Phase B: mainResponder.respond smoke test#543
Conversation
Adds tests/integration/test_cases/mainresponder_smoke.yaml — a discovery
probe verifying mainResponder.respond() runs end-to-end in the headless
runtime.
Designed as a discovery test expected to fail on first run so we could
triage what was missing. It PASSED on first run, confirming the legacy
~1000-line UserTalk dispatcher works headlessly without verb stubs or
workarounds. This is a significant de-risking signal for Phases C–F of
the Manila/mainResponder plan.
Test flow:
- Opens mainResponder.root as a guest DB via fileMenu.open
- Builds a minimal param table (GET / HTTP/1.0, method, host, client,
firstLine, requestHeaders) in system.temp
- Sets User-Agent = "Testing in Debugger" so respond.ut skips its
debug-log + scratchpad.paramtable writes
- Calls mainResponder.init() then mainResponder.respond()
- Asserts responseBody is a string
- Cleans up config.mainResponder and system.temp.mrSmoke on both the
happy and exception paths
- Uses try/else with scriptError(tryError) for informative CI output
File-level metadata: sequential: true, needs_guest_dbs: true,
protocol_mode: true.
Known false-positive: the runner's MD5-based sysroot drift check warns
that this test mutates the system root. Investigation confirmed the
cleanup is logically complete (no paths leak). The MD5 drift is caused
by save-path non-determinism in the ODB file format and reproduces for
a pure no-op CLI invocation. Follow-up PR will fix the runner.
Test results:
- In isolation: 1/1 pass
- Full suite: 2225 total, 1972 pass, 19 fail (baseline), 234 skip
- +1 pass vs. origin/develop baseline, zero new failures
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pre-commit hook emitted the regenerated manifest after the test commit landed (hook runs post-git-add). Landing the artifacts now so the manifest stays in sync with the test suite. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Code Review: Phase B mainResponder.respond() Smoke TestOverviewThis PR adds a single integration smoke test that verifies Strengths
Issues & SuggestionsMedium: Guest DB is opened but never closed
Low: Cleanup duplication across paths is correct but subtleThe cleanup is intentionally split: error-path cleanup runs in ...would prevent a future reader from thinking the duplication is a mistake and collapsing it into a finally-style block. Nit: Grammar in auto-generated OPML<title>Mainresponder Smoke (mainresponder_smoke) - 1 tests: 1 pass (100%)</title>"1 tests" should be "1 test". If this is templated output from the OPML generator, the fix belongs in the generator rather than this PR — worth filing a follow-up. Verification
SummarySolid Phase B implementation. The guest DB close question is the only issue worth resolving before merge — everything else is a polish item or follow-up candidate. The MD5 drift explanation is thorough and the follow-up PR commitment for the runner fix is the right call. |
Addresses PR review feedback (medium priority): add fileMenu.close() to both cleanup paths in mainresponder_smoke.yaml. The protocol-mode test runner shares one frontier-cli process across tests and only resets REPL variables via script/clearContext between tests — it does NOT close guest DBs. Leaving mainResponder.root open after the smoke test caused persistent interference with subsequent tests in persistence_save / dual_db / filemenu_verbs / cross-db categories (19 baseline failures). With fileMenu.close() added: - Smoke test still passes (1/1) - Full suite: 1991 pass, 0 fail (vs. 1972 pass / 19 fail previously) - 19 cascade failures RESOLVED by proper guest DB cleanup Also addresses low-priority review feedback: added an inline comment explaining why the error-path and success-path cleanups are duplicated (scriptError does not return, so a finally-style consolidation isn't possible). The nit about "1 tests" in the OPML generator (reviewer's third item) is a pluralization issue in the OPML template — belongs in the generator, not this PR. Will file as a P2 follow-up. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reflects new test results: 1989 pass / 2 fail / 234 skip (vs. 1972 / 19 / 234 previously). The 2 remaining failures (sys.countapps, sys process management) are known flaky tests — they surface variably across runs, documented in project_integration_test_failures.md. Not introduced by this PR. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
Thanks for the review. Your medium-priority observation turned out to be a bigger deal than we thought. 1. Guest DB close ✅ (and it fixed 19 cascade failures)4e5e2a85. You were right to flag it. Investigation: the protocol-mode runner shares one With 17 persistence_save / dual_db / filemenu_verbs / cross-db cascade failures resolved. The remaining 2 failures are known-flaky baseline tests ( This is the kind of systemic fix that justifies the review. The 2. Cleanup duplication comment ✅Added an inline comment on both cleanup blocks explaining the duplication is intentional — 3. OPML "1 tests" grammar nit — P2 follow-upCorrect — this is a pluralization bug in the OPML generator template, not a test issue. Will file as a P2 follow-up issue. Status
🤖 Generated with Claude Code /auto |
Code Review — PR #543: Phase B mainResponder.respond smoke testOverviewAdds a well-scoped discovery smoke test for Strengths
Issues / Questions1. Test result discrepancy (minor, worth noting) The PR description states the full suite result as "1972 pass / 19 fail (baseline)" with "+1 pass vs origin/develop". But the regenerated 2. The test cleans up 3. Uninitialized This is never a bug in UserTalk (uninitialized locals are safe), but the adjacent 4. Assertion strength (acknowledged, not a blocker) The test asserts SummaryThis is a solid, well-documented smoke test that follows all project conventions. The known MD5 drift is properly disclosed with a clear follow-up plan. The one non-trivial suggestion is to add a brief comment confirming which globals Verdict: Approve with minor suggestions — none of the issues above are blockers. 🤖 Generated with Claude Code |
Code Review — PR #543: Phase B mainResponder.respond smoke testOverviewThis PR adds a single integration smoke test verifying that What's Working Well
Issues and Suggestions1. No linked follow-up issue for the MD5 drift runner fix (Minor) The PR description acknowledges the sysroot drift false-positive and says "follow-up PR will fix the runner." However, there's no linked issue. If this follow-up gets deferred under workload, the warning will silently erode trust in the drift check over time. Recommend opening a GitHub issue and linking it here before merge. 2. The assertion is: This implies 3. Consider asserting non-empty responseBody (Minor) The test checks 4. If 5. OPML grammar nit (Cosmetic) The generated OPML title reads Test Coverage AssessmentThe test covers the happy path only, which is appropriate for a smoke test. Failure-path coverage (e.g., malformed param table, missing guest DB) is intentionally out of scope for Phase B. The Overall AssessmentThis is a well-crafted test that follows established project patterns. The non-obvious design decisions are explained, the cleanup is logically complete on both paths, and the test passed immediately — validating the legacy dispatcher works headlessly. The main ask before merge is linking a tracked issue for the MD5 drift runner fix so that work doesn't get lost. Verdict: Approve with minor suggestions — the linked issue for the drift fix is the only thing worth doing before merge. |
Addresses PR #543 round-2 review feedback: 1. Added comment explaining mainResponder.respond() writes responseBody back into the param table (non-obvious API contract — not a return value). 2. Added assertion that responseBody is non-empty (string.length > 0). Even without a www folder, respond() should produce some body — an empty string would indicate silent bailout. Also filed two P2 follow-up issues (as reviewer requested): - #545 — runner MD5-drift false positive (Path B of Phase B) - #546 — OPML generator pluralization bug ("1 tests" vs "1 test") Test results unchanged: full suite 1991 pass, 0 fail, 234 skip. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Code Review — PR #543: Phase B mainResponder.respond smoke testOverall this is a well-structured discovery/smoke test with good documentation. A few items worth discussing before merge: Correctness / Test isolation concern (medium)
From the
The cleanup only deletes Suggested mitigation: snapshot OPML / YAML discrepancy (minor)The committed The OPML appears to have been generated from an earlier draft of the script. Not a functional issue (YAML is the authoritative source), but the OPML should be regenerated to match before merge to keep the manifest accurate. Minor style notes
Suggestions
Test results+1 pass, zero new failures, 302/302 unit tests — looks good. The core goal (confirming the legacy ~1000-line dispatcher works headlessly) is achieved and the test design is sound. Blocking on merge: The |
|
Round 2 addressed. All review items either fixed in-branch or filed as follow-up issues. Items Fixed in this PR#2 API comment on This documents the out-parameter convention so future readers aren't surprised the return value is ignored. #3 Non-empty body assertion — same commit. Added alongside the existing Rationale in the comment: even in a headless environment without a real www folder, respond() should produce something (error page, 404, etc.). An empty string would indicate a silent bail-out and should fail the smoke test. Items Deferred to Follow-up Issues#1 MD5-based sysroot drift false positive — filed as #545. The drift check in #5 OPML "1 tests" pluralization — filed as #546. The generator in Item #4No code change needed — the comment you suggested was already in the file at both cleanup blocks. Quoting the current state: Test Status (after round 2)
The +2 pass over round 1 is noise from the known-flaky baseline ( Status
🤖 Generated with Claude Code /auto |
Code Review: Phase B — mainResponder.respond smoke testOverviewThis PR adds a single integration test ( Code Quality & Style ✅Strengths:
Minor comment concern: Potential Issues / Risks1. Test result discrepancy in PR description 2. MD5 drift false positive (documented, follow-up needed) 3. 4. Performance ✅30-second timeout is appropriate for a test that opens a guest DB and runs a ~1000-line UserTalk dispatcher. No performance concerns. Security ✅No external network calls; uses Test Coverage Assessment ✅For a smoke test, the assertions are appropriately scoped:
Body content is intentionally not asserted (environment-specific www folder). This is the right call for a smoke test; more detailed content assertions belong in Phase C/D functional tests. SummaryApprove with minor notes. The test is well-designed, correctly follows project conventions, handles cleanup properly, and the OPML is regenerated. The two items worth addressing:
Neither is a blocker. This is good Phase B work and a solid regression guard going forward. 🤖 Generated with Claude Code |
Snapshot defined() state for all sysroot paths that mainResponder.init() may create (system.environment.isRadio, user.inetd.config.http2, user.rootUpdates.callbacks, and its afterInstallPart.mainResponder entry), and conditionally delete only paths that did not already exist. This makes the test idempotent across repeated runs in the shared protocol-mode process and prevents sysroot state from leaking into subsequent tests. Also document the background thread spawned by init() (via mainResponder.subscriptions.updateAllChangesTables) as a known limitation — it exits on its own once no DB updates are pending and cannot be cleanly joined from the test. Test still passes in isolation (1/1) and in the full suite (2225 total, 1991 pass, 0 fail, 234 skip). The residual MD5 drift warning is issue #545 (save-path non-determinism), unrelated to this change. Addresses review comment from claude-bot round 3. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
Round 3 addressed. Your medium-priority finding was correct and substantive. P1:
|
Code Review — Phase B: mainResponder.respond smoke testOverall AssessmentSolid discovery test that follows established project patterns well. The documentation is thorough, the cleanup strategy is thoughtful, and the test correctly passes on first run. A few items worth discussing below. Strengths
Issues / Questions1. Background thread from
|
Code Review: Phase B mainResponder.respond() Smoke TestOverall: This is a well-designed discovery/regression test. The cleanup strategy is the most technically interesting part and is handled thoughtfully. A few items worth discussing before merge. Strengths
Issues & Questions1. OPML shows 0 failures; PR description says 19 baseline failures The committed but the PR summary states "2225 total / 1972 pass / 19 fail (baseline)". These numbers are inconsistent in two ways: the pass count (1991 vs 1972) and the failure count (0 vs 19). The OPML appears to be from a different run than the one described. If the 19 baseline failures are expected/known, they should appear in the OPML or be explained. If the OPML run genuinely had 0 failures, that's worth calling out as a data point on test stability. 2. Background thread from The PR notes that Is there any mechanism (e.g., 3. Cleanup duplication — maintenance surface The identical 7-line cleanup block appears twice (error path + success path). This is justified (no 4. Minor: This is correct per UserTalk conventions (OSType codes use single quotes). Flagging only because the CLAUDE.md VerdictThe core logic is solid and the test fills a real gap (Phase C/D de-risking). The OPML count inconsistency is the main thing to resolve before merge — either regenerate from the described run or explain the discrepancy. The background thread race is a known limitation but worth a one-line mitigation attempt or explicit risk comment. 🤖 Generated with Claude Code |
Reviewers flagged two gaps in the snapshot-and-restore pattern from round 3: 1. `user.inetd.config` parent wasn't snapshotted — if init() created both `user.inetd.config` and `.http2`, cleanup would delete only `.http2` and leave an empty parent table behind. 2. `user.rootUpdates.callbacks.afterInstallPart` intermediate table wasn't snapshotted — same problem between the root `.callbacks` and leaf `.mainResponder` entry. Added snapshot variables for both intermediate tables and corresponding conditional deletes in both cleanup paths (deletes go leaf-to-root so an outer delete doesn't invalidate an inner defined() check). Also addressed the background-thread race concern: added `thread.sleepTicks(6)` (~100 ms yield) at the start of each cleanup block so the thread spawned by init() can drain before we delete paths it may touch. In the headless environment the thread exits almost immediately because there are no pending DB updates. Added "KEEP IN SYNC" cross-reference comments on both duplicated cleanup blocks so future additions of snapshot variables don't miss one copy. Test still passes in isolation (1/1) and in the full suite (2225 total, 1991 pass, 0 fail, 234 skip). Addresses review comments from two round-4 bot reviews. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
Round 4 addressed. Both reviewers converged on two actionable items plus some documentation improvements. Fixed in
|
Code Review: Phase B mainResponder.respond smoke testOverviewThis PR adds a smoke test that verifies Strengths
Concerns1. Duplicated cleanup blocks (maintenance risk) The cleanup block is copy-pasted verbatim between the exception path ( Since UserTalk lacks 2. Sleeping ~100ms to let the background thread drain is acknowledged as non-eliminating the race window. On a loaded CI host, 100ms might be insufficient. The risk is bounded by 3. No HTTP status code assertion The test only checks that 4. Partial leak if If Minor Nits
Test ResultsThe results are compelling:
VerdictApprove with minor suggestions. The test is well-designed, correctly handles the shared-process-state constraints, and the documentation is exemplary. The duplication concern is the most actionable item — consider whether a Phase C follow-up (or a small helper) is worth addressing it before the test accumulates more callers. The timing assumption in 🤖 Generated with Claude Code |
Code Review — PR #543: Phase B mainResponder.respond smoke testOverviewAdds a single integration smoke test that opens ✅ What's working well
Issues and suggestions1. Cleanup duplication — maintenance risk (minor)The try/else cleanup block and the success-path cleanup are identical 8-line sequences. The PR explains this correctly: Suggestion: Consider extracting cleanup into a small helper verb (e.g., Not blocking — the duplication is explained and the current 2.
|
Three small cleanups from round-5 bot review: 1. Drop redundant `succeeded` local and `expected_success: true`. `expected_success: true` is the runner default; the else branch always calls scriptError() (which does not return), so the success-path return after cleanup can be a direct `return true`. Removes one local variable and one YAML field without changing behavior. 2. Annotate `thread.sleepTicks(6)` with the ticks-to-ms conversion (6 ticks ≈ 100 ms, 60 ticks/sec) so future maintainers understand the timing margin against the background-thread drain race. 3. Flag that a heavily loaded CI host may need more than 100 ms, with sequential test ordering as the load-insensitive risk bound. Test still passes in isolation (1/1) and in the full suite (2225 total, 1991 pass, 0 fail, 234 skip). Addresses round-5 bot review nits (none blocking). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
Round 5 addressed. Both reviewers converged on "approve with minor suggestions" — all remaining items are optional nits. Applied the easy ones. Fixed in
|
| Round | P0/P1 items | P2/nits |
|---|---|---|
| 1 | 1 (fileMenu.close — 17-cascade fix) | 4 |
| 2 | 0 | 5 (addressed API comment + non-empty assert; filed #545, #546) |
| 3 | 1 (init() side-effect snapshot) | 3 |
| 4 | 2 (intermediate-table snapshots) | 3 |
| 5 | 0 | 5 (all optional nits, 3 applied, 2 deferred) |
Round 5 has zero P0/P1 findings. Further rounds will likely continue surfacing optional stylistic suggestions with diminishing returns. Recommend merge from here.
🤖 Generated with Claude Code /auto
Code Review — Phase B: mainResponder.respond smoke testOverall: Well-structured discovery test with thorough documentation. The conditional-snapshot cleanup strategy is correct and idempotent. A few observations below. Strengths
Issues / Suggestions1. Duplicated cleanup is a maintenance hazard (high priority) The success-path and exception-path cleanup blocks are byte-for-byte identical across 9 lines each. The "KEEP IN SYNC" comment is a red flag — it documents a known fragility. If Does UserTalk support inner 2. Race window with background thread (medium priority)
3.
4. No assertion on The assertions check 5. OPML title pluralization: "1 tests" The generated VerdictThis is a solid Phase B addition. The cleanup strategy is correct, the test is well-documented, and the signal it provides (legacy 1000-line dispatcher works headlessly without stubs) is valuable de-risking for Phases C–D. The main actionable item is the duplicated cleanup — worth addressing before the test gains more snapshotted paths in follow-up phases. 🤖 Generated with Claude Code |
Code Review: Phase B — mainResponder.respond() Smoke TestOverviewAdds a single integration test ( Strengths
Issues and Suggestions1. Duplicate cleanup block — structural concern (medium) The success-path and exception-path cleanups are byte-for-byte identical, with a "KEEP IN SYNC" warning. This is a real maintenance risk: adding a new sysroot path requires updating two places, and a missed update will only surface as a leaked-state flake. One mitigation: extract the cleanup into a helper verb (e.g. Then the cleanup helper can read from that table. This trades one duplication for a slightly more complex setup, but removes the sync risk entirely. Worth considering if this pattern recurs in Phases C–F. If keeping the duplication, the existing "KEEP IN SYNC" comment is sufficient — just flag this as a known debt. 2. Background thread race — acknowledged but fragile (low)
Suggestion: Consider bumping to 3. If 4. Assertion scope is appropriate for a smoke test (informational) The test checks 5. OPML says "1 tests" — tracked in #546 (nit) <title>Mainresponder Smoke (mainresponder_smoke) - 1 tests: 1 pass (100%)</title>Grammar issue known and tracked upstream. No action needed in this PR. Test Result SignalThe fact that 2225 tests now pass (0 failures, vs. 19 failures at PR open) — and that 17 of those failures were resolved as a side effect of adding SummaryThis is a well-constructed smoke test with careful cleanup logic and thorough documentation. The main structural concern is the duplicated cleanup block; the race window is acknowledged and bounded. The test result (first-run pass, 0 baseline failures) speaks for itself as Phase B validation. Verdict: Approve with the cleanup-block duplication flagged as known debt. The duplicate-cleanup concern is worth a follow-up issue if this pattern appears in Phase C/D tests. 🤖 Generated with Claude Code |
Both round-6 reviewers converged on the same suggestion: bump thread.sleepTicks(6) to thread.sleepTicks(12) for more headroom against the background-thread race on loaded CI hosts. The previous 100 ms margin was thin; 200 ms is still fast in the happy path (the thread exits almost immediately when there are no pending DB updates) but gives meaningful headroom on loaded hosts. Sequential test ordering remains the load-insensitive bound on residual risk. Also updated the three matching comments (two inline cleanup blocks plus the header documentation block) to reference the new 12-tick value consistently. Test still passes in isolation (1/1) and in the full suite (2225 total, 1991 pass, 0 fail, 234 skip). Addresses round-6 bot review nit (non-blocking, converging signal). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
Round 6 addressed. Both reviewers converged on Approve — zero P0/P1 findings for the second consecutive round. Applied the one converging suggestion. Fixed in
|
| Round | P0/P1 items | P2/nits |
|---|---|---|
| 1 | 1 (fileMenu.close — 17-cascade fix) | 4 |
| 2 | 0 | 5 (addressed API comment + non-empty assert; filed #545, #546) |
| 3 | 1 (init() side-effect snapshot) | 3 |
| 4 | 2 (intermediate-table snapshots) | 3 |
| 5 | 0 | 5 (3 applied, 2 deferred) |
| 6 | 0 | 5 (1 applied, 4 deferred as already-argued) |
Two consecutive zero-P0/P1 rounds. Reviewers are approving with the same known-debt caveat (cleanup duplication), which I've explained and held firm on. Further rounds will continue surfacing the same optional suggestions with diminishing returns.
Ready for merge pending Jake's approval.
🤖 Generated with Claude Code /auto
Code Review: Phase B mainResponder.respond smoke testOverviewSolid Phase B smoke test that validates The test is well-structured and the comments are unusually thorough and accurate (the design rationale, background-thread caveat, and known MD5 false-positive are all documented correctly). Issues / Suggestions1. PR description says 6 ticks, code uses 12 ticks The PR description states:
But both cleanup blocks in the YAML use: 12 ticks ≈ 200 ms. Minor documentation inaccuracy — the code is probably correct (more headroom is better here), but the PR description should match. 2. Cleanup duplication is a maintenance hazard The two cleanup blocks (success-path and else-path) are byte-for-byte identical and each carries a No
Given the test's current scope (7 conditional deletes), the duplication is manageable. Just flagging it as the main long-term risk. 3. Redundant child delete when parent is also being deleted When both The child delete is redundant — deleting the parent would have cleaned it up anyway. Not a bug (the Consider whether it's cleaner to skip the Positive notes
SummaryReady to merge with minor notes. The duplication concern (item 2) is the only substantive issue worth addressing before merge if the cleanup complexity is expected to grow in later phases. Items 1 and 3 are low-risk and could be addressed in a follow-up. 🤖 Generated with Claude Code |
|
Round 7 addressed. Third consecutive zero-P0/P1 round. Verdict: "Ready to merge with minor notes." FixedNit #1: PR description said 6 ticks, code uses 12 ticksFixed in the PR description above — updated the cleanup-strategy paragraph from Not changed (acknowledged non-blocking)Nit #2: Cleanup duplication (4th consecutive round)Same position as rounds 4, 5, 6: known debt, Reviewer's suggestion of Nit #3: Redundant child delete when parent also deletedValid observation, but deliberately conservative: the child-first deletion pattern is uniform across both subtrees ( The reviewer correctly notes this "is not a bug (the Test status (after round 7)
Convergence signal
Three consecutive zero-P0/P1 rounds. Bot says "Ready to merge." Further rounds will continue surfacing the same optional style suggestions with strictly diminishing returns. Ready for merge pending Jake's approval. 🤖 Generated with Claude Code /auto |
Summary
tests/integration/test_cases/mainresponder_smoke.yaml— a discovery probe verifyingmainResponder.respond()runs end-to-end in the headless runtimefileMenu.close()to cleanup) resolved 17 cascading test failures across persistence_save / dual_db / filemenu_verbs / cross-db categories — the protocol-mode runner shares onefrontier-cliprocess across tests and does not close guest DBs between themTest design
Opens
mainResponder.rootas a guest DB, builds a minimalGET / HTTP/1.0param table insystem.temp, callsmainResponder.init()thenmainResponder.respond(), assertsresponseBodyis a string and non-empty, and restores sysroot state on both the happy and exception paths using a snapshot-and-restore pattern (conditional deletes based ondefined()checks captured beforeinit()).User-Agent = "Testing in Debugger"is set sorespond.utskips its debug-log andscratchpad.paramtablewrites. Usestry/elsewithscriptError(tryError)for informative CI output on failure.Cleanup strategy
mainResponder.init()writes several sysroot paths beyondconfig.mainResponder:system.environment.isRadiouser.inetd.config/user.inetd.config.http2user.rootUpdates.callbacks/.afterInstallPart/.afterInstallPart.mainResponderThe test snapshots
defined()for each path (including intermediate parent tables) before callinginit(), then conditionally deletes only paths that didn't previously exist. This makes the test idempotent across repeated runs in the shared protocol-mode process.init()also spawns a background thread viathread.callScript()formainResponder.subscriptions.updateAllChangesTables. The cleanup yields viathread.sleepTicks(12)(~200 ms) before deleting paths the thread may touch — in the headless environment the thread exits almost immediately because there are no pending DB updates.Known false positive
The runner's MD5-based sysroot drift check warns this test mutates the system root. Investigation confirmed the drift is caused by ODB save-path non-determinism (timestamps + block-allocation order) and reproduces for a pure no-op CLI invocation. Tracked in #545 for runner-side fix — this is not a bug in the test.
Test plan
Note: Baseline at PR open showed 19 fail; adding
fileMenu.close()in round 1 (per reviewer) resolved 17 of those as a side effect. The remaining 2 were known-flaky baseline tests that surface intermittently and were green on the current run.Files changed
tests/integration/test_cases/mainresponder_smoke.yaml(new)reports/integration_tests.opml(regenerated)reports/integration_tests/mainresponder_smoke.opml(new, per-category OPML)Follow-up issues
Plan context
Phase B of the Manila/mainResponder E2E plan. Follows Phase A (PR #541, merged) which established the inetd E2E test foundation. Next up: Phase C wires inetd → mainResponder together.
🤖 Generated with Claude Code /auto