ci: give the jobs that run the unit suite a reaping PID 1 #91

Merged
claude merged 1 commit from ci/reaping-init into main 2026-10-16 13:41:18 +00:00
Member

Summary

SessionCloseTest times out on main and on every PR since #86. The job container's PID 1 is tail -f /dev/null, which never reaps. A killed grandchild of the CLI stays a zombie, the JDK reports it as alive (JDK-8284282), and zio-process killTreeForcibly waits on its onExit() for ever.

  • container: init: true on ci.yml › test and publish.yml › publish. Docker then runs docker-init as PID 1.
  • The value is a literal on purpose: the runner reads init before it evaluates expressions, and drops ${{ }} silently.

This fixes CI only, to unblock 0.7.0. The SDK still hangs a close in a container without an init; that fix is filed as its own issue.

Stacked on #89 (its commit is the first one here). Merge #89 first.

Verification

Probe on this runner (v13.1.0, branch ci/init-probe, runs 1417 and the literal re-run):

Job PID 1 Orphan zombie SessionCloseTest
no container: tail -f /dev/null stays 1 of 2 fail (timeout)
init: ${{ matrix.init }} tail -f /dev/null stays 1 of 2 fail
init: true /sbin/docker-init -- tail -f /dev/null reaped 2 of 2 pass

🤖 Generated with Claude Code

https://claude.ai/code/session_01XE9uNVmKpVQiZvc3kLY2zh

## Summary `SessionCloseTest` times out on main and on every PR since #86. The job container's PID 1 is `tail -f /dev/null`, which never reaps. A killed grandchild of the CLI stays a zombie, the JDK reports it as alive (JDK-8284282), and zio-process `killTreeForcibly` waits on its `onExit()` for ever. - `container: init: true` on `ci.yml` › `test` and `publish.yml` › `publish`. Docker then runs `docker-init` as PID 1. - The value is a literal on purpose: the runner reads `init` before it evaluates expressions, and drops `${{ }}` silently. This fixes CI only, to unblock 0.7.0. The SDK still hangs a close in a container without an init; that fix is filed as its own issue. Stacked on #89 (its commit is the first one here). Merge #89 first. ## Verification Probe on this runner (v13.1.0, branch `ci/init-probe`, runs 1417 and the literal re-run): | Job | PID 1 | Orphan zombie | SessionCloseTest | |---|---|---|---| | no `container:` | `tail -f /dev/null` | stays | 1 of 2 fail (timeout) | | `init: ${{ matrix.init }}` | `tail -f /dev/null` | stays | 1 of 2 fail | | `init: true` | `/sbin/docker-init -- tail -f /dev/null` | reaped | 2 of 2 pass | 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01XE9uNVmKpVQiZvc3kLY2zh
Keep the kyo experiment out of every publish
Some checks failed
CI / Compile (pull_request) Successful in 2m1s
CI / Check Formatting (pull_request) Successful in 39s
CI / Check Linting (pull_request) Successful in 1m29s
CI / Run Tests (pull_request) Failing after 2m55s
CI / Run Integration Tests (pull_request) Successful in 1m49s
CI / Check Bundle Size (pull_request) Successful in 46s
8484ae442c
KX-D7 holds kyo as an unpublished experiment, and build.mill said so,
but kyo extended SharedModule, which mixed in PublishModule. The publish
selector __:PublishModule.publishArtifacts therefore took it, and
claude-code-query-kyo_3:0.7.0-SNAPSHOT reached the registry. Tagging
v0.7.0 would have added a release of it that the registry cannot
overwrite.

SharedModule now carries the compile settings only. PublishedModule adds
PublishModule, the version and the POM, and every module except kyo
extends it. ./mill resolve __:PublishModule.publishArtifacts no longer
lists kyo.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XE9uNVmKpVQiZvc3kLY2zh
ci: give the jobs that run the unit suite a reaping PID 1
All checks were successful
CI / Compile (pull_request) Successful in 1m37s
CI / Check Formatting (pull_request) Successful in 40s
CI / Check Linting (pull_request) Successful in 1m30s
CI / Run Tests (pull_request) Successful in 1m47s
CI / Run Integration Tests (pull_request) Successful in 1m48s
CI / Check Bundle Size (pull_request) Successful in 46s
4e6cf970d0
The job container's PID 1 is tail -f /dev/null, which never reaps. A
killed grandchild of the CLI then stays a zombie, the JDK reports it
alive (JDK-8284282), and zio-process killTreeForcibly waits on its
onExit for ever: SessionCloseTest hit its 60 s timeout on main and on
every PR since #86.

container.init: true makes Docker run docker-init as PID 1. Probed on
this runner (v13.1.0): with it PID 1 is docker-init, an orphan is
reaped, and SessionCloseTest passes; without it, the test times out.
The value is a literal because the runner drops an expression there.

This fixes CI only. The SDK still hangs a close in a container without
an init; that fix is filed separately.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XE9uNVmKpVQiZvc3kLY2zh
claude merged commit c729fa8a24 into main 2026-10-16 13:41:18 +00:00
claude deleted branch ci/reaping-init 2026-10-16 13:41:18 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
iterative-works/claude-code-query!91
No description provided.