Web interface
Signing in to the browser, what only the browser does, the Download CLI menu item, the search window, and a task's own page.
You do most of your work in Cadence over MCP. The web interface is the second way in. Use it when you want to look at something, such as a workflow's board view, a task or a doc, and for the things MCP does not do. This page covers how you sign in, what only the browser does, where to download the command-line client, and the two places the browser gives you to find and read a task: the search window and a task's own page.
Replace https://cadence.example.com with your instance's address.
Signing in
Open https://cadence.example.com/sign_in. Sign in with your email and password,
or choose Continue with Google if your instance has Google sign-in set up.
Google sign-in links to an existing account and does not create one. See
OAuth § Sign in with Google. If you have
forgotten your password, use the Forgot your password? link on the same page.
There is no sign-up page. You need an account on the instance before you can sign
in. An instance administrator creates accounts in the browser, under Settings
at /settings/users, and sets each new account's email and password there.
Cadence sends no invitation, so the administrator gives you your email and
password themselves. If you do not have an account, ask whoever administers your
instance.
Signing in does not by itself give you access to a space. Your role in each space (viewer, member or admin) decides what you can see and change there. See Authentication § What your role decides.
What only the browser does
These things have no MCP tool and no HTTP API route. Each linked page gives the details.
- Creating a space, and changing its name or key. Most other space settings, such as tags, checks, task types and credentials, also have MCP tools. See Spaces.
- Setting a space's Max vCPU ceiling. See Max vCPU.
- Setting or rotating a credential's secret value. Over MCP you can list a credential's details and revoke it, but not see or set its value. See Credentials § Set and rotate in the web interface.
- Entering an LLM-provider token's value. See LLM providers § Register, enter tokens, and refresh in the browser.
- Viewing the instance's background jobs, for whoever runs the instance. See Jobs.
- Downloading a doc as a Markdown file. See Docs § Download a doc.
- Comparing two versions of a doc. See Docs § Compare versions.
- Adding people to a space, changing their role and removing them, at
/settings/spaces/<KEY>/memberships, where<KEY>is the space's key. An admin of the space or an instance administrator can do this. An instance administrator reaches it from Settings with the space's Members link. A space admin has no link to it and opens the address directly. The instance-administrator parts of Settings answer403 Forbiddento anyone else:/settingsitself,/settings/spaces,/settings/users,/settings/images,/settings/credentials,/settings/llm_providers,/settings/agent_skillsand/settings/jobs. Your own/settings/account,/settings/account/connected_applicationsand/settings/api_tokensare open to any signed-in user. - Creating user accounts, for an instance administrator, at
/settings/users. See Signing in. - Creating and revoking your own API tokens, at
/settings/api_tokens. See Authentication § API tokens. - Adding and removing Slack apps. See Messaging and contacts § Slack apps.
A workflow's pages
A workflow's pages live under
https://cadence.example.com/spaces/:space_key/teams/:team_slug/workflows/:slug,
where :space_key is the space's key, such as OPS. That address opens the workflow's board view: its stage groups drawn as columns,
with each task as a card. The workflow's settings, stages, stage groups and
constraints have pages below it, such as …/workflows/:slug/settings.
Addresses containing /boards/ no longer open anything. If a bookmark stops
working, open the workflow from its team, or use its permalink,
/spaces/:space_key/workflows/:id-:slug, which keeps working after the workflow is
renamed or moved to another team. You do not have to build the permalink
yourself: it is the url in the workflow's ref that workflows_get and
workflows_list return over MCP. See
Workflows and stages § Workflow URLs.
Downloading the command-line client
On an instance that offers the cadence command-line client for download, the
user menu (the avatar at the right of the top navigation) has a Download CLI
item, below User settings, and above Instance settings if you are an
instance administrator. It opens /cli, which any signed-in user can open. On
an instance that does not offer downloads, the item is not there and /cli
answers 404 Not Found. The same downloads are available over MCP and the HTTP
API; see
Downloading the command-line client.
Search
The search window finds tasks and docs in your current space: the space you last picked in the top navigation's space switcher. If you have never picked one, or the one you picked is no longer open to you (for example, it was archived or you were removed from it), it is the first of your active spaces in alphabetical order by name, and that becomes your current space. It is not the space of the page you are looking at. On a task's page in another space, the window still searches your current space, so switch spaces first to search that task's space.
The search window uses the same matching rules as every other way in. See Search for how a query matches, and for how a task key finds its task.
Opening it
Press Cmd+K (macOS) or Ctrl+K (other systems), or click Search in the top navigation. The shortcut does nothing while your cursor is in a text field, so it never interrupts your typing. The Search button is in the top navigation on every page that has one, as long as you belong to at least one active space. If you belong to none, there is no Search button.
What you see
Type a query. Results update shortly after you stop typing. Results appear under
two headings, Tasks and then Documents. A heading with no matches is left
out. If nothing matches at all, the window says No matches for "…".
Each heading shows how many results it found. Cadence fetches up to 25 results
for each heading. When a heading reaches that limit, its count reads 25+,
because more may match than were fetched. Each heading shows at most 5 rows, so
narrow your query to reach a result further down.
A task row shows:
- the task's key, such as
OPS-42 - its task type
- its title, with the matched words highlighted
- its workflow, stage and status. Status is
On hold,ResolvedorOpen.On holdmeans the task carries a hold of either kind. See Tasks § Holds. Archived tasks are never returned. - a snippet of the body around the match, if there is one. A task found by its key has no snippet.
A document row shows its title with the matched words highlighted, where the doc sits in the doc tree, and a snippet.
The search window trims your query before searching. A trailing space therefore
does not finish the last word here: roll still finds rollback. End the query
with a closing " or a punctuation mark to match whole words only. See
Search § How a query matches.
Using the keyboard
Focus stays in the search box while you move through the results.
| Key | What it does |
|---|---|
| ↓ | Highlights the next result. The highlight moves from the last task into the documents, and wraps from the last result back to the first. |
| ↑ | Highlights the previous result, and wraps from the first result to the last. |
| Enter | Opens the highlighted result. With nothing highlighted, it runs the search straight away. |
| Escape | Closes the search window. |
For screen readers, the search box is a combo box and the results are a list of options. The highlighted result is marked as the active option.
Opening a result
Click a result, or highlight it and press Enter. The window closes and the result opens as a full page: a task opens on its own page, and a doc opens on its reading page. Pressing Back does not reopen the search window.
The search box stays fixed at the top of the window while you scroll through the results, and the window stays in place as results load.
The docs search page
The docs search page searches one space's docs only. To open it, go to the
space's docs and click the Search docs button (a magnifying glass) at the top
of the doc tree. You can also open
https://cadence.example.com/spaces/OPS/docs/search yourself, with your space's
key in place of OPS.
Type your query in the Search docs… box and click Search. The query is
sent as the q parameter, so /spaces/OPS/docs/search?q=rollback opens the page
with results for rollback. The page follows the same matching rules as the search window,
highlights the matched words in each title, and shows a snippet for each doc.
A task's page
Every task has its own page at /spaces/:space_key/tasks/:task_key, for example
/spaces/OPS/tasks/OPS-42. You reach it:
- from
https://cadence.example.com/tasks/OPS-42, which redirects to the task's page wherever the task sits - from the
urlin a task reference returned over MCP. See MCP § Entity references. - from a task result in the search window
You must be signed in and have read on the task's space. If you are signed
out, both addresses answer 404 Not Found, not a sign-in page. Sign in first,
then open the address again.
If you have no role in the task's space, you get a 403 Forbidden page headed
You don't have access to this., with the code role_insufficient and the
reason no membership on space. The page says If you should be able to reach this Space, ask an admin to grant you a Membership. Ask an admin of that
space to give you at least the viewer role. See
Authentication § What your role decides.
The task's page is a full page, with the top navigation and the search window available. It shows:
- the task's card, as it appears in the board view
- an Archived badge, if the task is archived. Archived tasks keep their page.
- the task's Body, Assignee, Priority, Parent, Tags and Stage. You change each one in place with its Edit link, as in the task drawer in the board view. You need the same role here as in the drawer: member to change a task. See Tasks. Choosing a pool as the Assignee creates a lease for that pool on the task straight away. It needs no assignment rule and goes ahead despite an unresolved dependency or an unpassed required check. If a lease of that pool is still active on the task, Cadence reuses it and starts no second worker. If the task has a blocking hold, the worker is refused when it tries to start. If the pool is paused or has no room, the lease waits, not started, until it is unpaused and has room. See What happens after a refused move.
- the parent task, if there is one. Its link opens the parent's own page.
- a View on board link, which opens the board view of the workflow the task is on
There is no separate status list. The task's stage is shown in the Stage field. When you change the stage or the assignee, the field and the card update in place.
Holds on a task's page
If the task is held, its card shows a badge. A blocking hold shows
Blocked · On hold. An advisory hold shows Waiting · Needs attention, unless
something else is also stopping the task, in which case the badge names that
instead.
The task's page has no Clear hold button. To clear a hold in the browser, click View on board and open the task there. In the task drawer, either:
-
click Clear hold, or
-
under Retry pool, click Dispatch next to a pool. This always clears the hold. It starts that pool on the task again only when all of these are true; otherwise the hold is cleared and no worker starts:
- an assignment rule at the task's current stage names that pool and applies to the task (see Stage rules § How a rule's scope is chosen)
- no lease of that pool is still active on the task the rule leases. A rule
with
target: parentleases the task's parent, not this task, and starts nothing if the task has no parent or the parent is not of the type the rule names. - the task has no unresolved dependency and no unpassed required check at its stage
A pool is listed once one of its leases on the task has finished since the task entered its current stage, even if a newer lease of that pool is still running, and even if that lease came from a scheduled rule, an inbound rule or an assignment made by hand rather than from an assignment rule. If no assignment rule at the stage names that pool, Dispatch clears the hold and starts nothing. To get such a pool running on the task again:
-
A pool you assigned: assign the task to the pool again, with the Assignee field or with
tasks_assignandassignee: "pool:<id>". See Tasks § Assign a task. -
A scheduled rule's pool: it runs again at the rule's next due time. See Scheduled rules.
-
An inbound rule's pool: it runs again when a new matching event arrives, or when an event that was already waiting in the dispatch queue reaches its turn. A waiting event starts the pool with no new event and no person, but only if, when its turn comes, the task has no blocking hold, no unresolved dependency that blocks at its current stage and no unpassed required check. If one of those stops it, the event is closed without starting anything and is not tried again. An event whose turn came while the hold was still on has already been closed this way, so it does not run after the clear.
Cadence takes the waiting events for a task and pool one at a time: on each pass it closes or starts only the oldest. So while the hold is on, it closes them one by one, and if you clear the hold before it has closed them all, the next one starts the pool after the clear.
To stop the waiting events from running, remove each of them with
inbound_queue_removebefore you clear the hold. This needs admin; if you are a member, ask a space admin to do it before you clear the hold. Find each event'sidwithinbound_queue_list space_key=OPS: they are thewaitingrows whosesubjectis the task and whosepool_idis the pool.If no event for the task and pool is still waiting, Cadence will not start that pool on the task again until a new matching event arrives. To run it sooner, assign the task to the pool yourself, with the Assignee field or with
tasks_assignandassignee: "pool:<id>". Assigning does not use up an event that is still waiting: the event waits while the lease you started is active, and once that lease ends it starts the pool again, with no person, if the task passes the same conditions. If you do not want that second run, remove the waiting event first. The lease you start waits,pending, while the pool is paused, the space is archived, or the pool, the space or the instance has no room, and starts once all of them allow it.To check whether an event was closed, an admin can run
inbound_queue_list space_key=OPS state=done; the event's delivery ininbound_deliveries_listis markedfailedwith the gate's reason. See Inbound § The dispatch queue and Inbound § When a dispatch mints nothing.
Over MCP, three tools clear a hold: tasks_clear_hold, tasks_nudge and
tasks_dispatch_pool. See Tasks § Holds,
Tasks § Nudge and
Tasks § Dispatch to a pool. Do not use
tasks_nudge on a hold whose reason ends in (3 attempts): after a nudge, the
third lost lease on that pool places no hold, so the task can sit idle with
nothing pointing you to it. The pool stays blocked even if another hold has
since replaced the (3 attempts) hold, so the task's current hold does not
tell you. Use Clear hold or tasks_clear_hold. If you are not sure, or you
have already nudged, call tasks_dispatch_unblock with the task's key and no
pool_id straight after the nudge: it resets every pool that is still blocked
and lists them in cleared. See
Tasks § A nudge turns off the lost-lease hold.
A blocking hold is meant to wait for a person. All three ways to clear it refuse a worker: only a person's own account, in the browser or with their own token, can clear a blocking hold through them. While it is on the task, no pool starts new work on the task and no sentinel rule moves it, whatever its checks say.
Do not rely on a blocking hold staying in place with no person involved. A worker
whose lease reaches the task can call tasks_set_hold with kind: "advisory".
That replaces the blocking hold with an advisory one, which any caller, including
that worker, can then clear, and which a move to another stage clears on its own.
A worker whose lease reaches the task can also still move it, held or not,
whenever its lease started (see What happens after a refused move).
A lease reaches more than the task it was leased for: by default also the task's
parent, children and siblings. See
Leases § What a lease can reach.
You can see when this happens. The task's timeline records every hold change as
a hold_set entry with the new kind and who set it. A clear is a
hold_cleared entry, except a clear made by tasks_nudge, which is a single
nudged entry carrying the cleared hold's reason in cleared_reason. A move
between stages is a transition entry and a move to another workflow a
transferred entry. Each names who made it in by. Read it in the task drawer or with activities_list. See
Tasks § Comments and the activity feed
and Hold a task and clear a hold.
Blocking holds do not only come from people. Cadence places one itself in these cases. Each one is cleared, or changed by a worker, in the same ways as above. On any workflow:
- A worker's lease on the task failed, was stopped for running past its pool's time limit, or stayed deferred for too long.
- A pool could not be dispatched for the task after repeated attempts.
- The task has entered its stage more times than the stage's re-entry limit allows. This is checked on every move, including one you make or force from this page.
Only on a workflow with auto-advance turned on (auto_advance_enabled), in a space
that is not archived, at a stage that is not archived, and only for a task that
is not archived and has not been resolved since it entered its current stage.
Cadence places these holds
during the same sweep that runs sentinel rules, so on a workflow with
auto-advance off it never places them, and a stuck task there stays unflagged until you
notice it:
- A stage's work looks abandoned. Cadence places this hold only when all of
these are true:
- the stage has
abandoned_work_detectionturned on - no sentinel rule at the stage moved or held the task on that pass
- the task is not waiting on an unresolved dependency that blocks at its current stage
- at least one lease of a pool named by an assignment rule at the stage that applies to the task (see Stage rules § How a rule's scope is chosen) has been created since the task entered the stage. A task that no assignment rule at its stage applies to never trips this hold, and leases of pools that no assignment rule applying to the task names do not count.
- none of those leases is still active, and the newest of them finished more than 3 minutes ago
- a check the stage expects is still missing or
pending
- the stage has
- A sentinel rule whose action is to hold the task matched it.
- Cadence failed 3 times to evaluate the task's sentinel rules during its
current stay at the stage. The count starts when the task entered the stage,
and starts again each time a hold on the task is cleared with
tasks_clear_hold,tasks_dispatch_pool, or the task drawer's Clear hold or Dispatch. A clear made withtasks_nudgedoes not restart the count.
The hold's reason says which case it was. See What moves a task without a person.
Moving a task from its page
Moving a task to another stage from this page follows the same rules as moving it anywhere else. The move is refused, and the task stays where it is, when:
- a check the target stage requires has not passed
- a property the target stage requires is not set
- the target stage does not accept the task's type
- a WIP limit on the target stage is full. A WIP limit refuses moves into a set of stages on a workflow once that set holds the limit's number of tasks. It refuses a task only when the task comes from a stage outside that set and matches the limit's task-type or tag filter, if it has one. It is checked only when a task moves between stages on a workflow: creating a task, moving it to another workflow and a forced move do not check it, so the set can hold more tasks than the limit. See Stage rules § WIP constraints.
What you see depends on the refusal and on your role in the task's space.
- If the move skips a stage group
(one of the columns a workflow's board view draws its stages in), the Stage field asks you to
confirm it:
You're skipping … Continue?, with a Confirm move button. - If you are an admin of the task's space and required checks refused the
move, the Stage field lists the checks that have not passed, with each one's
current state, under
Moving to … requires these checks. Force the move?, with a Force move button. A forced move goes ahead despite the refusal. - Otherwise the page shows each reason in a red box above the fields. The wording
is the refusal's own:
Stage requires check review_passed to be passed (currently pending)Stage requires property owner to be set (currently missing). The state isblankwhen the property is set but empty.Stage does not accept task type BugStage constraint Review WIP is at its limit of 3. When the limit counts tasks per parent, the message ends with the group it counted, for example… at its limit of 3 for parent OPS-40or… at its limit of 3 for tasks with no parent.
"Admin" here means the admin role in the task's space, not the person who runs your Cadence instance. See Authentication § What your role decides.
The browser offers a forced move only to a space admin, and only when required
checks refused the move. A space admin can force a move refused for any of the
four reasons over MCP or the API, by passing force: true. See
Tasks § Move a task between stages.
To get past a refusal:
- have the check set to
passed(see Checks) - set the property (see Task data § Properties)
- for a WIP limit, wait for a task to leave the stages the limit covers, or ask an admin of the task's space to raise the limit
- or ask an admin of the task's space to force the move
What happens after a refused move
Cadence does not retry the move you made. The task stays at its current stage until something moves it. These can move it without a person:
- A sentinel rule at the task's current
stage. Cadence re-checks every eligible task every 30 seconds. It moves the
task once all of these are true:
- the workflow has auto-advance turned on (
auto_advance_enabled) - the space, the task's current stage and the task itself are not archived
- the task has no blocking hold
- the task has not been resolved since it entered its current stage
- every lease of the pools named by the stage's assignment rules that apply
to the task, created since the task entered the stage, has finished. A
lease of any other pool does not delay the move, for example one started
by a scheduled rule, an inbound rule, an assignment to a pool, or a
target: parentrule at a child's stage. Cadence can move the task while that worker is still running on it. - the rule applies to the task (see Stage rules § How a rule's scope is chosen), and its predicate over the checks at the task's current stage holds. These are not the checks that refused your move. If a hold rule at the stage matches first, Cadence sets that hold instead of moving the task.
- the target stage's gates pass. If they do not, Cadence goes on to the next rule at the stage whose predicate holds, in the same pass. That rule can move the task to a different stage or set a hold. Only when no later rule matches does the task stay put, and Cadence tries again every 30 seconds, so the task moves once a WIP slot frees up or a missing check or property is filled in.
- the workflow has auto-advance turned on (
- A worker. A worker whose lease can reach the task can move it to another
stage over MCP with
tasks_transition, even while the task is held. That move goes through the same gates as yours, and a worker can never force a move. A worker can also move the task to another workflow withtasks_transfer, held or not, but only while no other lease on the task is still active. A worker reaching the task from a related task cannot transfer it while the task's own lease is running.
What each condition stops:
-
Auto-advance turned off on the workflow stops the whole sentinel sweep for that workflow. No sentinel rule moves the task, and Cadence never places the abandoned-work, sentinel-hold-rule or evaluation-failure holds listed in Holds on a task's page. It does not stop a worker from moving the task, and it does not stop pools from starting work on it. Pools are still started in five ways:
- An assignment rule at the task's stage. It creates a lease only while the task has no blocking hold, no unresolved dependency that blocks at its current stage and no unpassed required check at its stage, and no lease of that pool on the task is still active. See What moves a task without a person § A pool leases and works a task.
- An inbound
dispatch-workerrule that names the task. It checks the same conditions once, when it is its turn to run. If the task is held, blocked by a dependency or waiting on a required check at that moment, the match is recorded as failed and is not tried again. It waits only while a lease of that pool on the task is still active. - A scheduled rule with the task as its subject. It does not wait for dependencies or required checks. While the task has a blocking hold, it still creates a lease, and that worker is refused when it tries to start. See Scheduled rules § A scheduled rule at a held or blocked task.
- An assignment rule with
target: parentat a stage one of the task's children enters. Cadence checks the hold, dependency and required-check conditions against the child, not this task. So this task is leased despite its own dependency or unpassed required check. If this task has a blocking hold, the lease is still created and its worker is refused when it tries to start. - An assignment to a pool, made by a person with the task's Assignee field
or by anyone with
tasks_assignandassignee: "pool:<id>". A worker whose lease reaches the task can calltasks_assigntoo. It creates the lease straight away and checks no hold, dependency or required check. It reuses a lease of that pool on the task that is still active instead of creating a second one. If the task has a blocking hold, the worker is refused when it tries to start; otherwise it runs.
In every case the lease is created even when the pool is paused or has no room. It then waits, not started, until the pool is unpaused and has room.
-
A blocking hold stops sentinel rules from moving the task and stops pools from starting new work on it. Any worker whose lease reaches the task, including one started after the hold was placed, can still move it between stages or replace the hold with an advisory one. It can transfer the task to another workflow only while no other lease on the task is active.
-
No sentinel rule at the stage applies and no worker moves it. Then the task stays where it is until a person moves it.
Making a task wait for a person
Cadence has no single setting that guarantees a task stays put until a person acts. A task waits for you only while nothing that can move it is at work on it. Check each of these:
- No sentinel rule at the stage would move it. Either the workflow has auto-advance turned off, or no sentinel rule at the stage applies to the task.
- No worker is put on it. No
assignment rule at the stage routes
it to a pool, no scheduled rule has it as its
subject, no inbound
dispatch-workerrule names it, and no stage that one of its children can enter has an assignment rule withtarget: parent, and nobody assigns it to a pool with its Assignee field ortasks_assign. A worker whose lease reaches the task can make that assignment, so this also depends on what the workers that reach it do (see below). Dispatch,tasks_dispatch_poolandtasks_nudgestart a pool only through an assignment rule at the task's stage, and with no such rule they start nothing. A dependency or an unpassed required check on the task does not stop a scheduled rule, aparentrule or an assignment to a pool: their workers run anyway. A blocking hold on the task does not stop any of the three creating a lease, but the worker is refused when it tries to start. Over MCP,lease_claimrefuses withtask is on hold; over the HTTP API the refusal is409 task_on_hold. See Scheduled rules § A scheduled rule at a held or blocked task for what that refused lease looks like and what to do about it. - No other worker reaches it. A lease on a related task can reach this one through its pool's lease scopes, which by default cover the parent, children and siblings. See Leases § What a lease can reach.
- The workers that do reach it do not move it. What a worker does is set by
its worker version and the
agent skills that version pins. A
lease can always call
tasks_transition,tasks_transfer,tasks_set_hold,tasks_assign,tasks_dispatch_poolandtasks_nudgeon a task its scope reaches. The last two refuse a worker while the task has a blocking hold, andtasks_transferis refused while another lease on the task is active. No setting turns those tools off for a worker, so whether it uses them depends on its instructions.
A blocking hold adds to these but does not replace them. While it stands, no pool starts new work on the task and no new lease is claimed for it, and the three ways to clear it refuse a worker. To find out whether something moved a task or changed its hold without you, read its timeline, as described in Holds on a task's page.
See What moves a task without a person and Tasks § Move a task between stages.