vibe-spec-review — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited vibe-spec-review (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
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.
Audits every planning document before a line of code is written. Finds gaps, contradictions, untestable criteria, and missing boundaries that would cause failures, confusion, or rework during the build.
A bad spec is the most expensive bug in software. This skill finds it before it costs anything.
Always runs in Plan Mode. Never modifies files — read and report only.
The O'Reilly northstar is clear: "Most agent files fail because they're too vague." Vague specs produce vague code. Untestable criteria produce unverifiable builds. Missing boundaries produce agents that go off-script at the worst moment.
This skill is the last checkpoint before execution begins. It asks: if an agent read only these documents, would it build the right thing? If the answer is "maybe" — that's a finding.
This skill is never triggered by the user typing spec-review: alone. It is handed off from other skills at exactly the right moment:
vibe-brainstormInvoked by: the final step of vibe-brainstorm after BRIEF.md is written. Announcement: "BRIEF.md written. Running spec-review to check quality before architect:..." Scope: BRIEF.md only. Purpose: catch vague goals, untestable success criteria, missing user definition, and undefined constraints before they propagate into ARCHITECTURE.md and SPEC.md.
vibe-agentInvoked by: the final step of vibe-agent after AGENT_ARCH.md is written. Announcement: "AGENT_ARCH.md written. Running spec-review to validate agent design..." Scope: AGENT_ARCH.md + BRIEF.md if exists. Purpose: catch missing VerifierAgents, undefined HITL gates, hallucinated tools, agents with multiple responsibilities, and state ownership conflicts.
vibe-new-app or vibe-initInvoked by: the final step of vibe-new-app / vibe-init after vibe/ folder is created. Announcement: "vibe/ folder created. Running spec-review before first task..." Scope: SPEC.md + ARCHITECTURE.md + BRIEF.md + AGENT_ARCH.md (all that exist). Purpose: catch spec-architecture contradictions, missing acceptance criteria, undefined tech stack, empty boundary sections, and provisional SPEC.md warnings.
vibe-add-featureInvoked by: the final step of vibe-add-feature after FEATURE_SPEC.md is written. Announcement: "FEATURE_SPEC.md written. Running spec-review before feature build..." Scope: FEATURE_SPEC.md + SPEC.md (for contradiction check). Purpose: catch untestable feature criteria, missing scope boundaries, tasks without file assignments, and contradictions with existing SPEC.md.
Triggered by: spec-review: prefix in the user's message. Scope: all documents that exist in the project. No announcement needed — user explicitly requested it.
ls BRIEF.md AGENT_ARCH.md SPEC.md ARCHITECTURE.md \
vibe/SPEC.md vibe/ARCHITECTURE.md \
vibe/features/*/FEATURE_SPEC.md 2>/dev/nullBuild the audit list from what's found. Skip documents that don't exist. Never fail because a document is missing — just audit what's there.
If nothing exists:
"No planning documents found. Run brainstorm: to start."Stop.
Skip if BRIEF.md does not exist.
Read the full BRIEF.md. Check against references/BRIEF_RUBRIC.md.
("small business owners" = too vague = P1 / "marketing managers at B2B SaaS companies with 10-50 employees" = good)
Skip if AGENT_ARCH.md does not exist.
Read the full AGENT_ARCH.md. Check against references/AGENT_ARCH_RUBRIC.md.
(Orchestrator+Subagents for a 2-step pipeline = P1 over-engineering)
Skip if neither exists.
Read the full SPEC.md. Check against references/SPEC_RUBRIC.md.
Per the O'Reilly northstar, a complete spec covers six areas. Score each as present (✅) / partial (⚠️) / missing (❌):
Any missing area with P1 severity is a collective finding:
"Spec is missing [N] of the 6 O'Reilly core areas: [list]. These will cause agent confusion during build."
For each feature / requirement in SPEC.md:
Testability test: Can you write expect([something]).toBe([specific value]) from this criterion? If no — it's untestable.
Examples:
If SPEC.md contains ⚠️ PROVISIONAL (set by vibe-init):
"⚠️ P1: SPEC.md is marked PROVISIONAL — generated from code, not from original requirements. Human must verify it reflects actual intent before this review is considered complete."
Skip if neither exists.
Read the full ARCHITECTURE.md. Check against references/ARCHITECTURE_RUBRIC.md.
("write good code" in Always = P1 too vague)
Skip if no FEATURE_SPEC.md exists.
Read the FEATURE_SPEC.md for the current feature. Check against references/FEATURE_SPEC_RUBRIC.md.
Check for contradictions across all documents that exist.
BRIEF.md ↔ SPEC.md:
SPEC.md ↔ ARCHITECTURE.md:
AGENT_ARCH.md ↔ SPEC.md:
AGENT_ARCH.md ↔ ARCHITECTURE.md:
Read references/SPEC_REVIEW_REPORT.md for the output format.
Severity definitions:
The agent literally cannot build the right thing without this information.
Important to fix, but build can proceed with user's explicit acknowledgment.
Present findings clearly:
SPEC REVIEW — [Project Name] — [trigger source]
══════════════════════════════════════════════
Documents audited: [list]
Documents missing: [list or "none"]
FINDINGS
P0 — Critical ([N] found)
────────────────────────
[If none: "None — no critical gaps found ✅"]
P0-001 · [Document] · [Section]
──────────────────────────────
Issue: [Exactly what is wrong — specific, not vague]
Why: [What will go wrong in the build if this isn't fixed]
Fix: [Specific action — what to add/change/remove]
Example: [If helpful — show what good looks like]
[Repeat per P0]
P1 — Warnings ([N] found)
─────────────────────────
[If none: "None ✅"]
P1-001 · [Document] · [Section]
Issue: [What is weak or missing]
Fix: [Specific action]
[Repeat per P1 — grouped by document]
P2 — Notes ([N] found)
──────────────────────
[Inline list — one line each]
· [Document] — [issue] — [quick fix]
O'REILLY SIX CORE AREAS
────────────────────────
Commands: [✅ / ⚠️ partial / ❌ missing]
Testing: [✅ / ⚠️ / ❌]
Project structure:[✅ / ⚠️ / ❌]
Code style: [✅ / ⚠️ / ❌]
Git workflow: [✅ / ⚠️ / ❌]
Boundaries: [✅ / ⚠️ / ❌]
CROSS-DOCUMENT CONSISTENCY
───────────────────────────
[✅ No contradictions found]
[or list each contradiction as P0/P1]
VERDICT
───────
[✅ SPEC READY — 0 P0 findings. Proceed to [next step].]
[⚠️ SPEC HAS WARNINGS — 0 P0, [N] P1 findings above.]
[🔴 SPEC HAS CRITICAL GAPS — [N] P0 findings. See above.]
[If P0 or P1 found:]
Fix issues above, or say "continue anyway" to proceed
with findings logged to vibe/spec-reviews/[date].md.
Say "fix [P0-001]" to fix a specific finding now.Wait for user response.
Log all findings to vibe/spec-reviews/[YYYY-MM-DD]-[trigger].md. Update vibe/TASKS.md with a note:
⚠️ Spec review findings logged — [N] P0, [N] P1 unresolved
See: vibe/spec-reviews/[date]-[trigger].mdReturn control to the calling skill. Do not block. Do not repeat findings.
For each named finding — apply the fix from the Fix field. Modifies the relevant document (BRIEF.md / AGENT_ARCH.md / SPEC.md / ARCHITECTURE.md). After fixing: re-run only the affected check. Show updated result. If all P0s resolved: announce "P0 findings resolved — spec is ready."
Work through every P0 and P1 fix in order. Show each fix before applying it. Apply after confirmation. Re-run full review at the end.
Return control to calling skill with findings summary in one line:
[spec-review: N P0, N P1 found — logged to vibe/spec-reviews/]Save findings to vibe/spec-reviews/[YYYY-MM-DD]-[trigger-source].md regardless of whether fixes were applied.
Format: full report from Step 7.
Update vibe/DECISIONS.md:
---
## [date] — Spec review: [trigger source]
> P0: [N] · P1: [N] · P2: [N]
> Action: [fixed / continued with warnings / fully resolved]
> Report: vibe/spec-reviews/[date]-[trigger].md
---Read only. Never modifies documents unless the user explicitly says "fix [finding]". The default action is always to report and wait. Never silently modify a spec.
Every finding must be specific. "The spec is vague" is not a finding. "SPEC.md line 14: 'users should have a good experience' — untestable, no measurable criterion" is a finding.
P0 severity is reserved for build-breaking gaps only. Do not inflate findings. A missing code style section is P1, not P0. Reserve P0 for: missing users, untestable success criteria, stack mismatch, missing VerifierAgents, multi-writer state, missing auth pattern on auth system.
Never repeat findings the user has acknowledged. Once the user says "continue anyway", the findings are logged and closed. Do not surface them again in the same session.
Cross-document consistency always runs. Even if individual document checks are clean, contradictions between documents are where the most dangerous gaps hide. Never skip Step 6.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.