fix(release): enforce the v1.8 What's New floor
Demo images / Build & push demo images (push) Failing after 39s

This commit is contained in:
archipelago
2026-08-31 15:44:48 -04:00
parent e7854702c0
commit 9cf07e1eac
4 changed files with 40 additions and 103 deletions
@@ -573,7 +573,7 @@ RUN mkdir -p /etc/polkit-1/rules.d && \
# already-deployed nodes over OTA (idempotent no-op here once applied).
RUN set -eu; \
apt-get update; \
apt-get install -y --no-install-recommends kdump-tools kexec-tools rasdaemon; \
apt-get install -y --no-install-recommends kdump-tools kexec-tools makedumpfile rasdaemon; \
apt-get clean; rm -rf /var/lib/apt/lists/*; \
CONF=/etc/default/kdump-tools; \
sed -i 's|^#\?USE_KDUMP=.*|USE_KDUMP="1"|' "$CONF"; \
@@ -459,100 +459,6 @@ init()
<p><strong>The Receive window now tells you when the money is on its way.</strong> Previously it showed a QR code and left you to check elsewhere whether anything happened. Now, the moment the sender's transaction is broadcast, the QR gives way to a clock: the amount, the transaction ID (tap to copy), and a note that the funds arrive on their own — with a single Done button. If you keep the window open, the clock becomes a green check at the first confirmation. Verified live on a real node: payment detected within seconds of broadcast.</p>
</div>
</div>
<!-- alpha.9 -->
<div>
<div class="flex items-center gap-2 mb-3">
<span class="text-xs font-mono px-2 py-0.5 rounded bg-white/10 text-white/60">v1.2.0-alpha.9</span>
<span class="text-xs text-white/40">Mar 18, 2026</span>
</div>
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
<div>
<h4 class="text-white font-medium mb-1">Security Hardening Complete</h4>
<p>All 12 pentest findings fixed. CSRF tokens now survive restarts. Password hashing upgraded to Argon2id. Bitcoin RPC gets a unique random password on every install. Federation messages require ed25519 signatures.</p>
</div>
<div>
<h4 class="text-white font-medium mb-1">7 Bugs Squashed</h4>
<p>Random logouts fixed (P0). Uninstall dialog is now a proper full-screen modal with an "Uninstalling..." overlay. App cards no longer flicker between Start/Launch during container scans. ElectrumX index estimate corrected.</p>
</div>
<div>
<h4 class="text-white font-medium mb-1">Bitcoin Sync on Dashboard</h4>
<p>Homepage System card now shows Bitcoin Core sync progress, block height, and green/orange status indicator when Bitcoin is running.</p>
</div>
</div>
</div>
<!-- alpha.8 -->
<div>
<div class="flex items-center gap-2 mb-3">
<span class="text-xs font-mono px-2 py-0.5 rounded bg-white/10 text-white/60">v1.2.0-alpha.8</span>
<span class="text-xs text-white/40">Mar 18, 2026</span>
</div>
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
<div>
<h4 class="text-white font-medium mb-1">Pentest Remediation (9/12)</h4>
<p>Fixed 9 of 12 security findings: session auth on LND connect info, DEV_MODE removed from production, ed25519 signature verification on node messages, path traversal protection, NIP-07 origin validation, AIUI session checks, strict onion validation.</p>
</div>
<div>
<h4 class="text-white font-medium mb-1">UI Polish Batch</h4>
<p>Fedimint renamed to "Fedimint Guardian". Tab-launch icons. Marketplace sorts installed apps to end. Mesh mobile layout fixed. On-Chain first in receive modals. Federation shows names instead of DIDs. Cleaner iframe error screens.</p>
</div>
</div>
</div>
<!-- alpha.7 -->
<div>
<div class="flex items-center gap-2 mb-3">
<span class="text-xs font-mono px-2 py-0.5 rounded bg-white/10 text-white/60">v1.2.0-alpha.7</span>
<span class="text-xs text-white/40">Mar 18, 2026</span>
</div>
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
<div>
<h4 class="text-white font-medium mb-1">Marketplace & Credentials</h4>
<p>29 containers running rootless. Marketplace app aliases working. Credential injection for inter-container authentication.</p>
</div>
</div>
</div>
<!-- alpha.4-6 -->
<div>
<div class="flex items-center gap-2 mb-3">
<span class="text-xs font-mono px-2 py-0.5 rounded bg-white/10 text-white/60">v1.2.0-alpha.4-6</span>
<span class="text-xs text-white/40">Mar 18, 2026</span>
</div>
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
<div>
<h4 class="text-white font-medium mb-1">Rootless Podman Migration</h4>
<p>Migrated all containers from root to rootless Podman. UID namespace mapping, volume ownership fixes, sysctl tuning. Bitcoin RPC verified, all web services confirmed healthy. 29 containers up and running.</p>
</div>
</div>
</div>
<!-- alpha.2-3 -->
<div>
<div class="flex items-center gap-2 mb-3">
<span class="text-xs font-mono px-2 py-0.5 rounded bg-white/10 text-white/60">v1.2.0-alpha.2-3</span>
<span class="text-xs text-white/40">Mar 18, 2026</span>
</div>
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
<div>
<h4 class="text-white font-medium mb-1">Systemd Hardening Restored</h4>
<p>Full systemd security sandbox restored now that containers run rootless. NoNewPrivileges, restricted namespaces, and system call filtering re-enabled. Session persistence and boot sequence fixes.</p>
</div>
</div>
</div>
<!-- alpha.1 -->
<div>
<div class="flex items-center gap-2 mb-3">
<span class="text-xs font-mono px-2 py-0.5 rounded bg-white/10 text-white/60">v1.2.0-alpha.1</span>
<span class="text-xs text-white/40">Mar 18, 2026</span>
</div>
<div class="space-y-3 text-sm text-white/80 pl-3 border-l border-white/10">
<div>
<h4 class="text-white font-medium mb-1">Mesh Radio & Container Stability</h4>
<p>LoRa mesh radio auto-detects USB port changes with a new Connect button. Fixed container crash loops — all apps start cleanly and stay stable. Apps starting up show progress instead of re-appearing in the store. Tor routing enabled by default for Bitcoin and Lightning.</p>
</div>
<div>
<h4 class="text-white font-medium mb-1">Off-Grid Bitcoin</h4>
<p>Receive Bitcoin block headers over mesh radio. Dead man's switch broadcasts location to trusted contacts if you go silent. GPS sharing is opt-in only.</p>
</div>
</div>
</div>
</div>
<button @click="showReleaseNotes = false" class="glass-button w-full mt-4 py-2 text-sm shrink-0">Close</button>
</div>
+24 -5
View File
@@ -165,16 +165,35 @@ else
sudo rm -rf "$TMPBIN"
fi
# ── Frontend payload present ─────────────────────────────────────────
if [ -f "$MNT/archipelago/web-ui/index.html" ]; then
# ── Frontend + companion payload ─────────────────────────────────────
WEB_UI="$MNT/archipelago/web-ui"
if [ -f "$WEB_UI/index.html" ]; then
ok "frontend payload (archipelago/web-ui/index.html)"
if [ -f "$MNT/archipelago/web-ui/aiui/index.html" ]; then
if [ -f "$WEB_UI/aiui/index.html" ]; then
ok "AIUI included in frontend payload"
else
warn "AIUI missing from archipelago/web-ui (verify rootfs copy before shipping)"
bad "AIUI missing from archipelago/web-ui"
fi
COMPANION_META="$WEB_UI/packages/archipelago-companion.json"
COMPANION_APK="$WEB_UI/packages/archipelago-companion.apk"
if [ -s "$COMPANION_APK" ] && [ "$(jq -r '.versionName // empty' "$COMPANION_META" 2>/dev/null)" = "0.5.28" ] \
&& [ "$(jq -r '.versionCode // empty' "$COMPANION_META" 2>/dev/null)" = "48" ]; then
ok "Companion 0.5.28 (versionCode 48) APK included"
else
bad "Companion 0.5.28 APK/metadata missing or stale"
fi
SETTINGS_BUNDLE="$(grep -rlF "v$EXPECTED_VERSION" "$WEB_UI/assets" 2>/dev/null | head -1)"
if [ -n "$SETTINGS_BUNDLE" ] \
&& grep -qF 'v1.8.0-alpha' "$SETTINGS_BUNDLE" \
&& ! grep -qE 'v1\.[0-7]\.|v1\.2\.0-alpha' "$SETTINGS_BUNDLE"; then
ok "What's New is v1.8.6-first with a v1.8.0 history floor"
else
bad "What's New payload is missing v1.8 history or still contains pre-v1.8 entries"
fi
else
warn "no archipelago/web-ui payload on ISO (frontend may live in rootfs.tar only)"
bad "no archipelago/web-ui payload on ISO"
fi
echo
+15 -3
View File
@@ -73,10 +73,15 @@ def undated_versions():
def ordered_versions():
"""Return modal versions in display order (top to bottom)."""
"""Return generated modal versions in display order (top to bottom)."""
return re.findall(r"<!-- (v\d+\.\d+\.\d+\S*) -->", MODAL.read_text())
def legacy_blocks():
"""Return old hand-written alpha blocks that predate generated markers."""
return re.findall(r"<!-- (alpha\.[^ ]+) -->", MODAL.read_text())
def version_key(version):
match = re.match(r"v(\d+)\.(\d+)\.(\d+)", version)
return tuple(map(int, match.groups()))
@@ -85,7 +90,10 @@ def version_key(version):
def sort_modal_blocks(entries):
"""Re-render current release-note blocks newest-first and remove old history."""
lines = MODAL.read_text().splitlines(keepends=True)
marker = re.compile(r"^\s*<!-- (v\d+\.\d+\.\d+\S*) -->\s*$")
# Include the old hand-written `alpha.*` blocks in the replace range so
# normalization can delete them. Previously the checker saw only generated
# vX.Y.Z markers and falsely claimed the v1.8.0 history floor was enforced.
marker = re.compile(r"^\s*<!-- ((?:v\d+\.\d+\.\d+\S*)|(?:alpha\.[^ ]+)) -->\s*$")
blocks = []
for start, line in enumerate(lines):
@@ -115,7 +123,10 @@ def sort_modal_blocks(entries):
raise RuntimeError("unexpected content between What's New release blocks")
by_version = {entry["ver"]: entry for entry in entries}
retained = [b for b in blocks if version_key(b[2]) >= MIN_VISIBLE_VERSION]
retained = [
b for b in blocks
if b[2].startswith("v") and version_key(b[2]) >= MIN_VISIBLE_VERSION
]
sorted_segments = [
render_block(by_version[b[2]]).splitlines(keepends=True)
if b[2] in by_version else b[3]
@@ -181,6 +192,7 @@ def main():
expected_order = sorted(displayed, key=version_key, reverse=True)
out_of_order = displayed != expected_order
too_old = [v for v in displayed if version_key(v) < MIN_VISIBLE_VERSION]
too_old.extend(legacy_blocks())
if not missing and not out_of_order and not too_old:
changed = False if check else sort_modal_blocks(entries)