Readiness and handoff at 05:50: rounds seven and eight fixed, round nine running; the replicator's seventh build gated and under review
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2 files changed,
+11
−11
.claude/HANDOFF.md+7 −7implementation/carloku-paid-launch/READINESS.md+4 −4
CI passed — run details
diff --git a/.claude/HANDOFF.md b/.claude/HANDOFF.md| index 944b83b0d..25e4d9e79 100644 |
| --- a/.claude/HANDOFF.md |
| +++ b/.claude/HANDOFF.md |
| @@ -7,17 +7,17 @@ |
| Get Carloku's paid plans live with Stripe Tax and the complete metered model; have the pricing page and signup flow reviewable in the morning. |
| **STATUS:** |
| -Written 05:20 Dublin on 2026-10-02, during the second overnight run (brief: "continue overnight until we're ready to enable payments"; ready means reviewed, tested, integrated code and a scoped enablement plan, not payments switched on). Billing is OFF everywhere. No live Stripe write, no AWS change, no charge, no merge to main. Every payment anyone can see is a labelled simulation. |
| +Written 05:50 Dublin on 2026-10-02, during the second overnight run (brief: "continue overnight until we're ready to enable payments"; ready means reviewed, tested, integrated code and a scoped enablement plan, not payments switched on). Billing is OFF everywhere. No live Stripe write, no AWS change, no charge, no merge to main. Every payment anyone can see is a labelled simulation. |
| -Review servers, all answering 200: pricing page `http://100.119.180.57:38009` (static, rebuilt from site `2fc6388`), signup and billing demo `http://100.119.180.57:41881` (rebuilt 05:1x from the currency branch's tip `124eab27`, price book configured, USD/EUR/GBP end to end; Keymail and Stripe simulated), console billing copy `http://100.119.180.57:45033` if still up. |
| +Review servers, all answering 200: pricing page `http://100.119.180.57:38009` (static, rebuilt from site `2fc6388`), signup and billing demo `http://100.119.180.57:41881` (rebuilt 05:4x from the currency branch's tip `f8a23ef3`, price book configured, USD/EUR/GBP end to end; Keymail and Stripe simulated), console billing copy `http://100.119.180.57:45033` if still up. |
| The durable records are on this branch under `implementation/carloku-paid-launch/`: `READINESS.md` (every branch's tip, gate log, CI and review state, with the verified behaviour), `ENABLEMENT.md` (the scoped plan to enable payments: catalog of 36, cutovers, key permissions, webhook, portal, release order, rollback, approvals), `OVERAGE-RATES-PROPOSAL.md` (the USD/GBP rate table for approval), `stripe-live-readiness.json` (remaining list revised for 36 prices and the book), `OUTSTANDING.md` (the metered model's open items and approvals A to K). |
| Decisions received 2026-10-01 evening, applied: the annual bases (28/24/22, 6/5/4.50, 60/50/45 USD/EUR/GBP, team minimum ten) confirmed for implementation only; the currency rulings (USD default, EUR for EU member states, GBP for the UK, visible override, one stored currency for subscription and overages, bands by billing country only); the five currency strings and the regrouped pricing page copy, approved verbatim and applied. Still a draft: the book `2026-10-01-draft1` and the USD/GBP overage rates and floors. |
| Branches (all on the forge, none merged; the local gate is not CI): |
| -- `feat/carloku-multi-currency-20261001` `124eab27`: the price book and one stored currency per purchase end to end, the billing page as one form with a server-signed quote, ownership on every path, the cookies, the demo. Six review rounds, each Opus accept with fixes and Astra reject, each round's findings fixed in the next commit with distinguishing tests and mutation checks (dispositions "Review six" is the latest). Gate and CI passed on `124eab27`; seventh review: Opus in (accept with fixes, one P2 on a quantity-event outcome list), Astra pending. No round has yet ended with both reviewers accepting. |
| -- `feat/carloku-metered-replicator-20261001`: sixth build pushed 05:2x (the fifth review's bounded findings: the last clean look's hold, the union window, the lifecycle lock, platform links anywhere in the path, world-writable platform directories, sidecar names, vanished files); gate running; sixth review running; the deep items stay open. |
| +- `feat/carloku-multi-currency-20261001` `f8a23ef3`: the price book and one stored currency per purchase end to end, the billing page as one form with a server-signed quote, ownership on every path, the refusal review keyed by its intent with the session recorded, the cookies, the demo. Eight review rounds, each Opus accept with fixes and Astra reject, each round's findings fixed in the next commit with distinguishing tests and mutation checks (dispositions "Review eight" is the latest; rounds 7 and 8 found no P1 and round 8 no P2 in the money paths). Gate and CI passed through `3e941f00`; gate on `f8a23ef3` running at 05:50, CI pending; ninth review running. No round has yet ended with both reviewers accepting. |
| +- `feat/carloku-metered-replicator-20261001` `6b648c0c`: seventh build (the sixth review's bounded findings: relative state links, the hold from the last clean look on a registry finding too, whole-chain latching, `O_NOCTTY`, link-free targets, header reads on sidecar names); gate and CI passed; seventh review: Astra in (reject, three new bounded items), Opus pending. The deep items stay open and are listed in `READINESS.md`. |
| - `feat/carloku-storage-sole-holder-20261001` `eaf6e63e`: round 9 both accept; CI passed; needs approval K and a cutover date. |
| - `fix/carloku-observe-routes-cleanup-20261001` `023e106c`: both accept; CI passed; merged into this branch at `47c97fa6`; the gate on the launch tip `b953fae4` passed (exit 0, three cross builds). |
| - `feat/carloku-billing-layout-20261001` `c1ae91a0`: merged into the currency branch; its two-form page was replaced by one form. |
| @@ -29,15 +29,15 @@ Branches (all on the forge, none merged; the local gate is not CI): |
| - Paul, copy: the console billing page's 40 strings; the store-refusal copy (`OUTSTANDING.md` 19g); a new sentence for the pricing page's `bands.p3` ("The euro price is what is charged" is wrong under fixed currencies); the approved pricing and currency strings themselves need nothing more. |
| - Paul, rulings: evidence for a held bucket-hour (J); storage on a bucket a store has left (K); the cutover note (M: purchases before the book stay legacy EUR; binary first, variables second). |
| - Scoped approvals, prepared as plans only: Stripe test mode (E) for the fence test and the rehearsal; Stripe live provisioning (F) after the approved book; the Cost and Usage Report export and the scratch-object write (G); Path B on a dev box (H). |
| -- Reviews to read when they land: the currency branch's seventh (`logs/opus-currency-review7.md` is in, `astra-currency-review7.md` pending) and the replicator's sixth (`opus-replicator-review6.md`, `astra-replicator-review6.md`). |
| +- Reviews to read when they land: the currency branch's ninth (`logs/opus-currency-review9.md`, `astra-currency-review9.md`) and the replicator's seventh (`opus-replicator-review7.md` pending; `astra-replicator-review7.md` is in). |
| **RECOMMENDED:** |
| -- Fix the seventh currency review's findings (the outcome lists first); if a round ends with both accepting, merge the currency branch into this branch through the forge (`amadan branch merge`, CI green on the tip). Rule on K to let the storage branch follow. |
| +- Read the ninth currency review; the rounds are converging (round 8: no P1, no P2 in the money paths). If both accept, merge the currency branch into this branch through the forge (`amadan branch merge`, CI green on the tip); if not, the next commit answers it the same way. Rule on K to let the storage branch follow. |
| - Publish the approved book version as soon as L is given; it is a new entry in `internal/plans/pricebook.json`, the export regenerated and copied to the site, and the 36 lookup keys renamed. |
| - Test-mode rehearsal (E) before anything live: the list in both reviews and in `ENABLEMENT.md` section 6. |
| - Then, each on its own branch: quantity reduction at renewal, the evidence door for a box's first minutes, the AWS principal inventory and the bucket ownership attestation door, Free-tier enforcement, dormancy and pool accounting. |
| **SESSION:** |
| -Running at 05:20: the replicator's sixth-build gate, Astra's seventh currency review, the two sixth-round replicator reviews, the two replicator reviews (detached `setsid` processes; their output files are named in `READINESS.md`). The demo (pid in `layout-review/demo-redesigned.log`'s process, stop marker `layout-review/demo-redesigned.stop`) and the pricing preview (`python3 -m http.server 38009`) keep serving. |
| +Running at 05:50: the gate on the currency tip `f8a23ef3`, the two ninth-round currency reviews, Opus's seventh replicator review, the two replicator reviews (detached `setsid` processes; their output files are named in `READINESS.md`). The demo (pid in `layout-review/demo-redesigned.log`'s process, stop marker `layout-review/demo-redesigned.stop`) and the pricing preview (`python3 -m http.server 38009`) keep serving. |
| Scratch on the box: `~/.cache/tmp/claude-1001/{currency-wt,replicator-wt,fencing-wt,evidence-wt}` (git worktrees), the demo binaries, `/var/tmp/ck`, `~/.cache/carloku-gate`. The void gate logs are named `*VOID*`. |
diff --git a/implementation/carloku-paid-launch/READINESS.md b/implementation/carloku-paid-launch/READINESS.md| index db8818132..af3d8334c 100644 |
| --- a/implementation/carloku-paid-launch/READINESS.md |
| +++ b/implementation/carloku-paid-launch/READINESS.md |
| @@ -14,17 +14,17 @@ Log files are under `/home/paulca/.local/share/carloku-paid-launch-20260930/logs |
| | Branch | Tip | Gate | CI | Reviews | State | |
| | --- | --- | --- | --- | --- | --- | |
| -| `feat/carloku-multi-currency-20261001` | `124eab27` (the sixth review's findings) | passed on `de81dd70`, `8958392b`, `1f005804`, `b51c2a26` and `124eab27` (04:11Z, `gate-currency-124eab27.txt`, exit 0, three cross builds, clean tree). Void logs, not evidence: `gate-currency-a9304f16.txt`, `gate-currency-f269365a-VOID-dirty-tree.txt` | passed on every pushed tip through `124eab27` | Rounds 1 to 6, each Opus accept with fixes and Astra reject, each round's findings fixed in the next commit with distinguishing tests and mutation checks (dispositions, one section per round). Round 6 at `b51c2a26` found the quote signature keyed by a value the form discloses; `124eab27` keys it with a server secret and covers the account and the member count, judges the pass's session against the intent it works on, keys the refusal review by the intent and retires exactly it. Round 7 at `124eab27`: Opus accept with fixes (one P2: the new quantity-event outcome missing from two sibling lists, so a resolved refusal held the account for good; three P3), Astra pending at 05:20. No round has yet ended with both reviewers accepting | integrated end to end; not merged | |
| +| `feat/carloku-multi-currency-20261001` | `f8a23ef3` (the eighth review's findings) | passed on every tip through `3e941f00` (04:28Z, `gate-currency-3e941f00.txt`, exit 0, three cross builds, clean tree); `f8a23ef3`: started 04:39Z (`gate-currency-f8a23ef3.txt`); the four billing packages passed in full on the same tree before the commit. Void logs, not evidence: `gate-currency-a9304f16.txt`, `gate-currency-f269365a-VOID-dirty-tree.txt` | passed on every pushed tip through `3e941f00`; `f8a23ef3` pending | Rounds 1 to 8, each Opus accept with fixes and Astra reject, each round's findings fixed in the next commit with distinguishing tests and mutation checks (dispositions, one section per round). The findings have narrowed: rounds 7 and 8 found no P1 and, in round 8, no P2 in the money paths (one review-routing gap, one rollback trap, operator visibility). Round 9 at `f8a23ef3`: running (`currency-review9-brief.txt`). No round has yet ended with both reviewers accepting | integrated end to end; not merged | |
| | `feat/carloku-billing-layout-20261001` | `c1ae91a0` | (templates only; gated inside the currency branch) | passed | none of its own | merged into the currency branch at `5047494b`; its two-form layout was replaced by one form in `8958392b` | |
| | `feat/carloku-storage-sole-holder-20261001` | `eaf6e63e` | passed on `3af02a65`; `eaf6e63e` is wording and reports | passed | 9 rounds; round 9 both accept (omitted-holder class closed) | needs approval K and a recorded cutover date; not merged | |
| -| `feat/carloku-metered-replicator-20261001` | sixth build, pushed 05:2x (tip in `~/.cache/tmp/claude-1001/replicator-tip.txt` and the branch page) | passed on `01f2b072`, `1b3cc29e`; the sixth build's gate started 05:2x; the ops, registry and lease tests pass under `/tmp` and `~/.cache` | passed on `01f2b072`, `1b3cc29e`; the sixth build pending | 4 at `01f2b072` and 5 at `1b3cc29e`: each Opus accept with fixes, Astra reject; the bounded findings of each fixed in the next build (dispositions, "Review four", "Review five"); the deep ones open: litestream's own opens, `dataDir` and shadow ancestry, requests tracked to completion, a walk by directory descriptor. 6: running | not merged; unwired side work gated on approval H | |
| +| `feat/carloku-metered-replicator-20261001` | `6b648c0c` (seventh build) | passed on `01f2b072`, `1b3cc29e`, `d63f81df`, `6b648c0c` (04:33Z, three cross builds); the ops, registry and lease tests pass under `/tmp` and `~/.cache` | passed on every pushed tip through `6b648c0c` | 4 (`01f2b072`), 5 (`1b3cc29e`), 6 (`d63f81df`): each Opus accept with fixes, Astra reject; the bounded findings of each fixed in the next build (dispositions, "Review four" to "Review six"); the deep ones open: litestream's own opens by path, `dataDir` and shadow ancestry, requests tracked to completion across midnight and a crash, a walk by directory descriptor, a tenant sharing the platform's uid. 7 at `6b648c0c`: Astra reject (three new bounded items: a vanished owned file advancing the clean boundary, intermediate fleets' own recorders, relative link targets cleaned lexically), Opus pending at 05:50 | not merged; unwired side work gated on approval H | |
| | `fix/carloku-observe-routes-cleanup-20261001` | `023e106c` | passed on `51587e00`; `023e106c` changes a test and two docs | passed | both accept at `51587e00` | merged into the launch branch at `47c97fa6` | |
| | `feat/carloku-paid-launch-20260916` (launch) | `b953fae4`: this night's documents (`ea7e3ea6`) + the merge of the observe-routes fix (`47c97fa6`) + the readiness update | passed 03:06Z on `b953fae4` (`gate-launch-b953fae4.txt`, exit 0, three cross builds); last code gate before it on `cd8821c6` | passed on `6a08f88d`; `b953fae4` pushed 04:10, run pending | 17 rounds, no whole-branch pass | the integration target; first accepted side branch merged | |
| | site `feat/paid-pricing-20260916` (GitHub) | `9427c22` | `node --test`: 18 pass (04:4x) | n/a | read-only by the currency reviews (section K); rounds four and five's site findings fixed in `4feb1cd` and `9427c22` | preview served at `http://100.119.180.57:38009`, rebuilt from `4feb1cd` (the `9427c22` change is the build script alone) | |
| ## The flow, behaviour the tests establish (2026-10-02) |
| -These are what the automated tests assert on `124eab27`, against fakes of Keymail and Stripe; none of it is proven against the real provider, and the seventh independent review of this code is in progress (Opus in, Astra pending). Tests: (`internal/console`: `TestBillingFormPostsWhatItShows`, |
| +These are what the automated tests assert on `f8a23ef3`, against fakes of Keymail and Stripe; none of it is proven against the real provider, and the ninth independent review of this code is running. Tests: (`internal/console`: `TestBillingFormPostsWhatItShows`, |
| `TestBillingPageCurrencyControls`, `TestPricingLinkSurvivesSignIn`, |
| `TestCurrencySuggestionCookie`, `TestCountrySuggestionCookie`, |
| `TestBillingInclusionsFollowTheQuotedBand`, |
| @@ -59,7 +59,7 @@ reconcile, calculation, invoice and recovery tests in |
| review of a session paid in the wrong currency retires its intent. |
| Reviews four and five each found some of these wanting; they hold at |
| `b51c2a26` by the tests named, and round six is reading them. |
| -- Demo at `http://100.119.180.57:41881`: rebuilt 05:1x from `124eab27` |
| +- Demo at `http://100.119.180.57:41881`: rebuilt 05:4x from `f8a23ef3` |
| (binary `billing-redesigned.test`, started by the stop-marker procedure; |
| the EUR-only binary is kept as `billing-redesigned-eur-only.test.bak`), |
| serving with the price book configured: the whole path from the pricing |