CI/CD / containment (push) Successful in 1m58s
Hanzo CI/CD / cicd (push) Failing after 22m32s
CI/CD / gate (push) Failing after 29m15s
CI/CD / image (push) Skipped
CI/CD / rollout (push) Skipped
CI/CD / reach (push) Skipped
CI/CD / fanout (push) Skipped
CI/CD / receipt (push) Skipped
TWO THINGS STOOD BETWEEN THE FLEET DOCUMENT AND SOURCE, both revealed only once licensing stopped failing first — surface-check stops at the first app that cannot project, so everything behind it was invisible rather than passing. commerce publishes 17 generated CRUD families over the same store, 7 operations each: 119 sentences differing in one word. They are DERIVED now, for the reason openapi.DescribeSPA derives the two SPA addresses — prose written 119 times drifts 119 ways, and the next family the module adds would arrive undescribed and stop the gate again. Adding one is a line in `resources`. The vocabulary stays plain on purpose: these are generic store resources, so each sentence states the shape (what the address is, what the method does, what the id means) and stops. A resource that earns its own prose keeps an explicit Describe above — Describe panics on a duplicate, so the hand-written sentence and the loop cannot both claim an address. The weave then refused for a different reason, and it was right to: schema "Artifact" meant a RELEASE artifact in licensing (download_url, cosign_signature) and a RESEARCH artifact in research (git_sha, run_id, retention_class). Schema names are global in the woven document, so every generated SDK would have bound whichever it read last — one name, two shapes, silently. research's is the one this repo owns, so it becomes ResearchArtifact; licensing's stays, being the external module's. Regenerated: openapi.yaml, the affected subsets and the floor. Co-authored-by: Hanzo Dev <dev@hanzo.ai>