Platform State

Tailscale Network

DeviceTailscale IPLAN IPStatus
Samsung S23 Ultra100.124.223.117-Online
DESKTOP-F9KSPPP (Sozo PC)100.83.112.84192.168.68.100Online
IDA PC100.103.118.9192.168.68.110Online (WinRM 5985 + Ollama :11434 + SMB share)
MSI Laptop100.107.39.23192.168.68.111Online (WinRM 5985 + Ollama :11434)

Tailscale Dependency (2026-05-11)

  • When Tailscale is OFF: Both SSH/SCP to PC AND Obsidian Local REST API become unreachable
  • Symptom: News podcast cron fails at “upload script to PC” step with connection timeout/hang
  • Recovery: User manually reconnects Tailscale on PC → workflow resumes from failed step
  • Confirmed (2026-05-11): Tailscale down → ssh [email protected] hangs; Obsidian API curl returns connection timeout
  • Note: PC can still reach external internet when Tailscale is off (LAN connectivity maintained)

SSH Access

  • To PC: ssh -i ~/.ssh/id_ed25519 [email protected]
  • Key type: ed25519
  • User: Sozo (Administrators group ✓)
  • Status: Working (CRLF issue resolved)
  • PC may sleep at night — SSH timed out at ~22:00 MYT (2026-05-10 evening session)

Windows PC SSH Details

PowerShell GBK Display + NTFS UTF-16 Encoding (2026-05-11)

  • Symptom: PowerShell displays Chinese characters in file paths as garbled (e.g., News-2026-05-11-���Ų���.mp3)
  • Root cause: PowerShell console uses GBK/CP936 to display paths, but NTFS stores filenames as UTF-16 LE
  • The file is actually correctCopy-Item with the garbled path STILL WORKS because the underlying filesystem API uses UTF-16
  • Workaround: Use Copy-Item with garbled display path → copy to clean ASCII filename → download via SCP
  • Do NOT use: scp host:"D:\path\*.mp3" glob pattern with garbled filename — SCP glob doesn’t work

PowerShell Working Directory

  • Default: D:\ (not user’s home directory)
  • When SSH connects to PC via ssh [email protected] "powershell ...", PowerShell starts in D:\
  • SCP from Windows uses C:\hermes_wiki\ as staging — files must be in that directory for SCP to work

SCP Path Format

  • Working: [email protected]:\hermes_wiki\file (backslash at start, no drive letter)
  • Fails: [email protected]:C:\path\file (drive letter format)
  • Unix-style paths (/d/file) do NOT work from Windows SSH environment

File Paths

PathWorks via SCP?Notes
C:\hermes_wiki\✅ YesBest for temp files
H:\My Drive\...\Obsidian Vault\❌ NoMust use copy command
D:\hermes\sessions\❌ NoOnly via OpenClaw/SMB

Connected Services

ServicePlatformStatus
Hermes AgentTermuxRunning
Hermes WebUIlocalhost:5173Accessible
Hermes Backend APIlocalhost:9119Running
OpenClaw GatewayPC:18791Needs restart
PaperclipPC D:\paperclipRunning
Docker DesktopPCInstalled

Google Workspace

  • Primary account: [email protected]
    • OAuth token: ~/.hermes/google_token.json (refreshed)
    • OAuth scopes: forms.body + drive.file (both required for Forms API)
    • Client secret: ~/.hermes/google_client_secret.json
  • Secondary account: [email protected]
    • OAuth token: ~/.hermes/google_token_tttttttttze.json
    • Client secret: ~/.hermes/google_client_secret_tttttttttze.json

OAuth Token Expiry (2026-05-10)

  • Access token expires in ~1 hour — session at 22:00 had expired token (issued ~7hrs earlier at ~15:00)
  • Token refresh via oauth2.googleapis.com/token succeeds, BUT Forms API may still return 401
  • Refresh may need full re-auth if token revoked — watch for 401 on Forms API after refresh
  • client_secret.json on Termux IS valid (914687008998-vkogt2m5jn5s5a3qurj1o1nntfmklmr7.apps.googleusercontent.com)

Google Forms API

  • Forms API: https://forms.googleapis.com/v1/forms
  • Requires: forms.body + drive.file scopes (drive for photo hosting)
  • Limitation: No native image options — photos must be hosted on Drive and linked via text
  • Interior Design Poll Form (2026-05-10): 1FAIpQLScjAaZ2Qmjg6yCvYn9Z7RNZVzX8VgnAubMU9gkjNe4sLgty6Q
    • 8 sections × 5 options = 40 questions
    • Sections: 客厅/厨房/卧房/衣橱/饭厅 + 3 kids rooms

