ce-615: public dispatch-receipt surface + brain assertion supersession#1056
Conversation
Adds machine-readable dispatch-activation receipts so watchers can assert seat activation rather than infer it from scrollback. - New schema: ce.dispatch-receipt v1 (dispatch-receipt.v1.schema.yaml) with transport, activation.separate_enter, post_check, and model_effort_line (per 2026-07-19 Operator floor ruling). - New shared library dispatch_receipt.py: build/patch/write/read receipt dicts; verify_receipt() returns typed ReceiptFailure objects for dispatch-without-transport and receipt-without-activation gap classes. - CLI: `ce dispatch-receipt emit` / `ce dispatch-receipt verify` with --json support; emit auto-computes brief SHA256 from file. - 39 focused unit tests covering happy/sad schema paths, each gap classification, write/read round-trip, and CLI integration. All pass. Closes ce-ops#615 slice 1. Transport integration in slice 2. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…receipt VAL-AUTOGEN-STALE-CLI + VAL-AUTOGEN-STALE-SCHEMA: both generated docs were missing the new `ce dispatch-receipt` group and dispatch-receipt.v1.schema.yaml; regenerated via gen_cli_reference.py --write and gen_schema_reference.py --write. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…s, count 6->8) Add .ce/reference/cli.generated.md and .ce/reference/schemas.generated.md to the authorized path set; recompute LC_ALL=C SHA256 digest for the 8-path set. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Remove confidential ce-ops# ticket refs and internal seat-login markers from all new ce-615 artifacts so the public-docs confidentiality gate passes. Key changes: - .ce/changelog: ticket → issue key (exempt pattern) - dispatch_receipt.py: drop ticket ref from module docstring; neutralise ce-ops-NNN slug example → receipt-0001 - dispatch-receipt.v1.schema.yaml: remove Background ce-ops# ref; example dispatcher "ce-dev-2" → "controller-1"; example work_unit "ce-ops#615" → "wu-615" - test_dispatch_receipt.py: drop ticket ref from docstring; all dispatcher="ce-dev-2" → "controller-1"; work_unit="ce-ops#615/1" → "wu-615"/"wu-1"; CLI --dispatcher/--work-unit args neutralised - Regenerate .ce/reference/schemas.generated.md from cleaned schema - Add dispatch-receipt to docs/reference/cli.md (public: mirrors dispatch) - Add dispatch-receipt to expected inventory in test_v1_docs_reconciliation - Update carrier: +2 paths (docs/reference/cli.md, test_v1_docs_reconciliation.py), count 8→10, new digest Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ce-dev-2
left a comment
There was a problem hiding this comment.
Two-key approval bound to exact head f8153592156164e3e92ca2b060b456fbddac8c6c.
Controller byte-verification: 11 paths, LC_ALL=C sort -u digest ba091396a3c8380b9347d6b7733aa4c5806b34e157ac8a6aee72cbf0f4e91b02, base 607fd6b6 confirmed ancestor, zero gate-surface paths.
Independently verified rather than accepted from the seal:
.ce/brain/assertions.yamlhas zero removed lines — the supersession is genuinely append-only and record 197 is untouched.- The successor pins
evidence_sha256: b77d8e04…, matching the evidence file exactly as this carrier ships it. A supersession pinning the old or a wrong digest would look fixed while leaving the drift live; it does not. - The active record now carries the real doctrine text verbatim; the degraded templated statement remains only on the superseded intermediate, where it is harmless historical record.
Review chain: receipts work COMMENT 0H/2M/4L (Mediums → slice-2 ticket); supersession REQUEST_CHANGES 0H/1M/1L, Medium closed by restoring the doctrine statement, Low dismissed by the controller after verifying epic is a valid legacy alias for L in work_sizing.py and that a higher declared class always clears the floor.
Seat-side gate evidence: ce brain verify PASS (202 records, 45 active, zero errors), verify-path-manifest PASS, verify-work-sizing-floor PASS.
Supersedes #1048, closed as stale-base with slug mismatch. Author dev-3; approver ce-dev-2; independent review venues throughout. No signing performed by any worker.
ce-dev-2
left a comment
There was a problem hiding this comment.
Two-key approval re-bound to exact head 448546760ebf8707793afab60569ae531d7fed78. Supersedes the approval on f8153592, voided by a CI failure that was mechanical, not substantive.
WHY THE HEAD MOVED. schema_reference_autogen_sync failed: ce-615 adds dispatch-receipt.v1.schema.yaml, and the generated reference still declared the pre-addition schema count. This is the same coupling class the brain supersession in this very carrier already fixed — adding a schema obliges regenerating its reference in the same change, exactly as adding a top-level ce CLI group obliges reconciling the docs. The gate correctly refused an incomplete carrier.
WHAT CHANGED — a single line, verified by diff against the previously approved head:
-Schema files: 79
+Schema files: 80
Produced by the supported generator (scripts/gen_schema_reference.py --write), not by hand-editing the generated file. The registered sync check now returns PASS.
Carrier UNCHANGED: still 11 paths, digest ba091396a3c8380b9347d6b7733aa4c5806b34e157ac8a6aee72cbf0f4e91b02, base 607fd6b6 ancestor, zero gate surface. The prior review verdicts are inherited — a regenerated schema count cannot alter reviewed behaviour.
Worth recording: the author first reported this BLOCKED, believing PyYAML was missing. I verified inside the container — PyYAML 6.0.3 was present in both the default interpreter and the validator venv; the check had simply been invoked under an interpreter that could not see it. Re-running under PYTHONPATH=validators /opt/ce-validator-venv/bin/python resolved it. The author correctly did NOT commit unverified output or hand-edit the generated artifact to force the check green, which is why this cost one unblock rather than a correction round.
Author dev-3 (supersession) and dev-4 (schema sync); approver ce-dev-2; independent review venues throughout. No signing performed by any worker.
ce-dev-2
left a comment
There was a problem hiding this comment.
Two-key approval re-bound to exact head bce4701d3bd8342be5f40ad9ba7d4f5dff27e5dd. Supersedes the approval on 448546760.
WHY THE HEAD MOVED. test_ce_brain_drift.py:819 asserted a hardcoded global count, assert len(active) == 121. This carrier's two legitimate brain supersessions moved the real count to 123. Unlike the three prior blockers on this carrier — schema-reference sync, confidentiality guard, drift check — this was a test asserting an accident rather than an invariant: it pinned a global number that governed work is supposed to change, so every legitimate assertion append would break it in perpetuity.
WHAT CHANGED. Replaced with assert len(active) >= 123, the floor independently measured at the admitted head, with a comment explaining the intent. That retains the check's real protection — silent loss of a material portion of the migrated active set — while no longer making every governed append a mandatory test edit. The concrete probe and record assertions immediately below preserve semantic coverage.
I asked the author to assess whether the assertion should exist in that form at all, and said explicitly that if it concluded the exact count was correct for a reason I was not seeing, it should say so and leave it — I would rather be corrected than have a check weakened to stop it complaining. It chose the floor and justified it. That is the right distinction between fixing a brittle test and defeating a real one.
Carrier grows to 12 paths, digest 01d19850141088b474fe4e3eaf1af4e73c3608146834686d45373af396f298ab, matching the manifest and my independent recomputation.
Author dev-3 (supersession, test floor) and dev-4 (schema sync); approver ce-dev-2; independent review venues throughout. No signing performed by any worker.
ce-dev-2
left a comment
There was a problem hiding this comment.
Two-key approval bound to exact head bce4701d3bd8342be5f40ad9ba7d4f5dff27e5dd.
Re-issued: the prior approval bound to 448546760e, not to this head, because I chained the push and the approve in a single command and the approval registered before GitHub saw the new head. The PR was therefore genuinely unapproved at its current commit despite showing three APPROVED reviews — a stale-marker head mismatch, self-inflicted. Verified corrected below.
Carrier byte-verified controller-side: 12 paths, LC_ALL=C sort -u digest 01d19850141088b474fe4e3eaf1af4e73c3608146834686d45373af396f298ab, matching the manifest. Base 607fd6b6 confirmed ancestor. Zero gate-surface paths.
Both required checks are GREEN at this head — the first clean run on this carrier after four consecutive, distinct blockers: brain-assertion drift, schema-reference autogen sync, and a brittle hardcoded active-count test.
Content verified independently rather than taken from seals:
.ce/brain/assertions.yaml: zero removed lines — the supersessions are genuinely append-only, record 197 untouched.- The active successor pins
b77d8e04…, matching the shipped evidence file exactly, and carries the real doctrine text verbatim. test_ce_brain_drift.py: the hardcoded== 121is replaced by a floor>= 123at the independently measured count, retaining protection against silent loss of the migrated active set without making every governed append a mandatory test edit.- Work class recomputed, not eyeballed.
Review chain: receipts work COMMENT 0H/2M/4L (Mediums → slice-2 ticket); supersession REQUEST_CHANGES 0H/1M/1L with the Medium closed by restoring the doctrine statement and the Low dismissed after verifying epic is a valid legacy alias.
Authors dev-3 (supersession, test floor) and dev-4 (schema sync); approver ce-dev-2; independent review venues throughout. No signing performed by any worker.
Supersedes #1048, which was opened from a branch whose carrier slug no longer matches and whose head is 8 merges stale. Same work, rebased onto current main with the brain-drift blocker resolved.
Content
The dispatch-receipt v1 surface: schema, shared library module with fail-closed typed errors, additive
ce dispatch-receiptCLI group, public docs row, regenerated reference docs. Product-lens scrub applied.Plus the piece that was blocking it: a brain assertion supersession.
Why the supersession was needed
Assertion
brain-assertion-0ca9d4cfca4dc66ee6e5286estates that adding a top-levelceCLI group couples docs reconciliation and generated CLI reference updates in the same change. ce-615 addsce dispatch-receiptand its carrier modifiesvalidators/tests/unit/test_v1_docs_reconciliation.py— the evidence file that assertion pins — without updating the pinned digest.Main itself is clean (claim and file both hash
8c1514f5…), so this was ce-615's own incomplete coupling, not inherited debt. The gate was correctly refusing an unfinished carrier.How it was fixed — and how it was NOT fixed
Editing
evidence_sha256in place would have broken the record hash chain from sequence 197 onward. The supported path isce brain correct— append a supersession marker plus a corrected successor. Append-only, never mutate; the same discipline ce-627 enforced on the side-effect ledger.Verified: zero removed lines in
assertions.yaml, record 197 untouched, successor pinsb77d8e04…matching the evidence file exactly as shipped, and the marker deliberately retains the old digest as historical record rather than scrubbing it.A second supersession, and why it is there
Independent review caught that the first successor's
statementfield had collapsed to a genericdoctrine-item asserts …template — the real doctrine survived only inclaim.details. Since the successor is the record that goes forward active and is read by every future consumer, the doctrine had been quietly hollowed out on exactly the record that matters.ce brain correcthas no amend route, so repairing it required appending a second supersession pair. The lineage is therefore 197 → 199 → 201, with the doctrine text restored verbatim on the active record. That is correct append-only behaviour, not noise to be cleaned up.The underlying tool defect is filed as ce-ops#636: omitting
--statementderives a lossy template, and the loss lands asymmetrically on the surviving record while the superseded marker keeps the true wording.Verification
ce brain verify: PASS — 202 records, 45 active, zero errors.verify-path-manifestagainst607fd6b6: PASS.verify-work-sizing-floor --declared-work-class epic: PASS.ba091396a3c8380b9347d6b7733aa4c5806b34e157ac8a6aee72cbf0f4e91b02.Prior review on the receipts work: COMMENT 0 High / 2 Medium / 4 Low, Mediums folded into the slice-2 ticket. Supersession reviewed separately: REQUEST_CHANGES 0/1/1, both items now closed.
🤖 Generated with Claude Code
ce-approval-capability: v1.eyJhcHByb3ZlZF9ieSI6ImNlLWRldi0yIiwiZXhwaXJlc19hdCI6MTc4NDU2NzIzMSwiaGVhZF9zaGEiOiJiY2U0NzAxZDNiZDgzNDJiZTVmNDBhZDliYTdkNGY1ZGZmMjdlNWRkIiwiaXNzdWVkX2F0IjoxNzg0NTYzNjMxLCJwb2xpY3lfc2hhIjoiNzliOWRjOGI0MjllNGFmMTA5ZWNjNjhhZjE5YjI2ZTliM2Y2NDdkOWZhZDhkZDM3MzA5ZDZmNWVhZDgxYjNiMCIsInByX251bWJlciI6MTA1NiwicmVwbyI6ImNyZWF0b3ItZW5naW5lL2NyZWF0b3ItZW5naW5lIn0.T9GdhH_eMBwvl2l9LHSk1_EWByETAPQCQHp82eReSPU