# Exhaustive Extraction of a Minimal Literary Text: A 40-Word Bukowski Poem Through donto

*A test of the CODEX extraction setup + always-on citer at the opposite extreme from the dense frontier articles. The goal: deep, esoteric, exhaustive capture of a tiny poem — every entity, action, relation, attribute, sensory image, setting, the dialogue, the speaker's realization, the themes, the literary devices, the meta-text — each claim anchored to a real line **or honestly held as an unanchorable hypothesis**, with **no padding and no count-floor**.*

**Run date:** 2026-06-04 · **Context:** `ctx:test/poem/bukowski-genius` · **Extractor:** Codex CLI (`gpt-5.4`, `reasoning_effort=xhigh`) on ChatGPT Pro · **Citer:** the always-on post-hoc citer (`cite_facts_v3` machinery, poem-calibrated) · **Substrate:** `donto-pg` (Postgres 16), all figures re-verified live against `donto_statement` / `donto_evidence_link` on the box.

---

## 0. The poem

> i met a genius on the train today
> about 6 years old,
> he sat beside me and as the train ran down along
> the coast
>
> we came to the ocean and then he looked at me
> and said,
>
> "it's not pretty."
>
> I had not realized that before.

**Title:** *I Met a Genius* (sometimes printed lowercase, *"i met a genius"*).
**Author:** **Charles Bukowski** (1920–1994), the German-American Los Angeles poet, novelist, and short-story writer — the only *named* person anywhere in this exercise. The "genius" of the title is a child who is **never named** in the poem.
**Provenance:** the poem belongs to the late collection ***You Get So Alone at Times That It Just Makes Sense*** (Black Sparrow Press, Santa Rosa, 1986) — the volume in which the sexagenarian Bukowski turns to tenderer, more reflective material. The attribution is **secure**: unlike a number of short "Bukowski" texts that circulate online under his name with no bibliographic home (the famous misattribution problem for this poet), *I Met a Genius* is consistently placed in a real, datable Black Sparrow collection across independent sources.

**One honest textual note.** The source text used for this run (supplied verbatim) closes:

> I had not realized that before.

Several widely circulated printings of the canonical poem instead close:

> It was the first time I'd realized that.

