9c69b3ff07
gates / gates (push) Successful in 27s
Evidence off the machine at the end of the phases that produced it (R-320). Teardown follows. PHASE 2 — the two database engines, through the REAL Update button: - MariaDB 11.6 -> 12.3 on nextcloud: PROVEN, and pressed through the button for the first time. All four SPIKE-r459 observables: the datadir's own record moved 11.6.2 -> 12.3.3; the engine itself says "already upgraded ... no need to run mariadb-upgrade again"; the entrypoint says "Major version upgrade detected ... Check required!" and then STARTED and FINISHED it (not the `skipped due to $MARIADB_AUTO_UPGRADE` line R-459 feared); and the engine took its own pre-upgrade backup, 631 905 B. The seeded Nextcloud account read back. - PostgreSQL 16 -> 17 on docmost: FAILED exactly as R-463 predicted and nobody had measured. 5.1 s to held; the pin named 17 while nothing ran; the restore brought it back in 29.1 s. The engine's REFUSAL LINE was destroyed by failAndHold before any probe could read it, so it was REPRODUCED INDEPENDENTLY with a control on every step (R-320). PHASE 3 — the bad days. B1 produced THE UNATTENDED HOLD, which this project has never had: the caller pressed once with nobody watching, the app held after 312.9 s, and passes 2 and 3 pressed nothing. B2 put the pin back on a pull failure in 1.0 s. B3 refused `busy` six times. B4 showed there is NO single-flight — 5 of 5 updates ran at once and all ended honest. B5 cut the power in `backing-up` and the box recovered itself and said so. B7 refused under the 2 GB floor. B9 found R-458's risk narrower than the row states. PHASE 4 — every badge on the box is TRUE, and the held app answers all four of Q4's questions. FINDINGS, five new and three corrections to existing rows. The one that matters: R-618 is P1 — two templates name a health probe the app does not answer, and because the guarded update waits on that same probe, a SUCCESSFUL update ends by STOPPING a working app. Measured: tandoor served HTTP 200 on the new version at four samples across five minutes and was then stopped. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
#!/usr/bin/env python3
|
|
"""Insert the night's new rows into OPEN-ITEMS.md, and append the lines owed to existing rows.
|
|
|
|
Deliberately mechanical and idempotent-ish: it refuses to insert a row id that is already present,
|
|
and it refuses to append an addendum twice. Prints the register size before and after, which the
|
|
morning note quotes.
|
|
"""
|
|
import re, sys, os
|
|
|
|
REG = "/mnt/5_hdd/felhom.eu/git/felhom.eu/documentation/backlog/OPEN-ITEMS.md"
|
|
NEW = os.path.join(os.path.dirname(os.path.abspath(__file__)), "NEW-ROWS.md")
|
|
MARK = "<!-- DUE-CHECKS-BEGIN"
|
|
|
|
|
|
def main():
|
|
reg = open(REG).read()
|
|
src = open(NEW).read()
|
|
before = len(re.findall(r'^\| \*\*R-\d+\*\* \|', reg, re.M))
|
|
|
|
rows = [l for l in src.splitlines() if re.match(r'^\| \*\*R-\d+\*\* \|', l)]
|
|
add = []
|
|
for r in rows:
|
|
rid = re.match(r'^\| \*\*(R-\d+)\*\*', r).group(1)
|
|
if re.search(rf'^\| \*\*{rid}\*\* \|', reg, re.M):
|
|
print(f" SKIP {rid} — already in the register")
|
|
continue
|
|
add.append((rid, r))
|
|
|
|
if add:
|
|
i = reg.index(MARK)
|
|
# keep the blank line that precedes the DUE-CHECKS block
|
|
block = "\n".join(r for _, r in add) + "\n\n"
|
|
reg = reg[:i] + block + reg[i:]
|
|
print(f" inserted {len(add)} rows: {[rid for rid, _ in add]}")
|
|
|
|
open(REG, "w").write(reg)
|
|
after = len(re.findall(r'^\| \*\*R-\d+\*\* \|', reg, re.M))
|
|
print(f"\nregister size: {before} -> {after}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|