Hands the companion-owned work to the companion agent with precise pointers (Android/ source, served APK at 0.5.27/vc47 + the deploy pipeline from the 2026-07-23 handoff, the ArchipelagoNative bridge and isCompanionApp gating pattern) and the queue: the ungated CompanionBanner/intro-trigger residual of #61 (Discover.vue:156, useCompanionIntro's openCompanionIntro), GrapheneOS backup/restore (#128, reusing the node's ADR-005 backup envelope), and the NIP-46 remote-signer phone side (#139, with the signer-login research doc as background). Tracker labels applied earlier: #128 and #139 carry 'companion-agent'.
3.7 KiB
HANDOFF — companion-agent work queue (2026-08-30)
For: the companion agent. Compiled from the 2026-08-30 issue-triage
session. The tracker now labels the companion-owned issues companion-agent
(#128, #139); this document adds the pointers and one small residual that
isn't worth its own issue until it's being fixed.
Pointers
- App source:
Android/in this repo (Kotlin/Gradle). Release notes live inAndroid/COMPANION_RELEASE.md. - Served artifact:
neode-ui/public/packages/archipelago-companion.apkarchipelago-companion.json(currently 0.5.27 / versionCode 47). Shipping a companion change means refreshing both in the same commit (versionCode +1) plus a COMPANION_RELEASE.md entry; nodes serve the file from the web bundle. The deploy/verify pipeline (aapt badging, size checks, node redeploy) is documented indocs/HANDOFF-2026-07-23-companion-apk-deploy.md.
- Web bridge:
window.ArchipelagoNative(JS interface the WebView injects);isCompanionApp()inneode-ui/src/utils/openExternal.tsis the canonical detection helper;appLauncher.tsshows the gating pattern.
Work queue
1. Residual of #61 — companion-gate the store banner + intro overlay (small)
What #61 fixed was the AUTO-popup: CompanionIntroOverlay skips its
mounted auto-show when IN_COMPANION_APP (the ArchipelagoNative bridge
is present). Two paths are still ungated, so a user already inside the
companion WebView still gets "install the companion" pitches:
<CompanionBanner />inneode-ui/src/views/Discover.vue:156renders unconditionally.openCompanionIntro()(neode-ui/src/composables/useCompanionIntro.ts) is an explicit trigger that intentionally bypasses the once-per-browser gate — but nothing companion-checks its callers.
Fix: gate the banner render and the intro-trigger entry points on
isCompanionApp(), same pattern as appLauncher.ts (lines ~236/~341).
Verify inside the companion WebView (banner absent, no manual path can pop
the overlay). Land it in the web UI here; the APK doesn't change.
2. #128 — GrapheneOS phone backup & restore (feature)
Reporter's problem: losing your phone, or wiping it to cross a border.
Reporter's suggestion: "part of the companion app or passport prime combo".
The companion owns the phone side: trigger a GrapheneOS backup, transport
it, and restore it onto a wiped device — coordinated with the node's
existing encrypted-backup envelope (ADR-005: ChaCha20-Poly1305 +
Argon2id, core/archipelago/src/backup.rs). Reuse that envelope; do not
invent a second backup format. Node-side storage/quota/scheduling is
tracked separately on the roadmap — coordinate before assuming node-side
surface beyond the existing backup RPCs.
3. #139 — Nostr Bunker: companion-side remote signer (feature)
"Remote signer with companion app?" — the phone side of NIP-46: a bunker
client in the companion (pairing with a node-side bunker service via
QR/URI, a signature approve/deny UX that makes what's being signed legible,
and saved-remote-bunker management). Background research already exists:
docs/nostr-signer-login-research.md. The node-side bunker hosting is
roadmap-tracked separately; this issue's companion label covers the
phone-side integration.
Working rules (same as the node repo)
- Small commits, pushed immediately; vitest for web-side changes; the Kotlin app's on-device flows get verified on a real device before the APK ships.
- Node-side Rust changes are out of scope for the companion queue — anything that needs them goes through the labeled issues on the tracker.
- Done = artifact refreshed (APK + json meta) so a web-bundle deploy can serve it, plus the issue updated with what shipped.