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

TypeWhat it isActions
proposalThe Keeper wants to change spendApprove · Dismiss · Snooze
insightWorth knowing; nothing to approveGot it · Snooze
alertSomething brokeView · Snooze
gate_resultA validation gate passed or failedView · Log decision
policy_blockA write the policy engine refusedWhy blocked

The rules that don’t bend

  • A proposal cannot reach approved or executed without resolved_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_by is the authenticated account’s email. Over MCP, the required actor field 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.