Skip to content

Recover from opencode stalls and control-plane timeouts#66

Merged
pruiz merged 3 commits into
masterfrom
fix/sse-stall-server-resilience
Jul 2, 2026
Merged

Recover from opencode stalls and control-plane timeouts#66
pruiz merged 3 commits into
masterfrom
fix/sse-stall-server-resilience

Conversation

@pruiz

@pruiz pruiz commented Jun 30, 2026

Copy link
Copy Markdown
Owner

Summary

  • add structured run statuses and recoverable opencode server/session stall handling
  • make Phase 1 retry only the failed subphase after server restarts
  • harden SSE busy/idle handling and resume/session health checks
  • redirect Erlang crash dumps into ignored tmp/ so generated dumps do not become opencode patch candidates

Validation

  • rtk make tests
  • env BOOTSTRAP_ARGS='--keep-going' rtk make sandbox-validate
  • rtk git diff --check

Summary by CodeRabbit

  • New Features
    • Added resilience controls for server unavailability and session stalls, including automatic restart and bounded restart budgeting.
    • Improved resume-retry behavior with distinct recovery handling and clearer completion states.
    • Enhanced resilience of SSE consumption to avoid hangs on silent-but-open streams.
  • Bug Fixes
    • Improved timeout handling for session creation and prompt sending with recoverable vs non-recoverable outcomes.
    • More accurate stall/unreachable detection and propagation to recovery logic.
  • Documentation
    • Expanded README with new environment variables for recovery timing, stall detection, and health/reachability thresholds.
  • Tests
    • Added/expanded tests for resume health, restart recovery, SSE reconnect/busy watchdog behavior, and Erlang crash-dump sandbox setup.

@coderabbitai

coderabbitai Bot commented Jun 30, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds end-to-end resilience for opencode serve death, unavailability, and stalled sessions. The change introduces run statuses and structured request errors, adds SSE read-tick and stall detection, threads liveness checks through the runner and phase logic, and wires bounded server restart recovery into the harness.

Changes

Resume Server-Death Resilience

Layer / File(s) Summary
Statuses and session HTTP errors
tools/codecome/status.py, tools/codecome/session.py, tests/test_session.py
RunStatus and OpenCodeRequestError standardize run outcomes and HTTP failures; session create/send retry behavior, health probing, and timeout handling are added and tested.
SSE read ticks and stall watchdog
tools/events/base.py, tools/events/sse_client.py, tools/events/phase_loop.py, tests/test_sse_busy_resilience.py
SSE consumption now uses bounded read ticks, reconnect-budget controls, busy-turn stall detection, heartbeat bookkeeping, and idle-via-status synchronization, with new stall and reconnect tests.
Server liveness and restart support
tools/opencode/serve.py, templates/sandboxes/erlang-otp/docker-compose.yml, tests/test_sandbox_bootstrap.py
Server liveness is based on process polling, restart support and exit logging are added, and the Erlang sandbox crash-dump path is set and verified.
Resume handling and server-unreachable outcomes
tools/codecome/runner.py, tests/test_runner_resume_health.py, tests/test_codecome_runner.py
Runner logic now distinguishes server-unreachable and stalled outcomes, threads liveness checks into resume and event consumption, and adds coverage for resume health and timeout recovery paths.
Phase 1 status migration
tools/codecome/phase_1.py, tests/test_runner_resume_health.py
Phase 1 now returns structured outcomes, uses normalized statuses instead of numeric sentinels, and propagates liveness-aware subphase handling.
Harness auto-recovery and phase retry
tools/codecome/harness.py, tools/phases/completion.py, tests/test_harness_recovery_restart.py
The harness restarts the server within a bounded budget on recoverable outcomes, re-enters the failed Phase 1 subphase, rebuilds resume prompts for later phases, and extends resume-openers for new recovery reasons.
Plan and recovery documentation
.project/resume-server-death-resilience-plan.md, README.md
The resilience plan and README document the new recovery flow, environment variables, thresholds, and restart behavior.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related issues

Possibly related PRs

  • pruiz/CodeCome#43: This PR extends the same resume-idle gating logic with server liveness probing and a new unreachable-server path.
  • pruiz/CodeCome#46: This PR builds on the same _resume_opener_for_reason() path by adding new recovery reasons for resume diagnostics.
  • pruiz/CodeCome#64: This PR touches the same completion/resume-opener logic and adds adjacent completion diagnostics branches.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 28.78% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title matches the main theme: recovery for opencode stalls and timeout-related failures.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/sse-stall-server-resilience

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@pruiz pruiz requested a review from Copilot June 30, 2026 13:47
@github-actions

