Create a decision-support map for scope review before implementation. Do not inspect Git diffs, collect implementation evidence, persist approval, or modify the target repository.
Workflow
- Read the supplied requirements in any format.
- Normalize every requirement into the manifest below. Preserve source wording in
fullText; do not invent behavior. - Ask for clarification when uncertainty changes scope. Otherwise record uncertainty in
assumptionsoropenQuestionsand choose the matching non-ready status. - Add hierarchy edges. Add cross-links only when explicit or high-confidence; set
inferred: truefor inferred links. - Save the manifest outside the target repository.
- Run
node scripts/render-requirements-map.mjs manifest.json. - Return the two absolute paths printed by the renderer. Do not open a browser.
The report uses the Tailwind v4 Play CDN and therefore needs internet access to compile its embedded Tailwind source in the browser. The remote script can read report content, so do not use this skill for confidential requirements. tailwind.css is also emitted as an editable copy of that exact source.
Semantic Model
Use goal → scenario → given → when → then. Represent an And clause as its inherited clause type: an And after Given is given, after When is when, and after Then is then. Keep the original And wording in fullText.
Every source requirement must appear in a node. Use statuses only from:
ready: clear enough for scope reviewassumption: depends on a recorded assumptionambiguous: has more than one material interpretationconflict: contradicts another requirementmissing-outcome: lacks an observable result
This readiness is about requirement clarity, not implementation completion.
Manifest Schema
The renderer accepts one strict JSON object. Unknown fields are rejected.
{
"title": "Account recovery scope",
"summary": "Stakeholder review of the recovery journey.",
"nodes": [
{
"id": "goal-recovery",
"type": "goal",
"title": "Restore account access",
"meaning": "A locked-out customer can regain access.",
"fullText": "Customers can restore access to their account.",
"status": "ready",
"scenario": "recovery",
"assumptions": [],
"openQuestions": []
}
],
"edges": [
{
"source": "goal-recovery",
"target": "scenario-email",
"type": "contains",
"inferred": false
}
]
}
Rules:
- Root fields are exactly
title,summary,nodes, andedges. - All strings must be non-empty. IDs must match
[A-Za-z0-9][A-Za-z0-9_-]{0,63}and be unique. nodescontains 1–50 objects with exactly the shown node fields.- Node
typeisgoal,scenario,given,when, orthen. - Node
statususes the documented enum above. scenariois a stable grouping key, including for goal and scenario nodes.assumptionsandopenQuestionsare arrays of non-empty strings.edgescontains objects with exactlysource,target,type, andinferred.- Edge
typeiscontains,precedes, orrelates;inferredis Boolean. - Edge endpoints must be different existing node IDs. Duplicate edges are rejected.
- Use
containsfor hierarchy,precedesfor clause order, andrelatesonly for justified cross-links. - Include exactly one goal and at least one scenario node. Every other node must share a grouping key with exactly one scenario node.
- Connect every node to the goal through directed
containsandprecedesedges.relatesdoes not establish hierarchy. containssupports goal-to-scenario and scenario-to-clause edges.precedesconnects clauses in non-decreasing Given/When/Then order within one scenario.
Renderer
node scripts/render-requirements-map.mjs manifest.json
node scripts/render-requirements-map.mjs manifest.json --output-dir /absolute/new/directory
The optional output directory must be absolute, must not exist, and must not alias the input. By default, a unique directory is created under $TMPDIR. Publishing is atomic; failures clean up staging files.