2633dc1654
gates / gates (push) Successful in 26s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
78 lines
6.3 KiB
Markdown
78 lines
6.3 KiB
Markdown
# REPORT — the family gate built; Grimmory and MeTube published; every app's licence read (2026-10-02)
|
||
|
||
Brief: "the family gate, built (controller + catalog), Grimmory and MeTube published behind it; every app's licence read;
|
||
SparkyFitness's licence ruling recorded; one controller release and a golden bake". Architecture read:
|
||
`01-topology-and-trust.md` §5 (the family-gate paragraph is new), `09` §3 decisions 46, 47, 63, 64, 65.
|
||
Evidence root: `documentation/audits/family-gate-2026-10-02/`.
|
||
|
||
| Part | State | One line |
|
||
|---|---|---|
|
||
| **A** — the controller | **DONE** | v0.287.0: family members with own logins, a door per family app, anchored exceptions, the Család card. Exit items 1–5 live on 9202. |
|
||
| **B** — the catalog | **DONE** | Format + gate `family-gate`; Grimmory (4 e-reader exceptions) and MeTube (none) published (catalog `96829d0`) with complete records; on 9202 and demo-hp through the product. |
|
||
| **C** — licences | **DONE** | 58 templates, every image, one table (`audits/licences-2026-10-02/TABLE.md`); short list in STATUS; nothing hidden or changed. |
|
||
| **D** — SparkyFitness | **DONE (not sent)** | Request drafted (`audits/licences-2026-10-02/EMAIL-DRAFT-sparkyfitness.md`); decision 65 + trigger in STATUS. |
|
||
| **E** — release | **DONE** | Floor 0.287.0 (min_agent 0.131.0), both demo boxes in ~25 s; golden 0.287.0 baked, round-tripped, vouched; currency gate OK. Phone test SKIPPED (operator not present). |
|
||
|
||
Not stopped between sessions: Part A was proven live on 9202 before Part B started (`A/items.txt`).
|
||
|
||
## Claims in the brief, checked
|
||
|
||
- **"The family session is separable with the existing cookie scheme"** — right, with one addition: a separate cookie
|
||
name (`felhom_family`) scoped to `Path=/__family` and a separate store; RequireAuth never reads it (test
|
||
`TestFamilyGate_MemberPassesButNeverTheDashboard`, red-proof RP-F1; live: the member's cookies at `/launcher` → the
|
||
dashboard login, also through the real internet).
|
||
- **"Grimmory's e-reader paths keep their own auth behind an exception"** — right, measured per path as a stranger
|
||
through the simulated tunnel: OPDS 401 (Grimmory's), Kobo made-up token 401, KOReader wrong key 401, Komga API 401;
|
||
the right credentials 200; look-alikes (`/api/v1/opdsx`, `/api/koreaderx`, `../`) → the gate.
|
||
- **"MeTube's websocket passes forwardAuth"** — right: a member's upgrade → 101; a stranger's websocket and polling → 401.
|
||
- **"Whether n8n's licence limits paid services"** — partly: own internal or personal use is allowed; providing it to
|
||
others is allowed only free of charge for non-commercial purposes. Pulling the unchanged image onto the household's
|
||
box is arguably not that — a grey zone, now an operator row (R-791).
|
||
|
||
## Proof
|
||
|
||
- **Controller:** suites green; red-proofs RP-F1..F7 (`A/RP-F-family-gate-mutants.txt`). Live (`A/items.txt`): a stranger
|
||
0 app answers of 36; members in; reset/remove/logout end access at the next request; a stranger's 7 guesses lock only
|
||
the stranger; controller down → 500, never the app; the gate costs 0.49 ms. **Through the real internet on demo-hp**
|
||
(`B4/member-internet.txt`): a member's browser → the family sign-in → MeTube; logout → refused; a stranger 401.
|
||
- **Catalog:** `catalog_gates.py grimmory` and `metube` exit 0 on the bench, every gate OK (`B/catalog-gates-*.txt`).
|
||
Decoys of the new gate seen red (`B/family-gate-decoys-red.txt`).
|
||
- **Stranger per exception (Grimmory):** `A/items.txt` item 4; R-775 re-measured: 6 tries → the gate's 401, then the
|
||
household signs in 200 — the 15-minute lock can no longer be aimed from outside.
|
||
- **9202 lifecycle** (`B/box/`): Grimmory step 3.4.1 → 3.5.0 behind the gate (58.5 s, book read back); MeTube fresh
|
||
install (a stranger's 63 polls: 404 → 401, never the app), step .28 → .29 (34.9 s), night backup, remove keeping data,
|
||
restore (64.8 s / 38.5 s), seeds read back, the gate files and the stranger's refusal back by themselves.
|
||
- **demo-hp, live catalog** (`B4/`): both installed through the product, strangers 401 through the real internet and
|
||
the LAN, removed with data; the apps were removed after (STATUS asks whether to keep them).
|
||
|
||
## Found on the way (all register rows)
|
||
|
||
- **R-801 (P2, fixed in the catalog):** the volume-persistence gate never sent a request to ANY app — it read the port
|
||
from label values, the port is in the label name. Fixed (`routed_ports()`), red-proofed (`B/RP-R801-routed-ports.txt`).
|
||
**A re-sweep of all 58 templates is owed.** Before the fix MeTube answered UNDETERMINED; after, CLEAN with its own
|
||
download (`B/volume-persistence-after-R801.txt`).
|
||
- **R-800 (P2, operator):** "remove with data" keeps an app's files in userdata, and the dialog does not say so.
|
||
- R-788 (`APP_EXERCISE`), R-796 (MeTube's send-to helpers cannot pass the gate), R-797 (rule 3 not checkable in CI),
|
||
R-798 (Grimmory's dead env line), R-799 (fixture field). Licence rows R-789..R-795.
|
||
- Harness only (no row): box_walk cached "not gated" while an app had no router (fixed); Cloudflare refuses Python's
|
||
user agent (error 1010) — a test client detail, the box was never reached.
|
||
|
||
## Rows and gates
|
||
|
||
- **Register 422 → 436:** closed R-767, R-780, R-787; updated R-775 (narrowed), R-784 (decided B, draft ready),
|
||
R-788; opened R-788..R-801 (14).
|
||
- **Releases:** controller v0.287.0 (one release). Catalog `96829d0` (+ the record amendment). Golden 0.287.0.
|
||
- **CI by head_sha:** catalog 96829d0 → job 1201 success; felhom.eu e6d1ebd → 1200 success; controller 9821690 → 1199
|
||
success (all pushes of the session green).
|
||
- `unproven.py --summary`: unchanged (not walked 35 of 55).
|
||
|
||
## Teardown
|
||
|
||
- **9202:** both apps removed (keep-data remove; the harness removed its own test folders by hand — R-442 refuses
|
||
with-data there); back on the live catalog (`A/repoint-drill.txt` controls); family members anna/bela remain on 9202's
|
||
card (scratch box, harmless).
|
||
- **Bench 9401:** rebuilt and destroyed four times; `pct list` 9201 + 9202 only; nvme-scratch back to its baseline.
|
||
- **demo-hp 9201:** apps removed, test files removed by hand, the test member removed (`B4/teardown.txt`).
|
||
- **Hub:** the floor and the artifact manifest changed on purpose; nothing else. **Secrets:** scratch files shredded at
|
||
the end; evidence scanned for every secret value used (0 hits, positive control 1).
|