The box's services are mesh-bound and its public :22 is firewalled, so deploy-service.sh
now targets root@10.9.0.6 (the box's WG leg) with optional MRNUMBER_DEPLOY_JUMP for a
ProxyJump chain. Prospector MRNUMBER_BASE_URL corrected to http://10.9.0.6:8787 (was a
wrong VPC guess). Requires the box to be ON the mesh — see deploy header.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Per the corrected .infra.yaml, the trigger service is a PROD unit that runs ON the
redroid box (next to the Android container → local adb), with plum as dev-only. Replace
the (wrong) macOS LaunchAgent with the box-native pattern, mirroring @redroid's
deploy-droplet.sh / mrnumber-ocr.service:
- deploy/mr-number-service.service: systemd unit (multi-user.target, EnvironmentFile for
tokens, MR_NUMBER_DEVICE=localhost:5555, __BUN__ resolved at deploy time).
- deploy/deploy-service.sh: prereq-checks the box (bun/python3/redroid_client/adb), scp's
service+client to /opt/mr-number-service, installs the unit, seeds a 0600 env template,
enables only once tokens are filled (no crashloop). Does NOT mint tokens.
- service/run: drop launchd installer; plain dev launcher (loads cocotte-secrets).
- install.sh: plum = dev setup only; points prod at deploy-service.sh.
- CLAUDE.md/README: box-deploy ownership split (@redroid owns the box; we own our unit).
Syntax-checked; box SSH (:22) unreachable from this env so not yet run against the box.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Stand up the HTTP surface Prospector calls (this app had no listening port). Bun
service: bearer-auth (MRNUMBER_SERVICE_TOKEN, constant-time) POST /api/screening/requests
{phone, ref} → 202 {accepted, id}, enqueued in a durable SQLite queue; a single serial
worker (one Android box) drains by invoking mr_lookup.py and records the people-service
signal. GET /api/screening/requests/:id returns the row; GET /health is open. Crash-safe
(requeues stale in-flight rows on restart). 7 bun tests + typecheck; smoke-tested end to
end (auth 401, enqueue 202, drain→verdict, invalid-phone 400).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Update CLAUDE.md, README, app.manifest, .infra.yaml, install.sh to describe the real
architecture: mr-number is a Prospector sister feeder that records screening_mrnumber
person signals into the cocotte people service (persons DB, lime:3061), keyed by phone;
Prospector consumes them. Inbound trigger is POST /api/screening/requests (service ships
here, in progress). Env QUINN_MY_* → PEOPLE_* / MRNUMBER_SERVICE_TOKEN; secrets move to
~/.config/cocotte-secrets/. No quinn.api anywhere outside docs/archive.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- tray now opens /ui?app=mr-number so the webui gets ☎️ Mr. Number title + header
- synced improved adb-keyboard/server.py (dynamic labels, top banner with app name + note about which tray to use, better panel labels, updated PAGE/COMBO templates)
- Now when you Open Console from the ☎️ tray you see a clear "☎️ Mr. Number — Redroid Console" header
Mirror the mac-sync / net-tools pattern: own repo, HTTP-only coupling to the
platform. Two tiers — plum client (mr_lookup.py + console-tray) and the DO
redroid droplet (45.55.191.82) — plus a plum-local stdio MCP wrapping
mr_lookup.py --json.
- client/: lookup + vision + record, host-free unit tests (12/12), console tray
- mcp/: finished index.ts (mr_number_lookup tool), typechecks + boots
- cloud/: adb-keyboard droplet server; terraform reference (canonical IaC in uvlava)
- deploy/: install.sh (plum) + deploy-droplet.sh
- docs/archive/: first-attempt redroid post-mortem (the "complete failure" was
attempt #1 on the stock-kernel box; this droplet is its working successor)
Platform retains the screening data model, prospect gate, and trigger queue;
this app couples only via POST /admin/screening/check (service token).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>