Skip to content

An internal policy id is printed as the prefix of an adopter-facing gap explanation (mixed_policy_evidence) #420

Description

@pengfei-threemoonslab

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:

  1. 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.
  2. 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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Queued; valuable but not blockingbugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions