HTTP 200
2026-10-17T10:42:16.3815004Z felhom-gates-runner(version:v0.6.1) received task 2018 of job gates, be triggered by event: workflow_dispatch
2026-10-17T10:42:16.3828198Z workflow prepared
2026-10-17T10:42:16.3872302Z evaluating expression 'success()'
2026-10-17T10:42:16.3873226Z expression 'success()' evaluated to 'true'
2026-10-17T10:42:16.3902795Z evaluating expression ''
2026-10-17T10:42:16.3903231Z expression '' evaluated to 'true'
2026-10-17T10:42:16.3903389Z ⭐ Run Main Fetch the pushed commit
2026-10-17T10:42:16.3907376Z Wrote command \n\n# R-265: the start stamp the alarm reports, so a mail can never again describe a run\n# without saying how long it took.\necho "GATES_STARTED_AT=$(date +%s)" >> "$GITHUB_ENV"\n# Shallow, and pinned to the exact SHA that was pushed — not to the branch tip, which can\n# move under us if two pushes race. Probe P3 proved the two are equal when done this way.\ngit init -q .\ngit remote add origin http://gitea.gitea-system.svc.cluster.local:3000/admin/felhom.eu.git\ngit fetch -q --depth 1 origin "$GITHUB_SHA"\ngit checkout -q FETCH_HEAD\necho "checked out $(git rev-parse HEAD)"\n\n\n to 'workflow/0.sh'
2026-10-17T10:42:16.3908640Z ::group::Run # R-265: the start stamp the alarm reports, so a mail can never again describe a run
2026-10-17T10:42:16.3908932Z # R-265: the start stamp the alarm reports, so a mail can never again describe a run
2026-10-17T10:42:16.3909204Z # without saying how long it took.
2026-10-17T10:42:16.3909320Z echo "GATES_STARTED_AT=$(date +%s)" >> "$GITHUB_ENV"
2026-10-17T10:42:16.3909437Z # Shallow, and pinned to the exact SHA that was pushed — not to the branch tip, which can
2026-10-17T10:42:16.3909644Z # move under us if two pushes race. Probe P3 proved the two are equal when done this way.
2026-10-17T10:42:16.3909773Z git init -q .
2026-10-17T10:42:16.3909879Z git remote add origin http://gitea.gitea-system.svc.cluster.local:3000/admin/felhom.eu.git
2026-10-17T10:42:16.3910033Z git fetch -q --depth 1 origin "$GITHUB_SHA"
2026-10-17T10:42:16.3910150Z git checkout -q FETCH_HEAD
2026-10-17T10:42:16.3910252Z echo "checked out $(git rev-parse HEAD)"
2026-10-17T10:42:16.3910388Z shell: bash --noprofile --norc -e -o pipefail {0}
2026-10-17T10:42:16.3910561Z ::endgroup::
2026-10-17T10:42:39.0025786Z checked out 498b9139cf2a292a319a84ec222b092f1bb6be6f
2026-10-17T10:42:39.0046819Z ::group::Run git init -q ../felhom-agent
2026-10-17T10:42:39.0047174Z git init -q ../felhom-agent
2026-10-17T10:42:39.0047392Z cd ../felhom-agent
2026-10-17T10:42:39.0047597Z git remote add origin http://gitea.gitea-system.svc.cluster.local:3000/admin/felhom-agent.git
2026-10-17T10:42:39.0047828Z git fetch -q --depth 1 origin main
2026-10-17T10:42:39.0048022Z git checkout -q FETCH_HEAD
2026-10-17T10:42:39.0048219Z echo "agent at $(git rev-parse --short=12 HEAD)"
2026-10-17T10:42:39.0048520Z shell: bash --noprofile --norc -e -o pipefail {0}
2026-10-17T10:42:39.0048767Z ::endgroup::
2026-10-17T10:42:41.7231382Z agent at c52d59185103
2026-10-17T10:42:41.7249673Z ::group::Run git init -q ../felhom-controller
2026-10-17T10:42:41.7250105Z git init -q ../felhom-controller
2026-10-17T10:42:41.7250378Z cd ../felhom-controller
2026-10-17T10:42:41.7250605Z git remote add origin http://gitea.gitea-system.svc.cluster.local:3000/admin/felhom-controller.git
2026-10-17T10:42:41.7250869Z git fetch -q --depth 1 origin main
2026-10-17T10:42:41.7251116Z git checkout -q FETCH_HEAD
2026-10-17T10:42:41.7251334Z echo "controller CHANGELOG at $(git rev-parse --short=12 HEAD): $(head -1 CHANGELOG.md)"
2026-10-17T10:42:41.7251606Z shell: bash --noprofile --norc -e -o pipefail {0}
2026-10-17T10:42:41.7251859Z ::endgroup::
2026-10-17T10:42:45.9201908Z controller CHANGELOG at 3e8d02767763: ## v0.326.0 — FileBrowser's default password is checked at every FileBrowser start; the decoy suite is a gate (2026-10-17)
2026-10-17T10:42:45.9220276Z ::group::Run git init -q ../app-catalog-felhom.eu
2026-10-17T10:42:45.9220782Z git init -q ../app-catalog-felhom.eu
2026-10-17T10:42:45.9221028Z cd ../app-catalog-felhom.eu
2026-10-17T10:42:45.9221275Z git remote add origin http://gitea.gitea-system.svc.cluster.local:3000/admin/app-catalog-felhom.eu.git
2026-10-17T10:42:45.9221528Z git fetch -q --depth 1 origin main
2026-10-17T10:42:45.9221743Z git checkout -q FETCH_HEAD
2026-10-17T10:42:45.9221951Z echo "catalog at $(git rev-parse --short=12 HEAD)"
2026-10-17T10:42:45.9222168Z shell: bash --noprofile --norc -e -o pipefail {0}
2026-10-17T10:42:45.9222404Z ::endgroup::
2026-10-17T10:42:47.1931237Z catalog at 356659dd60e0
2026-10-17T10:42:47.1961807Z ::group::Run set -u
2026-10-17T10:42:47.1962230Z set -u
2026-10-17T10:42:47.1962482Z python3 - > /tmp/pushed-files.txt <<'PY' || : > /tmp/pushed-files.txt
2026-10-17T10:42:47.1962731Z import json, os, sys
2026-10-17T10:42:47.1962936Z path = os.environ.get("GITHUB_EVENT_PATH", "")
2026-10-17T10:42:47.1963183Z if not path or not os.path.isfile(path):
2026-10-17T10:42:47.1963404Z     sys.stderr.write("no GITHUB_EVENT_PATH - the file list is unknown\n")
2026-10-17T10:42:47.1963641Z     raise SystemExit(0)
2026-10-17T10:42:47.1963844Z try:
2026-10-17T10:42:47.1964034Z     ev = json.load(open(path))
2026-10-17T10:42:47.1964234Z except Exception as e:
2026-10-17T10:42:47.1964427Z     sys.stderr.write("event payload unreadable: %s\n" % e)
2026-10-17T10:42:47.1964653Z     raise SystemExit(0)
2026-10-17T10:42:47.1964855Z commits = ev.get("commits") or []
2026-10-17T10:42:47.1965046Z if not commits:
2026-10-17T10:42:47.1965246Z     sys.stderr.write("the payload carries no commits array - unknown\n")
2026-10-17T10:42:47.1965473Z     raise SystemExit(0)
2026-10-17T10:42:47.1965671Z seen = []
2026-10-17T10:42:47.1965860Z for c in commits:
2026-10-17T10:42:47.1966061Z     for key in ("added", "modified", "removed"):
2026-10-17T10:42:47.1966274Z         for f in (c.get(key) or []):
2026-10-17T10:42:47.1966466Z             if f not in seen:
2026-10-17T10:42:47.1966667Z                 seen.append(f)
2026-10-17T10:42:47.1966861Z sys.stderr.write("%d commit(s), %d distinct path(s) in the payload\n"
2026-10-17T10:42:47.1967086Z                  % (len(commits), len(seen)))
2026-10-17T10:42:47.1967289Z for f in seen:
2026-10-17T10:42:47.1967475Z     print(f)
2026-10-17T10:42:47.1967659Z PY
2026-10-17T10:42:47.1967839Z echo "--- paths the push event reported ---"
2026-10-17T10:42:47.1968046Z cat /tmp/pushed-files.txt
2026-10-17T10:42:47.1968237Z echo "-------------------------------------"
2026-10-17T10:42:47.1968452Z if [ -s /tmp/pushed-files.txt ] && [ -f scripts/push_scope.py ]; then
2026-10-17T10:42:47.1968683Z   SCOPE=$(python3 scripts/push_scope.py --files-from /tmp/pushed-files.txt) || SCOPE=code
2026-10-17T10:42:47.1968911Z else
2026-10-17T10:42:47.1969126Z   echo "no usable file list - treating this push as CODE (fail-closed)"
2026-10-17T10:42:47.1969348Z   SCOPE=code
2026-10-17T10:42:47.1969540Z fi
2026-10-17T10:42:47.1969718Z [ "$SCOPE" = "docs" ] || SCOPE=code
2026-10-17T10:42:47.1969925Z echo "PUSH_SCOPE=$SCOPE" >> "$GITHUB_ENV"
2026-10-17T10:42:47.1970126Z echo "scope: $SCOPE"
2026-10-17T10:42:47.1970319Z shell: bash --noprofile --norc -e -o pipefail {0}
2026-10-17T10:42:47.1970556Z ::endgroup::
2026-10-17T10:42:47.2946407Z the payload carries no commits array - unknown
2026-10-17T10:42:47.3007760Z --- paths the push event reported ---
2026-10-17T10:42:47.3028393Z -------------------------------------
2026-10-17T10:42:47.3031134Z no usable file list - treating this push as CODE (fail-closed)
2026-10-17T10:42:47.3033269Z scope: code
2026-10-17T10:42:47.3048114Z ::group::Run python3 scripts/repo_gates.py --fast --scope="${PUSH_SCOPE:-code}"
2026-10-17T10:42:47.3048402Z python3 scripts/repo_gates.py --fast --scope="${PUSH_SCOPE:-code}"
2026-10-17T10:42:47.3048565Z shell: bash --noprofile --norc -e -o pipefail {0}
2026-10-17T10:42:47.3048745Z ::endgroup::
2026-10-17T10:42:47.4176573Z repo_gates (felhom.eu) — 19 gate(s)  [--fast]
2026-10-17T10:42:47.4177864Z   --fast SKIPPED (deliberate periodic runs, never in a hook): iso-bootstrap
2026-10-17T10:42:47.4562998Z WARNING: this clone is UNARMED — core.hooksPath is unset, so the pre-push hook will not
2026-10-17T10:42:47.4563607Z          run here. Switch it on once with:  git config core.hooksPath .githooks
2026-10-17T10:42:47.4564028Z 
2026-10-17T10:42:47.4564253Z ==============================================================================
2026-10-17T10:42:47.4564482Z == gate: site   (site_gates.py)
2026-10-17T10:42:47.4564692Z ==============================================================================
2026-10-17T10:42:53.4055083Z   shell sidebar: 11 en page(s), all identical to en/apps.html
2026-10-17T10:42:53.4056019Z   shell sidebar: 15 hu page(s), all identical to 404.html
2026-10-17T10:42:53.4056299Z   download pages agree: felhom-installer-1.29.0-pve9.2-1.iso, sha dceacae5da24…
2026-10-17T10:42:53.4056588Z   twins: 11 pairs checked both ways (hreflang, globe, canonical), 0 of them unlisted
2026-10-17T10:42:53.4057142Z   apps pages agree: 0 cards, 64 logos
2026-10-17T10:42:53.4057407Z   no-HU matcher controls OK (positive 'Jelentkezz be'/'Kapcsolat' convict, negative 'Angola…' does not)
2026-10-17T10:42:53.4057734Z   gyik.html: JSON-LD equals the 42 visible questions and answers
2026-10-17T10:42:53.4058005Z   en/faq.html: JSON-LD equals the 42 visible questions and answers
2026-10-17T10:42:53.4058242Z   dashboard pictures: 24 references, each in its page's language
2026-10-17T10:42:53.4058469Z   picture viewer: 390 openers, every one a link to an existing file
2026-10-17T10:42:53.4058702Z   app logos: 65 catalog apps, each with its <slug>-logo file
2026-10-17T10:42:53.4058957Z   shell leak: 759 site rules vs 119 shell rules, 9 shared selector(s), 0 leaking declarations (media-aware)
2026-10-17T10:42:53.4059204Z   anchors: 416 in-site #fragment(s), every one resolves
2026-10-17T10:42:53.4059435Z   sitemap: 24 URL(s), every public page once, every twin pair cross-named
2026-10-17T10:42:53.4059695Z   unlisted: 0 page(s) — noindex, robots Disallow, not in the sitemap, linked from no other page
2026-10-17T10:42:53.4060063Z site gates OK — BOM, emoji=0, nav/footer per language, analytics, no CDN, no legacy tokens, no <style>, cache-busted assets, twins + hreflang + globe, lang, same apps, no Hungarian in English, FAQ JSON-LD, clean tail, dashboard pictures per language, one picture viewer, no shell CSS leak, live anchors, complete sitemap
2026-10-17T10:42:53.4174164Z 
2026-10-17T10:42:53.4175422Z ==============================================================================
2026-10-17T10:42:53.4176040Z == gate: hostinstall   (hostinstall_gates.py)
2026-10-17T10:42:53.4176434Z ==============================================================================
2026-10-17T10:42:56.0952139Z   ok: SCRIPT_VERSION=1.33.0
2026-10-17T10:42:56.0952846Z   ok: header has no version literal
2026-10-17T10:42:56.0953254Z   ok: hub carries no host-install version literal (421 .go/.html files scanned, 6 shapes checked)
2026-10-17T10:42:56.0953592Z   ok: age is in the installed package set
2026-10-17T10:42:56.0953760Z   ok: felhom-pbs-apply is fetched from the agent repo
2026-10-17T10:42:56.0953896Z   ok: felhom-pbs-apply installed 0755 to /usr/local/sbin
2026-10-17T10:42:56.0954010Z   ok: uninstall removes felhom-pbs-apply
2026-10-17T10:42:56.0954151Z   ok: rendered agent.json defaults wg_tunnel.enabled=true
2026-10-17T10:42:56.0954285Z   ok: byo assert no longer forbids wg_tunnel
2026-10-17T10:42:56.0954484Z   ok: PVE_STORAGES default contains felhom-pbs
2026-10-17T10:42:56.0954630Z   ok: no raw/branch/ ref in the installer — every run-time fetch is pinned
2026-10-17T10:42:56.0954796Z   ok: fetch_raw pins the agent configs to the vouched agent version
2026-10-17T10:42:56.0954925Z   ok: manifest: /scripts/ syncs from an installer tag
2026-10-17T10:42:56.0955058Z   ok: manifest: the website still tracks main (a copy edit must not need a release)
2026-10-17T10:42:56.0955224Z   ok: every arm that resolves the backup target also grants on it (2 resolution(s), 2 grant(s))
2026-10-17T10:42:56.0955382Z   ok: the offsite tier arms no client-side prune (keep_last=0; retention is ep0's prune jobs)
2026-10-17T10:42:56.0955517Z 
2026-10-17T10:42:56.0955630Z hostinstall gates: ALL PASS
2026-10-17T10:42:56.1043049Z 
2026-10-17T10:42:56.1043576Z ==============================================================================
2026-10-17T10:42:56.1043856Z == gate: hub-confirm   (hub_confirm_gate.py)
2026-10-17T10:42:56.1044007Z ==============================================================================
2026-10-17T10:42:56.2031082Z hub confirm gate OK — no native confirm()/prompt() in hub templates (17 scanned, any depth)
2026-10-17T10:42:56.2085504Z 
2026-10-17T10:42:56.2086029Z ==============================================================================
2026-10-17T10:42:56.2086345Z == gate: manifest-bearer   (manifest_bearer_gate.py)
2026-10-17T10:42:56.2086607Z ==============================================================================
2026-10-17T10:42:56.3172989Z manifest bearer gate OK - no bearer-shaped literals in manifests/
2026-10-17T10:42:56.3655629Z 
2026-10-17T10:42:56.3656465Z ==============================================================================
2026-10-17T10:42:56.3657143Z == gate: reuse-refs   (reuse_refs_check.py /root/.cache/act/e75913ab8508cd04/hostexecutor)
2026-10-17T10:42:56.3657464Z ==============================================================================
2026-10-17T10:42:56.7941226Z note [hostexecutor] line 54: web/routes.go  (resolved by suffix → hub/internal/web/routes.go)
2026-10-17T10:42:56.7942026Z note [hostexecutor] line 54: api/routes.go  (resolved by suffix → hub/internal/api/routes.go)
2026-10-17T10:42:56.7942215Z note [hostexecutor] line 80: store/r879_box_seal_test.go  (resolved by suffix → hub/internal/store/r879_box_seal_test.go)
2026-10-17T10:42:56.7942394Z note [hostexecutor] line 80: api/r879_box_seal_test.go  (resolved by suffix → hub/internal/api/r879_box_seal_test.go)
2026-10-17T10:42:56.7942555Z note [hostexecutor] line 90: api/handler.go  (resolved by suffix → hub/internal/api/handler.go)
2026-10-17T10:42:56.7942747Z OK   [hostexecutor]: 85 cited paths — exact 80, suffix 5, ambiguous 0, cross-repo 0, FAILED 0 (siblings searched: app-catalog-felhom.eu, felhom-agent, felhom-controller)
2026-10-17T10:42:56.8063573Z 
2026-10-17T10:42:56.8064180Z ==============================================================================
2026-10-17T10:42:56.8064483Z == gate: instructions   (instructions_gate.py /root/.cache/act/e75913ab8508cd04/hostexecutor)
2026-10-17T10:42:56.8064706Z ==============================================================================
2026-10-17T10:42:56.9585109Z instructions_gate: /root/.cache/act/e75913ab8508cd04/hostexecutor
2026-10-17T10:42:56.9585988Z   CLAUDE.md effective lines : 168 (ceiling 200)
2026-10-17T10:42:56.9586259Z   version literals          : 0
2026-10-17T10:42:56.9586693Z   TEMPORARY blocks          : 0
2026-10-17T10:42:56.9586954Z   rule files                : 6 (4 path-scoped)
2026-10-17T10:42:56.9587607Z   workspace copy            : n/a (not this workspace)
2026-10-17T10:42:56.9587938Z   memory index             : absent (.claude-memory/ not on this host — the auto-memory store is machine-local by design, so a clone elsewhere legitimately has none; PASS with reason)
2026-10-17T10:42:56.9588402Z   register citations       : n/a (no OPEN-ITEMS.md — not this workspace)
2026-10-17T10:42:56.9588671Z 
2026-10-17T10:42:56.9588890Z instructions_gate: OK
2026-10-17T10:42:56.9653001Z 
2026-10-17T10:42:56.9653441Z ==============================================================================
2026-10-17T10:42:56.9654323Z == gate: golden-currency   (golden_currency_gate.py)
2026-10-17T10:42:56.9654647Z ==============================================================================
2026-10-17T10:42:57.1167825Z   newest released controller : 0.326.0   (## v0.326.0 — FileBrowser's default password is checked at every FileBrowser start; the de)
2026-10-17T10:42:57.1169397Z   newest golden baked        : 0.318.0   (documentation/tests/golden-0.318.0-2026-10-16 [sha 18077b6a689a…])
2026-10-17T10:42:57.1169922Z   waiver                     : VALID until 2026-10-20 (3 day(s) left) — R-468, reason: pre-customer development; goldens on a weekly cadence (operator ruling 2026-09-13)
2026-10-17T10:42:57.1170252Z   golden age                 : 1 day(s) (baked 2026-10-16; the limit is 7 — `09` §3 decision 250)
2026-10-17T10:42:57.1170552Z 
2026-10-17T10:42:57.1170970Z GOLDEN CURRENCY GATE ADVISORY — the golden (0.318.0) is behind the newest release (v0.326.0, 8 release(s): 0.319.0, 0.320.0, 0.321.0, 0.322.0, 0.323.0, 0.324.0, 0.325.0, 0.326.0) but only 1 day(s) old. Releases ride the floor; the golden is weekly (decision 250). A new box installs 0.318.0 and updates itself to the floor.
2026-10-17T10:42:57.1171630Z golden currency gate OK — the golden is at most 7 days old (NOTE: the BAKE, not the vouch)
2026-10-17T10:42:57.1626300Z 
2026-10-17T10:42:57.1627180Z ==============================================================================
2026-10-17T10:42:57.1627448Z == gate: wire-contract   (wire_contract_gate.py)
2026-10-17T10:42:57.1627691Z ==============================================================================
2026-10-17T10:43:01.4878835Z wire-contract gate — 249 tag(s) checked across 6 declared wire(s); 97 skipped (generic / opaque / allowlisted)
2026-10-17T10:43:01.4880052Z   agent -> hub   (POST /host-report)                   name-reachability only (a tag found ANYWHERE in hub passes)
2026-10-17T10:43:01.4880389Z     └ guest_disk_trim                                  FIELD-BY-FIELD both ways against hub internal/sysfacts.DiskTrim (10 path(s))
2026-10-17T10:43:01.4880741Z   controller -> hub   (POST /report)                   name-reachability only (a tag found ANYWHERE in hub passes)
2026-10-17T10:43:01.4881210Z   hub -> controller  (report ACK, `escrow` object)     FIELD-BY-FIELD against controller internal/report.EscrowStatus (5 path(s))
2026-10-17T10:43:01.4881512Z   hub -> agent   (GET /hosts/<id>/escrow/retained)     FIELD-BY-FIELD against agent internal/hub.RetainedEscrowResponse (9 path(s))
2026-10-17T10:43:01.4881822Z   hub -> controller  (report ACK, `operator_actions` entry) FIELD-BY-FIELD against controller internal/report.OperatorAction (3 path(s))
2026-10-17T10:43:01.4882132Z   controller -> hub   (POST /preferences)              name-reachability only (a tag found ANYWHERE in hub passes)
2026-10-17T10:43:01.4882415Z wire-contract gate OK — every emitted field is at least decodable by its receiver
2026-10-17T10:43:01.4882735Z   (BLIND SPOTS: generic tag names skipped; name-reachability is not use; only the
2026-10-17T10:43:01.4883079Z    declared ROOTS are covered — hub desired-state and the agent local API are not.)
2026-10-17T10:43:01.4997295Z 
2026-10-17T10:43:01.4997952Z ==============================================================================
2026-10-17T10:43:01.4998359Z == gate: hub-copy   (hub_copy_gate.py)
2026-10-17T10:43:01.4998682Z ==============================================================================
2026-10-17T10:43:01.7992808Z hub-copy gate OK — 137 hub file(s) scanned for 2 retired name(s); 6 customer surface(s) scanned for 8 retrieval pattern(s) (4 hu + 4 en), 1 registered claim(s), none unregistered
2026-10-17T10:43:01.7993686Z   drift: controller gate imports the shared list (customer_copy_vocab.py) — single source
2026-10-17T10:43:01.7994059Z   (BLIND SPOT: this checks the WORDS in the 6 declared customer surfaces. It cannot
2026-10-17T10:43:01.7994321Z    tell whether a true-looking sentence is wired to a predicate that is actually true —
2026-10-17T10:43:01.7994643Z    that is what render tests are for. And it does not read the operator's screens.)
2026-10-17T10:43:01.8051427Z 
2026-10-17T10:43:01.8051944Z ==============================================================================
2026-10-17T10:43:01.8052270Z == gate: guide-quote   (guide_quote_gate.py)
2026-10-17T10:43:01.8052520Z ==============================================================================
2026-10-17T10:43:01.9001209Z guide-quote: 4 quoted messages checked against the controller's English bundle
2026-10-17T10:43:01.9002029Z guide-quote gate OK: every quoted message is what the screen says.
2026-10-17T10:43:01.9055050Z 
2026-10-17T10:43:01.9055537Z ==============================================================================
2026-10-17T10:43:01.9055937Z == gate: due-checks   (due_checks_gate.py)
2026-10-17T10:43:01.9056193Z ==============================================================================
2026-10-17T10:43:02.0173552Z due-checks gate OK — 6 dated check(s) pending, none due yet.
2026-10-17T10:43:02.0174871Z   today (UTC): 2026-10-17
2026-10-17T10:43:02.0175198Z   nearest: R-887 due 2026-10-19 (in 2 day(s)) — no CI job lost in the 7 days after the S21 DooPlex change (act-runner 
2026-10-17T10:43:02.0175653Z   (fires on the next PUSH after a date passes, not on the date itself — by design)
2026-10-17T10:43:02.0645879Z 
2026-10-17T10:43:02.0647027Z ==============================================================================
2026-10-17T10:43:02.0647456Z == gate: one-register   (one_register_gate.py)
2026-10-17T10:43:02.0647711Z ==============================================================================
2026-10-17T10:43:02.3870974Z one-register gate — ROADMAP rows: 0 done, 28 ideas, 0 open-with-a-register-row, 0 WITHOUT
2026-10-17T10:43:02.3871822Z one-register gate OK — every open ROADMAP row has a register counterpart.
2026-10-17T10:43:02.3963668Z 
2026-10-17T10:43:02.3964318Z ==============================================================================
2026-10-17T10:43:02.3964686Z == gate: closed-register   (closed_register_gate.py)
2026-10-17T10:43:02.3965082Z ==============================================================================
2026-10-17T10:43:02.7676480Z closed-register gate — 831 closed rows with a readable state cell, 177 open rows, 0 convicted, 0 warnings
2026-10-17T10:43:02.7677189Z closed-register gate OK — no open work filed as closed, no id in both registers.
2026-10-17T10:43:02.7735829Z 
2026-10-17T10:43:02.7736371Z ==============================================================================
2026-10-17T10:43:02.7736764Z == gate: observations   (observations_gate.py /root/.cache/act/e75913ab8508cd04/hostexecutor)
2026-10-17T10:43:02.7737062Z ==============================================================================
2026-10-17T10:43:02.8654745Z observations gate OK — REPORT.md has no observations section (nothing to check)
2026-10-17T10:43:02.8751206Z 
2026-10-17T10:43:02.8751687Z ==============================================================================
2026-10-17T10:43:02.8752011Z == gate: register-shape   (register_shape_gate.py)
2026-10-17T10:43:02.8752403Z ==============================================================================
2026-10-17T10:43:03.2700331Z register-shape: /root/.cache/act/e75913ab8508cd04/hostexecutor/documentation/backlog/OPEN-ITEMS.md
2026-10-17T10:43:03.2701097Z register-shape: 177 register row(s), 177 distinct R- id(s)
2026-10-17T10:43:03.2701335Z register-shape: OK — every row ends with a state cell, every id is unique, no blank line splits the table, and every row has its columns, a known category, a P1–P4 severity and a defined state
2026-10-17T10:43:03.2830833Z 
2026-10-17T10:43:03.2831145Z ==============================================================================
2026-10-17T10:43:03.2831321Z == gate: stands   (check_stands.py)
2026-10-17T10:43:03.2831468Z ==============================================================================
2026-10-17T10:43:03.4052189Z check_stands — 55 claim(s) in documentation/architecture/where-felhom-stands.yaml
2026-10-17T10:43:03.4053266Z   statuses: built=15, missing=4, partial=16, walked=20
2026-10-17T10:43:03.4053547Z   register citations resolved in CLOSED-ITEMS.md: 43
2026-10-17T10:43:03.4054134Z 
2026-10-17T10:43:03.4054378Z check_stands: OK — every claim cites a source, every citation resolves, and every 'walked' cites a walk.
2026-10-17T10:43:03.4110722Z 
2026-10-17T10:43:03.4111095Z ==============================================================================
2026-10-17T10:43:03.4111341Z == gate: script-tests   (script_tests_gate.py /root/.cache/act/e75913ab8508cd04/hostexecutor)
2026-10-17T10:43:03.4111589Z ==============================================================================
2026-10-17T10:48:53.4869671Z   OK   scripts/test_build_sizing_web.py                          0.3s rc=0
2026-10-17T10:48:53.4870822Z   OK   scripts/test_dockerfile_arg_order.py                      0.2s rc=0
2026-10-17T10:48:53.4871179Z   OK   scripts/test_due_checks_gate.py                          17.4s rc=0
2026-10-17T10:48:53.4871445Z   OK   scripts/test_felhom_restore_beside.py                     1.3s rc=0
2026-10-17T10:48:53.4871689Z   OK   scripts/test_gate_decoys.py                             211.7s rc=0
2026-10-17T10:48:53.4871994Z   OK   scripts/test_golden_currency_gate.py                      3.2s rc=0
2026-10-17T10:48:53.4872239Z   OK   scripts/test_guide_quote_gate.py                          1.1s rc=0
2026-10-17T10:48:53.4872480Z   OK   scripts/test_hostinstall.py                               1.9s rc=0
2026-10-17T10:48:53.4872711Z   OK   scripts/test_hu_grep.py                                   0.1s rc=0
2026-10-17T10:48:53.4873269Z   OK   scripts/test_hub_copy_drift.py                            0.2s rc=0
2026-10-17T10:48:53.4873514Z   OK   scripts/test_instructions_gate.py                         4.9s rc=0
2026-10-17T10:48:53.4873752Z   OK   scripts/test_iso_bootstrap_gate.py                        2.6s rc=0
2026-10-17T10:48:53.4874085Z   OK   scripts/test_no_latest_push.py                            0.2s rc=0
2026-10-17T10:48:53.4874324Z   OK   scripts/test_push_scope.py                                0.1s rc=0
2026-10-17T10:48:53.4874551Z   OK   scripts/test_read_credential.py                           0.4s rc=0
2026-10-17T10:48:53.4874852Z   OK   scripts/test_repo_gates.py                               15.6s rc=0
2026-10-17T10:48:53.4875078Z   OK   scripts/test_repo_gates_docstring.py                      0.1s rc=0
2026-10-17T10:48:53.4875314Z   OK   scripts/test_repo_gates_scope.py                          0.9s rc=0
2026-10-17T10:48:53.4875614Z   OK   scripts/test_reuse_refs_check.py                          0.5s rc=0
2026-10-17T10:48:53.4875862Z   OK   scripts/test_script_tests_gate.py                         1.0s rc=0
2026-10-17T10:48:53.4876125Z   OK   scripts/bench/test_plugcut.py                             0.3s rc=0
2026-10-17T10:48:53.4876429Z   OK   scripts/bench/test_plugswitch.py                          0.3s rc=0
2026-10-17T10:48:53.4876663Z   OK   scripts/dooplex-offsite/test_dooplex_offsite.py          71.8s rc=0
2026-10-17T10:48:53.4876897Z   OK   scripts/ep0-copy-gc/test_ep0_copy_gc.py                   3.7s rc=0
2026-10-17T10:48:53.4877184Z   OK   scripts/facebook/test_fb_probe.py                         0.5s rc=0
2026-10-17T10:48:53.4877446Z   OK   scripts/hub-db-backup/test_hub_db_backup.py               9.4s rc=0
2026-10-17T10:48:53.4877659Z   OK   scripts/iso/test/test_console_glyphs.py                   0.1s rc=0
2026-10-17T10:48:53.4877970Z   OK   scripts/iso/test/test_rootpw_guard.py                     0.2s rc=0
2026-10-17T10:48:53.4878215Z script-tests: OK — 28 suite(s), every one exited 0
2026-10-17T10:48:53.5034897Z 
2026-10-17T10:48:53.5035800Z ==============================================================================
2026-10-17T10:48:53.5036151Z == gate: decoy-coverage   (decoy_coverage_gate.py /root/.cache/act/e75913ab8508cd04/hostexecutor /root/.cache/act/e75913ab8508cd04/felhom-controller /root/.cache/act/e75913ab8508cd04/felhom-agent /root/.cache/act/e75913ab8508cd04/app-catalog-felhom.eu)
2026-10-17T10:48:53.5036712Z ==============================================================================
2026-10-17T10:48:53.8937677Z decoy-coverage gate — 66 registered gate(s): 66 with a decoy, 0 registered exempt, 0 UNACCOUNTED
2026-10-17T10:48:53.8939025Z   COVERED   app-catalog-felhom.eu  catalog-since        the date bumped in a comment/README while .felhom.yml's fiel
2026-10-17T10:48:53.8939366Z   COVERED   app-catalog-felhom.eu  copy-i18n            Hungarian edited in a COMMENT/README/display_name (label, no
2026-10-17T10:48:53.8939692Z   COVERED   app-catalog-felhom.eu  data-key             a data_key: true only in a COMMENT or inside the i18n: block
2026-10-17T10:48:53.8939948Z   COVERED   app-catalog-felhom.eu  db-credentials       the password variable only in a COMMENT; the same reference 
2026-10-17T10:48:53.8940202Z   COVERED   app-catalog-felhom.eu  engine-major         the major moved in a comment/env var/README/app image, not o
2026-10-17T10:48:53.8940585Z   COVERED   app-catalog-felhom.eu  family-gate          family_gate written only in a COMMENT (not gated, no min_con
2026-10-17T10:48:53.8940933Z   COVERED   app-catalog-felhom.eu  gate-decoys          this suite, run as a gate of the full run (R-1115): every ca
2026-10-17T10:48:53.8941444Z   COVERED   app-catalog-felhom.eu  guide-version        ADVISORY, exit 0 always: checked_version written only in a C
2026-10-17T10:48:53.8942339Z   COVERED   app-catalog-felhom.eu  image-pins           the pin's LABEL without the pin: a registry PORT (`:5000`) r
2026-10-17T10:48:53.8942727Z   COVERED   app-catalog-felhom.eu  image-resolvable     END TO END through the gate's own `docker manifest inspect` 
2026-10-17T10:48:53.8943032Z   COVERED   app-catalog-felhom.eu  image-volumes        the data path mounted only in a COMMENT, on ANOTHER service 
2026-10-17T10:48:53.8943386Z   COVERED   app-catalog-felhom.eu  login-kind           login_kind written only in a COMMENT, only inside the Englis
2026-10-17T10:48:53.8943731Z   COVERED   app-catalog-felhom.eu  mem-limit-sum        the right figure only in a COMMENT (the compose header's 'me
2026-10-17T10:48:53.8943977Z   COVERED   app-catalog-felhom.eu  onboarding           a NEW template with no record; a record missing an id, or ca
2026-10-17T10:48:53.8944346Z   COVERED   app-catalog-felhom.eu  probe-matches-compose the probe TARGET resolves by exact name, explicit `container
2026-10-17T10:48:53.8944672Z   COVERED   app-catalog-felhom.eu  probe-measured       the measurement written in the TAGLINE or another comment bl
2026-10-17T10:48:53.8945022Z   COVERED   app-catalog-felhom.eu  redis-persistence    `--appendonly yes` only in a COMMENT, or only in a steps/ fi
2026-10-17T10:48:53.8945317Z   COVERED   app-catalog-felhom.eu  test-record          a ladder whose newest step is not the compose's images (a mo
2026-10-17T10:48:53.8945621Z   COVERED   app-catalog-felhom.eu  test-record-move     an image move with NO entry, with the entry only in a COMMEN
2026-10-17T10:48:53.8946019Z   COVERED   app-catalog-felhom.eu  unclean-boot-images  the new image only in a compose COMMENT, on ANOTHER service 
2026-10-17T10:48:53.8946282Z   COVERED   app-catalog-felhom.eu  volume-persistence   the classifier and the self-test via the injected-prober sui
2026-10-17T10:48:53.8946638Z   COVERED   felhom-agent           gate-decoys          this suite, run as a gate of agent_gates.py's full run, whic
2026-10-17T10:48:53.8946953Z   COVERED   felhom-agent           instructions         a component version literal in THIS repo's CLAUDE.md effecti
2026-10-17T10:48:53.8947213Z   COVERED   felhom-agent           observations         R-419 in THIS repo's REPORT.md: an Observations note SAYING 
2026-10-17T10:48:53.8947641Z   COVERED   felhom-agent           published            against a FAKE Gitea: a tag whose package 404s, a tag whose 
2026-10-17T10:48:53.8947890Z   COVERED   felhom-agent           release-complete     the newest `## vX.Y.Z` with no tag anywhere, a tag parked on
2026-10-17T10:48:53.8948131Z   COVERED   felhom-agent           reuse-refs           a cited .go and a cited .md path that do not exist, planted 
2026-10-17T10:48:53.8948529Z   COVERED   felhom-controller      app-row-dedup        hand-rolled row markup in partials/, AND a commented-out par
2026-10-17T10:48:53.8948802Z   COVERED   felhom-controller      debug-routes         a live dispatcher case commented out - the button survives, 
2026-10-17T10:48:53.8949066Z   COVERED   felhom-controller      docker-v             R-426: an unallowlisted `-v /etc:/x` in a NEW .go file two d
2026-10-17T10:48:53.8949460Z   COVERED   felhom-controller      emoji                an emoji in templates/partials/ (scope was os.listdir)
2026-10-17T10:48:53.8949708Z   COVERED   felhom-controller      gate-decoys          this suite, run as a gate of controller_gates.py's full run 
2026-10-17T10:48:53.8950072Z   COVERED   felhom-controller      go-parity            a Go-side key REWORDED, a key citing text no base literal ha
2026-10-17T10:48:53.8950383Z   COVERED   felhom-controller      gofmt                R-454: a planted unformatted .go file in internal/ is convic
2026-10-17T10:48:53.8950627Z   COVERED   felhom-controller      golden-notice        R-410 in the other direction: an empty dir must not count as
2026-10-17T10:48:53.8950985Z   COVERED   felhom-controller      i18n                 an undefined marker key, a pleading English value, a shrinki
2026-10-17T10:48:53.8951307Z   COVERED   felhom-controller      instructions         R-426: a component version literal in THIS repo's CLAUDE.md 
2026-10-17T10:48:53.8951618Z   COVERED   felhom-controller      minagent-header      the word MinAgent in prose / a code span, not the header lin
2026-10-17T10:48:53.8951964Z   COVERED   felhom-controller      mojibake             CONTROL: already walked; proves the planted file is really r
2026-10-17T10:48:53.8952263Z   COVERED   felhom-controller      native-confirm       a native confirm() in templates/partials/
2026-10-17T10:48:53.8952623Z   COVERED   felhom-controller      observations         R-426: R-419 in THIS repo's REPORT.md - an Observations note
2026-10-17T10:48:53.8953081Z   COVERED   felhom-controller      offbox-rename        R-425: NAS branding in a NEW backups*.html, and in a bundle 
2026-10-17T10:48:53.8953521Z   COVERED   felhom-controller      retrieval-promise    an unregistered retrieval promise, in partials/; R-325: the 
2026-10-17T10:48:53.8953795Z   COVERED   felhom-controller      reuse-refs           R-426: a cited .go and a cited .md path that do not exist, p
2026-10-17T10:48:53.8954058Z   COVERED   felhom-controller      secret-markup        a secret templated into markup, in partials/
2026-10-17T10:48:53.8954450Z   COVERED   felhom-controller      template-id          a JS reference to a missing id, in partials/
2026-10-17T10:48:53.8954714Z   COVERED   felhom.eu              closed-register      a verdict cell reading open, a row with no state cell at all
2026-10-17T10:48:53.8955001Z   COVERED   felhom.eu              decoy-coverage       a gate registered in a runner with no decoy and no exemption
2026-10-17T10:48:53.8955376Z   COVERED   felhom.eu              due-checks           R-426: a dated check whose id survives only in prose (orphan
2026-10-17T10:48:53.8955649Z   COVERED   felhom.eu              golden-currency      R-410: an empty directory with a perfect name, checked by wh
2026-10-17T10:48:53.8956035Z   COVERED   felhom.eu              guide-quote          R-596: SEVEN cases in scripts/test_guide_quote_gate.py, run 
2026-10-17T10:48:53.8956430Z   COVERED   felhom.eu              hostinstall          R-426: R-185's regression with only its dry-run echo left, t
2026-10-17T10:48:53.8956811Z   COVERED   felhom.eu              hub-confirm          a native confirm() in templates/partials/ (scope was os.list
2026-10-17T10:48:53.8957142Z   COVERED   felhom.eu              hub-copy             R-558: an English retrieval promise in the NEW bundle (the s
2026-10-17T10:48:53.8957544Z   COVERED   felhom.eu              instructions         R-426: a version literal in a CLAUDE.md's effective text; th
2026-10-17T10:48:53.8957997Z   COVERED   felhom.eu              iso-bootstrap        R-502: SIX decoys + the genuine article in scripts/test_iso_
2026-10-17T10:48:53.8958302Z   COVERED   felhom.eu              manifest-bearer      a bearer literal in manifests/overlays/ (scope was os.listdi
2026-10-17T10:48:53.8958686Z   COVERED   felhom.eu              observations         R-419: prose SAYING it carries no marker, plus both genuine 
2026-10-17T10:48:53.8959058Z   COVERED   felhom.eu              one-register         R-426: an open roadmap row whose state NAMES another row's C
2026-10-17T10:48:53.8959603Z   COVERED   felhom.eu              poster-facts         a throwaway repo where the FACTS file is committed after the
2026-10-17T10:48:53.8959876Z   COVERED   felhom.eu              register-shape       R-627: a row whose state cell was EATEN (no trailing pipe), 
2026-10-17T10:48:53.8960311Z   COVERED   felhom.eu              reuse-refs           a cited .go path, and (R-422) a cited .md path, that does no
2026-10-17T10:48:53.8960762Z   COVERED   felhom.eu              script-tests         R-885: FIVE cases in scripts/test_script_tests_gate.py, run 
2026-10-17T10:48:53.8961200Z   COVERED   felhom.eu              site                 R-423: a NEW page under website/ that PAGES does not list (t
2026-10-17T10:48:53.8961450Z   COVERED   felhom.eu              stands               R-819: a stand citing a register id that exists in NEITHER r
2026-10-17T10:48:53.8961998Z   COVERED   felhom.eu              wire-contract        R-555: an emitted tag whose name the receiver carries ONLY i
2026-10-17T10:48:53.8962327Z 
2026-10-17T10:48:53.8962638Z decoy-coverage gate OK — every registered gate has a decoy or a named exemption (R-426)
2026-10-17T10:48:53.9085497Z 
2026-10-17T10:48:53.9086444Z ==============================================================================
2026-10-17T10:48:53.9086750Z == gate: poster-facts   (poster_facts_gate.py /root/.cache/act/e75913ab8508cd04/hostexecutor)
2026-10-17T10:48:53.9087146Z ==============================================================================
2026-10-17T10:48:54.0612722Z poster-facts gate - advisory, never fails a push
2026-10-17T10:48:54.0613625Z   poster is current: the drawing is as new as its facts (poster +0 s relative to facts)
2026-10-17T10:48:54.0876451Z 
2026-10-17T10:48:54.0876988Z ==============================================================================
2026-10-17T10:48:54.0877283Z == summary
2026-10-17T10:48:54.0877426Z ==============================================================================
2026-10-17T10:48:54.0877631Z   site               OK            (exit 0)
2026-10-17T10:48:54.0877771Z   hostinstall        OK            (exit 0)
2026-10-17T10:48:54.0877892Z   hub-confirm        OK            (exit 0)
2026-10-17T10:48:54.0878085Z   manifest-bearer    OK            (exit 0)
2026-10-17T10:48:54.0878215Z   reuse-refs         OK            (exit 0)
2026-10-17T10:48:54.0878380Z   instructions       OK            (exit 0)
2026-10-17T10:48:54.0878496Z   golden-currency    OK            (exit 0)
2026-10-17T10:48:54.0878657Z   wire-contract      OK            (exit 0)
2026-10-17T10:48:54.0878775Z   hub-copy           OK            (exit 0)
2026-10-17T10:48:54.0878887Z   guide-quote        OK            (exit 0)
2026-10-17T10:48:54.0879098Z   due-checks         OK            (exit 0)
2026-10-17T10:48:54.0879314Z   one-register       OK            (exit 0)
2026-10-17T10:48:54.0879472Z   closed-register    OK            (exit 0)
2026-10-17T10:48:54.0879587Z   observations       OK            (exit 0)
2026-10-17T10:48:54.0879741Z   register-shape     OK            (exit 0)
2026-10-17T10:48:54.0879873Z   stands             OK            (exit 0)
2026-10-17T10:48:54.0879983Z   script-tests       OK            (exit 0)
2026-10-17T10:48:54.0880141Z   decoy-coverage     OK            (exit 0)
2026-10-17T10:48:54.0880263Z   poster-facts       OK            (exit 0)
2026-10-17T10:48:54.0880389Z 
2026-10-17T10:48:54.0880544Z all felhom.eu gates OK
2026-10-17T10:48:54.1087538Z ::group::Run python3 -c 'import os;print("RESEND_API_KEY length: %d" % len(os.environ.get("RESEND_API_KEY","")))'
2026-10-17T10:48:54.1088110Z python3 -c 'import os;print("RESEND_API_KEY length: %d" % len(os.environ.get("RESEND_API_KEY","")))'
2026-10-17T10:48:54.1088608Z if [ "$FORCE_ALARM" = "true" ]; then
2026-10-17T10:48:54.1088856Z   echo "force_alarm=true - failing on purpose so the alarm step runs (R-1129 proof)"
2026-10-17T10:48:54.1089117Z   exit 1
2026-10-17T10:48:54.1089318Z fi
2026-10-17T10:48:54.1089595Z shell: bash --noprofile --norc -e -o pipefail {0}
2026-10-17T10:48:54.1089852Z env:
2026-10-17T10:48:54.1090051Z   RESEND_API_KEY: ***
2026-10-17T10:48:54.1090466Z   FORCE_ALARM: true
2026-10-17T10:48:54.1090831Z ::endgroup::
2026-10-17T10:48:54.1977060Z RESEND_API_KEY length: 36
2026-10-17T10:48:54.2036911Z force_alarm=true - failing on purpose so the alarm step runs (R-1129 proof)
2026-10-17T10:48:54.2039607Z   ❌  Failure - Main Manual proof - alarm key present, optional forced failure (dispatch only, R-1129)
2026-10-17T10:48:54.2044298Z exit status 1
2026-10-17T10:48:54.2057243Z ::group::Run python3 - <<'PY'
2026-10-17T10:48:54.2057711Z python3 - <<'PY'
2026-10-17T10:48:54.2057921Z import json, os, sys, time, urllib.request, urllib.error
2026-10-17T10:48:54.2058169Z 
2026-10-17T10:48:54.2058326Z key = os.environ.get("RESEND_API_KEY", "")
2026-10-17T10:48:54.2058506Z if not key:
2026-10-17T10:48:54.2058730Z     sys.exit("ALARM FAILED: RESEND_API_KEY is empty — the alarm cannot be sent, and a "
2026-10-17T10:48:54.2058952Z              "silent alarm is worse than none. Set the user-level Actions secret.")
2026-10-17T10:48:54.2059153Z 
2026-10-17T10:48:54.2059301Z repo = os.environ.get("GITHUB_REPOSITORY", "?")
2026-10-17T10:48:54.2059518Z sha  = os.environ.get("GITHUB_SHA", "?")
2026-10-17T10:48:54.2059695Z run  = os.environ.get("GITHUB_RUN_NUMBER", "?")
2026-10-17T10:48:54.2059866Z srv  = os.environ.get("GITHUB_SERVER_URL", "https://gitea.dooplex.hu")
2026-10-17T10:48:54.2060114Z 
2026-10-17T10:48:54.2060261Z # R-265: how long the run took, so a reap is self-identifying. An honest gate failure
2026-10-17T10:48:54.2060563Z # lands in well under a minute; a multi-minute figure means the job hit its own timeout
2026-10-17T10:48:54.2060793Z # and the interesting question is the runner, not the gates.
2026-10-17T10:48:54.2061021Z started = os.environ.get("GATES_STARTED_AT", "")
2026-10-17T10:48:54.2061202Z try:
2026-10-17T10:48:54.2061354Z     # An ABSENT stamp is "unknown", never a number. Defaulting to 0 would print an elapsed
2026-10-17T10:48:54.2061609Z     # of ~1.7 billion seconds, which is a confident wrong answer — the exact failure mode
2026-10-17T10:48:54.2061803Z     # this whole session is about.
2026-10-17T10:48:54.2061972Z     elapsed = "%d s" % (int(time.time()) - int(started)) if started else "unknown (no start stamp)"
2026-10-17T10:48:54.2062165Z except (TypeError, ValueError):
2026-10-17T10:48:54.2062381Z     elapsed = "unknown (unparseable start stamp %r)" % started
2026-10-17T10:48:54.2062581Z 
2026-10-17T10:48:54.2062726Z body = json.dumps({
2026-10-17T10:48:54.2062936Z     "from": "Felhom CI <monitoring@felhom.eu>",
2026-10-17T10:48:54.2063144Z     "to": ["admin@felhom.eu"],
2026-10-17T10:48:54.2063308Z     "subject": ("[felhom CI] FORCED TEST, not a real failure - gates FAILED in %s"
2026-10-17T10:48:54.2063492Z                 if os.environ.get("FORCE_ALARM") == "true"
2026-10-17T10:48:54.2063711Z                 else "[felhom CI] gates FAILED in %s") % repo,
2026-10-17T10:48:54.2063894Z     "text": (
2026-10-17T10:48:54.2064057Z         "The gate entry point exited non-zero.\n\n"
2026-10-17T10:48:54.2064288Z         "Repository : %s\n"
2026-10-17T10:48:54.2064455Z         "Commit     : %s\n"
2026-10-17T10:48:54.2064607Z         "Run        : %s/%s/actions/runs/%s\n"
2026-10-17T10:48:54.2064781Z         "Elapsed    : %s\n\n"
2026-10-17T10:48:54.2064983Z         "The failing gate names itself in the run log - WHEN THERE IS ONE. A run that\n"
2026-10-17T10:48:54.2065173Z         "hung and was reaped by the platform leaves no log at all (R-265, run 264: 834 s,\n"
2026-10-17T10:48:54.2065363Z         "log fetch 500). The job now times out at 5 minutes so that case should fail as a\n"
2026-10-17T10:48:54.2065594Z         "job and keep its log; if Elapsed above is minutes rather than seconds, suspect\n"
2026-10-17T10:48:54.2065780Z         "the runner before the gates, and if the log is missing say so rather than\n"
2026-10-17T10:48:54.2065965Z         "guessing which gate it was.\n\n"
2026-10-17T10:48:54.2066124Z         "If the local pre-push hook was GREEN for this commit, then CI and the hook\n"
2026-10-17T10:48:54.2066432Z         "disagree - that is a finding about the gates themselves, not about CI, and it\n"
2026-10-17T10:48:54.2066631Z         "outranks whatever the push was for.\n"
2026-10-17T10:48:54.2066802Z     ) % (repo, sha, srv, repo, run, elapsed),
2026-10-17T10:48:54.2067046Z }).encode()
2026-10-17T10:48:54.2067215Z 
2026-10-17T10:48:54.2067458Z req = urllib.request.Request(
2026-10-17T10:48:54.2067629Z     "https://api.resend.com/emails", data=body, method="POST",
2026-10-17T10:48:54.2067844Z     headers={"Authorization": "Bearer %s" % key,
2026-10-17T10:48:54.2068022Z              "Content-Type": "application/json",
2026-10-17T10:48:54.2068290Z              # Cloudflare fronts api.resend.com and BLOCKS the default
2026-10-17T10:48:54.2068520Z              # "Python-urllib/3.x" agent with its own 403 (error 1010) — which looks
2026-10-17T10:48:54.2068722Z              # exactly like an auth failure and is not one. Measured 2026-08-02.
2026-10-17T10:48:54.2068898Z              "User-Agent": "felhom-ci/1.0"})
2026-10-17T10:48:54.2069064Z try:
2026-10-17T10:48:54.2069254Z     with urllib.request.urlopen(req, timeout=30) as r:
2026-10-17T10:48:54.2069422Z         print("RESEND-ACCEPTED id=%s" % json.load(r)["id"])
2026-10-17T10:48:54.2069596Z except urllib.error.HTTPError as e:
2026-10-17T10:48:54.2069815Z     sys.exit("ALARM FAILED: Resend returned HTTP %s: %s" % (e.code, e.read().decode()[:300]))
2026-10-17T10:48:54.2070015Z PY
2026-10-17T10:48:54.2070167Z shell: bash --noprofile --norc -e -o pipefail {0}
2026-10-17T10:48:54.2070429Z env:
2026-10-17T10:48:54.2070594Z   RESEND_API_KEY: ***
2026-10-17T10:48:54.2070782Z   FORCE_ALARM: true
2026-10-17T10:48:54.2070934Z ::endgroup::
2026-10-17T10:48:54.8146021Z RESEND-ACCEPTED id=01a1497a-9cba-770c-aee8-103f238f507e
2026-10-17T10:48:54.8345857Z Cleaning up container for job gates
2026-10-17T10:48:55.9865684Z 🏁  Job failed
2026-10-17T10:48:55.9867335Z Job 'gates' failed

