From 7efcd9340395e6a762b496e48b99168bd4b51c5f Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Fri, 23 Oct 2026 18:04:26 -0400 Subject: [PATCH 1/2] Trust boundary-decoded IDs through queued and tracked inputs --- src/agent_comms/acp_extension.py | 3 --- src/agent_comms/native_pi.py | 1 - src/agent_comms/queued_input.py | 2 +- src/agent_comms/tracked_turn.py | 3 +-- 4 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/agent_comms/acp_extension.py b/src/agent_comms/acp_extension.py index c4e9009466..4ff6d4010b 100644 --- a/src/agent_comms/acp_extension.py +++ b/src/agent_comms/acp_extension.py @@ -677,9 +677,6 @@ class PromptRequest(CommsRequest): default_factory=UnattributedInputOrigin, kw_only=True ) - def __post_init__(self): - Id128Text.decode(self.input_id) - @property def draft_text(self) -> str | None: return self.user_text diff --git a/src/agent_comms/native_pi.py b/src/agent_comms/native_pi.py index 3ac328281f..6bf74bc408 100644 --- a/src/agent_comms/native_pi.py +++ b/src/agent_comms/native_pi.py @@ -888,7 +888,6 @@ def read_tracked_input_commitment( An unreadable or malformed journal is not an uncommitted input and raises. """ - Id128Text.decode(input_id) session_file = Path(session_file).absolute() from .native_entries import NativeEvidenceRead diff --git a/src/agent_comms/queued_input.py b/src/agent_comms/queued_input.py index 2f42295321..42fab843f1 100644 --- a/src/agent_comms/queued_input.py +++ b/src/agent_comms/queued_input.py @@ -133,7 +133,7 @@ def capture( text or prompt or "[image prompt]", echo, context, - Id128Text.mint() if input_id is None else Id128Text.decode(input_id), + Id128Text.mint() if input_id is None else input_id, prompt, images, controller, diff --git a/src/agent_comms/tracked_turn.py b/src/agent_comms/tracked_turn.py index 2f2dfcbded..41431a8547 100644 --- a/src/agent_comms/tracked_turn.py +++ b/src/agent_comms/tracked_turn.py @@ -19,7 +19,7 @@ from .backend import InputStartListener, TurnSession from .coordinator import Coordination from .errors import RelationViolationError -from .field_codec import Id128Text, MalformedRecord +from .field_codec import MalformedRecord from .external_transcript import DraftRow from .following_inputs import FollowingInputs from .maintenance_barrier import UNCOORDINATED_INGRESS, MaintenanceIngress @@ -290,7 +290,6 @@ async def execute( execution: NativeExecution, following: FollowingInputs = NO_FOLLOWING_INPUTS, ) -> NativeTurnResult: - Id128Text.decode(input_id) if not prompt or not isinstance(prompt, str): raise ValueError("A native turn requires a nonempty prompt") measurements = startup.measurements From b3e27355e6cdf96e3721cc40ddebcbac8274fbdf Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Fri, 23 Oct 2026 18:05:13 -0400 Subject: [PATCH 2/2] Keep constructor validation on FieldCodec-decoded requests --- src/agent_comms/acp_extension.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/agent_comms/acp_extension.py b/src/agent_comms/acp_extension.py index 4ff6d4010b..c4e9009466 100644 --- a/src/agent_comms/acp_extension.py +++ b/src/agent_comms/acp_extension.py @@ -677,6 +677,9 @@ class PromptRequest(CommsRequest): default_factory=UnattributedInputOrigin, kw_only=True ) + def __post_init__(self): + Id128Text.decode(self.input_id) + @property def draft_text(self) -> str | None: return self.user_text