Conversation
Vitest globalSetup spawns an ephemeral hub but did not carry the same HAPI_TEST_MARKER as CLI workers, so reapTestOwnedProcesses could not find leaked hub PIDs after agent crashes or ad-hoc probes. Also inherit host env (strip prod secrets), set repo cwd, and invoke bun directly on hub/src/index.ts so workspace resolution works on dev hosts. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Review mode: initial
Requirement — Pass
Making the ephemeral test hub discoverable by process cleanup addresses a verified ownership-marker gap.
Evidence
- Issue #1866 reports orphaned test hubs; the base globalSetup.ts omits HAPI_TEST_MARKER.
- cli/src/test/auditTestProcesses.ts:36 identifies test-owned processes through their environment marker.
Approach — Pass
Reusing the existing marker and final reaper is viable, but the implementation must distinguish the hub's suite-wide lifetime from per-test children.
Evidence
- cli/src/test/globalSetup.ts:86 adds the marker consumed by the final audit at line 143.
- cli/src/runner/runner.integration.test.ts:159 also invokes that reaper after every test.
Suggestions
- Consider retaining an explicit environment allowlist and adding only demonstrated runtime requirements; the new deletion list still inherits provider credentials such as OPENAI_API_KEY.
Code — Reviewed
Reviewed the entire fixed-head diff and surrounding cleanup paths. Found one integration regression.
- [Major] Per-test cleanup kills the shared test hub —
cli/src/test/globalSetup.ts:86
Testing
Not run (automation; PR code execution is prohibited).
- PR reports 2,824 CLI tests passing and manual marker inspection; the default CLI test configuration excludes runner.integration.test.ts.
- Observed CI: windows-codex-mcp succeeded; test and integration remained in progress.
- No PR code, tests, builds, or scripts were executed during this read-only review.
HAPI Bot
| CLI_API_TOKEN: token, | ||
| TELEGRAM_NOTIFICATION: 'false', | ||
| SERVERCHAN_NOTIFICATION: 'false', | ||
| [TEST_OWNED_MARKER_KEY]: tmpHome, |
There was a problem hiding this comment.
[Major] Per-test cleanup kills the shared test hub
The hub now carries the same marker returned by testOwnedMarker(). On POSIX, runner.integration.test.ts:159 unconditionally calls reapTestOwnedProcesses() after each test, and that function SIGKILLs every matching process without exclusions. The first test therefore kills the hub created once by globalSetup, leaving subsequent tests without their authentication and synchronization server.
Suggested fix
Exclude the shared hub from all intermediate sweeps and survivor assertions while retaining it in the final teardown audit, or use distinct lifecycle markers. Add regression coverage proving the hub survives per-test cleanup and is reaped during final teardown.
Estate guard for leaked `bun … hub/src/index.ts` processes (ad-hoc probes or crashed Vitest without teardown). Excludes production hapi-hub-oos.service; dry-run by default. Operator index row + postmortem follow-up to upstream tiann#1867. Co-authored-by: Cursor <cursoragent@cursor.com>
Revert full process.env inherit — it broke integration tests on GitHub Actions (hub ECONNREFUSED). Marker + cwd remain. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Review mode: follow-up after new commits
Requirement — Pass
Making leaked test hubs discoverable by the existing process audit addresses a verified ownership-marker gap.
Evidence
- Issue #1866 reports orphaned test hubs; the base cli/src/test/globalSetup.ts omits HAPI_TEST_MARKER from the hub environment.
- cli/src/test/auditTestProcesses.ts:36 identifies test-owned processes using their environment marker.
Approach — Pass
Reusing the ownership marker and final audit is viable. The current head preserves the environment allowlist and sets an explicit repository working directory. The hub's suite-wide lifetime needs correct handling in intermediate cleanup.
Evidence
- cli/src/test/globalSetup.ts:77 retains the environment allowlist, adds the marker at line 90, and sets cwd at line 101.
- cli/src/test/globalSetup.ts:125 stops the hub before running the final marker audit.
Suggestions
- Update the PR description to reflect the current implementation: it retains the environment allowlist and launches bun run, rather than inheriting the host environment and using a direct launch.
Code — Reviewed
Reviewed the entire fixed-head merge-base diff and surrounding cleanup paths. The previously reported integration regression remains unresolved.
- [Major] Per-test cleanup kills the shared test hub —
cli/src/test/globalSetup.ts:90
Testing
Not run (automation; PR code execution is prohibited).
- The PR reports 2,824 CLI tests passing and manual marker inspection; cli/vitest.config.ts excludes runner.integration.test.ts from that default test suite.
- Observed CI: test, integration, and windows-codex-mcp were still in progress.
- No regression tests were added in the current diff. No PR code, tests, builds, or scripts were executed during this read-only review.
HAPI Bot
| CLI_API_TOKEN: token, | ||
| TELEGRAM_NOTIFICATION: 'false', | ||
| SERVERCHAN_NOTIFICATION: 'false', | ||
| [TEST_OWNED_MARKER_KEY]: tmpHome, |
There was a problem hiding this comment.
[Major] Per-test cleanup kills the shared test hub
On POSIX, runner.integration.test.ts:159 calls reapTestOwnedProcesses(testOwnedMarker()) after every test. The new hub marker matches that sweep, and auditTestProcesses.ts:119 sends SIGKILL to every matching process without exclusions. Consequently, the first test's cleanup kills the hub created once by globalSetup, leaving subsequent tests unable to authenticate or synchronize with it. The current follow-up changes do not adjust these cleanup paths.
Suggested fix
Exclude the suite-wide hub from all intermediate sweeps and survivor assertions while retaining it in the final teardown audit, or use distinct lifecycle markers. Add regression coverage proving the hub survives per-test cleanup and remains eligible for final reaping.
Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Review mode: follow-up after new commits
Requirement — Pass
Making leaked test hubs discoverable by the existing process audit addresses a verified ownership-marker gap. Cleanup still requires the audit to run with the matching marker.
Evidence
- Issue #1866 reports orphaned test hubs; the base cli/src/test/globalSetup.ts hub environment omits HAPI_TEST_MARKER.
- cli/src/test/auditTestProcesses.ts:62 identifies test-owned processes by their environment marker.
Approach — Pass
Reusing the ownership marker and final teardown audit is a viable approach. The hub's suite-wide lifetime requires protection from intermediate cleanup, which remains an implementation defect.
Evidence
- cli/src/test/globalSetup.ts:90 adds the existing ownership marker to the hub environment.
- cli/src/test/globalSetup.ts:127 stops the hub before the final marker audit at line 138.
Suggestions
- Update the PR description: the current implementation retains the environment allowlist and bun run launch, and adds no explicit working directory.
Code — Reviewed
Reviewed the entire fixed-head merge-base diff and surrounding cleanup paths. The previously reported integration regression remains unresolved.
- [Major] Per-test cleanup kills the shared test hub —
cli/src/test/globalSetup.ts:90
Testing
Not run (automation; PR code execution is prohibited).
- The PR reports 2,824 CLI tests passing and manual marker inspection. The default CLI test suite excludes runner.integration.test.ts, so that result does not cover the affected cleanup path.
- At the fixed head, test, integration, and windows-codex-mcp CI checks were still in progress.
- No regression coverage was added. No PR code, tests, builds, or scripts were executed during this read-only review.
HAPI Bot
| CLI_API_TOKEN: token, | ||
| TELEGRAM_NOTIFICATION: 'false', | ||
| SERVERCHAN_NOTIFICATION: 'false', | ||
| [TEST_OWNED_MARKER_KEY]: tmpHome, |
There was a problem hiding this comment.
[Major] Per-test cleanup kills the shared test hub
On POSIX, runner.integration.test.ts:159 calls reapTestOwnedProcesses(testOwnedMarker()) after every test. The new hub marker matches that sweep, and auditTestProcesses.ts:119 sends SIGKILL to every matching process without exclusions. The first test's cleanup therefore kills the hub created once by globalSetup, leaving subsequent tests without their authentication and synchronization server. The current follow-up does not adjust these cleanup paths.
Suggested fix
Exclude the suite-wide hub from intermediate sweeps and survivor assertions while retaining it in the final teardown audit, or distinguish lifecycle scopes in the markers. Add regression coverage proving the hub survives per-test cleanup and remains eligible for final reaping.
CI note (integration red)
Diff is intentionally minimal: only |
Summary
Vitest
globalSetupspawns an ephemeral hub for integration tests but did not setHAPI_TEST_MARKERon that child process.reapTestOwnedProcessesscans for that marker, so leaked test hubs (crashed agents, ad-hoc probes without teardown) were invisible to the audit backstop.This PR stamps the hub with the same marker as CLI test workers and hardens spawn for dev hosts (inherit env with prod secrets stripped, repo
cwd, directbun hub/src/index.ts).Fixes #1866
Test plan
cd cli && bun run test(2824 passed)HAPI_TEST_MARKERvia manual spawn inspection on oos-linuxMade with Cursor