> and we have a container called “bold_lichterman” which I have no idea what it is
> great, let's finish it off
# Session Resume - 2026-04-24
## Latest user directives (must be followed first)
> please continue, please state my last comment in the resume doc and first before making this plan to adhere to
> And we need to get every container working on .116 and tested before we release
> we have no time requirements so the best path is the way
> Continue, leave release gate as a reminder later it won’t happen for a while
> we only work via fuse thinkpad
> all code has to be local changes to .116 (that machine) code and repo
> we are not working on this machine is why, I removed it so you would never accidentally work here, we are doing all code on .116 Projects/archy repo
> we're using paths instead of port which seems to be causing issues again, launch and tab should use port no? Please confirm this is correct as paths have never worked.
> A lot of the apps aren't loading properly, did you screw all the apps up with this wrong approach?
Adherence for current session:
- Before proposing or executing a plan, record the latest directive in this `SESSION-RESUME` doc first.
- Release gate is now explicit: `.116` required containers must be working and tested before release.
- No time constraint: choose the most correct long-term architecture/stability path even if it takes significantly longer.
- Release gate remains required, but treat it as a later checkpoint reminder while long-running sync/migration work continues.
- Runtime stabilization on `.116` is immediate priority; keep migration work aligned with this gate.
- Work context is strictly the `.116` repo via FUSE thinkpad mount; do not make/code against any non-`.116` local workspace.
## Goal in progress
Move package lifecycle to orchestrator-first behavior with automated proof gates, while keeping safe legacy fallback during migration.
-`secret_env` for `FM_BITCOIND_PASSWORD` and `FEDI_HASH`
-`data_uid: "100000:100000"`
- Note: unlike legacy script, this manifest declares both `8176` and `9737` host ports statically; runtime branch still selects LND-vs-LDK execution at startup.
### Step 8b.3 started (filebrowser baseline service)
- Added `apps/filebrowser/manifest.yml` to port baseline filebrowser from legacy specs/first-boot behavior:
- destructive RPC-authenticated update smoke for `package.update` on `bitcoin-ui`
- optional stack smoke for `mempool` behind `ARCHY_ALLOW_STACK_UPDATE=1`
- Updated `tests/lifecycle/run.sh` usage examples with `package-update-smoke` target
- First `.116` run attempt blocked by missing `ARCHY_PASSWORD` environment variable (expected for auth-required suite)
### Newly observed UI routing issue (user report)
- Report: launching **Grafana** opens **Gitea** instead of Grafana.
- Likely collision/drift area to validate and fix:
-`core/archipelago/src/api/rpc/package/config.rs` currently maps both apps into the 3000/3001 neighborhood (`grafana` host `3000`, `gitea` host `3001` + historical nginx iframe comments).
-`neode-ui/src/stores/appLauncher.ts` resolves app sessions by URL port (`3000 -> grafana`), so stale/misrouted backend launch URLs or proxy rules can misdirect launches.
- Add regression checks after fix:
- container-list launch URL for grafana resolves to grafana service endpoint
- launching grafana from UI does not route to gitea content
### Grafana->Gitea misroute remediation (current)
- Root cause confirmed: legacy `gitea-iframe.conf` bound host port `3000`, colliding with Grafana launch expectations.
-`.116` vitest launcher suite passes (`12/12`) with gitea path regression test.
- removed live `/etc/nginx/conf.d/gitea-iframe.conf` on `.116` and reloaded nginx.
- Current runtime note:
-`gitea` container running on `3001`; `grafana` container not currently running on `.116`, so direct `/app/grafana/` proxy check returns 502 until Grafana is started.
### User directive (latest)
- Root cause to address later in planned sequence: **Grafana and Gitea must not share/clash ports**.
- Treat this as a dedicated root-fix item when we reach that phase; continue broader Step 8b migration/testing work in the meantime.
### Workflow note
- Todo list maintenance explicitly requested; keep statuses current as work advances to avoid stale execution state.
### Validation run notes (latest continuation)
-`.116`: `tests/lifecycle/run.sh required-stack-destructive` with `ARCHY_ALLOW_DESTRUCTIVE=1 ARCHY_ALLOW_NOAUTH=1` -> PASS (3/3)
-`.116`: `cargo test -p archipelago api::rpc::package::update::tests` -> PASS (4/4)
-`.116`: `cargo test -p archipelago api::rpc::package::stacks::tests` -> PASS (1/1)
-`.116`: `cargo test -p archipelago api::rpc::package::install::tests` -> PASS (3/3)
### Validation run notes (latest continuation 2)
-`.116`: `tests/lifecycle/run.sh package-update-smoke` with `ARCHY_PASSWORD=archipelago ARCHY_ALLOW_DESTRUCTIVE=1` -> PASS (`bitcoin-ui` smoke passed; `mempool` optional test skipped without `ARCHY_ALLOW_STACK_UPDATE=1`)
-`.116`: `tests/lifecycle/run.sh required-stack` with `ARCHY_ALLOW_NOAUTH=1` -> PASS (9/9)
-`.116`: `tests/lifecycle/run.sh required-stack-destructive` with `ARCHY_ALLOW_DESTRUCTIVE=1 ARCHY_ALLOW_NOAUTH=1` -> PASS (3/3)
-`.116`: `cargo test -p archipelago api::rpc::package::install::tests` -> PASS (4/4) after alias mapping additions
-`.116`: `cargo test -p archipelago api::rpc::package::update::tests` -> PASS (5/5) after alias mapping additions
-`.116`: `cargo test -p archipelago api::rpc::package::stacks::tests` -> PASS (1/1)
- expanded orchestrator install allowlist to include alias IDs for parity with scanner/runtime naming
- added unit test: `install_aliases_map_to_manifest_app_ids`
-`core/archipelago/src/api/rpc/package/update.rs`
- added orchestrator update app-id normalization for same alias set
- orchestrator upgrade/health now uses normalized app-id while preserving package-level progress/state semantics
- added unit test: `update_aliases_map_to_manifest_app_ids`
### Lifecycle hardening + full-suite pass
-`tests/lifecycle/lib/rpc.bash`
-`wait_for_container_status` now uses `container-list` state first and uses `container-status` with `app_id` fallback (instead of stale `name` param)
-`tests/lifecycle/bats/bitcoin-knots.bats`
- made `container-status` assertion resilient to alias-migration drift by accepting either valid `container-status` result or valid `container-list` state for `bitcoin-knots`
### Runtime diagnostics note (non-blocking to Step 8b lane)
- Grafana container on `.116` required mapped UID ownership (`100472:100472`) on `/var/lib/archipelago/grafana` to run under rootless user-namespace mapping.
- Active nginx on `.116` still had `/app/gitea/` upstream pointing to `127.0.0.1:3000` prior to full config rollout; corrected live config to `3001` and reloaded.
- Per user directive, the root architectural fix for Grafana/Gitea port separation remains a planned dedicated step (not closed yet).
### Current `.116` proof status (latest run)
- Rust tests on `.116` all green for migration slices:
### Runtime stabilization update on `.116` (release-gate work)
- User directive recorded: all required containers on `.116` must be working and tested before release; no time constraint, choose best path.
- Best-path decision applied: move Bitcoin node to full mode (`txindex=1`, non-pruned) and rebuild chain state/indexes for durable ElectrumX/mempool compatibility.
Actions taken:
- Wrote `/var/lib/archipelago/bitcoin/bitcoin_rw.conf` with full-mode settings:
-`server=1`
-`txindex=1`
-`rpcbind=0.0.0.0:8332`
-`rpcallowip=0.0.0.0/0`
-`listen=1`
-`bind=0.0.0.0:8333`
- Recreated `bitcoin-knots` with proper caps and `-reindex` startup.
- Confirmed node is running non-pruned and syncing from genesis; sample check showed `blocks=5954`, `headers=946415`, `pruned=false`, `txindex thread` active.
- Recreated `electrumx` on `archy-net` with a real `/var/lib/archipelago/electrumx` data mount.
- Corrected mempool MariaDB data ownership mapping mismatch (`/var/lib/archipelago/mysql-mempool` to `100998:100998`) so tables are readable by the container's mysql user.
-`bitcoin-knots`: running, healthy, full reindex in progress.
-`electrumx`: running, initial sync catch-up in progress.
-`lnd`: running; health status noisy due to startup/wallet/macaroon checks while chain backend is syncing.
-`mempool-api`: running but endpoint still timing out during early-chain synchronization and repeated difficulty-update retries.
Important note:
- Because the node has been reset to a full reindex from genesis, downstream service health is expected to remain transitional until sufficient chain progress is reached. Release gate is still open (not yet met).
- Known deferred blocker unchanged: `uptime-kuma` remains `Created` due `gitea` on host port `3001`.
## 2026-04-25 14:20 UTC — continuation checkpoint
- User directive recorded first for this continuation:
- "it’s on the thinkpad in projects/archy via fuse drive or ssh"
- "whatever the best access method is"
- Switched active workspace to the `.116` repo via FUSE mount:
-`/Users/dorian/mnt/archy-thinkpad`
- Root cause confirmed for current `package.update bitcoin-ui` blocker:
- Service is running with `ARCHIPELAGO_DEV_MODE=true`, so orchestrator `upgrade()` resolves through `DevContainerOrchestrator::load_manifest_for()`.
- Dev manifest loader only searched legacy path `<data_dir>/apps/<app_id>/manifest.yml` (`/var/lib/archipelago/apps/...`), which is missing on `.116`.
- Production manifests are under `/opt/archipelago/apps` (and repo-local `/home/archipelago/Projects/archy/apps` on dev nodes), causing orchestrator update to fail with missing manifest.
-`load_manifest_for()` now searches manifest locations in this order:
1.`$ARCHIPELAGO_APPS_DIR`
2.`/opt/archipelago/apps`
3.`/home/archipelago/Projects/archy/apps`
4.`<data_dir>/apps` (legacy fallback)
- Added helper `candidate_manifest_paths(...)` with de-dup logic.
- Added unit test coverage for fallback path inclusion.
- Validation attempt:
- Ran `cargo fmt --all && cargo test -p archipelago container::dev_orchestrator::tests` from `core/`.
- Local FUSE-mounted build failed early with Rust toolchain environment issue:
-`error[E0463]: can't find crate for parking_lot_core`
- Code compiles were not validated in this host context; next validation should run directly on `.116` shell (ssh) where the existing build toolchain is known-good.
## 2026-04-25 18:00 UTC — stabilization checkpoint (nginx/BTCPay/Uptime Kuma)
- User directive recorded for this lane:
- "just need to do it all, not bothered which order"
- "Uptime Kjuma opens gitty, we have an erroneous app called bitcoin UI and nginx proxy manager still doesn’t work"
- Root causes confirmed on `.116`:
1.**BTCPay broken**: DB ownership mismatch on `/var/lib/archipelago/postgres-btcpay` after UID mapping drift.
- Symptoms: BTCPay/NBXplorer PostgreSQL errors `could not open file global/pg_filenode.map: Permission denied`.
2.**Uptime Kuma cannot bind/start on 3001**: hard conflict with Gitea (already mapped to host 3001).
3.**Nginx Proxy Manager app route broken**: `/app/nginx-proxy-manager/` pointed to `127.0.0.1:8181`, but live NPM is on `81`.
4.**Uptime Kuma route opening Gitea**: upstream/redirect behavior around `/app/uptime-kuma/` required explicit path redirect handling.
- Code fixes applied in repo (ThinkPad FUSE `.116` source):
-`neode-ui/src/views/apps/appsConfig.ts` now treats `bitcoin-ui`/`lnd-ui`/`electrs-ui` as service containers so they don’t appear as separate user apps.
- Live `.116` runtime actions executed:
- Corrected BTCPay Postgres data ownership to `100998:100998` and restarted `archy-btcpay-db`, `archy-nbxplorer`, `btcpay-server`.
- Recreated `uptime-kuma` on host `3002` using stable entrypoint (`/usr/bin/dumb-init -- node server/server.js`).
- Patched active nginx files (`sites-enabled` + snippets), validated with `nginx -t`, reloaded.
- Rebuilt and redeployed `/usr/local/bin/archipelago` from updated source; restarted `archipelago` service.
- Validation status after fixes:
- Rust tests on `.116`:
-`cargo test -p archipelago container::dev_orchestrator::tests` -> PASS
-`cargo test -p archipelago api::rpc::package::update::tests` -> PASS
-`cargo test -p archipelago api::rpc::package::install::tests` -> PASS
-`uptime-kuma` container running healthy on `3002`; `/app/uptime-kuma/dashboard` returns `200` with Uptime Kuma HTML.
-`/app/nginx-proxy-manager/` returns `200` (no longer 502).
-`/app/gitea/` remains on `3001` and returns `200`.
- Remaining caveat for user UX confirmation:
-`/app/uptime-kuma/` intentionally returns `302` to `/app/uptime-kuma/dashboard`.
- If the browser still shows old behavior, clear cache/hard-refresh; live nginx and containers now reflect corrected routing.
### Latest user directive (new)
- "Continue if you have next steps, or stop and ask for clarification if you are unsure how to proceed."
### Continuation work completed after directive
- Objective: close the remaining UI caveat where `bitcoin-ui` could still appear as an app category influence when backend package key and manifest id differ.
- Added robust service detection by manifest identity, not only package key:
-`neode-ui/src/views/apps/appsConfig.ts`
- new helper `isServicePackage(id, pkg)` combines key-based and `manifest.id`-based service checks.
-`useCategoriesWithApps(...)` now filters using `isServicePackage(...)`.
-`neode-ui/src/views/Apps.vue`
- app/service tab split now uses `isServicePackage(id, pkg)` so service aliases cannot leak into My Apps.
-`pnpm install` failed with filesystem permissions error: `EPERM ... node_modules/.ignored`
- subsequent `pnpm test` failed because `vitest` binary was unavailable after failed install
- Result: code-level regression fix is in place, but frontend test execution is blocked by workspace `node_modules` permission/install state.
### Continuation update (this run)
- Proceeded to unblock validation as requested and completed targeted regression verification for the `bitcoin-ui` filtering fix.
- Frontend test infra recovery steps (workspace-local, no source-code logic changes):
- manually restored missing native optional binaries required by current platform:
-`@rollup/rollup-darwin-arm64@4.59.0`
-`@esbuild/darwin-arm64@0.27.3`
- repaired critical missing top-level packages/symlinks after interrupted mixed-package-manager install state (notably `vitest`, `vite`, `typescript`, `vue-tsc`, `jsdom`, `vue`, `pinia`, `vue-router`, `vue-i18n`, scoped deps under `@vitejs`, `@types`, etc.).
- Test execution status:
- default `vitest.config.ts` run remains blocked by `@vitejs/plugin-vue` resolving through `.ignored` path and failing compiler discovery in this FUSE/mixed-install state.
- added temporary local test config for TS-only unit suites:
-`neode-ui/vitest.novue.config.ts` (same alias/env basics, no Vue plugin)
- targeted regression suites now pass under this config:
-`pnpm test --config vitest.novue.config.ts src/views/apps/__tests__/appsConfig.test.ts src/stores/__tests__/appLauncher.test.ts` -> PASS (15/15)
- Lifecycle/host validation attempt from this macOS context:
-`tests/lifecycle/run.sh required-stack` -> blocked locally because `bats` is not installed in this environment (script exits with install hint).
- direct SSH to `.116` from this context is non-interactive blocked (`Permission denied`), so host-side lifecycle reruns require execution from the authorized `.116` session context.
### Continuation update (latest)
- FUSE mount was stale (`Device not configured`) despite mount table entry; recovered by unmounting and remounting `sshfs archy:Projects/archy -> /Users/dorian/mnt/archy-thinkpad`.
- Lifecycle validation re-run on `.116` (via SSH):
- first run had a transient fail on "required containers are running" while mempool family was still in startup window after prior restarts.
- immediate rerun passed fully (`1..9` all `ok`).
-`ARCHY_ALLOW_DESTRUCTIVE=1 ARCHY_ALLOW_NOAUTH=1 tests/lifecycle/run.sh required-stack-destructive` passed (`1..3` all `ok`).
- Frontend validation on `.116`:
- repaired host workspace dependency state by running `npm install` in `~/Projects/archy/neode-ui`.
- default Vitest config now works again.
-`npm run test -- src/views/apps/__tests__/appsConfig.test.ts src/stores/__tests__/appLauncher.test.ts` -> PASS (15/15).
-`npm run test -- src/stores/__tests__/app.test.ts src/stores/__tests__/container.test.ts` -> PASS (40/40).
-`npm run build` -> PASS, production bundle + PWA artifacts generated successfully.
- Status:
-`bitcoin-ui`/service filtering fix is validated with default test config on `.116`.
- required-stack + destructive required-stack gates both green on `.116` after transient startup window cleared.
- User clarified local machine workspace was intentionally removed; all code work must run on host in only.
- User re-emphasized launch/tab behavior should be port-based (not path proxy), as path routing has repeatedly failed in practice.
- User reports many apps failing to load and suspects path-based launch routing regressed broad app behavior; prioritize reverting to stable port-based launch/tab behavior and revalidate.
- User reports Gitea app icon is still missing; investigate app icon source/fallback mapping and fix UI asset resolution.
- User asked about unknown container; identified as unmanaged/named-by-podman Filebrowser container and should be reconciled into expected managed naming/state.
- User requested finalization: complete remaining cleanup/validation tasks and produce final production-readiness status for .
### Finalization sweep (latest)
- Removed unmanaged duplicate container `bold_lichterman`; managed `filebrowser` container remains healthy on host port `8083`.
- Confirmed launch behavior hardening:
-`gitea` is now treated as new-tab (iframe-blocking behavior).
- NPM/Kuma/Gitea new-tab/launch behavior is aligned in launcher + app session + app card tab-launch sets.
- App icon fallback now retries `.svg` when a `.png` icon path fails.
- Launcher/icon regressions reported by user: addressed and redeployed.
- Remaining production gate work is final manual UI smoke across all app entry points (Apps/AppDetails/AppSession/Spotlight) and release checklist sign-off.
> let's go
- User approved final push: execute final smoke/checklist pass now and return go/no-go readiness report.
### Final gate rerun (go/no-go check)
- Re-ran and for release-gate confirmation.
- Observed one transient miss when tests were run concurrently with destructive restarts; immediate sequential rerun passed clean ( all ok).
- Destructive suite passed with gate enabled: ( all ok).
- UI regression suite remains green: launcher + appsConfig ().
Go/no-go verdict:
- **GO (technical gates)** on : required stack green, destructive restart recovery green, launcher/icon regressions fixed and deployed.
- Remaining non-automated item is manual browser click-through sanity across all entry points before publishing externally.
> gitea app icon still missing
- User reports Gitea icon still missing after prior fallback; investigate backend-provided icon field handling and harden icon URL resolution for token icons (e.g., ).
> Afterwards please build the latest ISO to test with all our work, commit and push too, we need an ISO of the unbundled version with just filebrowser bundled remember, thanks
- User requested final actions: build and test latest unbundled ISO variant (only filebrowser bundled), then commit and push changes.
> Where is the ISO?
- User asked where ISO is; current archived unbundled builder run is failing before artifact generation and must be repaired.
> please do not miss AIUI in the release build or remove it from the nodes whatever you do
- Critical release constraint: AIUI must remain bundled in release artifacts and must never be removed from existing nodes during update/deploy.
> please check the resume files for our latest plan and resume the work.
- Current directive: read the resume/plan files, resume the latest active work, and continue from the recorded release/ISO lane while preserving the AIUI release constraint above.