Asphodel + Tiresias-ZT · Data Analyst

The governed data-analyst agent

Triage and synthesis that runs at zero marginal cost on its free_large home, degrades cleanly to a self-hosted ollama_oss floor, and signs every token into a durable audit chain.

Asphodel + Tiresias-ZT · ACME Corporation
The role

Synthesis is where cost and trust collide

The data-analyst is a high-frequency middle node: it takes the research-lead's hand-off, condenses it, and feeds the content-editor. Exactly the unglamorous, high-volume work that must run for free — yet can never be allowed to hallucinate, leak across tenants, or drift unwatched.

The pressure

Every synthesis job is another LLM call. At fleet scale, routing this workload to a paid frontier model is the difference between cents and five-figure monthly spend.

The non-negotiable

Cheap cannot mean ungoverned. The same call must pass deny-by-default policy, land in an RLS-isolated tenant, and be signed into the audit chain — free or not.

The workforce

367 agents under one zero-trust policy

The data-analyst is one tenant in a live fleet mapped like-for-like to the real Acme org — every call enrolled, policy-gated, and audited.

367
governed agents
360
fleet agents
325,154
directory principals
28
departments · 10 regions
Source: CP registry (367 agent tenants, postgres) · Samba-AD directory sync — 120,120 humans + 205,034 NHI identities across 626 roles.
Position

One node in a 14-edge hand-off DAG

Among the 7 showcase agents, the data-analyst runs on a fixed schedule and sits mid-chain — downstream of intelligence gathering, upstream of publishing and compliance.

threat-intel-researcher security-analyst soc-lead research-lead data-analyst content-editor compliance-officer
Source: personas.json · container acme-runner-sched · runner.py schedule --interval 3600 (hourly).
Routing

Free by default, degrade by design

The tier ladder is the mechanism that makes this role cheap and reliable at once. Home is free; the floor is self-hosted; keywords are the only thing that buys a costlier tier.

HOME free_largeDefault tier for routine triage and synthesis — an OpenRouter free model, $0/call. $0.00
FLOOR ollama_ossReliable degrade target on failure — self-hosted gpt-oss:120b via Ollama Cloud. $0.0015
FALLBACK Fallback-to-floor on LLMErrorAny home-tier failure (e.g. free-tier 429) drops the job to the ollama_oss floor — not to nothing. auto
ESCALATE Keyword escalation+incident / +breach / +critical push the job up toward the ceiling tier. on-match
Source: personas.json tiering — free-homed floor = ollama_oss for reliable degrade; routing favors free/Ollama.
Live proof

One job, watched degrade cleanly

A real synthesis job: the free_large home returns a 429 under free-tier saturation, the runner catches the LLMError, and the job completes on the ollama_oss floor — still fully governed.

domain brief free_large 429 saturated fallback-to-floor ollama_oss · gpt-oss:120b governed CoT + memory write
429
home-tier response
$0.0015
degraded call cost
1
RLS-isolated write
100%
audit-chain coverage
Source: tzt_usage → acme-roi-economics board. hermes-405b:free chronic 429 → deterministic degrade to gpt-oss:120b at $0.0015/call.
Enforcement

Deny-by-default, then forwarded verbatim

Whichever tier answers, the call takes exactly one path. The PEP validates, evaluates policy, and only on allow forwards the request unchanged to this agent's own soul-svc tenant.

runner mints HS256 cap-token PEP :8343 acme-soul-svc PostgREST /rest/v1 acme_soul · RLS
VERIFY X-Tiresias-Api-Key + X-Capability-TokenTenant api-key plus a per-agent HS256 token minted from a 64-hex capability secret. deny-by-default
ISOLATE Per-agent soul-svc tenantFORCE RLS on _memories / _soul_api_keys; cross-tenant reads require SET ROLE service_role. RLS forced
SIGN SoulKey Ed25519 audit chainEvery allowed call signed and shipped to CP; durable WAL at /data/audit-wal. → CP
Source: governed request flow — PEP (TZT_ROLE=proxy, site acme-site) → acme-soul-svc → acme_soul (RLS forced).
The job

Four steps, every hour, all recorded

A data-analyst run is deterministic and self-documenting — it leaves behind reasoning, a memory, and a usage record the ROI board reads.

01 Domain briefThe scheduler feeds the agent its synthesis brief on the hourly interval. runner.py
02 Tiered LLM callRoutes to free_large home; degrades to ollama_oss on error; escalates on keyword match. 9 tiers
03 Governed CoT + memory writeChain-of-thought captured and a memory written into the RLS-isolated tenant; ContentInspection requires source_type + authored_by. /v1/memory/write
04 Usage reportTokens and cost posted to /cp/usage/report → tzt_usage → Grafana. /cp/usage/report
Source: fleet/showcase job lifecycle — domain brief → tiered LLM → governed CoT + memory write → usage report.
Governance

Signed, isolated, and watched

Three independent controls wrap every call this agent makes — none of them optional, none of them bypassable by choosing a cheaper tier.

Signed audit

SoulKey Ed25519 chain per call, durable WAL at /data/audit-wal, shipped to the control plane. RFC5424 syslog → Promtail:1514 → Loki for SIEM.

Tenant isolation

The agent's writes land only in its own acme_soul tenant. FORCE RLS on Cloud SQL means even postgres is subject to row-level policy.

SoulWatch turns behavioral drift into auto-quarantine — a misbehaving analyst is contained without a human in the loop.
Source: PEP audit chain + SoulWatch (shared postgres quarantine store) · analyst console at pdp.tiresias.watch /admin.
Economics

The self-host-versus-API answer

The ROI board makes the case in one column. The data-analyst's home and floor sit at the bottom of it — the tiers it actually uses cost cents-of-cents while frontier tiers are reserved for escalation.

Model / tierObserved $/callRelative
opus-4.8 (paid ceiling)$0.19
sonnet-4.5 (paid)$0.03
deepseek-v4-pro (ollama_deep)$0.002
gpt-oss:120b (ollama_oss · this floor)$0.0015
Llama-3.3-70B (HF)$0.0012
gemma-4-31b:free (free_large · this home)$0.00
Source: Grafana ROI dashboard uid acme-roi-economics · per-model $/1M-token economics on tzt_usage.
Reliability

Why the floor is self-hosted

Free is the right home, but free saturates. The chronic 429 on free-tier models is precisely why the floor is an owned, self-hosted tier rather than another rate-limited freebie.

$0
free_large home cost
429
chronic saturation signal
$0.0015
owned floor · gpt-oss:120b
127×
cheaper than opus ceiling
A $0 home with a $0.0015 self-hosted floor keeps this agent running when the free tier can't — at a fraction of a cent per job.
Source: acme-roi-economics — hermes-405b:free chronic 429 → the self-host case; gpt-oss:120b $0.0015 vs opus $0.19/call.
The close

Cheap, reliable, and provably governed

The data-analyst agent shows the whole thesis in one workload: routine synthesis runs free, degrades to a self-hosted floor under load, and every call is policy-gated, RLS-isolated, and signed — no exception for being cheap.

HOMEfree_large — $0/call routine triage & synthesis$0.00
FLOORollama_oss (gpt-oss:120b) — deterministic degrade$0.0015
TRUSTdeny-by-default · RLS forced · Ed25519 audit chainsigned
SCALE1 of 367 governed agents on the live ACME instance367
Asphodel + Tiresias-ZT · ACME Corporation
1 / 1