Symptom
On a freshly adopted repo (framework detected, small tool surface), every turn that runs the local loop ends with "A human must review this change before it can merge" — including a docs-only or README-only edit. Reproduced 2026-07-27 on a fresh fixture built from main at contract v19.
Two mechanics combine:
verify passes user_requested=True (cli/verify/orchestrator.py:155), so the capability scan runs on every invocation regardless of what the diff touched — the adopted-repo force-run contract.
- A repo whose tool surface is not statically enumerable trips
evidence_below_ie_threshold, returning insufficient_evidence → merge_verdict: human_review_required.
The abstention is correct as a release judgement. Attached to a docs-only turn it reads as a non sequitur, and because insufficient_evidence is immune to baselines, suppressions, severity overrides, and human_ack by explicit contract — with every generated remedy actor: human — there is no action the agent can take.
Why now
Contract v19 (#291) graded the local boundary stop, so benign edits no longer hard-stop at check. That moved this to the top of the remaining coding-agent UX friction: it is now the main reason a routine turn still ends with a review notice.
Aggravating detail (disproved — see Revision)
init detects the framework with high confidence and writes a manifest that does not declare agent_bindings — so the routed onboarding path manufactures the very gap verify then abstains on.
Measured 2026-07-28: a repository with one literal Agent(...) resolves its root through the single-top-level-agent fallback and reports binding_coverage.gap_count == 0 without any agent_bindings key. init does not manufacture the gap.
Revision (2026-07-28, after PR #296)
Measuring the two real cold-start shapes retired most of the original direction, and found the actual root cause elsewhere. Kept open with the criteria below.
The root cause was discoverability, not the verdict. The decision engine already generated the exact manifest snippet each gap wants (EvidenceGapAction.declaration_template), but the only way to reach one was to walk report.json down to release_decision.evidence_coverage.evidence_gaps[].next_action.declaration_template. A three-line, one-time task looked like schema archaeology, so repositories stayed abstained indefinitely.
Retired — 1. init scaffolds agent_bindings. Wrong premise (above), and actively harmful: every CHANGE_ME line becomes a source warning, and four warnings crosses _MAX_TOLERATED_SOURCE_WARNINGS and trips the abstention on its own. The value init has is also the wrong selector — agent_bindings.root.object matches the assignment target for the OpenAI Agents SDK, not the detected name= literal.
Retired — 2. Scope the verdict to the diff. Circular: insufficient_evidence means the static view of the agent surface is unreliable, so a rule reasoning from that view cannot be trusted. A config-bound or dynamically constructed toolkit presents as a diff touching no recognized capability surface while changing what the agent can do — precisely the case the verdict exists for would escape it. The delta variant ("no new gaps versus base") fails identically, because an unseeable addition yields an identical gap set. The verdict stays.
Retired — 3. Agent-proposable declaration. Effect, authority, and binding declarations are human-owned by the do_not_auto_assert contract. An agent proposing a tool's effect is the invented evidence that contract forbids, so there is no agent-executable path to build here. (Structural tool-source proposals under #282 remain fine; those are not claims about behavior.)
Shipped in #296
suggested-declarations.yaml: the templates assembled next to the report, merged per target, deleted when nothing is owed.
- Three template defects that surfacing them exposed — the binding template asserted
complete: true / tools: [] on the human's behalf; the authority template was unfillable for every mode; the selector template pointed at a schema that could not accept it. Plus a guard test enumerating every shipped template.
- Gap attribution:
verify reports whether this diff introduced a gap or inherited it.
- Framework-correct low-confidence remedy (
tool_inventories does not exist for openai_agents_sdk).
Acceptance (revised)
The original two criteria — a docs-only turn with no human-review notice, and an agent-executable remediation — are withdrawn: the first requires the retired verdict change, the second is forbidden by do_not_auto_assert. What remains for this issue:
Non-goals (unchanged): weakening insufficient_evidence where the diff is a capability change; letting an agent author binding, effect, or authority declarations.
Symptom
On a freshly adopted repo (framework detected, small tool surface), every turn that runs the local loop ends with "A human must review this change before it can merge" — including a docs-only or README-only edit. Reproduced 2026-07-27 on a fresh fixture built from
mainat contract v19.Two mechanics combine:
verifypassesuser_requested=True(cli/verify/orchestrator.py:155), so the capability scan runs on every invocation regardless of what the diff touched — the adopted-repo force-run contract.evidence_below_ie_threshold, returninginsufficient_evidence→merge_verdict: human_review_required.The abstention is correct as a release judgement. Attached to a docs-only turn it reads as a non sequitur, and because
insufficient_evidenceis immune to baselines, suppressions, severity overrides, andhuman_ackby explicit contract — with every generated remedyactor: human— there is no action the agent can take.Why now
Contract v19 (#291) graded the local boundary stop, so benign edits no longer hard-stop at
check. That moved this to the top of the remaining coding-agent UX friction: it is now the main reason a routine turn still ends with a review notice.Aggravating detail (disproved — see Revision)
initdetects the framework with high confidence and writes a manifest that does not declareagent_bindings— so the routed onboarding path manufactures the very gapverifythen abstains on.Measured 2026-07-28: a repository with one literal
Agent(...)resolves its root through the single-top-level-agent fallback and reportsbinding_coverage.gap_count == 0without anyagent_bindingskey.initdoes not manufacture the gap.Revision (2026-07-28, after PR #296)
Measuring the two real cold-start shapes retired most of the original direction, and found the actual root cause elsewhere. Kept open with the criteria below.
The root cause was discoverability, not the verdict. The decision engine already generated the exact manifest snippet each gap wants (
EvidenceGapAction.declaration_template), but the only way to reach one was to walkreport.jsondown torelease_decision.evidence_coverage.evidence_gaps[].next_action.declaration_template. A three-line, one-time task looked like schema archaeology, so repositories stayed abstained indefinitely.Retired — 1.
initscaffoldsagent_bindings. Wrong premise (above), and actively harmful: everyCHANGE_MEline becomes a source warning, and four warnings crosses_MAX_TOLERATED_SOURCE_WARNINGSand trips the abstention on its own. The valueinithas is also the wrong selector —agent_bindings.root.objectmatches the assignment target for the OpenAI Agents SDK, not the detectedname=literal.Retired — 2. Scope the verdict to the diff. Circular:
insufficient_evidencemeans the static view of the agent surface is unreliable, so a rule reasoning from that view cannot be trusted. A config-bound or dynamically constructed toolkit presents as a diff touching no recognized capability surface while changing what the agent can do — precisely the case the verdict exists for would escape it. The delta variant ("no new gaps versus base") fails identically, because an unseeable addition yields an identical gap set. The verdict stays.Retired — 3. Agent-proposable declaration. Effect, authority, and binding declarations are human-owned by the
do_not_auto_assertcontract. An agent proposing a tool's effect is the invented evidence that contract forbids, so there is no agent-executable path to build here. (Structural tool-source proposals under #282 remain fine; those are not claims about behavior.)Shipped in #296
suggested-declarations.yaml: the templates assembled next to the report, merged per target, deleted when nothing is owed.complete: true/tools: []on the human's behalf; the authority template was unfillable for every mode; the selector template pointed at a schema that could not accept it. Plus a guard test enumerating every shipped template.verifyreports whether this diff introduced a gap or inherited it.tool_inventoriesdoes not exist foropenai_agents_sdk).Acceptance (revised)
The original two criteria — a docs-only turn with no human-review notice, and an agent-executable remediation — are withdrawn: the first requires the retired verdict change, the second is forbidden by
do_not_auto_assert. What remains for this issue:verifynames a concrete, human-executable next step, and following it moves the verdict off abstention. (Verified: filling the scaffold clearedinferred_effect_onlyandmissing_authority_evidence; the fixture went toblockedbecause the declaredfinancial_writetool has no approval policy.)fixture run ai_generated_refund_prunchanged; the abstention still fires where the diff is a capability change.benign_escalation_rate0.286 to a cold-start whole-repo-surface artifact; that attribution now needs re-testing, since the artifact was not what this work turned out to be about.must_block_caught/needs_human_caughtmust hold at 1.0.Non-goals (unchanged): weakening
insufficient_evidencewhere the diff is a capability change; letting an agent author binding, effect, or authority declarations.