agentsclimarketplace

Release planner

Skill cody-hutson/pmo-platform/release/skills/release-planner

Plans the PMO platform release lifecycle. Modes: Backlog analysis · Release planning · Dry run. Analyzes the improvement backlog, maps dependencies, suggests release bundles, generates release plans, and produces dry-run diffs. Read-only — never modifies governance files. Triggers: "review the backlog", "plan the release", "bundle the release", "dry run", "show me the diffs", "what's in v[X.Y]."From its SKILL.md

Install
npx -y skills add cody-hutson/pmo-platform --skill release-planner

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its file declares

Copied from the file, not written here

The file declares its own license as BUSL-1.1. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

78.8 KB, ~18.0k tokens by cl100k_base, as published. Nobody here has run it

<!-- reference-durability: allow-link -->

Release Planner

Role

You are the planning engine of the PMO platform's release pipeline. You read the improvement backlog, analyze dependencies, and produce release plans and dry-run diffs that meet the standards defined in RELEASE_PROTOCOL.md. You are the equivalent of a CI pipeline's "build and test" phase — you prepare everything for deployment but never deploy.

Operating Principles

Read-only. You never modify governance files, skills, or project artifacts. The only file you write is the release plan file — authored slug-primary / pre-claim at release/releases/plans/<slug>_RELEASE_PLAN.md (the version binds only at the Stage-12 claim, when the file is renamed to vX.Y_RELEASE_PLAN.md; ADR-092). All other changes are the release-executor's responsibility.

Protocol-referenced, not protocol-duplicating. You read release/governance/RELEASE_PROTOCOL.md at the start of every invocation to get the current lifecycle steps, plan format, and dry-run requirements. You do not hardcode these — if the protocol changes, your behavior changes.

Config-resolved, not config-hardcoded. At session start you resolve the platform-behavior fields you consume — bundle_doctrine_frame, release_size_target_pts, and default_release_class — per OPERATIONS.md § Platform-Config Resolution Protocol (the 5-rung resolver over core/config/platform-config.toml.template + Layer-2 per-tier overrides). When the hub injected a resolved value into your chip prompt, use it (do not re-resolve). If a field is unresolved at every rung, fall back to your documented defaults (F1 / 15-25 / novel) and log the fallback — never hard-fail. The frame/size/class are config, not hardcoded constants — if the config changes, your behavior changes.

Evidence-grounded. Every recommendation (bundle composition, sequencing, version number) is traced to GitHub Issue data — dependencies, categories, severity, affected files. No gut-feel prioritization.

Pre-flight drift check. Before any mode, run a lightweight drift check:

  • Can GitHub Issues be queried? (verify: gh issue list --limit 1 succeeds)
  • Does RELEASE_PROTOCOL.md exist at release/governance/RELEASE_PROTOCOL.md?
  • Does the requested Milestone title exist? Assert gh api repos/{REPO}/milestones --jq '.[] | select(.title == "{milestone}")' returns exactly one match; HALT with valid-titles list on zero match (prevents silent empty-bundle outputs from typos).
  • Does RELEASE_LOG.md's latest version match expectations? Flag discrepancies before proceeding.

Stage-4-entry currency + crisping mandate. When operating as the Stage 4 Planning persona, the currency gate (Phase A0.5 / G-PL1) and the crisping gate (Phase A0.6 / G-PL2) per release/references/pipeline/stage-04-planning.md are MANDATORY first steps — not prompt-dependent options. Before A1 plan-design: (1) reconcile every release-scoped AC's context against current platform state (G-PL1); (2) re-run the Gate 1 substantive checks against each bundled issue's current body and route any FAIL to crisping (G-PL2). Skipping either is a domain-specific failure mode (below).

Template-protocol consumption. When authoring release-plan templates, consult core/standards/template-protocol.md for the T1-T5 trigger evaluation and the lifecycle state machine. New release-cycle templates must pass P1-P5 promotion gates before canonical placement under operations/templates/. See OPERATIONS.md § Template Protocol.

Mode Selection

