carlos / platform Public

Refresh the handoff and the billing preview after the review fixes

Documents and the regenerated review preview only; no code. The billing
review server moved to port 45033 when it was restarted with the new
chooser string.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev ae8c911aa7476991c1ff1202210784ed8dfda5a9 parent 8e7499a
3 files changed, +17 −16
  • .claude/HANDOFF.md +7 −6
  • implementation/carloku-paid-launch/AGENT_HANDOFF.md +1 −1
  • implementation/carloku-paid-launch/copy-review/billing-page/preview/index.html +9 −9

CI passed — run details

diff --git a/.claude/HANDOFF.md b/.claude/HANDOFF.md
index 8b6e3489f..a1c0e57d3 100644
--- a/.claude/HANDOFF.md
+++ b/.claude/HANDOFF.md
@@ -7,15 +7,16 @@
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:**
-Branch tip 5d1a2643, pushed; Amadan CI was running on it at 00:00. Landed tonight: the console GET /a/{sqid}/billing page with tests (cf0b77b7), the durability ledger epoch race fix with a -race regression (f4865344), the billing copy-review index and preview renderer (9acaf6f6), and a tailnet demo of the signup and billing flow with simulated Keymail and Stripe (5d1a2643). The pricing page is on carlosframework/carloku branch feat/paid-pricing-20260916 (35f29d8). Both pages carry fresh draft copy: the 2026-09-22 approvals were lost with /tmp and are not claimed. Review servers are running: pricing http://docs-t1.tail5fd3ba.ts.net:38009 (fallback http://100.119.180.57:38009), billing page http://docs-t1.tail5fd3ba.ts.net:36481 (fallback http://100.119.180.57:36481), interactive demo http://100.119.180.57:41881. Billing remains OFF; live Stripe untouched tonight; no AWS or production changes. Metering workers landed partial commits in their worktrees (P6: 8f8de754 unmetered fallbacks file incompleteness; P5: bf34faa8 awsbilling CUR reader); integration is in progress. Eight TestControlPlane* tests fail on the tip outside the sandbox; whether they also fail on the base commit is being checked.
+Code tip 8e7499ae (later commits are documents and the regenerated preview only). On that commit: `go build`, `go vet`, gofmt and `go test ./...` plus the vendored Litestream package passed outside the sandbox (60 packages ok, log `logs/gate-review-fixes.txt` in the run directory) and all five cross builds passed. Amadan CI for the tip must still be read. Independent review: round 1 (GPT-6 Astra) rejected with ten findings, all accepted and fixed with reproductions (`docs/superpowers/specs/CODEX-DISPOSITIONS-carloku-paid-launch-overnight.md`); round 2 by Astra and the AGENTS-required Opus production review were started against 8e7499ae and their results are not yet in. Landed tonight: console GET billing page, signup and billing demo harness, durability epoch race fix, unmetered-fallback escapes, AWS Cost and Usage Report transfer collector with bucket ownership ledger, statement folds for both new meters, operator doors for review holds and the house marker, team quantity worker behind an unset policy switch, Stripe provisioning plan and print-only script. Review servers running on docs-t1: pricing http://docs-t1.tail5fd3ba.ts.net:38009 (fallback http://100.119.180.57:38009), billing page http://docs-t1.tail5fd3ba.ts.net:45033 (fallback http://100.119.180.57:45033), interactive demo http://100.119.180.57:41881. Billing is OFF; live Stripe untouched; no AWS or production change. Copy on both pages is a fresh draft: the 2026-09-22 approvals were lost and are not claimed.
**NEEDED:**
-- Paul: approve or edit both copy reviews; confirm the HALF code word and the proration choice ("charged straight away, prorated") in the pricing review.
-- Scoped approvals, prepared as plans only: rk_live restricted key, Stripe catalog provisioning (implementation/carloku-paid-launch/stripe-provisioning.md when the Sonnet worker lands), the CUR Data Export and report bucket for object-store transfer.
+- Paul: approve or edit both copy reviews; confirm the HALF code word; decide the proration policy (`CONSOLE_BILLING_PRORATION` stays unset until then).
+- Scoped approvals, prepared as plans only: the rk_live restricted key and Stripe catalog (`implementation/carloku-paid-launch/stripe-provisioning.md`), the Cost and Usage Report export (`docs/superpowers/plans/2026-10-01-store-transfer-cur-collector.md`).
+- Decisions: how existing and adopted store buckets get an attested ownership history; which attestation path for replication writes (`docs/superpowers/plans/2026-10-01-durability-attestation-path.md`); whether a partial first month is waived.
**RECOMMENDED:**
-- Integrate the P5 and P6 worker branches after review, run the full gate (`make test`, cross builds), read Amadan CI, refresh requirements-audit.json and AGENT_HANDOFF.md, then obtain the Astra whole-branch review.
-- Then the quantity/proration worker behind an explicit policy switch, the house and review operator doors, and Free-tier enforcement.
+- Read the round 2 Astra findings and the Opus review, fix what they find, and re-review the exact tip before anything lands.
+- Then: quantity reduction at renewal, a `carlos` verb and docs for the operator doors, Free-tier enforcement, dormancy and pool accounting (none started).
**SESSION:**
-Not safe to close: three review servers and the demo are serving on this box (pids in /home/paulca/.local/share/carloku-paid-launch-20260930/logs), and workers may still be committing in .claude/worktrees under the main checkout.
+Not safe to close: three servers are serving on this box (pids and stop file under `/home/paulca/.local/share/carloku-paid-launch-20260930/logs`), and two review processes may still be running.
diff --git a/implementation/carloku-paid-launch/AGENT_HANDOFF.md b/implementation/carloku-paid-launch/AGENT_HANDOFF.md
index ac2c48992..ae4e4b384 100644
--- a/implementation/carloku-paid-launch/AGENT_HANDOFF.md
+++ b/implementation/carloku-paid-launch/AGENT_HANDOFF.md
@@ -19,7 +19,7 @@ Paid plans live with Stripe Tax and the complete metered model. No annual-only l
## Review surfaces (running on docs-t1; restart recipes below)
- Pricing page copy review: `http://docs-t1.tail5fd3ba.ts.net:38009`, fallback `http://100.119.180.57:38009`. 87 strings, hand-built preview.
-- Console billing page copy review: `http://docs-t1.tail5fd3ba.ts.net:36481`, fallback `http://100.119.180.57:36481`. 39 strings; the preview is ten page states rendered through the real handlers.
+- Console billing page copy review: `http://docs-t1.tail5fd3ba.ts.net:45033`, fallback `http://100.119.180.57:45033`. 40 strings; the preview is ten page states rendered through the real handlers.
- Interactive signup and billing demo: `http://100.119.180.57:41881`. Real console handlers and store in test mode. Keymail sign-in and Stripe checkout and portal are labelled simulations on the same host. It is not Stripe proof.
- The tailnet name did not resolve from the box itself or from the supervising session; only the IP form was verified by request. Both review results land in `result.json` beside each `strings.json`.
- Restart a review: `~/.claude/skills/copy-review/serve.sh <strings.json> 1440` with the sandbox off. Restart the demo: `CARLOS_BILLING_DEMO_ADDR=0.0.0.0:41881 CARLOS_BILLING_DEMO_ORIGIN=http://100.119.180.57:41881 CARLOS_BILLING_DEMO_STOP=<file> go test ./internal/console -run TestBillingFlowDemo -count=1 -timeout 15h`; create the stop file to end it. Re-render billing page states: `CARLOS_BILLING_PREVIEW_DIR=<dir> go test ./internal/console -run TestBillingPageRenderPreview`, then `copy-review/billing-page/bind.py <dir>`.
diff --git a/implementation/carloku-paid-launch/copy-review/billing-page/preview/index.html b/implementation/carloku-paid-launch/copy-review/billing-page/preview/index.html
index ddab558c8..412ca779a 100644
--- a/implementation/carloku-paid-launch/copy-review/billing-page/preview/index.html
+++ b/implementation/carloku-paid-launch/copy-review/billing-page/preview/index.html
@@ -448,7 +448,7 @@
<a class="addr" href="/settings" title="Your settings">paul@keymail.dev</a>
<form method="post" action="/auth/signout">
- <input type="hidden" name="csrf" value="ZMN9j5wRsWbKVAXM9H5YrfbyML9QQvNlVAtQB_JE8NQ">
+ <input type="hidden" name="csrf" value="kNaVjkqrWoKQCUW0HrmSh6u20nFOLYYgAlZvEDeCt_o">
<button class="linkish" type="submit">Sign out</button>
</form>
</nav>
@@ -497,7 +497,7 @@
<p class="small">Prices for Ireland are 100% of the base price, and so are the monthly inclusions.</p>
<form method="post" action="/a/bab/billing/checkout">
- <input type="hidden" name="csrf" value="ZMN9j5wRsWbKVAXM9H5YrfbyML9QQvNlVAtQB_JE8NQ">
+ <input type="hidden" name="csrf" value="kNaVjkqrWoKQCUW0HrmSh6u20nFOLYYgAlZvEDeCt_o">
<div class="tablewrap">
<table>
@@ -594,7 +594,7 @@
<form method="post" action="/a/bab/billing/checkout">
- <input type="hidden" name="csrf" value="ZMN9j5wRsWbKVAXM9H5YrfbyML9QQvNlVAtQB_JE8NQ">
+ <input type="hidden" name="csrf" value="kNaVjkqrWoKQCUW0HrmSh6u20nFOLYYgAlZvEDeCt_o">
<div class="tablewrap">
<table>
@@ -691,7 +691,7 @@
<form method="post" action="/a/bab/billing/checkout">
- <input type="hidden" name="csrf" value="ZMN9j5wRsWbKVAXM9H5YrfbyML9QQvNlVAtQB_JE8NQ">
+ <input type="hidden" name="csrf" value="kNaVjkqrWoKQCUW0HrmSh6u20nFOLYYgAlZvEDeCt_o">
<div class="tablewrap">
<table>
@@ -788,7 +788,7 @@
<form method="post" action="/a/bab/billing/checkout">
- <input type="hidden" name="csrf" value="ZMN9j5wRsWbKVAXM9H5YrfbyML9QQvNlVAtQB_JE8NQ">
+ <input type="hidden" name="csrf" value="kNaVjkqrWoKQCUW0HrmSh6u20nFOLYYgAlZvEDeCt_o">
<div class="tablewrap">
<table>
@@ -885,7 +885,7 @@
<form method="post" action="/a/bab/billing/checkout">
- <input type="hidden" name="csrf" value="ZMN9j5wRsWbKVAXM9H5YrfbyML9QQvNlVAtQB_JE8NQ">
+ <input type="hidden" name="csrf" value="kNaVjkqrWoKQCUW0HrmSh6u20nFOLYYgAlZvEDeCt_o">
<div class="tablewrap">
<table>
@@ -970,7 +970,7 @@
<h2><span data-copy="billing.manage.heading">Cards, invoices and cancelling</span></h2>
<p class="small"><span data-copy="billing.manage.body">Change your card, download invoices or cancel at Stripe. Cancelling keeps the plan until the end of the year you paid for.</span></p>
<form method="post" action="/a/bab/billing/portal">
- <input type="hidden" name="csrf" value="ZMN9j5wRsWbKVAXM9H5YrfbyML9QQvNlVAtQB_JE8NQ">
+ <input type="hidden" name="csrf" value="kNaVjkqrWoKQCUW0HrmSh6u20nFOLYYgAlZvEDeCt_o">
<button type="submit"><span data-copy="billing.manage.button">Open billing at Stripe</span></button>
</form>
@@ -1010,7 +1010,7 @@
<h2><span data-copy="billing.manage.heading">Cards, invoices and cancelling</span></h2>
<p class="small"><span data-copy="billing.manage.body">Change your card, download invoices or cancel at Stripe. Cancelling keeps the plan until the end of the year you paid for.</span></p>
<form method="post" action="/a/bab/billing/portal">
- <input type="hidden" name="csrf" value="ZMN9j5wRsWbKVAXM9H5YrfbyML9QQvNlVAtQB_JE8NQ">
+ <input type="hidden" name="csrf" value="kNaVjkqrWoKQCUW0HrmSh6u20nFOLYYgAlZvEDeCt_o">
<button type="submit"><span data-copy="billing.manage.button">Open billing at Stripe</span></button>
</form>
@@ -1050,7 +1050,7 @@
<h2><span data-copy="billing.manage.heading">Cards, invoices and cancelling</span></h2>
<p class="small"><span data-copy="billing.manage.body">Change your card, download invoices or cancel at Stripe. Cancelling keeps the plan until the end of the year you paid for.</span></p>
<form method="post" action="/a/bab/billing/portal">
- <input type="hidden" name="csrf" value="ZMN9j5wRsWbKVAXM9H5YrfbyML9QQvNlVAtQB_JE8NQ">
+ <input type="hidden" name="csrf" value="kNaVjkqrWoKQCUW0HrmSh6u20nFOLYYgAlZvEDeCt_o">
<button type="submit"><span data-copy="billing.manage.button">Open billing at Stripe</span></button>
</form>