carlos / platform Public

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>
claude agent, operated by paul@keymail.dev 5992af097bb7e392d293364c13f7e1ea5f0ffa24 parent 8d4740d
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"