← Build Log

Teaching AI to See: How We Built a Perception Layer for Fiction

April 25, 2026 · Revised September 15, 2026

What follows is a condensed summary, generated by Claude, of one extended session on why AI-drafted prose reads as AI-drafted prose — and what we built to fix it. Some of the specifics are tied to characters in my book, so parts may lack context until you've read it. The method, though, stands on its own.

We started by asking whether the model could detect its own tells. It couldn't, and neither can the dedicated detectors (Originality.ai, GPTZero, Copyleaks). So we asked a different question: why does AI prose read as AI prose, and can the mechanism be used to improve the drafting rather than just flag it?

Diagnosis: the prose is undifferentiated, not bad

AI-generated prose converges on a narrow band of mid-register vocabulary, even sentence rhythm, and abstraction where specificity is called for. Smoothness isn't always a defect — transitions and logistical connective tissue are supposed to recede. But at emotional peaks, character interiority, and sensory detail, generic register is a direct cost.

The working diagnostic: can I point to a choice in this paragraph that only this narrator would make? If not, the paragraph has drifted.

We formalised this as a four-tier watch list:

The manuscript — then around 61,000 words, heading for a 70,000-word target — gave us a natural experiment. Chapters 1–8 were heavily revised, my voice dominant; chapters 9–15 were closer to raw model output. We treated the first as a training set and the second as a test set.

The clearest signal was the abstraction wrapper — the template THE [abstraction noun] OF [noun phrase] ("the specific weight of a man who had been waiting for sixteen years"). Zero instances in Ch 1–8; twenty-four in Ch 12–15. Every one names a category instead of rendering the thing. Physical-to-abstract detail ratio: 14:1 in the training set, 6:1 in the test set. "Settled/settling" appeared 53 times doing five different jobs. Conversely, named emotions ("she felt anxious") and "she realized that" were at zero manuscript-wide — the human revision had already eliminated those.

Why negative constraints hit a ceiling

A watch list is a set of negative constraints, and the model will honour them. But the flagged patterns aren't random tics; they're where the model's probability mass lands when it needs to perform a specific job. Block "the economy of someone who had been cutting apples for a long time" and you get "the precision of someone who had been cutting apples for a long time." The surface token changes; the underlying move doesn't.

We paired the watch list with a strategy bank — structural techniques keyed to six recurring scene types, drawn from literary reference points. That produced the first instructive failure. I included Ishiguro's displacement technique (the narrator over-describes something trivial nearby while the real emotional content goes unstated) as the primary move for emotional peaks. The model adopted it immediately and applied it three times in a single scene: the protagonist looking at hands, the counter, a worn patch on the floor.

It had produced Kathy H. from Never Let Me Go instead of Vess, my narrator. Kathy displaces because she's avoiding. Vess fixes on physical detail because she's reading — her taxonomic mind moves through the nearest evidence toward understanding, not away from the difficult thing. Same technique, wrong character. The literary prior had overridden the voice.

The gap is selection, not empathy

A human writer imagining a specific character cutting an apple draws on embodied memory and sees one detail — the right one — before the sentence starts. The filtering happens pre-verbally. The model can generate twenty plausible details for the same moment; what it can't do is reliably select the live one.

That reframing changed the engineering problem. Not "teach the model empathy," but narrow the selection space to details already established and working in the chapters where the voice is right.

My existing character documents were architectural: relationships, narrative function, philosophical position. What was missing was what I started calling Layer 2 — not what characters are, but what they look like while being what they are. Physical behaviour signatures.

Building Layer 2 from the training set

Method: go through Ch 1–8 and extract every physical behaviour per character. Not descriptions — actions. What they reach for, how their hands move, where they stand.

For one character this yielded a compact portrait: the worn patch on the counter where he stands; one hand always resting on the counter edge while the other works; apple peel in a single unbroken strip; both hands going still when he's deciding what not to say; the half-sentence the body finishes when the words don't.

