step.29.diff.txt -- narrative retro for step.29 (U5.7: THE MULTI-HOME DISCIPLINE + the A3 account). Companion: step.29.gdiff.txt via ../scripts/step_gdiff. Executed: 2026-07-24, (p1.1.4) -- the fourth leg of the user's (p1.1) arc. Commits: SKELETON 66f8d6b, WORK 4e92036, Phase A b8c3797, CLOSE cabe538, ledger 2719fc6. b3u-side plan execution: f740edb (no new b3u step -- the lifecycle plan is UB.5's LIVE doc). ## Plan vs actual +---+--------------------------------------+--------------------------------------+ | # | Planned (brief) | Actual | +---+--------------------------------------+--------------------------------------+ | 1 | ~/.b3ubot.1/.2 multi-home via | Delivered as the PROFILE WRAPPER: | | | $B3UBOT_HOME + per-account env | creds live INSIDE the home | | | profiles (the user's own naming | (profile.env, 0600), wrapper takes | | | from the (p1.1) plan) | digits only -- mis-pairing has NO | | | | invocation surface, which turned | | | | TC-16 from "assert the hope" into | | | | "assert the wrapper". | | 2 | actor@example.com signup with the | Real end-to-end: signup + gmail | | | same 4242 card | verify + checkout run THROUGH the | | | | wrapper's own env; Stripe Link | | | | intervened (000000 test code) -- | | | | and then HID the card fingerprint, | | | | demoting the same-card assert to | | | | operator-witnessed + A2 raw-card | | | | control (plan F-6). | | 3 | TC-14..16 pre-named at UB.5 | All four flips (incl. TC-3) landed | | | | same-day with dated log entries -- | | | | the pre-naming discipline paid: the | | | | step executed a plan that already | | | | knew its acceptance shape. | +---+--------------------------------------+--------------------------------------+ ## Surprises / genuine findings 1. **The suite guards even the step files**: the corpus round-trip test refused this step's OWN skeleton (INTERNAL banner wrapped off the ledger emitter's canonical form) -- the ledger engine's byte-stability oracle now acts as a lint on incoming step files. Found at BUILD, fixed by re-wrapping one line. 2. **GNU env argument order**: `env NAME=VALUE -u OTHER cmd` execs "-u" as the command -- the -u flags must precede assignments. Caught by the gates before any real run. 3. **Q-28-E, third edition**: the chat paste channel injected a newline INSIDE a curl -H header string -- the wall answered non-JSON and the one-liner collapsed. The fix (a one-shot script file, ~/a3_checkout.sh, deleted after) is now the DEFAULT ceremony vehicle, not the fallback. Corollary finding: the helper's f-string \" escapes ran fine on the venv's 3.12 but broke the SYSTEM python3 -- ceremony helpers must target the oldest interpreter on the box ("%s" formatting, no f-string quoting tricks). 4. **Stripe census nuances, all three new**: (a) clock-backed customers are EXCLUDED from default Customer.list -- A2 is visible only via its test clock, so any future census must query per-clock; (b) newer API has no invoice.charge -- Charge.list(customer=..) is the road to payment evidence; (c) Link-funded charges expose neither last4 nor fingerprint. 5. **An orphan test clock survived step.54's recorded deletion** (0-customer lifecycle-plan twin) -- the deletion evidently hit the wrong clock. Found by the census, deleted for real this time. Lesson: cleanup claims deserve a list-after check. ## Scope discipline In: the wrapper + tests + gates, the ceremony, the census, the plan flips, docs/ledger. Out and named: a checkout/subscribe helper as product (that is UB.7's button); the census as a b3u script (promotion candidate `account_census.sh`, named in Q-29-C, deferred to the UB.6-era); TC-8/TC-5/TC-7/TC-11 wall-clock cases (stand planned by design -- A3's soak checkpoint is ~2026-08-24). Zero engine-code changes (C-29-C held: scripts + tests + docs only). ## Numbers - Suite 644+28=672 -> 660+28=688 (+12 wrapper tests, +4 corpus pickups: b3u step.54 + own step.29); 40 test files, 501 functions; measured after the last edit. - Phase A 9/9 first run; ceremony legs 3/3; census 3 accounts / 3 clients / 2+1 Stripe customers (clock-hidden A2), subs active/canceled/active exactly as the plan's log predicts. - The plane now carries the full actor set: A1 alex (wall-clock), A2 clockco (synthetic, expired), A3 uafco (soak, active, period_end 2026-08-24). - The (p1.1) arc: (p1.1.1) UB.4 / (p1.1.2) U5.6 / (p1.1.3) UB.5 / (p1.1.4) U5.7 -- four legs, two days. NEXT: (p1.1.5) downloadable b3ubot, then (p2) the xml project. End of retro.