Observation-class finding, measured while implementing #13646 (which routes one such artifact). Filed unassigned; deliberately NOT fixed there — one card, one route.
The class
#13335 records skills/**/references/_index.md as generator-owned but unrouted, and says the substance of that card is deciding its disposition. #13646 was the same shape for the elevation census page. Both are instances. This is the enumeration, so the next one is met by a list rather than by a merge conflict.
Measured across all 79 workspace manifests plus the root, on d32b0f501:
generator-ish scripts (a `gen:*` key, or a `--fix` / `--update` mode): 21
named as the `gen` of a driver-managed row in REGEN_ARTIFACTS: 10
in NEITHER that table NOR NOT_DRIVER_MANAGED: 11
Several of the 11 are already accounted for by a declaration on the artifact rather than on the script — gen:migration-registry and the gen:test-typecheck-debt family are NOT_DRIVER_MANAGED by path, and gen:authorable-surface-base is deliberately not named as any row's gen (the reasoning is in regen-artifacts.mjs beside the authorable-surface.base.json row).
That leaves the genuinely unaccounted set:
| script | note |
|---|
gen:skill-refs | already filed as #13335 — a member, not a duplicate of this |
gen:sdui-lockstep | writes packages/sdui-parser/objectui-lockstep.json |
gen:openapi | |
gen:skill-docs | |
gen:sbom | |
gen:react-blocks | |
gen:test-typecheck-debt in @objectstack/client and @objectstack/rest | the per-package copies; only the packages/spec one is declared |
Why the enumeration is the unit of work, not each file
.gitattributes's own header says the dangerous mistake is "adding a path to .gitattributes because a generator writes it, without asking whether recomputing it can lose a decision a human made" — which is why NOT_DRIVER_MANAGED exists and carries a per-path reason. The gap is therefore not "these paths are unrouted"; it is that for each of them, no one has recorded which of the two dispositions applies.pnpm check:merge-driver reconciles the table against .gitattributes in both directions and is green today, which means it cannot see an artifact that is in neither list — exactly the state #4675's fix left this file class in, and the reason #13646 and #13335 were each discovered by hitting them.
⚠️ Two of the entries above deserve care rather than a batch route, on the evidence of #13646: content/docs/permissions/** looked routable by symmetry with its sibling tree and is not (22 hand-written pages around one generated one), and a shrink-only ratchet must never be regenerated mid-merge. So the deliverable is a recorded disposition per path, not a block of new merge=os-regen lines.
Suggested shape
Either extend check:merge-driver with a third reconciliation — every artifact some gen: script writes must appear in one of the two ledgers — or work the list above once and accept that a future generator can re-open the gap. The first closes the class; the second repeats #4675's omission at a smaller scale.
Generated by Claude Code
Generated by Claude Code
Observation-class finding, measured while implementing #13646 (which routes one such artifact). Filed unassigned; deliberately NOT fixed there — one card, one route.
The class
#13335 records
skills/**/references/_index.mdas generator-owned but unrouted, and says the substance of that card is deciding its disposition. #13646 was the same shape for the elevation census page. Both are instances. This is the enumeration, so the next one is met by a list rather than by a merge conflict.Measured across all 79 workspace manifests plus the root, on
d32b0f501:Several of the 11 are already accounted for by a declaration on the artifact rather than on the script —
gen:migration-registryand thegen:test-typecheck-debtfamily areNOT_DRIVER_MANAGEDby path, andgen:authorable-surface-baseis deliberately not named as any row'sgen(the reasoning is inregen-artifacts.mjsbeside theauthorable-surface.base.jsonrow).That leaves the genuinely unaccounted set:
gen:skill-refsgen:sdui-locksteppackages/sdui-parser/objectui-lockstep.jsongen:openapigen:skill-docsgen:sbomgen:react-blocksgen:test-typecheck-debtin@objectstack/clientand@objectstack/restpackages/specone is declaredWhy the enumeration is the unit of work, not each file
.gitattributes's own header says the dangerous mistake is "adding a path to.gitattributesbecause a generator writes it, without asking whether recomputing it can lose a decision a human made" — which is whyNOT_DRIVER_MANAGEDexists and carries a per-path reason. The gap is therefore not "these paths are unrouted"; it is that for each of them, no one has recorded which of the two dispositions applies.pnpm check:merge-driverreconciles the table against.gitattributesin both directions and is green today, which means it cannot see an artifact that is in neither list — exactly the state #4675's fix left this file class in, and the reason #13646 and #13335 were each discovered by hitting them.content/docs/permissions/**looked routable by symmetry with its sibling tree and is not (22 hand-written pages around one generated one), and a shrink-only ratchet must never be regenerated mid-merge. So the deliverable is a recorded disposition per path, not a block of newmerge=os-regenlines.Suggested shape
Either extend
check:merge-driverwith a third reconciliation — every artifact somegen:script writes must appear in one of the two ledgers — or work the list above once and accept that a future generator can re-open the gap. The first closes the class; the second repeats #4675's omission at a smaller scale.Generated by Claude Code
Generated by Claude Code