akw-factory-floorsfloors.akwlabs.com · ga

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

```bash npm run stack -- doctor ``` Reports `gh`, the extension, the branch, the hooks path, the effective rules on `main`, and whether a stack exists here. ```bash npm run stack -- new ``` Never commit on `main` — the `pre-commit` hook refuses it. A layer is one bullet's worth of change, and it must stand on its own. If it only makes sense with the layer above it, they are one layer. ```bash npm run gen ``` Generated files are rebuilt in the same commit as their source. A manifest updated in a later commit is a manifest that was wrong in this one. ```bash npm run stack -- submit ``` Runs every gate before anything reaches GitHub, then pushes and opens each layer ready for review — not as a draft. One past-tense bullet in `CHANGELOG.md`, per layer. ```bash npm run stack -- land ``` One atomic squash merge over the whole stack.

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".