Skip to content

feat(feature-workflow): v9.7.2 — replaced/replacedBy rename, replaces auto-sync, verdict-language tighten#7

Merged
schuettc merged 5 commits into
mainfrom
feature/replaces-rename-v9.7.2
May 16, 2026
Merged

feat(feature-workflow): v9.7.2 — replaced/replacedBy rename, replaces auto-sync, verdict-language tighten#7
schuettc merged 5 commits into
mainfrom
feature/replaces-rename-v9.7.2

Conversation

@schuettc
Copy link
Copy Markdown
Owner

Summary

Patch release driven by live dogfood findings from slay-the-spire. Three improvements bundled:

1. supersededreplaced rename + new replaces: forward field

Original schema used supersededBy: (reverse-direction only) and state: superseded. Real user (me, in slay-the-spire) reached for supersedes: [a, b] — a forward-direction verb — and got silent no-op. Two parts:

  • Rename state: supersededstate: replaced, supersededBy:replacedBy:, --superseded-by--replaced-by. Clearer English; no users yet so no migration concerns.
  • New forward field 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.py now invokes sync_replaces.py before regenerating the dashboard. The sync sets state: replaced and replacedBy: <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:

  • 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. 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

  • 167/167 tests pass (160 baseline + 6 new sync_replaces + 1 new unknown-key test)
  • All superseded/supersededBy references swept from skill files, README, and prompts
  • Plugin version bumped 9.7.1 → 9.7.2 in both plugin.json and marketplace.json (em-dashes preserved in marketplace descriptions)
  • End-to-end: run /feature-capture with replaces: and confirm auto-sync (deferred to next dogfood pass)

Files changed (high signal)

  • feature-workflow/skills/shared/lib/models.py — schema rename + replaces field
  • feature-workflow/skills/shared/lib/sync_replaces.py — new auto-sync helper
  • feature-workflow/skills/shared/lib/run_dashboard.py — unknown-key warning
  • feature-workflow/hooks/post_tool_use.py — hook wires sync before regen
  • feature-workflow/templates/review-prompt-{plan,impl}.md — verdict definitions tightened
  • feature-workflow/reviewers/skills/feature-review-{plan,impl}.md — same fixes mirrored
  • feature-workflow/skills/feature-state/SKILL.md and other skill docs — rename propagated

Spec: dogfood findings at docs/superpowers/dogfood/2026-05-15-slay-the-spire-findings.md issue #1

schuettc added 5 commits May 15, 2026 23:20
…:' 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).
@schuettc schuettc merged commit 0218187 into main May 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant