Op planner
Converts user requests into planned work units in the project's task/spec system (BMAD epics/stories by default; spec-kit, beads, markdown, or issues when the project declares one — see docs/spec-systems.md), starting from a planning checkpoint. Use when planning features, creating epics, generating user stories, or turning a request into a backlog item. Default mode writes only PLANNER_CHECKPOINT.md; real unit files require --apply.From its SKILL.md
npx -y skills add rnrn/op --skill op-plannerAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 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.
SKILL.md
10.1 KB, as published. Nobody here has run it
Planner Skill
Convert a user request into a plan in the project's task/spec system (BMAD epics
and stories by default): pick the right container, check for duplicates, and
propose a unit with testable acceptance criteria. The plan lands in a checkpoint
file first; real unit files are materialized only on explicit apply. BMAD shown
throughout is the built-in default — the declared/detected system (Stack Profile
or docs/spec-systems.md) replaces it.
Safety Contract
Default mode writes only PLANNER_CHECKPOINT.md in the workspace. Do not
create, modify, or delete anything else unless the user explicitly passed
--apply in the same request. Write files only — never run git add,
git commit, or git reset; staging and commits belong to the user or the
baby-commit/dry-commit skills (an agent that auto-commits can corrupt a
detached worktree and strand later steps).
Checkpoint git policy: PLANNER_CHECKPOINT.md is a single-slot scratch draft overwritten by
each run — add it to the project's .gitignore and never commit it; the
durable output is the epic/story files written under --apply.
Usage
/op-planner <request> # Plan and write PLANNER_CHECKPOINT.md
/op-planner <request> --epic=NAME # Force an existing epic
/op-planner <request> --new-epic=NAME # Force creation of a new epic (on apply)
/op-planner <request> --apply # Checkpoint, then write real story/epic/sprint files
/op-planner add <epic-ref> <task> [--apply] # Append ONE unit to an existing epic (light path)
add — the single-unit append path. The most common action in a mature repo is adding one
task to an existing epic, and the full checkpoint cycle is heavy enough that operators bypass
the skill and hand-edit the epic — losing the duplicate check and status discipline (field
measurement: five hand-written tasks in three epics, zero skill invocations). For add, the
CONVERSATION is the checkpoint: run the op-story-finder duplicate check, pick the next free
number, place the status per the declared convention, and show the exact unit text; with
--apply in the same request, append exactly that one unit section to the existing epic file —
no PLANNER_CHECKPOINT.md for single-unit appends. Multi-unit or new-epic requests always take
the full checkpoint path.
Workflow
- Read the request — identify intent, scope (feature, bugfix, refactor, enhancement), referenced files, and priority. Priority one-liner: P0 = critical/blocking/security, P1 = important features and bugs, P2 = nice-to-have polish.
- Determine the task/spec system, then explore existing units — read the
Stack Profile
Task / spec systemor detect it (docs/spec-systems.md). If neither declares a system, default to BMAD (docs/*/epics/+docs/*/stories/). Explore existing units in THAT system (BMAD: Globdocs/*/epics/*.mdanddocs/*/stories/*.md; spec-kit:specs/*/tasks.md; beads:bd list; markdown: the backlog files). If present, also readdocs/HANDBOOK.md,docs/task-intake.md,docs/subsystem-doc-contracts.md, anddocs/docs-taxonomy.mdand respect their contracts (User Spec for operator-facing work; contract/runtime rung/owner/source-of-truth/proof path for structural work). - Check for duplicates AND target-existence — search existing stories for the
same capability (use
op-story-finderwhen available); never create a parallel docs track when an existing track or owner already covers the work. Before proposing a unit that references specific files/functions/subsystems, verify they still EXIST (glob/find/grep) — a request framed against code a later story deleted or dropped is obsolete: STOP, do not plan it, and emitDONE_WITH_CONCERNSnaming the story that removed the target. (Requests carry stale framing — trust the repo, not the request's "status" claims.) Status placement & parsing: write each new unit's status where the declared convention keeps it (flat-epic/tasks layouts: in the unit HEADING); read existing statuses only via the canonical helpernode ~/.claude/scripts/lib/unit-status.mjs— never a hand-rolled regex. If its--checkshows the corpus violating its own declaration, surface that in the checkpoint instead of adapting silently. - Pick track, epic, and number — prefer an existing track, then derive
from referenced file paths, then from project structure, then a semantic
name. Select the best-fit epic or justify a new one; next story number is
max existing + 1 within the epic. Detailed rules and an examples table:
read
references/conventions.md. - Apply scope rule — one story = one layer/subsystem of the project's
actual architecture (backend/frontend/infrastructure for web; core/UI/
platform for desktop apps; stage/harness/infra for pipelines); split
multi-layer features into separate stories. Stack-deviation flag: if a
story's implementation language differs from the declared Stack Profile
language(s) — a spec's reference code is illustrative, not a mandate (GP1) —
flag it in the checkpoint, record the deviation as a
status: pendingdecision for human acceptance (route toop-decision-memoryon--apply; never self-accept the language), and scope the story to an isolated dir (separate from the main module).scripts/lib/stack-check.mjsover the story's planned files detects it (config/docs/shell are stack-neutral). Undeclared stack: if the Stack ProfileLanguage(s)is missing orTODO, the spec is being sliced with the deviation guard off — detect the project's real language (go.mod/package.json/Cargo.toml/…), state it in the checkpoint, and plan every story in that language by default; a polyglot spec (e.g. Python reference code in a Go repo) must not silently set the implementation language. - Write
PLANNER_CHECKPOINT.md— required sections listed under Output; keep it under 140 lines. Before overwriting an existing checkpoint, check its## 1. Request Summary: if it plans a DIFFERENT request, note in the new checkpoint that you clobbered an unrelated stale plan (single-slot file) rather than silently discarding it. - Apply gate — only if the user explicitly passed
--applyin the same request.--applymust NOT materialize a unit the checkpoint marked obsolete or duplicate — withhold and report (the write gate serves the plan, it doesn't override a stop). When the best-fit epic isStatus: Done/closed, appending new work to it needs an explicit justification line (or a new epic). Otherwise: materialize the real unit in the detected system's format (BMAD: write the story file + update the epic story table; spec-kit: append atasks.mdrow +spec.md/plan.mdstub; beads:bd create; markdown: a task entry — seedocs/spec-systems.md), and — only when the project already tracks a sprint/board file — update it, using the templates inreferences/templates.md. When materializing or updating an epic file and the project provides an epic-closure-checklist template (docs/*/epics/epic-closure-checklist.mdor a path declared indocs/HANDBOOK.md), include its## Closure Checklistsection in the epic so the closure gate cannot be skipped silently; the checkpoint records whether such a template was found. Otherwise state in the checkpoint that no real files were written.
Read references/templates.md when applying (story, epic, and sprint YAML
templates). Read references/conventions.md for track detection, acceptance
criteria guidelines, MVP-vs-Production scoping, and the story status flow.
Output
PLANNER_CHECKPOINT.md must contain exactly these sections:
# Planner Checkpoint
## 1. Request Summary
## 2. Existing Docs Evidence
## 3. Duplicate And Scope Check
## 4. Proposed Track And Epic
## 5. Proposed Story
## 6. Acceptance Criteria
## 7. Tasks And Test Plan
## 8. Apply Gate
Checkpoint quality bar: target track named; docs evidence listed with paths; duplicate risk stated; epic selected or new epic justified; story has title, priority, status, and user story; at least 3 testable acceptance criteria; tasks map to acceptance criteria; apply gate says whether real files were written.
Example — request: "Add rate limiting to API endpoints in server/routes/"
ls docs/findsdocs/server/,docs/frontend/— file referenceserver/routes/selects trackserver.- Best-fit epic:
docs/server/epics/epic-2-security.md; existing stories 2.1 and 2.2, so the new story is 2.3. No duplicate story found. - Write
PLANNER_CHECKPOINT.mdproposingdocs/server/stories/story-2.3.md("Add Rate Limiting", P1, backend-only) with ACs such as "Returns 429 status when rate limit exceeded", and an apply gate reading "no real files written (no --apply)". - With
--apply: create story-2.3.md, add its row to epic-2-security.md, update the project's sprint/board file if it uses one, and report what was created.
Completion Status
Protocol (non-negotiable): the VERY LAST line of every run MUST start with exactly one of these tokens, as plain text — no markdown emphasis or backticks around the token. An optional — <one-line reason> may follow the token; nothing else. Do not invent other status wording:
DONE— checkpoint written (and real files written when--applywas passed).DONE_WITH_CONCERNS— checkpoint written but with unresolved duplicate or scope risks.BLOCKED— an external blocker prevents planning (e.g., workspace not writable).NEEDS_CONTEXT— the request is too vague to name a track, story, or acceptance criteria.