ForgeFX Simulations

ForgeApps Monorepo  /  Repo Simplification Audit  /  July 2, 2026

Top 10 Easy Refactors

Ranked wins toward Essentialism, Minimalism, and Clarity. Every item below was found by a dedicated scan, then independently re-verified against the live repo before making the list.

~150 MBtracked weight removed
~800tracked files removed
50 → 36candidates verified (14 refuted)
61agents · 10 scan dimensions

Verdict / The repo never throws anything away

The forgeapps monorepo is healthy at its core but carries heavy sediment: committed binary scratch (screenshots, renders, concept art), dead Python remnants from a pre-TypeScript era, auto-generated doc stubs that violate the repo's own documentation policy, and unbounded log-style files that grow every month. Almost every top win is a deletion — the code that ships is fine. The ten picks below remove roughly 150 MB of tracked weight and about 800 tracked files, fix two self-perpetuating leaks (a doc-stub reseeding bug and a scaffold template that clones violations into every new app), and bound the one file that grows 200 KB a month. All are verified low-risk and git-recoverable.

The Ten / Ranked by ease × impact

1

Delete the valley render iterations in the JD app (54 MB)

TrivialHigh impactEssentialismMinimalismIteration

Remove 24 throwaway Blender render iterations (v16 through v32, plus final/textured renders and a scene file), along with the one broken HTML viewer that points at them. The single largest tracked-weight win found — the pipeline that produced these was retired with the Python purge, so nothing can regenerate or consume them.

Verified evidence

53.6 MB across 24 files: apps/jd/scripts/valley-*.png + valley-scene.glb. Only the .glb is LFS; the 23 PNGs are raw blobs. Sole reference: apps/jd/scripts/valley-slider.html. Generating scripts deleted in 3bc09b148; last touched 2026-06-10.

First steps

git rm 'apps/jd/scripts/valley-comparison*.png' 'apps/jd/scripts/valley-render-*.png' apps/jd/scripts/valley-mcp-viewport.png apps/jd/scripts/valley-scene.glb apps/jd/scripts/valley-slider.html pnpm --filter jd build && commit

Risk: Low. Delete the slider viewer in the same commit or it becomes a blank page. Everything stays recoverable from git history.

2

Delete 15 empty scaffold stub apps

TrivialHigh impactEssentialismMinimalismMVP Focus

Fifteen apps/ directories contain nothing but placeholder files and auto-generated doc stubs — no package.json, no source, no deploy config. They landed accidentally in a stash-restore commit three weeks ago and inflate the app catalog; every tool that enumerates apps has to skip them.

Verified evidence

15 apps × 4 stub files = 60 tracked files (30 are CLAUDE.md), all created 2026-06-10 in commit 428dc7002. Bare-name grep across all tracked files: zero references except one maintenance-log line. Tracked app dirs drop 77 → 62.

First steps

git rm -r apps/forgedeck apps/forgedeploy apps/forgegoals apps/forgehire apps/forgemeet apps/forgenews apps/forgeplan apps/forgeprice apps/forgepulse apps/forgereport apps/forgeship apps/forgesocial apps/forgestack apps/forgeteam apps/forgetest

Risk: Very low. Nothing imports, tests, deploys, or requires these; git restores any of them trivially if one was actually planned.

3

Delete the tracked root downloads/ folder (25 MB)

EasyHigh impactEssentialismMinimalism

The repo-root downloads/ folder is committed one-off evidence — Playwright verification screenshots, one day's hourly shop-verification captures, and a March terrain-tile experiment. No code reads it, and repo policy sends large media to ForgeMedia, not git. Gitignore the path so future browser drops stay untracked.

Verified evidence

68 tracked files, 25 MB (53 root screenshots + 2 generated images + 13 terrain tiles). Plain blobs, not LFS, so the saving is real. Last content commit 2026-06-10 was a deploy retrigger, not new material.

First steps

