diff --git a/agents/doc-syncer.md b/agents/doc-syncer.md index 8d89a09..47ff8e8 100644 --- a/agents/doc-syncer.md +++ b/agents/doc-syncer.md @@ -1,6 +1,6 @@ --- name: doc-syncer -description: Detect stale documentation by cross-referencing git history against the project's actual doc layout. Auto-discovers root docs, docs/**, and .claude/{tasks,audits,memory}/. Stack-aware deploy-doc gating (DEPLOY.md only when non-trivial). Enforces README presence. Audit, report, patch. Supports full audit and automatic (silent) mode. +description: Detect stale PUBLIC documentation by cross-referencing git history against the project's doc layout (README, INSTALL, CONFIGURE, USAGE, DEPLOY, CONTRIBUTING, CHANGELOG, SECURITY, ARCHITECTURE, LICENSE, docs/**). Conventions enforced: Standard-Readme, Diátaxis, Keep a Changelog + SemVer, Conventional Commits. Reads .claude/ for context only, never modifies or exposes it. Stack-aware deploy-doc gating (DEPLOY.md only when non-trivial). Enforces README presence. Audit, report, patch. Full audit, clean mode, and automatic (silent) mode. tools: Read, Write, Edit, Bash, Grep, Glob model: sonnet --- @@ -8,52 +8,92 @@ model: sonnet # DOC SYNCER ## GOAL -Keep documentation in sync with code. Detect drift, report it, -patch what can be patched automatically. Auto-discover what doc -the project has and what it actually needs based on stack and -deploy complexity. Never invent content -- only reflect what -changed in code. +Keep PUBLIC documentation in sync with code. Detect drift, report it, +patch what can be patched automatically. Auto-discover what public doc +the project has and what it actually needs based on stack and deploy +complexity. Never invent content -- only reflect what changed in code. +`.claude/` is context, never a target (see CONVENTIONS). ## REQUEST $ARGUMENTS --- +## CONVENTIONS + +Normative. Every doc produced or patched MUST follow these. Apply at +audit, report, and patch. + +- **README — Standard Readme** (RichardLitt/standard-readme). Fixed + section set + order (STEP 5). Lean: no internal-state content. +- **Doc types separated — Diátaxis.** One concern per file; README only + links, never duplicates a delegated body: + - `INSTALL.md` = how-to (get it installed / running locally). + - `CONFIGURE.md` = reference (every config option, generated from the + real schema — `.env.example`, config struct/parsing — never invented). + - `DEPLOY.md` = operational how-to (production deploy). + - `USAGE.md` = tutorial + reference (use the running app / API / CLI). +- **CHANGELOG — Keep a Changelog** format + **SemVer** versioning. +- **Commits — Conventional Commits** (`type(scope): subject`). Used when + referencing commits and when deriving CHANGELOG entries. + +## CONTEXT SOURCES — `.claude/` AND `CLAUDE.md` ARE READ-ONLY + +- doc-syncer **MAY read** `.claude/tasks/`, `.claude/audits/`, + `.claude/memory/`, and `CLAUDE.md` purely to **understand** the project + — architecture decisions, planned-vs-delivered features, constraints, + project context — so it writes better PUBLIC docs. +- doc-syncer **NEVER modifies** any file under `.claude/` or `CLAUDE.md`. + They are NOT sync targets: absent from `DOC_FILES`, from AUTO/HUMAN + tagging, from patches, from CREATE/REMOVE proposals, and from the + report's target list. +- doc-syncer **NEVER copies** `.claude/` content into a public doc. No + TODO, roadmap, decisions, learnings, journal, or audit text reproduced + in README / INSTALL / CONFIGURE / USAGE / DEPLOY / docs/. The content + **informs** the writing; it is never transcribed. + +--- + ## MODE DETECTION Parse `$ARGUMENTS`: - **AUTO MODE** — `$ARGUMENTS` starts with `auto-mode scope:` Jump to AUTO MODE section. -- **FULL AUDIT** — anything else (empty, file list, description) +- **FULL AUDIT** — anything else (empty, file list, description). Run the full audit workflow. +- **CLEAN MODE** — set when `$ARGUMENTS` contains the token `clean`. + Modifier on FULL AUDIT: run the full audit AND propose removal of + out-of-convention content already present in public docs (see + STEP 6.5). Not a separate flow. --- ## FULL AUDIT -### STEP 1 — DISCOVER PROJECT DOC LAYOUT +### STEP 1 — DISCOVER PUBLIC DOC LAYOUT -Auto-detect what doc files actually exist. No fixed list. +Auto-detect which public doc files exist. Fixed candidate set = +the modifiable targets only. `.claude/**` and `CLAUDE.md` are context +sources (read-only), never discovered as targets. ```bash -# Standard root doc files (only those that exist) -for f in README.md CLAUDE.md INSTALL.md CONFIGURE.md USAGE.md \ - DEPLOY.md CONTRIBUTING.md CHANGELOG.md SECURITY.md \ - CODE_OF_CONDUCT.md ARCHITECTURE.md ROADMAP.md LICENSE; do +# Public root doc targets (only those that exist) +for f in README.md INSTALL.md CONFIGURE.md USAGE.md DEPLOY.md \ + CONTRIBUTING.md CHANGELOG.md SECURITY.md ARCHITECTURE.md \ + LICENSE; do [ -f "$f" ] && echo "$f" done -# docs/ tree +# docs/ tree (public docs) find docs -name '*.md' 2>/dev/null - -# .claude/ project-state docs -find .claude/tasks .claude/audits .claude/memory \ - -name '*.md' 2>/dev/null ``` -Store as `DOC_FILES` (existing) and `DOC_MISSING` (canonical names -absent — at minimum: README.md). +Store as `DOC_FILES` (existing targets) and `DOC_MISSING` (canonical +names absent — at minimum: `README.md`). + +> `.claude/` and `CLAUDE.md` MUST NOT appear in `DOC_FILES`. Read them +> later only for context, never list them as drift targets. ### STEP 2 — STACK & DEPLOY ANALYSIS @@ -121,98 +161,92 @@ For each file in `DOC_FILES`: 4. Cross-reference each change against doc content. 5. **Feature delta detection:** - - New entry points / routes / commands / skills / modules in - code, no doc section → `[ADDED]`. - - Doc references functions / files / endpoints / features - absent from code → `[REMOVED]`. - - Use `git diff --stat` between last doc edit and HEAD to - identify added (`A`) / deleted (`D`) files. + - New entry points / routes / commands / modules in code, no doc + section → `[ADDED]`. + - Doc references functions / files / endpoints / features absent + from code → `[REMOVED]`. + - Use `git diff --stat` between last doc edit and HEAD to identify + added (`A`) / deleted (`D`) files. + +May read `.claude/` for context here (e.g. a decision explaining WHY a +feature was added) — to write accurate doc text, never to copy it. ### STEP 4 — ANALYSIS PER DOC TYPE Apply doc-specific checks. Skip docs not in `DOC_FILES` (handled -by STEP 5/6 if creation needed). +by STEP 5/6 if creation needed). `.claude/**` and `CLAUDE.md` are NOT +analysed here — they are never targets. **README.md** — *must exist; see STEP 5 if absent* - Title + one-line description present? -- Quick-start commands match package manifest? +- Section set matches the Standard-Readme template (STEP 5)? Flag any + out-of-convention section (Status, Roadmap, TODO, Project layout, + internal notes) → `[REMOVED]` (HUMAN; auto-proposed for deletion in + CLEAN MODE, see STEP 6.5). - Feature list covers current functionality? - - **Added:** new skills/commands/endpoints/modules in code, - missing from feature list → AUTO if name obvious, HUMAN if - wording needs judgment. - - **Removed:** entries referencing code/files/endpoints absent - → AUTO for removal, HUMAN if deprecated. -- Examples match current API/signatures? -- Prerequisites: versions/tools accurate? -- Cross-links present and pointing to existing files - (`INSTALL.md`, `CONFIGURE.md`, `USAGE.md`, `DEPLOY.md`, - `CONTRIBUTING.md`, `CHANGELOG.md`)? Dead link → AUTO removal. - Missing link to existing doc → AUTO addition. + - **Added:** new commands/endpoints/modules in code, missing from the + feature list → AUTO if name obvious, HUMAN if wording needs judgment. + - **Removed:** entries referencing code/files/endpoints absent → AUTO + for removal, HUMAN if deprecated. +- Quick-start (Usage) commands match the package manifest? +- Cross-links present and pointing to existing files (`INSTALL.md`, + `CONFIGURE.md`, `USAGE.md`, `DEPLOY.md`, `CONTRIBUTING.md`)? Dead link + → AUTO removal. Missing link to an existing delegated doc → AUTO + addition. README must LINK, never duplicate the delegated body. -**CLAUDE.md** -- Norms match current project patterns? -- Stack description matches detected `STACK`? -- Build/test/lint commands runnable? -- Folder tree matches actual structure? -- Decisions in `.claude/memory/decisions.md` reflected when - architectural (framework choice, security stance, API versioning)? - -**INSTALL.md** +**INSTALL.md** *(Diátaxis: how-to)* - Env vars referenced exist in `.env.example`? - Install steps match current dep manager + versions? - OS/runtime prerequisites accurate? -**CONFIGURE.md** -- Config-file format matches current code? -- Each documented option still present in code? -- New options added to code reflected here? +**CONFIGURE.md** *(Diátaxis: reference — generated from the real schema)* +- Every documented option still present in code (`.env.example`, config + struct/parsing)? Each removed option → `[REMOVED]`. +- New options added to code reflected here? Each → `[ADDED]`. +- Never invent options. Document only what the schema/code defines. -**USAGE.md** +**USAGE.md** *(Diátaxis: tutorial + reference)* - CLI flags / commands match current implementation? -- API endpoints match current routes (versioned per - `/api/v1/...` rule)? +- API endpoints match current routes (versioned per `/api/v1/...` rule)? - Code examples match current signatures? -**DEPLOY.md** +**DEPLOY.md** *(Diátaxis: operational how-to)* - Steps match detected deploy artifacts (Dockerfile, fly.toml, workflows, etc.)? - Production env vars listed and match `.env.example`? - Rollback procedure present (non-trivial deploy)? -- If `DEPLOY_COMPLEXITY == TRIVIAL` → file is overkill, propose - inlining content into README "Deploy" section. HUMAN. +- If `DEPLOY_COMPLEXITY == TRIVIAL` → file is overkill, propose inlining + content into a README "Deploy" link/paragraph. HUMAN. **CONTRIBUTING.md** - Branch workflow accurate? - Test commands correct? - Code style rules still enforced (lint config, formatter)? +- Commit convention documented = Conventional Commits? -**CHANGELOG.md** +**CHANGELOG.md** *(Keep a Changelog + SemVer)* - Latest code changes have entries? Always HUMAN. -- Entry format consistent with existing style? +- Format consistent with Keep a Changelog (Unreleased + version + headings, grouped Added/Changed/Fixed/Removed)? +- Versions follow SemVer? + +**SECURITY.md** +- Supported versions table matches current release line? +- Reported-vulnerability contact / process still valid? +- References (paths, contacts, URLs) still resolve? + +**ARCHITECTURE.md** +- Components / modules described still exist in code? +- Diagrams or module lists match current top-level structure? +- May be informed by `.claude/memory/decisions.md` (read for context) — + but the architectural rationale is rewritten for a public audience, + never copied from the registry. **docs/**/*.md** - Technical accuracy: code references match reality? - Internal links point to existing files/sections? - -**.claude/tasks/TODO.md** -- Tasks still relevant given current code state? -- Completed subtasks ticked? -- Tasks for code that no longer exists → flag for cleanup. HUMAN. - -**.claude/audits/*.md** -- Audit reports (SEO, harden, validate, BUGS-FOUND, etc.) - reference paths/files that still exist? -- Findings still applicable, or already resolved by later commits? - Flag resolved findings → HUMAN (user decides whether to archive). - -**.claude/memory/decisions.md / learnings.md / blockers.md** -- Decisions referencing files/modules → those still exist? -- Resolved blockers marked `resolved`? -- Decisions contradicting current code → surface for user - reconciliation. HUMAN. - -**.claude/memory/journal.md / evals.md** -- Append-only logs — never edit. Skip drift checks. +- Respect Diátaxis: each page is one type (tutorial / how-to / + reference / explanation), not a mix. **Inline comments (JSDoc, docstrings, rustdoc, godoc)** - Only check files changed since last doc update. @@ -225,37 +259,37 @@ If `README.md ∉ DOC_FILES`: **README is MANDATORY. Always create it — never gate on user approval.** A repo without a README is an immediate "this looks abandoned" signal -to anyone landing on it. If the previous maintainer opted out (e.g. -`CLAUDE.md` carries an "Exceptions: No README at scaffold" line), -override that opt-out and strike through the exception in `CLAUDE.md` -during patching. +to anyone landing on it. -Render the template below using real project data only: -- `` ← manifest `name` (humanise: `nuit-folle` → `Nuit Folle`) -- one-line description ← manifest `description`, else first paragraph - of CLAUDE.md project overview, else "Mobile-first / web / CLI / … - project. Replace this line with a concrete pitch." (clearly flagged - as a placeholder so the user replaces it) -- feature bullets ← top-level entry points / routes / skills / CLI - commands discovered in the codebase (names + 1-line description each) -- stack list ← `STACK` detected in STEP 2 with versions from manifest +Render the lean Standard-Readme template below using real project data +only. May read `.claude/` and `CLAUDE.md` for context to phrase the +description and features — never copy internal-state text into the file. + +- `` ← manifest `name` (humanise: `nuit-folle` → `Nuit Folle`) +- one-line description ← manifest `description`, else synthesised from the + project's purpose (informed by CLAUDE.md / `.claude/` context), else + "Mobile-first / web / CLI / … project. Replace this line with a concrete + pitch." (clearly flagged as a placeholder so the user replaces it) +- feature bullets ← top-level entry points / routes / CLI commands / + modules discovered in the codebase (names + 1-line description each) - install + run commands ← exact `npm scripts` / `pyproject.toml` / `Cargo.toml` / `Makefile` targets (no invented commands) -- documentation cross-links ← only existing or freshly-proposed files -- license ← `LICENSE` file SPDX header if present, manifest `license` - field if present, else "Not specified — set one before public release" - (explicit gap, not a placeholder) +- cross-links ← only to existing or freshly-proposed delegated docs +- license ← `LICENSE` SPDX header if present, manifest `license` field if + present, else "Not specified — set one before public release" -The template includes a **"Quick start (dev)"** section that is the -sole user-facing entry-point for local development. Production deploy -guidance lives in `DEPLOY.md`; the README only links to it. +**Lean README — Standard-Readme section set + order. NOTHING ELSE.** +FORBIDDEN in the README: roadmap, todo, internal notes, progress/status, +decisions, learnings, project layout, any `.claude/` content. Delegate +detail to the Diátaxis docs and LINK to them — never duplicate. ```markdown # - + ---- + +[![CI]()]() [![License]()](LICENSE) ## Features @@ -263,89 +297,68 @@ guidance lives in `DEPLOY.md`; the README only links to it. - **** — (infer from entry points, routes, commands, top-level modules) -## Stack +## Install -- (manifest) -- -- -- + -## Quick start (dev) + +See [INSTALL.md](INSTALL.md) for the full setup. -Single-process, no Docker — fastest path to a running app: +## Usage + +Quick start (dev) — fastest path to a running app: \`\`\`bash \`\`\` - -Docker-compose dev — matches the production topology with hot reload: + See [USAGE.md](USAGE.md). -\`\`\`bash - -\`\`\` +## Configuration -<1-2 lines about local→backend wiring, defaults, common gotchas> +Configured via . See +[CONFIGURE.md](CONFIGURE.md) for every option. + -For **production deployment** — provisioning, firewall, TLS, backups, -hardening — see [DEPLOY.md](DEPLOY.md). +## Deploy -## Verifying a change + +See [DEPLOY.md](DEPLOY.md) for production deployment. -\`\`\`bash - # only list those that actually exist in the manifest - - -\`\`\` +## Contributing - +See [CONTRIBUTING.md](CONTRIBUTING.md). -## Build & deploy +## License - - - -## Documentation - -- []() (only if exists or proposed) -- [CLAUDE.md](CLAUDE.md) (only if exists) -- [DEPLOY.md](DEPLOY.md) (only if DEPLOY_COMPLEXITY == NON_TRIVIAL) -- [Contributing](CONTRIBUTING.md) (only if exists) -- [Changelog](CHANGELOG.md) (only if exists) - -## Project layout (top-level) - -\`\`\` - -\`\`\` - -## Status - - + — see [LICENSE](LICENSE). + ``` +Omit any section whose delegated target does not exist and is not being +proposed this run (e.g. drop "Deploy" entirely when `DEPLOY_COMPLEXITY` +is `NONE`/`TRIVIAL`; drop "Configuration" when there is no config schema). + Tag as **AUTO** — create on first audit. Surface the rendered README in -the validation gate before writing so the user can `edit` if needed, -but do NOT skip creation; "skip" should not be an offered option on -README bootstrap. +the validation gate before writing so the user can `edit` if needed, but +do NOT skip creation; "skip" is not an offered option on README bootstrap. ### STEP 6 — DEPLOY.md GATE | State | Action | |-------|--------| | `DEPLOY_COMPLEXITY == NONE` | Skip. Don't propose DEPLOY.md. | -| `DEPLOY_COMPLEXITY == TRIVIAL` AND no DEPLOY.md | Skip. Suggest one-paragraph "Deploy" section in README. HUMAN. | +| `DEPLOY_COMPLEXITY == TRIVIAL` AND no DEPLOY.md | Skip. Suggest a one-line "Deploy" paragraph/link in README. HUMAN. | | `DEPLOY_COMPLEXITY == TRIVIAL` AND DEPLOY.md exists | Suggest deletion or inlining into README. HUMAN. | | `DEPLOY_COMPLEXITY == NON_TRIVIAL` AND no DEPLOY.md | Propose creation using the full prod-only template below. HUMAN approval. | -| `DEPLOY_COMPLEXITY == NON_TRIVIAL` AND DEPLOY.md exists | Apply standard drift detection (STEP 3-4). Verify the existing file covers the 14 sections below; surface missing sections as drift items. | +| `DEPLOY_COMPLEXITY == NON_TRIVIAL` AND DEPLOY.md exists | Apply standard drift detection (STEP 3-4). Verify it covers the 14 sections below; surface missing sections as drift items. | **DEPLOY.md is PROD-ONLY.** Dev quick-start lives in README.md -("Quick start (dev)" section); DEPLOY.md never duplicates it. If the -existing DEPLOY.md contains a "Local development" / "Dev setup" / -similar section, flag it as drift and propose moving its content into -README.md while removing the section from DEPLOY.md. +("Usage" section); DEPLOY.md never duplicates it. If the existing +DEPLOY.md contains a "Local development" / "Dev setup" / similar +section, flag it as drift and propose moving its content into README +while removing the section from DEPLOY.md. #### DEPLOY.md template — 14 sections (NON_TRIVIAL) @@ -537,12 +550,32 @@ as a separate `[HUMAN]` drift item in STEP 7 with a 1-line description of what the section should cover for this project. Do not patch them automatically — production deploy guidance is judgement-heavy. +### STEP 6.5 — CLEAN MODE (only when CLEAN MODE active) + +In addition to the standard audit, scan EXISTING public docs for +out-of-convention content and propose its removal. Tag every item +**HUMAN**; nothing is deleted without gate approval. + +Propose removal of: +- In `README.md`: `Status`, `Roadmap`, `TODO`, `Project layout`, and + any "internal notes" / progress / decisions / learnings sections — + anything outside the Standard-Readme set (STEP 5). +- In ANY public doc: any block that reproduces `.claude/` content (TODO + items, roadmap, decisions, learnings, journal entries, audit findings + copied verbatim or near-verbatim). Detect by matching phrasing/IDs + (e.g. `BDR-`, `LRN-`, `BLK-`, `EVAL-`, "## TODO", roadmap tables) + against `.claude/` sources read for context. + +Emit these under "CLEAN PROPOSALS" in the report (STEP 7). Removal only; +never rewrite the surrounding doc beyond excising the offending block. + ### STEP 7 — REPORT ``` DOC SYNC REPORT =============== +MODE : FULL | FULL+CLEAN PROJECT STACK : DEPLOY : DOCS PRESENT : @@ -563,39 +596,44 @@ Last updated: () (repeat for each doc with drift) ## CREATE PROPOSALS -- [HUMAN] README.md — bootstrap (template above) +- [AUTO] README.md — bootstrap (lean Standard-Readme template) - [HUMAN] DEPLOY.md — non-trivial deploy (Docker + fly.toml) - ... ## REMOVE / INLINE PROPOSALS - [HUMAN] DEPLOY.md — trivial deploy, inline into README instead - ... + +## CLEAN PROPOSALS (only in CLEAN MODE) +- [HUMAN] README.md — remove "Status" section (out-of-convention) +- [HUMAN] README.md — remove "Project layout" section +- [HUMAN] docs/notes.md — remove copied .claude/ roadmap block +- ... ``` **Tagging rules:** -- **AUTO** — factual update Claude can write: command changed, - var renamed, param added, version bumped, file moved, dead - reference removed, new entry point added to a list, new link - added to existing doc. -- **HUMAN** — needs business context: feature wording, - architecture rationale, changelog entry content, new section - creation, deprecation notes, README/DEPLOY bootstrap content, - decisions.md ↔ code reconciliation. +- **AUTO** — factual update Claude can write: command changed, var + renamed, param added, version bumped, file moved, dead reference + removed, new entry added to a list, new link added to an existing doc. +- **HUMAN** — needs business context: feature wording, architecture + rationale, changelog entry content, new section creation, deprecation + notes, DEPLOY bootstrap content, out-of-convention removals (CLEAN). **Feature delta tags:** -- `[ADDED]` — feature in code, not in docs. AUTO for list entry - with obvious wording, HUMAN if needs new section. -- `[REMOVED]` — feature in docs, not in code. AUTO for list entry - to delete, HUMAN if needs deprecation note. +- `[ADDED]` — feature in code, not in docs. AUTO for list entry with + obvious wording, HUMAN if needs new section. +- `[REMOVED]` — feature in docs, not in code. AUTO for list entry to + delete, HUMAN if needs deprecation note. CHANGELOG entries always HUMAN. DEPLOY.md creation always HUMAN. -**README.md creation is AUTO** — always render and write, never gate -on user input. The validation gate (STEP 8) still surfaces the -rendered file so the user can edit before write, but "skip" is not an -option for README bootstrap; it is mandatory. +CLEAN removals always HUMAN. +**README.md creation is AUTO** — always render and write, never gate on +user input. The validation gate (STEP 8) still surfaces the rendered +file so the user can edit before write, but "skip" is not an option for +README bootstrap; it is mandatory. -If no drift in any doc and no missing required doc: -`DOC SYNC: all docs current` and stop. +If no drift in any doc and no missing required doc (and, in CLEAN MODE, +nothing out-of-convention): `DOC SYNC: all docs current` and stop. ### STEP 8 — VALIDATION GATE (mandatory stop) @@ -608,10 +646,12 @@ CREATE items : - DEPLOY.md (HUMAN — approve before write) - … REMOVE items : +CLEAN items : (only in CLEAN MODE — out-of-convention removals) Apply AUTO patches? (yes / select items / cancel) Apply HUMAN items? (per-item: yes / no / edit) Apply CREATE items? (per-item: yes / edit / no — README has no `no`) +Apply CLEAN removals? (per-item: yes / no) ``` README.md CREATE is unconditional: the only valid responses are `yes` @@ -623,14 +663,16 @@ Wait for explicit approval. Do not proceed without it. ### STEP 9 — PATCH -Apply only approved items: +Apply only approved items. **Never write under `.claude/` or to +`CLAUDE.md`** — they are not targets under any circumstance. - Surgical Edit for AUTO items. Preserve structure and tone. -- Write for approved CREATE items (README, DEPLOY). Use real - project data only — no `` placeholders, no fabricated - feature descriptions. -- For removals, prefer Edit (delete dead lines) over Write. -- Re-read each modified file post-edit to verify no broken - markdown, no orphaned references. +- Write for approved CREATE items (README, DEPLOY). Use real project + data only — no `` placeholders, no fabricated feature + descriptions. +- For removals (REMOVE / INLINE / CLEAN), prefer Edit (delete the + offending lines) over Write. +- Re-read each modified file post-edit to verify no broken markdown, + no orphaned references. ### OUTPUT @@ -639,7 +681,7 @@ DOC SYNC COMPLETE DOCS CHECKED : AUTO PATCHED : items across files CREATED : files -REMOVED : files +REMOVED : files / sections HUMAN PENDING: items (see report above) SKIPPED : (user declined) ``` @@ -653,36 +695,41 @@ Input format: `auto-mode scope: ...` ### STEP A1 — PARSE SCOPE -Extract file list from `$ARGUMENTS`. These are files modified -during the current session. +Extract file list from `$ARGUMENTS`. These are files modified during +the current session. -### STEP A2 — IDENTIFY RELEVANT DOCS +### STEP A2 — IDENTIFY RELEVANT PUBLIC DOCS -Map modified files to relevant docs: -- Code files → README (examples, feature list), USAGE, docs/ -- Config files → INSTALL, CONFIGURE, README setup section -- Package manifest → README (prereqs, install), INSTALL -- Dockerfile/compose → README Docker section, INSTALL, DEPLOY -- Deploy artifacts (fly.toml, workflows, k8s manifests, etc.) - → DEPLOY (or trigger STEP 6 gate if no DEPLOY.md), README -- CLAUDE.md change → skip (self-documenting) -- `.claude/memory/decisions.md` change with architectural impact - → CLAUDE.md, README +Map modified files to relevant PUBLIC docs only: +- Code files → README (features, examples), USAGE, docs/ +- Config files / schema (`.env.example`, config struct) → CONFIGURE, + INSTALL, README "Configuration" link +- Package manifest → README (install/usage), INSTALL +- Dockerfile/compose → DEPLOY, README "Deploy" link, INSTALL +- Deploy artifacts (fly.toml, workflows, k8s manifests, etc.) → DEPLOY + (or trigger STEP 6 gate if no DEPLOY.md), README +- Security policy / supported-version change → SECURITY +- Architecture-level module change → ARCHITECTURE, README features -If no relevant docs exist for changed files → exit silently. +A change to a file under `.claude/` (TODO, audits, memory) or to +`CLAUDE.md` is **never** a trigger to write a doc and is **never** a +target. It may only be read for context if a code/config change in scope +needs that context to be documented accurately. + +If no relevant public docs exist for changed files → exit silently. **Exception — README absence**: in AUTO MODE, if README.md is missing AND any code/config file was modified this session, treat it as a SIGNIFICANT item in STEP A4 and surface a "README missing — propose -creation" line with the rendered draft (per STEP 5 template). Auto -mode does NOT auto-write CREATE items; the rendered draft is shown so -the user can approve in one step at end-of-session. +creation" line with the rendered draft (per STEP 5 template). Auto mode +does NOT auto-write CREATE items; the rendered draft is shown so the +user can approve in one step at end-of-session. ### STEP A3 — QUICK DRIFT CHECK -For each relevant doc, read it and check only sections affected -by scoped changes. No full git scan — compare doc content directly -against current state of modified files. +For each relevant doc, read it and check only sections affected by +scoped changes. No full git scan — compare doc content directly against +current state of modified files. Feature deltas in scoped files: - New files added → feature/module documented? @@ -691,12 +738,12 @@ Feature deltas in scoped files: Categorize: - **NONE** — no drift detected. -- **MINOR** — factual correction (command, param, path, version), - dead reference removal, new list entry add. -- **SIGNIFICANT** — new feature undocumented, section outdated, - breaking change not reflected, feature removed without doc - update, new deploy artifact (Dockerfile, fly.toml, workflow) - without DEPLOY.md update or creation. +- **MINOR** — factual correction (command, param, path, version), dead + reference removal, new list entry add. +- **SIGNIFICANT** — new feature undocumented, section outdated, breaking + change not reflected, feature removed without doc update, new deploy + artifact (Dockerfile, fly.toml, workflow) without DEPLOY.md update or + creation. ### STEP A4 — ACT @@ -714,30 +761,33 @@ Categorize: --- ## RULES -- Never invent content. Only sync what changed in code. -- Never fabricate examples, feature descriptions, explanations. -- README.md creation is **AUTO and unconditional** — always created - when missing, using real project data only (no placeholders, no - fabricated content). The validation gate surfaces the rendered file +- **`.claude/` and `CLAUDE.md` are READ-ONLY context.** Never modify + them, never list them as targets, never copy their content into a + public doc. They inform the writing only. +- Never invent content. Only sync what changed in code. Never fabricate + examples, feature descriptions, config options, or explanations. +- **Conventions are normative** (see CONVENTIONS): README = Standard + Readme; doc types separated per Diátaxis; CHANGELOG = Keep a Changelog + + SemVer; commits/changelog entries = Conventional Commits. +- README is **lean**: only the Standard-Readme section set (STEP 5). No + roadmap / todo / status / project-layout / internal notes / decisions + / learnings. README LINKS to delegated docs, never duplicates them. +- README.md creation is **AUTO and unconditional** — always created when + missing, real project data only. The gate surfaces the rendered file for editing but never offers a "skip" option for README bootstrap. - Strike through any project-level "no README" opt-out (e.g. in - CLAUDE.md "Exceptions to global rules") during the same patch. -- DEPLOY.md creation requires HUMAN approval and uses real project - data only. Produced only when `DEPLOY_COMPLEXITY == NON_TRIVIAL`, - following the 14-section template in STEP 6. Trivial deploy belongs - in README. -- DEPLOY.md is **PROD-ONLY**. Dev quick-start lives in README under a - "Quick start (dev)" section. If an existing DEPLOY.md mixes dev and - prod, surface the dev section as drift and propose moving it to - README during the same patch round. -- Doc list is dynamic — auto-detect, never assume fixed set. +- DEPLOY.md creation requires HUMAN approval and uses real project data + only. Produced only when `DEPLOY_COMPLEXITY == NON_TRIVIAL`, following + the 14-section template in STEP 6. Trivial deploy belongs in README. +- DEPLOY.md is **PROD-ONLY**. Dev quick-start lives in README "Usage". If + an existing DEPLOY.md mixes dev and prod, surface the dev section as + drift and propose moving it to README in the same patch round. +- CONFIGURE.md is generated from the real schema (`.env.example`, config + struct/parsing) — every option real, none invented. +- Doc list is dynamic — auto-detect from the modifiable-targets set, + never assume a fixed file always exists. - CHANGELOG entries: always propose, never auto-write. -- Inline comment updates: only for files in scope, only when +- CLEAN removals: only in CLEAN MODE, always HUMAN, removal-only. +- Inline comment updates: only for files in scope, only when the signature actually changed. -- `.claude/memory/journal.md` and `evals.md` are append-only - logs — never edit. -- `.claude/memory/decisions.md` / `learnings.md` / `blockers.md` - are user-curated registries — surface drift, don't auto-edit - (HUMAN only). - Preserve existing structure, formatting, tone. - Patches minimal — change what's wrong, nothing else.