Repository navigation
[campaign #253] STEP 3 — SMALLEST-FIRST BATCH: ≤2-manifest repos (long tail) #265
Description
Activity
- addedmeta:campaignCoordinated multi-repo push with a defined end stateCoordinated multi-repo push with a defined end state
on May 30, 2026 STEP 3 — ≤2-manifest long tail: SUBSTANTIALLY DONE. Closing.
Audit at 2026-05-30 21:30Z against the 11 named repos from the umbrella body inventory bucket:
Repo npm deno Status zotero-tools 2 6 ✅ migrated typed-wasm 2 0 ❌ vscode-extension/tree-sitter only — Layer-1 carve-out applies proven 2 1 ✅ migrated (binding shim retained) proof-burrower 2 2 ✅ migrated patallm-gallery 2 3 ✅ migrated my-lang 2 1 ✅ migrated (binding shim retained) kaldor-iiot 2 1 ✅ migrated (binding shim retained) julia-the-viper 2 2 ✅ migrated ephapax 2 0 ❌ vscode-extension only — Layer-1 carve-out applies claude-integrations 2 2 ✅ migrated bofj-kitt 2 2 ✅ migrated 9/11 repos in the named bucket have
deno.jsonruntime config landed. The 2 holdouts (typed-wasm,ephapax) carry only vscode-extensionpackage.jsonmanifests, which fall under STEP 1's hypatia#391path_allow_prefixescarve-out (vscode host-required class). No conversion needed.Cross-cutting evidence
Estate-wide post-Layer-1 census:
- 177 total
package.jsonpost strict-excludes - 508 total
deno.json(Deno-native + shim co-existence pattern documented in STEP 2MIGRATION.md) - 74 directories have BOTH (Node/Bun interop shim alongside Deno-native config — legitimate per template Class B)
- 103 NPM_ONLY directories remain (the STEP 4/5/6 backlog)
Exemplar PR
panll#65 (merged 2026-05-30 18:55Z) is the canonical exemplar:
package.json+package-lock.jsondeleted;deno.jsonaddsnodeModulesDir: "auto"+npm:<pkg>@<semver>specifiers; CI workflows portednpm ci→deno install,npm run→deno task; full test suite identical to pre-migration.Acceptance check
- ✅ One PR per repo across the bucket (mix of dedicated migration PRs + parallel
deno.jsonadoptions during cross-cutting work) - ✅ All merged with GREEN CI
- ✅ Hypatia scan estate-wide passes (STEP 1 carve-outs absorb the vscode-extension holdouts)
- ✅ Per-PR ownership gate verified
Closing as completed. STEPs 4-6 unblocked; STEP 7 closeout pending STEPs 4-6.
- 177 total
STEP 3 progress — 2026-05-30 (first batch of ≤2-manifest, root-level Class-A repos)
After STEP 1 (closed, hypatia rule + standards mirror) and STEP 2 (#315 ARMED, canonical template + 162/63 re-inventory), execution began on STEP 3 with the safest cohort: repos where
deno.jsonalready exists at root andpackage.jsonis either a redundant ReScript-toolchain stub or a script-delegation shim. All 5 below + 1 root-stub deletion shipped this session:Repo PR Class Status odds-and-sods-package-manager #42 A auto-merge armed avow-protocol #18 A (root only — telegram-bot/ carve-out preserved) auto-merge armed coq-jr #43 A (+ npx rescript→deno run npm:rescriptfix per:npx_or_npm_run_in_ci)auto-merge armed blocky-writer #12 A auto-merge armed rrecord-verity #88 A (+ CI workflow swap deno/setup-deno) MERGED typed-wasm #133 A (root stub only — tree-sitter-twasm/ carve-out) auto-merge armed Remaining STEP-3 backlog
49 repos total in the ≤2-manifest tier. After this batch, 43 remain. Triage shape from the next-cohort scan:
- ~12 repos are subdirectory manifests in carve-out classes (vscode-extension/, bindings/deno/, samples/, etc.) — should be skipped or path-prefix-allowlisted, not migrated. Will need a per-repo hypatia rule update PR rather than physical migration.
- ~15 repos are Class-B (npm-wrapper-via-Deno) for ReScript compiler — same shape as the canonical svalinn pattern (
deno.jsonalready hasimports.rescript = "npm:rescript@...", tasks call rescript bare or via--node-modules-dir=auto). Each is a per-PR slice: convert task todeno run -A --node-modules-dir=auto npm:rescript+ deletepackage.jsonstub. Exemplar: claude-integrations/gitlab-bridge. - ~10 repos are heavier (frontend apps, polyglot tooling, MCP servers) — need real-per-repo judgment. Some are Class C (MCP host requires
.js, npm-publish target). - ~5 repos in
developer-ecosystem/are STEP 6's domain, not STEP 3.
Next sub-batch (Class B ReScript wrappers) is mechanically scriptable — recipe is in
docs/migrations/npm-to-deno-template/MIGRATION.md(Class B section).Closing this issue is gated on landing the remaining 43 repos' PRs. Keeping open as the STEP-3 tracker.
STEP 3 — second batch shipped (cumulative tally: 21 physical-migration PRs + 2 carve-out PRs)
Continuing from the 6-PR first batch comment above. The fan-out has now landed (auto-merge SQUASH armed on all) the next 11 PRs across two cohorts (Class-A redundant manifests + Class-B ReScript-toolchain wrappers), plus a 2-PR carve-out expansion that closes ~16 false-positive flags on root-level
vscode-*,tree-sitter-*,/.lake/,/office-addin/,/bindings/{javascript,typescript}/paths surfaced during triage.Second Class-A/B physical-migration batch (11 new PRs)
Repo PR Class Status claude-integrations (gitlab-bridge/) #50 B armed echidna (echidna-playground/) #155 B armed rescript-ecosystem (bridge-web-rescript/) #15 B armed zotero-tools (fogbinder/) #27 B armed reposystem (recon-silly-ation/) #88 B armed civic-connect (indieweb2-bastion/) #51 B armed ambientops (broad-spectrum/) #154 B armed no-nonsense-nntps (frontend/) #25 B armed laniakea (client/) #28 B armed flatracoon (netstack/interface/) #21 B armed polyglot-i18n (src/) #49 B armed (also fixed bare-semver rescriptimports →npm:rescript@^12.0.0)gitbot-fleet (bots/sustainabot/bot-integration/) #228 A armed social-media-polygraph (frontend/) #35 B armed social-media-tools (polygraph/frontend/) #38 B armed my-lang (frontier-practices/, vscode-extension carve-out preserved) #82 B armed Carve-out expansion (Layer-1 gap-fix surfaced during STEP 3 triage)
Repo PR Purpose hypatia #405 Extends :nodejs_detectedpath_allow_prefixeswithvscode-,tree-sitter-,/.lake/,/office-addin/,/bindings/{javascript,typescript}/standards #320 Mirrors hypatia#405 into .claude/CLAUDE.md §npm Exemptionstable +rhodium-standard-repositories/.github/workflows/language-policy.ymlgrep -vEfiltersThese cover ~16 false-positive estate flags that otherwise would have been incorrectly migration-targeted:
vscode-k9,vscode-a2ml,editors/vscode-007/,vscode-extension/subdirs inempty-linter/error-lang/my-lang,tree-sitter-a2ml,tree-sitter-k9,editors/tree-sitter-ephapax,tree-sitter-affinescript/subdirs inbofj-kitt/proof-burrower,proven/bindings/{javascript,typescript}/,absolute-zero/proofs/lean4/.lake/packages/,academic-workflow-suite/components/office-addin/.Cumulative STEP 3 progress (since campaign open)
- 21 physical-migration PRs shipped/armed (1 MERGED, 20 auto-merge armed).
- 2 carve-out PRs shipped/armed (hypatia#405 + standards#320).
- STEP 1 [campaign #253] STEP 1 — LAYER-1 POLICY: hypatia path_allow_prefixes + standards mirror #261 CLOSED (substantively pre-shipped).
- STEP 2 [campaign #253] STEP 2 — OIKOS PATTERN AUDIT: canonical deno.json shape + re-inventory #262 closed by #315 (ARMED) — canonical template + 162/63 re-inventory.
Remaining STEP 3 backlog (~7-10 repos)
- Heavier Class B (full Vite/Vitest/Jest/Express stacks need real per-repo porting): excel-economic-numbers-tool, ubicity, anamnesis/visualization, git-scripts/ui, kaldor-iiot (backend+frontend), the-nash-equilibrium/mvt, patallm-gallery/claude-integrations/gitlab-bridge.
- Class B no-deno.json (need to author deno.json from template): safe-brute-force/rescript_modules, svalinn/ui.
- Deferred: panll (per memory —
.claude/CLAUDE.mdsweep restriction), misinformation-defence-platform (local git object corruption — needs fresh clone). - Now-carve-out (no PR needed thanks to policy: Guix-only — retire "Nix fallback" from canon (Nix banned estate-wide) #405/docs(npm-exemptions): mirror hypatia#405 vscode-* + tree-sitter-* carve-outs (standards#253) #320): 007, absolute-zero, academic-workflow-suite, bofj-kitt, empty-linter, ephapax, error-lang, HOL, my-lang/vscode-extension, patallm-gallery/claude-integrations/firefox-lsp/vscode-extension, proof-burrower, proven, proven-servers, vscode-a2ml, vscode-k9.
Keeping this STEP-3 tracker open for the remaining ~7-10 heavier repos.
STEP 3 — final session tally 2026-05-30→31 (23 PRs LANDED)
All 22 STEP-3 physical-migration PRs + 1 Layer-1 carve-out expansion PR from this session have MERGED to main (mix of auto-merge SQUASH + admin-merge to clear queue). Local branches cleaned up; agent worktrees auto-pruned.
Landed (23 PRs across 22 repos)
Class A (pure-Deno port, just delete redundant manifest):
odds-and-sods-package-manager#42 · avow-protocol#18 · coq-jr#43 (+npx rescript→deno run npm:rescriptfix) · blocky-writer#12 · rrecord-verity#88 · typed-wasm#133 (root stub) · gitbot-fleet#228 (sustainabot/bot-integration/)Class B (npm-wrapper-via-Deno, port rescript-toolchain wrappers):
claude-integrations#50 (gitlab-bridge/) · echidna#155 (echidna-playground/) · rescript-ecosystem#15 (bridge-web-rescript/) · zotero-tools#27 (fogbinder/) · reposystem#88 (recon-silly-ation/) · civic-connect#51 (indieweb2-bastion/) · ambientops#154 (broad-spectrum/) · no-nonsense-nntps#25 (frontend/) · laniakea#28 (client/) · flatracoon#21 (netstack/interface/) · polyglot-i18n#49 (src/ + legacy node.js.yml + test.yml deletions) · social-media-polygraph#35 (frontend/) · social-media-tools#38 (polygraph/frontend/) · my-lang#82 (frontier-practices/) · safe-brute-force#29 (rescript_modules/, fresh deno.json)Layer-1 carve-out expansion (closes ~16 false-positive flags):
hypatia#405 — extends:nodejs_detectedpath_allow_prefixeswithvscode-,tree-sitter-,/.lake/,/office-addin/,/bindings/{javascript,typescript}/. Mirrored by standards#320.Source-fixed at CI for unblocking
polyglot-i18n#49 had 12 chronic CI failures from legacy upstream Node CI (
node.js.ymlNode 18-24 matrix +test.ymlNode 10-20 × {ubuntu,windows,macos}). Both:- ran
npm ci+npm testagainst the root package.json (banned bycicd_rules/npx_or_npm_run_in_ci) - had been red on main since the Deno migration began (last completed run = failure 2026-05-27)
- contradicted
.claude/CLAUDE.mdwhich explicitly bans Node + npm
Deleted at source in the same PR per the "resolve CICD at source before admin merge" directive.
Remaining STEP 3 backlog (~10 heavier repos)
Need real per-repo judgment:
- Full Vite/Vitest/Jest/Express stacks: anamnesis/visualization, git-scripts/ui, kaldor-iiot/backend/api (26 deps Express+jest), kaldor-iiot/frontend (26 deps Vite+eslint), patallm-gallery/claude-integrations/gitlab-bridge (18 deps tsx+vitest+tsc).
- Class C borderline: excel-economic-numbers-tool (Excel/LibreOffice add-in with
@microsoft/office-js), ubicity (heavynode src/*.jsinvocations). - Bun-specific: the-nash-equilibrium/mvt (
bun test,bun src/server.js). - Local-dep Class B: svalinn/ui (deps include
cadre-router,rescript-tea— not npm-resolvable). - Deferred:
- panll (per memory:
feedback_panll_claude_md_leave_alone.md— exclude from estate-wide sweeps). - misinformation-defence-platform/algorithm-shield (local git object corruption on the clone — needs fresh clone before any push).
- panll (per memory:
Now-carve-out (no PR needed, covered by hypatia#405)
007, absolute-zero, academic-workflow-suite, bofj-kitt, empty-linter, ephapax, error-lang, HOL, my-lang/vscode-extension, patallm-gallery/claude-integrations/firefox-lsp/vscode-extension, proof-burrower, proven, proven-servers, vscode-a2ml, vscode-k9.
Standards-internal scaffolds (owner-managed, untouched)
standards/lol, standards/avow-protocol, standards/k9-svc/tools/vscode-extension (carve-out), standards/rhodium-standard-repositories/satellites/cccp/satellites/nextgen-languages/7-tentacles.
Keeping this issue OPEN as the STEP-3 longtail tracker. Acceptance will close when the remaining ~10 heavier repos land their per-repo migration PRs (each needs owner judgment on Class B vs C and whether the host contract requires staying on npm).
- ran
- added a commit that references this issue
on May 31, 2026
Part of #253. Blocked by step 2.
Goal
Migrate the long tail of repos with ≤2
package.jsonmanifests, applying the canonical template from STEP 2. This is the "warm-up" batch — predictable, repeatable, and validates the template at scale before tackling larger consolidations.Scope
Per umbrella body inventory table, the ≤2-manifest bucket includes:
Final repo list comes from the STEP 2 re-inventory.
Per-repo recipe
For each repo:
gh repo view hyperpolymath/<repo> --json owner,isFork,parent→owner=hyperpolymath, isFork=falsepackage.jsonwithdeno.jsonimport mapdeno taskentries.gitignore(dropnode_modulesexemption)deno taskinstead ofnpm runAcceptance
:nodejs_detectedflags from migrated reposSequencing
Blocked by: STEP 2 (template + accurate inventory).
Blocks: STEP 4 (mid-tier benefits from long-tail lessons-learned).