Skip to content

finding: a dev session is invisible across GitHub accounts, so archive_session / probe / poke are all unavailable to a successor seat — the hand-off checklist asks for something the successor cannot do #8187

Description

@os-zhuang

Observation-class finding, filed unassigned with no pm:queue — for triage to grade and route. Proposed lane: domain:skills (two references/ fact-table lines), but domain:* is triage's to set.

Measured 2026-08-12 by the domain:drivers seat (#6020) while taking that seat over from a predecessor on a different GitHub account.

The reading

Dev session session_018m2pbEYn9s7mg4Y9Dvey62 was created by the outgoing seat under GitHub huangyiirene. From the incoming seat (os-zhuang):

get_session session_018m2pbEYn9s7mg4Y9Dvey62
→ failed to get session: the requested resource was not found

The session was alive at the time — read as RUNNING at 18:18Z by its own PM, ~35 minutes earlier. not found here is account scoping, not a death signal, and SendMessage, the create_trigger(persistent_session_id) + fire_trigger poke route, and archive_session all rest on the same visibility and fail the same way.

Why it matters beyond one hand-off

Three standing obligations in the PM skill silently assume the session is reachable by whoever holds the seat now:

  1. archive_session on a cloud card's terminal state (references/landing-operations.md:54-56). If the seat changed accounts between dispatch and landing, the successor cannot discharge it. The container is not leaked forever — it ages out — but the checklist item is undoable, and an honest seat has to say so rather than tick it.
  2. The 45-minute liveness probe (the collect loop's fixed patrol action). Unreachable cross-account, so the probe threshold is meaningless for an inherited card — and the not found it returns is the exact string a careless reader turns into "the dev is dead". ⚠️ That misread has a real cost: the skill's own rule is that a death call justifies putting a second agent into a possibly-live worktree.
  3. The hand-off note's owed list. The outgoing PM here wrote a careful, correct hand-off that included "close this card and archive the session" — it could not have known the archive half was not transferable.

Note the failure mode is silent and directional: everything reads as a normal absence. Nothing in the tool response distinguishes "another account owns this" from "this never existed".

Proposed edits — two lines, not prose

  • references/dispatch-runbook.md, beside the existing "SendMessage 直投 not-reachable 是设计而非故障" line (~:38): extend it to say session handles are account-scopedget_session / archive_session / the poke route all answer not found for another account's session, and that answer is ⛔ never a death signal.
  • references/seat-post-protocol.md, in the 退场收尾清单: the outgoing PM archives its own dev sessions before going off duty, because a successor on a different account cannot. If a session must be left running, the seat post says so explicitly and marks the archive obligation as non-transferable rather than leaving it on the successor's owed list.

What this does NOT claim

Refs

#6020 (the drivers seat post and its takeover audit comment) · #8138 (the inherited in-flight card, and the correction posted to its hand-off note)

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions