Build1 distinct publisher3 min readPublished
Codebase-intelligence tools that resolve a name to its first match return a well-formed answer about a different function. Freshness and error metadata cannot flag it, because nothing went wrong.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Start with the ID scheme, because it is the part that already got the design right. Function nodes in the graph are keyed as `function:${op.filePath}:${op.functionName}`, built at `src/graph/index.ts:452` [5]. That makes `getOrder` in `src/handler.ts` and `getOrder` in `experiments/handler.ts` two distinct nodes with two distinct sets of outgoing edges [5]. The graph knows they are different. The lookup then threw that away by matching on `n.name` alone, so which node came back depended on the order the AST scan happened to walk the file tree [6].
The blast radius is not the lookup. It is what the caller does next. `analyze_function` is the tool an assistant is supposed to call before writing a handler, and it reports which tables the function queries, how it queries them, which permissions the role is missing, and the trigger's event shape [4]. The author's worked example: the scratch file in `experiments/` queries `public.users`, while the real handler scans `public.orders` and carries a high-severity finding attached to that scan [7]. The assistant gets `found: true`, a real path, real table accesses, real findings [7]. It concludes the function it is editing touches `users`, has no scan problem, and needs no index work [8]. Every downstream decision is coherent and built on the wrong file [8].
Now the argument I think is correct. Unread and stale are conditions [2][3][9]. You can attach metadata to a condition: a per-source status, a read timestamp and an age [2][3]. Wrong-candidate resolution is a property of the function signature [10]. A lookup that returns one thing when two things matched has already destroyed the evidence that a choice was made, and no metadata bolted onto the response can reconstruct it [10]. This is why the two shipped fixes are silent here. Both report, correctly, that everything worked [9].
Count the failure classes the author now has open and note the asymmetry: three issues, #101, #102, #103 [2][3][9], and only the third produces a response in which every field is a real value read from a real source seconds ago [9]. Two out of three are instrumentable at the transport layer. The third is only fixable at the call site, by making the resolver return candidates and forcing the caller to disambiguate or refuse.
For transfer to your own tool, the condition is narrow and checkable. You need two things to be true at once: a namespace where the same name legitimately appears more than once, and a resolver that collapses that namespace to a scalar. Monorepos with `experiments/`, vendored copies, generated clients, and fixture directories all satisfy the first. Any `.find()` on a name satisfies the second. The author found the same shape a second time in the AST scanner, issue #44, where resolving an identifier to its string value did a file-wide search for a variable name and returned the first declaration regardless of the call site's scope [11].
The reason this survives review is that it never looks like a bug. A permissions error is annoying and honest: you retry, you fix the role, you move on [12]. A well-formed answer about the wrong file is worse than an error, because nothing in the workflow is designed to catch it, and nobody double-checks a response that looks perfectly correct [12]. The one grim detail is that the author learned about it from a comment describing the same bug in a tool he did not build, on an MCP codebase-intelligence server, which answered with a file path, a definition, and a list of references, all well-formed, all about the shadow definition [1].
Ranked by verification strength, evidence, and original report placement.
Issue #101 covers the 'unread' failure: a source fails to extract, the tool returns an empty list, and an empty list reads like 'there is nothing there' (e.g. saying 'no DLQ configured' after the SQS extractor threw a permissions error). The fix attaches a per-source status to every response so a failed read is never mistaken for an absent resource.
Issue #102 covers the 'stale' failure: data read correctly, then someone ran terraform apply. Every response now carries when the infrastructure was read and how long ago.
analyze_function is the tool an assistant is supposed to call before writing a handler; it reports which tables that function queries, how it queries them, which permissions its role is missing, and the exact event shape of its trigger. Its lookup was currentGraph.nodes.find((n) => n.type === 'function' && n.name === functionName), so first match wins silently. That is issue #103.
Function node IDs in the graph are file-scoped, built as function:${op.filePath}:${op.functionName} at src/graph/index.ts:452, so getOrder in src/handler.ts and getOrder in experiments/handler.ts are two genuinely distinct nodes with two distinct sets of outgoing edges.
The lookup matched on n.name alone, so which node came back depended on the order the AST scan happened to walk the file tree.
In the author's example, if the scan reaches experiments/handler.ts first, that scratch file queries public.users while the real handler scans public.orders and has a high-severity finding attached to that scan; the assistant gets back found: true, a real file path, a real list of table accesses, and real findings.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · September 1, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
Partial batch failures: the handler is fine, the mapping decides1 distinct publisher
build
Curator approval gates every record AWS Agent Registry shows a consumer1 distinct publisher
build
A gate that warns and a fan that queues: test the executor, not the card1 distinct publisher
build
MCP's empty-string cursor: the null check that hides most of a tool catalog1 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.
Code you can read, from the only witness
The mechanism is shown rather than asserted: the offending .find() call, the file-scoped node ID template at src/graph/index.ts:452, and the getSymbol() replacement all appear as code. What nobody outside can check is the repository they came from - it is the author's own and unnamed - and the bug report that started the audit reaches us second-hand through a comment about a product the post never identifies.
One repo, one comment
Everything sits inside one developer's issue tracker: #101 and #102 shipped, #44 fixed with code shown, #103 opened. The only sighting beyond that repository is a reader saying a different codebase-intelligence server handed back a shadow definition - one anecdote, no tool named, no counts. Real-world, and nothing like a measured pattern.
Small claim, wide conclusion
The demonstrated part is honest and narrow: name matching is not resolution, and .find() erases the fact that two candidates existed. The stretch is the jump from two occurrences in one codebase, written months apart, to the API shape pulling everyone toward the bug - plausible, unmeasured, and the piece's most quotable line. No product claims are inflated because barely any are made.
Auditing his own product in public
A developer writing critically about code he wrote, on a post that both advertises an infrastructure-context server and admits it shipped a silently wrong lookup. Self-criticism blunts the usual distortion - marketing copy does not open issue #103 - but the whole record of what broke, what was fixed and when is under one author's control, and the competitor whose bug started it stays anonymous.
Believable, uncorroborated
One publisher, one author, one repository, one relayed anecdote. These are claims that are easy to accept and hard to audit: internally consistent, code-level, and checked by nobody except the person who wrote both the bug and the essay about it. Confidence in the mechanism is decent; confidence in how much of the world it describes is not.