Status: one quad per path track·base·patch·wt against root

Status reporting is unified across status, GET, POST and PATCH: one vocabulary for file rows and commit ahead/behind, replacing the per-verb noun zoo of Dirty. Four states of a path the tracked tip, the base, the patched-in lines, the worktree bytes each compare to the root, the nearest common ancestor of track and base. Each comparison yields one of four relations, so a path displays as a quad of chars; all-same .... rows are omitted. Implementation: /todo/BRO/BRO-030.

The four columns

The columns are the four states a path can live in, in fixed order; position is authoritative, color is decoration. Patch and worktree build on base, so they are ahead of or diverged from root by construction.

The four relations

Per path, the track/base/patch columns compare to root's entry and the wt column to BASE's (local dirt); the relation is one char of the greppable ASCII canon .xov. A gitlink compares exactly like a blob, so an advanced submodule is a v like any file. A tty renders the Unicode glyphs (x removed, o created, v advanced); plain/piped output is always the ASCII canon.

Style annotations

Two facts do not reduce to a relation and ride as styles on the wt char: staging provenance and merge outcome. In plain output the style IS a char change, so the fact greps; a tty adds color on top.

Commit rows use the same relations

Ahead/behind is the same comparison one level up: commits against root instead of tree entries, so the old post/miss divergence rows join the same vocabulary.

Old vocabulary mapped

Every Dirty noun is a named quad (plus a style), so the old 3-char statuses become display aliases at most; each verb reports the transitions it produced through the same renderer.

Open edges

The quad is settled and is THE default output of status, GET, POST and PATCH reports (not a flag); a few renderings are fixed by implementation and listed here for the record.

Degenerate roots

The corner cases reduce cleanly: root=base and root=track just blank one side of the quad, a detached wt tracks its pin, and no common ancestor is not a status at all.