archy/docs/pine-voice-release-test-plan.md
archipelago 184257390d
Some checks failed
Demo images / Build & push demo images (push) Failing after 1m40s
feat(pine): 1.3.0 manifests — openwakeword member + live node status on the launcher page
pine-openwakeword manifest (wyoming-openwakeword 2.1.0, :10400, /custom model
dir for the future Yo Archy model). Pine 1.3.0: launcher page gains a live
node-status card fed by /api/pine/status via a same-origin nginx proxy, and
copy for the new intents / Claude fallback / mesh announcements. Catalogs,
app-session config, drift ids regenerated; release catalog embeds 56
manifests (unsigned until the ceremony). Framework PT test plan in docs/.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 02:59:34 -04:00

4.9 KiB
Raw Blame History

Framework PT test plan — Pine voice epic (pre-release gate)

Target node: framework-pt (100.65.115.109, LAN 192.168.1.249). Run after BOTH agents' work is merged, with the dev binary sideloaded and the signed catalog (pine 1.3.0 + pine-openwakeword) published. Every ❑ must pass before the release ritual starts. Items marked (user) need a human in the room.

A. Deploy / prerequisites

  • ❑ A1 Dev binary sideloaded, archipelago service active, no crash-loop in journal.
  • ❑ A2 nginx self-heal added location /api/pine/status to every server block; nginx -t passes; nginx reloaded.
  • ❑ A3 Signed catalog with pine 1.3.0 + pine-openwakeword live at the raw URL; node refreshed it (hourly sweep or "Check for updates").

B. /api/pine/status endpoint

  • ❑ B1 Public tier through nginx (curl http://127.0.0.1/api/pine/status): version, uptime, bitcoin height/sync_percent/peers, mesh peers. lightning null, mesh_message absent.
  • ❑ B2 Wrong bearer token → still public-only (no balances). Correct token (from /var/lib/archipelago/secrets/pine-status-token) → lightning balances + latest mesh message present.
  • ❑ B3 Reachable from inside the HA container via host.containers.internal:80.
  • ❑ B4 Token file is 0600, owned by the service user.

C. Stack / openwakeword container

  • ❑ C1 Reconcile installs pine-openwakeword (wyoming-openwakeword 2.1.0), healthy on :10400.
  • ❑ C2 Existing pine-whisper / pine-piper / pine were ADOPTED, not recreated — model data dirs untouched.
  • ❑ C3 archipelago service restart → all four pine containers come back (crash-recovery stack spec).
  • ❑ C4 UI: openwakeword listed under Services (no extra store card); Pine card shows 1.3.0.

D. Home Assistant seeding

  • ❑ D1 configuration.yaml: legacy hand-staged block (bitcoind :18332 + plaintext RPC creds) fully replaced by the bounded token-based block.
  • ❑ D2 custom_sentences/en/archy.yaml carries all four intents.
  • ❑ D3 .storage/core.config_entries: wyoming entry for openwakeword (:10400) + anthropic entry (Claude, conversation + ai_task subentries).
  • ❑ D4 Pipeline: conversation_engine = conversation.claude_conversation, prefer_local_intents: true.
  • ❑ D5 automations.yaml: archy_mesh_announce seeded.
  • ❑ D6 HA restarts clean — no setup errors for anthropic / wyoming / rest / intent_script in podman logs homeassistant.
  • ❑ D7 Sensors report real values: archy_block_height, archy_bitcoin_sync, archy_bitcoin_peers, archy_mesh_peers, archy_lightning_balance (or clean unavailable if LND absent), archy_mesh_message.

E. Voice / intents (API level first, then live speaker)

  • ❑ E1 Exact phrase "what's the block height" → answered by the LOCAL intent (correct height, no Anthropic API call in HA logs).
  • ❑ E2 Fuzzy phrase (e.g. "how tall is the chain right now") → Claude routes to the ArchyBlockHeight tool; answer contains the real height.
  • ❑ E3 "how many peers", "is the node synced", "what's my lightning balance" → correct spoken-length answers.
  • ❑ E4 Off-topic question → Claude answers, 12 sentences, no markdown.
  • ❑ E5 (user) Live speaker: "Hey Jarvis, what's the block height" → audible correct answer.
  • ❑ E6 Mesh announce: new received mesh text (or manual assist_satellite.announce if no radio) → speaker announces sender + text; no announce storm on HA restart.

F. Pine launcher page (1.3.0)

  • ❑ F1 Page on :10380→:10381 shows the live node card (version, uptime, block, sync, peers) within ~5s.
  • ❑ F2 /node-status proxy works (pine nginx resolves host.containers.internal at startup — container must not crash-loop).
  • ❑ F3 "Connect Pine to WiFi" provisioner still intact (no JS errors on load).

G. Cleanup / regression sweep

  • ❑ G1 Both stray socat 18332 forwarders killed; sensors still work via the endpoint.
  • ❑ G2 No bitcoind RPC credentials anywhere in HA config.
  • ❑ G3 Pre-existing HA function intact: whisper/piper entities, PineVoice satellite pairing, other integrations.
  • ❑ G4 nginx regressions: /health, /bitcoin-status, /api/app-catalog, /proxy/lnd/ all still proxied post-patch.
  • ❑ G5 (user) Mobile Home: wallet card sits directly under My Apps; desktop layout unchanged.
  • ❑ G6 Other agent's changes re-verified after merge (their own checklist).

H. Production-readiness (release ritual gate)

  • ❑ H1 cargo test workspace green; frontend builds; drift check --release --strict green.
  • ❑ H2 tests/lifecycle/run-gate.sh re-run ON .228 (stack membership changed → lifecycle gate rule applies).
  • ❑ H3 Catalog regenerated → signed (ceremony) → published via gitea-ai; verified at the raw URL.
  • ❑ H4 Changelog (layman-readable) + scripts/sync-whats-new.py + version bump; release ritual per v1.7.110 notes (push main via gitea-ai BEFORE publish; sign manifest AFTER create-release).
  • ❑ H5 No secrets in any commit; frontend tarball flat + APK policy per release notes.