Why govstruct
A family of repos links to itself everywhere - apps menus, README tables, status registries - and every one of those links is a hand-typed copy that drifts.
The problem: N copies of one fact
A suite of N repos that links to itself carries the same fact - who is a member, where it lives, what it pins - in N places at once. The apps menu says one thing, the README table another, the status registry a third. Nothing is wrong until one copy is edited and the others are not, and then the mesh lies in the one place nobody re-reads.
The fix is not discipline. Discipline is the thing that already failed. The fix is to make the mesh a single authored source that every surface is emitted from, and to make a disagreement a refusal rather than a drift nobody notices for a quarter.
The thesis: refusal, not warning
A doctor that warns into green is politeness theater. govstruct refuses nameably at author time: a manifest that breaks the grammar is a setup error with an exit code, not a log line to scroll past. A member that cannot be proven against the same truth is refused by name, and the name is registered in the refusal vocabulary.
Manifest frozen, refusal instant and nameable. The apps menu is payload #1, not the product - governance over how members link, state, and pin themselves is the product.
Who it is for
Anyone maintaining a suite of repos that must agree about themselves: the maintainer who owns the crosslink mesh, the CI that has to prove every member serves the same truth, and the agent that has to edit identity in one file instead of hunting literals across three languages.
Next: what govstruct is ยท about the project