construct — a product idea, grounded into a buildable SRD
For engine evidence and coverage limits, read engine-evidence.
construct turns a product idea into a Software Requirements Document suite
whose requirements and decisions are grounded in real research, not the
model's memory. The deterministic engine (scripts/construct.mjs, zero-dep
Node) does the searching, dossier assembly, SRD rendering and validation with
code; your job is to run the interview, drive the research, and enrich the
rendered scaffold into a precise, well-grounded SRD.
The core rule: prefer a grounded requirement to a guessed one. Use the
research the engine retrieves (competitors, OSS prior art, tech docs,
StackOverflow) to justify scope, NFRs and architecture decisions, and cite the
evidence with [E#]. Grounding is advisory by default: construct check reports citation
coverage. Pass --min-grounding <0-100> to fail below a required coverage
threshold. Coverage counts references; use review and check --semantic
to verify that the cited evidence actually supports the claims.
The loop, in one line
[brainstorm] → interview → research → analyze → drill → render → enrich → red-team → check → present → [build]
construct status --out <run> prints what exists and the exact next command.
Use it whenever you resume a run, or lose the thread.
When NOT to run construct
Check the fit before question 1; a wrong fit wastes the whole loop.
- An existing codebase. construct specs greenfield products. To document or
evolve a repo that already exists, use
reconstruct instead.
- Several products in one ask. One run = one product. Name the split,
recommend which to spec first, park the rest.
- No articulable idea.
init needs a one-liner. If the user cannot state the
problem in a sentence, run construct brainstorm and diverge until a real
shape emerges — don't start a run on "an AI thing".
- They just want a diagram, a name, or an estimate. Answer directly; an SRD
suite is not the deliverable they asked for.
Route by situation
| The user… |
Start at |
Read |
| has a rough idea, wants to explore |
step 0, brainstorm |
references/brainstorm-playbook.md |
| has a clear idea |
step 1, the interview |
references/interview-playbook.md |
already has brief.json |
step 2, research |
references/research-playbook.md |
| has a rendered SRD, wants it sharper |
step 4 enrich, then step 5 |
references/srd-authoring.md |
| has a validated SRD, wants the app |
step 8, verify as referee |
references/build-playbook.md |
| names >6 features or a modular layout |
step 1 + module split |
references/srd-authoring.md |
| wants grounding enforced, not advised |
check --min-grounding N, then review |
references/grounding-coverage.md |
| wants a throwaway spec, not a build |
render --level light |
references/srd-authoring.md |
A first run chains 1 → 2 → 3 → 4 → 5 → 6 → 7. Resuming usually starts at
status, then re-enters wherever it says.
The happy path, in eight commands
node scripts/construct.mjs init --idea "<one-liner>" --out ./my-idea # then interview → brief.json
node scripts/construct.mjs research --out ./my-idea --angles market,oss,tech
node scripts/construct.mjs analyze --out ./my-idea # what is thin + the drill for each gap
node scripts/construct.mjs research --out ./my-idea --angles market,oss,tech --url <proven,urls>
node scripts/construct.mjs render --out ./my-idea --level complex
# … enrich SRD.json, then:
node scripts/construct.mjs render --out ./my-idea --from-srd
node scripts/construct.mjs check --out ./my-idea
node scripts/construct.mjs review --out ./my-idea # adjudicate → check --semantic
The script
One committed, dependency-free bundle: node scripts/construct.mjs <command>.
No npm install, no API keys. --help has the full surface; this is the map.
| Command |
What it does |
init --idea "<s>" --out <run> |
scaffold the run folder + brief.json |
brainstorm --out <run> [--merge] |
optional divergent board; --merge folds kept ideas into the brief, parked ones into openQuestions (a gate-blocking 🧠) |
research --out <run> [--angles …] [--url …] [--docs-url …] |
gather evidence into <run>/evidence/. This is the only command that grounds anything. |
analyze --out <run> |
what is thin — every claim that will render UNGROUNDED, with the drill that fixes it. Never gates. |
web | oss | tech | so --out <run> |
drill ONE angle. Prints to stdout; persists nothing — including --url/--docs-url. |
render --out <run> [--level light|complex] |
render the SRD tree + SRD.json. --level defaults to light — pass complex whenever a build is even possible. |
render --out <run> --from-srd |
re-emit the tree from an edited SRD.json. This is how you persist enrichment. |
check --out <run> |
the hard structural gate + the advisory grounding report |
review --out <run> [--apply <f>] |
the claim↔evidence worklist, then the verdict ledger check --semantic gates on |
verify --out <run> [--app <dir>] [--acceptance] [--run-tests] [--strict] |
static consistency by default; --acceptance --run-tests executes current criterion-bound commands (--app defaults to conventions.appDir) |
status --out <run> [--json] |
what exists + the next command; --json adds the build frontier |
orchestrate --out <run> [--phase …] [--eco] |
emit this run's fan-out (see below) |
semantic up|down|status |
the optional local Docker stack |
firecrawl up|down|status |
the optional local Firecrawl stack — keyless main-content extraction. While it runs, every page is cleaned through it instead of the built-in HTML stripper; while it does not, nothing changes. |
cache status|clean [--all] |
the page cache that makes a research re-run nearly free |
Three behaviours worth knowing before they surprise you:
--prd is sticky. A later render that omits it refuses to run rather
than destroy requirements/prd/ — re-pass --prd, or --no-prd to delete it
deliberately.
check --semantic is fail-closed. A missing, unreadable or incompletely
adjudicated VERIFY.json FAILS, as does one adjudicated against a different
render. --allow-unverified degrades that to a warning — say so when you use it.
check hard-fails at complex on renderer scaffold. That level certifies
build-readiness; un-authored acceptance criteria certify nothing.
(references/requirements-rubric.md.)
Conventions. --out <run> (alias --run); --q <focus> (alias
--question). --refresh ignores the page cache and re-clones OSS repos;
--offline works from the cache alone and reports a miss honestly.
--web-engine auto|searxng|ddg|claude|firecrawl pins discovery (firecrawl is
explicit-only — auto never probes it); --firecrawl <url|off> points the
extraction layer elsewhere, or forces the built-in extractor. --concurrency <n>
(default 4) bounds in-flight fetches per angle; --max-tech <n> (default 3) how
many candidate technologies tech grounds; --per-source <n> (default 6) how
much evidence each source keeps; --source <kind> reclassifies web --url
pages. Most commands take --json — prefer it whenever you branch on the result.
Exit codes. 0 ok · 1 gate failure, usage error or runtime error · 2
orchestration precondition failure, including a phase whose worklist does not
exist yet (the message names the command that produces it). analyze never gates.
Semantic verdicts bind to the full claim and cited evidence content, including
text beyond the displayed excerpt. Keep the generated VERIFY.todo.json while
adjudicating: minimal verdict rows inherit its fingerprint only after the engine
confirms it still matches the current SRD and evidence. Preserve fingerprints in
self-contained verdicts. A legacy or missing worklist cannot bind old unbound
rows; check --semantic rejects them. Re-run review and re-adjudicate changed
content. --allow-unverified explicitly downgrades binding failures to warnings.
Workflow
You are invoked once and expected to return a complete, grounded SRD. Drive the
loop to completion; only pause to ask the user a real decision.
Brainstorm — optional, divergent, before the interview. When the user
can't yet articulate a crisp idea, or wants to explore options first, run
construct brainstorm --out <run> (after init) and generate candidate
ideas WITH the user across the six angles, then --merge the kept ones into
brief.json. Skip it when the user already knows what they want. Follow
references/brainstorm-playbook.md.
Interview the user — one question at a time. Establish the product before
researching. Follow references/interview-playbook.md (and
references/brief-example.md for a filled brief + the exchanges that
produced its hardest fields): problem, target
users, core value, must/should/could features, constraints (budget, timeline,
team, compliance), candidate technologies, and any competitor / OSS seeds.
Recommend an answer with each question; don't dump a questionnaire. Write the
answers into brief.json (start it with construct init).
Module decomposition: when the product is naturally modular (roughly >6
features, or the user names a modular architecture like src/modules/…),
propose a module split and record it — brief.modules (id/name/description/
dependsOn) plus a module on every feature. Render then emits one PRD per
module and check enforces the partition (all-or-nothing: every feature
assigned). Module ids become folder names — keep them slug-like, and keep
feature titles unique across modules (BUILD-PLAN progress is keyed by title).
Research — ground the idea. Run:
node scripts/construct.mjs research --out <run> --angles market,oss,tech
This discovers competitors on the web, mines comparable OSS projects (and
their issues/PRs for real pitfalls), and pulls candidate-tech docs +
StackOverflow. Read <run>/evidence/EVIDENCE.md.
Dig deeper — until analyze is clean or the user stops you. Run:
node scripts/construct.mjs analyze --out <run>
It names exactly what is thin — features, competitors, candidate tech and OSS
seeds with no matchable evidence — and prints the drill command that fixes
each gap. Fan out: if you can spawn parallel subagents, dispatch one per
gap (the engine emits this ready to launch:
node scripts/construct.mjs orchestrate --out <run> --phase research);
each gets the brief one-liner, the gap, its drill command and its own
WebSearch, and returns a ≤5-line summary plus URLs worth grounding. Subagents
MUST NOT write into the run folder — drills print to stdout; only
construct research writes the dossier, and only YOU run it. Fold findings
in with a single research re-run that PINS the proven URLs:
construct research --out <run> --angles market,oss,tech --url <u,...> [--docs-url <d,...>] → re-run analyze. A research run rebuilds the
dossier from exactly the angles/URLs it is given — always pass every angle,
or evidence from earlier runs is lost. Pinned URLs are never dropped by the
budget, and any budget cut is named in the dossier notes. [E#] ids are
stable across re-runs, so citations already written into the SRD keep pointing
at the same source. (No subagents? Work the gaps yourself, one drill at a
time.) Tell the user what you found and let them steer — prioritise
must-have features and load-bearing decisions, stop when they say it's
enough. See references/orchestration.md and
references/research-playbook.md.
Render the SRD. When the brief is solid and the dossier is rich:
node scripts/construct.mjs render --out <run> --level complex
Pick complex whenever a build is even possible; switching levels later
renumbers FR ids (see references/srd-authoring.md).
This writes the SRD tree (see below). The data model and interfaces come
pre-seeded by inference from the brief — verify them, don't trust them.
Then enrich it: resolve every 🧠 Decide: callout, sharpen the templated
acceptance criteria and NFR metrics into testable, bounded statements
(follow references/acceptance-criteria.md — at complex a surviving
renderer-templated criterion is a hard error, not a warning: that level
certifies build-readiness), correct/extend the data model and interfaces, and
add [E#] citations from the dossier to the requirements and decisions they
rest on. Persist enrichment by editing SRD.json and re-emitting with
render --out <run> --from-srd — that keeps the markdown and the gated
manifest in sync; hand-editing a rendered .md alone is overwritten by the
next render. See references/srd-authoring.md and
references/citation-format.md.
At complex, also enrich the design system (design/): replace the
seeded design tokens with the product's real brand values, verify the
component and screen/flow inventory, and sharpen the accessibility criteria
to the target standard (derived from the brief, default WCAG 2.2 AA). See
references/design-system-authoring.md.
Adversarial review — let fresh eyes break it. Spawn one reviewer
subagent with NO context beyond the run folder path and
references/adversarial-review.md (no subagents? do the pass yourself,
strictly following that checklist as a hostile reader). It must try to
break the SRD — ambiguity, untestable criteria, missing failure paths,
citation-washing, contradictions — and return tagged findings. Fix every
[blocker], use judgement on [advisory], then re-run check. Loop until
dry — stop when a round surfaces no NEW blocker (one clean round is enough;
don't spend three by default). Backstop: if you are still finding blockers
after 3 rounds, stop and take what remains to the user — an SRD that won't go
dry in 3 rounds has a structural problem worth a human.
For a genuinely contested, hard-to-reverse ADR at complex level, also run
the 3-judge panel from references/orchestration.md (emit it:
orchestrate --out <run> --phase adr-judges --adr <id>).
Validate (three layers).
- Structural (hard):
node scripts/construct.mjs check --out <run>. It
fails on any unresolved 🧠, no functional requirements at all, an FR with
no acceptance criteria, a dangling entity/interface/NFR reference, a missing
required NFR category, or a malformed ADR. Fix until it passes.
- Grounding (advisory): the same command prints coverage — what fraction of
requirements/decisions cite evidence. Raise it where it matters (the load-
bearing decisions); see
references/grounding-coverage.md. By default it
never fails the build, so use judgement. When the user wants grounding
enforced, add the opt-in gate: check --out <run> --min-grounding 70.
- Claim-support (opt-in gate, then fail-closed): coverage counts citations;
it does not check they hold.
construct review --out <run> builds a
claim↔evidence worklist; adjudicate each pair (fan out per
references/orchestration.md Pattern 4 — emitted by
orchestrate --out <run> --phase claim-review), assemble verdicts.json,
review --apply verdicts.json, then check --out <run> --semantic.
Run --semantic only after review --apply: it asserts the support
gate actually engaged, so a missing/incomplete VERIFY.json — or one
adjudicated against an earlier render — fails the check rather than passing
it quietly. Worth one pass over the load-bearing FRs/ADRs before presenting.
Loop steps 3–6 until check passes structurally, the reviewer finds no new
blockers, and the grounding is honest.
Present. Lead with the decisions, not the artifact: what the research
changed, the load-bearing ADRs with their cost and their [E#], the scope
boundary, and what is still unknown — pinned explicitly rather than smoothed
over. Report the gates honestly: a green check means structurally complete,
not good, and coverage counts citations rather than checking they hold. Then
ask what they want next; don't start building unprompted. Follow
references/presenting.md.
Build (when the user wants the app, not just the SRD). The render also
emitted BUILD-PLAN.json — a machine-readable task DAG (T-000 skeleton +
one task per FR, must → should → could, entity-aware dependencies) whose
acceptance entries POINT into SRD.json. You write all app code; the
engine referees. Follow references/build-playbook.md:
- Do
T-000 (scaffold, test harness, CI); set conventions.appDir and
conventions.testCommand in BUILD-PLAN.json.
- Per task, in topological order: read the acceptance criteria from
SRD.json; TDD them — every test names its FR id (e.g.
describe("FR-001 …"); that's what verify greps); record artifacts +
tests; set status: "done"; run
node scripts/construct.mjs verify --out <run> and fix any error before
the next task.
- Same-milestone tasks carry no edges to each other, so their ready frontier
(
status --out <run> --json) can be built in parallel — one isolated git
worktree per task; you alone fold results into BUILD-PLAN.json (Pattern 5
in references/orchestration.md; fan out:
orchestrate --out <run> --phase build).
- Per milestone:
verify --out <run> --run-tests --strict, then a
milestone adversarial review — fresh eyes hunting for an acceptance
criterion no test actually exercises (see the playbook;
references/verify.md explains what verify can and cannot prove).
- If an FR proves wrong while building, amend the brief, re-render
(progress merges by feature title), retag shifted FR ids, re-
check.
- Before claiming the app is implemented, follow the criterion-binding protocol
in
references/verify.md and run verify --out <run> --strict --acceptance --run-tests --json.
Every current criterion must be passed; failed or not-tested blocks the
claim. Review the dedicated assertions: exit 0 proves command success, not
that a skipped, empty or weakened test satisfies the business requirement.
When something goes wrong
| Symptom |
What to do |
check fails on a 🧠 callout |
Make the decision. Fold it into an ADR, a requirement or scope, remove it from brief.openQuestions, re-render. It is a gate because a deferred decision is a bug in a spec. |
check fails naming the renderer's scaffold |
Those criteria/contracts were never authored. Rewrite them (references/requirements-rubric.md), or drop to --level light if this is a throwaway spec. |
render refuses: "requirements/prd exists" |
A previous render used --prd. Re-pass --prd to regenerate it, or --no-prd to delete it deliberately. |
check --semantic exits 1 with no obvious cause |
It is fail-closed. Run review, adjudicate every pair, review --apply, then --semantic. A re-render since the review also invalidates it. |
orchestrate --phase <p> exits 2 |
That phase's worklist does not exist yet; the message names the command that produces it. |
| Research returns nothing |
Sharpen vague candidateTech/competitors and re-run. Then use your own WebSearch and pin the pages: research --url <u,...>. Stop after two empty attempts — record an assumption or an openQuestion and move on. A thin, honest SRD beats a fabricated citation. |
| Tests reference FR ids the SRD no longer has |
A re-render renumbered them. Retag the tests; verify lists the stale ids. |
| A run is unexpectedly slow |
construct cache status. A cold cache costs a full fetch per page; --offline works from the cache alone. Per-angle cost is in evidence/meta.json and at the foot of EVIDENCE.md. |
Common mistakes
- Treating a drill as grounding.
web/oss/tech/so PRINT. Only
research --url / research --docs-url persist evidence you can cite.
- Re-running
research with fewer angles. It rebuilds the dossier from
exactly what you give it — always pass every angle, or earlier evidence is lost.
- Rendering at the default
light when a build is possible. Switching later
renumbers FR ids and invalidates test tags.
- Editing a rendered
.md and stopping there. The next render overwrites it.
Edit SRD.json, then render --from-srd.
- Letting a subagent write the run folder. One writer — you. Subagents return
text.
- Presenting before
check passes. A coverage percentage is not a gate; an
unresolved 🧠 is.
How to know you're done
The SRD is done when all of these hold — check them explicitly, don't assume:
construct check exits 0.
- Every
must requirement has a failure-path criterion naming specific
behaviour, not "an error is shown".
- Every load-bearing decision (stack, datastore, build-vs-buy, the
differentiators) cites evidence that actually says what the claim implies —
you spot-checked at least three.
- The data model and interfaces were verified, not left as the renderer
inferred them.
- A red-team round surfaced no new blocker.
- Whatever is still unknown is written down as an assumption or an
openQuestion — not quietly guessed.
The self-test: could a developer who has never spoken to you build the
must-haves from this SRD alone, getting the contracts right rather than the gist?
If any answer needs a conversation, the SRD is not done.
Orchestration — route by harness
Four phases fan out over per-unit, file-backed state: research (one researcher per
analyze gap), claim-review (one skeptic per VERIFY.todo.json pair), adr-judges
(a fixed 3-lens panel over ONE contested ADR) and build (one worktree-isolated builder
per ready task). orchestrate emits them from the run's CURRENT state, with absolute paths
and the real worklist units baked in:
node scripts/construct.mjs orchestrate --out <run> [--phase research|claim-review|adr-judges|build] [--adr <id>] [--eco] [--list]
| Your harness |
How to run each phase |
| Has the Workflow tool |
orchestrate --phase <p>, then Workflow({ scriptPath: "<run>/orchestration/<p>.workflow.mjs" }) |
| Subagents, no Workflow tool |
Same orchestrate; dispatch one subagent per batch per <run>/orchestration/agents/<role>.md |
| Eco mode, or no subagents |
orchestrate --eco → follow <run>/orchestration/RUNBOOK.md sequentially |
Two rules survive every tier. Subagents never write the run folder — they return
fragments and YOU fold them in (builders write code only in their own git worktree). And
fan-out is an optimization, never a requirement: every phase has a sequential fallback with
identical artifacts, so the gates are harness-independent. Patterns, output contracts and
budget guidance: references/orchestration.md.
What it produces (the SRD tree, under --out)
00-overview/ VISION.md · SCOPE.md (+ 🧠 open decisions)
requirements/ FUNCTIONAL.md (FR-NNN · priority · Given/When/Then · [E#];
an index linking each FR to its module PRD in modules mode)
NON-FUNCTIONAL.md (NFR-NNN by category · metric · [E#])
prd/PRD-FR-NNN-*.md (+ README index — only with --prd)
prd/ README.md · <module>/PRD.md (modules mode only: one PRD per
module — full FR blocks, NFR refs, data/interface slices, deps)
architecture/ SYSTEM-CONTEXT.md · DATA-MODEL.md · INTERFACES.md
decisions/NNNN-*.md (ADRs)
design/ PRINCIPLES.md · DESIGN-TOKENS.md (+ design-tokens.json) · COMPONENTS.md
SCREENS.md · ACCESSIBILITY.md (complex only; --no-design to skip)
competitive/ LANDSCAPE.md (competitors + OSS prior art)
BUILD-PLAN.md · BUILD-PLAN.json (task DAG for the build phase; tasks carry their
module in modules mode)
TRACEABILITY.md (FR ↔ module ↔ NFR ↔ ADR ↔ entity ↔ interface ↔ component ↔ screen)
evidence/ EVIDENCE.md · evidence.json · meta.json · ids.json (the [E#]
ledger — do not hand-edit; it is what keeps citations stable)
VERIFY.md · VERIFY.todo.json · VERIFY.json (the claim-support worklist and its
adjudicated ledger — written by `review` / `review --apply`)
orchestration/ <phase>.workflow.mjs · agents/<role>.md · RUNBOOK.md
(written by `orchestrate`; `out/` is where subagents may return)
brief.json · SRD.json
evidence/, VERIFY.md and orchestration/ are retrieved or generated text —
check deliberately does not scan them for 🧠/TODO, so an evidence snippet can
quote anything without tripping the gate.
light keeps it lean; complex adds the full NFR set, a second ADR, failure-
path acceptance criteria, the full traceability matrix and a design-system
subtree (design/: principles, tokens, components, screens/flows, an
accessibility contract — --no-design opts out). Add --merge for a single-file
SRD.md (always the full FR blocks, even in modules mode).
Optional local stacks (fully local, no API key)
construct semantic up brings up a local Docker stack (Qdrant + Ollama + SearXNG); then
research --angles market,oss,tech,semantic --semantic re-ranks the gathered evidence by
embedding relevance. Nothing leaves the machine, and if the stack is down --semantic logs
a notice and keeps the lexical ranking.
construct firecrawl up brings up the second, heavier stack (~3 GB, its own
extract profile — never started by semantic up). While it runs, every page
the research pipeline fetches is cleaned through Firecrawl's main-content
markdown instead of the built-in HTML stripper, which is what makes a
JS-rendered page yield any evidence at all. Also keyless. Every failure path
falls back to the built-in extractor and says so in the dossier notes, so the
worst case of a stopped stack is the behaviour you had before.
See references/semantic-setup.md.
References
references/brainstorm-playbook.md — the optional divergent step: generating candidate ideas across six angles and merging the kept ones into the brief.
references/interview-playbook.md — how to elicit the brief, one question at a time.
references/brief-example.md — a filled brief.json, the exchanges that produced its hardest fields, and what makes it work.
references/research-playbook.md — picking angles and digging deeper to "good enough".
references/orchestration.md — the three-tier dynamic-workflow model and the subagent patterns: research fan-out, red team, judge panel, claim-support review fan-out, build fan-out (and the one-writer rule). The fan-out patterns are emitted ready-to-launch by construct orchestrate.
references/adversarial-review.md — the red-team checklist and its findings contract.
references/srd-authoring.md — resolving 🧠 callouts, writing testable requirements and ADRs.
references/design-system-authoring.md — enriching the complex design system: tokens, components, screens/flows and the accessibility contract.
references/requirements-rubric.md — the ISO/IEC/IEEE 29148:2018 characteristics check holds requirements to, the two severities, and what a green gate does and does not mean.
references/acceptance-criteria.md — bad→good Given/When/Then rewrites and measurable NFR metric patterns.
references/forbidden-patterns.md — the phrasings that never survive review, and the shape that replaces each.
references/citation-format.md — the [E#] grounding convention.
references/grounding-coverage.md — what the advisory coverage report means and how to raise it.
references/build-playbook.md — the build loop: task TDD, FR-tag convention, milestone gates, the milestone review.
references/verify.md — what each verify check proves and what still needs eyes.
references/presenting.md — step 7: what to say when you hand the SRD over, and how to report the gates honestly.
references/provider-apis.md — how OSS issues/PRs are fetched per host, keyless.
references/web-discovery.md — the layered keyless web search.
references/semantic-setup.md — the optional local Docker stack.
1---2name: construct3description: Turn a product idea into grounded SRD/PRD requirements, acceptance criteria, and a verifiable build plan.4license: MIT5---67# construct — a product idea, grounded into a buildable SRD89For engine evidence and coverage limits, read [engine-evidence](references/engine-evidence.md).1011`construct` turns a product idea into a **Software Requirements Document suite**12whose requirements and decisions are **grounded in real research**, not the13model's memory. The deterministic engine (`scripts/construct.mjs`, zero-dep14Node) does the searching, dossier assembly, SRD rendering and validation **with15code**; your job is to run the interview, drive the research, and enrich the16rendered scaffold into a precise, well-grounded SRD.1718> **The core rule:** prefer a *grounded* requirement to a *guessed* one. Use the19> research the engine retrieves (competitors, OSS prior art, tech docs,20> StackOverflow) to justify scope, NFRs and architecture decisions, and cite the21> evidence with `[E#]`. Grounding is **advisory by default**: `construct check` reports citation22> coverage. Pass `--min-grounding <0-100>` to fail below a required coverage23> threshold. Coverage counts references; use `review` and `check --semantic`24> to verify that the cited evidence actually supports the claims.2526## The loop, in one line2728```29[brainstorm] → interview → research → analyze → drill → render → enrich → red-team → check → present → [build]30```3132`construct status --out <run>` prints what exists **and the exact next command**.33Use it whenever you resume a run, or lose the thread.3435## When NOT to run construct3637Check the fit before question 1; a wrong fit wastes the whole loop.3839- **An existing codebase.** construct specs *greenfield* products. To document or40 evolve a repo that already exists, use `reconstruct` instead.41- **Several products in one ask.** One run = one product. Name the split,42 recommend which to spec first, park the rest.43- **No articulable idea.** `init` needs a one-liner. If the user cannot state the44 problem in a sentence, run `construct brainstorm` and diverge until a real45 shape emerges — don't start a run on "an AI thing".46- **They just want a diagram, a name, or an estimate.** Answer directly; an SRD47 suite is not the deliverable they asked for.4849## Route by situation5051| The user… | Start at | Read |52|---|---|---|53| has a rough idea, wants to explore | step 0, `brainstorm` | `references/brainstorm-playbook.md` |54| has a clear idea | step 1, the interview | `references/interview-playbook.md` |55| already has `brief.json` | step 2, `research` | `references/research-playbook.md` |56| has a rendered SRD, wants it sharper | step 4 enrich, then step 5 | `references/srd-authoring.md` |57| has a validated SRD, wants the app | step 8, `verify` as referee | `references/build-playbook.md` |58| names >6 features or a modular layout | step 1 + module split | `references/srd-authoring.md` |59| wants grounding *enforced*, not advised | `check --min-grounding N`, then `review` | `references/grounding-coverage.md` |60| wants a throwaway spec, not a build | `render --level light` | `references/srd-authoring.md` |6162A first run chains 1 → 2 → 3 → 4 → 5 → 6 → 7. Resuming usually starts at63`status`, then re-enters wherever it says.6465## The happy path, in eight commands6667```68node scripts/construct.mjs init --idea "<one-liner>" --out ./my-idea # then interview → brief.json69node scripts/construct.mjs research --out ./my-idea --angles market,oss,tech70node scripts/construct.mjs analyze --out ./my-idea # what is thin + the drill for each gap71node scripts/construct.mjs research --out ./my-idea --angles market,oss,tech --url <proven,urls>72node scripts/construct.mjs render --out ./my-idea --level complex73# … enrich SRD.json, then:74node scripts/construct.mjs render --out ./my-idea --from-srd75node scripts/construct.mjs check --out ./my-idea76node scripts/construct.mjs review --out ./my-idea # adjudicate → check --semantic77```7879## The script8081One committed, dependency-free bundle: `node scripts/construct.mjs <command>`.82No `npm install`, no API keys. `--help` has the full surface; this is the map.8384| Command | What it does |85|---|---|86| `init --idea "<s>" --out <run>` | scaffold the run folder + `brief.json` |87| `brainstorm --out <run> [--merge]` | optional divergent board; `--merge` folds kept ideas into the brief, parked ones into `openQuestions` (a gate-blocking 🧠) |88| `research --out <run> [--angles …] [--url …] [--docs-url …]` | gather evidence into `<run>/evidence/`. **This is the only command that grounds anything.** |89| `analyze --out <run>` | what is thin — every claim that will render UNGROUNDED, with the drill that fixes it. Never gates. |90| `web \| oss \| tech \| so --out <run>` | drill ONE angle. **Prints to stdout; persists nothing** — including `--url`/`--docs-url`. |91| `render --out <run> [--level light\|complex]` | render the SRD tree + `SRD.json`. **`--level` defaults to `light`** — pass `complex` whenever a build is even possible. |92| `render --out <run> --from-srd` | re-emit the tree from an **edited `SRD.json`**. This is how you persist enrichment. |93| `check --out <run>` | the hard structural gate + the advisory grounding report |94| `review --out <run> [--apply <f>]` | the claim↔evidence worklist, then the verdict ledger `check --semantic` gates on |95| `verify --out <run> [--app <dir>] [--acceptance] [--run-tests] [--strict]` | static consistency by default; `--acceptance --run-tests` executes current criterion-bound commands (`--app` defaults to `conventions.appDir`) |96| `status --out <run> [--json]` | what exists + **the next command**; `--json` adds the build frontier |97| `orchestrate --out <run> [--phase …] [--eco]` | emit this run's fan-out (see below) |98| `semantic up\|down\|status` | the optional local Docker stack |99| `firecrawl up\|down\|status` | the optional local Firecrawl stack — keyless main-content extraction. While it runs, every page is cleaned through it instead of the built-in HTML stripper; while it does not, nothing changes. |100| `cache status\|clean [--all]` | the page cache that makes a `research` re-run nearly free |101102Three behaviours worth knowing before they surprise you:103104- **`--prd` is sticky.** A later `render` that omits it **refuses to run** rather105 than destroy `requirements/prd/` — re-pass `--prd`, or `--no-prd` to delete it106 deliberately.107- **`check --semantic` is fail-closed.** A missing, unreadable or incompletely108 adjudicated `VERIFY.json` FAILS, as does one adjudicated against a different109 render. `--allow-unverified` degrades that to a warning — say so when you use it.110- **`check` hard-fails at `complex` on renderer scaffold.** That level certifies111 build-readiness; un-authored acceptance criteria certify nothing.112 (`references/requirements-rubric.md`.)113114**Conventions.** `--out <run>` (alias `--run`); `--q <focus>` (alias115`--question`). `--refresh` ignores the page cache and re-clones OSS repos;116`--offline` works from the cache alone and reports a miss honestly.117`--web-engine auto|searxng|ddg|claude|firecrawl` pins discovery (`firecrawl` is118explicit-only — `auto` never probes it); `--firecrawl <url|off>` points the119extraction layer elsewhere, or forces the built-in extractor. `--concurrency <n>`120(default 4) bounds in-flight fetches per angle; `--max-tech <n>` (default 3) how121many candidate technologies `tech` grounds; `--per-source <n>` (default 6) how122much evidence each source keeps; `--source <kind>` reclassifies `web --url`123pages. Most commands take `--json` — prefer it whenever you branch on the result.124125**Exit codes.** `0` ok · `1` gate failure, usage error or runtime error · `2`126orchestration precondition failure, including a phase whose worklist does not127exist yet (the message names the command that produces it). `analyze` never gates.128129Semantic verdicts bind to the full claim and cited evidence content, including130text beyond the displayed excerpt. Keep the generated `VERIFY.todo.json` while131adjudicating: minimal verdict rows inherit its fingerprint only after the engine132confirms it still matches the current SRD and evidence. Preserve fingerprints in133self-contained verdicts. A legacy or missing worklist cannot bind old unbound134rows; `check --semantic` rejects them. Re-run `review` and re-adjudicate changed135content. `--allow-unverified` explicitly downgrades binding failures to warnings.136137## Workflow138139You are invoked once and expected to return a complete, grounded SRD. Drive the140loop to completion; only pause to ask the user a real decision.1411420. **Brainstorm — optional, divergent, before the interview.** When the user143 can't yet articulate a crisp idea, or wants to explore options first, run144 `construct brainstorm --out <run>` (after `init`) and generate candidate145 ideas WITH the user across the six angles, then `--merge` the kept ones into146 `brief.json`. Skip it when the user already knows what they want. Follow147 `references/brainstorm-playbook.md`.1481491. **Interview the user — one question at a time.** Establish the product before150 researching. Follow `references/interview-playbook.md` (and151 `references/brief-example.md` for a filled brief + the exchanges that152 produced its hardest fields): problem, target153 users, core value, must/should/could features, constraints (budget, timeline,154 team, compliance), candidate technologies, and any competitor / OSS seeds.155 Recommend an answer with each question; don't dump a questionnaire. Write the156 answers into `brief.json` (start it with `construct init`).157 **Module decomposition:** when the product is naturally modular (roughly >6158 features, or the user names a modular architecture like `src/modules/…`),159 propose a module split and record it — `brief.modules` (id/name/description/160 dependsOn) plus a `module` on every feature. Render then emits **one PRD per161 module** and `check` enforces the partition (all-or-nothing: every feature162 assigned). Module ids become folder names — keep them slug-like, and keep163 feature titles unique across modules (BUILD-PLAN progress is keyed by title).1641652. **Research — ground the idea.** Run:166 ```167 node scripts/construct.mjs research --out <run> --angles market,oss,tech168 ```169 This discovers competitors on the web, mines comparable OSS projects (and170 their issues/PRs for real pitfalls), and pulls candidate-tech docs +171 StackOverflow. Read `<run>/evidence/EVIDENCE.md`.1721733. **Dig deeper — until `analyze` is clean or the user stops you.** Run:174 ```175 node scripts/construct.mjs analyze --out <run>176 ```177 It names exactly what is thin — features, competitors, candidate tech and OSS178 seeds with no matchable evidence — and prints the drill command that fixes179 each gap. **Fan out:** if you can spawn parallel subagents, dispatch one per180 gap (the engine emits this ready to launch:181 `node scripts/construct.mjs orchestrate --out <run> --phase research`);182 each gets the brief one-liner, the gap, its drill command and its own183 WebSearch, and returns a ≤5-line summary plus URLs worth grounding. Subagents184 MUST NOT write into the run folder — drills print to stdout; only185 `construct research` writes the dossier, and only YOU run it. Fold findings186 in with a single research re-run that PINS the proven URLs:187 `construct research --out <run> --angles market,oss,tech --url <u,...>188 [--docs-url <d,...>]` → re-run `analyze`. **A research run rebuilds the189 dossier from exactly the angles/URLs it is given** — always pass every angle,190 or evidence from earlier runs is lost. Pinned URLs are never dropped by the191 budget, and any budget cut is named in the dossier notes. `[E#]` ids are192 stable across re-runs, so citations already written into the SRD keep pointing193 at the same source. (No subagents? Work the gaps yourself, one drill at a194 time.) Tell the user what you found and **let them steer** — prioritise195 must-have features and load-bearing decisions, stop when they say it's196 enough. See `references/orchestration.md` and197 `references/research-playbook.md`.1981994. **Render the SRD.** When the brief is solid and the dossier is rich:200 ```201 node scripts/construct.mjs render --out <run> --level complex202 ```203 Pick `complex` whenever a build is even possible; switching levels later204 renumbers FR ids (see `references/srd-authoring.md`).205 This writes the SRD tree (see below). The data model and interfaces come206 pre-seeded by inference from the brief — **verify them, don't trust them**.207 Then **enrich it**: resolve every `🧠 Decide:` callout, sharpen the templated208 acceptance criteria and NFR metrics into testable, bounded statements209 (follow `references/acceptance-criteria.md` — at `complex` a surviving210 renderer-templated criterion is a **hard error**, not a warning: that level211 certifies build-readiness), correct/extend the data model and interfaces, and212 add `[E#]` citations from the dossier to the requirements and decisions they213 rest on. **Persist enrichment by editing `SRD.json` and re-emitting with214 `render --out <run> --from-srd`** — that keeps the markdown and the gated215 manifest in sync; hand-editing a rendered `.md` alone is overwritten by the216 next render. See `references/srd-authoring.md` and217 `references/citation-format.md`.218 At `complex`, also enrich the **design system** (`design/`): replace the219 seeded design tokens with the product's real brand values, verify the220 component and screen/flow inventory, and sharpen the accessibility criteria221 to the target standard (derived from the brief, default WCAG 2.2 AA). See222 `references/design-system-authoring.md`.2232245. **Adversarial review — let fresh eyes break it.** Spawn one reviewer225 subagent with NO context beyond the run folder path and226 `references/adversarial-review.md` (no subagents? do the pass yourself,227 strictly following that checklist as a hostile reader). It must try to228 *break* the SRD — ambiguity, untestable criteria, missing failure paths,229 citation-washing, contradictions — and return tagged findings. Fix every230 `[blocker]`, use judgement on `[advisory]`, then re-run `check`. **Loop until231 dry** — stop when a round surfaces no NEW blocker (one clean round is enough;232 don't spend three by default). Backstop: if you are still finding blockers233 after 3 rounds, stop and take what remains to the user — an SRD that won't go234 dry in 3 rounds has a structural problem worth a human.235 For a genuinely contested, hard-to-reverse ADR at `complex` level, also run236 the 3-judge panel from `references/orchestration.md` (emit it:237 `orchestrate --out <run> --phase adr-judges --adr <id>`).2382396. **Validate (three layers).**240 - *Structural (hard):* `node scripts/construct.mjs check --out <run>`. It241 fails on any unresolved `🧠`, no functional requirements at all, an FR with242 no acceptance criteria, a dangling entity/interface/NFR reference, a missing243 required NFR category, or a malformed ADR. Fix until it passes.244 - *Grounding (advisory):* the same command prints coverage — what fraction of245 requirements/decisions cite evidence. Raise it where it matters (the load-246 bearing decisions); see `references/grounding-coverage.md`. By default it247 never fails the build, so use judgement. When the user wants grounding248 *enforced*, add the opt-in gate: `check --out <run> --min-grounding 70`.249 - *Claim-support (opt-in gate, then fail-closed):* coverage counts citations;250 it does not check they hold. `construct review --out <run>` builds a251 claim↔evidence worklist; adjudicate each pair (fan out per252 `references/orchestration.md` Pattern 4 — emitted by253 `orchestrate --out <run> --phase claim-review`), assemble `verdicts.json`,254 `review --apply verdicts.json`, then `check --out <run> --semantic`.255 **Run `--semantic` only after `review --apply`:** it asserts the support256 gate actually engaged, so a missing/incomplete `VERIFY.json` — or one257 adjudicated against an earlier render — fails the check rather than passing258 it quietly. Worth one pass over the load-bearing FRs/ADRs before presenting.259 Loop steps 3–6 until `check` passes structurally, the reviewer finds no new260 blockers, and the grounding is honest.2612627. **Present.** Lead with the decisions, not the artifact: what the research263 changed, the load-bearing ADRs with their cost and their `[E#]`, the scope264 boundary, and what is still unknown — pinned explicitly rather than smoothed265 over. Report the gates honestly: a green `check` means structurally complete,266 not good, and coverage counts citations rather than checking they hold. Then267 ask what they want next; don't start building unprompted. Follow268 `references/presenting.md`.2692708. **Build (when the user wants the app, not just the SRD).** The render also271 emitted `BUILD-PLAN.json` — a machine-readable task DAG (T-000 skeleton +272 one task per FR, must → should → could, entity-aware dependencies) whose273 `acceptance` entries POINT into `SRD.json`. **You write all app code; the274 engine referees.** Follow `references/build-playbook.md`:275 - Do `T-000` (scaffold, test harness, CI); set `conventions.appDir` and276 `conventions.testCommand` in `BUILD-PLAN.json`.277 - Per task, in topological order: read the acceptance criteria from278 `SRD.json`; TDD them — **every test names its FR id** (e.g.279 `describe("FR-001 …")`; that's what `verify` greps); record `artifacts` +280 `tests`; set `status: "done"`; run281 `node scripts/construct.mjs verify --out <run>` and fix any error before282 the next task.283 - Same-milestone tasks carry no edges to each other, so their ready frontier284 (`status --out <run> --json`) can be built in parallel — one isolated git285 worktree per task; you alone fold results into `BUILD-PLAN.json` (Pattern 5286 in `references/orchestration.md`; fan out:287 `orchestrate --out <run> --phase build`).288 - Per milestone: `verify --out <run> --run-tests --strict`, then a289 milestone adversarial review — fresh eyes hunting for an acceptance290 criterion no test actually exercises (see the playbook;291 `references/verify.md` explains what verify can and cannot prove).292 - If an FR proves wrong while building, amend the brief, re-render293 (progress merges by feature title), retag shifted FR ids, re-`check`.294 - Before claiming the app is implemented, follow the criterion-binding protocol295 in `references/verify.md` and run `verify --out <run> --strict --acceptance --run-tests --json`.296 Every current criterion must be `passed`; `failed` or `not-tested` blocks the297 claim. Review the dedicated assertions: exit 0 proves command success, not298 that a skipped, empty or weakened test satisfies the business requirement.299300## When something goes wrong301302| Symptom | What to do |303|---|---|304| `check` fails on a 🧠 callout | Make the decision. Fold it into an ADR, a requirement or scope, remove it from `brief.openQuestions`, re-render. It is a gate because a deferred decision is a bug in a spec. |305| `check` fails naming *the renderer's scaffold* | Those criteria/contracts were never authored. Rewrite them (`references/requirements-rubric.md`), or drop to `--level light` if this is a throwaway spec. |306| `render` refuses: "requirements/prd exists" | A previous render used `--prd`. Re-pass `--prd` to regenerate it, or `--no-prd` to delete it deliberately. |307| `check --semantic` exits 1 with no obvious cause | It is fail-closed. Run `review`, adjudicate every pair, `review --apply`, *then* `--semantic`. A re-render since the review also invalidates it. |308| `orchestrate --phase <p>` exits 2 | That phase's worklist does not exist yet; the message names the command that produces it. |309| Research returns nothing | Sharpen vague `candidateTech`/`competitors` and re-run. Then use your own WebSearch and pin the pages: `research --url <u,...>`. **Stop after two empty attempts** — record an assumption or an `openQuestion` and move on. A thin, honest SRD beats a fabricated citation. |310| Tests reference FR ids the SRD no longer has | A re-render renumbered them. Retag the tests; `verify` lists the stale ids. |311| A run is unexpectedly slow | `construct cache status`. A cold cache costs a full fetch per page; `--offline` works from the cache alone. Per-angle cost is in `evidence/meta.json` and at the foot of `EVIDENCE.md`. |312313## Common mistakes314315- **Treating a drill as grounding.** `web`/`oss`/`tech`/`so` PRINT. Only316 `research --url` / `research --docs-url` persist evidence you can cite.317- **Re-running `research` with fewer angles.** It rebuilds the dossier from318 exactly what you give it — always pass every angle, or earlier evidence is lost.319- **Rendering at the default `light` when a build is possible.** Switching later320 renumbers FR ids and invalidates test tags.321- **Editing a rendered `.md` and stopping there.** The next render overwrites it.322 Edit `SRD.json`, then `render --from-srd`.323- **Letting a subagent write the run folder.** One writer — you. Subagents return324 text.325- **Presenting before `check` passes.** A coverage percentage is not a gate; an326 unresolved 🧠 is.327328## How to know you're done329330The SRD is done when all of these hold — check them explicitly, don't assume:3313321. `construct check` exits 0.3332. Every `must` requirement has a failure-path criterion naming specific334 behaviour, not "an error is shown".3353. Every load-bearing decision (stack, datastore, build-vs-buy, the336 differentiators) cites evidence that actually says what the claim implies —337 you spot-checked at least three.3384. The data model and interfaces were *verified*, not left as the renderer339 inferred them.3405. A red-team round surfaced no new blocker.3416. Whatever is still unknown is written down as an assumption or an342 `openQuestion` — not quietly guessed.343344**The self-test:** could a developer who has never spoken to you build the345must-haves from this SRD alone, getting the contracts right rather than the gist?346If any answer needs a conversation, the SRD is not done.347348## Orchestration — route by harness349350Four phases fan out over per-unit, file-backed state: **research** (one researcher per351`analyze` gap), **claim-review** (one skeptic per `VERIFY.todo.json` pair), **adr-judges**352(a fixed 3-lens panel over ONE contested ADR) and **build** (one worktree-isolated builder353per ready task). `orchestrate` emits them from the run's CURRENT state, with absolute paths354and the real worklist units baked in:355356```357node scripts/construct.mjs orchestrate --out <run> [--phase research|claim-review|adr-judges|build] [--adr <id>] [--eco] [--list]358```359360| Your harness | How to run each phase |361|---|---|362| Has the Workflow tool | `orchestrate --phase <p>`, then `Workflow({ scriptPath: "<run>/orchestration/<p>.workflow.mjs" })` |363| Subagents, no Workflow tool | Same `orchestrate`; dispatch one subagent per batch per `<run>/orchestration/agents/<role>.md` |364| Eco mode, or no subagents | `orchestrate --eco` → follow `<run>/orchestration/RUNBOOK.md` sequentially |365366**Two rules survive every tier.** Subagents never write the run folder — they return367fragments and YOU fold them in (builders write code only in their own git worktree). And368fan-out is an optimization, never a requirement: every phase has a sequential fallback with369identical artifacts, so the gates are harness-independent. Patterns, output contracts and370budget guidance: `references/orchestration.md`.371372## What it produces (the SRD tree, under `--out`)373374```37500-overview/ VISION.md · SCOPE.md (+ 🧠 open decisions)376requirements/ FUNCTIONAL.md (FR-NNN · priority · Given/When/Then · [E#];377 an index linking each FR to its module PRD in modules mode)378 NON-FUNCTIONAL.md (NFR-NNN by category · metric · [E#])379 prd/PRD-FR-NNN-*.md (+ README index — only with --prd)380prd/ README.md · <module>/PRD.md (modules mode only: one PRD per381 module — full FR blocks, NFR refs, data/interface slices, deps)382architecture/ SYSTEM-CONTEXT.md · DATA-MODEL.md · INTERFACES.md383 decisions/NNNN-*.md (ADRs)384design/ PRINCIPLES.md · DESIGN-TOKENS.md (+ design-tokens.json) · COMPONENTS.md385 SCREENS.md · ACCESSIBILITY.md (complex only; --no-design to skip)386competitive/ LANDSCAPE.md (competitors + OSS prior art)387BUILD-PLAN.md · BUILD-PLAN.json (task DAG for the build phase; tasks carry their388 module in modules mode)389TRACEABILITY.md (FR ↔ module ↔ NFR ↔ ADR ↔ entity ↔ interface ↔ component ↔ screen)390evidence/ EVIDENCE.md · evidence.json · meta.json · ids.json (the [E#]391 ledger — do not hand-edit; it is what keeps citations stable)392VERIFY.md · VERIFY.todo.json · VERIFY.json (the claim-support worklist and its393 adjudicated ledger — written by `review` / `review --apply`)394orchestration/ <phase>.workflow.mjs · agents/<role>.md · RUNBOOK.md395 (written by `orchestrate`; `out/` is where subagents may return)396brief.json · SRD.json397```398399`evidence/`, `VERIFY.md` and `orchestration/` are retrieved or generated text —400`check` deliberately does not scan them for 🧠/TODO, so an evidence snippet can401quote anything without tripping the gate.402403`light` keeps it lean; `complex` adds the full NFR set, a second ADR, failure-404path acceptance criteria, the full traceability matrix and a **design-system405subtree** (`design/`: principles, tokens, components, screens/flows, an406accessibility contract — `--no-design` opts out). Add `--merge` for a single-file407`SRD.md` (always the full FR blocks, even in modules mode).408409## Optional local stacks (fully local, no API key)410411`construct semantic up` brings up a local Docker stack (Qdrant + Ollama + SearXNG); then412`research --angles market,oss,tech,semantic --semantic` re-ranks the gathered evidence by413embedding relevance. Nothing leaves the machine, and if the stack is down `--semantic` logs414a notice and keeps the lexical ranking.415416`construct firecrawl up` brings up the second, heavier stack (~3 GB, its own417`extract` profile — never started by `semantic up`). While it runs, every page418the research pipeline fetches is cleaned through Firecrawl's main-content419markdown instead of the built-in HTML stripper, which is what makes a420JS-rendered page yield any evidence at all. Also keyless. Every failure path421falls back to the built-in extractor and says so in the dossier notes, so the422worst case of a stopped stack is the behaviour you had before.423See `references/semantic-setup.md`.424425## References426427- `references/brainstorm-playbook.md` — the optional divergent step: generating candidate ideas across six angles and merging the kept ones into the brief.428- `references/interview-playbook.md` — how to elicit the brief, one question at a time.429- `references/brief-example.md` — a filled `brief.json`, the exchanges that produced its hardest fields, and what makes it work.430- `references/research-playbook.md` — picking angles and digging deeper to "good enough".431- `references/orchestration.md` — the three-tier dynamic-workflow model and the subagent patterns: research fan-out, red team, judge panel, claim-support review fan-out, build fan-out (and the one-writer rule). The fan-out patterns are emitted ready-to-launch by `construct orchestrate`.432- `references/adversarial-review.md` — the red-team checklist and its findings contract.433- `references/srd-authoring.md` — resolving 🧠 callouts, writing testable requirements and ADRs.434- `references/design-system-authoring.md` — enriching the `complex` design system: tokens, components, screens/flows and the accessibility contract.435- `references/requirements-rubric.md` — the ISO/IEC/IEEE 29148:2018 characteristics `check` holds requirements to, the two severities, and what a green gate does and does not mean.436- `references/acceptance-criteria.md` — bad→good Given/When/Then rewrites and measurable NFR metric patterns.437- `references/forbidden-patterns.md` — the phrasings that never survive review, and the shape that replaces each.438- `references/citation-format.md` — the `[E#]` grounding convention.439- `references/grounding-coverage.md` — what the advisory coverage report means and how to raise it.440- `references/build-playbook.md` — the build loop: task TDD, FR-tag convention, milestone gates, the milestone review.441- `references/verify.md` — what each `verify` check proves and what still needs eyes.442- `references/presenting.md` — step 7: what to say when you hand the SRD over, and how to report the gates honestly.443- `references/provider-apis.md` — how OSS issues/PRs are fetched per host, keyless.444- `references/web-discovery.md` — the layered keyless web search.445- `references/semantic-setup.md` — the optional local Docker stack.