Hanzo CI/CD / cicd (push) Successful in 13s
CI/CD / gate (push) Successful in 13s
CI/CD / containment (push) Successful in 1m39s
CI/CD / rollout (push) Skipped
CI/CD / reach (push) Skipped
CI/CD / fanout (push) Skipped
CI/CD / receipt (push) Skipped
CI/CD / image (push) In progress
GET /v1/commands serves zip.CommandsFromSpec over the rendered document — the same function the CLI's tree is derived from, on the same bytes every SDK is generated from. No new registry, no generator, no build step: a route registered this morning is a command this afternoon. serve() gains one line, so both document sources light up at once — Mount for an app binary, MountFleet for the front door that answers api.hanzo.ai. Total, and unfiltered by caller on purpose. zip has no per-op scope; it has Authorizer, which decides on the DECODED INPUT of every op. Permission is a fact about an input, so any list filtered here would be a second static claim the Authorizer is free to contradict — wrong in the direction that hides working functionality from people who have access. Two things the design did not know, both measured here: The size. The projection is 2,344,651 bytes, 454,881 gzipped — 1.32x smaller than the document, not the 4.5x/107 KB the design quotes. That figure was taken from hanzoai/cli's spec/products.json, a different artifact with every description, summary and operationId stripped. This one keeps the prose, and the prose is most of it (Description alone is 1,028,067 bytes). Recorded in command.go rather than fixed by forking zip.Command into a trimmed wire shape. The order. 41 of the 2,323 commands share zip's (Service, Name) sort key — `mq streams-delete` is claimed by three — and sortCommands is unstable, so the tie fell to a map walk. Two replicas weaving one document served identical content under different ETags, which is a full re-download on every conditional request that lands on a different pod. order() completes the key with (Method, Path). openapi.Door names what serve registers. Three gates needed exactly that fact and each had written the one literal that was true when it was written — Complete skipping a description no app can own, cmd/cloud exempting the doors from a scoped deployment's surface, manifest refusing an app row that claims one. The second door made all three wrong the same afternoon. Pins: every served command is a route the document carries; the served bytes are CommandsFromSpec of openapi.yaml exactly; two mounts of one document agree on bytes AND ETag; a conditional request gets 304 and no body; the projection is smaller than what it projects. Plus the door itself answering on the host's own spec() mount. TestFleetIsTheWeaveOfItsApps and two cmd/cloud gates are red on this tree already, over a duplicate operationId between GET /v1/billing/methods and GET /v1/billing/portal/methods. Not touched, not absorbed: openapi.yaml therefore does not yet carry /v1/commands, and the full-fleet version of the door test belongs in the commit that fixes the weave. Co-authored-by: Hanzo Dev <dev@hanzo.ai>