docs: Stage 0 --- a total grading rule, honest counts, and the recovery floor

The recovery authority contradicted itself in the direction that
matters: the floor said `9a26ac8` while the operative check said
`e67ad07`, so the stated floor would have ACCEPTED a tree missing
everything since 2026-08-08. Floor and check are now both `e67ad07`.

The exercise claim is corrected rather than quietly inherited. That
paragraph argued its own value --- advancing the base is exactly when
the procedure must be re-run --- and then presented a 2026-08-08 run at
`9a26ac8` as if it covered today's base. It is now marked as the LAST
exercise, with the advance to `e67ad07` recorded as an OUTSTANDING
obligation. What is unverified is the procedure against the new base,
not the SHA.

The grading rule was not total. `Weak` required a non-empty blocker list
and `Partial` named blockers, which left a real state ungraded:
criterion 1 passing, blockers empty, criterion 3 failing or unassessed.
The rule now turns on criterion 1 alone --- pass is `Partial`, fail is
`Weak`, all-pass is `Strong` --- so every usable state is covered by
exactly one grade. Criterion 1 is the right discriminator because it is
the only one measuring the GPU AGAINST THE TUI; the others measure it
against its own goals. Today's grade is unchanged and now derives.

The listview counts were wrong because I used `grep -c`, which counts
comment mentions. Four executable calls in `lsp.lua`, one in `git.lua`
--- not five and four. The claim those numbers support is untouched:
listview is no longer LSP-only.

Two status claims corrected: the lane understated its own commits (15,
actually 16), now stated AS OF a SHA so it cannot rot on the next
commit; and the handoff said "Stage 0 in PR" when no PR exists ---
"ready for PR (not yet opened)".

The inference ruling is recorded where the flags live: they do not block
this docs PR, they must be closed before the table is first enforced as
a gate, 3(c) and 9 can change the deficit set, and 6(c) cannot change
step 6 today but still owes evidentiary closure.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bqGA6s9tTUFzYpbeW3tai
This commit is contained in:
Levi Neuwirth 2026-08-11 21:15:23 +02:00
parent 30e22090ae
commit c2b613c28d
No known key found for this signature in database
3 changed files with 39 additions and 13 deletions

View File