git rm -r downloads/ echo '/downloads/' >> .gitignore # ROOT-ANCHORED — bare 'downloads/' would silently ignore 16 other downloads dirs incl. apps/jd/downloads (531 tracked files)

Risk: Low, one footgun: the gitignore entry must be root-anchored. Optionally upload the meshy terrain reference image to ForgeMedia first.

4

Purge app-local downloads scratch in forgemedia + forgebooks (45 MB)

EasyHigh impactEssentialismMinimalismConventionality

Upload the five AI-generated slot-machine concept renders to ForgeMedia, then delete them from forgemedia's downloads folder; delete forgebooks' 38 research-session screenshots outright. Together they are 73% of all app-local downloads bloat, and both were accidentally converted from LFS pointers back to raw git blobs in June.

Verified evidence

apps/forgemedia/downloads/slot-machine-concepts/: 5 PNGs, 28.8 MB (raw blobs since d452281f0). apps/forgebooks/downloads/: 38 PNGs, 15.7 MB, zero references. Cross-app scan: 12 apps carry 60.9 MB of tracked downloads; these two are 73%.

First steps

1) Upload the 5 slot-machine PNGs via the forgemedia skill — delete only after the upload verifiably succeeds 2) git rm -r apps/forgemedia/downloads/slot-machine-concepts/ apps/forgebooks/downloads/ 3) pnpm --filter forgebooks build as a guard; later repeat on the 10 smaller apps/*/downloads dirs

Risk: Low. The ForgeMedia upload needs a Doppler token and must succeed before deletion or provenance is lost.

5

Prune the archived-routines folder to spec files only (554 files, 8.2 MB)

EasyHigh impactEssentialismMinimalismDocumentation

Keep only each retired routine's spec (ROUTINE.md) and delete the leftover working artifacts — logs, error files, dashboards, run histories — for 24 routines that will never fire again. Git history already preserves every byte; this is 2.2% of all tracked files removed with zero behavior change.

Verified evidence

579 tracked files under crons/routines/_archive/; excluding ROUTINE/CLAUDE/README.md leaves 554 files at 8.2 MB. Sole code consumer (forgeboard's sync-routines-from-markdown.mjs) only needs dir presence and tolerates missing logs. 24 archived dirs; 2 (adamobook-health-check, social-media-manager) have no ROUTINE.md.

First steps

1) git rm the non-spec files — but FIRST add a stub ROUTINE.md in the 2 dirs lacking one, so those dirs survive fresh checkouts 2) Update the 'Archiving a routine' section in crons/routines/CLAUDE.md in the same commit 3) Verify all 24 dirs still enumerate via a dry read of discoverRoutines() — don't run the live Supabase sync as verification

Risk: One must-fix: emptying the two spec-less dirs would make git drop them on fresh clones, and a later catalog sync could cascade-delete their Supabase run history. Accepted loss: archived run logs become git-archaeology only.

6

Rotate CHANGELOG.md into monthly archives (723 KB, growing unbounded)

EasyHigh impactEssentialismMinimalismDocumentation

Split entries older than the newest month into per-month files under docs/changelog/, leave the current entries plus a pointer at the root, and teach the maintaining cron to rotate monthly. The file grew from 2.4 KB to 723 KB in three months, and its own header tells every agent to scan it before starting work — so every reader pays for 2,329 lines to get the top thirty.

Verified evidence

723,469 bytes / 2,329 lines; 2,449 bytes three months ago, 502,739 one month ago. 55 uniformly delimited '## [YYYY.MM.DD.N]' entries, zero non-conforming. Live maintainer is adamobook-maintenance ROUTINE.md step 12a; its script anchors date math on the top header only.

First steps

1) mkdir docs/changelog; move pre-June sections into CHANGELOG-2026-MM.md files (entries split cleanly on '## [' headers) 2) Keep at least the newest entry in root CHANGELOG.md — zero July entries exist today, so 'current month only' would leave it empty and break the cron's anchor 3) SAME commit: update adamobook-maintenance ROUTINE.md step 12a with the rotation rule

Risk: The file is load-bearing for a live hourly cron with deletion-detection that restores removed blocks. Both hazards are neutralized by keeping the newest entry in root and updating the spec in the same commit.

7

Sweep out the dead Python remnants (26 orphaned packaging files + 2 scripts)

TrivialMedium impactEssentialismNo FakesConventionality

Delete the 25 Python packaging manifests sitting in skill directories that contain zero Python source, the foreign-project config/python/ directory (a pytest config targeting a package that doesn't exist), and two one-off JD report generators. The repo is TypeScript-only by rule; these files advertise tooling that was already deleted — one even recommends the banned dotenv package.

Verified evidence

28 tracked packaging files with zero .py in their trees (25 in .forgebot/skills/, plus config/python/). config/python/pytest.ini targets nonexistent packages/teamcity-lib. Zero tracked .py under apps/ or packages/. .openclaw/workspace/build_jd_report_v3.py + jd_phase3_cost_table.py = 738 lines idle since 2026-06-08.

First steps

1) Re-run the zero-py enumeration; git rm the 25 skill manifests + config/python + the two workspace scripts 2) Remove the python/ row from config/CLAUDE.md; grep owning SKILL.md files for stale 'pip install' instructions 3) Delete or rewrite the stale pytest guide docs under the testing subskill

Risk: The skills tree was bulk-restored from an external copy on 2026-06-30 — confirm no external mirror re-syncs the deleted manifests. Do NOT extend the sweep to the live keep-list Python in adamobook-maintenance.

8

Delete the 4 packages/*/CLAUDE.md stubs and fix the off-by-one that reseeds them

