Act III · What keeps it safe
AI Factory · Governance
One board, one state, many agents
Humans and every agent runtime share one coordination protocol on GitHub: Issues, a single Project board, a label taxonomy, milestone trains and pull requests. No runtime keeps a private backlog, and scripts check that Issue state, board Status and labels agree.
Issue lifecycle
CLOSED ⇒ Done
Board Status Done, and no in-progress or blocked label.
OPEN + WIP ⇒ In Progress
Status In Progress if and only if status:in-progress is set.
Blocked ⇒ label
There is no Blocked column; use status:blocked, and never Done while open.
Label families
| Family | Rule | Labels |
|---|---|---|
type: | exactly one on claimable work | feature · bug · refactor · chore · ci · epic |
priority: | exactly one on claimable work | critical · high · medium · low |
area: | one or more | backend · frontend · db · devops · test · docs |
status: | workflow flags | ready · in-progress · in-review · blocked · needs-info |
concern: | zero or more | security · a11y · i18n · ux · risk · tech-debt |
trace: | catalog anchors only, never claimable | rf · rnf · cu |
release: | optional | breaking (major bump) |
There are no lane labels. A lane is derived from the labels (security, cross, backend, frontend, platform, quality), and two Issues in a conflicting lane are not claimed at once. The type label also drives the semver bump and the CHANGELOG section.
Milestones are release trains
| Kind | Pattern | Example |
|---|---|---|
| Release train | v<MAJOR>.<MINOR> · <Theme> (<YYYY-MM>) | v0.3 · Hexagonal core & security (2026-11) |
| Shipped cut | same pattern, closed | v0.2 · Release identity & product forms (2026-10) |
| History stage | H<n> · <Stage> | H0 Swing monolith … H8 pre-release hardening |
| Continuous | Backlog · Unscheduled | no due date |
| Catalog | Catalog · Requirements & use cases | RF / RNF / CU anchors |
Each minor version has one train, and every patch tag belongs to it. Tags do not close milestones; the Owner closes a train when its exit criterion holds, and open work moves to the next train with a comment.
Pull request flow
Conventions
| What | Rule |
|---|---|
| Branch | <type>/<issue-number>_<description>, e.g. feat/253_user_auth |
| Commit | <type>(<scope>): <description>, ending Refs #N (intermediate) or Closes #N (closing) |
| PR title | [#<issue>] type(scope): description |
| Stale branch | git merge origin/main — never rebase or force-push a pushed branch |
| Exception | Only the Owner, only via the sdlc-exception label, only on a PR with no OpenSpec change |
| Progress | Push after each group of commits and comment on the Issue (publish-progress.sh) |