Decisions

Decision kinds and option actions, where you answer decisions, and how your tools list, read and answer them through the REST API.

Decisions are everything kanman needs a human for: plan approvals, policy exceptions, clarification questions, budget stops and failed verifications. Each decision that waits for you comes with kanman’s recommendation and 2 to 4 options. See Decisions for the concept. You answer decisions in the app, in Slack or through the REST API.

Answer a decision

Where How
App Decisions (/<workspace>/decisions), tabs Pending and Resolved, or the decision page /<workspace>/decisions/<decision-key>. Approving options take one click; rejecting, requesting changes, answering, abandoning and declining open a short note first.
Slack The buttons under the decision message in the team’s channel, or a reply to kanman in the thread, for example “approve” or “reject dec-4h2k”. See Answer decisions from Slack.
Intake A reply in the team’s intake that names the decision, for example “approve dec-4h2k”.
REST API POST /v1/decisions/<decision-key>/resolve with a token that has the write permission. See below.

The first answer wins. Whoever answers second is told that the decision is already resolved. Every answer writes a decision_resolved audit entry with the person and the channel, shown on the decision as “resolved via” the app, Slack, the MCP server or the API.

Kinds

Kind Raised when
plan_approval The policy requires plan approval for this story.
policy_exception The story needs something the policy does not allow, for example a denied path.
clarification The coding agent asked a question through request_human_input.
budget_stop The run reached its budget.
verification_failed Verification failed after the automatic rework attempt.
gate_failure Writing a working acceptance spec for the story failed.
diff_guard The implementation changed the acceptance spec.
repeated_gate_failure A gate failed more often than gate_failure_budget allows.
merge_approval A verified change is larger than the policy allows to merge automatically.
revert_approval A kanman merge broke the main branch and kanman proposes a revert.
main_red_incident The main branch is red; merges are held.
maintenance_proposal Maintenance mode found something worth a story.
strategy_proposal kanman proposes a feature based on your repository’s strategy notes.
scope_change Doing the story well would mean changing its scope.

Option actions

Action Effect
approve_plan The plan is approved; implementation starts.
request_changes The run continues with your note as input.
allow_once The policy exception is granted for this run only.
reject The run ends and the story returns to Backlog with your note.
raise_budget The run budget is raised, by default to double the cap, and the run continues.
abandon The run ends and the story returns to Backlog.
revert_spec_and_retry kanman restores the acceptance spec and starts a new attempt.
retry A new attempt starts, with your note as guidance.
answer Your answer is passed to the coding agent and the run continues.
merge The pull request is merged.
open_revert kanman opens a revert pull request.
accept_proposal The proposal is filed as a story or goes to intake.
decline_proposal The proposal is declined and remembered.

REST API

List decisions

GET /v1/decisions returns the workspace’s decisions, newest first, paginated. Filter with status (pending, resolved, expired, cancelled, superseded), team (team slug) and run (run key).

curl "https://api.kanman.ai/functions/v1/api-gateway/v1/decisions?status=pending" --header "Authorization: Bearer $KANMAN_API_KEY"
Field Description
key, kind, authority, title, body The decision; body holds kanman’s reasoning as Markdown.
status, recommendation The state and the id of the option kanman recommends.
options id, label, action and recommended per option.
team, story, runKey Where the decision belongs.
resolution, resolvedVia, resolvedAt The answer (optionId, note) and its channel, once resolved.
expiresAt, createdAt Timestamps.

GET /v1/decisions/{decision-key} returns one decision in the same shape.

Answer a decision through the API

POST /v1/decisions/{decision-key}/resolve needs a token with the write permission. The answer is recorded with the token’s owner as the person who answered and api as the channel, and has the same effect as answering in the app.

curl -X POST https://api.kanman.ai/functions/v1/api-gateway/v1/decisions/dec-4h2k/resolve \
  --header "Authorization: Bearer $KANMAN_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{"optionId": "approve", "note": "Looks good"}'
Body field Description
optionId Required. The id of one of the decision’s options.
note Optional, up to 4,000 characters. Passed on like a note in the app.

The answer is the updated decision plus effects, the steps kanman took. 400 means the option does not exist, 404 that the decision is not in the token’s workspace, 409 that it was already answered (the first answer wins).

Last updated: January 1, 0001

Open kanman