TrivialMedium impactConventionalityDocumentationMinimalism

Remove the four 7-line template stubs under packages/ and change one comparison in the docs-maintenance sweep and seeder so the tooling stops recreating files the written policy forbids. This is an active tug-of-war: a human deleted these stubs on June 10 and the routine reseeded them 90 minutes later.

Verified evidence

4 stubs, each exactly 7 template lines, duplicating the allowed 135-line packages/CLAUDE.md. Off-by-one verified: 'parts.length > 2' should be '>= 2' at claude_quality_sweep.ts:184 and seed_missing_claude.ts:93. Reseed cycle documented in commits 0ea07fe9d → ff55a124a → f17247efa.

First steps

1) Change 'parts.length > 2' to '>= 2' in the packages branch of both files 2) Add a regression test for the packages/<pkg> exclusion — no such test exists, which is why the reseeding went unnoticed twice 3) git rm the four stubs and run the sweep test

Risk: Low — single-character change in a coverage carve-out. Counter-risk of skipping it: the stubs propagate into app node_modules via workspace links, violating another policy rule.

9

Hoist one .prettierrc to the repo root, delete 33 identical copies

TrivialMedium impactEssentialismMinimalismConventionality

Copy the byte-identical formatting config that 33 apps each carry into a single root file, delete the copies, and remove the orphaned conflicting config under config/linting/. Prettier resolves config by walking up the tree, so this is a byte-exact no-op for the 33 apps — and gives the ~46 unconfigured apps house style for free.

Verified evidence

33 apps/*/.prettierrc files, all one md5 (4a2ddbb0...). No root prettier config of any form; no package.json prettier field anywhere. config/linting/.prettierrc.json referenced by nothing and contradicts the majority style. Nothing runs prettier automatically: no CI, hooks disabled.

First steps

cp apps/ally/.prettierrc .prettierrc git rm $(git ls-files 'apps/*/.prettierrc') config/linting/.prettierrc.json npx prettier --check apps/ally/src # spot-check outcomes unchanged

Risk: Zero behavior change for the 33 apps. Intended change for the rest: future manual prettier runs switch from defaults to house style — cosmetic diffs only.

10

