Commitments
A commitment is a tracked promise — “I'll send you the doc Friday,” “Call you back tomorrow,” “Quarterly review on the 15th.” Cortex auto-extracts commitments from messages and meetings via the consolidation engine, or your app creates them explicitly. The lifecycle state machine (open → snoozed → resolved / delegated / expired) is a first-class primitive, not buried in episode-store details.
Lifecycle
Every commitment moves through a state machine:
open— default state at creation. Either auto-extracted from an episode (via consolidation Phase 2) or explicitly created viacommitments.create.snoozed— user deferred.snoozed_untilfield carries the target time; transition back toopenhappens automatically when the time arrives.resolved— user marked complete (or substrate detected completion from a follow-up episode). Terminal.delegated— commitment ownership handed off to a Trusted Delegate. V2 only.expired— due date passed without resolution. Terminal; feeds into the social-debt surface (FR84a) and morning-briefing prompts.
The five tools
commitments.list(filter)— filter by counterparty, state, due_before. Read-class; counts againstdaily_substrate_read_calls.commitments.create({...})— explicit creation. Write routes through the action engine for ledger writes per FR55.commitments.resolve(commitment_id)— mark resolved with optional resolution_summary.commitments.snooze(commitment_id, until)— defer with an explicit return time.commitments.delegate(commitment_id, delegate_to)— Preview — V2. Stub-ships returningfeature_not_available.
Auto-extraction from the consolidation engine
You don't have to populate commitments manually. The consolidation engine's Phase 2 (per Pattern 5.2) detects commitment-shaped phrases in episodes and creates commitments automatically with source_episode_id linking back to the originating message or meeting. Your app reads via commitments.list — the auto-extracted and explicit commitments share the same surface.
Example: rendering an inbox sidebar
// Render the user's open commitments inbox in your app's sidebar
const open = await cortex.tools.call('commitments.list', {
state: 'open',
limit: 25,
});
return (
<CommitmentsInbox>
{open.items.map(c => (
<Row key={c.commitment_id}>
<Subject>{c.subject}</Subject>
{c.counterparty_id && <Counterparty id={c.counterparty_id} />}
{c.due_at && <DueAt date={c.due_at} />}
<Actions>
<ResolveBtn onClick={() => cortex.tools.call('commitments.resolve', { commitment_id: c.commitment_id })} />
<SnoozeBtn onClick={() => openSnoozePicker(c)} />
</Actions>
</Row>
))}
</CommitmentsInbox>
);Web dashboard surface
Per FR34d, the Cortex web dashboard hosts a non-delegable commitments inbox surface for direct user review — review, snooze, resolve affordances. Your app's commitments UI is additive; the web dashboard is the always-available admin path.
Cross-references
- Concept: Counterparty depth — commitments are scoped per-counterparty; the per-counterparty trust graph and commitments share the same entity model.
- Concept: Subscriptions — subscribe to
commitment_dueevents to receive dispatches as commitments approach their due date. - ADR-0021 §read-API (Family C — Commitments).