Skip to content

Decide: should a steer that arrives after Stop start a new turn? #293

Description

@Jacksondr5

Found in the #262 live pass (test B, evidence).

Repro: run sleep 40 on a cheap model and open the same thread in a second tab. Press Stop in tab 1, then Ctrl/⌘+Enter (steer) in tab 2 about 250 ms later. The steer starts a new turn, which then replies.

Why: the client sends deliveryIntent: "steer" (packages/client-runtime/src/operations/commands.ts ~771). Once the interrupt has ended the run, resolveMessageDispatchIntent (apps/server/src/orchestration-v2/CommandPolicy.ts ~119) finds no active run and returns start_immediately. J5's kept committed-Stop guard (Orchestrator.ts, FORK.md temporary patch) only covers steer_active, so this is consistent with today's rule that "an explicit new message can start new work". It's pre-existing, not a merge regression.

Why it matters for J5: a person rarely hits this race by hand, but agents do. An A2A message delivered right after stop_agent or Stop can wake the agent that was just stopped. This is the case the Astra steer guard was about.

Decide: when a message sent as a steer arrives after a committed Stop on the run it targeted, should it:

  • start a new turn (today)
  • be refused with a visible reason
  • be queued as held until the person resumes

Consider human steers and A2A delivery separately. Testing: this is hard to reproduce by hand, but it's deterministic in a server test: commit an interrupt, then dispatch a steer-intent message for that run.

Activity

  1. Jacksondr5 commented on Sep 28, 2026

    @Jacksondr5
    OwnerAuthor

    Posted by an AI agent on Jackson's behalf.

    Closing as not planned (Jackson, 2026-09-28), for two reasons:

    1. Controlling a thread's turns is upstream's area. J5 doesn't change it without a compelling reason. D5 (a committed Stop beats a steer that raced it) has one: stopping an agent while its peers are still messaging it is ordinary fleet work. A peer message landing in the same few milliseconds as Stop doesn't clear that bar.
    2. Millisecond races are edge cases J5 doesn't build for (principle: repair beats edge-case machinery). If it happens, press Stop again.

    The register (docs/j5/product/upstream.md, #329) keeps D5 as is. It wants to drop D5 once upstream honors a committed Stop itself.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions