capability; the handler intersects the catalog with the caller’s capability
set and returns only the entries the caller is allowed to invoke — entries the
caller can’t use never reach the wire.
The catalog has two halves. The static half is the four platform actions
below, the same in every workspace. The per-routine half is built from the
workspace’s own routines: a routine that carries a
slash block in its
definition is offered as /<slug>, opening a form built from its declared
inputs and running it with what the user fills in. See
Running a routine.
The endpoint requires authentication and workspace context (the slash palette
is workspace-scoped). A caller with no relevant grants gets an empty array,
not a 403 — the palette still opens, just with no actions in it.
i18n
Entries carry bothlabel (English) and label_cs (Czech) so the dashboard
can pick by locale without a translation step. The shape is open — additional
label_* fields may be added without breaking clients.
List Slash Commands
200 OK
Entry Fields
Form Field
type and value_type answer different questions, and a client needs both.
type is the widget to draw; value_type is the JSON type the server
expects back. They are not derivable from each other — a routine’s array
input and an issue’s description both draw a textarea, and only one of them
must reach the server as a parsed JSON array.
default is always a string because a form field’s value is a string. A
non-string default is formatted losslessly on the way out (42, not 42.0;
true, not True; arrays and objects as compact JSON) and parsed back via
value_type.
Static Catalog Entries
The platform-defined catalog includes these actions (each gated by its own capability):Running a routine
A routine that opts in with aslash block appears as an extra catalog entry:
routine.run:<slug>; the command a user types is the bare slug —
/msn-etn-podklady. The prefix exists for the dispatcher: both clients read it
to know the entry runs a routine, rather than inferring an endpoint from a name
a routine author chose. Strip it before rendering the command anywhere a person
will read it.
Dispatch. An entry whose id carries the prefix posts to that routine’s run
endpoint with the form’s values as inputs:
- Restore each value to its
value_type. Post anintegeras a number. Inputs reach acodestep with their original types, so a routine evaluatinginputs.limit > 20fails the run outright when42arrives as"42". Nothing catches it earlier: there is no run-time input validation, so the declaredtypeis honoured by whatever consumes the value and by nothing before it. - Omit an empty value; never send
"". The routine’s own default then applies server-side, which is the only place that knows what it is — formsn-etn-podklady, an emptyobdobimeans “the previous month”, and""would replace that with a blank period. Abooleanis the exception and always sends: its control is a checkbox with two states, so its empty value is a deliberatefalserather than “leave this alone”.
Which routines appear
A routine reaches the catalog only when all of these hold:
At most 50 routine entries are returned, ordered by invocation count, so what
survives a truncation is what people actually run.
Capability
Routine entries requireroutine.run — distinct from routine.create,
which authors a routine rather than invoking one. It is in the power and
admin bundles, and an admin can grant it alone:
routine.run is granted per membership and is not floored by role: an
admin can grant it to a VIEWER, and that VIEWER can then run routines. This
matches how credential.create and the other capabilities already behave — the
whole point of the layer is that it reaches past the role tier — but it is
worth knowing before granting it, because a routine run spends money and
touches the crew’s integrations.
A caller at MANAGER or above sees routine entries on role alone. That is not
redundant with the capability: migration v109 backfilled every membership’s
capability column before routine.run existed, so an admin on an
already-migrated database holds routine.create and not routine.run while
still clearing the run endpoint’s role gate. The catalog admits on role or
capability so it offers exactly what the endpoint accepts.
The same rule gates the endpoint itself — routine.run grants the right to
ask, and nothing more. Governance status, the integrations, resources and
credentials preconditions, and the routine’s spend caps all still apply, and
refuse a capability-admitted member exactly as they refuse an admin.