OTO
tutorials

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.

Said"the deductible went up to 750 in April"
→
Captureda dated source document, in the speaker's words
→
Supersededthe old fact keeps its dates and gains valid_to; the new one cites the statement
→
Askednow: 750 · as of March: 500 · history: both
A correction is a new fact that supersedes an old one. Nothing is overwritten, so what was true then is still answerable.

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-of

a 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.