diff --git a/plugins/source-control/.claude-plugin/plugin.json b/plugins/source-control/.claude-plugin/plugin.json index 9116c1397..fb864f39b 100644 --- a/plugins/source-control/.claude-plugin/plugin.json +++ b/plugins/source-control/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "source-control", - "version": "0.53.0", + "version": "0.53.1", "description": "Git and GitHub delivery workflow: /commit (Conventional Commits + Co-Authored-By trailer via safe heredoc mechanics), /pull-request (prep, create, CI monitoring, review-comment triage, merge, CI-log fetch), /babysit-prs (self-pacing fleet loop \u2014 safe by default; opt-in worker/autopilot tiers add gate-checked merge and thread resolution behind a deterministic Python engine), /babysit-loop (the loop-lane merge lane: a standing or drain loop that invokes babysit-prs per cycle, configured through repo-scoped babysit_loop_* keys on the layered source-control.md seam, with merge authority human-only until the target repo's tracked config adopts the lane, a gate-proven C2-mechanical baseline once adopted, and standing merge-rung raises binding from the team-tracked layer only \u2014 with one named exception, where an invocation line explicitly typing both the autopilot tier keyword and the dedicated raise argument --merge c3-this-run widens that single invocation's merge authority up to C3 behind a fresh independent frontier-tier resolver, while C4-structural and C5-untrusted-provenance stay unconditionally human-merge), /worktree (create, status, cleanup, audit for parallel-session isolation), /setup (check the effective commit-subject / PR-title convention merged across its config layers and the babysit-prs config, or apply \u2014 interview the repo and write the convention config to a chosen layer), and /resolve-conflicts (intent-first merge/rebase conflict resolution with a semantic-conflict sweep \u2014 never --abort). The commit-subject / PR-title convention is configurable via a source-control.md config written by a re-runnable setup skill, layered across a ~/.claude user-global file, the tracked team file, and a gitignored .claude/source-control.local.md personal overlay merged per key; Conventional Commits is the default when no convention is declared.", "author": { "name": "Melodic Software", diff --git a/plugins/source-control/CHANGELOG.md b/plugins/source-control/CHANGELOG.md index 469cf1e93..4095928ce 100644 --- a/plugins/source-control/CHANGELOG.md +++ b/plugins/source-control/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to the `source-control` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.53.1] + +### Fixed + +- **The paused-merge case pins both halves of the in-progress reason, and the landed+in-progress + fixture's comment corrects the cherry-pick rationale (#2257).** 0.51.16 rewrote the in-progress + reason to "…(staged result recomputable from base, sequencer position) dies with the directory", + but the suite asserted only "recomputable" — the clause carried over from the old wording — so + the #2257 half (the transient state is LOST with the directory, close to the opposite claim) + could regress silently; a second assertion now pins it. The fixture comment also claimed a + cherry-pick "would reuse the same object", which is wrong on two counts: cherry-pick mints a new + commit, and with this fixture's ordering (`unrelated on main` lands before the twin) a + cherry-pick would not have parent == HEAD at the branch tip and would carry `unrelated.txt` in the + tree — different parent, tree, and SHA even within the same second. The twin-with-different-subject + sequence below is deliberate; do not replace it with a cherry-pick. + ## [0.53.0] ### Changed diff --git a/plugins/source-control/scripts/landed-work.test.sh b/plugins/source-control/scripts/landed-work.test.sh index cdc7263a4..1c451f3b0 100755 --- a/plugins/source-control/scripts/landed-work.test.sh +++ b/plugins/source-control/scripts/landed-work.test.sh @@ -454,6 +454,11 @@ assert_eq "the conflicted files are counted apart from the staged tree" \ "1" "$(col "$R" $C_CONFLICTED)" assert_contains "the reason says the staged tree is recomputable" \ "$(col "$R" $C_REASON)" "recomputable" +# Pins the #2257 half of the reason as well: "recomputable" alone survived the +# rewrite that added it, so only this clause proves the reason still says the +# transient state is LOST with the directory — close to the opposite claim. +assert_contains "the reason says the operation's transient state dies with the directory" \ + "$(col "$R" $C_REASON)" "dies with the directory" # -------------------------------------------------------------------------- # A truncated pass fails loudly @@ -543,8 +548,12 @@ git -C "$WT_BISECT" bisect reset >/dev/null 2>&1 # as safe-to-remove, and removal mid-operation kills the operation's transient # state even when every commit is durable. Fixture holds both signals at once — # the branch's one commit matches the base by patch-id via a different SHA on -# origin/main (not a cherry-pick, which would reuse the same object and leave -# unpushed=0), then a merge is left open with --no-commit (MERGE_HEAD present). +# origin/main, then a merge is left open with --no-commit (MERGE_HEAD present). +# The twin is committed with a different subject on main (never cherry-picked): +# unrelated lands on main before the twin, so a cherry-pick would not have +# parent == HEAD at the branch tip and would carry unrelated.txt in the tree — +# different parent, tree, and SHA even within the same second. The sequence +# below is deliberate; do not replace the twin with a cherry-pick. W="$(mkfixture)" WT_OP="$TEST_TMPDIR/wt-inprog-landed" git -C "$W" worktree add -q -b feat-inprog "$WT_OP" main >/dev/null 2>&1