A correction made in conversation
Most knowledge changes are said, not written. The claims lead mentions that a deductible went up. In this tutorial that sentence becomes a dated source document, the old fact is superseded rather than overwritten, and the graph can still answer what was true in March. It continues from the complete tutorial and its claims project.
1. Capture what was said
oto capture --project claims --title "Collision deductible" \
--by "R. Osei, claims lead" --at 2026-04-01 --about coverage.collision \
--context "asked while reviewing the total loss procedure" \
--statement "The collision deductible went up to 750 dollars on the first of April. The procedure still says 500."
captured inbox/2026-04-01-collision-deductible.md
It is a source document in the inbox.
The date is required and never defaulted to today, because a correction usually refers to when something became true, not when it was typed. The file is in the speaker's words:
# Collision deductible
> **Captured:** 2026-04-01 · **By:** R. Osei, claims lead · **About:** coverage.collision
## Statements
1. "The collision deductible went up to 750 dollars on the first of April.
The procedure still says 500." — R. Osei, claims lead, 2026-04-01
In Claude Code, the capture skill writes this file when you tell the agent a correction. From here the pipeline is the same as for any document.
oto ingest --project claims
2. A supersession, not an edit
The graph holds coverage.collision with a deductible from January. The proposal retires it and adds a new fact that supersedes it. Save as claims/proposals/2026-04-01-collision-deductible.json:
{"source_doc": "2026-04-01-collision-deductible",
"as_of": "2026-04-01",
"nodes": [
{"id": "coverage.collision", "type": "Coverage", "label": "Collision",
"status": "superseded", "valid_to": "2026-04-01", "superseded_by": "coverage.collision.v2",
"change_note": "The collision deductible went up to 750 dollars on the first of April, per R. Osei, claims lead."},
{"id": "coverage.collision.v2", "type": "Coverage", "label": "Collision",
"supersedes": "coverage.collision", "valid_from": "2026-04-01",
"summary": "Damage to the insured vehicle from impact, subject to a deductible of 750 dollars since 2026-04-01.",
"change_note": "The collision deductible went up to 750 dollars on the first of April. The procedure still says 500.",
"evidence": [{"doc": "2026-04-01-collision-deductible", "where": "statement 1",
"quote": "The collision deductible went up to 750 dollars on the first of April."}]}
],
"edges": [
{"from": "policy.p-1001", "rel": "covers", "to": "coverage.collision.v2"},
{"from": "claim.c-5001", "rel": "claims_against", "to": "coverage.collision.v2"}
]}
The old node keeps its id, its summary and its dates, and gains valid_to, superseded_by and a change note. The new node says what it supersedes and from when. The edges that matter are re-pointed at the new fact.
3. Through the gates
oto curate start --project claims
oto curate add --project claims --from claims/proposals/2026-04-01-collision-deductible.json --dry-run
2026-04-01-collision-deductible.json: would add 1 node(s), 0 merged, 1 updated, would add 2 edge(s)
updated coverage.collision valid_to, status, superseded_by, change_note
SUSPECT coverage.collision.v2 same name as coverage.collision: one entity or two?
The dry run flags a SUSPECT: a new id with the same name as an existing node. Here that is intended, so merge. The check then reports that the facts on the old node did not change, only who attests them:
oto curate add --project claims --from claims/proposals/2026-04-01-collision-deductible.json
oto curate check --project claims
candidate would change the graph:
nodes: +1 -0 ~0
edges: +2 -0
provenance changed on 1 node(s): the facts are the same, who attests them is not
node added coverage.collision.v2
edge added claim.c-5001 -claims_against-> coverage.collision.v2
edge added policy.p-1001 -covers-> coverage.collision.v2
ready to apply
oto curate apply --project claims --by "A. Reader, claims operations" \
--note "Collision deductible 750 since April, superseding the 500 figure"
oto build --project claims
oto ingest complete --project claims
ledger: changelog.jsonl (1 retired). `oto curate log` reads it.
4. What is true now, and what was true then
oto query --project claims entity coverage.collision
=== Collision [Coverage] (coverage.collision) ===
⚠️ SUPERSEDED (valid_to=2026-04-01). Current → Collision. Showing current.
=== Collision [Coverage] (coverage.collision.v2) ===
status=current · as_of=2026-04-01 · valid_from=2026-04-01 · source_doc=2026-04-01-collision-deductible
Damage to the insured vehicle from impact, subject to a deductible of 750 dollars since 2026-04-01.
Sources: 2026-04-01-collision-deductible
Evidence:
- 2026-04-01-collision-deductible statement 1: "The collision deductible went up to 750 dollars on the first of April."
Asking for the old id says it was superseded and shows the current fact, which cites the spoken statement and names who said it. The old fact is still there:
oto query --project claims entity coverage.collision --history
oto query --project claims entity Collision --as-of 2026-03-01
oto query --project claims stale
=== Collision [Coverage] (coverage.collision) ===
status=superseded · as_of=2026-01-01 · valid_from=2026-01-01 · valid_to=2026-04-01 · source_doc=sample
Damage to the insured vehicle from impact, subject to a deductible.
status_counts: current=16, superseded=1
Superseded (1):
- Collision (coverage.collision) valid_to=2026-04-01 → coverage.collision.v2
--as-ofa March date returns the January fact, because that is what was true then. stale lists every superseded fact and what replaced it. Nothing was lost.
Where this matters
- A regulator asks what the deductible was on the day of a March incident. The graph answers with the March fact and its source.
- A reader who doubts the 750 figure sees who said it and on what date, and knows who to ask.
- A document that still says 500 is visibly older than the statement that supersedes it; the vet-provenance skill audits exactly this.
Next: ask the graph, every question it answers, at the terminal and over HTTP.