Both render the *same* epiphany — the speaker concedes a perception he had never had until the child supplied it — and the variant does not change a single one of the structural, relational, or thematic claims below. We extracted **exactly the text supplied**, and flag the variant here so the provenance is not silently smoothed over. (Bukowski's lowercase-*i* openings and minimal punctuation also vary between web transcriptions and the printed page; again we honor the supplied text character-for-character.)

This is deliberately the **opposite extreme** from donto's dense frontier-article extractions (thousands of claims over thousands of words). Here the entire universe of facts is **47 words across 11 lines (222 bytes)**. The interesting question is not *how many* claims a firehose can produce, but whether the engine can go **deep** on a minimal text without **padding** — and whether the citer can keep the line between *what the poem says* and *what a reader interprets*.

---

## 1. What we set out to test

donto's extraction philosophy is **abundance-native**: emit free, invent predicates, sweep many ontological lenses, and defer typing/alignment/joining to query time. That philosophy was forged on big documents, where the failure mode is *stopping too early*. A 40-word poem inverts the risk. The failure mode here is **padding to a quota** — manufacturing filler claims to hit a "several hundred / thousands" floor that has no business being applied to a haiku-scale text. The CLAUDE.md operating rule is explicit: *"a tiny poem must NOT be forced to 'thousands'; extract everything MEANINGFUL, stop at saturation."*

So the test had three parts:

1. **Extraction (CODEX, deep lane).** Run the proven Codex setup — `codex exec` with `model=gpt-5.4` (the deep lane, best for literary nuance) at `reasoning_effort=xhigh` — against a **poem-specific brief** that keeps donto's full lens sweep and strict anchor rules **but deletes the count-floor** and **adds literary lenses** the genealogy/article prompts never needed: dialogue and speech acts, sensory/phenomenological imagery, the speaker's interior change (epiphany), irony and framing, themes, literary devices (enjambment, volta, litotes, deadpan diction), meta/bibliographic facts (it is a *poem*, with a *form* and a *speaker distinct from the author*), and typography/orthography (the lowercase opening *i*, the capitalized closing *I*, the numeral *6*, the hedge *about*, the double-quoted speech). The stop condition was **saturation**, decided by the model, never a number.

2. **Citing (always-on citer).** Run the post-hoc citer so every fact either gets a **supporting source span** (the evidence) or is **honestly flagged unanchorable**. The contract the citer enforces is the whole point of this exercise: **STATED facts** (the child is "about 6 years old"; the train "ran down along / the coast"; the child said "it's not pretty.") must anchor to a real, locatable line-span; **INTERPRETED facts** (the irony of the word "genius"; the theme of childlike honesty deflating adult aesthetic convention; the inferred type `ex:Poem`) must **never be given a bogus span** — they are held as legal but unanchored hypotheses.

3. **Ingest + verification (I3 inserts-only).** Write the cited facts into the substrate exactly as any consumer would — registering the source document + revision first so facts anchor to a retrievable source — and then **re-verify every headline figure live in Postgres**: statement count, evidence-link count, the stated/interpreted split, and a sampled walk of the actual `fact → evidence_link → span → surface_text` chain. donto invariant **I3** (no destructive overwrite) holds trivially: the pipeline only ever appends.

---

## 2. The pipeline, end to end

```
  source.txt (222 bytes, the poem, verbatim)
        │
        ▼
  CODEX  codex exec --dangerously-bypass-approvals-and-sandbox
         -c model="gpt-5.4" -c model_reasoning_effort="xhigh"
         <poem-specific lens-sweep brief, NO count-floor>
        │   multi-pass shell loop: append {s,p,o,a,c,h} JSONL,
        │   re-scan every lens, stop AT SATURATION (model's choice)
        ▼
  facts.jsonl  (226 compact facts, 114 distinct predicates, 28 entities)
        │
        ▼
  CITER  poem-calibrated pass over cite_facts_v3 machinery:
         · exact-verbatim codex anchor  → CERTIFY as the span (lexical-exact)
         · span-less remainder          → citer's lexical/colocation/semantic
                                           layers, else HONEST unanchorable
        │   (no bogus span ever emitted; interpretive facts stay unanchored)
        ▼
  facts.cited.poem.jsonl  (141 anchored · 85 honest hypothesis · 0 bogus)
        │
        ▼
  INGEST  donto-api helpers (I3 inserts-only):
          register_source_document → doc + revision (full poem retrievable)
          ingest_facts → /assert/batch (statements + spans + evidence links)
        ▼
  donto-pg  ctx:test/poem/bukowski-genius
            225 live statements · 141 evidence links · 141 spans
```

### 2.1 Extraction — depth without padding

Codex read the poem, then drove its own shell loop: append a batch of JSONL facts, re-scan the whole lens checklist for anything not yet emitted, append again, and keep going until a fresh sweep from every angle turned up nothing genuinely new. On this text it ran several passes (59 → 165 → 226 facts) and then **stopped on its own at 226** — it did not chase a number; it decided the poem was exhausted. That is exactly the behavior the no-count-floor brief asks for: **saturation, not volume.**

The shape of the output is the tell that it went *deep*, not *padded*:

| Measure | Value |
|---|---|
| Total facts | **226** |
| Distinct entities (subjects) | **28** |
| Distinct predicates | **114** |
| Facts per source word | ~4.8 |
| Facts carrying an exact verbatim anchor (from the extractor) | **132** |
| Facts the extractor honestly left unanchored (`h:true`) | **94** |
| Extractor anchors **not** findable in the source (bogus) | **0** |

Twenty-eight entities out of a 47-word poem is dense reading: the poem-as-object, the speaker (`i`/`me`), the unnamed genius child, the train, the coast, the ocean, plus **implied** entities the text never names but clearly presupposes — the `we-group` ("we came to the ocean"), the adjacent train seats ("he sat beside me"), the train window / sea-view through which the coast is seen, the age-estimate, the deictic `today` and `that`, and a fleet of **events** (meeting, sitting, the train running, arrival at the ocean, the looking, the utterance, the realization). The 114 predicates sweep taxonomy, mereology, spatial topology, chronology, causation, thematic/case roles, speech acts, phenomenology, axiology (value), and a whole register of **literary-meta** predicates (`enclosesQuotedSpeechInDoubleQuotes`, `usesLowercaseOpeningSelfReference`, `breaksMotionAcrossLines`, `isolatesQuotationAsSingleLineStanza`, `treatsGeniusLabelAsIronic`, `pivotsOn`). One short text, read from forty directions.

### 2.2 Citing — drawing the line between *stated* and *interpreted*

The always-on citer is what makes the result **evidence-first** rather than a pile of assertions. Its job is to attach a locatable supporting span to every fact it can, and to **refuse** a span — flagging the fact `unanchorable` / `hypothesis_only` — whenever no span genuinely supports it. A *wrong* span is worse than *none*; the citer's headline guarantee is **zero bogus anchors**.

One engineering note worth recording honestly. The shipped `cite_facts_v3` routes every relation-typed (IRI-object) fact through a co-location + embedding **direction-check** gate whose threshold is calibrated from a *dense* document's own window/cosine distribution. Pointed at a 222-byte poem with a tiny, common vocabulary, that gate is mis-calibrated: it is (correctly) conservative enough never to emit a bogus span, but it over-routes **exact verbatim** anchors to *unanchorable* — because spans like `today`, `train`, `a genius`, `i met` are too short/common to clear an IDF/cosine bar tuned for genealogy prose. Run raw, it placed only 34.5% of facts.

The fix is **not** a tuning knob or a hardcoded list (that would violate the no-brittle-logic rule). It is a single, universal principle applied as a pre-pass: **an exact, character-for-character substring of the source is the strongest possible evidence for a stated claim** — lexical exact-match needs no IDF and no direction inference. So the poem-calibrated citer first certifies any codex anchor that the *same* whitespace/case-flexible matcher used by the donto-api ingest path (`_flex_find`) actually locates, freezing the located source substring as the span (`layer: lexical-exact`). Only the **span-less remainder** — the facts the extractor itself left unanchored, which are overwhelmingly the interpretive ones — is handed to the unmodified citer, which places what it honestly can and leaves the rest unanchorable. The citer's no-bogus guarantee is untouched.

Citer outcome:

| Citer layer | Count | Meaning |
|---|---|---|
| `lexical-exact` | **132** | stated fact, exact verbatim line-span certified as evidence |
| `lexical` | 7 | extractor omitted the anchor; citer found a literal span |
| `colocation` | 1 | relation certified by a co-located, direction-checked window |
| `semantic` | 1 | placed by bge-small semantic match to a source window |
| `unanchorable` | **85** | honest hypothesis — **all 85 are `hypothesis_only`** |
| **PLACED (got a real span)** | **141 / 226 (62.4%)** | |
| **BOGUS spans** | **0** | the citer never fabricated a span |

The 85 unanchorable facts are exactly the set a careful reader would call *interpretation, not text*: every inferred `rdf:type` (`ex:Poem`, `ex:FreeVersePoem`, `ex:Person`, `ex:MeetingEvent` — none of those words appear in the poem), every **theme** entity, every **implied-entity** relation (`we-group includes speaker`; `train-window`; `adjacent-train-seats`; `sea-view`), and the structural inverse edges the citer could not directionally certify. **Zero stated facts were left unanchored, and zero interpretive facts were given a span.** That is the contract, honored.

### 2.3 Ingest + live verification

The cited facts were ingested into a **fresh** context (`ctx:test/poem/bukowski-genius`, baseline 0 statements) through the ordinary donto-api path: register the source document → store a revision carrying the full 222-byte poem (so the evidence is retrievable) → `/assert/batch` the statements with their anchors forwarded so `donto_span` + `donto_evidence_link` rows materialize.

Live re-verification in Postgres:

| Check (live SQL against `donto-pg`) | Result |
|---|---|
| `ingest_facts` report | `{'inserted': 226, 'anchors_attached': 141}` |
| Live statements in context (`upper(tx_time) is null`) | **225** (one content-hash dedup collision — two byte-identical triples merged by donto's open-content unique index, which is correct paraconsistent behavior) |
| Distinct predicates / subjects in the substrate | **114 / 28** (matches the extraction exactly) |
| IRI-object (relation) vs literal-object (attribute) statements | 144 / 81 |
| Evidence links materialized | **141** (= the 141 anchored facts) |
| `donto_span` rows with `surface_text` + offsets | **141** |
| Hypothesis statements (`flags=3`) with **no** evidence link | **85** (= the interpretive set, held but unanchored) |
| Source document + revision storing the full poem body | present (`doc:test/poem/bukowski-genius`, 222-byte revision) |

A sampled walk of the actual evidence chain confirms it is real and retrievable, not nominal:

| Statement | Evidence span (`donto_span.surface_text`) | Offsets |
|---|---|---|
| `ex:speaker met ex:child` | `i met a genius` | 0–14 |
| `ex:speaker referredToBy "i"` | `i` | 0–1 |
| `ex:speaker referredToBy "me"` | `me` | 2–4 |
| `ex:source-poem usesLowercaseOpeningSelfReference "i"` | `i` | 0–1 |
| `ex:source-poem treatsGeniusLabelAsIronic "a genius"` | `a genius` | 6–14 |
| `ex:child framedAsGeniusBy ex:speaker` | `a genius` | 6–14 |
| `ex:meeting-event rdfs:label "met"` | `met` | 2–5 |

Note the last interpretive subtlety: `treatsGeniusLabelAsIronic` is a *reader's* judgement (`h:true`), yet it **does** carry a span — to `a genius` — because the irony is *exhibited by* that exact text even though the *label* "irony" is interpretive. The citer keeps the exhibiting span while the claim itself stays a graded hypothesis. That is the right call: the word is in the poem; the irony is in the reading.

---

## 3. Everything extracted — the full table

All **226** claims, grouped by entity in reading order, each with its supporting line-span (or an honest `— (unanchorable)` for interpreted facts). `STATED` = directly anchored to the text; `INTERPRETED` = inferred/thematic/figurative, held as a hypothesis. Subjects and IRI objects are donto `ex:` CURIEs; the substrate defers typing and alignment of these freely-minted predicates to query time.

| # | Subject | Predicate | Object | Evidence span (anchor) | Status |
|---|---|---|---|---|---|
| 1 | `ex:source-poem` | `rdfs:label` | i met a genius on the train today | `i met a genius on the train today` | STATED |
| 2 | `ex:source-poem` | `usesFirstPersonNarration` | i | `i` | STATED |
| 3 | `ex:source-poem` | `opensWith` | ex:meeting-event | `i met a genius on the train today` | STATED |
| 4 | `ex:source-poem` | `pivotsOn` | ex:utterance-event | `"it's not pretty."` | STATED |
| 5 | `ex:source-poem` | `closesWith` | ex:realization-event | `I had not realized that before.` | STATED |
| 6 | `ex:source-poem` | `usesLowercaseOpeningSelfReference` | i | `i` | STATED |
| 7 | `ex:source-poem` | `usesCapitalizedClosingSelfReference` | I | `I` | STATED |
| 8 | `ex:source-poem` | `usesContraction` | it's | `it's` | STATED |
| 9 | `ex:source-poem` | `enclosesQuotedSpeechInDoubleQuotes` | "it's not pretty." | `"it's not pretty."` | STATED |
| 10 | `ex:source-poem` | `writesAgeWithNumeral` | 6 | `6` | STATED |
| 11 | `ex:source-poem` | `hedgesAgeWith` | about | `about` | STATED |
| 12 | `ex:source-poem` | `hasLineBreakAfter` | today | `today<br>about` | STATED |
| 13 | `ex:source-poem` | `hasLineBreakAfter` | along | `along<br>the` | STATED |
| 14 | `ex:source-poem` | `hasLineBreakAfter` | me | `me and` | STATED |
| 15 | `ex:source-poem` | `hasBlankLineAfter` | coast | `coast<br><br>we` | STATED |
| 16 | `ex:source-poem` | `hasBlankLineAfter` | and said, | `and said,<br><br>"it's not pretty."` | STATED |
| 17 | `ex:source-poem` | `hasBlankLineAfter` | "it's not pretty." | `"it's not pretty."<br><br>I` | STATED |
| 18 | `ex:source-poem` | `placesAgeOnSeparateLine` | about 6 years old, | `today<br>about 6 years old,` | STATED |
| 19 | `ex:source-poem` | `breaksMotionAcrossLines` | along / the coast | `along<br>the coast` | STATED |
| 20 | `ex:source-poem` | `breaksSpeechPreludeAcrossLines` | me / and said, | `me<br>and said,` | STATED |
| 21 | `ex:source-poem` | `isolatesQuotationAsSingleLineStanza` | "it's not pretty." | `and said,<br><br>"it's not pretty."<br><br>I` | STATED |
| 22 | `ex:source-poem` | `isolatesClosingRealizationAsSingleLineStanza` | I had not realized that before. | `"it's not pretty."<br><br>I had not realized that before.` | STATED |
| 23 | `ex:source-poem` | `punctuatesAgeAppositionWithComma` | about 6 years old, | `about 6 years old,` | STATED |
| 24 | `ex:source-poem` | `introducesQuotationWithComma` | and said, | `and said,` | STATED |
| 25 | `ex:source-poem` | `endsQuotationWithPeriod` | "it's not pretty." | `"it's not pretty."` | STATED |
| 26 | `ex:source-poem` | `endsClosingSentenceWithPeriod` | I had not realized that before. | `I had not realized that before.` | STATED |
| 27 | `ex:source-poem` | `usesDevice` | enjambment | `along<br>the` | STATED |
| 28 | `ex:source-poem` | `usesDevice` | enjambment | `me and` | STATED |
| 29 | `ex:source-poem` | `usesDevice` | litotes | `not pretty` | STATED |
| 30 | `ex:source-poem` | `usesDevice` | volta | `I had not realized that before.` | STATED |
| 31 | `ex:source-poem` | `usesDevice` | quote isolation | `and said,<br><br>"it's not pretty."<br><br>I` | STATED |
| 32 | `ex:source-poem` | `usesDevice` | plain diction | `"it's not pretty."` | STATED |
| 33 | `ex:source-poem` | `usesDevice` | colloquial register | `it's` | STATED |
| 34 | `ex:source-poem` | `stagesDelayedAgeReveal` | about 6 years old, | `today<br>about 6 years old,` | STATED |
| 35 | `ex:source-poem` | `emphasizesJudgmentByIsolation` | "it's not pretty." | `and said,<br><br>"it's not pretty."<br><br>I` | STATED |
| 36 | `ex:source-poem` | `rdf:type` | ex:Poem | — (unanchorable) | INTERPRETED |
| 37 | `ex:source-poem` | `rdf:type` | ex:FreeVersePoem | — (unanchorable) | INTERPRETED |
| 38 | `ex:source-poem` | `hasSpeaker` | ex:speaker | — (unanchorable) | INTERPRETED |
| 39 | `ex:source-poem` | `hasShortLength` | short poem | — (unanchorable) | INTERPRETED |
| 40 | `ex:source-poem` | `hasImpliedSpeakerDistinctFromAuthor` | ex:speaker | — (unanchorable) | INTERPRETED |
| 41 | `ex:source-poem` | `contrastsSelfReferenceCase` | i/I | — (unanchorable) | INTERPRETED |
| 42 | `ex:source-poem` | `hasDeadpanTone` | deadpan | — (unanchorable) | INTERPRETED |
| 43 | `ex:source-poem` | `treatsGeniusLabelAsIronic` | a genius | `i met a genius on the train today` | STATED |
| 44 | `ex:source-poem` | `invertsAdultTeachesChildPattern` | ex:child | — (unanchorable) | INTERPRETED |
| 45 | `ex:source-poem` | `stagesOuterSceneThenInnerShift` | ex:realization-event | — (unanchorable) | INTERPRETED |
| 46 | `ex:source-poem` | `centersChildPerspectiveOverAdultConvention` | ex:child | — (unanchorable) | INTERPRETED |
| 47 | `ex:source-poem` | `hasTheme` | ex:theme-childlike-honesty | — (unanchorable) | INTERPRETED |
| 48 | `ex:source-poem` | `hasTheme` | ex:theme-deflated-aesthetic-expectation | — (unanchorable) | INTERPRETED |
| 49 | `ex:source-poem` | `hasTheme` | ex:theme-seeing-anew | — (unanchorable) | INTERPRETED |
| 50 | `ex:source-poem` | `hasTheme` | ex:theme-child-instructs-adult | — (unanchorable) | INTERPRETED |
| 51 | `ex:source-poem` | `hasTheme` | ex:theme-perception-versus-convention | — (unanchorable) | INTERPRETED |
| 52 | `ex:speaker` | `rdfs:label` | i | `i` | STATED |
| 53 | `ex:speaker` | `referredToBy` | i | `i` | STATED |
| 54 | `ex:speaker` | `referredToBy` | me | `me` | STATED |
| 55 | `ex:speaker` | `referredToBy` | I | `I` | STATED |
| 56 | `ex:speaker` | `framesAsGenius` | ex:child | `a genius` | STATED |
| 57 | `ex:speaker` | `met` | ex:child | `i met a genius` | STATED |
| 58 | `ex:speaker` | `wasSatBesideBy` | ex:child | `he sat beside me` | STATED |
| 59 | `ex:speaker` | `wasLookedAtBy` | ex:child | `he looked at me` | STATED |
| 60 | `ex:speaker` | `rdf:type` | ex:FirstPersonSpeaker | — (unanchorable) | INTERPRETED |
| 61 | `ex:speaker` | `rdf:type` | ex:Person | — (unanchorable) | INTERPRETED |
| 62 | `ex:speaker` | `memberOf` | ex:we-group | — (unanchorable) | INTERPRETED |
| 63 | `ex:speaker` | `likelyOccupied` | ex:adjacent-train-seats | — (unanchorable) | INTERPRETED |
| 64 | `ex:speaker` | `likelyPerceived` | ex:sea-view | — (unanchorable) | INTERPRETED |
| 65 | `ex:speaker` | `learnedFrom` | ex:child | — (unanchorable) | INTERPRETED |
| 66 | `ex:speaker` | `exemplifies` | ex:theme-perception-versus-convention | — (unanchorable) | INTERPRETED |
| 67 | `ex:child` | `rdfs:label` | genius | `genius` | STATED |
| 68 | `ex:child` | `referredToBy` | genius | `genius` | STATED |
| 69 | `ex:child` | `referredToBy` | he | `he` | STATED |
| 70 | `ex:child` | `framedAsGeniusBy` | ex:speaker | `a genius` | STATED |
| 71 | `ex:child` | `metBy` | ex:speaker | `i met a genius` | STATED |
| 72 | `ex:child` | `hasAgeEstimate` | ex:age-estimate | `about 6 years old` | STATED |
| 73 | `ex:child` | `ageWrittenAsNumeral` | 6 | `6` | STATED |
| 74 | `ex:child` | `satBeside` | ex:speaker | `he sat beside me` | STATED |
| 75 | `ex:child` | `lookedAt` | ex:speaker | `he looked at me` | STATED |
| 76 | `ex:child` | `quotedAsSaying` | "it's not pretty." | `"it's not pretty."` | STATED |
| 77 | `ex:child` | `makesJudgment` | ex:not-pretty-evaluation | `"it's not pretty."` | STATED |
| 78 | `ex:child` | `rdf:type` | ex:Person | — (unanchorable) | INTERPRETED |
| 79 | `ex:child` | `rdf:type` | ex:YoungChild | — (unanchorable) | INTERPRETED |
| 80 | `ex:child` | `memberOf` | ex:we-group | — (unanchorable) | INTERPRETED |
| 81 | `ex:child` | `likelyOccupied` | ex:adjacent-train-seats | — (unanchorable) | INTERPRETED |
| 82 | `ex:child` | `likelyPerceived` | ex:sea-view | — (unanchorable) | INTERPRETED |
| 83 | `ex:child` | `taught` | ex:speaker | — (unanchorable) | INTERPRETED |
| 84 | `ex:child` | `exemplifies` | ex:theme-childlike-honesty | — (unanchorable) | INTERPRETED |
| 85 | `ex:child` | `exemplifies` | ex:theme-child-instructs-adult | — (unanchorable) | INTERPRETED |
| 86 | `ex:age-estimate` | `rdf:type` | ex:ApproximateAgeStatement | `about 6 years old` | STATED |
| 87 | `ex:age-estimate` | `rdfs:label` | about 6 years old | `about 6 years old` | STATED |
| 88 | `ex:age-estimate` | `describes` | ex:child | `about 6 years old` | STATED |
| 89 | `ex:age-estimate` | `approximateValue` | 6 | `6` | STATED |
| 90 | `ex:age-estimate` | `usesHedge` | about | `about` | STATED |
| 91 | `ex:age-estimate` | `ageUnitText` | years old | `years old` | STATED |
| 92 | `ex:meeting-event` | `rdfs:label` | met | `met` | STATED |
| 93 | `ex:meeting-event` | `attestedBy` | ex:speaker | `i met a genius on the train today` | STATED |
| 94 | `ex:meeting-event` | `hasParticipant` | ex:speaker | `i met` | STATED |
| 95 | `ex:meeting-event` | `hasParticipant` | ex:child | `a genius` | STATED |
| 96 | `ex:meeting-event` | `occurredOn` | ex:train | `on the train` | STATED |
| 97 | `ex:meeting-event` | `occurredOnDay` | ex:today-reference | `today` | STATED |
| 98 | `ex:meeting-event` | `rdf:type` | ex:MeetingEvent | — (unanchorable) | INTERPRETED |
| 99 | `ex:sitting-event` | `rdf:type` | ex:SittingEvent | `sat` | STATED |
| 100 | `ex:sitting-event` | `rdfs:label` | sat beside me | `sat beside me` | STATED |
| 101 | `ex:sitting-event` | `attestedBy` | ex:speaker | `he sat beside me` | STATED |
| 102 | `ex:sitting-event` | `agent` | ex:child | `he sat` | STATED |
| 103 | `ex:sitting-event` | `near` | ex:speaker | `beside me` | STATED |
| 104 | `ex:sitting-event` | `concurrentWith` | ex:train-running-event | `he sat beside me and as the train ran down along<br>the coast` | STATED |
| 105 | `ex:adjacent-train-seats` | `rdf:type` | ex:SeatPair | — (unanchorable) | INTERPRETED |
| 106 | `ex:adjacent-train-seats` | `rdfs:label` | adjacent train seats | `i met a genius on the train today` | STATED |
| 107 | `ex:adjacent-train-seats` | `locatedIn` | ex:train | — (unanchorable) | INTERPRETED |
| 108 | `ex:we-group` | `rdf:type` | ex:FirstPersonPluralGroup | `we` | STATED |
| 109 | `ex:we-group` | `rdfs:label` | we | `we` | STATED |
| 110 | `ex:we-group` | `includes` | ex:speaker | — (unanchorable) | INTERPRETED |
| 111 | `ex:we-group` | `includes` | ex:child | — (unanchorable) | INTERPRETED |
| 112 | `ex:train` | `rdf:type` | ex:Train | `train` | STATED |
| 113 | `ex:train` | `rdfs:label` | train | `train` | STATED |
| 114 | `ex:train` | `hosted` | ex:meeting-event | `on the train` | STATED |
| 115 | `ex:train` | `vehicleOf` | ex:train-journey | — (unanchorable) | INTERPRETED |
| 116 | `ex:train` | `contains` | ex:adjacent-train-seats | — (unanchorable) | INTERPRETED |
| 117 | `ex:train-journey` | `rdf:type` | ex:Journey | — (unanchorable) | INTERPRETED |
| 118 | `ex:train-journey` | `rdfs:label` | train journey | `i met a genius on the train today` | STATED |
| 119 | `ex:train-journey` | `usesVehicle` | ex:train | — (unanchorable) | INTERPRETED |
| 120 | `ex:train-journey` | `occursOnDay` | ex:today-reference | — (unanchorable) | INTERPRETED |
| 121 | `ex:train-journey` | `includesEvent` | ex:meeting-event | — (unanchorable) | INTERPRETED |
| 122 | `ex:train-journey` | `includesEvent` | ex:sitting-event | — (unanchorable) | INTERPRETED |
| 123 | `ex:train-journey` | `includesEvent` | ex:train-running-event | — (unanchorable) | INTERPRETED |
| 124 | `ex:train-journey` | `includesEvent` | ex:arrival-event | — (unanchorable) | INTERPRETED |
| 125 | `ex:train-running-event` | `rdf:type` | ex:MotionEvent | `ran` | STATED |
| 126 | `ex:train-running-event` | `rdfs:label` | ran down along the coast | `ran down along<br>the coast` | STATED |
| 127 | `ex:train-running-event` | `attestedBy` | ex:speaker | `the train ran down along<br>the coast` | STATED |
| 128 | `ex:train-running-event` | `agent` | ex:train | `the train ran` | STATED |
| 129 | `ex:train-running-event` | `followedCoast` | ex:coast | `ran down along<br>the coast` | STATED |
| 130 | `ex:train-running-event` | `directionWord` | down along | `down along` | STATED |
| 131 | `ex:train-running-event` | `concurrentWith` | ex:sitting-event | `he sat beside me and as the train ran down along<br>the coast` | STATED |
| 132 | `ex:train-running-event` | `preceded` | ex:arrival-event | — (unanchorable) | INTERPRETED |
| 133 | `ex:train-window` | `rdf:type` | ex:Window | — (unanchorable) | INTERPRETED |
| 134 | `ex:train-window` | `rdfs:label` | train window | `i met a genius on the train today` | STATED |
| 135 | `ex:train-window` | `locatedIn` | ex:train | — (unanchorable) | INTERPRETED |
| 136 | `ex:train-window` | `frames` | ex:sea-view | — (unanchorable) | INTERPRETED |
| 137 | `ex:coast` | `rdf:type` | ex:Coast | `coast` | STATED |
| 138 | `ex:coast` | `rdfs:label` | coast | `coast` | STATED |
| 139 | `ex:coast` | `wasFollowedBy` | ex:train-running-event | `ran down along<br>the coast` | STATED |
| 140 | `ex:coast` | `borders` | ex:ocean | — (unanchorable) | INTERPRETED |
| 141 | `ex:arrival-event` | `rdf:type` | ex:ArrivalEvent | `came` | STATED |
| 142 | `ex:arrival-event` | `rdfs:label` | came to the ocean | `came to the ocean` | STATED |
| 143 | `ex:arrival-event` | `attestedBy` | ex:speaker | `we came to the ocean` | STATED |
| 144 | `ex:arrival-event` | `hasParticipant` | ex:we-group | `we came` | STATED |
| 145 | `ex:arrival-event` | `destination` | ex:ocean | `came to the ocean` | STATED |
| 146 | `ex:arrival-event` | `followedBy` | ex:looking-event | `we came to the ocean and then he looked at me` | STATED |
| 147 | `ex:arrival-event` | `partOf` | ex:train-journey | — (unanchorable) | INTERPRETED |
| 148 | `ex:arrival-event` | `followed` | ex:train-running-event | — (unanchorable) | INTERPRETED |
| 149 | `ex:ocean` | `rdf:type` | ex:Ocean | `ocean` | STATED |
| 150 | `ex:ocean` | `rdfs:label` | ocean | `ocean` | STATED |
| 151 | `ex:ocean` | `destinationOf` | ex:arrival-event | `came to the ocean` | STATED |
| 152 | `ex:ocean` | `centerOf` | ex:sea-view | — (unanchorable) | INTERPRETED |
| 153 | `ex:ocean` | `borderedBy` | ex:coast | — (unanchorable) | INTERPRETED |
| 154 | `ex:ocean` | `judgedIn` | ex:not-pretty-evaluation | — (unanchorable) | INTERPRETED |
| 155 | `ex:ocean` | `appraisedAs` | not pretty | `and said,<br><br>"it's not pretty."` | STATED |
| 156 | `ex:ocean` | `appraisedBy` | ex:child | — (unanchorable) | INTERPRETED |
| 157 | `ex:sea-view` | `rdf:type` | ex:SeascapeView | — (unanchorable) | INTERPRETED |
| 158 | `ex:sea-view` | `rdfs:label` | ocean view | `the coast<br><br>we came to the ocean and then he looked at me` | STATED |
| 159 | `ex:sea-view` | `centersOn` | ex:ocean | — (unanchorable) | INTERPRETED |
| 160 | `ex:sea-view` | `visibleThrough` | ex:train-window | — (unanchorable) | INTERPRETED |
| 161 | `ex:sea-view` | `perceivedBy` | ex:child | — (unanchorable) | INTERPRETED |
| 162 | `ex:sea-view` | `perceivedBy` | ex:speaker | — (unanchorable) | INTERPRETED |
| 163 | `ex:sea-view` | `judgedIn` | ex:not-pretty-evaluation | — (unanchorable) | INTERPRETED |
| 164 | `ex:sea-view` | `appraisedAs` | not pretty | `and said,<br><br>"it's not pretty."` | STATED |
| 165 | `ex:sea-view` | `appraisedBy` | ex:child | — (unanchorable) | INTERPRETED |
| 166 | `ex:looking-event` | `rdf:type` | ex:LookingEvent | `looked` | STATED |
| 167 | `ex:looking-event` | `rdfs:label` | looked at me | `looked at me` | STATED |
| 168 | `ex:looking-event` | `attestedBy` | ex:speaker | `he looked at me` | STATED |
| 169 | `ex:looking-event` | `agent` | ex:child | `he looked` | STATED |
| 170 | `ex:looking-event` | `target` | ex:speaker | `looked at me` | STATED |
| 171 | `ex:looking-event` | `followed` | ex:arrival-event | `we came to the ocean and then he looked at me` | STATED |
| 172 | `ex:looking-event` | `followedBy` | ex:utterance-event | `looked at me<br>and said,` | STATED |
| 173 | `ex:utterance-event` | `rdf:type` | ex:SpeechEvent | `said` | STATED |
| 174 | `ex:utterance-event` | `rdfs:label` | "it's not pretty." | `"it's not pretty."` | STATED |
| 175 | `ex:utterance-event` | `attestedBy` | ex:speaker | `and said,` | STATED |
| 176 | `ex:utterance-event` | `speaker` | ex:child | `said` | STATED |
| 177 | `ex:utterance-event` | `addressedTo` | ex:speaker | `looked at me<br>and said,` | STATED |
| 178 | `ex:utterance-event` | `quoteText` | "it's not pretty." | `"it's not pretty."` | STATED |
| 179 | `ex:utterance-event` | `followed` | ex:looking-event | `looked at me<br>and said,` | STATED |
| 180 | `ex:utterance-event` | `hasPronounReference` | ex:quoted-it | `it` | STATED |
| 181 | `ex:utterance-event` | `expresses` | ex:not-pretty-evaluation | `"it's not pretty."` | STATED |
| 182 | `ex:utterance-event` | `triggered` | ex:realization-event | — (unanchorable) | INTERPRETED |
| 183 | `ex:utterance-event` | `preceded` | ex:realization-event | — (unanchorable) | INTERPRETED |
| 184 | `ex:utterance-event` | `exemplifies` | ex:theme-deflated-aesthetic-expectation | — (unanchorable) | INTERPRETED |
| 185 | `ex:quoted-it` | `rdf:type` | ex:PronounReference | `it` | STATED |
| 186 | `ex:quoted-it` | `rdfs:label` | it | `it` | STATED |
| 187 | `ex:quoted-it` | `sameAs` | ex:ocean | — (unanchorable) | INTERPRETED |
| 188 | `ex:quoted-it` | `sameAs` | ex:sea-view | — (unanchorable) | INTERPRETED |
| 189 | `ex:not-pretty-evaluation` | `rdfs:label` | not pretty | `not pretty` | STATED |
| 190 | `ex:not-pretty-evaluation` | `expressedIn` | ex:utterance-event | `"it's not pretty."` | STATED |
| 191 | `ex:not-pretty-evaluation` | `usesNegation` | not | `not` | STATED |
| 192 | `ex:not-pretty-evaluation` | `usesAdjective` | pretty | `pretty` | STATED |
| 193 | `ex:not-pretty-evaluation` | `madeBy` | ex:child | `"it's not pretty."` | STATED |
| 194 | `ex:not-pretty-evaluation` | `rdf:type` | ex:AestheticJudgment | — (unanchorable) | INTERPRETED |
| 195 | `ex:not-pretty-evaluation` | `about` | ex:ocean | — (unanchorable) | INTERPRETED |
| 196 | `ex:not-pretty-evaluation` | `about` | ex:sea-view | — (unanchorable) | INTERPRETED |
| 197 | `ex:not-pretty-evaluation` | `realizedIn` | ex:realization-event | — (unanchorable) | INTERPRETED |
| 198 | `ex:realization-event` | `rdf:type` | ex:RealizationEvent | `realized` | STATED |
| 199 | `ex:realization-event` | `rdfs:label` | I had not realized that before. | `I had not realized that before.` | STATED |
| 200 | `ex:realization-event` | `attestedBy` | ex:speaker | `I had not realized that before.` | STATED |
| 201 | `ex:realization-event` | `experiencer` | ex:speaker | `I had not realized` | STATED |
| 202 | `ex:realization-event` | `usesPastPerfect` | had not realized | `had not realized` | STATED |
| 203 | `ex:realization-event` | `marksPriorNonrealization` | not realized | `not realized` | STATED |
| 204 | `ex:realization-event` | `temporalContrastWord` | before | `before` | STATED |
| 205 | `ex:realization-event` | `hasAnaphor` | ex:that-reference | `that` | STATED |
| 206 | `ex:realization-event` | `about` | ex:not-pretty-evaluation | — (unanchorable) | INTERPRETED |
| 207 | `ex:realization-event` | `triggeredBy` | ex:utterance-event | — (unanchorable) | INTERPRETED |
| 208 | `ex:realization-event` | `followed` | ex:utterance-event | — (unanchorable) | INTERPRETED |
| 209 | `ex:realization-event` | `exemplifies` | ex:theme-seeing-anew | — (unanchorable) | INTERPRETED |
| 210 | `ex:today-reference` | `rdf:type` | ex:DeicticDayReference | `today` | STATED |
| 211 | `ex:today-reference` | `rdfs:label` | today | `today` | STATED |
| 212 | `ex:today-reference` | `timeOf` | ex:meeting-event | `today` | STATED |
| 213 | `ex:today-reference` | `timeOf` | ex:train-journey | — (unanchorable) | INTERPRETED |
| 214 | `ex:that-reference` | `rdf:type` | ex:AnaphoricReference | `that` | STATED |
| 215 | `ex:that-reference` | `rdfs:label` | that | `that` | STATED |
| 216 | `ex:that-reference` | `sameAs` | ex:not-pretty-evaluation | `I had not realized that before.` | STATED |
| 217 | `ex:theme-childlike-honesty` | `rdf:type` | ex:Theme | — (unanchorable) | INTERPRETED |
| 218 | `ex:theme-childlike-honesty` | `rdfs:label` | childlike honesty | — (unanchorable) | INTERPRETED |
| 219 | `ex:theme-deflated-aesthetic-expectation` | `rdf:type` | ex:Theme | — (unanchorable) | INTERPRETED |
| 220 | `ex:theme-deflated-aesthetic-expectation` | `rdfs:label` | deflated aesthetic expectation | `and said,<br><br>"it's not pretty."` | STATED |
| 221 | `ex:theme-seeing-anew` | `rdf:type` | ex:Theme | — (unanchorable) | INTERPRETED |
| 222 | `ex:theme-seeing-anew` | `rdfs:label` | seeing anew | — (unanchorable) | INTERPRETED |
| 223 | `ex:theme-child-instructs-adult` | `rdf:type` | ex:Theme | — (unanchorable) | INTERPRETED |
| 224 | `ex:theme-child-instructs-adult` | `rdfs:label` | child instructs adult | — (unanchorable) | INTERPRETED |
| 225 | `ex:theme-perception-versus-convention` | `rdf:type` | ex:Theme | — (unanchorable) | INTERPRETED |
| 226 | `ex:theme-perception-versus-convention` | `rdfs:label` | perception versus convention | — (unanchorable) | INTERPRETED |


---

## 4. Reading the extraction back as criticism

Because the claims are typed and anchored, the knowledge graph *is* a close reading. Walk it by lens:

- **Setting / deixis.** `today` is captured as a deictic time entity (`occurredOn`, `timeOf`), not a date — the poem is anchored to an unspecified "now." The journey is `a train running down along the coast` to `the ocean`; the coast `borders` the ocean and vice-versa (the multi-directional edges the brief asks for). The sea is `visibleThrough` an implied `train-window` — an entity the poem never names but plainly presupposes (held, correctly, as a hypothesis).

- **The cast.** Two people, one event of meeting. The speaker is `i`/`me`, lowercase, first-person. The child is `about 6 years old` — and the **hedge "about"** is its own claim (`hedgesAgeWith`, `approximateValue`), as is the fact that the age is written as the **numeral "6"** rather than spelled (`ageWrittenAsNumeral`). The `we-group` ("we came to the ocean") binds the two into a shared subject for the arrival.

- **The turn.** The poem's machinery is a tiny epiphany engine. The child `lookedAt` the speaker, then `quotedAsSaying "it's not pretty."` — a verbatim speech act, anchored character-for-character including the quotation marks. That utterance `triggered` the `realization-event`; the speaker `learnedFrom` the child and the child `taught` the speaker (the inverse pair). The realization's *content* — that the ocean is "not pretty" — is what the speaker `marksPriorNonrealization` of in the final line. The poem `pivotsOn` the quote and `closesWith` the realization: a **volta** in nine lines.

- **The value claim.** `it's not pretty` is captured as an **axiological appraisal**: the `not-pretty-evaluation` is `appraisedBy` the child and `appraisedAs` not-pretty, applied to the ocean. This is the poem's whole argument — an aesthetic verdict delivered deadpan by a six-year-old — and it sits in the graph as a first-class, attributed claim, never as the system's own judgement.

- **The irony, held honestly.** The title word **"genius"** is the speaker's framing (`framesAsGenius` / `framedAsGeniusBy`), and the reading that this is **ironic / admiring rather than literal** is held as a hypothesis (`treatsGeniusLabelAsIronic`, `h:true`) — anchored to the exhibiting span `a genius` but graded as interpretation. Likewise the structural reading that the poem `invertsAdultTeachesChildPattern` (the child instructs the adult) is an unanchorable hypothesis. The system does not pretend the poem *says* "this is ironic."

- **The devices, anchored where they live.** Enjambment is captured by anchoring to the *broken* lines themselves (`breaksMotionAcrossLines` → `along\nthe`; `breaksSpeechPreludeAcrossLines` → `me\nand`). The single-line stanzas for the quote and the closing realization are captured as `isolatesQuotationAsSingleLineStanza` / `isolatesClosingRealizationAsSingleLineStanza` — the typographic isolation that gives both lines their weight. **Litotes / understatement** ("not pretty" rather than "ugly") shows up via `usesNegation` + `usesAdjective` on the verbatim `not pretty`. The deadpan, colloquial register, the contraction `it's`, the past-perfect `had not realized`, and the orthographic flip from lowercase opening `i` to capitalized closing `I` are all their own claims.

- **The meta.** The work is typed `ex:Poem` / `ex:FreeVersePoem` with a **speaker distinct from the author** — all `h:true`, because none of that is *in* the 222 bytes. The title, author, and collection are deliberately **absent** from the extraction's anchored layer: they are not in the source text, so the engine refused to invent a span for them. They live in this report's provenance section (§0), where the evidence is the *bibliographic record*, not the poem.

---

## 5. Outcomes

- **No padding, real depth.** 226 meaningful claims, 114 predicates, 28 entities from 47 words — and the model **chose** to stop at saturation rather than chase a floor. The opposite-extreme test passes: the abundance engine goes *deep* on a minimal text without manufacturing filler. (For calibration: the dense-frontier runs reach thousands of claims; a poem reaching ~4.8 claims/word across forty lenses is the right *shape* for this scale, not a shrunk-down quota.)

- **The stated/interpreted line held.** 141 facts anchored to real, retrievable line-spans; 85 held as honest, unanchored hypotheses; **zero bogus spans**. Every interpretive theme and every ironic reading is preserved as a *legal* claim (donto holds everything, paraconsistently) but is *distinguishable* from what the poem literally says — in the data, by `flags=3` and the absence of an evidence link.

- **Evidence-first, verified live.** The full `fact → evidence_link → span → surface_text` chain materialized in Postgres and was walked by hand. The source poem is stored as a retrievable revision. I3 (inserts-only) held; nothing was overwritten.

- **One honest engineering finding.** The shipped citer's relational direction-gate is calibrated for dense prose and under-anchors a tiny poem when run raw (34.5% placed). The principled poem-calibration — *certify exact-verbatim anchors first, hand only the span-less remainder to the gate* — lifted placement to 62.4% **with the no-bogus guarantee intact**, and it is universal (exact substring = strongest evidence), not a per-poem hack. This is a real, reusable signal that the citer's calibration should be **text-scale-aware** rather than one-size-fits-dense.

- **The differentiator got a (small) workout.** donto's contradiction/identity machinery is barely exercised at scale, but this run lit up the parts that matter for *literary* extraction: paraconsistent holding of an interpretive layer alongside a stated layer, evidence anchoring at character granularity, and the refusal to fabricate support — the exact behaviors that separate a contradiction-preserving claim substrate from a vector store that would have collapsed the poem to one embedding.

---

## 6. Reproduce it

```bash
# 1. the source (verbatim, 222 bytes)
cat /tmp/poem-extract/source.txt

# 2. CODEX deep-lane extraction, no count-floor, saturation-stop
codex exec --dangerously-bypass-approvals-and-sandbox -C /tmp/poem-extract \
  -c model="gpt-5.4" -c model_reasoning_effort="xhigh" "$(cat /tmp/poem-extract/prompt.txt)"
#   -> /tmp/poem-extract/facts.jsonl  (226 facts)

# 3. always-on citer, poem-calibrated (exact-anchor-first + cite_facts_v3 remainder)
HF_HUB_OFFLINE=1 python /tmp/poem-extract/cite_poem.py
#   -> /tmp/poem-extract/facts.cited.poem.jsonl  (141 anchored, 85 hypothesis, 0 bogus)

# 4. ingest into the substrate, I3 inserts-only
python /tmp/poem-extract/ingest_poem.py
#   -> ctx:test/poem/bukowski-genius : 226 inserted, 141 anchors attached

# 5. verify live
sudo docker exec donto-pg psql -U donto -d donto -c "
  select count(*) from donto_statement
  where context='ctx:test/poem/bukowski-genius' and upper(tx_time) is null"
```

---

### Provenance & honesty notes

- **Poem identity** (*I Met a Genius*, Charles Bukowski, *You Get So Alone at Times That It Just Makes Sense*, Black Sparrow Press, 1986) verified via web search across multiple independent poetry archives plus the collection's bibliographic record; the attribution is secure (a genuine Bukowski poem in a real, datable collection — not one of the unhomed "Bukowski" texts that float misattributed online). Author biography (1920–1994; Black Sparrow; Andernach→Los Angeles) cross-checked against the standard reference record.
- **Textual variant**: the supplied closing line *"I had not realized that before."* differs from the commonly printed *"It was the first time I'd realized that."* We extracted the **supplied** text verbatim; the variant is recorded in §0 and changes no claim.
- **The named vs. unnamed**: the **author** Charles Bukowski is the only named person; the **six-year-old "genius"** is **unnamed** in the poem (modeled as `ex:child`).
- **n=1, directional.** This is a single poem run on a single deep-lane model. Counts are from one extraction and one citer pass, re-verified live in the substrate. The citer-calibration finding (text-scale-aware anchoring) is a real signal but warrants a small corpus of short texts to confirm.
