Skip to content

feat(coding-agent): lazy child session hydration - #583

Merged
snimu merged 7 commits into
mainfrom
feat/lazy-child-hydration
Aug 5, 2026
Merged

snimu merged 7 commits into
mainfrom
feat/lazy-child-hydration

Conversation

@snimu

@snimu snimu commented Aug 2, 2026 •

Copy link
Copy Markdown
Contributor

When you opened a session that had spawned subagents, we used to load every finished subagent back into memory as a full runtime, immediately, whether or not you ever looked at them. That's wasted memory and startup time.

With this change, finished subagents just stay on disk. They only get loaded when something actually touches them: you attach to one, read its transcript, send it a message, or delete it. Until then they're just a registry entry and a transcript file.

Details worth knowing:

  • Lists (the agents view, list_subagents, etc.) show these on-disk children without loading them.
  • If two things try to wake the same child at once, they share one load instead of racing each other.
  • Deleting an on-disk child marks it deleted in the registry but keeps its files, same as deleting a live one.

This is part 1–7 of a stack (each PR builds on the one before it):

  1. feat(coding-agent): lazy child session hydration #583 — don't load finished subagents until someone needs them
  2. feat(coding-agent): persist parent edges and derived depth for all sessions #584 — record each session's parent and depth on disk
  3. feat(coding-agent): /rlm-max-depth session command #585 — new /rlm-max-depth command to control how deep agents can nest
  4. feat(coding-agent): recursive scoped agents view #586 — browse the agent tree in the agents view
  5. feat(coding-agent): delete child-agent inspector; one subagent summary line #587 — replace the child-agent inspector with one summary line
  6. feat(coding-agent): whole-tree idle eviction #588 — shut down worker processes whose sessions have all gone idle
  7. feat(coding-agent): intra-tree child session passivation #589 — quietly unload idle child sessions inside a running worker

Tests: the full suite at the top of the stack fails only on tests that already fail on the base branch. Each branch in the stack also passes checks and its own tests independently.

Note

Add lazy hydration of passive child sessions in the coding agent daemon

  • Passive RLM subagents (completed children persisted to disk) are now enumerated from registry files without creating runtimes, and appear in list, attach, create, observe, and messaging commands.
  • When a command targets a passive subagent, the daemon hydrates it on demand by walking the ancestor chain and restoring runtimes in order, deduplicating concurrent hydration via openingSessions.
  • AgentSession.listRlmSubagents is now async and merges daemon-reported passive children into local results; deleteRlmSubagent handles passive entries with stricter ambiguity detection.
  • Protocol schema is bumped to revision 9 (DAEMON_SCHEMA_REVISION) to advertise the new rlmDepth field on passive session rows.
  • Risk: registry IO throughout the daemon is now async; callers that previously accessed listRlmSubagents synchronously must now await it.

Changes since #583 opened

  • Added reservation checking to AgentDaemon.rehydrateCompletedRlmSubagent method to wait for concurrent explicit session opens [617ecca]
  • Added test coverage for reservation-based hydration coordination behavior [617ecca]

Macroscope summarized 0e6a645.


Note

Medium Risk
Touches daemon session lifecycle, RLM registry IO, cron heartbeat restore, and async breaking changes to listRlmSubagents and host controllers; race coalescing is new but heavily tested.

Overview
Lazy passive RLM children replace eager rehydration of every completed subagent when a parent opens. The daemon walks persisted rlm-subagents.jsonl registries to list passive children (including nested trees and non-resident saved roots) without creating runtimes, and bumps daemon schema revision 9 with rlmDepth on passive session rows.

On-demand hydration runs when create, attach, agent messaging, agent_observe, or RLM heartbeat restore targets a passive child: the ancestor chain is rehydrated in order, concurrent opens share openingSessions, and half-bound sessions wait on bindingCompletions instead of failing as unavailable.

AgentSession makes listRlmSubagents async, merges daemon-reported passive children (via sessionDir on agent summaries), and extends deleteRlmSubagent for passive-only children (optional session on deleteRlmSubagentRuntime, ambiguity checks against async listAgents). Host handlers for agent message, observe, and RLM list now await controllers that may return promises.

Supervisor paths forward create to the owning worker when the target is a passive child row, and retain passive summaries in cross-worker agent peer sync.

