You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Owner ruling from the first Cut C corpus round (#508), 2026-09-03: insufficient_evidence should be rare, avoided where possible, and the reason worked out from first principles. This is that reasoning, the evidence behind it, and what it changes. It is a child of #518 and it supersedes #517.
Current implementation status — 2026-09-08
#519 has delivered the corrected labeling guide and approved 38-case pre-1.0 / 80-case beta policy. The initial 28-cell/56-case alternatives and calibration counts below remain historical rationale, superseded by that policy.
PR Qualification: report actual coverage misses without changing safety thresholds #562 reports actual-IE count/rate by profile, denominators, missed cases, named gaps and explicit unscored cases. Expected-IE exactness is explicitly not applicable on the three-label corpus. The shipped metric values and all approved thresholds remain unchanged.
The epic remains open for these obligations. No authority, binding or deployment claim may be invented to close a coverage gap.
First principles
A verdict routes a change to an outcome.passed ships with nobody looking; review_required puts a named thing in front of a person; blocked does not ship without review. insufficient_evidence routes nowhere. It is an abstention, and an abstention has to earn its place: it is only better than an answer when the answer would be wrong and the abstention leads somewhere.
A runtime or remote binding is itself a nameable capability. This is the mistake the guide and the engine share: they treat "I cannot enumerate the leaves" as "I cannot establish the authority." But the authority is not the leaves. It is the binding:
This agent will call whatever https://mapstools.googleapis.com/mcp advertises, under GOOGLE_MAPS_API_KEY.
That is a complete, citable, decidable statement of authority — and it is a larger one than a fixed tool list, because it is unbounded. Reporting "unbounded" as "unknown" downgrades the strongest finding into an abstention.
What is left for insufficient_evidence is a statement about the reader. Once every binding is nameable, the only honest remaining use is "the evidence I was given is incomplete" — the packet, or the adapter, could not read the input. That is a fact about shipgate, not about the change. It follows that:
insufficient_evidence cannot be a ground-truth label. Ground truth is what a correct gate should do; a correct gate with complete inputs can always name the binding. When shipgate emits it, shipgate is reporting that its own reader failed — a coverage defect, not a release decision.
That is #393 in one sentence: ADK extraction confidence capped at medium made insufficient_evidence every ADK repository's default verdict. An adapter gap was wearing a verdict's clothes.
What the engine actually means by it
insufficient_evidence is emitted when source warnings cross a threshold. The warning's own text (core/source_warnings.py): "this entrypoint's tool surface cannot be enumerated from source, supply it." It is, by construction, a statement about extraction.
Evidence from the corpus round
96 blind labels over 48 cases, two model families, the corrected guide (benchmark/safety-qualification/corpus-round-2026-09-03.md).
κ = 0.6111 against a floor of 0.80, and the disagreement is this line. Codex chose insufficient_evidence 13 times to claude's 5. Collapsing review_required/insufficient_evidence into one class lifts κ to 0.7322. Two raters on different model families, reading the same text over the same evidence, split consistently on one question:
The diff registers a tool by name; its endpoint and credential are citable; its advertised operations live outside the packet. Is that a capability you can name, or a surface that cannot be established?
Both were following the guide, because the guide says both — review_required was rewritten as "adds a capability you can name" (ruling 1) while the insufficient_evidence list still carries "an integration is mounted by name and its capabilities live somewhere the repository does not include."
The four cases where both raters agreed on insufficient_evidence are all nameable. What the tree lacks is a name — the thing is chosen at runtime — and in every one the binding itself is citable:
case
what decides the surface
named as a binding
google_adk.ie.2
application-supplied interceptor objects, registered with an external emitter
arbitrary code in the lifecycle → review_required/blocked
google_adk.ie.3
endpoint from OPENREGISTRY_MCP_URL; tools from the remote tools/list
deployment decides what the agent can call → review_required
multi_agent_handoffs.ie.2
handoffs from TRIAGE_ROUTES, dynamically imported
deployment decides the sub-agents → review_required
n8n.ie.2
a write-capable, unauthorised tool whose target workflow ID comes from the request body
the caller chooses what runs → blocked
The last row is the tell: insufficient_evidence was hiding a block. And its sibling slot, n8n.insufficient_evidence.1, was sourced as insufficient_evidence and both raters labeled it blocked.
The stratum was sourced against the behaviour being doubted. 12 of the 15 insufficient_evidence slots in the inventory carry target_basis: miner_label — chosen with the engine's verdict in view, and the engine over-produces this verdict. A corpus that keeps the stratum enshrines the defect as ground truth, which is the one thing a benchmark must not do.
What changes
1. The rater guide (benchmark/miner/LABELING.md)
The insufficient_evidence section collapses to its honest residue and gains a positive rule:
Name the binding. When a tool's operations are assembled at runtime, mounted from a remote, or chosen by a deployment value, the capability the agent gains is that binding — cite the call, the endpoint or variable, and the credential. Judge it as any capability: unbounded, unguarded and high-risk → blocked; bounded and attributable → review_required.
insufficient_evidence is for an incomplete packet, and a rater does not see one. Packets are validated complete before a session starts (MANIFEST.json, broken_symlinks, undescribable_changes). A rater who reaches for the label is being told the guide has a gap; the rationale must say what was unnameable, so the guide can be fixed.
The "mounted by name" bullet, the factory bullet and the environment-variable bullet all move under name the binding.
2. The corpus and its requirements
insufficient_evidence leaves the target vocabulary. The 28 profile × decision cells become 21; minimum_insufficient_evidence_exact goes; pre_release_safety_requirements() and the beta tier (minimum_insufficient_evidence_exact=19) change together.
The 15 insufficient_evidence slots in strata-inventory.csv are re-targeted from what the blind raters actually established, or retired. The 48 labeled cases are re-labeled against the corrected guide before any freeze.
Case count is the owner's arithmetic to settle: 21 × 2 = 42 at the current per-cell count, against floors of 13 passed / 14 review_required / 14 blocked = 41; or 56 kept by raising the per-cell count. The origin floor (23) and the holdout fraction are unchanged either way.
The four-value enum stays; removing a shipped value is a STABILITY.md deprecation and this does not need it.
No threshold moves. κ stays 0.80; the floors for the three real decisions stay.
Nothing is adjudicated toward strata-inventory.csv's target_decision.
Shipped surface touched
pre_release_safety_requirements() / production_safety_requirements() (28 → 21 strata, one floor removed); scripts/run_safety_qualification.py (the IE-exact metric becomes a coverage-miss metric); docs/release-evidence-policy-decision.md Amendment 1's corpus shape; the pre_1_0 policy's 56-case statement. Each is a documented change under STABILITY.md; none is a silent one.
corpus shape and acceptance change: 21 cells, no IE stratum; plus the 12 shipped-sample slots that have no base//head/ and cannot be a change packet at all (recorded in the round record)
The scorer reports actual-IE count/rate, denominators and cases per profile, with named gaps; expected-IE exactness is explicitly not applicable on the three-label corpus, not presented as successful coverage.
A fixture proves actual IE still counts against the existing applicable outcome metric; no safety bar or shipped verdict disappears.
PR #562 delivers the diagnostic scoring slice after two review/address rounds. Qualification v6 records actual-IE per-profile counts, all-case denominators, missed case IDs, existing named gaps and explicit unscored cases; old expected-IE 0/0 is marked not applicable without moving a threshold. The original 38-case safe-pass tolerance remains tested. Older grammar stays readable without fabricated diagnostics. #538 and #357 are also merged.
This epic remains open. Evidence-backed recovery ownership is deferred to #561; selected-corpus/signed qualification remain #509/#456, with the artifact read race #559 to repair before final scoring. The independent fixed-history run #312 found new workflow regressions #563/#564; passing the scorer's tests does not satisfy those release-exit bars.
Owner ruling from the first Cut C corpus round (#508), 2026-09-03:
insufficient_evidenceshould be rare, avoided where possible, and the reason worked out from first principles. This is that reasoning, the evidence behind it, and what it changes. It is a child of #518 and it supersedes #517.Current implementation status — 2026-09-08
#519 has delivered the corrected labeling guide and approved 38-case pre-1.0 / 80-case beta policy. The initial 28-cell/56-case alternatives and calibration counts below remain historical rationale, superseded by that policy.
Delivered engineering:
Remaining:
The epic remains open for these obligations. No authority, binding or deployment claim may be invented to close a coverage gap.
First principles
A verdict routes a change to an outcome.
passedships with nobody looking;review_requiredputs a named thing in front of a person;blockeddoes not ship without review.insufficient_evidenceroutes nowhere. It is an abstention, and an abstention has to earn its place: it is only better than an answer when the answer would be wrong and the abstention leads somewhere.A runtime or remote binding is itself a nameable capability. This is the mistake the guide and the engine share: they treat "I cannot enumerate the leaves" as "I cannot establish the authority." But the authority is not the leaves. It is the binding:
That is a complete, citable, decidable statement of authority — and it is a larger one than a fixed tool list, because it is unbounded. Reporting "unbounded" as "unknown" downgrades the strongest finding into an abstention.
What is left for
insufficient_evidenceis a statement about the reader. Once every binding is nameable, the only honest remaining use is "the evidence I was given is incomplete" — the packet, or the adapter, could not read the input. That is a fact about shipgate, not about the change. It follows that:That is #393 in one sentence: ADK extraction confidence capped at
mediummadeinsufficient_evidenceevery ADK repository's default verdict. An adapter gap was wearing a verdict's clothes.What the engine actually means by it
insufficient_evidenceis emitted when source warnings cross a threshold. The warning's own text (core/source_warnings.py): "this entrypoint's tool surface cannot be enumerated from source, supply it." It is, by construction, a statement about extraction.Evidence from the corpus round
96 blind labels over 48 cases, two model families, the corrected guide (
benchmark/safety-qualification/corpus-round-2026-09-03.md).κ = 0.6111 against a floor of 0.80, and the disagreement is this line. Codex chose
insufficient_evidence13 times to claude's 5. Collapsingreview_required/insufficient_evidenceinto one class lifts κ to 0.7322. Two raters on different model families, reading the same text over the same evidence, split consistently on one question:Both were following the guide, because the guide says both —
review_requiredwas rewritten as "adds a capability you can name" (ruling 1) while theinsufficient_evidencelist still carries "an integration is mounted by name and its capabilities live somewhere the repository does not include."The four cases where both raters agreed on
insufficient_evidenceare all nameable. What the tree lacks is a name — the thing is chosen at runtime — and in every one the binding itself is citable:google_adk.ie.2review_required/blockedgoogle_adk.ie.3OPENREGISTRY_MCP_URL; tools from the remotetools/listreview_requiredmulti_agent_handoffs.ie.2TRIAGE_ROUTES, dynamically importedreview_requiredn8n.ie.2blockedThe last row is the tell:
insufficient_evidencewas hiding a block. And its sibling slot,n8n.insufficient_evidence.1, was sourced asinsufficient_evidenceand both raters labeled itblocked.The stratum was sourced against the behaviour being doubted. 12 of the 15
insufficient_evidenceslots in the inventory carrytarget_basis: miner_label— chosen with the engine's verdict in view, and the engine over-produces this verdict. A corpus that keeps the stratum enshrines the defect as ground truth, which is the one thing a benchmark must not do.What changes
1. The rater guide (
benchmark/miner/LABELING.md)The
insufficient_evidencesection collapses to its honest residue and gains a positive rule:blocked; bounded and attributable →review_required.insufficient_evidenceis for an incomplete packet, and a rater does not see one. Packets are validated complete before a session starts (MANIFEST.json,broken_symlinks,undescribable_changes). A rater who reaches for the label is being told the guide has a gap; the rationale must say what was unnameable, so the guide can be fixed.The "mounted by name" bullet, the factory bullet and the environment-variable bullet all move under name the binding.
2. The corpus and its requirements
insufficient_evidenceleaves the target vocabulary. The 28 profile × decision cells become 21;minimum_insufficient_evidence_exactgoes;pre_release_safety_requirements()and thebetatier (minimum_insufficient_evidence_exact=19) change together.insufficient_evidenceslots instrata-inventory.csvare re-targeted from what the blind raters actually established, or retired. The 48 labeled cases are re-labeled against the corrected guide before any freeze.passed/ 14review_required/ 14blocked= 41; or 56 kept by raising the per-cell count. The origin floor (23) and the holdout fraction are unchanged either way.3. Scoring and the product
insufficient_evidenceverdict on a corpus case scores as a coverage miss. It never matches ground truth, because ground truth no longer contains it. The metric it feeds is adapter coverage, reported per profile, so the misses point at Python FastMCP servers have no route either:@mcp.toolis the largest measured registration idiom #484/The zero-install detector does not read MCP registration sites, so it still reports vendor MCP servers as non-agent projects #485-shaped work rather than at the user.ReleaseDecisionStatusis a shipped enum and is not removed. When emitted, the report frames it as a coverage gap — "shipgate could not enumerate<source>; supply<the named input>" — with An insufficient_evidence verdict is only a finding when it names what would resolve it #517's requirement carried forward: it must name the resolving input, and the route to supply it is the reviewed inventory / RFC: prove the MCP configuration review gap before adding committed capability state #474's committed capability state.What does not change
STABILITY.mddeprecation and this does not need it.strata-inventory.csv'starget_decision.Shipped surface touched
pre_release_safety_requirements()/production_safety_requirements()(28 → 21 strata, one floor removed);scripts/run_safety_qualification.py(the IE-exact metric becomes a coverage-miss metric);docs/release-evidence-policy-decision.mdAmendment 1's corpus shape; thepre_1_0policy's 56-case statement. Each is a documented change underSTABILITY.md; none is a silent one.Related open issues, and what each needs
base//head/and cannot be a change packet at all (recorded in the round record)insufficient_evidence exact 14/14; "42 cases that should be blocked, reviewed, or abstained on" → no abstention classbetalosesminimum_insufficient_evidence_exact=19needs_human; note thatie_rate_on_safeis a coverage-miss rateAcceptance
Refs #508, #456, #517, #518, #393, #328, #440, #538, #539.
Implementation update — 2026-09-08
PR #562 delivers the diagnostic scoring slice after two review/address rounds. Qualification v6 records actual-IE per-profile counts, all-case denominators, missed case IDs, existing named gaps and explicit unscored cases; old expected-IE 0/0 is marked not applicable without moving a threshold. The original 38-case safe-pass tolerance remains tested. Older grammar stays readable without fabricated diagnostics. #538 and #357 are also merged.
This epic remains open. Evidence-backed recovery ownership is deferred to #561; selected-corpus/signed qualification remain #509/#456, with the artifact read race #559 to repair before final scoring. The independent fixed-history run #312 found new workflow regressions #563/#564; passing the scorer's tests does not satisfy those release-exit bars.