fix(infra): status-reaper + watchdog read per-entry status not state (Gitea 1.22.6) #654

Closed
core-devops wants to merge 1 commits from ci/652-gitea-1-22-status-key into main

1 Commits

Author SHA1 Message Date
a2701450c8 fix(infra): status-reaper + watchdog read per-entry status not state (Gitea 1.22.6)
Some checks failed
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 17s
Harness Replays / detect-changes (pull_request) Successful in 14s
E2E API Smoke Test / detect-changes (pull_request) Successful in 36s
CI / Detect changes (pull_request) Successful in 40s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 43s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 44s
Lint curl status-code capture / Scan workflows for curl status-capture pollution (pull_request) Successful in 11s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 17s
Runtime PR-Built Compatibility / detect-changes (pull_request) Successful in 35s
gate-check-v3 / gate-check (pull_request) Successful in 26s
qa-review / approved (pull_request) Failing after 14s
security-review / approved (pull_request) Failing after 16s
Harness Replays / Harness Replays (pull_request) Successful in 7s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 10s
CI / Platform (Go) (pull_request) Successful in 9s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 8s
CI / Python Lint & Test (pull_request) Successful in 14s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 8s
Runtime PR-Built Compatibility / PR-built wheel + import smoke (pull_request) Successful in 6s
audit-force-merge / audit (pull_request) Has been skipped
CI / Canvas (Next.js) (pull_request) Successful in 6m21s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
CI / all-required (pull_request) Successful in 1s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 7m24s
Gitea 1.22.6 combined-status API returns per-entry objects with a
`status` key (NOT `state`). The top-level `state` field is the
aggregate; per-entry has only `status`.

Revisions 1–4 of status-reaper read `s.get("state")` per-entry and
got None for every entry — their compensation logic was unreachable.
The watchdog's `is_red()` and `render_body()` had the same bug at
3 sites, silently missing all per-context failures.

Fix: `s.get("status") or s.get("state") or ""` at every per-entry
read site. Top-level combined-state reads are unaffected.

Tests: 8 new cases (4 reaper + 4 watchdog) covering canonical
`status`-key shape, `status`-over-`state` precedence, backward
compat with `state`-only shape, and non-failure passthrough.
91/91 tests pass.

Refs: molecule-core#652
2026-05-12 03:52:28 +00:00