38 KiB
Next Terminal Handoff - Archipelago 1.8-alpha
Last updated: 2026-06-11 00:17 America/New_York
Resume Prompt
Paste this into the next terminal/session:
Continue Archipelago
1.8-alpharelease hardening from/home/archipelago/Projects/archy. First readdocs/NEXT_TERMINAL_HANDOFF.md, thendocs/RESUME.md,docs/CONTAINER_LIFECYCLE_HANDOFF.md,docs/MIGRATION_STATUS_REPORT.md, anddocs/1.8-alpha-improvements-tracker.md. Active validation node is.198at192.168.1.198with userarchipelagoand passwordpassword123. Keeparchipelago-doctor.timerandarchipelago-reconcile.timerinactive for deterministic validation. Do not run broad Podman store/image cleanup commands on.198(podman prune,podman image list,podman system df, broad image-exists/list/store-wide cleanup); the store/control path is known to hang under load. Preserve app data. Latest deployed backend hash on.198is159e0daf13fca2df7e831122cb0e6c84223a7e5b7433f5dd0b7eec263233e228. Fedimint Guardian public launch is fixed:8175serves the styled wait/proxy UI with real background/icon assets and proxies to backend Guardian on8177;package.restart fedimintnow returns immediately and settled with both services active. Latest local-only tracker pass added uninstall preserve/delete-data UI, companion APK QR/download, setup instructions rendering, Fleet/Bitcoin receive-state loading improvements, Nextcloud false-update work, PhotoPrism credential fallback, and removed the Spotlight AI coming-soon block. Continue with the broader rootless Podman lifecycle/control-plane blocker, My Apps state truthfulness, progress UX, remaining in-progress tracker items, full lifecycle, clean reboot iterations, ISO cut, and ISO smoke test.
Current Goal
Cut Archipelago 1.8-alpha, including a ready-to-test ISO image.
Release status is still not green. The remaining work is mostly systemic hardening and final gates, not basic app catalog wiring.
The user improvement list in docs/1.8-alpha-improvements-tracker.md is part of
the same release and next ISO cut. Keep that tracker updated as items move from
todo to in-progress, blocked, done, or explicit release deferral.
Active Session Checkpoint - 2026-06-10 05:48 EDT
New terminal resumed from this handoff. No .198 host actions have been run in
this resumed pass yet.
Resume-save checkpoint, 2026-06-10 08:32 EDT: progress is saved in this handoff
and docs/1.8-alpha-improvements-tracker.md. No .198 host actions were run
after the 05:48 checkpoint, no dev server was intentionally left running, and no
long-running validation command is expected to still be active from this pass.
The user explicitly wants the fixes backlog continued, not app migration work,
unless they redirect. Start a resumed session by re-reading the tracker row
Make tabs info load quickly or show loading states, then continue the slow
panel audit or move to the next unresolved fixes-backlog row.
Resume-save checkpoint, 2026-06-10 23:15 EDT: continued only frontend fixes
backlog work and avoided Bitcoin/Tor RPC/backend paths because another agent is
working there. No .198 host actions were run, no dev server was intentionally
left running, and no long-running validation command is expected to still be
active from this pass.
Resume-save checkpoint, 2026-06-11 00:17 EDT: continued the fixes backlog only,
not app migration. Avoid Bitcoin/Tor RPC/backend work because a separate agent
is working there. The latest local change fixes the header responsiveness
regression the user flagged: primary My Apps/App Store/Websites navigation is
restored to persistent desktop tabs at md+ on My Apps, Discover, and
Marketplace; desktop primary dropdowns were removed; mobile dropdown behavior
remains; App Store category collapse is delayed by starting uncollapsed and
using a smaller header gap/search reserve; My Apps desktop category dropdown was
removed. Validation passed npm run type-check,
npm test -- --run src/views/marketplace/__tests__/MarketplaceAppCard.test.ts src/views/apps/__tests__/appsConfig.test.ts,
and scoped git diff --check. Browser smoke against the already-running local
Vite/mock session (http://127.0.0.1:8102 and mock backend 5959) is still
pending. Leave that existing session alone unless it has already exited.
Exact first step for this pass:
- Update the handoff docs with this fresh checkpoint.
- Rerun local resume gates that were pending after the 05:30 checkpoint:
git diff --checkand the focused Rust image-version test for the Nextcloud false-update work. - If local gates are clean, continue the rootless Podman lifecycle/control-plane
blocker by inspecting the backend scanner/backoff and package stop/start/
restart paths before touching
.198.
Progress in this resumed pass:
git diff --checkpassed./tmphas sufficient build headroom for focused Rust validation (/tmpwas 14% used at the start of the pass).- Focused Rust validation for Nextcloud/image-version work is still
inconclusive, not green:
env CARGO_INCREMENTAL=0 CARGO_TARGET_DIR=/tmp/archy-cargo-image-versions cargo test --manifest-path core/Cargo.toml -p archipelago container::image_versions::testscompiled through thearchipelagocrate, then the tool PTY stayed open with no activecargo,rustc, or linker process visible inps. - A bounded retry using the normal workspace target also did not finish:
timeout 300s cargo test --manifest-path core/Cargo.toml -p archipelago container::image_versions::testsexited124after compiling thearchipelagotest target without reaching test output. Keep the Nextcloud false-update rowin-progress. - Found and fixed a lifecycle asymmetry in
core/archipelago/src/api/rpc/package/runtime.rs:package.stopclaimed to return immediately but single-orchestrator apps still stopped synchronously before responding. The local change now lets migrated single-orchestrator apps return{"status":"stopping"}immediately and finish stop in the background, matching start/restart behavior. This is not deployed yet and still needs local validation. - Separate UI-only pass on port-review track:
- My Apps now preserves the last known backend package list when a later
scanner/backoff update reports
containers-scanned=falsewith an empty package map; - the page shows
Refreshing container state. Showing the last known app list until the scan finishes.above the app grid while cached app state is being rendered; - this touched only
neode-uiUI files and this handoff/tracker note, so it should not conflict with the backend app migration/control-plane pass; - focused validation passed:
npm test -- --run src/views/apps/__tests__/appPackageCache.test.tsandnpm run type-check. - Web5 Shared Content My Content tab now keeps the current content list
visible during refresh/failure and shows
Refreshing shared content...; - Web5 Shared Content Browse Peers tab now keeps the current peer content list
visible while refreshing the same peer, and shows
Refreshing peer content...instead of replacing the tab with a full loading panel; - switching to a different peer still clears stale content and shows the full connecting state;
- focused validation passed:
npm test -- --run src/views/web5/__tests__/Web5SharedContent.test.tsandnpm run type-check. - Local review services are running for user review:
Vite
http://localhost:8102//http://192.168.1.116:8102/and mock backendhttp://localhost:5959;curlprobes returned HTTP200for both the Vite root and proxiedserver.get-state.
- My Apps now preserves the last known backend package list when a later
scanner/backoff update reports
cargo fmt --manifest-path core/Cargo.toml --all --checkpassed after the stop-path fix.- Backend compile validation for the stop-path fix passed:
env CARGO_TARGET_DIR=/tmp/archy-cargo-runtime-check cargo check --manifest-path core/Cargo.toml -p archipelago --bin archipelago. The first check session also eventually returned success after the bounded rerun waited on its build-directory lock. git diff --checkpassed again after the stop-path edit and doc updates.- Follow-up inspection confirmed the lower-level Quadlet/orchestrator stop path
is already bounded:
quadlet::stop_serviceuses timedsystemctl --user stopwith app-scoped kill/reset recovery, and the runtime fallback treats missing containers as success. No additional lower-level stop change was made in this pass. - Latest backlog-fix pass stayed on the fixes tracker, not new app migration:
- backend
package.credentialsnow returns manifest-backed PhotoPrism credentials (admin/archipelago) directly, matching the existing UI fallback; - My Apps and mobile icon-grid credential pre-launch modals are centered vertically on mobile instead of behaving like bottom sheets;
- validation passed:
npm test -- --run src/views/apps/__tests__/appCredentials.test.ts src/views/apps/__tests__/AppIconGrid.test.ts,npm run type-check,env CARGO_TARGET_DIR=/tmp/archy-cargo-runtime-check timeout 300s cargo check --manifest-path core/Cargo.toml -p archipelago --bin archipelago,cargo fmt --manifest-path core/Cargo.toml --all --check, andgit diff --check.
- backend
- Focused Nextcloud/image-version Rust test is still not green:
env CARGO_INCREMENTAL=0 CARGO_TARGET_DIR=/tmp/archy-cargo-image-versions-2 timeout 600s cargo test --manifest-path core/Cargo.toml -p archipelago container::image_versions::tests -- --nocaptureagain exited124after compiling into thearchipelagocrate without reaching test output. Keep that tracker rowin-progress. - Continued the tab loading-state backlog:
- Web5 Connected Nodes Messages and Requests tabs keep populated lists visible during refresh or refresh failure;
- Web5 Identities keeps the current identity list visible during refresh or
refresh failure and shows
Refreshing identities...; - Web5 DWN message browsing keeps stored messages visible during refresh or
refresh failure and shows
Refreshing messages...; - validation passed:
npm test -- --run src/views/web5/__tests__/Web5ConnectedNodes.test.ts src/views/web5/__tests__/Web5Identities.test.ts src/views/web5/__tests__/Web5DWN.test.tsandnpm run type-check.
- Continued the same tab/loading-state backlog on Server networking:
- Server Network overview keeps current values visible during refresh/failure
and shows
Refreshing network...; - Server Network Interfaces keeps current detected interfaces visible during
refresh/failure and shows
Refreshing interfaces...; - Server Tor Services keeps existing hidden-service rows visible during
refresh/failure and shows
Refreshing Tor services...; - validation passed:
npm test -- --run src/views/__tests__/ServerNetworkRefresh.test.tsandnpm run type-check.
- Server Network overview keeps current values visible during refresh/failure
and shows
- Continued the same loading-state backlog on Credentials:
- the Credentials list keeps existing credential rows visible during
refresh/failure and shows
Refreshing credentials...; - validation passed:
npm test -- --run src/views/__tests__/CredentialsRefresh.test.ts src/views/__tests__/ServerNetworkRefresh.test.tsandnpm run type-check.
- the Credentials list keeps existing credential rows visible during
refresh/failure and shows
- Continued the same loading-state backlog on Lightning Channels:
- the channels list keeps existing channels visible during refresh/failure
and shows
Refreshing channels...; - validation passed:
npm test -- --run src/views/apps/__tests__/LightningChannels.test.ts src/views/__tests__/CredentialsRefresh.test.ts src/views/__tests__/ServerNetworkRefresh.test.tsandnpm run type-check.
- the channels list keeps existing channels visible during refresh/failure
and shows
- Continued the same loading-state backlog on Peer Files:
- the peer catalog keeps existing file cards visible during Tor
refresh/failure and shows
Refreshing peer files...; - validation passed:
npm test -- --run src/views/__tests__/PeerFilesRefresh.test.ts,npm run type-check, andgit diff --check.
- the peer catalog keeps existing file cards visible during Tor
refresh/failure and shows
- Continued the same loading-state backlog on Cloud peer cards:
- Cloud keeps existing peer cards visible during federation peer-list
refresh/failure and shows
Refreshing peer nodes...; - validation passed:
npm test -- --run src/views/__tests__/CloudPeersRefresh.test.ts src/views/__tests__/PeerFilesRefresh.test.ts,npm run type-check, andgit diff --check.
- Cloud keeps existing peer cards visible during federation peer-list
refresh/failure and shows
- Continued the same loading-state backlog on the Web5 Verifiable Credentials
summary:
- the summary keeps existing credential rows visible during refresh/failure
and shows
Refreshing credentials...; - validation passed:
npm test -- --run src/views/web5/__tests__/Web5CredentialsSummary.test.ts src/views/__tests__/CloudPeersRefresh.test.ts src/views/__tests__/PeerFilesRefresh.test.ts,npm run type-check, andgit diff --check.
- the summary keeps existing credential rows visible during refresh/failure
and shows
- Continued the same loading-state backlog on Web5 Nostr Relays:
- relay stats stay visible during refresh/failure and show
Refreshing relays...; - validation passed:
npm test -- --run src/views/web5/__tests__/Web5NostrRelays.test.ts src/views/web5/__tests__/Web5CredentialsSummary.test.ts src/views/__tests__/CloudPeersRefresh.test.ts src/views/__tests__/PeerFilesRefresh.test.ts,npm run type-check, andgit diff --check.
- relay stats stay visible during refresh/failure and show
- Continued the same loading-state backlog on Web5 Domains:
- registered-name counts stay visible during refresh/failure and show
Refreshing domains...; - validation passed:
npm test -- --run src/views/web5/__tests__/Web5Domains.test.ts src/views/web5/__tests__/Web5NostrRelays.test.ts src/views/web5/__tests__/Web5CredentialsSummary.test.ts src/views/__tests__/CloudPeersRefresh.test.ts src/views/__tests__/PeerFilesRefresh.test.ts,npm run type-check, andgit diff --check.
- registered-name counts stay visible during refresh/failure and show
- Continued the same loading-state backlog on Settings Backups:
- existing backup rows stay visible during refresh/failure and show
Refreshing backups...; - validation passed:
npm test -- --run src/views/settings/__tests__/BackupSection.test.ts src/views/web5/__tests__/Web5Domains.test.ts src/views/web5/__tests__/Web5NostrRelays.test.ts,npm run type-check, andgit diff --check.
- existing backup rows stay visible during refresh/failure and show
- Continued the same loading-state backlog on Settings Transport Preferences:
- existing preference controls stay visible during refresh/failure and show
Refreshing transport preferences...; - validation passed:
npm test -- --run src/views/settings/__tests__/TransportPrefsCard.test.ts src/views/settings/__tests__/BackupSection.test.ts,npm run type-check, andgit diff --check.
- existing preference controls stay visible during refresh/failure and show
- Continued the same loading-state backlog on Settings VPN status:
- current VPN connection details stay visible during refresh/failure and show
Refreshing VPN status...; - validation passed:
npm test -- --run src/views/settings/__tests__/VpnStatusSection.test.ts src/views/settings/__tests__/TransportPrefsCard.test.ts src/views/settings/__tests__/BackupSection.test.ts,npm run type-check, andgit diff --check.
- current VPN connection details stay visible during refresh/failure and show
- Continued the same loading-state backlog on Web5 Federation:
- summary node counts and node DID stay visible during refresh/failure and
show
Refreshing federation...; - validation passed:
npm test -- --run src/views/web5/__tests__/Web5Federation.test.ts,npm run type-check, andgit diff --check.
- summary node counts and node DID stay visible during refresh/failure and
show
- Continued the Mesh map denied-location backlog:
- added component coverage that browser geolocation denial remains optional and tells the user peer positions can still appear;
- validation passed:
npm test -- --run src/components/__tests__/MeshMap.test.ts,npm run type-check, andgit diff --check. - row remains
in-progressuntil browser smoke validates denied location with a real peer coordinate message.
- Continued the companion/tab-app backlog:
- mobile app-session keeps apps that require a new tab inside the mobile session fallback instead of auto-opening an external tab and closing;
- validation passed:
npm test -- --run src/views/__tests__/AppSessionMobileNewTab.test.ts src/views/appSession/__tests__/appSessionConfig.test.ts src/stores/__tests__/appLauncher.test.ts,npm run type-check, andgit diff --check. - row remains
in-progressuntil broader companion smoke testing is done.
- Continued the Nostr Discoverable Nodes UI backlog:
- Discover modal keeps existing discovered rows visible during relay
refresh/failure and shows
Searching relays...; - validation passed:
npm test -- --run src/views/federation/__tests__/DiscoverModal.test.ts,npm run type-check, andgit diff --check. - row remains
in-progressuntil live relay/trust validation is done.
- Discover modal keeps existing discovered rows visible during relay
refresh/failure and shows
- Continued the App Store screenshots backlog:
- Marketplace App Details and installed App Details no longer show fake screenshot placeholder tiles when no screenshot metadata exists;
- both views now render real screenshot URLs when metadata is provided as
strings or
{ src, alt }objects; - validation passed:
npm test -- --run src/views/appDetails/__tests__/AppContentSection.test.ts src/composables/__tests__/useMarketplaceApp.test.ts,npm run type-check, andgit diff --check; - row remains
in-progressuntil real screenshot assets/metadata are added.
- Continued the Home/App Store recommendations backlog:
- Home now shows an App Store recommendations card with up to three uninstalled core/recommended marketplace apps;
- the selector respects installed aliases, so recommended apps drop out once installed and then rely on normal My Apps/Home behavior;
- card clicks reuse the existing Marketplace App Details handoff;
- card animation ordering was tightened so Home cards have a stable stagger sequence as the recommendations card appears/disappears;
- validation passed:
npm test -- --run src/views/home/__tests__/homeRecommendations.test.ts,npm run type-check,git diff --check, andARCHY_BASE_URL=http://127.0.0.1:8103 npx playwright test e2e/visual-regression.spec.ts -g 'home / dashboard' --project=chromium; - temporary Vite on
8103was stopped after the smoke. An older local dev/mock session on8102/5959was already present and was left alone. - tracker row is
done.
- Home layout follow-up:
- Cloud was moved back into the second card slot;
- Recommended Apps moved into Cloud's previous position;
- Quick Start now lives inside the dashboard grid next to Wallet, with stacked goal buttons, instead of rendering as a separate odd-width row;
- validation passed:
npm test -- --run src/views/home/__tests__/homeRecommendations.test.ts,npm run type-check,git diff --check, andARCHY_BASE_URL=http://127.0.0.1:8102 npx playwright test e2e/visual-regression.spec.ts -g 'home / dashboard' --project=chromium.
- Continued the Easy Mode experience backlog:
- goal configure steps now route to their owning app/screen instead of silently completing without navigation;
- verify steps now show
Check & Continue, so goals that start with a verify step are no longer stuck without an active action; - configure/info/verify actions start goal progress before completing the current step;
- validation passed:
npm test -- --run src/views/goals/__tests__/goalStepActions.test.ts src/stores/__tests__/goals.test.ts,npm run type-check, andgit diff --check; - tracker row is
in-progressbecause broader Easy Mode product scope still needs review.
- Continued the setup screens/function/flow backlog:
- onboarding setup choice now shows only usable paths, Fresh Start and Restore from Seed;
- removed the disabled
Connect Existing (Coming Soon)option; - validation passed:
npm test -- --run src/views/__tests__/OnboardingOptions.test.ts src/composables/__tests__/useOnboarding.test.ts,npm run type-check, andgit diff --check; - tracker row is
in-progressbecause broader onboarding/setup audit still needs review.
Latest Local Checkpoint - 2026-06-10 05:30 EDT
User paused work to switch machines. No dev server or validation command should be intentionally left running from this checkpoint.
Latest local-only release-tracker work since the older .198 handoff:
- Uninstall/data reset:
- My Apps and App Details uninstall dialogs now include
Delete app data and reset it; - unchecked preserves app data and sends
preserve_data=true; - checked sends
preserve_data=false; - covered by
AppsUninstallModal.test.ts,rpc-client.test.ts, type-check, andgit diff --check; - tracker row is
done.
- My Apps and App Details uninstall dialogs now include
- Companion APK:
- companion intro modal uses
VITE_COMPANION_APK_URLor/packages/archipelago-companion.apk.zip; - desktop shows a centered QR image generated with the same
qrcodelibrary used by wallet flows; - mobile shows a direct download button;
- visible close button restored;
- APK exists at
neode-ui/public/packages/archipelago-companion.apk.zip; - tracker row is
done.
- companion intro modal uses
- Setup instructions:
- App Details sidebar renders
static-files.instructionswhen non-empty; - covered by
AppSidebar.test.ts, type-check, andgit diff --check; - tracker row is
done.
- App Details sidebar renders
- Fleet / tab loading:
- Fleet auto-refresh header/sort controls were tightened;
- node history no longer blanks during refresh and now shows
Refreshing history...; - covered by
useFleetData.test.ts, type-check, andgit diff --check; - tracker row remains
in-progresspending broader slow-tab audit.
- Bitcoin receive readiness:
- receive modals show a live
Checking Lightning wallet readiness...message while on-chain address generation is in flight; - shared helper now distinguishes LND REST/newaddress transport failures;
- covered by
bitcoinReceive.test.ts, type-check, andgit diff --check; - tracker row remains
in-progresspending live wallet-state smoke test.
- receive modals show a live
- Nextcloud false update:
- Nextcloud manifest/catalog/static UI metadata moved from
28to pinned29; - update comparison now ignores registry-host-only image changes while reporting same-repo tag drift;
python3 scripts/check-app-catalog-drift.py --release --strictpassed;cargo test -p archipelago container::image_versions::testsfromcore/failed first with a Rust linker/incremental artifact issue after/tmpwas full, then the non-incremental retry was killed because it ran too long;- old
/tmp/archy-cargo-*build-cache directories were removed and/tmprecovered to about 14% used; - tracker row is
in-progress; rerun the focused Rust test before marking done.
- Nextcloud manifest/catalog/static UI metadata moved from
- Dead/coming-soon UI:
- removed the non-interactive Spotlight AI Assistant coming-soon block;
- verified no active UI
Coming soonstrings remain outside historical release-note text; - type-check passed and
git diff --checkpassed; - tracker row is
done.
- No-registration credentials:
- added PhotoPrism fallback credentials from its manifest (
admin/archipelago); - did not add Grafana because its
GRAFANA_ADMIN_PASSWORDis not resolved to a known local secret/default in the repo; npm test -- --run src/views/apps/__tests__/appCredentials.test.tspassed;npm run type-checkpassed;- tracker row still
in-progressbecause other no-registration apps still need inventory.
- added PhotoPrism fallback credentials from its manifest (
Most recent validations before pause:
npm run type-checkpassed after the PhotoPrism credential fallback.npm test -- --run src/views/apps/__tests__/appCredentials.test.tspassed.git diff --checkpassed after the Spotlight cleanup and before the PhotoPrism fallback; rerun it after resuming.python3 scripts/check-app-catalog-drift.py --release --strictpassed during the Nextcloud pass.- Backend Rust focused validation for image versions is still not clean because of the local linker/incremental artifact failure and the killed retry; rerun from
core/when convenient.
Latest Known .198 State
- Host:
192.168.1.198. - Backend deployed:
/usr/local/bin/archipelagosha256159e0daf13fca2df7e831122cb0e6c84223a7e5b7433f5dd0b7eec263233e228. archipelago.service: active after deploy.archipelago-doctor.timer: inactive.archipelago-reconcile.timer: inactive.- No reboot validation should be started yet.
What Was Just Done
- Investigated current Fedimint Guardian UI report:
- live
.198RPC reportsfedimintasstartingandcontainer-health {"fedimint":"starting"}; - direct
http://192.168.1.198:8175/returns HTTP000because the manifest wrapper has not exec'dfedimintdyet; bitcoin-knotsisrunningandhttp://192.168.1.198:8334/returns HTTP200;bitcoin.statusRPC returned an operation-failed error during the check, consistent with the current Bitcoin-dependent-app wait-state problem.
- live
- Added frontend Fedimint-specific wait-state copy:
- My Apps/App card now says
Waiting for Bitcoin to finish initial sync before Guardian starts.when Fedimint is starting or running withhealth=starting; - App session fallback title now says
Waiting for Bitcoin syncinstead of genericApp not reachablefor that state.
- My Apps/App card now says
- Validated frontend changes:
npm test -- --run src/views/apps/__tests__/appsConfig.test.tspassed (7tests);npm run type-checkpassed;npm run buildpassed.
- Deployed rebuilt static frontend to
.198only:- preserved
aiui/andclaude-login.html; - backed up previous web root at
/opt/archipelago/rollback/web-ui-fedimint-ui-20260610-042927.tar; - reloaded nginx;
- confirmed deployed assets contain the new Fedimint copy.
- preserved
- Fixed Fedimint Guardian launch on
.198while Bitcoin is still syncing:- added
docker/fedimint-ui, an nginx wait/proxy companion; - changed Fedimint backend manifest so real Guardian UI maps to host
8177instead of the public launch port; - public launch port
8175is now owned byarchy-fedimint-ui, which servesWaiting for Bitcoin syncuntilfedimintdbinds behind it; - fixed the Fedimint wait command to avoid
printf '%s'in QuadletExec=because systemd expands%sto the user shell (/bin/bash); - live
.198fedimint.serviceunit hasTimeoutStartSec=infinityso systemd does not kill the intentional Bitcoin-sync wait loop; - rebuilt and deployed frontend static files so Fedimint remains launchable while
health=starting; - confirmed
http://192.168.1.198:8175/returns HTTP200withWaiting for Bitcoin sync.
- added
- Restyled the Fedimint wait/proxy page:
docker/fedimint-ui/index.htmlnow uses Archipelago-styleglass-card, app icon block, Montserrat-like heading stack, orange focus/glow accents, and yellow starting badge styling;- rebuilt
localhost/fedimint-ui:lateston.198; - restarting
archy-fedimint-ui.servicehit the known rootless Podman cleanup slowness and left the unit temporarilydeactivating; - recovered with app-scoped
systemctl --user kill --kill-whom=all -s SIGKILL archy-fedimint-ui.service,reset-failed, andstart; - final LAN validation:
http://192.168.1.198:8175/returns HTTP200, size6419, and containsglass-card,app-icon,Archipelago App, andWaiting for Bitcoin sync.
- Updated the Fedimint wait/proxy page again per design feedback:
- uses the Bitcoin custom UI's
/assets/img/bg-network.jpgfull-screen background + dark overlay pattern; - uses the real Fedimint icon inside the Bitcoin custom UI
logo-gradient-bordertreatment instead of text initials; - copied those assets into
docker/fedimint-ui/assets/; - rebuilt
localhost/fedimint-ui:lateston.198; - fixed nginx routing so
/assets/...is served statically instead of being proxied to the not-yet-running Guardian backend; - corrected the companion page to reference
fedimint.jpgbecause the catalog icon bytes are JPEG despite the old.pngextension; - final LAN validation:
http://192.168.1.198:8175/returns HTTP200, size11328;/assets/img/app-icons/fedimint.jpgreturns200 image/jpeg;/assets/img/bg-network.jpgreturns200 image/jpeg; - Playwright render validation confirmed title
Fedimint Guardian, statusWaiting for Bitcoin sync, background URL/assets/img/bg-network.jpg, and icon natural width860.
- uses the Bitcoin custom UI's
- Hardened Fedimint/backend lifecycle enough for this path:
- generated Quadlet services now include
TimeoutStartSec=0so systemd does not kill dependency-gated container entrypoints while they wait for Bitcoin IBD; package.restartnow returns{"status":"restarting"}immediately instead of blocking the RPC call for minutes in the single-orchestrator path;quadlet::restart_servicenow uses bounded stop/start, app-scoped kill/reset recovery, and settle waits instead of opaquesystemctl restart;- deployed backend hash
159e0daf13fca2df7e831122cb0e6c84223a7e5b7433f5dd0b7eec263233e228to.198; - backup made at
/opt/archipelago/rollback/archipelago-before-quadlet-timeout0-20260610-082535; package.restart fedimintreturned{"status":"restarting"}in0s;- restart observation:
8175stayed HTTP200throughout; generatedfedimint.containergainedTimeoutStartSec=0;fedimint.serviceandarchy-fedimint-ui.servicesettledactive; ports8175and8177listened.
- generated Quadlet services now include
- Final Fedimint live validation after restart:
container-healthreturned{"fedimint":"healthy"};container-listreturnedfedimintstate:"running"andlan_address:"http://localhost:8175";- services:
fedimint.serviceactive,archy-fedimint-ui.serviceactive; - unit contains
TimeoutStartSec=0at line42; - public wait/proxy UI and both image assets returned
200.
- Fedimint live rollback references:
- previous frontend backup:
/opt/archipelago/rollback/web-ui-fedimint-guardian-launch-20260610-045949.tar; - previous Fedimint Quadlet backup:
/home/archipelago/.config/containers/systemd/fedimint.container.guardian-fix-rewrite-20260610-050607.bak.
- previous frontend backup:
- Earlier backend hash
7f58da80063f58574675256913ac9cddf131e65d8935015748a70adffc228f83was superseded by159e0daf13fca2df7e831122cb0e6c84223a7e5b7433f5dd0b7eec263233e228. - Added explicit release gates:
- app packaging docs must match current manifest/runtime contract before
1.8-alpha; - refactor/remove-dead-code is mandatory before
1.8-alpha, after correctness validation and before final ISO/release gates.
- app packaging docs must match current manifest/runtime contract before
- Validated IndeeHub:
container-listreportedindeedhubrunning;container-healthreturned{"indeedhub":"healthy"};http://192.168.1.198:7778/returned HTTP200;http://192.168.1.198:7778/nostr-provider.jsreturned HTTP200and contains the Archipelago NIP-07/NIP-98 provider shim.
- Validated Immich launch:
http://192.168.1.198:2283/returned HTTP200;- one
container-healthcheck returned{"immich":"unknown"}, so health truthfulness still needs follow-up.
- Fixed Tailscale launch UI:
- patched
app-catalog/catalog.json,neode-ui/public/catalog.json, andscripts/first-boot-containers.sh; - command now waits for
/var/run/tailscale/tailscaled.sockbefore startingtailscale web; - copied updated catalog to
/opt/archipelago/web-ui/catalog.jsonon.198; - patched the live generated Tailscale
.containerunit and restarted onlytailscale.service; - confirmed
container-listreports Tailscale running; - confirmed
container-healthreturns{"tailscale":"healthy"}; - confirmed
http://192.168.1.198:8240/returns HTTP200with Tailscale UI content.
- patched
Important Caveat
Tailscale launch is fixed, but Tailscale lifecycle is not fully passing:
package.restart tailscalefailed through RPC withpodman ps timed out while listing containers.- Manual app-scoped restart showed old container stop needed SIGKILL and Podman cleanup took roughly 2 minutes.
- Logs still showed
podman ps timed out,podman stats timed out, scan backoff, and slow cleanup.
This confirms the active blocker is the rootless Podman control-plane/lifecycle path, not just individual app launch URLs.
Active Blockers
- Rootless Podman/control-plane responsiveness:
podman psand cleanup paths time out;- backend scan/backoff causes stale or slow UI state;
- app stop/start/restart can look frozen or fail through RPC.
- My Apps state truthfulness:
- do not show false empty/no-apps while scanner/Podman is in backoff;
- preserve last-known apps and show explicit stale/checking state.
- Progress UX:
- install/uninstall/start/stop/restart must show meaningful phase progress and not appear frozen.
- Immich health truthfulness:
- HTTP launch works, but health may still report
unknown.
- HTTP launch works, but health may still report
- Portainer:
- HTTP
9000returned200; - user still needs to retry environment wizard and confirm
/var/run/docker.sockworks.
- HTTP
- Fedimint:
- public Guardian launch URL now loads on
8175even while Bitcoin is in IBD; archy-fedimint-uiowns8175and proxies to the real Guardian backend on8177whenfedimintdeventually starts;- durable manifest/companion/frontend/backend changes are now deployed on
.198; package.restart fedimintfast-returned and settled active withTimeoutStartSec=0, but keep Fedimint in the broader lifecycle matrix because rootless Podman cleanup slowness remains a systemic blocker.
- public Guardian launch URL now loads on
- Reboot validation:
- require at least 3 clean consecutive post-fix reboots with broad lifecycle green after each;
- prefer 5 clean reboots;
- do not start until lifecycle/control-plane is stable.
- App packaging docs:
- aligned
docs/APP-PACKAGING-MIGRATION-PLAN.mdanddocs/app-developer-guide.mdwith the current manifest/runtime contract.
- aligned
- Refactor/remove-dead-code:
- required before
1.8-alpha; - remove stale per-app hacks, duplicate lifecycle paths, stale fallback metadata, misleading compatibility shims;
- rerun release gates afterward.
- required before
Local Validation Already Run
bash -n tests/lifecycle/remote-lifecycle.shpassed.bash -n scripts/first-boot-containers.sh tests/lifecycle/remote-lifecycle.shpassed.cargo fmt --manifest-path core/Cargo.toml --allwas run.cargo test --manifest-path core/Cargo.toml -p archipelago-containerpassed (45tests).cargo check --manifest-path core/Cargo.toml -p archipelago -p archipelago-containerpassed.python3 scripts/check-app-catalog-drift.py --release --strictpassed.cmp -s app-catalog/catalog.json neode-ui/public/catalog.jsonpassed.git diff --checkpassed.npm test -- --run src/views/apps/__tests__/appsConfig.test.tspassed.npm run type-checkpassed.npm run buildpassed.python3 scripts/check-app-catalog-drift.py --release --strictpassed after Fedimint manifest changes.git diff --checkpassed for Fedimint manifest, companion, frontend, and newdocker/fedimint-uifiles.cargo fmt --manifest-path core/Cargo.toml --allpassed.CARGO_TARGET_DIR=/tmp/archy-cargo-check-quadlet cargo check --manifest-path core/Cargo.toml -p archipelago -p archipelago-containerpassed after Quadlet/restart changes.CARGO_TARGET_DIR=/tmp/archy-cargo-final-quadlet cargo build --manifest-path core/Cargo.toml -p archipelago --bin archipelago --releaseproduced the deployed backend binary (tool PTY heartbeat wrapper became stale after link; artifact hash was validated separately before deploy).- Live Fedimint restart validation passed on
.198:package.restart fedimintreturned{"status":"restarting"}immediately;8175remained HTTP200;fedimint.serviceandarchy-fedimint-ui.servicesettledactive;container-health fedimintreturnedhealthy.
cargo test --manifest-path core/Cargo.toml -p archipelago companion::testscompiled then the tool PTY stuck with no activecargo/rustcprocess visible; treat as inconclusive, not failed.- Filtered
cargo test --manifest-path core/Cargo.toml -p archipelago --bin archipelago indeedhubappeared wedged in the tool PTY after compilation started; no local cargo/rustc worker remained visible. Treat as inconclusive, not failed.
Immediate Next Step
Do not reboot yet.
Start with the rootless Podman lifecycle/control-plane blocker:
- Inspect the backend stop/start/restart path around
package.restart, scanner backoff, andpodman psdependency. - Make stop/restart tolerate slow cleanup without wedging RPC/UI state.
- Keep last-known app state during scanner backoff.
- Revalidate focused apps on
.198:tailscale,indeedhub,immich,portainer,vaultwarden,botfights; keepfedimintin the matrix but its focused Guardian launch/restart path is currently green. - Only after focused lifecycle is clean, run broad non-destructive lifecycle.
- Only after that, begin 3/5 reboot validation.
Files Touched In Last Mini-Pass
docs/NEXT_TERMINAL_HANDOFF.md- this file.neode-ui/src/views/apps/appsConfig.ts- Fedimint launch-blocked reason helper.neode-ui/src/views/apps/AppCard.vue- show Fedimint Bitcoin-sync wait copy on app cards.neode-ui/src/views/AppSession.vue- pass app-specific blocked reason into app session.neode-ui/src/views/appSession/AppSessionFrame.vue- show app-specific blocked title/reason instead of generic unreachable fallback.neode-ui/src/views/apps/__tests__/appsConfig.test.ts- regression coverage for Fedimint wait-state copy.apps/fedimint/manifest.yml- backend real Guardian UI now maps host8177and wait command avoids systemd%expansion.core/archipelago/src/container/companion.rs- addedarchy-fedimint-uicompanion mapping.core/archipelago/src/container/quadlet.rs- generated unitTimeoutStartSec=0plus bounded stop/restart recovery helpers.core/archipelago/src/api/rpc/package/runtime.rs- restart RPC returns immediately and runs restart async.docker/fedimint-ui/- new nginx wait/proxy companion image for Fedimint Guardian launch.docs/RESUME.md- checkpoint and gates.docs/MIGRATION_STATUS_REPORT.md- packaging/refactor release gates.docs/CONTAINER_LIFECYCLE_HANDOFF.md- packaging/refactor release gates.docs/APP-PACKAGING-MIGRATION-PLAN.md- updated manifest/runtime contract documentation.docs/app-developer-guide.md- updated manifest/runtime contract documentation.docs/MIGRATION_STATUS_REPORT.md- noted that the docs gate is being closed in this pass.app-catalog/catalog.json- Tailscale socket-wait startup command.neode-ui/public/catalog.json- same Tailscale catalog update.scripts/first-boot-containers.sh- same Tailscale first-boot startup update.neode-ui/src/views/apps/appPackageCache.ts- UI-only last-known package cache for scanner backoff.neode-ui/src/views/apps/__tests__/appPackageCache.test.ts- cache behavior coverage.neode-ui/src/views/Apps.vue- uses cached packages during scanner backoff and shows a refresh status banner.docs/1.8-alpha-improvements-tracker.md- noted My Apps backoff cache improvement.neode-ui/src/views/web5/Web5SharedContent.vue- preserves shared/peer content during refresh and shows compact refresh states.neode-ui/src/views/web5/__tests__/Web5SharedContent.test.ts- shared and peer content refresh regression coverage.
The worktree has many other pre-existing release-hardening changes. Do not revert unrelated dirty files.