Ask-rate dashboards
Track how often agents needed a human yes, by project and action type, straight off the decision events.
outcome = ask · grouped weeklyContextDB + your warehouse
Snowflake and Databricks are where your company analyzes what happened. An agent mid-call needs something different: a scoped, trusted answer to "may I act on this?" in the time a caller will tolerate. Run both, wired together, each doing the job it is built for.
The loop
The framing
Data platforms are approaching agent memory from the storage side: managed Postgres with vector search, checkpointed conversation state, agents attached to the data cloud. The ContextDB research paper calls this "giving agents a hard drive when they need a brain": durable storage and similarity search, without the memory semantics above them.
Storage does not decide what is worth remembering, notice when a fact goes stale, distinguish a confirmed instruction from an overheard maybe, or refuse to authorize an action. Those are lifecycle and trust problems. They live in a memory layer, wherever the bytes live.
| Question at runtime | Warehouse | Memory layer |
|---|---|---|
| What did this caller confirm? | Joinable, eventually | One scoped call, now |
| May the agent act on it? | Not its job | act · ask · abstain |
| Who attested, with what evidence? | If you built it | Decision record, always |
| How did agents behave last quarter? | Exactly its job | Feeds it the events |
Pattern 1 · Decisions out
Register a webhook endpoint and every decision arrives as a signed event carrying the outcome, reason, and evidence IDs, never memory content. Land the events in Snowflake or Databricks the same way you land any webhook stream, and your analysts get an agent-behavior table nobody had to design: ask rates by project, abstain reasons, confirmation latency, evidence density per action.
# signed webhook event → your ingest → warehouse table { "type": "decision.recorded", "data": { "decision": { "kind": "action_recall", "outcome": "ask", "reason": "tentative preference only", "evidence_ids": ["mem_7f3a"], "user_id": "caller-1042" } } } -- then, in SQL: SELECT outcome, COUNT(*) FROM agent_decisions WHERE recorded_at > DATEADD(day, -7, CURRENT_DATE) GROUP BY outcome; -- act / ask / abstain mix, weekly
Pattern 2 · Facts in
Your warehouse already knows things agents should remember: plan
tier, service history, account standing. Load them with
remember_many and third-party provenance. They ground
conversations immediately, and the gate still knows they were derived
from systems, not confirmed by the person, so account-changing
actions still ask when they should.
# nightly job: warehouse rows → sourced memories rows = warehouse.query( "SELECT customer_id, plan, last_visit FROM crm_profile" ) for row in rows: await cdb.remember_many(row.customer_id, [ {"content": f"plan tier is {row.plan}", "source": "third_party", "confidence": 0.9}, {"content": f"last service visit {row.last_visit}", "source": "third_party", "confidence": 0.9}, ]) # third_party grounds the conversation; # it does not impersonate a user's confirmed yes
Worked example
A warehouse-computed churn score becomes a sourced memory, grounds a save offer, and the billing change still waits for the customer's yes.
Pattern 3 · Close the loop
Every ask is a labeled example of uncertainty. Every abstain is a labeled gap. Join decisions against downstream outcomes in the warehouse (was the booking kept? was the credit disputed?) and you have the eval dataset teams usually pay to fabricate: real actions, real evidence, real consequences. Use it to tune policies and prove to your risk team that the gate asks exactly when it should.
Track how often agents needed a human yes, by project and action type, straight off the decision events.
outcome = ask · grouped weeklySample act decisions and review their evidence IDs against source systems. The trail is already attached.
decision → evidence_ids → reviewReplay last month's decisions against a proposed policy change before it ships. The log is the fixture.
decisions as eval fixturesQuestions
Different layer. Managed Postgres with vector search and checkpointing is storage substrate; ContextDB is memory semantics: provenance, lifecycle, and the action gate. The open SDK can even use Postgres as a pluggable backend. The warehouse keeps every job it has today.
Scoping and semantics, not just speed. An agent's memory read must be partition-isolated per org, project, and user, and must answer trust questions the warehouse schema was never designed to encode: source, confidence, confirmation status, and whether this evidence passes policy for this action.
No. Decision events carry outcomes, reasons, and evidence IDs, never memory content. Analysts see how agents behaved; the remembered facts stay in their partitions. See the security model for the boundaries.
Register a webhook endpoint and land your first act, ask, abstain table.