gates / gates (push) Successful in 6m53s
Closed R-1126, R-1125 and R-1129 (not a defect: a misreading of the CI log by the session that filed it); opened R-1135..R-1137; R-1124 noted. 01 §5 [DESIGN]: the tunnel runs before the claim; FileBrowser is published only after its default login is checked. STATUS D10-D12 decided. N100 diary: the 21-minute file-manager gap after 0.327.0. Controller 0.327.1 is the floor since 12:06 UTC. Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
493 lines
46 KiB
Plaintext
493 lines
46 KiB
Plaintext
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
|
||
|