From b018ca9092419064f8f3c21fd2743e3c2df5a112 Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Mon, 5 Oct 2026 16:43:19 +0200 Subject: [PATCH] the size rule: a small finding is fixed in the session, not filed; reports state four register numbers (burn-down Part D) Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS --- .claude/rules/unprompted-work.md | 6 ++++-- REPORT-hub-db-offsite-2026-10-05.md | 5 ++--- STATUS.md | 4 ++-- documentation/PROMPT-TEMPLATE.md | 9 ++++++--- .../hub-db-offsite-2026-10-05/partD/alarm-drill.txt | 1 + documentation/backlog/OPEN-ITEMS.md | 11 +++++++++++ 6 files changed, 26 insertions(+), 10 deletions(-) diff --git a/.claude/rules/unprompted-work.md b/.claude/rules/unprompted-work.md index 80157dd2..d7a83c5b 100644 --- a/.claude/rules/unprompted-work.md +++ b/.claude/rules/unprompted-work.md @@ -13,7 +13,8 @@ unconditional: true - A register row **you or another CC session filed**, with owner CC, at P3 or a bounded P2, that needs **no operator decision**, touches **no customer data by design**, and introduces **no mechanism nobody has measured**. Smallest first. -- A defect you find while exercising the product, filed as a row **before** you fix it. +- A defect you find while exercising the product, filed as a row **before** you fix it — **unless it is small**: + a small finding is fixed in the session and never filed (the size rule, `OPEN-ITEMS.md` „How a row is filed"). - Hygiene: register compression, stale citations, rows with no owner, documents that contradict live source. @@ -43,7 +44,8 @@ it **first** in the morning note. A decision you cannot write in that shape is o 6. **One release per repo per session**, with a CHANGELOG entry (controller: with its `MinAgent` line), REPORT overwritten, floor raised to deliver it. **No golden unless a drill or fresh install needs one** (the waiver, R-468). **No `--no-verify`.** -7. **An enumerated gap becomes a row in the same session.** Prose is not a record. +7. **An enumerated gap becomes a row in the same session — or, if it is small, is fixed in it** (the size rule). + Prose is not a record. 8. **Hungarian text is searched with ASCII fragments**, with a positive and a negative control. 9. **Never leave a half-state.** If time runs out, revert to clean and say what was reverted. 10. **Teardown, three layers, stated** — machine, host, hub — or "provisioned nothing". diff --git a/REPORT-hub-db-offsite-2026-10-05.md b/REPORT-hub-db-offsite-2026-10-05.md index 5ec96801..41654df6 100644 --- a/REPORT-hub-db-offsite-2026-10-05.md +++ b/REPORT-hub-db-offsite-2026-10-05.md @@ -88,8 +88,8 @@ newer release and was pinned to 4.7.0. the `data` field only → restore `rc=0`, integrity `ok`, 4 hosts; without a key → `missing key`. - **Alarm** (`alarm-drill.txt`): success file hidden 13:51:46Z → pending 13:52:06Z → **firing 14:22Z** → Alertmanager: 1 active alert, receiver `email-notifications`, `notifications_total{email}` 5 and `failed_total` 0 → a real push - 14:23 (2 s) → inactive 14:23:42Z, email counter 6. **The mail itself was not read**: the Gmail connector reads the - felhom.eu catch-all, and Alertmanager mails the operator's personal address — the operator is asked to confirm. + 14:23 (2 s) → inactive 14:23:42Z, email counter 6. **Both mails arrived** (operator's inbox screenshot, 2026-10-05): + „[FIRING] HubDBBackupStale" 16:22 and „[RESOLVED] HubDBBackupStale" 16:27 CEST. - **R-519 on 9202** (`r519/`): 9202 raised to controller 0.296.0 by hand (`00-upgrade-9202.txt`); bookstack installed; run 1 complete (33 s); run 2 cut by `docker restart felhom-controller` at 14:05:59.67Z, 0.8 s after `Volume dump: bookstack/bookstack_bookstack_config` and before its database volume. After: the run record turned `interrupted`; @@ -126,5 +126,4 @@ newer release and was pinned to 4.7.0. ## Unproven / say-so - `unproven.py --summary`: walked 20, partial 17, built 14, missing 4 — NOT WALKED 35 of 55; no number moved (the hub-DB capability is a new row in `00` §G, not one of the 55 walked claims). -- The `HubDBBackupStale` mail in the operator's inbox — seen only as Alertmanager's send counter. - Runbook §3 steps 4–5. diff --git a/STATUS.md b/STATUS.md index c50798f2..dead7e45 100644 --- a/STATUS.md +++ b/STATUS.md @@ -34,8 +34,8 @@ by-design abilities stay. Today you also chose: grow the hub's disk to 2 GiB, an DooPlex use "always the newest" (new row). - **The alarm mail:** I hid the "copy sent" signal on purpose; after 30 minutes the alarm fired (14:22) and the mail - system sent it without error; a real send cleared it a minute later. **Please check your inbox** for - "HubDBBackupStale" around 16:22 — I cannot read your personal mailbox. + system sent it without error; a real send cleared it a minute later. **You confirmed both mails arrived:** + "[FIRING] HubDBBackupStale" 16:22 and "[RESOLVED] HubDBBackupStale" 16:27. - **The mail system (Alertmanager) cannot save its own notes since the Longhorn restart.** Mail still goes out; but a silence you set would be lost at its next restart (new row). diff --git a/documentation/PROMPT-TEMPLATE.md b/documentation/PROMPT-TEMPLATE.md index 37792c7b..0e83f97e 100644 --- a/documentation/PROMPT-TEMPLATE.md +++ b/documentation/PROMPT-TEMPLATE.md @@ -257,7 +257,9 @@ Then: [exact refusal — HTTP status, error, and the proven non-effect, e.g. "m typecheck; do not accumulate compile errors. 2. **Minimal changes:** build only what's listed. No "while I'm here" refactors. Note anything worth fixing under "Observations" (§15) — don't act on it, but **do file it**: §15.9's marker rule means - "not acted on" never means "not recorded". + "not acted on" never means "not recorded". **Exception — the size rule (2026-10-05):** a finding that is cosmetic + or small (about 30 minutes, in a repo this session may change) is FIXED in the session with a test and listed under + „fixed without a row" — not filed (`OPEN-ITEMS.md` „How a row is filed"). 3. **No silent failures:** never swallow a parse/exec error — log it. Check a subprocess's **own** exit code; never pipe in a way that hides a 127. (The silent `.felhom.yml` quoting bug + the spike's exit-swallow lesson.) @@ -423,8 +425,9 @@ inside an entry about something else, and a finding rediscovered because nobody shape `[DESIGN]` in the architecture document and point it at the log entry** (§4's map). **Losing a reason is how a deliberate design becomes a bug in someone's eyes** — that cost four mis-filed defect reports in August 2026 (R-370, R-376). -3. **State the register's size in the report, before and after.** A number every session is what makes - growth visible; prose about tidiness is not a mechanism. +3. **State the register's size in the report as FOUR numbers: rows before, rows after, rows opened, rows closed** + (2026-10-05). A number every session is what makes growth visible; prose about tidiness is not a mechanism. + Before/after alone hid that sessions closed some and opened as many. --- diff --git a/documentation/audits/hub-db-offsite-2026-10-05/partD/alarm-drill.txt b/documentation/audits/hub-db-offsite-2026-10-05/partD/alarm-drill.txt index cebf9ab6..41cfe95d 100644 --- a/documentation/audits/hub-db-offsite-2026-10-05/partD/alarm-drill.txt +++ b/documentation/audits/hub-db-offsite-2026-10-05/partD/alarm-drill.txt @@ -1,3 +1,4 @@ +## operator confirmation (inbox screenshot): [FIRING] HubDBBackupStale 16:22 CEST; [RESOLVED] HubDBBackupStale 16:27 CEST ## alarm drill start 2026-10-05T13:51:46Z: success file moved aside (absent case) backup_freshness.prom fan_metrics.prom diff --git a/documentation/backlog/OPEN-ITEMS.md b/documentation/backlog/OPEN-ITEMS.md index 07dbcd69..9ffa995d 100644 --- a/documentation/backlog/OPEN-ITEMS.md +++ b/documentation/backlog/OPEN-ITEMS.md @@ -13,6 +13,17 @@ a non-overwritten `REPORT-.md` sibling instead (`CLAUDE.md:82-87`), of wh belongs inside backticks), whose **Category** is not one of the eleven below, or whose **Sev** is not `P1`–`P4`. **A new row goes into its category's section**, in severity order. +**Fix small, do not file (the size rule — operator brief 2026-10-05, the burn-down).** The register grew because every +session closed a few rows and filed a few small new ones. So: **a finding that is cosmetic or small — fixable in the +session in about 30 minutes, in a repo the session may change — is FIXED in that session, with a test where it changes +behaviour, and NOT filed.** It is recorded in that repo's `CHANGELOG.md` and in the session report under „fixed without +a row". **Only a finding that needs a decision, a design, a larger build, or a change the session may not make** (a +protected machine, a repo out of scope, a release budget already spent) **becomes a row.** This narrows — it does not +repeal — „an enumerated gap becomes a row": a small gap leaves the session fixed, which is a record too. + +**Every session report states four numbers:** rows before, rows after, rows opened, rows closed — counted the way +`register_shape_gate.py` counts (`| **R-n** |` lines in this file). + **Sev — one scale for this file and `ROADMAP.md`:** - **P1 — now.** A household can lose or leak data, a box can stop or be taken over, or a promise we make is false — today. A P1 row says in one sentence what the harm is.