step.22.diff.txt -- narrative retro for step.22 (U5.1: the CCS plane's client side). Companion: step.22.gdiff.txt via ../scripts/step_gdiff (machine half). Executed: 2026-07-22, same session as the b3u UB.1/UB.2 steps it consumes. WORK commit eeda30f. ## Plan vs actual +---+--------------------------------------+--------------------------------------+ | # | Planned (brief) | Actual | +---+--------------------------------------+--------------------------------------+ | 1 | CCSService port per design §2.8 | Landed, with ONE amendment (Q-22-A): | | | (generate/validate/deliver/ | deliver() cannot exist against | | | entitlement) | contract v1 -- folded into | | | | generate()'s Artifacts return; | | | | health() takes the fourth slot. | | 2 | ReplayCCSService, deterministic | Landed; content-keyed (sha256 of | | | fixtures | spec bytes), refuse-loudly on | | | | missing fixtures; shipped set under | | | | tests/fixtures/ccs/ for U5.2. | | 3 | B3uDevClient vs the LOCAL b3u, | Landed + PROVEN LIVE: p5_gates.sh | | | login-token auth | ALL PASS first invocation -- 7/7 | | | | legs over real HTTP against a | | | | launcher-booted instance. | | 4 | (not planned) | The b3u-corpus ==50 tripwire fired | | | | mid-step (b3u grew to 52 in this | | | | same arc) -- resolved per Q-22-F. | +---+--------------------------------------+--------------------------------------+ ## Surprises / genuine findings 1. **The tripwire did its job the same week it became load-bearing.** test_ledger_parser's ==50 comment promised "if the corpus grows again, this test tells the next step to re-survey" -- b3u gained step.51/52.txt hours earlier, and the pin fired on this step's first full-suite run. Better: the two new b3u files round-tripped byte-identically through the parametrized corpus tests with ZERO parser changes -- the machinery absorbed brand-new sibling data silently and correctly; only the count pin complained. Retired the pin for floor(>=50)+contiguity(1..N): b3u is a LIVE sibling now, growing by design. 2. **The step file is data to the machinery it documents.** Writing steps/step.22.txt moved the suite total by +2 (own-corpus parametrization) -- the first draft of this step's own numbers was stale the moment the file existed. Measured after, not before (the b3u step.51 "measure, don't sum" rule, applied same-day). 3. **The §2.8 sketch vs contract v1**: deliver(unit) was designed before b3u's probe law existed; against v1 there is nothing at rest to deliver. Folding it into generate() is not a compromise -- it IS the §2.10 iterate-cheaply/deliver-once shape, stated precisely. 4. First-run ALL PASS on the live battery, including the stale-token transparent-refresh leg -- the UJ.4 revocation semantics b3u froze in its contract behaved exactly as documented, cross-repo, over real HTTP. ## Scope discipline In: exactly the U5.1 row + the fired-tripwire repair (Q-22-F, a discovered breakage in the step's own path -- fixed, named, tested). Out and named: T3 wiring (U5.2), SCB tier (U5.3), workflows (U5.4), foreign workspace (U5.4a), the trinity gate (U5.5), any CLI surface (U5.2, where the consumer exists). No b3u-repo changes of any kind. ## Numbers - New: app/ccs (5 files), 3 test files (31 tests: 24 hermetic + 7 live), scripts/p5_gates.sh (6 sections), 3 shipped JSON fixtures, 1 config key, 1 dependency (requests==2.34.2). - Suite: 565 -> 602 collected (31 new + 4 b3u-corpus growth + 2 own step.22.txt); 584 passed + 18 skipped (11 baseline + 7 live-gated), 0 failed. - p5_gates.sh: 6/6 sections PASS first run (env, boot, provision, live 7/7, honest-skip twin 24+7skip, B-4 grep). - Prior-test delta: exactly 2 tests touched (the fired tripwire), 1 renamed (covers_the_whole_corpus), 0 parser/emitter changes. End of retro.