github-actions Bot commented Jun 30, 2026

Copy link
Copy Markdown

Coverage Report

Metric Value
Line Coverage 77.0%
Lines Covered 0 / 0

Download detailed HTML coverage reports per OS/Python from the workflow artifacts.

Generated by pytest-cov on 2026-07-02T16:50:27.109Z

Copilot AI 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.

Pull request overview

This PR improves CodeCome’s resilience to opencode server crashes, control-plane timeouts, and hung busy turns by introducing structured run statuses, better SSE liveness handling, and automated server restart/retry flows (including resuming Phase 1 from the failed subphase only).

Changes:

  • Adds RunStatus codes and propagates server_unreachable / session_stalled as first-class recoverable conditions throughout the runner/harness/Phase 1 orchestration.
  • Hardens SSE consumption so long busy turns aren’t abandoned (reconnect past budget while busy+alive) while still bounding genuine hangs (stall watchdog + read-tick inactivity).
  • Improves operational diagnostics and workspace hygiene (server exit-code logging; Erlang crash dump redirected into ignored tmp/; documents new env knobs).

Reviewed changes

Copilot reviewed 19 out of 19 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
tools/phases/completion.py Adds resume opener messaging for server_unreachable and session_stalled.
tools/opencode/serve.py Adds process-handle liveness checks, restart(), and a daemon exit-code log monitor.
tools/events/sse_client.py Adds read-tick inactivity handling and should_continue to avoid abandoning busy turns.
tools/events/phase_loop.py Adds busy/idle tracking, stall watchdog, status-probe idle recovery, and stall propagation in RunResult.
tools/events/base.py Adds best-effort /session/status probe helper (absence ⇒ idle).
tools/codecome/status.py Introduces shared RunStatus IntEnum and normalization helper.
tools/codecome/session.py Adds structured OpenCodeRequestError, retries for session creation, and health probing.
tools/codecome/runner.py Threads liveness checks through resume wait + event consumption; maps retriable HTTP failures to recoverable outcomes.
tools/codecome/phase_1.py Returns structured Phase 1 outcome and enables retry-from-failed-subphase after server restart.
tools/codecome/harness.py Centralizes restart+retry logic for recoverable conditions; adds restart budgets for Phase 1 and phases 2–6.
tests/test_sse_busy_resilience.py Adds coverage for reconnect budgeting, read-tick behavior, stall watchdog, and idle recovery sync.
tests/test_session.py Adds coverage for create-session retry behavior and retriable request errors.
tests/test_sandbox_bootstrap.py Verifies Erlang crash dump is redirected to ignored tmp/.
tests/test_runner_resume_health.py Tests resume readiness logic with health/liveness probes and stall propagation mapping.
tests/test_harness_recovery_restart.py Tests harness restart/retry behavior and shared restart budget exhaustion.
tests/test_codecome_runner.py Updates runner tests for recoverable prompt/session failures using OpenCodeRequestError.
templates/sandboxes/erlang-otp/docker-compose.yml Sets ERL_CRASH_DUMP to /workspace/tmp/erl_crash.dump.
README.md Documents new resilience/recovery environment variables and behavior.
.project/resume-server-death-resilience-plan.md Adds implementation plan/design notes for the resilience work.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread tests/test_session.py Outdated
Comment thread tools/events/phase_loop.py Outdated
@greptile-apps

greptile-apps Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds structured resilience and recovery for the opencode server/session lifecycle, addressing a series of real production failures (dead server, stalled model turn, silent-but-open SSE stream, and control-plane timeouts). The implementation is carefully layered across multiple fixes with detailed design documentation.

  • RunStatus enum + Phase1Outcome: replaces raw integer exit codes throughout the harness and Phase 1 orchestration; Phase 1 now restarts only the failed subphase after a server death or stall.
  • Stall watchdog + read-tick mechanism: PhaseEventLoop gains a no-progress timer; SseClient converts read-timeout ticks into None yields so the watchdog can fire even on a silent-but-open stream.
  • Server death vs. control-plane timeout disambiguation: _wait_for_resume_idle uses the OS child-process handle as the authoritative liveness signal and distinguishes "process exited" (fast-fail) from "HTTP blocked but process alive" (continue waiting).

Confidence Score: 5/5

The changes are well-contained resilience improvements with no regression risk to the happy path; every new branch is covered by unit tests.

