plugins/src/base/skills/spec-conformance/SKILL.md
Verifies that shipped work matches its spec section-by-section — acceptance criteria, Out of Scope, Technical Approach, Validation Journey assertions, and any explicit deliverables. Builds a coverage matrix mapping each requirement to evidence, flags scope creep separately from misses, and produces a verdict (CONFORMS / PARTIAL / DIVERGES). Runs during the verification phase alongside empirical system verification.
npx skillsauth add codyswanngt/lisa spec-conformanceInstall 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.
Compare shipped work against its spec section-by-section. This is the "accountant lens" — did the work ship exactly what was written, nothing more, nothing less? It is NOT UX review (that's product-specialist) and it is NOT empirical system verification (that's verification-specialist). Run it alongside those, not instead of them.
Determine the source of truth for this work. Check in this order:
.claude/plans/<name>.md), JIRA key (e.g. PROJ-123), Linear key, GitHub issue URL, or PRD path passed as $ARGUMENTS..claude/plans/ for an active plan matching the branch name.If none of the above resolves, stop. Do not guess what the spec was. Report: "No spec source found — pass a plan file, ticket key, or PR URL."
Based on the source, load the full spec:
| Source | How to Load |
|--------|-------------|
| Plan file (.md) | Read the file |
| JIRA key, GitHub issue ref, or Linear identifier | Invoke /tracker-read <ref> (vendor-neutral; dispatches to /jira-read-ticket, /github-read-issue, or /linear-read-issue per .lisa.config.json tracker) to get the full context bundle (primary item + epic / project / parent + linked items) |
| PRD | Read the file or fetch via Notion / Confluence MCP, or gh issue view for a GitHub PRD |
Parse the spec into a structured requirement list. Do NOT skip sections — every requirement becomes a row in the coverage matrix.
Sections to extract:
| Section | What to Extract | Classification |
|---------|-----------------|----------------|
| Acceptance Criteria | Each Gherkin scenario or bullet | acceptance |
| Out of Scope | Each excluded item | excluded (flags scope creep) |
| Technical Approach | Each concrete implementation commitment (not narrative) | technical |
| Validation Journey Assertions | Each Assertion: bullet | assertion |
| Deliverables | Each explicit deliverable (migration, doc, endpoint, script) | deliverable |
| Plan file tasks | Each task marked complete in the plan | task |
| Linked blocker resolutions | Each is blocked by that required work in this ticket | blocker |
If an acceptance criterion is not in Gherkin, still extract it as a requirement — but flag it as LOW_SPECIFICITY so the verdict downgrades.
Downgrade rule: if any LOW_SPECIFICITY requirement exists, the maximum possible verdict is PARTIAL unless the spec is tightened and re-evaluated.
Skip narrative prose (Context / Business Value) — it isn't directly verifiable. Reference it only when explaining a miss.
Gather evidence of what was actually shipped:
BASE_BRANCH="$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@')"
git log "${BASE_BRANCH}"..HEAD --oneline
git diff "${BASE_BRANCH}"...HEAD --stat
git diff "${BASE_BRANCH}"...HEAD -- <file>
git diff "${BASE_BRANCH}"...HEAD -- '**/*.test.*' '**/*.spec.*'
verification-specialist if available (proof artifacts, API captures, UI screenshots, DB queries). If that report isn't in context, ask the caller for it before proceeding — do not substitute reading code for running the system.gh pr view --json title,body,files if a PR exists.Do NOT run the system yourself — that's the verification-specialist's job. Your job is to map their evidence to the spec.
For every requirement extracted in Phase 2, produce one row:
| Column | Value |
|--------|-------|
| Requirement ID | Stable identifier (e.g. AC-1, OOS-2, ASSERT-3) |
| Classification | acceptance / excluded / technical / assertion / deliverable / task / blocker |
| Requirement Text | Verbatim from spec |
| Evidence | Specific pointer — file:line, test name, verification report section, PR file, screenshot name |
| Status | MATCH / PARTIAL / MISSING / SCOPE_CREEP_VIOLATION |
| Notes | One line — why partial, what's missing, or where evidence is thin |
MATCH — requirement is implemented AND there is empirical evidence it works (test + verification report).PARTIAL — implementation exists but evidence is incomplete (e.g. code present, no test; or test present, no run-time verification).MISSING — requirement has no corresponding implementation OR no evidence at all.SCOPE_CREEP_VIOLATION — used for excluded classification only. An Out-of-Scope item appears to have been shipped anyway. This is a different failure than a miss — it means the agent exceeded the spec.Separately from the matrix, scan the diff for work NOT traceable to any requirement. For each such change:
UNTRACEABLE_CHANGE (not necessarily wrong — refactors often land here — but MUST be surfaced)Untraceable changes are not automatic failures. They become findings the human reviews.
Produce exactly one verdict:
CONFORMS — every requirement is MATCH. No SCOPE_CREEP_VIOLATION. Untraceable changes, if any, are clearly refactors or test support.PARTIAL — some requirements are PARTIAL but none are MISSING or SCOPE_CREEP_VIOLATION. Work is mostly there but evidence is thin.DIVERGES — at least one requirement is MISSING, OR at least one SCOPE_CREEP_VIOLATION exists, OR there are substantive untraceable changes that materially alter behavior.A verdict of PARTIAL or DIVERGES blocks task completion. The caller must resolve the gaps (implement the miss, remove the creep, add the missing evidence) before re-running.
Structure the report so it can be pasted into a PR comment or JIRA ticket:
## Spec Conformance Report
**Spec source:** <plan file / JIRA key / Linear / GitHub issue / PRD>
**Shipped scope:** <N commits, M files, K tests on branch <branch> vs <default-branch>>
### Coverage Matrix
| ID | Class | Requirement | Evidence | Status | Notes |
|----|-------|-------------|----------|--------|-------|
| AC-1 | acceptance | [text] | [pointer] | MATCH | |
| AC-2 | acceptance | [text] | — | MISSING | No corresponding code or test |
| OOS-1 | excluded | [text] | src/foo.ts:42 | SCOPE_CREEP_VIOLATION | Added anyway |
| ASSERT-1 | assertion | [text] | verification-report §2 | PARTIAL | Asserted in code, not run in verification |
### Untraceable Changes
- src/utils/helpers.ts — extracted shared regex constant (refactor, no behavior change)
- src/auth/session.ts — added retry logic (NOT IN SPEC — verify intentional)
### Verdict: CONFORMS | PARTIAL | DIVERGES
**Matches:** N/Total
**Partial:** N
**Missing:** N
**Scope creep violations:** N
**Untraceable changes flagged for review:** N
### Required Actions (if PARTIAL or DIVERGES)
1. [specific action — implement X, remove Y, add test for Z, capture evidence for W]
2. ...
MATCH based on the presence of code alone — evidence means test + runtime observation.excluded.DIVERGES for spec inadequacy until criteria are added.documentation
Onboard a user to the project via its LLM Wiki. Interviews the user about themselves in relation to the project, captures that to project-scoped memory only, then gives a guided tour of what the project is and sample questions they can ask. Use when someone is new to the project or asks to be onboarded. Read-mostly — it does not open PRs or write PII into the wiki.
documentation
Migrate an existing, hand-rolled wiki implementation onto the lisa-wiki kernel — phased and compatibility-first, with a strict no-loss guarantee. Use when adopting lisa-wiki in a repo that already has its own wiki/, ingest skills, docs, or roles. Renaming things into the canonical shape is fine; losing functionality or data is not. Ends by running /doctor.
development
Health-check the LLM Wiki. Reports orphan pages, contradictions, stale claims, broken internal links, missing index/log coverage, structure-manifest violations, and secret/tenant leaks. Use periodically or before hardening a wiki. Read-only — it reports findings, it does not fix them.
testing
Ingest source material into the LLM Wiki. With an argument (URL, file path, or prompt) it ingests that one source; with no argument it runs a full ingest across every enabled non-external-write source. Routes to the right connector, then runs the ordered pipeline (source note → synthesis → index → log → verify → state → commit/PR). Use whenever new knowledge should enter the wiki.