gate DIAGNOSTIC (remove with #359): sigwho.py is the step's own top process
The first diagnostic run (8d4740d0) showed sigwho as pid 4 under the gate shell (pid 2) and it never received a signal, while the step still died by SIGTERM: the signal went to one pid, the top shell or bwrap, not to the group. Now 10-gate execs the wrapper, which runs the real step from 10-gate.real, so a signal aimed at the step's top process is caught and its sender named.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2 files changed,
+62
−56
.amadan/ci.d/10-gate+6 −56.amadan/ci.d/10-gate.real+56 −0
CI failed — run details
CI log
=== gate === sigwho: pid 2 ppid 1 pgid 0 sid 0; child pid 3 .amadan/test-gate.sh gate: 2026-10-24T02:26:06Z on aarch64, 32 cpus, 61941 MB available, go1.26.8 linux/arm64 gate: +0s start launchctx gate: +0s start vet gate: +0s start gofmt go: downloading github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.68.0 go: downloading github.com/aws/aws-sdk-go-v2 v1.44.0 go: downloading github.com/aws/aws-sdk-go-v2/service/costexplorer v1.67.5 go: downloading github.com/aws/aws-sdk-go-v2/service/s3 v1.105.0 go: downloading github.com/aws/smithy-go v1.28.1 go: downloading github.com/superfly/ltx v0.5.1 go: downloading golang.org/x/net v0.56.0 go: downloading modernc.org/sqlite v1.55.0 go: downloading github.com/aws/aws-sdk-go-v2/config v1.32.6 go: downloading github.com/aws/aws-sdk-go-v2/service/sns v1.43.0 go: downloading github.com/aws/aws-sdk-go-v2/service/route53 v1.64.1 go: downloading golang.org/x/crypto v0.53.0 go: downloading github.com/aws/aws-sdk-go-v2/service/acm v1.45.0 go: downloading github.com/aws/aws-sdk-go-v2/service/ec2 v1.324.0 go: downloading github.com/aws/aws-sdk-go-v2/service/iam v1.58.2 go: downloading github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi v1.37.0 go: downloading github.com/aws/aws-sdk-go-v2/service/sts v1.45.6 go: downloading github.com/aws/aws-sdk-go-v2/service/autoscaling v1.74.0 go: downloading github.com/benbjohnson/litestream v0.5.14 go: downloading github.com/oschwald/maxminddb-golang v1.13.1 go: downloading golang.org/x/sys v0.46.0 go: downloading github.com/aws/aws-sdk-go-v2/credentials v1.19.6 go: downloading github.com/aws/aws-sdk-go-v2/service/sns v1.43.0 go: downloading github.com/aws/aws-sdk-go-v2 v1.44.0 go: downloading github.com/aws/aws-sdk-go-v2/service/route53 v1.64.1 go: downloading github.com/aws/aws-sdk-go-v2/config v1.32.6 go: downloading github.com/superfly/ltx v0.5.1 go: downloading github.com/benbjohnson/litestream v0.5.14 go: downloading github.com/aws/aws-sdk-go-v2/service/autoscaling v1.74.0 go: downloading github.com/aws/aws-sdk-go-v2/service/ec2 v1.324.0 go: downloading modernc.org/sqlite v1.55.0 go: downloading github.com/aws/aws-sdk-go-v2/service/ssm v1.74.0 go: downloading github.com/aws/aws-sdk-go-v2/service/s3 v1.105.0 go: downloading github.com/aws/aws-sdk-go-v2/service/iam v1.58.2 go: downloading github.com/aws/aws-sdk-go-v2/service/sesv2 v1.66.6 go: downloading github.com/klauspost/compress v1.18.0 go: downloading github.com/aws/aws-sdk-go-v2/service/sesv2 v1.66.6 go: downloading github.com/pion/logging v0.2.4 go: downloading github.com/pion/stun/v3 v3.0.1 go: downloading github.com/pion/logging v0.2.4 go: downloading github.com/pion/turn/v4 v4.1.4 go: downloading github.com/pion/stun/v3 v3.0.1 go: downloading github.com/pion/turn/v4 v4.1.4 go: downloading github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.40 go: downloading github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38 go: downloading github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 go: downloading github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.40 go: downloading github.com/pierrec/lz4/v4 v4.1.22 go: downloading github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.40 go: downloading github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.40 go: downloading github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.40 go: downloading github.com/pierrec/lz4/v4 v4.1.22 go: downloading github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 go: downloading github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 go: downloading github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 go: downloading github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 go: downloading github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 go: downloading github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 go: downloading github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 go: downloading github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 go: downloading github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 go: downloading github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 go: downloading github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.40 go: downloading github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23 go: downloading github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 go: downloading github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23 go: downloading github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 go: downloading github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31 go: downloading github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31 go: downloading github.com/prometheus/client_golang v1.17.0 go: downloading golang.org/x/sync v0.21.0 go: downloading github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.20.18 go: downloading github.com/lmittmann/tint v1.1.3 go: downloading github.com/prometheus/client_golang v1.17.0 go: downloading golang.org/x/sync v0.21.0 go: downloading github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.20.18 go: downloading github.com/mattn/go-isatty v0.0.20 go: downloading github.com/lmittmann/tint v1.1.3 go: downloading github.com/mattn/go-isatty v0.0.20 go: downloading google.golang.org/protobuf v1.36.10 go: downloading github.com/beorn7/perks v1.0.1 go: downloading github.com/prometheus/client_model v0.5.0 go: downloading github.com/prometheus/procfs v0.12.0 go: downloading github.com/prometheus/common v0.45.0 go: downloading github.com/cespare/xxhash/v2 v2.3.0 go: downloading github.com/cespare/xxhash/v2 v2.3.0 go: downloading github.com/prometheus/common v0.45.0 go: downloading github.com/beorn7/perks v1.0.1 go: downloading github.com/prometheus/client_model v0.5.0 go: downloading github.com/prometheus/procfs v0.12.0 go: downloading google.golang.org/protobuf v1.36.10 go: downloading golang.org/x/text v0.38.0 go: downloading golang.org/x/text v0.38.0 go: downloading github.com/pion/randutil v0.1.0 go: downloading github.com/pion/transport/v4 v4.0.1 go: downloading github.com/pion/randutil v0.1.0 go: downloading github.com/pion/transport/v4 v4.0.1 go: downloading github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 go: downloading github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 go: downloading github.com/pion/transport/v3 v3.0.8 go: downloading github.com/pion/dtls/v3 v3.0.7 go: downloading github.com/pion/transport/v3 v3.0.8 go: downloading github.com/pion/dtls/v3 v3.0.7 go: downloading github.com/wlynxg/anet v0.0.5 go: downloading github.com/wlynxg/anet v0.0.5 go: downloading modernc.org/libc v1.74.1 go: downloading modernc.org/libc v1.74.1 go: downloading github.com/dustin/go-humanize v1.0.1 go: downloading github.com/google/uuid v1.6.0 go: downloading modernc.org/memory v1.11.0 go: downloading modernc.org/mathutil v1.7.1 go: downloading github.com/dustin/go-humanize v1.0.1 go: downloading github.com/google/uuid v1.6.0 go: downloading modernc.org/mathutil v1.7.1 go: downloading modernc.org/memory v1.11.0 go: downloading github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec go: downloading github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec gate: +8s start rest gate: +46s start internal_console@0 gate: +46s start internal_console@1 gate: +46s start internal_console@2 gate: +46s start internal_console@3 gate: +46s start internal_console@4 gate: +46s start internal_console@5 gate: +46s start internal_console@6 gate: +46s start internal_console@7 gate: +46s waiting for internal_console's shards before the next split package gate: +219s start root@0 gate: +219s start root@1 gate: +219s start root@2 gate: +219s waiting for root's shards before the next split package amadan: step gate failed: signal: terminated amadan: job failed at step gate — its output is above, not at the tail of this log
diff --git a/.amadan/ci.d/10-gate b/.amadan/ci.d/10-gate| index b6963187c..bc8422687 100755 |
| --- a/.amadan/ci.d/10-gate |
| +++ b/.amadan/ci.d/10-gate |
| @@ -1,57 +1,7 @@ |
| #!/bin/sh |
| -# The build gate from CLAUDE.md — "go build ./..., go vet ./..., go test |
| -# ./... -count=1 — all clean, every package, before any commit lands" — |
| -# as amadan CI runs it. |
| -# |
| -# THIS IS THE GATE. Not a second home for one, not a copy kept beside a |
| -# more authoritative run somewhere else: the definition of green for this |
| -# repo is what these three steps say it is. |
| -# |
| -# It did not start that way, and the change is recent enough to be worth |
| -# writing down. Until 2026-08-24 the authority was |
| -# .github/workflows/ci.yml, and this file said so in as many words — |
| -# where the two disagreed, the workflow won and the difference was a bug |
| -# here. That workflow has been deleted. Two things made it safe to |
| -# delete, and they arrived together: |
| -# |
| -# 1. This directory caught up, and then went past it. `10-gate`, |
| -# `20-cross@5` and `30-minio-contract` cover every job the workflow |
| -# ran — build/vet/test, all five cross-compile targets, the live |
| -# MinIO contract — and the gofmt check here is STRICTER: `make |
| -# test` runs `gofmt -l .` over the whole tree, where the workflow |
| -# only ever checked the files a PR happened to touch. There is no |
| -# direction in which the deleted file was the tighter gate. |
| -# |
| -# 2. It had stopped running anyway. GitHub Actions on the |
| -# carlosframework account has been refusing to start jobs over |
| -# billing, so the "required check" was gating nothing well before |
| -# anyone removed it — which is the worse of the two failure modes, |
| -# because a gate that is merely absent is at least honest about it. |
| -# |
| -# So: a red step here is not a discrepancy to reconcile against a more |
| -# official run. It is the answer, and nothing behind it is going to catch |
| -# what it misses. Keep it true. |
| -# |
| -# One definition, not two. Everything past the build is `make test` — the |
| -# same target a maintainer runs on a laptop — so CI and the local gate |
| -# cannot drift apart, and a check added to one is a check added to both. |
| -# That is how the gofmt check gets here at all: `make test` runs vet, a |
| -# repo-wide `gofmt -l .` and the tests (side by side, through |
| -# .amadan/test-gate.sh), and this file no longer restates any of it. |
| -# |
| -# `go build ./...` stays spelled out because `make test` does not do it. |
| -# |
| -# -count=1 and -timeout 30m live in .amadan/test-gate.sh, on each go test |
| -# line, with the Makefile's note on why; they are still in force here, |
| -# just not written down twice. |
| -set -eu |
| - |
| -# The build runs beside the tests rather than before them: neither needs |
| -# the other, and the gate's wall clock is whichever finishes last. |
| -go build ./... & |
| -build=$! |
| -status=0 |
| -# DIAGNOSTIC (remove with #359): sigwho.py reports who sends the SIGTERM. |
| -python3 .amadan/sigwho.py make test || status=$? |
| -wait "$build" || status=1 |
| -exit "$status" |
| +# DIAGNOSTIC (remove with #359): the step's own top process is sigwho.py, so |
| +# the SIGTERM that has killed fourteen runs 35 s after the root shards start |
| +# is caught here with its sender's pid and command line. The real step is |
| +# 10-gate.real (an extension, so the runner treats it as clutter and runs |
| +# only this file). |
| +exec python3 .amadan/sigwho.py sh .amadan/ci.d/10-gate.real |
diff --git a/.amadan/ci.d/10-gate.real b/.amadan/ci.d/10-gate.real| new file mode 100644 |
| index 000000000..daf132329 |
| --- /dev/null |
| +++ b/.amadan/ci.d/10-gate.real |
| @@ -0,0 +1,56 @@ |
| +#!/bin/sh |
| +# The build gate from CLAUDE.md — "go build ./..., go vet ./..., go test |
| +# ./... -count=1 — all clean, every package, before any commit lands" — |
| +# as amadan CI runs it. |
| +# |
| +# THIS IS THE GATE. Not a second home for one, not a copy kept beside a |
| +# more authoritative run somewhere else: the definition of green for this |
| +# repo is what these three steps say it is. |
| +# |
| +# It did not start that way, and the change is recent enough to be worth |
| +# writing down. Until 2026-08-24 the authority was |
| +# .github/workflows/ci.yml, and this file said so in as many words — |
| +# where the two disagreed, the workflow won and the difference was a bug |
| +# here. That workflow has been deleted. Two things made it safe to |
| +# delete, and they arrived together: |
| +# |
| +# 1. This directory caught up, and then went past it. `10-gate`, |
| +# `20-cross@5` and `30-minio-contract` cover every job the workflow |
| +# ran — build/vet/test, all five cross-compile targets, the live |
| +# MinIO contract — and the gofmt check here is STRICTER: `make |
| +# test` runs `gofmt -l .` over the whole tree, where the workflow |
| +# only ever checked the files a PR happened to touch. There is no |
| +# direction in which the deleted file was the tighter gate. |
| +# |
| +# 2. It had stopped running anyway. GitHub Actions on the |
| +# carlosframework account has been refusing to start jobs over |
| +# billing, so the "required check" was gating nothing well before |
| +# anyone removed it — which is the worse of the two failure modes, |
| +# because a gate that is merely absent is at least honest about it. |
| +# |
| +# So: a red step here is not a discrepancy to reconcile against a more |
| +# official run. It is the answer, and nothing behind it is going to catch |
| +# what it misses. Keep it true. |
| +# |
| +# One definition, not two. Everything past the build is `make test` — the |
| +# same target a maintainer runs on a laptop — so CI and the local gate |
| +# cannot drift apart, and a check added to one is a check added to both. |
| +# That is how the gofmt check gets here at all: `make test` runs vet, a |
| +# repo-wide `gofmt -l .` and the tests (side by side, through |
| +# .amadan/test-gate.sh), and this file no longer restates any of it. |
| +# |
| +# `go build ./...` stays spelled out because `make test` does not do it. |
| +# |
| +# -count=1 and -timeout 30m live in .amadan/test-gate.sh, on each go test |
| +# line, with the Makefile's note on why; they are still in force here, |
| +# just not written down twice. |
| +set -eu |
| + |
| +# The build runs beside the tests rather than before them: neither needs |
| +# the other, and the gate's wall clock is whichever finishes last. |
| +go build ./... & |
| +build=$! |
| +status=0 |
| +make test || status=$? |
| +wait "$build" || status=1 |
| +exit "$status" |