4.2 KiB
Created
Created by tickets.sh create.
Plan
Preflight implementation plan
Classification: implementation-ready.
No product/API decision is needed before coding. ScopeSubDelegated remains a valid typed PodEvent for registry side effects and upward propagation, but must not enter the agent-visible notification/history/auto-kick lane.
Current code map:
crates/protocol/src/lib.rs:PodEventvariants and protocol roundtrip tests.crates/pod/src/controller.rs: idleMethod::PodEventhandler applies side effects, pushes notification, and auto-kicks; running-path handler applies side effects and pushes intoNotifyBuffer.crates/pod/src/ipc/event.rs: transport helpers andapply_event_side_effects;ScopeSubDelegatedregisters grandchild and re-emits upward.crates/pod/src/ipc/notify_buffer.rs: agent-visible notification/history lane.crates/pod/src/ipc/interceptor.rs: drainsNotifyBufferinto session history/context.- Existing tests: controller tests for visible
TurnEnded, pod events tests forScopeSubDelegatedregistry/re-emission, protocol roundtrips.
Implementation phases:
- Add
PodEvent::should_notify_agent()classification inprotocol: true forTurnEnded,Errored,ShutDown; false forScopeSubDelegated. - Gate idle-path notification/auto-kick in
controller.rs: always apply side effects; only push notify and scheduleRunForNotificationwhenshould_notify_agent()is true. - Gate running-path notification buffering the same way.
- Update comments/docs in protocol/controller/notify/event modules to distinguish control-plane side effects from agent-visible notifications.
- Add focused tests.
Critical risks:
- Never skip
apply_event_side_effectsforScopeSubDelegated. - Gate both idle and running receive paths.
- Do not change wire serialization or remove the event.
- Do not demote
ShutDown; it remains agent-visible. - Do not use rendering availability as the visibility decision.
Validation plan:
- Protocol test for
should_notify_agentclassification. - Controller test: idle
ScopeSubDelegatedupdates side effects as needed but creates noSystemItem::PodEvent, no auto-started LLM request, and parent remains idle. - Keep/verify existing positive
TurnEndedauto-kick test. - Existing
pod_events_testshould still pass for registry/re-emission. - Run
cargo test -p protocol pod_event,cargo test -p pod --test pod_events, focused controller pod-event tests, andcargo fmt --check.
Review: approve
Approve.
The implementation keeps PodEvent::ScopeSubDelegated on the typed IPC/control plane while removing it from the agent-visible notification/history/auto-run lane. The core change is an explicit PodEvent::should_notify_agent() classifier used by both controller event receive paths after side effects have already been applied.
Blocker findings: none.
Requirement coverage:
ScopeSubDelegatedside effects are still applied in both idle and running paths.- Upward re-emission remains in
apply_event_side_effects. ScopeSubDelegatedno longer entersNotifyBuffer, does not appendSystemItem::PodEvent, and does not auto-kickRunForNotification.TurnEnded,Errored, andShutDownremain agent-visible.- Wire serialization/protocol shape is unchanged.
- No new hidden history/context injection path was introduced.
Non-blocking follow-ups:
- Consider making misuse harder later by renaming/gating lower-level
push_pod_event_notify/NotifyBuffer::push_pod_eventAPIs or adding debug assertions. - Idle-path test does not directly assert registry side effect, but running-path and pod event side-effect tests cover it and the idle path calls the same side-effect function before gating.
Validation reviewed from coder report:
cargo fmt --check— passed.cargo test -p protocol pod_event— passed.cargo test -p pod --test pod_events_test— passed.cargo test -p pod --test controller_test pod_event— passed.- focused running-path tests for control-only and visible events — passed.
Final verdict: approve.