Reviewed by Cursor Bugbot for commit 617ecca. Bugbot is set up for automated code reviews on this repo. Configure here.

Comment thread packages/coding-agent/src/modes/daemon/daemon-mode.ts Outdated
Comment thread packages/coding-agent/src/modes/daemon/daemon-supervisor.ts
Comment thread packages/coding-agent/src/core/rlm-runtime.ts
Comment thread packages/coding-agent/src/modes/daemon/daemon-mode.ts
Comment thread packages/coding-agent/src/core/agent-session.ts
Comment thread packages/coding-agent/src/modes/daemon/daemon-mode.ts
Comment thread packages/coding-agent/src/modes/daemon/daemon-mode.ts
Comment thread packages/coding-agent/src/modes/daemon/daemon-mode.ts
snimu added a commit that referenced this pull request Aug 3, 2026
…letion races

- Finding 0: heartbeat restore could return a concurrently hydrating child before binding; fence resident fallback with waitForBoundSession and treat unavailable binding as a skipped dispatch. origin: PR #583
- Finding 1: supervisor child lookup accepted only exact selectors after worker suffix matching; add the same session-ID suffix fallback within the selected worker. origin: PR #583
- Finding 3: passive create hydration skipped explicit name and client environment bookkeeping; apply both before returning the hydrated state. origin: PR #583
- Finding 4: concurrent passive deletions raced through asynchronous resolution and started duplicate host deletes; defer deletion behind an atomic in-flight map check and coalesce callers. origin: PR #583
- Finding 5: concurrent hydration could make a passive lookup stale for advertised IDs and paths; retry normal bound-session resolution before rethrowing the original unknown-session error. origin: PR #583
- Finding 6: ambiguous live selectors fell through to passive lookup and could misroute; introduce a dedicated ambiguity error and rethrow it before passive resolution. origin: PR #583
- Finding 7: passive open skipped name and client-env bookkeeping (cron rebinding already occurred in addRuntime); apply only the missing bookkeeping. origin: PR #583
- Finding 30: rlmChildId traffic treated a resident passivating child as closing; join passivation and rehydrate in both bound lookup and direct message hydration branches. origin: PR #589
@snimu
snimu changed the base branch from refactor/session-action-cleanup to main August 3, 2026 12:05
@snimu
snimu force-pushed the feat/lazy-child-hydration branch from da7fd00 to 9333b1e Compare August 3, 2026 12:05
snimu added a commit that referenced this pull request Aug 3, 2026
…letion races

- Finding 0: heartbeat restore could return a concurrently hydrating child before binding; fence resident fallback with waitForBoundSession and treat unavailable binding as a skipped dispatch. origin: PR #583
- Finding 1: supervisor child lookup accepted only exact selectors after worker suffix matching; add the same session-ID suffix fallback within the selected worker. origin: PR #583
- Finding 3: passive create hydration skipped explicit name and client environment bookkeeping; apply both before returning the hydrated state. origin: PR #583
- Finding 4: concurrent passive deletions raced through asynchronous resolution and started duplicate host deletes; defer deletion behind an atomic in-flight map check and coalesce callers. origin: PR #583
- Finding 5: concurrent hydration could make a passive lookup stale for advertised IDs and paths; retry normal bound-session resolution before rethrowing the original unknown-session error. origin: PR #583
- Finding 6: ambiguous live selectors fell through to passive lookup and could misroute; introduce a dedicated ambiguity error and rethrow it before passive resolution. origin: PR #583
- Finding 7: passive open skipped name and client-env bookkeeping (cron rebinding already occurred in addRuntime); apply only the missing bookkeeping. origin: PR #583
- Finding 30: rlmChildId traffic treated a resident passivating child as closing; join passivation and rehydrate in both bound lookup and direct message hydration branches. origin: PR #589
@macroscopeapp

macroscopeapp Bot commented Aug 3, 2026 •

Copy link
Copy Markdown
Contributor

Macroscope has since reviewed this pull request. An earlier review was skipped by a cost limit; a review has now completed, so that notice no longer applies.

