Show readiness reason first and record live dashboard acceptance
Demo images / Build & push demo images (push) Failing after 45s

This commit is contained in:
archipelago
2026-09-30 13:46:16 -04:00
parent c1e20a71ae
commit 1724ea05d1
3 changed files with 39 additions and 10 deletions
+35 -6
View File
@@ -46,9 +46,9 @@ completed. See PR review for the accepted scope and coverage limits.
## Final release checklist ## Final release checklist
- [ ] Finish all new-scope implementation and specific acceptance above. - [ ] Finish all new-scope implementation and specific acceptance above.
- [ ] Remove disposable fixtures and temporary test overrides; verify native - [x] Remove disposable fixtures and temporary test overrides; verify native
Bitcoin/LND identity and start-state baselines remain protected. Bitcoin/LND identity and start-state baselines remain protected.
- [ ] Commit and push completed source changes to git and ngit. - [x] Commit and push completed source changes to git and ngit.
- [ ] Run final backend/UI/regression/release gates on the final source; inspect - [ ] Run final backend/UI/regression/release gates on the final source; inspect
skipped tests and report actual hardware/runtime coverage. skipped tests and report actual hardware/runtime coverage.
- [ ] Prepare compatible signed app catalog; old runtimes must not apply a - [ ] Prepare compatible signed app catalog; old runtimes must not apply a
@@ -127,7 +127,7 @@ across reboot; it does not substitute for final new-runtime delivery checks.
restored beside the real `mempool` frontend. Shared scanner canonicalization restored beside the real `mempool` frontend. Shared scanner canonicalization
fixes live and absent-container paths without deleting installed markers. fixes live and absent-container paths without deleting installed markers.
Frontend suppresses aliases only while a canonical tile exists. Frontend suppresses aliases only while a canonical tile exists.
- Readiness text names the app: “Waiting for Gitea…”. It shares the status row, - Readiness text names the app and condition: “Web UI not ready: Gitea”. It shares the status row,
with full text available through its title; card actions use bottom alignment. with full text available through its title; card actions use bottom alignment.
- Angor uses the operator-supplied dark-mode icon with green outer corners. - Angor uses the operator-supplied dark-mode icon with green outer corners.
Built-in imagegen prompt: fill transparent/white corners with the existing Built-in imagegen prompt: fill transparent/white corners with the existing
@@ -155,15 +155,15 @@ rootless Quadlet service with its declared port and network.
Runtime promotion and the legacy installer-directory repair now finish before Runtime promotion and the legacy installer-directory repair now finish before
orchestrator construction. The background doctor no longer changes that tree. orchestrator construction. The background doctor no longer changes that tree.
The final source backend suite passed 1,608 tests (four existing opt-in tests The final source backend suite passed 1,608 tests (four existing opt-in tests
ignored). Optimized build and normal-path live restart verification remain pending. ignored). Optimized build and normal-path live startup/restart verification have now passed (see final follow-up below).
Actual dev Angor acceptance passed managed service identity, no capabilities, Actual dev Angor acceptance passed managed service identity, no capabilities,
UID 101:101, archy-net, public block height, CORS and both fee URL forms. During UID 101:101, archy-net, public block height, CORS and both fee URL forms. During
Bitcoin initial sync, the real Mempool fee API returns 503; the adapter faithfully Bitcoin initial sync, the real Mempool fee API returns 503; the adapter faithfully
returns the same status and body. Full-sync fee availability remains unverified; returns the same status and body. Full-sync fee availability remains unverified;
ready-backend API and failure/recovery behavior passed the isolated live fixture. ready-backend API and failure/recovery behavior passed the isolated live fixture.
The temporary `/run/archy-candidate-manifests` snapshot override must be removed The temporary `/run/archy-candidate-manifests` snapshot override and snapshot
when deploying the startup-order fix, then normal startup/reload must be checked. are now removed; normal startup/reload verification passed.
The latest complete UI suite passed 140 files / 1,132 tests. Release preflight The latest complete UI suite passed 140 files / 1,132 tests. Release preflight
passed all static, manifest, catalog, type and UI gates. The requested named passed all static, manifest, catalog, type and UI gates. The requested named
@@ -196,3 +196,32 @@ managed Angor restarts. No new release version/tag, OTA or ISO has been created.
- Phoenixd has no browser UI. Headless services now omit web-readiness messages; - Phoenixd has no browser UI. Headless services now omit web-readiness messages;
actual browser apps name their web interface rather than waiting for actual browser apps name their web interface rather than waiting for
themselves. Focused 23 UI tests and production build passed; deployed to dev. themselves. Focused 23 UI tests and production build passed; deployed to dev.
## Final live follow-up: all three reported readiness/display defects fixed
- Final optimized backend is deployed on dev. Bitcoin Core's launch address is
`http://localhost:8334` and `ui-ready` is true during initial block download.
Live verification recorded height 293,855 with `initialblockdownload=true`.
Chromium at 1440 and 390 pixels opened the embedded dashboard, read a numeric
current block height, and repeated that check after hard refresh.
- One healthy Mempool remains in server state and in desktop/mobile My Apps
after hard refresh. Its durable install markers were preserved.
- Phoenixd remains a running headless service without a web launcher or false
web-readiness message. Desktop/mobile browser checks passed. For actual web
apps, the compact copy is “Web UI not ready: [app]”; the reason comes first so
narrower cards do not truncate it into a misleading self-dependency.
- Five normal management startup and managed Angor restart cycles passed
across the two acceptance logs. The retry harness uses bounded readiness
polling; it does not accept a running container alone as API readiness.
Disk + catalog manifest count remained 62 across startup refreshes, replacing
the previous 62-to-54 failure. Temporary override and snapshot are removed.
- Final backend tests: 1,609 passed, zero failed, four existing opt-in ignored.
Final UI tests: 140 files / 1,133 passed. Production UI build passed and is live.
Bitcoin/LND container identities and start timestamps stayed unchanged.
- Evidence: `/tmp/archy-dashboard-address-deploy.log`,
`/tmp/archy-bitcoin-ibd-browser.log`, `/tmp/archy-mempool-live-browser.log`,
`/tmp/archy-service-readiness-browser.log`,
`/tmp/archy-runtime-order-remaining-cycles.log`, and
`/tmp/archy-readiness-final-ui-tests.log`.
- These are live development fixes. The new signed catalog, versioned OTA and
raw ISO still need preparation, artifact verification, signing and publication.
@@ -167,7 +167,7 @@ describe('appsConfig service filtering', () => {
pkg.health = null pkg.health = null
expect(isAppReadyForLaunch(pkg)).toBe(false) expect(isAppReadyForLaunch(pkg)).toBe(false)
expect(canLaunch(pkg)).toBe(false) expect(canLaunch(pkg)).toBe(false)
expect(launchBlockedReason(pkg.manifest.id, pkg)).toBe('Waiting for GitWorkshop’s web interface…') expect(launchBlockedReason(pkg.manifest.id, pkg)).toBe('Web UI not ready: GitWorkshop')
pkg.health = 'healthy' pkg.health = 'healthy'
expect(canLaunch(pkg)).toBe(true) expect(canLaunch(pkg)).toBe(true)
}) })
@@ -214,7 +214,7 @@ describe('HTTP readiness independent of container health', () => {
pkg.health = 'healthy' pkg.health = 'healthy'
expect(canLaunch(pkg)).toBe(false) expect(canLaunch(pkg)).toBe(false)
expect(isAppReadyForLaunch(pkg)).toBe(false) expect(isAppReadyForLaunch(pkg)).toBe(false)
expect(launchBlockedReason(id, pkg)).toBe(`Waiting for ${resolveAppTitle(id, pkg)}’s web interface…`) expect(launchBlockedReason(id, pkg)).toBe(`Web UI not ready: ${resolveAppTitle(id, pkg)}`)
pkg['ui-ready'] = true pkg['ui-ready'] = true
expect(isAppReadyForLaunch(pkg)).toBe(true) expect(isAppReadyForLaunch(pkg)).toBe(true)
} }
+2 -2
View File
@@ -308,7 +308,7 @@ export function launchBlockedReason(id: string, pkg?: PackageDataEntry | null):
if (pkg && isWebsitePackage(appId, pkg)) return '' if (pkg && isWebsitePackage(appId, pkg)) return ''
if (pkg?.['ui-ready'] === false && !isServicePackage(appId, pkg)) { if (pkg?.['ui-ready'] === false && !isServicePackage(appId, pkg)) {
if (pkg.state === PackageState.Stopped || pkg.state === PackageState.Exited) return 'App is stopped. Start it to open it.' if (pkg.state === PackageState.Stopped || pkg.state === PackageState.Exited) return 'App is stopped. Start it to open it.'
return `Waiting for ${title}’s web interface…` return `Web UI not ready: ${title}`
} }
if ( if (
(appId === 'fedimint' || appId === 'fedimintd') && (appId === 'fedimint' || appId === 'fedimintd') &&
@@ -317,7 +317,7 @@ export function launchBlockedReason(id: string, pkg?: PackageDataEntry | null):
return 'Guardian opens a wait page until Bitcoin finishes initial sync.' return 'Guardian opens a wait page until Bitcoin finishes initial sync.'
} }
if (pkg && pkg.state === PackageState.Running && !isAppReadyForLaunch(pkg)) { if (pkg && pkg.state === PackageState.Running && !isAppReadyForLaunch(pkg)) {
return `Waiting for ${title}’s web interface…` return `Web UI not ready: ${title}`
} }
return '' return ''
} }