Skip to content

Commit 4c2e6ee

Browse files
committed
docs(p022): bring the status surfaces level with what cp5 proves (#259 cp5.4)
The census fragment now describes the checkpoint-5 comparison surface — every `Finding` member and every refusal in full — and counts the rendered-surface family beside the verdict ledger through tests/verdict_render_census.py, the same interpretation the render harness and the inventory use. Its filename stays checkpoint 4's, because that is where it was introduced and two notes link it; what it describes it now says in its own first paragraph, which keeps one census for one ledger instead of two that can disagree. The cp5.1/5.2/5.3 campaigns are registered like cp4's and the shadow slice's and rendered by the same single interpreter, so the existing gate holds them: a result that no longer matches its definition, was taken on a dirty tree, missed a required catcher, or names a commit this tree does not descend from is a red build. spec/Bridge.md §6 and spec/BridgeBehaviorMatrix.md move the BR-V4 wording rows and the BR-V9 rendering rows from "carried by the goldens, compared at cp5" to compared, marked L3 ✅ with a legend saying what the mark means. The P-022 status row, the proposals index and the cp4 note's forward pointer move with them. The cp4 note keeps its own numbers as history and says so. No count is typed into any status surface: every number lives in a generated fragment and the prose links. The wording these surfaces now carry is "Layer 3 parity over the measured set at the full Finding and the rendered surfaces", with the unmeasured set named — protocol documents (row 4b), the coordinate-domain controls (decision owed), the OD-1 door controls. Not "verdict parity complete", not "#259 complete", not "shadow mode". Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DQ471fbXuoL2Poo4Ap3Kfb
1 parent 2631548 commit 4c2e6ee

9 files changed

Lines changed: 281 additions & 76 deletions

‎docs/generated/p022-cp4-census.md‎

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
<!-- GENERATED by scripts/render_checkpoint_status.py from tests/fixtures/verdicts/manifest.json and the *.verdicts.json goldens. Do not edit: regenerate with `python scripts/render_checkpoint_status.py`; tests/run_tests.py fails while this file is stale. -->
1+
<!-- GENERATED by scripts/render_checkpoint_status.py from tests/fixtures/verdicts/ and tests/fixtures/verdict_renders/ (manifests + goldens). Do not edit: regenerate with `python scripts/render_checkpoint_status.py`; tests/run_tests.py fails while this file is stale. -->
22

3-
# P-022 checkpoint 4 — measured census
3+
# P-022 #259 — the Layer 3 measured census
44

5-
Computed by `tests/verdict_census.py` (the interpretation `tests/test_verdict_fixtures.py` verifies against the Python projection) over the frozen Layer 3 ledger; the Rust half is `rust/crates/own-bridge/tests/verdicts.rs`.
5+
Computed by `tests/verdict_census.py` and `tests/verdict_render_census.py` (the interpretations the two fixture harnesses verify against the Python projections) over the frozen ledgers; the Rust halves are `rust/crates/own-bridge/tests/verdicts.rs` and `.../tests/renders.rs`.
6+
7+
**The surface this describes is checkpoint 5's**: the verdict replay compares EVERY `Finding` member (`message`, `related` and `flow` included) and every refusal in full, and the rendered-surface replay compares bytes. At checkpoint 4 the same ledger was compared on identity, anchor, kind and tiering only, and refusals up to their `message=` member; the counts below are the ledger's either way, which is why one fragment serves both and says which surface it means.
68

79
| measure | value |
810
|--------------------------------------------------------------------------------------|------:|
@@ -17,8 +19,20 @@ Computed by `tests/verdict_census.py` (the interpretation `tests/test_verdict_fi
1719
| … refused by `check_facts` with an error containing `obligation protocol` | 2 |
1820
| … refused by `check_facts` with an error containing `outside the core's line domain` | 4 |
1921
| … refused at the typed `OwnIr` door (#294 OD-1) | 2 |
20-
| replayed by Rust at the cp4 surface (goldens minus exclusions) | 79 |
21-
| … reference refusals among them (compared by refusal class) | 5 |
22-
| … findings among them (compared on the cp4 members) | 152 |
22+
| replayed by Rust (goldens minus exclusions) | 79 |
23+
| … reference refusals among them (compared in full) | 5 |
24+
| … findings among them (compared on every `Finding` member) | 152 |
25+
26+
The differential counts over the replayed set — Python-only, Rust-only, changed, ordering-only, unexplained — are asserted, not measured here: the Rust replay compares every replayed case's full ordered verdict list (or its refusal text) against the golden on every member, collects every divergence without fail-fast, and fails if one exists. A green `cargo test -p own-bridge --test verdicts` is 0 / 0 / 0 / 0 / 0 by construction; a non-zero count is a red build.
27+
28+
## The rendered surfaces (BR-V9)
29+
30+
A second family, and a different kind of comparison: its replay compares the **bytes**, because SARIF key order is part of this surface. Cases are listed, never swept — one exists to exercise a BR-V9 rule, and which rows each pins is the join the [surface inventory](p022-cp5-inventory.md) reports on.
2331

24-
The differential counts over the replayed set — Python-only, Rust-only, changed, ordering-only, unexplained — are asserted, not measured here: the Rust replay compares every replayed case's full ordered verdict list (or its refusal class) against the golden on the cp4 members, collects every divergence without fail-fast, and fails if one exists. A green `cargo test -p own-bridge --test verdicts` is 0 / 0 / 0 / 0 / 0 by construction; a non-zero count is a red build.
32+
| measure | value |
33+
|-----------------------------------------------------------------------|------:|
34+
| cases — one per BR-V9 rule group, listed exhaustively in the manifest | 8 |
35+
| … whose golden is a bridge refusal (nothing to render) | 1 |
36+
| rendered lines compared byte-for-byte (4 formats, 2 host severities) | 104 |
37+
| SARIF results compared byte-for-byte (both host severities) | 26 |
38+
| BR-V9 ledger rows pinned by at least one case | 31 |

‎docs/notes/p022-bridge-verdict-checkpoint4.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ handler, kind, advisory, severity, ignore_reason`. Not compared yet:
7171
`message`, `related`, `flow` — the goldens carry them, cp5 compares them
7272
without regenerating a golden.
7373

74+
> Read as history. **#259 cp5 has since landed** and the replay compares every
75+
> member, plus every refusal in full; the census fragment linked above
76+
> describes that surface, not this one, and says so in its first paragraph.
77+
> See [the cp5 note](p022-bridge-verdict-checkpoint5.md).
78+
7479
### The unmeasured set is named, not hidden
7580

7681
Each exclusion is an entry in `rust_replay_excluded` with a reason and an

‎docs/notes/p022-bridge-verdict-checkpoint5.md‎

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# P-022 step 6b (#259) — checkpoint 5: messages, evidence, rendered surfaces
22

3-
> Status: **checkpoints 5.0–5.3 landed** (inventory, messages and evidence,
4-
> refusal text, rendered surfaces). This note names what checkpoint 5 has to prove, who owns each
3+
> Status: **checkpoint 5 complete at its surface** — 5.0 inventory, 5.1
4+
> messages and evidence, 5.2 refusal text, 5.3 rendered surfaces, 5.4 the
5+
> status surfaces and the census. This note names what checkpoint 5 has to prove, who owns each
56
> string it must reproduce, and what each sub-checkpoint closed. Every count
67
> lives in the generated fragments
78
> [`p022-cp5-inventory.md`](../generated/p022-cp5-inventory.md) and
@@ -76,7 +77,7 @@ threw away.
7677

7778
## 2. The evidence slices (BR-V5)
7879

79-
Seven families and six degradation rules, one ledger row each in the fragment:
80+
Every family, and every degradation rule, is one ledger row in the fragment:
8081
the DI retention path through `di_path_steps` (one, two, and `via`-hop
8182
lengths), the DI consuming-constructor `related` (with and without a known impl
8283
type), the DI004 and DI005 registration `related`, the OWN014 escape slice
@@ -138,7 +139,7 @@ Two constraints it inherits:
138139
* **No `ownlang/` production change.** New observer modules only, exactly as
139140
`verdicts.py` and `lowered.py` are.
140141
* **`rust_replay_excluded` neither grows nor shrinks** without an owner
141-
decision. Its three families stay as cp4 left them: the protocol documents
142+
decision. Its families stay as cp4 left them: the protocol documents
142143
(row 4b), the `u32` coordinate-domain controls (a contract decision the owner
143144
has stated a direction for — Python-first tightening — but has not taken), and
144145
the OD-1 typed-door controls (measured).
@@ -213,7 +214,7 @@ wording turns fourteen cases red) rather than inferred from a passing suite.
213214
That is a statement about the measured set only — see the next section for what
214215
the measured set did not contain.
215216

216-
### Six synthetic cases, because a green replay over a corpus that never reaches a branch proves nothing about it
217+
### Synthetic cases, because a green replay over a corpus that never reaches a branch proves nothing about it
217218

218219
The cp5.0 inventory named every wording and slice the goldens do not reach.
219220
Each one that a facts document *can* reach is now a case under the frozen
@@ -225,7 +226,7 @@ rewrote **no** existing record in either the verdict ledger or the shadow
225226
slice's digest ledger, which is P-022 discipline rule 4 measured rather than
226227
asserted.
227228

228-
Five branches a facts document *cannot* reach are pinned instead by controls in
229+
The branches a facts document *cannot* reach are pinned instead by controls in
229230
`verdict::tests`, driven through `map_core` — the production path — in the
230231
shape cp4's `M19` established: the two flow-local fallbacks (the nine-op flow
231232
vocabulary raises only codes that already have a wording), the `transient` and
@@ -345,10 +346,11 @@ the Layer 3 pattern, and a Rust replay that compares the **bytes**.
345346
one format `render_finding` does not know, so the fallback is *rendered*
346347
rather than asserted equal to the human line. `RENDERS_VERSION` keys the
347348
surface and the docstring freezes the normalization.
348-
* **`tests/fixtures/verdict_renders/`** — seven targeted cases under a frozen
349+
* **`tests/fixtures/verdict_renders/`** — targeted cases under a frozen
349350
manifest ledger, each naming the BR-V9 rows it is the control for. Listed,
350351
never swept: rendering the whole verdict corpus at two severities would
351-
freeze megabytes to prove less than seven documents chosen for the rules.
352+
freeze megabytes to prove less than a handful of documents chosen for the
353+
rules do.
352354
* **`tests/test_verdict_render_fixtures.py`** — verify/`--write`, with stale,
353355
missing and orphaned each a red build.
354356
* **`own-bridge/tests/renders.rs`** — replays every case with zero Python and
@@ -391,3 +393,40 @@ join is computed rather than asserted: the row ledger lives in
391393
and a row nobody pins reads `GAP: no control` while a case pinning a row the
392394
ledger does not know is a hard problem. The counts are in
393395
[the generated fragment](../generated/p022-cp5-inventory.md).
396+
397+
## 10. What checkpoint 5.4 landed
398+
399+
The status surfaces, brought level with what the tree proves — and nothing
400+
more.
401+
402+
* **The census** (`docs/generated/p022-cp4-census.md`) now describes the cp5
403+
comparison surface and counts the rendered-surface family beside the verdict
404+
ledger, through `tests/verdict_render_census.py` — the one interpretation the
405+
render harness and the inventory also use. The filename stays cp4's, because
406+
that is where the fragment was introduced and two notes link it; what it
407+
*describes* it says in its own first paragraph, which is the honest way to
408+
keep one census for one ledger.
409+
* **The mutation campaigns** for 5.1, 5.2 and 5.3 are registered like cp4's and
410+
the shadow slice's, rendered into `docs/generated/p022-cp5-mutations.md` by
411+
the same single interpreter and held by the same gate: a result that no
412+
longer matches its definition, was taken on a dirty tree, missed a required
413+
catcher, or names a commit this tree does not descend from is a red build.
414+
* **`spec/Bridge.md` §6** and **`spec/BridgeBehaviorMatrix.md`** move the BR-V4
415+
wording rows and the BR-V9 rendering rows from "carried by the goldens,
416+
compared at cp5" to compared — marked `L3 ✅` in the matrix, with the legend
417+
saying what the mark means. The P-022 status row and the proposals index move
418+
with them.
419+
* **No count is typed** into any of them. Every number lives in a generated
420+
fragment; the prose links.
421+
422+
### The wording this checkpoint earns, and the wording it does not
423+
424+
> Layer 3 parity over the measured set at the full `Finding` and the rendered
425+
> surfaces; unmeasured set: protocol documents (row 4b), coordinate-domain
426+
> controls (decision owed), OD-1 door controls.
427+
428+
Not "verdict parity complete" — the protocol family is a whole analysis that
429+
is not ported, and the bridge refuses rather than answers for it. Not "#259
430+
complete" — row 4b and the coordinate decision are both outstanding. Not
431+
"shadow mode": the reducer still refuses the verdict layer, which is #260's
432+
boundary. And not "P-022 done" by any reading.

0 commit comments

Comments
 (0)