Google Drive

  • Obsidian vault folder ID: 1jR76SbioF1u2H-hqca-TejjJ1_d4KDOI
  • Jakephone folder ID: 1bYsAY4SZcFFmtUtvJak3LWyzOR9OW22N

Obsidian Local REST API

  • API Key: 047e84eb941910b7ae221ea6b458fbd6c9b2bbfbeab654e05a59893520cd29f9
  • Base: http://100.83.112.84:27123
  • Endpoint: POST /vault/{filename}.md
  • Method: POST with Content-Type: text/markdown header
  • 认证: Authorization: Bearer {key}
  • 注意: POST 返回空不代表成功,需 GET 验证内容
  • 已知错误: "Could not determine home directory" — 改用 SCP fallback

Ports

PortService
8000Hermes Gateway
9119Hermes Backend API
5173Hermes Web UI
18789OpenClaw Web UI
18791OpenClaw Gateway
27123Obsidian Local REST API
5432PostgreSQL (if installed)
8080Pokemon Live Server (pokemon_live.py) — crashed 2026-05-05

Pokemon Live (Windows PC)

Service Info

  • ROM path: D:\Games\Pokemon\Pokemon - Red Version (USA, Europe) (SGB Enhanced).gb
  • Script: D:\pokemon_live.py
  • Port: 8080
  • Task name: PokemonLive (scheduled task via schtasks)
  • Python venv: C:\Users\Sozo\pokemon-agent\venv\Scripts\python.exe

Crash Recovery (2026-05-05)

  • Symptom: Process 16784 in CloseWait state with many connections, then Listen but refusing connections
  • Fix: Kill and restart via schtasks /Run /I /TN PokemonLive
  • Verified: schtasks /Run /I successfully starts task in Session 1 (user’s interactive session)

Cron Job Network Isolation (2026-05-06)

  • Cron sessions run in isolated network namespace on Termux
  • Cannot reach from cron: Obsidian Local REST API (100.83.112.84:27123), SSH to PC, SCP to PC
  • Can reach from cron: External internet (YouTube, HuggingFace, etc.)
  • Workaround: Use SCP+PS1+execute workflow or save to local draft for manual sync
  • Symptom: Obsidian API curl returns connection timeout; SSH/SCP hangs at connection

Windows Defender Exclusions (2026-05-08)

  • C:\hermes_wiki\hermes-gateway — Hermes gateway staging directory
  • Purpose: Prevents Windows Defender from scanning Hermes-related temp files

Telegram

  • PC Hermes bot: @hermesjake_bot
  • Bot token (Termux): ~/.hermes/.envTELEGRAM_BOT_TOKEN
  • Bot token (PC): D:\\hermes\\.envTELEGRAM_BOT_TOKEN
  • Ti Tze Czia: chat_id 5671991810
  • Old Termux bot token: 8766595133:AAH...iqN_BpP — unauthorized (bot was deleted/blocked)
  • PC Hermes bot can send messages to Ti Tze Czia via curl.exe PowerShell

Termux Package Notes

  • sqlite3 CLI not installed — only libsqlite library present
  • hermes.db is empty (0 bytes) — sqlite3 check in scripts will fail silently
  • This affects: check_recent_chat.sh (falls through to file-based check)

sozo-todos.json BOM Issue (2026-05-07)

  • File: D:\\hermes\\sessions\\sozo-todos.json
  • Issue: File has UTF-8 BOM (\xef\xbb\xbf)
  • Symptom: PowerShell Get-Content defaults to ANSI, Chinese chars become mojibake
  • Fix: Use encoding='utf-8-sig' in Python or -Encoding utf8 in PowerShell
  • Verified: python -c "import json; print(json.load(open('D:\\\\hermes\\\\sessions\\\\sozo-todos.json', encoding='utf-8-sig')))" works

Session Files Performance (2026-05-04)

  • Sessions directory: ~/.hermes/sessions/ (~162 .jsonl files)
  • Original stat -c %Y per file took ~0.2s on this filesystem (slow FUSE/exFAT)
  • FIXED (2026-05-04 06:xx): Replaced stat loop with find -mmin -180
  • New script runtime: 0.062s (was 31s) — 500x faster
  • check_recent_chat.sh now well under cron timeout

