Files
ironclaw/scripts
Henry Park bf495dddf1 fix(docker): install curl so orchestrator healthchecks can run (#7555)
* fix(docker): install curl so orchestrator healthchecks can run

Forward-port of #7303 from release/1.1.0-rc.1 onto this release branch.

The runtime stage installs only ca-certificates, postgresql-client and
sqlite3 on top of debian:bookworm-slim, which ships no HTTP client.
Hosted orchestrators probe the container with an in-container HTTP
healthcheck -- the CrabShack worker template runs

    test: ["CMD-SHELL", "curl -fsS http://localhost:3000/ || exit 1"]

so the probe could never execute. The container is never marked healthy,
the deploy times out, and the instance is moved to `error` -- while the
listener is serving 200s the entire time.

The regression test is scoped to the runtime stage rather than the whole
file: this branch's `railway_cli` build stage already installs curl for
its own download, so the upstream whole-file substring assertion would
pass here while the shipped image still had no HTTP client. Verified red
before the Dockerfile change, green after.

Also ports the other half of #7303's planner fix: `_root_test_partitions`
globbed only `tests/reborn_*.rs`, so `tests/dockerfile_runtime_home.rs`
(and `trace_format`, `trace_llm_tests`, the `e2e_trace_runtime_policy_*`
pair) hit the planner's fail-closed arm -- touching this test in a PR
failed `Detect Reborn test scope`. The inventory now covers every root
test target cargo auto-discovers. This branch's separate decision to keep
`Dockerfile`/`.dockerignore` as static control paths (#7084) is left
intact.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(ci): align the root-partition runner with the planner inventory

Addresses both review findings on #7555.

Codex P1 — the planner and `scripts/ci/run-reborn-root-partition.sh` both
index a sorted list of root tests and take `index % partitions`, so the two
inventories have to match exactly. Widening only the planner shifted every
assignment: the planner scheduled `dockerfile_runtime_home` into partition 0
while the runner, still globbing `reborn_*.rs`, executed a different set and
never ran it. The job passed anyway. The runner now discovers the same
`tests/*.rs` set cargo auto-discovers.

The new regression test drives the real script with a stubbed `cargo` and
`timeout` and compares what it executes, per partition, against
`_root_test_partitions()` — behavior, not script text. Verified it fails when
the runner's glob is narrowed back.

IronLoop medium — `Dockerfile` and `.dockerignore` were static control paths
(#7084) on the premise that no Reborn Rust lane reads the image definition.
That premise is false: `tests/dockerfile_runtime_home.rs` asserts the runtime
packages, the entrypoint's behavior, and the seed configs.
`platform-and-compat.yml` builds the image but never runs those assertions, so
a Dockerfile-only PR that dropped `curl` would have passed exactly as 1.1.0
did. Those paths, plus the two seed configs the same test reads, now schedule
that test's partition.

The routing set is enumerated rather than globbed as `docker/**`:
`config.production.toml` and `process-sandbox-entrypoint.sh` have no owning
lane and must keep failing closed, which
`test_sibling_container_inputs_still_require_a_decision` pins.
`docker/reborn/entrypoint.sh` keeps its earlier static-control decision — it
is matched before this branch is reached.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-12 14:17:35 -07:00
..