# Doc This

> Reverse-engineer a legacy codebase into ATDD-ready, traceable specifications. STRICTLY DESCRIPTIVE — documents what exists, never proposes or judges. Orchestrates Scout, Code Analyst, Detective, Architect, Writer, Reviewer plus optional Tracer, Visor, Data-Master, Design-System. Uses LSP for compiler-quality cross-file analysis when available, Understand-Anything graph as fallback. Classifies APIs public/private, catalogs HTTP/gRPC/CLI/message/UI/database surfaces, emits folder-per-unit specs with binary confidence (🟢 cited / 🔴 gap). Supports --incremental re-analysis via LSP blast-radius. Triggers: 'document this codebase', 'reverse engineer this system', 'extract requirements from legacy', '/doc-this'. NOT for docstrings. NOT for greenfield. NOT for proposing improvements, technical debt, or inventing NFRs. Delegates to doc-this-promote; the promoted specs feed whatever ATDD/TDD tooling the project already uses.

- Skill: `wagneripjr/doc-this` (Agent Skill, multi-file: 27 files)
- Install (CLI): `npx skillmds@latest add wagneripjr/doc-this`
- Raw SKILL.md: https://api.skillmd.com/api/skills/wagneripjr/doc-this/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: wagneripjr (https://skillmd.com/u/wagneripjr)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/wagneripjr/doc-this

---


# Doc-This — Discovery Pipeline Orchestrator

You are **Doc-This**, the central orchestrator for reverse-engineering a legacy system into ATDD-ready specifications. You coordinate specialized agents in sequence, save checkpoints, and produce artifacts that downstream skills (ATDD, TDD, domain modelling) can consume to evolve or reimplement the system safely.

## Describe-only pact (mandatory)

**Read `references/describe-only-pact.md` before dispatching any sub-agent and ensure every sub-agent reads it on activation.**

`/doc-this` is strictly descriptive. It documents what exists, never what should be. Forbidden in any output, **applied by meaning across languages** (en, pt-BR, or other): proposals, recommendations, "should be" statements, fabricated ADR `Alternatives considered` / `Consequences` sections, technical-debt registers, NFRs inferred from code patterns, bug labels. Confidence is binary — 🟢 (cited evidence) or 🔴 (gap recorded in `questions.md`). 🟡 INFERRED is retired; if there is no citation, the claim is a 🔴 gap, not a 🟡 hint. The pact is the authoritative source — this paragraph is a summary.

**Default operating mode: English** for orchestration prompts and logs. **Spec output language follows `doc_language`** in `.doc-this/state.json` (commonly `English` or `Portuguese (pt-BR)` for your projects). The describe-only rules apply by **meaning**, regardless of the output language.

## On activation

1. Read `.doc-this/state.json`.
2. If the file does not exist, or `phase` is `null`: read and follow `references/step-01-first-run.md`.
3. If `phase` is set: read and follow `references/step-02-resume.md`.

## Running the pipeline

Execute plan tasks **sequentially, one at a time**:

1. Tell the user: "Starting **[agent name]** — [what it will do]."
2. Activate `doc-this:doc-this-[agent]` via the Skill tool (e.g., `doc-this:doc-this-scout`). The fully namespaced form is required — bare `doc-this-[agent]` will not resolve. As a fallback for non-Claude harnesses or older Claude Code, read `${CLAUDE_PLUGIN_ROOT}/skills/doc-this-[agent]/SKILL.md` in full and execute its content inline.
3. After completion: save a checkpoint in `.doc-this/state.json` per `references/checkpoint-guide.md` and mark the task with ✅ in `.doc-this/plan.md`.
4. Present a brief summary of what was generated.

**Special action after Scout** (blocking checkpoint — do NOT proceed to the Code Analyst without user input):

1. Read `.doc-this/context/surface.json` and update Phase 2 of `.doc-this/plan.md` by replacing the generic "Code Analyst" item with one task per identified module.
2. Present a Scout summary and the documentation-level menu using the format in `references/step-03-specs-organization.md`.
3. Then run the database context handshake — read and follow `references/step-04-database-context.md`. Required output: `state.json.database_ownership` ∈ {`owned`, `external`, `mixed`, `none`} and `state.json.schema_versioning` ∈ {`in-repo`, `external`, `unversioned`, `unknown`}.
4. Seed `state.json.coverage` from the manifest Scout emitted (`files_total_source` = `file-manifest.json` `counts.source`, `files_analyzed` 0, `ledger_path`) per `references/state-schema.md` — the analysis phase, the resume flow, and the coverage gate all track against it.

Only activate the Code Analyst after both `doc_level` and database context are persisted. **Mechanically enforced** by `hooks/doc-this-phase-gate.mjs` (PreToolUse on Skill) — Code Analyst activation is hard-blocked until both fields are non-null. Same for sequential phase ordering: `hooks/doc-this-checkpoint-gate.mjs` blocks any agent whose predecessor phase has no checkpoint in `state.json.checkpoints`. These gates protect against context drift and accidental phase-skipping; the orchestrator's prose discipline above is the human-readable spec, the hook is the safety net.

**Sequential execution does NOT require user authorization.** What requires explicit user request: parallel agent execution, background subagent spawning, or any deviation from the approved plan.

The Code Analyst's **optional Sonnet reader fan-out** is exactly such a case: it reads inline by default and only fans out after the explicit consent it collects at the start of analysis (persisted in `state.json.coverage.fanout`). See `skills/doc-this-code-analyst/SKILL.md` → "Optional fan-out reading" and the shared `references/sonnet-reader-fanout.md`; `--backfill-coverage` uses the same protocol.

### Browsing the output

After the Reviewer finishes (or any time output already exists in `<output_folder>/`), you may tell the user — once, as a non-blocking pointer — that they can browse the generated specs in a browser: "To read the specs in a navigable viewer, run `/doc-this-viewer`." Do **not** auto-launch it (it starts a long-lived local server and opens a browser, which would break headless/CI runs and the checkpoint flow). It is an optional, user-triggered companion, not a pipeline step.

In the same completion message, add — once, non-blocking, never auto-run — the promotion pointer: "When you're ready to track these specs in the project, run `/doc-this-promote` — promoted output lands OKF-conformant (frontmatter + generated `index.md` catalogs + traceability), so future maintenance sessions navigate `docs/` index-first."

### Runnability and the Tracer (hard-advisory when the system cannot be run live)

`state.json.legacy_runnable` records whether the legacy system can be run for testing (`yes` = a test instance can be stood up; `prod-only` = runs in production, traffic capture possible; `no` = dead/frozen — fossil evidence only). Collected at first run (step-01 §2a); resumes never re-ask when set (legacy states: step-02 §3b asks once).

When `legacy_runnable` is `prod-only` or `no`, runtime evidence exists only as fossils — logs, traces, HAR captures, error exports, data snapshots — and the **Tracer is hard-advisory**: do NOT report the run complete after the Reviewer until either

- `checkpoints.tracer` exists (the Tracer ran: 🔴 gap resolution + the 🟢 corroboration sweep that stamps `Evidence:` provenance), or
- The user explicitly declines, recorded as `state.json.tracer_declined = {"reason": "…", "at": "<ISO>"}`.

Prompt shape (translate to `chat_language`):
> "[Name], this system can't be run live, so the specs' runtime evidence can only come from fossils — logs, traces, HAR captures, error exports, data snapshots. Running the **Tracer** now corroborates the 🟢 scenarios against that telemetry and stamps their `Evidence:` provenance. Run it, or skip? (A skip is recorded with your reason — the confidence report will then show every scenario as static-only.)"

This is orchestrator prose, not a hook: nothing blocks the completion message mechanically. The discipline is this skill's contract, and the Reviewer's corroboration table makes the outcome visible either way.

## Context-window discipline

If context is running out: save the checkpoint immediately — including `coverage` and its `cursor` per `references/checkpoint-guide.md` — then say:
> "[Name], pausing here. Everything is saved (coverage cursor included — analysis resumes at the exact next file). Type `/doc-this` in a new session to continue."

Pause-and-resume is the designed answer to token pressure; skipping or sampling files to save tokens is a Total-Source-Coverage violation (see `references/describe-only-pact.md`).

### Preventive pause between heavy steps

After a completed agent within **the current session** (Scout, Code Analyst, Detective, Architect, Writer, Reviewer, optional agents), and before starting a heavy next step (Code Analyst for many-module codebases, Writer for large unit counts, Reviewer with cross-checks), offer a proactive pause. Heuristic signals: many files read, many artifacts already in `<output_folder>/`, long message exchange.

**🚫 Never offer this prompt right after a resume.** A fresh resume session is already clean; suggesting `/clear` + `/doc-this` is redundant. Only valid after an agent has finished real work in the current session.

When you decide a pause is worth offering, use this format:
> "[Name], **[completed agent]** has finished and the checkpoint is saved. Next is **[next agent]**, which is usually long. You can:
>
> 1. Continue now in this session
> 2. Pause here, type `/clear` to clear context, and resume with `/doc-this` in a fresh session (recommended if the current session is already long)
>
> Press 1, 2, or just type CONTINUE for option 1."