The new stall watchdog, server-death disambiguation, and Phase 1 restart-at-subphase logic are all thoroughly unit-tested. Exception hierarchy ordering (subclass before parent) is correct, shared state (counters, step_finish_count) is properly initialised, and the liveness-check closure correctly captures the runner by reference so post-restart process handles are picked up automatically. The only findings are two cosmetic style nits.

No files require special attention; all core orchestration paths are covered by tests.

Important Files Changed

Filename Overview
tools/events/sse_client.py Adds read-tick mechanism (socket timeout → None yield), removes the fatal heartbeat-timeout check, and adds should_continue / _reconnect_budget_exhausted hooks. One minor redundant null check in _set_stream_timeout.
tools/events/phase_loop.py Adds _should_keep_consuming, _stalled, _note_progress, _track_session_busy, and _status_probe_reports_idle; promotes _build_result from static to instance method; adds session_stalled to RunResult. Logic is correct; idle-via-status recovery path is well-tested.
tools/codecome/runner.py Adds ResumeSessionServerUnreachable, liveness_check wiring, retriable OpenCodeRequestError handling in prompt-send path, and codecome.session.stalled event recording. Exception hierarchy ordering (subclass before parent) is correct.
tools/codecome/harness.py Adds _RECOVERABLE_RESTART_REASONS, _restart_server helper, Phase 1 restart loop, and shared stall/unreachable recovery path for phases 2-6. Shared variables (step_finish_count, etc.) are confirmed initialised before the loop.
tools/codecome/phase_1.py Refactors run_phase_1 to accept start_at and return Phase1Outcome; adds RunStatus comparisons throughout. Minor: missing blank line between _phase1_outcome definition and the section comment that follows.
tools/codecome/session.py Introduces OpenCodeRequestError with retriable / operation metadata, adds retry loop to create_session, exposes is_server_healthy, and replaces bare RuntimeError raises with typed errors. for/else branch is correctly unreachable.
tools/codecome/status.py New RunStatus IntEnum replaces magic integer exit codes. normalize_status maps unknown integers to ERROR. Clean and well-typed.
tools/opencode/serve.py Adds make_liveness_check (uses proc.poll()), ServerRunner.restart(), and a daemon exit-monitor thread. Daemon thread correctly uses proc.wait() and swallows OSError on the log write.
tools/events/base.py Adds _fetch_session_status to BaseEventLoop; correctly interprets absent session as idle (matching opencode's server-side behaviour where idle sessions are deleted from the status map).
tests/test_sse_busy_resilience.py New 510-line test file covering budget bypass, stall watchdog, read-tick stops, heartbeat-loss, idle-via-status recovery, and the previous-thread regression fixes. Good coverage of truth tables.
tests/test_harness_recovery_restart.py New test file covering server-unreachable restart, stall restart, shared-budget exhaustion, and budget-zero edge case. Uses proper fake runner/server-info stubs.
tests/test_runner_resume_health.py New test file covering live-process-does-not-kill-server, dead-process-raises-unreachable, healthy-server-waits-until-timeout, make_liveness_check with poll() semantics, and stall propagation through _run_subphase.
templates/sandboxes/erlang-otp/docker-compose.yml Redirects Erlang crash dump to tmp/ (gitignored) so generated dumps don't appear as opencode patch candidates.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant H as harness.run_phase_mode
    participant P1 as run_phase_1
    participant SP as _run_subphase
    participant R as _run_single_attempt
    participant PEL as PhaseEventLoop
    participant SSE as SseClient
    participant SRV as opencode serve

    H->>P1: "run_phase_1(start_at="1a")"
    P1->>SP: _run_subphase("1a")
    SP->>R: _run_single_attempt(liveness_check)
    R->>SRV: create_session / send_prompt
    SRV-->>SSE: SSE /event stream
    SSE-->>PEL: events() [with should_continue hook]
    Note over PEL,SSE: Silent stream → read-tick (None) every 10s
    PEL->>PEL: _should_keep_consuming()
    alt Session stalled (180s no progress)
        PEL->>SRV: GET /session/status (probe)
        alt "Status = idle"
            PEL->>PEL: "_session_idle_via_status=True"
            PEL-->>R: "RunResult(stalled=False)"
        else "Status = busy / None"
            PEL->>PEL: "_session_stalled=True"
            PEL-->>R: "RunResult(session_stalled=True)"
            R-->>SP: (OK, ses, stalled_result)
            SP-->>P1: RunStatus.SESSION_STALLED, "1b"
            P1-->>H: Phase1Outcome(SESSION_STALLED, "1b")
            H->>SRV: runner.restart()
            H->>P1: "run_phase_1(start_at="1b")"
        end
    else Process exited (liveness_check → False)
        PEL->>PEL: "_server_unreachable=True"
        PEL-->>R: "RunResult(finish="server_unreachable")"
        R-->>SP: (INCOMPLETE, ses, unreachable)
        SP-->>P1: RunStatus.SERVER_UNREACHABLE, "1b"
        P1-->>H: Phase1Outcome(SERVER_UNREACHABLE, "1b")
        H->>SRV: runner.restart()
        H->>P1: "run_phase_1(start_at="1b")"
    end
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant H as harness.run_phase_mode
    participant P1 as run_phase_1
    participant SP as _run_subphase
    participant R as _run_single_attempt
    participant PEL as PhaseEventLoop
    participant SSE as SseClient
    participant SRV as opencode serve

    H->>P1: "run_phase_1(start_at="1a")"
    P1->>SP: _run_subphase("1a")
    SP->>R: _run_single_attempt(liveness_check)
    R->>SRV: create_session / send_prompt
    SRV-->>SSE: SSE /event stream
    SSE-->>PEL: events() [with should_continue hook]
    Note over PEL,SSE: Silent stream → read-tick (None) every 10s
    PEL->>PEL: _should_keep_consuming()
    alt Session stalled (180s no progress)
        PEL->>SRV: GET /session/status (probe)
        alt "Status = idle"
            PEL->>PEL: "_session_idle_via_status=True"
            PEL-->>R: "RunResult(stalled=False)"
        else "Status = busy / None"
            PEL->>PEL: "_session_stalled=True"
            PEL-->>R: "RunResult(session_stalled=True)"
            R-->>SP: (OK, ses, stalled_result)
            SP-->>P1: RunStatus.SESSION_STALLED, "1b"
            P1-->>H: Phase1Outcome(SESSION_STALLED, "1b")
            H->>SRV: runner.restart()
            H->>P1: "run_phase_1(start_at="1b")"
        end
    else Process exited (liveness_check → False)
        PEL->>PEL: "_server_unreachable=True"
        PEL-->>R: "RunResult(finish="server_unreachable")"
        R-->>SP: (INCOMPLETE, ses, unreachable)
        SP-->>P1: RunStatus.SERVER_UNREACHABLE, "1b"
        P1-->>H: Phase1Outcome(SERVER_UNREACHABLE, "1b")
        H->>SRV: runner.restart()
        H->>P1: "run_phase_1(start_at="1b")"
    end
Loading

Reviews (2): Last reviewed commit: "fix: address resilience review feedback" | Re-trigger Greptile

Comment thread tools/codecome/runner.py
Comment thread tools/events/sse_client.py Outdated

@coderabbitai coderabbitai 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.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tools/codecome/harness.py`:
- Around line 328-362: The stalled-recovery path in the harness can break out
with a success status when the restart budget is exhausted, because
`_recovery_reason` from `session_stalled` does not force a non-success result.
Update the recovery handling in `harness.py` so that the `session_stalled`
branch sets `returncode`/final status to a failure state before the
budget-exhaustion `break`, and ensure the footer/exit logic driven by
`finish_warning`, `last_finish_reason`, and `RunStatus` cannot report success in
this case. Add a regression around the restart loop in the main run path that
exhausts the budget using only `session_stalled` outcomes and verifies a
non-zero exit.

In `@tools/codecome/runner.py`:
- Around line 297-308: Returning RunStatus.INCOMPLETE from the
OpenCodeRequestError retriable path can happen while the SSE consumer thread is
still alive, which lets the abandoned session keep running as the harness
retries. Update the retry/error handling in runner.py around the
consumer.join(timeout=5.0) and the OpenCodeRequestError branch so that a
timed-out or still-active consumer is first stopped/drained (or treated as a
terminal failure for this attempt) before any recoverable result is returned.
Use the existing _record_codecome_event and RunStatus/RunResult flow, but ensure
this path does not hand back a fresh retryable state until the consumer has
fully exited.

In `@tools/codecome/session.py`:
- Around line 225-228: Close the HTTP response in create_session() when calling
urllib.request.urlopen so retries don’t leak sockets. Update the request
handling in session.py to use the same context-manager pattern already used by
the status/health helpers, ensuring the response object is always closed after
reading and parsing the JSON.

In `@tools/events/phase_loop.py`:
- Around line 206-207: The dead-process path in phase_loop should be surfaced as
a recoverable outcome instead of falling through as a generic incomplete run.
Update the liveness_check() failure handling in phase_loop.py so a false result
sets a distinct finish reason such as server_unreachable and/or session_stalled
using the existing _last_finish_reason flow, then ensure the runner maps that
finish reason into the existing RunStatus.INCOMPLETE / SERVER_UNREACHABLE
recovery branch before harness branching. Use the phase_loop loop logic and the
runner’s finish-reason/status conversion code to keep recovery behavior
consistent.
- Around line 68-75: The stall timeout environment parsing in PhaseEventLoop
should be made resilient so invalid values do not raise during construction.
Update the initialization logic around the _stall_timeout_s and
_heartbeat_stall_timeout_s assignments in PhaseEventLoop to parse with a safe
fallback, matching the behavior used for CODECOME_RESUME_PROBE_TIMEOUT. If
either CODECOME_BUSY_STALL_TIMEOUT or CODECOME_HEARTBEAT_STALL_TIMEOUT is
missing or malformed, keep the default timeout value instead of letting float()
fail.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: e79ed5d1-cadf-4f73-989e-1fc313b505ca

📥 Commits

Reviewing files that changed from the base of the PR and between 3855c46 and 0b13245.

📒 Files selected for processing (19)
  • .project/resume-server-death-resilience-plan.md
  • README.md
  • templates/sandboxes/erlang-otp/docker-compose.yml
  • tests/test_codecome_runner.py
  • tests/test_harness_recovery_restart.py
  • tests/test_runner_resume_health.py
  • tests/test_sandbox_bootstrap.py
  • tests/test_session.py
  • tests/test_sse_busy_resilience.py
  • tools/codecome/harness.py
  • tools/codecome/phase_1.py
  • tools/codecome/runner.py
  • tools/codecome/session.py
  • tools/codecome/status.py
  • tools/events/base.py
  • tools/events/phase_loop.py
  • tools/events/sse_client.py
  • tools/opencode/serve.py
  • tools/phases/completion.py

Comment thread tools/codecome/harness.py
Comment thread tools/codecome/runner.py
Comment thread tools/codecome/session.py
Comment thread tools/events/phase_loop.py Outdated
Comment thread tools/events/phase_loop.py

@coderabbitai coderabbitai 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.

🧹 Nitpick comments (1)
tests/test_codecome_runner.py (1)

197-243: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Add a local timeout guard to this stalled-consumer test. There’s no suite-wide timeout configured, so this case can hang if the consumer-stop path regresses.

🕐 Suggested defensive timeout guard
+@pytest.mark.timeout(10)
 def test_run_single_attempt_prompt_timeout_requires_consumer_exit(mock_args, mock_console, monkeypatch):
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test_codecome_runner.py` around lines 197 - 243, Add a local timeout
guard around the stalled-consumer case in
test_run_single_attempt_prompt_timeout_requires_consumer_exit so the test cannot
hang if _run_single_attempt or the consumer-stop path regresses. Keep the
existing assertions, but wrap the call/behavior under test with a bounded
timeout using the test framework’s timeout mechanism or a small helper, and make
sure the guard is scoped to this test only.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@tests/test_codecome_runner.py`:
- Around line 197-243: Add a local timeout guard around the stalled-consumer
case in test_run_single_attempt_prompt_timeout_requires_consumer_exit so the
test cannot hang if _run_single_attempt or the consumer-stop path regresses.
Keep the existing assertions, but wrap the call/behavior under test with a
bounded timeout using the test framework’s timeout mechanism or a small helper,
and make sure the guard is scoped to this test only.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: e4e248d5-be3f-4bfb-b20c-f174f01b96f3

📥 Commits

Reviewing files that changed from the base of the PR and between 0b13245 and 7c2b8ac.

📒 Files selected for processing (10)
  • tests/test_codecome_runner.py
  • tests/test_harness_recovery_restart.py
  • tests/test_runner_resume_health.py
  • tests/test_session.py
  • tests/test_sse_busy_resilience.py
  • tools/codecome/harness.py
  • tools/codecome/runner.py
  • tools/codecome/session.py
  • tools/events/phase_loop.py
  • tools/events/sse_client.py
🚧 Files skipped from review as they are similar to previous changes (6)
  • tests/test_harness_recovery_restart.py
  • tests/test_runner_resume_health.py
  • tools/events/phase_loop.py
  • tools/events/sse_client.py
  • tools/codecome/runner.py
  • tools/codecome/harness.py

@pruiz pruiz merged commit 3cb1b2a into master Jul 2, 2026
8 checks passed
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