<!--
  Full-page Markdown export (rendered HTML → GFM).
  Source: https://neotoma.io/fr/inspector/observations-and-sources
  Generated: 2026-04-27T12:48:30.933Z
-->
# Inspector, Observations & sources

Snapshots are derived; observations and sources are the truth. Inspector exposes both as first-class browsable surfaces so operators can audit exactly which writes produced the current snapshot, and which raw artifact (file, API response, signed request) backed each write.

## Observations list

Observations are immutable. Every `store`, `correct`, or merge produces one or more rows here, and *none of them are ever mutated or deleted*. The list at `/observations` shows them in reverse chronological order with filters for entity, field, agent, trust tier, and `observation_source` (sensor, workflow\_state, llm\_summary, human, import).

inspector.neotoma.io/observations?entity=ent\_4ad…

Inspector

Neotoma

Dashboard

Conversations

Turns

Compliance

Activity

Feedback

Entities

Observations

Sources

Relationships

Graph Explorer

Schemas

Timeline

Interpretations

Agents

Agent grants

Settings

Observations

Subscription · Vercel · 8 rows

obs\_source: anyGroup by field

| When | Field | Value | Agent | Source | Reducer |
| --- | --- | --- | --- | --- | --- |
| 12:41 | amount | 20.00 | claude-code | llm\_summary | winner |
| 12:38 | category | subscription | operator | human | winner |
| 12:30 | merchant | Vercel | claude-code | llm\_summary | superseded |
| 12:30 | merchant | Vercel Inc. | claude-code | llm\_summary | winner |
| 11:08 | amount | $20 | ingest-pipeline | import | superseded |

The full immutable history for one entity. The 'reducer' column shows which row currently wins for each field.

◆

## Reducer transparency

Each observation displays which row currently "wins" for its field. The reducer order is documented and visible: higher `source_priority` wins, with `observation_source` as the tie-break (sensor < workflow\_state < llm\_summary < human < import). Inspector shows this in the row metadata so operators don't have to guess why a "human" correction did or did not override an automated row.

◆

## Source registry

Every observation that came from an external artifact carries a `source_id`. The Sources page (`/sources`) lists those artifacts: PDFs, CSVs, JSON dumps, screenshots, signed API responses, even raw email bodies. Each row links to `GET /sources/:id/content` so you can open the original file inline (browser-viewable types) or download it.

inspector.neotoma.io/sources?type=email

Inspector

Neotoma

Dashboard

Conversations

Turns

Compliance

Activity

Feedback

Entities

Observations

Sources

Relationships

Graph Explorer

Schemas

Timeline

Interpretations

Agents

Agent grants

Settings

Sources

2,154 artifacts · 312 unique

mime: application/pdfsize < 1MB

vercel-2026-04.pdf

ingested by claude-code · 12 observations downstream

application/pdfOpen

wise-transfer-58812.json

ingested by ingest-pipeline · 6 observations downstream

application/jsonOpen

screenshot-2026-04-22.png

ingested by cursor-agent · 3 observations downstream

image/pngOpen

calendar-week-17.ics

ingested by ingest-pipeline · 14 observations downstream

text/calendarOpen

Each source row preserves the original artifact, its mime type, the agent that ingested it, and downstream observations.

◆

## Source detail

Source detail pages show the artifact's metadata (mime type, size, ingestion agent, idempotency key, when it was first observed) and the full list of observations that cite it. The combined-store contract guarantees each `file_path` / `file_content` persisted via `store_structured` becomes one row here, making "what raw artifact backs this fact?" a one-click question.

◆

## Provenance chains

From any observation row, you can trace forward (what entity it contributed to, which fields it currently or once won) or backward (which source artifact, which agent, which trust tier). This is the same chain the per-field provenance hover on [Entities](/inspector/entities) surfaces, the difference is direction: that view starts from the snapshot, this one starts from the writes themselves.