Follow-ups from #731, which corrected AI-MANIFEST-SPEC.adoc (it forbade the deployed ply scheme) and added the advisory scripts/check-manifest-ply.sh.
Each item below was deliberately not done in #731, for a stated reason. This issue is the handoff so none of them is lost.
1. Rename standards/cartridges/0.2-AI-MANIFEST.a2ml → 0.1- — conversion agent
cartridges/ sits one ply below the repo root, so the manifest declares depth 2 while sitting at depth 1. It is the single reason this repository fails its own new check (scripts/check-manifest-ply.sh . → exit 1).
Not done in #731 because it is a rename of an .a2ml file, and .a2ml renames belong to the conversion agent. #731 changes no file extension anywhere, deliberately, so that it is visibly not that work.
Cause, for the record: the file was added 2026-05-26 by 7c2b8155, the same day boj-server-cartridges was extracted from boj-server. git log --follow confirms it never moved. The extraction itself was correct — boj-server-cartridges/0-AI-MANIFEST.a2ml rightly declares ply 0. The defect is in the same-day sibling copy into standards/cartridges/, which carried the pre-split ply-2 number into a ply-1 home.
If the .deed conversion renames this file anyway, fold the ply correction into that rename rather than doing it twice.
2. Rename metadatastician/paint-type/www/0.2-AI-MANIFEST.a2ml → 0.1-
Different cause, no relation to item 1: introduced by 2ac5684 "Fix CI hygiene: resolve 7 red checks in workflows" (2026-07-26), a commit about workflows. A plain off-by-one that rode in on an unrelated change. The directory has nine correctly-numbered 0.1- siblings (features, session, src, tests, scripts, .github, audits, verification, examples).
3. Wire the gate into CI — blocked on item 1
scripts/check-manifest-ply.sh ships in #731 unwired: no workflow calls it, no required context added. Wiring it before item 1 lands would redden main from the moment it merged.
When item 1 is done, prefer hanging one run: step on an existing workflow over adding a new workflow file — a new file means new action pins, actions.lock, and the banner-insertion traps that come with it.
Keep it advisory. It should not become a required check while item 5 is unresolved.
4. 0.N- → 0-plyN- migration — PROPOSED, not authorised
The dotted form does not announce its meaning, and 0.1.A- is readily misread as a version number. The successor form 0-ply<N>[-<unit>]-AI-MANIFEST.a2ml fixes both.
#731 records this in the spec as explicitly NOT NORMATIVE and authorises no migration. Do not sweep on it. It needs an owner ruling first, and it interacts with item 5 — a migration that encodes the wrong frame would have to be redone across ~15,000 files.
5. ⚖️ Owner ruling needed — how a unit's children are numbered
Where a subdirectory self-roots (carries its own 0- manifest), do its descendants number their plies:
- (a) from the repository root, or
- (b) from the unit?
5,716 manifests — 36.0% of the 15,872 measured — are consistent only with (b).
This is a notation gap, not drift. Until a unit tag existed there was no way for a self-rooting sub-project to say "I number from here", so it numbered from itself and looked wrong to a root-frame reader. The cure under (b) is "add the unit tag, keep the number", not "renumber 5,716 files".
Recommendation: (b). Evidence written up in PREFIX-CANON.adoc (checkpoint, not yet in-repo — say the word and it lands as a docs PR).
Until this is ruled, the gate reports these as UNIT-RELATIVE and never fails them. It hard-fails only what is wrong under every reading, which preserves the decision while still producing the evidence to settle it.
Baseline measurement
Local checkouts, 2026-09-04, 15,872 manifests under hyper-repos. Duplicate checkout trees not deduplicated, per #703.
| Class |
Count |
% |
Gate verdict |
| EQUAL, git-rooted |
7,684 |
48.4% |
pass |
| UNIT-RELATIVE |
5,716 |
36.0% |
reported, never failed |
| DRIFT, declared < actual |
2,468 |
15.6% |
warn; fails only under --strict |
| DRIFT, declared > actual |
4 |
0.0% |
FAIL |
| UNPARSEABLE |
0 |
0.0% |
FAIL |
LEGACY-NAME (AI.a2ml) |
766 |
— |
no ply claim to check |
The 4 DRIFT-DEEP are items 1 and 2 plus two _GITHUB_INBOX_REMEDIATION_SET duplicate checkouts of the same standards file.
The defect class this exposed
Repo extraction is a ply-shedding event, and nothing watches for it. Splitting a subtree into its own repository decrements the true ply of every descendant. Any manifest copied sideways at that moment keeps its pre-split number and is wrong, silently, indefinitely.
Both DRIFT-DEEP files were born wrong rather than having drifted, which means the durable cure belongs at file-creation and repo-split time, not on a periodic re-scan. A re-scan only ever finds these late.
🤖 Generated with Claude Code
Follow-ups from #731, which corrected
AI-MANIFEST-SPEC.adoc(it forbade the deployed ply scheme) and added the advisoryscripts/check-manifest-ply.sh.Each item below was deliberately not done in #731, for a stated reason. This issue is the handoff so none of them is lost.
1. Rename
standards/cartridges/0.2-AI-MANIFEST.a2ml→0.1-— conversion agentcartridges/sits one ply below the repo root, so the manifest declares depth 2 while sitting at depth 1. It is the single reason this repository fails its own new check (scripts/check-manifest-ply.sh .→ exit 1).Not done in #731 because it is a rename of an
.a2mlfile, and.a2mlrenames belong to the conversion agent. #731 changes no file extension anywhere, deliberately, so that it is visibly not that work.Cause, for the record: the file was added 2026-05-26 by
7c2b8155, the same dayboj-server-cartridgeswas extracted fromboj-server.git log --followconfirms it never moved. The extraction itself was correct —boj-server-cartridges/0-AI-MANIFEST.a2mlrightly declares ply 0. The defect is in the same-day sibling copy intostandards/cartridges/, which carried the pre-split ply-2 number into a ply-1 home.If the
.deedconversion renames this file anyway, fold the ply correction into that rename rather than doing it twice.2. Rename
metadatastician/paint-type/www/0.2-AI-MANIFEST.a2ml→0.1-Different cause, no relation to item 1: introduced by
2ac5684"Fix CI hygiene: resolve 7 red checks in workflows" (2026-07-26), a commit about workflows. A plain off-by-one that rode in on an unrelated change. The directory has nine correctly-numbered0.1-siblings (features,session,src,tests,scripts,.github,audits,verification,examples).3. Wire the gate into CI — blocked on item 1
scripts/check-manifest-ply.shships in #731 unwired: no workflow calls it, no required context added. Wiring it before item 1 lands would reddenmainfrom the moment it merged.When item 1 is done, prefer hanging one
run:step on an existing workflow over adding a new workflow file — a new file means new action pins,actions.lock, and the banner-insertion traps that come with it.Keep it advisory. It should not become a required check while item 5 is unresolved.
4.
0.N-→0-plyN-migration — PROPOSED, not authorisedThe dotted form does not announce its meaning, and
0.1.A-is readily misread as a version number. The successor form0-ply<N>[-<unit>]-AI-MANIFEST.a2mlfixes both.#731 records this in the spec as explicitly NOT NORMATIVE and authorises no migration. Do not sweep on it. It needs an owner ruling first, and it interacts with item 5 — a migration that encodes the wrong frame would have to be redone across ~15,000 files.
5. ⚖️ Owner ruling needed — how a unit's children are numbered
Where a subdirectory self-roots (carries its own
0-manifest), do its descendants number their plies:5,716 manifests — 36.0% of the 15,872 measured — are consistent only with (b).
This is a notation gap, not drift. Until a unit tag existed there was no way for a self-rooting sub-project to say "I number from here", so it numbered from itself and looked wrong to a root-frame reader. The cure under (b) is "add the unit tag, keep the number", not "renumber 5,716 files".
Recommendation: (b). Evidence written up in
PREFIX-CANON.adoc(checkpoint, not yet in-repo — say the word and it lands as a docs PR).Until this is ruled, the gate reports these as
UNIT-RELATIVEand never fails them. It hard-fails only what is wrong under every reading, which preserves the decision while still producing the evidence to settle it.Baseline measurement
Local checkouts, 2026-09-04, 15,872 manifests under
hyper-repos. Duplicate checkout trees not deduplicated, per #703.--strictAI.a2ml)The 4 DRIFT-DEEP are items 1 and 2 plus two
_GITHUB_INBOX_REMEDIATION_SETduplicate checkouts of the samestandardsfile.The defect class this exposed
Repo extraction is a ply-shedding event, and nothing watches for it. Splitting a subtree into its own repository decrements the true ply of every descendant. Any manifest copied sideways at that moment keeps its pre-split number and is wrong, silently, indefinitely.
Both DRIFT-DEEP files were born wrong rather than having drifted, which means the durable cure belongs at file-creation and repo-split time, not on a periodic re-scan. A re-scan only ever finds these late.
🤖 Generated with Claude Code