Comment thread packages/coding-agent/src/core/agent-session.ts
Comment thread packages/coding-agent/src/modes/daemon/daemon-mode.ts
Comment thread packages/coding-agent/src/modes/daemon/daemon-mode.ts
Comment thread packages/coding-agent/src/modes/daemon/daemon-mode.ts
Comment thread packages/coding-agent/src/modes/daemon/daemon-mode.ts
Comment thread packages/coding-agent/src/modes/daemon/daemon-mode.ts Outdated
Comment thread packages/coding-agent/src/modes/daemon/daemon-mode.ts
Comment thread packages/coding-agent/src/modes/daemon/daemon-mode.ts
Comment thread packages/coding-agent/src/modes/daemon/daemon-supervisor.ts
Comment thread packages/coding-agent/src/core/agent-session.ts
snimu added a commit that referenced this pull request Aug 3, 2026
…ots, and depth ingestion

- preserve daemon routable IDs for passive children (origin: PR #583)
- recheck guarded passive hydration and heartbeat restores (origin: PR #583)
- repair wrong-kind pending hydration joins (origin: PR #583)
- fence passive hydration during update restart preparation (origin: PR #583)
- validate persisted RLM depth before constructor ingestion (origin: PR #584)
- retry attach child snapshots across session replacement (origin: PR #587)
- retain effective depth for legacy parented new sessions (origin: PR #589)
- coordinate parent passivation with child hydration publication (origin: PR #589)
snimu added a commit that referenced this pull request Aug 3, 2026
…ancellation

The ownership-blind close closed shared hydrations out from under concurrent wakes (both interleavings); the idle sweep is the ownership-free arbiter.

origin: round-4 fix b956400 / PR #583
snimu added a commit that referenced this pull request Aug 4, 2026
…letion races

- Finding 0: heartbeat restore could return a concurrently hydrating child before binding; fence resident fallback with waitForBoundSession and treat unavailable binding as a skipped dispatch. origin: PR #583
- Finding 1: supervisor child lookup accepted only exact selectors after worker suffix matching; add the same session-ID suffix fallback within the selected worker. origin: PR #583
- Finding 3: passive create hydration skipped explicit name and client environment bookkeeping; apply both before returning the hydrated state. origin: PR #583
- Finding 4: concurrent passive deletions raced through asynchronous resolution and started duplicate host deletes; defer deletion behind an atomic in-flight map check and coalesce callers. origin: PR #583
- Finding 5: concurrent hydration could make a passive lookup stale for advertised IDs and paths; retry normal bound-session resolution before rethrowing the original unknown-session error. origin: PR #583
- Finding 6: ambiguous live selectors fell through to passive lookup and could misroute; introduce a dedicated ambiguity error and rethrow it before passive resolution. origin: PR #583
- Finding 7: passive open skipped name and client-env bookkeeping (cron rebinding already occurred in addRuntime); apply only the missing bookkeeping. origin: PR #583
- Finding 30: rlmChildId traffic treated a resident passivating child as closing; join passivation and rehydrate in both bound lookup and direct message hydration branches. origin: PR #589
snimu added a commit that referenced this pull request Aug 4, 2026
…ots, and depth ingestion

- preserve daemon routable IDs for passive children (origin: PR #583)
- recheck guarded passive hydration and heartbeat restores (origin: PR #583)
- repair wrong-kind pending hydration joins (origin: PR #583)
- fence passive hydration during update restart preparation (origin: PR #583)
- validate persisted RLM depth before constructor ingestion (origin: PR #584)
- retry attach child snapshots across session replacement (origin: PR #587)
- retain effective depth for legacy parented new sessions (origin: PR #589)
- coordinate parent passivation with child hydration publication (origin: PR #589)
snimu added a commit that referenced this pull request Aug 4, 2026
…ancellation

The ownership-blind close closed shared hydrations out from under concurrent wakes (both interleavings); the idle sweep is the ownership-free arbiter.

origin: round-4 fix b956400 / PR #583
snimu added a commit that referenced this pull request Aug 4, 2026
…letion races

- Finding 0: heartbeat restore could return a concurrently hydrating child before binding; fence resident fallback with waitForBoundSession and treat unavailable binding as a skipped dispatch. origin: PR #583
- Finding 1: supervisor child lookup accepted only exact selectors after worker suffix matching; add the same session-ID suffix fallback within the selected worker. origin: PR #583
- Finding 3: passive create hydration skipped explicit name and client environment bookkeeping; apply both before returning the hydrated state. origin: PR #583
- Finding 4: concurrent passive deletions raced through asynchronous resolution and started duplicate host deletes; defer deletion behind an atomic in-flight map check and coalesce callers. origin: PR #583
- Finding 5: concurrent hydration could make a passive lookup stale for advertised IDs and paths; retry normal bound-session resolution before rethrowing the original unknown-session error. origin: PR #583
- Finding 6: ambiguous live selectors fell through to passive lookup and could misroute; introduce a dedicated ambiguity error and rethrow it before passive resolution. origin: PR #583
- Finding 7: passive open skipped name and client-env bookkeeping (cron rebinding already occurred in addRuntime); apply only the missing bookkeeping. origin: PR #583
- Finding 30: rlmChildId traffic treated a resident passivating child as closing; join passivation and rehydrate in both bound lookup and direct message hydration branches. origin: PR #589
snimu added a commit that referenced this pull request Aug 4, 2026
…ots, and depth ingestion

- preserve daemon routable IDs for passive children (origin: PR #583)
- recheck guarded passive hydration and heartbeat restores (origin: PR #583)
- repair wrong-kind pending hydration joins (origin: PR #583)
- fence passive hydration during update restart preparation (origin: PR #583)
- validate persisted RLM depth before constructor ingestion (origin: PR #584)
- retry attach child snapshots across session replacement (origin: PR #587)
- retain effective depth for legacy parented new sessions (origin: PR #589)
- coordinate parent passivation with child hydration publication (origin: PR #589)
snimu added a commit that referenced this pull request Aug 4, 2026
…ancellation

The ownership-blind close closed shared hydrations out from under concurrent wakes (both interleavings); the idle sweep is the ownership-free arbiter.

origin: round-4 fix b956400 / PR #583
snimu added a commit that referenced this pull request Aug 4, 2026
…letion races

- Finding 0: heartbeat restore could return a concurrently hydrating child before binding; fence resident fallback with waitForBoundSession and treat unavailable binding as a skipped dispatch. origin: PR #583
- Finding 1: supervisor child lookup accepted only exact selectors after worker suffix matching; add the same session-ID suffix fallback within the selected worker. origin: PR #583
- Finding 3: passive create hydration skipped explicit name and client environment bookkeeping; apply both before returning the hydrated state. origin: PR #583
- Finding 4: concurrent passive deletions raced through asynchronous resolution and started duplicate host deletes; defer deletion behind an atomic in-flight map check and coalesce callers. origin: PR #583
- Finding 5: concurrent hydration could make a passive lookup stale for advertised IDs and paths; retry normal bound-session resolution before rethrowing the original unknown-session error. origin: PR #583
- Finding 6: ambiguous live selectors fell through to passive lookup and could misroute; introduce a dedicated ambiguity error and rethrow it before passive resolution. origin: PR #583
- Finding 7: passive open skipped name and client-env bookkeeping (cron rebinding already occurred in addRuntime); apply only the missing bookkeeping. origin: PR #583
- Finding 30: rlmChildId traffic treated a resident passivating child as closing; join passivation and rehydrate in both bound lookup and direct message hydration branches. origin: PR #589
snimu added a commit that referenced this pull request Aug 4, 2026
…ots, and depth ingestion

- preserve daemon routable IDs for passive children (origin: PR #583)
- recheck guarded passive hydration and heartbeat restores (origin: PR #583)
- repair wrong-kind pending hydration joins (origin: PR #583)
- fence passive hydration during update restart preparation (origin: PR #583)
- validate persisted RLM depth before constructor ingestion (origin: PR #584)
- retry attach child snapshots across session replacement (origin: PR #587)
- retain effective depth for legacy parented new sessions (origin: PR #589)
- coordinate parent passivation with child hydration publication (origin: PR #589)
snimu added a commit that referenced this pull request Aug 4, 2026
…ancellation

The ownership-blind close closed shared hydrations out from under concurrent wakes (both interleavings); the idle sweep is the ownership-free arbiter.

origin: round-4 fix b956400 / PR #583
Comment thread packages/coding-agent/src/modes/daemon/daemon-mode.ts
snimu added a commit that referenced this pull request Aug 4, 2026
…letion races

- Finding 0: heartbeat restore could return a concurrently hydrating child before binding; fence resident fallback with waitForBoundSession and treat unavailable binding as a skipped dispatch. origin: PR #583
- Finding 1: supervisor child lookup accepted only exact selectors after worker suffix matching; add the same session-ID suffix fallback within the selected worker. origin: PR #583
- Finding 3: passive create hydration skipped explicit name and client environment bookkeeping; apply both before returning the hydrated state. origin: PR #583
- Finding 4: concurrent passive deletions raced through asynchronous resolution and started duplicate host deletes; defer deletion behind an atomic in-flight map check and coalesce callers. origin: PR #583
- Finding 5: concurrent hydration could make a passive lookup stale for advertised IDs and paths; retry normal bound-session resolution before rethrowing the original unknown-session error. origin: PR #583
- Finding 6: ambiguous live selectors fell through to passive lookup and could misroute; introduce a dedicated ambiguity error and rethrow it before passive resolution. origin: PR #583
- Finding 7: passive open skipped name and client-env bookkeeping (cron rebinding already occurred in addRuntime); apply only the missing bookkeeping. origin: PR #583
- Finding 30: rlmChildId traffic treated a resident passivating child as closing; join passivation and rehydrate in both bound lookup and direct message hydration branches. origin: PR #589
snimu added a commit that referenced this pull request Aug 4, 2026
…ots, and depth ingestion

- preserve daemon routable IDs for passive children (origin: PR #583)
- recheck guarded passive hydration and heartbeat restores (origin: PR #583)
- repair wrong-kind pending hydration joins (origin: PR #583)
- fence passive hydration during update restart preparation (origin: PR #583)
- validate persisted RLM depth before constructor ingestion (origin: PR #584)
- retry attach child snapshots across session replacement (origin: PR #587)
- retain effective depth for legacy parented new sessions (origin: PR #589)
- coordinate parent passivation with child hydration publication (origin: PR #589)
snimu added a commit that referenced this pull request Aug 4, 2026
…ancellation

The ownership-blind close closed shared hydrations out from under concurrent wakes (both interleavings); the idle sweep is the ownership-free arbiter.

origin: round-4 fix b956400 / PR #583
@sethkarten
sethkarten self-requested a review August 4, 2026 21:10
snimu added a commit that referenced this pull request Aug 4, 2026
…letion races

- Finding 0: heartbeat restore could return a concurrently hydrating child before binding; fence resident fallback with waitForBoundSession and treat unavailable binding as a skipped dispatch. origin: PR #583
- Finding 1: supervisor child lookup accepted only exact selectors after worker suffix matching; add the same session-ID suffix fallback within the selected worker. origin: PR #583
- Finding 3: passive create hydration skipped explicit name and client environment bookkeeping; apply both before returning the hydrated state. origin: PR #583
- Finding 4: concurrent passive deletions raced through asynchronous resolution and started duplicate host deletes; defer deletion behind an atomic in-flight map check and coalesce callers. origin: PR #583
- Finding 5: concurrent hydration could make a passive lookup stale for advertised IDs and paths; retry normal bound-session resolution before rethrowing the original unknown-session error. origin: PR #583
- Finding 6: ambiguous live selectors fell through to passive lookup and could misroute; introduce a dedicated ambiguity error and rethrow it before passive resolution. origin: PR #583
- Finding 7: passive open skipped name and client-env bookkeeping (cron rebinding already occurred in addRuntime); apply only the missing bookkeeping. origin: PR #583
- Finding 30: rlmChildId traffic treated a resident passivating child as closing; join passivation and rehydrate in both bound lookup and direct message hydration branches. origin: PR #589
snimu added a commit that referenced this pull request Aug 4, 2026
…ots, and depth ingestion

- preserve daemon routable IDs for passive children (origin: PR #583)
- recheck guarded passive hydration and heartbeat restores (origin: PR #583)
- repair wrong-kind pending hydration joins (origin: PR #583)
- fence passive hydration during update restart preparation (origin: PR #583)
- validate persisted RLM depth before constructor ingestion (origin: PR #584)
- retry attach child snapshots across session replacement (origin: PR #587)
- retain effective depth for legacy parented new sessions (origin: PR #589)
- coordinate parent passivation with child hydration publication (origin: PR #589)
snimu added a commit that referenced this pull request Aug 4, 2026
…ancellation

The ownership-blind close closed shared hydrations out from under concurrent wakes (both interleavings); the idle sweep is the ownership-free arbiter.

origin: round-4 fix b956400 / PR #583
snimu added 6 commits August 5, 2026 00:36
Stop eagerly rehydrating completed RLM subagent sessions as full runtimes
when a parent session opens. Children stay on disk (registry entry + JSONL)
until first touched: agent message, client attach, observe read, or delete.

- passive children served registry-backed in both list branches; supervisor
  list/create/attach routes them to the owning worker; cross-worker peers
  include them
- hydrations coalesce through openingSessions with explicit opens; attach/
  observe/message share identical binding-wait race semantics; session lease
  acquired on the hydration path
- passive delete tombstones the registry, files preserved (same semantics
  as live delete)
- rlmRehydrationClaims replaced by per-child in-flight hydration promises;
  one cycle-safe async registry walker; no metadata cache (async listAgents
  via existing readSessionInfo mtime cache)

Track A PR 1 of the recursive-agent-harness plan.
- Match passive children by their current session name while retaining registry names only as a legacy fallback.
- Replace resident top-level runtimes for registered RLM children during heartbeat restoration.\n- Keep cancelling RLM heartbeats for resident top-level sessions that are not registered children.
- Keep a passive subagent's persisted summary id when attach hydration creates its runtime so supervisor event routing and snapshot caches use one id.
- Cover passive-row attach hydration with a daemon regression test.
The 'cancels an RLM heartbeat for a resident top-level session that is
not a registered child' test never persisted its child session file, so
restoration bailed at the session-id mismatch before reaching the
childState-kind guard the test describes. The fixture now persists the
child session with the matching id, and the test asserts the parent
open ran and cancellation came from the kind guard.
@snimu
snimu force-pushed the feat/lazy-child-hydration branch from 79a0c8d to 0e6a645 Compare August 4, 2026 22:42
snimu added a commit that referenced this pull request Aug 4, 2026
…letion races

- Finding 0: heartbeat restore could return a concurrently hydrating child before binding; fence resident fallback with waitForBoundSession and treat unavailable binding as a skipped dispatch. origin: PR #583
- Finding 1: supervisor child lookup accepted only exact selectors after worker suffix matching; add the same session-ID suffix fallback within the selected worker. origin: PR #583
- Finding 3: passive create hydration skipped explicit name and client environment bookkeeping; apply both before returning the hydrated state. origin: PR #583
- Finding 4: concurrent passive deletions raced through asynchronous resolution and started duplicate host deletes; defer deletion behind an atomic in-flight map check and coalesce callers. origin: PR #583
- Finding 5: concurrent hydration could make a passive lookup stale for advertised IDs and paths; retry normal bound-session resolution before rethrowing the original unknown-session error. origin: PR #583
- Finding 6: ambiguous live selectors fell through to passive lookup and could misroute; introduce a dedicated ambiguity error and rethrow it before passive resolution. origin: PR #583
- Finding 7: passive open skipped name and client-env bookkeeping (cron rebinding already occurred in addRuntime); apply only the missing bookkeeping. origin: PR #583
- Finding 30: rlmChildId traffic treated a resident passivating child as closing; join passivation and rehydrate in both bound lookup and direct message hydration branches. origin: PR #589
snimu added a commit that referenced this pull request Aug 4, 2026
…ots, and depth ingestion

- preserve daemon routable IDs for passive children (origin: PR #583)
- recheck guarded passive hydration and heartbeat restores (origin: PR #583)
- repair wrong-kind pending hydration joins (origin: PR #583)
- fence passive hydration during update restart preparation (origin: PR #583)
- validate persisted RLM depth before constructor ingestion (origin: PR #584)
- retry attach child snapshots across session replacement (origin: PR #587)
- retain effective depth for legacy parented new sessions (origin: PR #589)
- coordinate parent passivation with child hydration publication (origin: PR #589)
snimu added a commit that referenced this pull request Aug 4, 2026
…ancellation

The ownership-blind close closed shared hydrations out from under concurrent wakes (both interleavings); the idle sweep is the ownership-free arbiter.

origin: round-4 fix b956400 / PR #583
Comment thread packages/coding-agent/src/modes/daemon/daemon-mode.ts
snimu added a commit that referenced this pull request Aug 4, 2026
…letion races

- Finding 0: heartbeat restore could return a concurrently hydrating child before binding; fence resident fallback with waitForBoundSession and treat unavailable binding as a skipped dispatch. origin: PR #583
- Finding 1: supervisor child lookup accepted only exact selectors after worker suffix matching; add the same session-ID suffix fallback within the selected worker. origin: PR #583
- Finding 3: passive create hydration skipped explicit name and client environment bookkeeping; apply both before returning the hydrated state. origin: PR #583
- Finding 4: concurrent passive deletions raced through asynchronous resolution and started duplicate host deletes; defer deletion behind an atomic in-flight map check and coalesce callers. origin: PR #583
- Finding 5: concurrent hydration could make a passive lookup stale for advertised IDs and paths; retry normal bound-session resolution before rethrowing the original unknown-session error. origin: PR #583
- Finding 6: ambiguous live selectors fell through to passive lookup and could misroute; introduce a dedicated ambiguity error and rethrow it before passive resolution. origin: PR #583
- Finding 7: passive open skipped name and client-env bookkeeping (cron rebinding already occurred in addRuntime); apply only the missing bookkeeping. origin: PR #583
- Finding 30: rlmChildId traffic treated a resident passivating child as closing; join passivation and rehydrate in both bound lookup and direct message hydration branches. origin: PR #589
snimu added a commit that referenced this pull request Aug 4, 2026
…ots, and depth ingestion

- preserve daemon routable IDs for passive children (origin: PR #583)
- recheck guarded passive hydration and heartbeat restores (origin: PR #583)
- repair wrong-kind pending hydration joins (origin: PR #583)
- fence passive hydration during update restart preparation (origin: PR #583)
- validate persisted RLM depth before constructor ingestion (origin: PR #584)
- retry attach child snapshots across session replacement (origin: PR #587)
- retain effective depth for legacy parented new sessions (origin: PR #589)
- coordinate parent passivation with child hydration publication (origin: PR #589)
snimu added a commit that referenced this pull request Aug 4, 2026
…ancellation

The ownership-blind close closed shared hydrations out from under concurrent wakes (both interleavings); the idle sweep is the ownership-free arbiter.

origin: round-4 fix b956400 / PR #583
- Wait for path-keyed explicit-open reservations before lazy child hydration retries.
- Cover the reservation race between explicit open and passive child hydration.
snimu added a commit that referenced this pull request Aug 4, 2026
…letion races

- Finding 0: heartbeat restore could return a concurrently hydrating child before binding; fence resident fallback with waitForBoundSession and treat unavailable binding as a skipped dispatch. origin: PR #583
- Finding 1: supervisor child lookup accepted only exact selectors after worker suffix matching; add the same session-ID suffix fallback within the selected worker. origin: PR #583
- Finding 3: passive create hydration skipped explicit name and client environment bookkeeping; apply both before returning the hydrated state. origin: PR #583
- Finding 4: concurrent passive deletions raced through asynchronous resolution and started duplicate host deletes; defer deletion behind an atomic in-flight map check and coalesce callers. origin: PR #583
- Finding 5: concurrent hydration could make a passive lookup stale for advertised IDs and paths; retry normal bound-session resolution before rethrowing the original unknown-session error. origin: PR #583
- Finding 6: ambiguous live selectors fell through to passive lookup and could misroute; introduce a dedicated ambiguity error and rethrow it before passive resolution. origin: PR #583
- Finding 7: passive open skipped name and client-env bookkeeping (cron rebinding already occurred in addRuntime); apply only the missing bookkeeping. origin: PR #583
- Finding 30: rlmChildId traffic treated a resident passivating child as closing; join passivation and rehydrate in both bound lookup and direct message hydration branches. origin: PR #589
snimu added a commit that referenced this pull request Aug 4, 2026
…ots, and depth ingestion

- preserve daemon routable IDs for passive children (origin: PR #583)
- recheck guarded passive hydration and heartbeat restores (origin: PR #583)
- repair wrong-kind pending hydration joins (origin: PR #583)
- fence passive hydration during update restart preparation (origin: PR #583)
- validate persisted RLM depth before constructor ingestion (origin: PR #584)
- retry attach child snapshots across session replacement (origin: PR #587)
- retain effective depth for legacy parented new sessions (origin: PR #589)
- coordinate parent passivation with child hydration publication (origin: PR #589)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants