Agent Digests
Daily and weekly LLM-generated summaries of what each agent actually did — precomputed server-side for opted-in tenants, read from the dashboard or the reports API.
Agent Digests answer the operator question "what did my agents do yesterday / last week?" without anyone reading transcripts. On a schedule, the platform generates an LLM-written activity digest per agent — what it worked on, how much, and how it went — and stores it for cheap retrieval.
Digests are read-side reporting only: unlike the Interviewer (which writes memories back into the store), a digest writes nothing an agent can recall. The two are complementary — the Interviewer feeds the memory, digests brief the humans.
Opt-in and off by default
Digests are opt-in per tenant via agent_digest.enabled in the tenant's org settings. A tenant that hasn't opted in never appears in the generation fan-out and pays zero cost — no LLM calls, no storage.
How they're generated
Generation runs on the core-operations clock as two resident ticks:
| Tick | Cadence | Window |
|---|---|---|
agent-digest | daily | the previous day |
agent-digest-weekly | weekly | the previous full Monday-to-Monday week |
Each tick POSTs POST /admin/reports/agent-digest/run?period=day|week (admin-only), which enumerates opted-in orgs and generates inline with bounded concurrency. That is the write path; reads never compute.
Reading digests
- Dashboard — the Reports screen's Agent activity view (org-admin only).
- API —
GET /api/v1/reports/agent-activity, precomputed and served from storage:
| Query param | Meaning |
|---|---|
period | day (default) or week |
scope | own (one tenant) or org (every tenant the credential may read) |
tenant_id | home tenant, for scope=own |
agent_id | filter to a single agent |
as_of | ISO date/datetime for a past snapshot; absent = latest |
The endpoint is gated on cross-tenant read privileges — single-tenant callers reach it through the enterprise org-report proxy instead. Before the first scheduled run has completed, it returns digests: [] with meta.generated_at: null (not a 404) — an empty state, not an error.
Where to look in the source
- Generation service:
core-api/src/core_api/services/agent_digest.py - Read + admin-run endpoints:
core-api/src/core_api/routes/reports.py - Scheduler ticks:
core-operations/src/core_operations/app.py
Protocol
How a durable trail becomes typed memories — windows, the forward-only watermark, masking, chunked map-reduce, and idempotent writes. The same contract for every capture source.
For Agents
The MemClaw skill — the canonical prompt LLM agents follow when they have memclaw_* tools. Fetch the plain Markdown at /docs/agents.md.