Pokemon Live Server Update (2026-05-05 05-06h)

  • Status: STABLE ✅ (was crashed, now running with pyboy_lock fix)
  • Root cause: Concurrent access - background screenshot thread + button_press both accessing PyBoy
  • Fix: Added pyboy_lock = threading.Lock() to D:\pokemon_live.py
  • Verified: 5+ consecutive A-button presses work without timeout
  • Battle flag (0xCC28): Value=1 means “event in progress” (includes dialogue), NOT actual battle
  • Double process issue: port 8080 still shows 2 LISTENING processes (unresolved)

Web Scraping Limitations from Termux (2026-05-10)

  • Most Malaysian websites block curl requests from Termux
  • Blocked sites: qcosa.com, homify.my, renovationlady.com, bighome.com.my (return empty/0-length or 403)
  • Accessible alternatives: Houzz Australia (houzz.com.au), Space Furniture Singapore, international design sites
  • Fallback approach: When Malaysian sites are blocked:
    1. Compile content from domain knowledge + accessible international sources
    2. Houzz Australia has accessible interior design style content
    3. Use curated content document as NotebookLM source

Platform State

Tailscale Network

DeviceTailscale IPLAN IPStatus
Samsung S23 Ultra100.124.223.117-Online
DESKTOP-F9KSPPP (Sozo PC)100.83.112.84192.168.68.100Online
IDA PC100.103.118.9192.168.68.110Online (WinRM 5985 + Ollama :11434 + SMB share)
MSI Laptop100.107.39.23192.168.68.111Online (WinRM 5985 + Ollama :11434)

Tailscale Dependency (2026-05-11, updated 2026-05-15)

  • When Tailscale is OFF: Both SSH/SCP to PC AND Obsidian Local REST API become unreachable
  • Symptom: News podcast cron fails at “upload script to PC” step with connection timeout/hang
  • Recovery: User manually reconnects Tailscale on PC → workflow resumes from failed step
  • Confirmed (2026-05-11): Tailscale down → ssh [email protected] hangs; Obsidian API curl returns connection timeout
  • Note: PC can still reach external internet when Tailscale is off (LAN connectivity maintained)

⚠️ Tailscale is NOT a binary on/off — it can be intermittent (2026-05-15):

  • PC was REACHABLE at 07:23 (待办摘要 cron successfully read D:\\hermes\\sessions\\sozo-todos.json and sent Telegram)
  • PC became UNREACHABLE by 07:30 (news pipeline, 待办摘要 morning job, 全能新闻实验室 all failed)
  • PC still unreachable at 14:00 (Singtel Digi reminder failed with SSH timeout)
  • Tailscale became intermittent again mid-day — OpenClaw startup required Tailscale to be connected
  • Lesson: Jobs that depend on PC connectivity should have local fallbacks. News pipeline does (local edge-tts). 待办摘要 morning job doesn’t (requires PC access for canvas_summary.json).

OpenClaw npm Package Corruption (2026-05-15)

Symptom

  • D:\OpenClaw_Home\node_modules\openclaw\dist\ contained only extensions/ folder (1142 bytes total)
  • Actual JS files (index.js, openclaw.mjs, etc.) were completely missing
  • Result: OpenClaw completely non-functional — npx openclaw would fail immediately

Fix

# Reinstall openclaw locally in D:\OpenClaw_Home
cd D:\OpenClaw_Home
npm install openclaw

Startup Command (Verified 2026-05-15)

# From D:\OpenClaw_Home directory
npx openclaw gateway --port 18789

⚠️ Do NOT use global npm install

npm install -g openclaw does NOT work — global npm is empty on this PC. Always install locally in D:\OpenClaw_Home.

SSH Access

  • To PC: ssh -i ~/.ssh/id_ed25519 [email protected]
  • Key type: ed25519
  • User: Sozo (Administrators group ✓)
  • Status: Working (CRLF issue resolved) — but see Port Blockage below
  • PC may sleep at night — SSH timed out at ~22:00 MYT (2026-05-10 evening session)

⚠️ All TCP Ports Blocked (2026-05-16)

  • Discovery: Port scan from Termux Hermes shows ALL inbound TCP ports on Sozo PC are firewalled/blocked
  • Only ICMP (ping) works
  • Scanned and failed: 22 (SSH), 80 (HTTP), 443 (HTTPS), 445 (SMB), 3389 (RDP), 5900 (VNC), 5985/5986 (WinRM), 8080
  • Root cause: Windows Firewall or security software blocking all inbound connections
  • Fix required: Someone must be physically at the PC to run:
    New-NetFirewallRule -DisplayName "OpenSSH" -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow
  • This is a physical access problem — cannot be fixed remotely

Windows PC SSH Details

