Submit Ticket PR
Two separately invoked halves. Open runs inside a deliver-ticket lane after verify; Merge runs in the orchestrator's serial merge slot after the lane reports ready-to-merge-child. Child PRs target the epic branch, never main/master.
Under Florist neither half runs — this skill holds no seat. The kernel opens the child PR (pr-create) once the implementing seat's impl-ready digest verifies, and merges it (child-merge) once the integrating seat's verdict lands; both are irreversible actions performed over an exact head SHA. The docs-sync step moves into the implementing seat (implement-ticket § Phase sequence) so its edits sit on the head the PR opens over. The Merge section's eligibility rules hold there as kernel mechanics: currency is the integrating seat's sync edge, review-clean is the pinned clean final round, the verified merge is the kernel's checkpoint read. See epic-orchestrator/florist-worker-contract.md § 9.
Inputs
- child ticket id
- child branch
- epic branch
- child worktree
- evidence summary from implementation, review, tests, and verification
Open (lane-invoked)
- Verify the child branch is not main/master and targets the epic branch.
- Docs-sync. Dispatch the docs-sync worker (see
docs-sync-prompt.md, child mode) at Frontier tier — policy soft per AGENTS.md § Frontier Availability Policy (opus substitutes attributed on Claude Code, no make-up; the epic docs-sync sweep in submit-epic-pr is the backstop). Resolve the runtime-native Frontier executor per epic-orchestrator/execution-model.md § 2. Scope: the child diff vs the epic branch. If the worker edited module docs, commit them on the child branch (docs-sync: <summary>) — the doc edits ride the pushed diff so the child-PR review gate reviews them. Carry the worker's docs-sync: evidence line forward; "no update" is a recorded decision with its reason, never a silent skip.
- Push the child branch.
- Open a PR from child branch to epic branch.
- Write a PR body with spec, plan, test evidence, verification evidence (incl. repo-local + broader checks), the
docs-sync: line, and ticket link. Reference the ticket with the non-closing form Part of <ticket-id> — never Closes/Fixes on a child PR: children reach their terminal state when the epic merges to main/master, not when the child merges to the epic branch.
- Return to the lane — the lane runs
review (child-PR context) next. Do not merge from this half.
git push -u origin <child-branch>
gh pr create --base <epic-branch> --head <child-branch> --title "<ticket-id>: <title>" --body-file <pr-body-file>
Merge (orchestrator-invoked, strictly serial)
This section is the single source of merge eligibility — consumers reference it, never restate it.
- Require the lane's
ready-to-merge-child report with clean child-PR review and local CI-equivalent evidence — evidence-checker citations when adopting (per the epic-orchestrator Evidence Rule); own-session evidence trail otherwise.
- Verify the child branch is current with the epic head. If the epic moved, return to the lane for a sync and rerun of relevant checks — do not merge a stale branch. De-minimis exception: if everything the epic gained since the child branched is demonstrably disjoint from the child's file surface and touches no code (docs-only housekeeping), the merge slot may proceed — record the divergence assessment and the deviation in the done comment. Any code, config, schema, or generated-file movement means sync, no exceptions.
- Squash merge, then verify the merge actually happened —
gh pr merge can succeed silently without merging (field-confirmed: zero output, no merge). Never claim the merge from the merge command's exit; claim it from the verification script.
- Clean up the child branch and worktree via the cleanup script, threading the verified merge SHA through — squash merges rewrite the SHA, so the script's content-match proof requires it.
- Update the child ticket with PR link, merge evidence (including the verified merge commit), and final status.
gh pr merge <child-pr-number> --squash
# Verification is mandatory; the script owns the postcondition mechanics.
merge_sha="$("${CLAUDE_PLUGIN_ROOT}/scripts/verify-merge.sh" <child-pr-number> <epic-branch>)"
# Cleanup (handles worktree-checked-out branches; refuses without proof):
"${CLAUDE_PLUGIN_ROOT}/scripts/cleanup-branch.sh" <child-branch> <epic-branch> <child-worktree> . "$merge_sha"
Expected evidence:
- push output or remote branch URL
- the
docs-sync: evidence line (updated paths, or an attributed no-op with its reason)
- PR URL
- clean child-PR review evidence (
review, child-PR context)
- local CI-equivalent command evidence — a child-PR-stage local CI digest, or the checkpoint-recorded verify-stage local-CI digest when the conditional-CI predicate held (
review, child-PR context; the durable record, not session memory)
- merge verification:
gh pr view showing state MERGED plus the merge commit id (merge command output alone is not evidence)
- child ticket comment with final status
Rules
- Do not target main/master.
- Only the orchestrator's serial merge slot may merge; lanes never do.
- Do not merge if review or local CI-equivalent checks are not clean.
- Do not merge if the child branch is stale against the epic branch.
- Demote per the orchestrator's demotion rules if review or tests expose product, architecture, scope, or spec/plan mismatch.
1---2name: submit-ticket-pr3description: Open a child ticket PR against the epic branch (lane-invoked) and merge it into the epic branch (orchestrator-invoked, serial)4---56# Submit Ticket PR78Two separately invoked halves. **Open** runs inside a `deliver-ticket` lane after verify; **Merge** runs in the orchestrator's serial merge slot after the lane reports `ready-to-merge-child`. Child PRs target the epic branch, never main/master.910**Under Florist neither half runs** — this skill holds no seat. The kernel opens the child PR (`pr-create`) once the implementing seat's `impl-ready` digest verifies, and merges it (`child-merge`) once the integrating seat's verdict lands; both are irreversible actions performed over an exact head SHA. The docs-sync step moves into the implementing seat (`implement-ticket` § Phase sequence) so its edits sit on the head the PR opens over. The Merge section's eligibility rules hold there as kernel mechanics: currency is the integrating seat's sync edge, review-clean is the pinned clean final round, the verified merge is the kernel's checkpoint read. See `epic-orchestrator/florist-worker-contract.md` § 9.1112## Inputs1314- child ticket id15- child branch16- epic branch17- child worktree18- evidence summary from implementation, review, tests, and verification1920## Open (lane-invoked)21221. Verify the child branch is not main/master and targets the epic branch.232. **Docs-sync.** Dispatch the docs-sync worker (see `docs-sync-prompt.md`, child mode) at Frontier tier — policy **soft** per AGENTS.md § Frontier Availability Policy (`opus` substitutes attributed on Claude Code, no make-up; the epic docs-sync sweep in `submit-epic-pr` is the backstop). Resolve the runtime-native Frontier executor per `epic-orchestrator/execution-model.md` § 2. Scope: the child diff vs the epic branch. If the worker edited module docs, commit them on the child branch (`docs-sync: <summary>`) — the doc edits ride the pushed diff so the child-PR review gate reviews them. Carry the worker's `docs-sync:` evidence line forward; "no update" is a recorded decision with its reason, never a silent skip.243. Push the child branch.254. Open a PR from child branch to epic branch.265. Write a PR body with spec, plan, test evidence, verification evidence (incl. repo-local + broader checks), the `docs-sync:` line, and ticket link. Reference the ticket with the **non-closing** form `Part of <ticket-id>` — never `Closes`/`Fixes` on a child PR: children reach their terminal state when the epic merges to main/master, not when the child merges to the epic branch.276. Return to the lane — the lane runs `review` (child-PR context) next. Do not merge from this half.2829```bash30git push -u origin <child-branch>31gh pr create --base <epic-branch> --head <child-branch> --title "<ticket-id>: <title>" --body-file <pr-body-file>32```3334## Merge (orchestrator-invoked, strictly serial)3536This section is the **single source of merge eligibility** — consumers reference it, never restate it.37381. Require the lane's `ready-to-merge-child` report with clean child-PR review and local CI-equivalent evidence — evidence-checker citations when adopting (per the epic-orchestrator Evidence Rule); own-session evidence trail otherwise.392. Verify the child branch is current with the epic head. If the epic moved, return to the lane for a sync and rerun of relevant checks — do not merge a stale branch. **De-minimis exception:** if everything the epic gained since the child branched is demonstrably disjoint from the child's file surface *and* touches no code (docs-only housekeeping), the merge slot may proceed — record the divergence assessment and the deviation in the done comment. Any code, config, schema, or generated-file movement means sync, no exceptions.403. Squash merge, then **verify the merge actually happened** — `gh pr merge` can succeed silently without merging (field-confirmed: zero output, no merge). Never claim the merge from the merge command's exit; claim it from the verification script.414. Clean up the child branch and worktree via the cleanup script, threading the verified merge SHA through — squash merges rewrite the SHA, so the script's content-match proof requires it.425. Update the child ticket with PR link, merge evidence (including the verified merge commit), and final status.4344```bash45gh pr merge <child-pr-number> --squash4647# Verification is mandatory; the script owns the postcondition mechanics.48merge_sha="$("${CLAUDE_PLUGIN_ROOT}/scripts/verify-merge.sh" <child-pr-number> <epic-branch>)"4950# Cleanup (handles worktree-checked-out branches; refuses without proof):51"${CLAUDE_PLUGIN_ROOT}/scripts/cleanup-branch.sh" <child-branch> <epic-branch> <child-worktree> . "$merge_sha"52```5354Expected evidence:5556- push output or remote branch URL57- the `docs-sync:` evidence line (updated paths, or an attributed no-op with its reason)58- PR URL59- clean child-PR review evidence (`review`, child-PR context)60- local CI-equivalent command evidence — a child-PR-stage local CI digest, or the **checkpoint-recorded** verify-stage local-CI digest when the conditional-CI predicate held (`review`, child-PR context; the durable record, not session memory)61- merge verification: `gh pr view` showing state MERGED plus the merge commit id (merge command output alone is not evidence)62- child ticket comment with final status6364## Rules6566- Do not target main/master.67- Only the orchestrator's serial merge slot may merge; lanes never do.68- Do not merge if review or local CI-equivalent checks are not clean.69- Do not merge if the child branch is stale against the epic branch.70- Demote per the orchestrator's demotion rules if review or tests expose product, architecture, scope, or spec/plan mismatch.