statusgen
The Go tool that reads a repo's stream documents and registers, and generates the single STATUS.md board. It is the machinery that turns convention into enforcement: gates a script runs, not rules a team is asked to remember.
What it does
statusgen parses each stream directory's README.md frontmatter and brief-row table, cross-applies findings to the streams they affect (flagging affected briefs as stale-knowledge), reads the two registers (FINDINGS.md and INTAKE.md), and emits a single aggregated view: one STATUS.md file with a priority-and-staleness-ranked Next-up batch, a cross-stream board, and a findings-intersection table.
It supports three modes:
| Command | What it does | When to use it |
|---|---|---|
go run ./statusgen |
Generate STATUS.md from sources. Writes the file. |
Locally, to read the board and see Next-up. Never commit on a branch. |
go run ./statusgen --lint |
Run every source check and build the view internally, but never read or write STATUS.md. |
PR CI. Blocks PRs with malformed briefs, sequence gaps, or STATUS.md diffs. |
go run ./statusgen --check |
Regenerate STATUS.md internally and compare byte-for-byte to the committed version. |
Drift check. Advisory — not a CI gate by default. |
The single-writer model
Only one CI job — triggered on push to the default branch — ever commits STATUS.md. Every other context (PRs, local runs) only reads or lints. This eliminates the entire class of merge conflicts on a generated file and makes drift between sources and status immediately visible: if a PR's lint step passes but the merged main regen produces different output, something changed under the PR.
What it checks
In --lint mode, statusgen runs every source check:
- Brief frontmatter validity: typed IDs, wave consistency, gate derived from risk, sources non-empty.
- Dependency graph integrity: typed IDs only,
depends/unblocksmutual inverses, no self-loops, no wave violations. - Register sequence contiguity: FINDINGS and INTAKE numbering runs without gaps or duplicates.
- Status cell format: lifecycle tokens only (no appendages), dated entries in Verified/Reviewed columns, no bare checkmarks.
- Findings cross-application: every finding's
Affects:IDs resolve to real briefs; affected briefs are flagged stale and excluded from Next-up until resolved. - Stream README frontmatter: required fields present, valid values.
- STATUS.md immutability on branches: any PR diff touching STATUS.md trips lint.
Repo-agnostic
statusgen is a standalone Go module — stdlib plus yaml.v3, no other dependencies. It ships with the toolkit as a copyable directory. The module path (github.com/medici-finance/assay-toolkit/statusgen) means consumers can go get it as a package, or copy the directory into their own repo and place it wherever their layout prefers (./statusgen, tools/statusgen, etc.).
It was extracted from Medici's option-index-tracker repo on 2026-07-09, already written repo-agnostic. The source repo keeps its own vendored copy; whether this toolkit becomes the canonical home is an open decision (see the toolkit README).