PowerShell GBK Display + NTFS UTF-16 Encoding (2026-05-11)

  • Symptom: PowerShell displays Chinese characters in file paths as garbled (e.g., News-2026-05-11-���Ų���.mp3)
  • Root cause: PowerShell console uses GBK/CP936 to display paths, but NTFS stores filenames as UTF-16 LE
  • The file is actually correctCopy-Item with the garbled path STILL WORKS because the underlying filesystem API uses UTF-16
  • Workaround: Use Copy-Item with garbled display path → copy to clean ASCII filename → download via SCP
  • Do NOT use: scp host:"D:\path\*.mp3" glob pattern with garbled filename — SCP glob doesn’t work

PowerShell Working Directory

  • Default: D:\ (not user’s home directory)
  • When SSH connects to PC via ssh [email protected] "powershell ...", PowerShell starts in D:\
  • SCP from Windows uses C:\hermes_wiki\ as staging — files must be in that directory for SCP to work

SCP Path Format

  • Working: [email protected]:\hermes_wiki\file (backslash at start, no drive letter)
  • Fails: [email protected]:C:\path\file (drive letter format)
  • Unix-style paths (/d/file) do NOT work from Windows SSH environment

File Paths

PathWorks via SCP?Notes
C:\hermes_wiki\✅ YesBest for temp files
H:\My Drive\...\Obsidian Vault\❌ NoMust use copy command
D:\hermes\sessions\❌ NoOnly via OpenClaw/SMB

Connected Services

ServicePlatformStatus
Hermes AgentTermuxRunning
Hermes WebUIlocalhost:5173Accessible
Hermes Backend APIlocalhost:9119Running
OpenClaw GatewayPC:18789✅ Running (2026-05-15)
PaperclipPC D:\paperclipRunning
Docker DesktopPCInstalled

Google Workspace

  • Primary account: [email protected]
    • OAuth token: ~/.hermes/google_token.json (refreshed)
    • OAuth scopes: forms.body + drive.file (both required for Forms API)
    • Client secret: ~/.hermes/google_client_secret.json
  • Secondary account: [email protected]
    • OAuth token: ~/.hermes/google_token_tttttttttze.json
    • Client secret: ~/.hermes/google_client_secret_tttttttttze.json

OAuth Token Expiry (2026-05-10)

  • Access token expires in ~1 hour — session at 22:00 had expired token (issued ~7hrs earlier at ~15:00)
  • Token refresh via oauth2.googleapis.com/token succeeds, BUT Forms API may still return 401
  • Refresh may need full re-auth if token revoked — watch for 401 on Forms API after refresh
  • client_secret.json on Termux IS valid (914687008998-vkogt2m5jn5s5a3qurj1o1nntfmklmr7.apps.googleusercontent.com)

Google Forms API

  • Forms API: https://forms.googleapis.com/v1/forms
  • Requires: forms.body + drive.file scopes (drive for photo hosting)
  • Limitation: No native image options — photos must be hosted on Drive and linked via text
  • Interior Design Poll Form (2026-05-10): 1FAIpQLScjAaZ2Qmjg6yCvYn9Z7RNZVzX8VgnAubMU9gkjNe4sLgty6Q
    • 8 sections × 5 options = 40 questions
    • Sections: 客厅/厨房/卧房/衣橱/饭厅 + 3 kids rooms

Google Drive

  • Obsidian vault folder ID: 1jR76SbioF1u2H-hqca-TejjJ1_d4KDOI
  • Jakephone folder ID: 1bYsAY4SZcFFmtUtvJak3LWyzOR9OW22N

Obsidian Local REST API

  • API Key: 047e84eb941910b7ae221ea6b458fbd6c9b2bbfbeab654e05a59893520cd29f9
  • Base: http://100.83.112.84:27123
  • Endpoint: POST /vault/{filename}.md
  • Method: POST with Content-Type: text/markdown header
  • 认证: Authorization: Bearer {key}
  • 注意: POST 返回空不代表成功,需 GET 验证内容
  • 已知错误: "Could not determine home directory" — 改用 SCP fallback

Ports

PortService
8000Hermes Gateway
8642Hermes Gateway (PC Python agent — alternative port)
9119Hermes Backend API
5173Hermes Web UI
18789OpenClaw Web UI (HTTP)
18791OpenClaw Browser Control ( CDP)
27123Obsidian Local REST API
5432PostgreSQL (if installed)
8080Pokemon Live Server (pokemon_live.py) — crashed 2026-05-05

Pokemon Live (Windows PC)

