[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6NCH87GKEYYA992ECASG0A7":3,"skill-same:01M6NCH87GKEYYA992ECASG0A7":46},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":14,"categories":15,"keywords":16,"publishedAt":20,"linkOnly":21,"markdownContent":22,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":29,"ownerHtmlUrl":30,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":31,"install":32,"resources":45},"01M6NCH87GKEYYA992ECASG0A7","odylith-release-planning",null,"odylith\u002Fodylith","odylith","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F273743042?v=4","01M6NBM8TE74H3GP527QEJFCPB","01M6NBM8YT7A5XTNABG4R5KQQ0",36,"MIT","https:\u002F\u002Fgithub.com\u002Fodylith\u002Fodylith\u002Fblob\u002Fmain\u002Fodylith\u002Fskills\u002Fodylith-release-planning\u002FSKILL.md",[],[17,18,19],"planning","release","odylith release planning","2026-11-10 10:12:30",false,"# Release Planning\n\n## CLI-First Non-Negotiable\n- CLI-first is non-negotiable for both Codex and Claude Code. Remove all hand-authoring for places where Odylith CLI should be doing the heavy-lifting. When an Odylith CLI command exists for an operation, you must call the CLI command and you must not hand-edit governed files the CLI owns. Hand-authoring governed truth where a CLI exists is a hard policy violation, not a stylistic preference. The authoritative policy, CLI surface enumeration, allowed hand-edit surfaces, and failure-mode handling live in `odylith\u002Fagents-guidelines\u002FCLI_FIRST_POLICY.md`, anchored by Casebook learning `CB-104`. The rule travels through routed `spawn_agent` leaves on Codex and Task-tool subagents on Claude Code, so delegated work inherits the same contract.\n\nUse this skill when the operator wants to define releases, name a release,\ninspect release scope, or add, remove, and move backlog workstreams between\nrelease targets such as `current`, `next`, a version, a tag, or a named\nrelease.\n\n## Goal\n- Keep release-planning truth explicit, auditable, and repo-local.\n- Make natural phrasing like \"add B-123 to current release\" map to one\n  deterministic CLI and source contract.\n- Keep release planning separate from umbrella execution waves and separate\n  from the canonical maintainer publication lane.\n- Governance-learning: release claims require fresh governance learning. Do not build, publish,\n  or claim release readiness while escaped defects, failed simulations,\n  contract changes, topology changes, or proof checkpoints are still only in\n  chat memory. Search existing Casebook and related governance truth first,\n  read prior failed mechanisms, do not repeat a fix path that already failed,\n  and route new mechanism-level learning through Casebook, Radar\u002Fplans,\n  Registry, Atlas, and Compass before release closeout.\n\n## Keep It Separate\n- Use release planning when the question is \"what release should this\n  workstream ship in?\"\n  Example: `B-067 -> 0.1.11`.\n- Do not use this skill for umbrella sequencing questions such as \"what should\n  happen in W1, W2, and W3?\"\n  That is program or execution-wave planning under the Radar umbrella\n  contract, not `odylith release ...`.\n- The same workstream may participate in both because release target and\n  execution order are different truths.\n\n## Canonical Source Truth\n- `odylith\u002Fradar\u002Fsource\u002Freleases\u002Freleases.v1.json`\n  Release registry with immutable `release_id`, optional `version`, `tag`,\n  `name`, notes, lifecycle state, and explicit alias ownership.\n- `odylith\u002Fradar\u002Fsource\u002Freleases\u002Frelease-assignment-events.v1.jsonl`\n  Append-only add, remove, and move history for workstream targeting.\n\n## Canonical Commands\n```bash\n.\u002F.odylith\u002Fbin\u002Fodylith release list --repo-root .\n.\u002F.odylith\u002Fbin\u002Fodylith release show current --repo-root .\n.\u002F.odylith\u002Fbin\u002Fodylith release create release-2026-04 --repo-root . --alias current --version 0.1.11\n.\u002F.odylith\u002Fbin\u002Fodylith release update current --repo-root . --name \"Boringly Trustworthy\"\n.\u002F.odylith\u002Fbin\u002Fodylith release add B-123 current --repo-root .\n.\u002F.odylith\u002Fbin\u002Fodylith release move B-123 next --repo-root .\n.\u002F.odylith\u002Fbin\u002Fodylith release remove B-123 --repo-root .\n.\u002F.odylith\u002Fbin\u002Fodylith validate backlog-contract --repo-root .\n.\u002F.odylith\u002Fbin\u002Fodylith sync --repo-root . --check-only --runtime-mode standalone\n```\n\n## Selector Rules\n- Resolve releases by exact `release_id`, alias, exact `version`, exact `tag`,\n  or unique exact `name`.\n- Prefer `release:\u003Cid>` when a human name or version could collide.\n- Treat `current release`, `release current`, `next release`, and\n  `release next` as alias phrasing, not fuzzy search.\n- Ambiguous selectors must fail closed. Do not guess.\n\n## Mapping Natural Requests\n- \"Add B-123 to current release\"\n  - `odylith release add B-123 current`\n- \"Move B-123 to next release\"\n  - `odylith release move B-123 next`\n- \"Remove B-123 from release 0.1.11\"\n  - `odylith release remove B-123 0.1.11`\n- \"Name the release\"\n  - `odylith release update \u003Cselector> --name \"...\"` or set `--name` during `create`\n\n## Guardrails\n- `release_id` is immutable after creation.\n- `current` and `next` are explicit aliases owned by source truth, not inferred\n  from semver or dates.\n- The current active release remains visible in governed read surfaces until it\n  is explicitly updated to `shipped` or `closed`. Zero targeted workstreams is\n  an empty state, not implicit GA.\n- Changing the `current` or `next` alias only changes the release selector. It\n  does not move any workstreams. Never bulk-retarget older active work just\n  because the target release changed.\n- Move only the explicit workstream ids that are part of the current release\n  slice. Older release workstreams, including completed work, keep their\n  original release history so Radar and Compass filters stay truthful.\n- Finished work removed during release closeout may still appear in governed\n  read surfaces as completed release members; that history does not make the\n  workstream an active target again.\n- One workstream may have at most one active release target at a time. Use\n  `move`, not a second `add`, when work carries forward.\n- `finished`, `parked`, and `superseded` workstreams cannot stay in active\n  releases.\n- `shipped` and `closed` releases are terminal for active planning. Move alias\n  ownership off them before lifecycle closure.\n- Release `name` is explicit operator-owned source truth. Matching authored\n  release notes may exist for the same `version`, but they must never rename\n  or override the release-planning record without explicit maintainer\n  authorization.\n- In practice, release names only change through an explicit\n  `odylith release create ... --name` or `odylith release update ... --name`\n  operation.\n- If `name` is blank, release-planning surfaces may fall back to `version`,\n  then `tag`, then `release_id`; they must never inherit a release-note title\n  as the release name.\n\n## Working Flow\n1. Inspect the current release catalog and alias ownership first.\n2. Create or update the release definition if the target release does not yet\n   exist or needs a new name, version, tag, or alias.\n3. Add, move, or remove workstreams through the release CLI rather than by\n   editing source files manually.\n4. Run at least `odylith validate backlog-contract --repo-root .` after\n   release mutations.\n5. If the release change affects governed read surfaces, refresh or prove them\n   through `odylith sync --check-only --runtime-mode standalone`.\n6. When the release actually ships to GA, move aliases as needed and\n   explicitly mark the record `shipped` or `closed`; until then, expect the\n   current release to remain visible even if it has zero targeted workstreams.\n",{},"main","6d249fbca9cd8c41d45e6e2e90a72745cd954ce6","odylith\u002Fskills\u002Fodylith-release-planning",3,"https:\u002F\u002Fgithub.com\u002Fodylith\u002Fodylith","https:\u002F\u002Fodylith.ai","https:\u002F\u002Fgithub.com\u002Fodylith","2026-10-25 01:05:33",{"source":7,"skillName":5,"commands":33,"prompt":43,"zipAvailable":44},[34,37,40],{"tool":35,"command":36},"npx","npx skills add odylith\u002Fodylith --skill odylith-release-planning",{"tool":38,"command":39},"bunx","bunx skills add odylith\u002Fodylith --skill odylith-release-planning",{"tool":41,"command":42},"pnpm","pnpm dlx skills add odylith\u002Fodylith --skill odylith-release-planning","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fodylith\u002Fodylith\u002Fblob\u002Fmain\u002Fodylith\u002Fskills\u002Fodylith-release-planning\u002FSKILL.md",true,[],[47,59,71,88,104,121],{"skillNo":48,"name":49,"nameZh":6,"description":50,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":51,"categories":52,"keywords":53,"publishedAt":20},"01M6NDHJPSYZGHRX4S392CCQQE","odylith-version","Inspect the pinned, active, and locally available Odylith versions.","https:\u002F\u002Fgithub.com\u002Fodylith\u002Fodylith\u002Fblob\u002Fmain\u002Fsrc\u002Fodylith\u002Fbundle\u002Fassets\u002Fproject-root\u002F.claude\u002Fskills\u002Fodylith-version\u002FSKILL.md",[],[54,55,56,57,58],"odylith version","version","inspect","true","active",{"skillNo":60,"name":61,"nameZh":6,"description":62,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":65,"publishedAt":20},"01M6NDHEGHCN2ARB3MJVKJC1PY","odylith-sync","Refresh governed Odylith surfaces for the current changed slice.","https:\u002F\u002Fgithub.com\u002Fodylith\u002Fodylith\u002Fblob\u002Fmain\u002Fsrc\u002Fodylith\u002Fbundle\u002Fassets\u002Fproject-root\u002F.claude\u002Fskills\u002Fodylith-sync\u002FSKILL.md",[],[66,67,68,69,70],"sync","odylith sync","surfaces","for","refresh",{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":20},"01M6NDHBJ21XYP1SHNV2ABS4FJ","odylith-subagent-router","Choose local execution versus bounded delegation for Odylith slices and shape routed payloads.","https:\u002F\u002Fgithub.com\u002Fodylith\u002Fodylith\u002Fblob\u002Fmain\u002Fsrc\u002Fodylith\u002Fbundle\u002Fassets\u002Fproject-root\u002F.claude\u002Fskills\u002Fodylith-subagent-router\u002FSKILL.md",[],[78,79,80,81,82,83,84,85,86,57,69,87],"subagent","router","odylith subagent router","payloads","delegation","execution","choose","shape","local","bounded",{"skillNo":89,"name":90,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":20},"01M6NDH8FPCQB4TBXDZGKZEX43","odylith-subagent-orchestrator","Plan Odylith delegation ownership, bounded fanout, and merge-safe orchestration.","https:\u002F\u002Fgithub.com\u002Fodylith\u002Fodylith\u002Fblob\u002Fmain\u002Fsrc\u002Fodylith\u002Fbundle\u002Fassets\u002Fproject-root\u002F.claude\u002Fskills\u002Fodylith-subagent-orchestrator\u002FSKILL.md",[],[95,96,78,97,98,57,87,99,100,101,102,103,82],"subagent orchestrator","orchestrator","odylith subagent orchestrator","ownership","plan","fanout","safe","orchestration","merge",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":20},"01M6NDGT24T77XP3714G3YWTQQ","odylith-start","Run the repo-local Odylith startup contract first, before context\u002Fsearch fan out.","https:\u002F\u002Fgithub.com\u002Fodylith\u002Fodylith\u002Fblob\u002Fmain\u002Fsrc\u002Fodylith\u002Fbundle\u002Fassets\u002Fproject-root\u002F.claude\u002Fskills\u002Fodylith-start\u002FSKILL.md",[],[111,112,113,114,115,116,117,118,86,119,120],"start","odylith start","search","run","startup","first","repo","context","contract","contract first",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":127,"publishedAt":20},"01M6NDGNVNGNAFYF76GXJ4CAB4","odylith-show-me","Use when the operator asks what Odylith can do for a repo, requests an advisory repo demo, or asks for the clean scenario-aware show-me output.","https:\u002F\u002Fgithub.com\u002Fodylith\u002Fodylith\u002Fblob\u002Fmain\u002Fsrc\u002Fodylith\u002Fbundle\u002Fassets\u002Fproject-root\u002F.claude\u002Fskills\u002Fodylith-show-me\u002FSKILL.md",[],[128,129,130,131,132,117,133,134,135,136,137,138,139,140,69,141],"odylith show me","me","show me","show","demo","use","clean","do","advisory","scenario","output","requests","can","operator"]