Neotoma

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…
Observations
Subscription · Vercel · 8 rows
obs_source: anyGroup by field
WhenFieldValueAgentSourceReducer
12:41amount20.00claude-codellm_summarywinner
12:38categorysubscriptionoperatorhumanwinner
12:30merchantVercelclaude-codellm_summarysuperseded
12:30merchantVercel Inc.claude-codellm_summarywinner
11:08amount$20ingest-pipelineimportsuperseded
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
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 surfaces, the difference is direction: that view starts from the snapshot, this one starts from the writes themselves.