From livespec-impl-beads
Detect impl→spec drift heuristically (LLM-driven) and hand off each finding to /livespec:propose-change with user consent. Required heavyweight authored skill per livespec/SPECIFICATION/contracts.md §"Heavyweight authored skills (6)". Invoke as `/livespec-impl-beads:capture-spec-drift`.
How this skill is triggered — by the user, by Claude, or both
Slash command
/livespec-impl-beads:capture-spec-driftThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Asymmetric counterpart to `capture-impl-gaps`. Where impl-gap detection
Asymmetric counterpart to capture-impl-gaps. Where impl-gap detection
is mechanical, drift detection is heuristic — the implementation may
have evolved beyond what the spec documents, in ways no static
pattern-match can flag. The skill drives an LLM-assisted comparison
between the canonical Specification (via the Spec Reader) and the
working impl tree, surfaces each candidate finding to the user, and
hands the confirmed findings off to /livespec:propose-change
via the cross-boundary handoff (red-edge handoff 1 per
livespec/SPECIFICATION/contracts.md §"Cross-boundary handoffs").
<spec-root>/ containing ratified spec content at the path
declared in .livespec.jsonc (default: SPECIFICATION/).<spec-root>/)./livespec:propose-change cross-boundary handoff requires it.Use the Spec Reader to load the current specification:
from livespec_impl_beads.spec_reader import read_current_specification
from pathlib import Path
snapshot = read_current_specification(spec_root=Path("SPECIFICATION"))
The snapshot is the "what the project says it does." The impl tree is "what the project actually does." Drift is the delta.
Scan the consumer project's impl tree (excluding <spec-root>/,
.venv/, _vendor/, generated artifacts) for:
# spec:, etc.).For each candidate, ask:
Is this behavior reflected in the Specification? (yes / no / partial / skip)
yes — no drift; move on.no — drift exists; behavior is not in the spec. Proceed to Step 3.partial — drift exists; spec captures some but not all of the
behavior. Proceed to Step 3 with a "refinement" framing.skip — defer judgment.For each no / partial finding:
<spec-root>/?")./livespec:propose-change --spec-target SPECIFICATION/ --topic <slug> --body <draft>
The proposed-change file lands under <spec-root>/proposed_changes/
awaiting a subsequent /livespec:revise pass.
When all candidates are processed, print a summary:
/livespec:propose-change,
not here.<spec-root>/proposed_changes/ directly. The
handoff invocation is the surface contract./livespec:propose-change.capture-impl-gaps.Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub thewoolleyman/livespec-impl-beads --plugin livespec-impl-beads