Instruction-file sprawl: 1,808 CLAUDE.md files and a 14-file auto-import chainHigh
Evidence1,808 CLAUDE.md files (13,467 total lines) outside node_modules — 1,391 under apps/ alone (forgebooks has 128, jd 89, forgesales 64). Most are 3-5 line boilerplate stamps. The root chain auto-loads 14 files (~33 KB ≈ 8-9k tokens) before any work. Root also holds 12 more CLAUDE_*.md files including CLAUDE_SCHEDULED_TASKS_RULES.md at 1,083 lines / 122 KB.
FixCollapse the auto-import chain into one root CLAUDE.md under ~150 lines with on-demand pointers into docs/. Stop stamping per-directory stubs; keep CLAUDE.md only at root and per-app root.
Core behavioral instructions live in .openclaw/workspace/, invisible to non-Claude agentsHigh
EvidenceIDENTITY.md, SOUL.md, USER.md, AGENTS.md, HEARTBEAT.md, TOOLS.md sit in .openclaw/workspace/ — reachable only via Claude-specific @-import syntax. Codex reads AGENTS.md, Gemini reads GEMINI.md; neither follows @-imports. GEMINI.md count in the repo: 0. The same dir mixes in unrelated content (DREAMS.md 954 lines, BAE-MEMORIES.md 416 lines, reports).
FixPromote the operative rules into root AGENTS.md (the cross-CLI standard); make CLAUDE.md a thin pointer. Move persona/memory/report files out of the instruction directory.
Root has ~73 entries; heavy custom surface, no README, no root tsconfigHigh
Evidence49 visible + 24 dot-entries at root. Nonstandard: .forgebot/ (276 MB), .openclaw/, .hermes/, .codex/, .qmd/, .remember/, crons/, channels/, swat/, lost_n_found/, both output/ AND outputs/, FIX-FORGEMEDIA.bat. No README.md, no root tsconfig/turbo/nx. The repo ships a .rootallowed file to police its own root drift.
FixPromote CONTEXT.md (good 52-line orientation doc) to README.md. Merge output/ into outputs/, remove root clutter, fold agent-runtime dot-dirs into one location.
Skill system is a custom multi-runtime symlink web with a nonstandard SUBSKILL.md conventionMedium
Evidence.forgebot/skills is the physical home (223 SKILL.md, 368 SUBSKILL.md, 276 MB). Four symlinks point at it. SUBSKILL.md is a house-only convention no harness auto-discovers. pnpm-workspace.yaml registers 8 skill script dirs as workspace packages, so package tooling depends on symlink resolution on Windows.
FixDrop skills-as-workspace-packages from pnpm-workspace.yaml; document the symlink layout in one place; collapse SUBSKILL.md indirection where a subskill could be a plain skill.
Workspace config duplicated and divergent between pnpm-workspace.yaml and package.jsonMedium
Evidencepnpm-workspace.yaml lists packages/*, apps/*, crons, scripts, plus 8 .claude/skills paths. Root package.json ALSO has a npm-style "workspaces" field (ignored by pnpm) listing a different subset. An agent reading package.json first gets the wrong picture.
FixDelete the "workspaces" field from root package.json; keep pnpm-workspace.yaml as the single source, trimmed toward apps/* and packages/*.
Root package.json has no standard entry-point scriptsMedium
EvidenceNo dev, build, test, lint, or typecheck at root. Instead: sentry, image-gen, openrouter, share-preview, vercel:queue-slo — all skill utilities, several requiring Doppler. Per-app package.json is fine (forgesales has dev/build/preview/typecheck/lint/test — vanilla Vite).
FixAdd conventional root scripts that fan out (pnpm -r build etc.); move skill utilities into the skills' own package.json files.
64 app dirs with dead weight and typo-duplicatesMedium
Evidenceapps/justbcappy and apps/justbecapy both exist — a typo'd near-duplicate pair. Stray untracked build artifact at session start: apps/forgemail/vite.config.ts.timestamp-*.mjs.
FixArchive or delete dead/duplicate apps; move retired apps out of the workspace glob; gitignore vite timestamp files.
Committed automation exhaust: crons/ routine artifacts live in gitMedium
Evidence36 routine dirs each accumulate per-run artifacts (LOGS.md, REPORT.md, DASHBOARD.html). Recent commit history is dominated by "refresh artifacts" churn; the Multi-Agent Safety rules exist largely to manage it.
FixKeep ROUTINE.md specs in git; move run outputs to a gitignored dir or external store so history reflects code, not cron heartbeats.
House rules that invert agent defaults are scattered and repeatedMedium
EvidenceDeploy-only-via-git-push, Doppler-only secrets, trunk-only, never-stash, no-Python, CalVer — spread across CLAUDE_MISC.md, CLAUDE_PRINCIPLES.md, TOOLS.md, AGENTS.md, and re-stamped as banners in app files. The deploy rule appears in at least 4 auto-loaded files.
FixOne short "House rules (differ from defaults)" block — 8-10 bullets — near the top of the root instruction file; delete every duplicate.
No CI-discoverable build orchestration; ports live in a custom launch registryLow
EvidenceNo turbo.json/nx.json, no root .github/workflows. App ports live in .claude/launch.json and per-app dev scripts. A fresh agent cannot run "the whole repo" or find a canonical repo-wide check.
FixAdopt a minimal repo-wide pipeline (build, typecheck, test) or document that the unit of work is one app; mirror the port table into the README.