Debugging is reconstructing what happened. A century-old idea from Russian literary critics tells you what kind of thing you're actually looking at when you stare at telemetry.
The trace on the screen shows a span with a negative duration. The response came back four milliseconds before the request went out.
You know this is impossible. Causes precede effects; that is not negotiable. And yet there it is, rendered crisply on the dashboard, timestamps and all: an effect that, according to the record, happened before its cause. The temptation in that moment, the one that eats the next two hours, is to treat the timeline as the truth and go hunting for some exotic mechanism by which the future reached back. There is no such mechanism. The timeline is lying. Not maliciously, and not vaguely; it is lying precisely, with numbers, in a way that looks exactly like fact.
To debug well, you have to know what kind of thing you are looking at when you look at telemetry. And the people who understood it first were not engineers. They were Russian literary critics, a century ago, working out how a story can tell you events in an order that is not the order in which they happened.
Around 1917, the Russian Formalists, Viktor Shklovsky and Vladimir Propp chief among them, working in the group called OPOYAZ, drew a distinction that founded modern narratology. Shklovsky elaborated it in his 1925 Theory of Prose. He split any narrative into two layers.
The fabula is the raw material of the story: the events in their true chronological and causal order, what actually happened, organized by time, space, and cause. The sjuzhet (also transliterated syuzhet) is the discourse: the order, pace, and perspective in which those events are actually told. The fabula is the timeline of the world; the sjuzhet is the timeline of the telling, and the two are routinely, deliberately, different.
The cleanest demonstration is the genre built entirely on the gap. A detective story almost always opens with the corpse, an event very late in the fabula, and works backward, the reader recreating, alongside the detective, the chain of events that led to the death. Citizen Kane opens with Kane's death and assembles his life in flashback. The murder happened first and is told last; the death happened last and is told first. Telling-order is not event-order, and in good fiction the divergence is the art: Shklovsky's point was that the sjuzhet uses flashback, omission, and digression to “defamiliarize” events and prolong perception, to make you work to reassemble the fabula. Critics later sharpened the vocabulary: Tzvetan Todorov's histoire versus discours, and Gerard Genette's formal study of narrative order and its “anachronies,” the analepsis (flashback) and the prolepsis (flashforward), the telling of a thing before or after its place in the fabula.
A detective novel, the narratologists note, contains two stories pulled apart: the visible one (the investigation, the sjuzhet) and the hidden one (the crime, the fabula), and the whole pleasure is the reader's reconstruction of the second from the first. Hold that image. It is a precise description of an on-call engineer at 3 a.m.
Here is the claim, stated plainly: your observability stack does not show you what happened. It shows you the telling. Logs, traces, and metrics are a sjuzhet, a discourse-ordered, perspectival, partial account, and every property that makes it a sjuzhet is a property you can name in Shklovsky's terms.
It is reordered. Log lines and spans arrive and are stamped in the order they were emitted and received, across machines whose clocks disagree. That order is the discourse order, not the causal order. The clock skew that produces the negative-duration span is, structurally, a flashback the narrator did not intend: an event told out of its place in the fabula.
It is filtered by perspective. You see only what you chose to instrument. Everything you did not log is a Shklovskian omission, a part of the fabula the discourse simply does not contain, and whose absence you will not feel until you need it.
It is reshaped in transit. Buffering, batching, sampling, and aggregation pace and bundle the telling on their own logic, the way a narrator's digressions interrupt and reorder the underlying events. The dashboard's smooth timeline is a composition, not a chronicle.
There is a line from narratology that reads like it was written for this: the sjuzhet is “the part of the story world currently under observation, the rest of the fabula operating in the background.” That is the literal definition of observability: you watch the external telling and infer the internal events. Distributed tracing even concedes the framing in its own documentation: a request is reconstructed “as a directed acyclic graph... presenting a timeline that tells a coherent story.” The dashboard renders a sjuzhet. We just hadn't named it.
Name the two layers and the most common debugging error becomes obvious and avoidable: reading the discourse-order of telemetry as the causal-order of events. The field even has a term for the symptom, “causal inversion,” where effect appears to precede cause, and engineers “chase symptoms, not realizing the root cause is buried under a skewed timeline.” The negative-duration span is causal inversion you can see with your eyes: the sjuzhet visibly contradicting the fabula, and looking authoritative while it does.
And the distortion is not a rare pathology you can engineer away. By the observability field's own accounting, clock skew is permanent and ordinary. Even with good NTP synchronization you will see a few milliseconds of skew, and once it reaches tens of milliseconds it visibly bends trace timelines; NTP corrects slowly, and a fast-drifting or misconfigured clock can run wrong for hours. The magnitudes compound: if one machine's clock sits a couple of seconds behind and another's a couple ahead, two honest clocks can disagree about order by four full seconds. (Treat these figures as the rough operational estimates they are; the engineering point survives any particular number.) The lesson is not “tune your clocks harder.” It is that the fabula is not recoverable from timestamps, ever, not because your clocks are bad, but because physical timestamps are the sjuzhet, and a sjuzhet, by its nature, underdetermines the fabula.
That last phrase is not a flourish. It is, almost word for word, what the founding paper of distributed time proved.
In 1978, Leslie Lamport published “Time, Clocks, and the Ordering of Events in a Distributed System” (Communications of the ACM, vol. 21), one of the most-cited papers in computer science. Its core move is to stop trusting physical clocks and define order by causality instead: the happens-before relation. Event a happens-before b if they are in the same process and a came first, or if a is the sending of a message and b is its receipt, and it is transitive. Any two events that are not so connected are concurrent: genuinely unordered, no fact of the matter about which came “first.”
Read against narratology, Lamport built a fabula-recovery machine. He recovered the true causal order from the perspectival, clock-skewed telling, exactly the act of reconstructing the fabula from the sjuzhet. And the honest limit of his Lamport timestamps is the same caution a narratologist would give: they guarantee that if a happens-before b then clock(a) < clock(b), but not the reverse. A smaller timestamp does not prove a causal relationship. Lamport's clocks give you one valid ordering consistent with causality, one legitimate reading of the fabula, not the unique true one. The sjuzhet underdetermines the fabula; so does a Lamport clock. The Formalists and the distributed-systems community, sixty years and one discipline apart, arrived at the same epistemic humility about recovering “what really happened” from a partial account.
The rest of the toolkit is the same project, recovering more of the fabula:
parentId/spanId relationships form a causal graph (the parent caused the child) independent of any timestamp. When the trace's timestamp timeline and its parent/child graph disagree (the negative-duration span), the graph is the fabula and the timeline is the sjuzhet. Trust the graph.Mark Burgess made an adjacent argument in 2019 (“From Observability to Significance in Distributed Information Systems”): that understanding system behavior “fundamentally involves constructing narratives,” that observing is storytelling. He is right, and he stops one level above the useful part. The specific, actionable move is narrower and sharper: telemetry is sjuzhet specifically, debugging is fabula-reconstruction specifically, and the causal-ordering tools are fabula-reconstruction machinery specifically, which tells you, concretely, what to trust and when.
The analogy is not that engineers should distrust timestamps. They shouldn't. The discipline cuts both ways: physical time is the right tool for magnitude, latency, SLA, duration, “how long did the checkout take,” and you should keep it and use it for exactly that. The error is using it for order and causality, which is the one job it cannot do across machines. Demote the timestamp from “what caused what” to “how long things took,” and promote the causal graph to the question of order. Two readings of the same telemetry, each for its proper question.
And there is one place the analogy strains, in a way worth saying because it explains why telemetry fools good engineers. In fiction, the author chooses the sjuzhet; the divergence from the fabula is intentional, a made thing, and the reader knows a story is being shaped. In telemetry, no one chose the reordering. The skew, the buffering, the omissions are imposed by physics and architecture; the sjuzhet is an accident, not an art. That is exactly what makes it dangerous. A detective novel announces that it is withholding the fabula; a dashboard presents its sjuzhet as if it were the fabula, in confident monospace, with timestamps to the microsecond. The narrator who does not know he is a narrator is the hardest one to read past.
So here is the practical shift. Stop reading the dashboard as a chronicle of what happened and start reading it as a telling of what happened, a sjuzhet to be decoded, not a fabula to be believed. When the timeline shows an effect before its cause, do not invent a mechanism for time travel; recognize a flashback, and go find the causal graph. When the alert fires “before” the symptom that explains it, remember that the alert is a prolepsis, told early, not occurring early, and look for the happens-before edges, the span parentage, the vector-clock comparison that orders what the wall clock cannot.
The deepest and most useful inversion is this: the most reliable record of what actually happened often contains no clock at all. The fabula lives in the causal structure, happens-before, message send-and-receive, span parent-and-child, and that structure is frequently timeless. The thing with the impressive timestamps is the least trustworthy account of order in the building.
Every incident review is, whether the people in the room know it or not, a narratological exercise: a group of analysts reconstructing the fabula from a partial, perspectival, reordered telling, working backward from the corpse on the dashboard to the chain of events that actually led there. The detective novel taught us that the corpse comes first in the telling and last in the truth, and that the whole job is rebuilding the truth from the telling. Name your telemetry for what it is, the discourse, not the events, and you will stop chasing time-traveling bugs, and start, like every good detective, reconstructing what really happened.
For agents, the fabula is the causal chain — record it directly, don't reconstruct it from clocks.
When you're debugging what an autonomous agent did, the timestamps are the sjuzhet: skewed, reordered, perspectival. The fabula is the causal chain of decisions and actions, and the reliable version of it has no clock in it at all. Chain of Consciousness records that directly: an append-only, causally-ordered, verifiable log of what an agent decided and did, in happens-before order, so you replay the fabula instead of guessing it from a wall clock. It is event sourcing for agency, the story rather than a telling of it.
Hosted Chain of Consciousness · See a verified chain · pip install chain-of-consciousness · npm install chain-of-consciousness