Pull requests
Stacked by default, gated locally, landed atomically.
main is protected and cannot be committed to or pushed into. See
Protection on main. Every change arrives as a pull request, and
stacked pull requests are the default shape.
The process
The five gates
| Gate | Fails when |
|---|---|
npm run typecheck |
the types do not hold |
npm run codegen:check |
src/generated/ drifted from src/types.ts |
npm run gen:check |
a mailroom is absent or invalid, or the manifest is stale |
npm run empty-dirs:check |
any directory holds no files |
npm run hooks:check |
core.hooksPath is not scripts/hooks |
npm run check runs all five plus the tests. npm run protect:check is deliberately
outside it: that one needs the network.
Why the empty-directory gate exists
Verify a push by reading the tree at origin, never by reading the push's exit code:
gh api repos/akwlabs-ai/akw-factory-floors/git/trees/main --jq '.tree | length'
No merge without a green local run
Actions are blocked org-wide, so no workflow runs on a pull request here. That makes the local run the only run. State which commands you ran and what they said — the template asks for the output, not for the word "passed".