From 3f68c0cc7fd9acb24d37143c8def7c987976f63a Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 4 Oct 2026 01:33:46 +0000 Subject: [PATCH 1/3] fix(planning): drop stale branch-tracked history claims from interview, plan and prd Since #5719 the Brief, PLAN.md and PRD.md live in the uncommitted memory slice, so git log is not their history. Each pivot or restart note now says the dated note is the only history and the published copy in the PR body or linked issue carries it. Re-pins the interview Step 1 digest. Closes #5783 Co-authored-by: ksextonmelodic --- plugins/planning/.claude-plugin/plugin.json | 2 +- plugins/planning/CHANGELOG.md | 8 ++++++++ plugins/planning/skills/interview/SKILL.md | 2 +- plugins/planning/skills/interview/context/loop.md | 2 +- plugins/planning/skills/plan/SKILL.md | 2 +- plugins/planning/skills/prd/SKILL.md | 2 +- plugins/planning/tests/interview-defenses.test.sh | 2 +- 7 files changed, 14 insertions(+), 6 deletions(-) diff --git a/plugins/planning/.claude-plugin/plugin.json b/plugins/planning/.claude-plugin/plugin.json index 1e46288fc3..badc7f557e 100644 --- a/plugins/planning/.claude-plugin/plugin.json +++ b/plugins/planning/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "planning", - "version": "0.67.1", + "version": "0.67.2", "userConfig": { "surface": { "type": "string", diff --git a/plugins/planning/CHANGELOG.md b/plugins/planning/CHANGELOG.md index 931dceb50c..1326734c20 100644 --- a/plugins/planning/CHANGELOG.md +++ b/plugins/planning/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to the `planning` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.67.2] - 2026-10-04 + +### Fixed + +- **`interview` (SKILL.md and `context/loop.md`), `plan` and `prd` no longer say the Brief, PLAN.md or PRD is branch-tracked with git log as its history ([#5783](https://github.com/melodic-software/claude-code-plugins/issues/5783)).** + Since #5719 these files live in the uncommitted memory slice, so each pivot or restart note now says the dated note is the document's only history and the copy published to the pull request body or linked issue carries it. + The interview edit sits in the digested Step 1 section; `interview-defenses.test.sh` re-pins that one digest. + ## [0.67.1] - 2026-10-03 ### Changed diff --git a/plugins/planning/skills/interview/SKILL.md b/plugins/planning/skills/interview/SKILL.md index 9e4e6a51c4..1b0727aff1 100644 --- a/plugins/planning/skills/interview/SKILL.md +++ b/plugins/planning/skills/interview/SKILL.md @@ -322,7 +322,7 @@ Survey output: one paragraph "Here is what I see in the repo." **Classify the domain** from what the survey shows. *engineering* (a build or behavior-change task, or a technical subject that yields a build artifact) or *general* (a decision or idea with no build surface). The deciding signal is the **task/build surface itself**, not the working directory: a general decision raised from inside a code repo is still general, and the engineering machinery must never engage on cwd alone. Repo/cwd is context that breaks the tie only when the task surface is genuinely indeterminate. Then lean engineering inside a code repo, else general. This is inferred, never asked; honor any explicit user override. The domain governs which machinery engages and what the session produces (see Purpose "Domain-routed"); it is orthogonal to the `me`/`auto`/`lock` action. -**Engineering sessions only**. If a prior PLAN.md Brief exists, ask whether to **resume**, **revise**, or **start fresh** (the latter appends a dated scope-change note to the top of the Brief capturing why before rewriting, and the commit carrying the rewrite states the pivot rationale. The contract is branch-tracked, so git log is the history). On **resume**, before the first resumed round, resolve the surface through `${CLAUDE_PLUGIN_ROOT}` again (never an absolute path copied from a handoff) and run `round.sh --dir '//interview-surface' doctor --ledger `; it names each element the running version needs and the ledger lacks. A general session or the `scope` action never creates or edits a PLAN.md Brief, so it skips this prompt. +**Engineering sessions only**. If a prior PLAN.md Brief exists, ask whether to **resume**, **revise**, or **start fresh** (the latter appends a dated scope-change note to the top of the Brief capturing why before rewriting. The Brief is never committed, so that note is its only history; the copy published to the pull request body or the linked issue carries it). On **resume**, before the first resumed round, resolve the surface through `${CLAUDE_PLUGIN_ROOT}` again (never an absolute path copied from a handoff) and run `round.sh --dir '//interview-surface' doctor --ledger `; it names each element the running version needs and the ledger lacks. A general session or the `scope` action never creates or edits a PLAN.md Brief, so it skips this prompt. Then route per action. diff --git a/plugins/planning/skills/interview/context/loop.md b/plugins/planning/skills/interview/context/loop.md index c41c1063fd..01efbb3087 100644 --- a/plugins/planning/skills/interview/context/loop.md +++ b/plugins/planning/skills/interview/context/loop.md @@ -25,7 +25,7 @@ Spend the first turn grounding yourself. Do NOT ask anything you can answer from Classify the domain from what the survey shows before anything Brief-related. The task/build surface decides, not cwd; a general decision raised from inside a code repo is still general. See SKILL.md Step 1 "Classify the domain". -**Engineering sessions only:** if a prior `PLAN.md` with a Brief section exists for this topic, read it first and ask whether to **resume** (continue from last open question), **revise** (task shifted, update specific sections in-place), or **start fresh** (append a dated scope-change note to the top of the Brief capturing why, then rewrite it; the commit carrying the rewrite states the pivot rationale, so git log is the history). On **resume**, before the first resumed round, resolve the surface again through the SKILL.md start command (never an absolute path copied from a handoff) and run `round.sh --dir '//interview-surface' doctor --ledger `. A general session never creates or edits a PLAN.md Brief, so it skips this prompt. +**Engineering sessions only:** if a prior `PLAN.md` with a Brief section exists for this topic, read it first and ask whether to **resume** (continue from last open question), **revise** (task shifted, update specific sections in-place), or **start fresh** (append a dated scope-change note to the top of the Brief capturing why, then rewrite it. The Brief is never committed, so that note is its only history; the copy published to the pull request body or the linked issue carries it). On **resume**, before the first resumed round, resolve the surface again through the SKILL.md start command (never an absolute path copied from a handoff) and run `round.sh --dir '//interview-surface' doctor --ledger `. A general session never creates or edits a PLAN.md Brief, so it skips this prompt. Survey output is a one-paragraph summary in your reply: "Here is what I see in the repo about this task." Then transition to Step 1.5 (auto-detect) or Step 2 (Q&A loop), per the action. diff --git a/plugins/planning/skills/plan/SKILL.md b/plugins/planning/skills/plan/SKILL.md index 7a211d0868..e2f13413cb 100644 --- a/plugins/planning/skills/plan/SKILL.md +++ b/plugins/planning/skills/plan/SKILL.md @@ -370,7 +370,7 @@ Write the plan even for small changes. A cleared session or a fresh agent has on **Close-out (PR time).** `/planning:plan` owns describing the close-out. Read [context/close-out.md](context/close-out.md) when invoked with `close-out`. It holds the three-step procedure, the ADR admission test, and the spec-container ship ritual. -**Mid-flight pivots:** when scope changes after approval, append a dated scope-change note to the affected PLAN.md section capturing the rationale, and strikethrough+link the obsolete content. Carry the pivot rationale in the commit message as well. The contract is branch-tracked, so git log is the history. Do not silently rewrite history. +**Mid-flight pivots:** when scope changes after approval, append a dated scope-change note to the affected PLAN.md section capturing the rationale, and strikethrough+link the obsolete content. PLAN.md is never committed, so these notes are its only history; refresh the pull request body or linked issue paste so the published copy carries them. Do not silently rewrite history. **After writing, recommend:** clear context and begin implementation. The implementing session reads PLAN.md for the execution roadmap. diff --git a/plugins/planning/skills/prd/SKILL.md b/plugins/planning/skills/prd/SKILL.md index 74ff6a1d67..79db57737f 100644 --- a/plugins/planning/skills/prd/SKILL.md +++ b/plugins/planning/skills/prd/SKILL.md @@ -107,7 +107,7 @@ Spend the first turn grounding yourself, in parallel: - List the project's own rules files that govern the area (architecture, modules, conventions) - Note what the topic's memory slice `//` (default `.work/`) already contains: prior PRD, PLAN, design artifacts, exploration and research artifacts -If a prior `PRD.md` exists for this topic, ask: **resume** (continue from open questions), **revise** (in-place edits, bump `updated:`), or **start fresh** (append a dated restart note capturing why below the PRD's frontmatter, then rewrite; the commit carrying the rewrite states the pivot rationale. The contract is branch-tracked, so git log is the history). +If a prior `PRD.md` exists for this topic, ask: **resume** (continue from open questions), **revise** (in-place edits, bump `updated:`), or **start fresh** (append a dated restart note capturing why below the PRD's frontmatter, then rewrite. PRD.md is never committed, so the restart note is its only history; the copy pasted into the pull request body or the linked issue carries it). Survey output is a one-paragraph summary in your reply. Then transition to frontier-rounds Q&A. diff --git a/plugins/planning/tests/interview-defenses.test.sh b/plugins/planning/tests/interview-defenses.test.sh index 66db825d5b..962f6f090a 100755 --- a/plugins/planning/tests/interview-defenses.test.sh +++ b/plugins/planning/tests/interview-defenses.test.sh @@ -544,7 +544,7 @@ pin_section "SKILL.md Step 1 section is unchanged (a preamble here reads as gove "$SKILL" \ "### Step 1. Survey before you ask" \ "### Step 1.5. Auto-detect (default action only)" \ - "aa394832ccce4a164b025ac0f9953f8cabbdf01b535423f5b17cda38dca31351" + "6cc95d0a77848f2ac6f0528460f6648ad1f28ce1daab79aea3db48edd91d9b5f" # The "memory slice is not a durable home" paragraph names where content that outlives the # branch goes and touches no assumption or Brief rule. # The `scope` persist path also returns each `deferred` and `blocked` row with its arbiter From 8cf10d4f7740d2ec174a3f1b5f535540b039a91d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 4 Oct 2026 01:55:20 +0000 Subject: [PATCH 2/3] fix(planning): name the Brief's history in interview Step 4 and document both re-pins Step 4 still let the commit message carry the pivot rationale, which contradicts Step 1 now that the Brief is never committed. Re-pins the Step 4 digest and adds a rationale comment beside each re-pinned digest. Refs #5783 Co-authored-by: ksextonmelodic --- plugins/planning/CHANGELOG.md | 3 ++- plugins/planning/skills/interview/SKILL.md | 2 +- plugins/planning/tests/interview-defenses.test.sh | 4 +++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/plugins/planning/CHANGELOG.md b/plugins/planning/CHANGELOG.md index 1326734c20..5447d25552 100644 --- a/plugins/planning/CHANGELOG.md +++ b/plugins/planning/CHANGELOG.md @@ -9,7 +9,8 @@ All notable changes to the `planning` plugin are documented here. Format follows - **`interview` (SKILL.md and `context/loop.md`), `plan` and `prd` no longer say the Brief, PLAN.md or PRD is branch-tracked with git log as its history ([#5783](https://github.com/melodic-software/claude-code-plugins/issues/5783)).** Since #5719 these files live in the uncommitted memory slice, so each pivot or restart note now says the dated note is the document's only history and the copy published to the pull request body or linked issue carries it. - The interview edit sits in the digested Step 1 section; `interview-defenses.test.sh` re-pins that one digest. + The interview Step 4 persist line no longer has the commit message carry the pivot rationale; it names the note as the Brief's only history. + Both interview edits sit in digested sections; `interview-defenses.test.sh` re-pins the Step 1 and Step 4 digests. ## [0.67.1] - 2026-10-03 diff --git a/plugins/planning/skills/interview/SKILL.md b/plugins/planning/skills/interview/SKILL.md index 1b0727aff1..0500a3084d 100644 --- a/plugins/planning/skills/interview/SKILL.md +++ b/plugins/planning/skills/interview/SKILL.md @@ -421,7 +421,7 @@ PLAN.md holds `## Brief` + `## Plan` sections. `/planning:interview` writes only **Cross-check the Brief once it exists.** Immediately after writing it, re-run the register gate with `--procedure --brief //PLAN.md`. This run proves every `deferred` and `blocked` row actually reached `### Deferred questions`, and that the Brief carries all seven template headings (TLDR, Goal, Constraints, Acceptance criteria, Captured assumptions, Out-of-scope, Deferred questions); the Step 3 run could not check either because the file was not written yet. It matches on the `Q` id, so each deferred entry must lead with one. A non-zero exit means the Brief is missing a question the ledger retired or a template heading: fix the Brief, do not retire the row. Exit 1 with `brief=unconfirmed` means the Brief is stamped `Restatement: UNCONFIRMED`: the user confirms the latest `restate`, then the Brief is exported again. A Brief edit after a Confirm needs a new `restate` and a fresh Confirm. A general session writes no Brief and skips this. -If a PLAN.md Brief exists and user chose **revise**, edit the Brief in-place. If **start fresh**, append a dated scope-change note to the top of the Brief capturing why before rewriting. Never silently overwrite, and let the commit message carry the pivot rationale. +If a PLAN.md Brief exists and user chose **revise**, edit the Brief in-place. If **start fresh**, append a dated scope-change note to the top of the Brief capturing why before rewriting. Never silently overwrite: that note is the Brief's only history (Step 1). Section schema: write the literal `## Brief` template (TLDR / Goal / Constraints / Acceptance criteria / Captured assumptions / Out-of-scope / Deferred questions) per [`context/loop.md`](context/loop.md) "Brief template (the literal shape)". `### Acceptance criteria` stays plain bullets in both formats, tagged or not, per "Acceptance-criteria capture" above; it is never converted to checkboxes. Each **Deferred question** leads with its **`Q` id**, the tie back to its register row and what the Step 4 gate greps this section for, and carries an **arbiter tag** (`/planning:plan` default, or `USER-RESERVED` when its resolution could change acceptance criteria / out-of-scope / constraints). Both are required; loop.md covers when to use which. diff --git a/plugins/planning/tests/interview-defenses.test.sh b/plugins/planning/tests/interview-defenses.test.sh index 962f6f090a..bad2a5fb9f 100755 --- a/plugins/planning/tests/interview-defenses.test.sh +++ b/plugins/planning/tests/interview-defenses.test.sh @@ -540,6 +540,7 @@ pin_section "loop.md Step 4 section is unchanged (it twins the USER-RESERVED arb # Paths in this section name the memory slice and the artifact protocol; they set where files land and change no rule. # The resume branch runs `round.sh doctor` before the first resumed round; it reports and resolves nothing. +# The start-fresh note is the Brief's only history and its published PR-body or issue copy carries it; it touches no assumption, gap or Brief rule. pin_section "SKILL.md Step 1 section is unchanged (a preamble here reads as governing the two rules below)" \ "$SKILL" \ "### Step 1. Survey before you ask" \ @@ -553,11 +554,12 @@ pin_section "SKILL.md Step 1 section is unchanged (a preamble here reads as gove # The Brief cross-check also passes `--procedure`, which only adds a check on the Brief's # template headings; it retires no row and relaxes no rule. # The cross-check names `brief=unconfirmed` and the fresh-Confirm rule; it adds a halt and retires no row. +# The start-fresh line names the scope-change note as the Brief's only history; it touches no assumption, gap or Brief rule. pin_section "SKILL.md Step 4 section is unchanged (the Brief's assumption machinery lives here)" \ "$SKILL" \ "### Step 4. Persist the contract" \ "### Step 5. Hand off" \ - "94f688154723dd4995c221b9ee0d952c3e8961158d5b3661e38b32ddd3a3d465" + "8553a145d1912e1bfff5a0078e01ea02122e5aed81f12f1c9316aa2b9ba3552e" pin_section "SKILL.md Step 1.5 section is unchanged (auto-guard + unattended + \`lock\` routing live here)" \ "$SKILL" \ "### Step 1.5. Auto-detect (default action only)" \ From e84ca6290bef1498c80d2f5fe4136cad88ad49fa Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 4 Oct 2026 02:00:02 +0000 Subject: [PATCH 3/3] fix(planning): drop the removed contract slice from the interview checklist and prd scope Since #5719 only the memory slice exists; the prd scope line and its eval expectation also allow pasting the locked PRD into the PR body or linked issue, which the skill already directs. Refs #5783 Co-authored-by: ksextonmelodic --- plugins/planning/CHANGELOG.md | 1 + plugins/planning/skills/interview/templates/checklist.md | 2 +- plugins/planning/skills/prd/SKILL.md | 2 +- plugins/planning/skills/prd/evals/evals.json | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/planning/CHANGELOG.md b/plugins/planning/CHANGELOG.md index 5447d25552..89f97e20f8 100644 --- a/plugins/planning/CHANGELOG.md +++ b/plugins/planning/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to the `planning` plugin are documented here. Format follows - **`interview` (SKILL.md and `context/loop.md`), `plan` and `prd` no longer say the Brief, PLAN.md or PRD is branch-tracked with git log as its history ([#5783](https://github.com/melodic-software/claude-code-plugins/issues/5783)).** Since #5719 these files live in the uncommitted memory slice, so each pivot or restart note now says the dated note is the document's only history and the copy published to the pull request body or linked issue carries it. The interview Step 4 persist line no longer has the commit message carry the pivot rationale; it names the note as the Brief's only history. + The interview checklist, the `prd` scope line and its eval expectation no longer name the removed contract slice; only the memory slice remains. Both interview edits sit in digested sections; `interview-defenses.test.sh` re-pins the Step 1 and Step 4 digests. ## [0.67.1] - 2026-10-03 diff --git a/plugins/planning/skills/interview/templates/checklist.md b/plugins/planning/skills/interview/templates/checklist.md index 006c13d929..2f583ca336 100644 --- a/plugins/planning/skills/interview/templates/checklist.md +++ b/plugins/planning/skills/interview/templates/checklist.md @@ -6,7 +6,7 @@ Planning version: