Build1 distinct publisher3 min readPublished
Google ADK's output_key writes into whichever agent's session declared it, and in-process that session is shared. A branch-coverage gate that only ever runs the single-process topology cannot reach the failing path.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Start with the read. `ctx.session.state.get(AUDIT_FINDINGS_KEY)` is a dictionary lookup with a default [6]. In-process, that dictionary belongs to a session both agents share, so the Auditor's `output_key` write is sitting there when the Orchestrator looks [1][2]. Move the Auditor behind a `RemoteA2aAgent` and the same lookup runs against the caller's session while the write lands in the worker's [3]. A missing key returns the default, which is exactly what a well behaved dictionary should do.
Which line executed is a property of the code. Which session object that line executed against is a property of the deployment. A statement and branch gate proves the first and is silent on the second, which is why Arjun Ganesh's fleet could pass its configured coverage gate on the in-process graph [5][21]. The diff between the passing shape and the failing one is one argument list: same graph, different construction, including `a2a_request_meta_provider=_forward_investigation` [7]. For a coverage figure to say anything about the deployed system, CI would have to stand up a second process with its own session service and route the hop over real A2A transport. Absent that, the number is a claim about the single-process topology and nothing else.
There are two loss directions, and the writeup is careful to separate them: a remote worker writing `output_key` into its own session without exposing it to the caller, and a caller-side event whose useful result exists only as state, contributing no outgoing A2A content for the next remote step [9]. Neither throws. Ganesh notes that plausible older content can remain in the caller and keep the workflow looking successful while the new state never crossed [10], and his summary of that is the honest one: a silent wrong answer "only beats a loud failure in the sense that it survives longer" [11].
The repair is the part worth copying. Authoritative findings now cross as structured message content, and reading the reply is sound rather than a hack because `output_schema` makes the Auditor's final content validated JSON instead of prose the caller has to interpret; unparseable output is skipped and an empty result fails closed downstream [12]. The caller then checks that content field by field against deterministic tool output, so IDs, categories, departments, scores and required routing must all match, and a model can supply bounded rationale but cannot author or alter the finding set [13]. Correlation is split by scope: `invocation_id` groups one ADK run and stops at the boundary, while `investigation_id` travels as request metadata that no model reads or restates [14]. Completion is explicit, gated on a validated receipt for every required department delivery [15].
Upstream, the deployed reproducer and both directions are in google/adk-python#6854, still open [16]. Sylvester Kaczmarek's #6859 covers the state-only outbound loss and the rejected inbound remote-state-delta case, also open and unmerged [17]. A Google collaborator has said the `output_key` half is expected behaviour because remote sessions are per-agent by design, which Ganesh accepts, having asked for the boundary to become observable rather than for the semantics to change [18]; he supplied the reproduction they requested for testing #6859 the same day [19]. Two days after the deployed run, a Google maintainer closed his #6862 construction-time warning unmerged [20][22]. So the detector, for now, is yours to build, and a validated contract at the seam is cheaper than copying state across it.
Ranked by verification strength, evidence, and original report placement.
Across a RemoteA2aAgent hop the output_key write goes into the worker's session and never comes back; nothing raises and nothing warns.
The deployed reproducer and both loss directions are filed in google/adk-python#6854, which is open.
An ADK output_key writes into the session of the agent that declares it.
In-process, that session is shared, so it looks like state flows from one step to the next.
Bastion is a three-agent access-governance fleet built with Google ADK and A2A: an Orchestrator owns investigation state, an Access Auditor reads production IAM through a read-only identity, and a model-free Escalation Agent delivers validated count-only reviews.
In-process the Orchestrator reads the Auditor's result with report = ctx.session.state.get(AUDIT_FINDINGS_KEY).
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 29, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
One instruction to delete the sample data surfaced three invisible defects in an hour1 distinct publisher
build
A prompt-injection filter at maximum sensitivity missed the real attack and caught the textbook one1 distinct publisher
build
The A2A card said 0.0.0.0:8080, and the only caller it broke was Google's1 distinct publisher
build
The demo passed because Cloud Run didn't scale: a correlation bug that emits no error1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
First-hand, numbered, unaudited
Everything traces to one participant writing about a fleet he built himself. What lifts it above anecdote is that the falsifiable parts carry numbers: google/adk-python#6854, #6859, #6862, a maintainer reply quoted at length, a failure dated 2026-08-22, and the deployed constructor shown as code. What holds it down is that the failing run appears only as a paraphrase of one refusal string, Bastion's code is nowhere to be inspected, and no second party has pulled any of those threads.
One fleet, three tickets, zero merges
The visible blast radius is a single three-agent hackathon system. Upstream the tally is an open issue, an open community pull request, and a construction-time warning closed unmerged on 2026-08-24 — nothing landed. No other practitioner is on record hitting this, which is what you would expect of a seam most teams meet only after they split a graph across workers.
Undersells its own scoreboard
The headline promises a coverage scandal and then the body argues against its own author: semantics confirmed as intended, patch closed, fix belonging elsewhere. "Nothing here is merged. Check the live state before you repeat any of it" is not the sentence of someone inflating a win, and neither is reprinting the review comment that his own reflection check was import-order sensitive. The small residue of overreach is the coverage framing itself, which leans on a gate whose configured scope is never disclosed.
Hackathon entry, stated in line one
This was written to enter the All Things Agentic Hackathon, and it says so before any technical content — which shapes the packaging: a named system, a discovery arc, a redesign presented as a contract. The countervailing pressure is that the author is also the reporter whose patch was rejected two days after he saw the failure, and he had every reason to describe that as vendor endorsement. He does the opposite, explicitly writing that this is not the same thing as Google accepting his fix.
Checkable in public, unchecked here
The limit is arithmetic rather than suspicion: one publisher, one author, one deployment, one dated incident. The claims are unusually easy to falsify — anyone can open #6854, #6859 and #6862 and read today's state, which the piece invites — but nothing in this coverage does that checking, and issue state moves. Confidence in the ADK semantics is materially higher than confidence in the upstream scoreboard.