Skip to content
Back to skills

One Shot

ASecurity

Fast ramp into the mightymodels work loop from whatever context exists: an active ticket, a pasted issue, or a task described in chat. One AskUserQuestion dialog covers the questions open-ticket would have asked and that the context has not already answered (slug, scope, branch, progress view), then two or three scouts confirm the claims at HEAD, the task list is written with a checkable acceptance criterion per task, its commands are approved into the verification contract, and agents-assemb...

  • 2 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 20, 2026
ai-agentsgobashgitapidatabase

Works with

  • api
  • mcp

Security analysis

A100/100

Scanned October 20, 2026

npx -y skills add rhawk117/rygentic-harness --skill one-shot --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of One Shot?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for One Shot
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/rhawk117-one-shot/badge)](https://www.skillsdirectory.com/skills/rhawk117-one-shot)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: one-shot
description: >-
  Fast ramp into the mightymodels work loop from whatever context exists: an active ticket, a
  pasted issue, or a task described in chat. One AskUserQuestion dialog covers the questions
  open-ticket would have asked and that the context has not already answered (slug, scope,
  branch, progress view), then two or three scouts confirm the claims at HEAD, the task
  list is written with a checkable acceptance criterion per task, its commands are
  approved into the verification contract, and agents-assemble takes over. Stages the ticket
  through the ticket tool when none exists. Assumes no compaction, so there is no
  plan.md. Not the ramp for work expected to survive a compaction (game-plan).
when_to_use: >-
  Auto-invoke at session start when the active ticket says scope sm and plan-first
  false; use explicitly on any scope for "/one-shot", "one-shot this", "yolo this", "just
  send it", "skip the plan and run the loop", "start on this without a ticket", with an
  AskUserQuestion confirmation on med or large scope.
argument-hint: "[ticket-slug, issue or task]"
allowed-tools:
  - AskUserQuestion
  - mcp__plugin_mightymodels_state__contract
  - mcp__plugin_mightymodels_state__ticket
---

# one-shot

The loop's value is the scout-and-engineer discipline: claims confirmed at HEAD, an ASKED
stanza written before the engineer starts, verification by a fact-checker that did not write
the code. The plan exists for a different reason: surviving a compaction. When the user does not
expect one, the plan is ceremony, and this ramp skips it. The ticket directory holds the
briefs; the state database holds the ticket, the verification contract and the task rows, and
the `task` tool's rows are the progress view.

That is an assumption, and one-shot states it once at the start of every run: *no compaction
expected; if one happens, stop and re-ramp through game-plan, because the task list alone
will not carry the intent.* Said once, then the work starts.

## Sequence

**Argument:** a ticket slug, an issue or the task in words, given when the skill was started:
"$ARGUMENTS". Empty quotes mean nothing was given, and step 1 takes the target from the session.

**0.** Invoke `prompting-subagents`.

**1. Take stock.** If `.mightymodels/<slug>/ticket.yml` exists, read it and the issue (or
`issue-body.md`); that is the target and most of the interview is already answered. Otherwise
the target is what the user gave: the chat so far, a pasted issue, a link. State the target in
one line and what done looks like in one more; if the second line cannot be written, the
interview's first question is what proves done.

**2. The short interview.** One `AskUserQuestion` dialog (up to four questions a call, two to four
options each, and the user can always type an answer of their own), containing only the
questions the context has not answered. The full set, in open-ticket's order, minus the one one-shot answers itself:

- Slug for this unit of work (the options are one derived from the target and a shorter variant).
- Progress view: a GitHub issue, or a local `issue-body.md`; task progress is the `task`
  tool's rows either way.

The scope of each anticipated task and the branch are not asked here: the `ticket` `write` call
in step 3 leaves them out and asks the user itself. Compaction is not asked. one-shot answers it:
`plan-first: false`. When the scope the user chose comes back med or large (read `scope` in
ticket.yml after the write), one more `AskUserQuestion` before the loop starts: proceed under the
no-compaction assumption, or route to game-plan. A med or large ticket that hits a compaction
mid-sprint loses more than a sm one, so the user confirms that trade knowingly.

Answers already in the conversation or the ticket are confirmed in the target summary, not
re-asked.

**3. Materialize the minimum.** Only when no ticket exists: the issue via `gh issue create` if
one was asked for (else `issue-body.md`), then stage the ticket through the `ticket` tool, as
open-ticket does. Call `mcp__plugin_mightymodels_state__ticket` with action `write`, the answers
under `fields`, and no `scope` or `branch`; the tool asks the user for both:

```json
{"request": {"action": "write", "slug": "SLUG",
 "fields": {"summary": "...", "compaction": false, "context": ["..."]}}}
```

An answer starting `needs input` means no one could be asked through the tool: put each question
it names to the user in one `AskUserQuestion` dialog, then call again with those arguments in
`fields`. Then read `branch-name` from ticket.yml: when it is not the current branch, create that
branch from HEAD.

Then call it again with action `validate`, which stages the ticket as a row in the state
database:

```json
{"request": {"action": "validate", "slug": "SLUG"}}
```

open-ticket's schema reference,
`${CLAUDE_PLUGIN_ROOT}/skills/open-ticket/references/ticket-schema.md`, describes the fields. No `plan.md`; nothing is written for a next session that is not
expected to exist. Tell the user ticket.yml exists and that their edits win (call `validate`
again after one), and keep going; the tweak pause is open-ticket's, and this user asked for speed.

**4. Confirm the claims.** Two or three scouts (models from ticket.yml), each verifying one
claim the target rests on still holds at HEAD: the file is at that path, the API has that
shape, the config key is where the description says. A claim that no longer holds is a delta
report to the user before anything starts, not something to adapt around silently. On a
freshly described task there may be no claims to confirm beyond "the thing exists"; one scout
is enough, and zero is not.

**5. Enumerate the tasks.** Write the task list into the issue body (`gh issue edit`) or
`issue-body.md`. Each item is one thing agents-assemble can run through the loop, sized per
the scope answer, and carries its acceptance inline so the ASKED stanza lifts it. The list has
no boxes; progress is the `task` tool's rows, which the loop starts and marks:

```markdown
- T1: <one-line intent> | AC: <runnable command with expected result, or a checkable assertion naming a file or behavior>
```

Without a plan, the task list is the only enumerable list of work the loop has, and an item with
no acceptance makes the verification step theater. "Works correctly" is refused here for the
same reason it is refused in the ASKED stanza. Give every command-shaped AC a contract id
(`T1.AC-1`) and an argv list, and show the task list with its commands. The loop's runner
executes only contract commands, so approve them with one call to
`mcp__plugin_mightymodels_state__contract` with action `approve` and no `approved_by`; the tool
asks the user and records the commands only when the user approves:

```json
{"request": {"action": "approve", "slug": "SLUG",
 "commands": [{"id": "T1.AC-1", "argv": ["..."], "expect_exit": 0, "timeout": 300}]}}
```

An answer starting `not approved` means the user wants the list changed: change it and call
again. An answer starting `needs input` means no one could be asked through the tool: put the
question it names to the user in one `AskUserQuestion` dialog, and on approval call again with
`"approved_by": "user"` on each command.

Then baseline each one with `mightymodels verify run`, a bare Bash command (the plugin's
`bin/` is on the Bash PATH):

```bash
mightymodels verify run --slug SLUG --phase planning --id T1.AC-1
```

Revise regenerates the list.

**6. Hand off.** Invoke agents-assemble. Nothing else is written; a staged ticket plus a
task list with approved acceptance commands is what the small path needs, and the whole point
of one-shot is that it is enough.

## Boundaries

one-shot stages the ticket (when absent) through the `ticket` tool, the branch and issue
if asked, the task list, and the verification contract. It never writes `plan.md` or
`handoffs/`. It dispatches scouts and nothing
else before agents-assemble takes over. When the context shows the work is bigger than the
user thinks (five med tasks on a "sm" answer), that is a sentence to the user and a routing
offer to game-plan, not a quiet upgrade.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.