carlos / platform Public
Review brief: temporary static sites
You are an independent second reader of a design spec for the CARLOS platform (this repository). Read cold and adversarially.
Spec: docs/superpowers/specs/2026-09-25-temporary-static-sites-design.md at the commit named in the prompt.
Fixed rulings, do not re-argue
§1 of the spec lists the rulings the product owner has taken. Do not propose alternatives to them. Report only mechanisms that fail to honour a ruling, or that break something else in the platform.
What to check
Verify against the code, not the spec's description of it. Cite file:line for every claim about existing code. The places that matter:
internal/release/trash.go(tombstone,TrashCooloff,PurgeApp,PurgeReady),internal/release/production.go(signed flag envelope).internal/domains/reconcile.go(trash listing 1a, route drop 1c, auto-purge 1d, platform/canary minting).internal/host/housekeeper.go,internal/host/agent.go(which boxes run the domains reconcile, and whether they hold bucket write).internal/console/apicli.go(handleAPITrashApp,handleAPIRestoreApp),internal/console/domainattach.go,internal/console/apiinstances.go,internal/console/authcli.go.internal/console/store.go(apps table,CreateAppIn, trash rows),internal/console/materialize.go,internal/console/ownership.go,internal/console/server.go(claimApp),accounts.go(migrate).deploy.go(runDeploy,mintPlatformHost,deployTargets, ship-then-promote order),apps.go,retention.go.
Questions worth your time:
- Can a real, permanent site end up expired, or purged on the 3-day window? Look for any path: races, restore, keep, the brand-new checks, legacy unqualified keys, apps with object stores, apps created by
carlos instances createrather than deploy. - Can a temporary app escape expiry or the cap (keep races, restore loops, manual trash,
apps ttlbounds, renaming, the listing)? - Does the fail-safe table in §2 hold at every consumer, including boxes running old code and keyless boxes?
- Does the spec's claim that only the housekeeper writes the trash marker on expiry match how reconcile is actually scheduled? What bucket authority does that box have?
- Ordering: expiry-record-first creation, restore's rewrite-then- untrash, and purge's re-read. Any window left?
- Anything the spec relies on that does not exist, or exists with a different shape.
Output
A numbered list of findings, each with: severity (P1 breaks a ruling or loses data, P2 wrong behaviour, P3 clarity/gap), the spec section, the code evidence with file:line, and a concrete fix. Then a one-line verdict: accept, or revise. Do not rewrite the spec. No praise.
On a later round you will be given your earlier findings files. Start with a disposition table (finding → fixed / declined-with-reason acceptable / not fixed), then only new findings.