Summary
An internal policy identifier is printed verbatim as the prefix of a user-facing evidence-gap explanation:
mixed_policy_evidence | builtin-effect-control-applicability: Policy applicability mixes authoritative and heuristic evidence.
builtin-effect-control-applicability is a rule id from core/lenses/action_surface.py:404. To a reader it looks like a log line that escaped into the report, and it appears at the moment they are least equipped to absorb it — immediately after a declaration they wrote was challenged.
Not covered by #329, and deliberately so
I checked before filing, and this is outside the guard #329 established rather than a hole in it. internal_vocabulary() (core/adopter_text.py:189) detects internal identity terms — derived ids and identity-model vocabulary — which is exactly what #329 set out to remove. Run against the real string it returns clean:
>>> internal_vocabulary('builtin-effect-control-applicability: Policy applicability mixes authoritative and heuristic evidence.')
()
So no existing rule is failing. The observation is that internal rule/policy identifiers are a second category of internal string that reaches the same adopter surfaces, and the mechanism #329 built for the first category has no equivalent for it.
Reproduction
google/adk-samples#1745, python/agents/smart_closer, CLI 0.16.0b7 at aa6bd618. Manifest declaring send_email with effect: read (below its inferred external_communication) — i.e. any run that trips the #409 monotone rule:
agents-shipgate scan -c <manifest> --format json
python3 -c "
import json
r=json.load(open('agents-shipgate-reports/report.json'))
for g in r['release_decision']['evidence_coverage']['evidence_gaps']:
if g['kind']=='mixed_policy_evidence': print(g['why'])
"
Both gaps a reader sees at that moment, side by side:
declaration_below_inferred_evidence declared effect 'read' is weaker than inferred 'external_communication' evidence (risk_hint:keyword)
mixed_policy_evidence builtin-effect-control-applicability: Policy applicability mixes authoritative and heuristic evidence.
The first names the tool, both values, and the source of the inference. The second names an internal rule and restates its own gap kind in abstract terms — no tool, no values, no action.
Suggested direction
Two independent parts, either useful alone:
- Drop the
policy_id prefix from adopter-facing text, or move it to a structured field beside why where a machine reader can still use it.
- Give
mixed_policy_evidence the shape its sibling already has — name the subject, the two kinds of evidence in tension, and what closes it. "Policy applicability mixes authoritative and heuristic evidence" is a statement about the resolver, not about the reader's manifest.
Worth considering whether the #329 guard should grow a second term class for rule and policy identifiers, so this category cannot reappear the way the identity terms did.
Found 2026-08-24 on the fifth adoption walk of adk-samples#1745, at the point where the #409 monotone rule fires. Walk context: #410 (comment)
Summary
An internal policy identifier is printed verbatim as the prefix of a user-facing evidence-gap explanation:
builtin-effect-control-applicabilityis a rule id fromcore/lenses/action_surface.py:404. To a reader it looks like a log line that escaped into the report, and it appears at the moment they are least equipped to absorb it — immediately after a declaration they wrote was challenged.Not covered by #329, and deliberately so
I checked before filing, and this is outside the guard #329 established rather than a hole in it.
internal_vocabulary()(core/adopter_text.py:189) detects internal identity terms — derived ids and identity-model vocabulary — which is exactly what #329 set out to remove. Run against the real string it returns clean:So no existing rule is failing. The observation is that internal rule/policy identifiers are a second category of internal string that reaches the same adopter surfaces, and the mechanism #329 built for the first category has no equivalent for it.
Reproduction
google/adk-samples#1745,python/agents/smart_closer, CLI0.16.0b7ataa6bd618. Manifest declaringsend_emailwitheffect: read(below its inferredexternal_communication) — i.e. any run that trips the #409 monotone rule:Both gaps a reader sees at that moment, side by side:
The first names the tool, both values, and the source of the inference. The second names an internal rule and restates its own gap kind in abstract terms — no tool, no values, no action.
Suggested direction
Two independent parts, either useful alone:
policy_idprefix from adopter-facing text, or move it to a structured field besidewhywhere a machine reader can still use it.mixed_policy_evidencethe shape its sibling already has — name the subject, the two kinds of evidence in tension, and what closes it. "Policy applicability mixes authoritative and heuristic evidence" is a statement about the resolver, not about the reader's manifest.Worth considering whether the #329 guard should grow a second term class for rule and policy identifiers, so this category cannot reappear the way the identity terms did.
Found 2026-08-24 on the fifth adoption walk of
adk-samples#1745, at the point where the #409 monotone rule fires. Walk context: #410 (comment)