PM-GATED. The VP-Product Reviewer (VP Product) sets, critiques and ratifies OKRs for every goal-seed or goal-setting sizing at once, in one background wave. Or named seeds.
Installs into .claude/skills of the current project.
Are you the author of Goal Blitz?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/dbc-oduffy-goal-blitz)
---
name: goal-blitz
description: "PM-GATED. The VP-Product Reviewer (VP Product) sets, critiques and ratifies OKRs for every goal-seed or goal-setting sizing at once, in one background wave. Or named seeds."
description-budget: 320
version: 1.0.0
allowed-tools: ["Read", "Write", "Edit", "Bash", "Grep", "Glob", "Agent", "Skill", "Workflow", "AskUserQuestion", "TaskCreate", "TaskUpdate", "TaskGet", "TaskList"]
argument-hint: "[<seed-id> ...] [--interaction-mode hands-on|pm|ceo]"
---
# Goal-blitz — a repo's worth of OKRs, one ratification
Batches `coordinator:goal-setting`: the VP-Product Reviewer (`coordinator:vp-product`, Opus, effort high) sets each OKR
from the seed's context, a second the VP-Product Reviewer pass critiques it, the VP-Product Reviewer integrates, a blitz-em checks readiness,
and the VP-Product Reviewer ratifies the whole set once at the end. A seed that already states an objective is input the VP-Product Reviewer
may refine; the VP-Product Reviewer's version is what lands. Nothing reaches `state/goals/` before that ratification. Rationale: wiki `planning/goal-blitz`
— read when a rule looks wrong, never to decide whether to follow one. The wave fires from the
top-level EM only — a dispatched agent cannot fan out (`A-SKILL-PHASE-NAMES-ITS-ACTOR`).
---
## Two modes
| Mode | Target set |
|---|---|
| **Sweep** (default, no args) | every goal-seed baton (`kind: goal-seed`) with `deployment_state: awaiting_gate`, and every sizing with `route: goal-setting` and `status: sized` or `routed`. Landing stamps a consumed sizing `shipped`. |
| **Targeted** (`<seed-id> ...`) | the ids you pass. Everything unnamed is not a candidate. |
**Check `unmatched_targets` on every targeted run** — a quietly dropped target is worse than a refusal.
**When NOT to use:** one goal → `coordinator:goal-setting`. Still deciding what to build →
`coordinator:shape`. Goals ratified and ready for roadmaps → `coordinator:roadmap-planning`.
**Dispatch authorization — invoking this skill IS the request.** The dispatches named below are constitutive steps of this skill, not a separate thing to get cleared: invoking a skill requests the actions that skill performs. A harness line permitting dispatch "unless the user requested it" is therefore **satisfied here, not overridden** — no precedence claim is needed and none is made. Re-asking spends the very context the dispatch exists to protect. The rule attaches to skill entry and dissolves no PM-authored gate: keyword-gated skills gate entry, and every gate a skill names for itself still binds — per-session cross-repo-commit assent, ask-before-external-action, and any other this skill's own body names. Tripwire: `UNATTRIBUTED-HARNESS-LINE-IS-NOT-PM`.
**Host shapes.** Calls below are Shape W; on POSIX run `coordinator-invoke <op> '<json>'` (Shape B).
---
## The flow
**This runs at Sonnet.** Opus-tier judgment happens INSIDE the workflow. The driver is mechanism.
The args and result shapes are pinned by `${CLAUDE_PLUGIN_ROOT}/skills/goal-blitz/goal-blitz-contract.json`.
### 0. Preflight — confirm the engine is reachable
Resolve the launcher per `${CLAUDE_PLUGIN_ROOT}/snippets/resolve-coordinator-bin.md`. Unresolved —
**stop and report**; never fabricate a fire or a result. Scaffold the trail directory
`state/scratch/goal-blitz/<run-id>/`, `<run-id>` being this run's UTC start as `YYYYMMDDTHHMMSSZ`.
### 1. Emit the fire — never hand-write the args
python3 "${CLAUDE_PLUGIN_ROOT}/skills/goal-blitz/emit-goal-fire.py" \
--repo-root <abs> --trail-dir <abs trail> --provision-sidecar-cli <abs> \
--interaction-mode <mode> [--targets <seed-id> ...]
It collects the seeds, freezes `<trail>/candidates.json`, binds the args through the engine's
`workflow.bind_args` into `<trail>/goal-blitz.fire.mjs`, and prints one `Workflow({ scriptPath })`
line. `--interaction-mode` is the recorded mode, bound as-is; it does not change the ratifier. Pass
`--no-plugin-agents` where `coordinator:*` types do not resolve. An empty candidate set: report
and stop.
- **Never hand-type an args object.** Tripwire: `A-HAND-TYPED-WAVE-ARG-IS-AN-UNARCHIVED-FIRE`.
- **An emitted fire is a SNAPSHOT — RE-EMIT, never re-fire as found** after any workflow fix.
- **Resolve `${CLAUDE_PLUGIN_ROOT}`; never pass a repo-relative path** to a workflow.
### 2. Fire and wait
Fire the printed `Workflow({ scriptPath })` line. Then wait; do not read the trail mid-wave. Keep
the task output file the completion notification names — it is the lander's input as-is.
### 3. Ratify — once, at the end
The workflow ratifies nothing; it returns ready drafts in `awaitingRatification`. The ratifier is
**the VP-Product Reviewer** (`coordinator:vp-product`) for every `interactionMode`; the result's `approver` reports
`vp-product`. No PM or APM path ships.
Dispatch the VP-Product Reviewer **once**, Opus at effort `high`, over the whole `awaitingRatification` set. Give it the
paths of each ready draft (`<trail>/<seed-id>.goal-draft.yaml`) and its critique, and ask for per
draft the verdict ratified or declined with the VP-Product Reviewer's own words. Write each answer **verbatim** into
`<trail>/ratification.json`, shaped `{seed_id: {verdict, ratifier: "vp-product", utterance}}`. Never
infer, backfill or paraphrase a ratification. `pulled` and `rework` drafts are reported with their reasons
and are not asked about.
### 4. Land
python3 "${CLAUDE_PLUGIN_ROOT}/skills/goal-blitz/land-goals.py" \
--repo-root <abs> --trail-dir <abs trail> <workflow-result.json>
It lands only drafts carrying a recorded the VP-Product Reviewer ratification, through goal-setting's own CLIs, then
makes one scoped commit of the files it wrote (`--no-commit` lists them instead). It refuses and
writes nothing on a ready draft with no ratification record. A CLI failure mid-landing rolls back
every path the run wrote, so fix the cause and re-run. **Read its exit code and stderr; never route
around a refusal.**
### 5. Offer the chain
> _"{N} goal(s) landed with {M} roadmap-seed stub(s). Want me to chain into `/roadmap-planning`
> now, or review the stubs first?"_
**Wait for the PM.** Never auto-chain; roadmap-seed stubs stay `awaiting_gate`.
---
## Rules
**Review fires unconditionally; the VP-Product Reviewer ratifies once, at the end.** Tripwire: `A-BLITZ-WAVE-THAT-GATES-ON-THE-EM-IS-NOT-A-BLITZ`.
**Never write `state/goals/` by hand or before ratification** — `land-goals.py` is the only writer.
**A `rework` draft routes, it does not halt** — the other drafts proceed to ratification.
---
## Anti-scope
- Does not edit `goal-setting`, and does not ratify on the VP-Product Reviewer's behalf.
- Does not author roadmaps or invoke `/roadmap-planning`.
- Does not change effort pins in the workflow; the VP-Product Reviewer is pinned Opus/high inline.