Steering an autonomy job in its final/summary turn is silently dropped #93
Labels
No labels
prio_critical
prio_low
type_bug
type_contact
type_issue
type_lead
type_question
type_story
type_task
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
lhumina_code/hero_shrimp#93
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Symptom
Steered a running autonomy job ("add docs and tests") while it was wrapping up. The guidance was acknowledged ("will be picked up at the next checkpoint") but never applied — the job finished without docs/tests.
Root cause
There are two steering paths, and message-send steering uses the one with a timing gap:
session.steer->global_steering_inbox): drained every iteration atiteration_shell.rsL193-211 and folded in as a[steering #N]user message. Immediate.steer_existing_job_from_message(session_autonomy.rsL139-147), which does NOT touch the live inbox — it writespending_operator_guidance. That is only surfaced byOperatorGuidanceProvider(job_context.rsL171-201), which runs insidebuild_history— i.e. only when the orchestrator builds the prompt for the next turn/checkpoint.If the job is already in its finalization/summary turn ("deliverable is complete, let me just report the summary and be done"), there is no next checkpoint, so the queued guidance is never rendered into a prompt and is dropped.
Secondary:
pending_operator_guidanceis read but never cleared after consumption (job_context.rs), so on a job that does continue it can be re-injected every turn.Proposed fix
pending_operator_guidance; if present, force one more turn/replan instead of ending. (Fixes the exact case.)session.steer.pending_operator_guidanceonce consumed.Update: fails from BOTH UI entry points
Confirmed steering does nothing from either UI control — and they call different RPCs, so the failure spans both mechanisms, not just the checkpoint-timing gap above:
MessageInput.tsx:290->steerActiveTurn(store.ts:1126-1135)session.steeriteration_shell.rs:193-211)LiveJobPanel.tsx:271-275job.steerSteeringInput.tsx:37job.steerChatActivity.tsx:96session.steerThe original issue only explained the
job.steer/ checkpoint path. But the chat Steer button usessession.steer(the live inbox that’s drained every iteration) and that also doesn’t land — so the live-inbox path is broken too.Lead to verify: the live-inbox drain is gated on
options.session_idbeingSome(iteration_shell.rs:193—if let Some(sid) = state.options.session_id ...). If an autonomy job’s agent loop runs withsession_id: None,session.steerpushes to a key nothing ever drains, so it silently no-ops. Need to confirm whether autonomy turns thread the session id intoAgentOptions.Net: all four steering entry points fail for autonomy jobs —
job.steerones because guidance is only read at a next checkpoint that never comes, andsession.steerones likely because the loop has nosession_idto drain against (to confirm).