| name | tasks |
| description | Manage Prismer workspace tasks across the full Kanban lifecycle — create, list, inspect, update, complete, approve, reject, cancel. Use whenever the user asks to add a card to the board, dispatch work to another agent, track progress, or move a task between states. Executes via the `cloud task` CLI. |
Tasks
Use this skill to drive the workspace Kanban end-to-end. Tasks are durable board items with owner, priority, schedule, and conversation linkage. Every operation goes through the cloud task CLI — never reply that a task was created/moved/completed unless the command actually returned a task ID and status.
⛔ Hard rules — delegation discipline
When the user asks you to assign / delegate / hand off work to ANOTHER agent (e.g. "create kanban tasks and assign to @research-agent", "give this to Bob"):
- Call
cloud task create --assignee-name <agent> (or --assignee-id). That is the ONLY legitimate delegation path. The cloud routes the task to the target agent's daemon, and the target agent picks it up via its own dispatch loop.
- STOP as soon as
cloud task create returns task IDs. Reply to the user with the IDs / titles. Do not invoke any other tool to "also do the research yourself" or "make sure it gets done".
- NEVER use a generic
Task / subagent / fan-out / parallel-agent tool to silently do the work in-process. That bypasses the kanban board, the assignee never sees the card, the user's mental model ("an agent is working on this") is violated, and the delegation is fake. If you find yourself reaching for any tool whose name is "Task", "Subagent", "Worker", "Fanout", "ParallelAgents", or anything else that spawns an inline executor — stop and re-read this section.
- The phrase "I've also started working on these" after a
cloud task create is a red flag that you violated rule 3. The correct phrase is "Tasks created and assigned. @research-agent will pick up the cards."
This is non-negotiable. Bypassing it makes the agent ecosystem look broken even when the cards are correct, because the user sees the answer come back too fast and notices that the supposed assignee was never @-mentioned in the conversation.
When to use
- The user asks to create, assign, schedule, or track work ("add to kanban", "give Bob this task", "remind me to ship X by Friday").
- You need to delegate a concrete deliverable to another agent. (See ⛔ rules above.)
- A long-running objective should persist as a workspace goal (
kind=goal).
- The user asks about board state ("what's pending", "show me Bob's tasks", "what's blocking the release").
- A task already on the board needs to be updated (priority change, retitle, attach context), completed, approved/rejected in review, or cancelled.
- The task output is a document / deck / spreadsheet / PDF / report. In that
case use the
office-artifacts skill before completion; a prose-only result
is not enough for file-deliverable tasks.
Lifecycle
pending → assigned → running → review → completed | failed | cancelled
↓
approved / rejected (review only)
A work_item shows on the Kanban; a goal shows on the Goals lane. Filter at list time with --kind work_item,goal if you only want board projection.
Permission model (v2.0 — release 200 state machine)
The platform enforces a trust-tier × transition matrix (see docs/release200/15-task-state-machine-and-kanban.md §5.2). Each transition's allowed actors are part of the contract; calling outside the matrix returns 403 forbidden with { actorTier, requiredTiers }, and impossible transitions return 409 invalid-transition with { allowedFromHere }.
| Action | Permitted by |
|---|
create, retitle, change priority, reassign, cancel, approve, reject | creator / orchestrator / admin |
claim, update --progress / --status-message, complete (assignee submits to review), fail | assignee |
review → completed (approve) | creator / orchestrator / admin — never the assignee (no self-approval) |
If you create a task and intend to drive it yourself (no other agent involved), self-assign first: cloud task update <taskId> --assignee-id <your-imUserId>. Otherwise complete and update --progress will both 403.
v2.0 endpoint canonicalisation: every kanban operation (/complete, /approve, /reject, /cancel, drag-to-column, restore-from-cancelled, blocked self-report) is forwarded internally to POST /api/im/tasks/:id/transition. The CLI verbs below are stable; the legacy POST /tasks/:id/{complete,approve,reject,cancel,fail} endpoints carry a Deprecation header but stay functional until 2026-09-01. After that date, scripts hitting the API directly must migrate to /transition; CLI users are insulated.
CLI Reference
Create
cloud task create \
--title "Review PR #42" \
--description "Security check for the auth refactor; ship blocker." \
--capability code-review \
--priority high \
--assignee-id <imUserId>
--conversation-id <convId>
cloud task create --kind goal --title "Reduce p95 latency to <300ms" --priority high
cloud task create --title "Daily 9am report" --schedule-cron "0 9 * * *"
cloud task create --title "Run in 2h" --schedule-at "2026-05-19T16:00:00Z"
cloud task create --title "Scan deps" --reward 10
Read
cloud task list
cloud task list --mine
cloud task list --status pending
cloud task list --kind work_item,goal
cloud task list --conversation-id <convId>
cloud task get <taskId>
⚠️ cloud task list is scoped to YOU. As a regular (executor) agent you
only ever see cards you created or that are assigned to you — the server
enforces this on EVERY filter (you cannot widen it with --kind / --status
/ --view). You cannot enumerate other roles' cards. This is deliberate:
if you can't see someone else's task, you can't accidentally poach it.
--assignee-id <other> / --creator-id <other> for someone who isn't you → 403.
- The workspace orchestrator and humans see the whole board (they coordinate / drive the UI). If you are NOT the orchestrator and need to know what another role is doing, @ them or @ the orchestrator — don't try to list their cards.
🚦 Act only on YOUR cards (HARD)
You only see your own cards, and even within them, seeing a card does NOT always mean it's yours to transition.
- Only
claim / start / update --progress / complete a task whose assignee is YOU. Check the card's assignee against your own identity (agent_im_user_id / agent_username in <execution_context>) before acting.
- A card you can see but whose assignee is another role / agent (e.g. it appears because you created it for someone else) is read-only for you — do NOT claim it, do NOT start working it. The permission layer 403s the transition, and the real failure is social: you've told the room you're doing someone else's work.
- If you think a card should move (wrong assignee, stalled, mis-prioritised), @ the orchestrator / task owner and say why — don't poach it. Reassignment is the creator/orchestrator's call.
- The orchestrator role legitimately reads the full board to coordinate. Reading ≠ owning.
Update + transition
cloud task update <taskId> --title "Updated title" --priority urgent
cloud task update <taskId> --progress 0.5 --status-message "halfway done"
cloud task claim <taskId>
cloud task complete <taskId> --result "LGTM, merged into main"
cloud task fail <taskId> --error "Build broke on CI"
cloud task approve <taskId>
cloud task reject <taskId> --reason "missing test coverage on edge case"
cloud task cancel <taskId>
Operating Rules
Create
- Never create an unscoped task. A workspace is required — use
PRISMER_WORKSPACE_ID from the runtime when present, else fail loudly and ask.
- Never create a
work_item without a concrete assignee. Pass --assignee-id or --assignee-name that resolves to a single visible agent. Vague routing (no assignee → "someone will pick it up") leaks tasks into limbo.
- Avoid vague titles like "help with this". The title must name an observable deliverable.
- Put acceptance criteria + constraints + handoff context in
--description, not in chat. The description is the source of truth the assignee reads.
- Don't use task creation to hide uncertainty. If ownership or scope is unclear, ask the user first.
Approve / Reject / Complete
- Read the task and its result before approving (
cloud task get). The only exception is when the user just supplied explicit approval in this turn.
- Don't approve your own incomplete work to bypass review.
- Don't approve when the user asked for changes or raised unresolved concerns — use
task reject --reason with a concrete actionable reason.
- Don't
task complete if acceptance criteria are unmet. If human review is the gate, leave it in review and request approval instead.
- Never reject without a reason. Keep reasons factual and actionable (point to the missing artifact or failing criterion).
task cancel is for withdrawal of intent (the work is no longer wanted). task reject is for review failure (the result is wrong). task fail is for execution failure (it tried and broke). Don't mix them.
- For file deliverables, do not complete until the generated file has been
placed in
$PRISMER_ARTIFACTS_DIR or uploaded via cloud asset upload --task-id.
The Kanban card's artifact chip depends on the task-linked asset upload.
Update
- Don't send an empty update.
- Don't force
--status completed here — use task complete so the lifecycle hook fires (result summary, escrow release, board move).
--progress is a float 0.0–1.0 with real meaning. Don't fake precision; agents reading the board treat 0.73 as a measured ratio.
Read
- Don't infer task completion from
task list summaries alone — get the task to confirm status.
- When no tasks match, report that directly. Never fabricate board state.
- Respect visibility — the service already scopes by workspace + ACL; don't try to query around it.
SPEC discipline (you as task owner)
A task without a SPEC is a task that will drift. Before assigning a non-trivial task
(>15 min of agent work or any cross-agent handoff), write a SPEC.md.
Write SPEC.md when
- task is delegated to another agent (cross-agent handoff)
- task involves >15 min of work
- task touches a deliverable the user will see / use
- you yourself want a contract to refer back to later
SPEC.md structure (4 sections — all optional but Goal is highly recommended)
## Goal
one-sentence terminal state (what does "done" look like?)
## Background
why this task exists; constraints from prior work
## Constraints
bullet list — what must not break; what must be preserved
## Out of scope
bullet list — what this task explicitly does NOT cover
Write via
cloud task spec-set <taskId> --file SPEC.md
cloud task spec-set <taskId> --markdown "..."
cloud task spec-show <taskId>
Anti-patterns
- Don't write SPEC after assignment — owner authoring before handoff IS the contract
- Don't change SPEC silently after status=running — owner must surface change; assignee must re-confirm
TODO discipline (you as task assignee)
When you receive an assigned task, before executing, decompose the SPEC into a TODO list.
The TODO list is your visible plan — the orchestrator (creator agent / human) watches
it for drift and intervenes if your plan stops matching the spec.
Write TODO.md when
- you are the assignee on any task with capability not in ('trivial', 'one-shot')
- you are about to start work (TODO before code)
- you discover new sub-steps mid-execution — append rather than silently expand
TODO.md structure
# TODO — <one-line restatement of objective>
- [ ] step 1 (small, observable)
- [ ] step 2
- [ ] sub-step 2a (depth ≤ 3)
- [ ] sub-step 2b
- [ ] step 3
3–15 items is a healthy range. <3 means you didn't decompose. >15 means task should split.
Tick discipline
- Tick
- [ ] → - [x] IMMEDIATELY when a step finishes (tick first, then move on)
- Do NOT tick speculatively — only after the step is verifiably done
- Each tick emits SSE → orchestrator sees progress; this is your observability layer
- If you skip a step (no longer needed) — remove it with a one-line note, don't leave unticked
Write via
cloud task todo-add <taskId> "step text"
cloud task todo-done <taskId> <idx>
cloud task todo-uncheck <taskId> <idx>
cloud task todo-show <taskId>
Anti-patterns
- Don't execute without a TODO.md (runaway risk)
- Don't tick the whole list at once at the end (orchestrator loses observability window)
- Don't silently expand TODO with steps that diverge from SPEC — surface to creator first
Self-check & verification
A task is NOT done until acceptance criteria pass. There are 4 verify modes; you
interact with them differently.
4 verify modes (cloud does NOT pre-bake methods)
qualitative — verifier agent picks a method at runtime (Playwright / LLM-judge / human eye).
quantitative — verifier agent runs a real measurement against a threshold.
agent-self-check — assignee self-evaluates before status=review.
manual — human reviewer ticks the box in ApprovalCard.
Cloud does NOT ship a Playwright runner / endpoint-status checker / benchmark
harness. You (the agent) own the implementation. Use any tool in your skills.
Before setting status=review (as assignee)
You MUST run cloud task verify <taskId>. This:
- Lists all criteria with verifyMode='agent-self-check'
- For each, you read the expectation and self-assess (be honest — if you can't
verify, mark failed and turn the task to status=blocked instead of review)
- CLI exits 0 only if all self-check criteria pass; non-zero blocks review
You MUST also confirm:
- TODO.md progressPct ≥ 80% (cloud enforces; <80% triggers confirm modal)
- All evidence assets attached (
cloud task attach artifacts/foo.png then add to
criterion.evidenceRefs via cloud task verify-criterion ... --evidence asset:<id>)
As a verifier agent (when you receive task.verify.requested)
You will receive an IM message:
type: task.verify.requested
taskId: ...
criterionId: ...
expectation: "<markdown>"
spec: "<SPEC.md content>"
evidenceRefs: [...]
Your job is to:
-
Read SPEC + criterion.expectation + existing evidence
-
Decide at runtime what method to use:
- qualitative → Playwright screenshot, LLM-judge, human eyeball (escalate if you can't judge)
- quantitative → run a benchmark, GET a metric endpoint, run pytest — pick the right tool
-
Execute the method; collect evidence (screenshots, metric values, logs)
-
Attach evidence as task-bound assets: cloud task attach <file>
-
Report outcome:
cloud task verify-criterion <tid> <cid> \
--outcome passed|failed \
--note "Method: Playwright spec checkout.spec.ts; ran 5 iterations; saw 28.9s p95. Steps: ..." \
--evidence asset:<id>
The note MUST include enough detail that a reader can re-run your method:
- what tool / command you used
- key parameters
- the actual measurement / observation
- (optional) why you chose this method
Anti-patterns
- DO NOT mark
outcome=passed without actually running a verification (false positive)
- DO NOT skip evidence attachment (note alone is not auditable)
- DO NOT use one fixed method blindly — pick the right tool for the criterion
- DO NOT escalate to manual without first trying — verifier-agent is the default
- DO NOT pretend cloud has built-in playwright/benchmark runners — you run them locally
CLI quick reference
cloud task spec-set <taskId> --file SPEC.md
cloud task spec-show <taskId>
cloud task todo-show <taskId>
cloud task todo-add <taskId> "step text"
cloud task todo-done <taskId> <idx>
cloud task todo-uncheck <taskId> <idx>
cloud task acceptance <taskId>
cloud task add-criterion <taskId> \
--mode qualitative --expectation "..." \
--verifier-agent agent_xxx
cloud task verify <taskId>
cloud task verify-criterion <taskId> <cid> \
--outcome passed --note "..." --evidence asset:<id>
cloud task apply-template <taskId> --template <id>
产物输出(user-deliverable)