carlos / platform Public
Review brief: carlos db reads for instances in another region
You are an independent second reader of one design spec for the CARLOS platform (this repository). Read it cold and adversarially. Nothing is built yet; you are reviewing the design against the code on main.
Spec: docs/superpowers/specs/2026-10-22-db-region-forward-design.md, at the commit named in the prompt. Read AGENTS.md first.
Round 5
This is round 5. Rev 5 of the spec answers your round 4 findings, docs/superpowers/specs/CODEX-FINDINGS-DB-REGION-FORWARD-R4.md (reviewed at 010d29f6). Earlier rounds are in CODEX-FINDINGS-DB-REGION-FORWARD.md, -R2.md and -R3.md. Round 4 found the five invariants J1 to J5 (§5.3) fixed and the design converged. Rev 5 adds no mechanism; it makes four direct fixes, each marked (codex N):
| # | Finding | Round 4 said | Rev 5's answer | |---|---|---|---| | 7 | stored-ciphertext wording | partly, P3 | the 64 MiB plaintext limit and the stored ciphertext are now separate: raw sealed envelopes, under 100 bytes of overhead per 256 KiB chunk, base64 only on the wire, §5.7 | | 8 | restart recovery for disk reservations | partly, P2 | reconciliation by refusal against the units actually running, never a guessed size; and a worker that loses its connection exits by itself within 5 s, because litestream's file client and the LTX compactor ignore cancellation, §5.7, §8.3 | | 19 | progress writes not guaranteed to leave the console | new, P2 | every line flushed with ResponseController.Flush under its write deadline; admitted flushed with the headers; application/x-ndjson is not gzipped by the edge; work before the 200 bounded at 20 s for backhaul's 30 s header timeout, §5.5 step 6 | | 20 | the result can overtake the final chunk | new, P2 | result read before the listing, as the run's follow door does; the result line written only after every chunk through last_seq, §5.5 step 6 |
Findings 1 to 6 and 9 to 18 were fixed or declined-agreed in round 4 and are unchanged.
Your answer has two parts, in this order.
- A disposition table for findings 1 to 20: fixed, declined with an acceptable reason, or not fixed. Check rev 5's four answers against the code, not against the spec's summary of it.
- Only new findings of severity P0, P1 or P2. Leave out P3s this round. Do not repeat an earlier finding unless its fix is wrong or incomplete; then say so in the table and give the new evidence.
Fixed rulings: do not re-argue them
The product owner approved this direction:
- the console forwards a db read to a box in the region where the data lives;
- that box reads its own region's replica, runs the read-only operation there, and returns only the result;
- the console never reads another region's bucket;
- there is no console per region.
The carlos run spec's ruling also holds: the console never connects to a box, and output travels as objects in the deployment bucket.
Do not propose alternatives to these (a console per region, an IAM grant that lets the console read other regions, a direct console-to-box connection). Report only:
- a mechanism that fails to honour a ruling;
- a mechanism that breaks something else in the platform;
- a mechanism that cannot be built as described against
main.
The spec's own decisions (§4, D1 to D8) are open to challenge. The provisional rulings in §16 are for the product owner; comment on them only where the spec's mechanism fails to honour one or is unsafe.
What to check
Check against the code, not the spec's description of it. Cite file:line for every claim about existing code. These are the places that matter.
The db door and the CLI:
internal/console/apidb.go:resolveReplica,dbGate,resolveDBSource,dbClassRefusal,listReplicaLevel, the stream bounds;internal/console/apidbclaim.go: why the claim door stays refused;db.go:runQueryContext,checkQuerySQL,dbRestoreError,dbQueryStatus;internal/dbdoor/:plan.go(PlanRestore),restore.go(RestoreAsOf, the--atpath),client.go;internal/lease/endpoint.go:ReadReplicaClient, the root-credential branch ofnewReplicaClientForUID.
The transport the spec copies:
internal/runs/runs.go,store.go;internal/console/apiruns.go,apirunsfollow.go,runsweep.go;internal/host/runs.go;internal/release/rootenvelope.goandhostretry.go: the signed-request precedent;internal/appconfig/crypto.go: the sealing construction the spec reuses.
The long request (round 4):
internal/edge/edge.go: the public listeners (around lines 3188 and 3354) andunixProxyandtcpProxy(around line 2377);cmd/console/main.go: the console'shttp.Server(around line 586);internal/console/apiinstanceimport.go: the per-request read deadline (around line 479);auth.go(the CLI's 30 s console client) andapimode.go(shipTimeout);internal/console/apidb.go:handleAPIDBGetanddbStream, the streaming precedent.
Boxes, capability and sandbox:
internal/host/edgesfile.go(capabilities),movesoffline.goandmovesoffline_stage.go(how a capability is tied to an armed worker);internal/edgesfile/snapshot.go:ReadLiveSnapshot,Draining,Fresh;internal/host/claimunit_template.go,bootstrap.go(tmpfilesConf, socket ownership), and whereverensureSystemUnitsinstalls units;internal/activator/backend_unit.go: howcarlos-app@units and their sockets are started without root.
IAM and infrastructure:
infra/modules/region-host/main.tf:host_buckets;- carlosframework/carloku-infrastructure
region-uk.tfandregion-ie.tf(on GitHub): which bucket each box role reaches, and the module refs.
Census:
internal/provision/plan14_root_reads_test.go,plan9_b8_census_test.go,moves_offline_census_test.go;docs/superpowers/notes/census-proposal-moves-offline-precopy.mdfor how an overlay is proposed and ruled.
Questions worth your time
- Isolation. Can the member's SQL, or a crafted replica, reach anything but its own copy? Check the worker unit in §8.3 option by option against what
DynamicUser,PrivateNetwork,TemporaryFileSystem,PrivateTmpandAccept=yesactually do. Check every SQLite path that opens a file (ATTACH,VACUUM INTO, extensions, temp files,immutable) with modernc.org/sqlite v1.55.0. Can the worker reach the metadata service, the box role,/data,/etc/carlosor another tenant's files? - The prefix. Is there any path where a request field, rather than the fresh record and the box's own config, picks the bucket, prefix, host or level? Is the incarnation check placed so a host recreated between request and read cannot be read under the old request?
- Forgery and replay. Is the root envelope bound tightly enough (purpose, id, region, issued_at)? Can any other root-signed payload be read as a db-read request, or the reverse? Does the seen set plus the 60 s window close a second run of one request? Does sealing really make a replay harmless?
- Election and expiry. Can two boxes both run one read? Can the console's expiry and a late box both believe they own
picked? Can a result land before its last chunk, or a chunk after the result? - Cleanup and disk. On every exit path (done, failed, cancel, CLI gone, agent restart,
kill -9, box reboot, console restart), what is left in the deployment bucket and on the box? Is the disk floor enough on a 60 GiB box that also stages versions? Can the unacked window deadlock? - Parity. Will the forwarded
--atstop at the same transaction as the in-region door for the same replica and time, given the second truncation ofLastModified? Will the forwarded output be byte-identical to the in-region output across CLI and box versions? - Mixed fleet. Walk §9.2 and §11.2. Can a box publish
db-read-1without an armed worker? What does a host-claim console, a console with a scoped key, or a console withCARLOS_DB_FORWARDunset answer? - Census and build. Are §13's classifications right for the root-read scan as it is actually written (it matches
Open,Query,QueryContextand more across all production packages)? Does the worker code cross-compile for darwin and windows as described? - Provider boundary. Does anything in the design need AWS to work on a MinIO deployment with one store per region?
- Missing pieces. Anything the spec relies on that does not exist, or exists in a different shape.
Output
A numbered list of findings. Each one gives:
- severity: P1 breaks a ruling, crosses a tenant, or exposes box credentials; P2 is wrong behaviour; P3 is clarity or a gap;
- the spec section;
- the code evidence, with
file:line; - a concrete fix.
Then a one-line verdict: accept, or revise. Do not rewrite the spec. No praise.
On every round after the first, follow the answer format in the round section at the top.