Skip to content

test(cli): synchronize reap tests with shell readiness - #2204

Merged
newhoggy merged 2 commits into
mainfrom
issue-2174-reap-tests-readiness-handshake
Oct 6, 2026
Merged

newhoggy merged 2 commits into
mainfrom
issue-2174-reap-tests-readiness-handshake

Conversation

@newhoggy

@newhoggy newhoggy commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Description

The reap test helper previously signalled its shell after a fixed 100 ms setup sleep, which could arrive before trap '' HUP was installed. It now waits for a ready file written after the trap, with a 10-second diagnostic deadline and process-group cleanup on timeout. Well-behaved children skip that setup wait.

Type of Change

  • Test coverage improvement

Related Issue

Closes #2174

Implementation plan

Changes Made

All changes are in src/cli/worktrees/ui/terminal/pty.rs, within reap_tests:

  • group_leader accepts an optional ready path, passed through a child-only environment variable so shell quoting handles temporary paths safely.
  • A shared assertion helper preserves the SIGKILL and bounded-reaping checks. A new regression delays trap installation by one second.
  • The well-behaved test passes no ready path; its ignored-SIGHUP guard continues to pass.
  • Removed the real-PTY group's 150 ms setup sleep after checking that Alacritty calls setsid() before spawn returns.

Production reaping and REAP_GRACE are unchanged. This test-only change needs no user-facing docs or changelog entry.

Testing

All checks were repeated after rebasing onto origin/main at 83085b7cb:

  • Build, formatting, and Clippy with all targets/features passed.
  • Focused reap tests passed 6/6 in plain and nohup launches.
  • Full default suite: 13,158 passed, zero failed, one ignored.
  • Full MCP suite: 14,048 passed, zero failed, one ignored.
  • Documentation generation, changelog check, and strict commit lint passed.
  • Before rebase, cargo insta test --test integration_test --no-quiet passed 64/64 with no snapshots to review. The integration/snapshot tests passed again in both rebased full suites; no .snap.new files remain.
  • Ten additional focused runs before rebase passed 60/60 tests.
  • A standalone Rust harness extracted the repository helper and assertions: delayed setup passed with the handshake and failed with the old 100 ms wait (Some(SIGHUP) instead of Some(SIGKILL)). A shortened-deadline harness also verified timeout diagnostics and group cleanup, including a temporary path containing spaces and a quote.

Test Commands

WT=/Users/jky/wrk/work-trees/omni-dev/issue-2174-reap-tests-readiness-handshake
cargo build --manifest-path "$WT/Cargo.toml"
cargo fmt --manifest-path "$WT/Cargo.toml" --all -- --check
cargo clippy --manifest-path "$WT/Cargo.toml" --all-targets --all-features -- -D warnings
cargo test --manifest-path "$WT/Cargo.toml" --lib reap_tests
nohup cargo test --manifest-path "$WT/Cargo.toml" --lib reap_tests
cargo insta test --manifest-path "$WT/Cargo.toml" --test integration_test --no-quiet
cargo test --manifest-path "$WT/Cargo.toml"
cargo test --manifest-path "$WT/Cargo.toml" --features mcp
cargo doc --manifest-path "$WT/Cargo.toml" --no-deps --document-private-items
python3 "$WT/scripts/check_changelog.py" --base origin/main
"$WT/target/debug/omni-dev" git commit message lint --strict origin/main..HEAD

A targeted cargo-llvm-cov run after the coverage follow-up measured 54/54 changed executable lines covered locally (100%), including every region of wait_for_ready. Overall project coverage was not re-measured locally. Local platform validation was on macOS; Linux/Windows and beta/nightly checks are left to CI.

Coverage follow-up

The reported five uncovered timeout lines are now exercised by missing_readiness_kills_and_reaps_the_child_before_panicking. wait_for_ready accepts the deadline for tests while group_leader retains its 10-second default. The test waits for the HUP trap, then uses an immediate deadline and a missing marker. It verifies the diagnostic, SIGKILL, waitpid returning ECHILD before try_wait can reap anything, and the group's disappearance. No coverage exclusions were added.

Follow-up validation passed: formatting; all-target/all-feature Clippy; 7/7 focused tests in plain and nohup launches; 64/64 integration tests with no snapshot drift; instrumented focused tests; and strict commit lint.

cargo llvm-cov --manifest-path "$WT/Cargo.toml" --lib --json \
  --output-path /private/tmp/issue-2174-coverage-final.json -- reap_tests

Review Focus Areas

Review the ordering of trap installation and marker creation, and timeout cleanup. The committed diff and surrounding code were reviewed once against origin/main...HEAD; there were no actionable findings, fixes, or skipped findings.

Checklist

  • Followed project style and PR guidelines
  • Reviewed the committed changes
  • Added a regression that detects the old setup timing assumption
  • New and existing tests pass locally with default and MCP features
  • Formatting and Clippy checks pass
  • Rebased and repeated validation

Performance Impact

Test setup drops the unnecessary 100 ms waits and the real-PTY test's 150 ms wait. The delayed regression adds one second of deliberate setup. No production performance change.

Security Considerations

No production security change. Ready paths are confined to fresh temporary directories and passed through the child environment.

Deployment Notes

No special deployment requirements or breaking changes.

Additional Notes

  • Docs generation succeeded with 172 warnings in unchanged documentation; none refer to the changed file. The large macOS test binary also emitted an unwind-table linker warning; builds and tests succeeded.
  • The new main commit moved coverage tooling to patchcov and removed coverage lint-markers from the build script. That command passed before rebase and is no longer applicable to the rebased repository.
  • The implementation plan was updated to include the permanent timeout regression prompted by the coverage report. No unrelated code fixes included.

Wait for a marker written after the HUP trap is installed, and cover
one-second delayed setup. Skip setup waits for well-behaved children
and the real PTY group, which exists before spawn returns.

Closes #2174
@github-actions

