MemClaw / docs

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:

TickCadenceWindow
agent-digestdailythe previous day
agent-digest-weeklyweeklythe 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).
  • APIGET /api/v1/reports/agent-activity, precomputed and served from storage:
Query paramMeaning
periodday (default) or week
scopeown (one tenant) or org (every tenant the credential may read)
tenant_idhome tenant, for scope=own
agent_idfilter to a single agent
as_ofISO 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