Witnora observability answers assurance questions from records the product already owns: what an agent attempted, which policy decided it, whether approval was required, what the target system actually reported, and whether the evidence chain is complete. It is not a replacement for application logging, OpenTelemetry storage, LangSmith, or infrastructure APM.
One run can correlate five entity types without copying them into a second database:
| Entity | Purpose |
|---|---|
run |
One MCPBench, Tripwire, release-gate, runtime, or custom execution. |
event |
An ordered agent, tool, policy, fault, or verification observation. |
action |
A proposed SUBMIT, PAY, SEND, or UPDATE action and policy decision. |
approval |
The human decision linked to a high-risk action. |
evidence |
A hash-addressed artifact linked to the run or action. |
Runs declare 32-hex-character traceId and 16-hex-character rootSpanId
values. Events and actions may declare their own spanId and parentSpanId.
These identifiers are W3C/OpenTelemetry-compatible, but Witnora does not
claim to be an OpenTelemetry backend or accept arbitrary telemetry volume.
Event sequences are append-only. A batch may contain at most 500 events, each payload is limited to 64 KiB, and an existing sequence cannot be rewritten. The trace read model reports missing sequence numbers, mixed trace IDs, missing root context, and orphan parent spans instead of silently presenting a complete timeline.
Customers install one maintained package and authorize a project once:
npx witnora@latest onboard --project <project-id>
Onboarding creates a bounded local Gateway client and keeps the Hosted credential, source-signing key, queue, and private discovery inside the customer-owned environment. Agents send structured run and action records to that local boundary; customers do not install a separate SDK or embed a Hosted API key in agent code.
The generated Gateway and CLI emit the same structured model for current products:
tripwire.fault.assertion for each deterministic browser fault;mcpbench.policy.violation and policy assertions;onegent.policy.decision, onegent.approval.decision, and
onegent.outcome.verification; andPayloads are recursively bounded before upload and suspicious credential field
names are replaced with [REDACTED]. This is a defensive guard, not permission
to put customer secrets into event payloads.
GET /v1/projects/{projectId}/runs/{runId}/analysis returns the run, ordered
events, trace-correlated actions and approvals, linked evidence, evidence
completeness, and agentcert.run_observability.v0.1.
GET /v1/projects/{projectId}/observability?days=30 returns
agentcert.observability_snapshot.v0.1 for a 7, 30, or 90-day window:
CURRENT rate;Aggregate reads are bounded to 10,000 records per entity. The response exposes
truncated.any and per-entity truncation flags whenever that safety bound is
reached, so partial metrics cannot masquerade as complete.
The Hosted Overview renders the aggregate assurance window. The Runs workspace renders one nested trace with an explicit risk strip and integrity diagnostics. It correlates the original database rows at read time; there is no duplicate trace service or parallel analytics identity.
Postgres remains the system of record. Existing JSONB payloads hold framework-specific attributes, while indexed project/time/type, trace/risk, and approval/time columns support the bounded read paths. In-memory storage is used only by tests and local development.
Project API keys need only runs:write and events:write to collect data.
Continuous CI additionally needs runs:read and evidence:write to verify
Hosted CURRENT. Reading correlated runtime actions requires actions:read;
a continuous-CI key cannot retrieve action details.
It does not prove that an uninstrumented action was captured, that an agent could not bypass an optional recorder, or that an event payload is truthful. Those stronger claims require the enforced gateway, customer-owned collector, source signatures, mandate binding, independent outcome probes, and server attestation described in the action-assurance protocol.