feat(feature-workflow): v9.7.2 — replaced/replacedBy rename, replaces auto-sync, verdict-language tighten#7
Merged
Conversation
…:' field State enum value, FeatureContext field (replaced_by), frontmatter key (replacedBy) all renamed for clarity. New 'replaces: [ids]' forward-direction field lets a new feature declare what it replaces in one place — the dashboard hook will auto-sync state and replaced_by on the targets in a follow-up commit.
…link When idea.md is written with replaces: [a, b], the post_tool_use hook now sets state=replaced and replacedBy=<self> on each referenced target before regenerating the dashboard. Idempotent; missing targets are silently skipped (dashboard validation will warn separately).
Catches typos like 'supersedes:' (vs 'replaces:'), 'asignee:' (vs 'assignee:'), or any other unsupported field. Surfaced in the Validation Warnings section with a one-liner per offending feature.
Old prompt let reviewers output CONDITIONAL PASS verdicts alongside 'Blocking' findings, which created an internally inconsistent verdict surface — the autopilot's wait-for-review.sh treats CONDITIONAL PASS as advance, but the findings list said the work needed more revisions. Lock in the user-facing distinction: - PASS: great, no changes - CONDITIONAL PASS: good; address Recommendations during impl, no re-review - FAIL: needs rework + re-review Blocking findings are now defined as FAIL-only. If a reviewer lists a Blocking finding the verdict MUST be FAIL. Recommendations stay verdict-agnostic. Mirrors the change across templates/ (consumer projects' CI prompts) and reviewers/skills/ (this plugin's internal source-of-truth).
…ocs; bump to 9.7.2 Updated all skill SKILL.md / capture.md / interview.md / search.py references from 'superseded'/'supersededBy' to 'replaced'/'replacedBy'/'--replaced-by', plus the README state table. Bump feature-workflow plugin to 9.7.2 (patch release: schema rename + replaces auto-sync + unknown-key validation + verdict-language tightening).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Patch release driven by live dogfood findings from slay-the-spire. Three improvements bundled:
1.
superseded→replacedrename + newreplaces:forward fieldOriginal schema used
supersededBy:(reverse-direction only) andstate: superseded. Real user (me, in slay-the-spire) reached forsupersedes: [a, b]— a forward-direction verb — and got silent no-op. Two parts:state: superseded→state: replaced,supersededBy:→replacedBy:,--superseded-by→--replaced-by. Clearer English; no users yet so no migration concerns.replaces: [a, b]lets the new feature declare what it replaces from one place.2. Auto-sync in the dashboard hook
When idea.md is written with
replaces: [a, b],hooks/post_tool_use.pynow invokessync_replaces.pybefore regenerating the dashboard. The sync setsstate: replacedandreplacedBy: <new-id>on each referenced target. Idempotent; missing targets are silently skipped (dashboard validation surfaces them separately).3. Verdict-language tightening in review prompts
Dogfood surfaced reviewers outputting CONDITIONAL PASS verdicts with "Blocking" findings — internally inconsistent. Locked in:
Blocking findings are now defined as FAIL-only. The Critical Findings section is only present under FAIL; Recommendations are verdict-agnostic.
Bonus: unknown-frontmatter-key validation
The dashboard's Validation Warnings section now flags unknown frontmatter keys (e.g., my original
supersedes:typo). Would have caught the original confusion at idea.md write time.Test plan
superseded/supersededByreferences swept from skill files, README, and promptsreplaces:and confirm auto-sync (deferred to next dogfood pass)Files changed (high signal)
feature-workflow/skills/shared/lib/models.py— schema rename + replaces fieldfeature-workflow/skills/shared/lib/sync_replaces.py— new auto-sync helperfeature-workflow/skills/shared/lib/run_dashboard.py— unknown-key warningfeature-workflow/hooks/post_tool_use.py— hook wires sync before regenfeature-workflow/templates/review-prompt-{plan,impl}.md— verdict definitions tightenedfeature-workflow/reviewers/skills/feature-review-{plan,impl}.md— same fixes mirroredfeature-workflow/skills/feature-state/SKILL.mdand other skill docs — rename propagatedSpec: dogfood findings at
docs/superpowers/dogfood/2026-05-15-slay-the-spire-findings.mdissue #1