v0.281.0: 'Done' asks the probe first; sign-up closed after the first admin (decision 47); R-713 code-bound values refused, ${NAME|base64}
gates / gates (push) Successful in 23s

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-09-29 09:57:58 +02:00
parent 3a12c7341a
commit 149467c795
28 changed files with 1928 additions and 15 deletions
+25
View File
@@ -1,3 +1,28 @@
## v0.281.0 — "Done" asks the app first; open sign-up closed once the first admin exists; a password is never read as code (2026-09-29)
**MinAgent: 0.131.0** (unchanged). Needs hub v0.123.0 (unchanged). New strings: `signup_closed.page_title`,
`signup_closed.page_body`, `app_info.setup_gate_confirm`, `app_info.signup_title`, `app_info.signup_closed`,
`app_info.signup_add_how`, `app_info.signup_open_until`, `app_info.signup_window_btn`, `err.setup_gate.probe_not_done`,
`err.setup_gate.no_signup_block` (hu + en). Evidence: `felhom.eu/documentation/audits/gate-rollout-2026-09-29/`.
- **„Kész, beállítottam" asks the app first.** For an app with a `setup_done_probe:` the press reads it and REFUSES
while it says "not done", and when it cannot be read (409, "The app says its first setup is not done yet. Create your
account, then try again."). Measured 2026-09-29: uptime-kuma pressed before its setup answered anyone. A probe app
now also shows the press. An app without a probe asks in the page first (`felhomConfirm`: "Press this only after
you have created your own account. After this, anyone can reach the app's address.").
- **Sign-up closed once the first admin exists (`09` §3 decision 47).** `.felhom.yml` `signup_block:` (a traefik
matcher for the app's own sign-up address). When the setup gate opens, the box writes
`<stacks>/traefik/dynamic/signup-block-<app>.yml` FIRST (a failed write keeps the gate closed), then removes the
gate: that address alone answers "sign-up is closed" (`/__felhom_gate/signup-closed`, a page or 403 JSON). The app
page's new sign-up card says how to add a family member (`app_info.add_people`, per app, hu + en) and has
„Regisztráció megnyitása 15 percre" (`POST /apps/<slug>/signup-window`); the loop closes it again. Only an app
whose gate this box opened gets a block — an installed app is never touched.
- **R-713:** `after_install` refuses a value that would land inside code (text with spaces, quotes or brackets around
the placeholder) when it holds a quote, a backslash, `$`, `{`, `}`, a backtick or a line break. Its own argument and
plain arguments (`--password=${X}`, `admin:${X}`) take any value. New `${NAME|base64}`.
- Tests: `TestSetupGateButton_*`, `TestSignupBlock_*`, `TestSignupClosed_*`, `TestSetupGatePage_ConfirmAndSignupCard`,
`TestR713_*`. Red-proofs RP17–RP24, each seen failing on an assertion.
## v0.280.0 — the setup gate: a new app is closed to strangers until its household set it up; "I changed it"; an installed app's password leaves the page HTML; a generator with a special character (2026-09-29)
**MinAgent: 0.131.0** (unchanged). Needs hub v0.123.0 (unchanged). New strings: `setup_gate.page_title`,