This skill has three modes that produce scope-different outputs from the same trigger — "plan the release" could mean Backlog analysis (read-only priority recommendation), Release planning (authoritative plan file), or Dry run (near-destructive diff preview that anchors operator decisions). Misfiring produces the wrong artifact and erodes trust in the plan file. Mode selection is mandatory on every direct invocation — do not guess. The structural placement of this section (first operational subsection before ## Modes) is the forcing function: read it before any mode-specific content.

Tier classification: Always-ask (per OPERATIONS.md § Mode Selection Protocol). AUQ fires on every direct invocation; no trigger-match heuristic.

Step 1 — Check for chained invocation

If this invocation was chained from ppm-agent (detected when the Skill-tool args string contains the token chained=true), read the mode=<value> token from the same args string (pre-filled from the Handoff Manifest action entry per OPERATIONS.md § Skill Chaining Protocol) and skip directly to Step 3.

Dormant branch. release-planner is not on the 4-skill cascade allowlist (comms-writer, delivery-engine, tracker-manager, artifact-generator only). The chain-skip detection is present for forward-compat if the allowlist expands; it does not fire under the current allowlist.

Step 2 — Invoke AskUserQuestion

Otherwise, call the AskUserQuestion tool with:

  • questionText: "Which mode should I run?"
  • options:
    • option: "Backlog Analysis" description: "Read-only backlog review — dependency graph, suggested bundles, priority recommendations. Produces no plan file."
    • option: "Release Planning" description: "Author a release plan at release/releases/plans/<slug>_RELEASE_PLAN.md (slug-primary / pre-claim) — bundle selection, dependency ordering, risk register."
    • option: "Dry Run" description: "Generate diff previews against an existing release plan — no files written outside the release plan's Dry-Run Record section."
    • option: "Pattern Review" description: "Read-only scan of open observations (label:observation) — detect emergent (domain, theme) clusters per decision-discipline.md § 4.2 N=2 emergence rule + § 4.3 theme tagging; draft Proposal-tier issue bodies for candidate clusters; produce Decision Briefing with operator PROMOTE/DEFER/CLOSE verdict request. Writes NO files; produces NO state mutation. On PROMOTE verdict, hands off to release-executor Mode G — Pattern Review Execute (chained=false; operator-explicit handoff per OPERATIONS.md Skill Chaining Protocol)."

Await the user's selection; use the selected option as the mode. Do not proceed without an explicit mode value.

Step 3 — Execute the selected mode

Proceed to the corresponding mode section below (Mode A Backlog Analysis, Mode B Release Planning, Mode C Dry Run, Mode D Pattern Review). Do not proceed until Step 1 or Step 2 has produced an explicit mode value.

Modes

Why Mode A (Stage 3) and Mode B (Stage 4) co-locate — ADR-019

Mode A (Stage-3 bundle-composition) and Mode B (Stage-4 planning) are intentionally co-located in this one skill, not split into separate skills, per ADR-019 (specialists compose, don't proliferate). The Stage-3-Bundle ↔ Stage-4-Planning decision-rights separation is carried at the persona-card level — the distinct §Stage 3: Bundle (Portfolio Manager — Bundle Approver) and §Stage 4: Release Planning (Release Manager) cards in release-personas.md — while the bundle-composition logic itself is externalized to bundle-composition-doctrine.md, which this skill consumes. A separate pmo-bundle-composer skill would duplicate capability against that doctrine + the hub orchestration and is precisely the ADR-019 absorb/proliferate anti-pattern; this skill's multi-mode shape is the compose-correct form of the Stage-3/Stage-4 separation.

Typed Artifact Relationships (Mode A + Mode B)

When emitting a dependency view, Mode A and Mode B label each in-release edge with one of four typed artifact-relationship kinds. The vocabulary is adopted from core/schemas/frontmatter-schema.md §Category 4 (a subset of the frozen 7 MVP relationship types) — referenced, not redefined — so planner output and backlog relations cannot diverge. The four kinds, one line each:

  • GENERATES — the source artifact produced the target (e.g. an issue whose File Change Matrix Creates a file generates it).
  • DEPENDS_ON — the source depends on the target for its validity (the default for any issue→issue edge not provably BLOCKS).
  • BLOCKS — the source's state blocks progress on the target (derived from a native blocks dependency).
  • SUPERSEDES — the source replaces the target (a version-supersession file change, e.g. a _v2 over a _v1).

This artifact-relationship axis is orthogonal to the FS/SS/FF/SF scheduling axis the critical path consumes — an edge can carry both, and the CPM forward-pass never reads the artifact-relationship type. Derivation rules and edge-case dispositions live in references/dependency-analysis.md § Artifact-Relationship Classification.

Mode A — Backlog Analysis

Trigger: "review the backlog", "what should we release next", "prioritize improvements", "show me the dependency graph"

Steps:

  1. Read the bundle and unbundled-Approved queue via read_bundle_issues(milestone) + read_approved_queue_for_theme(theme_labels). The function-contract returns a list of IssueRecord per issue: {number, title, state, labels, priority, status, theme, milestone, body, affected_files, dependencies, parse_status}. Underlying mechanism: gh issue list --milestone "<title>" --state open --json number,title,state,labels,milestone,body --limit 5000 (per git-workflow.md § Batch CLI Query Limits). For the unbundled queue: gh issue list --label "status: approved" --search "no:milestone" --json number,title,labels,createdAt,body --limit 5000. Parsing is delegated to release/tools/bundle-issues-parser.py which extracts affected_files and dependencies from each ### Affected Files and ### Dependencies body section in a single read pass.

    Step 1.5 — Bundleability pre-filter (run BEFORE the parser measures/parses). Non-bundleable work-item types legitimately have no ### Affected Files field (their intake templates do not define one), so parsing them as bundle candidates is a category error that depresses the parse-rate against bodies the parser was never meant to read. Partition the candidate set into three groups before any parse-rate is computed or the dependency graph is built — this is a release-planner filter, NOT a bundle-issues-parser.py change (the parser stays a pure per-body function; the exclusion stays visible and auditable on the planner side rather than hidden inside a silent parser skip):

    1. Conformant-bundleable (the only set the parse-rate denominator and Steps 2–5 operate on): issues typed improvement or bug that have a recognized ### Affected Files heading (after the parser's heading-alias / suffix-tolerant match).
    2. Type-excluded (set aside — not parsed, not counted, not a failure): issues carrying a sub-task, observation, or adr label; issues whose title is [Initiative]-prefixed; and umbrella / roster bodies (e.g., Skill-Update suites and multi-item rosters that enumerate child work rather than name an atomic change). These are excluded by type/shape, not by parse outcome.
    3. Needs-body-repair (set aside — surfaced, not failed): improvement|bug bodies with no recognized ### Affected Files heading after alias/suffix matching. Route these to a needs-body-repair queue surfaced to the operator (older-schema or non-conformant bodies whose repair is a separate, out-of-scope pass); exclude them from the parse-rate denominator so a non-conformant body cannot make the run report a spurious parse-failed/BLOCKING.

    Denominator rule: every parse-rate, the dependency graph, the bundle suggestions, and the File Contention Map operate on the conformant-bundleable set only. Report the Type-excluded and Needs-body-repair counts alongside the parse-quality summary (Step 5 output) as an auditable record — never silently drop them. (Design basis: the ratified Stage 5 spec for the bundle-issues verification surface — the conformant-bundleable denominator + Mode A pre-filter; the parser-side robustification is its sibling and is owned by bundle-issues-parser.py, not this skill.) Per-gate enforcement: the combined-clean parse rate over this conformant-bundleable denominator is gated by G3-14 (core/schemas/gate-criteria-spec.md § Gate 3) at the Stage 3 → 4 (Bundle → Planning) boundary — a Mode A run whose conformant-bundleable combined-clean rate (over bodies with a determinate parse_status of clean/failed; deferred set aside) falls below [bundling].mode_a_parse_rate_floor (default 0.90) cannot proceed to dep-graph consumption (Stage 3 A2/A8, Stage 4 Planning) without the operator-override-with-rationale disposition recorded per the G3-14 self-repair.

  2. The parsed fields are already available from read_bundle_issues() — no separate parse step (run over the conformant-bundleable set from Step 1.5). The IssueRecord schema exposes number/title/priority/status/theme/milestone/body/affected_files/dependencies/parse_status to subsequent steps.

  3. Build the dependency graph per the algorithm specified in references/dependency-analysis.md § Dependency Graph Construction Algorithm — Kahn's BFS topological sort over Map<issue_number, Set[issue_number]> adjacency list, priority-desc (P1>P2>P3>P4) → issue-number-asc tie-breaker, cycle detection via residual-subgraph DFS extraction. After Kahn's emits the topo-sorted sequence, invoke references/dependency-analysis.md § Step 5: Longest-Path Computation (CPM) to produce the schedule-determining chain (DP-DAG longest-path relaxation; degraded mode default until typed-dep substrate populates). Identify:

    • Dependency chains (A → B → C)
    • Independent items (no dependencies)
    • Circular dependencies (HALT bundle recommendation; emit cycle path #A → #B → #C → #A with ERROR severity per failure-mode entry)
    • Items that unblock the most downstream work (high leverage)
    • Schedule-determining chain (longest path from chain-head to chain-tail; emitted as ### Critical Path H3 with mode annotation header per § Step 5c output schema)

    After the dep-graph is built, classify each in-bundle edge into the four §Category 4 artifact-relationship types (GENERATES / DEPENDS_ON / BLOCKS / SUPERSEDES) per references/dependency-analysis.md § Artifact-Relationship Classification, and emit the ### Artifact Relationship Graph (with the empty-state positive-signal body when the classifier yields zero edges). This artifact-relationship axis is independent of the FS/SS scheduling type used by the Critical Path.

  4. Suggest release bundles based on:

    • Dependency ordering (items that unblock others go first)
    • Category clustering (protocol changes together, skill changes together)
    • Severity weighting (P1 items prioritized unless blocked by dependencies)
    • Affected file overlap (items touching the same files bundle naturally)
    • Bundle composition doctrine per release/references/standards/bundle-composition-doctrine.md — apply the 7-step vertical capability slice method (§ 3): name the user capability (Step 1, AFTER/BEFORE), list tickets (Step 2), walk dep graph backward (Step 3), check older milestones (Step 4), size-check at 15-25 pts target band (Step 5), declare internal sequence (Step 6), declare external deps ≤2 (Step 7). Name the composition shape for each suggested bundle per bundle-composition-doctrine.md § 8 — one of: capability-slice / hotfix / audit-driven / cleanup-debt / new-track-inaugural / subsumption-fission. Resolve the bundle-composition frame from the live [bundling].bundle_doctrine_frame config field (core/config/platform-config.toml.template, default F1 SAFe Feature-Slicing + Vertical Slice) per the 5-rung resolver in OPERATIONS.md § Platform-Config Resolution Protocol; the frame is swappable via that field without rewriting doctrine prose. New-track / distinct-capability gate: when a suggested bundle's composition shape is new-track-inaugural, OR the milestone is otherwise a non-identical-track-extension (A6 fires under condition (a) no-prior-rationale OR (b) distinct-capability-scope per release-process.md § Stage 3 Bundle § A6), the ## New-Track Placement Rationale section is required and is gated by G3-17 (core/schemas/gate-criteria-spec.md § Gate 3) at the Stage 3 → 4 boundary; an identical-track-extension records the one-line A6: identical-track-extension … acknowledgment instead (silence is never a pass). Cutover: Applies to all bundle recommendations going forward.

    For each suggested bundle, run file contention analysis and emit a ### File Contention Map section per the format in Step 5. Suppress the section when zero files reach BINARY+ severity across all suggested bundles. Severity rubric: NONE (1 issue, suppressed) / BINARY (2 issues, sequencing) / MULTI-WAY (≥3 issues, atomic edit batch) / CONFLICT (delete + other intent, scope reconciliation blocking).

Step 4.5 — G3-07 cross-milestone sequence validation:

For each suggested bundle, run the G3-07 check per core/schemas/gate-criteria-spec.md § Gate 3. Construct the milestone-position map per the Milestone-Position Resolution algorithm (position: override → due_on ascending → milestone number ascending). For each candidate bundle, enumerate all dependency edges owned by in-bundle issues; compute violations; render the G3-07 result. Always emit the ### G3-07 section under each bundle entry when the bundle has ≥1 dependency edge (any type — same-milestone, cross-milestone resolved, cross-milestone exception-registered, or cross-milestone violation). Emit G3-07 Status: PASS — N dependency edge(s) checked, 0 cross-milestone violations body when the bundle has dep edges but zero unresolved cross-milestone violations — explicit positive signal that the gate ran, analogous to the File Contention Map No file contention detected empty-state. Suppress the section entirely only when the bundle has zero dependency edges (no check possible). Edges registered in the candidate milestone's ## Dependency Exceptions block PASS as governed exceptions.

  1. Present a prioritized view with rationale. See references/output-templates.md § Mode A — Backlog Analysis output for the output-format example.

Emit the G3-07 section under each bundle entry (when bundle has ≥1 dependency edge) with the status line G3-07 Status: PASS | PASS-WITH-EXCEPTIONS (N registered) | FAIL (N unresolved). Include the violation table when status is FAIL; include the registered-exception list when PASS-WITH-EXCEPTIONS; include only the counted status line (PASS — N dependency edge(s) checked, 0 cross-milestone violations) when PASS — the status line is the load-bearing positive-signal artifact when bundle has dep edges but zero violations. When the bundle has ≥2 issues, always emit the File Contention Map (with explicit No file contention detected body when severity_map is all-NONE).

Mode B — Release Planning

Trigger: "plan the release", "generate release plan for v[X.Y]", "bundle these issues"

Steps:

  1. Accept a bundle of GitHub Issues (from user specification or Mode A output, referenced as #N).

  2. Read release/governance/RELEASE_PROTOCOL.md for current plan format requirements.

  3. Auto-determine version number:

    • New skills or structural changes → Major (X.0)
    • Skill updates, protocol changes → Minor (X.Y)
    • Fixes, corrections → Patch (X.Y.Z) Present recommendation; user confirms.

    Note (version vs. deploy order): Milestone version numbers are version keys, NOT chronological deploy order. Releases may deploy out of numeric sequence due to parallel work and late scope changes. See <OPERATOR_INSTANCE_RELEASE_LOG_PATH> § Deploy Order for the chronological timeline.

  4. Read each issue in the bundle via read_bundle_issues(milestone). For each, produce:

    • Root cause analysis (why the problem exists, why it persists)
    • Implementation details (exact file changes, sequence)
    • Lifecycle definition for any new artifacts (per RELEASE_PROTOCOL.md requirement)
    • Upstream dependencies and downstream impact

    Bundle-composition-doctrine field persistence. Mode B persists the doctrine-derived fields per bundle-composition-doctrine.md § 7 Required Fields schema into the release plan's ## Summary H2 section: composition shape (capability-slice / hotfix / audit-driven / cleanup-debt / new-track-inaugural / subsumption-fission per bundle-composition-doctrine.md § 8), capability outcome (one line — references the milestone description's ### Release Outcome Statement H3 block per release-outcome-statement-template.md), size-target band assessment (within 15-25 pts / above / below per § 3 Step 5), frame anchor (resolved from the live [bundling].bundle_doctrine_frame config field per the 5-rung resolver; default F1 SAFe Feature-Slicing + Vertical Slice). Persistence happens in-line with ## Summary H2 — no new H2 section required. Cutover: Applies to all release plans going forward.

    Parallelization-Map auto-populator. Mode B is the canonical auto-populator for the standing ## Parallelization Map (recorded YYYY-MM-DD) section in the milestone description — the standing convention defined in the Stage 3 Bundle spec. At Mode B emit time, the skill ALREADY computes cross-milestone deps (Step 5b G3-07 check), file contention (Step 6), and the dep-graph (Step 5). Drafting the Parallelization Map is a natural extension of that surface: walk the bundle's hard-vs-soft edges using the Hard-vs-Soft Edge Classifier in the dependency-analysis reference, bidirectionally scan other open milestones, and emit the ## Parallelization Map (recorded YYYY-MM-DD) block (verdict + table + reconfirm procedure) into the milestone description via gh api repos/.../milestones/<N> --field description=... at the same Phase B3 moment when the doctrine-required fields land. Operator review at Phase B1 covers the map alongside Outcome Statement + Release Class.

    Structural-blast-radius (Tier-S) emission. Beyond the hard / soft / file-contention edge classes, the auto-populator ALSO emits the Tier-S verdict tier and the structural-blast-radius edge type per the structural-blast-radius (path-invalidation) contention axis defined in the Stage 3 Bundle spec § A9.6.1. When this release's File Change Matrix declares a rename / relocate / delete (and once a release branch exists at Stage 4), compute the mover-set via the 4-token git mover-classifier (RENAME / RELOCATE / DELETE-RECREATE / DIR-RESTRUCTURE, from git diff --name-status --find-renames <base>..<head>), then compute the cross-release structural surface SURFACE(R) via the F1–F6 ref-form sweep in the doc-corpus-reorg ref-form protocol (references neighbor doc-corpus-reorg-ref-forms.md), parameterized by the mover-set's old/new path pairs — consuming the Stage 5 Phase A3.2 sweep output when it has already fired rather than recomputing. The cross-release SURFACE(R) is the union of the five inbound-reference forms enumerated in that protocol — F1 + F2 + F3 + F5 + the in-tree half of F6; F4 (mover-internal-outbound) is EXCLUDED — it is the release's own A3.2 rewrite obligation, not an edit to the target files, and including it over-serializes. Any open/planned sibling milestone whose edit-set intersects SURFACE(R) enters the map as a Tier-S structural-blast-radius serialization edge (one merges, the other re-baselines), with the F1–F6 sweep verdict + intersecting form(s) cited as evidence. Cite the F1–F6 protocol — do not re-author its six forms (the surface enumerator is owned there; this skill consumes it). At Stage 3 (no release branch yet), Tier-S is an advisory pre-filter keyed on the sibling's File-Change-Matrix change_type; Stage 4 A4 is the authoritative structural-detection surface. Scope: corpus mover-sets (the code-mover case uses the Stage 5 Phase A3.1 domain-aware impact-analysis branch).

    Mechanism note: the auto-populator is the convention; this skill is the candidate auto-populator. The map ITSELF is persisted in the milestone description (durable, queryable), NOT in the release plan file — the release plan may reference it for traceability but does not own the canonical copy. The convention binds milestones going forward and does not retroactively bind milestones that predate its adoption (which carry no map by construction).

  5. Determine execution sequence based on dependency ordering. Within this step:

    Step 5a — Bundle refresh check (runs FIRST per CR Conflict C): Invoke the refresh-trigger detection (T1/T2/T3/T4) per release-process.md § A7 — Bundle Mutability Protocol. If Gate G-BR (Bundle Refresh Readiness, G-BR1..G-BR4 per gate-criteria-spec.md § Gate G-BR) detects an unresolved refresh-trigger event since the last Mode A/B invocation, emit a ### Bundle Refresh State section per the Mode B Output Format spec and HALT the plan write until the operator selects an outcome path (no-op / amend / re-bundle / defer) and records the decision per the outcome-path recording mechanism.

    Step 5b — G3-07 halt-condition + always-emit (runs SECOND per CR Conflict C): Re-run the G3-07 cross-milestone-sequence check against the post-refresh bundle scope (in case scope changed at Step 5a). If the check returns FAIL and no exception entries are registered in the candidate milestone description's ## Dependency Exceptions block, HALT the plan-write and surface the violation table to the operator with the four-option remediation prompt (bundle target into source milestone, re-sequence source to later milestone, remove dependency link, register exception with rationale + authorizer + date). Do not write the plan until the operator selects a remediation path or registers exception(s). When the check returns PASS or PASS-WITH-EXCEPTIONS (and the bundle has ≥1 dependency edge), proceed to plan-write with the ## Cross-Milestone Dependency Validation section populated per the Mode B Output Format spec (§ row 4) — emit the positive-signal ### G3-07 Status subsection with body PASS — N dependency edge(s) checked, 0 cross-milestone violations (counted form) even when zero violations exist, analogous to row 3 No file contention detected. Suppress the section entirely only when the bundle has zero dependency edges (no check possible).

    Cutover discipline: Applies to all releases going forward.

    Step 5c — Critical-path emit (CPM longest-chain). After Step 5b completes, invoke references/dependency-analysis.md § Step 5: Longest-Path Computation (CPM) to compute the schedule-determining chain over the bundle's dep-graph. The same DP-DAG longest-path computation runs at Stage 3 A2 (gate signal at Bundle approval) and here at Mode B write-time (durable artifact in the release plan) — Mode B reads the Stage-3-emitted chain when available, OR re-runs DP-DAG when no Stage-3 chain is persisted. Emit the result as the ### Critical Path H3 under the ## Dependency Graph H2 (per Mode B Output Format row 2) using the output schema in references/dependency-analysis.md § Step 5c:

    • Mode-annotation header — always emit at the H3 start. [DEGRADED-MODE: typed-dep substrate absent; chain length is unweighted edge count; lead/lag NOT modeled] when ANY in-bundle edge lacks typed metadata (the default at release ship); [TYPED-MODE: edges carry FS/SS + lead/lag; chain length reflects FS-edge count + lead/lag delays] when every edge carries typed metadata.
    • Chain — ordered list #<head> → #<n2> → ... → #<tail> from chain-head to chain-tail. When bundle has zero dependency edges, emit (none — bundle has no dependency edges).
    • Chain length<integer> edges (degraded mode) OR <integer> edges + <integer> lead/lag days (typed mode).
    • AlgorithmDP-DAG (topologically-sorted longest path) per references/dependency-analysis.md § Step 5.

    The activation predicate degraded_mode_active(bundle) is field-presence-checking over edge.edge_type; transition to typed mode fires automatically when every edge carries typed metadata (no operator-cutover ceremony). Cutover: Applies to all releases entering Stage 3 Bundle / Stage 4 Planning going forward.

    Step 5d — Artifact-relationship typing (CPM-independent). Classify each in-bundle edge into the four §Category 4 artifact-relationship types (GENERATES / DEPENDS_ON / BLOCKS / SUPERSEDES) per references/dependency-analysis.md § Artifact-Relationship Classification, and emit the ### Artifact Relationship Graph H3 under the ## Dependency Graph H2 (table per references/release-plan-template.md; empty-state positive-signal body when the classifier yields zero edges). Also populate the Edge Type column on the ### Topologically Sorted Sequence table. This artifact-relationship axis is orthogonal to the FS/SS scheduling type the Critical Path reads — the CPM forward-pass (Step 5c) never consumes the artifact-relationship type, so the typed graph is a provably additive output.

  6. Produce cross-file impact assessment using the File Contention Map per the format in references/release-plan-template.md. Always emit the ### File Contention Map section when the bundle has ≥2 issues (emit table-header + No file contention detected body when all files map to NONE — explicit positive signal that contention was checked).

  7. Write the plan to release/releases/plans/<slug>_RELEASE_PLAN.md (slug-primary / pre-claim — no version stem; the version binds at the Stage-12 claim).

  8. Present summary to user for review.

Plan format: Follow the structure in references/release-plan-template.md and the section anchor map in ### Mode B Output Format below.

Mode B Output Format

The Mode B output file contains 11 H2 sections in fixed order. Each H2 with its required H3 subsections and conditional-emit rules:

#H2 SectionContent ownerRequired H3sConditional emit
1## SummaryMode B Step 8(none)Always
2## Dependency GraphMode A Step 3 / CPM step / Step 5d### Topologically Sorted Sequence (carries the Edge Type column — the §Category 4 artifact-relationship type per in-release edge), ### Artifact Relationship Graph (always when bundle ≥1 issue — typed edges per references/dependency-analysis.md § Artifact-Relationship Classification; emits the No typed artifact relationships — ... empty-state body when the classifier yields zero edges), ### Mermaid Visualization (when >5 nodes; edges labeled with the artifact-relationship type), ### Tie-Breaker Trace (when ties existed), ### Critical Path (always when bundle ≥1 issue — emits mode annotation header [DEGRADED-MODE: ...] or [TYPED-MODE: ...] + chain ordered list + chain length + algorithm reference per references/dependency-analysis.md § Step 5c; emits "(none — bundle has no dependency edges)" body when bundle has zero edges)Always
3## File Contention MapMode B Step 6(none — table inline)Always when bundle ≥2 issues; explicit "No file contention detected" body when all-NONE
4## Cross-Milestone Dependency ValidationMode B Step 5b / G3-07 spec / always-emit harmonization### G3-07 Status (always when section emitted; body PASS — N dependency edge(s) checked, 0 cross-milestone violations when zero violations — positive signal), ### Violations (when FAIL), ### Resolved Edges (B is Done) (when [RESOLVED] annotations exist), ### Registered Exceptions (when ## Dependency Exceptions block present)Always emitted when bundle has ≥1 dependency edge (any type); suppressed only when bundle has zero dependency edges (no check possible) — analogous to row 3's No file contention detected always-emit pattern / always-emit harmonization
5## Bundle Refresh StateMode B Step 5a / refresh-state ADR(none — body inline)Conditional — present only when Gate G-BR fired non-no-op since last Mode A/B; absent otherwise
6## Implementation SequenceMode B Step 5### Commit Plan, ### Stage Applicability MatrixAlways
7## Cross-PR Overlap AuditStage 4 A4### Baseline SHA (records the audit-start baseline SHA AND, when a GO is rendered, the GO baseline SHA + the sibling-merge revalidation predicate git log <baseline>..origin/main --name-status --find-renames intersected against this release's structural surface SURFACE(R) per the Stage 3 Bundle spec § A9.6.1 axis — the UNIFIED predicate shared by Stage 9 G-PR9 and Stage 12 Phase A.5; --name-status --find-renames, NOT --merges, so squash / fast-forward sibling landings are caught; the pin self-invalidates when a sibling parallel release merges after the baseline and before Stage 9), ### Open PRs in Scope, ### Recently-Merged PRs in Scope, ### Structural Sub-Audit (the mover-set + SURFACE(R) intersection per sibling milestone, when this release's File Change Matrix declares a rename / relocate / delete; suppressed otherwise)Always
8## Risk RegisterMode B Step 4(none — table inline)Always
9## Operator Decisions (D-Gate Block)Stage 4 D-Gate### D-N: <decision title> per D-decision with required subsections (Gate input / Pre-decided / Gate decision / Blocks / Upstream compatibility / Reversibility-Confidence / Spoke recommendation)Always (one H3 per D-decision; Upstream compatibility subsection is structurally required)
10## RecommendationsMode B Step 8(none — numbered list)Always; each entry must be Stage 6+ chip-prompt-input-shaped (actionable, not "consider X")
11## Verification EvidenceStage 13 Close(none — placeholder until Stage 13)Always (initially placeholder)

Sub-section anchors ### File Contention Map (when used inline within Mode A bundle suggestions per Step 5) nest as H3 under each bundle's H3 frame; within Mode B release plan output, the same content lands at H2 level as a top-level section.

D-Concurrency Posture D-row (a recurring entry in the row-9 ## Operator Decisions (D-Gate Block)). Mode B emits a ### D-Concurrency Posture H3 in the D-Gate block declaring the per-release Stage-6 Engineering parallelism posture (per parallelism-posture-taxonomy.md), carrying the same structurally-required subsections every D-row carries. Default P0 fully-serial when undeclared. Scaffold:

### D-Concurrency Posture: Stage-6 Engineering parallelism posture
- **Gate input:** contention map + ADR-005 `overlap_class` distribution + D-C topology (SINGLE / OPTION-A) + wave count
- **Pre-decided:** default **P0 fully-serial** when undeclared (safe-by-construction floor; posture parallelism is opt-IN)
- **Gate decision:** <P0 | P1 | P2 | P3>  (P4 commit-broker is a taxonomy-extension stub, not yet selectable)
- **Blocks:** Stage-6 chip routing (hub Procedure 2 posture dispatch)
- **Upstream compatibility:** posture NAMES the existing D-C SINGLE / OPTION-A behavior (SINGLE = P0, OPTION-A = P2) and adds dispatch; no routing-primitive re-type (ADR-052). No `anthropic-skills:skill-creator` convention conflict.
- **Reversibility-Confidence:** MODERATE / HIGH
- **Spoke recommendation:** P0 unless the contention map + topology + wave count justify a non-serial posture; P2 (per-sub-task-branch merge-queue) is the empirically-validated non-serial default

Mode B narrative: declare the per-release posture in the D-Gate block; when the bundle is single-card / serial, record P0 explicitly rather than leaving the row absent. Every non-serial posture prohibits force-push (incl. --force-with-lease) on the shared release branch under multi-chip activity.

Mode C — Dry Run

Trigger: "dry run", "show me the diffs", "preview changes for v[X.Y]"

Steps:

  1. Read the release plan file for the specified version.
  2. For each file in the plan's affected files list: a. Read the current file content. b. Identify the exact sections that will change (using the implementation details). c. Produce a diff preview per RELEASE_PROTOCOL.md Dry-Run Protocol format:
    • File path and section being modified
    • Before block (current content with line numbers)
    • After block (proposed new content)
    • Context (5 lines above and below)
    • Conflict check (does this change conflict with other IMPs in the bundle?)
    • Impact note (which skills/protocols/flows are affected?)
  3. For complex releases: include cross-file impact assessment and regression risks.
  4. Present all diffs for user review.
  5. On user approval, append the diffs as a "Dry-Run Record" section to the release plan file.

Diff format: See references/diff-format.md for the exact format specification.

Mode D — Pattern Review (DRAFT phase)

Trigger: "run pattern review", "scan observations", "check for emergent patterns", "graduate observations", or operator-explicit AUQ Step 2 Pattern Review selection. Mode D is read-only; it produces NO file writes, NO GitHub state mutation, NO RELEASE_LOG row append. All mutations are deferred to release-executor Mode G — Pattern Review Execute via operator-explicit handoff on PROMOTE verdict.

Steps:

  1. Enumerate open observationsgh issue list --label observation --state open --json number,title,body,createdAt,labels --limit 5000.

  2. Parse domain + theme (two-pass heuristic):

    • Pass 1 (narrow): kebab-case derivation from observation title and body — produces per-instance tag (e.g., plug-and-play-architecture, dim-drift, drift-check-enumeration).
    • Pass 2 (broaden to mechanism level per decision-discipline.md § 4.3): broaden each Pass-1 tag to its parent mechanism (e.g., plug-and-play-architecturearchitecture-boundaries; dim-drift + drift-check-enumerationdrift-detection). If Pass-2 inference produces unknown-mechanism for ANY observation, surface that observation for operator-rendered theme assignment BEFORE proceeding to Step 3, NOT after.
    • Domain assignment: infer from observation body content per § 4.3 three-domain taxonomy (release-ops / project-ops / general-agent-behavior); default release-ops for observation-tier intake when body is silent.
    • Surface BOTH narrow (Pass 1) and broad (Pass 2) tags in the Decision Briefing for operator reference.
  3. Group observations by (domain, Pass-2 broadened theme) tuple over a 180-day rolling window from observation createdAt.

  4. Apply emergence rule per decision-discipline.md § 4.2: any group with count ≥ 2 within the window surfaces as a candidate pattern (cluster).

  5. Draft graduation candidates — for each cluster, draft the literal Proposal-tier issue body per the 9-field mapping in core/governance/OPERATIONS.md § Pattern Review Cadence Protocol Rule 3 (verbatim quoted-block preservation of source observation bodies as Description sub-content). The drafted body is what gh issue create -F <body> will literally receive at Mode G execution time. Persist each cluster's draft body to a file for handoff to Mode G.

  6. Present Decision Briefing — emit structured output AS THE LITERAL PROPOSAL BODIES INLINE (the operator approves the verbatim body, not just the verdict abstraction). See references/output-templates.md § Mode D — Pattern Review Decision Briefing output for the verbatim Decision Briefing format the operator approves literally.

  7. Await operator verdict per candidate. On any PROMOTE verdict, present operator with handoff option per references/output-templates.md § Mode D — Operator-Explicit Handoff to release-executor Mode G.

    Mode D HALTS here. No file writes, no GitHub state mutation occur in Mode D. The operator-explicit handoff is the seam; release-executor Mode G executes the writes.

Output decision-class: PROMOTE / DEFER / CLOSE verdicts are reversibility-tagged per decision-discipline.md. Mode D itself produces NO state mutation; the decision-class items are the verdict recommendations and the drafted Proposal bodies. Tier vocabulary applies: each cluster surfaced is MODERATE · confidence depends on theme-tag quality (HIGH when Pass-2 broadening produced a canonical mechanism; LOW when Pass-1 narrow drove emergence and Pass-2 was inferred).

Output format: Decision Briefing per Step 6 inline. NEW reference template references/pattern-review-template.md (authored per template-protocol.md T1-T5; defaults to skill-internal-standalone per § Template-protocol consumption — does NOT go through P1-P5 promotion until 3 Pattern Reviews exercise it).

What This Skill Does NOT Do

  • Does not modify governance files (CLAUDE.md, OPERATIONS.md, etc.)
  • Does not create snapshots (release-executor's job)
  • Does not execute file changes (release-executor's job)
  • Does not transition issues to closed status (release-executor's job)
  • Does not update RELEASE_LOG.md (release-executor's job)

Reversibility Discipline

This skill produces decision-class outputs — release-bundle recommendations, version recommendations, execution-sequence recommendations, release plans, and dry-run diff approvals. The skill is read-only against governance files, but its outputs shape what downstream release-executor actually modifies, so tier labels are required on every decision-class item. Every decision-class item must carry a reversibility tier paired with a confidence level per core/specs/reversibility-protocol.md.

Decision-class outputs in this skill:

  • Mode A (Backlog Analysis) — suggested release bundles with rationale, dependency-ordering recommendations, version-bump suggestions (major / minor / patch).
  • Mode B (Release Planning) — version number auto-determination and recommendation, bundle composition, execution sequence, cross-file impact assessment, plan structure choices.
  • Mode C (Dry Run) — diff-conflict findings, regression-risk callouts, recommendation to append Dry-Run Record to the plan.

Tier vocabulary (undo threshold + stakeholder impact):

  • CHEAP (undo in hours) — backlog-analysis suggested bundles the user hasn't actioned, draft version suggestion, pre-approval diff preview. State the tier. Proceed.
  • MODERATE (undo in days) — release plan circulated for operator review, dependency-ordering rationale consumed by downstream planning. State the tier, surface the key assumption in ≤1 sentence, invite single-reviewer pass.
  • EXPENSIVE (undo in weeks) — release plan written to releases/plans/ and referenced by downstream release-executor, bundle composition used to scope Milestone and assign sub-tasks. State the tier, document rationale (≥2 sentences), state rollback plan, name the affected cohort (release-executor agent, operator, any sub-task assignees).
  • IRREVERSIBLE (cannot undo) — a version number recommendation adopted for a release that ships and is logged in RELEASE_LOG.md; a bundle composition that has triggered downstream Solutioning and Engineering work. State the tier, document rationale, state rollback is infeasible or name the counter-commitment (a follow-on release that supersedes), name the sign-off authority (operator), pair with explicit downside description.

Label format (any accepted):

  • Inline: Recommendation (MODERATE · confidence: HIGH): <text>
  • Trailing: <text> [MODERATE · confidence: HIGH]
  • Structured column: tier value in a Reversibility or Tier column of the bundle table or release-plan section header.
  • Structured frame: tier value populated alongside each bundle suggestion, each version recommendation, or each dry-run conflict finding.

Confidence values: HIGH / MEDIUM / LOW. Reversibility is what-if-wrong cost; confidence is how-likely-wrong. Both travel together. A HIGH-confidence IRREVERSIBLE recommendation still requires a sign-off gate; a LOW-confidence CHEAP recommendation still proceeds immediately.

Enforcement: pmo-qa-auditor G4 will FAIL any output of this skill that contains a decision-class item without a reversibility tier label. Outputs missing tiers on decision-class items — including bundle suggestions, version recommendations, and release plan sections that frame a preferred path — will fail G4. See core/specs/reversibility-protocol.md for the full protocol, worked examples, and G4 gate algorithm.

Guardrails (Platform)

Inherits CLAUDE.md § Universal Preferences and § Quality Standards. See the source for the authoritative list. Domain-specific additions appear under § Domain-Specific Failure Modes below — those are skill-specific, not platform-wide.

Domain-Specific Failure Modes

These domain-specific anti-patterns coexist with the ## Operating Principles (platform- wide generic guardrails including read-only, protocol-referenced, evidence-grounded) and ## Reversibility Discipline (decision-class output discipline). Each entry uses the 5-field conditional template per core/standards/failure-mode-standard.md. pmo-qa-auditor gate G7 enforces structural conformance and content quality.

Circular dependency silently bundled — PROC

  • Signature (observable signal): Mode A suggested bundle contains issues where the dependency graph forms a cycle (e.g., #A depends on #B, #B depends on #C, #C depends on #A) and the bundle output proceeds without an explicit "Circular dependency detected — cannot bundle" error citing the specific cycle path.
  • Conditional: do NOT emit a bundle recommendation when the dependency graph among bundle issues contains a cycle, because a bundled cycle produces an unschedulable release — the execution sequence at Mode B / downstream release-executor cannot resolve the ordering — and the cycle must be surfaced at planning so the operator can break it (defer an issue, split the release, refactor the dependency chain) before engineering invests in the bundle.
  • Root cause: Cycle detection is a specific graph-traversal step with no convenient heuristic — scanning dependency fields linearly is fast; building the graph and running cycle detection is the separate discipline step that's easy to skip when the bundle "looks reasonable."
  • Mitigation: Before emitting any Mode A bundle, construct the dependency graph from the Dependencies field of every issue in the candidate bundle (per references/dependency-analysis.md § Dependency Graph Construction Algorithm — Kahn's BFS with residual-subgraph DFS extraction); on detection, emit the specific cycle path with severity ERROR and halt the bundle recommendation.
  • Principal response vs. junior response: Principal runs the cycle check, surfaces the specific path (#A → #B → #C → #A), and proposes which edge to break. Junior ships the bundle suggestion because the issues "feel related" and the cycle surfaces at execution time as a scheduling failure.

Mode B writes files beyond the release plan — TRIG

  • Signature (observable signal): A Mode B invocation's file-write activity targets files other than the release plan file (release/releases/plans/<slug>_RELEASE_PLAN.md pre-claim, or its post-claim vX.Y_RELEASE_PLAN.md) — for example, writes to CLAUDE.md, OPERATIONS.md, a skill's SKILL.md, or any other governance or reference file.
  • Conditional: do NOT modify any file other than the release plan file during Mode B execution, because release-planner is read-only against governance files by contract — release-executor owns modification — and a planner that writes governance files destroys the two-phase review structure that separates planning approval (operator reviews the plan) from execution approval (operator reviews the diff).
  • Root cause: "While I'm here, let me also update..." — scope creep from efficiency framing. Fixing a typo in the protocol while writing the plan feels helpful; it violates the read-only contract that makes planner/executor separation trustworthy.
  • Mitigation: Before every file write during Mode B, verify the target is the release plan file — the slug-keyed pre-claim form release/releases/plans/<slug>_RELEASE_PLAN.md (or, post-claim, release/releases/plans/vX.Y_RELEASE_PLAN.md after the Stage-12 rename); reject any other target with an explicit skill-scope-violation flag; open an IMP issue for any governance update observed during planning rather than executing it in-band. (No hard version-only reject — the pre-claim plan legitimately carries no version stem.)
  • Principal response vs. junior response: Principal enforces the boundary and opens follow-on IMP issues for observed drift. Junior writes opportunistic edits to governance files, which then conflict with the downstream release-executor run that was meant to apply the same changes.

Version number auto-determined without user confirmation gate — OUT

  • Signature (observable signal): Mode B release plan finalizes a concrete version — a vX.Y bound into the frontmatter or into the filename (a premature releases/plans/vX.Y_RELEASE_PLAN.md instead of the slug-keyed pre-claim releases/plans/<slug>_RELEASE_PLAN.md) — but the conversation shows no user response between the auto-determination step and the plan write — no explicit acknowledgment or override. (At plan time the version is a bump-class intent + provisional-display label, not a claim; the concrete number binds only at the Stage-12 CAS — ADR-092.)
  • Conditional: do NOT finalize a version number in a release plan file when the version was auto-computed and the user has not explicitly confirmed it, because version numbers are the release's permanent identifier — written into RELEASE_LOG.md, tag references, rollback procedures, and downstream release-executor targets — and wrong version numbers propagate through every downstream artifact, while the Mode B protocol explicitly requires "Present recommendation; user confirms."
  • Root cause: Auto-determination (major / minor / patch from change class) produces a plausible number that feels safe to commit. The confirmation step adds a round trip that feels redundant when the determination logic is clear.
  • Mitigation: After auto-determining the version, present the recommendation with rationale ("Proposed: v4.1 — minor, 4 protocol updates, 2 skill edits. Confirm or override."); wait for user confirm or override; only then write the plan file with the confirmed version in its filename and frontmatter.
  • Principal response vs. junior response: Principal presents and waits. Junior writes the plan with the auto-determined version, and correcting a wrong version after plan write requires a rename-and-reference-update cycle that would not have been needed if the gate had fired.

Dry-run diff conflict check skipped across issues in bundle — INPUT

  • Signature (observable signal): Mode C dry-run diff preview contains per-issue diffs for each affected file, but no Conflict Check line per file, or the Conflict Check reports "no conflicts" when two or more issues in the bundle modify overlapping line ranges in the same file.
  • Conditional: do NOT emit a Mode C diff preview without running the per-file conflict check across every issue in the bundle, because overlapping edits in a single file produce merge failures at execution time that the dry-run was specifically designed to catch — bypassing the check means release-executor discovers at Step 5 what the dry-run should have surfaced at planning.
  • Root cause: Single-issue diff production feels complete — each issue's diff is clean in isolation. The cross-issue union of edited line ranges is a separate pass that only fires when more than one issue in the bundle touches the same file.
  • Mitigation: For each file in the bundle's affected-files union, compute the union of line ranges touched by all issues targeting that file; identify overlaps; emit [CONFLICT] #A (lines 10-15) overlaps #B (lines 12-18) in the per-file diff; when any conflict exists, downgrade the dry-run verdict from "ready to execute" to "conflicts require resolution."
  • Principal response vs. junior response: Principal runs the cross-issue conflict pass and surfaces overlapping ranges with proposed resolution (resequence, split, merge the edits into one issue). Junior ships per-issue diffs, the operator approves the dry-run, and release-executor halts at Step 5 with a merge conflict.

Cross-milestone dependency silently bundled — PROC

  • Signature (observable signal): A Mode A bundle suggestion or Mode B release plan contains an issue with a dependency edge to a target issue in a later milestone (per Milestone-Position Resolution), and the bundle/plan output proceeds without an explicit G3-07 violation table OR an exception registration in the milestone description's ## Dependency Exceptions block.
  • Conditional: do NOT emit a bundle recommendation or write a release plan when the dependency graph contains a cross-milestone-sequence violation that is neither resolved (target Done in closed milestone) nor exception-registered, because a bundled sequence violation produces a release that cannot execute without inline-authoring its own blockers — the operator must either re-sequence (move issues between milestones), bundle the target into this milestone, or document the exception with rationale; bypassing the gate destroys the cross-milestone-sequence guarantee that makes bundle plans schedulable.
  • Root cause: Cross-milestone validation requires consulting milestone-position state EXTERNAL to the candidate bundle — the per-issue gate loop checks dep-state (G3-01) and within-bundle cycles (G3-02), both of which feel like "the dependency check is done." The milestone-sequence dimension is a separate consultation step that is mechanically easy to skip when bundle composition looks clean.
  • Mitigation: Before emitting any Mode A bundle or writing any Mode B plan, construct the milestone-position map per the Milestone-Position Resolution algorithm (gate-criteria-spec.md § Gate 3); for each dep edge owned by in-bundle issues, compute violations; surface the violation table; halt on FAIL until operator selects remediation or registers exception per the exception-acceptance protocol.
  • Principal response vs. junior response: Principal runs the cross-milestone check, surfaces the specific edges with milestone-positions and gap distance, and proposes which remediation path fits each violation (resequence vs. bundle vs. remove vs. exception-with-rationale). Junior ships the bundle suggestion because dep-states all read "Approved" and within-bundle order looks coherent; the sequence violation surfaces at Stage 6 Engineering when the implementing agent discovers the target issue isn't yet shipped.

Bundle output omits File Contention Map — OUT

  • Signature (observable signal): Mode A or Mode B output for a bundle with ≥2 issues omits the ### File Contention Map section, OR emits the section without a parse-quality summary line.
  • Conditional: do NOT emit a Mode A or Mode B bundle output without the File Contention Map section when the bundle has ≥2 issues, because contention is a release-planning input the operator must see before scope-lock — silent omission causes the operator to approve a bundle with unmapped collision risk.
  • Root cause: Single-issue bundles naturally have no contention, so the section is conditional — easy to extend the conditional to "bundle has no overlap" and skip emission entirely. The required behavior is "emit always when ≥2 issues; explicit empty-table when no overlap detected."
  • Mitigation: Mode A/B step verify len(bundle) >= 2 → emit section; check parser tool output is non-empty; emit explicit No file contention detected body row when severity_map is all-NONE; always include parse-quality summary line (<N> issues parsed cleanly · <M> deferred (excluded) · <K> parse-failed (BLOCKING)).
  • Principal response vs. junior response: Principal emits the section with empty body and positive-signal note. Junior skips the section to "avoid clutter," and the operator approves the bundle without knowing whether contention analysis was actually run.

Critical-path output omits mode annotation — OUT

  • Signature (observable signal): Mode A or Mode B output emits a ### Critical Path H3 with a chain and length, but no [DEGRADED-MODE: ...] / [TYPED-MODE: ...] annotation header preceding the chain. The operator sees Chain: #A → #B → #C and Chain length: 3 with no indication of whether "3" means "3 unweighted edges (untyped substrate)" or "3 FS-edge weight + lead/lag delays (typed substrate)."
  • Conditional: do NOT emit the ### Critical Path H3 without the mode-annotation header when the bundle has ≥1 issue, because the chain length number is semantically ambiguous without the header — [DEGRADED-MODE: ...] and [TYPED-MODE: ...] carry the per-edge-weight interpretation, and a chain length unanchored to mode produces operator misreads (e.g., treating an unweighted edge count as a lead/lag-inclusive duration estimate, or vice versa).
  • Root cause: The chain reconstruction step (sink→head walk over pred map) feels complete on its own — the chain list and length are the visible artifacts; the mode-annotation header is a separate string-emission step that's mechanically easy to skip when the chain "looks right." The annotation is the load-bearing semantic anchor for the length number, not visual decoration.
  • Mitigation: Compute mode_annotation = _mode_annotation(bundle) per references/dependency-analysis.md § Step 5b BEFORE emitting the H3 body; emit the annotation as the FIRST line under the H3 (before chain or length); verify the annotation string matches one of the two canonical forms ([DEGRADED-MODE: ...] or [TYPED-MODE: ...]); on missing or non-canonical annotation, halt emission and re-run _mode_annotation(). Stage 7 DT walks the bundle's ### Critical Path H3 and asserts annotation presence.
  • Principal response vs. junior response: Principal emits the annotation FIRST and treats it as the load-bearing semantic anchor — chain + length without annotation is incomplete output. Junior ships the chain + length thinking the H3 is complete; downstream operator at Bundle approval / Stage 4 sequencing misreads "Chain length: 3" as a day-count or work-unit estimate, and bundle decisions are made on a length number whose semantic meaning was never declared.

Bundle read returns empty due to mistyped milestone — INPUT

  • Signature (observable signal): Mode A or Mode B receives a milestone title that does not match any GitHub Milestone, and the skill returns an empty bundle without surfacing the discrepancy.
  • Conditional: do NOT proceed past pre-flight when gh api repos/{REPO}/milestones --jq '.[] | select(.title == "{milestone}")' returns zero results, because an empty read silently produces an empty plan output that misleads the operator into thinking the bundle is empty.
  • Root cause: Mistyped milestone titles (e.g., v2.01-release-planner-bundle vs v2.01-release_planner_bundle) return empty result sets from GitHub's API; the skill's pre-flight drift check does not currently validate milestone-title existence on its own — the symptom (empty bundle) is indistinguishable from a legitimate empty bundle.
  • Mitigation: Pre-flight asserts gh api repos/{REPO}/milestones --jq '.[] | .title' returns at least one match for the requested title; HALT with valid-titles list on zero match. The Operating Principles § Pre-flight drift check bullet enforces this assertion before any Mode A/B work.
  • Principal response vs. junior response: Principal validates and surfaces the typo with the valid-titles list so the operator can self-correct in one round-trip. Junior reports "no issues in bundle" and the operator wastes a Stage 5 cycle debugging an apparent empty bundle that was actually a typo at Stage 4 entry.

Mode D pattern cluster handed off without literal-body operator approval — PROC

  • Signature (observable signal): Mode D Step 6 Decision Briefing emits cluster summaries but omits the verbatim Proposal body inline; operator's PROMOTE verdict is rendered against the cluster summary abstraction; the handoff manifest to release-executor Mode G references a "Mode D synthesized body" the operator never literally approved.
  • Conditional: do NOT proceed from Step 6 to Step 7 handoff when the Decision Briefing does NOT contain the LITERAL verbatim Proposal body that release-executor Mode G will receive via gh issue create -F <body>, because operator PROMOTE rendered against a cluster summary is NOT operator approval of the issue body — and Mode G is forbidden from synthesizing or modifying the body post-approval (its only input is the approved body file).
  • Root cause: [systemic pattern: verdict-abstraction substitution for artifact-preview approval] → [proximal cause: Decision Briefing's cluster summary is shorter and faster to render than the full Proposal body, but the latter is what gh issue create -F actually consumes] → [observable signal: handoff manifest cites a body file the operator did not literally read in the Decision Briefing].
  • Mitigation: Mode D Step 5 produces the LITERAL Proposal body and persists it as a draft file; Step 6 Decision Briefing embeds the verbatim body inline under the **Proposed Proposal (verbatim — operator approves this body literally):** header; Step 7 handoff manifest cites the persisted file path; release-executor Mode G reads that exact file via gh issue create -F <file> with NO modification.
  • Principal response vs. junior response: Principal embeds the literal body inline and persists it as the handoff artifact. Junior shortcuts to a cluster summary in the Briefing, treats PROMOTE as approval-of-intent, and Mode G synthesizes the body at file-time using "the cluster summary as guidance" — producing a filed Proposal the operator did not literally pre-approve.

Phase A0.5 currency gate skipped at Stage 4 entry — PROC

  • Signature (observable signal): A Stage 4 Planning run proceeds to A1 plan-design (sequencing / change-spec drafting) without a Phase A0.5 (G-PL1) currency reconciliation in the sub-task output — no per-issue AC-context check against current state, and stale paths/versions/upstream-artifact refs in issue bodies are carried into the plan as-written.
  • Conditional: do NOT begin A1 plan-design when any release-scoped issue's AC context (file paths, version refs, named upstream artifacts) has not been reconciled against current platform state at Stage 4 entry, because intake-substrate drift means a body that passed at intake may cite retired paths by Stage 4 (e.g., a .claude/agents/... path that the agent→skill cutover retired) — and planning against stale context produces change-specs that target non-existent files, surfacing as Tier 1 [ADJUST] rework (or worse, silent mis-edits) at Engineering.
  • Root cause: The currency check is a separate stage-entry reconciliation pass with no convenient heuristic — reading an issue body linearly is fast; cross-checking each cited path/version against the live tree is the discipline step that is easy to skip when the body "looks complete." Historically the check was a prompt-dependent option (no structural enforcement) per the confirmed-permanent intake-substrate-drift memory.
  • Mitigation: Run Phase A0.5 (G-PL1) as the mandatory first reconciliation: for each release-scoped AC, verify cited file paths exist (git ls-files), version refs are current, and named upstream artifacts are present; route CURRENCY-MISMATCH to Tier 1 [ADJUST] (gh issue edit --body + deviation-log entry) BEFORE A1. Record the reconciliation in the sub-task output.
  • Principal response vs. junior response: Principal reconciles every cited path against the live tree, catches the retired-path drift at Stage 4 entry, and re-targets via [ADJUST] before planning. Junior plans against the body as-written, and the stale path surfaces at Engineering as a change-spec pointing at a file that no longer exists.

Phase A0.6 crisping gate skipped at Stage 4 entry — PROC

  • Signature (observable signal): A Stage 4 Planning run proceeds to A1 plan-design without a Phase A0.6 (G-PL2) crisping check — no re-run of the Gate 1 substantive checks (G1-02 / G1-04 / G1-05) against each bundled issue's current body, and a weak/under-specified body is planned against without being routed to crisping.
  • Conditional: do NOT begin A1 plan-design when a bundled issue body fails the Gate 1 substantive checks (Description actionable / Proposed Change names files / AC verifiable) at Stage 4 entry, because a weak body produces a vague change-spec that pushes design ambiguity downstream into Engineering — the crisping gate exists to catch a body that degraded since intake (or was force-bundled with [ASSUMPTION – CONFIRM] gaps) and refine it BEFORE plan-design commits to it.
  • Root cause: A bundled issue feels "already triaged," so re-checking body substantiveness at Stage 4 entry feels redundant — but intake-substrate drift and operator force-bundle overrides mean a body that passed Gate 1 at intake can be stale or thin at planning time. Re-running the substantive checks is a separate pass that is mechanically easy to skip when the bundle looks settled.
  • Mitigation: Run Phase A0.6 (G-PL2) before A1: re-evaluate each bundled body against gate-criteria-spec.md § Gate 1 substantive criteria (G1-02 / G1-04 / G1-05); on any FAIL, route the issue to the crisping pre-gate (operator-gated body refinement via gh issue edit --body, reusing the Gate 1 self-repair remediations) and do not plan against it until it passes. House crisping inline in this skill — do not hand off to an operations-module skill (module Public-API discipline).
  • Principal response vs. junior response: Principal re-runs the substantive checks at Stage 4 entry, surfaces the 2 weak bodies, and crisps them (or routes to operator) before drafting change-specs. Junior treats "bundled" as "body is fine," drafts change-specs against thin bodies, and the ambiguity surfaces at Engineering as an unimplementable spec requiring a round-trip back to Planning.

Size-band breach self-remediated instead of handed to the operator — HAND

  • Signature (observable signal): A Mode A bundle suggestion or Mode B plan whose bundle-composition size-check lands outside the doctrine's target band (15-25 pts at current calibration; thresholds carry [CALIBRATE-AFTER-3]) ships with the scope silently adjusted — issues dropped, merged, or split by the planner on its own — or proceeds at the breached size with the band assessment omitted from the output; no operator decision point carrying the disposition options appears.
  • Conditional: do NOT self-trim, self-merge, or silently proceed when the size-check lands outside the bundle-composition doctrine's target band, because the band's dispositions (split by sub-capability / merge with an adjacent slice / ship-as-is with documented rationale) are scope decisions that bind Milestone composition and downstream Engineering — the planner's contract is recommend-then-operator-decides, and the established HALT-and-prompt pattern (bundle-refresh outcome paths, cross-milestone remediation options, the plan's operator-decision gates) exists precisely so a capacity breach surfaces as a decision, not as an invisible scope mutation.
  • Root cause: The size-check returns a number, and the doctrine's disposition table reads like an algorithm — "above band → split" looks executable, so the planner executes it, conflating the doctrine's positive guidance with authorization to mutate scope. Dropping an issue from a suggested bundle does not feel like a decision because no file changed — but the milestone roster downstream is built from exactly this output.
  • Mitigation: When the size-check lands outside the target band, emit the size-target band assessment with the total and per-issue points, then HALT the recommendation at an explicit operator decision: present the disposition options from the doctrine's table — split by sub-capability (with the proposed cut lines), merge with a named adjacent slice, or proceed-with-rationale recording an operator-judgment override (the oversized-precedent shape in the doctrine's worked examples) — each tagged with reversibility and confidence. Record the selected disposition in the plan's Operator Decisions block (Mode B; for a Mode A bundle suggestion, in the suggestion's disposition section). The planner proposes the cut lines; the operator owns the cut.
  • Principal response vs. junior response: Principal emits "54 pts — above band; options: (A) split at the synthesis boundary into 2 slices [proposed lists], (B) proceed oversized with documented rationale," and the milestone that ships reflects an operator choice with a recorded why. Junior quietly drops three issues to land at 24 pts and ships the "clean" bundle — the operator discovers the orphaned issues a release later, with no record of who descoped them or why.

Structural-blast-radius axis omitted or computed with the wrong instrument — PROC

  • Signature (observable signal): A Parallelization Map this skill auto-populates for a milestone whose File Change Matrix declares a rename / relocate / delete ships with NO Tier-S verdict and no structural-blast-radius edge — OR the map's Tier-S edge was derived by running the inbound-discovery blast-radius CLI on the mover-set (which exits on a non-extant renamed-from / deleted path and is depth-capped, so it cannot enumerate a relocating set's surface) instead of the F1–F6 ref-form sweep — so a sibling milestone whose edit-set references a path this release moves is classified parallel-safe despite sharing zero ticket-dependency edge and zero same-path overlap.
  • Conditional: do NOT emit a Parallelization Map for a mover-declaring milestone without computing the Tier-S axis via the F1–F6 ref-form sweep over the mover-set, because the structural-blast-radius collision class is invisible to the ticket-graph and same-path classifiers (the two releases never reference each other) — it is the exact zero-edge case the cross-release impact model exists to catch — and the inbound-discovery CLI structurally cannot enumerate a moving set's surface, so using it re-creates the silent blind spot the axis was added to remove.
  • Root cause: The mover-classifier + F1–F6 sweep is a distinct multi-step discipline (compute the mover-set, parameterize the sweep, intersect per sibling), whereas the hard / soft / file-contention edges fall out of the dep-graph and contention work the skill already does — so the structural axis is the step easy to skip when the map "looks complete," and the nearest-named inbound tracer is the tempting wrong tool because it superficially answers "what references this path."
  • Mitigation: When the milestone's File Change Matrix declares a rename / relocate / delete, compute the mover-set (git diff --name-status --find-renames <base>..<head>), then compute SURFACE(R) per the Tier-S emission rule in Mode B above (the F1–F6 sweep in the doc-corpus-reorg ref-form protocol; cross-release surface = F1/F2/F3/F5 + in-tree F6, F4 excluded), consuming the Stage 5 Phase A3.2 sweep output when present; test each open/planned sibling's edit-set for intersection; emit any intersecting sibling as a Tier-S structural-blast-radius serialization edge with the sweep verdict cited. Never substitute the inbound-discovery CLI for the mover-set surface.
  • Principal response vs. junior response: Principal runs the mover-classifier + F1–F6 sweep, surfaces the Tier-S serialization edge with the intersecting form, and recommends the serialize order. Junior emits a clean-looking map with only hard / soft / file-contention edges, the two mover-vs-referrer releases are run in parallel, and one voids the other's GO mid-pipeline as a rename/modify conflict.

Artifact-relationship type conflated with FS/SS scheduling type — PROC

  • Signature (observable signal): The ### Artifact Relationship Graph or the Edge Type column labels an edge with an FS/SS/FF/SF scheduling value (Finish-Start, Start-Start…) instead of a §Category 4 artifact-relationship type (GENERATES / DEPENDS_ON / BLOCKS / SUPERSEDES) — OR the §Category 4 type is fed into the critical-path computation (the chain length or chain identity changes when an edge's artifact-relationship type changes), proving the CPM forward-pass read the artifact-relationship field it must never read.
  • Conditional: do NOT read the §Category 4 artifact-relationship type field in the critical-path computation, and do NOT emit a scheduling-precedence value in the artifact-relationship render, because the two are orthogonal axes — the artifact-relationship type answers "what kind of relationship connects these artifacts," the scheduling type answers "what precedence does this edge impose on the schedule" — and conflating them either corrupts the schedule chain (if §Cat-4 types reach the DP-DAG relaxation) or mislabels the rendered graph (if FS/SS values reach the artifact-relationship column), destroying the provably-additive guarantee that lets the typed graph coexist with the existing CPM math untouched.
  • Root cause: Both axes are "edge types" stored on the same edge record, and the skill already carries a typed edge_type enum for scheduling — so a single-axis mental model collapses the two into one field, and the CPM relaxation (which legitimately reads edge_type) is one field-name slip away from also reading artifact_rel. The two enums are lexically distinct but conceptually adjacent, which is exactly when a cross-wire is easy and invisible.
  • Mitigation: Keep the two edge attributes as independent fields — edge_type ∈ {FS, SS, FF, SF} consumed ONLY by the CPM forward-pass (§ Step 5b/5c), and artifact_rel ∈ {GENERATES, DEPENDS_ON, BLOCKS, SUPERSEDES} consumed ONLY by the ### Artifact Relationship Graph render (§ Step 5d) and the Edge Type column. Per references/dependency-analysis.md § Artifact-Relationship Classification, the derivation of artifact_rel reads native-dep kind / body provenance / File-Change-Matrix change-type — never the scheduling enum; the CPM relaxation reads edge_type / lead_lag — never artifact_rel. On any output where a critical-path number moves with an artifact-relationship change, halt and trace which field the CPM path read.
  • Principal response vs. junior response: Principal keeps the two fields strictly separate, verifies the critical-path output is byte-identical when only artifact-relationship types change, and renders each axis in its own surface. Junior overloads the existing edge_type enum with GENERATES/BLOCKS, the CPM forward-pass relaxes over a union enum it cannot weight, and the schedule chain length silently becomes meaningless.

Reference Files

Read these on first use:

  • references/release-plan-template.md — Template for release plan files
  • references/dependency-analysis.md — Dependency mapping methodology
  • references/diff-format.md — Dry-run diff production format
  • references/output-templates.md — Output-format examples for Mode A (Backlog Analysis), Mode D (Pattern Review Decision Briefing + Operator-Explicit Handoff)
  • release/references/standards/bundle-composition-doctrine.md — Bundle composition doctrine: 7-step vertical capability slice method + tight-merge mechanics + naming convention + size-target heuristics + 6 worked-example shapes; current default frame F1 SAFe Feature-Slicing + Vertical Slice (resolved from the live [bundling].bundle_doctrine_frame config field per the 5-rung resolver — see OPERATIONS.md § Platform-Config Resolution Protocol); Mode A consults at Step 4; Mode B persists doctrine-derived fields per § 7 (cutover applies to all bundles going forward)

Reference docs

Mode B calibration read-model inputs (telemetry)

Mode B reads the platform's on-demand window telemetry read-models for capacity/quality calibration once a window establishes (≥3 comparable windows per the platform N=3 threshold). Pointer only — read on demand, never recompute; these are read-models over existing events, never written back:

What ships with it: 5 files

66.8 KB alongside SKILL.md

Keep looking

Skills are one crate of 326,764. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.