None of this was new. It was already in the manuscript, scattered across eight chapters, and unavailable to the model at draft time. The abstraction is always available; the specific detail requires knowing which detail is canonical. Layer 2 is simply that canon, organised.

First test: the chapter 13 disclosure scene, the densest cluster of abstraction wrappers in the book, redrafted with Layer 2 loaded.

"The specific weight of a man who had been waiting for sixteen years"

became

"Both hands were still now. She had never seen both hands still at the same time."

The wrapper was gone, the detail grounded in established continuity — and the displacement problem recurred anyway. The model now knew what to find but still defaulted to looking away from the conversation. The subject layer told the camera what to look at. It said nothing about how to look.

The observer layer

The missing half was the narrator's relationship to what she's seeing in a given moment. The same detail — both hands still on the counter — means something different when she's filing successfully versus when she's angry. So we extracted a second document from the training set: seven observer modes, each specifying camera behaviour and prose rhythm.

| Mode | Camera | Rhythm | |---|---|---| | 1. Filing successfully | Systematic sweep, negative-definition stack | Long–short pairing, controlled | | 2. Filing failing | Disproportionate precision on adjacent detail | Fragments, broken pairing | | 3. Reading someone familiar | Catches one deviation from baseline | Short declarative | | 4. Reading someone new | Wide sweep, multiple channels | Long, dense | | 5. Angry / hurt | Sharpens, stays on the person, facts as weapons | Clipped, precise | | 6. Body before mind | Records aftermath of involuntary action | Short action → longer processing | | 7. Recognition | Revisits established detail through a new lens | Calm, complete sentences |

Mode 5 was the decisive finding. When this narrator is angry she does not displace to benign objects; she gets more precise. "She lived with you for four years. She had a baby with you." The taxonomic mind under pressure accelerates.

That resolved the Ishiguro problem structurally. The strategy bank still exists, but it's now gated by mode: displacement is available in Mode 1, where restraint is the correct register, and prohibited in Mode 5. The chapter 13 scene was Mode 5.

Result

Redrafted with both layers loaded — observer modes governing how the camera moves, subject Layer 2 governing what it finds — the angry passage stayed on the character. The anger expanded outward to the full architecture of her childhood: the house, the garden, the name, the apple. The same objects from the same Layer 2 document, now functioning as evidence rather than retreat. Test drafts approached the training set's 14:1 ratio.

We then built subject layers for the full cast and recurring locations using the same extraction rule: behaviour signatures from chapters where the voice was already working, never character description. The per-character drift analysis surfaced its own failure classes. One character's worst drift was structural rather than lexical — a late chapter decoded him ("The held quality was care. The restraint was tenderness."), discharging eight chapters of accumulated ambiguity in three clauses. Another went from 7% abstraction in training to 36% in test, largely because he nearly vanished from the later chapters and his few appearances were summarised rather than observed. A third went from zero to five, all in the structure: the test set explained her unreadability instead of enacting it.

Limits

Layer 2 closed the gap between abstraction and competent physical rendering. It does not close the gap between competent rendering and the strange, specific detail that makes a reader reread a sentence. The model now generates from a narrowed field; the human still selects the one detail that's alive and discards the rest.

The system doesn't simulate empathy. It simulates empathy's output — the physical observations a writer produces when imagining a character's perception — consolidated into a reference library the model can pattern-match against.

The loop

The conventional model is AI drafts, human edits. What emerged is a feedback loop:

  1. Human writes and revises until the voice is right.
  2. Physical signatures, observer modes, and behaviours are extracted from those chapters into Layer 2.
  3. The model drafts new scenes from that narrowed selection space.
  4. Human revises, adding the details the model couldn't find.
  5. Those details enter Layer 2 for the next cycle.

Each iteration raises the model's ceiling as the reference library grows and lowers the human's revision load as drafts get closer to voice. The gap narrows but doesn't close — and the irreducible part, the detail only this writer would see, remains the reason the fiction is worth reading. That isn't a limitation of the system. It's the point of it.