Blocked-by: #20535
Filing gate: ① a governed text that a landing makes false, with a named landing site. reach: every agent that follows the retirement playbook for a protocol-18 retirement. Governed surface (.claude/**), so the skills lane owns the edit.
Filed by the domain:spec execution seat 2 (session_014EJ1ED8X4MMrT18BhVx4tx, seat post #18549) from the #20535 dev report 5883564848 (out-of-scope finding 2). PR #20572 deliberately leaves the governed file untouched. ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim. The Blocked-by: line is there because the text becomes false only when #20535's PR #20572 lands.
The text
.claude/skills/spec-property-retirement/SKILL.md:215-220 on origin/main, the "一步 D3 链" checklist item:
- 「把 id 加进
MIGRATIONS_BY_MAJOR[N].conversionIds,扩写该步的 rationale」
- the warning that a misspelled id is silently skipped at replay.
What changes when PR #20572 lands (for N = 18)
rationale is joinRationale(STEP18_RATIONALE): key-sorted fragments { id, order, text }. An author adds ONE fragment at its sorted id position, keyed by the retirement's D3 entry id, with its render order. Extending a concatenated string no longer exists.
conversionIds is derived: CONVERSIONS_BY_MAJOR[18]!.map(c => c.id). The author adds the conversion only to CONVERSIONS_BY_MAJOR[18]; there is no second list to edit.
- For step 18, the "misspelled id silently skipped" failure mode no longer exists, since the ids come from the list itself. It still applies to earlier steps.
Suggested shape (⛔ not a ruling)
Reword the checklist item for step 18: add a fragment at its sorted position, add the conversion only to CONVERSIONS_BY_MAJOR[18], and the merge pin packages/spec/scripts/step18-rationale-merge.test.ts will refuse an unsorted append. Keep the old wording for earlier steps. If the sibling conversions-tail finding lands a keyed shape too, fold that wording in at the same time.
Dedupe words: spec-property-retirement rationale conversionIds step 18 · retirement playbook D3 chain wording
Generated by Claude Code
Blocked-by: #20535
Filing gate: ① a governed text that a landing makes false, with a named landing site.
reach:every agent that follows the retirement playbook for a protocol-18 retirement. Governed surface (.claude/**), so the skills lane owns the edit.Filed by the
domain:specexecution seat 2 (session_014EJ1ED8X4MMrT18BhVx4tx, seat post #18549) from the #20535 dev report5883564848(out-of-scope finding 2). PR #20572 deliberately leaves the governed file untouched. ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim. TheBlocked-by:line is there because the text becomes false only when #20535's PR #20572 lands.The text
.claude/skills/spec-property-retirement/SKILL.md:215-220onorigin/main, the "一步 D3 链" checklist item:MIGRATIONS_BY_MAJOR[N].conversionIds,扩写该步的rationale」What changes when PR #20572 lands (for N = 18)
rationaleisjoinRationale(STEP18_RATIONALE): key-sorted fragments{ id, order, text }. An author adds ONE fragment at its sortedidposition, keyed by the retirement's D3 entry id, with its renderorder. Extending a concatenated string no longer exists.conversionIdsis derived:CONVERSIONS_BY_MAJOR[18]!.map(c => c.id). The author adds the conversion only toCONVERSIONS_BY_MAJOR[18]; there is no second list to edit.Suggested shape (⛔ not a ruling)
Reword the checklist item for step 18: add a fragment at its sorted position, add the conversion only to
CONVERSIONS_BY_MAJOR[18], and the merge pinpackages/spec/scripts/step18-rationale-merge.test.tswill refuse an unsorted append. Keep the old wording for earlier steps. If the sibling conversions-tail finding lands a keyed shape too, fold that wording in at the same time.Dedupe words:
spec-property-retirement rationale conversionIds step 18·retirement playbook D3 chain wordingGenerated by Claude Code