spec/audit.py flags any downstream AGENTS.md containing the hub's name, and the byte-locked AGENTS.md > Fleet Bootstrap section contains it. A repository that carries the canonical correctly is therefore guaranteed to fail the check, and the only way to pass is to break the byte-lock.
Audited against hub main7194f91. Found on Blog immediately after it re-vendored Fleet Bootstrap from 3a7cc64 (ptr727/Blog#11), which is the first downstream repository to carry that section at all.
The two rules, both on main
spec/files.json declares the section verbatim:
{ "path": "AGENTS.md", "sections": [ { "name": "Fleet Bootstrap", "fidelity": "verbatim" }, ... ] }The canonical text names the repository, and says so in its own words:
the canonical rules, machine-readable spec, and procedures live in github.com/ptr727/ProjectTemplate ... This section is byte-locked across every repository in the fleet, so it reads identically wherever it is found
spec/audit.py then flags exactly that, skipping only the hub:
ifentry.get("name") !=HUB_NAME:
forpathin ("AGENTS.md", "GOVERNANCE.md", ".github/copilot-instructions.md"):
...
if ... HUB_NAME.lower() in ...:
findings.append(("DRIFT", f"carried: {path} references the template repo ..."))The comment above it reads "A downstream repo naming it is still flagged, which is the point." That intent is coherent on its own. It just cannot coexist with a byte-locked section whose whole purpose is to name the destination, since Fleet Bootstrap exists precisely to tell an agent where the rules live when nothing else present does.
Reproduction
$ python3 spec/audit.py --branch develop Blog DRIFT carried: AGENTS.md references the template repo by name or link (...)
Blog's AGENTS.md byte-matches the canonical Fleet Bootstrap, Context and Delegation Discipline, and Where the Rules Live, verified by hashing each ## heading block against the hub. The verbatim findings are gone and this one took their place.
Scope
reports/divergences.md lists 19 repositories still owing Fleet Bootstrap. Every one of them trips this check on the day it converges, so the finding count goes up as the fleet gets more correct, which inverts what the ledger is for. Blog is the only repository carrying it today, which is why it surfaced here first and why it is worth settling before the propagation wave.
Which rule gives
Not proposing a resolution, since it is a governance call, but the shapes seem to be:
- Exempt the
Fleet Bootstrap region from the reference check, keeping the check for prose outside it. This preserves both intents: readers do not see coordination machinery in ordinary rule text, and the one section whose job is routing still routes. - Drop the hub name from the canonical and describe the hub without naming it. This weakens the section, because an agent that reads "a shared template" with no destination cannot fetch it, which is the failure
Fleet Bootstrap was added to fix. - Narrow the check to
GOVERNANCE.md and .github/copilot-instructions.md, where the stale "report drift upstream" paragraph the comment mentions actually lived.
The first looks closest to the intent behind both rules, but that is a preference and the call is yours.
🤖 Generated with Claude Code
spec/audit.pyflags any downstreamAGENTS.mdcontaining the hub's name, and the byte-lockedAGENTS.md > Fleet Bootstrapsection contains it. A repository that carries the canonical correctly is therefore guaranteed to fail the check, and the only way to pass is to break the byte-lock.Audited against hub
main7194f91. Found on Blog immediately after it re-vendoredFleet Bootstrapfrom3a7cc64(ptr727/Blog#11), which is the first downstream repository to carry that section at all.The two rules, both on
mainspec/files.jsondeclares the section verbatim:{ "path": "AGENTS.md", "sections": [ { "name": "Fleet Bootstrap", "fidelity": "verbatim" }, ... ] }The canonical text names the repository, and says so in its own words:
spec/audit.pythen flags exactly that, skipping only the hub:The comment above it reads "A downstream repo naming it is still flagged, which is the point." That intent is coherent on its own. It just cannot coexist with a byte-locked section whose whole purpose is to name the destination, since
Fleet Bootstrapexists precisely to tell an agent where the rules live when nothing else present does.Reproduction
Blog's
AGENTS.mdbyte-matches the canonicalFleet Bootstrap,Context and Delegation Discipline, andWhere the Rules Live, verified by hashing each## headingblock against the hub. The verbatim findings are gone and this one took their place.Scope
reports/divergences.mdlists 19 repositories still owingFleet Bootstrap. Every one of them trips this check on the day it converges, so the finding count goes up as the fleet gets more correct, which inverts what the ledger is for. Blog is the only repository carrying it today, which is why it surfaced here first and why it is worth settling before the propagation wave.Which rule gives
Not proposing a resolution, since it is a governance call, but the shapes seem to be:
Fleet Bootstrapregion from the reference check, keeping the check for prose outside it. This preserves both intents: readers do not see coordination machinery in ordinary rule text, and the one section whose job is routing still routes.Fleet Bootstrapwas added to fix.GOVERNANCE.mdand.github/copilot-instructions.md, where the stale "report drift upstream" paragraph the comment mentions actually lived.The first looks closest to the intent behind both rules, but that is a preference and the call is yours.
🤖 Generated with Claude Code