# Learn Workflow — $autoresearch learn Autonomous codebase documentation engine. Scouts codebase structure, learns patterns and architecture, generates/updates comprehensive documentation — then validates and iteratively improves until docs are accurate. **Core idea:** Scout → Generate → Validate → Fix → Repeat until docs match codebase reality. ## Trigger - User invokes `$autoresearch learn` - User says "learn this codebase", "generate docs", "document this project", "create documentation", "update docs", "check docs health", "docs status" - User wants to understand or document an unfamiliar codebase ## Loop Support ``` # Default — auto-detect mode and learn $autoresearch learn # Specific mode $autoresearch learn --mode update # Bounded iterations for validation-fix loop $autoresearch learn Iterations: 5 # Scoped learning $autoresearch learn --scope src/api/** # Selective single-doc update $autoresearch learn --mode update --file system-architecture.md ``` ## PREREQUISITE: Interactive Setup (when invoked without flags) **CRITICAL — BLOCKING PREREQUISITE:** If invoked without `--mode` or sufficient inline context, you MUST use direct prompting to gather config BEFORE proceeding to Phase 1. **TOOL AVAILABILITY:** direct prompting may be a deferred tool. If calling it fails, use `ToolSearch` to fetch the schema first, then retry. NEVER skip setup because of tool issues. ### Pre-scan (before asking questions) Detect project state for smart defaults: 1. Does `docs/` exist? How many .md files? `ls docs/*.md 2>/dev/null | wc -l` 2. Project type indicators: `ls package.json Cargo.toml go.mod pyproject.toml *.sln 2>/dev/null` 3. Staleness: `git log -1 --format='%ci' -- docs/ 2>/dev/null` vs `git log -1 --format='%ci' 2>/dev/null` 4. Scale: `find . -type f -not -path './.git/*' -not -path '*/node_modules/*' | wc -l` ### Questions (single direct prompting call — 4 questions) | # | Header | Question | Options (from pre-scan) | |---|--------|----------|------------------------| | 1 | `Mode` | "What documentation operation?" | "Init — learn codebase from scratch, generate all docs (Recommended)" (if 0 docs), "Update — learn what changed, refresh docs (Recommended)" (if docs exist), "Check — read-only health assessment", "Summarize — quick codebase summary" | | 2 | `Scope` | "Which parts of the codebase should I learn?" | Detected top-level dirs as globs + "Everything (entire codebase)" | | 3 | `Depth` | "How comprehensive should documentation be?" | "Quick — overview + summary only", "Standard — all core docs (Recommended)", "Deep — comprehensive with deployment, design, API reference" | | 4 | `Launch` | "Ready to start learning?" | "Launch", "Edit config", "Cancel" | **Skip condition:** If user provides `--mode` + `--scope` or `--depth` → skip setup entirely. **State-aware defaults:** - `docs/` has 0 files → default Mode = Init - `docs/` has files → default Mode = Update - User says "check" / "health" → Mode = Check - User says "summarize" / "summary" → Mode = Summarize **Cancel handling:** If user selects "Cancel" → exit: "Learning cancelled. Run `$autoresearch learn` when ready." ## Architecture ``` $autoresearch learn ├── Phase 1: Scout — Parallel codebase reconnaissance ├── Phase 2: Analyze — Structure detection + project type classification ├── Phase 3: Map — Dynamic doc discovery + gap analysis ├── Phase 4: Generate — Spawn docs-manager with structured prompt ├── Phase 5: Validate — Mechanical verification (refs, links, completeness) ├── Phase 6: Fix — Re-generate failed docs with validation feedback (LOOP) ├── Phase 7: Finalize — Size check, inventory, git diff summary └── Phase 8: Log — Record results to learn-results.tsv ``` ## Phase 1: Scout — Parallel Codebase Reconnaissance **Mode-specific:** - **Init / Update / Summarize (with `--scan`):** Execute full scout - **Check:** SKIP entirely (read-only mode — jump to Phase 2) - **Summarize (without `--scan`):** SKIP (use existing docs only — jump to Phase 3) **Steps:** 1. Scan codebase, calculate files/LOC per directory 2. **Exclusion list:** `.claude`, `.opencode`, `.git`, `node_modules`, `__pycache__`, `secrets`, `vendor`, `dist`, `build`, `.next`, `.nuxt`, `coverage`, `generated`, `*.min.js`, `.cache`, `.tmp` - **Test directories (`tests`, `__tests__`) are NOT excluded** — scouts should scan test structure (file patterns, frameworks, fixtures) for testing-guide.md generation. Scouts read test metadata, not individual test logic. 3. **Scale awareness:** - Count total files: `find . -type f -not -path './.git/*' -not -path '*/node_modules/*' | wc -l` - If >5000 files: increase scout parallelism, add summarization step for reports - If >10000 files: warn user, suggest scoping with `--scope` 4. Activate `ck:scout` skill for parallel codebase exploration 5. **Scout validation:** After scouts return, verify reports contain meaningful data. If all scouts return empty/minimal: STOP → warn: "Scout found minimal code. Verify project has source files or adjust scope with `--scope`." 6. **Monorepo detection:** Check for `workspaces` in package.json, `lerna.json`, `pnpm-workspace.yaml`, `Cargo.toml` with `[workspace]`. If detected → note workspace structure in context. 7. Merge scout reports. Estimate token count: `total_report_lines × 5`. If >100K estimated tokens → summarize merged reports before passing downstream. **Incremental scouting (planned):** - If `learn/` output directory exists from a previous run, read `scout-context.md` for cached context - Compare `git log --oneline` since the cached scout's commit hash - If <20 files changed: use cached scout + targeted re-scout of changed dirs only - If >20 files changed or no cache: full scout as normal - **Note:** This is optimization scaffolding — full scout is always the fallback **Update mode optimization — git-diff scoping:** - Run `git diff --name-only HEAD~10 -- '*.ts' '*.js' '*.py' '*.go' '*.rs' '*.java' '*.rb' 2>/dev/null | head -30` - If changes concentrated in <3 directories → hint scouts to prioritize those areas - Additive: scouts still cover full codebase, but changed areas get extra attention Output: `✓ Phase 1: Scouted — [N] files, [M] directories, [K] LOC analyzed` ## Phase 2: Analyze — Structure Detection + Classification 1. Detect **project type** from scout reports: library, web app, CLI tool, API server, infrastructure, monorepo 2. Detect **tech stack**: languages, frameworks, build tools, test runners 3. Detect **existing doc structure:** `ls docs/*.md 2>/dev/null` 4. Calculate **staleness gap:** - Last code commit: `git log -1 --format='%ci' -- $(git ls-files '*.ts' '*.js' '*.py' '*.go' '*.rs' '*.java' '*.rb' | head -1) 2>/dev/null` - Last docs commit: `git log -1 --format='%ci' -- docs/ 2>/dev/null` - Gap in days between the two **Mode-specific behavior:** - **Init:** Project type determines which docs to create (Phase 3) - **Update:** Staleness + changed areas determine update priority - **Check:** Staleness + validation = health report (Phase 5 outputs report, then STOP) - **Summarize:** Project type shapes summary sections Output: `✓ Phase 2: Analyzed — [type] project, [N] existing docs, staleness: [X] days` ## Phase 3: Map — Dynamic Doc Discovery + Gap Analysis ### Init Mode — Determine Docs to Create **Always create:** - `docs/project-overview-pdr.md` — Project overview and PDR - `docs/codebase-summary.md` — Codebase summary with file inventory - `docs/code-standards.md` — Codebase structure and code standards - `docs/system-architecture.md` — System architecture - `README.md` at root (create or update, max 300 lines) **Conditional creation (based on project signals from Phase 2):** - `docs/deployment-guide.md` — if Dockerfile, CI config (`.github/workflows`, `.gitlab-ci.yml`), deploy scripts, or cloud config detected - `docs/design-guidelines.md` — if UI components, CSS/style files, or frontend framework detected - `docs/project-roadmap.md` — if project has milestones, issues, or TODO tracking - `docs/api-reference.md` — if API routes, controllers, resolvers, or OpenAPI/Swagger specs detected. Include endpoint catalog with method, path, description, request/response shapes - `docs/testing-guide.md` — if test directories (`tests/`, `__tests__/`, `spec/`), test config (jest.config, vitest.config, pytest.ini), or CI test steps detected. Document test strategy, how to run tests, coverage expectations, fixture patterns - `docs/configuration-guide.md` — if `.env.example`, `config/` directory, feature flags, or environment-specific configs detected. Document all env vars, config keys, and their purpose - `docs/changelog.md` — generate from `git log --oneline --no-merges -50` using conventional commit parsing. Group by type (feat, fix, docs, refactor). Only on init; update mode appends new entries ### Update Mode — Read Existing Docs in Parallel **You (main agent) must spawn readers** — subagents cannot spawn subagents. 1. Discover docs dynamically: `ls docs/*.md 2>/dev/null` 2. **Filter:** `*.md` files only — skip binary files (.pdf, .png, .drawio) 3. Count + LOC: `wc -l docs/*.md 2>/dev/null | sort -rn` 4. **Strategy by count:** - **0 files:** Warn via direct prompting: "No docs found. Switch to init mode? [yes/cancel]". If yes → restart as init. If cancel → STOP. - **1-3 files:** Skip parallel reading, docs-manager reads directly - **4-6 files:** Spawn 2-3 `Explore` agents - **7+ files:** Spawn 4-5 `Explore` agents (max 5) 5. **Context budget:** If total docs LOC >5000 → warn in docs-manager prompt about summarization 6. Distribute by LOC (larger files get dedicated agent) 7. **Explore agent output contract:** ``` "Read these markdown docs. For each file return EXACTLY this format: ## {filename} **Purpose:** one-line summary **Key sections:** bullet list of main headings **Needs update:** areas likely stale or incomplete based on content Files: {list}" ``` 8. Merge Explore results into context **Selective update:** If `--file ` provided → scope to that single file only, skip parallel reading. **Diff-based doc targeting (update mode optimization):** - After git-diff scoping identifies changed source files, map them to affected docs: - `src/api/**` changes → prioritize `api-reference.md`, `system-architecture.md` - `src/components/**` changes → prioritize `design-guidelines.md` - `tests/**` changes → prioritize `testing-guide.md` - `package.json` / dependency changes → prioritize `codebase-summary.md` (dependency section) - Config file changes → prioritize `configuration-guide.md` - New files in `src/` → prioritize `code-standards.md`, `system-architecture.md` - Instruct docs-manager to focus regeneration effort on mapped docs, light-touch others - This is advisory, not exclusive — all docs still get reviewed, mapped ones get deeper updates ### Check Mode — Inventory Only 1. List all docs with LOC: `wc -l docs/*.md 2>/dev/null | sort -rn` 2. Get last modified date per file: `stat -f '%Sm' -t '%Y-%m-%d' docs/*.md 2>/dev/null` (macOS) or `stat -c '%y' docs/*.md 2>/dev/null` (Linux) 3. Report which standard doc types exist vs missing (informational, not prescriptive) 4. → Proceed directly to Phase 5 for validation (skip Phase 4) ### Summarize Mode — Read Summary Context 1. Read `docs/codebase-summary.md` if exists (will be created if missing) 2. If `--scan` flag: use merged scout reports from Phase 1 3. If no `--scan`: read existing `docs/*.md` for cross-reference context only 4. If `--topics ` provided: focus on those topics Output: `✓ Phase 3: Mapped — [N] docs to create/update, [M] gaps identified` ## Phase 4: Generate — Spawn docs-manager Agent **CRITICAL:** Spawn `docs-manager` agent via Task tool with all gathered context. Do not wait for user input. **Mode-specific:** - **Init:** Create all docs determined in Phase 3 - **Update:** Update all discovered `docs/*.md` + user's custom docs - **Check:** SKIP (read-only — jump to Phase 5) - **Summarize:** Create/update `docs/codebase-summary.md` only ### Pre-generation Ensure target directory exists: `mkdir -p docs/` ### docs-manager Prompt Template Include ALL of the following in the agent prompt: 1. **Merged scout reports** (summarized if >100K est. tokens) 2. **Doc reading results** (from Phase 3 Explore agents — Update mode only) 3. **Git-diff hints** (from Phase 1 — Update mode only) 4. **Project type + tech stack** (from Phase 2) 5. **Monorepo structure** (if detected in Phase 1) 6. **File list:** Explicit list of all docs to create/update 7. **Constraint:** Each doc file must stay under `{docs.maxLoc}` lines (default: 800) 8. **Constraint:** README must stay under 300 lines 9. **Instruction (Init):** "Adapt doc content to the detected project type. Do not generate generic boilerplate." 10. **Instruction (Update):** "Preserve the user's custom doc structure and content. Update information, don't reorganize." 11. **Instruction (Mermaid):** "Include Mermaid diagrams in `system-architecture.md` — at minimum: component relationship diagram, data flow diagram, and service dependency graph. Use ```mermaid code blocks. For API projects, add request flow diagrams. For frontends, add component hierarchy." 12. **Instruction (Dependencies):** "In `codebase-summary.md`, include a **Key Dependencies** section listing the top 10-15 dependencies with: package name, version, purpose (one line), and whether it's a runtime or dev dependency. Parse from package.json/requirements.txt/Cargo.toml." 13. **Instruction (Cross-references):** "Add 'See also' links between related docs. Example: system-architecture.md should link to api-reference.md for endpoint details, code-standards.md should link to testing-guide.md for test patterns. Use relative markdown links: `[API Reference](api-reference.md)`." 14. **Instruction (Format):** If `--format` flag is set, output in the specified format instead of Markdown. Currently supported: `markdown` (default). Planned: `confluence`, `rst`, `html`. ### Additional Requests Passthrough ``` $ARGUMENTS (with flags stripped) ``` Output: `✓ Phase 4: Generated — [N] docs created/updated` ## Phase 5: Validate — Mechanical Verification ### Post-generation Inventory 1. List files: `ls docs/*.md 2>/dev/null` 2. Compare against expected files (from Phase 3 mapping) 3. Flag: missing expected files, unexpected new files (informational) ### Script Validation 1. Check script exists: `[ -f "$HOME/.claude/scripts/validate-docs.cjs" ]` 2. If exists: run `node $HOME/.claude/scripts/validate-docs.cjs docs/` 3. Checks performed: code references exist, internal links resolve, config keys are real, markdown syntax valid 4. Display validation report (warnings listed) 5. If script missing: skip with note "Validation script not found — skipping script validation" ### Size Check 1. `wc -l docs/*.md README.md 2>/dev/null | sort -rn` 2. Use `docs.maxLoc` from session context (default: 800) 3. Flag files exceeding limit with delta (e.g., "system-architecture.md: 923 lines, 123 over limit") ### Calculate Metric ``` validation_score = (docs_passing_all_checks / total_docs) × 100 ``` **Decision:** - 100% → Skip Phase 6, proceed to Phase 7 - <100% → Proceed to Phase 6 (fix loop) - `--no-fix` flag set → Accept current state, proceed to Phase 7 ### Check Mode: Health Report (then STOP) If mode is `check`, output health report and stop: ``` === Documentation Health Report === Status: [Healthy | Needs attention | Stale] Files: [N] docs found, [M] total LOC Staleness: [Fresh (<7d) | Stale (7-30d) | Very stale (>30d)] — [X] days behind code | File | LOC | Last Modified | Over Limit? | Valid? | |------|-----|--------------|-------------|--------| | ... | ... | ... | ... | ... | Validation: [N] warnings [list warnings if any] Coverage: [list present vs missing standard doc types] Recommendation: [action to take] ``` **STOP after check report.** Do not proceed to Phase 6-8. Output: `✓ Phase 5: Validated — [N]% pass rate, [M] warnings` ## Phase 6: Fix — Validation-Fix Loop (AUTORESEARCH CORE) **Only entered if `validation_score < 100%` AND `--no-fix` is NOT set.** This is the core autoresearch iteration pattern applied to documentation. ### Fix Loop ``` FIX_ITERATION = 0 MAX_FIX_ITERATIONS = 3 LOOP: 1. Collect validation failures: (file, issue_type, severity, details) 2. Re-spawn docs-manager with: - Original generation context (from Phase 4) - Validation report with SPECIFIC issues to fix - Instruction: "Fix ONLY the flagged issues below. Do not rewrite entire documents." 3. Re-run Phase 5 validation checks 4. FIX_ITERATION += 1 5. DECIDE: - validation_score = 100% → KEEP, proceed to Phase 7 - validation_score improved AND FIX_ITERATION < MAX → RETRY (loop) - validation_score NOT improved OR FIX_ITERATION >= MAX → ACCEPT with warnings, proceed to Phase 7 6. Log fix attempt to results ``` ### Fix Strategies by Issue Type | Issue | Fix Strategy | |-------|-------------| | Broken code reference | Grep codebase for correct path/name, update ref | | Broken internal link | Check docs/ for correct filename, fix link | | Invalid config key | Search project config files, correct key name | | Oversized file | Split into focused sub-docs or trim redundant sections | | Missing required section | Generate section from scout context | Output: `✓ Phase 6: Fixed — [N] issues resolved in [M] iterations` or `⚠ Phase 6: [N] warnings remaining after 3 attempts` ## Phase 7: Finalize — Inventory + Summary 1. **Git diff summary:** `git diff --stat docs/ README.md 2>/dev/null` 2. **Report:** - Files created (new) - Files updated (changed) - Files unchanged - Total docs count + LOC 3. **Size compliance:** List any files still over limit 4. **Summarize mode special:** If `codebase-summary.md` exceeds `maxLoc` → trim to essential sections Output: `✓ Phase 7: Finalized — [N] files ready` ## Phase 8: Log — Record Results ### Results File Append to `learn-results.tsv` in the output directory: ```tsv iteration mode docs_generated docs_updated validation_score fix_iterations learn_score duration_s 1 init 7 0 100 1 95 45 2 update 0 5 85 2 78 62 ``` ### Progress Report (every 5 iterations if bounded) ``` === Learn Progress (iteration N) === Docs generated: [X] | Docs updated: [Y] Validation score: [Z]% (target: 100%) Fix iterations used: [A]/[B] Coverage: [C]/[D] core docs present Learn score: [S] ``` ### Final Summary (on completion or iteration limit) Write `summary.md` to output directory: - Mode used, scope, depth - Baseline state → final state - Docs created/updated with one-line descriptions - Validation score trajectory - Learn score - Remaining warnings (if any) - Recommended next steps ## Flags | Flag | Purpose | Default | |------|---------|---------| | `--mode ` | Operation: init, update, check, summarize | Auto-detect from docs/ state | | `--scope ` | Limit codebase learning to specific dirs/files | Everything | | `--depth ` | Doc comprehensiveness: quick, standard, deep | standard | | `--scan` | Force fresh codebase scout (summarize mode) | false | | `--topics ` | Focus summarize on specific topics | all | | `--file ` | Selective update — target single doc file | all docs | | `--no-fix` | Skip validation-fix loop (accept first-pass) | false | | `--format ` | Output format: `markdown` (default). Planned: `confluence`, `rst`, `html` | markdown | | `--chain ` | Chain to downstream tool(s) after completion. Comma-separated for multi-chain. Spaces after commas tolerated. `--chain debug` or `--chain scenario,debug,fix` | none | ## Composite Metric ``` learn_score = (validation_score% × 0.5) + (docs_coverage% × 0.3) + (size_compliance% × 0.2) Where: validation_score = passing_docs / total_docs × 100 docs_coverage = existing_core_docs / expected_core_docs × 100 size_compliance = docs_under_limit / total_docs × 100 ``` | Score | Rating | |-------|--------| | 90-100 | Excellent — docs are comprehensive and valid | | 70-89 | Good — minor gaps or warnings | | <70 | Needs work — significant gaps or validation failures | ## What NOT to Do — Anti-Patterns | Anti-Pattern | Why Wrong | Do This Instead | |---|---|---| | Generate docs without scouting first | Produces hallucinated content disconnected from reality | Always scout → learn actual structure → then generate | | Hardcode expected doc file list | Misses user's custom docs, breaks when files renamed | Dynamic discovery: scan `docs/*.md` at runtime | | Skip validation on freshly generated docs | "New docs can't have errors" is wrong — LLMs hallucinate references | Always validate. Init and update both run Phase 5 | | Retry validation-fix loop indefinitely | Diminishing returns after 3 attempts, wastes tokens | Cap at 3 retries, accept with warnings | | Scout entire monorepo without scoping | Context overflow, massive token waste | Detect monorepo early, suggest `--scope` to user | | Generate deployment-guide.md for a library | Irrelevant docs erode trust in all generated content | Create conditional docs only when project signals detected | | Overwrite user's custom docs on update | Destroys manual work, violates trust | Discover custom docs, preserve their structure, update content only | | Run check mode then modify files | Check is strictly read-only diagnostic | Use update mode for modifications | ## Chain Conversion When `--chain` is specified, learn passes results forward after Phase 8 completes. Output includes: documentation files, scout context, validation results. #### `--chain plan` Documentation gaps or improvement areas revealed by learning — plan implementation to address them. ``` $autoresearch plan Goal: Address documentation-revealed gaps — {top gap from validation report} Context: Learn run completed, validation score: {validation_score}%, coverage: {docs_coverage}% Scope: {source files related to documentation gaps} ``` #### `--chain debug` Documentation gaps reveal potential bug areas — investigate before they surface in production. ``` $autoresearch debug Scope: {source files with undocumented or stale-doc areas} Symptom: Documentation gaps indicate untested or undocumented behavior in {area} Context: Learn validation flagged: {validation_warnings} ``` #### `--chain scenario` Architecture knowledge from learning → explore edge cases in the documented system. ``` $autoresearch scenario Scenario: {key architectural pattern discovered during learn} — explore edge cases Domain: software Depth: standard ``` #### `--chain predict` Codebase patterns discovered during learning → predict issues before they emerge. ``` $autoresearch predict Scope: {scope from learn run} Goal: Predict issues based on patterns discovered during documentation: {top patterns} Depth: standard ``` #### `--chain security` Architecture knowledge from learning → audit security implications of documented patterns. ``` $autoresearch security Scope: {scope from learn run} Focus: Security audit informed by documentation: {auth, data handling, and API patterns documented} ``` #### `--chain fix` Documentation validation failures point to real issues — fix them directly. ``` $autoresearch fix Target: {top validation failure description} Scope: {files flagged in validation report} Context: Learn validation identified: {specific broken references or invalid links} ``` #### `--chain reason` Complex patterns discovered in documentation → adversarial refinement of improvement approach. ``` $autoresearch reason Task: Reason about best approach to address: {top documentation finding} Domain: software Context: Learn run completed with validation score {validation_score}% ``` #### `--chain ship` Documentation complete and validated → ship docs as a PR or publish them. ``` $autoresearch ship Type: code-pr Target: docs/ Context: Learn run produced {N} docs, validation score: {validation_score}% ``` #### `--chain probe` Knowledge gaps surfaced during learning → interrogate requirements before the next implementation cycle. ``` $autoresearch probe Topic: Requirements and constraints behind: {top undocumented or ambiguous area} Context: Learn discovered gaps in: {areas from validation report} ``` ### Multi-Chain Execution `--chain plan,scenario,fix` executes sequentially: 1. Write `summary.md` after Phase 8 completes 2. Launch first chain target with learn results as context 3. Each stage's output feeds the next via handoff 4. All targets receive: mode used, validation score, docs created/updated, scout context **Empirical evidence rule:** Downstream loop results ALWAYS override upstream findings. If a fix or debug loop disproves a documentation claim, log: `Learn finding [X] REVISED by empirical [tool] loop — [evidence]`. Do NOT revert to pre-loop documentation. ## Output Directory ``` learn/{YYMMDD}-{HHMM}-{slug}/ ├── learn-results.tsv # iteration log (tsv) ├── summary.md # executive summary ├── validation-report.md # last validation output └── scout-context.md # merged scout reports (reference) ``` **Generated/updated docs go to `docs/` directly** — not the learn/ output folder. **learn/ is the audit trail** — records what was learned, validated, and fixed. ## Chaining Patterns ```bash # Learn codebase, then security audit $autoresearch learn --mode init $autoresearch security # Learn changes, then predict issues $autoresearch learn --mode update $autoresearch predict --scope src/** # Check health, update if stale $autoresearch learn --mode check # If report says "Stale" → $autoresearch learn --mode update # Learn then ship docs as PR $autoresearch learn --mode update $autoresearch ship --type code-pr # Full quality pipeline $autoresearch learn --mode init $autoresearch scenario --domain software $autoresearch security $autoresearch ship ```