Skip to content

An author session that stops with nothing staged is resumed, not ended - #496

Merged
renmengye merged 4 commits into
mainfrom
fix/silent-session-stop
Oct 10, 2026
Merged

renmengye merged 4 commits into
mainfrom
fix/silent-session-stop

Conversation

@renmengye

Copy link
Copy Markdown
Member

Problem

When an author session ends without staging a syscall (no launch, sleep, submit or end), the orchestrator treats it as the end of the run: request is None breaks the decision loop and the attempt ends as "ended without a submit". Some models stop this way by accident:

  • an empty reply after a long reasoning turn;
  • a line of narration ("Let me check the data…") with no command after it.

In one study run, a run had found a new best in a sweep, and its next session ended on an empty reply before submitting. The result was lost, and the run ended with GPU budget left.

Change

If a session stops with nothing staged, the kernel resumes the same session with a note: nothing ran, the run is still open, continue, or stage end --report FILE if done. This happens up to SILENT_STOP_RESUMES (3) times per leg.

A stop keeps its old meaning (end, or park for review) when:

  • the kernel already sent a note in this leg (a refusal, a capacity note), or a scope refusal or gate verdict is pending, because then the stop is the agent's answer;
  • a PR is open (on_stop), because then the stop parks the run for review;
  • there is no launcher, or the harness cannot resume.

Tests

  • New: a silent stop is resumed, and an explicit end then ends the run; silent stops are bounded; with a PR open, a silent stop still parks.
  • Updated: two tests that pinned the old behavior in exactly this case (a wake with no PR, where the author replies without staging anything).

Compatibility

No persisted format changes. The note is an ordinary kernel note with a new key prefix (silent-stop:). Readers that match refusal: notes are unaffected.

Built by Claude (Opus 5.5); review by the advisory panel on this PR.

A session that ended without a syscall (an empty reply after long reasoning,
or narration with no command) ended its run as 'ended without a submit',
discarding the open run and any unsubmitted result. The kernel now resumes
the session with a note that nothing ran, up to three times per leg. A stop
after a kernel note, a gate verdict, or with a PR open is still the agent's
answer, and end still ends the run.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 1 — reviewed head 0d459c08 — reviewer summarizer:hermes/gpt-5.6-terra over coverage+credentials+deployment+general+lifecycle+prose.

terra
Advisory findings from outerloop — the code owner decides. Reply to disagree; the outerloop:no-review label opts this PR out.

Verdict: 1 blocking, 1 advisory.

2 findings attached to the lines below.

Merged one blocking orchestrator defect agreed by coverage, credentials, deployment, lifecycle, and prose: persisted capacity kernel notes are not recognized by the silent-stop retry guard. Also retained the coverage test-gap finding. Rejected: none; the lifecycle version was merged into the same blocking finding despite its non-blocking flag because it makes the same claim at the same location.

Comment thread src/outerloop/orchestrator.py Outdated
Comment thread tests/test_attempt.py
…top the author's answer

The silent-stop guard only saw notes sent during the leg; a capacity
refusal delivered with the wake was missed, so a stop answering it was
nudged. The guard now reads refusals pending from the leg's starting
cursor; pacing notes and launch results still allow the nudge. The
capacity-wake test pins that no nudge follows.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 1 — reviewed head 1eb0f21f — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from outerloop — the code owner decides. Reply to disagree; the outerloop:no-review label opts this PR out.

Verdict: nothing blocking — 1 advisory note.

1 finding attached to the lines below.

Refusal notes with other established key prefixes still trigger silent-stop retries.

Comment thread src/outerloop/orchestrator.py Outdated
refused: (stale submit), capacity-refusal: and publish-refused: notes were
not recognized, so a stop answering them was nudged. The keys live in one
tuple, and a test covers each.
@renmengye renmengye added outerloop:review re-request the advisory review and removed outerloop:review re-request the advisory review labels Oct 10, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 2 — reviewed head 278d48a7 — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from outerloop — the code owner decides. Reply to disagree; the outerloop:no-review label opts this PR out.

Verdict: 1 blocking, 0 advisory.

1 finding attached to the lines below.

A previously delivered scope refusal disables silent-stop recovery on later legs.

Comment thread src/outerloop/orchestrator.py Outdated
…er leg

scope_refused reads the whole inbox, so one answered scope refusal turned
the nudge off for the rest of the run. Refusals delivered with or during
the current leg already make a stop an answer; the history-wide flag is
dropped from the condition.
@renmengye renmengye added outerloop:review re-request the advisory review and removed outerloop:review re-request the advisory review labels Oct 10, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 3 — reviewed head 2a47e749 — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from outerloop — the code owner decides. Reply to disagree; the outerloop:no-review label opts this PR out.

Verdict: no defects found.

@renmengye
renmengye merged commit 76dd1b4 into main Oct 10, 2026
5 checks passed
@renmengye
renmengye deleted the fix/silent-session-stop branch October 10, 2026 02:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

outerloop:review re-request the advisory review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant