Plan
| This documentation was generated with the assistance of AI. Please report any inaccuracies. |
Produce a concrete, step-by-step implementation plan for a task — grounded in the real state of the
codebase — and write it to implementation_plan.md at the repository root. This skill does not modify
source code; its only output artifact is the plan file itself.
Purpose
iru-plan turns a tracked ticket (a GitHub issue or a Jira ticket, auto-detected like iru-explore) or a
free-form task description into a reviewable, checkbox-driven list of implementation steps before any code
changes begin. If implementation_plan.md already exists at the repository root, it determines whether that
plan matches the requested task and asks the user whether to resume it as-is, discard and regenerate it, or
update it while preserving already-completed work. It grounds itself in the actual codebase (via iru-explore),
resolves only genuinely ambiguous decisions with the user (including acceptance criteria too vague to verify), groups tasks into dependency-aware task groups (each
marked whether its tasks can be implemented in parallel), and determines which <key>-code-one-task skill (e.g.
iru-java-code-one-task, iru-dotnet-code-one-task, iru-typescript-code-one-task, iru-android-code-one-task,
iru-swift-code-one-task, iru-java-springboot-code-one-task, iru-kotlin-springboot-code-one-task,
iru-quarkus-code-one-task, iru-php-code-one-task, iru-nestjs-code-one-task, iru-nextjs-code-one-task, iru-fastapi-code-one-task, iru-django-code-one-task, iru-kmp-code-one-task, iru-react-native-code-one-task, iru-windows-code-one-task, iru-rust-code-one-task, iru-go-code-one-task) each
task belongs to — tagged on every top-level task — so the iru-code skill that later executes it, via
iru-code-one-task-group, knows exactly which language-specific group skill to dispatch each task group to
without re-inferring it. When a tracked ticket is involved, the plan’s Task summary records an explicit Source:
line (e.g. Source: GitHub issue 42 or Source: Jira PROJ-123) so iru-code’s own archiving step can name the
archived plan after the exact ticket it resolved, rather than falling back to a timestamp. When the base branch
the work forks from is known — typically because `Issue already resolved and confirmed it
with the user before invoking this skill — the Task summary records that too, as a Base branch: line, so that a
later /iru-pr-description run in a separate session can recover the choice and target the pull request at the
same base rather than the repository default. Every plan also carries an # Acceptance criteria coverage table
mapping each ticket criterion (or 2-6 derived: statements for a free-form task) to the tasks that cover it, and any
question that cannot be put to the user (unattended run, declined question, "decide later") is persisted as a
plain-text [NEEDS CLARIFICATION: …] marker, never guessed silently; iru-code refuses to start implementing
while a marker remains. For user-interface work (screens, pages, windows, components or controls on any stack) it decomposes the design
top-down into screens, regions and components, plans one task per component or screen with its own UI tests, groups
them bottom-up (leaves, composites, screens, flows) and ends with a documentation task for /iru-update-docs; see
Building user interfaces. Everything is written to
implementation_plan.md — the artifact iru-code later executes group by group.
Plugin
Shipped by the iru-core plugin of the ai-catalog marketplace (install with /plugin install iru-core@ai-catalog; see Plugins).
Inputs
| Argument | Required | Description | Default |
|---|---|---|---|
|
No |
A GitHub issue number or a Jira key (e.g. |
None — if neither a ticket id nor a free-form description is provided, the skill asks the user which one they want to plan around. |
Free-form task description |
No |
A manually described piece of work (given in the invocation or immediately preceding messages) to plan instead of a ticket. |
None — mutually exclusive with |
Outputs
-
implementation_plan.mdat the repository root — overwritten if the user chose to discard an existing plan, merged into (preserving completed tasks) if the user chose to update one, or left completely untouched if the user chose to skip planning and resume execution of the existing file as-is. -
The plan is structured as: a task summary (including a
Source:line naming the originating GitHub issue or Jira ticket, if any, aBase branch:line when known, a plan-wide Language/framework line if every task shares one key, and a mandatory closingOpen clarifications:entry listing each unresolved marker ornone), an# Acceptance criteria coveragetable (/Criterion/Covered by tasks; every row names at least one task, and an uncovered criterion is fixed by adding a task or a marker on the closest task), a summary of the current relevant code state (concrete file paths and class/method names), and implementation steps organized into task groups — each group naming itsParallelizableverdict and containing its tasks/sub-tasks, every one carrying its own empty markdown checkbox ([ ]) foriru-codeto check off later, numbered continuously across the whole plan (Task N/Task N.M) and tagged with its own language/framework key. -
[NEEDS CLARIFICATION: <question> — options: <a> | <b>; recommended: <a>]markers for unanswerable ambiguities, written as plain text (never in backticks or a code fence, becausegrepand the plan audit ignore those), placed right after the blocked task’s title and repeated underOpen clarifications:. Planning continues around the recommended option; a marker is resolved in place once the user answers, and an update run carries the coverage table and markers forward (re-deriving only rows for new or unchecked tasks). -
The distinct set of
<key>-code-one-taskkeys involved.iru-explore’s `Project type:is mapped to the most specific installed key:java-springbootandkotlin-springboot(Hilla frontends staytypescript),quarkusfor both Java and Kotlin Quarkus,phpfor every PHP flavor (Laravel, WordPress, PrestaShop, library), andnestjs/nextjs— never plaintypescriptfor NestJS or Next.js code —react-nativefor everyreact-native-app(Expo or Metro; nevertypescript/android/swift),kmpfor everykmp-app(including the Swift code in itsiosApp/host; neverandroid),windowsfor everywindows-app (wpf|winui|winforms)(the UI-freesrc/<App>.Corecode, the app project’s XAML/forms, MSIX manifests and their tests — neverdotnet; the plan’s "Current code state" states the UI stack and MVVM/MVC architecture),swiftfor amacos-app (swiftui|appkit)(the Swift coding skill detects the UI framework and architecture itself, also stated in "Current code state"),rust/gofor Rust and Go projects and forcli-tool (rust)/cli-tool (go)(every task in the crate or module, including the command tree, terminal UI and doc generators),swift/dotnetforcli-tool (swift)/cli-tool (dotnet)(their coding skills detect the command-line shape themselves; the plan’s "Current code state" names the argument parser, any terminal-UI library and which commands are read-only vs. destructive, and CLI tasks are phrased as observable contracts: stdout/stderr,--jsonschema, exit codes), andfastapi/djangoforpython-fastapi/python-django(apython-libraryhas no coding key in this catalog and is recorded as plainpython). Keys are resolved against which such skills are actually installed, read first from the skills available in the session (iru--code-one-task, which also works for plugin installs) and corroborated withfind .claude/skills -maxdepth 1 -type d -name "-code-one-task"when that directory exists — a task whose language/framework has no matching skill installed is still recorded accurately, just without a dispatchable tag. -
For UI work: a
Screen › Region › Component (in: …; out: …)tree in "Current code state" with each node marked new/changed/reused; one task per component or screen (inputs, events, visual states, plus its tests across left-to-right/right-to-left × light/dark,.ui-screenshots/captures and the accessibility check at the.ui-quality.ymllevel, per the coding skill’sreference/ui-contract.md; withaccessibility: nonethe accessibility tasks, attributes and checks are omitted entirely); collections planned as a virtualizing collection component plus one item component; groups ordered leaves first; and a final untagged documentation task that runs/iru-update-docs. -
Any decisions made on the user’s behalf (per the ambiguity-resolution step) are stated in the plan itself, with a one-line rationale, rather than asked upfront.
-
No source code, configuration, or documentation outside
implementation_plan.mdis ever modified. -
A short summary in the conversation once the plan is written — including how many task groups were formed and which, if any, are non-parallelizable and why, any criterion left uncovered (there should be none) and every open
[NEEDS CLARIFICATION: …]marker with its recommended option — asking the user to review and resolve them before implementation starts.
Execution flow
Dependencies
Invokes
-
Explore — grounds the plan in the real codebase (scoped to the issue id, if any), unless equivalent exploration already happened earlier in the conversation.
Invoked by
-
Issue — Step 5.2, to produce implementation_plan.md.
Gated by
-
Code — refuses to start implementing while any
[NEEDS CLARIFICATIONmarker remains in the plan, so the user must resolve them first.
Related agents
iru-plan itself does not spawn any Agent — it calls the iru-explore skill directly and otherwise only reads the
codebase and writes the plan file. However, the implementation_plan.md it writes explicitly instructs
whoever executes that plan (normally the iru-code skill, via iru-code-one-task-group and the language-specific
<key>-code-one-task-group skill it dispatches to) to delegate each task’s test run to the
iru-gate-runner agent, if installed, rather than running tests inline, so test
output doesn’t consume the executing agent’s main context window. This is an instruction iru-plan embeds in its
output file for a later execution step to follow — not an Agent() call iru-plan makes itself.
Source
SKILL.md on GitHub — the file this page was generated from.