[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CF13MTPRG5JVX56T10MB49":3,"skill-same:01M6CF13MTPRG5JVX56T10MB49":101},{"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":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":79,"commitSha":80,"skillDirectory":81,"forksCount":82,"repositoryHtmlUrl":83,"repositoryHomepageUrl":6,"ownerHtmlUrl":84,"ownerBlogUrl":6,"ownerDescription":85,"updatedAt":86,"install":87,"resources":100},"01M6CF13MTPRG5JVX56T10MB49","release-effector",null,"δ-side mechanics for cutting a release — scripts\u002Frelease.sh invocation, tag push, release CI polling, CI-red recovery runbook, branch cleanup. The platform-actions companion to release\u002FSKILL.md (β-side authoring).","usurobor\u002Fcnos","usurobor","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F182342826?v=4","01M6CEXJCRMYD8HB2315FGB1Q8","Peter Lisovin","01M6CEXJH2RW04GQ2SNXY40F5S",9,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fusurobor\u002Fcnos\u002Fblob\u002Fmain\u002Fsrc\u002Fpackages\u002Fcnos.cdd\u002Fskills\u002Fcdd\u002Frelease-effector\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"release effector","release","recovery","gamma","cds","ready","version","closeout","branch","decision","verify","policy","runbook","ci","actions","beta","push","harness","delete","cleanup","2026-11-10 10:12:30",false,"---\nname: release-effector\ndescription: δ-side mechanics for cutting a release — scripts\u002Frelease.sh invocation, tag push, release CI polling, CI-red recovery runbook, branch cleanup. The platform-actions companion to release\u002FSKILL.md (β-side authoring).\nartifact_class: skill\nkata_surface: embedded\ngoverning_question: When γ declares closure, what does δ run, in what order, and how does δ verify the release disconnected cleanly?\nvisibility: internal\nparent: cdd\ntriggers:\n  - release effector\n  - scripts\u002Frelease.sh\n  - tag push\n  - release CI\n  - branch cleanup\n  - disconnect release\nscope: task-local\ninputs:\n  - gamma-closeout.md on main\n  - VERSION decision (per release\u002FSKILL.md §2.2)\n  - RELEASE.md on main (per release\u002FSKILL.md §2.5)\n  - cycle directories under .cdd\u002Funreleased\u002F{N}\u002F ready to move\noutputs:\n  - bare X.Y.Z annotated tag on origin\n  - release CI green (or operator-accepted override)\n  - merged cycle\u002F{N} branches deleted (or attempt recorded if harness blocks delete)\n  - gate-action completion confirmations per operator\u002FSKILL.md §3.3\nrequires:\n  - δ has read operator\u002FSKILL.md §3 (outward gate policy)\n  - γ has shipped RELEASE.md and the cycle-dir moves per release\u002FSKILL.md §2.5–§2.5a (or scripts\u002Frelease.sh will perform the moves)\n  - gamma-closeout.md exists on main (per cnos.cds\u002Fskills\u002Fcds\u002FCDS.md §\"Artifact contract\" → §\"Frozen snapshot rule\")\n  - β has signaled \"release ready for δ tag\" in beta-closeout.md (per release\u002FSKILL.md §2.6)\ncalls:\n  - release\u002FSKILL.md\n  - operator\u002FSKILL.md\n---\n\n# Release Effector (δ)\n\n## Core Principle\n\n**The tag is the disconnection point. δ runs the script, polls CI, cleans the branches.**\n\n`release-effector` is the **mechanics-of-the-disconnect** skill. β-side authoring (RELEASE.md, CHANGELOG, version decision, cycle-dir move) lives in `release\u002FSKILL.md`. δ-policy frame (when the release gate fires, what δ does NOT do, override authority) lives in `operator\u002FSKILL.md` (Phase 4a will relocate to `delta\u002FSKILL.md`). This skill is the executable surface between them: the exact commands δ runs at the disconnect moment, in order, with the failure-mode runbook for red CI.\n\nFailure mode: **manual tagging.** A `git tag X.Y.Z && git push --tags` skips version stamping, skips consistency checks, skips structured tag-message generation, and produces a release whose VERSION, `cn.json`, package manifests, and tag disagree. The single-command release script is the only sanctioned path.\n\n---\n\n## Preconditions\n\nBefore δ runs `scripts\u002Frelease.sh`, all of the following must be true on `main`:\n\n| Precondition | Owner | Verified where |\n|---|---|---|\n| `gamma-closeout.md` exists on main | γ | `cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Artifact contract\" → §\"Ownership matrix\"; `gamma\u002FSKILL.md` §2.10 closure gate |\n| `RELEASE.md` exists at repo root | γ | `release\u002FSKILL.md` §2.5; `cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Artifact contract\" → §\"Ownership matrix\" |\n| Cycle directories moved (or ready to move via the script) | γ | `release\u002FSKILL.md` §2.5a |\n| VERSION decided (semver bump) | γ + β | `release\u002FSKILL.md` §2.2 |\n| β signaled \"release ready for δ tag\" in `beta-closeout.md` | β | `release\u002FSKILL.md` §2.6 |\n| Local main up to date with origin\u002Fmain | δ | `scripts\u002Frelease.sh` step 2 (auto-check) |\n| Tag X.Y.Z does not already exist | δ | `scripts\u002Frelease.sh` step 3 (auto-check) |\n\nThe script enforces the last two mechanically and errors out if they fail. The first five are γ\u002Fβ responsibilities; δ confirms they are met before invoking the script.\n\n---\n\n## 1. Run scripts\u002Frelease.sh\n\n**Single-command release.** Edit `VERSION`, then run the script:\n\n```bash\n# Edit VERSION first (canonical: bare X.Y.Z, no v-prefix), then:\nscripts\u002Frelease.sh\n\n# Or pass version directly:\nscripts\u002Frelease.sh 3.67.0\n```\n\n**Manual tagging is not allowed.** Do not run `git tag` directly. The release script is the only way to tag. It prevents the class of failures where VERSION, `cn.json`, and package manifests disagree.\n\n**What the script does, in order** (mechanical narration; matches `scripts\u002Frelease.sh` as of cycle #399):\n\n1. Set VERSION (writes `$1` to `VERSION` if a version arg was passed).\n2. Confirm current branch is `main` and `HEAD` matches `origin\u002Fmain`. Errors out otherwise.\n3. Confirm the tag does not already exist locally. Errors out if it does (use `release\u002FSKILL.md` §3.6 amend-don't-re-tag procedure when CI fails post-tag).\n4. Run `scripts\u002Fvalidate-release-gate.sh` — RELEASE.md + cycle-artifact completeness check (see `release\u002FSKILL.md` §2.1 for the validator surface).\n5. Run `scripts\u002Fstamp-versions.sh` — derives `cn.json` and package manifests from VERSION.\n6. Run `scripts\u002Fcheck-version-consistency.sh` — validates all version-stamped files agree.\n7. Move `.cdd\u002Funreleased\u002F*\u002F` directories to `.cdd\u002Freleases\u002F$VERSION\u002F` (no-op when γ has already moved them per `release\u002FSKILL.md` §2.5a; the script handles both cases idempotently).\n8. Stage + commit `release: $VERSION` if anything changed in the working tree.\n9. Warn-prompt (interactive `y\u002FN`) if `CHANGELOG.md` does not contain a `## $VERSION` heading. Abort path is `N`.\n10. Generate the annotated tag message via `scripts\u002Fgenerate-release-tag-message.sh` — includes issue metadata, wave context when present, and CDD review artifacts when available; deterministic fallback when metadata is unavailable.\n11. Create the **annotated** (not lightweight) tag at the bare version: `git tag -a $VERSION -F \u003Cmessage-file>`.\n12. `git push origin main --tags` — pushes the release commit and tag in one command.\n\nAfter the script returns, monitor release CI per §3 below.\n\n- ❌ `git tag 3.67.0 && git push --tags` (skips stamp, skips consistency check, skips structured tag message)\n- ❌ γ's skill patches sit on main untagged across multiple cycles\n- ❌ δ defers release \"because there are no consumers\" (the tag is structural, not consumer-driven)\n- ✅ `scripts\u002Frelease.sh 3.67.0` — stamps, verifies, commits, tags, pushes\n\n---\n\n## 2. Tag policy (bare X.Y.Z, no v-prefix)\n\n**All tags are bare `X.Y.Z`.** Canonical reference: `cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Artifact contract\" → §\"Location matrix\" — *\"Tags are bare `X.Y.Z` everywhere (VERSION file, git tag, branch-name version segment, CHANGELOG row, RELEASE.md, snapshot directory). `v`-prefixed tags are legacy and warn-only.\"*\n\nThe bare-version convention applies to every surface in the chain:\n\n| Surface | Form |\n|---|---|\n| `VERSION` file content | `3.67.0` |\n| Git tag | `3.67.0` (annotated, not lightweight) |\n| Branch name version segment | `cycle\u002F399`, `claude\u002F3.67.0-22-...` (release directory `3.67.0\u002F`) |\n| `CHANGELOG.md` ledger row | `## 3.67.0` |\n| `RELEASE.md` body | references the bare version |\n| Snapshot dir | `docs\u002Fgamma\u002Fcdd\u002F3.67.0\u002F` |\n| Cycle-dir move target | `.cdd\u002Freleases\u002F3.67.0\u002F{N}\u002F` |\n\n**Annotated tags only.** `scripts\u002Frelease.sh` creates `git tag -a $VERSION -F \u003Cmessage-file>` — never lightweight tags. The annotated form carries the structured message generated by `scripts\u002Fgenerate-release-tag-message.sh` (issue metadata, wave context, CDD review artifacts, deterministic fallback). δ can inspect the tag-message body after the fact with:\n\n```bash\ngit show \u003Cversion>\ngit for-each-ref refs\u002Ftags\u002F\u003Cversion> --format='%(contents)'\n```\n\n**One tag per release.** Per `release\u002FSKILL.md` §3.6: if CI fails post-tag, amend the release commit, delete-and-recreate the same bare-version tag, force-push. Do NOT proliferate `3.9.1`, `3.9.1-fix`, `3.9.1-fix2`.\n\n- ❌ `v3.67.0` (legacy v-prefix; warn-only per `cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Artifact contract\" → §\"Location matrix\")\n- ❌ Lightweight tag (`git tag $VERSION` without `-a` or `-F`) — loses the structured message\n- ❌ Tag proliferation across CI-red retries\n- ✅ One bare `3.67.0` annotated tag, amended until CI green\n\n---\n\n## 3. Poll release CI\n\nAfter tag push, the release CI workflow builds binaries (linux-x64, macos-x64, macos-arm64) and attaches them to the GitHub release. δ blocks release completion until that workflow reports green.\n\n```bash\n# Quick view:\ngh run list --branch \u003Cversion>\n\n# Or watch a specific run to completion:\ngh run watch \u003Crun-id> --exit-status\n\n# Or via the workflow surface:\ngh run list --workflow release.yml --limit 1\n```\n\n**Decision rule:**\n\n- **CI Green** → δ declares the release complete; report completion to γ per `operator\u002FSKILL.md` §3.3.\n- **CI Red** → execute the recovery runbook in §4 below. δ MUST NOT declare release complete while CI is red.\n\n**The gate does not close until CI is green or operator explicitly accepts a known pre-existing failure (override per §4 step 5).**\n\n- ❌ \"Tag pushed; we're done\" — release CI may still be running or red\n- ❌ Deploy from binaries before CI completes (stale binary from previous release)\n- ✅ `gh run watch \u003Cid> --exit-status` then verify assets attached, then report completion\n\n---\n\n## 4. CI-red recovery runbook\n\nWhen release CI reports red, δ owns the recovery. The runbook is mandatory; declaring the release complete while CI is red is a discipline break (see §6 below).\n\n1. **Investigate** the release CI logs to identify which workflow step failed and why.\n2. **Classify** the failure:\n   - **Release-specific** — the failure is caused by something this release introduced (a broken stamp, a manifest drift, a binary-build error new to this version).\n   - **Pre-existing infrastructure** — the failure was present before this release (flaky smoke test, transient registry outage, expired token, environment regression unrelated to release content).\n3. **Fix or escalate** based on classification:\n   - **Fixable \u002F release-specific** — fix the cause, then amend the release commit and re-tag per `release\u002FSKILL.md` §3.6 (`git commit --amend --no-edit && git tag -d $VERSION && git tag -a $VERSION -F \u003Cmessage-file> && git push --force origin main $VERSION`). Then re-poll CI. Do NOT proliferate tags.\n   - **Pre-existing \u002F infrastructural** — document the failure, escalate to operator-as-human, and do NOT declare release complete on the agent's authority.\n4. **Re-verify** — after any fix attempt, re-poll CI (§3 above) and reapply this runbook if CI is still red.\n5. **Operator override** — explicit operator-as-human acceptance is the only path to declare release complete with red CI. This is the escape hatch for known pre-existing failures (canonical examples: v3.66.0 and v3.67.0 smoke failures). The override must be declared per `operator\u002FSKILL.md` §4 (override protocol) and recorded in `gamma-closeout.md` or `cdd-iteration.md` so the next release sees the precedent.\n\n**The gate does not close until CI is green or operator explicitly accepts the failure.**\n\n- ❌ Declare release complete because the tag is on origin, ignoring red CI\n- ❌ Proliferate `3.67.0-fix`, `3.67.0-fix2` instead of amend-and-re-tag\n- ❌ Apply operator override to a release-specific failure (\"just ship it\")\n- ✅ Investigate → classify → fix-or-escalate → re-verify → operator-override-if-pre-existing\n\n---\n\n## 5. Branch cleanup\n\nAfter the release is declared complete (CI green or accepted override), δ deletes merged cycle branches. This is mechanical cleanup, not judgment — if it's merged into main, it's dead.\n\n**Targets:**\n- Cycle branches: `cycle\u002F{N}` (post-#287 canonical form per `cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Development lifecycle\" → §\"Branch rule\")\n- γ session branches: harness-given `claude\u002F...` or operator-named `gamma\u002Fsession-{N}` patterns\n- Any other branches merged into main during this release\n\nNo orphan γ session branches survive past closure.\n\n**Procedure** (mirrors `release\u002FSKILL.md` §2.6a):\n\n```bash\ngit branch -r --merged origin\u002Fmain \\\n  | grep -v main \\\n  | grep -v HEAD \\\n  | sed 's\u002Forigin\\\u002F\u002F\u002F' \\\n  | xargs -I{} git push origin --delete {}\n```\n\nFor targeted deletion of a single cycle branch:\n\n```bash\ngit push origin --delete cycle\u002F399\n```\n\n**Harness 403 \u002F push-restriction case.** Some Claude Code harness environments block remote branch deletion (`403` on `git push origin --delete \u003Cbranch>`; same constraint as `operator\u002FSKILL.md` §5.2 consequence 3). δ attempts the delete; if the harness blocks it, δ records the failure in the cycle's close-out and proceeds — the merged-into-main state is authoritative. Branches blocked from delete in-cycle become an inter-cycle cleanup task (operator-as-human or a follow-on agent session with delete permission).\n\n- ❌ Leave merged branches accumulating (\"someone might need them\")\n- ❌ Treat a 403 on delete as a release failure (the merge is what matters; the branch is residue)\n- ✅ Attempt delete immediately after release; record any 403s in close-out; merged-to-main state is the source of truth\n\n---\n\n## 6. Disconnect-release rules\n\nThese are the hard rules δ enforces from the release-effector surface. Each maps to a precondition or a discipline failure mode evidenced by prior cycles.\n\n1. **Do not tag\u002Frelease before `gamma-closeout.md` exists on main.** γ closure declaration gates the tag. (`cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Artifact contract\" → §\"Ownership matrix\"; `gamma\u002FSKILL.md` §2.10. The doctrinal frame lives in `operator\u002FSKILL.md` §3.4.)\n2. **Manual `git tag` is not allowed.** `scripts\u002Frelease.sh` is the only way to tag a release.\n3. **One tag per release.** Per `release\u002FSKILL.md` §3.6: amend the release commit and reuse the same bare-version tag on CI-red retry. Do not proliferate `3.9.1-fix`, `3.9.1-fix2`.\n4. **Annotated tags only.** Generated message via `scripts\u002Fgenerate-release-tag-message.sh`. Lightweight tags lose the structured metadata.\n5. **δ blocks release completion until CI is green** (or operator explicitly accepts a known pre-existing failure per §4 step 5).\n6. **The tag is the signal.** No separate completion announcement is needed for the disconnect tag itself — the tag appearing on main IS proof that all gate actions completed. Mid-cycle gate actions (per `operator\u002FSKILL.md` §3.3) still require explicit completion confirmations; the disconnect tag does not. (The doctrinal claim lives in `operator\u002FSKILL.md` §3.5; the mechanical fact that the tag is what δ pushes lives here.)\n7. **No mixing v-prefixed and bare tags.** Bare `X.Y.Z` only, per `cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Artifact contract\" → §\"Location matrix\".\n8. **The release is structural, not consumer-driven.** Untagged post-cycle patches on main are an open boundary; δ does not defer release because \"no one is downstream right now.\" (The doctrinal claim lives in `operator\u002FSKILL.md` §3.4.)\n\n---\n\n## 7. Docs-only disconnect (no tag)\n\nWhen a cycle ships docs-only — no code change, no version bump — the disconnect is the merge commit on main, not a tag. Release-effector is **not invoked**:\n\n- `scripts\u002Frelease.sh` is NOT run.\n- VERSION is unchanged.\n- The merge commit hash IS the disconnect signal.\n- Cycle directories move to `.cdd\u002Freleases\u002Fdocs\u002F{ISO-date}\u002F{N}\u002F` (γ does this per `release\u002FSKILL.md` §2.5b, not δ).\n- No CHANGELOG ledger row; no tag-message generation; no release CI; no branch cleanup driven from release-effector (any merged-branch cleanup runs as ordinary inter-cycle housekeeping under δ-policy, not under this skill).\n\nSee `release\u002FSKILL.md` §2.5b for the docs-only flow and `issue\u002FSKILL.md` for the `docs-only` mode declaration on the issue.\n\n- ❌ Run `scripts\u002Frelease.sh` on a docs-only cycle \"just to be safe\" (version drift; synthetic bump)\n- ❌ Skip the cycle-directory move because no tag is being cut (loses cycle-to-release association)\n- ✅ γ moves cycle dirs to `.cdd\u002Freleases\u002Fdocs\u002F{ISO-date}\u002F{N}\u002F`; merge commit IS the disconnect\n\n---\n\n## 8. What this skill does NOT do\n\nThese are intentionally out of scope. Crossing them is a role-boundary violation or an authority claim release-effector does not hold.\n\n- **Do not author `RELEASE.md`.** That's γ per `release\u002FSKILL.md` §2.5.\n- **Do not write the CHANGELOG ledger row.** That's β\u002Fγ per `release\u002FSKILL.md` §2.4 and §3.8.\n- **Do not decide the version bump.** That's γ + β per `release\u002FSKILL.md` §2.2.\n- **Do not run `scripts\u002Fvalidate-release-gate.sh` outside the script's flow.** β\u002FCI may run it independently for pre-merge validation; release-effector triggers it transitively via the script's step 4 only.\n- **Do not deploy.** Deployment (binary distribution, host installation, daemon restart) is a separate effector surface — see `release\u002FSKILL.md` §2.8 for the current deploy step (β\u002Foperator).\n- **Do not declare the cycle closed.** Cycle closure is γ's; release completion is δ's. The two are sequential: γ closes → δ tags → release complete.\n- **Do not override the gate.** Override is `operator\u002FSKILL.md` §4 territory. Release-effector executes the mechanics; override is a δ-policy decision.\n\n---\n\n## 9. Cross-references\n\n- `operator\u002FSKILL.md` §3 (outward gate policy: when the gate fires, who requests, completion-reporting protocol)\n- `operator\u002FSKILL.md` §3.4 (doctrinal frame: the tag is the disconnection point)\n- `operator\u002FSKILL.md` §3.5 (doctrinal frame: the tag is the signal)\n- `operator\u002FSKILL.md` §4 (override protocol — used in §4 step 5 above)\n- `operator\u002FSKILL.md` §7 (cycle lifecycle table — Disconnect row points here for mechanics)\n- `release\u002FSKILL.md` §2.1 (pre-release validator; invoked transitively by script step 4)\n- `release\u002FSKILL.md` §2.4 (CHANGELOG — γ\u002Fβ surface; release-effector does not author)\n- `release\u002FSKILL.md` §2.5 (RELEASE.md — γ surface; release-effector does not author)\n- `release\u002FSKILL.md` §2.5a (cycle-dir move — γ surface; script step 7 idempotently handles too)\n- `release\u002FSKILL.md` §2.5b (docs-only disconnect — release-effector is not invoked)\n- `release\u002FSKILL.md` §2.6 (release-readiness signaling — β surface; precondition above)\n- `release\u002FSKILL.md` §2.7 (release CI polling — β-side text says δ owns this per release-effector §3)\n- `release\u002FSKILL.md` §3.6 (amend-don't-re-tag — invoked by §4 step 3 above)\n- `release\u002FSKILL.md` §3.8 (TSC scoring — γ\u002Fβ; release-effector does not score)\n- `cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Artifact contract\" → §\"Location matrix\" (canonical tag policy)\n- `cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Artifact contract\" → §\"Ownership matrix\" (gamma-closeout.md gates tag)\n- `gamma\u002FSKILL.md` §2.10 (γ closure gate — verifies preconditions above)\n- `gamma\u002FSKILL.md` §2 release-prep (γ writes RELEASE.md + moves cycle dirs before requesting δ disconnect)\n- `scripts\u002Frelease.sh` (the script — δ does not reimplement)\n- `scripts\u002Fvalidate-release-gate.sh` (script step 4)\n- `scripts\u002Fstamp-versions.sh` (script step 5)\n- `scripts\u002Fcheck-version-consistency.sh` (script step 6)\n- `scripts\u002Fgenerate-release-tag-message.sh` (script step 10)\n\n---\n\n## 10. Embedded Kata\n\n### Scenario\n\nγ has declared cycle\u002F{N} closure. `gamma-closeout.md` is on main. `RELEASE.md` is at repo root. The cycle directory under `.cdd\u002Funreleased\u002F{N}\u002F` is ready to move. VERSION still reads the previous release's version. The current release will be `3.67.0`.\n\n### Task\n\nExecute the disconnect release.\n\n### Expected actions\n\n1. **Verify preconditions.** `gamma-closeout.md` on main; `RELEASE.md` on main; `beta-closeout.md` carries \"release ready for δ tag\" signal; local main matches `origin\u002Fmain`.\n2. **Run the script.** `scripts\u002Frelease.sh 3.67.0` (or edit VERSION then `scripts\u002Frelease.sh`).\n3. **Watch the script's output.** Expect: VERSION set, gate validated, manifests stamped, consistency OK, cycle dirs moved, release commit, tag annotated, push complete.\n4. **Poll release CI.** `gh run list --branch 3.67.0`, then `gh run watch \u003Cid> --exit-status`.\n5. **CI Green path.** Confirm completion to γ per `operator\u002FSKILL.md` §3.3 (\"Released 3.67.0 — CI green, binaries attached\"). Delete merged cycle branches (`git push origin --delete cycle\u002F{N}`).\n6. **CI Red path.** Execute §4 runbook: investigate, classify, fix-or-escalate, re-verify. Operator override only for pre-existing infrastructural failures.\n\n### Common failures\n\n- Manual `git tag 3.67.0 && git push --tags` instead of `scripts\u002Frelease.sh` (skips stamp\u002Fconsistency check; produces version drift).\n- Pushing the tag before `gamma-closeout.md` exists on main (γ closure gate violated).\n- Declaring release complete while CI is red without operator override (discipline failure; the gate has not actually closed).\n- Treating a 403 on `git push origin --delete cycle\u002F{N}` as a release failure (the merge is authoritative; the branch is residue — record and move on).\n- Letting merged branches accumulate (\"someone might need them\") instead of deleting at release time.\n- Proliferating tags (`3.67.0`, `3.67.0-fix`) instead of amend-and-re-tag on CI-red retry (`release\u002FSKILL.md` §3.6).\n","# Release Effector (δ)\n\n## Core Principle\n\n**The tag is the disconnection point. δ runs the script, polls CI, cleans the branches.**\n\n`release-effector` is the **mechanics-of-the-disconnect** skill. β-side authoring (RELEASE.md, CHANGELOG, version decision, cycle-dir move) lives in `release\u002FSKILL.md`. δ-policy frame (when the release gate fires, what δ does NOT do, override authority) lives in `operator\u002FSKILL.md` (Phase 4a will relocate to `delta\u002FSKILL.md`). This skill is the executable surface between them: the exact commands δ runs at the disconnect moment, in order, with the failure-mode runbook for red CI.\n\nFailure mode: **manual tagging.** A `git tag X.Y.Z && git push --tags` skips version stamping, skips consistency checks, skips structured tag-message generation, and produces a release whose VERSION, `cn.json`, package manifests, and tag disagree. The single-command release script is the only sanctioned path.\n\n---\n\n## Preconditions\n\nBefore δ runs `scripts\u002Frelease.sh`, all of the following must be true on `main`:\n\n| Precondition | Owner | Verified where |\n|---|---|---|\n| `gamma-closeout.md` exists on main | γ | `cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Artifact contract\" → §\"Ownership matrix\"; `gamma\u002FSKILL.md` §2.10 closure gate |\n| `RELEASE.md` exists at repo root | γ | `release\u002FSKILL.md` §2.5; `cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Artifact contract\" → §\"Ownership matrix\" |\n| Cycle directories moved (or ready to move via the script) | γ | `release\u002FSKILL.md` §2.5a |\n| VERSION decided (semver bump) | γ + β | `release\u002FSKILL.md` §2.2 |\n| β signaled \"release ready for δ tag\" in `beta-closeout.md` | β | `release\u002FSKILL.md` §2.6 |\n| Local main up to date with origin\u002Fmain | δ | `scripts\u002Frelease.sh` step 2 (auto-check) |\n| Tag X.Y.Z does not already exist | δ | `scripts\u002Frelease.sh` step 3 (auto-check) |\n\nThe script enforces the last two mechanically and errors out if they fail. The first five are γ\u002Fβ responsibilities; δ confirms they are met before invoking the script.\n\n---\n\n## 1. Run scripts\u002Frelease.sh\n\n**Single-command release.** Edit `VERSION`, then run the script:\n\n```bash\n# Edit VERSION first (canonical: bare X.Y.Z, no v-prefix), then:\nscripts\u002Frelease.sh\n\n# Or pass version directly:\nscripts\u002Frelease.sh 3.67.0\n```\n\n**Manual tagging is not allowed.** Do not run `git tag` directly. The release script is the only way to tag. It prevents the class of failures where VERSION, `cn.json`, and package manifests disagree.\n\n**What the script does, in order** (mechanical narration; matches `scripts\u002Frelease.sh` as of cycle #399):\n\n1. Set VERSION (writes `$1` to `VERSION` if a version arg was passed).\n2. Confirm current branch is `main` and `HEAD` matches `origin\u002Fmain`. Errors out otherwise.\n3. Confirm the tag does not already exist locally. Errors out if it does (use `release\u002FSKILL.md` §3.6 amend-don't-re-tag procedure when CI fails post-tag).\n4. Run `scripts\u002Fvalidate-release-gate.sh` — RELEASE.md + cycle-artifact completeness check (see `release\u002FSKILL.md` §2.1 for the validator surface).\n5. Run `scripts\u002Fstamp-versions.sh` — derives `cn.json` and package manifests from VERSION.\n6. Run `scripts\u002Fcheck-version-consistency.sh` — validates all version-stamped files agree.\n7. Move `.cdd\u002Funreleased\u002F*\u002F` directories to `.cdd\u002Freleases\u002F$VERSION\u002F` (no-op when γ has already moved them per `release\u002FSKILL.md` §2.5a; the script handles both cases idempotently).\n8. Stage + commit `release: $VERSION` if anything changed in the working tree.\n9. Warn-prompt (interactive `y\u002FN`) if `CHANGELOG.md` does not contain a `## $VERSION` heading. Abort path is `N`.\n10. Generate the annotated tag message via `scripts\u002Fgenerate-release-tag-message.sh` — includes issue metadata, wave context when present, and CDD review artifacts when available; deterministic fallback when metadata is unavailable.\n11. Create the **annotated** (not lightweight) tag at the bare version: `git tag -a $VERSION -F \u003Cmessage-file>`.\n12. `git push origin main --tags` — pushes the release commit and tag in one command.\n\nAfter the script returns, monitor release CI per §3 below.\n\n- ❌ `git tag 3.67.0 && git push --tags` (skips stamp, skips consistency check, skips structured tag message)\n- ❌ γ's skill patches sit on main untagged across multiple cycles\n- ❌ δ defers release \"because there are no consumers\" (the tag is structural, not consumer-driven)\n- ✅ `scripts\u002Frelease.sh 3.67.0` — stamps, verifies, commits, tags, pushes\n\n---\n\n## 2. Tag policy (bare X.Y.Z, no v-prefix)\n\n**All tags are bare `X.Y.Z`.** Canonical reference: `cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Artifact contract\" → §\"Location matrix\" — *\"Tags are bare `X.Y.Z` everywhere (VERSION file, git tag, branch-name version segment, CHANGELOG row, RELEASE.md, snapshot directory). `v`-prefixed tags are legacy and warn-only.\"*\n\nThe bare-version convention applies to every surface in the chain:\n\n| Surface | Form |\n|---|---|\n| `VERSION` file content | `3.67.0` |\n| Git tag | `3.67.0` (annotated, not lightweight) |\n| Branch name version segment | `cycle\u002F399`, `claude\u002F3.67.0-22-...` (release directory `3.67.0\u002F`) |\n| `CHANGELOG.md` ledger row | `## 3.67.0` |\n| `RELEASE.md` body | references the bare version |\n| Snapshot dir | `docs\u002Fgamma\u002Fcdd\u002F3.67.0\u002F` |\n| Cycle-dir move target | `.cdd\u002Freleases\u002F3.67.0\u002F{N}\u002F` |\n\n**Annotated tags only.** `scripts\u002Frelease.sh` creates `git tag -a $VERSION -F \u003Cmessage-file>` — never lightweight tags. The annotated form carries the structured message generated by `scripts\u002Fgenerate-release-tag-message.sh` (issue metadata, wave context, CDD review artifacts, deterministic fallback). δ can inspect the tag-message body after the fact with:\n\n```bash\ngit show \u003Cversion>\ngit for-each-ref refs\u002Ftags\u002F\u003Cversion> --format='%(contents)'\n```\n\n**One tag per release.** Per `release\u002FSKILL.md` §3.6: if CI fails post-tag, amend the release commit, delete-and-recreate the same bare-version tag, force-push. Do NOT proliferate `3.9.1`, `3.9.1-fix`, `3.9.1-fix2`.\n\n- ❌ `v3.67.0` (legacy v-prefix; warn-only per `cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Artifact contract\" → §\"Location matrix\")\n- ❌ Lightweight tag (`git tag $VERSION` without `-a` or `-F`) — loses the structured message\n- ❌ Tag proliferation across CI-red retries\n- ✅ One bare `3.67.0` annotated tag, amended until CI green\n\n---\n\n## 3. Poll release CI\n\nAfter tag push, the release CI workflow builds binaries (linux-x64, macos-x64, macos-arm64) and attaches them to the GitHub release. δ blocks release completion until that workflow reports green.\n\n```bash\n# Quick view:\ngh run list --branch \u003Cversion>\n\n# Or watch a specific run to completion:\ngh run watch \u003Crun-id> --exit-status\n\n# Or via the workflow surface:\ngh run list --workflow release.yml --limit 1\n```\n\n**Decision rule:**\n\n- **CI Green** → δ declares the release complete; report completion to γ per `operator\u002FSKILL.md` §3.3.\n- **CI Red** → execute the recovery runbook in §4 below. δ MUST NOT declare release complete while CI is red.\n\n**The gate does not close until CI is green or operator explicitly accepts a known pre-existing failure (override per §4 step 5).**\n\n- ❌ \"Tag pushed; we're done\" — release CI may still be running or red\n- ❌ Deploy from binaries before CI completes (stale binary from previous release)\n- ✅ `gh run watch \u003Cid> --exit-status` then verify assets attached, then report completion\n\n---\n\n## 4. CI-red recovery runbook\n\nWhen release CI reports red, δ owns the recovery. The runbook is mandatory; declaring the release complete while CI is red is a discipline break (see §6 below).\n\n1. **Investigate** the release CI logs to identify which workflow step failed and why.\n2. **Classify** the failure:\n   - **Release-specific** — the failure is caused by something this release introduced (a broken stamp, a manifest drift, a binary-build error new to this version).\n   - **Pre-existing infrastructure** — the failure was present before this release (flaky smoke test, transient registry outage, expired token, environment regression unrelated to release content).\n3. **Fix or escalate** based on classification:\n   - **Fixable \u002F release-specific** — fix the cause, then amend the release commit and re-tag per `release\u002FSKILL.md` §3.6 (`git commit --amend --no-edit && git tag -d $VERSION && git tag -a $VERSION -F \u003Cmessage-file> && git push --force origin main $VERSION`). Then re-poll CI. Do NOT proliferate tags.\n   - **Pre-existing \u002F infrastructural** — document the failure, escalate to operator-as-human, and do NOT declare release complete on the agent's authority.\n4. **Re-verify** — after any fix attempt, re-poll CI (§3 above) and reapply this runbook if CI is still red.\n5. **Operator override** — explicit operator-as-human acceptance is the only path to declare release complete with red CI. This is the escape hatch for known pre-existing failures (canonical examples: v3.66.0 and v3.67.0 smoke failures). The override must be declared per `operator\u002FSKILL.md` §4 (override protocol) and recorded in `gamma-closeout.md` or `cdd-iteration.md` so the next release sees the precedent.\n\n**The gate does not close until CI is green or operator explicitly accepts the failure.**\n\n- ❌ Declare release complete because the tag is on origin, ignoring red CI\n- ❌ Proliferate `3.67.0-fix`, `3.67.0-fix2` instead of amend-and-re-tag\n- ❌ Apply operator override to a release-specific failure (\"just ship it\")\n- ✅ Investigate → classify → fix-or-escalate → re-verify → operator-override-if-pre-existing\n\n---\n\n## 5. Branch cleanup\n\nAfter the release is declared complete (CI green or accepted override), δ deletes merged cycle branches. This is mechanical cleanup, not judgment — if it's merged into main, it's dead.\n\n**Targets:**\n- Cycle branches: `cycle\u002F{N}` (post-#287 canonical form per `cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Development lifecycle\" → §\"Branch rule\")\n- γ session branches: harness-given `claude\u002F...` or operator-named `gamma\u002Fsession-{N}` patterns\n- Any other branches merged into main during this release\n\nNo orphan γ session branches survive past closure.\n\n**Procedure** (mirrors `release\u002FSKILL.md` §2.6a):\n\n```bash\ngit branch -r --merged origin\u002Fmain \\\n  | grep -v main \\\n  | grep -v HEAD \\\n  | sed 's\u002Forigin\\\u002F\u002F\u002F' \\\n  | xargs -I{} git push origin --delete {}\n```\n\nFor targeted deletion of a single cycle branch:\n\n```bash\ngit push origin --delete cycle\u002F399\n```\n\n**Harness 403 \u002F push-restriction case.** Some Claude Code harness environments block remote branch deletion (`403` on `git push origin --delete \u003Cbranch>`; same constraint as `operator\u002FSKILL.md` §5.2 consequence 3). δ attempts the delete; if the harness blocks it, δ records the failure in the cycle's close-out and proceeds — the merged-into-main state is authoritative. Branches blocked from delete in-cycle become an inter-cycle cleanup task (operator-as-human or a follow-on agent session with delete permission).\n\n- ❌ Leave merged branches accumulating (\"someone might need them\")\n- ❌ Treat a 403 on delete as a release failure (the merge is what matters; the branch is residue)\n- ✅ Attempt delete immediately after release; record any 403s in close-out; merged-to-main state is the source of truth\n\n---\n\n## 6. Disconnect-release rules\n\nThese are the hard rules δ enforces from the release-effector surface. Each maps to a precondition or a discipline failure mode evidenced by prior cycles.\n\n1. **Do not tag\u002Frelease before `gamma-closeout.md` exists on main.** γ closure declaration gates the tag. (`cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Artifact contract\" → §\"Ownership matrix\"; `gamma\u002FSKILL.md` §2.10. The doctrinal frame lives in `operator\u002FSKILL.md` §3.4.)\n2. **Manual `git tag` is not allowed.** `scripts\u002Frelease.sh` is the only way to tag a release.\n3. **One tag per release.** Per `release\u002FSKILL.md` §3.6: amend the release commit and reuse the same bare-version tag on CI-red retry. Do not proliferate `3.9.1-fix`, `3.9.1-fix2`.\n4. **Annotated tags only.** Generated message via `scripts\u002Fgenerate-release-tag-message.sh`. Lightweight tags lose the structured metadata.\n5. **δ blocks release completion until CI is green** (or operator explicitly accepts a known pre-existing failure per §4 step 5).\n6. **The tag is the signal.** No separate completion announcement is needed for the disconnect tag itself — the tag appearing on main IS proof that all gate actions completed. Mid-cycle gate actions (per `operator\u002FSKILL.md` §3.3) still require explicit completion confirmations; the disconnect tag does not. (The doctrinal claim lives in `operator\u002FSKILL.md` §3.5; the mechanical fact that the tag is what δ pushes lives here.)\n7. **No mixing v-prefixed and bare tags.** Bare `X.Y.Z` only, per `cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Artifact contract\" → §\"Location matrix\".\n8. **The release is structural, not consumer-driven.** Untagged post-cycle patches on main are an open boundary; δ does not defer release because \"no one is downstream right now.\" (The doctrinal claim lives in `operator\u002FSKILL.md` §3.4.)\n\n---\n\n## 7. Docs-only disconnect (no tag)\n\nWhen a cycle ships docs-only — no code change, no version bump — the disconnect is the merge commit on main, not a tag. Release-effector is **not invoked**:\n\n- `scripts\u002Frelease.sh` is NOT run.\n- VERSION is unchanged.\n- The merge commit hash IS the disconnect signal.\n- Cycle directories move to `.cdd\u002Freleases\u002Fdocs\u002F{ISO-date}\u002F{N}\u002F` (γ does this per `release\u002FSKILL.md` §2.5b, not δ).\n- No CHANGELOG ledger row; no tag-message generation; no release CI; no branch cleanup driven from release-effector (any merged-branch cleanup runs as ordinary inter-cycle housekeeping under δ-policy, not under this skill).\n\nSee `release\u002FSKILL.md` §2.5b for the docs-only flow and `issue\u002FSKILL.md` for the `docs-only` mode declaration on the issue.\n\n- ❌ Run `scripts\u002Frelease.sh` on a docs-only cycle \"just to be safe\" (version drift; synthetic bump)\n- ❌ Skip the cycle-directory move because no tag is being cut (loses cycle-to-release association)\n- ✅ γ moves cycle dirs to `.cdd\u002Freleases\u002Fdocs\u002F{ISO-date}\u002F{N}\u002F`; merge commit IS the disconnect\n\n---\n\n## 8. What this skill does NOT do\n\nThese are intentionally out of scope. Crossing them is a role-boundary violation or an authority claim release-effector does not hold.\n\n- **Do not author `RELEASE.md`.** That's γ per `release\u002FSKILL.md` §2.5.\n- **Do not write the CHANGELOG ledger row.** That's β\u002Fγ per `release\u002FSKILL.md` §2.4 and §3.8.\n- **Do not decide the version bump.** That's γ + β per `release\u002FSKILL.md` §2.2.\n- **Do not run `scripts\u002Fvalidate-release-gate.sh` outside the script's flow.** β\u002FCI may run it independently for pre-merge validation; release-effector triggers it transitively via the script's step 4 only.\n- **Do not deploy.** Deployment (binary distribution, host installation, daemon restart) is a separate effector surface — see `release\u002FSKILL.md` §2.8 for the current deploy step (β\u002Foperator).\n- **Do not declare the cycle closed.** Cycle closure is γ's; release completion is δ's. The two are sequential: γ closes → δ tags → release complete.\n- **Do not override the gate.** Override is `operator\u002FSKILL.md` §4 territory. Release-effector executes the mechanics; override is a δ-policy decision.\n\n---\n\n## 9. Cross-references\n\n- `operator\u002FSKILL.md` §3 (outward gate policy: when the gate fires, who requests, completion-reporting protocol)\n- `operator\u002FSKILL.md` §3.4 (doctrinal frame: the tag is the disconnection point)\n- `operator\u002FSKILL.md` §3.5 (doctrinal frame: the tag is the signal)\n- `operator\u002FSKILL.md` §4 (override protocol — used in §4 step 5 above)\n- `operator\u002FSKILL.md` §7 (cycle lifecycle table — Disconnect row points here for mechanics)\n- `release\u002FSKILL.md` §2.1 (pre-release validator; invoked transitively by script step 4)\n- `release\u002FSKILL.md` §2.4 (CHANGELOG — γ\u002Fβ surface; release-effector does not author)\n- `release\u002FSKILL.md` §2.5 (RELEASE.md — γ surface; release-effector does not author)\n- `release\u002FSKILL.md` §2.5a (cycle-dir move — γ surface; script step 7 idempotently handles too)\n- `release\u002FSKILL.md` §2.5b (docs-only disconnect — release-effector is not invoked)\n- `release\u002FSKILL.md` §2.6 (release-readiness signaling — β surface; precondition above)\n- `release\u002FSKILL.md` §2.7 (release CI polling — β-side text says δ owns this per release-effector §3)\n- `release\u002FSKILL.md` §3.6 (amend-don't-re-tag — invoked by §4 step 3 above)\n- `release\u002FSKILL.md` §3.8 (TSC scoring — γ\u002Fβ; release-effector does not score)\n- `cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Artifact contract\" → §\"Location matrix\" (canonical tag policy)\n- `cnos.cds\u002Fskills\u002Fcds\u002FCDS.md` §\"Artifact contract\" → §\"Ownership matrix\" (gamma-closeout.md gates tag)\n- `gamma\u002FSKILL.md` §2.10 (γ closure gate — verifies preconditions above)\n- `gamma\u002FSKILL.md` §2 release-prep (γ writes RELEASE.md + moves cycle dirs before requesting δ disconnect)\n- `scripts\u002Frelease.sh` (the script — δ does not reimplement)\n- `scripts\u002Fvalidate-release-gate.sh` (script step 4)\n- `scripts\u002Fstamp-versions.sh` (script step 5)\n- `scripts\u002Fcheck-version-consistency.sh` (script step 6)\n- `scripts\u002Fgenerate-release-tag-message.sh` (script step 10)\n\n---\n\n## 10. Embedded Kata\n\n### Scenario\n\nγ has declared cycle\u002F{N} closure. `gamma-closeout.md` is on main. `RELEASE.md` is at repo root. The cycle directory under `.cdd\u002Funreleased\u002F{N}\u002F` is ready to move. VERSION still reads the previous release's version. The current release will be `3.67.0`.\n\n### Task\n\nExecute the disconnect release.\n\n### Expected actions\n\n1. **Verify preconditions.** `gamma-closeout.md` on main; `RELEASE.md` on main; `beta-closeout.md` carries \"release ready for δ tag\" signal; local main matches `origin\u002Fmain`.\n2. **Run the script.** `scripts\u002Frelease.sh 3.67.0` (or edit VERSION then `scripts\u002Frelease.sh`).\n3. **Watch the script's output.** Expect: VERSION set, gate validated, manifests stamped, consistency OK, cycle dirs moved, release commit, tag annotated, push complete.\n4. **Poll release CI.** `gh run list --branch 3.67.0`, then `gh run watch \u003Cid> --exit-status`.\n5. **CI Green path.** Confirm completion to γ per `operator\u002FSKILL.md` §3.3 (\"Released 3.67.0 — CI green, binaries attached\"). Delete merged cycle branches (`git push origin --delete cycle\u002F{N}`).\n6. **CI Red path.** Execute §4 runbook: investigate, classify, fix-or-escalate, re-verify. Operator override only for pre-existing infrastructural failures.\n\n### Common failures\n\n- Manual `git tag 3.67.0 && git push --tags` instead of `scripts\u002Frelease.sh` (skips stamp\u002Fconsistency check; produces version drift).\n- Pushing the tag before `gamma-closeout.md` exists on main (γ closure gate violated).\n- Declaring release complete while CI is red without operator override (discipline failure; the gate has not actually closed).\n- Treating a 403 on `git push origin --delete cycle\u002F{N}` as a release failure (the merge is authoritative; the branch is residue — record and move on).\n- Letting merged branches accumulate (\"someone might need them\") instead of deleting at release time.\n- Proliferating tags (`3.67.0`, `3.67.0-fix`) instead of amend-and-re-tag on CI-red retry (`release\u002FSKILL.md` §3.6).\n",{"name":5,"calls":49,"scope":52,"inputs":53,"parent":58,"outputs":59,"requires":64,"triggers":69,"visibility":75,"description":7,"kata_surface":76,"artifact_class":77,"governing_question":78},[50,51],"release\u002FSKILL.md","operator\u002FSKILL.md","task-local",[54,55,56,57],"gamma-closeout.md on main","VERSION decision (per release\u002FSKILL.md §2.2)","RELEASE.md on main (per release\u002FSKILL.md §2.5)","cycle directories under .cdd\u002Funreleased\u002F{N}\u002F ready to move","cdd",[60,61,62,63],"bare X.Y.Z annotated tag on origin","release CI green (or operator-accepted override)","merged cycle\u002F{N} branches deleted (or attempt recorded if harness blocks delete)","gate-action completion confirmations per operator\u002FSKILL.md §3.3",[65,66,67,68],"δ has read operator\u002FSKILL.md §3 (outward gate policy)","γ has shipped RELEASE.md and the cycle-dir moves per release\u002FSKILL.md §2.5–§2.5a (or scripts\u002Frelease.sh will perform the moves)","gamma-closeout.md exists on main (per cnos.cds\u002Fskills\u002Fcds\u002FCDS.md §\"Artifact contract\" → §\"Frozen snapshot rule\")","β has signaled \"release ready for δ tag\" in beta-closeout.md (per release\u002FSKILL.md §2.6)",[24,70,71,72,73,74],"scripts\u002Frelease.sh","tag push","release CI","branch cleanup","disconnect release","internal","embedded","skill","When γ declares closure, what does δ run, in what order, and how does δ verify the release disconnected cleanly?","main","fb527e6c4bfb75c71fa75d6471b3aa3da32106d4","src\u002Fpackages\u002Fcnos.cdd\u002Fskills\u002Fcdd\u002Frelease-effector",0,"https:\u002F\u002Fgithub.com\u002Fusurobor\u002Fcnos","https:\u002F\u002Fgithub.com\u002Fusurobor","Coherence engineer. Building git-CN.","2026-11-07 14:25:44",{"source":8,"skillName":5,"commands":88,"prompt":98,"zipAvailable":99},[89,92,95],{"tool":90,"command":91},"npx","npx skills add usurobor\u002Fcnos --skill release-effector",{"tool":93,"command":94},"bunx","bunx skills add usurobor\u002Fcnos --skill release-effector",{"tool":96,"command":97},"pnpm","pnpm dlx skills add usurobor\u002Fcnos --skill release-effector","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fusurobor\u002Fcnos\u002Fblob\u002Fmain\u002Fsrc\u002Fpackages\u002Fcnos.cdd\u002Fskills\u002Fcdd\u002Frelease-effector\u002FSKILL.md",true,[],[102,120,136,162,177,195],{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":108,"publishedAt":44},"01M6CF8RWQPM0VXZG06XMR0FFX","issues\u002Ftriage","Issue triage doctrine pointer. Use when classifying a new issue, deciding dispatch eligibility, or deciding whether to close\u002Fsupersede\u002Fdefer.","https:\u002F\u002Fgithub.com\u002Fusurobor\u002Fcnos\u002Fblob\u002Fmain\u002Fsrc\u002Fpackages\u002Fcnos.issues\u002Fskills\u002Ftriage\u002FSKILL.md",[],[109,110,111,112,113,114,33,115,116,117,118,119],"triage","issues","issues triage","issue triage","SET","how","public","use","dispatch","issue","doctrine",{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":126,"publishedAt":44},"01M6CF8PJ812DD4APZ3WE8X67B","issues\u002Ftaxonomy","Issue label taxonomy pointer. Use when classifying an issue's kind\u002Farea\u002Fpriority\u002Feffort\u002Fstatus\u002Fprotocol\u002Fdispatch labels, or when the board needs to interpret them.","https:\u002F\u002Fgithub.com\u002Fusurobor\u002Fcnos\u002Fblob\u002Fmain\u002Fsrc\u002Fpackages\u002Fcnos.issues\u002Fskills\u002Ftaxonomy\u002FSKILL.md",[],[110,127,128,129,130,131,113,132,115,133,116,117,134,118,135],"taxonomy","issues taxonomy","github","status","protocol","open","board","github issue","issue labels",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":150,"publishedAt":44},"01M6CF8KBMZ4D0CDJQ3PF1YVTP","issues\u002Fmap","Issue-board (Issue Pivot) generation domain. Use when reasoning about `cn issues map`'s fetch, taxonomy-parse, effort-computation, and render pipeline, or about the board's JSON\u002FHTML output contract.","https:\u002F\u002Fgithub.com\u002Fusurobor\u002Fcnos\u002Fblob\u002Fmain\u002Fsrc\u002Fpackages\u002Fcnos.issues\u002Fskills\u002Fmap\u002FSKILL.md",[142,145],{"categoryNo":143,"categoryName":144,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":146,"categoryName":147,"taxonomyType":148,"taxonomyTypeDesc":149},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[110,151,129,152,153,154,113,155,127,132,114,156,157,133,158,159,160,161,116,118],"issues map","reasoning","data","pipeline","api","json","README","edit","interactive","fetch","generated",{"skillNo":163,"name":110,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":167,"publishedAt":44},"01M6CF8CZQH7G7B7RZPANQWR4G","cnos.issues package entrypoint. Use when reasoning about issue taxonomy, the Issue Pivot \u002F issue-board (`cn issues map`), the read-only CDS issue-state evaluator (`cn issues fsm evaluate`), or the current command-dispatch disposition of issue tooling.","https:\u002F\u002Fgithub.com\u002Fusurobor\u002Fcnos\u002Fblob\u002Fmain\u002Fsrc\u002Fpackages\u002Fcnos.issues\u002FSKILL.md",[],[110,129,168,169,170,171,172,173,174,127,132,114,33,32,157,175,116,176,117,28],"pr","current state","run","artifacts","state","package","boundary","command","only",{"skillNo":178,"name":179,"nameZh":6,"description":180,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":181,"categories":182,"keywords":183,"publishedAt":44},"01M6CF896XKSRQVB1CSHY8GSXB","receipt-stream","Cross-cycle receipt-stream doctrine for protocol-iteration. Use when γ closes a cycle and writes the per-cycle iteration artifact (`cdd-iteration.md`), when γ updates the cross-cycle aggregator at `.cdd\u002Fiterations\u002FINDEX.md`, when ε reads the receipt stream across cycles to surface protocol-gap patterns, when a finding's disposition lands a cross-repo patch and the cross-repo trace bundle attaches, or when a courtesy empty-findings stub is written for a `protocol_gap_count == 0` cycle.","https:\u002F\u002Fgithub.com\u002Fusurobor\u002Fcnos\u002Fblob\u002Fmain\u002Fsrc\u002Fpackages\u002Fcnos.handoff\u002Fskills\u002Fhandoff\u002Freceipt-stream\u002FSKILL.md",[],[184,185,171,131,186,114,187,188,189,115,190,31,191,192,116,76,193,194,58,119],"receipt stream","handoff","index","learning","format","trace","repo","read","channel","patch","shape",{"skillNo":196,"name":197,"nameZh":6,"description":198,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":199,"categories":200,"keywords":201,"publishedAt":44},"01M6CF84VCBME6RK8V6HAVDM8Z","mid-flight","Mid-flight γ→in-flight-α rescue channel. Use when γ needs to change a load-bearing fact (pinned axis, scope, AC, blocker) after α has begun coding, when γ edits the cycle's GitHub issue body mid-cycle, or when a spec change lands on origin\u002Fmain while α\u002Fβ polling sessions are in-flight.","https:\u002F\u002Fgithub.com\u002Fusurobor\u002Fcnos\u002Fblob\u002Fmain\u002Fsrc\u002Fpackages\u002Fcnos.handoff\u002Fskills\u002Fhandoff\u002Fmid-flight\u002FSKILL.md",[],[202,129,203,204,205,206,114,207,208,32,190,191,116,176,117,209,134,210,27,211],"mid flight","change","sessions","file","cache","pin","coordination","up","Legacy","artifact channel"]