Cuprate: disk-fill gate + Cuprate UI companion dashboard #157
Closed
ssmithx
wants to merge 0 commits from
cuprate-fixes into main
pull from: cuprate-fixes
merge into: :main
:main
:fix/paid-content-payment-not-lost
:fix/mint-error-detail-swallowed
:investigate/framework-lnd-startup
:fix/minibits-already-redeemed
:cuprate-fixes
:feature/dojobay-app
:fix/bitcoin-core-tor-service-name
:docs/openwrt-gateway-setup
:cuprate-cpu-fix
:fix/cuprate-explicit-logging-levels
:companion/session-2026-08-31
:companion/0.5.28-deploy-handoff
:companion/0.5.28-ship
:companion/0.5.28
:app-bumps-mirror-pending
:cuprate-archyapp
:docs/todo-list
:companion/0.5.27-version-meta
:companion/0.5.27-ship
:companion/0.5.27-clipboard-qr-restart
:ux-at-last
:fix/mesh-send-content-inline-federation-fallback
:cashu-error-messages
:gsd/phase-13-aiui-functional-conversational-node-control-and-content-surf
:feat/podsteadr-app-package
:rotate-release-root
:chore/aiui-monorepo-migration
:wip/phase-13-p13-02
:wip/phase-13-p13-01
:fix/bitcoin-conf-conflict-crash-loop
:demo-build
:archy-hwconfig
:openwrt-enhancements
:a3-10-endpoint-fallback
:public-prelaunch
:release/1.7.115-prep
:fix/web-listener-ipv6
:fips-companion-5g-hardening
:fix/connection-accept-deadlock
:fix/demo-images-path-filter
:fix/companion-autologin-replay-intro
:networking-profits-dashboard
:identities-mobile-polish
:companion-qr-scan-fix
:companion-qr-pairing
:intro-reliability-video-perf
:login-bg-continuity
:audio-bottom-bar
:demo-intro-every-visit
:intro-entrance-fixes
:cloud-feedback-demo-content
:cloud-tabs-search
:ark-wallet-ui-demo
:demo-nginx-app-assets
:demo-ui-fixes
:ark-wallet-barkd
No Reviewers
Labels
Clear labels
companion-agent
queued
roadmap
waiting-external
Companion-app agent's handover list (node-side parts tracked separately)
Triaged, next in this session's queue after current release work
Feature/effort item, deliberately unscheduled — needs scoping + a slot, not a fix today
Waiting on a person outside this session (tester, operator)
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: lfg2025/archy#157
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Why
Cuprate was filling the disk until Archipelago crashed. Upstream cuprate has no on-disk pruning (verified against
cuprated/src/config.rs; itspruningcrate is Monero's p2p protocol pruning), so it cannot do what bitcoin-knots/core do (self-prune below a disk threshold). The safe equivalent is to refuse to run rather than let an unprunable ~250 GiB chain overrun the filesystem.Changes
Disk-safety gate (
450 GBtotal,crate::constants::CUPRATE_MIN_DISK_GB— single source)package.start,package.restart,package.updateall refuse with an actionable message; boot reconcile skips an already-installed cuprate on a shrunken disk (Left("cuprate-insufficient-disk"), recorded beforeensure_runningso desired-state recovery can't undo it)apps/cuprate/manifest.ymlstorage/disk_limit raised 300Gi -> 450Gi so manifest-driven surfaces match what is enforcedCuprate UI companion (
cuprate-ui, port 18091)docker/cuprate-ui/: host-networked nginx on 127.0.0.1:18091 (auth: gated, session_passthrough), session-gated/cuprate-rpc/proxy to the restricted RPC (18090), dark-glass dashboard: sync progress (handles Monero'starget_height: 0= synced sentinel), peers, mempool, chain size, free disk, wallet remote-node endpoint; offline state explains the disk gatecompanion.rs(archy-cuprate-ui); UI_APP_IDS, health tier, image pin, mesh launch portcuprate -> cuprate-uialias, icon, vite dev proxyReview round (see commits): restart/update gate bypasses,
target_height: 0misread, manifest 300Gi vs enforced 450, duplicated 450 constant unified intocrate::constants.Verification
cargo test -p archipelago --bins: 1450 passed; the 24 failures are pre-existing podman-environment failures identical on main (dev box has no podman)cuprate(450Gi) +cuprate-ui; registry-trust preflight OK; drift check clean⚠️ Signing notes — REQUIRED before this ships
releases/app-catalog.jsonis committed UNSIGNED.scripts/generate-app-catalog.shcannot sign (mnemonic is terminal-only, never stored). Before publishing this catalog to the OVH origin, runscripts/sign-catalog.sh(paste the 24-word release master mnemonic; it preflights registry trust and verifies the expected release-root keydid:key:z6Mkfu5…DLWT). Nodes reject an unsigned/invalid-signature catalog — committing without signing is fine, publishing without signing breaks the fleet's catalog.docker/cuprate-uiand pushsource.archipelago-foundation.org/lfg2025/cuprate-ui:1.7.123-alpha(the pin inscripts/image-versions.sh). Nodes without the local build context pull this as their fallback; until it exists only local-build nodes get the UI.tests/lifecycle/run-gate.sh) — install/UI/stop/start/restart/reinstall/reboot-survive — plus a manual check of the disk gate on a <450 GB node (install/start/restart/update must all refuse with the explanatory message).Do not merge-and-publish the catalog before step 1.
Maintainer review in progress. The local Cuprate UI image builds successfully as
localhost/cuprate-ui:review(nginx, port 18091). However,cargo fmt --all -- --checkcurrently fails on generatedcore/archipelago/src/fips/app_ports.rs; please format that file before merge. The targeted disk-gate tests are still running on the review worktree. No merge yet; catalog/signing and node UAT remain required.The targeted Cuprate test compile was not completed in this review window (the isolated worktree triggered a long cold Rust build and was stopped to avoid leaving a runaway compiler). This is not a pass; please include the test result with the formatting fix before merge.
Additional local check: the review image serves HTTP 200 on port 18091 when run with host networking, as declared by the manifest. A normal bridged
-prun cannot reach nginx because its config intentionally binds 127.0.0.1 inside the container; this is expected for the host-network design, but should remain documented. Still blocked on formatting and targeted test result.I pushed commit
cb567056to this PR for pre-manifest UAT: the dashboard now follows the Bitcoin UI header/card rhythm, keeps only Cuprate/Monero-accurate fields, and removes the cross-node pruning/disk-policy comparison text. The rebuilt image is running temporarily on the review node at port 28091 for visual testing.5441415a3dto5441415a3d6b8535fca7to6b8535fca7Cuprate has no pruning — verified against upstream main (binaries/cuprated/src/config.rs): the 'pruning' crate is Monero's p2p protocol pruning, not on-disk. Unlike the bitcoin apps, which branch on DISK_GB in their entrypoint and self-prune, a disk-constrained cuprate can only sync until the filesystem fills and take Archipelago down. Translate the bitcoin disk-awareness into the only form cuprate can honor — refuse rather than prune: - install (sync + async RPC paths) and package.start fail with an actionable message below CUPRATE_MIN_DISK_GB (450 GB total: chain ~250 GiB + headroom; allows 500 GB-class, refuses the 250 GB VPS) - boot reconcile skips an already-installed cuprate on a shrunken disk, recorded as Left("cuprate-insufficient-disk") before ensure_running so desired-state recovery can never undo it (same shape as requires-archival-bitcoin) - df failure fail-opens at install (never block on an unreadable disk), fail-closes at boot (never start a doomed sync) prod_orchestrator also registers cuprate-ui in UI_APP_IDS (its companion commit follows).6b8535fca7to00682e642000682e6420to00682e6420Pull request closed