The problem this sweep exposed
Correcting the language policy in standards/.claude/CLAUDE.md (#655) fixed one file out of ~372.
Measured across the estate on 2026-08-26:
|
|
CLAUDE.md files in the tree |
1,765 |
| carrying stale Deno/Bun policy |
927 |
| unique (remote, in-repo path) — actual files needing the fix |
386 |
| repos affected |
131 |
| already carrying the corrected text |
10 |
Marker counts: \| Bun \| Deno \| (Bun listed as BANNED) 868 · \| **Deno** \| 920 · "No node_modules in production" 907 · "No package.json for runtime deps" 555.
Five repos hold 212 of the 386: ssg-collection 65, polystack 61, developer-ecosystem 41, asdf-tool-plugins 26, ambientops 19.
Why it matters
Each repo carries a copy of the policy, not a pointer to it. An agent opening a repo reads the local .claude/CLAUDE.md — so between the ruling and this sweep, the estate's own tooling was being told, in 868 places, that Bun was banned and Deno was mandatory, which is the exact inverse of the ruling.
The same fan-out is why the ReScript purge did so much damage: it had to run as a find-and-replace over hundreds of duplicated files, and it corrupted policy tables in the process — | | AffineScript | (banned cell blanked, 70 files), 1. **No new files** (209), | **JavaScript** | Only where cannot | (144), | AffineScript | AffineScript | (a rule banning the language it mandates). Same root cause as the rm -rf /lib in wordpress-tools#62.
A policy duplicated 372 times is a policy that will drift 372 ways. This sweep corrects the current drift; it does not stop the next one.
Options (owner decision — not taken unilaterally)
- Pointer, not copy. Each repo's
.claude/CLAUDE.md becomes a short stub naming the repo-specific facts and linking to the canonical standards document. Smallest surface; relies on agents following the link.
- Generated, with a drift gate. Keep a full local copy but generate it from
standards, and add a CI check that fails when it diverges. Keeps offline readability; adds a gate that can actually catch drift.
- Status quo + periodic sweeps. What we do now. Each ruling costs a 131-repo PR wave, and every bulk edit risks another blanking incident.
My recommendation is (2): agents benefit from the full text being present locally, and the drift gate is the part that has been missing — nothing has ever detected that 868 files contradicted the standard.
Related: #655 (the ruling), #658 (Deno→Bun assessment), wordpress-tools#62, ubicity#107.
The problem this sweep exposed
Correcting the language policy in
standards/.claude/CLAUDE.md(#655) fixed one file out of ~372.Measured across the estate on 2026-08-26:
CLAUDE.mdfiles in the treeMarker counts:
\| Bun \| Deno \|(Bun listed as BANNED) 868 ·\| **Deno** \|920 · "No node_modules in production" 907 · "No package.json for runtime deps" 555.Five repos hold 212 of the 386:
ssg-collection65,polystack61,developer-ecosystem41,asdf-tool-plugins26,ambientops19.Why it matters
Each repo carries a copy of the policy, not a pointer to it. An agent opening a repo reads the local
.claude/CLAUDE.md— so between the ruling and this sweep, the estate's own tooling was being told, in 868 places, that Bun was banned and Deno was mandatory, which is the exact inverse of the ruling.The same fan-out is why the ReScript purge did so much damage: it had to run as a find-and-replace over hundreds of duplicated files, and it corrupted policy tables in the process —
| | AffineScript |(banned cell blanked, 70 files),1. **No new files**(209),| **JavaScript** | Only where cannot |(144),| AffineScript | AffineScript |(a rule banning the language it mandates). Same root cause as therm -rf /libin wordpress-tools#62.A policy duplicated 372 times is a policy that will drift 372 ways. This sweep corrects the current drift; it does not stop the next one.
Options (owner decision — not taken unilaterally)
.claude/CLAUDE.mdbecomes a short stub naming the repo-specific facts and linking to the canonicalstandardsdocument. Smallest surface; relies on agents following the link.standards, and add a CI check that fails when it diverges. Keeps offline readability; adds a gate that can actually catch drift.My recommendation is (2): agents benefit from the full text being present locally, and the drift gate is the part that has been missing — nothing has ever detected that 868 files contradicted the standard.
Related: #655 (the ruling), #658 (Deno→Bun assessment), wordpress-tools#62, ubicity#107.