Help us improve
Share bugs, ideas, or general feedback.
From goalkeeper
Supervises multi-goal missions by reading the mission charter and prior goal artifacts, then deciding whether to proceed with the next goal, declare the mission done, or escalate to the user.
npx claudepluginhub itsuzef/goalkeeper --plugin goalkeeperHow this skill is triggered — by the user, by Claude, or both
Slash command
/goalkeeper:goal-supervisorThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are operating the **goal-supervisor** skill — the mission-level layer sitting one above individual goals. Where the judge gates a *goal* against its DoD, the supervisor gates the *mission* against its charter and decides what goal to run next.
Executes durable, contract-driven goals with checkpoint validation and judge-gated completion. Useful for multi-turn autonomous tasks that need structured progress tracking.
Implements mission specs via autonomous coding, milestone commits, evaluator reports in Markdown, and verification asset captures. For TandemKit structured development.
Plans milestones step-by-step with review gates: grill-design session, then goal contract todo task specs with user approval at each phase.
Share bugs, ideas, or general feedback.
You are operating the goal-supervisor skill — the mission-level layer sitting one above individual goals. Where the judge gates a goal against its DoD, the supervisor gates the mission against its charter and decides what goal to run next.
Mission ← .claude/mission.md (user-authored charter)
├─ Goal A (done, in _archive) ← goalkeeper contract — within-goal loop works
├─ Goal B (done, in _archive) ← drafted in response to A's output
└─ Goal … (drafted on demand by supervisor) ← what /goal-supervisor produces
The supervisor is NOT a chain. Chains commit to a linear sequence at chain-start. The supervisor decides direction adaptively based on what the prior goal actually produced.
done or cleared, active.json terminal-shape).active — supervisor refuses if a goal is still running..claude/mission.md — the user-authored mission charter. Required — supervisor refuses without it..claude/active.json — must be terminal-shape (no active goal)..claude/mission.json — supervisor state. May not exist on first invocation; supervisor initializes it..claude/mission-log.md — append-only mission-level audit trail. May not exist on first invocation..claude/goals/_archive/<slug-with-timestamp>/log.md (preferred, if cleared).claude/goals/<slug>/log.md (if done but not yet archived)state.json for verdict + rejection_count contextmission.md) — expected shapeThe supervisor expects users to author mission.md with these sections. None are syntactically required (no JSON Schema), but all are strongly recommended:
# Mission: <name>
## Objective
<one-paragraph statement of the mission's high-level intent>
## Success condition
<concrete, observable condition for "mission done." Like a goal's definition_of_done
but at the mission level. Specific. Measurable.>
## Constraints
<bulleted list of hard rules. The supervisor will refuse to propose goals
that violate these.>
## Legal next-goal shapes
<bulleted catalog of the kinds of goals this mission may need. The supervisor
draws from this list when proposing next-objectives. Each entry: name +
1-sentence description.>
## Done is not
<bulleted list of things that look like progress but don't satisfy the
success condition — equivalent to a contract's non_goals at the mission level.>
.claude/mission.md. If missing, halt with: "Supervisor requires .claude/mission.md. See goal-supervisor skill docs for the expected shape." Do not proceed..claude/active.json. If slug != null AND the corresponding state.json.status == "active", halt with: "Supervisor refuses while a goal is active. Pause or complete the current goal first.".claude/mission.json if it exists; otherwise initialize:
{
"name": "<from mission.md heading>",
"status": "active",
"started_at": "<ISO8601 now>",
"goals_completed": [],
"supervisor_verdicts": []
}
The most-recently-ended goal is the supervisor's primary input. In order of preference:
active.json.previous_slug is non-null: that's the slug..claude/goals/_archive/ for the most-recently-archived directory..claude/goals/ for a directory whose state.json.status == "done" and isn't yet archived.If no prior goal exists (first supervisor invocation on a new mission), the supervisor treats this as "the mission just started, no prior context — propose the first goal from mission.md's Legal next-goal shapes section."
Use the Agent tool with subagent_type: general-purpose. Fresh context — supervisor must NOT inherit the executing agent's reasoning.
Pass a self-contained prompt with:
mission.md — verbatim.log.md — verbatim. (May be long. If > 50KB, include the last 200 lines + activation entry + every "judge approved" and "judge rejected" block.)state.json — verbatim. (Tells the supervisor whether the goal was approved, how many rejections, etc.)mission.json.goals_completed — list of prior slug + brief result summary.git rev-parse HEAD at this moment, git status --porcelain (first 20 lines).You are the mission supervisor. The user's mission is described above.
One goal has just completed. Your job: decide what happens next.
You have three legal outputs:
PROCEED — the mission is still active and the next goal can be named.
Output a one-sentence objective for the next goal. Reference what the
prior goal produced and how it shapes this one. The objective will be
fed to /goalkeeper:goal-prep, which drafts a full contract from it.
DONE — the mission's success condition is satisfied. Cite the specific
evidence in the prior goal(s) that demonstrates each part of the
success condition.
ESCALATE — you cannot decide. Either the prior goal's output is
ambiguous, the mission charter is internally inconsistent, the
success condition isn't observable from the artifacts, or you've
hit a constraint that requires human judgment. Explain in 3-5
sentences exactly what decision needs human input.
Output ONCE. Pre-think before writing. Do not self-correct mid-response.
Respond in this exact format:
VERDICT: proceed
or
VERDICT: done
or
VERDICT: escalate
REASONING:
<3-8 sentences explaining what the prior goal produced, what it tells
you about mission progress, and why this verdict>
NEXT_OBJECTIVE: (only if proceed — single sentence, will be passed to /goal-prep)
DONE_EVIDENCE: (only if done — bulleted list of mission success-condition
items, each with the specific prior-goal artifact that satisfies it)
ESCALATION: (only if escalate — exactly what human input is needed and why)
Read the subagent's structured response. Then:
.claude/mission-log.md:
## <ISO8601> — supervisor verdict: proceed
Prior goal: <prior-slug>
Reasoning: <from REASONING block>
Proposed next objective: <from NEXT_OBJECTIVE>
mission.json.supervisor_verdicts:
{"at": "<ISO8601>", "prior_slug": "<prior-slug>", "verdict": "proceed", "next_objective": "<...>"}
mission.json.goals_completed:
{"slug": "<prior-slug>", "result": "<approved|cleared|...>", "rejection_count": <n>}
/goalkeeper:goal-prep with the proposed next-objective as the rough idea. The user reviews and approves/edits the drafted contract per the standard prep flow. Do NOT auto-activate — the user-review checkpoint at prep is the human-in-the-loop safety property and stays mandatory in v0.2.<objective>. Review the contract before activating.".claude/mission-log.md:
## <ISO8601> — supervisor verdict: done
Mission: <mission name>
Reasoning: <from REASONING block>
Evidence: <from DONE_EVIDENCE block>
mission.json:
{
"status": "done",
"completed_at": "<ISO8601>",
"goals_completed": [...append final...]
}
.claude/mission-completed.md — a final snapshot with the verdict text, every prior goal's slug + result, total elapsed time, and a copy of the original mission.md for posterity.<name> complete. goals approved. See .claude/mission-completed.md for the final snapshot.".claude/mission-log.md:
## <ISO8601> — supervisor verdict: escalate
Prior goal: <prior-slug>
Reasoning: <from REASONING block>
Required input: <from ESCALATION block>
mission.json.status = "escalated"./goalkeeper:goal-supervisor again (it will re-read the latest artifacts), or /goalkeeper:goal-prep a specific next goal yourself."Append a brief line to the prior goal's log.md (since the goal's log is its archived audit trail and the supervisor verdict is relevant context for anyone reading later):
## <ISO8601> — supervisor verdict
Mission `<mission-name>` supervisor verdict on this goal: <proceed|done|escalate>.
See `.claude/mission-log.md` for full reasoning.
This makes the supervisor's verdict discoverable from inside the goal's own log without forcing readers to cross-reference the mission log.
.claude/mission.json{
"name": "<from mission.md heading>",
"status": "active" | "done" | "escalated",
"started_at": "<ISO8601>",
"completed_at": "<ISO8601 or absent>",
"goals_completed": [
{"slug": "<slug>", "result": "approved" | "cleared", "rejection_count": <n>, "ended_at": "<ISO8601>"}
],
"supervisor_verdicts": [
{"at": "<ISO8601>", "prior_slug": "<slug>", "verdict": "proceed" | "done" | "escalate", "next_objective": "<if proceed>", "escalation": "<if escalate>"}
]
}
.claude/mission-log.mdAppend-only, parallel structure to per-goal log.md. One entry per supervisor invocation. Sections delimited by ## <ISO8601> — supervisor verdict: <kind>.
.claude/mission-completed.mdFinal snapshot written on DONE. Contains:
mission.md (in case the user later edits the live one)mission.json at completionlog.md paths in _archive/mission.md → supervisor halts. The skill does not auto-draft missions; that's user intent.mission.json, mission-log.md) plus one informational append to the prior goal's log.md./goal-supervisor twice in a row without a new goal completing between, the second invocation is a no-op (return last verdict + tell user)./goalkeeper:goal-clear the drafted-but-unactivated goal and re-run /goal-supervisor — both verdicts stay in the log./goalkeeper:goal-chain instead — chains are the right primitive when the sequence is known.Success condition section, the supervisor isn't the right tool yet.The supervisor subagent should ESCALATE rather than PROCEED in these cases:
rejection_count == max_rejections) and ended in needs_human — user already needs to address this manually before the mission continues.Constraints as off-limits — mission charter integrity violated; user must decide whether to amend the charter or roll back.