Reframe
A Claude Code and Codex plugin that scaffolds AI-native development practices into new projects. jig adds a repeatable spec, implementation, review, and memory workflow to AI-assisted software projects.
npx -y skills add ramboz/jig --skill reframeAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 4 stars4 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Re-baseline a jig corpus onto a moved load-bearing reference by drafting a keystone ADR and an affected-artifact disposition manifest. Use when a vendor/API contract moved and specs and decisions must be re-anchored. Auto-triggers when you say reframe onto this, we changed direction, the design moved, or re-baseline the project; invoke explicitly as `/jig:reframe`. Defers to any other installed skill whose description identifies it as handling project re-baselining or migrating onto a new reference. Does not defer to the generic built-in. Do not use for adopting jig (use `/jig:migrate`), cleanup against a fixed reference (use `jig:refactor`), changing one decision (use `adr.py supersede`), or cross-artifact drift detection (use `/jig:analyze`).
SKILL.md
18.8 KB, as published. Nobody here has run it
Spec 067 introduces this skill; ADR-0024 decides its shape. Reframe is a lightweight correction capability over the lifecycle spine (ADR-0023 §4), not a new gated lifecycle member: it has no
transitionand no state machine of its own — its arc (recognize → decide dispositions → execute) orchestrates the ADR and spec lifecycles it spawns, and every gate it relies on (the keystone ADR's frame-critiqueaccept; the review passes on the retrofit specs) belongs to those lifecycles. Shipping as its own skill is a user-facing-surface choice — a deliberate, named operation a user reaches for — not a lifecycle one.Like
/jig:clarifyand/jig:explain, reframe is a judgment skill — it ships no.pyhelper. The determinism it needs (reserve the keystone ADR, reserve retrofit specs) it borrows from the existingadr.py/workflow.pyscaffolding; the corpus read and the drafting are model judgment. Its testable surface is structural (this SKILL.md's contract: the keystone-ADR-via-adr.py newflow, the disposition vocabulary, the coverage-floor shape, the deferral language, registration). The quality of the corpus read and the honesty of a given coverage floor are judgment, exercised by this prompt and by the keystone ADR's frame-critiqueacceptgate — not something a unit test can assert (the accepted gap for every judgment-only jig skill).
What this skill does
jig keeps work consistent with prior decisions: every spec and ADR is a durable record, and new work reads the accepted corpus as authoritative. That is jig's strength — and its blind spot when a load-bearing premise changes from outside the system. A team drops a new design (or contract, or vision) into the repo intending to retrofit onto it; but the corpus already encodes the old premise as settled truth, so the new artifact enters as an inert file with no authority and the consistency machinery faithfully carries the dead premise forward — the agent patches at the edges instead of re-baselining.
A load-bearing reference is any authoritative external input the corpus is
premised on: a design system, a test-infrastructure choice, a vendor / API
contract, a compliance regime, a target platform, or a product-positioning /
strategic-vision shift. A reframe re-anchors the corpus to one that has
moved. /jig:reframe, given the new reference:
- Reads the accepted corpus against the reference (the corpus read).
- Drafts the keystone reframe-ADR via
adr.py new— elevating the new reference from an inert file to an accepted decision, superseding the old premise, and carrying the re-baselining manifest. - Assigns every affected artifact a disposition in that manifest (no
TBD), each routing to an operation that already exists. - States a two-level coverage floor — what corpus was scanned, at what
granularity, and what was not — so a partial read is visible at the ADR's
acceptgate rather than silently carrying a dead premise forward under fresh authority.
A competent session, handed the accepted keystone ADR + the manifest, then executes the dispositions through the existing ADR and spec lifecycles. The skill drafts; the session executes. This is a best-effort correction floor: it makes re-baselining expressible and human-gated — it does not auto-solve enumeration completeness (parked, see the coverage floor) and it is not a silent-drift detector (that half is the 067-03 noticing nudge + parked detection).
When to use vs. when to defer
Defer to a richer installed skill first. If another installed skill's description identifies it as handling project re-baselining or migrating onto a new reference, prefer it — jig's reframe is a slim baseline. This skill does not defer to the generic built-in; it only steps aside for a skill whose description names the re-baselining / reference-migration job.
Sibling jig operations that are easy to confuse with reframe — reach for the right one:
/jig:migrate— brings an existing project into jig (adopts an outside layout into jig structure). Reframe operates within an already-jig project whose premise moved. Migrate is about the container; reframe is about the contents' authority.jig:refactor(ADR-0019) — changes structure while preserving behaviour against a fixed reference. Reframe is the level above: the reference itself moved, which then spawns behaviour-change work (retrofit specs) that flows through refactor / bug-fix / spec-workflow. Reframe is not a member of ADR-0019's behaviour-change taxonomy.adr.py supersede— retires one decision with one replacement (1:1, decision-scoped). A reframe re-baselines a corpus premised on the moved reference — many artifacts, many dispositions — and mints the keystone ADR that makes the new reference authoritative. If the shift really is a single 1:1 decision change, useadr.py supersededirectly (over-built otherwise — see ADR-0024 Kill criteria)./jig:analyze— surfaces drift between existing artifacts (does spec A contradict ADR B?). Reframe introduces a new authority and routes the fallout. Analyze audits the corpus as-is; reframe changes what the corpus is anchored to.
Rule of thumb: the premise moved → this skill. Adopt a project into jig →
/jig:migrate. Behaviour-preserving cleanup → jig:refactor. One decision
changed → adr.py supersede. Audit alignment → /jig:analyze.
Inputs — the moved reference
The argument is the new load-bearing reference: a path to a dropped-in
artifact (design/new-system.fig, docs/vision-2.0.md, an OpenAPI file) or a
clearly named reference the user points at.
- Not locatable → refuse and ask. If the named reference can't be located (no such path, ambiguous name), the skill refuses and asks the user for a path or a precise identifier. It does not guess a reference or draft a keystone ADR against a reference it never read.
- Nothing to re-baseline → say so, draft nothing. If the corpus read finds no artifact that the reference actually invalidates (the reference is additive, or the corpus never encoded the old premise), the skill reports "nothing to re-baseline" and drafts no keystone ADR. An empty keystone ADR is never minted. (Resolves spec 067 Clarification Q1.)
The corpus read
Given a located reference, the skill reads the accepted corpus (decisions + prose) against it as the basis for drafting — which artifacts encode the old premise the new reference replaces. Two things this read is explicitly not:
- Not a
## Assumptionssweep. The## Assumptionsledger is risk-gated (ADR-0020): it logs only contested assumptions, never settled premises. A dead design that was settled truth never appears there — settled premises are invisible to the ledger for the same reason they silently steer the model: they are unquestioned ground. Scanning the ledger would structurally miss the exact thing a reframe must catch. - Not a built corpus-walker. There is no detection engine, no
references:frontmatter tagging, no spec 024-02 corpus-walking helper. Those are parked behind triggers T1/T2/T3 (ADR-0024 §7). The read is the model's judgment over Read — its completeness is the binding risk the coverage floor surfaces (below).
The keystone reframe-ADR
Reserve and scaffold the keystone ADR through the real ADR lifecycle so it
inherits the frame-critique accept gate:
python3 "${CLAUDE_PLUGIN_ROOT}/skills/adr-workflow/adr.py" new reframe-onto-<slug>
Then author its body:
- Declare the new reference authoritative as of
<date>. - Supersede the old premise (name it; link the decisions/prose that encoded it).
- Carry the re-baselining manifest (below) and the coverage floor (below).
Because the keystone ADR rides adr.py, its Proposed→Accepted flip is
frame-critique-gated (probed: adr.py's _gate_frame_critique() refuses
accept without a passing verdict; new ADRs are stamped frame_review: true).
This is load-bearing: the coverage floor is human-confirmed at that gate — the
natural checkpoint for "did the read miss anything?"
The re-baselining manifest
A table of every affected artifact, each assigned a deliberate disposition
— no TBD. retire-draft items are surfaced first (future-work drafts on
the dead premise mint dead-premise work; kill them before anything builds on
them).
Net-new forward work the reframe spawns — specs/ADRs the new reference reveals
that did not exist before, distinct from fixing an existing artifact — is
recorded in a separate ## Emergent work section, not forced into a
disposition row (a disposition is the fate of an already-affected artifact;
spawned work has no prior artifact to dispose of).
Disposition vocabulary
Each disposition routes to an operation that already exists (ADR-0024 §3):
| Disposition | Meaning | Routes to |
|---|---|---|
reaffirm | premise survives the new reference | refresh last_verified + note the reframe |
amend | closed record, still valid, needs a pointer | ## Amendments (ADR-0010) |
supersede | decision now wrong | adr.py supersede / superseding spec |
retire-draft | future-work on the dead premise | DEFERRED or discard — do first |
retrofit | shipped code must change | a slice in a retrofit spec /jig:reframe mints via workflow.py new (see Retrofit spec drafts) |
rewrite | live, non-record prose whose framing must change (not a closed record → not amend; not a decision → not supersede; not code → not retrofit) | rewrite in place, citing the keystone ADR |
The two-level coverage floor
The manifest's coverage statement is not free text — a bare "here's what I scanned" note is checked against nothing, so a confident narration of a partial scan reads as complete. It is a two-level coverage floor (ADR-0024 §2–§3):
-
Level 1 — whole corpus, class-level. Walk the corpus's deterministically-listable top-level artifact classes and mark each
scannedorexcused (reason):docs/decisions/(ADRs)docs/specs/(specs + slices)- live-prose docs under the docs root (
product-vision.md,architecture.md,workflow.md,README-style guides, roadmap, glossary) skills/*/SKILL.md- the root primer(s) (
CLAUDE.md/AGENTS.md) README
L1 covers the authority-bearing corpus — decisions, specs, and the prose / skill contracts that encode premises — not the code tree: shipped code that must change is dispositioned
retrofitand handled by a retrofit spec, not scanned by the floor. L1 makes a whole class silently dropped impossible-to-hide: an omission requires actively writingskills/: not scanned, which is visible. (This is the miss that bit the n=2 servo reframe, whose read covered onlydocs/+READMEand silently skippedskills/.) -
Level 2 — artifact-level, within touched classes. For each class the reference actually touches (the classes the keystone supersedes into), enumerate the artifacts within and state the method by which you decided which encode the dead premise — so the manifest's disposition rows are the output of an explicit within-class read, not a hand-waved "class scanned." L2 confronts the intra-class miss — the motivating Android-design failure, where dead-premise files lived inside
docs/specs/anddocs/decisions/entries a class-level floor would markscanned.
State the overall method and the residual uncertainty. Say plainly that the floor reduces and surfaces the enumeration risk — it does not eliminate it. Genuinely-open residuals (own them, don't hide them):
- a class wrongly judged untouched gets only L1, so an intra-class miss there survives;
- even within a touched class the read can miss an artifact;
- a human can rubber-stamp a weak
excused.
All three are backstopped by T1's two-pronged evidence (ADR-0024 §7): the
accept-time floor or post-reframe discovery — a later session that finds a
surviving dead-premise artifact inside a class the manifest marked scanned
un-parks systematic detection. This is the honest fallback, not a completeness
claim.
Maintenance note — the L1 class list is jig-corpus-shaped. The top-level classes above match jig's own corpus layout. If a downstream project grows a new top-level artifact class this list doesn't name (or uses a configurable docs root), extend the L1 walk to name it — otherwise that class is invisible to L1 (the whole-class-drop failure moved up one level, into the template). This is a foreseeable maintenance seam, adjacent to the T2 corpus-growth trigger; written down here rather than left silent, per this skill's own "omissions must be visible" ethos.
Retrofit spec drafts
For every retrofit disposition in the manifest, /jig:reframe also mints a
retrofit spec draft — the shipped-code change the reference forces, queued in
the spec lifecycle rather than left for the session to hand-author. For each
retrofit row:
-
Reserve a spec via
workflow.py new:python3 "${CLAUDE_PLUGIN_ROOT}/skills/spec-workflow/workflow.py" new \ retrofit-<artifact>-onto-<reference-slug>Slugify the substituted parts — lowercase,
[a-z0-9-]only, no--;workflow.py newrefuses a malformed slug. -
Goal the draft on the reference. The draft's Overview / first-slice goal reads "bring
<artifact/code>in line with<reference>", naming the moved reference explicitly — so the retrofit's purpose is unambiguous and measured against the new authority, not the dead premise. -
Anchor
## Assumptionson the new reference. The retrofit spec's## Assumptionscite the new reference as the authority the work is measured against, so a future frame-critique on that spec is anchored correctly (ADR-0024 §3) — not against the premise the reframe just retired. -
Close the loop — no
retrofitdisposition silently dropped. Everyretrofitrow maps to a drafted spec or to an explicitly-recorded reason it was not drafted surfaced to the user (e.g.deferred — <why>). Update the keystone manifest to link eachretrofitrow to its drafted spec number, so the disposition→draft mapping is complete and visible — the same "omissions must be visible" ethos as the coverage floor.
The retrofit specs then ride the normal review-gated spec-workflow lifecycle:
/jig:reframe drafts them, a competent session implements them. (This mirrors
the keystone-ADR flow — reframe reserves + drafts through the real lifecycle so the
spawned work inherits its gates for free.)
No .py helper
Like /jig:clarify and /jig:explain, this skill ships no helper script. The
only determinism it needs runs through existing tooling:
- reserve the keystone ADR via
adr.py new(frame-critique-gatedaccept); - reserve retrofit specs via
workflow.py new(one perretrofitdisposition); - corpus reading via the Read tool.
There is no reframe.py. The corpus read and the drafting are model judgment; the
structural surface (this contract) is what tests assert.
Gotchas
- Draft, don't execute. The skill produces the keystone ADR + manifest + drafts; a competent session executes the dispositions through the existing lifecycles. No heavy auto-execution (ADR-0024 §6).
- No empty keystone ADR. If nothing in the corpus encodes the moved premise, report "nothing to re-baseline" and draft nothing (Q1). If the reference isn't locatable, refuse and ask.
- The coverage floor is the point, not a formality. A weak
excusedreason or a class you markscannedwithout an L2 read reproduces the motivating failure under fresh keystone authority. Make the read honest; the frame-critique gate is where a human confronts it. retire-draftfirst. Dead-premise drafts mint dead-premise work — retire them before anything builds on them.- Not the
## Assumptionsledger. Never detect the shift by sweeping## Assumptions— it is risk-gated and blind to settled premises (the exact thing to catch). - Capability, not a lifecycle member. Reframe adds no
transitionand no state machine; it orchestrates the ADR/spec lifecycles it spawns. Don't build areframe.pystate machine (ADR-0024 Option B — rejected at n=1).
Relationship to other skills
adr-workflow(adr.py) — reframe reserves the keystone ADR viaadr.py newand routessupersededispositions throughadr.py supersede. The keystone's frame-critiqueacceptgate is where coverage is human-confirmed.spec-workflow(workflow.py) —retrofitdispositions become retrofit spec drafts viaworkflow.py new(slice 067-02); those specs then ride the normal review-gated lifecycle.jig:refactor/jig:bug-fix— the behaviour-change lifecycles a reframe spawns work into; reframe is explicitly not a member of their taxonomy./jig:migrate— the sibling entry path (project into jig) that reframe is not; see "When to use vs. when to defer"./jig:analyze— audits drift between existing artifacts; reframe introduces a new authority and routes the fallout. Reuse of analyze is conceptual (its six-category model), not code.