fix(release): enforce the v1.8 What's New floor
Demo images / Build & push demo images (push) Failing after 39s
Demo images / Build & push demo images (push) Failing after 39s
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user