Service Info

  • ROM path: D:\Games\Pokemon\Pokemon - Red Version (USA, Europe) (SGB Enhanced).gb
  • Script: D:\pokemon_live.py
  • Port: 8080
  • Task name: PokemonLive (scheduled task via schtasks)
  • Python venv: C:\Users\Sozo\pokemon-agent\venv\Scripts\python.exe

Crash Recovery (2026-05-05)

  • Symptom: Process 16784 in CloseWait state with many connections, then Listen but refusing connections
  • Fix: Kill and restart via schtasks /Run /I /TN PokemonLive
  • Verified: schtasks /Run /I successfully starts task in Session 1 (user’s interactive session)

Cron Job Network Isolation (2026-05-06)

  • Cron sessions run in isolated network namespace on Termux
  • Cannot reach from cron: Obsidian Local REST API (100.83.112.84:27123), SSH to PC, SCP to PC
  • Can reach from cron: External internet (YouTube, HuggingFace, etc.)
  • Workaround: Use SCP+PS1+execute workflow or save to local draft for manual sync
  • Symptom: Obsidian API curl returns connection timeout; SSH/SCP hangs at connection

⚠️ Skill loader transient failures (2026-05-15):

  • web skill exists at ~/.hermes/skills/web but was skipped during daily-news-podcast-pipeline cron execution
  • Cron job listed web skill but skill loader returned “skill(s) not found and skipped”
  • Not a persistent issue — skill files exist, likely a timing/loading order issue in the cron job runner
  • Monitor: if news pipeline fails to search web content, check skill loader logs

Windows Defender Exclusions (2026-05-08)

  • C:\hermes_wiki\hermes-gateway — Hermes gateway staging directory
  • Purpose: Prevents Windows Defender from scanning Hermes-related temp files

Telegram

  • PC Hermes bot: @hermesjake_bot
  • Bot token (Termux): ~/.hermes/.envTELEGRAM_BOT_TOKEN
  • Bot token (PC): D:\\hermes\\.envTELEGRAM_BOT_TOKEN
  • Ti Tze Czia: chat_id 5671991810
  • Old Termux bot token: 8766595133:AAH...iqN_BpP — unauthorized (bot was deleted/blocked)
  • PC Hermes bot can send messages to Ti Tze Czia via curl.exe PowerShell

Termux Package Notes

  • sqlite3 CLI not installed — only libsqlite library present
  • hermes.db is empty (0 bytes) — sqlite3 check in scripts will fail silently
  • This affects: check_recent_chat.sh (falls through to file-based check)

sozo-todos.json BOM Issue (2026-05-07)

  • File: D:\\hermes\\sessions\\sozo-todos.json
  • Issue: File has UTF-8 BOM (\xef\xbb\xbf)
  • Symptom: PowerShell Get-Content defaults to ANSI, Chinese chars become mojibake
  • Fix: Use encoding='utf-8-sig' in Python or -Encoding utf8 in PowerShell
  • Verified: python -c "import json; print(json.load(open('D:\\\\hermes\\\\sessions\\\\sozo-todos.json', encoding='utf-8-sig')))" works

Session Files Performance (2026-05-04)

  • Sessions directory: ~/.hermes/sessions/ (~162 .jsonl files)
  • Original stat -c %Y per file took ~0.2s on this filesystem (slow FUSE/exFAT)
  • FIXED (2026-05-04 06:xx): Replaced stat loop with find -mmin -180
  • New script runtime: 0.062s (was 31s) — 500x faster
  • check_recent_chat.sh now well under cron timeout

Pokemon Live Server Update (2026-05-05 05-06h)

  • Status: STABLE ✅ (was crashed, now running with pyboy_lock fix)
  • Root cause: Concurrent access - background screenshot thread + button_press both accessing PyBoy
  • Fix: Added pyboy_lock = threading.Lock() to D:\pokemon_live.py
  • Verified: 5+ consecutive A-button presses work without timeout
  • Battle flag (0xCC28): Value=1 means “event in progress” (includes dialogue), NOT actual battle
  • Double process issue: port 8080 still shows 2 LISTENING processes (unresolved)

Web Scraping Limitations from Termux (2026-05-10)

  • Most Malaysian websites block curl requests from Termux
  • Blocked sites: qcosa.com, homify.my, renovationlady.com, bighome.com.my (return empty/0-length or 403)
  • Accessible alternatives: Houzz Australia (houzz.com.au), Space Furniture Singapore, international design sites
  • Fallback approach: When Malaysian sites are blocked:
    1. Compile content from domain knowledge + accessible international sources
    2. Houzz Australia has accessible interior design style content
    3. Use curated content document as NotebookLM source