Skip to content

fix(signal): pin idle-liveness turn-lifecycle parity (no wall-clock cap)#2624

Merged
rysweet merged 1 commit into
mainfrom
fix/signal-idle-liveness-parity-2607
Jul 6, 2026
Merged

fix(signal): pin idle-liveness turn-lifecycle parity (no wall-clock cap)#2624
rysweet merged 1 commit into
mainfrom
fix/signal-idle-liveness-parity-2607

Conversation

@rysweet

@rysweet rysweet commented Jul 5, 2026

Copy link
Copy Markdown
Owner

What

Locks the Signal channel to the idle-liveness turn lifecycle (no wall-clock per-turn timeout), completing the cross-transport parity tracked by #2604 / #2607 and finishing the work PR #2608 started for the meeting surface.

Why

The idle-liveness / no-wall-clock-timeout turn-lifecycle fix had to span dashboard, meeting, AND signal (#2604). Meeting got the hours-scale idle default in #2608; dashboard and signal route through the same MeetingBackendPersistentAgentProxy path.

On main, Signal already inherits idle-liveness: open_signal_agent_session() builds its SessionBuilder in OperatingMode::Meeting, and Meeting mode is the seam that routes turns through PersistentAgentProxy — which reaps the agent child only on idle-liveness (no output for a generous window; every streamed chunk resets the clock) and never on a wall-clock elapsed-time cap. SIMARD_MEETING_IDLE_LIVENESS_SECS (default 3600s, per #2608) governs it, 0 = unbounded.

The gap #2604/#2607 leaves open is that nothing locked that wiring. A future refactor of the signal agent session onto a non-Meeting mode would silently drop it back onto the per-turn adapter and reintroduce the wall-clock turn timeout #2607 forbids — with no test to catch the regression.

Scope

No behavioral change: signal turn handling already runs through the idle-liveness proxy today. This makes the guarantee explicit and regression-proof — the missing "Signal parity + test" acceptance criterion of #2604/#2607.

Tests

  • cargo test --release --lib signal_conversation::89 passed (incl. the new test)
  • cargo clippy --release --no-deps -- -D warnings — clean
  • cargo clippy --all-targets --all-features --locked -- -D warnings (pre-push) — clean
  • cargo fmt --all -- --check — clean

Refs #2607, #2604. Follow-up to #2608, #2581, #2612.

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

The Signal channel opens its agent session via `open_signal_agent_session`,
which builds a `SessionBuilder` in `OperatingMode::Meeting`. Meeting mode is
the seam that routes turns through `PersistentAgentProxy`, whose lifecycle
reaps the agent child only on *idle-liveness* (no output for a generous
window; every streamed chunk resets the clock) and never on a wall-clock
elapsed-time cap. So on `main`, Signal already inherits the same
no-wall-clock-timeout turn lifecycle the meeting REPL and dashboard chat use,
and PR #2608's hours-scale idle default (`SIMARD_MEETING_IDLE_LIVENESS_SECS`,
3600s) governs it.

Nothing locked that wiring, though: a future refactor of the signal agent
session onto a non-Meeting mode would silently drop it back onto the per-turn
adapter and reintroduce the wall-clock turn timeout that issue #2607 forbids,
breaking the cross-transport parity issue #2604 requires — with no test to
catch it.

This extracts the mode decision into a documented `signal_agent_mode()` and
adds a hermetic regression test
(`signal_opens_agent_in_meeting_mode_for_idle_liveness_parity`) that pins it
to `OperatingMode::Meeting`, closing the missing "Signal parity + tests"
acceptance criterion of #2604/#2607.

Tests:
- `cargo test --release --lib signal_conversation::` — 89 passed (incl. new test)
- `cargo clippy --release --no-deps -- -D warnings` — clean
- `cargo fmt --all -- --check` — clean

Refs #2607, #2604. Follow-up to #2608, #2581, #2612.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

github-actions Bot commented Jul 5, 2026

Copy link
Copy Markdown

📊 Coverage Summary

Generated by cargo llvm-cov --workspace --summary-only (nightly, excluding test files)

Module Lines Covered Coverage
Total 136694 113170 82.8%

Coverage data from CI run. Test files matching tests?/ are excluded from line counts.

@rysweet rysweet merged commit 2641d53 into main Jul 6, 2026
16 checks passed
@rysweet rysweet deleted the fix/signal-idle-liveness-parity-2607 branch July 6, 2026 03:22
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.

1 participant