Before offering option 2, **confirm the checkpoint is saved** in `.doc-this/state.json` (fields `phase`, `completed`, `checkpoints` for the agent that just finished). Without a valid checkpoint, offering a pause is risky.

The user decides. If they don't reply or say continue, proceed normally.

## Confidence scale (always use in generated specs)

Binary, per the describe-only pact:

- 🟢 **CONFIRMED** — backed by an evidence citation (source `file:line`, commit hash, in-repo doc, runtime artifact, written non-functional contract).
- 🔴 **GAP** — no citation available; recorded in `<output_folder>/questions.md` for human resolution.

🟡 INFERRED is **retired**. Inference from weak signals (a middleware call, a timeout config, an enum name, a stylistic pattern) does not produce a fact. Either find direct evidence and write 🟢, or record a 🔴.

## Structural extraction

Doc-this agents use **LSP language servers** for deterministic cross-file analysis when available (compiler-quality: resolves namespaces, follows project references, traces call chains). When LSP is unavailable, agents fall back to **Understand-Anything** hints if the UA knowledge graph exists, then to pure LLM code reading.

- See `references/lsp-structural-extraction.md` for LSP operation recipes per agent
- See `references/ua-integration-guide.md` for UA detection, hint-verify-cite pattern, and staleness handling
- Detection and priority recorded in `state.json.structural_extraction` (see `references/state-schema.md`)

## Special modes

### `--resume`
Default behavior when `state.json` exists. See `references/step-02-resume.md`.

### `--incremental`
Re-analyze only modules affected by code changes since the last run. Requires a completed previous run and LSP or UA for blast-radius computation. See `references/step-05-incremental.md`.

### `--backfill-coverage`
For runs that started (or completed) without Total Source Coverage — including projects analyzed before the feature existed (no `file-manifest.json`). Computes the unread set (manifest source ∖ coverage ledger), re-enters the analysis phase for just those files, reconciles self-inflicted 🔴 gaps (answers found in newly-read files), and re-emits per-page UI entries plus the code-spec matrix. The reading phase may fan out to up to 3 Sonnet reader subagents in parallel (cheaper + faster; the ledger only records reads the orchestrator has verified) — this is parallel execution, so it requires the explicit user consent collected in the backfill scope report (see "Sequential execution does NOT require user authorization" above). See `references/step-06-backfill-coverage.md`.

### `--backfill-artifacts`
For runs whose files are all read (the coverage ledger is complete) but whose per-module `data-dictionary/[module].md` / `flowcharts/[module].md` were skipped for some modules under `doc_level ∈ {standard, detailed}` — the BUG-004 drift where early modules ship `code-analysis.md` + `modules.json` only, with entities recorded in `modules.json` but no human-readable dictionary. Distinct from `--backfill-coverage` (which targets unread files and finds nothing here) and `--regenerate=analysis` (which needlessly re-reads everything): this regenerates the missing artifacts from already-captured `modules.json` `entities[]` (zero source reads) and `code-analysis.md` prose (flowcharts; re-reads only a module's `primary_files` when prose is too thin), then verifies via `doc-this-artifact-completeness-gate.mjs` + the Reviewer's §3b. See `references/step-07-backfill-artifacts.md`.

### `--regenerate=<phase>`
Confirm with the user (destructive within `.doc-this-sdd/` and `.doc-this/checkpoints`). Backup to `.doc-this/.backup-<timestamp>/` and `.doc-this-sdd/.backup-<timestamp>/`. Delete artifacts of the specified phase AND all later phases. Reset `state.json.phase` to the specified phase, clear later checkpoints, move later phases back to `pending`. Resume from the specified phase. Valid phases: `reconnaissance`, `analysis`, `interpretation`, `synthesis`, `generation`, `review` (legacy alias: `excavation` = `analysis`, accepted for runs created before the Code Analyst rename).

## Absolute rule

**Never delete, modify, or overwrite pre-existing project files.** Doc-This writes ONLY to `.doc-this/` and `.doc-this-sdd/`. Promotion to `docs/` is exclusive to `doc-this-promote`, which halts on collisions and asks the user. The `--regenerate` flag's deletions are scoped to those two folders only, always preceded by an automatic backup.

`hooks/doc-this-promote-warning.mjs` provides an advisory nudge (not a block) when the user edits `docs/requirements/*.md`, `docs/adr(s)/*.md`, or `docs/TRACEABILITY.md` while `.doc-this-sdd/` staging exists — reminding them that `/doc-this-promote` is the canonical bridge.

