Build1 distinct publisher3 min readPublished
The logs held request, model call, response and status code, which is exactly the field set that cannot show an empty retrieval chunk. A span carrying the payload and the model version can, at a cost in storage and in what you are then holding about customers.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
The useful artifact in the dev.to writeup is the field list, not the anecdote. Every span, the author says, carries duration, token counts, cost, model name, and the input and output that passed through it [10]. Set that against the four things the logistics team went looking for and did not have: what the retrieval step returned, what the prompt looked like that day, which model version answered, and how many tokens it burned to be wrong [6]. All four sit on that span attribute list [2]. This is a schema gap. The library recorded the transport faithfully, and the wrongness was inside the payload.
Follow the chain and you can see why nothing fired. Retrieval returned an empty chunk and the prompt went out truncated; the model answered anyway [11]. An empty result list is still a valid result list, and a truncated prompt is still a valid prompt. Neither raises a status code, and the fluent answer that follows returns a 200 with normal latency [3][12]. Hundreds of runs a day [2] across three weeks [1] puts a floor around 2,100 answers behind that gap, reading "hundreds" as the smallest thing the word can mean [1].
A trace only tells you what broke. The author's second half is the part I would argue about at review: a regression set of 50 to 100 de-identified real interactions [15], scored on exact checks and rubric checks whenever a prompt, retrieval strategy or model changes [16], with a rule that a three-point drop blocks the ship even when the change fixes reported incidents [18]. For that gate to mean anything, run-to-run variance on an unchanged set has to be smaller than the gate. At 50 cases each flipped case moves the pass rate two points, so a three-point drop is at least two cases; at 100 cases it is three [3]. Given that the same prompt can be right at 9:00 and hallucinate at 9:15 with no code change [7], the first experiment is running the unchanged set twice and measuring the spread. If the spread is four points, the gate is measuring noise dressed up as rigor.
Adoption cost is real, and it is not CPU. The logging layer keeps the full prompt and completion for every run, plus retrieved chunks with their scores and sources, tool arguments and results, and a stable run ID [13]. That store grows with tokens rather than with requests, and it also retains a searchable record of customers' addresses.
In my context I would ship two span attributes before the agent talks to a customer: the retrieval payload and the model version. Those are the two the incident narrative turns on. Token counts come third, because a retry loop can multiply the bill tenfold without throwing an exception [8] and request counters sit flat through all of it. Cost per resolved task and cache hit rate [14] are good numbers, but they help you tune the system rather than catch failures like this one.
Ranked by verification strength, evidence, and original report placement.
A trace is a tree of spans: the root span is the request, and child spans are retrieval, prompt assembly, each LLM call and each tool call.
Every span carries duration, token counts, cost, model name, and the input and output that passed through it.
The logs that existed said only: request received, model called, response returned, 200 OK.
The logs contained no record of what the retrieval step returned, no record of what the prompt looked like that day, no record of which model version answered, and no record of how many tokens it burned.
The same prompt can produce a correct answer at 9:00 AM and a hallucination at 9:15 AM with no code change in between.
A retry loop, a bloated context or a greedy agent can quietly multiply the bill 10x without throwing a single exception, so token counts are needed rather than request counts.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 29, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
product
On-device inference turns a phone's temperature into a release-gating variable1 distinct publisher
leadership
ClickHouse buys Langfuse, turning a neutral tracing layer into someone's roadmap1 distinct publisher
build
The ignored 402 is a lint error, not a judgment call1 distinct publisher
build
ZizkaDB bets agent debugging on edges you declare, not spans you read1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One practitioner's recollection, no artifacts
The mechanics hold up on their own — a span carrying the model name, the token counts and what actually went in and out can show what a status-code log structurally cannot, and OpenTelemetry's gen_ai.* attributes name exactly those fields. The incident carrying the story does not travel as well: unnamed client, no exported trace, no ticket, no bill, and a root cause described two different ways within a few paragraphs.
A convention and two tool names
What is actually observable amounts to one engineer's stack. OpenTelemetry's generative-AI attribute family exists and is pointed at; LangSmith and Langfuse are named as things the author has personally run; one team reruns a 50-to-100-case regression set on every prompt change. Nothing in this reporting counts deployments, users or spend, so the ceiling here is low by construction rather than by judgement.
Dramatic opening, undramatic mechanism
The headline number — three weeks of confident wrong answers, and by dev.to's own volume figure at least a couple of thousand of them — is the least verifiable thing on offer, while the part that survives scrutiny is fairly ordinary: capture the prompt, the retrieval result, the model version and the tokens, and you can see what a 200 hides. The 'you should too' framing also skips the bill for the advice, since keeping every prompt and completion is a storage and data-retention decision nobody here prices.
Consulting authority, undisclosed tool ties
This is a working consultant writing about a client engagement in the first person — 'everything I now do, and you should too' is positioning as much as instruction, and an unnameable client makes the war story unfalsifiable in a way that happens to favour the teller. Two commercial observability vendors get named from personal use with no statement either way about any relationship. Nothing suggests sponsorship; the pull is reputational.
Clear text, single unchecked witness
We can read the claims precisely — the field lists, the span attributes, the eval thresholds are all stated plainly — so our uncertainty is not about what was said. It is that one publisher said it, about an engagement nobody else describes, and contradicted its own root-cause account along the way. A second report of the same failure mode, or an exported trace, would move this materially.