The action queue
The queue is the product’s spine. Anything the Keeper or the system wants you to know — or wants permission for — becomes a card: a headline (90 characters, hard limit in the schema), one metric line, and actions. Detail sits behind a disclosure. No essays.
Card types
| Type | What it is | Actions |
|---|---|---|
proposal | The Keeper wants to change spend | Approve · Dismiss · Snooze |
insight | Worth knowing; nothing to approve | Got it · Snooze |
alert | Something broke | View · Snooze |
gate_result | A validation gate passed or failed | View · Log decision |
policy_block | A write the policy engine refused | Why blocked |
The rules that don’t bend
- A proposal cannot reach
approvedorexecutedwithoutresolved_by— enforced by a database CHECK constraint, not application code. - Approving a spend proposal runs the policy engine: per-product daily caps, network walls (some products can never touch Meta — also a DB constraint), and a portfolio monthly ceiling. A policy refusal beats an approval, whoever clicked it.
resolved_byis the authenticated account’s email. Over MCP, the requiredactorfield names the human whose decision is being relayed; the audit log records both the actor and that the write came via MCP.- Cards expire (default 72h) so the Keeper never acts on stale analysis; a fresh sweep raises a fresh card.
States
pending → approved | rejected | snoozed (until) | expired. Approved and rejected cards
collapse to one-line receipts with who and when. Restore only ever returns a snoozed or
expired card to pending — it can never resolve one.