Skip to content

Commit 07edf7f

Browse files
PhysShellclaude
andcommitted
docs(p022): state the protocol door rules as the tree proves them, and caveat BR-V5
Two places where a document said less, or other, than the evidence: * The cp4b note's §3.2 (written at 4b.0) claimed the tolerant door's protocol rules — malformed-entry skip and first-wins — are unreachable through the typed Rust constructor and pinned only by unit controls. The constructor checks protocol blocks for nesting depth alone; the grammar runs in the strict door, so the rules are reachable end to end, the synthetic case verdict_protocol_tolerant_door_rules replays them against Python's golden, and cp4b.2's M21–M23 are caught by that replay. The section now says so and names the one rule (non-list block) that is a unit control. * spec/Bridge.md BR-V5 states a slice shorter than two steps is dropped; _protocol_findings does not do that, so a leak off the end carries a one-step slice, and the port reproduces the reference. The sentence now carries the exception and points at the note that records the open Python-first decision, instead of a normative line one family knowingly does not implement. No code, fixtures or evidence change. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016vuEiNoEXaooMDRu6tXrZ6
1 parent d419fa4 commit 07edf7f

2 files changed

Lines changed: 26 additions & 11 deletions

File tree

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

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -239,16 +239,26 @@ The strict door's error texts do not move by a byte. The cp1 ledger
239239
accept/reject verdict and their category; red there is a stop, not a thing to
240240
re-baseline.
241241

242-
### 3.2 The door difference, and where it is pinned (OD-1)
243-
244-
Three of the tolerant door's protocol rules — the malformed-entry skip (H24,
245-
H25) and first-wins on a duplicate name (H26) — are **unreachable through the
246-
typed Rust constructor**, exactly as the effect-entry skip already is. They are
247-
pinned at the raw-document level with unit controls in the bridge (the shape
248-
`malformed_effect_entries_are_skipped_not_coerced` established at cp4), not by
249-
quietly coercing a document into shape. If a synthetic case needs such a
250-
document to travel through the door, it becomes a **declared** `verdict_door_*`
251-
exclusion with a reason — never a silent coercion.
242+
### 3.2 The door difference, and where each rule is pinned (OD-1)
243+
244+
The typed Rust constructor (`OwnIr::from_json`) keeps `protocols[]` and
245+
`protocol_functions[]` as raw values and checks only their nesting depth; the
246+
protocol grammar runs in the **strict** door alone. So, unlike the effect-entry
247+
skip — which the typed `Effect` shape makes unreachable, the OD-1 case cp4
248+
recorded — the tolerant door's protocol rules are reachable **end to end**: a
249+
malformed `protocols[]` entry is skipped (H24), a malformed
250+
`protocol_functions[]` entry is skipped without taking the rest of the list
251+
with it (H25), and a duplicate name resolves first-wins (H26). All three are
252+
replayed against Python's golden by the synthetic case
253+
`verdict_protocol_tolerant_door_rules`, and the cp4b.2 campaign's M21–M23 are
254+
caught by that replay, not by a unit test. Only the non-list block rule (H23)
255+
is pinned at the unit level (`protocol_blocks_that_are_not_lists_yield_nothing`,
256+
M24), in the shape cp4 established for the effect skip. Nothing here coerces a
257+
document into shape: a record the grammar refuses is dropped whole on the
258+
tolerant path, and the strict door still refuses the same document at load —
259+
its 216 controls are unchanged by 4b. (An earlier draft of this section, written
260+
at 4b.0 before the case existed, said the three rules were unreachable; the
261+
tree proved otherwise and this paragraph follows the tree.)
252262

253263
## 4. The surfaces 4b moved
254264

‎spec/Bridge.md‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,12 @@ anchorless. Related locations and ordered `flow` slices are attached exactly
304304
where §4/§5 say (DI consumer ctor; DI paths via `di_path_steps`; the capture
305305
escape slice subscribe-site → registration-site; flow-local origin→violation
306306
2-step; effect re-run→mint; protocol opened→barrier). Steps with unknown lines
307-
(`< 1`) are omitted; a slice shorter than 2 steps is dropped.
307+
(`< 1`) are omitted; a slice shorter than 2 steps is dropped — **except on the
308+
protocol path**: `_protocol_findings` filters unknown lines and stops there, so
309+
an obligation leaking off the end of its method carries a **one-step** slice
310+
(its second step would repeat the first). The port reproduces the reference;
311+
whether this sentence or that code should move is a Python-first decision still
312+
owed (#259 cp4b note §6.7).
308313

309314
**BR-V6 (severity and suppression).** `advisory` findings (OWN050/051/052,
310315
OBL005) render as warnings, SARIF `note`, and are excluded from the exit code.

0 commit comments

Comments
 (0)