Skip to content

[campaign #253] STEP 3 — SMALLEST-FIRST BATCH: ≤2-manifest repos (long tail) #265

Description

@hyperpolymath

Part of #253. Blocked by step 2.

Goal

Migrate the long tail of repos with ≤2 package.json manifests, 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:

Manifests Repos
2 zotero-tools, typed-wasm, proven, proof-burrower, patallm-gallery, my-lang, kaldor-iiot, julia-the-viper, ephapax, claude-integrations, bofj-kitt
≤1 tail (per re-inventory from STEP 2)

Final repo list comes from the STEP 2 re-inventory.

Per-repo recipe

For each repo:

  1. Verify per-PR ownership gate: gh repo view hyperpolymath/<repo> --json owner,isFork,parent → owner=hyperpolymath, isFork=false
  2. Apply STEP 2 template: replace package.json with deno.json import map
  3. Port npm scripts → deno task entries
  4. Update .gitignore (drop node_modules exemption)
  5. Update CI workflow file(s) to call deno task instead of npm run
  6. Verify hypatia scan is GREEN (carve-outs from STEP 1 absorb legit npm-style manifests)
  7. Open PR with auto-merge armed

Acceptance

  • One PR per repo (or batched per repo if multiple manifests in same repo)
  • All PRs auto-merged with GREEN CI
  • Hypatia scan estate-wide shows no new :nodejs_detected flags from migrated repos
  • Per-PR ownership gate verified for each before opening PR

Sequencing

Blocked by: STEP 2 (template + accurate inventory).
Blocks: STEP 4 (mid-tier benefits from long-tail lessons-learned).

Activity

  1. hyperpolymath commented on May 30, 2026

    @hyperpolymath
    OwnerAuthor

    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.json runtime config landed. The 2 holdouts (typed-wasm, ephapax) carry only vscode-extension package.json manifests, which fall under STEP 1's hypatia#391 path_allow_prefixes carve-out (vscode host-required class). No conversion needed.

    Cross-cutting evidence

    Estate-wide post-Layer-1 census:

    • 177 total package.json post strict-excludes
    • 508 total deno.json (Deno-native + shim co-existence pattern documented in STEP 2 MIGRATION.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.json deleted; deno.json adds nodeModulesDir: "auto" + npm:<pkg>@<semver> specifiers; CI workflows ported npm 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.json adoptions 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.

  2. hyperpolymath commented on May 30, 2026

    @hyperpolymath
    OwnerAuthor

    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.json already exists at root and package.json is 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:rescript fix 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.json already has imports.rescript = "npm:rescript@...", tasks call rescript bare or via --node-modules-dir=auto). Each is a per-PR slice: convert task to deno run -A --node-modules-dir=auto npm:rescript + delete package.json stub. 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.

  3. hyperpolymath commented on May 30, 2026

    @hyperpolymath
    OwnerAuthor

    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 rescript imports → 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_detected path_allow_prefixes with vscode-, tree-sitter-, /.lake/, /office-addin/, /bindings/{javascript,typescript}/
    standards #320 Mirrors hypatia#405 into .claude/CLAUDE.md §npm Exemptions table + rhodium-standard-repositories/.github/workflows/language-policy.yml grep -vE filters

    These cover ~16 false-positive estate flags that otherwise would have been incorrectly migration-targeted: vscode-k9, vscode-a2ml, editors/vscode-007/, vscode-extension/ subdirs in empty-linter/error-lang/my-lang, tree-sitter-a2ml, tree-sitter-k9, editors/tree-sitter-ephapax, tree-sitter-affinescript/ subdirs in bofj-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)

    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.md sweep 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.

  4. hyperpolymath commented on May 30, 2026

    @hyperpolymath
    OwnerAuthor

    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:rescript fix) · 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_detected path_allow_prefixes with vscode-, 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.yml Node 18-24 matrix + test.yml Node 10-20 × {ubuntu,windows,macos}). Both:

    • ran npm ci + npm test against the root package.json (banned by cicd_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.md which 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 (heavy node src/*.js invocations).
    • 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).

    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).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    meta:campaignCoordinated multi-repo push with a defined end state

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions