chore: release v1.7.61-alpha

This commit is contained in:
archipelago 2026-05-17 22:13:21 -04:00
parent 4d6b4f76af
commit a992abcd06
8 changed files with 73 additions and 43 deletions

View File

@ -1,5 +1,12 @@
# Changelog # Changelog
## v1.7.61-alpha (2026-05-18)
- Multi-container stack installs now keep their app card in the `Installing` state for up to 20 minutes while dependency containers are being pulled and prepared.
- BTCPay Server installs no longer appear to vanish or fail after two minutes while Postgres and NBXplorer are still being created before the primary `btcpay-server` container exists.
- The stale-transition escape hatch remains short for start, stop, restart, update, and removal operations, so genuinely wedged lifecycle actions still recover quickly.
- Live validation on `100.70.96.88` confirmed BTCPay Server completed installation and responds on port `23000` with the expected HTTP redirect.
## v1.7.60-alpha (2026-05-18) ## v1.7.60-alpha (2026-05-18)
- Meshtastic serial detection now rejects malformed or incomplete handshakes instead of accepting unrelated serial devices as a fallback Meshtastic radio. - Meshtastic serial detection now rejects malformed or incomplete handshakes instead of accepting unrelated serial devices as a fallback Meshtastic radio.

2
core/Cargo.lock generated
View File

@ -80,7 +80,7 @@ checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
[[package]] [[package]]
name = "archipelago" name = "archipelago"
version = "1.7.60-alpha" version = "1.7.61-alpha"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"archipelago-container", "archipelago-container",

View File

@ -1,6 +1,6 @@
[package] [package]
name = "archipelago" name = "archipelago"
version = "1.7.60-alpha" version = "1.7.61-alpha"
edition = "2021" edition = "2021"
description = "Archipelago Bitcoin Node OS - Native backend" description = "Archipelago Bitcoin Node OS - Native backend"
authors = ["Archipelago Team"] authors = ["Archipelago Team"]

View File

@ -840,6 +840,20 @@ const CONTAINER_ABSENCE_THRESHOLD: u32 = 3;
/// scanner's authoritative view. Applies to all transitional variants. /// scanner's authoritative view. Applies to all transitional variants.
const TRANSITIONAL_STUCK_TIMEOUT: Duration = Duration::from_secs(120); const TRANSITIONAL_STUCK_TIMEOUT: Duration = Duration::from_secs(120);
/// Multi-container installs can legitimately spend several minutes before the
/// primary user-facing container exists. BTCPay, for example, pulls/starts
/// Postgres and NBXplorer before `btcpay-server`; do not erase its installing
/// card just because the primary container is absent during that setup window.
const INSTALLING_STUCK_TIMEOUT: Duration = Duration::from_secs(20 * 60);
fn transitional_stuck_timeout(state: &crate::data_model::PackageState) -> Duration {
if *state == crate::data_model::PackageState::Installing {
INSTALLING_STUCK_TIMEOUT
} else {
TRANSITIONAL_STUCK_TIMEOUT
}
}
/// Returns true if `state` is one of the transitional variants that a /// Returns true if `state` is one of the transitional variants that a
/// `spawn_transitional`-style background task owns. While such a state is /// `spawn_transitional`-style background task owns. While such a state is
/// set, the package scanner must not overwrite it with whatever podman /// set, the package scanner must not overwrite it with whatever podman
@ -961,13 +975,14 @@ async fn scan_and_update_packages(
let overwrite = match existing { let overwrite = match existing {
Some(existing_entry) if is_transitional(&existing_entry.state) => { Some(existing_entry) if is_transitional(&existing_entry.state) => {
let entered = *transitional_since.entry(id.clone()).or_insert(now); let entered = *transitional_since.entry(id.clone()).or_insert(now);
let stuck = now.duration_since(entered) > TRANSITIONAL_STUCK_TIMEOUT; let timeout = transitional_stuck_timeout(&existing_entry.state);
let stuck = now.duration_since(entered) > timeout;
if stuck { if stuck {
warn!( warn!(
"Container {} stuck in {:?} for >{}s; overriding with scan state {:?}", "Container {} stuck in {:?} for >{}s; overriding with scan state {:?}",
id, id,
existing_entry.state, existing_entry.state,
TRANSITIONAL_STUCK_TIMEOUT.as_secs(), timeout.as_secs(),
pkg.state pkg.state
); );
transitional_since.remove(id); transitional_since.remove(id);
@ -1015,12 +1030,13 @@ async fn scan_and_update_packages(
if let Some(entry) = merged.get(&id) { if let Some(entry) = merged.get(&id) {
if is_transitional(&entry.state) { if is_transitional(&entry.state) {
let entered = *transitional_since.entry(id.clone()).or_insert(now); let entered = *transitional_since.entry(id.clone()).or_insert(now);
if now.duration_since(entered) > TRANSITIONAL_STUCK_TIMEOUT { let timeout = transitional_stuck_timeout(&entry.state);
if now.duration_since(entered) > timeout {
warn!( warn!(
"Container {} stuck in {:?} and absent for >{}s; removing stale transitional state", "Container {} stuck in {:?} and absent for >{}s; removing stale transitional state",
id, id,
entry.state, entry.state,
TRANSITIONAL_STUCK_TIMEOUT.as_secs() timeout.as_secs()
); );
merged.remove(&id); merged.remove(&id);
transitional_since.remove(&id); transitional_since.remove(&id);
@ -1247,4 +1263,13 @@ mod merge_tests {
assert!(!is_transitional(&s), "{:?} should NOT be transitional", s); assert!(!is_transitional(&s), "{:?} should NOT be transitional", s);
} }
} }
#[test]
fn installing_uses_longer_stale_timeout_than_other_transitions() {
assert!(transitional_stuck_timeout(&PackageState::Installing) > TRANSITIONAL_STUCK_TIMEOUT);
assert_eq!(
transitional_stuck_timeout(&PackageState::Stopping),
TRANSITIONAL_STUCK_TIMEOUT
);
}
} }

View File

@ -1,12 +1,12 @@
{ {
"name": "neode-ui", "name": "neode-ui",
"version": "1.7.60-alpha", "version": "1.7.61-alpha",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "neode-ui", "name": "neode-ui",
"version": "1.7.60-alpha", "version": "1.7.61-alpha",
"dependencies": { "dependencies": {
"@types/dompurify": "^3.0.5", "@types/dompurify": "^3.0.5",
"@vue-leaflet/vue-leaflet": "^0.10.1", "@vue-leaflet/vue-leaflet": "^0.10.1",

View File

@ -1,7 +1,7 @@
{ {
"name": "neode-ui", "name": "neode-ui",
"private": true, "private": true,
"version": "1.7.60-alpha", "version": "1.7.61-alpha",
"type": "module", "type": "module",
"scripts": { "scripts": {
"start": "./start-dev.sh", "start": "./start-dev.sh",

View File

@ -1,29 +1,28 @@
{ {
"version": "1.7.60-alpha", "version": "1.7.61-alpha",
"release_date": "2026-05-18", "release_date": "2026-05-18",
"changelog": [ "changelog": [
"Meshtastic serial detection now rejects malformed or incomplete handshakes instead of accepting unrelated serial devices as a fallback Meshtastic radio.", "Multi-container stack installs now keep their app card in the `Installing` state for up to 20 minutes while dependency containers are being pulled and prepared.",
"Mesh radio auto-detection now skips known non-mesh serial devices such as Sierra Wireless LTE modems and Zooz/Z-Wave sticks, avoiding interference with production peripherals.", "BTCPay Server installs no longer appear to vanish or fail after two minutes while Postgres and NBXplorer are still being created before the primary `btcpay-server` container exists.",
"Meshtastic config sync now sends `want_config_id` with the correct protobuf wire type, fixing radio-side `ignore malformed toradio` errors and allowing node-info/contact ingestion.", "The stale-transition escape hatch remains short for start, stop, restart, update, and removal operations, so genuinely wedged lifecycle actions still recover quickly.",
"The stable `/dev/mesh-radio` udev rule no longer claims every `ttyACM*` device; it only matches known mesh USB serial adapters and known USB CDC ACM radio vendors.", "Live validation on `100.70.96.88` confirmed BTCPay Server completed installation and responds on port `23000` with the expected HTTP redirect."
"Live validation on `100.70.96.88` confirmed Archipelago selects `/dev/ttyUSB0`, identifies the Meshtastic node, and refreshes 103 mesh contacts."
], ],
"components": [ "components": [
{ {
"name": "archipelago", "name": "archipelago",
"current_version": "1.7.60-alpha", "current_version": "1.7.61-alpha",
"new_version": "1.7.60-alpha", "new_version": "1.7.61-alpha",
"download_url": "http://146.59.87.168:3000/lfg2025/archy/releases/download/v1.7.60-alpha/archipelago", "download_url": "http://146.59.87.168:3000/lfg2025/archy/releases/download/v1.7.61-alpha/archipelago",
"sha256": "ef67a16686e1a5f05385455589c56b22243b690b79a914b8b341b3ff4f063be9", "sha256": "5b08f66aa9a685475b86cdcbabe96c3132f3cc0e72d8daaeb0ddd52a01ca87b6",
"size_bytes": 42737160 "size_bytes": 42738544
}, },
{ {
"name": "archipelago-frontend-1.7.60-alpha.tar.gz", "name": "archipelago-frontend-1.7.61-alpha.tar.gz",
"current_version": "1.7.60-alpha", "current_version": "1.7.61-alpha",
"new_version": "1.7.60-alpha", "new_version": "1.7.61-alpha",
"download_url": "http://146.59.87.168:3000/lfg2025/archy/releases/download/v1.7.60-alpha/archipelago-frontend-1.7.60-alpha.tar.gz", "download_url": "http://146.59.87.168:3000/lfg2025/archy/releases/download/v1.7.61-alpha/archipelago-frontend-1.7.61-alpha.tar.gz",
"sha256": "f781295c9dbd6a18098e63a73e0783dec403ca9598ab4b60defcb717bf1ef5f2", "sha256": "80c5bef31460ece8c1416a8f4e5e88626d1ef4103d40fec0e4872aafb3332dcc",
"size_bytes": 166468694 "size_bytes": 166470847
} }
] ]
} }

View File

@ -1,29 +1,28 @@
{ {
"version": "1.7.60-alpha", "version": "1.7.61-alpha",
"release_date": "2026-05-18", "release_date": "2026-05-18",
"changelog": [ "changelog": [
"Meshtastic serial detection now rejects malformed or incomplete handshakes instead of accepting unrelated serial devices as a fallback Meshtastic radio.", "Multi-container stack installs now keep their app card in the `Installing` state for up to 20 minutes while dependency containers are being pulled and prepared.",
"Mesh radio auto-detection now skips known non-mesh serial devices such as Sierra Wireless LTE modems and Zooz/Z-Wave sticks, avoiding interference with production peripherals.", "BTCPay Server installs no longer appear to vanish or fail after two minutes while Postgres and NBXplorer are still being created before the primary `btcpay-server` container exists.",
"Meshtastic config sync now sends `want_config_id` with the correct protobuf wire type, fixing radio-side `ignore malformed toradio` errors and allowing node-info/contact ingestion.", "The stale-transition escape hatch remains short for start, stop, restart, update, and removal operations, so genuinely wedged lifecycle actions still recover quickly.",
"The stable `/dev/mesh-radio` udev rule no longer claims every `ttyACM*` device; it only matches known mesh USB serial adapters and known USB CDC ACM radio vendors.", "Live validation on `100.70.96.88` confirmed BTCPay Server completed installation and responds on port `23000` with the expected HTTP redirect."
"Live validation on `100.70.96.88` confirmed Archipelago selects `/dev/ttyUSB0`, identifies the Meshtastic node, and refreshes 103 mesh contacts."
], ],
"components": [ "components": [
{ {
"name": "archipelago", "name": "archipelago",
"current_version": "1.7.60-alpha", "current_version": "1.7.61-alpha",
"new_version": "1.7.60-alpha", "new_version": "1.7.61-alpha",
"download_url": "http://146.59.87.168:3000/lfg2025/archy/releases/download/v1.7.60-alpha/archipelago", "download_url": "http://146.59.87.168:3000/lfg2025/archy/releases/download/v1.7.61-alpha/archipelago",
"sha256": "ef67a16686e1a5f05385455589c56b22243b690b79a914b8b341b3ff4f063be9", "sha256": "5b08f66aa9a685475b86cdcbabe96c3132f3cc0e72d8daaeb0ddd52a01ca87b6",
"size_bytes": 42737160 "size_bytes": 42738544
}, },
{ {
"name": "archipelago-frontend-1.7.60-alpha.tar.gz", "name": "archipelago-frontend-1.7.61-alpha.tar.gz",
"current_version": "1.7.60-alpha", "current_version": "1.7.61-alpha",
"new_version": "1.7.60-alpha", "new_version": "1.7.61-alpha",
"download_url": "http://146.59.87.168:3000/lfg2025/archy/releases/download/v1.7.60-alpha/archipelago-frontend-1.7.60-alpha.tar.gz", "download_url": "http://146.59.87.168:3000/lfg2025/archy/releases/download/v1.7.61-alpha/archipelago-frontend-1.7.61-alpha.tar.gz",
"sha256": "f781295c9dbd6a18098e63a73e0783dec403ca9598ab4b60defcb717bf1ef5f2", "sha256": "80c5bef31460ece8c1416a8f4e5e88626d1ef4103d40fec0e4872aafb3332dcc",
"size_bytes": 166468694 "size_bytes": 166470847
} }
] ]
} }