with one click
scan-codebase-health
// [Documentation] Use when you need to detect codebase health issues: unused exports, doc count-drift, orphan files, stale config references.
// [Documentation] Use when you need to detect codebase health issues: unused exports, doc count-drift, orphan files, stale config references.
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | scan-codebase-health |
| description | [Documentation] Use when you need to detect codebase health issues: unused exports, doc count-drift, orphan files, stale config references. |
Codex compatibility note:
- Invoke repository skills with
$skill-namein Codex; this mirrored copy rewrites legacy Claude/skill-namereferences.- Prefer the
plan-hardskill for planning guidance in this Codex mirror.- Task tracker mandate: BEFORE executing any workflow or skill step, create/update task tracking for all steps and keep it synchronized as progress changes.
- User-question prompts mean to ask the user directly in Codex.
- Ignore Claude-specific mode-switch instructions when they appear.
- Strict execution contract: when a user explicitly invokes a skill, execute that skill protocol as written.
- Subagent authorization: when a skill is user-invoked or AI-detected and its protocol requires subagents, that skill activation authorizes use of the required
spawn_agentsubagent(s) for that task.- Do not skip, reorder, or merge protocol steps unless the user explicitly approves the deviation first.
- For workflow skills, execute each listed child-skill step explicitly and report step-by-step evidence.
- If a required step/tool cannot run in this environment, stop and ask the user before adapting.
Codex does not receive Claude hook-based doc injection. When coding, planning, debugging, testing, or reviewing, open project docs explicitly using this routing.
Always read:
docs/project-config.json (project-specific paths, commands, modules, and workflow/test settings)docs/project-reference/docs-index-reference.md (routes to the full docs/project-reference/* catalog)docs/project-reference/lessons.md (always-on guardrails and anti-patterns)Situation-based docs:
backend-patterns-reference.md, domain-entities-reference.md, project-structure-reference.mdfrontend-patterns-reference.md, scss-styling-guide.md, design-system/README.mdfeature-docs-reference.mdintegration-test-reference.mde2e-test-reference.mdcode-review-rules.md plus domain docs above based on changed filesDo not read all docs blindly. Start from docs-index-reference.md, then open only relevant files for the task.
Goal: Detect structural rot in AI-assisted codebases — dead code, count-drift, orphan files, stale configs, dead feature flags, broken cross-references. Works on any project via docs/project-config.json.
Workflow:
plans/reports/codebase-health-scan-{YYMMDD}.mdKey Rules:
.code-graph/graph.db not foundfile:line, category, severity (HIGH/MEDIUM/LOW), suggested action
MUST ATTENTION NEVER report a finding without file:line proofBefore any other step, in parallel:
docs/project-config.json for the codebaseHealth section:{
"codebaseHealth": {
"sourcePaths": ["src/"],
"docPaths": ["docs/"],
"configPatterns": ["**/appsettings*.json", "**/environment*.ts"],
"excludePaths": ["node_modules", "dist", "bin", "obj"]
}
}
If codebaseHealth section missing, use defaults: sourcePaths: ["src/"], docPaths: ["docs/"].
| Signal | Phase Enabled |
|---|---|
.code-graph/graph.db exists | Phase 3 (Unused Exports) + Phase 4 (Orphan Files) |
CI config found (.github/workflows, azure-pipelines.yml) | Phase 6 (CI Health) — optional |
Feature flag patterns found (FeatureFlags, IFeatureManager, LaunchDarkly) | Phase 6 (Dead Feature Flags) |
Cross-reference patterns in docs (file:line, [link]()) | Phase 7 (Broken Cross-References) |
Evidence gate: If docs/project-config.json not found and no detectable source paths, report and ask user for guidance. DO NOT guess project structure.
Think: Which numeric claims in docs can actually be verified? What's the drift threshold that signals a real maintenance problem vs normal growth?
Scan docs/ for numeric claims: "N files", "N tests", "N hooks", "N services", "N skills", "N components".
For each claim:
Severity thresholds:
Write findings incrementally to report after each doc scanned. NEVER batch at end.
Think: Which config values reference code artifacts (class names, module names, connection strings)? Could those artifacts have been renamed or deleted?
For each file matching configPatterns:
Evidence gate: NEVER flag a reference as stale without attempting grep. Confidence <80% → flag as MEDIUM "unverified" only.
Skip if .code-graph/graph.db does not exist — log "Phase 3 skipped: no graph.db".
Think: Which public API surface has zero consumers? Could be dead code, or could be an intentional entry point — distinguish by file type.
For key exported symbols in source files:
python .claude/scripts/code_graph query importers_of <symbol> --jsonSkip if .code-graph/graph.db does not exist — log "Phase 4 skipped: no graph.db".
Find source files (.ts,.cs,.py, etc.) with zero inbound edges:
python .claude/scripts/code_graph query importers_of <file> --jsonThink: Where does the same pattern appear across services/modules? Does it look different in different places? Is that divergence intentional or accidental?
Compare the same pattern across services/modules:
Skip if no feature flag patterns found in Phase 0.
Think: Which flags exist in config but have no code references? Which code references flags that no longer exist in config?
Think: Which doc links point to files that no longer exist? Which file:line references in docs are stale?
For docs containing markdown links [text](path) or file:line references:
Before writing final report, spawn a fresh sub-agent (zero memory) to:
file:line evidence sourceMax 2 rounds → escalate to user if review finds >30% false positive rate.
Write to plans/reports/codebase-health-scan-{YYMMDD}.md:
# Codebase Health Scan Report
**Date:** {YYYY-MM-DD}
**Phases Completed:** {N}/{total} ({reason for skipped phases})
**Findings:** {total} ({HIGH} high, {MEDIUM} medium, {LOW} low)
## Summary
| Phase | Status | Findings |
| ----------------------- | ----------------------------------- | ---------- |
| Doc Count-Drift | Scanned | N findings |
| Stale Config Refs | Scanned | N findings |
| Unused Exports | Scanned/Skipped (no graph.db) | N findings |
| Orphan Files | Scanned/Skipped (no graph.db) | N findings |
| Pattern Drift | Scanned | N findings |
| Dead Feature Flags | Scanned/Skipped (no flags detected) | N findings |
| Broken Cross-References | Scanned | N findings |
## Findings
### HIGH Severity
- `{file}:{line}`: {description} — Action: {action}
### MEDIUM Severity
- `{file}:{line}`: {description} — Action: {action}
### LOW Severity
- `{file}:{line}`: {description} — Action: {action}
## False Positives (Fresh-Eyes Review)
{Findings dismissed by Round 2 review with reasoning}
[IMPORTANT] Use task tracking to break ALL work into small tasks BEFORE starting.
Critical Thinking Mindset — Every claim needs traced proof, confidence >80% to act. Anti-hallucination: Never present guess as fact — cite sources, admit uncertainty, self-check output, cross-reference independently. Certainty without evidence = root of all hallucination.
Output Quality — Token efficiency without sacrificing quality.
- No inventories/counts — stale instantly
- No directory trees — use 1-line path conventions
- No TOCs — AI reads linearly
- One example per pattern — only if non-obvious
- Lead with answer, not reasoning
- Sacrifice grammar for concision in reports
- Unresolved questions at end
AI Mistake Prevention — Failure modes to avoid:
Verify AI-generated content against actual code. AI hallucinates class names/signatures. Grep to confirm existence before documenting. Trace full dependency chain after edits. Always trace full chain. Holistic-first — resist nearest-attention trap. List EVERY precondition before forming hypothesis. Surface ambiguity before coding. NEVER pick silently.
IMPORTANT MUST ATTENTION output quality: no counts/trees/TOCs, 1 example per pattern, lead with answer.
MUST ATTENTION apply critical thinking — every claim needs traced proof, confidence >80% to act. Anti-hallucination: never present guess as fact.
MUST ATTENTION apply AI mistake prevention — holistic-first debugging, fix at responsible layer, surface ambiguity before coding, re-read files after compaction.
IMPORTANT MUST ATTENTION break work into small task tracking tasks BEFORE starting — one per phase
IMPORTANT MUST ATTENTION detect available tooling in Phase 0 — never assume graph.db exists
IMPORTANT MUST ATTENTION NEVER report a finding without file:line evidence
IMPORTANT MUST ATTENTION write findings incrementally after each phase — NEVER batch at end
IMPORTANT MUST ATTENTION severity thresholds are concrete: HIGH = runtime failure risk; MEDIUM = drift/dead code; LOW = cleanup candidate
IMPORTANT MUST ATTENTION Phase 8 fresh-eyes review is mandatory — prevents false positives from rationalization
Anti-Rationalization:
| Evasion | Rebuttal |
|---|---|
| "Graph not needed, skip Phases 3-4" | Phases 3-4 are explicitly gated — state skip reason in report, don't silently omit |
| "Count drift is small, LOW severity is fine" | Apply the threshold table: >10% = MEDIUM, >30% = HIGH. No discretionary override. |
| "Finding looks valid, skip Round 2 review" | Main agent rationalizes own findings. Fresh-eyes is non-negotiable. |
| "No feature flags found, skip Phase 6" | Log "Phase 6 skipped: no feature flag patterns detected" in report |
| "Config reference might still exist" | Grep to verify. Confidence <80% → flag as MEDIUM "unverified" not LOW "probably fine" |
[TASK-PLANNING] Before acting, analyze task scope and break into small todo tasks and sub-tasks using task tracking.
Source: .claude/hooks/lib/prompt-injections.cjs + .claude/.ck.json
$workflow-start <workflowId> for standard; sequence custom steps manually[CRITICAL] Hard-won project debugging/architecture rules. MUST ATTENTION apply BEFORE forming hypothesis or writing code.
Goal: Prevent recurrence of known failure patterns — debugging, architecture, naming, AI orchestration, environment.
Top Rules (apply always):
ExecuteInjectScopedAsync for parallel async + repo/UoW — NEVER ExecuteUowTaskwhere python/where py) — NEVER assume python/python3 resolvesExecuteInjectScopedAsync, NEVER ExecuteUowTask. ExecuteUowTask creates new UoW but reuses outer DI scope (same DbContext) — parallel iterations sharing non-thread-safe DbContext silently corrupt data. ExecuteInjectScopedAsync creates new UoW + new DI scope (fresh repo per iteration).AccountUserEntityEventBusMessage = Accounts owns). Core services (Accounts, Communication) are leaders. Feature services (Growth, Talents) sending to core MUST use {CoreServiceName}...RequestBusMessage — never define own event for core to consume.HrManagerOrHrOrPayrollHrOperationsPolicy names set members, not what it guards. Add role → rename = broken abstraction. Rule: names express DOES/GUARDS, not CONTAINS. Test: adding/removing member forces rename? YES = content-driven = bad → rename to purpose (e.g., HrOperationsAccessPolicy). Nuance: "Or" fine in behavioral idioms (FirstOrDefault, SuccessOrThrow) — expresses HAPPENS, not membership.python/python3 resolves — verify alias first. Python may not be in bash PATH under those names. Check: where python / where py. Prefer py (Windows Python Launcher) for one-liners, node if JS alternative exists.Test-specific lessons →
docs/project-reference/integration-test-reference.mdLessons Learned section. Production-code anti-patterns →docs/project-reference/backend-patterns-reference.mdAnti-Patterns section. Generic debugging/refactoring reminders → System Lessons in.claude/hooks/lib/prompt-injections.cjs.
ExecuteInjectScopedAsync, NEVER ExecuteUowTask (shared DbContext = silent data corruption){CoreServiceName}...RequestBusMessagepython/python3 resolves — run where python/where py first, use py launcher or nodeBreak work into small tasks (task tracking) before starting. Add final task: "Analyze AI mistakes & lessons learned".
Extract lessons — ROOT CAUSE ONLY, not symptom fixes:
$learn.$code-review/$code-simplifier/$security/$lint catch this?" — Yes → improve review skill instead.$learn.
[TASK-PLANNING] [MANDATORY] BEFORE executing any workflow or skill step, create/update task tracking for all planned steps, then keep it synchronized as each step starts/completes.