skills/compare-specs/SKILL.md
--- name: compare-specs description: Diff two specs produced by /generate-spec. Walks the 10-section template, builds a section-by-section change table, a mermaid sankey of additions/removals/changes, and a drift score. Optional PDF render. Use to compare initial vs post-phase-1 spec, or two competing drafts before commit. category: development argument-hint: [--pdf] <spec-a-path> <spec-b-path> allowed-tools: Read Write Edit Glob Grep Bash content-pipeline: - pipeline:input - platform:agnost
npx skillsauth add RonanCodes/ronan-skills skills/compare-specsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Reads two spec files, walks the 10 sections of the spec template, and emits a single comparison report. Common pairings:
spec-v1-*.md vs spec-v2-*.md in the same docs/specs/ directory (drift between phases of the same project).vaults/.../wiki/specs/<name>-spec-v1-fresh-*.md) vs the corresponding from-codebase spec in the repo (<repo>/docs/specs/spec-v2-from-codebase-*.md). This is the headline "what we said vs what we built" diff.Sister skills: /generate-spec (produces the inputs) and /compare-codebase-to-spec (audits drift between spec and code).
/compare-specs docs/specs/spec-v1-fresh-2026-05-02.md docs/specs/spec-v2-from-codebase-2026-08-15.md
/compare-specs --pdf <a> <b>
Both arguments are paths. By convention A is older / planned, B is newer / actual, but the report works either way.
Versions are read from each spec's frontmatter.
Path rules:
docs/specs/ directory: write the report next to them as <repo>/docs/specs/diff-v<A>-vs-v<B>-YYYY-MM-DD.md.docs/specs/diff-vault-genesis-vs-v<B>-YYYY-MM-DD.md and add a cross-vault link from the vault spec.wiki/specs/ directories: write to the same vault as wiki/specs/diff-<A>-vs-<B>-YYYY-MM-DD.md.repo fields, abort: comparing across projects is meaningless.If --pdf, render via /generate pdf and print both paths.
Read frontmatter of both files. Confirm:
title, version, mode fields. repo may be empty on a vault-genesis spec; that is valid.repo, they must match. If they disagree, stop and surface the mismatch.repo populated, that is the lifecycle case (genesis vault spec vs post-graduation repo spec). This is a meaningful comparison: it shows what we said we'd build vs what we built. Annotate the report header with this.For each of the 10 template sections, extract the content from both specs. For sections that contain tables (Outcomes, Scope, Constraints, User Stories, Decisions, Plan, Verification), parse the rows and compare by stable key:
| Section | Stable key | |---|---| | Constitution | principle name (bold-prefixed) | | Outcomes | outcome text | | Scope | row (in/out preserved) | | Constraints | type + constraint | | User Stories | story ID (US-NNN) | | Architecture | diagram name | | Decisions | ADR ID | | Plan | milestone ID | | Verification | story ID | | Open Questions | question text |
Classify each row as:
For prose sections, do a structural diff: list new headings, removed headings, materially changed paragraphs.
Write the report using this template:
---
title: Spec Comparison <A> vs <B>
date: YYYY-MM-DD
spec-a:
path: <relative path>
version: v<A>
mode: <mode>
date: <date>
spec-b:
path: <relative path>
version: v<B>
mode: <mode>
date: <date>
repo: <shared repo>
drift-score: <0-100>
---
# Spec Comparison: v<A> vs v<B>
> One-sentence summary: e.g. "v1 was the up-front plan, v2 is the from-codebase reflection 4 months later. Drift score 32 / 100."
## Drift score
Calculated as `(added + removed + changed) / total * 100`, rounded.
| Bucket | Count |
|---|---|
| Added (in B only) | N |
| Removed (in A only) | N |
| Changed (key matches, content differs) | N |
| Unchanged | N |
| **Total tracked items** | N |
## Change overview
```mermaid
sankey-beta
v<A> spec, Unchanged, N
v<A> spec, Removed, N
v<A> spec, Changed, N
v<B> spec, Unchanged, N
v<B> spec, Added, N
v<B> spec, Changed, N
```
## Section-by-section
### Constitution
| Status | Principle | v<A> | v<B> |
|---|---|---|---|
| ➕ added | <name> | | <text> |
| ➖ removed | <name> | <text> | |
| 🔄 changed | <name> | <old text> | <new text> |
| ✅ unchanged | <name> | <text> | <text> |
(Repeat the table format for each section. Omit unchanged rows when the section has more than 5 unchanged items — replace with a single "✅ N items unchanged" line to keep the report readable.)
### User Stories
Extra column: did the acceptance criteria change?
| Status | ID | Title | Criteria changes |
|---|---|---|---|
| 🔄 changed | US-003 | <title> | +2 / -1 / 4 unchanged |
### Architecture
Diagram-by-diagram. If the mermaid source changed, embed both side-by-side and call out the structural delta in prose underneath.
### Decisions (ADRs)
If an ADR was reversed or replaced, mark with `↩️ reversed`. Cross-link the new decision.
## Notable themes
Free-form prose section. Pick out 2-5 themes the diff reveals. Examples:
- "Scope grew: 4 new stories, 0 removed."
- "ADR-002 was reversed: we tried X, fell back to Y."
- "Verification gaps closed: 3 stories went from manual demo to automated test."
Keep this honest. If drift is low and boring, say so.
## Recommended next actions
| Action | Why |
|---|---|
| Update spec-a status to `superseded` | Now that v<B> exists |
| Run `/compare-codebase-to-spec` against v<B> | To check current code matches |
## Sources
- `<path-a>` — spec A
- `<path-b>` — spec B
--pdf, run /generate pdf <output-path> and print the PDF path.superseded in its frontmatter."development
Close the loop on a Linear ticket when its work ships - move the status and post a deploy comment with the PR link, what shipped, and a try-it link, mentioning the collaborator. Used as the tail of /ro:linear-nightshift for every merged mirror, or manually after an ad-hoc build. Triggers on "linear update", "update the linear ticket", "mark NUT-x done", "tell eoin it shipped", "/ro:linear-update".
devops
Run a night-shift against a collaborator's Linear board. Pulls the team's Grilled tickets (/ro:linear-grill moves a ticket to Grilled once its questions are answered), VERIFIES the questions were actually answered (unanswered → bounce the ticket to the "Question for <name>" state), mirrors verified tickets to ephemeral GitHub issues with ready-for-agent, then runs the standard /ro:night-shift machinery on GitHub. Tail-calls /ro:linear-update for everything that merged + deployed. Triggers on "linear nightshift", "nightshift linear", "drain the linear board", "run the shift off linear", "/ro:linear-nightshift".
development
Grill a collaborator's Linear tickets and move every processed ticket to where it belongs. Resolves the board from the repo's .ro-linear.json, reads the collaborator's Backlog / Ready-for-agent issues, then per ticket either posts 3-5 decision-extracting questions (state moves to "Question for <name>") or confirms it build-ready (state moves to "Grilled", the gate /ro:linear-nightshift consumes); shipped-and-confirmed tickets close as Done. The async-collaborator counterpart of /ro:day-shift for people who never touch GitHub. Triggers on "grill linear", "grill eoin's tickets", "linear grill", "add questions to the linear tickets", "/ro:linear-grill".
development
--- name: about-page description: Add a standard About page to any web app, what it is, the tech stack, and an FAQ, wired into a footer link with a sticky footer. Built with Spartan + Tailwind (the canonical component layer) and falls back to semantic HTML so it ships reliably. Use whenever building, polishing, or shipping an app, every app should have one. Triggers on "add an about page", "about page", "footer about link", or as a standard step in app build/polish. category: frontend argument-h