Files
felhom.eu/documentation/audits/catalog-currency-2026-09-30/02-retry-429.py
T
admin 25cb3eb9c1
gates / gates (push) Successful in 29s
The last six PostgreSQL apps decided; the gate's wait seen live by day; catalog currency; stale rows
- R-463 CLOSED: rallly, outline, sparkyfitness -> PostgreSQL 18 (catalog 25ffd89 / aeb0cd6 / 1666572),
  each proven on the bench and on 9202 through the guarded Update with one undo case; zipline,
  adventurelog, immich stay on 16 by 09 decision 42's rule (upstream runs 16 / 16 / 14).
- Part F: bookstack, kimai, audiobookshelf, n8n, navidrome, grafana, komga moved on both venues;
  immich not (R-732: its first start OOM-killed its database on the bench).
- R-687 item 4 PROVEN LIVE on demo-hp: two deferrals while the leg stepped two apps, the whole-guest
  backup on the first poll after, success; config + window put back and read back.
- Catalog currency audit (Part D): 25/53 behind inside a major, 19 across; night-updatable 28 -> 31 (+1).
- R-446 and R-440 narrowed (measured on demo-hp); R-624 corrected (outline, rallly, zipline have routes);
  R-548 note (demo-hp's local tier refused for space since 09-27).
- New rows: R-730 (the ISO 1.29.0 build commit cannot be proven -> no tag; installer-v* is the script's
  line), R-731 (tag-shape switches), R-732. Register 361 -> 364.
- 09 §3: the 2026-09-30 operator notes (by day; Tester-2 pre-checks done; decision 52 not needed, not
  recorded); §6.4 dated currency note. STATUS, CONTEXT, REPORT-pg-last-six-2026-09-30.md.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-09-30 14:47:12 +02:00

33 lines
1.6 KiB
Python

#!/usr/bin/env python3
"""Re-measure the rows 00-currency.py recorded as HTTP 429 (ghcr rate limit), slower, and merge them
into 01-currency-raw.json. Same functions, same rules; only the pacing differs."""
import importlib.util, json, sys, time
sys.argv = ["x", "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu", "."]
spec = importlib.util.spec_from_file_location("c", "00-currency.py")
c = importlib.util.module_from_spec(spec); spec.loader.exec_module(c)
orig = c.S.get
def slow_get(*a, **k):
for i in range(8):
r = orig(*a, **k)
if r.status_code != 429:
time.sleep(1.0)
return r
wait = int(r.headers.get("Retry-After", "0") or 0) or 20 * (i + 1)
print("429, waiting", wait, "s"); time.sleep(wait)
return r
c.S.get = slow_get
rows = json.load(open("01-currency-raw.json"))
for row in rows:
if "429" not in row.get("error", ""):
continue
host, hrepo = c.host_repo(row["repo"])
tags = c.tags_all(host, hrepo)
res = c.newest(tags, row["tag"])
row.pop("error"); row["status"] = "ok"; row["n_tags"] = len(tags); row["pinned_tag_listed"] = row["tag"] in tags
ba, bm = res["all"], res["maj"]
row["newest_all"] = ba[0] if ba else None; row["newest_major"] = bm[0] if bm else None
row["behind_within_major"] = bool(bm and bm[1] > res["cur"]); row["behind_across_major"] = bool(ba and ba[1][0] > res["cur"][0])
row["major"] = res["cur"][0]; row["retried_after_429"] = True
print(row["ref"], len(tags), row["newest_major"], row["newest_all"])
json.dump(rows, open("01-currency-raw.json", "w"), indent=1)