FileBrowser never on its default password (D11 = A), real memory amounts (D10 = A), CI mail: report, register, docs
gates / gates (push) Successful in 6m53s
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
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
# REPORT — FileBrowser never on its default password (D11 = A), real memory amounts (D10 = A), CI failure mail, STATUS (2026-10-17)
|
||||
|
||||
Written in ASD-STE100 Simplified Technical English. Brief: the operator's „D11 = A, D10 = A, D12 = key set" task
|
||||
(2026-10-17). Design read first: `01-topology-and-trust.md` §5 (now carries the `[DESIGN]` paragraph),
|
||||
`02-controller-module-map.md` (the app page, R-513 states), controller `stacks/infra.go`, `stacks/deploy.go`
|
||||
`memoryVerdict`. Evidence: `documentation/audits/filebrowser-memory-ci-2026-10-17/`.
|
||||
|
||||
## Plain words first
|
||||
|
||||
- **FileBrowser never answers on its default password any more** (controller 0.327.1, the floor for every box since
|
||||
12:06 UTC). FileBrowser's own password setting cannot do this: it overwrites the household's own password at every
|
||||
restart (measured). So the box keeps FileBrowser off the internet until it has checked it.
|
||||
- **One mistake in my release, found and fixed:** 0.327.0 made `files.<domain>` time out on demo-hp and on the N100 for
|
||||
about 21 minutes. 0.327.1 fixed it by the normal update path. No data touched; the N100's diary has the line.
|
||||
- **The install check uses real memory amounts** (your D10 = A), and its message and the install page now say what to
|
||||
do. No box is over. The page and the check now show the same numbers (they did not before).
|
||||
- **R-1129 was my mistake from earlier today.** The CI failure mail always worked: the „ALARM FAILED" text I found was the
|
||||
CI printing its own script before running it. **Your key change did no harm.** A forced test mail went to
|
||||
**admin@felhom.eu at 10:48:54 UTC** (CC saw it arrive in the catch-all). **Please confirm you have it** — subject
|
||||
„[felhom CI] FORCED TEST, not a real failure - gates FAILED in admin/felhom.eu".
|
||||
- **STATUS:** the other session had already given its decision a new number; D10, D11, D12 are now marked decided.
|
||||
Tester 1's four leftover mount units are removed.
|
||||
|
||||
## 1. FileBrowser (R-1126)
|
||||
|
||||
- **Spike (1a), at the pinned tag `gtstef/filebrowser:1.5.6-stable`:** the admin password can come from
|
||||
`auth.adminPassword` (`backend/common/settings/auth.go:52`) or `FILEBROWSER_ADMIN_PASSWORD`
|
||||
(`backend/common/settings/config.go:923-926`); there is no password-file form. It is applied at EVERY start:
|
||||
`validateUserInfo` (called at each start, `backend/cmd/root.go:144`) resets the admin user's password when the setting is
|
||||
set (`backend/cmd/user.go:50-57`, „Resetting admin user to default username and password").
|
||||
- **Measured on 9202:**
|
||||
- With the variable set, the default login was refused from the first answer.
|
||||
- But a password the household set in FileBrowser was overwritten at the next restart: own login 401, the variable's
|
||||
password 200 (`P1/A1b-env-password-spike.txt`).
|
||||
- So **Path 1 fails the brief's condition, and Path 2 is built.**
|
||||
- Also seen: FileBrowser 1.5.6 limits login tries (429 after 8 fast tries) — a small guard of its own.
|
||||
- **Path 2, with one change from the brief's sketch:** FileBrowser starts on its own network, not on `traefik-public`;
|
||||
the box joins it there after the check, by container ID. `files.<domain>` is a file route to `filebrowser:80` by name,
|
||||
which resolves only while it is joined.
|
||||
- Why the network decides: any container re-created by anyone starts unpublished.
|
||||
- Why by ID: the commit's security review found a check-then-connect race when connecting by name; fixed before the
|
||||
release.
|
||||
- **0.327.0 used Docker labels, and that failed on two boxes.** Traefik kept the address it chose at container start, on
|
||||
the wrong network, so `files.<domain>` timed out on demo-hp and the N100. 0.327.1 replaced the labels with the file
|
||||
route.
|
||||
- **9202 probes from outside, through Traefik (`P1/`):**
|
||||
- rc.2 (labels): 143 probes, the default login never 200; 404 while unpublished.
|
||||
- 0.327.1-rc.1 (file route): 140 probes, never 200; 502 while unpublished, then the page 200 and the default refused.
|
||||
- **Box walk on 0.327.1:** all three boxes, through Traefik and publicly: `files.<domain>` page 200, default login 401.
|
||||
- **Tests, each red-proved:**
|
||||
- `TestFileBrowserRender_R1126_NotPublicAtStart` (no `traefik-public`, no labels, the route);
|
||||
- `TestFileBrowserGate_PublishedOnlyAfterTheCheck`;
|
||||
- `TestFileBrowserGate_ConnectsTheCheckedContainerById`.
|
||||
|
||||
## 2. Memory (R-1125)
|
||||
|
||||
**Every box the hub knows** (4, no customer box; `hosts` and `customer_configs` read; `P2/B1-boxes.txt`):
|
||||
|
||||
| Box | Guest | Usable | Committed today → after |
|
||||
|---|---|---|---|
|
||||
| demo-hp | 25,898 MB | 25,514 | 2,478 → 3,682 |
|
||||
| demo-felhom | 12,288 | 11,904 | 622 → 622 |
|
||||
| Tester 1 | 4,096 | 3,712 | 680 → 840 |
|
||||
| Tester-2 | 11,691 | 11,307 | 0 → 0 (no app; last report 2026-10-04) |
|
||||
|
||||
No box is over; there was no STOP.
|
||||
|
||||
**The refusal, before and after:**
|
||||
- **Before:** „Nincs elég memória az alkalmazás telepítéséhez. Szükséges: … Elérhető: … (… ebből … használt …)" — no advice.
|
||||
- **Now (check and page):**
|
||||
- HU: „Nincs elég memória ehhez az alkalmazáshoz a már telepítettek mellett: kell 150 MB, szabad 50 MB (…). Távolíts
|
||||
el egy alkalmazást, amelyre nincs szükséged, vagy használj több memóriájú gépet."
|
||||
- EN: „There is not enough memory for this app next to the apps already installed: … Remove an app you do not need, or
|
||||
use a machine with more memory."
|
||||
- The install page shows its own memory box first; it now says the same.
|
||||
|
||||
**Found and fixed:** the page used `/proc`'s host-wide figures, the check the guest's committed requests. On 9202 the
|
||||
page said 12,637 MB „needed" against the check's 2,648. Now both read `stacks.InstallMemory`.
|
||||
|
||||
**Promises:** an ASCII grep of the website, the estimator and the dashboard templates for `8 GB`/`8GB`/`8 GiB` (control:
|
||||
the estimator data names an 8 GB box) found **no promise** that the household set fits 8 GB. The estimator says it does
|
||||
not (`P2/B3-promise-grep.txt`).
|
||||
|
||||
**The change:** catalog `1af6ea7`, 23 requests (`P2/B4-requests-applied.txt`). Also fixed:
|
||||
- REUSE.md said „display-only", which was untrue;
|
||||
- paperless-ngx's „display hint" comment;
|
||||
- the README memory column.
|
||||
|
||||
Step files unchanged.
|
||||
|
||||
**Live:**
|
||||
- 9201: Uptime Kuma (150 MB) accepted, then removed.
|
||||
- 9202 made nearly full (reserve raised, then restored): 400 in HU and EN, nothing installed. The page is blocked with the
|
||||
same numbers as the check (2,798 vs 2,698); screenshots `P2/shots/`. After the restore the page allows it.
|
||||
- Tests `TestR1125_*` (2), red-proved. Fixtures `deploy_new_blocked`, `deploy_new_memory_blocked` re-captured as
|
||||
`*_r1125` (only that sentence); every other fixture byte-identical.
|
||||
|
||||
## 3. CI mail (R-1129)
|
||||
|
||||
- **Key length:** all four repos' CI sees a key of length 36. A manual `workflow_dispatch` input `force_alarm` was added
|
||||
in all four; push runs are unchanged.
|
||||
- **The forced run:** felhom.eu job 1997 — `RESEND-ACCEPTED id=01a1497a-…` at **10:48:54 UTC**, to **admin@felhom.eu**.
|
||||
The Gmail catch-all holds it (10:48:55Z).
|
||||
- **R-1129 is closed as „not a defect":**
|
||||
- my earlier reading took the script's own source line for its output;
|
||||
- every cited job had in fact sent its mail;
|
||||
- the four CLAUDE.md „emails on failure" lines were true all along.
|
||||
- The controller CHANGELOG line that repeated my wrong claim is corrected.
|
||||
|
||||
## 4. STATUS and Tester 1
|
||||
|
||||
- **STATUS:**
|
||||
- The duplicate „D10" was already fixed by the cc-creds session: its decision moved to the „What works" list, and its
|
||||
new decisions are D13–D16.
|
||||
- D10, D11 and D12 are marked decided with your answers.
|
||||
- **Tester 1 (R-1124):**
|
||||
- Before: four `mnt-media_*.mount` units, „Managed by felhom-agent", inactive, for the removed drives' UUIDs.
|
||||
- I disabled and removed them, then reloaded systemd. After: only adatlemez's units are left, and 3 minutes later the
|
||||
agent had not written them back.
|
||||
- **But the agent still lists the four drives** and logs „enrolled drive absent by UUID — will retry" every ~20 s.
|
||||
That needs the agent change R-1124 names, and it waits for a vouched agent release.
|
||||
|
||||
## 5. Versions, commits, fixtures
|
||||
|
||||
- **Controller 0.327.1** (MinAgent 0.158.1, no golden), built from `71fbef6` in a fresh clean clone with that clone's own
|
||||
build script. The shared clone had another session's open edits, so `FELHOM_REPO_DIR` pointed the build at the fresh
|
||||
clone.
|
||||
- Test images:
|
||||
- 0.327.0-rc.1 — built, never deployed: the TOCTOU fix replaced it;
|
||||
- rc.2, rc.3, rc.4 — on 9202;
|
||||
- 0.327.1-rc.1 — on 9201 and 9202.
|
||||
- 0.327.0 was released at 11:43 UTC to the three test boxes only. Its box walk found the timeout; it was never the
|
||||
global floor.
|
||||
- 0.327.1: per-box floors at 12:04:44; all three on it by 12:05:23; box walk green; https-only OK. Global floor
|
||||
12:06:54 UTC (303 `floor_set`), read back from `hub.db` + WAL (`0.327.1=0.158.1`, no per-box floor) and from the page.
|
||||
- Controller commits: `e3bb775`, `8f029aa`, `67a4b45`, `a4c0d54`, `0c6ce95`, `71fbef6`.
|
||||
- **Catalog:** `1af6ea7`. **Helper (CI):** `498b9139` felhom.eu, `411d776` controller, `c899c82` catalog, `344c4f9` agent.
|
||||
- **Fixtures:** 2 replaced under new names; 155 byte-identical.
|
||||
- 9202 runs 0.327.1. Its settings were put back byte-identical: `controller.yaml.pre-r1125` was copied back.
|
||||
|
||||
## 6. Rows
|
||||
|
||||
- **Before:** 181 (after the cc-creds session's push).
|
||||
- **Closed:** R-1126, R-1125 and R-1129 (3).
|
||||
- **Opened:** R-1135 (the CI mail's link uses the cluster address), R-1136 (felhom.eu CI runs longer than the 5 minutes
|
||||
R-265 assumes), R-1137 (a rerun may overwrite a failed job's log — unproven) (3).
|
||||
- **After:** 181.
|
||||
- **R-1124** stays open, with the note above.
|
||||
|
||||
## 7. Observations
|
||||
|
||||
1. FileBrowser's own admin-password setting re-applies at every start. NOT-A-FINDING: the reason Path 2 was built (`01` §5).
|
||||
2. 0.327.0's label route timed out on demo-hp and the N100 (~21 min). NOT-A-FINDING: found by the release's own box walk, fixed in 0.327.1 the same hour; N100 diary updated.
|
||||
3. A TOCTOU in the first gate (connect by name). NOT-A-FINDING: found by the commit security review, fixed before any release.
|
||||
4. The install page used `/proc`'s host-wide memory, unlike the check. NOT-A-FINDING: fixed in 0.327.0 (small).
|
||||
5. R-1129's diagnosis was false (my misreading of CI logs). NOT-A-FINDING: row closed as not a defect, cause written in it.
|
||||
6. The CI mail's „Run" link points at the in-cluster Gitea address. FILED: R-1135
|
||||
7. felhom.eu CI runs ~6.9 minutes, past the 5 minutes R-265 assumes. FILED: R-1136
|
||||
8. A CI rerun may overwrite a failed job's log. FILED: R-1137
|
||||
9. The agent keeps listing decommissioned, removed drives. NOT-A-FINDING: already R-1124, note added.
|
||||
10. My first 9202 probe was stopped locally but ran on in the guest and upgraded it. NOT-A-FINDING: a scratch box; the upgrade was the intended next step, its log recorded.
|
||||
|
||||
## 8. Teardown (three layers)
|
||||
|
||||
- **Machine:**
|
||||
- 9202: the probe scripts removed; FileBrowser re-created three times (scratch); its settings put back; it runs
|
||||
0.327.1.
|
||||
- 9201: Uptime Kuma removed through the product (no volume left).
|
||||
- Tester 1: as in §4.
|
||||
- No throwaway container or volume left (`r1126-*` cleaned).
|
||||
- **Host:** Tester 1's four mount units removed (§4); nothing else.
|
||||
- **Hub:** per-box floors set and cleared; global floor 0.327.1 / MinAgent 0.158.1.
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
**Ready for the first real tester (Tester-2): yes. Tester 2 (a laptop) is off; nothing was sent to it.**
|
||||
|
||||
**Updated 2026-10-17 (afternoon).** Controller 0.326.0 is the floor for every box since 09:55 UTC: FileBrowser's default password is checked at every FileBrowser start. Tester 1 is back on the live app list (test apps and drives removed); six memory limits raised — `REPORT-tester1-limits-filebrowser-2026-10-17.md`. **Earlier today:** controller 0.325.0 was the floor since 08:21 UTC (after the three test boxes): two more password doors count a try before checking it, family sign-ins are stored as fingerprints, a file-share rename always applies; five apps' Redis saves snapshots now, which a full disk cannot damage — `REPORT-burndown-3-2026-10-17.md`. **Earlier (2026-10-17 night):** controller 0.324.0 was the floor for every box since 02:46 UTC (all three test boxes made tonight's off-site backup on it first): a restore now brings the database password back with the data (your 1A), restic 0.19.1 (your 2A), dashboard hardening — `REPORT-night-2026-10-17.md`. **Earlier (2026-10-16 evening):** 0.323.0, Debian 13 — `REPORT-debian13-restic-2026-10-16.md`. **Earlier (midday):** Controller 0.319.0 (the app page in panels, the login in one panel) is the floor, MinAgent 0.158.1 — `REPORT-app-page-tuning-2026-10-16.md`. **Earlier (morning):** Storage identity build B shipped: agent 0.158.1 and golden 0.318.0 vouched by you, controller 0.318.0 is the floor (MinAgent 0.158.1), installer 1.33.0 published — new one-disk boxes get their own data area. Open items: see `documentation/backlog/OPEN-ITEMS.md`. Older notes, day by day:
|
||||
**Updated 2026-10-17 (afternoon, later).** Controller 0.327.1 is the floor for every box since 12:06 UTC: FileBrowser is published only after its default password is checked (your D11 = A), and the install check uses real memory amounts with a clear message (your D10 = A) — `REPORT-filebrowser-memory-ci-2026-10-17.md`. **Earlier:** Controller 0.326.0 is the floor for every box since 09:55 UTC: FileBrowser's default password is checked at every FileBrowser start. Tester 1 is back on the live app list (test apps and drives removed); six memory limits raised — `REPORT-tester1-limits-filebrowser-2026-10-17.md`. **Earlier today:** controller 0.325.0 was the floor since 08:21 UTC (after the three test boxes): two more password doors count a try before checking it, family sign-ins are stored as fingerprints, a file-share rename always applies; five apps' Redis saves snapshots now, which a full disk cannot damage — `REPORT-burndown-3-2026-10-17.md`. **Earlier (2026-10-17 night):** controller 0.324.0 was the floor for every box since 02:46 UTC (all three test boxes made tonight's off-site backup on it first): a restore now brings the database password back with the data (your 1A), restic 0.19.1 (your 2A), dashboard hardening — `REPORT-night-2026-10-17.md`. **Earlier (2026-10-16 evening):** 0.323.0, Debian 13 — `REPORT-debian13-restic-2026-10-16.md`. **Earlier (midday):** Controller 0.319.0 (the app page in panels, the login in one panel) is the floor, MinAgent 0.158.1 — `REPORT-app-page-tuning-2026-10-16.md`. **Earlier (morning):** Storage identity build B shipped: agent 0.158.1 and golden 0.318.0 vouched by you, controller 0.318.0 is the floor (MinAgent 0.158.1), installer 1.33.0 published — new one-disk boxes get their own data area. Open items: see `documentation/backlog/OPEN-ITEMS.md`. Older notes, day by day:
|
||||
`documentation/backlog/STATUS-HISTORY.md`. Reports: `REPORT-night-2026-10-14.md`, `REPORT-immich-rollout-2026-10-14.md`, `REPORT-seo-felho-tarhely-2026-10-14.md`, `REPORT-immich-repair-2026-10-14.md`, `REPORT-power-cut-fixes-2026-10-14.md`, `REPORT-night-power-2026-10-13.md`, `REPORT-poweroff.md`.
|
||||
|
||||
## What works
|
||||
@@ -57,9 +57,9 @@
|
||||
| D6 | R-992 | The scratch box cannot read the private drill catalog: give it a read-only login, or make that copy readable? | **A read-only login** | Readable copy: the drill catalog becomes public | every new-app test needs hand-staging | new-app tests |
|
||||
| D7 | R-990, R-989 | Rule yes / no / later on the forum ideas (`audits/forum-research-2026-10-12/FELHOM.md` §5) and the selfh.st ideas (`audits/selfhst-survey-2026-10-12/FELHOM.md` §6) | — | — | nothing changes; the research ages | — |
|
||||
| D8 | R-206 | Install DooPlex's Docker settings from git (restarts Docker), and prune the build cache weekly: yes or no? | **Yes, in a quiet window** | — | a rebuild of DooPlex still has the settings in git | — |
|
||||
| D10 | R-1125 | Raise the 23 memory requests to what the apps really use? Then an 8 GB box no longer installs the full household set (its sixth app is refused). | **Your call** — values ready | Keep: the box's install check stays optimistic | nothing changes | — |
|
||||
| D11 | R-1126 | The tunnel runs before the claim (the claim needs it). Close FileBrowser's first-start window (A), or claim only at home (B)? | **A** — small, no promise changes | B: the claim mail and flow change, the household must be at home | FileBrowser's default is open for ~2 s at its first start | — |
|
||||
| D12 | R-1129 | CI has never sent its failure mail (the key is empty in the runner since at least 2026-09-22). Set the key in the four repos? | **Yes** — you set it, or CC with your word (it is a credential) | — | a red CI run or a `--no-verify` push reaches nobody | — |
|
||||
| D10 | R-1125 | **DECIDED 2026-10-17: A** — the 23 memory requests now match real use (catalog `1af6ea7`); the install refusal and page say what to do (controller 0.327.0). An 8 GB box no longer installs the whole household set. | done | — | — | — |
|
||||
| D11 | R-1126 | **DECIDED 2026-10-17: A** — FileBrowser is published only after its default password is checked; it never answers on the default (controller 0.327.1). The tunnel still runs before the claim, by design (`01` §5). | done | — | — | — |
|
||||
| D12 | R-1129 | **CLOSED 2026-10-17: not a defect** — CC misread the CI log; the failure mail always worked. A forced test mail went to admin@felhom.eu at 10:48:54 UTC (CC saw it arrive). Your key change did no harm. | done | — | — | — |
|
||||
| D13 | R-1119 | Remove `export RESEND_API=…` from your `~/.bashrc` (line 88)? The key is in CC's store now (`sec run RESEND_API`). | **Yes** — you, or CC with your word (it is your file) | Keep: every CC command carries the key | the key stays one `env` away from a record; the new guard refuses bare `env`/`printenv`, but not every shape | — |
|
||||
| D14 | R-1120 | homelab CC settings let `kubectl get secret -o yaml` run with no prompt. Add an `ask` rule too, or rely on the new guard alone? | **Add the ask rule too** — one line, two layers | Guard only: one layer, already proven | the guard alone refuses it in every session | — |
|
||||
| D15 | R-1130, R-1131, R-1132 | Three secrets are in old CC records: the registry password, and the demo-felhom and demo-hp recovery codes (printed today 10:27 by the JARR session, before the guards). Change them? | **Change the registry password; your call on the two demo codes** | Accept: no work; the values stay valid | the three values stay valid while copies sit in records Anthropic's API has seen | — |
|
||||
|
||||
@@ -129,6 +129,18 @@ a trust boundary too: a default password, or a "first visitor creates the admin"
|
||||
household acts. Rule and per-app status: `09` §3 decision 45 and `app-catalog-felhom.eu/FIRST-ADMIN.md` (the audit
|
||||
of all 53 apps, 2026-09-28).
|
||||
|
||||
**[DESIGN, 2026-10-17, R-1126, operator decision D11 = A] The tunnel runs before the claim, and FileBrowser never
|
||||
answers on a default password.** The box starts cloudflared as soon as it has a tunnel token, before it is claimed,
|
||||
because the claim itself is reached through it: the claim mail links `https://felhom.<domain>`
|
||||
(`hub/internal/notify/templates.go:27`). Before the claim a stranger reaches only the claim page (a code: 72 h life, 5
|
||||
tries, 15-minute lockout — controller `web/claim.go`) and `files.<domain>`. FileBrowser starts every new database on
|
||||
admin/admin, and its own admin-password setting cannot replace that (it re-applies at every start and would overwrite
|
||||
the household's own password — FileBrowser 1.5.6 `backend/cmd/user.go:50-57`, measured). So FileBrowser starts OFF
|
||||
`traefik-public`, on its own network; the box checks THIS run's default login (and replaces it when it works), and only
|
||||
then joins it to `traefik-public`; `files.<domain>` is a file route to `filebrowser:80` by name, which resolves only
|
||||
while it is joined (controller v0.327.1, `stacks/filebrowser_gate.go`). Until then the route answers 502. Measured on
|
||||
scratch 9202: FileBrowser and its data removed, 140 probes from outside over 5 minutes, the default login never 200.
|
||||
|
||||
**Who is the visitor — the address (recorded 2026-10-01, R-753, `09` §3 decision 63, controller ≥ 0.286.0).** Rule:
|
||||
*never believe an address a client can write.* Through the tunnel every visitor used to reach traefik as cloudflared's
|
||||
one docker-assigned address, so every per-address guard (the dashboard's login counter, an app's lock) was an
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
== 1. a NEW database with the env password: probe the default login from the first moment (every 0.25 s, 40 s)
|
||||
default-login answers seen: 8 401 149 429
|
||||
env password login: 429
|
||||
== 2. the household sets its own password in FileBrowser (the API the box uses), then a restart
|
||||
Traceback (most recent call last):
|
||||
File "<string>", line 1, in <module>
|
||||
import json,sys;print(json.load(sys.stdin)["id"])
|
||||
~~~~~~~~~~~~~~~~~~~~^^^^^^
|
||||
KeyError: 'id'
|
||||
Traceback (most recent call last):
|
||||
File "<string>", line 1, in <module>
|
||||
import json,sys;print(json.dumps({"which":["password"],"data":{"id":int(sys.argv[1]),"username":"admin","password":sys.stdin.read()}}))
|
||||
~~~^^^^^^^^^^^^^
|
||||
ValueError: invalid literal for int() with base 10: ''
|
||||
PUT own password: 401; own login: 429; env login: 429
|
||||
AFTER RESTART — own login: 401; env login: 200; default login: 401
|
||||
log: 2026/10/17 10:32:13 [INFO ] Resetting admin user to default username and password.
|
||||
log: 2026/10/17 10:33:02 [INFO ] Using admin password from FILEBROWSER_ADMIN_PASSWORD environment variable
|
||||
log: 2026/10/17 10:33:02 [INFO ] Resetting admin user to default username and password.
|
||||
== cleanup: 0 containers, 0 volumes left
|
||||
@@ -0,0 +1,12 @@
|
||||
== 1. a NEW database with the env password: probe the default login from the first answer (1 s apart, 5 answers —
|
||||
FileBrowser 1.5.6 limits login tries: the first run of this spike probed 4/s and was answered 429 after 8 tries)
|
||||
default-login answers seen: 5 401
|
||||
waiting 90 s for FileBrowser's login limiter to clear
|
||||
env password login: 200
|
||||
== 2. the household sets its own password in FileBrowser (the API the box uses), then a restart
|
||||
PUT own password: 204; own login: 200; env login: 401
|
||||
AFTER RESTART — own login: 401; env login: 200; default login: 401
|
||||
log: 2026/10/17 10:33:21 [INFO ] Resetting admin user to default username and password.
|
||||
log: 2026/10/17 10:34:57 [INFO ] Using admin password from FILEBROWSER_ADMIN_PASSWORD environment variable
|
||||
log: 2026/10/17 10:34:57 [INFO ] Resetting admin user to default username and password.
|
||||
== cleanup: 0 containers, 0 volumes left
|
||||
@@ -0,0 +1,8 @@
|
||||
== the rc.2 upgrade on 9202 (the session's first ssh was stopped locally but ran on; its probe output was lost). Read afterwards:
|
||||
2026/10/17 11:11:02 handlers.go:3886: [INFO] [web] FileBrowser mounts synced (recreated) — 11 storage path(s), config updated
|
||||
2026/10/17 11:11:03 filebrowser_gate.go:68: [INFO] [infra] connected felhom-controller to felhom-filebrowser (the FileBrowser default-login check, R-1126)
|
||||
2026/10/17 11:11:05 filebrowser_gate.go:94: [INFO] [infra] filebrowser: default login refused for this run — joined traefik-public, files.<domain> served (R-1126)
|
||||
== probe through Traefik right after (Host files.enkisfelhom.hu):
|
||||
11:11:05 page=404 default-login=404 nets=[felhom-filebrowser ]
|
||||
11:11:07 page=404 default-login=404 nets=[felhom-filebrowser traefik-public ]
|
||||
11:11:09 page=200 default-login=401 nets=[felhom-filebrowser traefik-public ]
|
||||
@@ -0,0 +1,13 @@
|
||||
removed filebrowser + its data volume at 11:11:33
|
||||
11:11:33 page=404 default-login=404 nets=[]
|
||||
11:16:03 page=404 default-login=404 nets=[felhom-filebrowser ]
|
||||
11:16:05 page=404 default-login=404 nets=[felhom-filebrowser traefik-public ]
|
||||
11:16:09 page=200 default-login=401 nets=[felhom-filebrowser traefik-public ]
|
||||
11:16:26 page=200 default-login=429 nets=[felhom-filebrowser traefik-public ]
|
||||
probes: 143, default login answered 200: 0 times
|
||||
2026/10/17 11:11:02 handlers.go:3954: [INFO] [web] FileBrowser: drive /mnt/felhom-drives/scratch_hdd/userdata/metube not mounted — skipping userdata skeleton
|
||||
2026/10/17 11:11:03 filebrowser_gate.go:68: [INFO] [infra] connected felhom-controller to felhom-filebrowser (the FileBrowser default-login check, R-1126)
|
||||
2026/10/17 11:11:05 filebrowser_gate.go:94: [INFO] [infra] filebrowser: default login refused for this run — joined traefik-public, files.<domain> served (R-1126)
|
||||
2026/10/17 11:16:04 filebrowser_password.go:151: [WARN] [infra] filebrowser: admin/admin logs in again on a new FileBrowser run (recorded state "generated") — its data was re-created; replacing it (R-977)
|
||||
2026/10/17 11:16:05 filebrowser_password.go:208: [INFO] [infra] filebrowser: admin/admin replaced by a generated password (value never logged); verified new=200 admin=401
|
||||
2026/10/17 11:16:05 filebrowser_gate.go:94: [INFO] [infra] filebrowser: default login refused for this run — joined traefik-public, files.<domain> served (R-1126)
|
||||
@@ -0,0 +1,4 @@
|
||||
rc.1 at 11:57:43
|
||||
11:57:55 page 200 nets=[felhom-filebrowser traefik-public ] route=1
|
||||
public https://files.enkisfelhom.hu/: page 200, default login 401
|
||||
created 2026-10-17T11:57:45.226509967Z traefik-labels=
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
removed filebrowser + its data volume at 11:58:55
|
||||
11:58:55 page=502 default-login=502 nets=[]
|
||||
12:03:15 page=502 default-login=502 nets=[felhom-filebrowser ]
|
||||
12:03:17 page=200 default-login=401 nets=[felhom-filebrowser traefik-public ]
|
||||
12:03:32 page=200 default-login=429 nets=[felhom-filebrowser traefik-public ]
|
||||
12:03:36 page=200 default-login=401 nets=[felhom-filebrowser traefik-public ]
|
||||
12:03:38 page=200 default-login=429 nets=[felhom-filebrowser traefik-public ]
|
||||
probes: 140, default login answered 200: 0 times
|
||||
@@ -0,0 +1,18 @@
|
||||
read hub.db + WAL; integrity: ok
|
||||
customers in the hub: 0
|
||||
box report guestMB usable today after verdict
|
||||
Tester-2 2026-10-04 11691 11307 0 0 fits apps=-
|
||||
demo-felhom 2026-10-17 12288 11904 622 622 fits apps=opengist,prowlarr,qbittorrent,radarr,sonarr
|
||||
demo-hp 2026-10-17 25898 25514 2478 3682 fits apps=adventurelog,bentopdf,bookstack,calibre-web,docmost,home-assistant,kimai,opengist,paperless-ngx,plex,privatebin,romm
|
||||
tester-1 2026-10-17 4096 3712 680 840 fits apps=bookstack,paperless-ngx,privatebin
|
||||
tables with customers/hosts: ['customer_notifications', 'customer_configs', 'hosts', 'host_reports', 'host_escrow', 'host_recovery', 'host_pbs_secrets', 'customer_claims', 'host_deletions', 'host_escrow_superseded', 'customer_resets', 'os_host_settings']
|
||||
hosts: 4 rows, columns shown ['host_id', 'customer_id']
|
||||
('demo-felhom-8363b5', 'demo-felhom')
|
||||
('demo-hp-bb76ea', 'demo-hp')
|
||||
('Tester-2-be8404', 'Tester-2')
|
||||
('tester-1-d70be4', 'tester-1')
|
||||
customer_configs: 4 rows, columns shown ['customer_id', 'status']
|
||||
('demo-felhom', 'active')
|
||||
('demo-hp', 'active')
|
||||
('tester-1', 'active')
|
||||
('Tester-2', 'active')
|
||||
@@ -0,0 +1,17 @@
|
||||
pattern: 8\s?(GB|GiB|gigab) (ASCII); roots: ['felhom.eu/website', 'felhom-controller/controller/internal/web/templates', 'felhom.eu/documentation/pilot']
|
||||
positive control — sizing-data.json contains an 8 GB box: True
|
||||
felhom.eu/website/CHANGELOG.md: …nt, Paperless-ngx, Grimmory and 18 small ones). One answer is stricter: the household set without Immich on 8 GB now reads „fits, but tight" (0.5 MB over the fits-well line). The presets keep their verdicts. Data `?v=4`.…
|
||||
felhom.eu/website/CHANGELOG.md: …y carry the same text. ## 2026-10-13 (night) — „Milyen gép kell?" is a main menu item; no „tight from" below 8 GB - **Menu:** „Milyen gép kell?" / „Which machine do I need?" left the Alkalmazások / Apps group and is a top-…
|
||||
felhom.eu/website/CHANGELOG.md: …mator:** the legend's „Szűkösen elfér innen: …" item and the thin marker are hidden when that size is below 8 GB (the smallest size the page names) — with nothing ticked it read 2,1 GB. `sizing.js?v=5`; a test pins it (r…
|
||||
felhom.eu/website/CHANGELOG.md: …). - **The explaining sentence:** its base figure was already the base of the box the bar draws (4.0 GB on an 8 GB bar, 4.6 GB for the household preset); a test now pins that. No JS, CSS or data change, so no cache version…
|
||||
felhom.eu/website/CHANGELOG.md: …stimator v3.1: two fixes from the reviewer's browser check - **The bar is never drawn for a box smaller than 8 GB** (the smallest size the page names). With nothing or very little ticked, the „fits well" size was about 2.…
|
||||
felhom.eu/website/CHANGELOG.md: ….3 GB, where the installer's ceiling clause gave a 1.6 GB base system no real box has. Now the parts are an 8 GB box's: base system 4.0 GB, Felhom 0.5 GB, spare 3.5 GB; the empty-selection sentence uses the same split. T…
|
||||
felhom.eu/website/CHANGELOG.md: …s the recommended size. The typical figure moved into „Hogyan számol az oldal?". - **English article:** „an 8 GB machine" (the article comes from the page's own strings). - Cache versions `?v=3` for `sizing.css`, `sizing.j…
|
||||
felhom.eu/website/assets/sizing.js: …-why-line'); var typicalLine = document.getElementById('sizer-typical'); // English needs "an 8 GB machine"; the article comes from the page's strings (none in Hungarian) var article = function (gb) {…
|
||||
felhom.eu/documentation/pilot/PETI-tester-agreement.md: … point of the pilot is to prove the BYO trust boundary on someone else's box. **Peti's box:** an 80-core / 128 GB rack server already running his own workloads. The Felhom guest is capped at **12 cores / 32768 MiB** (noisy-…
|
||||
felhom.eu/documentation/pilot/RUNBOOK-peti-return-2026-07-13.md: …- The agent's node (`host.node = "proxmox"`) reports **uptime 12,663 s (~3.5 h — rebooted ~12:35Z today), 128 GB RAM, 0 guests**. - The guest's controller reports **uptime 365,289 s (~4.2 days), i5-2500, 8 GB** — the guest…
|
||||
felhom.eu/documentation/pilot/RUNBOOK-peti-return-2026-07-13.md: …Z today), 128 GB RAM, 0 guests**. - The guest's controller reports **uptime 365,289 s (~4.2 days), i5-2500, 8 GB** — the guest has been up longer than the node the agent runs on, on visibly different hardware. - ⇒ **The …
|
||||
felhom.eu/documentation/pilot/GO-LIVE-PACKAGE.md: …ssert-bring-up-only F7, `:53`-must-be-free F6), exit rights (uninstall keeps data), Peti's box facts (80c/128 GB → caps 12/32768, `sajatfelhom.hu` tunnel re-point), the byo install command, and the onboarding sequence (p…
|
||||
felhom.eu/documentation/pilot/GO-LIVE-PACKAGE.md: …**Open questions:** - G5: CPU/RAM cap values for Peti's guest — **RESOLVED: 12 cores / 32768 MiB** (his 80c/128 GB box). - G11/GL-7: the local backup TARGET on Peti's box, given `felhom-pbs` is unreachable from his LAN. **…
|
||||
felhom.eu/documentation/pilot/DRILL-GL6-2026-07-08.md: …'s broken dnsmasq (F6) was failing.) - **Dashboard live:** "Demo Ügyfél", 3 running / 56 total apps, mem 1.1/8 GB, backup "Még nem futott". - **Drive re-enrollment (CC-driven UI):** Storage → Meghajtók showed all 3 drives d…
|
||||
hits: 14
|
||||
@@ -0,0 +1,24 @@
|
||||
adventurelog 100M -> 400M
|
||||
bookstack 150M -> 200M
|
||||
calcom 200M -> 800M
|
||||
claper 100M -> 250M
|
||||
docmost 200M -> 450M
|
||||
grafana 100M -> 250M
|
||||
home-assistant 256M -> 350M
|
||||
homepage 50M -> 90M
|
||||
kimai 100M -> 200M
|
||||
komga 200M -> 450M
|
||||
mealie 200M -> 300M
|
||||
nextcloud 256M -> 350M
|
||||
outline 200M -> 300M
|
||||
paperless-ngx 500M -> 600M
|
||||
papra 256M -> 300M
|
||||
privatebin 30M -> 40M
|
||||
recipe-importer 30M -> 70M
|
||||
romm 300M -> 600M
|
||||
seerr 100M -> 200M
|
||||
tandoor 512M -> 900M
|
||||
termix 30M -> 150M
|
||||
uptime-kuma 50M -> 150M
|
||||
zipline 100M -> 200M
|
||||
README rows not matched by display name: [('recipe-importer', 'Recipe Importer')]
|
||||
@@ -0,0 +1,10 @@
|
||||
sync: 200 {'ok': True, 'data': {'ok': True, 'updated': ['adventurelog', 'bookstack', 'calcom', 'claper', 'docmost', 'grafana', 'ho
|
||||
catalog request now: mem_request: "150M"
|
||||
13:17:50 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
|
||||
13:18:56 [1] deployed, controller state=running, pinned={'uptime-kuma': 'louislam/uptime-kuma:2.5.5'}
|
||||
deploy accepted and running: True
|
||||
2026/10/17 11:17:50 deploy.go:1545: [INFO] [stacks] Memory check: total=25898MB, reserved=384MB, usable=25514MB, committed_used=3482MB, new_req=150MB, remaining=21882MB
|
||||
13:19:04 [X] stop -> 200 {'ok': True, 'message': 'Stack uptime-kuma stop completed'}
|
||||
13:19:36 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'uptime-kuma', 'volumes_removed': ['uptime-kuma_uptime_kuma_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_no
|
||||
13:19:44 [X] after remove: deployed=False leftovers='/opt/docker/stacks/uptime-kuma'
|
||||
remove: 200
|
||||
@@ -0,0 +1,3 @@
|
||||
signed in, at /launcher
|
||||
{"path": "/apps/uptime-kuma/install", "box": "Nincs elég memória ehhez az alkalmazáshoz a már telepítettek mellett: telepítés után 2798 MB kellene, a gép 2698 MB-ot tud adni. Távolíts el egy alkalmazást, amelyre nincs szükséged, vagy használj több memóriájú gépet.", "button_disabled": true, "button_title": "Nincs elég memória"}
|
||||
{"path": "/apps/uptime-kuma/install?lang=en", "box": "There is not enough memory for this app next to the apps already installed: after the install it would need 2798 MB, and the machine can give 2698 MB. Remove an app you do not need, or use a machine with more memory.", "button_disabled": true, "button_title": "Not enough memory"}
|
||||
@@ -0,0 +1,10 @@
|
||||
system:
|
||||
reserved_memory_mb: 23200
|
||||
gitea.dooplex.hu/admin/felhom-controller:0.327.0-rc.2 Up 25 seconds (healthy)
|
||||
deploy uptime-kuma (hu) -> HTTP 400: Nincs elég memória ehhez az alkalmazáshoz a már telepítettek mellett: kell 150 MB, szabad 50 MB (összesen 25898 MB, ebből 2648 MB-ot a telepített alkalmazások foglalnak, 23200 MB a rendszeré). Távolíts el egy alkalmazást, amelyre nincs szükséged, vagy használj több memóriájú gépet.
|
||||
deploy uptime-kuma (en) -> HTTP 400: There is not enough memory for this app next to the apps already installed: it needs 150 MB, 50 MB is free (25898 MB in total, 2648 MB of it held by the installed apps, 23200 MB for the system). Remove an app you do not need, or use a machine with more memory.
|
||||
2026/10/17 11:20:47 deploy.go:1545: [INFO] [stacks] Memory check: total=25898MB, reserved=23200MB, usable=2698MB, committed_used=2648MB, new_req=150MB, remaining=-100MB
|
||||
deployed after the refusals: False
|
||||
0
|
||||
Up 25 seconds (healthy)
|
||||
{"path": "/apps/uptime-kuma/install", "box": null, "button_disabled": false, "button_title": null}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 115 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 109 KiB |
@@ -0,0 +1,253 @@
|
||||
HTTP 200
|
||||
2026-10-15T19:10:30.3398641Z felhom-gates-runner(version:v0.6.1) received task 1905 of job gates, be triggered by event: push
|
||||
2026-10-15T19:10:30.3403557Z workflow prepared
|
||||
2026-10-15T19:10:30.3404412Z evaluating expression 'success()'
|
||||
2026-10-15T19:10:30.3405327Z expression 'success()' evaluated to 'true'
|
||||
2026-10-15T19:10:30.3411729Z evaluating expression ''
|
||||
2026-10-15T19:10:30.3412140Z expression '' evaluated to 'true'
|
||||
2026-10-15T19:10:30.3412297Z ⭐ Run Main Fetch the pushed commit and the sibling clone it needs
|
||||
2026-10-15T19:10:30.3417603Z Wrote command \n\n# Shallow, and pinned to the exact SHA that was pushed — not to the branch tip,\n# which can move under us if two pushes race.\nmkdir -p ws/felhom-controller\ncd ws/felhom-controller\ngit init -q .\ngit remote add origin http://gitea.gitea-system.svc.cluster.local:3000/admin/felhom-controller.git\ngit fetch -q --depth 1 origin "$GITHUB_SHA"\ngit checkout -q FETCH_HEAD\necho "checked out $(git rev-parse HEAD)"\ncd .. && git clone -q --depth 1 http://gitea.gitea-system.svc.cluster.local:3000/admin/felhom.eu.git felhom.eu\necho "sibling felhom.eu present at $(cd felhom.eu && git rev-parse --short HEAD)"\n\n\n to 'workflow/0.sh'
|
||||
2026-10-15T19:10:30.3419005Z ::group::Run # Shallow, and pinned to the exact SHA that was pushed — not to the branch tip,
|
||||
2026-10-15T19:10:30.3419433Z # Shallow, and pinned to the exact SHA that was pushed — not to the branch tip,
|
||||
2026-10-15T19:10:30.3419721Z # which can move under us if two pushes race.
|
||||
2026-10-15T19:10:30.3419944Z mkdir -p ws/felhom-controller
|
||||
2026-10-15T19:10:30.3420142Z cd ws/felhom-controller
|
||||
2026-10-15T19:10:30.3420351Z git init -q .
|
||||
2026-10-15T19:10:30.3420520Z git remote add origin http://gitea.gitea-system.svc.cluster.local:3000/admin/felhom-controller.git
|
||||
2026-10-15T19:10:30.3420654Z git fetch -q --depth 1 origin "$GITHUB_SHA"
|
||||
2026-10-15T19:10:30.3420764Z git checkout -q FETCH_HEAD
|
||||
2026-10-15T19:10:30.3420873Z echo "checked out $(git rev-parse HEAD)"
|
||||
2026-10-15T19:10:30.3420984Z cd .. && git clone -q --depth 1 http://gitea.gitea-system.svc.cluster.local:3000/admin/felhom.eu.git felhom.eu
|
||||
2026-10-15T19:10:30.3421118Z echo "sibling felhom.eu present at $(cd felhom.eu && git rev-parse --short HEAD)"
|
||||
2026-10-15T19:10:30.3421280Z shell: bash --noprofile --norc -e -o pipefail {0}
|
||||
2026-10-15T19:10:30.3421511Z ::endgroup::
|
||||
2026-10-15T19:10:33.9073828Z checked out c6a567122ecc7b03087a5eeb22b1e295209ef9d9
|
||||
2026-10-15T19:10:57.2946446Z sibling felhom.eu present at 22cd7c5
|
||||
2026-10-15T19:10:57.2961701Z ::group::Run cd ws/felhom-controller/controller && python3 scripts/controller_gates.py --fast
|
||||
2026-10-15T19:10:57.2962152Z cd ws/felhom-controller/controller && python3 scripts/controller_gates.py --fast
|
||||
2026-10-15T19:10:57.2962412Z shell: bash --noprofile --norc -e -o pipefail {0}
|
||||
2026-10-15T19:10:57.2962691Z ::endgroup::
|
||||
2026-10-15T19:10:57.4804777Z controller_gates — 18 gate(s) [--fast]
|
||||
2026-10-15T19:10:57.4828459Z WARNING: this clone is UNARMED — core.hooksPath is unset, so the pre-push hook will not
|
||||
2026-10-15T19:10:57.4829041Z run here. Switch it on once with: git config core.hooksPath .githooks
|
||||
2026-10-15T19:10:57.4829352Z
|
||||
2026-10-15T19:10:57.4829559Z ==============================================================================
|
||||
2026-10-15T19:10:57.4829796Z == gate: template-id (template_id_gate.py)
|
||||
2026-10-15T19:10:57.4830034Z ==============================================================================
|
||||
2026-10-15T19:10:57.6070984Z integrity gate OK — every JS element-ID reference resolves in the page it renders on
|
||||
2026-10-15T19:10:57.6640434Z
|
||||
2026-10-15T19:10:57.6641448Z ==============================================================================
|
||||
2026-10-15T19:10:57.6641751Z == gate: emoji (emoji_gate.py)
|
||||
2026-10-15T19:10:57.6641996Z ==============================================================================
|
||||
2026-10-15T19:11:02.1616134Z emoji gate OK — no emoji in web templates
|
||||
2026-10-15T19:11:02.1761407Z
|
||||
2026-10-15T19:11:02.1762107Z ==============================================================================
|
||||
2026-10-15T19:11:02.1762413Z == gate: native-confirm (native_confirm_gate.py)
|
||||
2026-10-15T19:11:02.1762653Z ==============================================================================
|
||||
2026-10-15T19:11:02.4815590Z native-confirm gate OK — no native confirm()/prompt()/alert() in templates
|
||||
2026-10-15T19:11:02.4900567Z
|
||||
2026-10-15T19:11:02.4901273Z ==============================================================================
|
||||
2026-10-15T19:11:02.4901736Z == gate: offbox-rename (offbox_rename_gate.py)
|
||||
2026-10-15T19:11:02.4902038Z ==============================================================================
|
||||
2026-10-15T19:11:02.6668110Z offbox rename gate OK — Tier-3 is 'Tavoli mentes' everywhere customer-facing (26 file(s) + 129 bundle value(s) named by them)
|
||||
2026-10-15T19:11:02.6772354Z
|
||||
2026-10-15T19:11:02.6772904Z ==============================================================================
|
||||
2026-10-15T19:11:02.6773218Z == gate: app-row-dedup (app_row_dedup_gate.py)
|
||||
2026-10-15T19:11:02.6773479Z ==============================================================================
|
||||
2026-10-15T19:11:02.7727350Z app_row_dedup_gate: OK (row markup single-sourced in app_row.html; 44 templates scanned)
|
||||
2026-10-15T19:11:02.7789277Z
|
||||
2026-10-15T19:11:02.7789756Z ==============================================================================
|
||||
2026-10-15T19:11:02.7789944Z == gate: mojibake (mojibake_gate.py)
|
||||
2026-10-15T19:11:02.7790120Z ==============================================================================
|
||||
2026-10-15T19:11:04.7585835Z mojibake_gate: OK (1141 files clean — no double-encoding signatures)
|
||||
2026-10-15T19:11:04.7626742Z
|
||||
2026-10-15T19:11:04.7627328Z ==============================================================================
|
||||
2026-10-15T19:11:04.7627700Z == gate: docker-v (docker_run_volume_path_gate.py)
|
||||
2026-10-15T19:11:04.7627945Z ==============================================================================
|
||||
2026-10-15T19:11:05.0625636Z docker -v gate OK — every volume mount is named-volume or proven host-visible
|
||||
2026-10-15T19:11:05.0700096Z
|
||||
2026-10-15T19:11:05.0701336Z ==============================================================================
|
||||
2026-10-15T19:11:05.0701689Z == gate: secret-markup (secret_in_markup_gate.py)
|
||||
2026-10-15T19:11:05.0701932Z ==============================================================================
|
||||
2026-10-15T19:11:05.2648228Z secret-in-markup gate OK — 44 templates, no secret-named expression rendered
|
||||
2026-10-15T19:11:05.2648829Z (NAME-BASED: blind to a secret arriving under a neutral PAGE-DATA key — see the docstring)
|
||||
2026-10-15T19:11:05.2707803Z
|
||||
2026-10-15T19:11:05.2708204Z ==============================================================================
|
||||
2026-10-15T19:11:05.2708534Z == gate: retrieval-promise (retrieval_promise_gate.py)
|
||||
2026-10-15T19:11:05.2708775Z ==============================================================================
|
||||
2026-10-15T19:11:05.6598722Z retrieval-promise gate OK — 45 surface(s) incl. 1 Go handler file(s), 18 registered claim(s) + 16 English, none unregistered
|
||||
2026-10-15T19:11:05.6600522Z (BLIND SPOT: it registers WHERE the claim is made, not whether each conditional is wired
|
||||
2026-10-15T19:11:05.6601085Z to a true predicate — that is what the R-302 render tests are for.)
|
||||
2026-10-15T19:11:05.6683288Z
|
||||
2026-10-15T19:11:05.6683851Z ==============================================================================
|
||||
2026-10-15T19:11:05.6684231Z == gate: debug-routes (debug_route_gate.py)
|
||||
2026-10-15T19:11:05.6684540Z ==============================================================================
|
||||
2026-10-15T19:11:05.7031014Z debug route gate OK - 19 referenced address(es), all dispatched, none orphaned
|
||||
2026-10-15T19:11:05.7080060Z
|
||||
2026-10-15T19:11:05.7080826Z ==============================================================================
|
||||
2026-10-15T19:11:05.7081168Z == gate: reuse-refs (reuse_refs_check.py /root/.cache/act/2ea1ebbc85faa62f/hostexecutor/ws/felhom-controller)
|
||||
2026-10-15T19:11:05.7081576Z ==============================================================================
|
||||
2026-10-15T19:11:05.8052080Z note [felhom-controller] line 15: backup/appbackup_bridge.go (resolved by suffix → controller/internal/backup/appbackup_bridge.go)
|
||||
2026-10-15T19:11:05.8053453Z note [felhom-controller] line 19: appbackup/userdata.go (resolved by suffix → controller/internal/appbackup/userdata.go)
|
||||
2026-10-15T19:11:05.8054847Z note [felhom-controller] line 19: stacks/skeleton_derive.go (resolved by suffix → controller/internal/stacks/skeleton_derive.go)
|
||||
2026-10-15T19:11:05.8069340Z note [felhom-controller] line 64: internal/report/builder.go (resolved by suffix → controller/internal/report/builder.go)
|
||||
2026-10-15T19:11:05.8083852Z note [felhom-controller] line 95: stacks/deploy.go (resolved by suffix → controller/internal/stacks/deploy.go)
|
||||
2026-10-15T19:11:05.8596209Z note [felhom-controller] line 155: cmd/controller/main.go (resolved by suffix → controller/cmd/controller/main.go)
|
||||
2026-10-15T19:11:05.8618633Z note [felhom-controller] line 172: internal/selfupdate/updater.go (resolved by suffix → controller/internal/selfupdate/updater.go)
|
||||
2026-10-15T19:11:05.8629227Z note [felhom-controller] line 180: appbackup/appdata.go (resolved by suffix → controller/internal/appbackup/appdata.go)
|
||||
2026-10-15T19:11:05.8651344Z note [felhom-controller] line 206: scripts/secret_in_markup_gate.py (resolved by suffix → controller/scripts/secret_in_markup_gate.py)
|
||||
2026-10-15T19:11:06.1091820Z note [felhom-controller] line 248: hub/internal/api/handler.go (cross-repo → felhom.eu/hub/internal/api/handler.go)
|
||||
2026-10-15T19:11:06.1092717Z note [felhom-controller] line 248: hub/internal/notify/dispatcher.go (cross-repo → felhom.eu/hub/internal/notify/dispatcher.go)
|
||||
2026-10-15T19:11:06.1572023Z note [felhom-controller] line 265: monitor/deadline.go (cross-repo (suffix) → felhom.eu/hub/internal/monitor/deadline.go)
|
||||
2026-10-15T19:11:06.1588594Z note [felhom-controller] line 308: wgsync/reconciler.go (cross-repo (suffix) → felhom.eu/hub/internal/wgsync/reconciler.go)
|
||||
2026-10-15T19:11:06.1590698Z note [felhom-controller] line 313: templates/app_shell.html (resolved by suffix → controller/internal/web/templates/app_shell.html)
|
||||
2026-10-15T19:11:06.1606039Z note [felhom-controller] line 349: api/router.go (resolved by suffix → controller/internal/api/router.go)
|
||||
2026-10-15T19:11:06.1616777Z note [felhom-controller] line 366: cmd/controller/r856_wiring_test.go (resolved by suffix → controller/cmd/controller/r856_wiring_test.go)
|
||||
2026-10-15T19:11:06.1622518Z note [felhom-controller] line 375: web/netprobe.go (resolved by suffix → controller/internal/web/netprobe.go)
|
||||
2026-10-15T19:11:06.1623020Z note [felhom-controller] line 375: web/server.go (resolved by suffix → controller/internal/web/server.go)
|
||||
2026-10-15T19:11:06.1630340Z note [felhom-controller] line 399: felhom.eu/scripts/golden_currency_gate.py (cross-repo → felhom.eu/scripts/golden_currency_gate.py)
|
||||
2026-10-15T19:11:06.1641615Z OK [felhom-controller]: 225 cited paths — exact 206, suffix 14, ambiguous 0, cross-repo 5, FAILED 0 (siblings searched: felhom.eu)
|
||||
2026-10-15T19:11:06.1746703Z
|
||||
2026-10-15T19:11:06.1747665Z ==============================================================================
|
||||
2026-10-15T19:11:06.1747818Z == gate: instructions (instructions_gate.py /root/.cache/act/2ea1ebbc85faa62f/hostexecutor/ws/felhom-controller)
|
||||
2026-10-15T19:11:06.1748020Z ==============================================================================
|
||||
2026-10-15T19:11:06.2834261Z instructions_gate: /root/.cache/act/2ea1ebbc85faa62f/hostexecutor/ws/felhom-controller
|
||||
2026-10-15T19:11:06.7009123Z CLAUDE.md effective lines : 92 (ceiling 200)
|
||||
2026-10-15T19:11:06.7010071Z version literals : 0
|
||||
2026-10-15T19:11:06.7010375Z TEMPORARY blocks : 0
|
||||
2026-10-15T19:11:06.7010747Z rule files : 5 (4 path-scoped)
|
||||
2026-10-15T19:11:06.7011147Z workspace copy : n/a (not this workspace)
|
||||
2026-10-15T19:11:06.7011345Z 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-15T19:11:06.7011611Z register citations : 12 cited, 1043 register items known
|
||||
2026-10-15T19:11:06.7011828Z
|
||||
2026-10-15T19:11:06.7012139Z instructions_gate: OK
|
||||
2026-10-15T19:11:06.7612490Z
|
||||
2026-10-15T19:11:06.7613133Z ==============================================================================
|
||||
2026-10-15T19:11:06.7613667Z == gate: observations (observations_gate.py /root/.cache/act/2ea1ebbc85faa62f/hostexecutor/ws/felhom-controller)
|
||||
2026-10-15T19:11:06.7614115Z ==============================================================================
|
||||
2026-10-15T19:11:06.7998287Z OBSERVATIONS GATE INCONCLUSIVE: found the section '## 11. Observations' but no numbered items under it.
|
||||
2026-10-15T19:11:06.7999001Z Items must be a numbered list (`1.`, `2.` …). If the section is deliberately empty, remove the heading — an empty section reads as coverage while providing none.
|
||||
2026-10-15T19:11:06.8567718Z
|
||||
2026-10-15T19:11:06.8568458Z ==============================================================================
|
||||
2026-10-15T19:11:06.8569170Z == gate: minagent-header (minagent_header_gate.py)
|
||||
2026-10-15T19:11:06.8569456Z ==============================================================================
|
||||
2026-10-15T19:11:06.9049987Z minagent header gate OK — v0.316.4 declares MinAgent 0.155.0
|
||||
2026-10-15T19:11:06.9621200Z
|
||||
2026-10-15T19:11:06.9621876Z ==============================================================================
|
||||
2026-10-15T19:11:06.9622372Z == gate: i18n (i18n_missing_gate.py)
|
||||
2026-10-15T19:11:06.9622629Z ==============================================================================
|
||||
2026-10-15T19:11:09.3988878Z i18n: 2037 markers in 44 templates; hu 2723 keys, en 2735 keys
|
||||
2026-10-15T19:11:09.3989756Z i18n: English missing 0 (ceiling 0); Hungarian formal forms 0 (ceiling 0, R-516)
|
||||
2026-10-15T19:11:09.3990304Z i18n gate OK
|
||||
2026-10-15T19:11:09.4071499Z
|
||||
2026-10-15T19:11:09.4072121Z ==============================================================================
|
||||
2026-10-15T19:11:09.4072536Z == gate: go-parity (i18n_go_parity.py)
|
||||
2026-10-15T19:11:09.4072745Z ==============================================================================
|
||||
2026-10-15T19:11:18.8584741Z go-parity: base capture 736f54b49610 (7467 literals), 776 slice-2 keys listed, 250 pre-existing, 759 named in Go, 568 helper calls judged for arity
|
||||
2026-10-15T19:11:18.8585604Z go-parity gate OK: every Go-side key carries base-commit text, byte for byte, and every judged call passes as many arguments as its message has verbs.
|
||||
2026-10-15T19:11:18.8716251Z
|
||||
2026-10-15T19:11:18.8716709Z ==============================================================================
|
||||
2026-10-15T19:11:18.8716976Z == gate: gofmt (gofmt_gate.py)
|
||||
2026-10-15T19:11:18.8717404Z ==============================================================================
|
||||
2026-10-15T19:11:18.9850789Z gofmt gate NOT CHECKED in CI: no Go toolchain on the runner — the pre-push hook (with Go) enforces it
|
||||
2026-10-15T19:11:18.9953671Z
|
||||
2026-10-15T19:11:18.9954189Z ==============================================================================
|
||||
2026-10-15T19:11:18.9954467Z == gate: golden-notice (golden_notice.py /root/.cache/act/2ea1ebbc85faa62f/hostexecutor/ws/felhom-controller)
|
||||
2026-10-15T19:11:18.9954746Z ==============================================================================
|
||||
2026-10-15T19:11:19.1961208Z ==============================================================================
|
||||
2026-10-15T19:11:19.1961851Z NOTICE — v0.316.4 OWES A GOLDEN. (this NEVER blocks; see the docstring)
|
||||
2026-10-15T19:11:19.1962044Z ==============================================================================
|
||||
2026-10-15T19:11:19.1962170Z newest released controller : 0.316.4 (this repo's CHANGELOG.md)
|
||||
2026-10-15T19:11:19.1962565Z newest golden baked : 0.313.0 (felhom.eu documentation/tests/)
|
||||
2026-10-15T19:11:19.1962913Z
|
||||
2026-10-15T19:11:19.1963110Z A machine installed right now would receive 0.313.0, not 0.316.4.
|
||||
2026-10-15T19:11:19.1963355Z
|
||||
2026-10-15T19:11:19.1963681Z This is a REMINDER AT THE ONE MOMENT IT IS USEFUL — you are in the repo where the
|
||||
2026-10-15T19:11:19.1963991Z release happens. It does not block, and must not: at the moment a release is
|
||||
2026-10-15T19:11:19.1964398Z committed the golden cannot exist yet.
|
||||
2026-10-15T19:11:19.1964822Z
|
||||
2026-10-15T19:11:19.1965103Z WHAT CLEARS IT: bake a golden (felhom.eu documentation/runbooks/RUNBOOK-manual-build.md
|
||||
2026-10-15T19:11:19.1965469Z section 4.1), then vouch it — a THREE-field change: golden_version + agent_version +
|
||||
2026-10-15T19:11:19.1965773Z min_agent. The bake record lands in felhom.eu documentation/tests/golden-<ver>-<date>/.
|
||||
2026-10-15T19:11:19.1966124Z
|
||||
2026-10-15T19:11:19.1966347Z If this release deliberately needs no golden, record a waiver row in
|
||||
2026-10-15T19:11:19.1966587Z felhom.eu documentation/backlog/OPEN-ITEMS.md — never a habit of bypassing.
|
||||
2026-10-15T19:11:19.1966940Z ==============================================================================
|
||||
2026-10-15T19:11:19.2037655Z
|
||||
2026-10-15T19:11:19.2038147Z ==============================================================================
|
||||
2026-10-15T19:11:19.2038472Z == summary
|
||||
2026-10-15T19:11:19.2038770Z ==============================================================================
|
||||
2026-10-15T19:11:19.2039149Z template-id OK (exit 0)
|
||||
2026-10-15T19:11:19.2039385Z emoji OK (exit 0)
|
||||
2026-10-15T19:11:19.2039596Z native-confirm OK (exit 0)
|
||||
2026-10-15T19:11:19.2039806Z offbox-rename OK (exit 0)
|
||||
2026-10-15T19:11:19.2040031Z app-row-dedup OK (exit 0)
|
||||
2026-10-15T19:11:19.2040304Z mojibake OK (exit 0)
|
||||
2026-10-15T19:11:19.2040572Z docker-v OK (exit 0)
|
||||
2026-10-15T19:11:19.2040861Z secret-markup OK (exit 0)
|
||||
2026-10-15T19:11:19.2041116Z retrieval-promise OK (exit 0)
|
||||
2026-10-15T19:11:19.2041427Z debug-routes OK (exit 0)
|
||||
2026-10-15T19:11:19.2041629Z reuse-refs OK (exit 0)
|
||||
2026-10-15T19:11:19.2041831Z instructions OK (exit 0)
|
||||
2026-10-15T19:11:19.2042099Z observations INCONCLUSIVE (exit 2)
|
||||
2026-10-15T19:11:19.2042306Z minagent-header OK (exit 0)
|
||||
2026-10-15T19:11:19.2042516Z i18n OK (exit 0)
|
||||
2026-10-15T19:11:19.2042718Z go-parity OK (exit 0)
|
||||
2026-10-15T19:11:19.2043032Z gofmt OK (exit 0)
|
||||
2026-10-15T19:11:19.2043253Z golden-notice ADVISORY (exit 0, advisory)
|
||||
2026-10-15T19:11:19.2043466Z UNDETERMINED (never a pass): observations
|
||||
2026-10-15T19:11:19.2692235Z ❌ Failure - Main Run the gate entry point
|
||||
2026-10-15T19:11:19.2696371Z exit status 2
|
||||
2026-10-15T19:11:19.2703703Z ::group::Run python3 - <<'PY'
|
||||
2026-10-15T19:11:19.2703933Z python3 - <<'PY'
|
||||
2026-10-15T19:11:19.2704056Z import json, os, sys, urllib.request, urllib.error
|
||||
2026-10-15T19:11:19.2704183Z
|
||||
2026-10-15T19:11:19.2704291Z key = os.environ.get("RESEND_API_KEY", "")
|
||||
2026-10-15T19:11:19.2704407Z if not key:
|
||||
2026-10-15T19:11:19.2704525Z sys.exit("ALARM FAILED: RESEND_API_KEY is empty — the alarm cannot be sent, and a "
|
||||
2026-10-15T19:11:19.2704665Z "silent alarm is worse than none. Set the user-level Actions secret.")
|
||||
2026-10-15T19:11:19.2704824Z
|
||||
2026-10-15T19:11:19.2704935Z repo = os.environ.get("GITHUB_REPOSITORY", "?")
|
||||
2026-10-15T19:11:19.2705064Z sha = os.environ.get("GITHUB_SHA", "?")
|
||||
2026-10-15T19:11:19.2705177Z run = os.environ.get("GITHUB_RUN_NUMBER", "?")
|
||||
2026-10-15T19:11:19.2705295Z srv = os.environ.get("GITHUB_SERVER_URL", "https://gitea.dooplex.hu")
|
||||
2026-10-15T19:11:19.2705578Z
|
||||
2026-10-15T19:11:19.2705680Z body = json.dumps({
|
||||
2026-10-15T19:11:19.2705801Z "from": "Felhom CI <monitoring@felhom.eu>",
|
||||
2026-10-15T19:11:19.2705919Z "to": ["admin@felhom.eu"],
|
||||
2026-10-15T19:11:19.2706064Z "subject": "[felhom CI] gates FAILED in %s" % repo,
|
||||
2026-10-15T19:11:19.2706179Z "text": (
|
||||
2026-10-15T19:11:19.2706283Z "The gate entry point exited non-zero.\n\n"
|
||||
2026-10-15T19:11:19.2706440Z "Repository : %s\n"
|
||||
2026-10-15T19:11:19.2706554Z "Commit : %s\n"
|
||||
2026-10-15T19:11:19.2706656Z "Run : %s/%s/actions/runs/%s\n\n"
|
||||
2026-10-15T19:11:19.2706768Z "The failing gate names itself in the run log.\n\n"
|
||||
2026-10-15T19:11:19.2706916Z "If the local pre-push hook was GREEN for this commit, then CI and the hook\n"
|
||||
2026-10-15T19:11:19.2707056Z "disagree - that is a finding about the gates themselves, not about CI, and it\n"
|
||||
2026-10-15T19:11:19.2707185Z "outranks whatever the push was for.\n"
|
||||
2026-10-15T19:11:19.2707336Z ) % (repo, sha, srv, repo, run),
|
||||
2026-10-15T19:11:19.2707464Z }).encode()
|
||||
2026-10-15T19:11:19.2707572Z
|
||||
2026-10-15T19:11:19.2707665Z req = urllib.request.Request(
|
||||
2026-10-15T19:11:19.2707812Z "https://api.resend.com/emails", data=body, method="POST",
|
||||
2026-10-15T19:11:19.2707931Z headers={"Authorization": "Bearer %s" % key,
|
||||
2026-10-15T19:11:19.2708064Z "Content-Type": "application/json",
|
||||
2026-10-15T19:11:19.2708188Z # Cloudflare fronts api.resend.com and BLOCKS the default
|
||||
2026-10-15T19:11:19.2708401Z # "Python-urllib/3.x" agent with its own 403 (error 1010) — which looks
|
||||
2026-10-15T19:11:19.2708540Z # exactly like an auth failure and is not one. Measured 2026-08-02.
|
||||
2026-10-15T19:11:19.2708683Z "User-Agent": "felhom-ci/1.0"})
|
||||
2026-10-15T19:11:19.2708803Z try:
|
||||
2026-10-15T19:11:19.2708905Z with urllib.request.urlopen(req, timeout=30) as r:
|
||||
2026-10-15T19:11:19.2709020Z print("RESEND-ACCEPTED id=%s" % json.load(r)["id"])
|
||||
2026-10-15T19:11:19.2709145Z except urllib.error.HTTPError as e:
|
||||
2026-10-15T19:11:19.2709269Z sys.exit("ALARM FAILED: Resend returned HTTP %s: %s" % (e.code, e.read().decode()[:300]))
|
||||
2026-10-15T19:11:19.2709400Z PY
|
||||
2026-10-15T19:11:19.2709500Z shell: bash --noprofile --norc -e -o pipefail {0}
|
||||
2026-10-15T19:11:19.2709642Z env:
|
||||
2026-10-15T19:11:19.2709760Z RESEND_API_KEY: ***
|
||||
2026-10-15T19:11:19.2709880Z ::endgroup::
|
||||
2026-10-15T19:11:19.8780239Z RESEND-ACCEPTED id=01a140f9-ded0-7a0b-ad19-53d6c4fc4a0c
|
||||
2026-10-15T19:11:19.8965187Z Cleaning up container for job gates
|
||||
2026-10-15T19:11:20.7610786Z 🏁 Job failed
|
||||
2026-10-15T19:11:20.7611786Z Job 'gates' failed
|
||||
|
||||
@@ -0,0 +1,492 @@
|
||||
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
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
Removed '/etc/systemd/system/multi-user.target.wants/mnt-media_a.mount'.
|
||||
removed '/etc/systemd/system/mnt-media_a.mount'
|
||||
Removed '/etc/systemd/system/multi-user.target.wants/mnt-media_b.mount'.
|
||||
removed '/etc/systemd/system/mnt-media_b.mount'
|
||||
Removed '/etc/systemd/system/multi-user.target.wants/mnt-media_c.mount'.
|
||||
removed '/etc/systemd/system/mnt-media_c.mount'
|
||||
Removed '/etc/systemd/system/multi-user.target.wants/mnt-media_d.mount'.
|
||||
removed '/etc/systemd/system/mnt-media_d.mount'
|
||||
== after
|
||||
mnt-adatlemez.mount loaded active mounted Felhom storage mount 863c67fd-3e21-4d9f-9a74-3c5fa406f2a2
|
||||
mnt-felhom\x2ddrives-adatlemez.mount loaded active mounted /mnt/felhom-drives/adatlemez
|
||||
mnt-felhom\x2ddrives.mount loaded active mounted /mnt/felhom-drives
|
||||
0
|
||||
/mnt/media_a
|
||||
/mnt/media_b
|
||||
/mnt/media_c
|
||||
/mnt/media_d
|
||||
== agent warnings since
|
||||
Oct 17 13:40:17 felhom felhom-agent[1278]: time=2026-10-17T13:40:17.706+02:00 level=INFO msg="storage: enrolled drive absent by UUID — not re-asserting (will retry when it enumerates)" name=8a31a462-ff15-4be2-9aeb-9620b99c7f77 where=/mnt/media_d uuid=8a31a462-ff15-4be2-9aeb-9620b99c7f77
|
||||
Oct 17 13:40:37 felhom felhom-agent[1278]: time=2026-10-17T13:40:37.704+02:00 level=INFO msg="storage: enrolled drive absent by UUID — not re-asserting (will retry when it enumerates)" name=4ebfd36d-87d3-4b63-839e-a5a710fc799a where=/mnt/media_a uuid=4ebfd36d-87d3-4b63-839e-a5a710fc799a
|
||||
Oct 17 13:40:37 felhom felhom-agent[1278]: time=2026-10-17T13:40:37.705+02:00 level=INFO msg="storage: enrolled drive absent by UUID — not re-asserting (will retry when it enumerates)" name=e15652d5-0aa7-4eb8-93a1-afb2839d527c where=/mnt/media_b uuid=e15652d5-0aa7-4eb8-93a1-afb2839d527c
|
||||
Oct 17 13:40:37 felhom felhom-agent[1278]: time=2026-10-17T13:40:37.705+02:00 level=INFO msg="storage: enrolled drive absent by UUID — not re-asserting (will retry when it enumerates)" name=86f33f9c-1022-43d8-95eb-f9a6ec9eb923 where=/mnt/media_c uuid=86f33f9c-1022-43d8-95eb-f9a6ec9eb923
|
||||
Oct 17 13:40:37 felhom felhom-agent[1278]: time=2026-10-17T13:40:37.705+02:00 level=INFO msg="storage: enrolled drive absent by UUID — not re-asserting (will retry when it enumerates)" name=8a31a462-ff15-4be2-9aeb-9620b99c7f77 where=/mnt/media_d uuid=8a31a462-ff15-4be2-9aeb-9620b99c7f77
|
||||
11:41:53
|
||||
unit files: 0
|
||||
units known: 0
|
||||
@@ -0,0 +1,28 @@
|
||||
== before
|
||||
mnt-adatlemez.mount loaded active mounted Felhom storage mount 863c67fd-3e21-4d9f-9a74-3c5fa406f2a2
|
||||
mnt-felhom\x2ddrives-adatlemez.mount loaded active mounted /mnt/felhom-drives/adatlemez
|
||||
mnt-felhom\x2ddrives.mount loaded active mounted /mnt/felhom-drives
|
||||
mnt-media_a.mount loaded inactive dead Felhom storage mount 4ebfd36d-87d3-4b63-839e-a5a710fc799a
|
||||
mnt-media_b.mount loaded inactive dead Felhom storage mount e15652d5-0aa7-4eb8-93a1-afb2839d527c
|
||||
mnt-media_c.mount loaded inactive dead Felhom storage mount 86f33f9c-1022-43d8-95eb-f9a6ec9eb923
|
||||
mnt-media_d.mount loaded inactive dead Felhom storage mount 8a31a462-ff15-4be2-9aeb-9620b99c7f77
|
||||
== /etc/systemd/system/mnt-media_a.mount
|
||||
# Managed by felhom-agent — do not edit by hand.
|
||||
[Unit]
|
||||
What=/dev/disk/by-uuid/4ebfd36d-87d3-4b63-839e-a5a710fc799a
|
||||
Where=/mnt/media_a
|
||||
== /etc/systemd/system/mnt-media_b.mount
|
||||
# Managed by felhom-agent — do not edit by hand.
|
||||
[Unit]
|
||||
What=/dev/disk/by-uuid/e15652d5-0aa7-4eb8-93a1-afb2839d527c
|
||||
Where=/mnt/media_b
|
||||
== /etc/systemd/system/mnt-media_c.mount
|
||||
# Managed by felhom-agent — do not edit by hand.
|
||||
[Unit]
|
||||
What=/dev/disk/by-uuid/86f33f9c-1022-43d8-95eb-f9a6ec9eb923
|
||||
Where=/mnt/media_c
|
||||
== /etc/systemd/system/mnt-media_d.mount
|
||||
# Managed by felhom-agent — do not edit by hand.
|
||||
[Unit]
|
||||
What=/dev/disk/by-uuid/8a31a462-ff15-4be2-9aeb-9620b99c7f77
|
||||
Where=/mnt/media_d
|
||||
@@ -0,0 +1,3 @@
|
||||
--- FAIL: TestR1125_NotEnoughMemorySaysWhatToDo (0.01s)
|
||||
r553_deploy_error_kinds_test.go:175: hu: the refusal does not say "a már telepítettek mellett": "Nincs elég memória az alkalmazás telepítéséhez. Szükséges: 600 MB, Elérhető: 200 MB (összesen: 3712 MB, ebből 3310 MB használt, 384 MB rendszer számára fenntartva)"
|
||||
r553_deploy_error_kinds_test.go:175: hu: the refusal does not say "kell 600 MB": "Nincs elég memória az alkalmazás telepítéséhez. Szükséges: 600 MB, Elérhető: 200 MB (összesen: 3712 MB, ebből 3310 MB használt, 384 MB rendszer számára fenntartva)"
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
--- FAIL: TestR1125_InstallMemoryIsTheChecksReading (0.00s)
|
||||
r1125_install_memory_test.go:46: the install page must read memory through InstallMemory, the check's own reading:
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
--- FAIL: TestFileBrowserRender_R1126_NotPublicAtStart (0.00s)
|
||||
infra_test.go:268: FileBrowser must carry no Traefik labels (the route is the file route by name):
|
||||
@@ -0,0 +1,4 @@
|
||||
--- FAIL: TestFileBrowserRender_R1126_NotPublicAtStart (0.00s)
|
||||
infra_test.go:260: FileBrowser starts on traefik-public — it would be served before its default login is checked:
|
||||
--- FAIL: TestFileBrowserGate_PublishedOnlyAfterTheCheck (0.01s)
|
||||
filebrowser_password_test.go:283: published while this run's default login was never checked
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
--- FAIL: TestFileBrowserGate_ConnectsTheCheckedContainerById (0.00s)
|
||||
filebrowser_password_test.go:317: the checked container must be published by its id, got [felhom-controller@felhom-filebrowser filebrowser@traefik-public]
|
||||
@@ -0,0 +1,48 @@
|
||||
=== hp (enkisfelhom.hu)
|
||||
containers: 24 not healthy/running: none
|
||||
2026/10/17 11:43:48 updater.go:855: [INFO] [selfupdate] Post-update startup: update successful (0.326.0 → 0.327.0)
|
||||
2026/10/17 11:43:49 filebrowser_gate.go:68: [INFO] [infra] connected felhom-controller to felhom-filebrowser (the FileBrowser default-login check, R-1126)
|
||||
2026/10/17 11:43:55 filebrowser_gate.go:94: [INFO] [infra] filebrowser: default login refused for this run — joined traefik-public, files.<domain> served (R-1126)
|
||||
filebrowser networks: felhom-filebrowser traefik-public
|
||||
via traefik: page 000, default login 000
|
||||
public https://files.enkisfelhom.hu/: page 000, default login 000
|
||||
public https://felhom.enkisfelhom.hu/login: 200
|
||||
=== felhom-pve (demo-felhom.eu)
|
||||
containers: 9 not healthy/running: none
|
||||
2026/10/17 11:43:38 [INFO] [selfupdate] Post-update startup: update successful (0.326.0 → 0.327.0)
|
||||
2026/10/17 11:43:38 [INFO] [infra] connected felhom-controller to felhom-filebrowser (the FileBrowser default-login check, R-1126)
|
||||
2026/10/17 11:43:44 [INFO] [infra] filebrowser: default login refused for this run — joined traefik-public, files.<domain> served (R-1126)
|
||||
filebrowser networks: felhom-filebrowser traefik-public
|
||||
via traefik: page 000, default login 000
|
||||
public https://files.demo-felhom.eu/: page 000, default login 000
|
||||
public https://felhom.demo-felhom.eu/login: 200
|
||||
=== -J hp root@192.168.0.154 (enkicsifelhom.hu)
|
||||
containers: 10 not healthy/running: none
|
||||
2026/10/17 11:43:47 [INFO] [selfupdate] Post-update startup: update successful (0.326.0 → 0.327.0)
|
||||
2026/10/17 11:43:48 [INFO] [infra] connected felhom-controller to felhom-filebrowser (the FileBrowser default-login check, R-1126)
|
||||
2026/10/17 11:43:53 [INFO] [infra] filebrowser: default login refused for this run — joined traefik-public, files.<domain> served (R-1126)
|
||||
filebrowser networks: felhom-filebrowser traefik-public
|
||||
via traefik: page 200, default login 401
|
||||
public https://files.enkicsifelhom.hu/: page 200, default login 401
|
||||
public https://felhom.enkicsifelhom.hu/login: 200
|
||||
#### 0.327.1 box walk
|
||||
=== hp (enkisfelhom.hu)
|
||||
containers: 24 not healthy/running: none
|
||||
2026/10/17 12:04:56 updater.go:855: [INFO] [selfupdate] Post-update startup: update successful (0.327.1-rc.1 → 0.327.1)
|
||||
via traefik: page 200, default login 401
|
||||
public https://files.enkisfelhom.hu/: page 200, default login 401
|
||||
public https://felhom.enkisfelhom.hu/login: 200
|
||||
=== felhom-pve (demo-felhom.eu)
|
||||
containers: 9 not healthy/running: none
|
||||
2026/10/17 12:04:45 [INFO] [selfupdate] Post-update startup: update successful (0.327.0 → 0.327.1)
|
||||
2026/10/17 12:04:52 [INFO] [infra] filebrowser: default login refused for this run — joined traefik-public, files.<domain> served (R-1126)
|
||||
via traefik: page 200, default login 401
|
||||
public https://files.demo-felhom.eu/: page 200, default login 401
|
||||
public https://felhom.demo-felhom.eu/login: 200
|
||||
=== -J hp root@192.168.0.154 (enkicsifelhom.hu)
|
||||
containers: 10 not healthy/running: none
|
||||
2026/10/17 12:04:55 [INFO] [selfupdate] Post-update startup: update successful (0.327.0 → 0.327.1)
|
||||
2026/10/17 12:05:01 [INFO] [infra] filebrowser: default login refused for this run — joined traefik-public, files.<domain> served (R-1126)
|
||||
via traefik: page 200, default login 401
|
||||
public https://files.enkicsifelhom.hu/: page 200, default login 401
|
||||
public https://felhom.enkicsifelhom.hu/login: 200
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
integrity: ok
|
||||
('min_controller_version', '0.327.1')
|
||||
('min_controller_version_declared_min_agent', '0.327.1=0.158.1')
|
||||
per-box floors still set: []
|
||||
@@ -0,0 +1,5 @@
|
||||
global floor 2026-10-17T12:06:54Z: HTTP/1.1 303 See Other Location: /configuration?flash=floor_set
|
||||
clear per-box tester-1: HTTP/1.1 303 See Other Location: /customers/tester-1?flash=floor_set
|
||||
clear per-box demo-hp: HTTP/1.1 303 See Other Location: /customers/demo-hp?flash=floor_set
|
||||
clear per-box demo-felhom: HTTP/1.1 303 See Other Location: /customers/demo-felhom?flash=floor_set
|
||||
hub /configuration page: 5 0.158.1 3 0.327.1
|
||||
@@ -0,0 +1,33 @@
|
||||
control NEGATIVE (a stub answering 200 over plain http): convicted, as it must (200 -)
|
||||
== tester-1 (enkicsifelhom.hu): 6 public name(s)
|
||||
OK control POSITIVE http://felhom.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://felhom.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://files.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://files.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://no-such-name-r1033.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://no-such-name-r1033.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://paperless.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://paperless.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://paste.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://paste.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://wiki.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://wiki.enkicsifelhom.hu/r1033-check?q=1
|
||||
== demo-hp (enkisfelhom.hu): 14 public name(s)
|
||||
OK http://arcade.enkisfelhom.hu/r1033-check?q=1 -> 301 https://arcade.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://books.enkisfelhom.hu/r1033-check?q=1 -> 301 https://books.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://docs.enkisfelhom.hu/r1033-check?q=1 -> 301 https://docs.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://felhom.enkisfelhom.hu/r1033-check?q=1 -> 301 https://felhom.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://files.enkisfelhom.hu/r1033-check?q=1 -> 301 https://files.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://gist.enkisfelhom.hu/r1033-check?q=1 -> 301 https://gist.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://ha.enkisfelhom.hu/r1033-check?q=1 -> 301 https://ha.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://no-such-name-r1033.enkisfelhom.hu/r1033-check?q=1 -> 301 https://no-such-name-r1033.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://papir.enkisfelhom.hu/r1033-check?q=1 -> 301 https://papir.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://paste.enkisfelhom.hu/r1033-check?q=1 -> 301 https://paste.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://pdf.enkisfelhom.hu/r1033-check?q=1 -> 301 https://pdf.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://plex.enkisfelhom.hu/r1033-check?q=1 -> 301 https://plex.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://travel.enkisfelhom.hu/r1033-check?q=1 -> 301 https://travel.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://wiki.enkisfelhom.hu/r1033-check?q=1 -> 301 https://wiki.enkisfelhom.hu/r1033-check?q=1
|
||||
== demo-felhom (demo-felhom.eu): 8 public name(s)
|
||||
OK http://felhom.demo-felhom.eu/r1033-check?q=1 -> 301 https://felhom.demo-felhom.eu/r1033-check?q=1
|
||||
OK http://files.demo-felhom.eu/r1033-check?q=1 -> 301 https://files.demo-felhom.eu/r1033-check?q=1
|
||||
OK http://gist.demo-felhom.eu/r1033-check?q=1 -> 301 https://gist.demo-felhom.eu/r1033-check?q=1
|
||||
OK http://no-such-name-r1033.demo-felhom.eu/r1033-check?q=1 -> 301 https://no-such-name-r1033.demo-felhom.eu/r1033-check?q=1
|
||||
OK http://prowlarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://prowlarr.demo-felhom.eu/r1033-check?q=1
|
||||
OK http://radarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://radarr.demo-felhom.eu/r1033-check?q=1
|
||||
OK http://sonarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://sonarr.demo-felhom.eu/r1033-check?q=1
|
||||
OK http://torrent.demo-felhom.eu/r1033-check?q=1 -> 301 https://torrent.demo-felhom.eu/r1033-check?q=1
|
||||
== every public name redirects http -> https
|
||||
@@ -0,0 +1,6 @@
|
||||
per-box tester-1 2026-10-17T11:43:36Z: HTTP/1.1 303 See Other Location: /customers/tester-1?flash=floor_set
|
||||
per-box demo-hp 2026-10-17T11:43:36Z: HTTP/1.1 303 See Other Location: /customers/demo-hp?flash=floor_set
|
||||
per-box demo-felhom 2026-10-17T11:43:36Z: HTTP/1.1 303 See Other Location: /customers/demo-felhom?flash=floor_set
|
||||
per-box tester-1 2026-10-17T12:04:44Z: HTTP/1.1 303 See Other Location: /customers/tester-1?flash=floor_set
|
||||
per-box demo-hp 2026-10-17T12:04:44Z: HTTP/1.1 303 See Other Location: /customers/demo-hp?flash=floor_set
|
||||
per-box demo-felhom 2026-10-17T12:04:44Z: HTTP/1.1 303 See Other Location: /customers/demo-felhom?flash=floor_set
|
||||
@@ -0,0 +1,111 @@
|
||||
#!/usr/bin/env python3
|
||||
"""cdp_shot.py — R-1125: screenshots of dashboard pages of SCRATCH 9202 (felhom.enkisfelhom.hu mapped to 9202 by --host-resolver-rules). Based on the v0.324.0 night (R-983, R-976): the household's normal flow in headless Chrome through the PUBLIC addresses — sign in, sign out (now a POST form),
|
||||
sign in again, a family-gated app (Grimmory), a setup-gated app (Rallly). Minimal CDP client: log in to the controller through its PUBLIC address in headless Chrome, open each
|
||||
app-page tab, assert computed styles, collect console errors, save screenshots. The password is read
|
||||
from a 0600 file and only ever sent inside a CDP message; it is never printed."""
|
||||
import base64, json, os, socket, struct, subprocess, sys, time, urllib.request
|
||||
|
||||
CHROME = os.path.expanduser('~/.cache/ms-playwright/chromium_headless_shell-1243/chrome-headless-shell-linux64/chrome-headless-shell')
|
||||
BASE = sys.argv[1] # https://felhom.enkisfelhom.hu
|
||||
PWFILE = sys.argv[2] # the controller password (0600 file)
|
||||
PATHS = sys.argv[3].split(',') # dashboard paths to open and shoot
|
||||
OUT = sys.argv[4]
|
||||
PORT = 9333
|
||||
os.makedirs(OUT, exist_ok=True)
|
||||
prof = os.path.join(OUT, '.profile')
|
||||
proc = subprocess.Popen([CHROME, f'--remote-debugging-port={PORT}', '--no-sandbox', f'--user-data-dir={prof}',
|
||||
'--window-size=1280,1400', '--host-resolver-rules=MAP felhom.enkisfelhom.hu 192.168.0.114', '--ignore-certificate-errors', 'about:blank'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||
try:
|
||||
for _ in range(50):
|
||||
try:
|
||||
tabs = json.load(urllib.request.urlopen(f'http://127.0.0.1:{PORT}/json'))
|
||||
break
|
||||
except Exception:
|
||||
time.sleep(0.2)
|
||||
ws_url = [t for t in tabs if t['type'] == 'page'][0]['webSocketDebuggerUrl']
|
||||
host, path = ws_url[len('ws://'):].split('/', 1)
|
||||
h, p = host.split(':')
|
||||
sock = socket.create_connection((h, int(p)))
|
||||
key = base64.b64encode(os.urandom(16)).decode()
|
||||
sock.send(f'GET /{path} HTTP/1.1\r\nHost: {host}\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: {key}\r\nSec-WebSocket-Version: 13\r\n\r\n'.encode())
|
||||
buf = b''
|
||||
while b'\r\n\r\n' not in buf:
|
||||
buf += sock.recv(4096)
|
||||
st = {'pending': buf.split(b'\r\n\r\n', 1)[1]}
|
||||
|
||||
def send(obj):
|
||||
data = json.dumps(obj).encode()
|
||||
hdr = bytearray([0x81])
|
||||
n = len(data)
|
||||
if n < 126: hdr.append(0x80 | n)
|
||||
elif n < 65536: hdr.append(0x80 | 126); hdr += struct.pack('>H', n)
|
||||
else: hdr.append(0x80 | 127); hdr += struct.pack('>Q', n)
|
||||
mask = os.urandom(4); hdr += mask
|
||||
sock.sendall(bytes(hdr) + bytes(b ^ mask[i % 4] for i, b in enumerate(data)))
|
||||
|
||||
def recv_exact(n):
|
||||
while len(st['pending']) < n:
|
||||
st['pending'] += sock.recv(1 << 20)
|
||||
out, st['pending'] = st['pending'][:n], st['pending'][n:]
|
||||
return out
|
||||
|
||||
def recv():
|
||||
msg = b''
|
||||
while True:
|
||||
b0, b1 = recv_exact(2)
|
||||
n = b1 & 0x7f
|
||||
if n == 126: n = struct.unpack('>H', recv_exact(2))[0]
|
||||
elif n == 127: n = struct.unpack('>Q', recv_exact(8))[0]
|
||||
msg += recv_exact(n)
|
||||
if b0 & 0x80: return json.loads(msg)
|
||||
|
||||
console = []
|
||||
mid = [0]
|
||||
def call(method, **params):
|
||||
mid[0] += 1; i = mid[0]
|
||||
send({'id': i, 'method': method, 'params': params})
|
||||
while True:
|
||||
m = recv()
|
||||
if m.get('method') == 'Runtime.exceptionThrown':
|
||||
console.append(('exception', m['params']['exceptionDetails'].get('text', ''), m['params']['exceptionDetails'].get('exception', {}).get('description', '')[:200]))
|
||||
elif m.get('method') == 'Runtime.consoleAPICalled' and m['params']['type'] in ('error', 'warning'):
|
||||
console.append((m['params']['type'], ' '.join(str(a.get('value', a.get('description', ''))) for a in m['params']['args'])[:200]))
|
||||
elif m.get('method') == 'Log.entryAdded' and m['params']['entry']['level'] in ('error', 'warning'):
|
||||
e = m['params']['entry']; console.append(('log-' + e['level'], e.get('text', '')[:200], e.get('url', '')))
|
||||
if m.get('id') == i:
|
||||
if 'error' in m: raise RuntimeError(f'{method}: {m["error"]}')
|
||||
return m.get('result', {})
|
||||
|
||||
def ev(expr):
|
||||
r = call('Runtime.evaluate', expression=expr, returnByValue=True, awaitPromise=True)
|
||||
return r.get('result', {}).get('value')
|
||||
|
||||
def goto(url):
|
||||
call('Page.navigate', url=url)
|
||||
for _ in range(100):
|
||||
time.sleep(0.2)
|
||||
if ev('document.readyState') == 'complete':
|
||||
break
|
||||
time.sleep(1.5) # images' onerror, layout
|
||||
|
||||
for d in ('Page', 'Runtime', 'Log', 'Network'):
|
||||
call(d + '.enable')
|
||||
def login():
|
||||
pw = open(PWFILE).read().strip()
|
||||
goto(BASE + '/login')
|
||||
ev("(function(){var f=document.querySelector('input[type=password]'); f.value=%s; f.form.submit(); return 1})()" % json.dumps(pw))
|
||||
time.sleep(3)
|
||||
return ev('location.pathname')
|
||||
def shot(name):
|
||||
s = call('Page.captureScreenshot', format='png', captureBeyondViewport=True)
|
||||
open(os.path.join(OUT, name + '.png'), 'wb').write(base64.b64decode(s['data']))
|
||||
print("signed in, at", login())
|
||||
for i, p in enumerate(PATHS):
|
||||
goto(BASE + p)
|
||||
time.sleep(2)
|
||||
info = ev("({path: location.pathname + location.search, box: (document.querySelector('.memory-blocked .alert')||{}).innerText || null, button_disabled: !!document.querySelector('#deploy-form button[type=submit][disabled]'), button_title: (document.querySelector('#deploy-form button[type=submit]')||{}).title || null})")
|
||||
print(json.dumps(info, ensure_ascii=False))
|
||||
shot("page%d" % i)
|
||||
finally:
|
||||
proc.terminate()
|
||||
subprocess.run(['rm', '-rf', prof])
|
||||
@@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
# fbenv-spike.sh — R-1126 Part 1a, inside scratch guest 9202. A THROWAWAY FileBrowser (r1126-fb, its own volume) with
|
||||
# FILEBROWSER_ADMIN_PASSWORD from a 0600 env file (generated here, never printed). Prints status codes only.
|
||||
set -u
|
||||
IMG=gtstef/filebrowser:1.5.6-stable; W=/root/r1126; rm -rf $W; mkdir -m 700 -p $W/srv
|
||||
docker rm -f r1126-fb >/dev/null 2>&1; docker volume rm r1126_data >/dev/null 2>&1
|
||||
cat > $W/config.yaml <<'C'
|
||||
server:
|
||||
port: 80
|
||||
database: "/home/filebrowser/data/database.db"
|
||||
sources:
|
||||
- path: "/srv/t"
|
||||
name: "T"
|
||||
C
|
||||
umask 077; printf 'FILEBROWSER_ADMIN_PASSWORD=%s\n' "$(head -c 18 /dev/urandom | base64 | tr -dc A-Za-z0-9 | head -c 16)" > $W/env
|
||||
cfgpw() { sed -n 's/^FILEBROWSER_ADMIN_PASSWORD=//p' $W/env; }
|
||||
ip() { docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' r1126-fb; }
|
||||
login() { printf 'X-Password: %s\n' "$1" | curl -s -o /dev/null -w '%{http_code}' --max-time 5 -X POST -H @- "http://$(ip):80/api/auth/login?username=admin"; }
|
||||
token() { printf 'X-Password: %s\n' "$1" | curl -s --max-time 5 -X POST -H @- "http://$(ip):80/api/auth/login?username=admin" | tr -d '"'; }
|
||||
start() { docker run -d --name r1126-fb -v r1126_data:/home/filebrowser/data -v $W/config.yaml:/home/filebrowser/config.yaml:ro \
|
||||
-v $W/srv:/srv/t -e FILEBROWSER_CONFIG=/home/filebrowser/config.yaml --env-file $W/env $IMG >/dev/null; }
|
||||
echo "== 1. a NEW database with the env password: probe the default login from the first answer (1 s apart, 5 answers —"
|
||||
echo " FileBrowser 1.5.6 limits login tries: the first run of this spike probed 4/s and was answered 429 after 8 tries)"
|
||||
start; seen=""; n=0
|
||||
for i in $(seq 1 120); do c=$(login admin 2>/dev/null); if [ -n "$c" ] && [ "$c" != "000" ]; then seen="$seen $c"; n=$((n+1)); [ $n -ge 5 ] && break; sleep 1; else sleep 0.25; fi; done
|
||||
echo " default-login answers seen: $(echo $seen | tr ' ' '\n' | sort | uniq -c | tr '\n' ' ')"
|
||||
echo " waiting 90 s for FileBrowser's login limiter to clear"; sleep 90
|
||||
echo " env password login: $(login "$(cfgpw)")"
|
||||
echo "== 2. the household sets its own password in FileBrowser (the API the box uses), then a restart"
|
||||
tok=$(token "$(cfgpw)"); own="$(head -c 18 /dev/urandom | base64 | tr -dc A-Za-z0-9 | head -c 16)"
|
||||
id=$(curl -s --max-time 5 -H "X-Auth: $tok" -H "Authorization: Bearer $tok" "http://$(ip):80/api/users?id=self" | python3 -c 'import json,sys;d=json.load(sys.stdin);print(d.get("id", ""))')
|
||||
body=$(python3 -c 'import json,sys;print(json.dumps({"which":["password"],"data":{"id":int(sys.argv[1]),"username":"admin","password":sys.stdin.read()}}))' "$id" <<< "$own" | sed 's/\\n"/"/')
|
||||
code=$(printf 'X-Password: %s\n' "$(cfgpw)" | curl -s -o /dev/null -w '%{http_code}' --max-time 5 -X PUT -H @- -H "X-Auth: $tok" -H "Authorization: Bearer $tok" -H 'Content-Type: application/json' --data "$body" "http://$(ip):80/api/users?id=$id")
|
||||
echo " PUT own password: $code; own login: $(login "$own"); env login: $(login "$(cfgpw)")"
|
||||
docker restart r1126-fb >/dev/null; for i in $(seq 1 60); do c=$(curl -s -o /dev/null -w '%{http_code}' --max-time 3 "http://$(ip):80/"); [ "$c" != "000" ] && break; sleep 0.5; done
|
||||
echo " AFTER RESTART — own login: $(login "$own"); env login: $(login "$(cfgpw)"); default login: $(login admin)"
|
||||
docker logs r1126-fb 2>&1 | grep -iE "Resetting admin|admin password from" | sed 's/^/ log: /' | tail -3
|
||||
docker rm -f r1126-fb >/dev/null; docker volume rm r1126_data >/dev/null; rm -rf $W
|
||||
echo "== cleanup: $(docker ps -a --filter name=r1126 --format '{{.Names}}' | wc -l) containers, $(docker volume ls -q | grep -c r1126) volumes left"
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
#!/bin/bash
|
||||
# fbgate-probe.sh — R-1126 live proof, inside scratch guest 9202. Through TRAEFIK (what the tunnel reaches), with the
|
||||
# Host header of files.<domain>: the page's status, and the DEFAULT login's status (FileBrowser's public default; on
|
||||
# stdin). Status codes only. Usage: fbgate-probe.sh <seconds> [recreate]
|
||||
set -u
|
||||
H="Host: files.enkisfelhom.hu"; T=https://127.0.0.1
|
||||
page() { curl -sk -o /dev/null -w '%{http_code}' --max-time 3 -H "$H" $T/; }
|
||||
dflt() { printf 'X-Password: admin\n' | curl -sk -o /dev/null -w '%{http_code}' --max-time 3 -X POST -H @- -H "$H" "$T/api/auth/login?username=admin"; }
|
||||
nets() { docker inspect -f '{{range $k,$_ := .NetworkSettings.Networks}}{{$k}} {{end}}' filebrowser 2>/dev/null; }
|
||||
if [ "${2:-}" = recreate ]; then
|
||||
docker stop filebrowser >/dev/null && docker rm filebrowser >/dev/null && docker volume rm filebrowser_filebrowser_data >/dev/null && echo "removed filebrowser + its data volume at $(date -u +%T)"
|
||||
fi
|
||||
last=""; end=$(( $(date +%s) + $1 )); n=0; d200=0
|
||||
while [ $(date +%s) -lt $end ]; do
|
||||
p=$(page); d=$(dflt); [ "$d" = 200 ] && d200=$((d200+1)); n=$((n+1))
|
||||
cur="page=$p default-login=$d nets=[$(nets)]"
|
||||
[ "$cur" != "$last" ] && echo "$(date -u +%T) $cur" && last=$cur
|
||||
sleep 2
|
||||
done
|
||||
echo "probes: $n, default login answered 200: $d200 times"
|
||||
@@ -26,6 +26,14 @@
|
||||
|
||||
---
|
||||
|
||||
## 2026-10-17 — FileBrowser never on its default password, real memory amounts, CI mail (controller v0.327.1, catalog `1af6ea7`)
|
||||
|
||||
| Row | What | Closed | Evidence |
|
||||
|---|---|---|---|
|
||||
| **R-1125** | **23 apps' `mem_request` is below their measured typical use (R-994's second half), and the requests feed the box's install check** (P3) | CLOSED 2026-10-17 — operator decision D10 = A. Catalog `1af6ea7`: 23 `mem_request` = measured use. Read first on every box the hub knows (4, no customer): none over. **controller v0.327.0**: the refusal and the install page's memory box say the memory is held by the installed apps and to remove one or use a machine with more memory (HU/EN; 2 fixtures re-captured as `*_r1125`); the page now shows the check's own reading (`stacks.InstallMemory` — it used `/proc`'s host-wide figures). Live: an install that fits accepted on 9201; on 9202 made nearly full, refused (400) in both languages and blocked on the page with the same numbers (2,798 vs 2,698), nothing installed. No page promises the household set fits 8 GB (grep). | `audits/filebrowser-memory-ci-2026-10-17/` |
|
||||
| **R-1126** | **The Cloudflare tunnel runs before the box is claimed, and no document says whether that is intended.** (P3) | CLOSED 2026-10-17 — operator decision D11 = A. **controller v0.327.1**: FileBrowser starts off `traefik-public` (own network `felhom-filebrowser`); the box checks this run's default login, then joins it to `traefik-public` by container ID; `files.<domain>` is a file route to `filebrowser:80` by name (v0.327.0 used Docker labels and timed out on demo-hp and the N100 — Traefik kept the start-time address; fixed in 0.327.1 within 25 minutes). Spike first: FileBrowser's own admin-password setting re-applies at every start (1.5.6 `cmd/user.go:50-57`, measured on 9202: the household's own password was overwritten) → not usable. Live on 9202: FileBrowser + data removed, 140 probes from outside, default login never 200 (502 until published). Box walk on all three: `files.<domain>` 200, default 401. Tunnel unchanged, by design: `01` §5 [DESIGN] paragraph. | `audits/filebrowser-memory-ci-2026-10-17/` |
|
||||
| **R-1129** | **CI's failure mail has never been sent: every failed gate run ends „ALARM FAILED: RESEND_API_KEY is empty”, so the safety net four CLAUDE.md files promise („CI re-runs the entry point on every push and emails on failure”, R-168) does not exist.** (P2) | CLOSED 2026-10-17 — **NOT A DEFECT: misdiagnosed by the session that filed it.** The „ALARM FAILED: RESEND_API_KEY is empty” lines are the CI runner printing the alarm step's own source before it runs; every cited job's real output was `RESEND-ACCEPTED id=…` (job 1887 log line 207 = source, 249 = output), and the Gmail catch-all holds CI failure mails from 2026-10-16 and earlier today. Proof added anyway: a manual `workflow_dispatch` with `force_alarm` in all four repos (key length 36 seen by each); forced run felhom.eu job 1997, `RESEND-ACCEPTED` at 10:48:54Z to admin@felhom.eu, received (Gmail 10:48:55Z). The operator set the key at 12:28 CEST on this row's wrong word. | `audits/filebrowser-memory-ci-2026-10-17/` |
|
||||
|
||||
## 2026-10-17 — the CC secret broker `sec` and its guards (`admin/cc-secrets`)
|
||||
|
||||
| Row | What | Closed | Evidence |
|
||||
|
||||
@@ -124,7 +124,7 @@ stopping line that lies.
|
||||
| **R-494** | Install & onboarding | P4 | **NARROWED 2026-09-14 by operator ruling → [P3-LOW] the hub COULD create the tunnel at customer creation, for a domain already on Cloudflare. Not blocking: every customer has their own domain and the operator creates the tunnel per day-0 A.1 (`architecture/01-topology-and-trust.md`).** *Original finding, kept:* **[P1-HIGH] A new customer's dashboard has NO reachable address unless the operator hand-makes a Cloudflare tunnel — the link in the setup-code mail is dead.** MEASURED 2026-09-14 on a fresh install from the public ISO (drill intervention **I1**): the claim mail points at `https://felhom.drill0242.felhom.eu`; that name has **no A and no AAAA** record (`dig @1.1.1.1`, control `felhom.enkisfelhom.hu` resolves); the hub has **no tunnel- or DNS-creation code** (`hub/internal/cloudflare/` holds only geo-rule removal; `cf_tunnel_token` is a pasted, optional form field, `configs.go:1478`) — day-0 runbook A.1 makes it a manual Cloudflare-dashboard step that nothing on the customer-create page asks for; the box's own split-horizon resolver on the appliance LAN IP answered `google.com` but not the dashboard name at 13:27:39Z; the agent applied the record at **13:27:44Z** (`lanresolver: applied split-horizon record … ip=192.168.0.158`, 3 m 46 s after the controller started), so the box CAN answer the name — **but only to a device that uses the box as its DNS server, and no document, screen or mail tells a household to do that**; the router and the installer-offered DNS answer nothing. The page was reachable only at the guest's LAN address with the name forced (`curl --resolve …:443:192.168.0.158`). **A volunteer could not have done that.** **What it needs:** an operator ruling — the hub creates the tunnel and DNS at customer creation, or the product gives a household a LAN address that works with no DNS change. | **READY — rank P3-LOW; owner: CC** **Re-ranked 2026-10-03: P3→P4: operator-side automation; the operator creates the tunnel by hand per the day-0 runbook.** | — | — | CC |
|
||||
| **R-504** | Install & onboarding | P4 | **[P3-LOW] `iso.felhom.eu` cannot show an index page on its own — its root returns 404, and the download page lives on the website instead.** MEASURED 2026-09-14: `https://iso.felhom.eu/` and `/index.html` → 404; only named objects answer. The host is an R2 bucket behind a custom domain; whether R2 would serve an uploaded `index.html` at `/` was **not measured** (uploading anything to the public bucket is a publication). The ISO v1.27.0 task puts the Hungarian download page at `felhom.eu/letoltes` (published with the ISO, after the operator's yes). **Remaining:** a redirect from `iso.felhom.eu/` to that page needs a Cloudflare rule the session has no credential for. | **WAITING-ON-OPERATOR — rank P3-LOW; owner: operator (Cloudflare rule)** **Re-ranked 2026-10-03: P3→P4: households are sent to the website's download page; the bare address is cosmetic.** | — | — | operator |
|
||||
|
||||
## Apps & catalog — 21 rows (P2 1, P3 11, P4 9)
|
||||
## Apps & catalog — 20 rows (P2 1, P3 10, P4 9)
|
||||
|
||||
| ID | Category | Sev | What | State | Blocked on | Next action | Owner |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
@@ -148,7 +148,6 @@ stopping line that lies.
|
||||
| **R-1100** | Apps & catalog | P3 | **One sign-in for the dashboard and FileBrowser (proxy auth) — spike first.** Since controller 0.320.0 every app with a folder has „Fájlok ↗", and the box can show FileBrowser's password — but FileBrowser still asks for its OWN login the first time, so the household signs in twice. FileBrowser Quantum has a proxy-auth method (`auth.methods.proxyAuth`, header-trusted) that could take the dashboard session through traefik; nobody has measured it. Design: `architecture/02-controller-module-map.md` „Logins and folders". | OPEN — filed 2026-10-16 (task logins-folders). | — | Spike on demo-hp: proxy auth at the pinned tag (source + measured), a forwardAuth in traefik that answers only for a dashboard session, what a stranger reaching `files.<domain>` with a forged header gets, and what happens to FileBrowser's shares. | CC |
|
||||
| **R-1099** | Apps & catalog | P4 | **The N100 may hold RomM games in the old upload place, now shown under a fake „roms” platform.** Until 2026-10-16 RomM's own upload wrote to the drive's `roms/roms/<platform>/`; after the mapping fix (catalog `fb18471`, R-1089) those files are at RomM's `library/roms/roms/…`. Measured on 9201: such a game showed as missing in its platform and again under a platform „roms” (`audits/romm-ghost-2026-10-16/B/b-after.txt`). Files put in with the file manager are not affected — they are now found. The N100 runs RomM (hub `/apps/romm`); CC does not log in to the lived-in box. | OPEN — filed 2026-10-16 | Operator: look at `roms/roms/` on the N100's drive in the file manager | If it holds platform folders: move them up one level into `roms/`, then run „Scan” in RomM; if it is empty, close | Operator |
|
||||
| **R-1117** | Apps & catalog | P4 | **Immich's and Nextcloud's Redis keep a volume they do not need** (upstream runs both without one; queues and caches only). Deferred from R-1096 on purpose: removing a volume from the compose leaves the old volume on installed boxes, and the nightly dump / an old backup's restore for a volume the compose no longer declares is unchecked. The RDB switch (catalog `5d9450b`) already removed the full-disk danger. | DEFERRED — filed 2026-10-17 | — | Measure the dump and an old-backup restore without the volume on 9202; then the template change + an orphan-volume note | CC |
|
||||
| **R-1125** | Apps & catalog | P3 | **23 apps' `mem_request` is below their measured typical use (R-994's second half), and the requests feed the box's install check** (`controller` `stacks/deploy.go:1549` `memoryVerdict`: committed requests + the new one > guest memory − 384 MB → refused). The measured values (rounded up) would raise the household set (Immich, Jellyfin, Nextcloud, Home Assistant, Vaultwarden, paperless-ngx) from 3,622 to 3,910 MB of the 3,712 MB an 8 GB box can use, so its sixth app would be refused on the smallest supported box. The website estimator is not affected (it reads the measurement). Values ready: `audits/tester1-limits-filebrowser-2026-10-17/P3/`. | WAITING-ON-OPERATOR — filed 2026-10-17 (operator: „limits now, requests wait”) | the operator's decision: raise the requests (the box's check gets truer; 8 GB no longer takes the full household set) or keep them | Apply the decision through the catalog | CC |
|
||||
|
||||
|
||||
## App updates — 4 rows (P3 4)
|
||||
@@ -210,9 +209,9 @@ stopping line that lies.
|
||||
| **R-1076** | Storage & devices | P4 | **A cheap SSD reports a vendor-less WWN, so a WWN-first disk key may not be unique.** MEASURED 2026-10-15 on the N100's system SSD (AirDisk 512 GB): `ID_WWN=0x5000000123456f1f` — NAA-5 with OUI `000000`, a pattern that looks like a placeholder; its serial `QDF922W009654S30EX` looks real. The agent's wipe binding prefers `wwn-` links (A/internal/storage/durable_device.go:32). Not known whether two units share the WWN. Evidence: `audits/storage-identity-2026-10-15/B-n100.txt`. | OPEN | — | Check a second unit of the same model (or vendor data); if shared, make the agent skip OUI-000000 WWNs (the design already keys on model+serial, `architecture/16-storage-physical-identity.md` §3). | CC |
|
||||
| **R-1077** | Storage & devices | P4 | **No USB enclosure that hides or fakes a disk's serial has been measured.** The storage-identity spike (2026-10-15) had none at hand and found none in earlier evidence; the design's `usb_bridge` unknown rule (`architecture/16-storage-physical-identity.md` §3) is therefore an assumption. Cheap single- and dual-bay bridges are known to report one bridge serial for any disk. Evidence: `audits/storage-identity-2026-10-15/README.md` case 4b. | OPEN | — | Buy or borrow one cheap USB enclosure (single and dual bay), run `tools/physdisk_probe.py` against it, and set the rule from what it reports. | Operator (a device) then CC |
|
||||
| **R-1094** | Storage & devices | P4 | **The whole-disk format refusal tells the household to format the free part — which is refused while the other part is in use.** SEEN 2026-10-16 (controller 0.318.0): 409 „Ezen a lemezen egy használatban lévő meghajtó van, ezért a teljes lemez nem formázható. Csak a szabad részét formázhatod." — since agent 0.158.1 a part next to a mounted part can only be USED (the root wrapper trusts no „Felhom's own" claim). Evidence: `audits/storage-identity-buildB-2026-10-15/live/14-samedisk-refusal-offer.txt`. | READY | — | Reword `err.web.meghajto_hasznalatban_formazas` (hu + en): „… nem formázható. A szabad részét használatba veheted." Next controller release; the copy gates run. | CC |
|
||||
| **R-1124** | Storage & devices | P4 | **A drive decommissioned and then unplugged keeps its agent mount unit enabled on the host** (`mnt-<name>.mount`, „Managed by felhom-agent”, `WantedBy=multi-user.target`), so every later boot waits for a device that is gone, and the agent's watchdog reports it „disconnected”. Decommission retires the drive logically (agent: „logical retire, data untouched”) and releases only the guest bind; no product path releases the host mount or forgets the drive. Seen on Tester 1 at the R-1022 teardown 2026-10-17 (four units left; the boot delay is read from the unit, NOT measured). | OPEN — filed 2026-10-17 | — | Decide „forget a decommissioned drive” (unit disabled + removed when the drive is absent), with a test | CC |
|
||||
| **R-1124** | Storage & devices | P4 | **A drive decommissioned and then unplugged keeps its agent mount unit enabled on the host** (`mnt-<name>.mount`, „Managed by felhom-agent”, `WantedBy=multi-user.target`), so every later boot waits for a device that is gone, and the agent's watchdog reports it „disconnected”. Decommission retires the drive logically (agent: „logical retire, data untouched”) and releases only the guest bind; no product path releases the host mount or forgets the drive. Seen on Tester 1 at the R-1022 teardown 2026-10-17 (four units left; the boot delay is read from the unit, NOT measured). | OPEN — filed 2026-10-17 **2026-10-17 (later):** on Tester 1 the four units were disabled and removed by hand (read before and after, `audits/filebrowser-memory-ci-2026-10-17/P4/`); the agent did not write them back, but it still lists the four drives and logs „enrolled drive absent by UUID — will retry” every ~20 s. The product fix (decommission releases the host mount and lets the agent forget an absent drive) is an agent change — it waits for the next vouched agent release. | — | Decide „forget a decommissioned drive” (unit disabled + removed when the drive is absent), with a test | CC |
|
||||
|
||||
## Security & access — 27 rows (P1 1, P2 2, P3 18, P4 6)
|
||||
## Security & access — 26 rows (P1 1, P2 2, P3 17, P4 6)
|
||||
|
||||
| ID | Category | Sev | What | State | Blocked on | Next action | Owner |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
@@ -242,7 +241,6 @@ stopping line that lies.
|
||||
| **R-1132** | Security & access | P3 | **demo-hp's recovery code (`R_DEMO_HP`) was printed in the same JARR record line as R-1131** (2026-10-17 08:27 UTC, the same `. ~/.config/credentials`). | WAITING-ON-OPERATOR | the operator: re-issue, or accept (a demo box) | Decide together with R-1131 | operator |
|
||||
| **R-1133** | Security & access | P3 | **`~/.git-credentials` on DooPlex holds Gitea tokens in clear text** — three entries (`kisfenyo`, `Kisfenyo`, `admin`); the `admin` token has `write:repository` (and misc, package, issue, notification). Any `cat` of it prints them; the new PreToolUse guard refuses reads of that path (`read-secret-file`), but git itself must keep reading it. Out of the 2026-10-17 build's scope by its brief. | OPEN | — | Decide: move git to a credential helper that reads from `sec`, or accept the file (0600) with the guard | operator → CC |
|
||||
| **R-1134** | Security & access | P3 | **Retire the old `~/.config/credentials`**: every named key is in the CC store since 2026-10-17 13:16 (23 imported; the two hyphenated names became `R_DEMO_FELHOM`, `R_DEMO_HP`). **Two open points:** (1) its line 20 is a 32-character value with NO name — the import refused it (one bad line refuses all) and CC imported the named lines from a filtered copy; only the operator knows what it is. (2) `FACEBOOK_API` and the Tuya keys, which `fb_probe.py` and the bench README name, are in neither the file nor the store. | WAITING-ON-OPERATOR | a week with no reader (from 2026-10-17), and the operator's go | 2026-10-24: check no reader (sweep + `hook.log`); operator names line 20 (or drops it); then rename the file to `.retired`, and delete only on the operator's go | operator → CC |
|
||||
| **R-1126** | Security & access | P3 | **The Cloudflare tunnel runs before the box is claimed, and no document says whether that is intended.** The claim needs it: the claim mail links `https://felhom.<domain>` (`hub/internal/notify/templates.go:27`); `cloudflared` is started from the token with no claim check (`controller` `stacks/infra.go:85-90`; `01-topology-and-trust.md:119`, `:248`). Reachable before the claim: the dashboard serves only the claim page (code: 72 h life, 5 tries, 15 min lockout — `web/claim.go:22-33`), and `files.<domain>` — FileBrowser on its default login from its first start until the next base-stack tick sets a password (seconds; v0.326.0 re-checks every run). Options: (A) keep the tunnel; route FileBrowser publicly only after its default is replaced — small, no promise changes; (B) start the tunnel only after a LAN claim — the claim flow and its mail change, the household must be at home. Recommended A. From R-977. | WAITING-ON-OPERATOR — filed 2026-10-17 | the operator's choice A or B | Write the choice into `01` §5; build A (or B) | CC |
|
||||
|
||||
## Box system & updates — 12 rows (P2 1, P3 7, P4 4)
|
||||
|
||||
@@ -316,11 +314,10 @@ stopping line that lies.
|
||||
| **R-990** | Business & legal | P4 | **Operator: read `documentation/audits/forum-research-2026-10-12/FELHOM.md` §5 and rule on each recommendation.** READ-ONLY research 2026-10-12: three years (#7943–#11092, 2,908 posts, 195 people, 82 beginner threads) of the public PROHARDVER! topic „Home server / házi szerver építése”, tagged and counted by person (`FINDINGS.md`, method and spot-check in `METHOD.md`; no username or post text in git). Ten ranked recommendations, none acted on; the top three: a „which machine works” page (8 of 33 beginners who name their hardware own only a Synology, a router disk or a Raspberry Pi — the installer cannot run there; the same gap is R-989's first recommendation from a different source, and the shipped-page half is R-991), „you do not choose an operating system — we do” (the biggest beginner question, 20 of 82 threads), and „bring your old office PC” as the cheap entry. Catalog gap (≥ 3 people): a DLNA server (7), an ad/DNS blocker (5), a camera recorder (5). | **WAITING-ON-OPERATOR** — filed 2026-10-12 | the operator's reading | Operator: rule on each of the ten (yes / no / later). If nothing is done: nothing changes; the research ages | operator |
|
||||
| **R-1035** | Business & legal | P4 | **Did the „felhő tárhely” page earn anything? Two dated checks.** **Baseline (reported by the operator from Search Console, 2026-10-14, last 3 months):** 1 click, 48 impressions, CTR 2.1 %, average position **73.6**; „felhő tárhely” 19 impressions, „felhőtárhely” 5, „felhő alapú tárhely” 3. CC measured separately that the phrase „felhő tárhely” appeared **0 times** on the home, FAQ and backup pages — Google was showing the home page for those queries by accident. `/sajat-felho-tarhely` + `/en/own-cloud-storage` published **2026-10-14**; full baseline, price sources and the power provenance in `audits/seo-2026-10-14/BASELINE.md`. **What to measure, both times:** impressions and average position for „felhő tárhely” and „saját felhő tárhely”, plus the new page's own impressions, clicks and position. **A null result at +4 weeks means nothing on its own** — a new page on a site at position 73.6 takes weeks to months to move, and „felhő tárhely” alone is held by Microsoft, Google and the big list sites; the page aims at the two longer phrases. That is why there are two checks and not one, and why neither should be read as a verdict on the copy. **There is no Search Console connector in this project, so CC cannot read these numbers** — the operator reads them, CC records and compares. **Blocked until the operator asks for indexing** (Search Console → URL-ellenőrzés → the URL → „Indexelés kérése”): until that happens, or Google finds the page itself, both checks read zero for a reason that is not the page. **This is a slow channel and does not replace talking to people.** | **WATCHING** | operator: request indexing, then supply the Search Console read | 2026-11-11: first read (+4 weeks); 2026-12-09: second (+8 weeks), compared with the first | operator + CC |
|
||||
|
||||
## Process & tooling — 31 rows (P2 1, P3 9, P4 21)
|
||||
## Process & tooling — 33 rows (P3 9, P4 24)
|
||||
|
||||
| ID | Category | Sev | What | State | Blocked on | Next action | Owner |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| **R-1129** | Process & tooling | P2 | **CI's failure mail has never been sent: every failed gate run ends „ALARM FAILED: RESEND_API_KEY is empty”, so the safety net four CLAUDE.md files promise („CI re-runs the entry point on every push and emails on failure”, R-168) does not exist.** MEASURED 2026-10-17 from the CI logs: felhom-controller jobs 1887, 1990, 1991; felhom.eu 1747, 1796, 1889; app-catalog 876, 877 (back to 2026-09-22) — all `ALARM FAILED`. `.gitea/workflows/gates.yml:192-199` reads `secrets.RESEND_API_KEY`, which is empty in the runner. A `--no-verify` push or a red CI run therefore reaches nobody. Found by the R-977/R-1116 session (a red run of its own, caused by an unpushed register row). | OPEN — filed 2026-10-17 | — | Set the Actions secret `RESEND_API_KEY` in the four repos (the operator's key, or CC with the operator's word — it is a credential), then prove one mail with a deliberately red throwaway run; correct the four CLAUDE.md sentences until it works | operator |
|
||||
| **R-1083** | Process & tooling | P3 | **The scratch box 9202 cannot use any feature that needs the agent: its `bootstrap.json` has no `local_api` block, so its controller never gets an agent client.** MEASURED 2026-10-15 (storage-identity build A): 9202 put on controller 0.317.0 by hand to show that a NAS share no longer hides the one-copy notice (R-1075); its `bootstrap.json` (read on the box) holds no `local_api`, so the controller has no agent to ask and keeps the old `st_dev` rule — the check could not tell old from new — 9202 was put back on 0.314.0. Every agent-coupled feature (drives, same-disk, format, network storage) is untestable on the scratch box today, and the NAS leg of build A is proven by a red-proofed unit test only. Evidence: `audits/storage-identity-buildA-2026-10-15/9202-upgrade.txt`. | OPEN | — | Give 9202 a local-API token the normal way (the agent mints it for its guest), or record in `runbooks/target-selection.md` that 9202 is controller-only; then show the NAS notice live. | CC |
|
||||
| **R-1081** | Process & tooling | P4 | **Two published controller tags hold content that is not what their number says: `0.315.0` and `0.316.3`.** Both were caused by CC on 2026-10-15, and both by the same shape — a guard that was not on the path the work takes. **`0.316.3`:** the build directory's `build.sh` is a symlink into the SHARED clone's working copy, which predated the `FELHOM_REPO_DIR` override, so the override was silently ignored and the build copied that tree — which held 31 uncommitted files of another session's physical-disk storage work. The banner printed `Commit: 0225255` with no `Repo:` line. **Nobody deployed it; that was luck, not a control.** Fixed at the root in controller v0.316.4: `build.sh` now refuses `--push` from a tree that is dirty, not at `origin/main`, or not a git checkout, with four test cases red-proved. **Neither tag is re-pushed or deleted** — a version number is pushed once, and that applies to numbers CC spoiled. **No box runs either:** demo-hp 9201 is on 0.317.0, the floor is 0.314.0, and the button offers the highest tag. **`0.315.0`:** Caused by CC on 2026-10-15 while proving R-1080's own fix: the guard was added to `controller/build.sh` in the repo, but the documented release command runs `$FELHOM_ROOT/build/felhom-controller/build.sh`, which was a **separate copy taken 2026-07-18** and had no guard. Running the refusal against a real existing tag therefore rebuilt and re-pushed 0.315.0 — a fourth time — with v0.316.0's code under it (digest `8887343011d6` → `b809201841f7`). **Fixed at the root in the same session:** the build directory's script is now a symlink to the repo's, the old copy kept beside it as `build.sh.stale-copy-2026-07-18`, and the refusal was then proven to fire from the documented path. **No box is affected:** nothing runs 0.315.0 (demo-hp 9201 is on 0.316.2), the floor is 0.314.0, and the household button offers the highest tag. What remains is two tags that must never be deployed and are no longer reproducible from the registry. | **OPEN** — filed 2026-10-15; nothing to do unless someone needs one of those two images, and then the answer is the current release | — | Leave them. If an audit ever needs the real 0.315.0 or 0.316.3, build it from the matching commit under a NEW number and say so | CC |
|
||||
| **R-992** | Process & tooling | P3 | **The drill-catalog route that `09` §6.5 documents cannot be followed: `admin/app-catalog-drill` is PRIVATE and no box has catalog credentials.** Measured 2026-10-12 while publishing the Usenet pair: the box's clone fails with `fatal: could not read Username for 'https://gitea.dooplex.hu'` (exit 128), the Gitea API reports the drill repo `private=true` and the live catalog `private=false`, and NEITHER the current controller.yaml on 9202 NOR any of its 30 saved copies has ever carried `git.username` or `git.token` (the controller supports both — `internal/config/config.go` GitConfig). The route worked for the campaigns of 2026-10-10 and the torrent pair earlier the same day, so the repository's visibility changed between then and now. **Worked around, not fixed:** that campaign staged its two templates in the box's own catalog cache (`audits/usenet-2026-10-12/tools/stage_in_cache.py`), which is where the sync copies a catalog change anyway, with the sync interval raised to 12h for the duration and rescan used in place of sync. The real fix is an operator decision: either a read-only catalog credential on the scratch box (a secret on a Tier-0 guest) or making the drill repository readable. Until then every new-app campaign hits this. | WAITING-ON-OPERATOR | the operator's choice between a box credential and a readable drill repo | Decide; then either set `git.username`/`git.token` on 9202 from the credentials store, or flip the drill repo, and correct `09` §6.5 either way | operator |
|
||||
@@ -351,6 +348,9 @@ stopping line that lies.
|
||||
| **R-1127** | Process & tooling | P4 | **The controller's and the catalog's decoy suites run only when someone starts a full gate run by hand** — neither the pre-push hook nor CI (`--fast`) runs them (too slow, or they edit real files), so a decoy that goes quiet is again seen only by chance (R-1115's shape). The agent's runs in CI. Found by the R-1116 helper 2026-10-17. | OPEN — filed 2026-10-17 | — | A scheduled full run (CI cron or the nightly), with a mail on failure | CC |
|
||||
| **R-1128** | Process & tooling | P4 | **The controller's decoy suite edits real tracked files (`handler_debug.go`, `update.go`, the locale bundles, templates) and plants `.go` files, with no lock** — a full run while another session edits the controller tree can overwrite that session's edits. felhom.eu's suite took an `flock` after the 2026-10-08 clobber. Found by the R-1116 helper 2026-10-17. | OPEN — filed 2026-10-17 | — | Run the suite in a scratch copy of the tree, or take the felhom.eu-style lock | CC |
|
||||
| **R-1123** | Process & tooling | P4 | **`reuse_refs_check.py` treats every git directory beside the repo as a sibling repo**, including stray clones in the workspace (`felhom.eu-media`, `felhom.eu-sizing-push`, `felhom.eu-wt-sizing`), so a citation can resolve against a stale clone and pass. Found by the R-1116 helper 2026-10-17 (it also makes the agent suite 20 s here vs 5 s in CI). | OPEN — filed 2026-10-17 | — | Search only the four known repo names (or the main clones), with a decoy | CC |
|
||||
| **R-1135** | Process & tooling | P4 | **CI's failure mail links the run at the in-cluster Gitea address** (`http://gitea.gitea-system.svc.cluster.local:3000/...`), which a reader outside the cluster cannot open. Seen in the forced test mail 2026-10-17 (job 1997). | OPEN — filed 2026-10-17 | — | Use the public Gitea URL in the alarm step's link | CC |
|
||||
| **R-1136** | Process & tooling | P4 | **felhom.eu CI runs take ~6.9 minutes and complete, so the 5-minute job timeout R-265 assumes does not hold there** (runs 1996, 1997; `script-tests` alone ~356 s). Found by the R-1129 proof helper 2026-10-17. | OPEN — filed 2026-10-17 | — | Measure the runner's real timeout; correct R-265's assumption or speed up `script-tests` | CC |
|
||||
| **R-1137** | Process & tooling | P4 | **A CI rerun may overwrite a failed job's log** — failure mails arrived for controller commits `c02c9d83` and `29a3ce8c` while their jobs (1944, 1959) now read green. UNPROVEN (a reading, 2026-10-17). | OPEN — filed 2026-10-17 | — | Confirm with one deliberate red + rerun on a scratch repo; if true, the CI check must read the first attempt | CC |
|
||||
|
||||
<!-- DUE-CHECKS-BEGIN — machine-readable. Parsed by scripts/due_checks_gate.py.
|
||||
One row per dated check. The R-number must have a row above. Dates are UTC.
|
||||
|
||||
@@ -39,3 +39,10 @@ what happened, who noticed, and the register row it became. Prose here is not a
|
||||
household could not open the file manager. The dashboard's „Új jelszó beállítása" (pressed through its endpoint, after
|
||||
the operator's yes in chat): 200 in 3.5 s; the page now shows the password behind „Megjelenítés"; inside the box the new
|
||||
password logs in (200), admin/admin is refused (401), the state is `generated`. Evidence: `audits/logins-folders-2026-10-16/live/n100-fb-reset-*.txt`. (CC)
|
||||
- **2026-10-17 — the file manager unreachable from outside for ~21 minutes, after controller 0.327.0.** 0.327.0 arrived by
|
||||
the normal update path (11:43:38 UTC) and moved FileBrowser off Traefik's network until its default password is
|
||||
checked (R-1126); the box checked and joined it (11:43:44), but Traefik kept the address it had picked at the
|
||||
container's start, so `files.demo-felhom.eu` timed out (seen by the release's box walk). Controller 0.327.1 (a file
|
||||
route by name) reached the N100 by the normal update path at 12:04:45; `files.demo-felhom.eu` 200, the default login
|
||||
refused (401). No data touched. Register: fixed within the release, recorded in R-1126's close. Evidence:
|
||||
`audits/filebrowser-memory-ci-2026-10-17/release/box-walk.txt`. (CC)
|
||||
|
||||
Reference in New Issue
Block a user