manage-change
ALWAYS invoke this skill when claiming, releasing, submitting, advancing, lowering, closing Applied, or closing Abandoned a Change in the declared Change Store. NEVER assign a Change, write its Maturity or Lifecycle, or close its issue by hand.
- License 许可
- MIT
- 最近更新
- 2026-11-10
- Stars
- ★ 1
- Forks
- 1
01 前言 Front Matter
- name
- manage-change
- arguments
- transition reference
- description
- ALWAYS invoke this skill when claiming, releasing, submitting, advancing, lowering, closing Applied, or closing Abandoned a Change in the declared Change Store. NEVER assign a Change, write its Maturity or Lifecycle, or close its issue by hand.
- allowed-tools
- Read, Write, Bash(gh issue view:*), Bash(gh issue list:*), Bash(gh issue edit:*), Bash(gh issue comment:*), Bash(gh issue close:*), Bash(gh pr view:*), Bash(gh pr checks:*), Bash(gh api graphql:*), Bash(gh api user --jq .login), Bash(gh api repos/*/issues/*/dependencies/blocked_by --method GET -F per_page=100), Bash(git status:*), Bash(git fetch:*), Bash(git switch:*), Bash(git branch --list:*), Bash(git ls-remote --heads origin:*), Bash(git worktree list --porcelain), Bash(git rev-parse:*), Bash(git merge-base --is-ancestor:*), Bash(git push -u origin HEAD:*), Bash(spx worktree status:*), Bash(spx diagnose:*), Bash(spx spec status:*), Bash(spx verification run render:*), Bash(spx verification run input:*), Bash(id -un), Bash(hostname -s),{!% if target == 'claude' %!} Bash(printenv CLAUDE_CODE_SESSION_ID), Agent,{!% else %!} Bash(printenv CODEX_THREAD_ID), {{! tool('spawn_agent') !}}, {{! tool('wait_agent') !}},{!% endif %!} {{! tool('use_skill') !}}
- argument-hint
- <claim|release|submit|advance|lower|applied|abandoned> <#N | owner/repo#N | issue-url> [Maturity] [reason]
03 SKILL.md 正文
<objective> One Transition made on one Change in the declared Change Store — its Transition comment the newest comment, every field it changes written to its home, and the complete state read back — or a refusal naming the state or the actor the Transition requires, with nothing written. </objective>
<required_reading>
Use skill product-tree:change-standards. Its <transitions> table, transition-actor, and <github_store> rules govern every step below by their slugs. Read its references/github-store.md for every read and write, the Transition comment, and the write discipline.
Use skill product-tree:commit-changes. It commits the uncommitted session-owned work a release carries, in step 5.
Use skill product-tree:sync-base. It brings the claimed branch current, in step 8.
</required_reading>
<intake>
Take $transition as one of claim, release, submit, advance, lower, applied, and abandoned; any other value, an empty one included, is refused naming the seven, with nothing read. Take $reference as #N, owner/repo#N, or an issue URL; any other form is refused naming the three. advance takes a target Maturity as its next token, and an advance to Applicable then takes the run token of the record's sealed audit run; lower takes a target Maturity and then its reason, the rest of the arguments; a missing or unknown Maturity, or a lower without a reason, is refused naming what it lacks. claim takes an optional absolute worktree root to claim for, which must hold no . or .. segment; without it, the claim is for this session's worktree. No other Transition takes a further token.
</intake>
<workflow>
- Read the Change. Resolve the store under
<store_binding>and read the issue, its fields, its comments, and its blockers under<reads>. Resolve the current login withgh api user --jq .login, the session id with{!% if target == 'claude' %!}printenv CLAUDE_CODE_SESSION_ID{!% else %!}printenv CODEX_THREAD_ID{!% endif %!}, the user and host withid -unandhostname -s, and the worktree withgit rev-parse --show-toplevel. Derive the Change's type underchange-typefrom the store's Parent values under<reads>. This session holds the Change when the issue's one assignee is the current login and the newestclaimcomment'sworktreeis this worktree; a session restart keeps the Claim underclaim-kept, so thesessionmay differ. - Check the state. Refuse the Transition, naming the state found, unless the Change stands in the state its
transitionsrow requires:claiman open Available Change with no assignee;releasea Change this session holds;submitan Available Change this session holds;advancea Submitted Change that meets the condition of each Maturity up to the target undermaturity-ready, or a Sliced Leaf this session holds that meets the Applicable condition;lowera Framed, Sliced, or Applicable Change whose target is lower than its Maturity;appliedandabandonedan open Change. A closed issue, or a Lifecycle of Applied or Abandoned, refuses every Transition underterminal. - Check the actor. Refuse the Transition, naming the actor
transition-actornames, unless that actor makes it:claim: any session.releaseandsubmit: this session as holder.advanceto Framed or Sliced,lowerfor a reopened judgment,abandonedof a Change no merge absorbs, andappliedof a Parent: the Operator's explicit direction, given in this conversation or in an order from the Operator's delegate.advanceof a Sliced Leaf to Applicable: this session as holder, once the Applicable condition holds as step 4 states.lowerto Sliced by the Applier, for a decision line that differs from the reviewed line or a failed Application check, and by any session whose publish wrote the body of an Applicable record: this session, naming that cause in the reason.lowerto Proposed for a reframe: this session as Refiner.abandonedof a Change a merge absorbs: this session as Refiner, on the Operator's direction.appliedof a Leaf: this session as holder.
- Check the condition.
- For an
advanceto Sliced or Applicable, confirmgithub-binding: read the body's edit history and the Base field's change events under<reads>, and require the current body and Base to equal those the review or the audit read, or the review to carry forward to them underreview-carry. For Applicable, require each Node the record's infrastructure lines name to stand on the default branch with State Passing underspx spec status --format json, or a blocker to build it. Read the audit's sealed run withspx verification run render --verification-type audit --scope-type file --scope <owner>/<repo>#<N> --run <run-token>and its retained record with the same arguments tospx verification run input; advance only when the run is sealedapprovedwith no finding and the retained record's body andbaseequal the current body and Base, underaudit-binding. - For
appliedof a Leaf, require every part ofleaf-applied. Take the merge commit from the newestreleasecomment'shandoff, or from the pull request this session merged, withgh pr view <pr> --json state,mergeCommit; rungit fetch origin <default>and requiregit merge-base --is-ancestor <merge-commit> origin/<default>to exit zero. Require each Node the Declarations name to hold every result its Malleability requires underspx spec status --format json, and every Declarations line to stand on the default branch. Require the audit at close: launch {!% if target == 'codex' %!}product-tree_change-auditor{!% else %!}product-tree:change-auditor{!% endif %!} once through the native subagent capability with the task message<owner>/<repo>#<N> <absolute checkout root>, and close only when its sealed run isapprovedwith no finding. A failed condition refuses the Transition, naming the part that failed. - For
appliedof a Parent, require every Child closed under<reads>. - Before any write to Maturity or Lifecycle, run the option check of
<store_options>; a field whose options differ stops the Transition naming the field.
- For an
- Prepare the checkout. For a
claimfor another worktree, the comment'sworktreeis that root, and this step and step 8 leave every checkout as it is. For aclaimfor this worktree, runspx worktree statusas a read-only check and require this session'sSessionStartclaim on the worktree; record no claim by hand. Forrelease, rungit status --short --branch: commit uncommitted session-owned work throughproduct-tree:commit-changes, on the work branchwork/change-<N>when the checkout is detached or on the default branch; push the branch withgit push -u origin HEAD:refs/heads/<branch>and require the local and origin tips equal; run the preflight checksspx/local/merging.mddeclares, thengit switch --detach, and the post-cleanup checks it declares. The live worktree claim stays with the session; never release it. - Write in order, under
<write_discipline>:claim: add the assignee, then post theclaimcomment.release: post thereleasecomment with itshandoff, remove the assignee, then write Lifecycle Available when it reads Submitted.submit: write Lifecycle Submitted, then post thesubmitcomment.advance: write the target Maturity, then post theadvancecomment.lower: write the target Maturity, then post thelowercomment with itsreason. After a lower other than the Applier's to write a decision line, make thereleaseTransition next underlower-claim.applied: post theappliedcomment, withchangesetfor a Leaf, remove the assignee, write Lifecycle Applied, then close the issue as completed.abandoned: post theabandonedcomment, remove the assignee, write Lifecycle Abandoned, then close the issue as not planned.
- Read back under
<write_discipline>: every field the Transition writes equals its target, every other field is unchanged, the assignee list is the intended holder or empty, and the Transition's own comment is the newest Transition comment. - Bring the branch. After a
claimfor this worktree, read the newestreleasecomment'shandoff.branch. For a branch on origin,git fetch origin <branch>; whengit worktree list --porcelainshows another worktree holding it, rungit switch -c <branch>-<n> origin/<branch>with the first<n>from 2 for whichgit branch --listandgit ls-remote --heads originprint nothing; otherwisegit switch <branch>. A failed fetch or switch leaves the Claim standing and the checkout unchanged, and is reported verbatim. Then use skillproduct-tree:sync-base.
</workflow>
<result>
Return the issue URL, the Transition, the readback values verbatim, and the comment's YAML block. A refusal returns the Transition, the state or the actor it required, the state found, and no write.
</result>
<failure_modes>
The assignee stood in for the holding session. Claude treated the assignee as proof that this session held the Change while a second session of the same account worked in another worktree. One account runs several sessions, so the newest claim comment's worktree names the session's place; the assignee alone names only the account.
A partial Transition was repaired by guessing. Claude's Lifecycle write failed after the comment landed, and Claude re-ran a later step to make the state look complete. Stop at the failed write, report the completed writes and the observed state, and leave the partial state visible.
</failure_modes>
<success_criteria>
- A Transition ran only on a Change in the state its row requires and for the actor
transition-actornames; every other request was refused with nothing written. - Each Transition posted exactly one comment, a YAML block with the keys
log-keysnames and only the extra its row admits. - No write reached a Maturity, Lifecycle, Value, or Investment field whose options differ from the values the standards name.
- The issue carries at most one assignee, and the readback shows every written field at its target and every other field unchanged.
- A release left the work branch pushed and the worktree detached from it, and a claim brought the newest Handoff's branch into this worktree.
</success_criteria>
04 同仓库更多 Skills
plugin
暂无简介
sanitize-powerpoint
ALWAYS invoke this skill when sanitizing, cleaning up, auditing, or aligning a PowerPoint (.pptx) deck — slide-master and layout structure, layout type attributes, stray fonts, non-theme colors, or layout naming. NEVER hand-edit pptx XML without this skill.
draw-excalidraw
ALWAYS invoke this skill when creating Excalidraw diagrams, visualizing workflows, architectures, or concepts. NEVER generate Excalidraw JSON without this skill.
typescript-test-standards
TypeScript test standards enforced across all skills. Loaded by other skills, not invoked directly.
typescript-code-standards
TypeScript code standards enforced across all skills. Loaded by other skills, not invoked directly.
typescript-architecture-standards
TypeScript ADR conventions enforced across architect and auditor skills. Loaded by other skills, not invoked directly.