Readiness and handoff at 04:47: round five fixed and round six running; the replicator's fifth build gated and under review
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2 files changed,
+25
−24
.claude/HANDOFF.md+8 −8implementation/carloku-paid-launch/READINESS.md+17 −16
CI passed — run details
diff --git a/.claude/HANDOFF.md b/.claude/HANDOFF.md| index 4ef79ed7f..c1aaf0ad5 100644 |
| --- a/.claude/HANDOFF.md |
| +++ b/.claude/HANDOFF.md |
| @@ -7,37 +7,37 @@ |
| 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 04:35 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 04:47 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 04:3x from the currency branch's tip `1f005804`, 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 04:4x from the currency branch's tip `b51c2a26`, 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` `1f005804`: the price book and one stored currency per purchase end to end, the billing page as one form, the cookies, the demo. Four review rounds; every finding of the fourth (Opus accept with fixes, Astra reject) fixed with a distinguishing test (dispositions "Review four", eight mutants killed). Gate and CI passed on `8958392b`; gate on `1f005804` running at 04:35, CI pending; fifth review (Opus + Astra) running. No round has yet ended with both reviewers accepting. |
| -- `feat/carloku-metered-replicator-20261001` `01f2b072`: fourth build plus the chain-climb fix; gate and CI passed; fourth review in: Opus accept with fixes (P2-1 to P2-4), Astra reject (four P1s, mostly litestream's own opens and the hold's dates). Nothing fixed yet; the fifth build is next on that branch. |
| +- `feat/carloku-multi-currency-20261001` `b51c2a26`: the price book and one stored currency per purchase end to end, the billing page as one form with a signed quote, ownership on every path, the cookies, the demo. Five 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 five" is the latest). Gate and CI passed on `1f005804`; gate on `b51c2a26` running at 04:47, CI pending; sixth review (Opus + Astra) running. No round has yet ended with both reviewers accepting. |
| +- `feat/carloku-metered-replicator-20261001` `1b3cc29e`: fifth build (the fourth review's bounded findings fixed; the deep ones, litestream's first open above all, stated open); gate and CI passed on `1b3cc29e`; fifth review running. |
| - `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. |
| - `feat/carloku-late-request-fencing-20261001` `1b61de82`, `feat/carloku-bucket-hour-evidence-20261001` `0aa1fbec`: unchanged (rejected / needs approval J). |
| -- Site `feat/paid-pricing-20260916` (GitHub) `4feb1cd`: every amount from the platform's export; country band wiring; exact rates; honest link parameters, static links included; a draft book cannot be published. |
| +- Site `feat/paid-pricing-20260916` (GitHub) `9427c22`: every amount from the platform's export; country band wiring; exact rates; honest link parameters, static links included; a draft book cannot be published by `check` or `build`. |
| **NEEDED:** |
| - Paul, commercial: approve the 36 amounts as an `approved` book version (approval L) together with the USD/GBP overage rates and floors in `OVERAGE-RATES-PROPOSAL.md`, or state other figures; the HALF code word; the proration policy (B); the partial-month rule (C). |
| - 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 fifth (`logs/opus-currency-review5.md`, `astra-currency-review5.md`). The replicator's fourth is in and unaddressed. |
| +- Reviews to read when they land: the currency branch's sixth (`logs/opus-currency-review6.md`, `astra-currency-review6.md`) and the replicator's fifth (`opus-replicator-review5.md`, `astra-replicator-review5.md`). |
| **RECOMMENDED:** |
| -- Read the fifth currency review; if both accept, 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 sixth currency review; if both accept, 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. |
| - 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 04:35: the gate on the currency tip `1f005804` (`logs/gate-currency-1f005804.txt`), the two fifth-round currency 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 04:47: the gate on the currency tip `b51c2a26` (`logs/gate-currency-b51c2a26.txt`), the two sixth-round currency reviews, the two fifth-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. |
| 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 3f9c1a822..d248bb61c 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` | `1f005804` (the fourth review's findings) | `8958392b`: passed 03:01Z (`gate-currency-8958392b.txt`, exit 0, three cross builds, clean tree); `de81dd70`: passed 23:39Z. `1f005804`: started 03:22Z (`gate-currency-1f005804.txt`); the four billing packages passed in full on the same tree before the commit. Void logs, not evidence: `gate-currency-a9304f16.txt` (tree moved), `gate-currency-f269365a-VOID-dirty-tree.txt` (started on an uncommitted tree, killed) | passed on `de81dd70` and `8958392b`; `1f005804` pushed 04:25, run pending | 1 at `9d104f1d`: Opus accept with fixes, Astra reject. 2 at `a88a39e6`: Opus accept with fixes, Astra reject; fixed in `a9304f16`. 3 at `de81dd70`: Opus accept with fixes, Astra reject; fixed in `8958392b`. 4 at `8958392b`: Opus accept with fixes (seven P3), Astra reject (ten: ownership without the customer, the choice flag against the quote, invalid currency through the handler, the trigger's superset and its migration, a bound completion on changed metadata, legacy held currency, static links, the script's count, the draft flag); every finding of either fixed in `1f005804` with a distinguishing test, eight mutants killed (dispositions, "Review four"). 5 at `1f005804`: running (Opus + Astra, `currency-review5-brief.txt`). No round has yet ended with both reviewers accepting | integrated end to end: plans, Stripe client, console store/service/calculation/invoice, one billing form, cookies, demo; not merged | |
| +| `feat/carloku-multi-currency-20261001` | `b51c2a26` (the fifth review's findings) | `1f005804`: passed 03:26Z (`gate-currency-1f005804.txt`, exit 0, three cross builds, clean tree); `8958392b`, `de81dd70` passed before it. `b51c2a26`: started 03:45Z (`gate-currency-b51c2a26.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 `de81dd70`, `8958392b`, `1f005804`; `b51c2a26` pushed 04:46, run pending | 1 (`9d104f1d`), 2 (`a88a39e6`), 3 (`de81dd70`), 4 (`8958392b`): each Opus accept with fixes, Astra reject; each round's findings fixed in the next commit with distinguishing tests and mutation checks. 5 at `1f005804`: Opus accept with fixes (five P3), Astra reject (seven: ownership on the listing, reconcile and bind paths, forged agreeing quote fields, the trigger swap not atomic, the review reopening after resolution, the site's build entry point, the check's single page, an own-option shape); every finding of either fixed in `b51c2a26` (ownership on every path, a signed quote, the swap in one transaction, resolution retires the intent, paginated metadata counts, the tautology replaced), seven mutants killed, one equivalent (dispositions, "Review five"). 6 at `b51c2a26`: running (`currency-review6-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` | `01f2b072` (fourth build `b53f2a93` + the chain-climb fix) | `b53f2a93`: FAILED (two ops tests, the climb reached the temp root). `01f2b072`: passed 23:47Z (`gate-replicator-01f2b072.txt`, exit 0, three cross builds) | failed on `b53f2a93` (same two tests); **passed on `01f2b072`** | 3 rounds on the third build (Opus accept with fixes, Astra reject). 4 at `01f2b072`: running (`replicator-review4-brief.txt`) | not merged; open items in its dispositions, "Review three" | |
| +| `feat/carloku-metered-replicator-20261001` | `1b3cc29e` (fifth build) | `01f2b072`: passed 23:47Z; `1b3cc29e`: passed 03:39Z (`gate-replicator-1b3cc29e.txt`, exit 0, three cross builds); the ops tests pass under `/tmp` and `~/.cache` | passed on `01f2b072` and `1b3cc29e` | 3 rounds on the third build; 4 at `01f2b072`: Opus accept with fixes (P2-1 to P2-4), Astra reject (four P1s); the bounded findings fixed in `1b3cc29e` (admission re-check after the read, bounded witness reads, close once, the inherited window passed on, the file-swap lower bound, the chain's starting directory and the DynamicUser link, the safe header read, sidecar names, the inventory's silent drops), the deep ones (litestream's first open, shadow ancestry, requests tracked to completion) stated open (dispositions, "Review four"). 5 at `1b3cc29e`: running | 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) | `4feb1cd` | `node --test`: 18 pass (04:2x) | n/a | read-only by the currency reviews (section K); round four's site findings fixed in `4feb1cd` | preview served at `http://100.119.180.57:38009`, rebuilt from `4feb1cd` | |
| +| 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 `1f005804`, against fakes of Keymail and Stripe; none of it is proven against the real provider, and the fifth independent review of this code is still running. Tests: (`internal/console`: `TestBillingFormPostsWhatItShows`, |
| +These are what the automated tests assert on `b51c2a26`, against fakes of Keymail and Stripe; none of it is proven against the real provider, and the sixth independent review of this code is still running. Tests: (`internal/console`: `TestBillingFormPostsWhatItShows`, |
| `TestBillingPageCurrencyControls`, `TestPricingLinkSurvivesSignIn`, |
| `TestCurrencySuggestionCookie`, `TestCountrySuggestionCookie`, |
| `TestBillingInclusionsFollowTheQuotedBand`, |
| @@ -54,9 +54,12 @@ reconcile, calculation, invoice and recovery tests in |
| currency sold is a 400 on both doors; an account that bought before, |
| under the book or before it, is offered its currency alone; a session is |
| acted on only when it is the intent's own (id, account, customer, mode, |
| - bound id). Review four found all of these wanting at `8958392b`; they |
| - hold at `1f005804` by the tests named, and round five is reading them. |
| -- Demo at `http://100.119.180.57:41881`: rebuilt 04:3x from `1f005804` |
| + bound id); the page signs its quote with the session's own token, so a |
| + post buys only a quote a page rendered for that session; resolving the |
| + 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 04:4x from `b51c2a26` |
| (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 |
| @@ -89,12 +92,10 @@ Each is scoped in `ENABLEMENT.md` section 8 and `OUTSTANDING.md`. |
| own review. |
| - `OUTSTANDING.md` items 7 and 9 (late requests past Stripe's key memory) |
| are open defects, held, not waived. |
| -- The replicator's fourth review (Opus accept with fixes: P2-1 to P2-4; |
| - Astra reject: four P1s on litestream's first open, admission after |
| - staleness, the hold's dates and shadow ancestry, plus six more): nothing |
| - of it fixed yet; the fifth build is the next work on that branch. |
| -- Open on the currency branch after round four: an operator's door to |
| - retire the intent of a refused, paid session once the money is settled |
| - (today the review reopens on the next pass once resolved); two |
| - unreviewed system strings on the billing page (`billing.quote.unknown`, |
| - `billing.currency.unknown`). |
| +- The replicator's deep open items after its fourth review: a swap during |
| + litestream's first open is never seen (needs a litestream change); |
| + shadow directories' ancestry; requests tracked to completion across |
| + midnight and a crash. Its fifth build fixed the bounded ones. |
| +- Open on the currency branch after round five: two unreviewed system |
| + strings on the billing page (`billing.quote.unknown`, |
| + `billing.currency.unknown`); everything else waits on Stripe test mode. |