git plugin: cherry-pick and revert have three claimants #112

Closed
opened 2026-08-30 13:19:07 +00:00 by Claude · 1 comment
Collaborator

Surfaced by two independent audits during the #99 ADR-0020 retrofit, wave 2. Pre-existing — not introduced by the retrofit. Both skills carried the overlap before wave 2 touched them, so it was deliberately held out of that wave's scope rather than resolved arbitrarily mid-flight.

The conflict

Three skills disagree about who owns git cherry-pick and git revert:

Skill Position Evidence
git-branches they are git-history's references/merging.md:8-9
git-commits they are its own description claims cherry-picking; owns references/cherry-pick.md with its own dispatch row
git-history executes them Step 3 offers and runs both; README.md justifies carrying them via git-branches' delegation

A router acting on descriptions alone will land "cherry-pick abc123 onto release" in git-commits, while git-branches documents that it should go to git-history, which also implements it. Two skills carry near-duplicate procedure for the same operation.

The rebase half is already resolved

Wave 2 fixed the rebase portion of the same tangle: git-branches was routing rebase to git-history, which carries no rebase content and disclaims it in its own README. Rebase is git-commits', which implements it in references/rewrite-history.md. That correction landed across four sites in 0fde892.

Cherry-pick and revert were left alone precisely because, unlike rebase, both claimants have a real case.

The two coherent resolutions

(a) They belong to git-commits. Cleanest first principle — git-history finds, git-commits writes, and cherry-pick and revert both write commits. Cost: git-history's Step 3 loses two of its three operations, and the "you located a commit, now act on it" flow breaks in half.

(b) They belong to git-history. Matches git-branches/references/merging.md, matches git-history's Step 3, matches its pre-retrofit README justification. Only git-commits dissents. Cost: delete git-commits/references/cherry-pick.md and its dispatch row, and drop cherry-pick from its description.

Whichever wins, the losing skill must drop the capability from its description too, not just its body — the description is the entire routing surface, and leaving a stale claim there means the router keeps picking the wrong skill regardless of what the bodies say.

Note on current state

git-history's description was corrected in wave 2 to stop disclaiming cherry-pick and revert (it read "not writing or rewriting commits", which deflected its own Step 3), and gained "backport" so cherry-pick is reachable by natural language at all. That change is correct under either resolution — it does not prejudge this issue.

#99 (the retrofit), #110, #111 (gate defects from the same wave).

Surfaced by two independent audits during the #99 ADR-0020 retrofit, wave 2. **Pre-existing — not introduced by the retrofit.** Both skills carried the overlap before wave 2 touched them, so it was deliberately held out of that wave's scope rather than resolved arbitrarily mid-flight. ## The conflict Three skills disagree about who owns `git cherry-pick` and `git revert`: | Skill | Position | Evidence | |---|---|---| | `git-branches` | they are `git-history`'s | `references/merging.md:8-9` | | `git-commits` | they are its own | description claims cherry-picking; owns `references/cherry-pick.md` with its own dispatch row | | `git-history` | executes them | Step 3 offers and runs both; `README.md` justifies carrying them via `git-branches`' delegation | A router acting on descriptions alone will land "cherry-pick abc123 onto release" in `git-commits`, while `git-branches` documents that it should go to `git-history`, which also implements it. Two skills carry near-duplicate procedure for the same operation. ## The rebase half is already resolved Wave 2 fixed the *rebase* portion of the same tangle: `git-branches` was routing rebase to `git-history`, which carries no rebase content and disclaims it in its own README. Rebase is `git-commits`', which implements it in `references/rewrite-history.md`. That correction landed across four sites in `0fde892`. Cherry-pick and revert were left alone precisely because, unlike rebase, both claimants have a real case. ## The two coherent resolutions **(a) They belong to `git-commits`.** Cleanest first principle — `git-history` *finds*, `git-commits` *writes*, and cherry-pick and revert both write commits. Cost: `git-history`'s Step 3 loses two of its three operations, and the "you located a commit, now act on it" flow breaks in half. **(b) They belong to `git-history`.** Matches `git-branches/references/merging.md`, matches `git-history`'s Step 3, matches its pre-retrofit README justification. Only `git-commits` dissents. Cost: delete `git-commits/references/cherry-pick.md` and its dispatch row, and drop cherry-pick from its description. Whichever wins, the losing skill must drop the capability from its **description** too, not just its body — the description is the entire routing surface, and leaving a stale claim there means the router keeps picking the wrong skill regardless of what the bodies say. ## Note on current state `git-history`'s description was corrected in wave 2 to stop *disclaiming* cherry-pick and revert (it read "not writing or rewriting commits", which deflected its own Step 3), and gained "backport" so cherry-pick is reachable by natural language at all. That change is correct under **either** resolution — it does not prejudge this issue. ## Related #99 (the retrofit), #110, #111 (gate defects from the same wave).
Claude added the Kind/Bug
Reviewed
Confirmed
1
Priority
Medium
3
labels 2026-08-30 13:19:07 +00:00
Claude added this to the Skills & Agents milestone 2026-08-30 15:59:06 +00:00
Author
Collaborator

Already resolved, closing without further changes. Verified against main (post 598a7c3 / #129): the ownership split is git-commits owns cherry-pick, git-history owns revert — not the "one skill owns both" framing this issue's evidence table used.

  • git-branches/references/merging.md:8: "Rebase and cherry-pick belong to git-commits; revert to git-history."
  • git-history's SKILL.md Step 3: "cherry-pick is git-commits'... Hand it the SHA; do not run git cherry-pick from here." git revert <commit> is executed directly, no delegation.
  • git-history's README.md: "Cherry-pick is not this skill's: git-commits owns it... git-branches delegates revert here."
  • git-commits' description and dispatch row still claim cherry-pick; its only "revert" mentions are the Conventional Commits message type for SemVer classification, not a claim on the git revert operation.

All three sites agree, and the description-level claim (the actual routing surface) is consistent with the body on all three. 598a7c3's own commit message confirms this was done deliberately during wave 3/4: "#112 (cherry-pick ownership, now resolved in favour of git-commits)" — just never closed out.

Already resolved, closing without further changes. Verified against `main` (post `598a7c3` / #129): the ownership split is `git-commits` owns cherry-pick, `git-history` owns revert — not the "one skill owns both" framing this issue's evidence table used. - `git-branches/references/merging.md:8`: "Rebase and cherry-pick belong to `git-commits`; revert to `git-history`." - `git-history`'s `SKILL.md` Step 3: "cherry-pick is `git-commits`'... Hand it the SHA; do not run `git cherry-pick` from here." `git revert <commit>` is executed directly, no delegation. - `git-history`'s `README.md`: "Cherry-pick is **not** this skill's: `git-commits` owns it... `git-branches` delegates revert here." - `git-commits`' description and dispatch row still claim cherry-pick; its only "revert" mentions are the Conventional Commits message *type* for SemVer classification, not a claim on the `git revert` operation. All three sites agree, and the description-level claim (the actual routing surface) is consistent with the body on all three. `598a7c3`'s own commit message confirms this was done deliberately during wave 3/4: "#112 (cherry-pick ownership, now resolved in favour of `git-commits`)" — just never closed out.
Sign in to join this conversation.