Handoff: the second overnight run, the evening's approvals, every branch's state at 23:10
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
1 file changed,
+15
−24
.claude/HANDOFF.md+15 −24
CI passed — run details
diff --git a/.claude/HANDOFF.md b/.claude/HANDOFF.md| index 1ac5d5e59..133410641 100644 |
| --- a/.claude/HANDOFF.md |
| +++ b/.claude/HANDOFF.md |
| @@ -7,35 +7,26 @@ |
| 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 12:50 Dublin on 2026-10-01, at the end of the run. Nothing is running for it any more except the three review servers. Three things, kept apart. |
| +Written 23:10 Dublin on 2026-10-01, 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 on). Billing is OFF; no live Stripe or AWS write; nothing deployed; no merge to main. |
| -1. Draft copy to review, not approved: pricing http://100.119.180.57:38009 (name form http://docs-t1.tail5fd3ba.ts.net:38009), console billing page http://100.119.180.57:45033 (name form http://docs-t1.tail5fd3ba.ts.net:45033). |
| -2. A demo to click through: http://100.119.180.57:41881, real console handlers with Keymail and Stripe simulated. It is not Stripe proof. |
| -3. A tested branch that is not production-ready. `implementation/carloku-paid-launch/OUTSTANDING.md` says what is reviewable, tested and proven, lists every launch blocker, and lists each approval to ask for with its exact scope. |
| +Review servers, all answering 200: pricing http://100.119.180.57:38009, console billing page http://100.119.180.57:45033, demo http://100.119.180.57:41881 (old EUR-only redesigned binary; Keymail and Stripe simulated; to be rebuilt from the integrated source tonight). |
| -All three review servers answered 200 on the IP form at 12:48 Dublin. |
| +Decisions and approvals received 2026-10-01 evening: |
| +- Fixed annual base prices, confirmed for implementation (not production): Personal 28 USD / 24 EUR / 22 GBP; Community 6 / 5 / 4.50 per member; Business 60 / 50 / 45 per member; team minimum 10. Overage USD/GBP rates and floors remain draft; a full rate table is owed for morning approval. |
| +- Currency rulings: USD default (international and unknown), EUR for EU member states, GBP for the UK; visible override; the chosen currency persists across pricing, signup, annual and monthly bills; band from billing country only; allowances never change with currency. |
| +- Copy approved verbatim: the five currency strings (site `copy-review/currency/result.json`) and the regrouped pricing page (`copy-review/pricing/result.json`, latest user edits preserved). Both committed on the site branch `feat/paid-pricing-20260916` at 7bd8fcc. |
| -Preview readiness with billing off is not launch readiness, and a review that accepts a diff is not approval of the branch. Full metering is not ready: neither metered source is proven (replication writes, store transfer), Stripe has no catalog or runtime key and the quantity fence is unverified, and quantity reduction at renewal and the Free tier are not built. |
| +Branches (all on the forge, none merged; the local gate is not CI): |
| +- `feat/carloku-multi-currency-20261001`: the price book and one stored currency per purchase, end to end (plans, Stripe client, console store, checkout, reconcile, version 2 calculation, invoice engine, config, provisioning plan and script). Review 1 at 9d104f1d (Opus accept with fixes, Astra reject) fixed in a88a39e6; review 2 at a88a39e6 (Opus accept with fixes, Astra reject: older-build barrier on mixed history, bound session not expired, paid session wedge, currency_options) fixed in a9304f16 (gate running at 23:10). 5047494b merges the layout branch's templates in; the billing page's currency controls are next, then a gate on the integrated tip and review 3. Design: `docs/superpowers/specs/2026-10-01-multi-currency-price-book-design.md`; dispositions `DISPOSITIONS-multi-currency.md`; discussion #198. |
| +- `feat/carloku-billing-layout-20261001` c1ae91a0: the layout session's billing page redesign, committed as handed over, merged into the currency branch. |
| +- `feat/carloku-storage-sole-holder-20261001` 3af02a65: review 8 both accept with fixes; fixes applied; review 9 running. Needs approval K. |
| +- `feat/carloku-metered-replicator-20261001` 4c9cdb3c: third build; review 3 Opus accept with fixes (one new P1: a single-file unit route follows links above it; a swap during litestream's first open), Astra reject. Reports on the branch; dispositions and fixes owed. |
| +- `fix/carloku-observe-routes-cleanup-20261001` 023e106c: both reviews accept; ready to merge into the launch branch. |
| +- `feat/carloku-late-request-fencing-20261001` 1b61de82, `feat/carloku-bucket-hour-evidence-20261001` 0aa1fbec: unchanged since the morning handoff (rejected / needs approval J). |
| -Billing is OFF, the quantity worker is OFF (two switches, both unset), nothing attests, nothing was deployed, and no live Stripe or AWS write was made. |
| +Launch branch tip 12e70d95 (this commit adds only this file). Last product-code commit cd8821c6; Amadan CI passed on it and on the handoff tips through a78d5982. |
| -Last gated tip when this was written: `bac513f6` (handoff-only commits sit on top). This file does not claim what later commits contain; read `git log bac513f6..` for that. |
| - |
| -- `cd8821c6` is the last commit that changes product code (round seventeen's fixes). Local gate on it: build, vet, gofmt, `make test` with 61 packages ok on the second run (`logs/gate-cd8821c6.txt` in the run directory; the first run failed one `internal/activator` test, log kept as `logs/gate-cd8821c6-run1-failed.txt`); cross builds for darwin, linux arm64 and windows (`logs/cross-cd8821c6.txt`). Amadan CI passed on `cd8821c6`. |
| -- `bac513f6` changes one test file only: it fixes that activator test. Its recording script wrote a file with a shell redirect, which creates the file empty before the content arrives, and the test could read it in that moment. The file is now renamed into place whole. Under the same load, 55 failures in 1,280 runs before and none after. Local gate on `bac513f6`: 61 packages ok, first run (`logs/gate-bac513f6.txt`). CI passed on `c1cf8822`, which is `bac513f6` plus this file. |
| -- Amadan CI sat queued all night, first ran at 07:34 Dublin, and has passed on `1395f7bf`, `d0a21aa1`, `d5705a63`, `973a9f15`, `abc9f781`, `86a1849d`, `cd8821c6`, `c1cf8822` and the handoff-only tips after it up to `a78d5982`. It has not run on any side branch. The local gate is not offered in CI's place. |
| - |
| -Independent review. No review of the whole branch has passed. GPT-6 Astra rejected rounds 1 to 16; the AGENTS-required Opus production review accepted with fixes in rounds 2 to 16. Each round found the round before closed for its reported shapes and found neighbouring ones, in the object-store walks (`internal/objstore`) and their readers since round seven. Round seventeen read only the diff since round sixteen: Opus accepted, Astra accepted with fixes (one P2). That P2 and Opus's small items are fixed in `cd8821c6` and have not been read by a reviewer. Open items the reviews left are in `OUTSTANDING.md` 19a to 19i. Nothing lands until the whole branch has been read and accepted. Dispositions, round by round: `docs/superpowers/specs/CODEX-DISPOSITIONS-carloku-paid-launch-overnight.md`. |
| - |
| -Two open defects, both with their paths disabled, neither offered as a risk to accept: a quantity request that runs after Stripe has forgotten its key, and a late invoice-line request that can leave a finalized invoice with a wrong total a customer could pay. The design meant to remove both is `docs/superpowers/plans/2026-10-01-late-request-fencing.md`; its first review found that, as designed, it does not (below). |
| - |
| -Side branches, all on the forge, none run through CI, nothing on the launch branch calls them. Each has now had one review by both reviewers, and none passed: |
| - |
| -- `feat/carloku-late-request-fencing-20261001` (`1b61de82`, rebased onto this branch at `a78d5982`, full local gate passes): a Stripe request cannot outlive its connection, and a void for a wrong-total invoice (remediation only). Both reviewers rejected it at `1772e840`. Five findings are fixed since and unread. One finding limits the design: the provider's idle-connection limit bounds when a request can begin to be written, not when a whole request is received. As designed the branch does not close the two defects. Open: the sandbox probe and three transport tests, in `DISPOSITIONS-late-request-fencing.md` on that branch. |
| -- `feat/carloku-metered-replicator-20261001` (`9c08ce31`, rebased onto this branch at `72b4f59a`, full local gate passes): path B, first pieces. Rejected by both reviewers twice, at `ebab1a37` and at `f4fe6f2b`. The second review found the ownership fence added after the first does not hold as built: a refused request is still sent, and the registry witness is moved by the replicator's own bookkeeping. Both need changes outside that branch's packages before a third review. What holds: ownership by file for the database itself, the refusals for unclaimed files and unreadable directories, the platform identities, the private store, and `Close` stopping the store. `DISPOSITIONS-metered-replicator.md` on that branch. |
| -- `feat/carloku-bucket-hour-evidence-20261001` (`0aa1fbec`, rebased onto this branch at `a78d5982`, full local gate passes): the operator evidence door for a store's partial first hour. Reviewed once: Astra rejected it, Opus accepted with fixes. Both confirmed it releases only that hour for the owner the ledger names. Both found the evidence is free text one operator records, which in practice is a waiver. That needs your ruling (approval J in `OUTSTANDING.md`). Nothing fixed yet. `DISPOSITIONS-bucket-hour-evidence.md` on that branch. |
| -- `feat/carloku-storage-sole-holder-20261001` (`4ed6b71e`, off this branch at `c68ecddd`, full local gate passes): the fix for `OUTSTANDING.md` 19i. The storage pass sizes a store only when it is the sole holder of its bucket. Read six times. The fifth reading, of a diff, was accepted with fixes by both reviewers. The sixth, of the whole change, was accepted with fixes by Opus and rejected by Astra on one P1, fixed in `4ed6b71e` and unread. It is the nearest of the side branches to mergeable. It is not accepted and not merged: it needs one more reading and your ruling on approval K. |
| -- `feat/carloku-scoped-attestation-20261001` (`058ea506`): path A, parked. It cannot prove an exclusive writer. Replication-write completeness is a launch blocker, not waived. |
| +What the night still owes (the brief): finish and gate the currency branch with the page integrated; the site's currency selector wired to the generated price book; the demo rebuilt from the integrated source; the replicator and storage findings; the 36-price catalog, runtime credential and permission plan, webhook, portal, release and rollback plan; the readiness checklist with evidence; the morning report with the USD/GBP overage rate proposal and the scoped approvals. |
| **NEEDED:** |
| - Paul: approve or edit both copy reviews; confirm the HALF code word; decide the proration policy; approve or change the whole-paid-day rule for partial months; review copy for the store refusals (`OUTSTANDING.md` 19g); rule on what counts as evidence for a held bucket-hour (approval J); rule on storage for a bucket a store has left (approval K). No ruling is asked for on a store's first clock hour or a box's first minutes: they hold by default, and what releases one is an operator evidence door, not a waiver. |