[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71JJ9HTQ8B8E7MCV18KB71M":3,"skill-same:01M71JJ9HTQ8B8E7MCV18KB71M":73},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":49,"ownerHtmlUrl":50,"ownerBlogUrl":51,"ownerDescription":6,"updatedAt":52,"install":53,"resources":66},"01M71JJ9HTQ8B8E7MCV18KB71M","release-branch",null,"Make the merge\u002FPR\u002Fkeep\u002Fdiscard decision for a feature branch, verify coverage gates, create the PR with gh, and clean up the worktree. Use when a feature is done and ready to ship, or when user says \"release\", \"merge\", or \"open a PR\".","danielvm-git\u002Fbigpowers","danielvm-git","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1020864?v=4","01M71H1N1CTQ529S0KN7KETVG6","Daniel V M","01M71H1N218Y3S8WHCJ58NPRSW",290,"MIT","https:\u002F\u002Fgithub.com\u002Fdanielvm-git\u002Fbigpowers\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Frelease-branch\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"release","release branch","branch","feature","pr","make","ship","merge","worktree","haiku","verify coverage","create","done","when","open","clean","decision","up","ready","coverage","2026-11-10 10:12:30",false,"---\nname: release-branch\nmodel: haiku\ndescription: \"Make the merge\u002FPR\u002Fkeep\u002Fdiscard decision for a feature branch, verify coverage gates, create the PR with gh, and clean up the worktree. Use when a feature is done and ready to ship, or when user says \\\"release\\\", \\\"merge\\\", or \\\"open a PR\\\".\"\n---\n\n\u003C!-- story: e38s07 -->\n\u003C!-- story: e45s15 -->\n\u003C!-- story: e45s32 -->\n\u003C!-- story: e45s39 -->\n\u003C!-- story: e82s02 -->\n\u003C!-- story: e20s02 -->\n\n\n# Release Branch\n\n> **HARD GATE** — Do NOT merge or release if tests fail or if coverage gates are not met. If the branch is red, return to `develop-tdd` to fix regressions or add missing tests before proceeding.\n\nFinalize a completed feature branch: verify coverage gates, integrate onto `main`, and clean up the worktree.\n\n## Additional modes\n- `--hotfix`: Cherry-pick to main + tag. Skip PR in solo.\n- `--squash-state`: Squash `chore(state):` commits before merge.\n\n## Integrate mode\n\nRead `specs\u002Fstate.yaml` key `workflow_mode` (`team-pr` | `solo-git`). Fall back to `profiles\u002Fsolo-git.md`.\n\n| Mode | When | Ship path |\n|------|------|-----------|\n| **solo-local** | `workflow_mode: solo-git` | Auto: `scripts\u002Fland-branch.sh` if present, else fallback (Step 5) |\n| **team-pr** | `workflow_mode: team-pr` (default) | `gh pr create` → `gh pr merge --squash` |\n\nIf unsure, prefer **solo-local**. Also read `state.yaml` `vcs.kind`: Git follows the procedures below; Jujutsu uses workspaces\u002Fbookmarks and must not call Git-only landing scripts.\n\n## Process\n\n> **Timing:** `bash scripts\u002Fbp-timing.sh start release-branch` at invocation; `bash scripts\u002Fbp-timing.sh end release-branch` before handoff.\n\n### 1. Final verification\n\n```bash\n\u003Cfull test command> && \u003Ctypecheck command> && \u003Clint command>\ngit log main...HEAD --oneline | grep -vE \"^[a-f0-9]+ (feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\\(.+\\))?!?: .+$\" && echo \"❌ Non-conventional commits found\" || echo \"✅ Commits verified\"\n# Block AI agent attribution (P1)\ngit log main...HEAD --format=\"%B\" | grep -qiE 'co[- ]authored[- ]by' && echo \"❌ Co-authored-by footer found — blocked\" || echo \"✅ No AI attribution\"\n```\n\n- [ ] All tests pass, no type errors, no lint violations, all commits follow Conventional Commits\n- [ ] **NO `Co-authored-by` or `Co-Authored-By`** in any commit body — P1 rule (CONVENTIONS.md § Git Attribution). `land-branch.sh` blocks the merge if found.\n\n### 2. Coverage check\n\n- [ ] Overall coverage ≥ 80%; business logic coverage ≥ 95%\n\n### 2a. Security gate\n\n- [ ] `specs\u002Fsecurity\u002FREVIEW.md` exists and is fresh (matches current branch diff)\n\n### 2b. Audit-code & Traceability gates (HARD GATES — Issue #182)\n\n- [ ] Run `bash scripts\u002Flib\u002Fassert-epic-gate.sh release` (asserts `specs\u002FAUDIT_LATEST.md` passed; blocks release on failure).\n- [ ] No unresolved HIGH security findings with confidence ≥ 8 (or documented in `specs\u002Fsecurity\u002FEXCEPTIONS.md`).\n- [ ] Run `gate-trace`. FAIL blocks merge; CONCERNS requires explicit override in `specs\u002Fstate.yaml`. WAIVED if no matrix available.\n\n> **Adversarial refute framing (e45s32):** The final pre-merge check is **refute, not rubber-stamp**. Before declaring ready, actively try to disprove traceability completeness — missing story tags, absent verify evidence, stale security review. Only proceed when refutation fails.\n\n### 3. Diff review\n\n- [ ] All commits intentional, no secrets, CONVENTIONS.md compliance\n\n### 4. Decision\n\nOptions: **Release (solo-local)** \u002F **Open PR** \u002F **Keep branch** \u002F **Discard**\n\n### 5. Integrate\n\nRun `commit-message` first. Git solo-local uses `land-branch.sh`. Jujutsu team mode explicitly advances and pushes a bookmark; `-m` is mandatory for commit\u002Fdescribe operations:\n\n```bash\n# Git solo-local\nbash scripts\u002Fland-branch.sh \u003Ctask-slug> \"feat(scope): description\"\n# Jujutsu team PR\njj describe -m \"feat(scope): description\"\njj bookmark set \u003Ctask-slug> -r @\njj git push -b \u003Ctask-slug>\n```\n\nJujutsu solo-local landing is unsupported: run `bp_require_vcs_operation \"$PWD\" land-branch` and stop with its remediation instead of invoking the Git backend.\n\n### 6. Create PR (team-pr only)\n\nCreate the pull request with a **literal provenance marker** in the body so agent-generated PRs are identifiable and do not rot silently:\n\n```markdown\n\u003C!-- bigpowers-provenance: agent-generated -->\n```\n\nPlace the marker on its own line immediately after the `## Summary` heading. Then merge via `gh`:\n\n```bash\ngh pr create --title \"...\" --body \"$(cat \u003C\u003C'EOF'\n## Summary\n\u003C!-- bigpowers-provenance: agent-generated -->\n\n- ...\n\n## Test plan\n- [ ] ...\n\nEOF\n)\"\ngh pr merge --squash --delete-branch\n```\n\n`semantic-release` auto-detects the commit, bumps SemVer, tags the repo, generates release notes.\n\n### 7a. Archive completed epic capsule\n\n> **HARD GATE** — When all epic stories are done (all `done` in `execution-status.yaml`), archive the capsule:\n\n```bash\nmv specs\u002Fepics\u002FeNN-slug specs\u002Fepics\u002Farchive\u002F\n```\n\n### 7b. CI verification & agent lock release (e39s02)\n\n> **HARD GATE** — Do NOT declare success until CI completes. **Three-independent-facts** (e45s15): commit landed, workflow green, registry visible — see [REFERENCE.md](..\u002F..\u002F..\u002Fskills\u002Frelease-branch\u002FREFERENCE.md#three-independent-facts-release).\n\n```bash\nbash scripts\u002Fwait-for-ci.sh --timeout 600 --interval 30\n```\n\n- [ ] CI passes; `release.ci_verified: true` in state.yaml\n- On failure: `handoff.next_skill = fix-bug`\n\n### 8. Clean up & return\n\nGit: prune worktree, delete branch, return to main. Jujutsu: `jj workspace forget \u003Cworkspace>` only after integration; do not delete its bookmark implicitly. Cycle-time: see [REFERENCE.md](..\u002F..\u002F..\u002Fskills\u002Frelease-branch\u002FREFERENCE.md#cycle-time).\n\nReport: \"Branch released.\"\n\n## Verify\n\n→ verify: `command -v gh >\u002Fdev\u002Fnull 2>&1 && test -f specs\u002Fstate.yaml && test -d skills\u002Fverify-work`\n\n---\n\n# Release Branch — Reference\n\n## Navigation\n\n| Lines | Section |\n|-------|---------|\n| 1 | Title |\n| 3–22 | Navigation |\n| 23–31 | PR body template (team-pr mode) |\n| 32–35 | Summary |\n| 36–41 | Verify |\n| 42–47 | specs\u002F artifacts |\n| 48–58 | Worktree cleanup details |\n| 59–81 | Cycle-time recording |\n| 82–100 | Why not story_start minus story_end? |\n| 101–121 | CI verification |\n| 122–127 | Solo-local fallback detail |\n| 128–134 | Handoff |\n| 135–159 | Reference block 1 |\n\n# Release Branch — Reference\n\n## PR body template (team-pr mode)\n\n```bash\nPR_TITLE=\"\u003Ctype>(\u003Cscope>): \u003Cdescription>\"\necho \"$PR_TITLE\" | grep -vE \"^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\\(.+\\))?!?: .+$\" && echo \"❌ ERROR: PR Title must follow Conventional Commits\"\n\ngh pr create \\\n  --title \"$PR_TITLE\" \\\n  --body \"$(cat \u003C\u003C'EOF'\n## Summary\n- [What this PR does]\n- [Key decisions made]\n\n## Verify\n- [ ] All tests pass\n- [ ] Coverage gates met (≥80% overall, ≥95% business logic)\n- [ ] CONVENTIONS.md compliance verified\n- [ ] PR Title follows Conventional Commits (for automated release)\n\n## specs\u002F artifacts\n- [List any specs\u002F files produced or updated]\nEOF\n)\"\n```\n\n## Worktree cleanup details\n\n```bash\n# From the main repo root\ngit worktree prune\ngit worktree remove ..\u002F\u003Cbranch-name> 2>\u002Fdev\u002Fnull || true\ngit branch -d \u003Cbranch-name>\n```\n\nIf `git worktree remove` fails due to uncommitted changes, ask: \"There are uncommitted changes in the worktree. Force remove? (y\u002Fn)\". If yes: `git worktree remove -f ..\u002F\u003Cbranch-name>`.\n\n## Cycle-time recording\n\nAfter landing the branch, record delivery metrics using the git-derived,\nadditive script (replaces hand-arithmetic):\n\n```bash\nbash scripts\u002Frecord-cycle-time.sh append \\\n  --story \u003Cstory_id> --bcps \u003Cbcps> \\\n  --range \"$(git merge-base main HEAD)..HEAD\" \\\n  --file specs\u002Fmetrics\u002Fcycle-times.yaml\n```\n\nThis appends a row to the cycle-times ledger with two separated metrics:\n\n- **effort_hours** — ADDITIVE. Idle-stripped estimated effort from git commit\n  history (git-hours model: 120-min session threshold, 120-min first-commit pad).\n  Sums exactly to whole-repo effort. NO hand-arithmetic, NO wall-clock includes.\n- **lead_time_minutes** — calendar latency from first commit to merge.\n  Median-aggregated across stories; NEVER summed.\n\nThe script also runs an additivity self-check: Σ(story effort) == whole-repo effort\nwithin rounding tolerance.\n\n### Why not story_start minus story_end?\n\nThe previous hand-arithmetic approach (survey-context writes `story_start`,\nrelease-branch writes `story_end`, agent hand-computes `cycle_minutes`) was\nretired because:\n\n1. It was **agent-self-reported** — trivially fabricated or mis-subtracted.\n2. Wall-clock included **overnight\u002Fweekend\u002FUAT gaps** — calendar latency,\n   not coding effort.\n3. The `bcp_per_hour` metric was **computationally meaningless** (velocity\n   derived from a latency measurement).\n\nThe new approach derives effort from commit history (objective, reproducible)\nand lead time from first commit → merge (honest calendar latency). See\n`docs\u002Freferences\u002Fbcp.md` for BCP sizing context and\n`scripts\u002Frecord-cycle-time.sh` for the full algorithm.\n\n---\n\n## CI verification\n\nThe CI polling logic has been extracted to `scripts\u002Fwait-for-ci.sh`.\nSee the script's `--help` for usage. Step 7b of the main SKILL.md invokes it directly:\n\n```bash\nbash scripts\u002Fwait-for-ci.sh --timeout 600 --interval 30\n```\n\n**Exit codes:**\n- **0** — all workflows green. Set `release.ci_verified: true` in state.yaml.\n- **1** — at least one workflow failed. Prints failure URLs. Set `handoff.next_skill = fix-bug`.\n- **2** — timeout. CI did not complete. Retry or investigate.\n- **0 with warning** — `gh` CLI not available, git-only fallback confirmed push landed but CI status unverified.\n\nThe script handles: auto-discovery of all workflows for the current\nbranch\u002Fcommit, polling until completion, success\u002Ffailure\u002Ftimeout exit codes,\nand git-only fallback when `gh` CLI is unavailable.\n\n---\n\n## Solo-local fallback detail\n\nThe fallback sequence (Path B above) handles the \"remote has moved\" case with `git pull --rebase`. Use when `scripts\u002Fland-branch.sh` is absent.\n\n**Acceptance:** When fallback runs, main is updated, feature branch is deleted locally, and output states `\"used fallback merge (land-branch.sh not found)\"`.\n\n## Handoff\n\nGate: READY -> next: survey-context\nWrites: state.yaml handoff.next_skill = survey-context\n\n---\n\n## Reference block 1\n\n```bash\n# Fallback: manual squash-merge when land-branch.sh is absent\nFEATURE_BRANCH=\u003Ctask-slug>\nDEFAULT_BRANCH=$(git symbolic-ref refs\u002Fremotes\u002Forigin\u002FHEAD 2>\u002Fdev\u002Fnull | sed 's@^refs\u002Fremotes\u002Forigin\u002F@@' || echo main)\n\n# Ensure we're on the feature branch\nif [ \"$(git branch --show-current)\" != \"$FEATURE_BRANCH\" ]; then\n  git checkout \"$FEATURE_BRANCH\"\nfi\n\n# Checkout default branch and update\ngit checkout \"$DEFAULT_BRANCH\"\ngit pull --rebase origin \"$DEFAULT_BRANCH\" 2>\u002Fdev\u002Fnull || git pull origin \"$DEFAULT_BRANCH\"\n\n# Squash-merge the feature branch\ngit merge --no-ff \"$FEATURE_BRANCH\" -m \"\u003Cconventional-commit-message>\"\n\n# Push\ngit push origin \"$DEFAULT_BRANCH\"\n\n# Clean up local feature branch\ngit branch -d \"$FEATURE_BRANCH\"\n```\n","\u003C!-- story: e38s07 -->\n\u003C!-- story: e45s15 -->\n\u003C!-- story: e45s32 -->\n\u003C!-- story: e45s39 -->\n\u003C!-- story: e82s02 -->\n\u003C!-- story: e20s02 -->\n\n\n# Release Branch\n\n> **HARD GATE** — Do NOT merge or release if tests fail or if coverage gates are not met. If the branch is red, return to `develop-tdd` to fix regressions or add missing tests before proceeding.\n\nFinalize a completed feature branch: verify coverage gates, integrate onto `main`, and clean up the worktree.\n\n## Additional modes\n- `--hotfix`: Cherry-pick to main + tag. Skip PR in solo.\n- `--squash-state`: Squash `chore(state):` commits before merge.\n\n## Integrate mode\n\nRead `specs\u002Fstate.yaml` key `workflow_mode` (`team-pr` | `solo-git`). Fall back to `profiles\u002Fsolo-git.md`.\n\n| Mode | When | Ship path |\n|------|------|-----------|\n| **solo-local** | `workflow_mode: solo-git` | Auto: `scripts\u002Fland-branch.sh` if present, else fallback (Step 5) |\n| **team-pr** | `workflow_mode: team-pr` (default) | `gh pr create` → `gh pr merge --squash` |\n\nIf unsure, prefer **solo-local**. Also read `state.yaml` `vcs.kind`: Git follows the procedures below; Jujutsu uses workspaces\u002Fbookmarks and must not call Git-only landing scripts.\n\n## Process\n\n> **Timing:** `bash scripts\u002Fbp-timing.sh start release-branch` at invocation; `bash scripts\u002Fbp-timing.sh end release-branch` before handoff.\n\n### 1. Final verification\n\n```bash\n\u003Cfull test command> && \u003Ctypecheck command> && \u003Clint command>\ngit log main...HEAD --oneline | grep -vE \"^[a-f0-9]+ (feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\\(.+\\))?!?: .+$\" && echo \"❌ Non-conventional commits found\" || echo \"✅ Commits verified\"\n# Block AI agent attribution (P1)\ngit log main...HEAD --format=\"%B\" | grep -qiE 'co[- ]authored[- ]by' && echo \"❌ Co-authored-by footer found — blocked\" || echo \"✅ No AI attribution\"\n```\n\n- [ ] All tests pass, no type errors, no lint violations, all commits follow Conventional Commits\n- [ ] **NO `Co-authored-by` or `Co-Authored-By`** in any commit body — P1 rule (CONVENTIONS.md § Git Attribution). `land-branch.sh` blocks the merge if found.\n\n### 2. Coverage check\n\n- [ ] Overall coverage ≥ 80%; business logic coverage ≥ 95%\n\n### 2a. Security gate\n\n- [ ] `specs\u002Fsecurity\u002FREVIEW.md` exists and is fresh (matches current branch diff)\n\n### 2b. Audit-code & Traceability gates (HARD GATES — Issue #182)\n\n- [ ] Run `bash scripts\u002Flib\u002Fassert-epic-gate.sh release` (asserts `specs\u002FAUDIT_LATEST.md` passed; blocks release on failure).\n- [ ] No unresolved HIGH security findings with confidence ≥ 8 (or documented in `specs\u002Fsecurity\u002FEXCEPTIONS.md`).\n- [ ] Run `gate-trace`. FAIL blocks merge; CONCERNS requires explicit override in `specs\u002Fstate.yaml`. WAIVED if no matrix available.\n\n> **Adversarial refute framing (e45s32):** The final pre-merge check is **refute, not rubber-stamp**. Before declaring ready, actively try to disprove traceability completeness — missing story tags, absent verify evidence, stale security review. Only proceed when refutation fails.\n\n### 3. Diff review\n\n- [ ] All commits intentional, no secrets, CONVENTIONS.md compliance\n\n### 4. Decision\n\nOptions: **Release (solo-local)** \u002F **Open PR** \u002F **Keep branch** \u002F **Discard**\n\n### 5. Integrate\n\nRun `commit-message` first. Git solo-local uses `land-branch.sh`. Jujutsu team mode explicitly advances and pushes a bookmark; `-m` is mandatory for commit\u002Fdescribe operations:\n\n```bash\n# Git solo-local\nbash scripts\u002Fland-branch.sh \u003Ctask-slug> \"feat(scope): description\"\n# Jujutsu team PR\njj describe -m \"feat(scope): description\"\njj bookmark set \u003Ctask-slug> -r @\njj git push -b \u003Ctask-slug>\n```\n\nJujutsu solo-local landing is unsupported: run `bp_require_vcs_operation \"$PWD\" land-branch` and stop with its remediation instead of invoking the Git backend.\n\n### 6. Create PR (team-pr only)\n\nCreate the pull request with a **literal provenance marker** in the body so agent-generated PRs are identifiable and do not rot silently:\n\n```markdown\n\u003C!-- bigpowers-provenance: agent-generated -->\n```\n\nPlace the marker on its own line immediately after the `## Summary` heading. Then merge via `gh`:\n\n```bash\ngh pr create --title \"...\" --body \"$(cat \u003C\u003C'EOF'\n## Summary\n\u003C!-- bigpowers-provenance: agent-generated -->\n\n- ...\n\n## Test plan\n- [ ] ...\n\nEOF\n)\"\ngh pr merge --squash --delete-branch\n```\n\n`semantic-release` auto-detects the commit, bumps SemVer, tags the repo, generates release notes.\n\n### 7a. Archive completed epic capsule\n\n> **HARD GATE** — When all epic stories are done (all `done` in `execution-status.yaml`), archive the capsule:\n\n```bash\nmv specs\u002Fepics\u002FeNN-slug specs\u002Fepics\u002Farchive\u002F\n```\n\n### 7b. CI verification & agent lock release (e39s02)\n\n> **HARD GATE** — Do NOT declare success until CI completes. **Three-independent-facts** (e45s15): commit landed, workflow green, registry visible — see [REFERENCE.md](..\u002F..\u002F..\u002Fskills\u002Frelease-branch\u002FREFERENCE.md#three-independent-facts-release).\n\n```bash\nbash scripts\u002Fwait-for-ci.sh --timeout 600 --interval 30\n```\n\n- [ ] CI passes; `release.ci_verified: true` in state.yaml\n- On failure: `handoff.next_skill = fix-bug`\n\n### 8. Clean up & return\n\nGit: prune worktree, delete branch, return to main. Jujutsu: `jj workspace forget \u003Cworkspace>` only after integration; do not delete its bookmark implicitly. Cycle-time: see [REFERENCE.md](..\u002F..\u002F..\u002Fskills\u002Frelease-branch\u002FREFERENCE.md#cycle-time).\n\nReport: \"Branch released.\"\n\n## Verify\n\n→ verify: `command -v gh >\u002Fdev\u002Fnull 2>&1 && test -f specs\u002Fstate.yaml && test -d skills\u002Fverify-work`\n\n---\n\n# Release Branch — Reference\n\n## Navigation\n\n| Lines | Section |\n|-------|---------|\n| 1 | Title |\n| 3–22 | Navigation |\n| 23–31 | PR body template (team-pr mode) |\n| 32–35 | Summary |\n| 36–41 | Verify |\n| 42–47 | specs\u002F artifacts |\n| 48–58 | Worktree cleanup details |\n| 59–81 | Cycle-time recording |\n| 82–100 | Why not story_start minus story_end? |\n| 101–121 | CI verification |\n| 122–127 | Solo-local fallback detail |\n| 128–134 | Handoff |\n| 135–159 | Reference block 1 |\n\n# Release Branch — Reference\n\n## PR body template (team-pr mode)\n\n```bash\nPR_TITLE=\"\u003Ctype>(\u003Cscope>): \u003Cdescription>\"\necho \"$PR_TITLE\" | grep -vE \"^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\\(.+\\))?!?: .+$\" && echo \"❌ ERROR: PR Title must follow Conventional Commits\"\n\ngh pr create \\\n  --title \"$PR_TITLE\" \\\n  --body \"$(cat \u003C\u003C'EOF'\n## Summary\n- [What this PR does]\n- [Key decisions made]\n\n## Verify\n- [ ] All tests pass\n- [ ] Coverage gates met (≥80% overall, ≥95% business logic)\n- [ ] CONVENTIONS.md compliance verified\n- [ ] PR Title follows Conventional Commits (for automated release)\n\n## specs\u002F artifacts\n- [List any specs\u002F files produced or updated]\nEOF\n)\"\n```\n\n## Worktree cleanup details\n\n```bash\n# From the main repo root\ngit worktree prune\ngit worktree remove ..\u002F\u003Cbranch-name> 2>\u002Fdev\u002Fnull || true\ngit branch -d \u003Cbranch-name>\n```\n\nIf `git worktree remove` fails due to uncommitted changes, ask: \"There are uncommitted changes in the worktree. Force remove? (y\u002Fn)\". If yes: `git worktree remove -f ..\u002F\u003Cbranch-name>`.\n\n## Cycle-time recording\n\nAfter landing the branch, record delivery metrics using the git-derived,\nadditive script (replaces hand-arithmetic):\n\n```bash\nbash scripts\u002Frecord-cycle-time.sh append \\\n  --story \u003Cstory_id> --bcps \u003Cbcps> \\\n  --range \"$(git merge-base main HEAD)..HEAD\" \\\n  --file specs\u002Fmetrics\u002Fcycle-times.yaml\n```\n\nThis appends a row to the cycle-times ledger with two separated metrics:\n\n- **effort_hours** — ADDITIVE. Idle-stripped estimated effort from git commit\n  history (git-hours model: 120-min session threshold, 120-min first-commit pad).\n  Sums exactly to whole-repo effort. NO hand-arithmetic, NO wall-clock includes.\n- **lead_time_minutes** — calendar latency from first commit to merge.\n  Median-aggregated across stories; NEVER summed.\n\nThe script also runs an additivity self-check: Σ(story effort) == whole-repo effort\nwithin rounding tolerance.\n\n### Why not story_start minus story_end?\n\nThe previous hand-arithmetic approach (survey-context writes `story_start`,\nrelease-branch writes `story_end`, agent hand-computes `cycle_minutes`) was\nretired because:\n\n1. It was **agent-self-reported** — trivially fabricated or mis-subtracted.\n2. Wall-clock included **overnight\u002Fweekend\u002FUAT gaps** — calendar latency,\n   not coding effort.\n3. The `bcp_per_hour` metric was **computationally meaningless** (velocity\n   derived from a latency measurement).\n\nThe new approach derives effort from commit history (objective, reproducible)\nand lead time from first commit → merge (honest calendar latency). See\n`docs\u002Freferences\u002Fbcp.md` for BCP sizing context and\n`scripts\u002Frecord-cycle-time.sh` for the full algorithm.\n\n---\n\n## CI verification\n\nThe CI polling logic has been extracted to `scripts\u002Fwait-for-ci.sh`.\nSee the script's `--help` for usage. Step 7b of the main SKILL.md invokes it directly:\n\n```bash\nbash scripts\u002Fwait-for-ci.sh --timeout 600 --interval 30\n```\n\n**Exit codes:**\n- **0** — all workflows green. Set `release.ci_verified: true` in state.yaml.\n- **1** — at least one workflow failed. Prints failure URLs. Set `handoff.next_skill = fix-bug`.\n- **2** — timeout. CI did not complete. Retry or investigate.\n- **0 with warning** — `gh` CLI not available, git-only fallback confirmed push landed but CI status unverified.\n\nThe script handles: auto-discovery of all workflows for the current\nbranch\u002Fcommit, polling until completion, success\u002Ffailure\u002Ftimeout exit codes,\nand git-only fallback when `gh` CLI is unavailable.\n\n---\n\n## Solo-local fallback detail\n\nThe fallback sequence (Path B above) handles the \"remote has moved\" case with `git pull --rebase`. Use when `scripts\u002Fland-branch.sh` is absent.\n\n**Acceptance:** When fallback runs, main is updated, feature branch is deleted locally, and output states `\"used fallback merge (land-branch.sh not found)\"`.\n\n## Handoff\n\nGate: READY -> next: survey-context\nWrites: state.yaml handoff.next_skill = survey-context\n\n---\n\n## Reference block 1\n\n```bash\n# Fallback: manual squash-merge when land-branch.sh is absent\nFEATURE_BRANCH=\u003Ctask-slug>\nDEFAULT_BRANCH=$(git symbolic-ref refs\u002Fremotes\u002Forigin\u002FHEAD 2>\u002Fdev\u002Fnull | sed 's@^refs\u002Fremotes\u002Forigin\u002F@@' || echo main)\n\n# Ensure we're on the feature branch\nif [ \"$(git branch --show-current)\" != \"$FEATURE_BRANCH\" ]; then\n  git checkout \"$FEATURE_BRANCH\"\nfi\n\n# Checkout default branch and update\ngit checkout \"$DEFAULT_BRANCH\"\ngit pull --rebase origin \"$DEFAULT_BRANCH\" 2>\u002Fdev\u002Fnull || git pull origin \"$DEFAULT_BRANCH\"\n\n# Squash-merge the feature branch\ngit merge --no-ff \"$FEATURE_BRANCH\" -m \"\u003Cconventional-commit-message>\"\n\n# Push\ngit push origin \"$DEFAULT_BRANCH\"\n\n# Clean up local feature branch\ngit branch -d \"$FEATURE_BRANCH\"\n```\n",{"name":5,"model":28,"description":7},"main","72f5e4c8b43f60cf86b37078ad8cd7e22daf67aa",".pi\u002Fskills\u002Frelease-branch",24,"https:\u002F\u002Fgithub.com\u002Fdanielvm-git\u002Fbigpowers","https:\u002F\u002Fdanielvm-git.github.io\u002Fbigpowers\u002F","https:\u002F\u002Fgithub.com\u002Fdanielvm-git","danielvm.net","2026-11-10 01:18:54",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add danielvm-git\u002Fbigpowers --skill release-branch",{"tool":59,"command":60},"bunx","bunx skills add danielvm-git\u002Fbigpowers --skill release-branch",{"tool":62,"command":63},"pnpm","pnpm dlx skills add danielvm-git\u002Fbigpowers --skill release-branch","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdanielvm-git\u002Fbigpowers\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Frelease-branch\u002FSKILL.md",true,[67],{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"REFERENCE.md","REFERENCE","参考文档",5228,"https:\u002F\u002Fgithub.com\u002Fdanielvm-git\u002Fbigpowers\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Frelease-branch\u002FREFERENCE.md",[74,94,101,130,153,174],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":85,"publishedAt":39},"01M71KBG9F8X644MJB16H4V8M7","skill-verify-fail-open-fixture","Negative-path fixture for run-skill-verify.sh — must never PASS.","https:\u002F\u002Fgithub.com\u002Fdanielvm-git\u002Fbigpowers\u002Fblob\u002Fmain\u002Fspecs\u002Fverifications\u002Ffixtures\u002Fskill-verify-fail-open\u002FSKILL.md",[80],{"categoryNo":81,"categoryName":82,"taxonomyType":83,"taxonomyTypeDesc":84},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[86,33,87,88,89,90,91,92,93],"fixture","verify","skill verify fail open fixture","skill verify","path","run","for","never",{"skillNo":95,"name":96,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":39},"01M71KBE3BKEMKNE0C5DGVDWZH","negative-path","https:\u002F\u002Fgithub.com\u002Fdanielvm-git\u002Fbigpowers\u002Fblob\u002Fmain\u002Fspecs\u002Fverifications\u002Ffixtures\u002Fnegative-path\u002FSKILL.md",[],[100,90],"negative path",{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":110,"publishedAt":39},"01M71KBBGF7Y4EB4AMHBZ8CJFC","write-document","Write, organize, and sync high-integrity technical documents using the BMAD methodology. Ensures every document is Bold, Minimal, Actionable, and Durable. Use when creating architectural docs, technical guides, or organizing the specs\u002F directory.","https:\u002F\u002Fgithub.com\u002Fdanielvm-git\u002Fbigpowers\u002Fblob\u002Fmain\u002Fskills\u002Fwrite-document\u002FSKILL.md",[107],{"categoryNo":108,"categoryName":109,"taxonomyType":83,"taxonomyTypeDesc":84},"01JBSEEDCAT000000000000002","文档处理",[111,112,113,114,115,116,117,118,119,120,121,32,122,123,124,125,126,127,128,129],"write","write document","document","documents","actionable","technical","methodology","high","bmad","standard","use","minimal","bold","sonnet","integrity","organize","sync","directory","guides",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":136,"publishedAt":39},"01M71KB8TM089JJD5AY5KAFSDM","wire-observability","Add structured JSON logging, observability commands, and idempotent setup scripts to a project. Use when a project needs production-readiness instrumentation, when user wants structured logging, or as a production-readiness gate at any phase of development.","https:\u002F\u002Fgithub.com\u002Fdanielvm-git\u002Fbigpowers\u002Fblob\u002Fmain\u002Fskills\u002Fwire-observability\u002FSKILL.md",[],[137,138,139,120,140,121,141,142,143,144,124,145,146,147,148,149,150,32,151,152],"observability","wire observability","readiness","commands","development","as","logging","add","instrumentation","at","structured logging","production-readiness","idempotent","phase","project","scripts",{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":159,"publishedAt":39},"01M71KB6CNRANP449DQA3NJZ96","wire-ci","CI pipeline setup with bundled, forge-neutral templates and local validation. Detects the forge from the git remote, generates workflows for supported forges, and skips honestly for the rest. The CI equivalent of wire-observability.","https:\u002F\u002Fgithub.com\u002Fdanielvm-git\u002Fbigpowers\u002Fblob\u002Fmain\u002Fskills\u002Fwire-ci\u002FSKILL.md",[],[160,161,162,163,164,165,166,167,168,169,170,120,171,92,137,124,172,173],"wire ci","ci","remote","local","pipeline","forge","validation","setup","templates","REST","with","ci pipeline setup","git","workflows",{"skillNo":175,"name":176,"nameZh":6,"description":177,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":178,"categories":179,"keywords":191,"publishedAt":39},"01M71KB2ZV98P03X88QR8MT9F1","visual-dashboard","Start a browser-based dashboard that visualizes architecture, implementation plans, and project status. Persists artifacts in .bigpowers\u002Fdashboard\u002F. Reads specs\u002Fstate.yaml, release-plan.yaml, epics, and planning-status via HTTP API or opencode panel.","https:\u002F\u002Fgithub.com\u002Fdanielvm-git\u002Fbigpowers\u002Fblob\u002Fmain\u002Fskills\u002Fvisual-dashboard\u002FSKILL.md",[180,183,188],{"categoryNo":181,"categoryName":182,"taxonomyType":83,"taxonomyTypeDesc":84},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":184,"categoryName":185,"taxonomyType":186,"taxonomyTypeDesc":187},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",{"categoryNo":189,"categoryName":190,"taxonomyType":186,"taxonomyTypeDesc":187},"01JBSEEDCAT000000000000033","数据分析师",[192,193,194,195,196,197,198,199,200,124,201,19,202,203,204,205,206,151,207,208],"dashboard","visual","visual dashboard","status","artifacts","http","plans","planning","panel","start","opencode","plan","browser","api","architecture","project status","http api"]