Skip to content

Answer a setup task

A setup task is the platform asking a person for something it cannot invent: a value it does not hold, or a decision the work never settled. It is always a person’s to do, so an agent cannot be assigned one and bulk assignment skips them.

Three places, and they all end in the same form:

  • An agent mid-run that needs a credential, an environment value, or an answer the task never gave it.
  • A question agreed in a huddle, which becomes a setup task when that huddle’s tasks are merged.
  • A connection a task needs, where the work reads a service nobody has connected.
It asks forThe form showsExample
A connectionA field for a credential, masked as you typeThe analytics account the task reads
A secret valueA secret fieldThe staging key for the payments sandbox
A configuration valueA plain text fieldThe percentage a new feature rolls out to
A decisionTwo to twelve named options, pick oneShip behind a flag, or ship it on
A confirmationA checkbox you tick and Confirm, saying you did something outside CommandChainInstalling a toolchain
AnswerLands
A connectionYour workspace’s connected accounts, used by agents and never shown back
A secret valueThe project environment’s write-only storage, released one attempt at a time
A configuration valueThe project environment as a plain variable, readable afterwards
A decision, or any question with no value to storeRecorded on the waiting task, under Human answers in the spec the next run reads

An answer recorded on the task never rewrites its description: it sits beside the question, so the next run reads both. When several tasks waited on the same question, each gets the answer, so none is released without it.

Why a plain value can still be stored as a secret

Section titled “Why a plain value can still be stored as a secret”

An agent says whether a value is sensitive, and CommandChain does not take its word. When the name reads like the name of a credential, the field is a secret field whatever the agent asked for, and the form says so:

You asked for this as a plain value. Because the name contains SECRET, it is stored in the secret store.

The override is recorded on the task, and it goes one way only: nothing turns a secret back into a readable plain value.

The explanation at the top is the agent’s

Section titled “The explanation at the top is the agent’s”

Where an agent raised the task, the paragraph saying what it needs and why was written by that agent, and the form labels it Written by the agent’s name, or by an agent where the name is missing. Read it as a colleague’s request rather than product copy, and check it before handing anything over.

A plain answer is prose the next run reads, so a credential typed into one becomes a credential in a prompt. The form turns such an answer away:

This looks like a secret. Ask for it on the setup form as a secret field instead of typing it into a plain answer.

A refused answer writes nothing, and the field stays open to submit again. Writing about keys and tokens is fine; only the value is turned away.

A run that raises a setup task does not sit and wait, because you may take a day.

  1. It pushes everything written so far to the task’s branch, so nothing is lost.

  2. It stops as inconclusive, recorded as waiting on setup. No review runs on work the agent has called unfinished, and the runner is free at once.

  3. The task moves to blocked and names the setup task as what it is waiting on.

Completing it clears the block and dispatches the work again, carrying on from the branch the run pushed rather than starting over.

When no connected runner has a language a task needs, one install task per language goes to whoever approved the runner, else the task creator, the project owner, then the workspace’s first member. It carries commands for macOS, Debian or Ubuntu, and Fedora or RHEL.

Run them on a self-hosted runner’s machine, then open the runner with commandchain-runner and press r to check again: waiting tasks start on their own and the install task completes itself. Ticking the box and pressing Confirm also restarts them.

The install task is for self-hosted runners only: a managed run already has a fixed set of toolchains, and there is no managed machine to install on. If you use only managed runs and a task needs a language outside that set, install a self-hosted runner on a machine that has it, and the waiting task starts once that runner connects and reports it.