specification-capture — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited specification-capture (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Iron law: every issue gets the four elements (non-goals, failure modes, interface contracts, risk map) in the journal before PLAN. Invoked with issue context, journal path, and invocation reason (Per-invoker scope below). Returns the ## Captured Specification payload from references/specification-journal-format.md after writing and re-reading .decisions/issue-{N}.md. Permitted skips: elements outside the invoker's scope row; the risk map when specFirst.riskMap is false (written as disabled — specFirst.riskMap=false); elements the journal already holds for an unchanged issue.
Issue context, journal path (<journal dir>/issue-{N}.md, the journal dir being what bin/journal-dir.sh prints; never a hand-built .decisions/), invocation reason (start | design | brainstorm). Any missing: halt with SPEC_CAPTURE_BLOCK: missing input <name>. Toggle: "${CLAUDE_PLUGIN_ROOT:-plugins/flow}/bin/cascade-resolve.sh" --default true '.specFirst.riskMap'.
Run bin/journal-read-section.sh --file "$JOURNAL" --heading '## Specification' and record which of ### Non-goals, ### Failure modes, ### Interface contracts, ### Risk map exist. All four present and the issue not newer than the journal (staleness rule in the reference): return verbatim. Otherwise fill only the gaps.
Cues. Non-goals: ## Non-goals, ## Out of scope, "Does NOT". Failure modes: ## Failure modes, ## Error cases, "timeout", "fallback". Interface contracts: ## API, ## Schema, ## Contract, type definitions, signatures. Risk map: ## Risks, ## Tricky parts, "edge", "subtle", "off-by-one".
Verbatim matches are extracted-from-issue; never prompt for what the issue states.
Draft each missing element, then surface one blocking six-field escalation per element (never bundled) via AskUserQuestion per references/escalation-format.md. Options: (1) accept draft, (2) edit, (3) reject (update the issue first). Recommend (1).
Risk map draft: 2-6 rows from the issue and the touched files. Each: where the logic is likeliest subtly wrong; what the plausible wrong version does (reversed order, off-by-one, wrong precedence, wrong empty case); one input where right and wrong differ.
Write ## Specification per the reference shape (replace if present, append otherwise). All four failure-mode categories are required; a non-applicable one is none — {reason}, never blank.
Persist it with bin/journal-append.sh --file "$JOURNAL" --replace-heading '## Specification' - (on stdin), never Write: an unlocked body write can be published over by the manifest writer's rename. Non-zero exit → SPEC_CAPTURE_BLOCK: journal write failed (exit {code}). Re-read with the Step 1 command; absent → SPEC_CAPTURE_BLOCK: journal write verification failed.
Return the ## Captured Specification payload; consumers cite subsections as Non-goals touched, Failure modes covered, Interface contract, Risk areas.
commands/start.md Phase 1: all four (risk map exempt when specFirst.riskMap is false); partial = BLOCK.commands/design.md Phase 1: non-goals + interface contracts; risk map recommended.commands/brainstorm.md Phase 1: non-goals only, captured before generating approaches.commands/debug.md Phase 3 (via goal-contract-capture): outcome + acceptance criterion (the reproducing test) + root-cause constraints; full specification skipped.The invoker MUST verify (any failure: halt, re-invoke):
## Specification.### Non-goals, ### Failure modes, ### Interface contracts present and non-empty (none — {reason} allowed per failure-mode category).### Risk map is a 2-6 row table, or exactly disabled — specFirst.riskMap=false.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.