Context
Follow-up of #16204 (the devDependency census, PR #16354). The census classified all 45 devDependencies by AST-verified importers (static + dynamic + require), tool-usage (bins/hooks), and mention evidence. Four packages came back with zero verified usage of any class. Per the census ticket's Out of Scope, removals are their own ticket — this is it. Full adjudication: #16204 issuecomment-5158183571.
Correction (2026-08-02, operator review): the original body named five, including mermaid. Wrong — src/main/addon/Mermaid.mjs:40 loads node_modules/mermaid/dist/mermaid.min.js via DomAccess.loadScript (the learning section's mermaid blocks in apps/portal render through it; chain: src/component/Markdown.mjs → dynamic wrapper import → addon → loadScript). The census's evidence was honest (5 mention files); the adjudication dismissed them from a truncated grep view. Mermaid is restored as a keep; the correction is recorded on #16204.
Live latest-open sweep at 2026-08-02T14:12Z (20 newest) + A2A in-flight claim scan (15 newest): no equivalent found.
The Problem
Four devDependencies sit in every contributor's install with no importer, no bin invocation, and no asset-path consumer:
| package |
census evidence |
note |
clean-webpack-plugin |
zero references anywhere |
webpack 5 output.clean supersedes it |
glob |
329 mention files, all English (global, fast-glob); zero imports/bins |
fs.globSync (Node 22+) era |
webpack-node-externals |
zero references anywhere |
— |
yargs |
zero references anywhere |
commander + inquirer are the used CLI libs |
None is native-build, so removal buys install weight only — no compile relief (that question belongs to the tier ticket). The risk is the reverse: removing something a lane still needs. That risk is what the census exists to bound — and what the mermaid correction just demonstrated is real.
The Architectural Reality
- Evidence class per package is on the census comment — reproducible in seconds:
node ai/scripts/diagnostics/devDependencyCensus.mjs.
- The instrument's zero-importer section prints mention evidence per package; the adjudication table on the ticket converts that evidence into keep/remove verdicts (the keeps —
@fortawesome, monaco-editor, highlightjs-line-numbers.js, @chroma-core/default-embed, webpack-cli, webpack-dev-server, mermaid — are NOT in scope; they have asset-path or bin-delegate consumers).
package.json + package-lock.json are the only touched surfaces; no source file changes. The lockfile prune is surgical (root mirror + reachability-walk from the root, 4-space format preserved) — a full npm install --package-lock-only re-resolution rewrites the entire file's formatting and was rejected for blast radius.
The Fix
Remove the four rows from devDependencies, prune the lockfile surgically, and prove the two things that could secretly consume one of them: the theme/app builds and the test suite.
A single removal commit is fine (the four share one evidence class and one verification pass), but each package's removal must be named in the commit body so a bisect can isolate it.
Acceptance Criteria
Out of Scope
better-sqlite3, chromadb, and every keep-verdict package — placement/tier questions live in the tier follow-up, not here.
- Any source-code change.
Related
Origin Session ID: session_5c970912-b750-4835-ad51-fbb3d2bc4ebe
Retrieval Hint: query_raw_memories("devDependency census zero-importer removal candidates clean-webpack-plugin glob")
Context
Follow-up of #16204 (the devDependency census, PR #16354). The census classified all 45 devDependencies by AST-verified importers (static + dynamic +
require), tool-usage (bins/hooks), and mention evidence. Four packages came back with zero verified usage of any class. Per the census ticket's Out of Scope, removals are their own ticket — this is it. Full adjudication: #16204 issuecomment-5158183571.Correction (2026-08-02, operator review): the original body named five, including
mermaid. Wrong —src/main/addon/Mermaid.mjs:40loadsnode_modules/mermaid/dist/mermaid.min.jsviaDomAccess.loadScript(the learning section's mermaid blocks inapps/portalrender through it; chain:src/component/Markdown.mjs→ dynamic wrapper import → addon → loadScript). The census's evidence was honest (5 mention files); the adjudication dismissed them from a truncated grep view. Mermaid is restored as a keep; the correction is recorded on #16204.Live latest-open sweep at 2026-08-02T14:12Z (20 newest) + A2A in-flight claim scan (15 newest): no equivalent found.
The Problem
Four devDependencies sit in every contributor's install with no importer, no bin invocation, and no asset-path consumer:
clean-webpack-pluginoutput.cleansupersedes itglobglobal,fast-glob); zero imports/binsfs.globSync(Node 22+) erawebpack-node-externalsyargscommander+inquirerare the used CLI libsNone is native-build, so removal buys install weight only — no compile relief (that question belongs to the tier ticket). The risk is the reverse: removing something a lane still needs. That risk is what the census exists to bound — and what the mermaid correction just demonstrated is real.
The Architectural Reality
node ai/scripts/diagnostics/devDependencyCensus.mjs.@fortawesome,monaco-editor,highlightjs-line-numbers.js,@chroma-core/default-embed,webpack-cli,webpack-dev-server,mermaid— are NOT in scope; they have asset-path or bin-delegate consumers).package.json+package-lock.jsonare the only touched surfaces; no source file changes. The lockfile prune is surgical (root mirror + reachability-walk from the root, 4-space format preserved) — a fullnpm install --package-lock-onlyre-resolution rewrites the entire file's formatting and was rejected for blast radius.The Fix
Remove the four rows from
devDependencies, prune the lockfile surgically, and prove the two things that could secretly consume one of them: the theme/app builds and the test suite.A single removal commit is fine (the four share one evidence class and one verification pass), but each package's removal must be named in the commit body so a bisect can isolate it.
Acceptance Criteria
package.json;package-lock.jsonpruned consistently (npm ci --dry-runpasses; no full re-resolution churn).node ./buildScripts/build/themes.mjs -f -n -e dev -t allbuilds clean after removal (the build is the likeliest hidden consumer — webpack plugins and CSS pipeline live there).UNIT_TEST_MODE=true npx playwright test -c test/playwright/playwright.config.unit.mjs(receipt in the PR).mermaid.)Out of Scope
better-sqlite3,chromadb, and every keep-verdict package — placement/tier questions live in the tier follow-up, not here.Related
Origin Session ID: session_5c970912-b750-4835-ad51-fbb3d2bc4ebe
Retrieval Hint:
query_raw_memories("devDependency census zero-importer removal candidates clean-webpack-plugin glob")