From Ultragoal
Transforms messy brain dumps into actionable goals with a checkable rubric, then autonomously executes until verification and lessons are saved.
How this skill is triggered — by the user, by Claude, or both
Slash command
/ultragoal:goalThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Turn the user's brief into an armed, self-correcting goal loop, then start working toward it.
experiment-guide.mdgoal-template.mdrubric-guide.mdrubrics/INDEX.mdrubrics/accessibility.mdrubrics/api-endpoint.mdrubrics/app-store-readiness.mdrubrics/bug-fix.mdrubrics/build-ci-speedup.mdrubrics/cli-tool.mdrubrics/dependency-upgrade.mdrubrics/documentation.mdrubrics/frontend-design.mdrubrics/nextjs-react-feature.mdrubrics/realtime-stability.mdrubrics/refactor-migration.mdrubrics/rn-feature.mdrubrics/security-pass.mdrubrics/test-suite-health.mdrubrics/web-performance.mdTurn the user's brief into an armed, self-correcting goal loop, then start working toward it.
The input may be an unedited speech transcript: expect filler words, self-corrections, topic jumps, and missing structure. Extract intent; never quote the mess back at the user.
User's brief:
$ARGUMENTSIf .ultragoal/ does not exist in the project root, run the ultragoal:setup skill first (it scaffolds directories, asks the preference knobs, and offers the CLAUDE.md block), then continue here.
Before asking the user anything:
.ultragoal/memory/MEMORY.md and any topic files relevant to the brief. Trust [VERIFIED] facts; treat [UNVERIFIED] ones as hypotheses..ultragoal/goals/archive/ for related past goals (especially their Decision journals and failure notes).Goals are per-session: each lives in .ultragoal/goals/active/<slug>/goal.md with a session: field, and the gate enforces only the goal armed by the current session. So a goal active in another session does not block you — arm a new one freely; concurrent goals across sessions are the intended model. Only if this same session already has an active goal do you ask the user to pick: keep the current one (drop this brief), or replace it (pause/abandon per the ultragoal:stop protocol, then arm this).
One caution: sessions share the working tree. If another session's active goal touches files this goal will also touch — and any kind: experiment goal touches everything, since it commits and resets constantly — warn the user before arming and suggest running one of the goals in its own checkout instead (claude --worktree, or npx ultragoal run --worktree). The gate keeps the loops from interfering; only a worktree keeps the files from interfering.
Ask high-leverage questions only — the forks where different answers produce materially different work. A question earns its place when all three hold: (1) the answer changes what you build, not just cosmetics; (2) you genuinely can't pick it confidently from the brief, repo, and memory; (3) guessing wrong is expensive (rework, wasted budget, wrong direction). If a question fails any of these, don't ask it — answer it yourself from the codebase, or take the obvious default and note it.
The leverage usually lives in these forks (pick the 2–5 that actually matter for this brief):
Size the interview to what a wrong guess costs. Check interview-depth in .ultragoal/config.md (the user can override per-goal by saying "quick" or "deep/thorough interview"):
Whatever the depth, the same rules keep even a 25-question interview painless: every question concrete and decision-shaped — real options (not "what do you think?"), your recommended default first with a one-line why, so ratifying is one tap and overriding is deliberate. At most 4 questions per AskUserQuestion batch; multiSelect where choices aren't exclusive. When going deep, open with one line that sets expectations ("Big goal — about 5 short rounds, every question has a recommended default; accepting all defaults is a fine answer."). Skip any round the brief already settles; stop when a round stops changing the plan.
Never ask what the codebase can answer — go look. If running non-interactively (no user), don't ask: make the most defensible call on each fork and record every such decision explicitly in the spec's Context as an assumption.
First decide the goal's kind:
task (default): success is "this exists and works" — features, fixes, migrations, investigations.experiment: success is "this number improved" — latency, build time, size, cost, score — and one command can measure it. Read experiment-guide.md and compile the spec as a measure-and-ratchet loop instead of a checklist. If the user's brief is an optimize-ask but no reliable measure command exists, the spec's first rubric item is building one.Check the rubric library first: read rubrics/INDEX.md and if the brief matches a domain, load that template as your starting point — it carries research-backed thresholds and check commands. Adapt it to this repo (real commands, applicable items only); don't transplant blindly. Also scan the available skills in this session against the template's "Skills to pair" line and the task domain — if a matching skill exists (e.g. frontend-design for UI work, vercel-react-best-practices for React), plan to use it during execution and note it in the spec's Context.
Copy the structure from goal-template.md and write the rubric following rubric-guide.md — read it; rubric quality decides whether this loop converges. A well-designed rubric is doing more work than the model.
Before showing the user, adversarially review your own rubric against the anti-pattern list in the guide (vague judgments, unmeasurable criteria, missing stop conditions, no incremental order, checks the repo can't actually run) — plus the defect taxonomy that judge research keeps finding: compound items bundling two claims (split them), redundant items double-counting one property (merge them), coverage gaps against the brief's own stated criteria (every acceptance criterion the user voiced must map to an item), missing must-NOT items for things that shouldn't happen, and checks whose output is noisy or ambiguous (wrap them to emit one decisive line). Fix what you find.
Match the machinery to the goal — default to less. The arsenal — parallel scouts, subagent delegation, instrumentation, worktrees, deep interviews, rubric variants — is sized by stakes × ambiguity × length, and every piece must earn its place. The default for a contained brief is the lean loop: no scouts (search the repo directly), a compact spec (objective in a sentence or two, 2–4 rubric items plus the VERIFIER line, small budget), one verifier pass at the final sign-off, one-line distillation. Escalate selectively: parallel subagents only for decomposable read-heavy work (research, audits — 2–4 focused scouts beat five scattered ones; they pay nothing on sequential build work); for truly exceptional stakes — destructive operations, release-grade sign-offs — you can dispatch extra verifier passes with different lenses (mechanical re-run, refutation, constraints), though the gate only ever needs the one final PASS. Name whatever kit you chose, and what you deliberately skipped, in the spec's Context — a quietly smaller plan and silent gold-plating are both failures; the user's lever is informed consent.
Let the user own the dials. After drafting, pull out the 2–4 thresholds that define the contract — the latency bar, the coverage floor, how strict the constraints are, the turn budget — and put them to the user as one AskUserQuestion batch, recommended value first with the research behind it. Recommend a budget sized to the rubric, not the config default by reflex: a contained fix ~10–15 turns, standard work ~25, a long or overnight build 40+ — the model sustains far longer coherent runs than old defaults assume, and an undersized budget pauses good work mid-flight. A number the user chose is a number they'll trust at verification time; a number buried in a recap is one they'll dispute after 20 turns. Skip this for thresholds the interview already settled.
For goals that earned a deep interview, draft the rubric at two or three contract levels — lean (core checks only, ship fast), standard (recommended), strict (production-grade: the domain template's full security/a11y/perf items) — and present them as previews in a single question so the user picks the bar. Drafting the variants costs minutes; it turns the user from spec-reader into contract-author, and the unchosen items go in the spec's Context as a noted non-goal.
First, write the finished spec as a draft: create .ultragoal/goals/active/<slug>/ and write the spec to goal.md inside it with status: draft in the frontmatter (if that directory already exists for a different session, add a short suffix to the slug). A draft is inert — the gate ignores it. This ordering is enforced, not advisory: a guard hook blocks the arm question if no draft exists, because the recap must be read back from a real artifact, not improvised.
Then give the user a tight, skimmable recap built from that draft, so they can course-correct while it's still cheap. Five short parts, in plain language:
Then ask to arm with a standalone AskUserQuestion — exactly one question, header exactly Arm goal, options "Yes, arm it" / "Edits first" — in the same message as the recap, recap first. Never bundle the arm question into an interview batch (the guard hook blocks that too), and never ask it before the draft exists. This holds for every goal, including follow-up rounds in a session that has already run goals — earlier rounds never waive the recap, because each round's decisions and rubric are new. Keep the recap scannable — it's a confirmation, not the full spec dump; the draft file holds the detail.
On yes:
status: draft to status: active. The frontmatter already carries session: ${CLAUDE_SESSION_ID} (the gate enforces only this session's goal) and verify: from the verification knob in .ultragoal/config.md (default on; off means the gate accepts a fully checked rubric without the verifier pass).0 to .ultragoal/goals/active/<slug>/.turns. (Experiment goals keep their results.tsv in this same directory, beside goal.md.)/ultragoal:stop, or the turn budget).On "Edits first": revise the draft and re-recap. If the goal is dropped entirely, delete the draft directory — never leave orphan drafts.
Then begin working immediately. Do not end the turn with a plan.
- evidence: \command` -> key output line. Never write a ULTRAGOAL-VERIFIEDline yourself — that verdict is the verifier's alone. The default verification cadence is **one pass at the final sign-off**: dispatch theultragoal:verifiersubagent before finishing, **passing it the exact path to this goal'sgoal.md** so it hashes and signs the right file; it audits the evidence ledger (a checked box without evidence is an automatic FAIL), re-runs every check itself, and appends the verdict. Dispatch it earlier only for an item that already failed verification, a check that looks shaky, or when .ultragoal/config.mdsetsverification-cadence: every-claim— and then pipeline it: dispatch in the background and keep building while it checks. Scoped early checks recordULTRAGOAL-INTERIM:lines, which the gate ignores; only a full-rubric pass earnsULTRAGOAL-VERIFIED`.<goal dir>/logs/<name>.log; tail or grep the log for the decisive lines when you need them. If the goal is genuinely blocked on a long background run (a suite, a deploy), don't burn budget on idle polling turns: set status: paused with a note, arm a completion watch, and flip back to active when it fires — pausing on a real blocker is honest, not quitting.! prefix so the output arrives in the session. One precise ask beats three vague ones.status: paused in the goal file, report honestly where every rubric item stands, and stop.npx claudepluginhub morphaxl/ultragoal --plugin ultragoalGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.