Skip to content

[bug] The idle-reap message teaches the user what a session is, then tells them to do something the platform already does by itself #695

Description

@serge-ivo

Two issues (#257, #408) went to real trouble to stop "session" being a word the user has to know. One string undoes both, and it is the last thing a returning user reads.

The string

lib/coding-session-sweeper.ts:120-123:

const head = `${IDLE_REAP_PREFIX} ${idleHours} hours with no activity`;
return engineStopped
	? `${head} — the engine process was released. Start a new session to pick the work back up.`
	: `${head}, but the engine could not be stopped on your machine — it may still be running. Check it there if you need the process gone.`;

with IDLE_REAP_PREFIX = "Session closed automatically after" (:109).

This is written into coding_timeline as the run's outcome row, so it is the final line of the repo history the console renders when the user comes back. #257's own comment (agents/coder/web/src/CodingTab.tsx:154) says the history exists so "the user must not be shown an empty screen with a 'Start a session' button where their work used to be" — and then the history's last line tells them to start a session.

It is also not true

The user does not need to start anything, and starting a new session is not how they get their work back — the platform reattaches with continuity on the next engagement. Verified 2026-08-17 on instance bd43f4de: POST /v1/instances/:id/coding/sessions after this exact reap returned "resumed": true with resumeFrom pointing at the reaped session, and the engine recalled its previous closing question verbatim.

So the sentence teaches a concept the user should never have needed, in order to instruct an action the platform performs by itself, using a word ("new") that describes the opposite of what happens.

Owner report, 2026-08-17

"I just tried to ask it to continue, but it said the session has ended and all output pane is gone."

and then:

"why do users have to know about sessions? why can't it just be seamless?"

The reap message is, as far as I can trace, where that knowledge came from.

Fix

The reap itself is correct and should stay — IDLE_SESSION_MS is 6h (:63) and its header explains it is deliberately set below one night so an abandoned tab does not hold a child process on someone's laptop until morning. That is a good decision about a real cost.

What changes is that the reap stops being an announcement:

  • Drop the instruction entirely. The user has nothing to do.
  • Prefer sleep vocabulary to death vocabulary, or emit no user-visible row at all and let the history simply continue at the next turn. "Asleep" is what actually happened; the work is intact.
  • The second branch (engine could not be stopped) IS worth telling a human — a stray process on their machine is their problem to know about. Keep that one, minus the session noun.

Related: #697, which is the sentence that should be there instead — resolveSessionContinuity already returns "the previous conversation on this repo was last touched 11 hours ago" and nothing displays it.

Grep for the noun elsewhere before closing: any user-facing string containing "session" in the coding surface is in scope, not just this one.

Metadata

Metadata

Assignees

No one assigned

    Labels

    backendBackend / Worker / API workbugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions