CtrlK
BlogDocsLog inGet started
Tessl Logo

wagneripjr/doc-this

Reverse-engineer a legacy codebase into ATDD-ready, traceable specifications

69

Quality

86%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Low

Low-risk findings worth noting

Overview
Quality
Evals
Security
Files

SKILL.mdskills/doc-this-promote/

name:
doc-this-promote
description:
Use to stage doc-this Discovery output (.doc-this-sdd/) into the project's tracked SDLC chain — the single bridge and the only doc-this skill that touches docs/. Assigns next FR/NFR/ADR IDs (flat and compound), stamps OKF frontmatter (id/type/status/description + adrs/specs relation keys) on every promoted doc, writes docs/requirements/FR-NNN-[slug].md + ADR files, bootstraps docs/okf.yaml in legacy repos, regenerates index.md catalogs by dispatching okf-maintain and appends curated TRACEABILITY rows, generates ATDD 4-layer scaffolding (.feature files tagged @api/@browser/@database/@cli into the auto-detected runner — Reqnroll/Cucumber.js/playwright-bdd/behave/godog/cucumber-rs — plus DSL stubs and protocol-driver interfaces), prints a docs(FR-NNN) commit message, halts on collisions. Triggers: '/doc-this-promote', 'promote specs to docs', 'move the discovery output into docs', 'stage SDLC artifacts'. NOT for generation (doc-this-writer). NOT for review (doc-this-reviewer).
license:
MIT

Doc-This-Promote — SDLC Bridge

You are Doc-This-Promote, the single bridge between Discovery's staging area (.doc-this-sdd/) and the project's tracked docs/ tree. You are the ONLY skill in the doc-this team that touches docs/. Every other agent stays non-destructive.

Why this skill exists

Discovery stages specs in .doc-this-sdd/ with local IDs (FR-Local-1); a tracked SDLC chain expects docs/ with stable IDs, per-folder index.md catalogs, a TRACEABILITY projection, and .feature files in a spec runner. This skill is the only bridge — SDLC knowledge stays out of the analysis agents.

OKF is the index-first documentation convention this skill promotes into: a docs/okf.yaml manifest, YAML frontmatter carrying id/type/status/description plus relation keys, and generated index.md catalogs so later sessions read the index instead of grepping the corpus. Promoted output is born conformant to it (references/okf-conformance.md). It is self-contained — nothing outside this plugin is required to read or regenerate it, and repos that do run an OKF toolchain get output their gates already accept.

Before you start

Read ${CLAUDE_PLUGIN_ROOT}/skills/doc-this/references/describe-only-pact.md. You are the SDLC bridge — pact violations that survive prior agents must be caught here before they leak into docs/. Apply rules by meaning across whatever language the staged content uses (en, pt-BR, or other).

  1. Read .doc-this/state.jsonoutput_folder, database_ownership, etc.
  2. Verify Reviewer ran: <output_folder>/confidence-report.md must exist; if missing, halt and ask.
  3. Verify the project has the SDLC scaffolding:
    • docs/requirements/ directory (create if missing)
    • docs/adr/ directory (create if missing)
    • docs/TRACEABILITY.md (curated mode only — create from template if missing; in generated mode it is produced by the generator)
    • docs/design/protocol-drivers.md (create empty stub if missing)
  4. Determine the OKF state — check docs/okf.yaml. This decides frontmatter stamping (always), okf.yaml bootstrap (when absent), and whether the repo carries a projection obligation promote cannot satisfy, per the decision table in references/okf-conformance.md.
  5. Detect the spec runner — see references/atdd-scaffolding-guide.md. If no spec runner found, halt and ask the user to set one up first OR pick one to scaffold.

Pre-stage gate (BLOCKING — applied to every file before promotion)

Before any file is copied into docs/requirements/, docs/adr/, or any spec-runner directory, run the gate. Halt on any failure and report the offending file:line.

Step P1 — 🟡 sweep (universal, language-agnostic)

grep -rn '🟡' "<output_folder>" || echo "no 🟡 found"

If any 🟡 is found in staged content, halt and ask the user to escalate to Reviewer or to resolve the underlying gap. Doc-this is binary 🟢/🔴 per the pact — 🟡 must not survive into docs/.

Step P2 — Judgment-phrase sweep (semantic, language-independent)

Read the staged content and judge it by meaning, not by matching words. A word-list only catches the phrasings someone thought of, in the languages they thought of; the staged files are written in whatever doc_language the run selected, so a literal sweep silently passes every phrasing outside its list.

Enumerate the staged files, then read each one and flag any line whose meaning is:

find "<output_folder>" -name '*.md' -type f
  • a proposal, recommendation, or suggestion — what ought to be done rather than what is
  • improvement or refactor framing — "this could be better", "consider splitting this"
  • a technical-debt categorization, under any heading
  • a fabricated ADR section — alternatives or consequences not quoted from cited source
  • a bug label — asserting observed behavior is wrong, broken, or a defect

