package.start/restart installs an app that isn't installed #167
Closed
opened 2026-10-24 19:40:12 +00:00 by ssmithx
·
2 comments
No Branch/Tag Specified
main
pr/feat/first-install-owner-network-20261112
pr/demo-intro-ux-polish
docs/security-audit-2.0.3-alpha
docs/fips-compute-market-proposal
feat/routstr-fips-llama
docs/ui-uat-pr-rule
fix/routstr-xcashu-change
fix/lifecycle-lock-wait
fix/btcpay-db-password
feat/podsteadr-app
feat/qortal-app
fix/quadlet-iec-memory-limits
feat/podsteadr-app-package
arm64-pi-test
feat/nostr-vpn-seller-app
work/terminal-developer-spec-20261009
feat/justworks-integration-review
conduit-market-archyapp
fix/gitea-portainer-20260930
fix/app-install-lifecycle-20260930
fix/filebrowser-purchase-filing
fix/ecash-paid-download-v2-keyset
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
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
v2.1.22
v2.1.21
v2.1.2-beta
v1.9.1-alpha
v1.9.0-alpha
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#167
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.
Summary
package.start(andpackage.restart) on an app that is not installed silently installs it: it pulls images, creates containers and data directories under/var/lib/archipelago/<app>, and marks the app installed. Start/restart should refuse with an error such as " is not installed".How it was found
While running the lifecycle gate (
tests/lifecycle/run-gate.sh) on a test node, the per-app suites for bitcoin-knots, electrumx, immich and lnd ran their stop → start → restart tests against apps that were not installed. Instead of failing, the start step installed all four apps (≈24 GB of chain/index data was created before they were cleaned up). Installed-app set before the run had none of them; after the run, all four were in My Apps.Code path (main @
fcc18b39)api/rpc/package/runtime.rspackage.starthandler: validates the id, takes the lifecycle lock, resolvesto_startfrom the manifest/stack membership, clears user-stopped markers — no check that the app is installed.container/prod_orchestrator.rsstart()(~L5245): when there is no installed quadlet unit it falls through, thenclear_user_uninstalled(app_id)andmark_installed(app_id)— actively reversing a prior uninstall, andensure_running(&lm), which usesReconcileMode::InstallMissing→install_freshwhen no container exists.restart()(~L5404) ends up on the same path for a non-unit app, and the split-stack fallback ("member restart failed; falling back to start") does the same per member.Expected
package.start/package.restarton an app with no installed record (not ininstalled/was_installed, no container, no quadlet unit) returns an error and changes nothing on disk.start()should onlymark_installed/clear_user_uninstalledfor apps that are actually installed; installing ispackage.install's job.startreachesensure_runningwith a missing container) — so the check should key on the durable installed record, not on container presence.Suggested tests
mark_installed.uninstall(preserve_data) → error,user_uninstalledmarker untouched.skipwhen the app isn't installed rather than relying on start to install it.🤖 Generated with Claude Code
Mirrored on ngit: issue
2dabc976464ac7d2f52a2bd71a64d5749381fef9fc5e6d9b25a7cc9e6f20a414— https://gitworkshop.dev/nevent1qqszm27fwery437j754zh4c6vn2hfyuplmulchndnvj60ny7dus2g9qpz3mhxue69uhhyetvv9ujumn8d96zuer9wc9q948mClosing this duplicate tracker record in favor of the canonical ngit issue. The full report and regression requirements are retained there.
The canonical issue remains open while the next-release verification is completed; this duplicate closure does not claim the bug is resolved.