The moment of choice
Declared in Advance
Two metrics carry the same name and answer different questions. Every mechanism that keeps them apart assumes a person is standing at the moment of choice, reading the source column. Take that person away and see which of the four cases your stack is in.
The twins
Finance builds net revenue retention from the contract table. Sales Ops builds net revenue retention from the billing export. Both are correct, and they separate on the quarter the question lands on.
Set who is asking and whether a declaration exists, then watch the screen and the trace change together.
Who is at the moment of choice
Has anyone declared which one answers this
She reads the source column
Right answer, and nobody will ever know she chose
Metric picker
What was net revenue retention last quarter?
Net revenue retention
112%finance contract table, owned by Finance
holds the original contract value through a mid-term change
Net revenue retention
119%sales ops billing export, owned by Sales Ops
counts a mid-term change as expansion in the month it bills
What the trace records
- search "net revenue retention" returned 2 candidates
- rendered both rows with source and owner
- analyst selected metric.finance_nrr
The choice happened in her head. The system stored the click, not the reason.
Both rows are on her screen. She reads the source column, remembers which one last quarter used, and picks the finance number in about four seconds. The judgment is sound and it happens dozens of times a week.
What the business gets back
112% from the finance contract table
The same story on a clock
The window to declare closes months before the question is ever asked.
When somebody could still have been asked
The two controls above set a state. This is the same scene as a sequence, and it is the part that does not show up in any architecture diagram. The people who could answer which twin the question means are present for a few weeks, while the metric is being built and while somebody still remembers why. The query lands months after they stopped paying attention. A declaration is not paperwork, it is the only channel that reaches across that gap.
This is not a data problem, it is a timing problem
The protocol layer already worked it out, one floor down.
Two servers, one tool name
The Model Context Protocol spec says tool name uniqueness is scoped to a single server, and that a client aggregating several servers may hit collisions, two servers each exposing a search tool, and should prefix names with a server identifier. It also names what will not save you. The server name is not guaranteed to be unique and should not be relied on for disambiguation.
Model Context Protocol, Tools ↗What the benchmarks grade
Spider 2.0 runs 632 real enterprise workflow problems on databases that often carry more than 1,000 columns. Execution accuracy compares the generated query against one correct target, which means a person already decided which table the question meant. Models keep getting better at the part that starts after that decision.
Spider 2.0, Lei et al. ↗The timing claim
An agent cannot ask which one you meant. It can only be told, and it has to have been told already.
Every disambiguation mechanism in this architecture assumed a human standing at the moment of choice. Agent to agent consumption deletes that station, so the judgment has to exist before the question arrives, attached to something durable enough to still be there at 2am. A declaration written after the agent has already answered is not governance. It is a postmortem.
Read the full article
Declared in Advance, on Substack