@ -107,7 +107,7 @@ remain open to them.
| 11 | Config layering + provenance | **Partial (foundation only)** | Typed registry is right; 5 settings live in it; no value provenance | | 11 | Config layering + provenance | **Partial (foundation only)** | Typed registry is right; 5 settings live in it; no value provenance |
| 12 | Profiles | **Missing** | One hardcoded default keymap; not a named concept | | 12 | Profiles | **Missing** | One hardcoded default keymap; not a named concept |
| 13 | Package lifecycle UX | **Resolution without lifecycle** | Mature resolver/lockfile; init-only install; no uninstall/disable/search | | 13 | Package lifecycle UX | **Resolution without lifecycle** | Mature resolver/lockfile; init-only install; no uninstall/disable/search |
| 14 | Workbench primitives | **Partial (best trajectory)** | Listview is a real primitive with call sites in **two** modules — `lsp.lua` (5) and **`git.lua` (4, `*git-status*`, #227)** — so it is **no longer LSP-only**; buffer-list and search re-implement it; **the bottom panel is COMPLETE — both frontends, and Stage 3 flipped the adopter default so omission means the panel**. **Tree is implemented (◐) with the LSP outline as its one adopter; the remaining consumers, including dired's `i`, have not adopted** | | 14 | Workbench primitives | **Partial (best trajectory)** | Listview is a real primitive with executable call sites in **two** modules — `lsp.lua` (**4**) and **`git.lua` (1, `*git-status*`, #227)** — so it is **no longer LSP-only**; *(counted excluding comment mentions, which an earlier `grep -c` included)*; buffer-list and search re-implement it; **the bottom panel is COMPLETE — both frontends, and Stage 3 flipped the adopter default so omission means the panel**. **Tree is implemented (◐) with the LSP outline as its one adopter; the remaining consumers, including dired's `i`, have not adopted** |
| 15 | Contextual affordances | **Weak** | Right-click menu only; code actions apply first-blindly; **Git integration reaches status and diff (#227, Stage 1) and no further** — §15's ground truth is authoritative, and this row previously said "no git integration at all" | | 15 | Contextual affordances | **Weak** | Right-click menu only; code actions apply first-blindly; **Git integration reaches status and diff (#227, Stage 1) and no further** — §15's ground truth is authoritative, and this row previously said "no git integration at all" |
| 16 | Semantic frontend | **Architectural: Strong · Product: Weak** | v6..=v23 schema support; production attach remains v20 during the dark panel slice; degradation practiced. **The two subgrades and the product criteria live in §16** — the row points there rather than carrying a grade of its own, so the GUI-as-a-product half cannot hide inside an architectural `Strong` | | 16 | Semantic frontend | **Architectural: Strong · Product: Weak** | v6..=v23 schema support; production attach remains v20 during the dark panel slice; degradation practiced. **The two subgrades and the product criteria live in §16** — the row points there rather than carrying a grade of its own, so the GUI-as-a-product half cannot hide inside an architectural `Strong` |
| 17 | Distribution | **Partial** | **v1.1.0 ships prebuilt Linux/macOS binaries on tag** (#211) with checksums and a stated glibc floor. No channels, in-place update, rollback, signing, or package-manager distribution | | 17 | Distribution | **Partial** | **v1.1.0 ships prebuilt Linux/macOS binaries on tag** (#211) with checksums and a stated glibc floor. No channels, in-place update, rollback, signing, or package-manager distribution |
@ -507,7 +507,15 @@ fails on GPU *alone*, so it is **frontend-local** — Stage 1d's IME work
closes it. A single merged TUI column would have shown two identical closes it. A single merged TUI column would have shown two identical
red cells and no way to tell those apart. red cells and no way to tell those apart.
**Inference flags.** GPU 3(c) is inferred **in both halves** — **Inference flags — and when they must be closed (user ruling,
2026-08-11).** These do **not** block the Stage 0 docs PR. They **must**
be verified **before this table is first enforced as a release gate**.
**3(c) and 9 can change the deficit set**; **6(c) cannot change step 6's
grade today** — 6(e) already floors it at `Missing` on all three
frontends — but still needs evidentiary closure rather than standing
indefinitely as an assumption.
GPU 3(c) is inferred **in both halves** —
rendering and browsing interaction — as are GPU 9 (compile output rendering and browsing interaction — as are GPU 9 (compile output
renders like any other daemon buffer) and GPU 6(c) (hover reaches the renders like any other daemon buffer) and GPU 6(c) (hover reaches the
echo area as on the grid). All must be verified before this table is echo area as on the grid). All must be verified before this table is
@ -1754,12 +1762,23 @@ grade. The product subgrade reads:
| grade | condition | | grade | condition |
|---|---| |---|---|
| **Strong** | all three criteria pass | | **Strong** | all three criteria pass |
| **Partial** | criterion 1 passes — the GPU is nowhere *behind* the TUI — while blockers remain open | | **Partial** | usable, criterion 1 **passes**, and not all three criteria pass |
| **Weak** | criterion 1 fails at one or more steps **and** the blocker list is non-empty | | **Weak** | usable and criterion 1 **fails** at one or more steps |
| **Missing** | no usable graphical frontend | | **Missing** | no usable graphical frontend |
**Current: Weak** — criterion 1 fails at two known steps, and nine **The rule is TOTAL by construction** — every usable state is covered by
blockers are open including the one-window ceiling. The distinction that exactly one of `Partial`/`Weak`/`Strong`, since criterion 1 either
passes or fails and `Strong` is the all-pass case. An earlier draft
required a non-empty blocker list for `Weak` and named blockers in
`Partial`, which left a real state ungraded: criterion 1 passing with an
empty blocker list but criterion 3 failing or unassessed. Criterion 1 is
the discriminator because it is the only one that measures the GPU
*against the TUI*; the others measure it against its own goals.
**Current: Weak** — criterion 1 fails at two known steps. (Nine
blockers are open including the one-window ceiling; under the total rule
they no longer *derive* the grade, but they are why it is not close to
`Strong`.) The distinction that
matters is between `Weak` and `Partial`: the GPU is not merely matters is between `Weak` and `Partial`: the GPU is not merely
*unfinished*, it is **behind a frontend that ships in the same binary**, *unfinished*, it is **behind a frontend that ships in the same binary**,
and that is what the ceiling and the two failing steps say. and that is what the ceiling and the two failing steps say.

View File

@ -173,7 +173,7 @@ lesson, §1 for the two framings).
where they describe a stage as it landed** — only this where they describe a stage as it landed** — only this
current-state paragraph tracks the live range. current-state paragraph tracks the live range.
**The recovery floor advances with the base**, so the check below **The recovery floor advances with the base**, so the check below
now requires `9a26ac8` or newer; a tree at `db1bbe9` no longer now requires **`e67ad07`** or newer; a tree at `db1bbe9` no longer
passes — it would lack the entire QoL arc, which this file and the passes — it would lack the entire QoL arc, which this file and the
handoff both describe as complete. That is deliberate — a check accepting an older commit than handoff both describe as complete. That is deliberate — a check accepting an older commit than
the declared base passes on a tree the rest of this file does not the declared base passes on a tree the rest of this file does not
@ -220,9 +220,14 @@ declares canonical will pass on a tree the rest of this file does not
describe. describe.
If it does not, stop and repair the remote/fetch configuration. If it does not, stop and repair the remote/fetch configuration.
**This path was exercised, not asserted, at this snapshot** — re-run **LAST EXERCISED AT `9a26ac8`, 2026-08-08** — re-run from an empty
from an empty directory on 2026-08-08 when the base advanced to directory rather than having its SHA swapped. **The advance to
`9a26ac8`, rather than having its SHA swapped. That distinction is the `e67ad07` (2026-08-11) has NOT been re-exercised**, and by this
paragraph's own argument that is exactly when the exercise matters, so
it is recorded as an outstanding obligation rather than left to read as
though it had been done. The floor above and the check below are in
step at `e67ad07`; what is unverified is the *procedure* against that
base, not the SHA. That distinction is the
whole point of this paragraph: advancing the base is exactly when the whole point of this paragraph: advancing the base is exactly when the
recovery commands are most likely to have rotted, and a swapped SHA recovery commands are most likely to have rotted, and a swapped SHA
reads identically to a verified one. `git clone` the canonical URL, add reads identically to a verified one. `git clone` the canonical URL, add
@ -278,8 +283,10 @@ is listed at the commit that does it, not promised here.
its first commit until #227 merged, because #227 was 72 `main` commits its first commit until #227 merged, because #227 was 72 `main` commits
behind and touched the three files Stage 0's absorption rewrites. behind and touched the three files Stage 0's absorption rewrites.
#227 merged (`b867f64`), #233's arc closed (#234, #235), this branch #227 merged (`b867f64`), #233's arc closed (#234, #235), this branch
rebased onto `e67ad07`, and the absorption ran. **15 commits above the rebased onto `e67ad07`, and the absorption ran. **Sixteen commits
base; ready for its PR.** above the base as of `30e2209`; ready for its PR.** *(Anchored to a
SHA deliberately: a bare running count goes stale on the next commit,
which is the staleness class this lane exists to retire.)*
- **What landed (docs only, no `src/`):** the absorption pass - **What landed (docs only, no `src/`):** the absorption pass
enumerated in the framing's §5 — five stale lanes, the enumerated in the framing's §5 — five stale lanes, the
authority/recovery anchor, `COHERENCE.md`'s `v6..=v21` → `v6..=v23`, authority/recovery anchor, `COHERENCE.md`'s `v6..=v21` → `v6..=v23`,

View File

@ -3195,7 +3195,7 @@ servers.
## 6. Named deferrals (the standing backlog, consolidated) ## 6. Named deferrals (the standing backlog, consolidated)
**The GUI arc — OPEN, framing approved 2026-08-10, Stage 0 in PR.** **The GUI arc — OPEN, framing approved 2026-08-10, Stage 0 READY FOR PR (not yet opened).**
`docs/gui-arc-framing.md` is the arc-level frame and is also Stage 0's `docs/gui-arc-framing.md` is the arc-level frame and is also Stage 0's
own framing; Stages 1–10 each need their own before their branch. It own framing; Stages 1–10 each need their own before their branch. It
opened from a daily-driver report: the TUI is daily-drivable, the GUI is opened from a daily-driver report: the TUI is daily-drivable, the GUI is