Skip to content
Back to skills

Spec Report Format

ASecurity

Report structure, SR-id rules, reviewer/challenger/verifier/fixer output shapes, outcome enum, and terminal statuses for the /superutils:spec-review triage pipeline. Load when reading or writing a spec-review report. (Distinct from qa:report-format, which is the QA test-report format.)

  • 5 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 1, 2026
developmentgit

Works with

  • terminal
  • cli

Security analysis

A100/100

Scanned September 21, 2026

npx -y skills add AppVerk/av-marketplace --skill spec-report-format --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Spec Report Format?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Spec Report Format
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/appverk-spec-report-format/badge)](https://www.skillsdirectory.com/skills/appverk-spec-report-format)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: spec-report-format
description: Report structure, SR-id rules, reviewer/challenger/verifier/fixer output shapes, outcome enum, and terminal statuses for the /superutils:spec-review triage pipeline. Load when reading or writing a spec-review report. (Distinct from qa:report-format, which is the QA test-report format.)
---

# Spec-Review Report Format

## Reviewer finding shape (panel lenses; one JSON object)

```json
{
  "findings": [
    {
      "severity": "critical|major|minor|nit",
      "location": "<verbatim ## heading text, or empty when locationless>",
      "description": "<the defect, citing the text>",
      "proposed_fix": "<concrete edit instruction or replacement text>",
      "needs_decision": false
    }
  ],
  "rejected": ["<one line per self-falsified candidate>"]
}
```

Panel reviewers never emit SR ids or fingerprints — identity is
orchestrator-owned; the fix-coherence verifier echoes only the ids it was given.

## Challenger verdict shape

```json
{"sr_id": "SR-007", "verdict": "uphold|refute", "justification": "<one paragraph>"}
```

## Verifier output shape (`fix-coherence` lens; one JSON object)

```json
{"resolved": [{"sr_id": "SR-003", "resolved": true, "reason": "<one sentence>"}],
 "findings": [{"severity": "major", "location": "<## heading>", "description": "…",
               "proposed_fix": "…", "needs_decision": false,
               "fix_induced": true, "introduced_by": ["SR-003"]}],
 "rejected": ["<one line per self-falsified candidate>"]}
```

`resolved` carries exactly one entry per landed SR of batch A (`applied`);
declined, fix-failed and accepted-risk entries are never in the list, judged
against the SR description alone (the verifier never holds a proposed fix). The
orchestrator checks the id set: a batch A SR missing from it is treated as
unresolved and enters batch B marked `re-fix`, and the omission is noted under
Coverage.
`findings` are the defects the edits introduced; each names the SR ids whose
edits introduced it. The verifier's `rejected` list is recorded like a panel
reviewer's, labelled with the `fix-coherence` lens id.

## Fixer output shape (no writes — edit pairs only)

```json
{"edits": [{"sr_ids": ["SR-007", "SR-011"], "old": "<exact current text>",
            "new": "<replacement>"}],
 "growth": {"net_lines": 12, "drivers": ["SR-007"]},
 "notes": "<per-SR reasons when no unique pair could be produced>"}
```

A pair lists every SR it resolves in `sr_ids`; several pairs may share an SR.
`growth.net_lines` is the fixer's own estimate of the batch's net line delta
and `growth.drivers` the SR ids whose pairs account for most of it — advisory,
shown at the gate beside the measured figure. An SR that no returned pair lists
is `fix-failed`; the reason belongs in `notes`.

## SR ids and anchors (one run)

- SR ids are assigned once per registry entry, in discovery order: panel order
  as logged, then each reviewer's own output order; fix-induced findings from the
  verifier take the next ids. Every run starts at SR-001. Ids are never reused
  across runs — there is no registry to continue.
- Location anchor: nearest enclosing `##` heading slug (GitHub-style: lowercase,
  spaces→hyphens, punctuation stripped; duplicates get `-2`, `-3`).
  Pre-first-heading content → `__preamble__`; locationless/document-level →
  `__document__`; cross-section → first-cited section's slug, **with the other
  section named in the canonical phrase** (without it, two cross-section findings
  sharing a first-cited heading can false-merge).
- Canonical phrase: an orchestrator-derived ≤10-word identity phrase; the
  original description is never replaced.
- Duplicate matching is within the panel only: slug equality plus an
  orchestrator yes/no equivalence judgment, logged in the report. Duplicates merge
  to one entry at maximum severity, recording every contributing lens.

## Markers

- `re-derive` — the pair never landed (mismatch, no pair, or fixer failure). The
  fixer derives a fresh pair against the current text; a decided `new` text is
  preserved.
- `re-fix` — the batch A edit landed and the verifier judged the defect
  unresolved (or omitted the SR). `old` targets the applied text and the fix
  must change it. For a user-decided entry this is a new decision: the fixer may
  depart from the decided text; in default mode the approve gate shows the
  departure, in `--no-approve` the entry is re-asked before the fixer runs.

## Outcome enum (exhaustive — every emitted finding gets exactly one)

`applied` (a batch A edit landed) · `applied (not re-reviewed)` (a batch B edit
landed, or a batch A edit landed and no verifier read it) · `fix-failed` (a
batched fix did not land — pair mismatch, no pair, or fixer failure; after batch
B it stays and makes the run incomplete) · `refuted` (a critical a challenger
refuted) · `reported-only` (minors and nits, and sub-major needs-decision
entries — never batched) · `accepted-risk` (user chose keep-as-is) ·
`pending-decision` (`--auto` skipped a needs-decision entry) · `declined` (user
deselected the group at the gate) · `confirmed (not fixed — stopped)` (a major+
entry a stop left unfixed, including a verifier-unresolved batch A entry whose
batch B never ran — its Residuals line says the edit did land).

## Terminal statuses

`TRIAGED` · `TRIAGED (incomplete)` ·
`STOPPED(user-declined | budget | interaction-unavailable | external-edit)`.
`TRIAGED (incomplete)` is set by any of: a lens not returned, a verifier that was
dispatched and did not return after its retry (a skipped Stage 4 is not such a
case), a `fix-failed` entry after batch B, a `pending-decision` entry. A stop is
never success. Every verdict is advisory.

## Report header and skeleton

Path: `docs/superpowers/specs/reviews/<spec>-review.md`. Re-run detection reads
the `post-loop` hash line, so both hash lines are mandatory and verbatim.

`<label>` is one of three, exhaustively: `Re-reviewed (advisory)` when the batch
A verifier returned · `Not re-reviewed (verifier not returned)` when it was
dispatched and did not · `Not re-reviewed (no batch A edits)` when Stage 4 was
skipped because batch A applied nothing. Any of the three is followed by
`K edits applied without re-review` when any `applied (not re-reviewed)` entry
exists.

```markdown
# Spec-review report — <spec>.md
**Mode:** default | --no-approve | --auto · **Budgets used:** <D> of <max> dispatches, <S> of <budget> active seconds · **Terminal status:** `<status>` · **Verdict label:** <label>
**Spec hash (pre-loop):** <sha256>
**Spec hash (post-loop):** <sha256>
**Spec lines:** <before> → <after>
## Panel — lenses, units
- Units: the spec's `##` headings, in order.
- Lenses selected, each with its one-line selection rationale; lenses the rules
  did not name are listed under Coverage.
- Merges: one line per merged entry — `SR-0NN ← [lens-a, lens-b] · <judgment>`.
| SR | severity | lenses | needs-decision | outcome |
## Critical challengers
| SR | verdict | note |
## Verification of batch A
| SR | resolved | reason |
Fix-induced findings: | SR | severity | introduced by | outcome |
## Decisions
| SR | decision | edit text (verbatim) |
## Residuals
- confirmed (not fixed — stopped) · fix-failed · pending-decision · declined · accepted-risk · applied (not re-reviewed) · reported-only
- Ordered most- to least-serious; `confirmed (not fixed — stopped)` and `fix-failed` entries carry their full description, not just an SR id, and a `fix-failed` entry quotes the fixer's `notes` reason.
## Coverage
- Lenses not selected · not returned (with reasons) · standing blind spots (intent, external facts, unstated requirements)
## Rejected by the panel and the verifier (self-falsification)
- `- [lens] candidate — why it was refuted`; `None` when empty. Never rendered as findings.
## Residual risks
## Recovery
- Loop-touched files, snapshot path; never `git restore` on the spec
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.