diff --git a/HEARTBEAT.md b/HEARTBEAT.md index 8e6b6b6..8ed5a03 100644 --- a/HEARTBEAT.md +++ b/HEARTBEAT.md @@ -192,6 +192,18 @@ systemctl --user restart clawdbot-gateway --- +## Signal Reply Watch (temporary — email migration) + +Sent email migration instructions to kids on 2026-02-18 ~2AM. Watch for replies: +- **Misha** +17272381189 +- **Roos** +31646563377 +- **Jacques** +31624403744 + +If any of them reply via Signal, **ping Johan immediately** regardless of time (he's on night shift). +Remove this section once all three have confirmed setup or it's been >7 days. + +--- + ## WhatsApp Monitor **Handled by webhook** — message-bridge POSTs to `/hooks/message` on new messages. diff --git a/memory/2026-02-18.md b/memory/2026-02-18.md new file mode 100644 index 0000000..afd823f --- /dev/null +++ b/memory/2026-02-18.md @@ -0,0 +1,156 @@ +# Daily Notes — 2026-02-18 + +## Contacts Dedup (completed ~midnight) +- Johan has contacts across multiple Google accounts, exporting to iCloud as part of Apple ecosystem switch +- Built Python dedup script at `/home/johan/clawd/tmp/contacts/dedup.py` + `postprocess.py` +- Input: 4,168 contacts (3 vcf files: contacts.vcf 689, contacts(1).vcf 3477, contacts(2).vcf 2) +- Output: `final.vcf` with ~2,200 clean contacts +- Key bugs fixed during session: + - Phone chain merging via shared switchboard numbers (LogicNow HQ +1-919-957-5099 merged 15 employees) → threshold filter: skip phones appearing in 3+ contacts + - ORG-only dedup merged entire companies → removed + - Single-word name dedup merged all "Sander" / "Floor" contacts → require 2+ significant words + - Subset name matching (Wenda Haasjes / Wenda Haasjes - Jongsma) → fixed using prefix matching +- Post-processing: removes contacts with no email+phone, removes nameless contacts (215 emails printed for review), converts Dutch 06XXXXXXXXX numbers to +316XXXXXXXXX +- **Nameless contacts email list** was printed — Johan should review if any need a contact card created +- 62 Dutch phone numbers converted to international format +- `final.vcf` ready to import at icloud.com/contacts → gear → Import vCard (Mac/browser, not iPhone) + +## Apple Ecosystem Transition +- Johan bought iPhone 17 (sign-ins seen on Apple, Google, Spotify today ~3:39 PM PST) +- Moving from Windows → Mac (Apple Silicon superior, especially for local AI) +- Prefers Android but accepting iPhone because Mac + Windows mismatch is worse +- Calendaring: all in Outlook (work), no personal calendar +- Contacts: moving to iCloud + +## Email Triage (9 PM, silent while Johan slept) +- 34 messages processed across tj_jongsma_me and johan_jongsma_me +- Key alerts posted to Fully: + - ✈️ Delta flight F86VDN: TPA→JFK Thu Feb 19 at 7:16 AM, back at 6:06 PM (day trip NYC) + - 🏠 851 Brightwaters showing (2/16): Sarasota buyers, liked exterior, disliked modern interior; Diana waiting for buyer response + - 💳 Macy's CC (ending 8097): $29 min due by 2/22, balance $147.23 + - 👙 Fleur du Mal new collection + - 🧠 Southwest Brain Performance Centers (Albuquerque) — Sophia's provider, seminar Feb 18 6PM + appointment reminder +- Deliveries added to dashboard: Macy's (3 packages, UPS+USPS, by 2/19-2/23), Nordstrom chinos x2 (by 2/20) +- Cloudflare DNSSEC errors: zavtra.nl, busel.nl, muskepo.nl — James task created to remove DS records +- flourishevents.nl: successfully migrated to Cloudflare Free plan +- NETGEAR Meural annual renewal: $74.85 auto-charged to MC ****2208 + +## Dashboard Cleanup +- Old Fully alerts from 2/9 era were still visible (David Bagget era, Kaseya Win Alerts, Teams messages) +- Johan flagged this — cleaned all alerts older than tonight +- Root cause: messages with null dates were being treated as current +- Fix: email straggler cron now checks message body date, skips >48h old + +## Heartbeat Architecture Overhaul +- Problem: heartbeats ran in main session → burned 148k tokens per check when context was large +- Solution: disabled built-in heartbeat (set to 720h), created two isolated cron jobs: + - **Watchdog (K2.5)** — every 30 min, isolated: K2 watchdog + doc inbox + Claude usage + - **Email Straggler (Sonnet)** — every 90 min, isolated: email fallback triage +- Main session now only used for actual conversations with Johan + +## Token Usage +- Weekly: 55% used as of midnight, resets Fri Feb 21 +- Tonight's contacts dedup session was expensive (~500k-1M tokens estimated) +- New architecture should significantly reduce background token burn + +## 851 Brightwaters Real Estate +- Diana Geegan is the realtor +- Showing 2/16: Sarasota buyers (Bird Key homeowners), daughter lives in St. Pete +- Also toured 1075 31st Ter NE ($8.95M) — not on Brightwaters +- Buyers felt interior was "too modern" / contemporary European for their Mediterranean taste +- Agent expected response from buyers the morning of 2/17 — no offer reported yet + +## Delta Flight Thu Feb 19 +- Delta 2475: TPA departs 7:16 AM → JFK arrives 10:00 AM +- Delta 2093: JFK departs 2:59 PM → TPA arrives 6:06 PM +- Confirmation: F86VDN, seat assigned at gate, Main Basic (E) fare, $445.80 +- Day trip to NYC + +## Contacts Pipeline — Known Issues in final.vcf +- **Bishop I.T. Solutions**: appears 3× — manual review needed after iCloud import +- **McKenna Sloan Malison**: Shorecrest multi-person blob from source data; not a pipeline error +- **Johan Jongsma**: appears 2× — caught by chain merge guard correctly (not merged) +- **Aleksey Shafransky / Alona Dishy / Bertram Heemink**: each has 4 emails but are legitimate (career history) +- **To re-run pipeline**: `cd /home/johan/clawd/tmp/contacts && python3 dedup.py && python3 postprocess.py` +- **Chain merge guard**: if merged record would have >4 email domains, revert to individual records +- **iCloud chosen over Baikal**: zero infra maintenance, easy export later, Johan already has Apple ID from iPhone 17 + +## Contacts Pipeline — Dedup Rules (for future reference) +- Email match → merge +- Unique phone match (phone appearing in <3 contacts) → merge +- Exact full name match (≥2 significant words) → merge; prefix name match also handled (e.g. "Wenda Haasjes" ↔ "Wenda Haasjes - Jongsma") +- No org-only dedup (caused LogicNow + Shorecrest blobs) +- Skip phones appearing in 3+ contacts (shared switchboard numbers) +- Chain merge guard: >4 email domains → revert +- Strip: no-email AND no-phone contacts; no-name contacts; noise labels (Imported on, Restored from Google, myContacts); keep "starred" +- Dutch 06XXXXXXXXX → +316XXXXXXXXX normalization + +## Heartbeat Cron Jobs (new architecture) +- Built-in heartbeat disabled (interval set to 720h) — was burning 148k tokens per ping +- **K2 Watchdog** (isolated, K2.5/Haiku): runs every 30 min — checks K2 service + doc inbox + Claude usage +- **Email Straggler** (isolated, Sonnet): runs every 90 min — fallback email triage check +- Isolated sessions have minimal context → cheap per-run cost + +## Teams 24h Age Filter (fix committed) +- Old January Teams messages were appearing on Fully dashboard +- Root cause: no age filtering on inbound Teams messages +- Fix: added `ComposeTime string` to `teamsMsg` struct; skip if message > 24h old before building `convDetails` +- Committed `b69af43` on `mc-unified` branch of `message-center` + +## mail.jongsma.me — Family Email Server +- DNS: A record added → Zurich IP (82.24.174.112); Stalwart ACME covers `mail.inou.com` + `mail.jongsma.me` +- Stalwart admin password reset: `agolM71pOwZBJhggROBDkn8R` (stored in `memory/vaultwarden-credentials.md`) +- **Family accounts created** on Stalwart: + - Rozemarijn: pw `cRKEWJL4h3MGn3Li` — aliases: rozemarijn@, roos@, rozie@, rozemarijn@flourishevents.nl, info@flourishevents.nl + more @jongsma.me + - Jacques: pw `7I#rydMKlri6r%!g` — aliases: jacques@, tjerk@, tjerkjacob@, jacques@e-consultants.nl + - Misha: pw `6hRSl8KAZtGXPRUG` — aliases: misha@muskepo.com, michael@muskepo.com, misha@jongsma.me (PRIVATE — not to be mentioned publicly) +- Signal migration instructions sent to all three from James bot (+31634481877) +- Cert provisioning in progress — verify with `curl -v https://mail.jongsma.me` +- Roos asked if she wants James to help with migration or do it herself — awaiting reply +- **Stalwart quirk**: PATCH is broken in v0.15.5 — use DELETE + POST for account updates + +## Signal Connector (MC) +- Built `connector_signal.go` in Message Center at `/home/johan/dev/message-center/` +- Polls signal-cli JSON-RPC at `http://localhost:8080/api/v1/rpc` +- Posts Fully alerts per sender; `Send()` via same endpoint +- Test pings sent to Roos (+31646563377) and Jacques (+31624403744) — both delivered +- Jacques Signal UUID: `ce74137a-b165-411d-9d2b-48362d8468cf` + +## Signal Session Isolation Fix (Critical) +- **Problem discovered**: `allowFrom` setting in OpenClaw bypasses pairing flow → all family messages fell into Johan's main session +- **Fix**: Reverted `signal-allowFrom.json` to only contain `+17272252475` (Johan only); cleared `signal-pairing.json` +- **Result**: Kids must now send a message → get pairing code → type it back → get isolated sessions +- Roos confirmed channel works ("Hoi James"), had brief conversation about rijles + studio +- Roos asked about Sophia's guitar — no info in memory, James told her to ask Johan +- Jacques confirmed channel works; follow-up sent ("pairing thing was a bug, channel works now, dad is doing great") +- Roos informed of pairing reset — told to send a message to get new code + +## M365 Email Alert Auto-Delete +- When Outlook email is deleted/read, next MC poll cycle now removes corresponding Fully tile +- Implementation: `EmailAlerts map[string]string` added to `m365State` (`msgID → alertID`), persisted in `~/.message-center/m365-state.json` +- `pollEmail()` tracks IDs and reconciles (removes orphaned Fully tiles) on each poll +- Committed `2005d75` on `mc-unified` + +## OpenClaw Family Agent Routing (investigated, not yet configured) +- Confirmed: `bindings[]` array at top level of OpenClaw config with `agentId` + `match` (channel, accountId, peer.id, peer.kind, roles) +- `peer.id` matching Signal numbers → routes to specific `agentId`; multiple agents defined in `agents.list[]` +- Each agent can have separate workspace/identity/skills/memory +- **Decision pending**: Johan needs to decide whether to create a dedicated family agent (stripped-down, no personal memory files) or keep shared workspace +- Risk of shared workspace: kids' sessions currently can read MEMORY.md (Sophia medical, finances) +- Recommended: create `agents.family` with separate workspace dir, no access to Johan's personal memory + +## Alena CVS Prescriptions +- 3 prescriptions ready since Feb 16: HYD, CAR, AML +- Johan needs to arrange pickup or delivery + +## Pending / Next Steps +1. Johan: import `final.vcf` to iCloud — `scp johan@192.168.1.16:/home/johan/clawd/tmp/contacts/final.vcf ~/Downloads/` → icloud.com/contacts → gear → Import vCard +2. Verify `mail.jongsma.me` cert: `curl -v https://mail.jongsma.me` +3. Roos email migration: awaiting her reply +4. Kids pairing: Roos, Jacques, Misha each need to send message + complete pairing flow +5. OpenClaw family agent: Johan decides whether to create separate agent with isolated workspace +6. **URGENT**: jongsma.me domain transfer — expires Feb 28 (2026) +7. DNSSEC fix: remove DS records for zavtra.nl, busel.nl, muskepo.nl (Cloudflare) +8. Alena's prescriptions: pickup or delivery at CVS +9. Johan's flight Thu Feb 19: Delta TPA→JFK departs 7:16 AM — be at TPA ~5:30 AM (conf: F86VDN) +10. Vaultwarden: Johan needs to create account + import Proton Pass passwords diff --git a/memory/claude-usage.db b/memory/claude-usage.db index 8c770e7..58ce753 100644 Binary files a/memory/claude-usage.db and b/memory/claude-usage.db differ diff --git a/memory/claude-usage.json b/memory/claude-usage.json index 99d4acd..7f423b7 100644 --- a/memory/claude-usage.json +++ b/memory/claude-usage.json @@ -1,9 +1,9 @@ { - "last_updated": "2026-02-18T05:00:04.947668Z", + "last_updated": "2026-02-18T11:00:10.022130Z", "source": "api", - "session_percent": 0, - "session_resets": null, - "weekly_percent": 55, - "weekly_resets": "2026-02-21T18:59:59.902276+00:00", - "sonnet_percent": 10 + "session_percent": 2, + "session_resets": "2026-02-18T14:59:59.984844+00:00", + "weekly_percent": 59, + "weekly_resets": "2026-02-21T18:59:59.984863+00:00", + "sonnet_percent": 16 } \ No newline at end of file diff --git a/memory/vaultwarden-credentials.md b/memory/vaultwarden-credentials.md index 4b4aa04..327d8bf 100644 --- a/memory/vaultwarden-credentials.md +++ b/memory/vaultwarden-credentials.md @@ -12,3 +12,10 @@ ## TODO - [ ] Configure rclone for Google Drive (needs OAuth browser auth - Johan must run `rclone config` on Zurich) - [ ] Disable signups after Johan creates his account (set SIGNUPS_ALLOWED=false in docker-compose.yml) + +## Stalwart Mail Admin +**URL:** https://mail.inou.com (admin panel) +**Admin user:** admin +**Admin password:** agolM71pOwZBJhggROBDkn8R +**Config:** /opt/stalwart-mail/etc/config.toml +**Note:** Temp password `Temp@dmin2026!` was used during 2026-02-18 session; replaced with above