Skip to content

SDLC

+--------------------------+
| ticket                   |   labelled `ready`: the approved ticket is the plan
+--------------------------+
             |
             v
+--------------------------+
| branch                   |   one ticket, one branch, one PR
+--------------------------+
             |
             v
+--------------------------+
| red slice test           |   enters where a real consumer enters; fails first
+--------------------------+
             |
             v
+--------------------------+
| implement, <= 40 lines   |   smallest change that satisfies the ticket
+--------------------------+
             |
             v
+--------------------------+
| mutation gate            |   pre-commit or Stop hook; a survivor blocks
+--------------------------+
             |
             v
+--------------------------+
| PR, `Closes #N`          |   CI green
+--------------------------+
             |
             v
+--------------------------+
| review, squash merge     |   branch deleted on merge
+--------------------------+

Intent lives in the tracker, never in the tree. An approved ticket is the plan and maps to exactly one branch and one PR. The first code written is a slice test at a seam a real consumer uses, watched failing for the right reason; unit tests fill in behind it. Past about 40 request-driven lines with no ticket, the work stops and a ticket gets written. The gate runs before the commit lands, the PR body carries Closes #N, and merges are squash-only.

A vertical slice enters through something a real consumer actually calls — an exported header, a CLI subcommand, a published API — rather than the internal function that happens to implement it. It proves the feature works end to end, the way a walking skeleton does before its internals are filled in. Unit tests then cover what the slice can't reach: numeric edge cases, error paths, boundary values.

Source: rules/tickets.md, rules/testing.md, rules/diff-discipline.md.