github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown

Coverage

Total: 97.93% ⚪ 0 pp vs main

Comparing b4437c7..b89f9d5 (merge-base → PR head)

File Before After Δ
src/cli/worktrees/ui/terminal/pty.rs 97.09% 97.48% 🟢 0.39 pp
🔇 269 ignored region(s), 0 tolerated region(s)

ignore removes the lines from both reports; tolerate keeps them in the reported percentage but scores them against the baseline, so a cross-run flip cannot move a delta. Regions are read from each revision's own source.

File Kind Lines Rev Reason
src/claude/client.rs ignore 815-827 both process-bound: hardcodes SystemEnv with no injectable seam (unlike create_default_claude_client_with's tested Default arm, which this mirrors) and has no in-crate caller; testing it would mean mutating real process env for shared credential vars
src/cli/ai/jev/route.rs ignore 176-251 both RouteCommand::execute is the process-bound wiring shell; fetch_docs, run_route_with_reference_fetch_failures, render_output_with_style and terminal_style_with provide its deterministic seams
src/cli/ai/jev/route.rs ignore 325-330 both the SystemEnv/stdout probe is process-bound; terminal_style_with is exhaustively covered through its injected environment and TTY seam
src/cli/ai/jev/route.rs ignore 882 both guards this test's assumption; the parse above always fails on --ignore-closed with --allow-closed
src/cli/ai/jev/route.rs ignore 914 both guards this test's assumption; the parse above always fails on a malformed --ladder-definition
src/cli/ai/jev/verify_decision.rs ignore 89-142 both VerifyDecisionCommand::execute is the process-bound wiring shell; fetch_input and run_verify provide its deterministic seams
src/cli/claude_wrap.rs ignore 160-170 both process-bound wiring shell: it joins this process's own stdin/stdout and reads the real OMNI_DEV_CLAUDE_WRAP_LOG, which a test must not take over (see the note on run/wrap in the tests module); wrap_io_diagnostics beneath it is covered directly
src/cli/claude_wrap.rs ignore 716-720 both resolve_socket fails only when the platform has no data directory to put the default socket in (no resolvable home), which a test cannot reproduce on macOS or Linux; the fail-open return is what keeps the wrapper forwarding
src/cli/claude_wrap.rs ignore 773-777 both to_value on an ObserveRequest fails only for a non-UTF-8 cwd, and the tracker takes cwd from a JSON string, so it is always UTF-8; the arm exists so a future non-string field cannot silently drop the report
src/cli/claude_wrap/diagnostics.rs ignore 60 both Builder::spawn fails only when the OS refuses a new thread (resource exhaustion), which a test cannot provoke; the fail-open return is what keeps the wrapper forwarding
src/cli/drive.rs ignore 2407 both guards this test's assumption; the parse above always yields DriveSubcommands::Sync for a sync argv
src/cli/drive/lease.rs ignore 564-568 both a sheet restore's fresh backup is always a DriveCopy — restore.rs's own recheck refuses unless the target is still a spreadsheet, and acquire() only ever takes a Bytes backup of a non-native target; this arm exists solely for exhaustiveness over the shared LeaseBackup enum
src/cli/drive/lease.rs ignore 1274-1277 both guards this test helper against misuse; every call site below passes an acquire subcommand
src/cli/drive/lease.rs ignore 1288-1291 both guards this test helper against misuse; every call site below passes a prune subcommand
src/cli/drive/sheets/values.rs ignore 208 both this closing brace of the if let Some(...) = last (no else) reports 0 hits under llvm-cov even though both inner branches are exercised (csv_interior_blank_line_before_an_unterminated_last_row_is_kept hits the insert path, csv_single_trailing_newline_adds_no_row hits the no-insert path); last is always Some once missing_final_newline is true, since the loop above always runs at least once for non-empty content, so there is no reachable skip path — the same llvm-cov region-attribution artifact on an if-let's closing brace as src/utils/settings.rs:1096
src/cli/drive/trash.rs ignore 168 both guards this test's assumption; the parse above always yields a trash or untrash subcommand
src/cli/gmail/draft/create.rs ignore 2088-2092 both never called: every test using UnreadableStdin gives an HTML body, so resolve_body returns before reading stdin; the panic exists to fail loudly if that ever changes
src/cli/gmail/draft/update.rs ignore 261 both this closing brace reports 0 hits under llvm-cov regardless of test count — verified locally: run_update_sets_a_checked_from_and_keeps_everything_else and run_update_to_the_nameless_primary_leaves_from_to_gmail both complete the block above successfully (proven by the outer if-let's own closing brace and the following let drafts = ... line both measuring as hit), yet this specific inner brace, immediately after a statement with two chained ? operators, never registers a hit; an llvm-cov region-attribution artifact, not an untested path
src/cli/gmail/sync_all.rs ignore 213-246 both SyncAllCommand::execute is the process-bound wiring shell: it loads the real ~/.omni-dev settings and builds clients against the real Gmail host; run_sync_all, load_gmail_sync_config and validate_accounts are its tested seams
src/cli/sessions.rs ignore 273-276 both resolve_socket fails only when the platform has no data directory to put the default socket in (no resolvable home), which a test cannot reproduce on macOS or Linux; the sink is fail-open by design, so this is the same silent return as every other skipped hook
src/cli/sessions.rs ignore 283 both wire returns None only through the serialization failure ignored in wire() itself (a non-UTF-8 cwd, which a hook payload cannot carry), so this arm is unreachable for the same reason
src/cli/sessions.rs ignore 403-410 both to_value on an ObserveRequest fails only for a non-UTF-8 cwd, and the hook payload's cwd is deserialized from a JSON string, so it is always UTF-8; the arm exists so a future non-string field cannot silently drop the report
src/cli/sessions.rs ignore 3529 both the arm above always matches: parse() above always parses an install-hooks argv into SessionsSubcommands::InstallHooks
src/cli/sessions.rs ignore 3533 both the arm above always matches: parse() above always parses an uninstall-hooks argv into SessionsSubcommands::UninstallHooks
src/cli/worktrees/ui/terminal/pty.rs ignore 314-321 both the closure runs only in the forked child between fork and exec, and exec discards that process's coverage counters before they can be flushed, so llvm-cov reports 0 hits on these lines however often the tests run it (CI measured the whole body uncovered on PR #2169); the reset is checked by behaviour instead, in the_well_behaved_test_passes_when_the_test_process_ignores_sighup
src/daemon/services/worktrees/divergence.rs ignore 346 both only runs if a started computation never sets its flag within 2s, which fails the calling test; a passing run never takes it
src/drive/docs/anchor.rs ignore 351 both map_boundary is only called with a byte offset inside the text its runs concatenate, so the loop always returns first; the Err keeps the function total without a panic
src/drive/docs/anchor.rs ignore 404 both a match never contains the paragraph's closing newline (find rejects a needle with one) and collect verified the last run ends at it, so the index always lies inside the paragraph; kept as defence on the write boundary
src/drive/docs/anchor.rs ignore 463 both a container switch between two paragraphs of one container is always a table, and the paragraph before it has protected_newline, so the check below refuses the range before the walk reaches a foreign paragraph; kept as defence in depth
src/drive/docs/anchor.rs ignore 488 both lo and hi are regex match boundaries mapped through whole runs, so neither falls inside a surrogate pair; kept as defence in the UTF-16 arithmetic
src/drive/docs/anchor.rs ignore 496 both end is the end of the last anchor, which lies inside a run the loop above visits, and a gap before it already returned UnsafeRange, so the cursor always reaches it; kept as defence in depth
src/drive/docs/anchor.rs ignore 577 both collect verified every paragraph has a final run ending at p.end, and the loop above leaves cursor at that run's end, so it always matches; kept as defence in depth on the write boundary
src/drive/docs/anchor.rs ignore 648 both collect refuses a paragraph whose last run does not end at the paragraph's end, and the loop above leaves cursor on the last run's end, so cursor always equals p.end here; kept as defence in depth on the write boundary
src/drive/docs/named_range.rs ignore 214 both the Create branch above always returns, so a Create mutation never reaches the ID lookup; the arm exists solely for exhaustiveness
src/drive/docs/named_range.rs ignore 283 both the Create branch above always returns, so a Create mutation never reaches this match; the arm exists solely for exhaustiveness
src/drive/docs/table.rs ignore 329 both rows, cells and paragraphs are each checked above to start at or after the previous one's end, so the half-open cell ranges are pairwise disjoint and at most one contains the index; kept as defence in depth on the write boundary
src/drive/docs/table.rs ignore 349 both an Insert edit returned from the branch above, so only a Dimension edit reaches here; the else-arm exists only to destructure the already-known variant
src/drive/docs/table.rs ignore 386 both validate already refuses a Dimension edit carrying InsertTable before resolve reads the document, so this arm exists solely for exhaustiveness over TableVerb
src/drive/docs/write.rs ignore 942-946 both preview is built by the payload match above, so a Table payload always carries a WouldEditTable preview; this arm exists solely for exhaustiveness over the shared WriteResult enum
src/drive/docs/write.rs ignore 960-964 both preview is built by the NamedRange payload match above, so a NamedRange payload always carries WouldMutateNamedRange; this arm exists solely for exhaustiveness over the shared WriteResult enum
src/drive/docs/write.rs ignore 991-995 both preview is built by the payload match above, so an Insert/Delete/List payload always carries its matching edit preview; this arm exists solely for exhaustiveness over the shared WriteResult enum
src/drive/docs/write.rs ignore 2343 both anchored_payloads yields only Insert and Delete
src/drive/lease/ledger.rs ignore 1109-1113 both mutate_locked refuses before ever calling the closure, so its body never runs — a hit here is a regression, not a coverage gap
src/drive/lease/restore.rs ignore 1261-1265 both every test using this double refuses before authenticating; a hit here is a regression, not a coverage gap
src/drive/sheets/api.rs ignore 1492 both the assertion arm only fires if the outcome type regresses, in which case the test has already failed
src/drive/sheets/auto_fill.rs ignore 584 both unreachable by construction: source_grid.sheet_id was itself resolved from this same workbook by resolve_grid_range above, so find_sheet_by_id always finds it
src/drive/sheets/auto_fill.rs ignore 802 both every call site resolves grid from a range already checked with grid_range::is_bounded, or computes it from one via compute_destination, which only ever produces a fully bounded range from a fully bounded source; this else-arm exists only to unwrap the shared Option fields
src/drive/sheets/auto_fill.rs ignore 815 both unreachable by construction: compose rejects only a sheet-prefixed or whole-sheet range, and the numeric {start}:{end} built just above is neither
src/drive/sheets/auto_fill.rs ignore 1471 both guards this test's assumption; build_request always returns AutoFill
src/drive/sheets/auto_fill.rs ignore 1488 both guards this test's assumption; build_request always returns AutoFill
src/drive/sheets/auto_fill.rs ignore 2688 both guards this test's assumption; the mocked response above always leads to WouldChange
src/drive/sheets/auto_fill.rs ignore 2736 both guards this test's assumption; the mocked response above always leads to WouldChange
src/drive/sheets/auto_fill.rs ignore 2774 both guards this test's assumption; the mocked response above always leads to WouldChange
src/drive/sheets/auto_fill.rs ignore 2828 both guards this test's assumption; the mocked response above always leads to WouldChange
src/drive/sheets/banding.rs ignore 763 both resolve_sheet_target always resolves AddBanding to a range or has already returned its refusal; this else-arm exists only to unwrap the shared Option
src/drive/sheets/banding.rs ignore 796 both find_existing_banded_range returns Some for UpdateBanding or has already returned RefusedBandedRangeNotFound; this else-arm exists only to unwrap the shared Option
src/drive/sheets/banding.rs ignore 1233 both guards this test's assumption; build_request always returns AddBanding for a BandingVerb::AddBanding verb
src/drive/sheets/banding.rs ignore 1261 both guards this test's assumption; build_request always returns AddBanding for a BandingVerb::AddBanding verb
src/drive/sheets/banding.rs ignore 1302 both guards this test's assumption; build_request always returns UpdateBanding for a BandingVerb::UpdateBanding verb
src/drive/sheets/banding.rs ignore 1342 both guards this test's assumption; build_request always returns UpdateBanding for a BandingVerb::UpdateBanding verb
src/drive/sheets/banding.rs ignore 1373 both guards this test's assumption; build_request always returns UpdateBanding for a BandingVerb::UpdateBanding verb
src/drive/sheets/banding.rs ignore 1398 both guards this test's assumption; build_request always returns UpdateBanding for a BandingVerb::UpdateBanding verb
src/drive/sheets/banding.rs ignore 1511 both guards this test's assumption; build_request always returns UpdateBanding for a BandingVerb::UpdateBanding verb
src/drive/sheets/banding.rs ignore 1524 both guards this test's assumption; build_request always returns DeleteBanding for a BandingVerb::DeleteBanding verb
src/drive/sheets/banding.rs ignore 2026 both guards this test's assumption; only reached when the refusal regresses
src/drive/sheets/cell_format.rs ignore 294 both this closing brace reports 0 hits under llvm-cov regardless of test count — verified locally: render_line_covers_background_bold_number_note_and_validation and render_line_covers_italic_strikethrough_underline_foreground_alignment_and_bare_validation both complete the block above (the pattern and no-pattern pushes both measure as hit), yet this specific brace, closing the format_type.is_empty() check, never registers a hit; the same llvm-cov region-attribution artifact as src/utils/settings.rs:1096
src/drive/sheets/delete_duplicates.rs ignore 1405 both this let-else panic only runs if the match failed to bind the expected variant; an open-ended range always refuses here
src/drive/sheets/developer_metadata.rs ignore 1249 both guards this test's assumption; the multi-row span above always fails resolve_location with RefusedInvalidLocation
src/drive/sheets/developer_metadata.rs ignore 2637 both guards this test's assumption; a start of 0 above always fails resolve_location with RefusedInvalidLocation
src/drive/sheets/dimension_group.rs ignore 469 both find_sheet_id only ever returns an id it read out of this same workbook's sheets, so a lookup by that id in the same workbook always succeeds; this else-arm exists only to unwrap the shared Option
src/drive/sheets/dimension_group.rs ignore 716-718 both resolve_for_update returns Ok only with exactly one group, or the caller has already returned RefusedDimensionGroupNotFound/RefusedAmbiguousDimensionGroup; this else-arm exists only to unwrap the shared enum
src/drive/sheets/dimension_group.rs ignore 735-737 both resolve_for_delete returns Ok only as MaybeOne, or the caller has already returned RefusedDimensionGroupNotFound; this else-arm exists only to unwrap the shared enum
src/drive/sheets/dimension_group.rs ignore 1218 both guards this test's assumption; resolve_for_update always returns RefusedAmbiguousDimensionGroup for more than one candidate with no depth given
src/drive/sheets/dimension_group.rs ignore 1301 both guards this test's assumption; build_request always returns AddDimensionGroup for a DimensionGroupVerb::AddDimensionGroup verb
src/drive/sheets/dimension_group.rs ignore 1321 both guards this test's assumption; build_request always returns UpdateDimensionGroup for a DimensionGroupVerb::UpdateDimensionGroup verb
src/drive/sheets/dimension_group.rs ignore 1339 both guards this test's assumption; build_request always returns DeleteDimensionGroup for a DimensionGroupVerb::DeleteDimensionGroup verb
src/drive/sheets/dimension_group.rs ignore 1841 both guards this test's assumption; the mounted workbook has no sheet titled Q1
src/drive/sheets/embedded_object.rs ignore 1264 both build_plan only calls build_add_chart after matching verb as EmbeddedObjectVerb::AddChart; this else-arm exists only to destructure the already-known variant
src/drive/sheets/embedded_object.rs ignore 1367 both the series_ranges.len() != 1 check immediately above has already returned, so the pop always yields Some; this else-arm exists only to unwrap it
src/drive/sheets/embedded_object.rs ignore 1608 both merge_chart_spec is only ever called from build_update_chart, which build_plan reaches only after matching verb as EmbeddedObjectVerb::UpdateChart; this else-arm exists only to destructure the already-known variant
src/drive/sheets/embedded_object.rs ignore 1688 both merge_pie_chart is only ever called from merge_chart_spec, which has already destructured the same verb as EmbeddedObjectVerb::UpdateChart; this else-arm exists only to destructure the already-known variant
src/drive/sheets/embedded_object.rs ignore 1762 both merge_basic_chart is only ever called from merge_chart_spec, which has already destructured the same verb as EmbeddedObjectVerb::UpdateChart; this else-arm exists only to destructure the already-known variant
src/drive/sheets/embedded_object.rs ignore 1938 both build_plan only calls build_add_slicer after matching verb as EmbeddedObjectVerb::AddSlicer; this else-arm exists only to destructure the already-known variant
src/drive/sheets/embedded_object.rs ignore 2004-2006 both build_plan only calls build_update_slicer after matching verb as EmbeddedObjectVerb::UpdateSlicer; this else-arm exists only to destructure the already-known variant
src/drive/sheets/embedded_object.rs ignore 2291 both build_plan only calls build_move_chart after matching verb as EmbeddedObjectVerb::MoveChart; this else-arm exists only to destructure the already-known variant
src/drive/sheets/embedded_object.rs ignore 2362 both build_plan only calls build_move_slicer after matching verb as EmbeddedObjectVerb::MoveSlicer; this else-arm exists only to destructure the already-known variant
src/drive/sheets/embedded_object.rs ignore 2407 both build_plan only calls build_update_chart_border after matching verb as EmbeddedObjectVerb::UpdateChartBorder; this else-arm exists only to destructure the already-known variant
src/drive/sheets/embedded_object.rs ignore 2421 both validate_verb already refuses UpdateChartBorder { color: None, clear: false, .. } before build_plan is ever reached, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 2736 both every row of the table above pairs its raw value with the kind parse_chart_type returns for it, so the mismatch arm only fires if one of the two assertions above would already have failed
src/drive/sheets/embedded_object.rs ignore 2950 both this test always constructs verb as EmbeddedObjectVerb::AddChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 2961 both this test always constructs verb as EmbeddedObjectVerb::AddChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 2972 both this test always constructs verb as EmbeddedObjectVerb::AddChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 2986 both this test always constructs verb as EmbeddedObjectVerb::AddChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 3089 both this test always constructs verb as EmbeddedObjectVerb::AddChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 3112 both this test always constructs verb as EmbeddedObjectVerb::AddChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 3129 both this test always constructs verb as EmbeddedObjectVerb::AddChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 3150 both this test always constructs verb as EmbeddedObjectVerb::AddChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 3171 both this test always constructs verb as EmbeddedObjectVerb::AddChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 3183 both this test always constructs verb as EmbeddedObjectVerb::AddChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 3432 both this test always constructs verb as EmbeddedObjectVerb::UpdateChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 3449 both this test always constructs verb as EmbeddedObjectVerb::UpdateChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 3467 both this test always constructs verb as EmbeddedObjectVerb::UpdateChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 3520 both this test always constructs verb as EmbeddedObjectVerb::UpdateChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 3569 both this test always constructs verb as EmbeddedObjectVerb::UpdateChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 3598 both this test always constructs verb as EmbeddedObjectVerb::UpdateChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 3623 both this test always constructs verb as EmbeddedObjectVerb::UpdateChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 4150 both this test always constructs verb as EmbeddedObjectVerb::AddChart above, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 4797 both add_chart_verb_with's only callers pass an EmbeddedObjectVerb::AddChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 4810 both add_chart_verb_with's only callers pass an EmbeddedObjectVerb::AddChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 4830 both add_chart_verb_with's only callers pass an EmbeddedObjectVerb::AddChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 4845 both add_chart_verb_with's only callers pass an EmbeddedObjectVerb::AddChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 4858 both add_chart_verb_with's only callers pass an EmbeddedObjectVerb::AddChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 4873 both add_chart_verb_with's only callers pass an EmbeddedObjectVerb::AddChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 4882 both add_chart_verb_with's only callers pass an EmbeddedObjectVerb::AddChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 4895 both add_chart_verb_with's only callers pass an EmbeddedObjectVerb::AddChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 4908 both add_chart_verb_with's only callers pass an EmbeddedObjectVerb::AddChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 4930 both add_chart_verb_with's only callers pass an EmbeddedObjectVerb::AddChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 4951 both add_chart_verb_with's only callers pass an EmbeddedObjectVerb::AddChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5070 both update_chart_verb_with's only callers pass an EmbeddedObjectVerb::UpdateChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5094 both update_chart_verb_with's only callers pass an EmbeddedObjectVerb::UpdateChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5109 both update_chart_verb_with's only callers pass an EmbeddedObjectVerb::UpdateChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5125 both update_chart_verb_with's only callers pass an EmbeddedObjectVerb::UpdateChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5143 both update_chart_verb_with's only callers pass an EmbeddedObjectVerb::UpdateChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5161 both update_chart_verb_with's only callers pass an EmbeddedObjectVerb::UpdateChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5188 both update_chart_verb_with's only callers pass an EmbeddedObjectVerb::UpdateChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5233 both update_chart_verb_with's only callers pass an EmbeddedObjectVerb::UpdateChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5364 both update_slicer_verb always builds an EmbeddedObjectVerb::UpdateSlicer, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5441 both add_slicer_verb always returns an EmbeddedObjectVerb::AddSlicer, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5472 both add_slicer_verb always returns an EmbeddedObjectVerb::AddSlicer, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5566 both update_slicer_verb always builds an EmbeddedObjectVerb::UpdateSlicer, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5576 both update_slicer_verb always builds an EmbeddedObjectVerb::UpdateSlicer, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5586 both update_slicer_verb always builds an EmbeddedObjectVerb::UpdateSlicer, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5596 both update_slicer_verb always builds an EmbeddedObjectVerb::UpdateSlicer, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5606 both update_slicer_verb always builds an EmbeddedObjectVerb::UpdateSlicer, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5620 both update_slicer_verb always builds an EmbeddedObjectVerb::UpdateSlicer, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5675 both update_slicer_verb always builds an EmbeddedObjectVerb::UpdateSlicer, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5684 both update_slicer_verb always builds an EmbeddedObjectVerb::UpdateSlicer, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5739 both update_slicer_verb always builds an EmbeddedObjectVerb::UpdateSlicer, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5753 both update_slicer_verb always builds an EmbeddedObjectVerb::UpdateSlicer, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5805 both callers always pass a verb built by move_chart_verb, which is always MoveChart
src/drive/sheets/embedded_object.rs ignore 5812 both callers always pass a verb built by move_slicer_verb, which is always MoveSlicer
src/drive/sheets/embedded_object.rs ignore 5856 both move_chart_verb always builds an EmbeddedObjectVerb::MoveChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5888 both move_chart_verb always builds an EmbeddedObjectVerb::MoveChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5912 both move_chart_verb always builds an EmbeddedObjectVerb::MoveChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5955 both move_chart_verb always builds an EmbeddedObjectVerb::MoveChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5971 both move_chart_verb always builds an EmbeddedObjectVerb::MoveChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 5986 both move_slicer_verb always builds an EmbeddedObjectVerb::MoveSlicer, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 6025 both move_chart_verb always builds an EmbeddedObjectVerb::MoveChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 6040 both move_slicer_verb always builds an EmbeddedObjectVerb::MoveSlicer, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 6056 both move_chart_verb always builds an EmbeddedObjectVerb::MoveChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 6090 both move_slicer_verb always builds an EmbeddedObjectVerb::MoveSlicer, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 6169 both update_chart_border_verb always builds an EmbeddedObjectVerb::UpdateChartBorder, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 6187 both update_chart_border_verb always builds an EmbeddedObjectVerb::UpdateChartBorder, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 6199 both update_chart_border_verb always builds an EmbeddedObjectVerb::UpdateChartBorder, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 6211 both update_chart_border_verb always builds an EmbeddedObjectVerb::UpdateChartBorder, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 6690 both add_chart_verb_with's only callers pass an EmbeddedObjectVerb::AddChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 6865 both add_chart_verb_with's only callers pass an EmbeddedObjectVerb::AddChart, so this arm can never run
src/drive/sheets/embedded_object.rs ignore 7134 both this test always constructs verb as EmbeddedObjectVerb::AddChart above, so this arm can never run
src/drive/sheets/filter.rs ignore 643 both find_existing_filter_view returns Some for UpdateFilterView or has already returned RefusedFilterViewNotFound; this else-arm exists only to unwrap the shared Option
src/drive/sheets/filter.rs ignore 693 both resolve_sheet_target returns Some for SetBasicFilter or has already returned its refusal; this else-arm exists only to unwrap the shared Option
src/drive/sheets/filter.rs ignore 711 both resolve_sheet_target returns Some for ClearBasicFilter or has already returned its refusal; this else-arm exists only to unwrap the shared Option
src/drive/sheets/filter.rs ignore 723 both resolve_sheet_target returns Some for AddFilterView or has already returned its refusal; this else-arm exists only to unwrap the shared Option
src/drive/sheets/filter.rs ignore 745 both update_write is built for UpdateFilterView above or has already returned its refusal; this else-arm exists only to unwrap the shared Option
src/drive/sheets/filter.rs ignore 3932 both this arm only fires if the match failed to bind the expected variant; the assertion below it pins the same variant, so the branch never executes
src/drive/sheets/find_replace.rs ignore 306-310 both request_scope only returns None for a Range target paired with no grid, but resolve_target's Range arm always returns Ok with Some(grid) alongside it; this arm exists only to unwrap the shared Option
src/drive/sheets/find_replace.rs ignore 393-397 both validate_scope_syntax already refuses --all-sheets combined with --sheet before resolve_target is ever reached; this arm exists only as a defensive re-check
src/drive/sheets/find_replace.rs ignore 403-407 both validate_scope_syntax's scope_count check already guarantees --range is unset whenever --whole-sheet is set, before resolve_target is ever reached; this arm exists only as a defensive re-check
src/drive/sheets/find_replace.rs ignore 410-414 both validate_scope_syntax already refuses --whole-sheet without --sheet before resolve_target is ever reached; this arm exists only as a defensive re-check
src/drive/sheets/find_replace.rs ignore 503 both record_attempt is only called when !opts.dry_run, and WouldChange is only ever returned when opts.dry_run is true, so this arm can never run
src/drive/sheets/find_replace.rs ignore 843 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/find_replace.rs ignore 856 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/find_replace.rs ignore 870 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/find_replace.rs ignore 894 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/find_replace.rs ignore 914 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/find_replace.rs ignore 933 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/find_replace.rs ignore 951 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/find_replace.rs ignore 1091 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/find_replace.rs ignore 1155 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/find_replace.rs ignore 1581 both assert_eq!'s message args are only evaluated on failure, and this test always passes
src/drive/sheets/grid_range.rs ignore 1122 both a sheet-only composition always fails at the split_sheet_prefix check above; not_found is never reached in this test
src/drive/sheets/named_range.rs ignore 489 both existing is always Some for UpdateNamedRange: find_existing_named_range above either returns it or refuses and returns early
src/drive/sheets/named_range.rs ignore 541 both existing is always Some for DeleteNamedRange: find_existing_named_range_target above either returns it or refuses and returns early
src/drive/sheets/named_range.rs ignore 564 both new_grid is always Some for AddNamedRange: resolve_grid above either returns it or refuses and returns early
src/drive/sheets/named_range.rs ignore 579 both existing is always Some for UpdateNamedRange: find_existing_named_range above either returns it or refuses and returns early
src/drive/sheets/named_range.rs ignore 590 both existing is always Some for DeleteNamedRange: find_existing_named_range above either returns it or refuses and returns early
src/drive/sheets/named_range.rs ignore 1270 both find_existing_named_range always returns RefusedAmbiguousName here; this test's mounted workbook always has two matching names
src/drive/sheets/named_range.rs ignore 1356 both check_new_name_available always returns RefusedDuplicateName here; this test's new_name always collides with a different named range
src/drive/sheets/named_range.rs ignore 1381 both check_new_name_available always returns RefusedDuplicateName here; this test's new_name always collides with two different named ranges
src/drive/sheets/paste.rs ignore 701 both extents are bounded and non-empty by construction; the fallback exists so an invariant break degrades instead of panicking
src/drive/sheets/pivot.rs ignore 1953 both dry_run plus a fully-allowing gate always reaches WouldChange here; this branch is a safety net against an unexpected refusal, not a coverage gap
src/drive/sheets/randomize_range.rs ignore 678 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/randomize_range.rs ignore 740 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/randomize_range.rs ignore 879 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/randomize_range.rs ignore 916 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/randomize_range.rs ignore 938 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/randomize_range.rs ignore 954 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/randomize_range.rs ignore 979 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/sort_range.rs ignore 790 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/sort_range.rs ignore 879 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/sort_range.rs ignore 894 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/sort_range.rs ignore 911 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/sort_range.rs ignore 928 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/sort_range.rs ignore 942 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/sort_range.rs ignore 957 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/sort_range.rs ignore 1087 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/sort_range.rs ignore 1121 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/sort_range.rs ignore 1142 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/sort_range.rs ignore 1158 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/sort_range.rs ignore 1183 both this let-else panic only runs if the match failed to bind the expected variant; this test always constructs that exact variant, so the branch never executes
src/drive/sheets/structure.rs ignore 1868-1870 both validate_verb_args refuses an UpdateSheetProperties verb that set none of its six properties before structure_inner ever reaches build_request, and every one of those six pushes a fields entry, so fields is never empty here
src/drive/sheets/structure.rs ignore 1962-1966 both every call site matches on the verb as UpdateWorkbookProperties before calling workbook_properties_summary, so this else-arm exists only to destructure the already-known variant
src/drive/sheets/structure.rs ignore 6255 both guards this test's assumption; validate_verb_args always refuses --tab-color with --clear-tab-color as RefusedInvalidRange
src/drive/sheets/structure.rs ignore 6307 both guards this test's assumption; check_freeze_bound always refuses a negative --freeze-rows as RefusedInvalidRange
src/drive/sheets/structure.rs ignore 6335 both guards this test's assumption; check_freeze_bound always refuses a --freeze-rows at or above the sheet's known row count as RefusedInvalidRange
src/drive/sheets/structure.rs ignore 6435 both guards this test's assumption; check_freeze_bound always refuses a negative --freeze-columns as RefusedInvalidRange
src/drive/sheets/structure.rs ignore 6462 both guards this test's assumption; check_freeze_bound always refuses a --freeze-columns at or above the sheet's known column count as RefusedInvalidRange
src/drive/sheets/structure.rs ignore 6508 both guards this test's assumption; validate_verb_args always refuses an update-sheet-properties verb that set no property as RefusedInvalidRange
src/drive/sheets/structure.rs ignore 8052 both build_request always returns UpdateSpreadsheetProperties for an UpdateWorkbookProperties verb, so this else-arm exists only to unwrap the shared enum
src/drive/sheets/structure.rs ignore 8076 both build_request always returns UpdateSpreadsheetProperties for an UpdateWorkbookProperties verb, so this else-arm exists only to unwrap the shared enum
src/drive/sheets/structure.rs ignore 8104 both build_request always returns UpdateSpreadsheetProperties for an UpdateWorkbookProperties verb, so this else-arm exists only to unwrap the shared enum
src/drive/sheets/structure.rs ignore 8156 both guards this test's assumption; a dry run against an allowed target always reaches WouldChange here
src/drive/sheets/structure.rs ignore 8236 both guards this test's assumption; an apply against an allowed target with a mocked batchUpdate always reaches Changed here
src/drive/sheets/target_gate.rs ignore 550 both every operation is granted by the mounted rule, so resolve_all always returns Gated here; this branch is a safety net against an unexpected refusal, not a coverage gap
src/drive/sheets/target_gate.rs ignore 581 both the target has a visible parent with a matching folder rule, so resolve_all always returns Gated here; this branch is a safety net against an unexpected refusal, not a coverage gap
src/drive/sheets/target_gate.rs ignore 609 both the target has a visible parent with a matching folder rule, so resolve_all always returns Gated here; this branch is a safety net against an unexpected refusal, not a coverage gap
src/drive/sheets/target_gate.rs ignore 645 both every operation is granted by a mounted rule, so resolve_all always returns Gated here; this branch is a safety net against an unexpected refusal, not a coverage gap
src/drive/sheets/target_gate.rs ignore 722 both the file rule gives sheets-structure something to deny rather than find nothing, so resolve_all always returns Gated here; this branch is a safety net against an unexpected refusal, not a coverage gap
src/drive/sheets/text_to_columns.rs ignore 1502 both this match's catch-all only runs if build_request failed to return the request variant this test constructs it to build; that never happens, so the branch never executes
src/drive/sheets/text_to_columns.rs ignore 1514 both this match's catch-all only runs if build_request failed to return the request variant this test constructs it to build; that never happens, so the branch never executes
src/drive/sheets/text_to_columns.rs ignore 1584 both would_change_outcome always constructs a WouldChange result, so this catch-all identity arm never runs
src/drive/sheets/text_to_columns.rs ignore 1667 both from_lease_failed always returns Failed; this test's catch-all guards that assumption and never runs
src/drive/sheets/text_to_columns.rs ignore 2308 both this test's mocked responses always drive a WouldChange outcome; this catch-all guards that assumption and never runs
src/drive/sheets/text_to_columns.rs ignore 2403 both this test's mocked responses always drive a Changed outcome; this catch-all guards that assumption and never runs
src/drive/sheets/text_to_columns.rs ignore 2858 both this test's mocked responses always drive a Changed outcome; this catch-all guards that assumption and never runs
src/drive/sheets/trim_whitespace.rs ignore 1315 both this let-else panic only runs if the match failed to bind the expected variant; the mocked run always produces it
src/drive/sheets/trim_whitespace.rs ignore 1436 both this let-else panic only runs if the match failed to bind the expected variant; the mocked run always produces it
src/drive/sheets/validation.rs ignore 1793 both guards this test's assumption; only reached when the refusal regresses
src/drive/sync.rs ignore 110 both every caller passes one of the five literal actions above; the arm only guards against a future caller adding a sixth without a counter
src/drive/sync.rs ignore 473 both TOCTOU only: safe_path above already ran this identical lstat on the leaf and fails on any non-NotFound error, so a deterministic test cannot reach it
src/drive/test_support.rs ignore 315-321 both only runs if a function mutates a Drive env var without EnvGuard::take(); offenders.is_empty() below is this test's whole point
src/drive/test_support.rs ignore 329 both assert! message args only evaluate when the condition is false, i.e. an offender was found
src/github_issues.rs ignore 579 both validated by the citation parser; every ItemRef reaching here already has a project of the form owner/repo
src/github_metrics/incremental.rs ignore 1207 both guards this test's assumption; the last attempt treats a raced search as a file not found, so it always plans
src/gmail/draft_edit.rs ignore 634 both unreachable: a delimiter line's start is always the position right after some previous line's '\n' (either the outer while loop's line_end, or 0 for the very first line), so it always ends with '\n'; this arm exists solely for exhaustiveness over the byte-slice check
src/jev/citations.rs ignore 127 both unreachable: both call sites (find_citations, first_citation) already filtered out the only alternative with no numbered group (other_url) via number_end before calling this
src/jev/exists.rs ignore 190 both Child::kill returns Ok for a child that has exited but not been reaped, and wait() only runs after this call, so only an OS-level failure such as EPERM reaches this arm; it exists so that failure is logged rather than silently dropped
src/jev/route.rs ignore 310 both defensive: the embedded questions YAML always has all three stage keys, pinned by stage_questions_are_the_tested_wording
src/jev/route.rs ignore 320 both defensive: every embedded stage question is a choice question, pinned by stage_questions_are_the_tested_wording
src/jev/route.rs ignore 328 both defensive: no embedded or custom tier is ever named none, the one fixed criterion (stage_design's no-design-work option)
src/jev/route.rs ignore 1804 both unreachable: https is a special scheme per the WHATWG URL spec, so a URL that already passed the scheme check above can never be cannot-be-a-base and path_segments() is always Some
src/jev/route.rs ignore 1970 both assert_eq!'s message args are only evaluated on failure, and this test always passes
src/jev/route.rs ignore 1980 both assert_eq!'s message args are only evaluated on failure, and this test always passes
src/jev/route.rs ignore 1981 both assert_eq!'s message args are only evaluated on failure, and this test always passes
src/jev/route.rs ignore 3369 both guards this test helper against misuse; every call site below passes an already-routed outcome
src/jev/route.rs ignore 3575 both guards this test's assumption; the mocked response above always answers with a routed outcome
src/jev/route.rs ignore 3639 both guards this test's assumption; the mocked response above always leaves gemini's answers missing
src/sessions/watcher.rs ignore 148-151 both read_dir yields an Err entry only on an I/O fault (EIO, a vanished directory mid-iteration), which a test cannot provoke; the scan counts it and moves on, the same handling as the unreadable project directory below
src/sessions/watcher.rs ignore 159-162 both read_dir yields an Err entry only on an I/O fault (EIO, a vanished directory mid-iteration), which a test cannot provoke; the scan counts it and moves on, the same handling as the unreadable project directory above
src/sessions/watcher.rs ignore 174-177 both DirEntry::metadata does not follow symlinks, so it fails only when the entry vanished between read_dir and the stat, a race a test cannot provoke; the scan counts it and moves on
src/sessions/watcher.rs ignore 183-186 both Metadata::modified fails only on a platform with no mtime, and every supported one (Linux, macOS) has it
src/sessions/watcher.rs ignore 250-254 both spawn_blocking's JoinError needs the scan closure to panic or the runtime to shut down mid-scan; scan has no panicking path, and the runtime outlives the watcher, whose token is cancelled first
src/utils/secret_env.rs ignore 936-944 both the loop above runs this 4 times and every mode fails the same way; verified locally that llvm-cov still reports 0 hits on the matches!( line — a region-attribution artifact on the nested assert!/matches! macro call, not an untested path
src/utils/secret_env.rs ignore 1366 both exercised by strip_test_modules_ignores_braces_in_literals_and_comments's '{' char literal; verified locally that llvm-cov still reports 0 hits — a region-attribution artifact on this closing brace, not an untested path
src/utils/secret_env.rs ignore 1421 both only runs if an unregistered secret-shaped literal exists; the assert below that unknown is empty is this test's whole point, so a passing run never takes this branch
src/utils/secret_env.rs ignore 1479-1481 both only runs if a registered secret is read through a plain accessor outside this module; offenders.is_empty() below is this test's whole point
src/utils/secret_env.rs ignore 1525 both only runs if a _FILE companion collides with an existing variable; collisions.is_empty() below is this test's whole point
src/utils/secret_env.rs ignore 1556 both only runs if a stray file names the companion; strays.is_empty() below is this test's whole point
src/utils/secret_env/command.rs ignore 281-290 both try_wait on a live, owned child fails only if waitpid itself errors (ECHILD/EINTR from outside the process); no in-process test can provoke it, and the arm only reaps and reports
src/utils/settings.rs ignore 1235 both this closing brace reports 0 hits under llvm-cov regardless of test count — verified locally: upsert_account_writes_a_secret_into_its_file_not_settings and several other tests complete the block above (the push on the line just before, and entry.remove(*key) right after, both measure as hit), yet this specific brace, immediately after an if-let whose scrutinee ends in a ? operator, never registers a hit; an llvm-cov region-attribution artifact, not an untested path

Patch coverage

Patch: 100% (54/54 new lines covered)

File Patch Uncovered new lines
src/cli/worktrees/ui/terminal/pty.rs 100% (54/54) —

📦 Full per-file coverage summary · run summary

Extract the readiness wait with an injectable deadline, and exercise
its timeout without delaying the suite. Assert the panic diagnostic,
SIGKILL, OS-level reaping, and removal of the process group.
@newhoggy
newhoggy added this pull request to the merge queue Oct 6, 2026
Merged via the queue into main with commit 85973ec Oct 6, 2026
19 checks passed
@newhoggy
newhoggy deleted the issue-2174-reap-tests-readiness-handshake branch October 6, 2026 14:28
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.

test(worktrees): reap_tests' fixed 100 ms setup sleep is a timing assumption; replace it with a readiness handshake

1 participant