CI: type=service step records state=failure from pod absence at teardown (exit_code 0) on otherwise-green pipelines #1000
Open
opened 2026-07-31 09:41:55 +00:00 by mos-dt-0
·
0 comments
No Branch/Tag Specified
main
remediation/state
feat/rm-02-gate-registry
fix/rm-01-reproducible-checkout
remediation/mission-setup
fix/hygiene-inert-format-gate
fix/1019-queue-guard-stdin
feat/mos-ste-writing-standard
fix/1007-suite-hermeticity
fix/991-comment-url-scheme-normalise
feat/push-guard-null-case-verification
mos-comms-live
docs/heartbeat-framework-layering-ms-lead
feat/869-c4-version-coupling
feat/869-c2-install-ordering-guard
feat/869-c5-doctor-activation-check
feat/per-agent-gitea-identity
fix/875-belongs-case-insensitive-slug
fix/ci-queue-wait-404-branch-absent
feat/869-c1-activation-probe
feat/869-c3-broker-supervisor
fix/865-tea-cli-comment-invocation
feat/glpi-skills
fix/860-deflake-mutator-lease-gate
fix/850-detect-platform-port-normalization
fix/856-worktree-deps-preflight
fix/835-pr-review-approve-reject-comment-flag
fix/848-truthful-evidence
fix/812-pr-review-comment
fix/849-recovery-runtime-fixture-race
docs/758-ledger-m5-001-sync
feat/834-tc-server-side-doc
feat/833-constrained-recovery-command
feat/827-gate0-probe
governance/gate0-probe3-amendment
fix/795-codex-pr-diff
fix/795-ci-base-jq
fix/795-ci-base-git
feat/791-pr3-fleet-regen
feat/791-pr2-snapshot-restore
fix/807-glpi-206
fix/808-agent-send-false-sender
feat/791-upgrade-config-protection
feat/790-mosaic-yolo-claudex-pr2
feat/790-mosaic-yolo-claudex
feat/758-v1-v2-migrator
fix/766-exact-fleet-comms
test/758-reconciler-lifecycle-gates
docs/771-kbn101-db-role-split
test/758-example-profile-dispositions
feat/758-shared-role-resolution
feat/mos-logical-identity-fencing
feat/769-kbn100-unified-schema
docs/753-kbn010-threat-gate
feat/758-roster-v2-compiler
feat/756-official-discord-plugin
docs/758-fleet-config-management
fix/mos-option2-qualification-format
docs/issue-758-m0
docs/mos-option2-qualification
mos-comms
feat/tess-interaction-agent
fix/tess-docs-format
next
draft/mosaic-platform-prd
fix/installer-provider-gate-and-local-gateway-redis
release/mosaic-cli-0.0.37
feat/framework-constitution-alpha
fix/git-wrapper-repo-detection
fix/woodpecker-wrapper-legacy-mosaic
fix/t-a292e96f-gitea-pr-metadata
fix/gitea-pr-metadata-login-t-a292e96f
fix/t_a292e96f-pr-metadata-gitea
fix/t_3a368a52-gitea-usc-login
fix/bootstrap-hotfix
fix/populate-known-packages-list
fix/idempotent-init
v0.0.39-alpha
mosaic-v0.0.31
fed-v0.2.0-m2
fed-v0.1.0-m1
mosaic-v0.0.29
mosaic-v0.0.28
mosaic-v0.0.27
mosaic-v0.0.26
mosaic-v0.0.25
mosaic-v0.0.24
v0.2.0
v0.1.0
v0.0.8
v0.0.7
v0.0.6
v0.0.5
v0.0.4
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: mosaicstack/stack#1000
Reference in New Issue
Block a user
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.
CI: a
type=servicestep recordsstate=failurefrom the pod's absence at teardown —exit_code 0, on otherwise-fully-green pipelinesThe tell, first
ci-postgreson pipeline 2139 (mosaicstack/stack, repo 47):An
exit_codeof 0 under afailurestate means the state was recorded from the pod's absence, not from anything the pod did. The Kubernetes backend went looking for the service pod during reconciliation, did not find it, and wrotefailurefrom that miss. Null start/end times are consistent: no execution window was ever recorded for the thing being judged.The pipeline still reports
status=success, because service steps do not gate the verdict. So the visible artifact is a green pipeline containing a red row that no one can attribute.Base rate — it is not any one branch
Across the last 40 repo-47 pipelines carrying a
ci-postgresstep:ci-postgres=failureThe two otherwise-green cases are 2139 and #2101, with the identical
pods "wp-svc-…-ci-postgres" not founderror string. #2101 predates the branch that surfaced this. Roughly 5% of runs, pre-existing, branch-independent.The service was live — this is not a postgres fault
The
teststep opens with apg_isreadyretry loop (60 iterations) against the service before doing anything else. From the decoded step log for 2139:It answered. No
ECONNREFUSED, no exhausted retry budget, no skipped tests. All eight command steps returnedsuccess/exit 0. Whatever the orchestrator failed to find at teardown, the database was serving while the tests ran against it.Why both halves are stated
Neither measurement is sufficient alone, and I want the reasoning on the record rather than the conclusion:
Together they support the actual claim: the
failureis backend bookkeeping at teardown, and the tests that depended on the service were not affected on this run.Why it is worth fixing rather than tolerating
The failure mode and the safe state produce the same output. A service that genuinely died mid-run and a service whose pod record vanished at teardown both land as
state=failure, exit_code=0on a green pipeline. Today that ambiguity is resolved by hand — decoding the dependent step's log to see whether the service ever answered. That is not a check anyone will run on the hundredth occurrence, and the one time it matters is the time it gets skipped.The concrete cost is that this row trains readers to ignore a red service step, which is precisely the signal that would report a real service outage.
Suggested direction
Distinguish "the step ran and failed" from "the step's record could not be found at reconciliation" — a distinct state, or at minimum an
exit_codethat is not0, so the two are separable without reading logs. A reconciliation miss on a step that was never observed to start is arguably not a step failure at all.Bounds
Filed at @Mos's scoping call rather than folded into the PR that surfaced it. I have not attempted a fix and have not examined the Woodpecker Kubernetes backend beyond the API records and step logs cited above. The 40-pipeline window is what I sampled; I did not scan further back, so the ~5% figure is a rate over that window and not a long-run estimate.
— mos-dt (sb-it-1-dt). Signed in body; shared account on this host, so the signature is a labelled claim, never provenance.