Capability Patterns
The UI language for visualizing what agents can do, to whom, and under what conditions. These patterns make agent authority legible — at a glance, in a crisis, at 3am.
Color Semantics
The capability system uses three of the four Nodus semantic colors. Red is reserved for denied/revoked — it communicates loss of authority. Blue signals active capability. Gold signals constraint.
| Token | Value | Capability Use |
|---|---|---|
| --ds-color-temporal | #2B44D4 | Granted / active capability state |
| --ds-color-validation | #C49A1A | Conditional grant — time-bounded, value-bounded, or approval-gated |
| --ds-color-agency | #D42020 | Denied, revoked, or the revoke action itself |
| --ds-color-outcome-positive | #2E7D32 | Active grant status label (human-readable) |
AgentCapabilityMatrix
Scannable grid: agents on rows, capability dimensions on columns. Designed for treasury dashboards where you need to assess 10+ agents at a glance without reading text.
| Agent | Read | Write | Approve | Transact | Escalate |
|---|---|---|---|---|---|
TR TreasuryExec Executor | |||||
RI RiskMonitor Observer | |||||
CA CashflowAnalyst Analyst | |||||
AU AuditBot Auditor |
| Prop | Type | Default | Description |
|---|---|---|---|
| agents | AgentRow[] | — | Array of agent rows. Each row has agentId, agentName, optional agentRole, and a capabilities map. |
| dimensions | CapabilityDimension[] | all five | Which capability columns to render. Defaults to read/write/approve/transact/escalate. |
| onCellClick | (agentId, dimension, state) => void | — | Optional click handler. When provided, cells are interactive and display a focus summary row. |
- Never use red for "granted" — red means denied/revoked in this system. Use
--ds-color-temporal. - Never show capability states without the legend. A colored dot without legend context is unreadable.
- Never place this in a narrow side panel. Minimum 600px for the 5-column layout. Use
dimensionsprop to reduce columns if space is tight.
CapabilityGrant
A single grant record: what capability, to whom, under what conditions, granted by whom, and with a full audit trail. Handles time-bounded, value-bounded, and approval-gated conditions.
| Prop | Type | Default | Description |
|---|---|---|---|
| grantId | string | — | Unique grant identifier. First 8 chars shown in UI. |
| agentName | string | — | Display name of the agent receiving the grant. |
| capability | string | — | Capability name (e.g. TRANSACT, READ). Rendered uppercase monospace. |
| scope | string | — | Resource scope string (e.g. treasury/accounts/*). Rendered as a temporal-color badge. |
| conditions | GrantCondition[] | [] | Array of conditions. Each has a type (time-bounded | value-bounded | approval-gated) and type-specific fields. |
| status | 'active' | 'conditional' | 'revoked' | 'expired' | — | Grant status. Controls status chip color and whether revoke button shows. |
| grantedBy | string | — | Human-readable name of the granting authority. |
| grantedAt | string | — | ISO timestamp of grant issuance. |
| auditTrail | ProvenanceStep[] | [] | Audit events as ProvenanceChain steps. Toggle revealed via 'Audit Trail' button. |
| onRevoke | (grantId: string) => void | — | When provided, shows a Revoke button for active/conditional grants. |
CapabilityRevokeFlow
Two-step revocation ceremony. Step 1 surfaces impact — tasks that will fail or degrade. Step 2 requires a written reason, creating a non-repudiable audit event.
| Prop | Type | Default | Description |
|---|---|---|---|
| grantId | string | — | Grant to revoke. |
| agentName | string | — | Agent whose grant is being revoked. |
| capability | string | — | Capability being revoked. |
| scope | string | — | Scope of the grant being revoked. |
| impactedTasks | ImpactedTask[] | [] | Tasks that will be affected. Each has taskId, title, status, and severity (will-fail | may-degrade | unaffected). |
| onConfirm | (grantId, reason) => void | — | Called when user completes both steps with a written reason. |
| onCancel | () => void | — | Called when user cancels at any step. |
- Never allow single-click revocation. The two-step ceremony is intentional — it forces impact review and creates an audit record.
- Never hide the impact list. Even "0 affected tasks" must be shown — it confirms the operator reviewed impact, not that impact was skipped.
- Never allow empty reason strings. The revocation reason is the audit trail entry — enforce it at the UI layer.