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:
Extraction (CODEX, deep lane). Run the proven Codex setup —
codex execwithmodel=gpt-5.4(the deep lane, best for literary nuance) atreasoning_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.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.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_textchain. 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.
todayis captured as a deictic time entity (occurredOn,timeOf), not a date — the poem is anchored to an unspecified "now." The journey isa train running down along the coasttothe ocean; the coastbordersthe ocean and vice-versa (the multi-directional edges the brief asks for). The sea isvisibleThroughan impliedtrain-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 isabout 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). Thewe-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
lookedAtthe speaker, thenquotedAsSaying "it's not pretty."— a verbatim speech act, anchored character-for-character including the quotation marks. That utterancetriggeredtherealization-event; the speakerlearnedFromthe child and the childtaughtthe speaker (the inverse pair). The realization's content — that the ocean is "not pretty" — is what the speakermarksPriorNonrealizationof in the final line. The poempivotsOnthe quote andclosesWiththe realization: a volta in nine lines.The value claim.
it's not prettyis captured as an axiological appraisal: thenot-pretty-evaluationisappraisedBythe child andappraisedAsnot-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 spana geniusbut graded as interpretation. Likewise the structural reading that the poeminvertsAdultTeachesChildPattern(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 asisolatesQuotationAsSingleLineStanza/isolatesClosingRealizationAsSingleLineStanza— the typographic isolation that gives both lines their weight. Litotes / understatement ("not pretty" rather than "ugly") shows up viausesNegation+usesAdjectiveon the verbatimnot pretty. The deadpan, colloquial register, the contractionit's, the past-perfecthad not realized, and the orthographic flip from lowercase openingito capitalized closingIare all their own claims.The meta. The work is typed
ex:Poem/ex:FreeVersePoemwith a speaker distinct from the author — allh: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=3and the absence of an evidence link.Evidence-first, verified live. The full
fact → evidence_link → span → surface_textchain 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
# 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.