carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1# Review brief: temporary static sites
2
3You are an independent second reader of a design spec for the CARLOS
4platform (this repository). Read cold and adversarially.
5
6**Spec:** `docs/superpowers/specs/2026-09-25-temporary-static-sites-design.md`
7at the commit named in the prompt.
8
9## Fixed rulings, do not re-argue
10
11§1 of the spec lists the rulings the product owner has taken. Do not
12propose alternatives to them. Report only mechanisms that **fail to
13honour** a ruling, or that break something else in the platform.
14
15## What to check
16
17Verify against the code, not the spec's description of it. Cite
18`file:line` for every claim about existing code. The places that matter:
19
20- `internal/release/trash.go` (tombstone, `TrashCooloff`, `PurgeApp`,
21 `PurgeReady`), `internal/release/production.go` (signed flag envelope).
22- `internal/domains/reconcile.go` (trash listing 1a, route drop 1c,
23 auto-purge 1d, platform/canary minting).
24- `internal/host/housekeeper.go`, `internal/host/agent.go` (which boxes
25 run the domains reconcile, and whether they hold bucket write).
26- `internal/console/apicli.go` (`handleAPITrashApp`,
27 `handleAPIRestoreApp`), `internal/console/domainattach.go`,
28 `internal/console/apiinstances.go`, `internal/console/authcli.go`.
29- `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).
30- `deploy.go` (`runDeploy`, `mintPlatformHost`, `deployTargets`,
31 ship-then-promote order), `apps.go`, `retention.go`.
32
33Questions worth your time:
34
351. Can a real, permanent site end up expired, or purged on the 3-day
36 window? Look for any path: races, restore, keep, the brand-new
37 checks, legacy unqualified keys, apps with object stores, apps
38 created by `carlos instances create` rather than deploy.
392. Can a temporary app escape expiry or the cap (keep races, restore
40 loops, manual trash, `apps ttl` bounds, renaming, the listing)?
413. Does the fail-safe table in §2 hold at every consumer, including
42 boxes running old code and keyless boxes?
434. Does the spec's claim that only the housekeeper writes the trash
44 marker on expiry match how reconcile is actually scheduled? What
45 bucket authority does that box have?
465. Ordering: expiry-record-first creation, restore's rewrite-then-
47 untrash, and purge's re-read. Any window left?
486. Anything the spec relies on that does not exist, or exists with a
49 different shape.
50
51## Output
52
53A numbered list of findings, each with: severity (P1 breaks a ruling or
54loses data, P2 wrong behaviour, P3 clarity/gap), the spec section, the
55code evidence with `file:line`, and a concrete fix. Then a one-line
56verdict: accept, or revise. Do not rewrite the spec. No praise.
57
58On a later round you will be given your earlier findings files. Start
59with a disposition table (finding → fixed / declined-with-reason
60acceptable / not fixed), then only new findings.
61