Skip to content

Bound release-test children and reap escaped Harness descendants - #1063

Merged
JacobStephens2 merged 2 commits into
mainfrom
issue-737
Oct 22, 2026
Merged

JacobStephens2 merged 2 commits into
mainfrom
issue-737

Conversation

@JacobStephens2

@JacobStephens2 JacobStephens2 commented Oct 22, 2026 •

Copy link
Copy Markdown
Owner

Summary

Release fixtures now fail with captured stdout/stderr when fake CI never finishes, and clean up every owned descendant even if the fixture process is killed. Production release polling and rerun resumption are unchanged.

fixture harness
  guardian (Linux subreaper + private EOF lease)
    release.sh
      gh / git / release-summary Harnesses

exit / deadline / panic / harness death
  kill and reap owned descendants until none remain

The shared child-lifetime helper from #736 supplies the immediate child's parent-death signal. Release commands, sourced script functions and release-note scripts now use a 120-second test deadline. File-backed stdio keeps input writes and inherited output descriptors from blocking the deadline.

Closes #737

Evidence

  • Before: cargo test --test release lifetime::missing_workflows_fail_with_captured_output_within_five_seconds -- --exact --nocapture failed after 5.04s because the release fixture was still polling.
    After: the retained full-script lifecycle tests cover missing and pending runs at both CI and release-workflow waits, with a 500ms deadline and a five-second supervisor bound. Normal completion, assertion unwinding and fixture SIGKILL also pass.
  • Before: the Spec review's exact standalone reproduction timed out after 100ms but left the actual release-summary Harness alive (exit 101, release summary CLI 1798286 survived fixture timeout).
    After: the guardian adopts descendants across process groups. cargo test --test release lifetime::release_summary_harness_ -- --nocapture independently passed both retained regressions, including fixture SIGKILL.
  • cargo test --test release lifetime:: -- --nocapture: 9 passed, 2 ignored.
  • cargo clippy --all-targets -- -D warnings and formatting checks passed.
  • Final /usr/bin/time -p scripts/affected-tests main selected cargo nextest run: 2,237 passed, 50 skipped. Test execution took 1,062.658s; total wall time was 1,101.46s (18m21s), including 37.54s compilation. The full suite includes failing_checks_leave_the_pr_open_with_no_tag and the existing release resumption cases.
  • CI passed for 27aaa13: Linux full Rust suite, formatting, clippy, release-generator checks, site, Console, and the macOS gate.

Test seams

  • Release fixture command execution: bounded completion and captured stdout/stderr.
  • Real release polling functions with a focused fake gh: permanently missing/pending workflow runs.
  • Fixture subprocess lifetime: normal exit, assertion unwinding, deadline expiry and SIGKILL, observed through recorded owned PIDs.
  • Full release script with failed CI: release PR remains open and no tag is pushed.

Review coverage

Independent Standards and Spec reviews used main as the fixed point, then reviewed the descendant-cleanup correction. Both read all four changed files: docs/testing.md, tests/release.rs, tests/release/lifetime.rs, and tests/support/child_lifetime.rs. Unread changed files: none. Generated-output exclusions: none.

Spec S1 was reproduced as written, fixed, and retained as timeout/SIGKILL regressions. No remaining Spec findings.

Unaddressed findings

Standards

  • S1 (P3 heuristic): duplicated lifecycle observers. Plan decision: keep the release and setup observers local to their different readiness and ownership protocols for this focused fix. The release observer checks a guardian plus a variable list of descendant PIDs; setup's observer has its separate setup/retained-PTY-master keeper protocol. Command lifetime enforcement is shared in tests/support/child_lifetime.rs. The follow-up Standards reviewer agreed this deferral is reasonable and identified no behavior defect or required correction. This implementation-scope decision needs no Spec or Day shift ruling.

Spec

None.

Security

None.

Security review outcome

No unaddressed introduced findings.

Merge Danger

Door: two-way

Test infrastructure and documentation only; production release code is unchanged.

Blast Radius: tests

The new descendant guardian runs only for Linux release fixtures. Existing setup lifetime enforcement remains unchanged.

Built with codex · gpt-6.1-sol · xhigh

@JacobStephens2
JacobStephens2 merged commit 8770bb8 into main Oct 22, 2026
7 checks passed
@JacobStephens2
JacobStephens2 deleted the issue-737 branch October 22, 2026 08:58
@JacobStephens2 JacobStephens2 mentioned this pull request Oct 22, 2026
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.

Bound release-test child lifetime when CI polling never completes

1 participant