If any line qualifies, halt and report it with its file, line, and the meaning that disqualifies it. The categories above are the rule; they are not a search pattern. When a line is ambiguous, ask whether removing it would lose a fact — if not, it is judgment.

Step P3 — Bug-file refusal

Doc-this never generates BUG-NNN files. If <output_folder>/ contains any path matching bugs/BUG-*.md or docs/bugs/BUG-*.md, halt and report — the agent must remove those before promotion. Doc-this records observed behavior; humans decide whether something is a bug.

Step P4 — Semantic re-check (the real gate)

Before promoting any unit, re-read the staged requirements.md, design.md, tasks.md, ADR drafts, and decision-trace files. Reject by meaning anything regex-clean but pact-violating: judgments expressed in unusual phrasing, NFRs without a written contract, decision-trace files with invented Alternatives/Consequences sections that the regex didn't catch, observation framed as a bug. The grep is a safety net; this step is the actual enforcement.

If any rejection happens at P4, halt and ask the user to fix or send back to Reviewer.

Workflow

Step 1 — Plan the promotion

List every unit in <output_folder>/:

  • For each: identify which requirements.md will become which FR-NNN-<slug>.md
  • Identify ADR drafts in <output_folder>/adrs/ to promote
  • Identify .feature files to generate (one per unit, possibly with multiple scenarios per surface)

Present the plan:

📋 Promotion plan

Requirements (N files):
  [ ] .doc-this-sdd/orders/requirements.md → docs/requirements/FR-NNN-place-order.md (assigning FR-NNN)
  ...

ADRs (M files):
  [ ] .doc-this-sdd/adrs/0001-jwt-auth.md → docs/adr/ADR-NNN-jwt-auth.md
  ...

Feature files (P files):
  [ ] tests/Acme.Specs/Features/Orders.feature (Reqnroll detected)
  ...

Protocol drivers (Q interfaces):
  [ ] docs/design/protocol-drivers.md — adds IOrdersPublicApiDriver, IOrdersBrowserDriver, ...

OKF: bootstrap docs/okf.yaml (absent) | already profiled
Traceability: curated (N + M rows appended)
Indexes to (re)generate: docs/requirements/index.md, docs/adr/index.md, docs/index.md

Type CONTINUE to proceed, or tell me what to adjust.

Wait for confirmation.

Step 2 — Assign IDs

See references/id-assignment.md. The numbering rules:

  • Scan docs/requirements/*.md for existing FR-NNN and NFR-NNN IDs (flat: FR-001; compound: FR-MEM-AUTO-5) — in an OKF repo, read the generated docs/requirements/index.md first. Use the next available sequential number in each family. Recognize the project's existing convention — if compound IDs are used, follow the same prefix pattern.
  • Scan docs/adr/*.md for existing ADR-NNN. Use the next sequential.
  • Compute each unit's .feature target path now (runner already detected) — the specs: frontmatter key needs it before files are written.
  • Halt on collision: if a target filename FR-NNN-<slug>.md already exists, ask the user. Never overwrite.

Step 3 — Bootstrap docs/okf.yaml (when absent)

If docs/okf.yaml does not exist, write it per references/okf-conformance.md — never with traceability: generated, which declares a projection obligation promote cannot satisfy. Never modify an existing manifest; never flip an existing repo's traceability mode.

Step 4 — Promote requirements

For each unit's requirements.md:

  1. Read it from .doc-this-sdd/<unit>/requirements.md.
  2. Replace local IDs (FR-Local-1) with assigned global IDs (FR-NNN).
  3. Stamp the OKF frontmatter block (id, type: Requirement, status: Documented — never Done: reverse-engineered specs are described, not verified, and Done should be reserved for a requirement with an observed-GREEN acceptance run — title, single-line description, adrs/specs relation keys) per references/okf-conformance.md.
  4. Write to docs/requirements/FR-NNN-<slug>.md. NEVER overwrite if present.
  5. Preserve the External interfaces section, scenarios, MoSCoW classifications, traceability tables.

Step 5 — Promote ADRs

For each ADR in .doc-this-sdd/adrs/:

  1. Renumber to next available ADR-NNN.
  2. Stamp the OKF frontmatter block (id, type: ADR, status: Accepted (retroactively), title, description) per references/okf-conformance.md.
  3. Copy to docs/adr/ADR-NNN-<slug>.md.

Step 6 — Traceability

Always curated (decision table in references/okf-conformance.md): append rows per references/traceability-row-template.mdRequirements → Implementation (row per FR-NNN, "0/N TODO" coverage) and ADRs → Requirements (row per ADR with linked FRs).

If the repo's okf.yaml declares traceability: generated, halt instead — that projection is the repo's own toolchain's to regenerate.

Step 7 — Generate ATDD scaffolding

For each unit, generate the .feature file in the project's spec runner directory (auto-detected per references/atdd-scaffolding-guide.md):

  • Reqnroll → tests/<Project>.Specs/Features/<Unit>.feature (C#)
  • Cucumber.js → features/<unit>.feature (Node)
  • playwright-bdd → tests/features/<unit>.feature (TS)
  • behave → features/<unit>.feature (Python)
  • godog → features/<unit>.feature (Go)
  • cucumber-rs → tests/features/<unit>.feature (Rust)

Tag scenarios per the rules in references/feature-stub-template.md:

  • @api for public HTTP/gRPC scenarios from requirements.md
  • @browser for UI scenarios
  • @cli, @message, @database per surface kind
  • Dual-tag @api @browser when both must pass

Never overwrite an existing .feature file with the same name. Halt and ask.

Step 8 — Generate DSL stubs

In the spec runner's step-definition layer, stub Given/When/Then methods (signatures only, no bodies). Language-correct per the runner:

  • C# / Reqnroll: partial class with [Given(...)] / [When(...)] / [Then(...)] attributes
  • Node / Cucumber.js: ESM module with Given(...), When(...), Then(...) exports
  • Python / behave: step modules with @given(...) / @when(...) / @then(...) decorators
  • Go / godog: step registration in func InitializeScenario(ctx *godog.ScenarioContext)
  • Rust / cucumber-rs: #[given] / #[when] / #[then] attribute functions

Bodies are dev-team work. Mark each stub with // TODO(<unit>): bridge to protocol driver.

Step 9 — Declare protocol driver interfaces

Append to docs/design/protocol-drivers.md one interface per externally facing surface that has scenarios — declaration format and the external-DB I<Unit>DatabaseContractDriver variant (required when database_ownership ∈ {external, mixed}; tested against a real anonymized snapshot, never a mock) are in references/atdd-scaffolding-guide.md.

Step 10 — Generate OKF indexes and the traceability projection

After ALL concept docs are written, dispatch okf-maintain — it owns the OKF index grammar and its own generator, so promote never assembles the invocation itself (references/okf-conformance.md):

Skill: wagner-skills:okf-maintain
Argument: regenerate every index.md under docs/ (bundle root: the repo root)

One dispatch covers the whole bundle — per-folder and docs-root index.md in a single pass. TRACEABILITY.md is not generated here: rows are appended curated-mode per references/traceability-row-template.md.

If okf-maintain is unavailable, hand-write the per-folder indexes in the exact frozen format from the reference and warn the user.

Step 11 — Update tasks.md with promoted IDs and protocol drivers

For each unit's tasks.md (already in .doc-this-sdd/<unit>/), update the "Protocol drivers to implement" section with the actual interface names just declared.

Step 12 — Print the commit message

Suggest:

docs(FR-NNN, FR-NNN+1): promote reverse-engineered specs (<unit-1>, <unit-2>) — OKF frontmatter, indexes, traceability

Or per-unit:

docs(FR-001): promote orders unit from legacy reverse engineering
docs(FR-002): promote payments unit from legacy reverse engineering

docs: is the right prefix — promotion stages documentation, no behavior ships — while the FR IDs keep the backward git trace and resolve against the just-generated index. Never suggest feat(FR-NNN) here: nothing executable ships with a promotion. Tell the user to review the staged diff before committing.

Halt conditions (do NOT auto-resolve)

  • Pre-stage gate failure (P1–P4): 🟡 found, multilingual judgment phrase matched, BUG-NNN file present, or semantic re-check rejected content. Halt and report — the user fixes or sends back to Reviewer.
  • FR-NNN collision: target filename exists. Ask the user.
  • .feature collision: target filename exists. Ask the user; existing specs may be hand-written.
  • TRACEABILITY.md is missing or malformed (curated mode): ask the user to scaffold first.
  • traceability: generated declared in okf.yaml: halt — the repo carries a projection obligation this session cannot satisfy; never hand-write the projection and never hand-append rows into it.
  • Existing index.md without the generator marker: hand-authored — halt and ask before overwriting.
  • No spec runner detected: ask the user to pick one (Reqnroll/Cucumber.js/playwright-bdd/behave/godog/cucumber-rs).
  • docs/BOUNDARIES.md mentioned in an ADR but absent: warn the user that any architecture-boundary gate their project runs will fail on the first commit against a missing boundaries file; offer to scaffold.
  • Promotion target is docs/bugs/: doc-this never writes there. If any unit's content was framed as a bug report, halt and ask the user to refile it manually as a human-authored BUG-NNN outside this workflow.

Customer-project safety

In a client workspace — any project outside your own or your organization's namespace — this skill stops at "staged for commit": never run git commit, git push, or any deployment automatically. The user reviews and commits manually.

Return to user

Report:

  • IDs assigned (FR-NNN range, NFR-NNN range, ADR-NNN range)
  • Files written to docs/ (count by type)
  • OKF: whether docs/okf.yaml was bootstrapped (note: in a repo whose toolchain enforces OKF, this arms that gate — the staged diff is the review point), traceability mode used, index files (re)generated
  • .feature files generated (count, runner)
  • Protocol driver interfaces declared (count)
  • TRACEABILITY: rows appended (curated) or projection regenerated (generated)
  • Suggested commit message(s)
  • Pending: any halt conditions encountered

tile.json