Delete the 70 policy-violating CLAUDE.md files (67 in __tests__, 3 too deep)

EasyMedium impactConventionalityEssentialismDocumentation

Remove every CLAUDE.md inside __tests__ directories and the three buried at depth four or deeper, hoisting the handful of unique test-strategy paragraphs into parent docs first. The set includes the two template copies in apps/example — which closes the vector that stamps this violation into every newly scaffolded app.

Verified evidence

67 files match __tests__ across 37 apps; sweep + seeder already exclude these paths (claude_quality_sweep.ts:22, seed_missing_claude.ts:15), so deletions are stable. 7 of the 67 postdate the rule because create-app.ts clones apps/example wholesale. Depth-4+ set is exactly 3 pure stubs, none referenced.

First steps

1) git ls-files '*CLAUDE.md' | grep -E '(^|/)__tests__/' for the list; fold any non-boilerplate Purpose paragraph into the parent CLAUDE.md first (7 apps have one) 2) git rm the 67 + the 3 depth-4+ files 3) Commit with exact pathspecs

Risk: Low. Nothing reads these programmatically; the seeder won't regenerate them. Use exact pathspecs around apps/forgeboard/__tests__ — another agent has in-flight test edits there right now.

Honorable Mentions / Verified, just outside the ten

Remove ~47 verified-unused runtime dependencies across 21 apps

forgebench's 16-dep phantom CLI/server stack (with knip suppressions telling the dead-code tool to lie), 31 template-leftover deps across 19 apps, and policy-violating dotenv declarations in forgebooks and kando/adamabot. All zero-reference by word-boundary grep; one pnpm install plus affected-app builds verifies.

Trash 62 MB of untracked root scratch: working/ and the three JD_XR PNGs

working/ is 59 MB of gitignored, self-declared regeneratable creative-brief scratch idle since June 8. Upload JD_XR Options A and B to ForgeMedia before trashing (they exist nowhere else; C is already uploaded byte-identical), and use trash not rm — the Tadano deal is active with a July client review.

Delete the slack skill's archived legacy Python subskills (35 files, 3.9 MB)

The archive self-declares reference-only and its TypeScript replacements are live. Update the 5 external doc pointers; also removes the last 2 orphaned Python packaging files not covered by pick #7.

Move the BAE sim archive out of forgesales' deployed public tree (34 MB)

24.3 MB of podcast MP3, infographics, and RFI scrape dump plus two stray 9.5 MB PNGs ship with every forgesales deploy and are publicly fetchable today. Relocate to ForgeMedia rather than delete — these are concluded-deal business records.

Empty the lost_n_found/ quarantine and restore CONTEXT-MAP.md to root

CONTEXT-MAP.md was mistakenly quarantined while two docs still expect it at root — move it back. Then relocate 4.8 MB of Walmart VR images to ForgeMedia and trash the 14 MB untracked dist/ plus old logs.

Delete the crons/ root strays and finish retiring crons/scheduled-tasks/

Seven stray one-off files (including a self-described delete-me verification memo) plus the 16-file scheduled-tasks/ dir whose two tasks were disabled at the scheduler in May. Verified inert.

Method. Ten parallel scan agents each swept one dimension — Python remnants, root clutter, CLAUDE.md sprawl, config duplication, dead apps, dependency hygiene, docs sprawl, crons/channels/scripts, git binary bloat, and code duplication — producing 50 candidate refactors. Every candidate was then handed to an independent adversarial verifier instructed to refute it: re-run the evidence commands, grep for load-bearing references, check git history for signs of life. 14 candidates were refuted or downgraded (notably: naive ESLint consolidation breaks 4 apps with error-level failures, and a proposed bulk deletion of 1,022 generated doc stubs conflicts with the seeder that would recreate them). A synthesis pass deduped the 36 survivors and ranked by ease × impact.

All ranks 1–10 are executable independently, in any order, each in one commit. Numbers cited were re-verified against the working tree on July 2, 2026.