Skip to content

Language policy is duplicated into ~372 per-repo CLAUDE.md files across 131 repos — fixing standards fixes one #659

Description

@hyperpolymath

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)

  1. 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.
  2. 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.
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    governancePolicy, rulesets, standards, compliance, and their enforcementscope:estateAffects many or all repos across the estatetech-debtKnown shortcut, drift, or hygiene owed - includes cleanup

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions