Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Plan and execute a project through Agent Kanban boards, tasks, dependencies, and workers, delegating review to an active board maintainer when present and retaining leader review otherwise. Use only when the user explicitly asks for AK Plan, Agent Kanban planning, an AK project plan, or project execution through an AK board. Do not use for ordinary project planning, product development, version planning, or project scaffolding.
.claude/skills/saltbo-ak-plan/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 1967% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 246% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 991% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 447% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 792% | 0% |
Plan and create a board with tasks — for a new version release or a new product from scratch.
Assume this workflow runs in two explicit modes:
If execution hits a blocker after confirmation, use the available tools and repository context to resolve it. If the blocker cannot be resolved without external authorization or production mutation, fail fast with the exact blocker and the next required action instead of waiting in the middle of the workflow.
This is a leader workflow.
If ak says no leader identity exists for the current runtime, create one first:
bashak auth login --leader-agent --username <username> [--name <name>]
The leader chooses its own username and optional full name.
Parse the user's input:
v1.4.0, normalize task labels to v1.4.Immediately after this skill is invoked, create and maintain an explicit task plan/checklist in the agent UI. This checklist is a guardrail against attention drift during long human-in-the-loop planning discussions.
The checklist must include the full lifecycle, not just planning:
Keep this checklist current:
that item completed as not applicable instead of leaving it pending.
mark monitoring/completion as in progress before doing any final user-facing summary.
pending, unless the user explicitly says to stop, cancel, abort, or only create tasks.
deciding the next action.
Check if this is an existing project or a new product:
bashgit remote -v 2>/dev/null # has a remote? → existing project ak get repo # registered repos
Three possible states:
https://… or git@…). Tell the user one of:gh repo create <owner>/<name> --source . --pushNever invent a URL (no file://, no local paths, no placeholders). The agent-kanban server will reject non-http(s)/ssh URLs with 400, and even if it didn't, the daemon cannot clone local paths.
bash# Create and clone repo (NEVER inside an existing git repo) gh repo create <owner>/<name> --public --description "<one-liner>" --clone cd <repo-dir> # Initialize project — use framework CLIs, install ALL dependencies upfront # Ask user for tech stack if not specified # Create config files, entry point, DB schema, .gitignore # Commit and push git add -A && git commit -m "feat: project scaffold" && git push -u origin main
Register with agent-kanban (URL MUST come from git remote get-url origin — never hand-crafted):
bashak create repo --name <name> --url "$(git remote get-url origin)"
The scaffold must contain enough structure for agents to start writing code immediately.
bashak get board # existing boards ak get maintainer --board <board-id> -o json ak get agent -o json # agents, status.schedulable, and status.tasks load ak get repo # registered repos git remote -v # repo URL (use this, never guess)
Read project instruction files, CONTRIBUTING.md, and recent git history to understand:
After selecting or creating the board, resolve review ownership before previewing or creating tasks:
bashak get maintainer --board <board-id> -o json
status is active, usemaintainer-review mode. Record its id in the plan preview. The leader plans, creates, assigns, and monitors tasks, but does not review PRs, reject tasks, post verification evidence, merge PRs, or complete tasks.
status: active—including an emptyarray or paused maintainer records—use leader-review mode and follow the original review workflow in this skill.
heartbeat_enabled to choose the mode. A maintainer can remainactive for event-driven review while scheduled heartbeats are disabled.
in_review. Switch toleader-review mode only when no returned maintainer is active. If any maintainer is active, remain in or switch to maintainer-review mode and record an active maintainer id.
The CLI already exposes the required board-level check. Do not infer maintainer state from agents, taints, task assignment, or heartbeat history. A newly created board has no maintainer unless one is created separately, so it starts in leader-review mode.
Use Explore agents to thoroughly scan the codebase for gaps related to the goals. Consider:
Plan tasks as independently runnable work packages, not as a sequential todo list. A task is not "step 1, step 2, step 3" in the leader's private plan. A task is a self-contained assignment that another agent can claim, understand, implement, test, and submit for review without guessing the rest of the plan.
Before drafting tasks, define the project-level integration strategy:
as adapter, provider, repository, service, command, route, plugin, or module boundaries.
formats, CLI flags, and UI state contracts that multiple tasks must obey.
implementations start.
Split by business capability, product surface, module boundary, or adapter implementation. Do not split by chronological implementation steps such as "create interface", "wire backend", "write tests", "final cleanup", or "verify everything" unless that work is itself an independently reviewable product or platform outcome.
For abstraction work, make the shared abstraction contract explicit before parallel implementation starts. If several providers/adapters/plugins need the same abstraction:
independently reviewed and all later adapter tasks can depend on it.
later adapter tasks depend on that task.
adapter reveals a real missing capability.
must update the shared contract and the affected call sites, or the leader must make that task sequential with the affected work.
interface is inconvenient or incomplete. The task description must say how to evolve the contract safely.
Never create a final "acceptance", "QA", "integration review", or "verify all previous work" task whose purpose is to re-check the whole plan. End-to-end verification belongs to the resolved review owner during PR review. Create a verification infrastructure task only when the project lacks reusable tooling or fixtures needed for workers and reviewers to validate future work.
Use AskUserQuestion to interactively confirm the plan with the user. For each ambiguous point, present options:
Keep iterating until all uncertainties are resolved.
Use the runtime's structured question tool during the pre-task-creation phase:
AskUserQuestion.request_user_input.For Codex Default mode, verify the feature flag before relying on interactive prompts:
bashcodex features list | rg default_mode_request_user_input
Expected:
textdefault_mode_request_user_input under development true
If it is not enabled, tell the user to enable the feature flag themselves and restart Codex before continuing:
bashcodex features enable default_mode_request_user_input
Do not run this command for the user. The current Codex session will not gain the tool after an automatic config change; the user must enable it and reopen Codex. Do not switch Codex into Plan mode as a workaround. Plan mode injects Codex-native planning behavior and conflicts with this leader workflow.
Before creating any tasks, show the user a task summary table using AskUserQuestion:
📋 Task Plan Preview
Architecture direction:
- <shared pattern and integration strategy>
Shared contracts:
- <interface/schema/API/event/CLI/UI contract that workers must preserve>
Review owner: <active maintainer id or "leader">
| # | Title | Boundary | Repo | Labels | Depends on | Agent |
|---|-------|----------|------|--------|------------|-------|
| 1 | <title> | <module/capability/contract> | <repo> | backend | — | <agent> |
| 2 | <title> | <module/capability/adapter> | <repo> | frontend | #1 | <agent> |
| ...
Per-task description summary:
### Task 1: <title>
Goal: <one sentence>
Boundary: <business capability/module/adapter/contract this task owns>
Contract: <shared interface/schema/API this task must preserve or evolve>
Files: <file list>
Spec: <key points — not the full description, but enough to judge scope>
### Task 2: <title>
...
---
Create all tasks? (y/n)The user must confirm before any ak create task calls are made. If the user requests changes, adjust and re-preview.
Labels are board-level taxonomy, not free-form notes. Before task creation, define the small label set this plan will use and show it in the preview. Prefer reusing existing board labels and adding only labels that will remain useful for future filtering.
Recommended label categories:
vX.Y (for example v1.4, v2.0). Prefer avoiding patch versions (v1.4.0) or suffixes (v1.4-final, v1.4-test) unless the board already has a specific reason to track that granularity.backend, frontend, cli, api, database, infra, docs, ui, security, test.feature, bug, refactor.Prefer keeping temporary process state, tools, providers, experiments, and implementation trivia in the task description instead of labels. Labels such as done, setup:lefthook, prompt-fix-test, smoke-test, cost-test, codex, github, cloudflare, tanstack-query, or file/library names usually become noisy unless the board already uses that exact label intentionally.
When labels overlap, choose the stable category:
infra, not infrastructure.bug, not bugfix.database, not db.frontend for UI implementation unless the task is specifically design polish, then add ui.Task labels must already exist on the board. Check existing labels first; if a needed label does not exist, create it with color and description, then use it on tasks:
bashak get label --board $BOARD ak create label --board $BOARD --name v1.4 --color "#22C55E" --description "Version 1.4" ak create label --board $BOARD --name backend --color "#38BDF8" --description "Backend/API work" ak create label --board $BOARD --name bug --color "#F87171" --description "Bug fix"
Useful color defaults:
#22C55E#A78BFA#38BDF8#22D3EE#F87171#F59E0B#71717AUse the existing board for the project. One project = one board.
bashak get board # find the project board # Only create a new board if this is a new product with no board yet
Before creating tasks, choose or create the workers that will own them. Read references/runtime-delegation.md.
Check existing agents. For a typical project you need:
Only assign work to agents whose status.schedulable is true. If the best role exists only on an unschedulable runtime, create a new worker with the same role, soul, skills, and handoff settings on a schedulable runtime.
Create missing agents before task creation:
yamlkind: Agent metadata: name: <human-username> annotations: agent-kanban.dev/nickname: "<Human Name>" spec: runtime: <available-runtime> model: <runtime-model> role: "<kebab-case-role>" bio: "<durable responsibility>" soul: | <durable behavior policy and decision rules> <if subagents are set, when to call them and how to review or integrate their output> skills: - <source>@<domain-skill> subagents: - <specialist-worker-agent-id>
The leader must generate and apply worker Agent YAML according to references/runtime-delegation.md. Then run ak get agent -o json and confirm the latest worker is visible and status.schedulable: true before assigning tasks.
Create tasks with full specs. For each task:
--title — concise action phrase--description — exhaustive spec including:--repo <id> — from ak repo list--labels — include the planned vX.Y version label plus one or two stable area/type labels--assign-to <agent-id> — worker chosen before task creation--depends-on — task IDs this depends onCreate tasks in dependency order so earlier task IDs can be referenced:
bashT1=$(ak create task --board $BOARD --title "..." --repo $REPO --assign-to $AGENT -o json | jq -r .id) T2=$(ak create task --board $BOARD --title "..." --repo $REPO --assign-to $AGENT --depends-on $T1 -o json | jq -r .id)
--description.--assign-to.--depends-on for real blockers or overlapping context. Tasks touching the same files, data model, or API contract should be sequential or merged.v1.4,backend or v1.4,cli.Agents are autonomous — the description is their only input. A good description:
## Goal
One sentence: what this task produces.
## Boundary
The business capability, module, adapter, provider, or contract this task owns.
## Architecture
The shared pattern this task must preserve, such as an adapter interface,
repository layer, service boundary, route contract, or UI state model.
## Contract
The exact interface/schema/API/CLI/UI contract this task must use. If the
contract is insufficient, extend it in this task and update affected callers
instead of bypassing the abstraction.
## Files
- src/foo.ts — API route handlers
- src/bar.ts — data access layer
## Spec
POST /api/items — create item
Request: { "name": string }
Response: 201 { "id": 1, "name": "..." }
Empty name → 400 validation error
## Checks
- [ ] POST /api/items returns 201 with { id, name }
- [ ] Empty name returns 400 with validation error
- [ ] New item appears on the list page without refresh
- [ ] Empty state shows "No items yet" placeholderVague descriptions produce vague code. Be specific.
Block on ak wait instead of writing polling loops. Exit codes: 0 condition met, 2 task cancelled, 124 timeout.
Wait for every task created by this plan to reach done:
bashak wait task <created-task-ids...> --until done --timeout 1h
Do not stream in_review tasks for leader review. On timeout, inspect task and runtime state, then re-check review ownership with ak get maintainer --board <board-id> -o json. If any maintainer is still active, inspect that active maintainer's status and recent runs with ak get maintainer <maintainer-id> --board <board-id> --runs; resolve runtime or platform blockers and continue waiting without taking over review. If no active maintainer remains, switch to leader-review mode.
React to PRs as workers push them:
bash# Stream in_review tasks one at a time, handle each, then wait for the next while ak wait board <board-id> --filter in_review --timeout 1h; do # Latest in_review task is printed — review its PR, merge or reject : done # After reviewing all tasks created by this plan, confirm only those tasks converged ak wait task <created-task-ids...> --until done --timeout 1h
Run ak wait board --help for the full flag list.
Before starting or recovering any wait, follow references/wait-monitoring.md. The same wait policy applies to board waits and task waits.
in_review with a PR — leader-review mode onlySkip the review gates entirely in maintainer-review mode.
Pre-check: CI status. Before reviewing, verify CI has passed on the PR:
bashgh pr checks <pr-number> --repo <owner>/<repo>
If CI is pending or failed, reject immediately — worker must wait for CI to pass before submitting:
bashak task reject <task-id> --reason "CI not green — wait for CI to pass before submitting for review"
Three gates — code review, functional acceptance, and agent notes review — must pass before merging. Follow the shared verification policy in references/leader-verification.md, including waiver evidence and verification infrastructure learning.
Gate 1: Code Review
Read the full PR diff and review against the task spec:
bashgh pr view <pr-number> --repo <owner>/<repo> --json title,body,additions,deletions,changedFiles gh pr diff <pr-number> --repo <owner>/<repo>
Check:
Fails → reject immediately, don't proceed to Gate 2.
Gate 2: Functional Acceptance
Apply references/leader-verification.md. Passing tests, CI, and code review is not completion. Validate every task check from the product/user perspective. If verification cannot be completed, follow the shared attempt budget, waiver, and verification infrastructure learning rules.
Gate 3: Agent Notes Review
Read task notes before merging:
bashak get note --task <task-id>
Check:
Agent YAML using the same metadata.name username as the current agent.If the completion summary is missing or unclear, reject and ask the worker to add it.
If no proposal is present, continue. If a proposal is present, review it using references/runtime-delegation.md. Apply it only when the proposal is durable, role-appropriate, and not task-specific.
Any gate fails or is blocked → Reject. List all issues in the reason.
bashak task reject <task-id> --reason "<all issues, specific and actionable>"
After reject, continue monitoring. If the failure reveals a durable worker behavior problem, apply references/runtime-delegation.md#leader-driven-profile-iteration: use reject to correct the current active session, or close/cancel the task if it is too far off-course; update the worker profile only after the current task is no longer being worked, and never change the agent runtime.
All gates pass, or Gate 2 is explicitly waived after the required attempt budget → Post verification comment, then merge.
Post evidence on the PR before merging using the verification comment template in references/leader-verification.md. Before running gh pr merge, re-read the comment and confirm it satisfies the shared policy.
If the PR has merge conflicts, reject instead of merging — the worker agent will rebase, fix, and resubmit:
bashak task reject <task-id> --reason "merge conflicts with main — rebase and resubmit"
Then merge:
bashgh pr merge <pr-number> --repo <owner>/<repo> --squash --delete-branch
The daemon's PR Monitor will automatically complete the task. Do not manually run ak task complete unless the PR Monitor lag rule in references/wait-monitoring.md applies.
Remove local review artifacts from the repo root after verifying each path belongs to this workflow:
/tmp/ak-review-*playwright-report/test-results/When all tasks are done, report the final summary to the user.
If the blocker appears to be an ak bug, missing capability, confusing UX, documentation gap, or skill workflow problem, file an issue in the official repo after collecting a minimal reproduction.
If the leader agent makes a process error, violates this skill, merges/rejects incorrectly, skips a required gate, misinterprets conflicting skill instructions, or has to be corrected by the user about expected skill behavior, do not stop at a chat apology or "next time" promise. Summarize the failure as a durable skill-improvement issue so future agents and external projects can benefit from the lesson. Include:
bashgh issue create \ --repo saltbo/agent-kanban \ --title "ak-plan: <short process or skill problem summary>" \ --body "$(cat <<'EOF' ## Summary <what failed or what capability is missing> ## Command ak <command and flags> ## Expected <what should have happened> ## Actual <exact error text or observed behavior> ## Context - ak version: - OS: - Runtime: - Auth type: user | machine | agent - Board/task/repo IDs, if relevant: ## Reproduction 1. <step> 2. <step> ## Proposed Skill Change <specific wording or rule that would prevent recurrence> EOF )"
Never include API keys, session tokens, private keys, .env contents, or private repository data. If gh is unavailable, open https://github.com/saltbo/agent-kanban/issues/new and paste the same content.
done; a cancelled task is an unsuccessful terminal outcome that must be reported, not left pending or described as plan completion.ak create task, continue immediately into monitoring (ak wait board ...) in the same turn whenever possible. Do not send a final answer merely reporting that tasks were created unless the user explicitly says to stop, cancel, abort, or only create tasks.ak get maintainer --board <board-id> -o json; only status: active delegates review, and heartbeat_enabled does not affect ownership-o json | jq when extracting fields into variables (e.g. task IDs for --depends-on). For display, use default text output.git remote get-url origin — never guess, never improvise. If there is no remote, stop and ask the user to push the repo first (see Phase 0). file://, local paths, and placeholder URLs will be rejected by the server with 400.saltbo/agent-kanban documenting the failure and proposed skill change. Do this in addition to any immediate local skill edit; do not replace it with an apology or private note.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-11 | fail→fail | 5,208 | 7,831 | +50% | 1 | 1 | 0% | 764 | 7,906 | +935% | 0 | 0 | — |
case-01 | fail→fail | 5,355 | 6,231 | +16% | 1 | 1 | 0% | 410 | 7,860 | +1817% | 0 | 0 | — |
case-02 | fail→fail | 12,088 | 3,725 | -69% | 1 | 1 | 0% | 1,911 | 7,938 | +315% | 0 | 0 | — |
case-03 | fail→fail | 5,622 | 6,130 | +9% | 1 | 1 | 0% | 306 | 7,814 | +2454% | 0 | 0 | — |
case-04 | fail→pass | 3,007 | 10,149 | +238% | 1 | 1 | 0% | 415 | 8,576 | +1967% | 0 | 0 | — |
case-12 | fail→fail | 8,957 | 18,756 | +109% | 1 | 1 | 0% | 1,496 | 10,902 | +629% | 0 | 0 | — |
case-05 | pass→fail | 16,296 | 5,825 | -64% | 1 | 1 | 0% | 1,867 | 7,690 | +312% | 0 | 0 | — |
case-06 | pass→fail | 11,453 | 7,345 | -36% | 1 | 1 | 0% | 1,765 | 7,593 | +330% | 0 | 0 | — |
case-07 | pass→fail | 13,678 | 6,223 | -55% | 1 | 1 | 0% | 2,274 | 7,996 | +252% | 0 | 0 | — |
case-08 | fail→pass | 13,931 | 9,310 | -33% | 1 | 1 | 0% | 2,381 | 8,241 | +246% | 0 | 0 | — |
case-09 | fail→fail | 24,831 | 5,581 | -78% | 1 | 1 | 0% | 3,281 | 7,805 | +138% | 0 | 0 | — |
case-10 | fail→fail | 7,546 | 6,111 | -19% | 1 | 1 | 0% | 443 | 7,728 | +1644% | 0 | 0 | — |
case-13 | fail→fail | 7,568 | 8,516 | +13% | 1 | 1 | 0% | 1,305 | 7,909 | +506% | 0 | 0 | — |
case-14 | fail→fail | 9,680 | 6,444 | -33% | 1 | 1 | 0% | 1,116 | 7,798 | +599% | 0 | 0 | — |
case-15 | fail→pass | 5,123 | 3,088 | -40% | 1 | 1 | 0% | 724 | 7,898 | +991% | 0 | 0 | — |
case-16 | fail→pass | 8,980 | 1,949 | -78% | 1 | 1 | 0% | 1,407 | 7,692 | +447% | 0 | 0 | — |
case-17 | fail→fail | 5,282 | 7,026 | +33% | 1 | 1 | 0% | 780 | 7,952 | +919% | 0 | 0 | — |
case-18 | fail→fail | 9,679 | 7,033 | -27% | 1 | 1 | 0% | 1,616 | 8,001 | +395% | 0 | 0 | — |
case-19 | fail→pass | 6,547 | 9,092 | +39% | 1 | 1 | 0% | 926 | 8,264 | +792% | 0 | 0 | — |
case-20 | fail→pass | 11,883 | 9,147 | -23% | 1 | 1 | 0% | 2,023 | 9,146 | +352% | 0 | 0 | — |
case-21 | fail→pass | 7,325 | 3,578 | -51% | 1 | 1 | 0% | 1,326 | 8,095 | +510% | 0 | 0 | — |
case-22 | pass→fail | 16,359 | 6,308 | -61% | 1 | 1 | 0% | 2,714 | 7,660 | +182% | 0 | 0 | — |
case-23 | fail→fail | 5,928 | 5,019 | -15% | 1 | 1 | 0% | 887 | 8,287 | +834% | 0 | 0 | — |
case-24 | pass→pass | 8,909 | 3,507 | -61% | 1 | 1 | 0% | 1,525 | 7,978 | +423% | 0 | 0 | — |
case-25 | fail→pass | 6,626 | 4,885 | -26% | 1 | 1 | 0% | 1,112 | 8,282 | +645% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted, and 14 counted toward the lift figure. The other 11 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +16 percentage points is the difference between those two pass rates over the 14 comparable cases. 6 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.