[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71J3Y3PBMR151ME873HSF47":3,"skill-same:01M71J3Y3PBMR151ME873HSF47":67},{"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":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":50,"ownerHtmlUrl":51,"ownerBlogUrl":52,"ownerDescription":6,"updatedAt":53,"install":54,"resources":66},"01M71J3Y3PBMR151ME873HSF47","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",292,"MIT","https:\u002F\u002Fgithub.com\u002Fdanielvm-git\u002Fbigpowers\u002Fblob\u002Fmain\u002F.gemini\u002Fextensions\u002Fbigpowers\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","worktree","haiku","done","when","decision","up","coverage","user","keep","use","for","ship","verify coverage","create","open","clean","ready","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\\\".\"\ndisable-model-invocation: true\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](REFERENCE.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](REFERENCE.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](REFERENCE.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](REFERENCE.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":23,"description":7,"disable-model-invocation":44},true,"main","72f5e4c8b43f60cf86b37078ad8cd7e22daf67aa",".gemini\u002Fextensions\u002Fbigpowers\u002Fskills\u002Frelease-branch",23,"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":55,"prompt":65,"zipAvailable":44},[56,59,62],{"tool":57,"command":58},"npx","npx skills add danielvm-git\u002Fbigpowers --skill release-branch",{"tool":60,"command":61},"bunx","bunx skills add danielvm-git\u002Fbigpowers --skill release-branch",{"tool":63,"command":64},"pnpm","pnpm dlx skills add danielvm-git\u002Fbigpowers --skill release-branch","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdanielvm-git\u002Fbigpowers\u002Fblob\u002Fmain\u002F.gemini\u002Fextensions\u002Fbigpowers\u002Fskills\u002Frelease-branch\u002FSKILL.md",[],[68,87,94,122,145,166],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":79,"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",[74],{"categoryNo":75,"categoryName":76,"taxonomyType":77,"taxonomyTypeDesc":78},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[80,36,81,82,83,84,85,32,86],"fixture","verify","skill verify fail open fixture","skill verify","path","run","never",{"skillNo":88,"name":89,"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":90,"categories":91,"keywords":92,"publishedAt":39},"01M71KBE3BKEMKNE0C5DGVDWZH","negative-path","https:\u002F\u002Fgithub.com\u002Fdanielvm-git\u002Fbigpowers\u002Fblob\u002Fmain\u002Fspecs\u002Fverifications\u002Ffixtures\u002Fnegative-path\u002FSKILL.md",[],[93,84],"negative path",{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":103,"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",[100],{"categoryNo":101,"categoryName":102,"taxonomyType":77,"taxonomyTypeDesc":78},"01JBSEEDCAT000000000000002","文档处理",[104,105,106,107,108,109,110,111,112,113,31,25,114,115,116,117,118,119,120,121],"write","write document","document","documents","actionable","technical","methodology","high","bmad","standard","minimal","bold","sonnet","integrity","organize","sync","directory","guides",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":128,"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",[],[129,130,131,113,132,31,133,134,135,136,116,137,138,139,140,141,142,25,143,144],"observability","wire observability","readiness","commands","development","as","logging","add","instrumentation","at","structured logging","production-readiness","idempotent","phase","project","scripts",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":151,"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",[],[152,153,154,155,156,157,158,159,160,161,162,113,163,32,129,116,164,165],"wire ci","ci","remote","local","pipeline","forge","validation","setup","templates","REST","with","ci pipeline setup","git","workflows",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":170,"categories":171,"keywords":183,"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",[172,175,180],{"categoryNo":173,"categoryName":174,"taxonomyType":77,"taxonomyTypeDesc":78},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":176,"categoryName":177,"taxonomyType":178,"taxonomyTypeDesc":179},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",{"categoryNo":181,"categoryName":182,"taxonomyType":178,"taxonomyTypeDesc":179},"01JBSEEDCAT000000000000033","数据分析师",[184,185,186,187,188,189,190,191,192,116,193,19,194,195,196,197,198,143,199,200],"dashboard","visual","visual dashboard","status","artifacts","http","plans","planning","panel","start","opencode","plan","browser","api","architecture","project status","http api"]