Fixes the CI sweep self-test tearing down other jobs' live stacks on the shared runner.
What happened.scripts/test-ci-sweep.sh (run by infrastructure-smoke on every Core run) called ci-sweep.sh --stale --max-age-seconds 0 against the shared Docker daemon. A zero threshold matches everyekklesia-ci- stack, so it removed whatever was running at that moment, while reporting "CI sweep checks passed". It removed Zayin/Signage run 288's integration stack twice: attempt 1 during Core run 289, and attempt 2 during Core run 290 at 03:40:56, one second before connectivity-blip failed and the stack's _edge network vanished.
Fix.
ci-sweep.sh --stale accepts --prefix P. P must begin with the CI prefix, so it can only narrow a sweep. --job refuses it. The workflow's sweeps are unchanged.
The self-test confines every stale sweep to its own fake run, and adds a bystander stack from another run that must survive even the zero threshold.
tests/ci-scripts.test.ts gains a Docker-free guard: every stale sweep in the self-test is confined, and the workflow's keep the default threshold.
Verified.
Reproduced locally: main's self-test removes an unrelated ekklesia-ci-… container and still passes. With this change the same container survives and all 15 checks pass.
Fixes the CI sweep self-test tearing down other jobs' live stacks on the shared runner.
**What happened.** `scripts/test-ci-sweep.sh` (run by `infrastructure-smoke` on every Core run) called `ci-sweep.sh --stale --max-age-seconds 0` against the shared Docker daemon. A zero threshold matches *every* `ekklesia-ci-` stack, so it removed whatever was running at that moment, while reporting "CI sweep checks passed". It removed Zayin/Signage run 288's integration stack twice: attempt 1 during Core run 289, and attempt 2 during Core run 290 at 03:40:56, one second before `connectivity-blip` failed and the stack's `_edge` network vanished.
**Fix.**
- `ci-sweep.sh --stale` accepts `--prefix P`. P must begin with the CI prefix, so it can only narrow a sweep. `--job` refuses it. The workflow's sweeps are unchanged.
- The self-test confines every stale sweep to its own fake run, and adds a bystander stack from another run that must survive even the zero threshold.
- `tests/ci-scripts.test.ts` gains a Docker-free guard: every stale sweep in the self-test is confined, and the workflow's keep the default threshold.
**Verified.**
- Reproduced locally: `main`'s self-test removes an unrelated `ekklesia-ci-…` container and still passes. With this change the same container survives and all 15 checks pass.
- The new guard fails against `main`'s self-test.
- `pnpm ci:verify` passes (2,639 tests).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
scripts/test-ci-sweep.sh proves the stale sweep by running
`ci-sweep.sh --stale --max-age-seconds 0` on the runner's shared Docker
daemon. With a zero threshold that removes every `ekklesia-ci-` stack on
the daemon, not just the test's own: any job running at that moment
loses its containers, networks, and volumes. It reported "CI sweep
checks passed" while doing it. Core's infrastructure-smoke job runs the
self-test on every run, and twice tore down Signage's integration stack
mid-scenario (Zayin/Signage run 288: its first attempt, and the second
one during connectivity-blip).
`ci-sweep.sh --stale` now takes `--prefix P`, which narrows the sweep to
stacks whose names begin with P and must itself begin with the CI
prefix, so it can only narrow a sweep, never widen one. The self-test
confines every stale sweep to its own fake run and proves that another
run's stack survives even the zero threshold. The workflow's own sweeps
are unchanged.
Regression: a bystander stack from another run in the self-test, and a
Docker-free guard that every stale sweep in the self-test is confined
and the workflow's keep the default threshold.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Fixes the CI sweep self-test tearing down other jobs' live stacks on the shared runner.
What happened.
scripts/test-ci-sweep.sh(run byinfrastructure-smokeon every Core run) calledci-sweep.sh --stale --max-age-seconds 0against the shared Docker daemon. A zero threshold matches everyekklesia-ci-stack, so it removed whatever was running at that moment, while reporting "CI sweep checks passed". It removed Zayin/Signage run 288's integration stack twice: attempt 1 during Core run 289, and attempt 2 during Core run 290 at 03:40:56, one second beforeconnectivity-blipfailed and the stack's_edgenetwork vanished.Fix.
ci-sweep.sh --staleaccepts--prefix P. P must begin with the CI prefix, so it can only narrow a sweep.--jobrefuses it. The workflow's sweeps are unchanged.tests/ci-scripts.test.tsgains a Docker-free guard: every stale sweep in the self-test is confined, and the workflow's keep the default threshold.Verified.
main's self-test removes an unrelatedekklesia-ci-…container and still passes. With this change the same container survives and all 15 checks pass.main's self-test.pnpm ci:verifypasses (2,639 tests).🤖 Generated with Claude Code