The substrate
contradiction-preserving · evidence-first

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 (breaksMotionAcrossLinesalong\nthe; breaksSpeechPreludeAcrossLinesme\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

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