#!/usr/bin/env python3 # -*- coding: utf-8 -*- """render_stands.py — generate where-felhom-stands.html from where-felhom-stands.yaml. Run by hand, deliberately not wired into CI: python3 scripts/check_stands.py && python3 scripts/render_stands.py WHY THIS EXISTS. The first version of this page was a React bundle: one 154 KB artefact whose content sat gzip+base64 inside a JS module map. It rendered, and that was all it could do — it could not be edited, a diff of it showed nothing a person could read, and it could not be regenerated when a status moved. So it began going stale the moment it was committed, which is the one thing a picture of "where we stand" must not do. This emits plain static HTML with inline CSS and NO JavaScript. It is bigger on disk than it needs to be and that is the trade: the page is a build product of a file a person can read and diff. The palette and layout deliberately match the 2026-08-09 snapshot — the operator should recognise the page, not learn a new one. """ import html import os import re import sys ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) SRC = os.path.join(ROOT, "documentation", "architecture", "where-felhom-stands.yaml") OUT = os.path.join(ROOT, "documentation", "architecture", "where-felhom-stands.html") DOT = {"walked": "#34d399", "built": "#60a5fa", "partial": "#fbbf24", "missing": "#64748b"} LEGEND = [ ("walked", "Walked", "done end to end on real hardware, evidence on file"), ("built", "Built", "shipped and tested, the real path never walked"), ("partial", "Partial", "some walked, some not — the note says which"), ("missing", "Missing", "does not exist"), ] STAGES = {1: "Getting a box", 2: "Making it theirs", 3: "Using it", 4: "Drives", 5: "Backing up", 6: "When something goes wrong", 7: "Getting everything back"} def load(path): claims, cur, sect = [], None, None meta = {} for raw in open(path, encoding="utf-8"): line = raw.rstrip("\n") if line.startswith("verified_on:"): meta["date"] = line.split(":", 1)[1].strip() if line.startswith(" - id:"): cur = {"id": line.split(":", 1)[1].strip(), "sources": [], "changed": None} claims.append(cur) sect = None continue if cur is None: continue if line.strip() == "sources:": sect = "sources" continue if line.strip() == "changed:": sect = "changed" cur["changed"] = {} continue if line.strip() == "verified:": sect = "verified" continue m = re.match(r'\s+- (capability-map|evidence|register): (.*)$', line) if sect == "sources" and m: cur["sources"].append((m.group(1), m.group(2).strip().strip('"'))) continue m = re.match(r'\s+(\w+): (.*)$', line) if not m: continue k, v = m.group(1), m.group(2).strip().strip('"') if sect == "changed": cur["changed"][k] = v elif sect == "verified": cur.setdefault("v_" + k, v) else: cur.setdefault(k, v) return meta, claims def esc(t): return html.escape(t, quote=False) def dot(status): return ('' % DOT.get(status, "#64748b")) def claim_html(c): bits = ['
where-felhom-stands.yaml, which cites the capability map, register row or '
'evidence document behind every claim — and which is checked by '
'scripts/check_stands.py.28ba8593b8, felhom-controller c732fe1283, hub '
'56f8aa611c. %d status(es) moved in that pass — '
'each is marked on the page.scripts/render_stands.py from where-felhom-stands.yaml. '
'Do not hand-edit this file — edit the data and regenerate. '
'The 2026-08-09 React bundle is kept as '
'where-felhom-stands-2026-08-09-snapshot.html and is not maintained.'
'