diff --git a/.hermes/plans/2026-08-06_140718-pipecat-lag-and-stt-tuning.md b/.hermes/plans/2026-08-06_140718-pipecat-lag-and-stt-tuning.md new file mode 100644 index 0000000..822657d --- /dev/null +++ b/.hermes/plans/2026-08-06_140718-pipecat-lag-and-stt-tuning.md @@ -0,0 +1,235 @@ +# Pipecat Lag + STT Accuracy — Tuning Plan (Mac mini M4) + +> **For Hermes:** Use `subagent-driven-development` to implement task-by-task. Verify against real trace. + +**Goal:** Cut end-to-end voice turn from ~7–9s to <2.5s for Grace (child voice) and fix Whisper `base` mis-transcriptions, while keeping the stack local (no new cloud bill) with an optional Apple STT fast-path. + +**Current trace (from `proc_221ead32955d`, session 10:01–10:04, Grace):** +- `greeting -> speaking: 0.37s` OK. Kokoro synthesize `0.235s` — not the bottleneck. +- **Per turn (e.g. "Teach it to be kind"):** + - VAD `stop_secs 0.65s` + Silero confidence `0.62` — OK + - `Whisper base` `processing 0.21–0.29s`, **TTFB 0.78–0.94s** (speech-end → text) — high for M4 + - **SmartTurn V3 hold: +2.24–2.40s** `_idle_watcher: Disabling receiver after 2.3s idle / Discarding old frames` + `stop_ttfb 0.78s` — dominates lag. Second +2–3s `append_audio: End of Turn complete due to stop_secs. Silence in ms: 3000.0` on short turns ("Yes.", "Keep going.") — SmartTurn is waiting 3s extra silence before firing `UserTurnStop`. + - `LLM muse-spark-1.2 via 127.0.0.1:8642`: `0.93–6.1s` (median ~3.8s). Grows with context — context had duplicate greeting, 6 turns, 20k tokens prompt. + - TTS chunking OK but sequential per sentence, no streaming. +- **STT accuracy (Whisper base):** + - Good: `and my daughter is here...`, `My name is Grace, nice to meet you too.` ✓ + - Bad child voice: `I like good stuff` (likely "I like princess stuff"?), `Princess, tough.` (fragmented), `go on and do it, inventors, together.` (should be "go on an adventure together" — the LLM had to guess), `subscribe and watch again Enjoy.` (nonsense split, 2 turns merged as one with 4s gap). + - `RNNoise 16000↔48000 resampling`, `TurnAnalyzer VAD stop_secs differs from recommended 0.2s` warning, duplicate greeting in context. + +**Architecture:** Keep Pipecat pipeline. Fix in layers: transport/VAD/SmartTurn → STT model/prompt → LLM context/streaming → TTS streaming → observability. All files under `~/Projects/pipecat-voice-gateway/server/`. + +**Tech Stack:** Pipecat 1.7, faster-whisper 1.2.1, `WhisperSTTService` / `WhisperMLXSTTService`, `SileroVADAnalyzer`, `LocalSmartTurnAnalyzerV3`, `OpenAILLMService` @ `:8642`, Kokoro `:7332` warm + MLX. + +--- + +## Task 1 — Baseline observability (metrics you can read) + +**Objective:** Make lag measurable without grepping DEBUG. + +**Files:** +- Modify: `server/bot.py:1-40` — logging + PipelineParams +- Create: `server/metrics.py` (optional, tiny helper) + +**Step 1: Enable structured per-turn timing** +In `run_bot()` after `PipelineParams`, ensure `enable_metrics=True, enable_usage_metrics=True` already set (is). Add a `MetricsLogger` or `on_metrics` handler: +```python +from pipecat.processors.metrics import MetricsProcessor # if exists, else use logger filter +# Add after worker creation: +@worker.event_handler("on_metrics") +async def on_metrics(metrics): # check Pipecat API: worker.on_metrics or PipelineWorker metrics callback + logger.info(f"[metrics] {metrics}") +``` +If API differs, at minimum lower VAD/STT/TTS `logger` to INFO and add a one-line turn summary in `on_client_ready` helper that computes `speech_stopped -> transcript -> llm_first_token -> tts_first_audio`. + +**Step 2: Persist logs sanely** +The current bg proc writes to stdout only; `tee /tmp/pipecat-7860.log` mask from earlier run hid logs. Ensure `server/bot.py` launch (both manual and `launchctl`) writes to `StandardOutPath /tmp/pipecat-7860.log` and also `logger.add("/tmp/pipecat-7860.log")` if needed. + +**Step 3: Verify** +Run: `tail -f /tmp/pipecat-7860.log | grep -E "TTFB|processing time|EndOfTurn|prompt tokens|kokoro"` shows per-turn numbers. Same via `curl` to public URL. + +**Commit:** `feat: per-turn metrics logging` + +--- + +## Task 2 — SmartTurn / VAD tuning (biggest win: −2–4s) + +**Objective:** Remove the `2.3s idle + 3s silence` hold. + +**Files:** +- Modify: `server/bot.py:145-180` (`VADProcessor`, `LocalSmartTurnAnalyzerV3`, `LLMUserAggregatorParams`) + +**Step 1: Read current Pipecat docs for SmartTurn config** +Search in venv: +```bash +grep -rn "stop_secs\|idle_watcher\|LLMUserAggregatorParams\|TurnAnalyzer" .venv/lib/python*/site-packages/pipecat --include="*.py" | head -n 80 +``` +Note: `SileroVADAnalyzer(params=VADParams(confidence=0.62, start_secs=0.12, stop_secs=0.65))` vs the warning `recommended 0.2s`. And `LLMUserAggregatorParams(vad_analyzer=SileroVADAnalyzer(... stop_secs=0.8))` is duplicated. + +**Step 2: Reduce hold** +- Set **VAD `stop_secs 0.35–0.45s`** (child speech has longer pauses but 0.65 is too slow): + ```python + vad = VADProcessor( + vad_analyzer=SileroVADAnalyzer(params=VADParams(confidence=0.58, start_secs=0.10, stop_secs=0.40)), + audio_idle_timeout=1.0) # was 1.5 + ``` +- If using `LocalSmartTurnAnalyzerV3`, pass `stop_secs` consistently — do **not** create two different Silero instances with 0.65 and 0.8. Use one set of params shared with the aggregator, or disable SmartTurn for the fast path: + ```python + # Option A: disable SmartTurn, rely on VAD only for snappy turn + smart_turn = None + # Option B: keep it but lower thresholds + smart_turn = LocalSmartTurnAnalyzerV3(stop_secs=0.40) # check constructor — if no arg, wrap via LLMUserAggregatorParams(smart_turn_params=...) + ``` +- Set `ttfs_p99_latency` on STT to match measured value so Pipecat doesn't pad: + ```python + stt = WhisperSTTService(settings=WhisperSTTService.Settings(model="base", language="en"), ttfs_p99_latency=0.45) + ``` + (measure after tuning; target 0.4–0.6s). + +**Step 3: Fix duplicate context turn** +In `bot.py:192-194` both `user_aggregator` and `assistant_aggregator` may double-add greeting. The trace shows assistant message duplicated twice. Deduplicate: +```python +if llm and context is not None: + greeting = "Hey — Hermes on your Mac mini..." + context.add_message({"role": "assistant", "content": greeting}) # once + await worker.queue_frame(TTSSpeakFrame(text=greeting)) +``` + +**Step 4: Verify** +Run: speak "Yes." — should trigger LLM within ~0.6s of VAD stop, not 2.8s. Log should show no `Disabling receiver after 2.3s idle` before turn. + +--- + +## Task 3 — STT accuracy: Whisper base → small / MLX + prompting + +**Objective:** Fix child-voice errors (`I like good stuff`, `go on and do it, inventors`). + +**Files:** +- Modify: `server/bot.py:147` (STT instantiation) +- Modify: `server/kokoro_bridge.py` / `server/apple_stt_bridge.py` (optional Apple path) + +**Why base is suboptimal:** Pipecat `Model.BASE` = 74M params, trained on adult speech; WER higher on high-pitched child voice, especially at `base` + CPU int8. The gateway already installs `pipecat-ai[mlx-whisper]`. + +**Step 1: Try Whisper `small` (244M, ~3× base) — easiest drop-in** +```python +# Cost: ~0.35s vs 0.25s on M4, but accuracy jump for child voice +stt = WhisperSTTService(settings=WhisperSTTService.Settings(model="small", language="en"), ttfs_p99_latency=0.55) +``` +Benchmark: `faster_whisper.WhisperModel("small", device="cpu", compute_type="int8")` or `float16` if available — test offline on a recorded Grace wav before wiring. + +**Step 2 (preferred on M4): Whisper MLX `small` or `large-v3-turbo`** +Apple Silicon MLX is faster than faster-whisper CPU: +```python +from pipecat.services.whisper.stt import WhisperSTTServiceMLX +stt = WhisperSTTServiceMLX(settings=WhisperSTTServiceMLX.Settings(model="small", language="en")) +# or: model="mlx-community/whisper-large-v3-turbo" # need to check Model enum supports it +``` +Quantized variant `large-v3-turbo-q4` may trade tiny WER for speed — test. + +**Step 3: Prompt/initial_prompt for domain** +Whisper respects an initial prompt. Pass kid-domain hints: +```python +stt = WhisperMLXSTTServiceMLX(settings=..., extra={"prompt": "Grace, princess, inventors, adventure, dragon, castle"}) +# Check BaseWhisperSTTSettings prompt field vs STTSettings extra +``` +For faster-whisper, verify `prompt` actually forwards to model — read `base_stt.py:148` and `stt.py` `transcribe` call. + +**Step 4: Compare to Apple on-device** +`server/apple_stt_bridge.py` already wraps `speech_transcribe_file` (SpeechAnalyzer, 6.3× realtime, 2.12% WER) — test it: +```bash +# Record 5s Grace utterance to /tmp/grace.wav, then: +python -c "from apple_stt_bridge import transcribe_apple_stt; print(transcribe_apple_stt('/tmp/grace.wav', locale='en-US'))" +``` +If WER < faster-whisper small, implement a hybrid: try Apple first (single MCP roundtrip ~120ms + transcribe), fall back to MLX Whisper. Requires a custom `SegmentedSTTService` subclass that buffers VAD segment to temp file then calls `transcribe_apple_stt` — latency ~0.6–1.0s but accuracy wins for kids. + +**Step 5: Filter non-speech** +Set `no_speech_prob 0.45` or `push_empty_transcripts=False` already — but check `WhisperSTTSettings(no_speech_prob=...)` to suppress the `subscribe and watch again` hallucination on near-silence. Lower `min_volume 0.55` in `VADParams`. + +**Verify:** +Record 5 utterances from Grace, compare transcriptions across `base` / `small` / `MLX small` / `Apple`. Pick lowest WER; log latency per model. + +--- + +## Task 4 — LLM latency: context pruning + streaming TTS + +**Objective:** Cut `0.9–6.1s` LLM tail. + +**Files:** +- Modify: `server/bot.py:166-180, 198-210` (LLM + context + TTS) + +**Step 1: Prune context** +Current context grew to `prompt 20k → 20.7k tokens` over 6 turns (includes full `brain` hint). Symptoms: 6s on "subscribe and watch again". Fix: +- Set `LLMContext` max turns (e.g. keep last 8 messages + system, drop older): + ```python + context = LLMContext(messages=[{"role":"system","content": SYSTEM_PROMPT}]) + # On each turn, after add_message, trim if len(context.messages) > 10 + ``` +- Or use `LLMContextAggregatorPair` with `context_aggregator` limits — check Pipecat LLMContext API for `max_messages`. + +**Step 2: Stream LLM → TTS (don't wait for full completion)** +Current: `OpenAILLMService` generates full completion (`processing 4.7s`) then `_push_tts_frames` synthesizes all sentences sequentially. Switch to incremental: +- Ensure `OpenAILLMService` streams deltas (`LLMTextFrame` per token). Then `WarmKokoroTTSService` should use `TTSService` sentence-based chunking (already via `push_frame` in Pipecat 1.7 — verify `WarmKokoroTTSService.run_tts` yields per sentence, not per full response). If not streaming, wrap as: + ```python + # In WarmKokoroTTSService: split on sentence boundaries inside run_tts, yield TTSStartedFrame per sentence + ``` +- Enable `PipelineParams(enable_metrics=True)` already does streaming; confirm `on_client_ready` doesn't block. + +**Step 3: Hermes gateway model routing** +`muse-spark-1.2` via `:8642` is correct; check if a faster local model (e.g. qwen2.5:3b via Ollama `:11434`) could be used for kid chat with sub-500ms first token — compare `curl http://127.0.0.1:8642/v1/models` vs Ollama latency, but keep Hermes for tool use. + +**Step 4: Deduplicate greeting token cost** +Fix Task 2 duplicate greeting — saves ~300 tokens/turn. + +**Verify:** +`processing time` drops from 5.3s to <1.5s for short turns; `TTS first audio` appears within 200ms of `LLM TTFB`. + +--- + +## Task 5 — Audio input hygiene (RNNoise + transport) + +**Objective:** Stop resampling thrash and timeouts. + +**Files:** +- Modify: `server/bot.py:230-245` (`_make_rnnoise`, `TransportParams`) + +**Step 1: Lock sample rate** +Log shows `RNNoise enabling resampling: 16000 <-> 48000`. SmallWebRTC negotiates 16k or 48k depending on browser. Set transport explicitly: +```python +TransportParams(audio_in_enabled=True, audio_out_enabled=True, audio_in_sample_rate=16000, audio_out_sample_rate=24000) +``` +So RNNoise knows input rate up front and avoids SOXR per-frame resample jitter (adds ~20ms). + +**Step 2: Confirm RNNoise not double-instantiated** +`_make_rnnoise()` is called per-transport lambda — good. Don't also create in `run_bot`. + +**Step 3: Suppress spurious timeout spam** +`Timeout: No audio frame received within the specified time.` every 2–3s is normal idle but clutters logs. Lower log level for `smallwebrtc.transport` to INFO, or increase `audio_idle_timeout` handling in Pipecat — just filter it from metrics. + +--- + +## Task 6 — E2E validation script (repeatable) + +**Files:** +- Create: `server/scripts/bench_stt.py` — records 5s, runs `base` vs `small` vs `MLX` vs `Apple`, prints WER + latency +- Create: `server/scripts/bench_turn.py` — drives a WebRTC client and measures `VAD stop -> LLM first token -> TTS first audio` + +**Run:** +```bash +cd ~/Projects/pipecat-voice-gateway/server +uv run python scripts/bench_stt.py --wav /tmp/grace.wav +uv run python scripts/bench_turn.py --host https://voice.reynafamily.com +# Targets: VAD->STT <0.6s, STT->LLM <0.4s, LLM->TTS <0.3s, E2E <2.0s p50, WER <5% on kid voice +``` + +--- + +## Risks + +- `WhisperMLX small` model download ~500MB via HF — cache on first run, may need `HF_TOKEN`. +- Apple STT via MCP is **outside** Pipecat's segmented pipeline — adds file I/O + HTTP hop; if used, must be benchmarked against local MLX for p99. +- Cutting `VAD stop_secs` too low (0.2s) splits Grace's pauses into multiple turns — test child-specific 0.35–0.45s sweet spot. + +## Open questions + +- Is `muse-spark-1.2` the right LLM for kid chat, or should we route kid sessions to a faster 3B with constrained toolset (`voice` profile already is)? +- Should kid STT get a separate model (MLX `small`) vs adult default (`base`)? Could switch via diarizer speaker hint. diff --git a/areas/finances/220_emerald_homeowners_insurance.md b/areas/finances/220_emerald_homeowners_insurance.md index 78863a3..c4a131c 100644 --- a/areas/finances/220_emerald_homeowners_insurance.md +++ b/areas/finances/220_emerald_homeowners_insurance.md @@ -91,8 +91,22 @@ Tags: [areas, finances, insurance, homeowners, 220_emerald, cabrillo, orange_ins - **2026-07-30 status:** Household called the insurer; support is actively helping reconcile the mortgagee/escrow and renewal-information issue. The new declarations document supports that the insurer-side mortgagee update is now complete. - **Homeowners dashboard:** https://insured-app.cabgen.com/ (Cabrillo/Orange policy portal; user-provided). +## 2026-08-05 Verification — Re-upload of OIH0012918_DEC.PDF + Escrow Payment Proof +- Source 1: WhatsApp upload `doc_32349e669ba1_OIH0012918_DEC.PDF` saved to `~/.hermes/cache/documents/doc_32349e669ba1_OIH0012918_DEC.PDF` on 2026-08-05. + - Extraction: 4 pages, pymupdf - confirms identical to Nextcloud `220 emerald ave/OIH0012918_DEC.PDF` (issued 7/30/26). + - Interpretation: Renewal declarations page only - NOT proof of payment alone. Shows Pennymac as D-BILL payor. +- Source 2: WhatsApp upload `LoanActivity_8212730928.pdf` saved to `~/.hermes/cache/documents/doc_93616fab494d_LoanActivity_8212730928.pdf` on 2026-08-05. + - Extraction: 1 page loan activity for 8212730928, 220 Emerald Ave. + - **Key transaction: 7/31/2026 Homeowners Insurance Premium ($6,703.65) disbursed ($0 principal/$0 interest), escrow balance $5,841.40 after.** + - Matches renewal declarations total exactly: $6,703.65. + - Subsequent: 8/5/2026 Payment $5,358.53 + MI Disb ($145.35) → escrow $7,024.38. +- **Status RESOLVED 2026-08-05: Homeowners renewal PAID via Pennymac escrow on 7/31/2026, before 8/06/2026 effective date. Policy OIH0012918 2026-08-06 through 2027-08-06 is current and funded.** +- Portals: Orange/Cabrillo https://insured-app.cabgen.com/ should now show paid; Pennymac loan 8212730928 confirms. + ## Follow-up -- Verify with Pennymac before 2026-08-06 that escrow has paid (or scheduled payment for) the $6,703.65 renewal and that the declarations are attached to loan reference ending `8212730928`. +- None needed for 2026-2027 homeowners premium — paid. Keep LoanActivity PDF as proof. +- Still verify flood (Neptune TNF4366115) separately if not yet confirmed (see [[220_emerald_flood_insurance]]). +- Next renewal check: ~June 2027. ## Related - [[220_emerald_flood_insurance]] diff --git a/areas/maintenance/medical_appointments.md b/areas/maintenance/medical_appointments.md index 7988d45..75c8a61 100644 --- a/areas/maintenance/medical_appointments.md +++ b/areas/maintenance/medical_appointments.md @@ -138,6 +138,21 @@ Tags: [areas, maintenance, health, appointments, radiology] - Location clue shown: AdventHealth Celebration / Hospital Rd area. - Follow-up: Adolfo was referred by ENT to this doctor. As of 2026-07-04, Adolfo plans to wait some time before scheduling; do not keep this as an active reminder unless he asks again. +## Adolfo - ENT hearing-test statement (payment due) +- Source: mailed statement photo shared via WhatsApp on 2026-08-05. +- Patient: Adolfo Reyna. +- Invoice: MM-1021699. +- Provider/billing office: ENT & Allergy Associates of Florida, LLC (ENT Hearing Associates of Florida); 6421 Congress Ave, Suite 113, Boca Raton, FL 33487. +- Statement balance / total due from patient: **$179.55**. The statement says it is past due and requests payment in full. +- Payment due date shown: 2026-07-28. Payment portal: entaaf.com. Billing phone: (561) 338-3267. +- Provider: Timothy Tudor, DO. Location noted for each service: Fort Pierce SCENT (New Office). + +### Billed services +- 2026-05-21 — CPT 92557, comprehensive hearing test: charge $90.00; insurance adjustment $32.83; patient deductible/balance $57.17. +- 2026-05-21 — CPT 92550, tympanometry & reflex threshold: charge $60.00; insurance adjustment $31.04; patient deductible/balance $28.96. +- 2026-05-21 — CPT 92588, evoked auditory test complete: charge $147.00; insurance adjustment $53.58; patient deductible/balance $93.42. +- Total charges: $297.00. Insurance adjustments: $117.45. Insurance pending: $0.00. Amount due: $179.55. + ## Related - [[maintenance/index]] - [[Areas]] diff --git a/areas/platform.md b/areas/platform.md new file mode 100644 index 0000000..b4f17e2 --- /dev/null +++ b/areas/platform.md @@ -0,0 +1,158 @@ +--- +date: 2026-08-05 +type: area +status: active +tags: [platform, macmini, mcp, hermes, reyna-cli, voice-assistant, electronics, infra] +--- + +# Platform — Mac Mini Private-Host Layer + +Canonical tracker for all custom (not Hermes-native) skills, MCP servers, integrations, LaunchAgents, cron jobs, and Hermes plugins. Mac mini M4 (.102) is the sole private and browser host per AGENTS.md. This doc is source of truth; other brain files link here. + +## Direction: MacMiniMCP to reyna-cli consolidation + +Decision 2026-08-05: Migrate out of Node MacMiniMCP MCP server and consolidate everything into reyna-cli native privacy host. + +Why: +- MacMiniMCP uses fragile Applescript JXA osascript paths requiring separate Automation TCC approvals and spawning child processes. +- reyna-cli native host is one stable signed Reyna CLI.app bundle at native/ReynaCLIHost/ owning all Privacy and Automation permissions (Calendar, Contacts, Reminders, Notes via EventKit and NSAppleEventsUsageDescription). +- Python CLI becomes typed testable client over Unix socket Library Application Support reyna-cli privacy reyna-cli.sock with allowlist and redaction. +- No long-term Node fallback, no Mail or Full Disk Access scope creep, LAN stays private socket only. + +Policy: +- Do not build MacMiniMCP fallback. Add native operations until callers covered, validate with service.health plus synthetic probes, then disable and archive com.local.macmini-mcp. +- Preserve root symlinks MacMiniMCP to platform/MacMiniMCP and reyna-cli to platform/reyna-cli until LaunchAgents updated to platform canonical paths. +- Xcode Automatic Signing batch wave with Gitea backup before privileged migrations per mac_privacy_migrations_2026. + +Evolution: +electronics/mcp_screen micropython origin boot.py circuitpython lib desktop_client iphone_app from its spec +-> voice-assistant mcp_screen plus hermes-esp32-voice-gateway jarvis whisper-translation +-> platform/MacMiniMCP Node MCP 27 tools osascript +-> platform/reyna-cli Python facade plus Swift signed host <- current and final + +## Projects layout after Aug 5 2026 cleanup + +Projects/ +- platform/ + - MacMiniMCP Gitea mac_mcp 743M LEGACY to archive src/server.js 27 tools + - reyna-cli Gitea reyna-cli 960M CANONICAL Python facade Swift host +- electronics/ + - tactility/tactility 142M 16 branches tactility_apps 17M 6 branches ACTIVE + - basic1 48M RP2350 + - eink-api eink-dairy emulatedisplay pico-8 legacy +- voice-assistant/ + - mcp_screen 2.5M origin micropython spec for desktop + - hermes-esp32-voice-gateway jarvis whisper-translation AI-Harness-Basic VideoCaptioningTranslation +- EMI 780M EMI-Backend plus expoApp plus website +- xcode AI-Harness ReynaBot Watch App TestApp TestiOS1 +- Symlinks compat: MacMiniMCP to platform/MacMiniMCP, reyna-cli to platform/reyna-cli, basic1 to electronics/basic1 +- Removed: EMI_new_website PayloadCMS PoC, FamBoard Homarr widget uncommitted, remotion-hello starter +- Gitea 22 repos git.reynafamily.com/adolforeyna: 19 cloned, skipped clawbot 177k TS Feb24, WFK_theme PHP, immich-emi text, FamReynaBrain is brain + +## Custom skills owned + +- tactility-operations ~/.hermes/skills/tactility-operations/SKILL.md Book Player plus BibleVerse v6 BIBK per-book bin idx editorial UI plus Pi fleet 107 113 131 dashboard FS API RGB565 plus deterministic watercolor avatar workflow Grace purple constraint biggest skill refs watercolor-cute-style-guide kidsos-fleet-discovery kidsos-screen-send-fix +- reyna-cli-privacy-host ~/.hermes/skills/software-development/reyna-cli-privacy-host/SKILL.md one signed host consolidation privacy contract TDD RPC client 3-tier path validation EventKit main-thread deadlock fix launchd lifecycle capability migration refs 12 docs + +Heavily customized skill refs: +- macos-private-service-hosts refs macmini-projects-grouping 2026-08-05 notes-automation-migration +- electronics-projects refs macmini-layout 2026-08-05 paper-apps-games xiao-epaper rlcd-whale-writer +- weekly-coding-recap refs gitea-local-inventory 2026-08-05 implementation +- native-mcp refs kokoro-mlx-ksay macmini-mcp-cli-facade +- software-development-lifecycle refs reyna-cli-browser-integration web-open-design gitea-integration +- church-worship-graphics-generator family-brain-automation etc brain-tidying + +## MCP Tools inventory + +MacMiniMCP LEGACY 27 tools src/server.js via integrations js: +- Notes notes_list read create (JXA osascript) +- Calendar calendar_list_calendars list_events create_event focused Home index 2 Time window ISO +- Contacts contacts_search read create +- Reminders reminders_list_lists list create account context assignment meta +- Mail RO mail_accounts list_mailboxes list_messages 50 max read_message +- Deco deco_get_overview list_clients ipv4_status config_status router +- TTS STT speech_list_voices synthesize synthesize_base64 transcribe_file list_locales quick_test live_transcribe status close persistent pipe SpeechTranscriber +- Kokoro warm daemon 7332 speech_kokoro_status synthesize synthesize_base64 mlx-audio ksay_server.py +- Voicebox Qwen3-TTS voicebox_list_profiles health generate generate_base64 quick_reply instant contextual reply +- Apple LLM ANE 3B apple_llm_check status polish quick_reply chat close FoundationModels Swift +- Image codex_image_generate get_config_status local Codex CLI, gemini_image_generate get_config_status Gemini API, gemini_chrome_prompt_build get_config_status +- System system_get_info sw_vers uname system_speech_api_status +Auth local-only no creds. HTTP src/http.js plus stdio src/stdio.js. LaunchAgents com.local.macmini-mcp logs service out err, com.local.ksay-kokoro + +reyna-cli CANONICAL Python plus Swift: +CLI uv run reyna-cli --help: +- doctor +- web FastAPI uvicorn browser UI Authentik OIDC auth.reynafamily.com to reyna-cli.reynafamily.com port 8765 +- devices list ping tools call describe device registry config.py local_devices.yaml aliases kidsos4 kid4 rlcd rcld to esp32_screen + - devices screen laptop computer iphone arm ESP32 ESP32 screen personal laptop MCP this Mac desktop companion .102 iPhone app robot arm state home wave battery + - computer service-install start status restart logs desktop companion GUI service +- immich stats albums search sunset --limit 5 tools direct REST 8626 mcp +- mongo MongoDB direct driver 8630 bridge +- deco TP-Link Deco direct tplinkrouterc6u +- macmini Mac mini MCP facade Calendar Contacts Reminders while migration +- remarkable Paper Pro .132 UDP 49321 watchdog 15m discovery local cache macOS listener service +- privacy-host native privacy host commands lifecycle +- local-services local TTS STT Voice services direct Kokoro Voicebox Apple LLM Speech Image no MCP +Clients src/reyna_cli/clients immich mongodb zoom direct REST wrappers. + +Privacy contract privacy_contract.py: +- ALLOWED_OPERATIONS service.health calendar.list events.list event.create contacts.search read create reminders.lists list create notes.list read create speech.transcribe_file locales synthesize plus expanding +- command_to_operation cmd to typed op calendar_list_calendars to calendar.list raises KeyError unknown +- scrub_privacy_result exact key match token password secret api_key authorization case-insensitive REDACT exact only not substring my_token tokenizer passwords api_key_id stay visible recursive dict list tuple non-mutating + +Privacy RPC client privacy_client.py: +Unix socket JSON-lines id uuid operation args dict newline 64 KiB check before connect matching id validation PrivacyClientError missing socket timeout malformed mismatch ok false. + +Swift host native/ReynaCLIHost/: +Signed Reyna CLI.app native/ReynaCLIHost/dist/Reyna CLI.app ONLY Privacy owner after migration. +Package.swift linkedFramework AppKit when macOS required for Automation dialog foreground activation. +Providers CalendarProvider ContactsProvider RemindersProvider NotesProvider fail-closed automation_required unless fixed-probe authorization, SystemInfoProvider etc. +Security owner-only via getpeereid, 3-tier path validation platform allowlist root Users private var tmp uid 0 no go write except tmp 1777 only tmp var symlink allowed, user-owned intermediates Home Library Application Support uid current dir not symlink mode 022 must be 0 allows 0700 0750 0755 rejects 0770 0777, dedicated runtime parent immediate parent of socket eg privacy uid current dir not symlink mode 077 must be 0 strictly 0700 family rejects 0750 0755 socket 0600. No symlink following lstat. RunLoop pumping bridge for EKEventStore requestFullAccessToEvents deadlock avoid DispatchSemaphore wait on main thread. Bounded accepted clients size capped nonprompting default except explicit calendar.request_full_access foreground helper. +Build Xcode automatic signing wave batch plus Gitea backup before privileged migrations, validate bundle via service.health plus unique new operation semantic proof mtime unreliable. +Launchd ProgramArguments array native binary plus --socket path, RunAtLoad KeepAlive ProcessType Interactive working dir project log paths Library Logs reyna-cli privacy-host.* runtime dirs 0700. + +## LaunchAgents user domain Library LaunchAgents + +- com.local.macmini-mcp.plist LEGACY node --watch src/http.js WD Projects/MacMiniMCP symlink resolves to platform/MacMiniMCP logs .logs/service.*.log to be archived after reyna-cli coverage +- com.local.ksay-kokoro.plist Projects/MacMiniMCP/.venv/bin/python scripts/ksay_server.py WD MacMiniMCP logs ksay.out err TTS warm daemon 127.0.0.1:7332 keep used by both old and new +- com.reyna.cli.privacy-host.plist CANONICAL Reyna CLI.app Contents MacOS ReynaCLIHost --socket Library Application Support reyna-cli privacy reyna-cli.sock WD reyna-cli KeepAlways Interactive RunAtLoad +- com.reynafamily.reyna-cli.remarkable-listener.plist plus remarkable-sync.plist Paper Pro .132 UDP 49321 watchdog plus 30s sync to brain ~/brain areas notetaker etc +- ai.hermes.gateway.plist GW API 127.0.0.1:8642 model muse-spark-1.1 fallback openai-codex gpt-5-mini terra provider custom meta-claude +- com.adolforeyna.calendar-checkin.plist com.reyna.hermes-browser-dashboard-proxy.plist ancillary + +Current plists reference old symlink-root paths that resolve via symlinks. Update to platform canonical only on explicit approval plus launchctl unload load. + +## Hermes Plugins durable + +- ~/.hermes/plugins/esp32-voice-gateway/ durable plugin bundled patch patch/*.patch self-heals api/esp32/voice WebSocket routes _handle_esp32_voice_ws ESP32_AUDIO_MAX_BYTES etc after hermes update wipes gateway/platforms/api_server.py in-tree patches. __init__.py checks api_server.py for ESP32 markers auto-applies patch via git apply logs actionable warning. Operator must run separate shell restart outside GW process SIGTERM guard cannot restart from inside gateway. Future v2 runtime injection monkeypatch. + +- ~/.hermes/plugins/hermes-achievements/ scan_checkpoint state gamification. + +## Cron Jobs .hermes/cron/jobs.json + +- Script-only no agent spawn fast: + - reyna_family_wind_down_whatsapp.py weekday 20:30 group 120363424746547296@g.us deliver local + - reyna_morning_briefing_whatsapp.py daily 8am FamReynaBot group deliver local + - chiapas_flight_price_monitor.py daily 7am Kayak monitor empty stdout no alert deliver origin +- Agent jobs: + - weekly-coding-recap Mon 8am runs ~/.hermes/scripts/weekly_coding_recap.py to brain/areas/coding/recaps/YYYY-WXX.md updates areas/coding.md index silent unless fails. FIXED 2026-08-05: pinned provider openai-codex model gpt-5.6-terra via hermes cron edit 50b9ca5ec3cb --provider openai-codex --model gpt-5.6-terra — previously errored model drift gpt-5 to gpt-5.6-terra unpinned needs cronjob action update pin provider model. +- One-shots plant feed Aug14 Aug28 exact reminder push. + +Scripts location ~/.hermes/scripts or bundled backup platform/reyna-cli/backup/macmini-automation-baseline-2026-08-03/hermes-scripts/weekly_coding_recap.py. + +## Related brain files + +- Areas: coding weekly recaps index, mac_privacy_migrations_2026 signing wave rules infra map, network devices_inventory raw_scans caddy_parsed git.reynafamily.com, operations hermes_migration_macmini_2026-08-02.md apple_mail_local_read_research +- Projects: para_brain_mcp_server brain Gitea FamReynaBrain.git ~/brain backed, voice_dev_infrastructure_2026 triad 102 110 150 plus GW 8642, voice_agent_platform_research_2026 open-gpt-live StreamCore fork, jarvis_v2_always_listening (iMac11,3 Intel i3 550 PipeWire Silero VAD openWakeWord hey_jarvis faster-whisper ECAPA faceID fusion), tactility_voice_gateway_elato_transition_2026, paseo_centralized_agents_2026, reyna_cli_browser_control Gemini Web image gen via iMac headed Chrome CDP 9222, pocketbase_family_baas_2026, electronics_xiao_epaper_400x300_2026, etc. +- READMEs: platform/README.md electronics/README.md voice-assistant/README.md in Projects + +## Next + +- Fix weekly-coding-recap cron pin job 50b9ca5ec3cb provider openai-codex model gpt-5.6-terra or pin original +- Add remaining privacy-host operations per reyna-cli-privacy-host skill Calendar events create list Contacts Reminders Notes automation_required boundary speech until MacMiniMCP coverage complete then archive com.local.macmini-mcp +- Update LaunchAgent working directories from symlink-root to platform canonical explicit approval plus unload load +- Verify after regroup: launchctl list grep macmini ksay reyna, uv run reyna-cli doctor --json, ls -l Library/Application Support/reyna-cli/privacy/reyna-cli.sock, curl macmini-mcp http tools +- Gitea inventory doc update when clawbot WFK_theme decision +- Keep this file single tracker update when new MCP tool skill cron LaunchAgent plugin added plus cross-ref to tactility-operations and reyna-cli-privacy-host skills references + +[[Areas]] | [[Projects]] diff --git a/projects/msc_cruise_2026.md b/projects/msc_cruise_2026.md index 051c9cf..2ba4e4d 100644 --- a/projects/msc_cruise_2026.md +++ b/projects/msc_cruise_2026.md @@ -62,6 +62,21 @@ Original message from Brittany (Post Cruise Support): - **Recipient:** `postcruisesupport@msccruisesusa.com`. - **Status:** Follow-up ready to send; awaiting MSC's written response. +### Response After 90-Day Follow-up (2026-07-29) +- **Response received:** Brittany / MSC Post Cruise Support replied to the July 28 follow-up. +- **Substance:** MSC said it had followed up internally with the appropriate team to request an update on the review status and would email again once more information was available. +- **Assessment:** This was another holding response, not a completed investigation result, medical-expense coverage decision, reimbursement position, evidence-preservation confirmation, or substantive response. +- **Related auto-acknowledgment:** A separate message on July 29 created service request **2-28521288231** and stated that a team member would respond within seven business days. +- **Current status:** The case remains unresolved and under internal review after the promised 90-day period. + +### Manager Escalation Follow-up Sent (2026-08-08) +- **Sent:** Reply to the July 29 MSC claim email. +- **To:** MSC Post Cruise Support. +- **CC:** Alicia Gillespie. +- **Subject:** `Re: BM / Claim Injury / 70380587`. +- **Content:** Requested escalation to a manager or claims/risk-management representative, a substantive investigation and reimbursement update, documentation requirements, a response date, and confirmation that evidence remains preserved. The paragraph about MSC asking about my father's current health was removed as requested. +- **Verification:** Sent copy appears in Gmail Sent Mail at 2026-08-08 22:24:34 UTC. + ### Key Contacts for Medical Case - **Mark Moya** (Front Desk Manager) - 📞 6014 or dial 99 Reception – Guest Service