{"type":"mode","mode":"normal","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"type":"permission-mode","permissionMode":"default","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"type":"file-history-snapshot","messageId":"8cd8dc4d-a9af-44f6-929a-d7162ca2d245","snapshot":{"messageId":"8cd8dc4d-a9af-44f6-929a-d7162ca2d245","trackedFileBackups":{},"timestamp":"2026-06-14T03:17:57.958Z"},"isSnapshotUpdate":false}
{"parentUuid":null,"isSidechain":false,"promptId":"6393fe71-00e0-4f4a-9a0c-55ffb25f68f1","type":"user","message":{"role":"user","content":"━━━━━━━━━━━━━━━━━━━━━━━\n\n━━━ 🔄 slskd — Connection Check ━━━\n\n━━━ 🔍 slskd — Stuck Searches ━━━\n🏁 [OK] No stuck searches found ✅\n\n━━━ 🔍 slskd — Dead Transfer Records ━━━\n🏁 [OK] Transfers: 0 cleared, 4 skipped (active/empty), 0 failed\n\n━━━ 🔍 slskd — Failed Imports (older than 7 days) ━━━\n🏁 [OK] 🗑️ Purged 1 expired failed import(s)\n\n━━━ 🔍 SABnzbd — Completed History (older than 7 days) ━━━\n🏁 [OK] No completed history found ✅\n\n━━━ 🔍 SABnzbd — Failed History (older than 7 days) ━━━\n🏁 [OK] No failed history found ✅\n\n━━━ 🔍 SABnzbd — Stalled Queue Items ━━━\n🏁 [OK] Queue: 0 removed, 6806 active (skipped)\n\n━━━ 🔍 qBittorrent — Failsafe (older than 180 days) ━━━\n🏁 [OK] qBittorrent: 0 deleted, 0 skipped (under threshold)\n\n━━━━━ 📋 DOWNLOADERS RESET SUMMARY ━━━━━\n🖥️ Identity: HOST1 (unRAID-Gmer4Lfe)\n⏱️ Duration: 12m2s\n✅ Actions: 1\n❌ Failures: 0\n\n🏁 Status: ✅ DONE\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n━━━ 🔄 Play State Sync — 2026-06-13 22:43:09 ━━━\n⚠️ [WARN] Emby-Jayred365 (unRAID-Jayred365) — unreachable, skipping\n⚠️ [WARN] Jellyfin (unRAID-Jayred365) — unreachable, skipping\n\n── User: gmer4lfe (2 server(s)) ──\n🏁 [OK] ✓ tvdb:ep:5618559:s7e2 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:167594:s5e4 → Jellyfin (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:11818886:s18e1 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:11759792:s9e2 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:11766619:s10e12 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ imdb:tt8750122 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:3279811:s1e2 → Emby (unRAID-Gmer4Lfe) resume synced (370s)\n🏁 [OK] ✓ tvdb:ep:11493564:s8e11 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:10693981:s2e3 → Jellyfin (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:11426444:s1e3 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:10355686:s9e6 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:10355684:s9e7 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ imdb:tt0437863 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:7547570:s1e1 → Jellyfin (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:1555111:s1e1 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:5553405:s4e13 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:893201:s1e5 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:2861921:s1e1 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:11759791:s9e1 → Emby (unRAID-Gmer4Lfe) marked played\n\n── User: failedproxy (2 server(s)) ──\n\n━━━━━ 📋 PLAY STATE SYNC SUMMARY ━━━━━\n⏱️ Duration: 49s\n🏁 Synced: 19\n🟢 Skipped: 35 (already current)\n🏁 [OK] Done ✅\nPartnership disabled — skipping check\n\n━━━━━ 📋 CRITICAL SYNC SUMMARY ━━━━━\n🖥️ Identity: HOST1 (unRAID-Gmer4Lfe)\n⏱️ Duration: 13m52s\nSynced: Emby\n❌ Failed: Critical-Data\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n── 2026-06-13 23:00:01 ────────────────────────────────────────────────\nℹ️ [INFO] 🌐 Remote IP: 100.97.4.47\nCritical sync — HOST1 → HOST2 — 23:00:06\nℹ️ [INFO] 🌐 Remote IP: 100.97.4.47\n\n━━━ 🛡️ Pre-flight ━━━\nℹ️ [INFO] 📡 unRAID-Jayred365 is reachable\nℹ️ [INFO] 🩺 Remote rootfs: 1% (threshold: 75%)\nℹ️ [INFO] 🩺 Remote share verified: /mnt/user/appdata-Fallback/Critical-Data\nℹ️ [INFO] 💾 Checking disks backing Critical-Data on unRAID-Jayred365...\nℹ️ [INFO] 💾 docker-unraid (ZFS pool) 🟢 — Critical-Data ONLINE\n🏁 [OK] All disks backing Critical-Data are online ✅\n\n━━━ 🔄 Transfer ━━━\n🚀 Source: /mnt/user/appdata-Fallback/Critical-Data\n🌐 Remote: 100.97.4.47:/mnt/user/appdata-Fallback/Critical-Data\n⚙️ Profile: critical-fallback\n🖥️ Identity: HOST1 → HOST2\n\n🔄 Rsync running — this may take a while...\n\n━━━ ▶️ 📦 Remote Restart (post dirty sync) ━━━\n📶 Logged: critical-fallback — 10s — success\n\n━━━━━ 📋 RSYNC SUMMARY ━━━━━\n🖥️ Identity: HOST1 (unRAID-Gmer4Lfe)\n🚀 Directory: /mnt/user/appdata-Fallback/Critical-Data\n⚙️ Profile: critical-fallback\n⏱️ Duration: 10s\n🏁 Status: ✅ DONE\n━━━━━━━━━━━━━━━━━━━━━━━\nℹ️ [INFO] 🌐 Remote IP: 100.97.4.47\n\n━━━ 🛡️ Pre-flight ━━━\nℹ️ [INFO] 📡 unRAID-Jayred365 is reachable\nℹ️ [INFO] 🩺 Remote rootfs: 1% (threshold: 75%)\nℹ️ [INFO] 🩺 Remote share verified: /mnt/user/Media_Server/Emby\nℹ️ [INFO] 💾 Checking disks backing Emby on unRAID-Jayred365...\nℹ️ [INFO] 💾 docker-unraid (ZFS pool) 🟢 — Emby ONLINE\n🏁 [OK] All disks backing Emby are online ✅\n\n━━━ 🔄 Transfer ━━━\n🚀 Source: /mnt/user/Media_Server/Emby\n🌐 Remote: 100.97.4.47:/mnt/user/Media_Server/Emby\n⚙️ Profile: emby-fallback\n🖥️ Identity: HOST1 → HOST2\n\n🔄 Rsync running — this may take a while...\n\n━━━ ▶️ 📦 Remote Restart (post dirty sync) ━━━\n📶 Logged: emby-fallback — 13s — success\n\n━━━━━ 📋 RSYNC SUMMARY ━━━━━\n🖥️ Identity: HOST1 (unRAID-Gmer4Lfe)\n🚀 Directory: /mnt/user/Media_Server/Emby\n⚙️ Profile: emby-fallback\n⏱️ Duration: 13s\n🏁 Status: ✅ DONE\n━━━━━━━━━━━━━━━━━━━━━━━\n\n━━━ 🔄 slskd — Connection Check ━━━\n\n━━━ 🔍 slskd — Stuck Searches ━━━\n🏁 [OK] No stuck searches found ✅\n\n━━━ 🔍 slskd — Dead Transfer Records ━━━\n🏁 [OK] Transfers: 0 cleared, 4 skipped (active/empty), 0 failed\n\n━━━ 🔍 slskd — Failed Imports (older than 7 days) ━━━\n🏁 [OK] 🗑️ Purged 2 expired failed import(s)\n\n━━━ 🔍 SABnzbd — Completed History (older than 7 days) ━━━\n🏁 [OK] No completed history found ✅\n\n━━━ 🔍 SABnzbd — Failed History (older than 7 days) ━━━\n🏁 [OK] No failed history found ✅\n\n━━━ 🔍 SABnzbd — Stalled Queue Items ━━━\n🏁 [OK] Queue: 0 removed, 6807 active (skipped)\n\n━━━ 🔍 qBittorrent — Failsafe (older than 180 days) ━━━\n🏁 [OK] qBittorrent: 0 deleted, 0 skipped (under threshold)\n\n━━━━━ 📋 DOWNLOADERS RESET SUMMARY ━━━━━\n🖥️ Identity: HOST1 (unRAID-Gmer4Lfe)\n⏱️ Duration: 11m56s\n✅ Actions: 2\n❌ Failures: 0\n\n🏁 Status: ✅ DONE\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n━━━ 🔄 Play State Sync — 2026-06-13 23:13:10 ━━━\n⚠️ [WARN] Emby-Jayred365 (unRAID-Jayred365) — unreachable, skipping\n⚠️ [WARN] Jellyfin (unRAID-Jayred365) — unreachable, skipping\n\n── User: gmer4lfe (2 server(s)) ──\n🏁 [OK] ✓ tvdb:ep:5618559:s7e2 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:167594:s5e4 → Jellyfin (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:11818886:s18e1 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:11759792:s9e2 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:11766619:s10e12 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ imdb:tt8750122 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:3279811:s1e2 → Emby (unRAID-Gmer4Lfe) resume synced (370s)\n🏁 [OK] ✓ tvdb:ep:11493564:s8e11 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:10693981:s2e3 → Jellyfin (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:10693998:s2e10 → Jellyfin (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:11426444:s1e3 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:10355686:s9e6 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:10355684:s9e7 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ imdb:tt0437863 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:7547570:s1e1 → Jellyfin (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:1555111:s1e1 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:5553405:s4e13 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:893201:s1e5 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:2861921:s1e1 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:11759791:s9e1 → Emby (unRAID-Gmer4Lfe) marked played\n\n── User: failedproxy (2 server(s)) ──\n\n━━━━━ 📋 PLAY STATE SYNC SUMMARY ━━━━━\n⏱️ Duration: 1m3s\n🏁 Synced: 20\n🟢 Skipped: 34 (already current)\n🏁 [OK] Done ✅\nPartnership disabled — skipping check\nCritical sync complete — HOST1 — 14m7s — 2 share(s)\n"},"uuid":"8cd8dc4d-a9af-44f6-929a-d7162ca2d245","timestamp":"2026-06-14T03:17:57.958Z","permissionMode":"default","promptSource":"typed","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"8cd8dc4d-a9af-44f6-929a-d7162ca2d245","isSidechain":false,"attachment":{"type":"deferred_tools_delta","addedNames":["CronCreate","CronDelete","CronList","DesignSync","EnterPlanMode","EnterWorktree","ExitPlanMode","ExitWorktree","Monitor","NotebookEdit","PushNotification","RemoteTrigger","TaskCreate","TaskGet","TaskList","TaskOutput","TaskStop","TaskUpdate","WebFetch","WebSearch","mcp__claude_ai_Google_Drive__authenticate","mcp__claude_ai_Google_Drive__complete_authentication"],"addedLines":["CronCreate","CronDelete","CronList","DesignSync","EnterPlanMode","EnterWorktree","ExitPlanMode","ExitWorktree","Monitor","NotebookEdit","PushNotification","RemoteTrigger","TaskCreate","TaskGet","TaskList","TaskOutput","TaskStop","TaskUpdate","WebFetch","WebSearch","mcp__claude_ai_Google_Drive__authenticate","mcp__claude_ai_Google_Drive__complete_authentication"],"removedNames":[],"readdedNames":[],"pendingMcpServers":[]},"type":"attachment","uuid":"144ee346-2845-47a3-ac02-44c1bf352c75","timestamp":"2026-06-14T03:17:57.957Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"144ee346-2845-47a3-ac02-44c1bf352c75","isSidechain":false,"attachment":{"type":"skill_listing","content":"- update-config: Use this skill to configure the Claude Code harness via settings.json. Automated behaviors (\"from now on when X\", \"each time X\", \"whenever X\", \"before/after X\") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions (\"allow X\", \"add permission\", \"move permission to\"), env vars (\"set X=Y\"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: \"allow npm commands\", \"add bq permission to global settings\", \"move permission to user settings\", \"set DEBUG=true\", \"when claude stops show X\". For simple settings like theme/model, suggest the /config command.\n- keybindings-help: Use when the user wants to customize keyboard shortcuts, rebind keys, add chord bindings, or modify ~/.claude/keybindings.json. Examples: \"rebind ctrl+s\", \"add a chord shortcut\", \"change the submit key\", \"customize keybindings\".\n- verify: Verify that a code change actually does what it's supposed to by running the app and observing behavior. Use when asked to verify a PR, confirm a fix works, test a change manually, check that a feature works, or validate local changes before pushing.\n- code-review: Review the current diff for correctness bugs and reuse/simplification/efficiency cleanups at the given effort level (low/medium: fewer, high-confidence findings; high→max: broader coverage, may include uncertain findings; ultra: deep multi-agent review in the cloud). Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review.\n- simplify: Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.\n- fewer-permission-prompts: Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.\n- loop: Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace. - When the user wants to set up a recurring task, poll for status, or run something repeatedly on an interval (e.g. \"check the deploy every 5 minutes\", \"keep running /babysit-prs\"). Do NOT invoke for one-off tasks.\n- schedule: Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule. - When the user wants to schedule a recurring cloud agent, set up automated tasks, create a cron job for Claude Code, or manage their scheduled agents/routines. Also use when the user wants a one-time scheduled run (\"run this once at 3pm\", \"remind me to check X tomorrow\").\n- claude-api: Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).\n- run: Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).\n- init: Initialize a new CLAUDE.md file with codebase documentation\n- review: Review a pull request\n- security-review: Complete a security review of the pending changes on the current branch","skillCount":13,"isInitial":true,"names":["update-config","keybindings-help","verify","code-review","simplify","fewer-permission-prompts","loop","schedule","claude-api","run","init","review","security-review"]},"type":"attachment","uuid":"ac4891be-8d44-42f5-8583-f795bb3c0c99","timestamp":"2026-06-14T03:17:57.957Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"type":"ai-title","aiTitle":"Monitor media server sync and backup health","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"parentUuid":"ac4891be-8d44-42f5-8583-f795bb3c0c99","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_0174zRBREHVDD6R5QVm3aGqT","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"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"}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":12676,"cache_read_input_tokens":12056,"output_tokens":795,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":12676,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":795,"cache_read_input_tokens":12056,"cache_creation_input_tokens":12676,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":12676},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2Rp5CL98Q71nn5i8L9w","type":"assistant","uuid":"cd4cfb36-8e04-45b0-b286-3dbe7656cad8","timestamp":"2026-06-14T03:18:15.111Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"cd4cfb36-8e04-45b0-b286-3dbe7656cad8","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_0174zRBREHVDD6R5QVm3aGqT","type":"message","role":"assistant","content":[{"type":"text","text":"Looking at these logs, everything looks healthy with one minor note:\n\n**Critical sync at ~22:43** had `Critical-Data` fail (only `Emby` synced). The **23:00 run** then succeeded for both — `Critical-Data` and `Emby` both completed cleanly, confirmed by the final `Critical sync complete — HOST1 — 14m7s — 2 share(s)`.\n\nEverything else is clean: downloaders reset ran twice (1 and 2 actions respectively), play state synced 19 and 20 items, HOST2 media servers unreachable as expected while it's being rebuilt.\n\nWas there something specific you wanted me to look into or act on here?"}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":12676,"cache_read_input_tokens":12056,"output_tokens":795,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":12676,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":795,"cache_read_input_tokens":12056,"cache_creation_input_tokens":12676,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":12676},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2Rp5CL98Q71nn5i8L9w","type":"assistant","uuid":"3ff7cd80-435a-4460-8d10-256c645f3f5f","timestamp":"2026-06-14T03:18:18.133Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"3ff7cd80-435a-4460-8d10-256c645f3f5f","isSidechain":false,"type":"system","subtype":"turn_duration","durationMs":20210,"messageCount":5,"timestamp":"2026-06-14T03:18:18.205Z","uuid":"5d1937c7-f8a2-4d4b-8f22-47eabeb47d10","isMeta":false,"userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"type":"file-history-snapshot","messageId":"a3f0c23a-5a8e-4e26-9ab8-1005dce3392e","snapshot":{"messageId":"a3f0c23a-5a8e-4e26-9ab8-1005dce3392e","trackedFileBackups":{},"timestamp":"2026-06-14T03:18:49.906Z"},"isSnapshotUpdate":false}
{"parentUuid":"5d1937c7-f8a2-4d4b-8f22-47eabeb47d10","isSidechain":false,"promptId":"cd232ca5-1382-4956-82fd-a0877b9d01dc","type":"user","message":{"role":"user","content":"play state has been syncing the same episodes?"},"uuid":"a3f0c23a-5a8e-4e26-9ab8-1005dce3392e","timestamp":"2026-06-14T03:18:49.905Z","permissionMode":"default","promptSource":"typed","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"a3f0c23a-5a8e-4e26-9ab8-1005dce3392e","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01FmZeQBsYjyENgQyjfLafDd","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"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"}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":807,"cache_read_input_tokens":24732,"output_tokens":1450,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":807,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":1450,"cache_read_input_tokens":24732,"cache_creation_input_tokens":807,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":807},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2Rsj8hA92939PWdpNoT","type":"assistant","uuid":"d8217fcb-4d57-405a-b204-349741b3057f","timestamp":"2026-06-14T03:19:07.705Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"d8217fcb-4d57-405a-b204-349741b3057f","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01FmZeQBsYjyENgQyjfLafDd","type":"message","role":"assistant","content":[{"type":"text","text":"Yes — nearly identical items in both runs 30 minutes apart. After the first run marked them played, the second run found them unplayed again. Let me look at the play state sync script."}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":807,"cache_read_input_tokens":24732,"output_tokens":1450,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":807,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":1450,"cache_read_input_tokens":24732,"cache_creation_input_tokens":807,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":807},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2Rsj8hA92939PWdpNoT","type":"assistant","uuid":"87297e48-067e-42ef-a10a-55fa65d158ce","timestamp":"2026-06-14T03:19:08.939Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"87297e48-067e-42ef-a10a-55fa65d158ce","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01FmZeQBsYjyENgQyjfLafDd","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_016jMtreDC5wuFZMZhSnTtoD","name":"Bash","input":{"command":"find /boot/config/plugins/varaverk -name \"*play*state*\" -o -name \"*state*sync*\" -o -name \"*play*sync*\" 2>/dev/null","description":"Find play state sync script"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":807,"cache_read_input_tokens":24732,"output_tokens":1450,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":807,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":1450,"cache_read_input_tokens":24732,"cache_creation_input_tokens":807,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":807},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2Rsj8hA92939PWdpNoT","type":"assistant","uuid":"97b6a8d8-c097-4481-b00c-6077169511a5","timestamp":"2026-06-14T03:19:09.952Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"97b6a8d8-c097-4481-b00c-6077169511a5","isSidechain":false,"promptId":"cd232ca5-1382-4956-82fd-a0877b9d01dc","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_016jMtreDC5wuFZMZhSnTtoD","type":"tool_result","content":"/boot/config/plugins/varaverk/Media/play_state_sync.sh","is_error":false}]},"uuid":"c42131bf-bcae-4a66-92a5-b874db897fdb","timestamp":"2026-06-14T03:19:11.305Z","toolUseResult":{"stdout":"/boot/config/plugins/varaverk/Media/play_state_sync.sh","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"97b6a8d8-c097-4481-b00c-6077169511a5","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"type":"last-prompt","lastPrompt":"play state has been syncing the same episodes?","leafUuid":"c42131bf-bcae-4a66-92a5-b874db897fdb","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"type":"ai-title","aiTitle":"Monitor media server sync and backup health","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"type":"mode","mode":"normal","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"type":"permission-mode","permissionMode":"default","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"parentUuid":"c42131bf-bcae-4a66-92a5-b874db897fdb","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01KDqqT6fJcU2Cix5avg2pmQ","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_016YJ45tSfi4LGVcKbe1h4v9","name":"Read","input":{"file_path":"/boot/config/plugins/varaverk/Media/play_state_sync.sh"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":1483,"cache_read_input_tokens":25539,"output_tokens":72,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":1483,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":72,"cache_read_input_tokens":25539,"cache_creation_input_tokens":1483,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1483},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2RuJcsB4SUFhCTVbSYN","type":"assistant","uuid":"d0da55ae-a93c-4cc0-b2e7-d7b85924c3c9","timestamp":"2026-06-14T03:19:12.853Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"d0da55ae-a93c-4cc0-b2e7-d7b85924c3c9","isSidechain":false,"promptId":"cd232ca5-1382-4956-82fd-a0877b9d01dc","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_016YJ45tSfi4LGVcKbe1h4v9","type":"tool_result","content":"1\t#!/bin/bash\n2\t# ==============================================================================================\n3\t# ================================= Play State Sync ============================================\n4\t# ==============================================================================================\n5\t#\n6\t# PURPOSE\n7\t# ─────────────────────────────────────────────────────────────────────────────\n8\t# Syncs watched/played state and resume positions across all configured Emby\n9\t# and Jellyfin servers. Newest timestamp wins — no data is ever lost.\n10\t#\n11\t# Users are matched by name (case-insensitive). If a user exists on some servers\n12\t# but not others, those servers are skipped for that user — no errors, no partial\n13\t# syncs from unrelated accounts.\n14\t#\n15\t# Items are matched by external provider IDs:\n16\t# Movies → IMDb ID, then TMDB ID\n17\t# Episodes → TVDB ID + season + episode number\n18\t# Audio → MusicBrainz Track ID\n19\t#\n20\t# ==============================================================================================\n21\t# SYNC LOGIC\n22\t# ==============================================================================================\n23\t#\n24\t# For each matched item across ≥2 servers:\n25\t# 1. Compare LastPlayedDate across all servers that have a play record.\n26\t# 2. The server with the newest LastPlayedDate is authoritative.\n27\t# 3. Push that server's state (Played, PlayCount, LastPlayedDate,\n28\t# PlaybackPositionTicks) to every other server.\n29\t# 4. Servers with no record for that item also receive the state.\n30\t#\n31\t# Resume positions (partial plays, not marked Played):\n32\t# Synced by comparing PlaybackPositionTicks when LastPlayedDate is absent.\n33\t# The higher tick count wins.\n34\t#\n35\t# ==============================================================================================\n36\t# CONFIGURATION (host*.conf, aliased by detect_hosts)\n37\t# ==============================================================================================\n38\t#\n39\t# HOST*_TRANSCODE_SERVERS \"Name|URL|APIKey|type\" entries per host (emby/jellyfin)\n40\t# All hosts are discovered automatically — no extra config needed.\n41\t# Remote host URLs have localhost rewritten to their Tailscale IP.\n42\t#\n43\t# master.conf\n44\t#\n45\t# PLAY_SYNC_ENABLED Master toggle (default: true)\n46\t# PLAY_SYNC_REMOTE Sync across all hosts via Tailscale (default: true)\n47\t# false = local servers only (this host's Emby + Jellyfin)\n48\t# PLAY_SYNC_DAYS How many days back to check for played items (default: 90)\n49\t# Use 0 to sync all played items (slow on large libraries).\n50\t# PLAY_SYNC_TYPES Comma-separated item types to sync (default: Movie,Episode,Audio)\n51\t#\n52\t# ==============================================================================================\n53\t# RUNTIME MODES\n54\t# ==============================================================================================\n55\t#\n56\t# play_state_sync.sh\n57\t# Sync all matched users across all configured servers.\n58\t#\n59\t# play_state_sync.sh --dry-run\n60\t# Show what would be synced without writing any state.\n61\t#\n62\t# play_state_sync.sh --status\n63\t# Show configured servers, reachability, and user counts.\n64\t#\n65\t# play_state_sync.sh --full\n66\t# Ignore PLAY_SYNC_DAYS — sync all played items (may be slow).\n67\t#\n68\t# play_state_sync.sh --log\n69\t# Verbose output — show each item comparison.\n70\t#\n71\t# ==============================================================================================\n72\t\n73\tSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\n74\tsource \"$SCRIPT_DIR/../load_config.sh\"\n75\t\n76\t# ── Handle --full before parse_args ───────────────────────────────────────────\n77\tFULL_SYNC=false\n78\t_FILTERED=()\n79\tfor _a in \"$@\"; do\n80\t [[ \"$_a\" == \"--full\" ]] && FULL_SYNC=true || _FILTERED+=(\"$_a\")\n81\tdone\n82\tparse_args \"${_FILTERED[@]}\"\n83\t\n84\t# ==============================================================================================\n85\t# ━━━ Setup ━━━\n86\t# ==============================================================================================\n87\t[[ \"${PLAY_SYNC_ENABLED:-true}\" != \"true\" ]] && echo \"Play state sync disabled\" && exit 0\n88\t\n89\tSYNC_DAYS=\"${PLAY_SYNC_DAYS:-90}\"\n90\tSYNC_TYPES=\"${PLAY_SYNC_TYPES:-Movie,Episode,Audio}\"\n91\t[[ \"$FULL_SYNC\" == true ]] && SYNC_DAYS=0\n92\tlog \"$ICON_GEAR Config: days=${SYNC_DAYS} types=${SYNC_TYPES} remote=${PLAY_SYNC_REMOTE:-true}\"\n93\t\n94\tcommand -v jq >/dev/null 2>&1 || { error \"jq is required but not installed\"; exit 1; }\n95\t\n96\tacquire_lock\n97\t\n98\t# ── Build server list across ALL hosts ────────────────────────────────────────\n99\t# All HOST*_TRANSCODE_SERVERS arrays are loaded into env by load_config.sh.\n100\t# For remote hosts, localhost in the URL is rewritten to their Tailscale IP.\n101\tdeclare -a SRV_NAME SRV_URL SRV_KEY SRV_TYPE\n102\t_srv_count=0\n103\t_my_hostname=$(hostname -s)\n104\t\n105\t_add_server() {\n106\t local name=\"$1\" url=\"$2\" key=\"$3\" type=\"$4\"\n107\t [[ -z \"$url\" || -z \"$key\" ]] && return\n108\t [[ \"$key\" == \"YOUR_API_KEY\"* || \"$key\" == \"placeholder\"* ]] && return\n109\t SRV_NAME[$_srv_count]=\"$name\"\n110\t SRV_URL[$_srv_count]=\"$url\"\n111\t SRV_KEY[$_srv_count]=\"$key\"\n112\t SRV_TYPE[$_srv_count]=\"$type\"\n113\t (( _srv_count++ ))\n114\t}\n115\t\n116\tfor _varname in $(compgen -v | grep -E '^HOST[0-9]+$' | sort); do\n117\t _num=\"${_varname//[^0-9]/}\"\n118\t _host_hostname=\"${!_varname}\"\n119\t [[ -z \"$_host_hostname\" ]] && continue\n120\t\n121\t _is_me=false\n122\t [[ \"${_host_hostname,,}\" == \"${_my_hostname,,}\" ]] && _is_me=true\n123\t\n124\t # Skip remote hosts when PLAY_SYNC_REMOTE=false\n125\t if [[ \"$_is_me\" == false && \"${PLAY_SYNC_REMOTE:-true}\" != \"true\" ]]; then\n126\t log \"$_host_hostname — remote sync disabled (PLAY_SYNC_REMOTE=false), skipping\"\n127\t continue\n128\t fi\n129\t\n130\t # Resolve Tailscale IP for remote hosts\n131\t _ts_ip=\"\"\n132\t if [[ \"$_is_me\" == false ]]; then\n133\t _ts_ip=$(resolve_tailscale_ip \"$_host_hostname\")\n134\t if [[ -z \"$_ts_ip\" ]]; then\n135\t log \"$_host_hostname — Tailscale IP not found, skipping\"\n136\t continue\n137\t fi\n138\t fi\n139\t\n140\t # Load this host's TRANSCODE_SERVERS array\n141\t _srv_arr_name=\"HOST${_num}_TRANSCODE_SERVERS\"\n142\t eval \"_host_entries=(\\\"\\${${_srv_arr_name}[@]}\\\")\"\n143\t [[ \"${#_host_entries[@]}\" -eq 0 ]] && continue\n144\t\n145\t for _entry in \"${_host_entries[@]}\"; do\n146\t IFS='|' read -r _name _url _key _type <<< \"$_entry\"\n147\t [[ \"$_type\" == \"emby\" || \"$_type\" == \"jellyfin\" ]] || continue\n148\t # For remote hosts rewrite localhost/127.0.0.1 → Tailscale IP\n149\t if [[ \"$_is_me\" == false ]]; then\n150\t _url=\"${_url//localhost/$_ts_ip}\"\n151\t _url=\"${_url//127.0.0.1/$_ts_ip}\"\n152\t fi\n153\t _add_server \"${_name} (${_host_hostname})\" \"$_url\" \"$_key\" \"$_type\"\n154\t done\n155\tdone\n156\t\n157\tif [[ \"$_srv_count\" -lt 2 ]]; then\n158\t error \"Need at least 2 media servers configured — found $_srv_count\"\n159\t exit 1\n160\tfi\n161\t\n162\t# ==============================================================================================\n163\t# ━━━ API Helpers ━━━\n164\t# ==============================================================================================\n165\t_api_get() {\n166\t local url=\"$1\" key=\"$2\" endpoint=\"$3\"\n167\t curl -sf --max-time 30 \\\n168\t -H \"X-Emby-Token: $key\" \\\n169\t \"${url%/}/${endpoint}\" 2>/dev/null\n170\t}\n171\t\n172\t_api_post() {\n173\t local url=\"$1\" key=\"$2\" endpoint=\"$3\" data=\"${4:-}\"\n174\t if [[ -n \"$data\" ]]; then\n175\t curl -sf --max-time 30 -s -o /dev/null -w \"%{http_code}\" -X POST \\\n176\t -H \"X-Emby-Token: $key\" \\\n177\t -H \"Content-Type: application/json\" \\\n178\t -d \"$data\" \\\n179\t \"${url%/}/${endpoint}\" 2>/dev/null\n180\t else\n181\t curl -sf --max-time 30 -s -o /dev/null -w \"%{http_code}\" -X POST \\\n182\t -H \"X-Emby-Token: $key\" \\\n183\t \"${url%/}/${endpoint}\" 2>/dev/null\n184\t fi\n185\t}\n186\t\n187\t# ISO 8601 date → unix seconds (portable, no date -d on BusyBox)\n188\t_iso_to_epoch() {\n189\t local dt=\"$1\"\n190\t [[ -z \"$dt\" || \"$dt\" == \"null\" ]] && echo 0 && return\n191\t # Strip fractional seconds and Z, convert to seconds\n192\t dt=\"${dt%.*}\" # remove .NNNNNNN\n193\t dt=\"${dt%Z}\" # remove trailing Z\n194\t dt=\"${dt/T/ }\" # T → space\n195\t date -u -d \"$dt UTC\" +%s 2>/dev/null || echo 0\n196\t}\n197\t\n198\t# Ticks → seconds (1 tick = 100ns, 10_000_000 ticks = 1s)\n199\t_ticks_to_sec() {\n200\t echo $(( ${1:-0} / 10000000 ))\n201\t}\n202\t\n203\t# ==============================================================================================\n204\t# ━━━ Status ━━━\n205\t# ==============================================================================================\n206\tif [[ \"$SHOW_STATUS\" == true ]]; then\n207\t echo \"\"\n208\t echo \"━━━━━ $ICON_SUMMARY PLAY STATE SYNC STATUS ━━━━━\"\n209\t echo \"$ICON_GEAR Remote sync: ${PLAY_SYNC_REMOTE:-true}\"\n210\t echo \"$ICON_GEAR Sync days: ${SYNC_DAYS:-all}\"\n211\t echo \"$ICON_GEAR Item types: $SYNC_TYPES\"\n212\t echo \"\"\n213\t for i in $(seq 0 $(( _srv_count - 1 ))); do\n214\t echo \"$ICON_HOST [${SRV_TYPE[$i]}] ${SRV_NAME[$i]} (${SRV_URL[$i]})\"\n215\t _users=$(_api_get \"${SRV_URL[$i]}\" \"${SRV_KEY[$i]}\" \"Users\" 2>/dev/null | jq -r '.[].Name' 2>/dev/null | wc -l)\n216\t if [[ \"$_users\" -gt 0 ]]; then\n217\t echo \" $ICON_DONE Reachable — $_users user(s)\"\n218\t _api_get \"${SRV_URL[$i]}\" \"${SRV_KEY[$i]}\" \"Users\" 2>/dev/null \\\n219\t | jq -r '.[].Name' 2>/dev/null | while read -r n; do echo \" · $n\"; done\n220\t else\n221\t echo \" $ICON_ERROR Unreachable or no users\"\n222\t fi\n223\t done\n224\t echo \"━━━━━━━━━━━━━━━━━━━━━━━\"\n225\t exit 0\n226\tfi\n227\t\n228\t# ==============================================================================================\n229\t# ━━━ Main Sync ━━━\n230\t# ==============================================================================================\n231\techo \"━━━ $ICON_SYNC Play State Sync — $(date '+%Y-%m-%d %H:%M:%S') ━━━\"\n232\t[[ \"$DRY_RUN\" == true ]] && warn \"DRY RUN — no state will be written\"\n233\t[[ \"$FULL_SYNC\" == true ]] && log \"Full sync mode — ignoring PLAY_SYNC_DAYS\"\n234\t\n235\tSTART=$(date +%s)\n236\tTOTAL_SYNCED=0\n237\tTOTAL_SKIPPED=0\n238\tTOTAL_ERRORS=0\n239\t\n240\t# ── Step 1: Fetch users from each server ─────────────────────────────────────\n241\tdeclare -A SRV_USERS # idx → JSON array string of users\n242\t\n243\tlog \"Fetching users...\"\n244\tfor i in $(seq 0 $(( _srv_count - 1 ))); do\n245\t _resp=$(_api_get \"${SRV_URL[$i]}\" \"${SRV_KEY[$i]}\" \"Users\")\n246\t if [[ -z \"$_resp\" ]]; then\n247\t warn \"${SRV_NAME[$i]} — unreachable, skipping\"\n248\t SRV_USERS[$i]=\"\"\n249\t continue\n250\t fi\n251\t SRV_USERS[$i]=\"$_resp\"\n252\t _count=$(echo \"$_resp\" | jq 'length' 2>/dev/null || echo 0)\n253\t log \"${SRV_NAME[$i]} — $_count user(s)\"\n254\tdone\n255\t\n256\t# ── Step 2: Build cross-server user map ──────────────────────────────────────\n257\t# lowercase_name → \"server_idx:user_id server_idx:user_id ...\"\n258\tdeclare -A USER_MAP\n259\t\n260\tfor i in $(seq 0 $(( _srv_count - 1 ))); do\n261\t [[ -z \"${SRV_USERS[$i]}\" ]] && continue\n262\t while IFS=$'\\t' read -r uid uname; do\n263\t [[ -z \"$uid\" || -z \"$uname\" ]] && continue\n264\t lname=\"${uname,,}\"\n265\t if [[ -n \"${USER_MAP[$lname]}\" ]]; then\n266\t USER_MAP[$lname]+=\" ${i}:${uid}\"\n267\t else\n268\t USER_MAP[$lname]=\"${i}:${uid}\"\n269\t fi\n270\t done < <(echo \"${SRV_USERS[$i]}\" | jq -r '.[] | [.Id, .Name] | @tsv' 2>/dev/null)\n271\tdone\n272\t\n273\t# ── Step 3: Sync per matched user ────────────────────────────────────────────\n274\t_date_filter=\"\"\n275\tif [[ \"$SYNC_DAYS\" -gt 0 ]]; then\n276\t _cutoff=$(date -u -d \"$SYNC_DAYS days ago\" '+%Y-%m-%dT%H:%M:%SZ' 2>/dev/null || \\\n277\t date -u -v \"-${SYNC_DAYS}d\" '+%Y-%m-%dT%H:%M:%SZ' 2>/dev/null)\n278\t [[ -n \"$_cutoff\" ]] && _date_filter=\"&MinDateLastSaved=$_cutoff\"\n279\tfi\n280\t\n281\tfor lname in \"${!USER_MAP[@]}\"; do\n282\t read -ra _pairs <<< \"${USER_MAP[$lname]}\"\n283\t\n284\t # Skip users only on one server\n285\t [[ \"${#_pairs[@]}\" -lt 2 ]] && log \" $lname — only on 1 server, skipping\" && continue\n286\t\n287\t echo \"\"\n288\t echo \"── User: $lname (${#_pairs[@]} server(s)) ──\"\n289\t\n290\t # Build per-server user context\n291\t declare -A U_IDX U_UID\n292\t for _pair in \"${_pairs[@]}\"; do\n293\t IFS=':' read -r _si _ui <<< \"$_pair\"\n294\t U_IDX[\"$_si\"]=\"$_si\"\n295\t U_UID[\"$_si\"]=\"$_ui\"\n296\t done\n297\t\n298\t # ── Fetch played items from each server for this user ────────────────────\n299\t # Key: provider_id_string → sorted list of (epoch, srv_idx, item_id, play_count, ticks, played)\n300\t declare -A ITEM_MAP # provider_key → JSON per-server data\n301\t\n302\t for _si in \"${!U_IDX[@]}\"; do\n303\t _uid=\"${U_UID[$_si]}\"\n304\t _endpoint=\"Users/${_uid}/Items?Recursive=true&Fields=ProviderIds,UserData,Type,ParentIndexNumber,IndexNumber,SeriesName&IncludeItemTypes=${SYNC_TYPES}&Filters=IsPlayed${_date_filter}&Limit=5000\"\n305\t _resp=$(_api_get \"${SRV_URL[$_si]}\" \"${SRV_KEY[$_si]}\" \"$_endpoint\")\n306\t if [[ -z \"$_resp\" ]]; then\n307\t warn \" ${SRV_NAME[$_si]} — failed to fetch items for $lname\"\n308\t continue\n309\t fi\n310\t\n311\t # Also fetch items with resume position (not yet marked played)\n312\t _endpoint2=\"Users/${_uid}/Items?Recursive=true&Fields=ProviderIds,UserData,Type,ParentIndexNumber,IndexNumber,SeriesName&IncludeItemTypes=${SYNC_TYPES}&SortBy=DatePlayed&SortOrder=Descending&Filters=IsResumable${_date_filter}&Limit=500\"\n313\t _resp2=$(_api_get \"${SRV_URL[$_si]}\" \"${SRV_KEY[$_si]}\" \"$_endpoint2\")\n314\t\n315\t # Combine and deduplicate by Id\n316\t if [[ -n \"$_resp2\" ]]; then\n317\t _combined=$(printf '%s\\n%s' \"$_resp\" \"$_resp2\" | jq -s \\\n318\t '[.[0].Items // [], .[1].Items // []] | add // [] | unique_by(.Id)' 2>/dev/null)\n319\t else\n320\t _combined=$(echo \"$_resp\" | jq '.Items // []' 2>/dev/null)\n321\t fi\n322\t\n323\t _count=$(echo \"$_combined\" | jq 'length' 2>/dev/null || echo 0)\n324\t log \" ${SRV_NAME[$_si]} — $_count item(s) with state for $lname\"\n325\t\n326\t # Build item lookup by provider key\n327\t while IFS=$'\\t' read -r iid itype season ep imdb tmdb tvdb mbtrack played ticks lplayed pcount; do\n328\t # Build canonical provider key\n329\t _pkey=\"\"\n330\t case \"$itype\" in\n331\t Movie)\n332\t [[ \"$imdb\" != \"null\" && -n \"$imdb\" ]] && _pkey=\"imdb:${imdb}\"\n333\t [[ -z \"$_pkey\" && \"$tmdb\" != \"null\" && -n \"$tmdb\" ]] && _pkey=\"tmdb:movie:${tmdb}\"\n334\t ;;\n335\t Episode)\n336\t [[ \"$tvdb\" != \"null\" && -n \"$tvdb\" && \"$season\" != \"null\" && \"$ep\" != \"null\" ]] && \\\n337\t _pkey=\"tvdb:ep:${tvdb}:s${season}e${ep}\"\n338\t ;;\n339\t Audio)\n340\t [[ \"$mbtrack\" != \"null\" && -n \"$mbtrack\" ]] && _pkey=\"mb:track:${mbtrack}\"\n341\t ;;\n342\t esac\n343\t [[ -z \"$_pkey\" ]] && continue\n344\t\n345\t _epoch=$(_iso_to_epoch \"$lplayed\")\n346\t _entry=\"${_si}|${iid}|${played}|${pcount}|${ticks}|${_epoch}|${lplayed}\"\n347\t\n348\t if [[ -n \"${ITEM_MAP[$_pkey]}\" ]]; then\n349\t ITEM_MAP[$_pkey]+=$'\\n'\"$_entry\"\n350\t else\n351\t ITEM_MAP[$_pkey]=\"$_entry\"\n352\t fi\n353\t\n354\t done < <(echo \"$_combined\" | jq -r '.[] | [\n355\t .Id,\n356\t .Type,\n357\t (.ParentIndexNumber // \"null\" | tostring),\n358\t (.IndexNumber // \"null\" | tostring),\n359\t (.ProviderIds.Imdb // \"null\"),\n360\t (.ProviderIds.Tmdb // \"null\"),\n361\t (.ProviderIds.Tvdb // \"null\"),\n362\t (.ProviderIds.MusicBrainzTrackId // \"null\"),\n363\t (.UserData.Played // false | tostring),\n364\t (.UserData.PlaybackPositionTicks // 0 | tostring),\n365\t (.UserData.LastPlayedDate // \"null\"),\n366\t (.UserData.PlayCount // 0 | tostring)\n367\t ] | @tsv' 2>/dev/null)\n368\t done\n369\t\n370\t # ── Compare and sync ─────────────────────────────────────────────────────\n371\t for _pkey in \"${!ITEM_MAP[@]}\"; do\n372\t # Collect all server entries for this item\n373\t declare -A E_EPOCH E_PLAYED E_PCOUNT E_TICKS E_IID E_LPLAYED E_SIDX\n374\t _has_entries=false\n375\t\n376\t while IFS='|' read -r _si _iid _played _pcount _ticks _epoch _lplayed; do\n377\t [[ -z \"$_si\" ]] && continue\n378\t E_SIDX[$_si]=\"$_si\"\n379\t E_IID[$_si]=\"$_iid\"\n380\t E_PLAYED[$_si]=\"$_played\"\n381\t E_PCOUNT[$_si]=\"$_pcount\"\n382\t E_TICKS[$_si]=\"$_ticks\"\n383\t E_EPOCH[$_si]=\"$_epoch\"\n384\t E_LPLAYED[$_si]=\"$_lplayed\"\n385\t _has_entries=true\n386\t done <<< \"${ITEM_MAP[$_pkey]}\"\n387\t\n388\t [[ \"$_has_entries\" == false ]] && continue\n389\t\n390\t # Find the authoritative server: newest LastPlayedDate epoch\n391\t # Tie-break: higher PlayCount, then higher Ticks\n392\t _auth_si=\"\"\n393\t _auth_epoch=0\n394\t _auth_pcount=0\n395\t _auth_ticks=0\n396\t\n397\t for _si in \"${!E_SIDX[@]}\"; do\n398\t _e=\"${E_EPOCH[$_si]:-0}\"\n399\t _pc=\"${E_PCOUNT[$_si]:-0}\"\n400\t _tk=\"${E_TICKS[$_si]:-0}\"\n401\t if [[ \"$_e\" -gt \"$_auth_epoch\" ]] || \\\n402\t [[ \"$_e\" -eq \"$_auth_epoch\" && \"$_pc\" -gt \"$_auth_pcount\" ]] || \\\n403\t [[ \"$_e\" -eq \"$_auth_epoch\" && \"$_pc\" -eq \"$_auth_pcount\" && \"$_tk\" -gt \"$_auth_ticks\" ]]; then\n404\t _auth_si=\"$_si\"\n405\t _auth_epoch=\"$_e\"\n406\t _auth_pcount=\"$_pc\"\n407\t _auth_ticks=\"$_tk\"\n408\t fi\n409\t done\n410\t\n411\t [[ -z \"$_auth_si\" ]] && continue\n412\t\n413\t _auth_played=\"${E_PLAYED[$_auth_si]}\"\n414\t _auth_lplayed=\"${E_LPLAYED[$_auth_si]}\"\n415\t _auth_pcount=\"${E_PCOUNT[$_auth_si]}\"\n416\t _auth_ticks=\"${E_TICKS[$_auth_si]}\"\n417\t\n418\t # Push to servers with older state OR no state at all\n419\t for _si in \"${!U_IDX[@]}\"; do\n420\t [[ \"$_si\" == \"$_auth_si\" ]] && continue\n421\t _their_epoch=\"${E_EPOCH[$_si]:-0}\"\n422\t _their_played=\"${E_PLAYED[$_si]:-false}\"\n423\t\n424\t # Skip if they already have the same/newer state\n425\t if [[ \"$_their_epoch\" -ge \"$_auth_epoch\" ]] && \\\n426\t [[ \"$_their_played\" == \"$_auth_played\" ]]; then\n427\t log \" SKIP $_pkey → ${SRV_NAME[$_si]} already up to date\"\n428\t (( TOTAL_SKIPPED++ ))\n429\t continue\n430\t fi\n431\t\n432\t _uid=\"${U_UID[$_si]}\"\n433\t _iid=\"${E_IID[$_si]:-}\" # might not exist on this server yet\n434\t\n435\t # Find item ID on target server by provider key if not in our map\n436\t if [[ -z \"$_iid\" ]]; then\n437\t _ptype=\"${_pkey%%:*}\"\n438\t _pval=\"${_pkey##*:}\"\n439\t case \"$_ptype\" in\n440\t imdb) _search_field=\"imdb.${_pval}\" ;;\n441\t tmdb) _search_field=\"tmdb.${_pval##movie:}\" ;;\n442\t tvdb)\n443\t # _pkey format: tvdb:ep:{tvdb_id}:s{season}e{ep}\n444\t # ##*: gives \"s7e2\" (wrong); strip prefix then first :\n445\t _tvdb_num=\"${_pkey#tvdb:ep:}\"; _tvdb_num=\"${_tvdb_num%%:*}\"\n446\t _search_field=\"tvdb.${_tvdb_num}\"\n447\t ;;\n448\t mb) _search_field=\"\" ;; # skip music if not found\n449\t esac\n450\t\n451\t if [[ -n \"$_search_field\" ]]; then\n452\t _iid=$(_api_get \"${SRV_URL[$_si]}\" \"${SRV_KEY[$_si]}\" \\\n453\t \"Items?AnyProviderIdEquals=${_search_field}&Recursive=true&Fields=ProviderIds&ExcludeLocationTypes=Virtual&Limit=1\" 2>/dev/null \\\n454\t | jq -r '.Items[0].Id // empty' 2>/dev/null)\n455\t fi\n456\t [[ -z \"$_iid\" ]] && log \" SKIP $_pkey → ${SRV_NAME[$_si]} item not found on server\" && continue\n457\t fi\n458\t\n459\t log \" SYNC $_pkey → ${SRV_NAME[$_si]} (auth: ${SRV_NAME[$_auth_si]}, epoch: $_auth_epoch)\"\n460\t\n461\t if [[ \"$DRY_RUN\" == true ]]; then\n462\t echo \" DRY RUN: would sync $_pkey → ${SRV_NAME[$_si]} user=$lname played=$_auth_played date=$_auth_lplayed\"\n463\t (( TOTAL_SYNCED++ ))\n464\t continue\n465\t fi\n466\t\n467\t # Write state to target server\n468\t if [[ \"$_auth_played\" == \"true\" ]]; then\n469\t # Mark as played with date\n470\t _date_param=\"\"\n471\t if [[ \"$_auth_lplayed\" != \"null\" && -n \"$_auth_lplayed\" ]]; then\n472\t # PlayedItems expects DatePlayed in yyyyMMddHHmmss (no separators, no timezone)\n473\t _lp=\"${_auth_lplayed%.*}\"\n474\t _lp=\"${_lp%Z}\"\n475\t _date_param=\"?DatePlayed=${_lp//[-T:]/}\"\n476\t fi\n477\t _http=$(_api_post \"${SRV_URL[$_si]}\" \"${SRV_KEY[$_si]}\" \\\n478\t \"Users/${_uid}/PlayedItems/${_iid}${_date_param}\")\n479\t if [[ \"$_http\" == \"200\" || \"$_http\" == \"201\" ]]; then\n480\t success \" ✓ $_pkey → ${SRV_NAME[$_si]} marked played\"\n481\t (( TOTAL_SYNCED++ ))\n482\t else\n483\t warn \" ✗ $_pkey → ${SRV_NAME[$_si]} failed (HTTP ${_http:-err})\"\n484\t (( TOTAL_ERRORS++ ))\n485\t fi\n486\t else\n487\t # Sync resume position only\n488\t _ticks_int=$(( ${_auth_ticks:-0} ))\n489\t if [[ \"$_ticks_int\" -gt 0 ]]; then\n490\t _payload=\"{\\\"PlaybackPositionTicks\\\":${_ticks_int}}\"\n491\t _http=$(_api_post \"${SRV_URL[$_si]}\" \"${SRV_KEY[$_si]}\" \\\n492\t \"Users/${_uid}/Items/${_iid}/UserData\" \"$_payload\")\n493\t if [[ \"$_http\" == \"200\" || \"$_http\" == \"204\" ]]; then\n494\t success \" ✓ $_pkey → ${SRV_NAME[$_si]} resume synced ($(_ticks_to_sec \"$_ticks_int\")s)\"\n495\t (( TOTAL_SYNCED++ ))\n496\t else\n497\t warn \" ✗ $_pkey → ${SRV_NAME[$_si]} resume sync failed (HTTP ${_http:-err})\"\n498\t (( TOTAL_ERRORS++ ))\n499\t fi\n500\t fi\n501\t fi\n502\t done\n503\t\n504\t unset E_EPOCH E_PLAYED E_PCOUNT E_TICKS E_IID E_LPLAYED E_SIDX\n505\t done\n506\t\n507\t unset ITEM_MAP U_IDX U_UID\n508\tdone\n509\t\n510\t# ==============================================================================================\n511\t# ━━━ Summary ━━━\n512\t# ==============================================================================================\n513\tEND=$(date +%s)\n514\techo \"\"\n515\techo \"━━━━━ $ICON_SUMMARY PLAY STATE SYNC SUMMARY ━━━━━\"\n516\techo \"$ICON_TIME Duration: $(format_duration $(( END - START )))\"\n517\techo \"$ICON_DONE Synced: $TOTAL_SYNCED\"\n518\t[[ \"$TOTAL_SKIPPED\" -gt 0 ]] && echo \"$ICON_RUNNING Skipped: $TOTAL_SKIPPED (already current)\"\n519\t[[ \"$TOTAL_ERRORS\" -gt 0 ]] && echo \"$ICON_ERROR Errors: $TOTAL_ERRORS\"\n520\t\n521\tif [[ \"$DRY_RUN\" == true ]]; then\n522\t warn \"DRY RUN — no changes written\"\n523\telif [[ \"$TOTAL_ERRORS\" -eq 0 ]]; then\n524\t success \"Done ✅\"\n525\telse\n526\t warn \"Done with $TOTAL_ERRORS error(s)\"\n527\tfi\n528\t"}]},"uuid":"b2f24c0f-04a8-4748-ace2-6d4658abc4c5","timestamp":"2026-06-14T03:19:12.868Z","toolUseResult":{"type":"text","file":{"filePath":"/boot/config/plugins/varaverk/Media/play_state_sync.sh","content":"#!/bin/bash\n# ==============================================================================================\n# ================================= Play State Sync ============================================\n# ==============================================================================================\n#\n# PURPOSE\n# ─────────────────────────────────────────────────────────────────────────────\n# Syncs watched/played state and resume positions across all configured Emby\n# and Jellyfin servers. Newest timestamp wins — no data is ever lost.\n#\n# Users are matched by name (case-insensitive). If a user exists on some servers\n# but not others, those servers are skipped for that user — no errors, no partial\n# syncs from unrelated accounts.\n#\n# Items are matched by external provider IDs:\n# Movies → IMDb ID, then TMDB ID\n# Episodes → TVDB ID + season + episode number\n# Audio → MusicBrainz Track ID\n#\n# ==============================================================================================\n# SYNC LOGIC\n# ==============================================================================================\n#\n# For each matched item across ≥2 servers:\n# 1. Compare LastPlayedDate across all servers that have a play record.\n# 2. The server with the newest LastPlayedDate is authoritative.\n# 3. Push that server's state (Played, PlayCount, LastPlayedDate,\n# PlaybackPositionTicks) to every other server.\n# 4. Servers with no record for that item also receive the state.\n#\n# Resume positions (partial plays, not marked Played):\n# Synced by comparing PlaybackPositionTicks when LastPlayedDate is absent.\n# The higher tick count wins.\n#\n# ==============================================================================================\n# CONFIGURATION (host*.conf, aliased by detect_hosts)\n# ==============================================================================================\n#\n# HOST*_TRANSCODE_SERVERS \"Name|URL|APIKey|type\" entries per host (emby/jellyfin)\n# All hosts are discovered automatically — no extra config needed.\n# Remote host URLs have localhost rewritten to their Tailscale IP.\n#\n# master.conf\n#\n# PLAY_SYNC_ENABLED Master toggle (default: true)\n# PLAY_SYNC_REMOTE Sync across all hosts via Tailscale (default: true)\n# false = local servers only (this host's Emby + Jellyfin)\n# PLAY_SYNC_DAYS How many days back to check for played items (default: 90)\n# Use 0 to sync all played items (slow on large libraries).\n# PLAY_SYNC_TYPES Comma-separated item types to sync (default: Movie,Episode,Audio)\n#\n# ==============================================================================================\n# RUNTIME MODES\n# ==============================================================================================\n#\n# play_state_sync.sh\n# Sync all matched users across all configured servers.\n#\n# play_state_sync.sh --dry-run\n# Show what would be synced without writing any state.\n#\n# play_state_sync.sh --status\n# Show configured servers, reachability, and user counts.\n#\n# play_state_sync.sh --full\n# Ignore PLAY_SYNC_DAYS — sync all played items (may be slow).\n#\n# play_state_sync.sh --log\n# Verbose output — show each item comparison.\n#\n# ==============================================================================================\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nsource \"$SCRIPT_DIR/../load_config.sh\"\n\n# ── Handle --full before parse_args ───────────────────────────────────────────\nFULL_SYNC=false\n_FILTERED=()\nfor _a in \"$@\"; do\n [[ \"$_a\" == \"--full\" ]] && FULL_SYNC=true || _FILTERED+=(\"$_a\")\ndone\nparse_args \"${_FILTERED[@]}\"\n\n# ==============================================================================================\n# ━━━ Setup ━━━\n# ==============================================================================================\n[[ \"${PLAY_SYNC_ENABLED:-true}\" != \"true\" ]] && echo \"Play state sync disabled\" && exit 0\n\nSYNC_DAYS=\"${PLAY_SYNC_DAYS:-90}\"\nSYNC_TYPES=\"${PLAY_SYNC_TYPES:-Movie,Episode,Audio}\"\n[[ \"$FULL_SYNC\" == true ]] && SYNC_DAYS=0\nlog \"$ICON_GEAR Config: days=${SYNC_DAYS} types=${SYNC_TYPES} remote=${PLAY_SYNC_REMOTE:-true}\"\n\ncommand -v jq >/dev/null 2>&1 || { error \"jq is required but not installed\"; exit 1; }\n\nacquire_lock\n\n# ── Build server list across ALL hosts ────────────────────────────────────────\n# All HOST*_TRANSCODE_SERVERS arrays are loaded into env by load_config.sh.\n# For remote hosts, localhost in the URL is rewritten to their Tailscale IP.\ndeclare -a SRV_NAME SRV_URL SRV_KEY SRV_TYPE\n_srv_count=0\n_my_hostname=$(hostname -s)\n\n_add_server() {\n local name=\"$1\" url=\"$2\" key=\"$3\" type=\"$4\"\n [[ -z \"$url\" || -z \"$key\" ]] && return\n [[ \"$key\" == \"YOUR_API_KEY\"* || \"$key\" == \"placeholder\"* ]] && return\n SRV_NAME[$_srv_count]=\"$name\"\n SRV_URL[$_srv_count]=\"$url\"\n SRV_KEY[$_srv_count]=\"$key\"\n SRV_TYPE[$_srv_count]=\"$type\"\n (( _srv_count++ ))\n}\n\nfor _varname in $(compgen -v | grep -E '^HOST[0-9]+$' | sort); do\n _num=\"${_varname//[^0-9]/}\"\n _host_hostname=\"${!_varname}\"\n [[ -z \"$_host_hostname\" ]] && continue\n\n _is_me=false\n [[ \"${_host_hostname,,}\" == \"${_my_hostname,,}\" ]] && _is_me=true\n\n # Skip remote hosts when PLAY_SYNC_REMOTE=false\n if [[ \"$_is_me\" == false && \"${PLAY_SYNC_REMOTE:-true}\" != \"true\" ]]; then\n log \"$_host_hostname — remote sync disabled (PLAY_SYNC_REMOTE=false), skipping\"\n continue\n fi\n\n # Resolve Tailscale IP for remote hosts\n _ts_ip=\"\"\n if [[ \"$_is_me\" == false ]]; then\n _ts_ip=$(resolve_tailscale_ip \"$_host_hostname\")\n if [[ -z \"$_ts_ip\" ]]; then\n log \"$_host_hostname — Tailscale IP not found, skipping\"\n continue\n fi\n fi\n\n # Load this host's TRANSCODE_SERVERS array\n _srv_arr_name=\"HOST${_num}_TRANSCODE_SERVERS\"\n eval \"_host_entries=(\\\"\\${${_srv_arr_name}[@]}\\\")\"\n [[ \"${#_host_entries[@]}\" -eq 0 ]] && continue\n\n for _entry in \"${_host_entries[@]}\"; do\n IFS='|' read -r _name _url _key _type <<< \"$_entry\"\n [[ \"$_type\" == \"emby\" || \"$_type\" == \"jellyfin\" ]] || continue\n # For remote hosts rewrite localhost/127.0.0.1 → Tailscale IP\n if [[ \"$_is_me\" == false ]]; then\n _url=\"${_url//localhost/$_ts_ip}\"\n _url=\"${_url//127.0.0.1/$_ts_ip}\"\n fi\n _add_server \"${_name} (${_host_hostname})\" \"$_url\" \"$_key\" \"$_type\"\n done\ndone\n\nif [[ \"$_srv_count\" -lt 2 ]]; then\n error \"Need at least 2 media servers configured — found $_srv_count\"\n exit 1\nfi\n\n# ==============================================================================================\n# ━━━ API Helpers ━━━\n# ==============================================================================================\n_api_get() {\n local url=\"$1\" key=\"$2\" endpoint=\"$3\"\n curl -sf --max-time 30 \\\n -H \"X-Emby-Token: $key\" \\\n \"${url%/}/${endpoint}\" 2>/dev/null\n}\n\n_api_post() {\n local url=\"$1\" key=\"$2\" endpoint=\"$3\" data=\"${4:-}\"\n if [[ -n \"$data\" ]]; then\n curl -sf --max-time 30 -s -o /dev/null -w \"%{http_code}\" -X POST \\\n -H \"X-Emby-Token: $key\" \\\n -H \"Content-Type: application/json\" \\\n -d \"$data\" \\\n \"${url%/}/${endpoint}\" 2>/dev/null\n else\n curl -sf --max-time 30 -s -o /dev/null -w \"%{http_code}\" -X POST \\\n -H \"X-Emby-Token: $key\" \\\n \"${url%/}/${endpoint}\" 2>/dev/null\n fi\n}\n\n# ISO 8601 date → unix seconds (portable, no date -d on BusyBox)\n_iso_to_epoch() {\n local dt=\"$1\"\n [[ -z \"$dt\" || \"$dt\" == \"null\" ]] && echo 0 && return\n # Strip fractional seconds and Z, convert to seconds\n dt=\"${dt%.*}\" # remove .NNNNNNN\n dt=\"${dt%Z}\" # remove trailing Z\n dt=\"${dt/T/ }\" # T → space\n date -u -d \"$dt UTC\" +%s 2>/dev/null || echo 0\n}\n\n# Ticks → seconds (1 tick = 100ns, 10_000_000 ticks = 1s)\n_ticks_to_sec() {\n echo $(( ${1:-0} / 10000000 ))\n}\n\n# ==============================================================================================\n# ━━━ Status ━━━\n# ==============================================================================================\nif [[ \"$SHOW_STATUS\" == true ]]; then\n echo \"\"\n echo \"━━━━━ $ICON_SUMMARY PLAY STATE SYNC STATUS ━━━━━\"\n echo \"$ICON_GEAR Remote sync: ${PLAY_SYNC_REMOTE:-true}\"\n echo \"$ICON_GEAR Sync days: ${SYNC_DAYS:-all}\"\n echo \"$ICON_GEAR Item types: $SYNC_TYPES\"\n echo \"\"\n for i in $(seq 0 $(( _srv_count - 1 ))); do\n echo \"$ICON_HOST [${SRV_TYPE[$i]}] ${SRV_NAME[$i]} (${SRV_URL[$i]})\"\n _users=$(_api_get \"${SRV_URL[$i]}\" \"${SRV_KEY[$i]}\" \"Users\" 2>/dev/null | jq -r '.[].Name' 2>/dev/null | wc -l)\n if [[ \"$_users\" -gt 0 ]]; then\n echo \" $ICON_DONE Reachable — $_users user(s)\"\n _api_get \"${SRV_URL[$i]}\" \"${SRV_KEY[$i]}\" \"Users\" 2>/dev/null \\\n | jq -r '.[].Name' 2>/dev/null | while read -r n; do echo \" · $n\"; done\n else\n echo \" $ICON_ERROR Unreachable or no users\"\n fi\n done\n echo \"━━━━━━━━━━━━━━━━━━━━━━━\"\n exit 0\nfi\n\n# ==============================================================================================\n# ━━━ Main Sync ━━━\n# ==============================================================================================\necho \"━━━ $ICON_SYNC Play State Sync — $(date '+%Y-%m-%d %H:%M:%S') ━━━\"\n[[ \"$DRY_RUN\" == true ]] && warn \"DRY RUN — no state will be written\"\n[[ \"$FULL_SYNC\" == true ]] && log \"Full sync mode — ignoring PLAY_SYNC_DAYS\"\n\nSTART=$(date +%s)\nTOTAL_SYNCED=0\nTOTAL_SKIPPED=0\nTOTAL_ERRORS=0\n\n# ── Step 1: Fetch users from each server ─────────────────────────────────────\ndeclare -A SRV_USERS # idx → JSON array string of users\n\nlog \"Fetching users...\"\nfor i in $(seq 0 $(( _srv_count - 1 ))); do\n _resp=$(_api_get \"${SRV_URL[$i]}\" \"${SRV_KEY[$i]}\" \"Users\")\n if [[ -z \"$_resp\" ]]; then\n warn \"${SRV_NAME[$i]} — unreachable, skipping\"\n SRV_USERS[$i]=\"\"\n continue\n fi\n SRV_USERS[$i]=\"$_resp\"\n _count=$(echo \"$_resp\" | jq 'length' 2>/dev/null || echo 0)\n log \"${SRV_NAME[$i]} — $_count user(s)\"\ndone\n\n# ── Step 2: Build cross-server user map ──────────────────────────────────────\n# lowercase_name → \"server_idx:user_id server_idx:user_id ...\"\ndeclare -A USER_MAP\n\nfor i in $(seq 0 $(( _srv_count - 1 ))); do\n [[ -z \"${SRV_USERS[$i]}\" ]] && continue\n while IFS=$'\\t' read -r uid uname; do\n [[ -z \"$uid\" || -z \"$uname\" ]] && continue\n lname=\"${uname,,}\"\n if [[ -n \"${USER_MAP[$lname]}\" ]]; then\n USER_MAP[$lname]+=\" ${i}:${uid}\"\n else\n USER_MAP[$lname]=\"${i}:${uid}\"\n fi\n done < <(echo \"${SRV_USERS[$i]}\" | jq -r '.[] | [.Id, .Name] | @tsv' 2>/dev/null)\ndone\n\n# ── Step 3: Sync per matched user ────────────────────────────────────────────\n_date_filter=\"\"\nif [[ \"$SYNC_DAYS\" -gt 0 ]]; then\n _cutoff=$(date -u -d \"$SYNC_DAYS days ago\" '+%Y-%m-%dT%H:%M:%SZ' 2>/dev/null || \\\n date -u -v \"-${SYNC_DAYS}d\" '+%Y-%m-%dT%H:%M:%SZ' 2>/dev/null)\n [[ -n \"$_cutoff\" ]] && _date_filter=\"&MinDateLastSaved=$_cutoff\"\nfi\n\nfor lname in \"${!USER_MAP[@]}\"; do\n read -ra _pairs <<< \"${USER_MAP[$lname]}\"\n\n # Skip users only on one server\n [[ \"${#_pairs[@]}\" -lt 2 ]] && log \" $lname — only on 1 server, skipping\" && continue\n\n echo \"\"\n echo \"── User: $lname (${#_pairs[@]} server(s)) ──\"\n\n # Build per-server user context\n declare -A U_IDX U_UID\n for _pair in \"${_pairs[@]}\"; do\n IFS=':' read -r _si _ui <<< \"$_pair\"\n U_IDX[\"$_si\"]=\"$_si\"\n U_UID[\"$_si\"]=\"$_ui\"\n done\n\n # ── Fetch played items from each server for this user ────────────────────\n # Key: provider_id_string → sorted list of (epoch, srv_idx, item_id, play_count, ticks, played)\n declare -A ITEM_MAP # provider_key → JSON per-server data\n\n for _si in \"${!U_IDX[@]}\"; do\n _uid=\"${U_UID[$_si]}\"\n _endpoint=\"Users/${_uid}/Items?Recursive=true&Fields=ProviderIds,UserData,Type,ParentIndexNumber,IndexNumber,SeriesName&IncludeItemTypes=${SYNC_TYPES}&Filters=IsPlayed${_date_filter}&Limit=5000\"\n _resp=$(_api_get \"${SRV_URL[$_si]}\" \"${SRV_KEY[$_si]}\" \"$_endpoint\")\n if [[ -z \"$_resp\" ]]; then\n warn \" ${SRV_NAME[$_si]} — failed to fetch items for $lname\"\n continue\n fi\n\n # Also fetch items with resume position (not yet marked played)\n _endpoint2=\"Users/${_uid}/Items?Recursive=true&Fields=ProviderIds,UserData,Type,ParentIndexNumber,IndexNumber,SeriesName&IncludeItemTypes=${SYNC_TYPES}&SortBy=DatePlayed&SortOrder=Descending&Filters=IsResumable${_date_filter}&Limit=500\"\n _resp2=$(_api_get \"${SRV_URL[$_si]}\" \"${SRV_KEY[$_si]}\" \"$_endpoint2\")\n\n # Combine and deduplicate by Id\n if [[ -n \"$_resp2\" ]]; then\n _combined=$(printf '%s\\n%s' \"$_resp\" \"$_resp2\" | jq -s \\\n '[.[0].Items // [], .[1].Items // []] | add // [] | unique_by(.Id)' 2>/dev/null)\n else\n _combined=$(echo \"$_resp\" | jq '.Items // []' 2>/dev/null)\n fi\n\n _count=$(echo \"$_combined\" | jq 'length' 2>/dev/null || echo 0)\n log \" ${SRV_NAME[$_si]} — $_count item(s) with state for $lname\"\n\n # Build item lookup by provider key\n while IFS=$'\\t' read -r iid itype season ep imdb tmdb tvdb mbtrack played ticks lplayed pcount; do\n # Build canonical provider key\n _pkey=\"\"\n case \"$itype\" in\n Movie)\n [[ \"$imdb\" != \"null\" && -n \"$imdb\" ]] && _pkey=\"imdb:${imdb}\"\n [[ -z \"$_pkey\" && \"$tmdb\" != \"null\" && -n \"$tmdb\" ]] && _pkey=\"tmdb:movie:${tmdb}\"\n ;;\n Episode)\n [[ \"$tvdb\" != \"null\" && -n \"$tvdb\" && \"$season\" != \"null\" && \"$ep\" != \"null\" ]] && \\\n _pkey=\"tvdb:ep:${tvdb}:s${season}e${ep}\"\n ;;\n Audio)\n [[ \"$mbtrack\" != \"null\" && -n \"$mbtrack\" ]] && _pkey=\"mb:track:${mbtrack}\"\n ;;\n esac\n [[ -z \"$_pkey\" ]] && continue\n\n _epoch=$(_iso_to_epoch \"$lplayed\")\n _entry=\"${_si}|${iid}|${played}|${pcount}|${ticks}|${_epoch}|${lplayed}\"\n\n if [[ -n \"${ITEM_MAP[$_pkey]}\" ]]; then\n ITEM_MAP[$_pkey]+=$'\\n'\"$_entry\"\n else\n ITEM_MAP[$_pkey]=\"$_entry\"\n fi\n\n done < <(echo \"$_combined\" | jq -r '.[] | [\n .Id,\n .Type,\n (.ParentIndexNumber // \"null\" | tostring),\n (.IndexNumber // \"null\" | tostring),\n (.ProviderIds.Imdb // \"null\"),\n (.ProviderIds.Tmdb // \"null\"),\n (.ProviderIds.Tvdb // \"null\"),\n (.ProviderIds.MusicBrainzTrackId // \"null\"),\n (.UserData.Played // false | tostring),\n (.UserData.PlaybackPositionTicks // 0 | tostring),\n (.UserData.LastPlayedDate // \"null\"),\n (.UserData.PlayCount // 0 | tostring)\n ] | @tsv' 2>/dev/null)\n done\n\n # ── Compare and sync ─────────────────────────────────────────────────────\n for _pkey in \"${!ITEM_MAP[@]}\"; do\n # Collect all server entries for this item\n declare -A E_EPOCH E_PLAYED E_PCOUNT E_TICKS E_IID E_LPLAYED E_SIDX\n _has_entries=false\n\n while IFS='|' read -r _si _iid _played _pcount _ticks _epoch _lplayed; do\n [[ -z \"$_si\" ]] && continue\n E_SIDX[$_si]=\"$_si\"\n E_IID[$_si]=\"$_iid\"\n E_PLAYED[$_si]=\"$_played\"\n E_PCOUNT[$_si]=\"$_pcount\"\n E_TICKS[$_si]=\"$_ticks\"\n E_EPOCH[$_si]=\"$_epoch\"\n E_LPLAYED[$_si]=\"$_lplayed\"\n _has_entries=true\n done <<< \"${ITEM_MAP[$_pkey]}\"\n\n [[ \"$_has_entries\" == false ]] && continue\n\n # Find the authoritative server: newest LastPlayedDate epoch\n # Tie-break: higher PlayCount, then higher Ticks\n _auth_si=\"\"\n _auth_epoch=0\n _auth_pcount=0\n _auth_ticks=0\n\n for _si in \"${!E_SIDX[@]}\"; do\n _e=\"${E_EPOCH[$_si]:-0}\"\n _pc=\"${E_PCOUNT[$_si]:-0}\"\n _tk=\"${E_TICKS[$_si]:-0}\"\n if [[ \"$_e\" -gt \"$_auth_epoch\" ]] || \\\n [[ \"$_e\" -eq \"$_auth_epoch\" && \"$_pc\" -gt \"$_auth_pcount\" ]] || \\\n [[ \"$_e\" -eq \"$_auth_epoch\" && \"$_pc\" -eq \"$_auth_pcount\" && \"$_tk\" -gt \"$_auth_ticks\" ]]; then\n _auth_si=\"$_si\"\n _auth_epoch=\"$_e\"\n _auth_pcount=\"$_pc\"\n _auth_ticks=\"$_tk\"\n fi\n done\n\n [[ -z \"$_auth_si\" ]] && continue\n\n _auth_played=\"${E_PLAYED[$_auth_si]}\"\n _auth_lplayed=\"${E_LPLAYED[$_auth_si]}\"\n _auth_pcount=\"${E_PCOUNT[$_auth_si]}\"\n _auth_ticks=\"${E_TICKS[$_auth_si]}\"\n\n # Push to servers with older state OR no state at all\n for _si in \"${!U_IDX[@]}\"; do\n [[ \"$_si\" == \"$_auth_si\" ]] && continue\n _their_epoch=\"${E_EPOCH[$_si]:-0}\"\n _their_played=\"${E_PLAYED[$_si]:-false}\"\n\n # Skip if they already have the same/newer state\n if [[ \"$_their_epoch\" -ge \"$_auth_epoch\" ]] && \\\n [[ \"$_their_played\" == \"$_auth_played\" ]]; then\n log \" SKIP $_pkey → ${SRV_NAME[$_si]} already up to date\"\n (( TOTAL_SKIPPED++ ))\n continue\n fi\n\n _uid=\"${U_UID[$_si]}\"\n _iid=\"${E_IID[$_si]:-}\" # might not exist on this server yet\n\n # Find item ID on target server by provider key if not in our map\n if [[ -z \"$_iid\" ]]; then\n _ptype=\"${_pkey%%:*}\"\n _pval=\"${_pkey##*:}\"\n case \"$_ptype\" in\n imdb) _search_field=\"imdb.${_pval}\" ;;\n tmdb) _search_field=\"tmdb.${_pval##movie:}\" ;;\n tvdb)\n # _pkey format: tvdb:ep:{tvdb_id}:s{season}e{ep}\n # ##*: gives \"s7e2\" (wrong); strip prefix then first :\n _tvdb_num=\"${_pkey#tvdb:ep:}\"; _tvdb_num=\"${_tvdb_num%%:*}\"\n _search_field=\"tvdb.${_tvdb_num}\"\n ;;\n mb) _search_field=\"\" ;; # skip music if not found\n esac\n\n if [[ -n \"$_search_field\" ]]; then\n _iid=$(_api_get \"${SRV_URL[$_si]}\" \"${SRV_KEY[$_si]}\" \\\n \"Items?AnyProviderIdEquals=${_search_field}&Recursive=true&Fields=ProviderIds&ExcludeLocationTypes=Virtual&Limit=1\" 2>/dev/null \\\n | jq -r '.Items[0].Id // empty' 2>/dev/null)\n fi\n [[ -z \"$_iid\" ]] && log \" SKIP $_pkey → ${SRV_NAME[$_si]} item not found on server\" && continue\n fi\n\n log \" SYNC $_pkey → ${SRV_NAME[$_si]} (auth: ${SRV_NAME[$_auth_si]}, epoch: $_auth_epoch)\"\n\n if [[ \"$DRY_RUN\" == true ]]; then\n echo \" DRY RUN: would sync $_pkey → ${SRV_NAME[$_si]} user=$lname played=$_auth_played date=$_auth_lplayed\"\n (( TOTAL_SYNCED++ ))\n continue\n fi\n\n # Write state to target server\n if [[ \"$_auth_played\" == \"true\" ]]; then\n # Mark as played with date\n _date_param=\"\"\n if [[ \"$_auth_lplayed\" != \"null\" && -n \"$_auth_lplayed\" ]]; then\n # PlayedItems expects DatePlayed in yyyyMMddHHmmss (no separators, no timezone)\n _lp=\"${_auth_lplayed%.*}\"\n _lp=\"${_lp%Z}\"\n _date_param=\"?DatePlayed=${_lp//[-T:]/}\"\n fi\n _http=$(_api_post \"${SRV_URL[$_si]}\" \"${SRV_KEY[$_si]}\" \\\n \"Users/${_uid}/PlayedItems/${_iid}${_date_param}\")\n if [[ \"$_http\" == \"200\" || \"$_http\" == \"201\" ]]; then\n success \" ✓ $_pkey → ${SRV_NAME[$_si]} marked played\"\n (( TOTAL_SYNCED++ ))\n else\n warn \" ✗ $_pkey → ${SRV_NAME[$_si]} failed (HTTP ${_http:-err})\"\n (( TOTAL_ERRORS++ ))\n fi\n else\n # Sync resume position only\n _ticks_int=$(( ${_auth_ticks:-0} ))\n if [[ \"$_ticks_int\" -gt 0 ]]; then\n _payload=\"{\\\"PlaybackPositionTicks\\\":${_ticks_int}}\"\n _http=$(_api_post \"${SRV_URL[$_si]}\" \"${SRV_KEY[$_si]}\" \\\n \"Users/${_uid}/Items/${_iid}/UserData\" \"$_payload\")\n if [[ \"$_http\" == \"200\" || \"$_http\" == \"204\" ]]; then\n success \" ✓ $_pkey → ${SRV_NAME[$_si]} resume synced ($(_ticks_to_sec \"$_ticks_int\")s)\"\n (( TOTAL_SYNCED++ ))\n else\n warn \" ✗ $_pkey → ${SRV_NAME[$_si]} resume sync failed (HTTP ${_http:-err})\"\n (( TOTAL_ERRORS++ ))\n fi\n fi\n fi\n done\n\n unset E_EPOCH E_PLAYED E_PCOUNT E_TICKS E_IID E_LPLAYED E_SIDX\n done\n\n unset ITEM_MAP U_IDX U_UID\ndone\n\n# ==============================================================================================\n# ━━━ Summary ━━━\n# ==============================================================================================\nEND=$(date +%s)\necho \"\"\necho \"━━━━━ $ICON_SUMMARY PLAY STATE SYNC SUMMARY ━━━━━\"\necho \"$ICON_TIME Duration: $(format_duration $(( END - START )))\"\necho \"$ICON_DONE Synced: $TOTAL_SYNCED\"\n[[ \"$TOTAL_SKIPPED\" -gt 0 ]] && echo \"$ICON_RUNNING Skipped: $TOTAL_SKIPPED (already current)\"\n[[ \"$TOTAL_ERRORS\" -gt 0 ]] && echo \"$ICON_ERROR Errors: $TOTAL_ERRORS\"\n\nif [[ \"$DRY_RUN\" == true ]]; then\n warn \"DRY RUN — no changes written\"\nelif [[ \"$TOTAL_ERRORS\" -eq 0 ]]; then\n success \"Done ✅\"\nelse\n warn \"Done with $TOTAL_ERRORS error(s)\"\nfi\n","numLines":528,"startLine":1,"totalLines":528}},"sourceToolAssistantUUID":"d0da55ae-a93c-4cc0-b2e7-d7b85924c3c9","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"type":"last-prompt","lastPrompt":"play state has been syncing the same episodes?","leafUuid":"b2f24c0f-04a8-4748-ace2-6d4658abc4c5","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"type":"ai-title","aiTitle":"Monitor media server sync and backup health","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"type":"mode","mode":"normal","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"type":"permission-mode","permissionMode":"default","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"parentUuid":"b2f24c0f-04a8-4748-ace2-6d4658abc4c5","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01KbevFrRC6gVPfFm3LK1gcR","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"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"}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":8708,"cache_read_input_tokens":27022,"output_tokens":24674,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":8708,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":24674,"cache_read_input_tokens":27022,"cache_creation_input_tokens":8708,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":8708},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2RuRVrjhNeyZV3jjitJ","type":"assistant","uuid":"cfe7e417-bc35-4dc4-9aa0-1dfbbef6464a","timestamp":"2026-06-14T03:26:22.357Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"cfe7e417-bc35-4dc4-9aa0-1dfbbef6464a","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01KbevFrRC6gVPfFm3LK1gcR","type":"message","role":"assistant","content":[{"type":"text","text":"Yes — all 19 items from 22:43 re-appeared at 23:13, including `tvdb:ep:3279811:s1e2` with the exact same 370s ticks. Let me read the script."}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":8708,"cache_read_input_tokens":27022,"output_tokens":24674,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":8708,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":24674,"cache_read_input_tokens":27022,"cache_creation_input_tokens":8708,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":8708},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2RuRVrjhNeyZV3jjitJ","type":"assistant","uuid":"cb8024ee-0409-4b3f-8bbc-35822f7c5f96","timestamp":"2026-06-14T03:26:23.880Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"cb8024ee-0409-4b3f-8bbc-35822f7c5f96","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01KbevFrRC6gVPfFm3LK1gcR","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_018i1seWr4MDLxdjH6rkNenf","name":"Read","input":{"file_path":"/boot/config/plugins/varaverk/Media/play_state_sync.sh","offset":298,"limit":30},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":8708,"cache_read_input_tokens":27022,"output_tokens":24674,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":8708,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":24674,"cache_read_input_tokens":27022,"cache_creation_input_tokens":8708,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":8708},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2RuRVrjhNeyZV3jjitJ","type":"assistant","uuid":"db4ae6ea-9964-489d-9156-ff9d6ccf5424","timestamp":"2026-06-14T03:26:24.801Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"db4ae6ea-9964-489d-9156-ff9d6ccf5424","isSidechain":false,"promptId":"cd232ca5-1382-4956-82fd-a0877b9d01dc","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_018i1seWr4MDLxdjH6rkNenf","type":"tool_result","content":"298\t # ── Fetch played items from each server for this user ────────────────────\n299\t # Key: provider_id_string → sorted list of (epoch, srv_idx, item_id, play_count, ticks, played)\n300\t declare -A ITEM_MAP # provider_key → JSON per-server data\n301\t\n302\t for _si in \"${!U_IDX[@]}\"; do\n303\t _uid=\"${U_UID[$_si]}\"\n304\t _endpoint=\"Users/${_uid}/Items?Recursive=true&Fields=ProviderIds,UserData,Type,ParentIndexNumber,IndexNumber,SeriesName&IncludeItemTypes=${SYNC_TYPES}&Filters=IsPlayed${_date_filter}&Limit=5000\"\n305\t _resp=$(_api_get \"${SRV_URL[$_si]}\" \"${SRV_KEY[$_si]}\" \"$_endpoint\")\n306\t if [[ -z \"$_resp\" ]]; then\n307\t warn \" ${SRV_NAME[$_si]} — failed to fetch items for $lname\"\n308\t continue\n309\t fi\n310\t\n311\t # Also fetch items with resume position (not yet marked played)\n312\t _endpoint2=\"Users/${_uid}/Items?Recursive=true&Fields=ProviderIds,UserData,Type,ParentIndexNumber,IndexNumber,SeriesName&IncludeItemTypes=${SYNC_TYPES}&SortBy=DatePlayed&SortOrder=Descending&Filters=IsResumable${_date_filter}&Limit=500\"\n313\t _resp2=$(_api_get \"${SRV_URL[$_si]}\" \"${SRV_KEY[$_si]}\" \"$_endpoint2\")\n314\t\n315\t # Combine and deduplicate by Id\n316\t if [[ -n \"$_resp2\" ]]; then\n317\t _combined=$(printf '%s\\n%s' \"$_resp\" \"$_resp2\" | jq -s \\\n318\t '[.[0].Items // [], .[1].Items // []] | add // [] | unique_by(.Id)' 2>/dev/null)\n319\t else\n320\t _combined=$(echo \"$_resp\" | jq '.Items // []' 2>/dev/null)\n321\t fi\n322\t\n323\t _count=$(echo \"$_combined\" | jq 'length' 2>/dev/null || echo 0)\n324\t log \" ${SRV_NAME[$_si]} — $_count item(s) with state for $lname\"\n325\t\n326\t # Build item lookup by provider key\n327\t while IFS=$'\\t' read -r iid itype season ep imdb tmdb tvdb mbtrack played ticks lplayed pcount; do"}]},"uuid":"c6ea054a-7fbe-4ae1-829a-ecd8ffad0987","timestamp":"2026-06-14T03:26:24.827Z","toolUseResult":{"type":"text","file":{"filePath":"/boot/config/plugins/varaverk/Media/play_state_sync.sh","content":" # ── Fetch played items from each server for this user ────────────────────\n # Key: provider_id_string → sorted list of (epoch, srv_idx, item_id, play_count, ticks, played)\n declare -A ITEM_MAP # provider_key → JSON per-server data\n\n for _si in \"${!U_IDX[@]}\"; do\n _uid=\"${U_UID[$_si]}\"\n _endpoint=\"Users/${_uid}/Items?Recursive=true&Fields=ProviderIds,UserData,Type,ParentIndexNumber,IndexNumber,SeriesName&IncludeItemTypes=${SYNC_TYPES}&Filters=IsPlayed${_date_filter}&Limit=5000\"\n _resp=$(_api_get \"${SRV_URL[$_si]}\" \"${SRV_KEY[$_si]}\" \"$_endpoint\")\n if [[ -z \"$_resp\" ]]; then\n warn \" ${SRV_NAME[$_si]} — failed to fetch items for $lname\"\n continue\n fi\n\n # Also fetch items with resume position (not yet marked played)\n _endpoint2=\"Users/${_uid}/Items?Recursive=true&Fields=ProviderIds,UserData,Type,ParentIndexNumber,IndexNumber,SeriesName&IncludeItemTypes=${SYNC_TYPES}&SortBy=DatePlayed&SortOrder=Descending&Filters=IsResumable${_date_filter}&Limit=500\"\n _resp2=$(_api_get \"${SRV_URL[$_si]}\" \"${SRV_KEY[$_si]}\" \"$_endpoint2\")\n\n # Combine and deduplicate by Id\n if [[ -n \"$_resp2\" ]]; then\n _combined=$(printf '%s\\n%s' \"$_resp\" \"$_resp2\" | jq -s \\\n '[.[0].Items // [], .[1].Items // []] | add // [] | unique_by(.Id)' 2>/dev/null)\n else\n _combined=$(echo \"$_resp\" | jq '.Items // []' 2>/dev/null)\n fi\n\n _count=$(echo \"$_combined\" | jq 'length' 2>/dev/null || echo 0)\n log \" ${SRV_NAME[$_si]} — $_count item(s) with state for $lname\"\n\n # Build item lookup by provider key\n while IFS=$'\\t' read -r iid itype season ep imdb tmdb tvdb mbtrack played ticks lplayed pcount; do","numLines":30,"startLine":298,"totalLines":528}},"sourceToolAssistantUUID":"db4ae6ea-9964-489d-9156-ff9d6ccf5424","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"type":"last-prompt","lastPrompt":"play state has been syncing the same episodes?","leafUuid":"c6ea054a-7fbe-4ae1-829a-ecd8ffad0987","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"type":"ai-title","aiTitle":"Monitor media server sync and backup health","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"type":"mode","mode":"normal","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"type":"permission-mode","permissionMode":"default","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"type":"file-history-snapshot","messageId":"f6053070-4557-4382-adde-d01c70cdd3e7","snapshot":{"messageId":"a3f0c23a-5a8e-4e26-9ab8-1005dce3392e","trackedFileBackups":{"/boot/config/plugins/varaverk/Media/play_state_sync.sh":{"backupFileName":"9c50ba6f918d705a@v1","version":1,"backupTime":"2026-06-14T03:27:46.841Z"}},"timestamp":"2026-06-14T03:18:49.906Z"},"isSnapshotUpdate":true}
{"parentUuid":"c6ea054a-7fbe-4ae1-829a-ecd8ffad0987","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_011XENmb3ir4krXQXjVidLf4","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"Es0ICmUIDhgCKkAGTrvwKBVpMLwpBpAdW1+CRebMvC6T0VtvD+gNLvKASsN69oIQ29ZLxCd09XQeocfU5Hr5C5zrY+NgwmTHM2xPMhFjbGF1ZGUtc29ubmV0LTQtNjgAQgh0aGlua2luZxIMz7xx19GySZb/xuDRGgwlTB98rugErHJnQ5IiMDIZmK5KnSbtkJjO7IEF2vDfHZcu3XxrcM563lsv5YGa4Cl96dOMjMhARGS0cz3xeCqVB5qvCmP1JBcOPNxgwS/Eq4riHjgs15GFGnq509pWdOAGwqsSJuINaxlu1mBPIrrKVvKbZGI9GsDUjwwYQ8KHw1+4myxPs/WWoWlGHXnmt3wv6Hbd7Vc927BWn7+bxRymB0ZI+gCIe7pa0AaCs53RigT8TB7zpdhFU+8+SWmeRNwl7Wx32pAwhNYrj4vwpYw+u+Pah5pFYR21jTWXABUQ0vh/xR2F3ZVH+HcIj5d45TlJ7FFnAlk3todngi8a3V2KQujB2XQ1rtYoJV5dtkZjOfQPW/E5mmSXt7Ry1dswiURdgR0y6JPxF1QDeQTA9EiDO1dndBPX1GetfWV9A+5DMEYrTi5+hEcgZEEf+/V8Zsf2SAJ+DHnny5cUp7uVB6pXywI7zBl/RafcDX0KEe8sVjpZ9m8obvcxR1p8zxqCuw984VKNKc4nCa3hL5fy1LyYfTvwVRawjxtb2IsV17qr7hDN9mSGZwBThBSrfcH5tnvvflfVPy3w5g9cvipprzDgEXd2HmLuEKrxs4vTWumOmbioZ0HTsA6GUY9rkA5zv6SphtLNvPNLGD+d8YXTNIPFtMSTPuIWATd9vITG9FvGnBee4J15xCSxIbKjSKy6YMhhMX2MogEvo75KT//sZu4+cRPkB52AbYih3vLXJ/yFty/ZrExtW3uEG6a0Da/ji2SWtA3vzSPa4/TPMybR71uLLz2fhDq/zaO4QGkPf2ID3LnJKtdHEiwFop93d71rwIuMLBBGTXyiVZlIJTAyZzHNZYd02VYx6/Uwa3RuQMi33NB8/KKaeypO6mmHYKeAvh/vLwqB5xR/tAuEjsNwUiWJxxs9KeETIJXBFU6s7XdsqTAHyH/fUpL/BuDRvBt6jY5k3gLrGLJedbFUTi+mSa2/fjZFQs4zSv6meOlQMjw7VKLXfC8nsm2HI4r8oL+UKDN5GjvqsIUFEtDSvCxqd1MJRpubLv6NUjHM8bCyxO463U7cQXehnOENCMFdZjqp2ikxprmWmr2bHuxJ4ATtBdypUEMqaueQMnnOMwG3PsEHISPibrXfl1kj+7FEGVtzKStfJNy/Q9h92dMTwrSvxyi4IO9hCV21PjhWX8tA2yHqa6Qu4KbhPPA+xHtoHCnYEylo5rAKN2kGuMlbABS2leoJn2MVqhq95jtiqfovvXaKcakQBai9WUihUZEbs5drK4I7katwRcENr9M44kw6EfKY/zdVjbabGAE="}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":25371,"cache_read_input_tokens":35730,"output_tokens":729,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":25371,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":729,"cache_read_input_tokens":35730,"cache_creation_input_tokens":25371,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":25371},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2STGLLfij2dj4LsX8PS","type":"assistant","uuid":"0a31b68a-8e71-49f0-933d-1550a46cfc70","timestamp":"2026-06-14T03:26:31.401Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"0a31b68a-8e71-49f0-933d-1550a46cfc70","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_011XENmb3ir4krXQXjVidLf4","type":"message","role":"assistant","content":[{"type":"text","text":"I can see it. Line 304 has no sort order on the IsPlayed query — with `Limit=5000` and no `SortBy`, Emby/Jellyfin returns items in arbitrary library order. Items recently marked played on the target could fall outside the 5000 window, so the next run's target query misses them and they appear to still need syncing.\n\nAlso, `MinDateLastSaved` on Emby filters by when item *metadata* was last saved — not when play state was last updated — so items marked played don't bubble up into the window.\n\nFor the resume item, it's a separate issue: posting ticks via `/UserData` doesn't set `LastPlayedDate`, so target epoch stays 0 < auth epoch → skip condition never triggers → re-syncs forever.\n\nTwo fixes:"}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":25371,"cache_read_input_tokens":35730,"output_tokens":729,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":25371,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":729,"cache_read_input_tokens":35730,"cache_creation_input_tokens":25371,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":25371},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2STGLLfij2dj4LsX8PS","type":"assistant","uuid":"d531573d-8b58-4580-ad88-50b507ae5a6b","timestamp":"2026-06-14T03:26:36.051Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"d531573d-8b58-4580-ad88-50b507ae5a6b","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_011XENmb3ir4krXQXjVidLf4","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01GTJD8MQWNeCDyasW7PJQGL","name":"Edit","input":{"replace_all":false,"file_path":"/boot/config/plugins/varaverk/Media/play_state_sync.sh","old_string":" _endpoint=\"Users/${_uid}/Items?Recursive=true&Fields=ProviderIds,UserData,Type,ParentIndexNumber,IndexNumber,SeriesName&IncludeItemTypes=${SYNC_TYPES}&Filters=IsPlayed${_date_filter}&Limit=5000\"","new_string":" _endpoint=\"Users/${_uid}/Items?Recursive=true&Fields=ProviderIds,UserData,Type,ParentIndexNumber,IndexNumber,SeriesName&IncludeItemTypes=${SYNC_TYPES}&Filters=IsPlayed&SortBy=DatePlayed&SortOrder=Descending&Limit=5000\""},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":25371,"cache_read_input_tokens":35730,"output_tokens":729,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":25371,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":729,"cache_read_input_tokens":35730,"cache_creation_input_tokens":25371,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":25371},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2STGLLfij2dj4LsX8PS","type":"assistant","uuid":"f6053070-4557-4382-adde-d01c70cdd3e7","timestamp":"2026-06-14T03:26:37.450Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"f6053070-4557-4382-adde-d01c70cdd3e7","isSidechain":false,"promptId":"cd232ca5-1382-4956-82fd-a0877b9d01dc","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01GTJD8MQWNeCDyasW7PJQGL","type":"tool_result","content":"The file /boot/config/plugins/varaverk/Media/play_state_sync.sh has been updated successfully. (file state is current in your context — no need to Read it back)"}]},"uuid":"e44aaa8d-03ec-4bf4-8afa-38295d7d2e49","timestamp":"2026-06-14T03:27:46.899Z","toolUseResult":{"filePath":"/boot/config/plugins/varaverk/Media/play_state_sync.sh","oldString":" _endpoint=\"Users/${_uid}/Items?Recursive=true&Fields=ProviderIds,UserData,Type,ParentIndexNumber,IndexNumber,SeriesName&IncludeItemTypes=${SYNC_TYPES}&Filters=IsPlayed${_date_filter}&Limit=5000\"","newString":" _endpoint=\"Users/${_uid}/Items?Recursive=true&Fields=ProviderIds,UserData,Type,ParentIndexNumber,IndexNumber,SeriesName&IncludeItemTypes=${SYNC_TYPES}&Filters=IsPlayed&SortBy=DatePlayed&SortOrder=Descending&Limit=5000\"","originalFile":null,"structuredPatch":[{"oldStart":301,"oldLines":7,"newStart":301,"newLines":7,"lines":[" "," for _si in \"${!U_IDX[@]}\"; do"," _uid=\"${U_UID[$_si]}\"","- _endpoint=\"Users/${_uid}/Items?Recursive=true&Fields=ProviderIds,UserData,Type,ParentIndexNumber,IndexNumber,SeriesName&IncludeItemTypes=${SYNC_TYPES}&Filters=IsPlayed${_date_filter}&Limit=5000\"","+ _endpoint=\"Users/${_uid}/Items?Recursive=true&Fields=ProviderIds,UserData,Type,ParentIndexNumber,IndexNumber,SeriesName&IncludeItemTypes=${SYNC_TYPES}&Filters=IsPlayed&SortBy=DatePlayed&SortOrder=Descending&Limit=5000\""," _resp=$(_api_get \"${SRV_URL[$_si]}\" \"${SRV_KEY[$_si]}\" \"$_endpoint\")"," if [[ -z \"$_resp\" ]]; then"," warn \" ${SRV_NAME[$_si]} — failed to fetch items for $lname\""]}],"userModified":false,"replaceAll":false},"sourceToolAssistantUUID":"f6053070-4557-4382-adde-d01c70cdd3e7","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"e44aaa8d-03ec-4bf4-8afa-38295d7d2e49","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_017sRfXYV2iA82ZR8ndu9BeR","type":"message","role":"assistant","content":[{"type":"text","text":"Now fix the skip condition for resume items:"}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":802,"cache_read_input_tokens":61101,"output_tokens":116,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":802,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":116,"cache_read_input_tokens":61101,"cache_creation_input_tokens":802,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":802},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2SZKdSuSx3EVJCSPnoU","type":"assistant","uuid":"1f746e5a-fd1b-4092-8c1e-4a27ee0ef4ae","timestamp":"2026-06-14T03:27:49.525Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"1f746e5a-fd1b-4092-8c1e-4a27ee0ef4ae","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_017sRfXYV2iA82ZR8ndu9BeR","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_0126YnjHKdnAHyEYDSG3nWf2","name":"Read","input":{"file_path":"/boot/config/plugins/varaverk/Media/play_state_sync.sh","offset":418,"limit":20},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":802,"cache_read_input_tokens":61101,"output_tokens":116,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":802,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":116,"cache_read_input_tokens":61101,"cache_creation_input_tokens":802,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":802},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2SZKdSuSx3EVJCSPnoU","type":"assistant","uuid":"11971557-9dce-4142-8cb2-5f15e5c718ef","timestamp":"2026-06-14T03:27:50.067Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"11971557-9dce-4142-8cb2-5f15e5c718ef","isSidechain":false,"promptId":"cd232ca5-1382-4956-82fd-a0877b9d01dc","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_0126YnjHKdnAHyEYDSG3nWf2","type":"tool_result","content":"418\t # Push to servers with older state OR no state at all\n419\t for _si in \"${!U_IDX[@]}\"; do\n420\t [[ \"$_si\" == \"$_auth_si\" ]] && continue\n421\t _their_epoch=\"${E_EPOCH[$_si]:-0}\"\n422\t _their_played=\"${E_PLAYED[$_si]:-false}\"\n423\t\n424\t # Skip if they already have the same/newer state\n425\t if [[ \"$_their_epoch\" -ge \"$_auth_epoch\" ]] && \\\n426\t [[ \"$_their_played\" == \"$_auth_played\" ]]; then\n427\t log \" SKIP $_pkey → ${SRV_NAME[$_si]} already up to date\"\n428\t (( TOTAL_SKIPPED++ ))\n429\t continue\n430\t fi\n431\t\n432\t _uid=\"${U_UID[$_si]}\"\n433\t _iid=\"${E_IID[$_si]:-}\" # might not exist on this server yet\n434\t\n435\t # Find item ID on target server by provider key if not in our map\n436\t if [[ -z \"$_iid\" ]]; then\n437\t _ptype=\"${_pkey%%:*}\""}]},"uuid":"9e8cdb0d-7bbe-4965-af5d-7b600d080042","timestamp":"2026-06-14T03:27:50.081Z","toolUseResult":{"type":"text","file":{"filePath":"/boot/config/plugins/varaverk/Media/play_state_sync.sh","content":" # Push to servers with older state OR no state at all\n for _si in \"${!U_IDX[@]}\"; do\n [[ \"$_si\" == \"$_auth_si\" ]] && continue\n _their_epoch=\"${E_EPOCH[$_si]:-0}\"\n _their_played=\"${E_PLAYED[$_si]:-false}\"\n\n # Skip if they already have the same/newer state\n if [[ \"$_their_epoch\" -ge \"$_auth_epoch\" ]] && \\\n [[ \"$_their_played\" == \"$_auth_played\" ]]; then\n log \" SKIP $_pkey → ${SRV_NAME[$_si]} already up to date\"\n (( TOTAL_SKIPPED++ ))\n continue\n fi\n\n _uid=\"${U_UID[$_si]}\"\n _iid=\"${E_IID[$_si]:-}\" # might not exist on this server yet\n\n # Find item ID on target server by provider key if not in our map\n if [[ -z \"$_iid\" ]]; then\n _ptype=\"${_pkey%%:*}\"","numLines":20,"startLine":418,"totalLines":528}},"sourceToolAssistantUUID":"11971557-9dce-4142-8cb2-5f15e5c718ef","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"9e8cdb0d-7bbe-4965-af5d-7b600d080042","isSidechain":false,"attachment":{"type":"task_reminder","content":[],"itemCount":0},"type":"attachment","uuid":"7c2ec9e4-868e-4c1c-b72a-ecb5c575ef56","timestamp":"2026-06-14T03:27:50.141Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"7c2ec9e4-868e-4c1c-b72a-ecb5c575ef56","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_014bXpbFqR5GHxV3bF9qB2e5","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_013GtMQ43YkMJ4Di6KhkbmqT","name":"Edit","input":{"replace_all":false,"file_path":"/boot/config/plugins/varaverk/Media/play_state_sync.sh","old_string":" # Skip if they already have the same/newer state\n if [[ \"$_their_epoch\" -ge \"$_auth_epoch\" ]] && \\\n [[ \"$_their_played\" == \"$_auth_played\" ]]; then\n log \" SKIP $_pkey → ${SRV_NAME[$_si]} already up to date\"\n (( TOTAL_SKIPPED++ ))\n continue\n fi","new_string":" # Skip if they already have the same/newer state\n _skip=false\n if [[ \"$_auth_played\" == \"true\" ]]; then\n # Played: skip if target is already marked played with same/newer date\n [[ \"$_their_epoch\" -ge \"$_auth_epoch\" && \"$_their_played\" == \"true\" ]] && _skip=true\n else\n # Resume only: skip if target already has same or more ticks\n # (posting ticks via /UserData doesn't set LastPlayedDate, so epoch comparison is useless here)\n [[ \"${E_TICKS[$_si]:-0}\" -ge \"${_auth_ticks:-0}\" && \"$_their_played\" == \"false\" ]] && _skip=true\n fi\n if [[ \"$_skip\" == true ]]; then\n log \" SKIP $_pkey → ${SRV_NAME[$_si]} already up to date\"\n (( TOTAL_SKIPPED++ ))\n continue\n fi"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":538,"cache_read_input_tokens":61903,"output_tokens":452,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":538,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":452,"cache_read_input_tokens":61903,"cache_creation_input_tokens":538,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":538},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2SZYoD7f2v82veYtKDN","type":"assistant","uuid":"347893ea-ec82-482a-8bbc-53b9e0c24438","timestamp":"2026-06-14T03:27:55.419Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"347893ea-ec82-482a-8bbc-53b9e0c24438","isSidechain":false,"promptId":"cd232ca5-1382-4956-82fd-a0877b9d01dc","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_013GtMQ43YkMJ4Di6KhkbmqT","type":"tool_result","content":"The file /boot/config/plugins/varaverk/Media/play_state_sync.sh has been updated successfully. (file state is current in your context — no need to Read it back)"}]},"uuid":"17294bcf-e17f-4e4e-98b3-ba3f30b9ee6c","timestamp":"2026-06-14T03:27:55.451Z","toolUseResult":{"filePath":"/boot/config/plugins/varaverk/Media/play_state_sync.sh","oldString":" # Skip if they already have the same/newer state\n if [[ \"$_their_epoch\" -ge \"$_auth_epoch\" ]] && \\\n [[ \"$_their_played\" == \"$_auth_played\" ]]; then\n log \" SKIP $_pkey → ${SRV_NAME[$_si]} already up to date\"\n (( TOTAL_SKIPPED++ ))\n continue\n fi","newString":" # Skip if they already have the same/newer state\n _skip=false\n if [[ \"$_auth_played\" == \"true\" ]]; then\n # Played: skip if target is already marked played with same/newer date\n [[ \"$_their_epoch\" -ge \"$_auth_epoch\" && \"$_their_played\" == \"true\" ]] && _skip=true\n else\n # Resume only: skip if target already has same or more ticks\n # (posting ticks via /UserData doesn't set LastPlayedDate, so epoch comparison is useless here)\n [[ \"${E_TICKS[$_si]:-0}\" -ge \"${_auth_ticks:-0}\" && \"$_their_played\" == \"false\" ]] && _skip=true\n fi\n if [[ \"$_skip\" == true ]]; then\n log \" SKIP $_pkey → ${SRV_NAME[$_si]} already up to date\"\n (( TOTAL_SKIPPED++ ))\n continue\n fi","originalFile":null,"structuredPatch":[{"oldStart":422,"oldLines":8,"newStart":422,"newLines":16,"lines":[" _their_played=\"${E_PLAYED[$_si]:-false}\""," "," # Skip if they already have the same/newer state","- if [[ \"$_their_epoch\" -ge \"$_auth_epoch\" ]] && \\","- [[ \"$_their_played\" == \"$_auth_played\" ]]; then","+ _skip=false","+ if [[ \"$_auth_played\" == \"true\" ]]; then","+ # Played: skip if target is already marked played with same/newer date","+ [[ \"$_their_epoch\" -ge \"$_auth_epoch\" && \"$_their_played\" == \"true\" ]] && _skip=true","+ else","+ # Resume only: skip if target already has same or more ticks","+ # (posting ticks via /UserData doesn't set LastPlayedDate, so epoch comparison is useless here)","+ [[ \"${E_TICKS[$_si]:-0}\" -ge \"${_auth_ticks:-0}\" && \"$_their_played\" == \"false\" ]] && _skip=true","+ fi","+ if [[ \"$_skip\" == true ]]; then"," log \" SKIP $_pkey → ${SRV_NAME[$_si]} already up to date\""," (( TOTAL_SKIPPED++ ))"," continue"]}],"userModified":false,"replaceAll":false},"sourceToolAssistantUUID":"347893ea-ec82-482a-8bbc-53b9e0c24438","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"17294bcf-e17f-4e4e-98b3-ba3f30b9ee6c","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_012xwXDD4P2WkQrsNGScP4Sf","type":"message","role":"assistant","content":[{"type":"text","text":"Two bugs fixed:\n\n1. **IsPlayed query** (line 304): removed `MinDateLastSaved` filter (Emby uses item *metadata* date for that, not play state date — so items you just marked played don't bubble up) and added `SortBy=DatePlayed&SortOrder=Descending` so the 5000-item limit always keeps the most recently played items rather than arbitrary library order.\n\n2. **Resume skip condition**: posting ticks via `/UserData` doesn't set `LastPlayedDate`, so `_their_epoch` stays 0 on the target indefinitely. The skip now compares ticks for resume-only items instead of epoch, so once ticks are equal it won't re-push."}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":525,"cache_read_input_tokens":62441,"output_tokens":170,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":525,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":170,"cache_read_input_tokens":62441,"cache_creation_input_tokens":525,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":525},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2SZwfNqz1kVSVrAmjVa","type":"assistant","uuid":"37a65d00-dcd6-473c-8e7e-367fb23d1b1c","timestamp":"2026-06-14T03:28:01.814Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"37a65d00-dcd6-473c-8e7e-367fb23d1b1c","isSidechain":false,"type":"system","subtype":"turn_duration","durationMs":482689,"messageCount":28,"timestamp":"2026-06-14T03:28:01.937Z","uuid":"bf78f63b-07b7-4fd8-9e7f-5e31e6ea2730","isMeta":false,"userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"bf78f63b-07b7-4fd8-9e7f-5e31e6ea2730","isSidechain":false,"promptId":"9324dab6-0f3a-415f-83e7-ba84d2cd13aa","type":"user","message":{"role":"user","content":"run it"},"uuid":"feeffc62-0a71-420d-8db3-43fc21fd9b5f","timestamp":"2026-06-14T03:29:04.656Z","permissionMode":"acceptEdits","promptSource":"typed","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"type":"file-history-snapshot","messageId":"feeffc62-0a71-420d-8db3-43fc21fd9b5f","snapshot":{"messageId":"feeffc62-0a71-420d-8db3-43fc21fd9b5f","trackedFileBackups":{"/boot/config/plugins/varaverk/Media/play_state_sync.sh":{"backupFileName":"9c50ba6f918d705a@v2","version":2,"backupTime":"2026-06-14T03:29:04.698Z"}},"timestamp":"2026-06-14T03:29:04.698Z"},"isSnapshotUpdate":false}
{"parentUuid":"feeffc62-0a71-420d-8db3-43fc21fd9b5f","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_014H2FS3ABNfbcn38Ps15ygB","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"EocCCmUIDhgCKkDDto6Jrw5xZ+5vZG8QImcFK3V8sDA1ZcF6VT8fr6M5qhbuN4McbfzmWy2gsEXvlX1esjws9ygPUjqTnWfmFXubMhFjbGF1ZGUtc29ubmV0LTQtNjgAQgh0aGlua2luZxIMXigW6jfa4Lp3WmBkGgz7TQw4FES8zXO6fV8iMK05TYHAwek/5ZIBJqiiO/wbq9g/OoFEcufygoYmNA3kgNAK1PMYqF+a9ncor1oV1CpQkFKvF7BOvylvyx1DHbLcBrGJ74JHd1trpMX0/SILVAMDSadR93xkRiuGnN+WsXvUz0Tf/4Kn94T/Bbe2lKTsPeObBu/uWssJhwKETYp2/FcYAQ=="}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":5,"cache_read_input_tokens":63134,"output_tokens":144,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":5,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":144,"cache_read_input_tokens":63134,"cache_creation_input_tokens":5,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":5},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2Sf3Qo1v5wLiDWhKwhF","type":"assistant","uuid":"76d79277-8b59-4186-b2f1-4fc595576868","timestamp":"2026-06-14T03:29:07.151Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"76d79277-8b59-4186-b2f1-4fc595576868","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_014H2FS3ABNfbcn38Ps15ygB","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_011PZYhaAcXUwppBz7sj5F6g","name":"Bash","input":{"command":"/boot/config/plugins/varaverk/Media/play_state_sync.sh 2>&1","description":"Run play state sync","timeout":300000},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":5,"cache_read_input_tokens":63134,"output_tokens":144,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":5,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":3,"output_tokens":144,"cache_read_input_tokens":63134,"cache_creation_input_tokens":5,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":5},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2Sf3Qo1v5wLiDWhKwhF","type":"assistant","uuid":"38f24dc3-295c-4071-b1c9-934b6ac4e62b","timestamp":"2026-06-14T03:29:07.563Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"38f24dc3-295c-4071-b1c9-934b6ac4e62b","isSidechain":false,"promptId":"9324dab6-0f3a-415f-83e7-ba84d2cd13aa","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_011PZYhaAcXUwppBz7sj5F6g","type":"tool_result","content":"Command running in background with ID: btmrwrnul. Output is being written to: /tmp/claude-0/-root/685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f/tasks/btmrwrnul.output. You will be notified when it completes. To check interim output, use Read on that file path.","is_error":false}]},"uuid":"15d78a8c-ef50-45ed-95ed-70526d978bb9","timestamp":"2026-06-14T03:34:10.448Z","toolUseResult":{"stdout":"","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false,"backgroundTaskId":"btmrwrnul","assistantAutoBackgrounded":false},"sourceToolAssistantUUID":"38f24dc3-295c-4071-b1c9-934b6ac4e62b","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"15d78a8c-ef50-45ed-95ed-70526d978bb9","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01GJkQ5EvAVMfnfvWEBpsFCe","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01X4Xafd7wssUriZMkhFFkY9","name":"Read","input":{"file_path":"/tmp/claude-0/-root/685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f/tasks/btmrwrnul.output"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":248,"cache_read_input_tokens":63139,"output_tokens":100,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":248,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":100,"cache_read_input_tokens":63139,"cache_creation_input_tokens":248,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":248},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2T3atVuM57wdyKgDqiF","type":"assistant","uuid":"f81881e5-8c09-4739-8dcd-9ff95dc9d2b6","timestamp":"2026-06-14T03:34:12.306Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"f81881e5-8c09-4739-8dcd-9ff95dc9d2b6","isSidechain":false,"promptId":"9324dab6-0f3a-415f-83e7-ba84d2cd13aa","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01X4Xafd7wssUriZMkhFFkY9","type":"tool_result","content":"1\t━━━ 🔄 Play State Sync — 2026-06-13 23:29:15 ━━━\n2\t⚠️ [WARN] Emby-Jayred365 (unRAID-Jayred365) — unreachable, skipping\n3\t⚠️ [WARN] Jellyfin (unRAID-Jayred365) — unreachable, skipping\n4\t\n5\t── User: gmer4lfe (2 server(s)) ──\n6\t🏁 [OK] ✓ tvdb:ep:5618559:s7e2 → Emby (unRAID-Gmer4Lfe) marked played\n7\t🏁 [OK] ✓ tvdb:ep:5648795:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (203s)\n8\t🏁 [OK] ✓ tvdb:ep:10724843:s16e2 → Jellyfin (unRAID-Gmer4Lfe) resume synced (1446s)\n9\t🏁 [OK] ✓ tvdb:ep:167594:s5e4 → Jellyfin (unRAID-Gmer4Lfe) marked played\n10\t🏁 [OK] ✓ tvdb:ep:9387051:s1e22 → Jellyfin (unRAID-Gmer4Lfe) resume synced (381s)\n11\t🏁 [OK] ✓ tvdb:ep:8083279:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (1014s)\n12\t🏁 [OK] ✓ tvdb:ep:11818886:s18e1 → Emby (unRAID-Gmer4Lfe) marked played\n13\t🏁 [OK] ✓ tvdb:ep:226931:s1e2 → Jellyfin (unRAID-Gmer4Lfe) resume synced (46s)\n14\t🏁 [OK] ✓ tvdb:ep:179542:s1e3 → Jellyfin (unRAID-Gmer4Lfe) resume synced (608s)\n15\t🏁 [OK] ✓ tvdb:ep:11759792:s9e2 → Emby (unRAID-Gmer4Lfe) marked played\n16\t🏁 [OK] ✓ tvdb:ep:213767:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (840s)\n17\t🏁 [OK] ✓ tvdb:ep:11766619:s10e12 → Emby (unRAID-Gmer4Lfe) marked played\n18\t🏁 [OK] ✓ tvdb:ep:5704192:s1e3 → Jellyfin (unRAID-Gmer4Lfe) resume synced (1532s)\n19\t🏁 [OK] ✓ imdb:tt8750122 → Emby (unRAID-Gmer4Lfe) marked played\n20\t🏁 [OK] ✓ tvdb:ep:11320854:s4e2 → Jellyfin (unRAID-Gmer4Lfe) resume synced (2345s)\n21\t🏁 [OK] ✓ tvdb:ep:3279811:s1e2 → Emby (unRAID-Gmer4Lfe) marked played\n22\t🏁 [OK] ✓ tvdb:ep:11493564:s8e11 → Emby (unRAID-Gmer4Lfe) marked played\n23\t🏁 [OK] ✓ imdb:tt1294226 → Jellyfin (unRAID-Gmer4Lfe) resume synced (146s)\n24\t🏁 [OK] ✓ tvdb:ep:226930:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (52s)\n25\t🏁 [OK] ✓ tvdb:ep:82592:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (938s)\n26\t🏁 [OK] ✓ tvdb:ep:10693981:s2e3 → Jellyfin (unRAID-Gmer4Lfe) marked played\n27\t🏁 [OK] ✓ tvdb:ep:10693998:s2e10 → Jellyfin (unRAID-Gmer4Lfe) marked played\n28\t🏁 [OK] ✓ tvdb:ep:11426444:s1e3 → Emby (unRAID-Gmer4Lfe) marked played\n29\t🏁 [OK] ✓ imdb:tt14142060 → Jellyfin (unRAID-Gmer4Lfe) resume synced (5601s)\n30\t🏁 [OK] ✓ tvdb:ep:6324409:s2e7 → Jellyfin (unRAID-Gmer4Lfe) resume synced (1186s)\n31\t🏁 [OK] ✓ tvdb:ep:5292348:s1e7 → Jellyfin (unRAID-Gmer4Lfe) resume synced (1084s)\n32\t🏁 [OK] ✓ tvdb:ep:10355686:s9e6 → Emby (unRAID-Gmer4Lfe) marked played\n33\t🏁 [OK] ✓ tvdb:ep:10355684:s9e7 → Emby (unRAID-Gmer4Lfe) marked played\n34\t🏁 [OK] ✓ tvdb:ep:10941539:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (78s)\n35\t🏁 [OK] ✓ tvdb:ep:364205:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (880s)\n36\t🏁 [OK] ✓ imdb:tt0437863 → Emby (unRAID-Gmer4Lfe) marked played\n37\t🏁 [OK] ✓ tvdb:ep:7547570:s1e1 → Jellyfin (unRAID-Gmer4Lfe) marked played\n38\t🏁 [OK] ✓ tvdb:ep:1555111:s1e1 → Emby (unRAID-Gmer4Lfe) marked played\n39\t🏁 [OK] ✓ imdb:tt0384537 → Jellyfin (unRAID-Gmer4Lfe) resume synced (1356s)\n40\t🏁 [OK] ✓ tvdb:ep:5553405:s4e13 → Emby (unRAID-Gmer4Lfe) marked played\n41\t🏁 [OK] ✓ tvdb:ep:8464434:s1e4 → Jellyfin (unRAID-Gmer4Lfe) resume synced (818s)\n42\t🏁 [OK] ✓ tvdb:ep:962071:s1e9 → Jellyfin (unRAID-Gmer4Lfe) resume synced (1081s)\n43\t🏁 [OK] ✓ tvdb:ep:893201:s1e5 → Emby (unRAID-Gmer4Lfe) marked played\n44\t🏁 [OK] ✓ tvdb:ep:2861921:s1e1 → Emby (unRAID-Gmer4Lfe) marked played\n45\t🏁 [OK] ✓ tvdb:ep:307647:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (67s)\n46\t🏁 [OK] ✓ tvdb:ep:7055604:s1e3 → Jellyfin (unRAID-Gmer4Lfe) resume synced (1325s)\n47\t"}]},"uuid":"5d308b68-27bb-4d16-9dd2-ba4323fccff1","timestamp":"2026-06-14T03:34:12.322Z","toolUseResult":{"type":"text","file":{"filePath":"/tmp/claude-0/-root/685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f/tasks/btmrwrnul.output","content":"━━━ 🔄 Play State Sync — 2026-06-13 23:29:15 ━━━\n⚠️ [WARN] Emby-Jayred365 (unRAID-Jayred365) — unreachable, skipping\n⚠️ [WARN] Jellyfin (unRAID-Jayred365) — unreachable, skipping\n\n── User: gmer4lfe (2 server(s)) ──\n🏁 [OK] ✓ tvdb:ep:5618559:s7e2 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:5648795:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (203s)\n🏁 [OK] ✓ tvdb:ep:10724843:s16e2 → Jellyfin (unRAID-Gmer4Lfe) resume synced (1446s)\n🏁 [OK] ✓ tvdb:ep:167594:s5e4 → Jellyfin (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:9387051:s1e22 → Jellyfin (unRAID-Gmer4Lfe) resume synced (381s)\n🏁 [OK] ✓ tvdb:ep:8083279:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (1014s)\n🏁 [OK] ✓ tvdb:ep:11818886:s18e1 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:226931:s1e2 → Jellyfin (unRAID-Gmer4Lfe) resume synced (46s)\n🏁 [OK] ✓ tvdb:ep:179542:s1e3 → Jellyfin (unRAID-Gmer4Lfe) resume synced (608s)\n🏁 [OK] ✓ tvdb:ep:11759792:s9e2 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:213767:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (840s)\n🏁 [OK] ✓ tvdb:ep:11766619:s10e12 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:5704192:s1e3 → Jellyfin (unRAID-Gmer4Lfe) resume synced (1532s)\n🏁 [OK] ✓ imdb:tt8750122 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:11320854:s4e2 → Jellyfin (unRAID-Gmer4Lfe) resume synced (2345s)\n🏁 [OK] ✓ tvdb:ep:3279811:s1e2 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:11493564:s8e11 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ imdb:tt1294226 → Jellyfin (unRAID-Gmer4Lfe) resume synced (146s)\n🏁 [OK] ✓ tvdb:ep:226930:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (52s)\n🏁 [OK] ✓ tvdb:ep:82592:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (938s)\n🏁 [OK] ✓ tvdb:ep:10693981:s2e3 → Jellyfin (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:10693998:s2e10 → Jellyfin (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:11426444:s1e3 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ imdb:tt14142060 → Jellyfin (unRAID-Gmer4Lfe) resume synced (5601s)\n🏁 [OK] ✓ tvdb:ep:6324409:s2e7 → Jellyfin (unRAID-Gmer4Lfe) resume synced (1186s)\n🏁 [OK] ✓ tvdb:ep:5292348:s1e7 → Jellyfin (unRAID-Gmer4Lfe) resume synced (1084s)\n🏁 [OK] ✓ tvdb:ep:10355686:s9e6 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:10355684:s9e7 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:10941539:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (78s)\n🏁 [OK] ✓ tvdb:ep:364205:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (880s)\n🏁 [OK] ✓ imdb:tt0437863 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:7547570:s1e1 → Jellyfin (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:1555111:s1e1 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ imdb:tt0384537 → Jellyfin (unRAID-Gmer4Lfe) resume synced (1356s)\n🏁 [OK] ✓ tvdb:ep:5553405:s4e13 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:8464434:s1e4 → Jellyfin (unRAID-Gmer4Lfe) resume synced (818s)\n🏁 [OK] ✓ tvdb:ep:962071:s1e9 → Jellyfin (unRAID-Gmer4Lfe) resume synced (1081s)\n🏁 [OK] ✓ tvdb:ep:893201:s1e5 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:2861921:s1e1 → Emby (unRAID-Gmer4Lfe) marked played\n🏁 [OK] ✓ tvdb:ep:307647:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (67s)\n🏁 [OK] ✓ tvdb:ep:7055604:s1e3 → Jellyfin (unRAID-Gmer4Lfe) resume synced (1325s)\n","numLines":47,"startLine":1,"totalLines":47}},"sourceToolAssistantUUID":"f81881e5-8c09-4739-8dcd-9ff95dc9d2b6","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"type":"last-prompt","lastPrompt":"run it","leafUuid":"5d308b68-27bb-4d16-9dd2-ba4323fccff1","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"type":"ai-title","aiTitle":"Monitor media server sync and backup health","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"type":"mode","mode":"normal","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"type":"permission-mode","permissionMode":"acceptEdits","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"}
{"parentUuid":"5d308b68-27bb-4d16-9dd2-ba4323fccff1","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01A139pbgCfzKEf9ngUfQorB","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"EsgICmUIDhgCKkDNmfBfo37s3gppFCoGgOxQVzVWUQBxvkHbyOtM2O4xYtt5/iexTwNQIZh2S3MuNlWWnrKlimKPeXB4Kfec3s8/MhFjbGF1ZGUtc29ubmV0LTQtNjgAQgh0aGlua2luZxIMgoTkC6SBKdiV1UWLGgyVcc9IwjLpx/dQ7LwiMBQWHNmbBOu8Nv1hqGfQx48U49dyayaswEYJ/e53AV6AratRVqLRDUu2pVpSG7Oq7SqQB4bm4+b1sTIGaM0z4Ch48oKImMiDE1L3PyaEf145Hh+polKohIO00+k2koIuWEppHozAj4J1ZDB3jJy7lp13X457UDm83Vl+aMuIRAAd/+S546n7NEpy57QVFD0HdcAwXny7cSkCmN2/hGCDztLJU+D2Hen8461/IOfrvoWKS2KzXXDVEma6WCmmG6yrIYr78Bu4imWsrHzhs66RfrxOWF1nNbI7jdfOFRb2TNdQU2xr0kqWWif0Yxmei8vsQLIhDw5lGNDSsyuy5JhgoFmViRU6z6OXSDgrZ9Xku/iCgvOvUtjpbqh5xI/QsOHyEPTUO479hIGVv6FOciIvPVH3wqlqvZUq091DfLdfG7ROouGKzwtlBO04CbkCDsrOTQy/ZuvwpxKw6kbI8AKDtAyMjn/V91rQu1VXuw5NHYdCAFhHfPCo5W72Sf+RUedYhgQAlbIAsl/3WxUqI0UMOo/ThJtF6W6+qFrLV6A8O1m1bpKTtFaSlgz23Rzk1AMIgQ38V/QLaOehMG/iyfTcRRm62BMEHLjFcmggb8l4HhySUCIlnn8QYRpqpcI8kqSnQq9y+CBc0CDSA3lDfEhfQWBwwR7UIaDbd2vkRmGI3smgWtDbASgmaw0wQotm+yLWeP1Zh942PipkgZvgtcJ6Uy+fraTF5TgZ2oU1ShlVq51JZT89VLboShe+vumn8PTRYxPtkyQjj1J45Sk3XJXIDjGW1ljFx6MvAO4kE8MAgLl711BaMb/gSB1B42wKAFVlKBc240dlzJnOS3jTNMzqKYAWqC/f36MGjexnjMwimo6yl30/Y11TM6Lu88zVUZ33Baiju+jb3uxgx6Z1Gyy36NJskWG3oXNgisu0BVkalR0vL+NP3KhQR6X2Ll8p2Zr0dellTMxeQoLLEvt/CDUAI6oK2PaeXhbxYw0kV8TlghmbrHvepdJmstfLuS4Ng2Bjnc3ChYEAZu8Dnqz/NALcoJV6E6JR0yZC0ryMRbj9tlTYjQfVGs72lvS2ZjwlEq339vpHLHV7FhNYPQGt5qpu1ZZqQSxMaNmEUZvJzAabYihMzYlOpY9Tq24AM6L8RUVZ8K/WfjeDUiW+Ar6yZcVCbjLIHF7d+M/6K3PzQRHXHVzlVZTfVNjKjc2dCcpBk6Az+lopJv/1UNaZPhmP7d7z8TeqZ+xWtbL7E+zq54Lg2L8SxT+BPbGXQPSypdivJGpt78roGhgB"}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":2319,"cache_read_input_tokens":63387,"output_tokens":393,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":2319,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":393,"cache_read_input_tokens":63387,"cache_creation_input_tokens":2319,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":2319},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2T3j6N383GqFrasEWHK","type":"assistant","uuid":"9299a24d-dc27-4000-8ea6-0ae4f5995544","timestamp":"2026-06-14T03:34:18.740Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"9299a24d-dc27-4000-8ea6-0ae4f5995544","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01A139pbgCfzKEf9ngUfQorB","type":"message","role":"assistant","content":[{"type":"text","text":"Still running — already syncing a lot more resume items that were being filtered out before. Let me wait for it to finish."}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":2319,"cache_read_input_tokens":63387,"output_tokens":393,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":2319,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":393,"cache_read_input_tokens":63387,"cache_creation_input_tokens":2319,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":2319},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2T3j6N383GqFrasEWHK","type":"assistant","uuid":"cca49b4b-20a1-433b-82c3-127f0cb564bb","timestamp":"2026-06-14T03:34:19.555Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"cca49b4b-20a1-433b-82c3-127f0cb564bb","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01A139pbgCfzKEf9ngUfQorB","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01JciwVbJF8mqMGmXmBGCcma","name":"Read","input":{"file_path":"/tmp/claude-0/-root/685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f/tasks/btmrwrnul.output","offset":47},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":2319,"cache_read_input_tokens":63387,"output_tokens":393,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":2319,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":393,"cache_read_input_tokens":63387,"cache_creation_input_tokens":2319,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":2319},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2T3j6N383GqFrasEWHK","type":"assistant","uuid":"29a21170-1f6b-4c04-82b4-3cafe7cbd6dd","timestamp":"2026-06-14T03:34:21.559Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"29a21170-1f6b-4c04-82b4-3cafe7cbd6dd","isSidechain":false,"promptId":"9324dab6-0f3a-415f-83e7-ba84d2cd13aa","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01JciwVbJF8mqMGmXmBGCcma","type":"tool_result","content":"47\t🏁 [OK] ✓ tvdb:ep:10635743:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (192s)\n48\t"}]},"uuid":"f9067ab2-58cc-41d2-9a49-5ea78d70ef1c","timestamp":"2026-06-14T03:34:21.573Z","toolUseResult":{"type":"text","file":{"filePath":"/tmp/claude-0/-root/685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f/tasks/btmrwrnul.output","content":"🏁 [OK] ✓ tvdb:ep:10635743:s1e1 → Jellyfin (unRAID-Gmer4Lfe) resume synced (192s)\n","numLines":2,"startLine":47,"totalLines":48}},"sourceToolAssistantUUID":"29a21170-1f6b-4c04-82b4-3cafe7cbd6dd","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"f9067ab2-58cc-41d2-9a49-5ea78d70ef1c","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_015bhSQqSGgEToBFPssbNtey","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"EoICCmUIDhgCKkAf7UjpanZMq34jM12m4HrerGralwRQupCUEq3ACur1jJpqpIcveO7XDW436kwx12j1YbKeMfPI/D8JqbqjDQ3FMhFjbGF1ZGUtc29ubmV0LTQtNjgAQgh0aGlua2luZxIMpDqU0qrVyTEeO0OCGgwD7pWKP7NUKVXDMJkiMFdz9YMFzjlihx1gKBSm594Y+g2PNMGn0a/RgGcfg9NfDShEq3Pbl6T1fZewwduO5ypLm2xsQtr/TX3RwdlFglzGJltFD2ngXTJsPtM178AsCqw1wAGQJPrJBut/H0w75InHX/WtJMejk6UR6W6m+TftlrD8Myov0xRBFGVgGAE="}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":461,"cache_read_input_tokens":65706,"output_tokens":99,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":461,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":99,"cache_read_input_tokens":65706,"cache_creation_input_tokens":461,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":461},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2T4QmKHP8dRTwqesHb5","type":"assistant","uuid":"43db2e76-48c4-43f4-9cb1-a499d6579663","timestamp":"2026-06-14T03:34:23.316Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"43db2e76-48c4-43f4-9cb1-a499d6579663","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_015bhSQqSGgEToBFPssbNtey","type":"message","role":"assistant","content":[{"type":"text","text":"Still running. I'll wait for the background notification.\n\nThe script found a lot more resume items this run — those were being silently skipped before because `MinDateLastSaved` was filtering them out. This first run will be the big one-time catch-up; subsequent runs should be much shorter once everything's in sync."}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":461,"cache_read_input_tokens":65706,"output_tokens":99,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":461,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":99,"cache_read_input_tokens":65706,"cache_creation_input_tokens":461,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":461},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2T4QmKHP8dRTwqesHb5","type":"assistant","uuid":"f2606e2f-289f-4370-b4b1-383f31497e6b","timestamp":"2026-06-14T03:34:24.761Z","userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"parentUuid":"f2606e2f-289f-4370-b4b1-383f31497e6b","isSidechain":false,"type":"system","subtype":"turn_duration","durationMs":317474,"messageCount":41,"timestamp":"2026-06-14T03:34:24.833Z","uuid":"f62398d2-e597-4494-911d-b94f1e777c60","isMeta":false,"userType":"external","entrypoint":"cli","cwd":"/root","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD"}
{"type":"queue-operation","operation":"enqueue","timestamp":"2026-06-14T03:35:50.326Z","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","content":" No transcode state — ramdisk_setup.sh not yet run. No transcode state — ramdisk_setup.sh not yet run.
No transcode state — ramdisk_setup.sh not yet run.
';\n1482\t } else {\n1483\t const loc = tc.is_ramdisk ? 'Ramdisk' : 'SSD';\n1484\t const locColor = tc.is_ramdisk ? '#4caf50' : '#ff9800';\n1485\t\n1486\t // RAM disk bar\n1487\t const rd = tc.ramdisk ?? {};\n1488\t const rdUsed = rd.used_mb ?? 0;\n1489\t const rdSize = rd.size_mb ?? 0;\n1490\t const rdPct = rdSize > 0 ? Math.round(rdUsed / rdSize * 100) : 0;\n1491\t const rdHue = Math.round(120 * (1 - rdPct / 100));\n1492\t\n1493\t // SSD bar\n1494\t const ssd = tc.ssd ?? {};"}]},"uuid":"f5d8156a-e3ad-41d4-83c5-fa3020ff5ea2","timestamp":"2026-06-14T05:41:40.442Z","toolUseResult":{"type":"text","file":{"filePath":"/boot/config/plugins/varaverk/Plugin/unraid/pages/monitor.php","content":" document.getElementById('vv-gpu-body').innerHTML = 'No GPU detected
';\n }\n\n // ── Scripts ─────────────────────────────────────────────────────────────\n vvLastScripts = d.scripts ?? {};\n vvRenderScripts();\n\n // ── Transcode ───────────────────────────────────────────────────────────\n const tc = d.transcode ?? {};\n if (!tc.available) {\n document.getElementById('vv-transcode-body').innerHTML =\n 'No transcode state — ramdisk_setup.sh not yet run.
';\n } else {\n const loc = tc.is_ramdisk ? 'Ramdisk' : 'SSD';\n const locColor = tc.is_ramdisk ? '#4caf50' : '#ff9800';\n\n // RAM disk bar\n const rd = tc.ramdisk ?? {};\n const rdUsed = rd.used_mb ?? 0;\n const rdSize = rd.size_mb ?? 0;\n const rdPct = rdSize > 0 ? Math.round(rdUsed / rdSize * 100) : 0;\n const rdHue = Math.round(120 * (1 - rdPct / 100));\n\n // SSD bar\n const ssd = tc.ssd ?? {};","numLines":25,"startLine":1470,"totalLines":2220}},"sourceToolAssistantUUID":"af66d3eb-5eed-4e38-899d-117a081e1175","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"parentUuid":"f5d8156a-e3ad-41d4-83c5-fa3020ff5ea2","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01L1di861dvr48q56Z1ANcD6","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01XSD5g4WQdk8UgVKhDgDMPa","name":"Bash","input":{"command":"grep -n \"transcode_state\\|STATE_FILE\\|state_file\\|transcode.*available\" /boot/config/plugins/varaverk/Plugin/unraid/include/common.php | head -20","description":"Find where PHP reads the transcode state file"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":563,"cache_read_input_tokens":163059,"output_tokens":126,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":563,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":126,"cache_read_input_tokens":163059,"cache_creation_input_tokens":563,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":563},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2cmW8TxwJoNZYGMPCYt","type":"assistant","uuid":"7937334e-c50b-492a-9595-b2e009842510","timestamp":"2026-06-14T05:41:46.375Z","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"parentUuid":"7937334e-c50b-492a-9595-b2e009842510","isSidechain":false,"promptId":"6303c7f5-6ea6-4ee2-952e-e194b2183e8c","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01XSD5g4WQdk8UgVKhDgDMPa","type":"tool_result","content":"737: $stateFile = \"$stateDir/transcode_state.db\";","is_error":false}]},"uuid":"a1244097-c53c-4a4b-8935-cd0c5cd80e63","timestamp":"2026-06-14T05:41:46.962Z","toolUseResult":{"stdout":"737: $stateFile = \"$stateDir/transcode_state.db\";","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"7937334e-c50b-492a-9595-b2e009842510","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"parentUuid":"a1244097-c53c-4a4b-8935-cd0c5cd80e63","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01HoAZ92x4214nNzo6kMB3CY","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Tnc1eB6HTiUiSTfgwywwR1","name":"Read","input":{"file_path":"/boot/config/plugins/varaverk/Plugin/unraid/include/common.php","offset":730,"limit":20},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":158,"cache_read_input_tokens":163622,"output_tokens":107,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":158,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":107,"cache_read_input_tokens":163622,"cache_creation_input_tokens":158,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":158},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2cmyktAafiJMGacSnmH","type":"assistant","uuid":"247c883c-89de-42e4-b322-acf78d7c4311","timestamp":"2026-06-14T05:41:50.282Z","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"parentUuid":"247c883c-89de-42e4-b322-acf78d7c4311","isSidechain":false,"promptId":"6303c7f5-6ea6-4ee2-952e-e194b2183e8c","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Tnc1eB6HTiUiSTfgwywwR1","type":"tool_result","content":"730\t }\n731\t return $items;\n732\t}\n733\t\n734\tfunction vv_transcode_sessions(): array {\n735\t $v = vv_conf_vars();\n736\t $stateDir = rtrim($v['STATE_DIR'] ?? STATE_DIR, '/');\n737\t $stateFile = \"$stateDir/transcode_state.db\";\n738\t if (!file_exists($stateFile)) return ['available' => false];\n739\t\n740\t $raw = [];\n741\t foreach (file($stateFile) ?: [] as $line) {\n742\t [$k, $v] = array_pad(explode('=', trim($line), 2), 2, '');\n743\t $raw[trim($k)] = trim($v);\n744\t }\n745\t\n746\t $target = $raw['current_target'] ?? '';\n747\t $lastFlip = (int)($raw['last_flip_time'] ?? 0);\n748\t $flipCount = (int)($raw['flip_count_hour'] ?? 0);\n749\t $isRamdisk = str_contains($target, 'ramdisk');"}]},"uuid":"99f1b67b-4e3d-47a3-82e8-634d6c8868b4","timestamp":"2026-06-14T05:41:50.320Z","toolUseResult":{"type":"text","file":{"filePath":"/boot/config/plugins/varaverk/Plugin/unraid/include/common.php","content":" }\n return $items;\n}\n\nfunction vv_transcode_sessions(): array {\n $v = vv_conf_vars();\n $stateDir = rtrim($v['STATE_DIR'] ?? STATE_DIR, '/');\n $stateFile = \"$stateDir/transcode_state.db\";\n if (!file_exists($stateFile)) return ['available' => false];\n\n $raw = [];\n foreach (file($stateFile) ?: [] as $line) {\n [$k, $v] = array_pad(explode('=', trim($line), 2), 2, '');\n $raw[trim($k)] = trim($v);\n }\n\n $target = $raw['current_target'] ?? '';\n $lastFlip = (int)($raw['last_flip_time'] ?? 0);\n $flipCount = (int)($raw['flip_count_hour'] ?? 0);\n $isRamdisk = str_contains($target, 'ramdisk');","numLines":20,"startLine":730,"totalLines":809}},"sourceToolAssistantUUID":"247c883c-89de-42e4-b322-acf78d7c4311","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"parentUuid":"99f1b67b-4e3d-47a3-82e8-634d6c8868b4","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01RzgoqR7zQFCmD5qTRJkuDR","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"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"}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":415,"cache_read_input_tokens":163780,"output_tokens":1837,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":415,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":1837,"cache_read_input_tokens":163780,"cache_creation_input_tokens":415,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":415},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2cnFH2pr2QowDrk2VDk","type":"assistant","uuid":"b0d29390-8cd9-44c6-8d10-8e4e6b6c8fbe","timestamp":"2026-06-14T05:42:22.703Z","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"parentUuid":"b0d29390-8cd9-44c6-8d10-8e4e6b6c8fbe","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01RzgoqR7zQFCmD5qTRJkuDR","type":"message","role":"assistant","content":[{"type":"text","text":"Found it. The daily git pull picked up our master.conf change — `STATE_DIR=\"${SCRIPTS_DIR}/State_Files\"` is now literal in master.conf, but the PHP config parser doesn't resolve bash variable references. It reads `STATE_DIR` as the string `${SCRIPTS_DIR}/State_Files`, which isn't a real path, so the state file isn't found.\n\nLet me look at how `vv_conf_vars()` parses configs:"}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":415,"cache_read_input_tokens":163780,"output_tokens":1837,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":415,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":1837,"cache_read_input_tokens":163780,"cache_creation_input_tokens":415,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":415},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2cnFH2pr2QowDrk2VDk","type":"assistant","uuid":"ce3c8319-b544-4d5b-96f9-90a5bc0f15fb","timestamp":"2026-06-14T05:42:24.273Z","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"parentUuid":"ce3c8319-b544-4d5b-96f9-90a5bc0f15fb","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01RzgoqR7zQFCmD5qTRJkuDR","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01FgEbNBBY3oZ99LCUamCPGi","name":"Read","input":{"file_path":"/boot/config/plugins/varaverk/Plugin/unraid/include/common.php","offset":1,"limit":60},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":415,"cache_read_input_tokens":163780,"output_tokens":1837,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":415,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":1837,"cache_read_input_tokens":163780,"cache_creation_input_tokens":415,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":415},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2cnFH2pr2QowDrk2VDk","type":"assistant","uuid":"a15b7a71-a46d-4e7e-9792-971b23e73411","timestamp":"2026-06-14T05:42:24.814Z","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"parentUuid":"a15b7a71-a46d-4e7e-9792-971b23e73411","isSidechain":false,"promptId":"6303c7f5-6ea6-4ee2-952e-e194b2183e8c","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01FgEbNBBY3oZ99LCUamCPGi","type":"tool_result","content":"1\t $os['hostname'] ?? ($ident['NAME'] ?? gethostname()),\n35\t 'comment' => $ident['COMMENT'] ?? '',\n36\t 'timezone' => $ident['timeZone'] ?? 'UTC',\n37\t 'cpu_model' => $cpu['brand'] ?? ($ident['SYS_MODEL'] ?? ''),\n38\t 'cpu_threads' => (int)($cpu['threads'] ?? 0),\n39\t 'cpu_cores' => (int)($cpu['cores'] ?? 0),\n40\t 'reg_type' => 'Unraid OS ' . ($var['regTy'] ?? ''),\n41\t 'reg_to' => $var['regTo'] ?? '',\n42\t 'uptime' => $uptime,\n43\t 'uptime_sec' => $uptimeSec,\n44\t 'array_state' => strtoupper($api['array']['state'] ?? $var['mdState'] ?? 'UNKNOWN'),\n45\t 'version' => trim($os['release'] ?? '') ?: $version,\n46\t 'load_avg' => $load ? [round($load[0], 2), round($load[1], 2), round($load[2], 2)] : null,\n47\t ];\n48\t }\n49\t\n50\t // ── Local fallback ────────────────────────────────────────────────────────\n51\t vv_api_record_fallback('system_info');\n52\t $cpuModel = '';\n53\t foreach (@file('/proc/cpuinfo') ?: [] as $line) {\n54\t if (preg_match('/^model name\\s*:\\s*(.+)/', $line, $m)) { $cpuModel = trim($m[1]); break; }\n55\t }\n56\t $uptimeSec = (int)explode(' ', @file_get_contents('/proc/uptime') ?: '0')[0];\n57\t $uptime = vv_format_uptime($uptimeSec);\n58\t\n59\t $load = sys_getloadavg();\n60\t return ["}]},"uuid":"807c9d76-8953-4177-b562-a67a8e3bd664","timestamp":"2026-06-14T05:42:24.847Z","toolUseResult":{"type":"text","file":{"filePath":"/boot/config/plugins/varaverk/Plugin/unraid/include/common.php","content":" $os['hostname'] ?? ($ident['NAME'] ?? gethostname()),\n 'comment' => $ident['COMMENT'] ?? '',\n 'timezone' => $ident['timeZone'] ?? 'UTC',\n 'cpu_model' => $cpu['brand'] ?? ($ident['SYS_MODEL'] ?? ''),\n 'cpu_threads' => (int)($cpu['threads'] ?? 0),\n 'cpu_cores' => (int)($cpu['cores'] ?? 0),\n 'reg_type' => 'Unraid OS ' . ($var['regTy'] ?? ''),\n 'reg_to' => $var['regTo'] ?? '',\n 'uptime' => $uptime,\n 'uptime_sec' => $uptimeSec,\n 'array_state' => strtoupper($api['array']['state'] ?? $var['mdState'] ?? 'UNKNOWN'),\n 'version' => trim($os['release'] ?? '') ?: $version,\n 'load_avg' => $load ? [round($load[0], 2), round($load[1], 2), round($load[2], 2)] : null,\n ];\n }\n\n // ── Local fallback ────────────────────────────────────────────────────────\n vv_api_record_fallback('system_info');\n $cpuModel = '';\n foreach (@file('/proc/cpuinfo') ?: [] as $line) {\n if (preg_match('/^model name\\s*:\\s*(.+)/', $line, $m)) { $cpuModel = trim($m[1]); break; }\n }\n $uptimeSec = (int)explode(' ', @file_get_contents('/proc/uptime') ?: '0')[0];\n $uptime = vv_format_uptime($uptimeSec);\n\n $load = sys_getloadavg();\n return [","numLines":60,"startLine":1,"totalLines":809}},"sourceToolAssistantUUID":"a15b7a71-a46d-4e7e-9792-971b23e73411","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"parentUuid":"807c9d76-8953-4177-b562-a67a8e3bd664","isSidechain":false,"attachment":{"type":"task_reminder","content":[],"itemCount":0},"type":"attachment","uuid":"7317c06f-15ef-444f-bdfe-fd27a0fc8ace","timestamp":"2026-06-14T05:42:24.939Z","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"type":"last-prompt","lastPrompt":"monitor page, Transcode No transcode state — ramdisk_setup.sh not yet run. what caused this, daily orch?","leafUuid":"7317c06f-15ef-444f-bdfe-fd27a0fc8ace","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"} {"type":"ai-title","aiTitle":"Monitor media server sync and backup health","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"} {"type":"mode","mode":"normal","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"} {"type":"permission-mode","permissionMode":"acceptEdits","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"} {"parentUuid":"7317c06f-15ef-444f-bdfe-fd27a0fc8ace","isSidechain":false,"message":{"model":"claude-sonnet-4-6","id":"msg_01HVus8mfY2RWw71kPjs4VpU","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01551QuSatcroKBSdtfnf8fi","name":"Bash","input":{"command":"grep -n \"vv_conf_vars\\|STATE_DIR\\|SCRIPTS_DIR\\|conf_vars\" /boot/config/plugins/varaverk/Plugin/unraid/include/common.php | head -20","description":"Find vv_conf_vars definition and STATE_DIR references in common.php"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":2982,"cache_read_input_tokens":164195,"output_tokens":136,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":2982,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":1,"output_tokens":136,"cache_read_input_tokens":164195,"cache_creation_input_tokens":2982,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":2982},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011Cc2cpn6VJjc5UquetGM3r","type":"assistant","uuid":"152b8d95-333c-4158-a6b7-c65085600571","timestamp":"2026-06-14T05:42:30.110Z","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"parentUuid":"152b8d95-333c-4158-a6b7-c65085600571","isSidechain":false,"promptId":"6303c7f5-6ea6-4ee2-952e-e194b2183e8c","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01551QuSatcroKBSdtfnf8fi","type":"tool_result","content":"606: $vars = vv_conf_vars();\n735: $v = vv_conf_vars();\n736: $stateDir = rtrim($v['STATE_DIR'] ?? STATE_DIR, '/');","is_error":false}]},"uuid":"3f1b4d18-4f34-4857-8027-3afcf21682ce","timestamp":"2026-06-14T05:42:30.755Z","toolUseResult":{"stdout":"606: $vars = vv_conf_vars();\n735: $v = vv_conf_vars();\n736: $stateDir = rtrim($v['STATE_DIR'] ?? STATE_DIR, '/');","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"152b8d95-333c-4158-a6b7-c65085600571","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"type":"last-prompt","lastPrompt":"monitor page, Transcode No transcode state — ramdisk_setup.sh not yet run. what caused this, daily orch?","leafUuid":"3f1b4d18-4f34-4857-8027-3afcf21682ce","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"} {"type":"ai-title","aiTitle":"Monitor media server sync and backup health","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"} {"type":"mode","mode":"normal","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"} {"type":"permission-mode","permissionMode":"acceptEdits","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f"} {"parentUuid":null,"logicalParentUuid":"3f1b4d18-4f34-4857-8027-3afcf21682ce","isSidechain":false,"type":"system","subtype":"compact_boundary","content":"Conversation compacted","isMeta":false,"timestamp":"2026-06-14T05:45:19.901Z","uuid":"bbbe7a6d-6810-4601-8a50-fb3d57a41239","level":"info","compactMetadata":{"trigger":"auto","preTokens":167347,"durationMs":169138,"preservedSegment":{"headUuid":"152b8d95-333c-4158-a6b7-c65085600571","anchorUuid":"dd50d557-ee9d-446c-b2a2-9d987aa1dca4","tailUuid":"3f1b4d18-4f34-4857-8027-3afcf21682ce"},"preservedMessages":{"anchorUuid":"dd50d557-ee9d-446c-b2a2-9d987aa1dca4","uuids":["152b8d95-333c-4158-a6b7-c65085600571","3f1b4d18-4f34-4857-8027-3afcf21682ce"],"allUuids":["152b8d95-333c-4158-a6b7-c65085600571","3f1b4d18-4f34-4857-8027-3afcf21682ce"]},"postTokens":19908},"userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"parentUuid":"bbbe7a6d-6810-4601-8a50-fb3d57a41239","isSidechain":false,"promptId":"6303c7f5-6ea6-4ee2-952e-e194b2183e8c","type":"user","message":{"role":"user","content":"This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.\n\nSummary:\n1. Primary Request and Intent:\n\nThis session continued from a prior conversation and covered several major tasks:\n\n**Platform-agnostic refactor (completing prior session's pending items):**\n- Complete all remaining hardcoded `/mnt/user`, `/boot/config/plugins/varaverk`, and Unraid-specific path removals from core bash scripts\n- Add cross-platform remote storage path support via `HOST*_STORAGE_PATH` in host*.conf files, resolved to `REMOTE_STORAGE_PATH` by `detect_hosts()`\n- Add `platform_get_os_version()` / `platform_os_version_probe_cmd()` to adapter\n- Rename `check_unraid_version_parity()` → `check_os_version_parity()`\n- Remove `${STATE_DIR:-/boot/config}` fallbacks; use `platform_setup_db_path()` for setup DB references\n- Remove redundant `DOCKER_APPDATA_BASE` default from arr_sync.sh\n\n**Header/code audit:**\n- Run parallel agents across all 78 core bash scripts to check that each script does what its header claims\n- Fix all discrepancies found\n\n**Implement missing behavior (user explicit request):**\n- `docker_daily_restart.sh`: `RESTART_VERIFY_WAIT` was logged but never applied before `verify_running()`\n- `cert_monitor.sh`: `--log` flag documented as verbose per-domain output but didn't change behavior\n\n**Current bug being investigated:**\n- Monitor page shows \"No transcode state — ramdisk_setup.sh not yet run.\" after daily orchestrator ran git pull that picked up `STATE_DIR=\"${SCRIPTS_DIR}/State_Files\"` — PHP can't resolve bash variable references\n\n2. Key Technical Concepts:\n- Varaverk: self-healing two-server Unraid home media ecosystem (HOST1=unRAID-Gmer4Lfe, HOST2=unRAID-Jayred365)\n- Three-file config model: `master.conf` (shared), `host1.conf`, `host2.conf` (per-host credentials/paths)\n- Platform adapter layer: `Plugin/$PLATFORM/adapter.sh` provides `platform_*()` API; core scripts never branch on OS directly\n- `load_config.sh` does runtime OS detection: `/etc/unraid-version` → `PLATFORM=\"unraid\"`; exports `SCRIPTS_DIR` before sourcing master.conf\n- All host*.conf files loaded into memory at runtime (\"obscurely in memory\") — so HOST1 has access to HOST2's conf vars at runtime; only sparse git checkout prevents them from being on each server's git-tracked files\n- `detect_hosts()` sets `MY_ID`/`REMOTE_ID` and all `HOST*_VAR` → `VAR` aliases via `_alias_array`\n- `REMOTE_STORAGE_PATH` — resolved by `detect_hosts()` from `${REMOTE_ID}_STORAGE_PATH` in remote's conf, with `platform_storage_path()` fallback\n- `SCRIPTS_DIR` is exported BEFORE master.conf is sourced — allows `${SCRIPTS_DIR}` references in master.conf for bash, but PHP can't resolve bash variable references\n\n3. Files and Code Sections:\n\n- **`/boot/config/plugins/varaverk/Plugin/unraid/adapter.sh`**\n - Added `platform_setup_db_path()` → `/boot/config/varaverk_setup.db`\n - Added `platform_get_os_version()`:\n ```bash\n platform_get_os_version() {\n local ver\n ver=$(grep -oP '(?<=version=\")[^\"]+' /etc/unraid-version 2>/dev/null)\n [[ -n \"$ver\" ]] || return 1\n echo \"$ver\"\n }\n ```\n - Added `platform_os_version_probe_cmd()`:\n ```bash\n platform_os_version_probe_cmd() {\n echo \"grep -oP '(?<=version=\\\")[^\\\"]+' /etc/unraid-version 2>/dev/null\"\n }\n ```\n - Added `platform_storage_path()` → `/mnt/user`\n - Added `platform_webui_install_path()` → `/boot/config/plugins/varaverk`\n - Added `platform_scripts_dir_probe_cmd()` → grep command for varaverk.cfg\n - Set `DOCKER_APPDATA_BASE=\"${DOCKER_APPDATA_BASE:-/mnt/user/appdata}\"` at source time\n - Updated header to document all new functions\n\n- **`/boot/config/plugins/varaverk/common.sh`**\n - `check_remote_array()`: `_spath=\"$REMOTE_STORAGE_PATH\"` (was `$(platform_storage_path)`)\n - `check_remote_disks()` Tier 3: `local _spath=\"$REMOTE_STORAGE_PATH\"` (was `$(platform_storage_path)`)\n - `check_os_version_parity()` (renamed from `check_unraid_version_parity()`):\n ```bash\n check_os_version_parity() {\n local local_version remote_version\n local_version=$(platform_get_os_version 2>/dev/null)\n if [[ -z \"$local_version\" ]]; then\n warn \"Cannot read local OS version — skipping version parity check\"\n return 0\n fi\n local _probe_cmd\n _probe_cmd=$(platform_os_version_probe_cmd)\n remote_version=$(ssh -i \"$SSH_KEY\" -o ConnectTimeout=10 root@\"$REMOTE_SERVER\" \\\n \"$_probe_cmd\" 2>/dev/null)\n ...\n }\n ```\n - `show_status()`: `local_ver=$(platform_get_os_version 2>/dev/null || echo \"unknown\")`, label changed to \"OS ver:\"\n - `detect_hosts()` — added `REMOTE_STORAGE_PATH` resolution:\n ```bash\n local _rsp_var=\"${REMOTE_ID}_STORAGE_PATH\"\n REMOTE_STORAGE_PATH=\"${!_rsp_var:-$(platform_storage_path)}\"\n ```\n - Updated `detect_hosts()` docblock to document `REMOTE_STORAGE_PATH`\n - All `${STATE_DIR:-/boot/config}/partnership_*.db` → `${STATE_DIR}/partnership_*.db`\n\n- **`/boot/config/plugins/varaverk/Configurations/master.conf`**\n - `DATA_DIR=\"${SCRIPTS_DIR}/data\"`, `STATE_DIR=\"${SCRIPTS_DIR}/State_Files\"`\n - `DOCKER_APPDATA_BASE=\"${DOCKER_APPDATA_BASE:-}\"` (adapter sets default)\n - Added `RESTART_VERIFY_WAIT=3` (seconds to wait after restart before checking container)\n\n- **`/boot/config/plugins/varaverk/Configurations/host1.conf`**\n - Added `HOST1_STORAGE_PATH=\"/mnt/user\"` after `HOST1_SSH_KEY`\n\n- **`/boot/config/plugins/varaverk/Configurations/host2.conf`**\n - Added `HOST2_STORAGE_PATH=\"/mnt/user\"` after `HOST2_SSH_KEY`\n\n- **`/boot/config/plugins/varaverk/Partnership/partnership_manager.sh`**\n - `check_both_healthy()`: uses `$REMOTE_STORAGE_PATH` directly in SSH command (was `$(platform_storage_path)`)\n - `do_final_sync()`: removed hardcoded `/mnt/user/appdata-Fallback/Critical-Data` and `/mnt/user/Media_Server/Emby` fallback paths; now warns when `CRITICAL_SYNC_SHARES` is empty\n - `BLOCKLIST_FILE`: `${STATE_DIR}/partnership_blocklist.db` (removed `:-/boot/config` fallback)\n - LOCAL/REMOTE/OWNER/MIRROR_STATE_FILE: `${STATE_DIR}/partnership_*.db`\n - `local_state_file=\"$(platform_setup_db_path)\"` (was complex fallback)\n - `check_os_version_parity` (renamed)\n\n- **`/boot/config/plugins/varaverk/Partnership/partnership_onboard.sh`**\n - Remote SCRIPTS_DIR discovery:\n ```bash\n _probe_cmd=$(platform_scripts_dir_probe_cmd)\n OWNER_SCRIPTS_DIR=$(timeout \"$SSH_TIMEOUT\" ssh ... \"$_probe_cmd\" 2>/dev/null | tr -d '[:space:]')\n OWNER_SCRIPTS_DIR=\"${OWNER_SCRIPTS_DIR:-$SCRIPTS_DIR}\"\n ```\n - `write_onboard_phase()`: `local state_file=\"$(platform_setup_db_path)\"`\n - KEY_READY flag: `local _setup_f=\"$(platform_setup_db_path)\"`\n\n- **`/boot/config/plugins/varaverk/Partnership/partnership_transfer.sh`**\n - Remote SCRIPTS_DIR: `_probe_cmd=$(platform_scripts_dir_probe_cmd)`, `_REMOTE_SD=\"${_REMOTE_SD:-$SCRIPTS_DIR}\"`\n - LOCAL/REMOTE_STATE_FILE: `${STATE_DIR}/...`\n\n- **`/boot/config/plugins/varaverk/Partnership/partnership_offboard.sh`**\n - All state files: `${STATE_DIR}/partnership_*.db` (removed `:-/boot/config` fallbacks)\n\n- **`/boot/config/plugins/varaverk/Partnership/onboard_cancel.sh`**\n - `STATE_FILE=\"$(platform_setup_db_path)\"`\n - Setup DB in SSH command: `$(platform_setup_db_path)` (was hardcoded `/boot/config/varaverk_setup.db`)\n\n- **`/boot/config/plugins/varaverk/System_Essentials/conf_sync.sh`**\n - `remote_conf=\"${SCRIPTS_DIR}/Configurations/${partner_slot}.conf\"` (was hardcoded `/boot/config/plugins/varaverk/...`)\n\n- **`/boot/config/plugins/varaverk/git_pull_execute.sh`**\n - `_BOOT_DIR=$(platform_webui_install_path)` (was `\"/boot/config/plugins/varaverk\"`)\n\n- **`/boot/config/plugins/varaverk/Orchestrators/watchdog_orchestrator.sh`**\n - `log \"$ICON_DISK Array: $(platform_storage_path) mounted ✅\"` (was hardcoded `/mnt/user`)\n\n- **`/boot/config/plugins/varaverk/Fallback/fallback.sh`**\n - `local_ver=$(platform_get_os_version 2>/dev/null || echo \"unknown\")`\n - Status line: \"OS ver:\" (was \"unRAID ver:\")\n - `check_os_version_parity` (renamed)\n - `check_partnership_active()`: `${STATE_DIR}/partnership_*.db`\n\n- **`/boot/config/plugins/varaverk/Fallback/fallback_test.sh`**\n - `local_ver=$(platform_get_os_version 2>/dev/null || echo \"unknown\")`\n - `check_os_version_parity` (renamed)\n\n- **`/boot/config/plugins/varaverk/Watchdogs/stability_watchdog.sh`**\n - `platform_is_mover_running` (was `pgrep -f \"mover\"`)\n\n- **`/boot/config/plugins/varaverk/Watchdogs/system_watchdog.sh`**, **`docker_watchdog.sh`**\n - Various `platform_*` calls already in place from prior session; `check_os_version_parity` rename\n\n- **`/boot/config/plugins/varaverk/Rsync/rsync.sh`**\n - `BLOCKLIST_FILE=\"${PARTNERSHIP_BLOCKLIST_FILE:-${STATE_DIR}/partnership_blocklist.db}\"`\n - `check_os_version_parity` (renamed)\n\n- **`/boot/config/plugins/varaverk/Media/arr_sync.sh`**\n - Removed `DOCKER_APPDATA_BASE=\"${DOCKER_APPDATA_BASE:-/mnt/user/appdata}\"` (adapter sets it)\n\n- **`/boot/config/plugins/varaverk/Docker_Essentials/docker_daily_restart.sh`**\n - Added CONFIGURATION doc for `RESTART_VERIFY_WAIT`\n - Added sleep before `verify_running()`:\n ```bash\n if retry_docker docker restart \"$container\"; then\n [[ \"${RESTART_VERIFY_WAIT:-3}\" -gt 0 ]] && sleep \"${RESTART_VERIFY_WAIT:-3}\"\n if verify_running \"$container\"; then\n ```\n\n- **`/boot/config/plugins/varaverk/Docker_Essentials/docker_update.sh`** and **`docker_update_remaining.sh`**\n - `platform_rebuild_container \"$container\"` (was direct rebuild script call)\n\n- **`/boot/config/plugins/varaverk/Monitors/cert_monitor.sh`**\n - Per-domain summary loop now includes days/expiry info:\n ```bash\n for domain in \"${CERT_MONITOR_DOMAINS[@]}\"; do\n [[ -z \"$domain\" ]] && continue\n local _days=\"${DOMAIN_DAYS[$domain]:-?}\" _exp=\"${DOMAIN_EXPIRY[$domain]:-unknown}\"\n case \"${DOMAIN_STATUS[$domain]:-UNKN}\" in\n OK) log \" $ICON_SUCCESS $domain — healthy (${_days}d, expires ${_exp})\" ;;\n WARN) warn \" $ICON_WARN $domain — warning (${_days}d, expires ${_exp})\" ;;\n CRIT) echo \" $ICON_ERROR $domain — CRITICAL (${_days}d, expires ${_exp})\" ;;\n FAIL) echo \" $ICON_ERROR $domain — unreachable\" ;;\n esac\n done\n ```\n - Updated --log description in RUNTIME MODES header\n\n- **`/boot/config/plugins/varaverk/Docker_Essentials/downloaders_reset.sh`**\n - Header: \"every 15 minutes\" → \"every 30 minutes\"\n\n- **`/boot/config/plugins/varaverk/Media/lidarr_cleanup.sh`**\n - Header: \"after each deletion run\" → \"after runs where files were deleted\"\n\n- **`/boot/config/plugins/varaverk/Partnership/ssh_setup.sh`**\n - Added `Partnership/ssh_setup.sh --local-only` to USAGE section\n\n- **`/boot/config/plugins/varaverk/Tools/ramdisk_stop.sh`**\n - Added `TRANSCODE_STATE_FILE` to CONFIGURATION section\n\n- **`/boot/config/plugins/varaverk/Transcodes/ramdisk_setup.sh`**\n - Updated STATE FILES section and added `TRANSCODE_STATE_FILE` to CONFIGURATION\n\n- **`/boot/config/plugins/varaverk/Tools/smart_long_test.sh`**\n - Removed dead `SMART_TEMP_WARN / SMART_TEMP_CRIT` from CONFIGURATION header\n\n- **`/boot/config/plugins/varaverk/Monitors/zfs_memory_snapshot.sh`**\n - PURPOSE: clarified dry-run outputs console only\n\n- **`/boot/config/plugins/varaverk/Orchestrators/sunday_morning_coffee_report.sh`**\n - `_unraid_ver=$(platform_get_os_version 2>/dev/null || echo \"unknown\")`\n\n- **`/boot/config/plugins/varaverk/Plugin/unraid/include/common.php`**\n - `vv_transcode_sessions()` at line 734: reads `$stateDir/transcode_state.db`\n - `$stateDir = rtrim($v['STATE_DIR'] ?? STATE_DIR, '/')` — this is the problem: STATE_DIR in master.conf is now `\"${SCRIPTS_DIR}/State_Files\"` which PHP can't resolve\n\n- **`/boot/config/plugins/varaverk/Plugin/unraid/pages/monitor.php`**\n - Line 1481: shows \"No transcode state — ramdisk_setup.sh not yet run.\" when `tc.available` is false\n\n4. Errors and Fixes:\n- **`partnership_offboard.sh` Edit failed \"File has not been read yet\"**: Fixed by reading the file first before editing\n- **`docker_update_remaining.sh` Edit failed similarly**: Read first, then edited\n- **`git push github main` failed** — \"Repository not found\": GitHub remote SSH key not available in RAM session; pushed to gitea origin only\n- **conf files are gitignored**: When trying to `git add Configurations/host1.conf` — these are gitignored (credentials). Only committed code changes.\n- **Agent audit false positives**: Multiple agents reported issues that were already fixed:\n - `radarr_cleanup.sh` RADARR_IMPORT_SCAN_TIMEOUT — already at line 69\n - `playback_aware_sonarr_discovery.sh` SONARR_EMBY_LIBRARIES — already at line 81\n - `weekly_health_digest.sh` DIGEST_SMART_ON_BANDWIDTH — actually used at line 301\n - `fallback.sh` Tier 4 — already documented at line 168\n - Watchdog scripts couldn't be fully audited due to file length limits in agent context\n\n5. Problem Solving:\n\n**Cross-platform remote SSH assumption**: When SSH commands run on the remote server, they need that server's platform-specific paths. Solved by adding `HOST*_STORAGE_PATH` to each host's conf, resolved to `REMOTE_STORAGE_PATH` by `detect_hosts()`. Same-platform pairs don't need config (fallback to `platform_storage_path()`). True cross-platform just requires setting `HOST*_STORAGE_PATH` in the new node's conf.\n\n**PHP can't resolve bash variable references (CURRENT BUG)**: `STATE_DIR=\"${SCRIPTS_DIR}/State_Files\"` in master.conf works for bash (SCRIPTS_DIR exported before master.conf sourced), but PHP's `vv_conf_vars()` reads the literal string `${SCRIPTS_DIR}/State_Files`. `vv_transcode_sessions()` in common.php uses `$v['STATE_DIR']` to construct the state file path, which resolves to an invalid path, causing \"No transcode state\" on the monitor page. This was triggered when the daily orchestrator ran `git_pull_execute.sh` and pulled the new master.conf.\n\n6. All User Messages:\n- \"ok so now we have auth,arrs,and shared services that get pushed to mirrors during onboarding\" (prior session)\n- \"now this is in the core code. all bash scripts are core code. i need unraid specific removed and added to the app layer.\" (prior session)\n- \"gitea is no longer involved. deployment is with github and handled elsewhere\" (prior session — re: gitea)\n- \"leave it alone im using it for dev, but not in release\" (prior session — re: gitea_ssh_setup.sh)\n- \"lets check all bash scripts\" (prior session)\n- \"how do we make this work with other systems. goal was to have plugins/adapters...\" (prior session)\n- \"lets do it.... ive gotton close to the cor scipts being universal...\" (prior session)\n- \"push the whole project\" — push to git\n- \"so, cores are now dynamic, calling the adapters?\" — confirming architecture\n- \"since you don't have a mixed-platform pair yet. this is a very long ways away, it was just a thought that kinda turned into a 5-10 year goal\"\n- \"ok, i mean now is the time, we are already here and in the mindset, everything is good\" — implement REMOTE_STORAGE_PATH properly\n- \"host*.confs get stores obsecurely in memory. so we have all .conf of all nodes that are onboarded\" — key architectural clarification\n- \"yeah, i was against having other server host.conf on other servers, but this isnt enterprise...\" — trust model explanation\n- \"what else is still hardcoded that shouldn't be\" — sweep for remaining hardcodes\n- \"yes\" — fix the remaining hardcodes\n- \"started as 1 scripts with like 3 lines...\" — project history reflection\n- \"well. i built the server just for media...\" — personal context on distro hopping philosophy\n- \"what else is still hardcoded that shouldn't be\" — second sweep\n- \"yes\" — implement the four fixes (OS version, STATE_DIR fallbacks, setup DB path, arr_sync redundant default)\n- \"ok, i mean now is the time...\" — fix mover check and rename function\n- \"yes\" — go ahead with mover fix and rename\n- \"ready for a really big task\"\n- \"lets go through each bash script and check that the script does what the header says it does\"\n- \"yes\" — implement missing behavior (cert_monitor --log and docker_daily_restart RESTART_VERIFY_WAIT)\n- \"monitor page, Transcode / No transcode state — ramdisk_setup.sh not yet run. what caused this, daily orch?\"\n\n**Security/Operational Constraints (preserved verbatim):**\n- **Workspace is always** `/boot/config/plugins/varaverk` — every edit goes here\n- **Never touch** `/mnt/user/Important Shit/Git/Development/Varaverk` — stale dev folder, ignore it\n- **No Co-Authored-By** in commit messages unless explicitly asked\n- `gitea_ssh_setup.sh` — leave alone, used for dev not release, excluded from all refactoring\n\n7. Pending Tasks:\n- **Fix the \"No transcode state\" bug**: PHP `vv_transcode_sessions()` in `Plugin/unraid/include/common.php` reads `STATE_DIR` from `vv_conf_vars()` but gets the literal string `${SCRIPTS_DIR}/State_Files` because PHP can't resolve bash variable references. Need to either: (a) add bash variable resolution to `vv_conf_vars()` using PHP-computed scripts dir (`dirname(dirname(dirname(__FILE__)))`), or (b) revert STATE_DIR to a hardcoded path in master.conf, or (c) add a `$scripts_dir` substitution pass in the PHP after reading conf vars\n- **GitHub push**: Need user to run `! git push github main` when their GitHub SSH key is accessible\n- Header fixes for remaining minor issues (transcode_cleanup.sh lsof description — minor, deferred)\n\n8. Current Work:\nInvestigating the monitor page \"No transcode state\" bug. The user asked \"what caused this, daily orch?\" and the answer is yes — the daily orchestrator ran `git_pull_execute.sh` which pulled the latest master.conf from gitea. That master.conf now contains `STATE_DIR=\"${SCRIPTS_DIR}/State_Files\"` (a bash variable reference). PHP `vv_transcode_sessions()` in `Plugin/unraid/include/common.php` line 736-737 reads:\n```php\n$stateDir = rtrim($v['STATE_DIR'] ?? STATE_DIR, '/');\n$stateFile = \"$stateDir/transcode_state.db\";\nif (!file_exists($stateFile)) return ['available' => false];\n```\nPHP gets `${SCRIPTS_DIR}/State_Files` as a literal string for STATE_DIR, which is not a valid filesystem path. The state file doesn't exist at that path, so `available` returns false, and the monitor shows \"No transcode state\".\n\nThe bash scripts write to `${STATE_DIR}/transcode_state.db` which resolves correctly at bash runtime since SCRIPTS_DIR is exported before master.conf loads. But PHP never resolves SCRIPTS_DIR.\n\n9. Optional Next Step:\nFix the PHP variable resolution bug in `Plugin/unraid/include/common.php`. The `vv_conf_vars()` or `vv_transcode_sessions()` function needs to resolve `${SCRIPTS_DIR}` references. Since the PHP file is at `/boot/config/plugins/varaverk/Plugin/unraid/include/common.php`, the scripts dir can be computed as `dirname(dirname(dirname(__FILE__)))` = `/boot/config/plugins/varaverk`. Add a substitution pass after reading conf vars:\n\n```php\n$scripts_dir = dirname(dirname(dirname(__FILE__)));\n// Resolve ${SCRIPTS_DIR} references in conf vars\nforeach ($vars as $k => &$v) {\n if (is_string($v)) $v = str_replace('${SCRIPTS_DIR}', $scripts_dir, $v);\n}\n```\n\nOr more targeted, just in `vv_transcode_sessions()`:\n```php\n$scripts_dir = dirname(dirname(dirname(__FILE__)));\n$stateDir = str_replace('${SCRIPTS_DIR}', $scripts_dir, $stateDir);\n```\n\nThe user's most recent message was: \"monitor page, Transcode / No transcode state — ramdisk_setup.sh not yet run. what caused this, daily orch?\" — and we had just identified the root cause and were about to implement the fix.\n\nIf you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: /root/.claude/projects/-root/685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f.jsonl\nContinue the conversation from where it left off without asking the user any further questions. Resume directly — do not acknowledge the summary, do not recap what was happening, do not preface with \"I'll continue\" or similar. Pick up the last task as if the break never happened."},"isVisibleInTranscriptOnly":true,"isCompactSummary":true,"uuid":"dd50d557-ee9d-446c-b2a2-9d987aa1dca4","timestamp":"2026-06-14T05:45:19.898Z","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"parentUuid":"dd50d557-ee9d-446c-b2a2-9d987aa1dca4","isSidechain":false,"attachment":{"type":"file","filename":"/boot/config/plugins/varaverk/Monitors/cert_monitor.sh","content":{"type":"text","file":{"filePath":"/boot/config/plugins/varaverk/Monitors/cert_monitor.sh","content":"#!/bin/bash\n# ==============================================================================================\n# ============================= Certificate Monitor ============================================\n# ==============================================================================================\n#\n# PURPOSE\n# ─────────────────────────────────────────────────────────────────────────────\n# SSL certificate expiry monitoring for all configured domains. Scheduled weekly\n# (Sunday 9am). Connects via openssl directly to each domain — not to NPM's API,\n# not to any internal check, but to the actual TLS handshake the outside world sees.\n#\n# Per domain: HEALTHY (> CERT_WARN_DAYS remaining, silent) | WARNING (≤ CERT_WARN_DAYS)\n# | CRITICAL (≤ CERT_CRIT_DAYS) | FAILED (could not connect or parse cert).\n# Notifications batched by severity — one message lists all WARNING domains, a\n# separate message lists all CRITICAL domains. Not one notification per domain.\n#\n# ==============================================================================================\n# DESIGN PRINCIPLES\n# ==============================================================================================\n#\n# Direct openssl, Not an API\n# API-based cert checks ask the certificate manager whether the cert is valid.\n# openssl checks ask the server what cert it is actually serving. These are not\n# the same question and the answers can differ. Catches: cert renewed in NPM but\n# server not reloaded (old cert still serving), wrong cert being served to external\n# clients, chain issues visible externally but not internally, NPM reporting healthy\n# while the outside world sees an expired cert.\n#\n# ==============================================================================================\n# OPERATIONAL SAFEGUARDS\n# ==============================================================================================\n#\n# Single Instance Lock\n# acquire_lock prevents concurrent runs producing duplicate notifications.\n#\n# Per-Host Domain List\n# detect_hosts() aliases HOST*_CERT_MONITOR_DOMAINS → CERT_MONITOR_DOMAINS.\n# Each server monitors its own domains only.\n#\n# Empty Array Guard\n# Warns and exits cleanly if CERT_MONITOR_DOMAINS is empty — no silent no-op.\n#\n# Connection Timeout\n# CERT_TIMEOUT caps each openssl connection attempt. One unreachable domain\n# does not block the remaining domains.\n#\n# Notification Validated\n# platform_require_cmd confirms openssl and notify script are present before use.\n#\n# ==============================================================================================\n# CONFIGURATION\n# ==============================================================================================\n#\n# host*.conf\n#\n# HOST*_CERT_MONITOR_DOMAINS\n# Domains this host monitors. Each domain and subdomain is a separate entry —\n# they have independent certs. Aliased by detect_hosts() → CERT_MONITOR_DOMAINS.\n#\n# master.conf\n#\n# CERT_WARN_DAYS\n# Days before expiry at which to send a warning notification. (default: 30)\n#\n# CERT_CRIT_DAYS\n# Days before expiry at which to send a critical notification. (default: 7)\n#\n# CERT_TIMEOUT\n# Seconds to wait per domain before declaring FAILED. (default: 10)\n#\n# ==============================================================================================\n# RUNTIME MODES\n# ==============================================================================================\n#\n# cert_monitor.sh\n# Check all configured domains and notify on WARNING, CRITICAL, or FAILED.\n# Silent when all domains are healthy.\n#\n# cert_monitor.sh --dry-run\n# Check all domains and show results. No notifications sent regardless of result.\n#\n# cert_monitor.sh --status\n# Show domain list, warning thresholds, and timeout. Then exit.\n#\n# cert_monitor.sh --log\n# Include healthy domains in per-domain output with expiry date and days remaining.\n# Problems (WARN/CRIT/FAIL) always show with their details regardless of this flag.\n#\n# ==============================================================================================\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\n\nsource \"$SCRIPT_DIR/../load_config.sh\"\n\nparse_args \"$@\"\n\n# ==============================================================================================\n# ━━━ Setup ━━━\n# ==============================================================================================\necho \"\"\necho \"━━━ $ICON_GEAR Setup ━━━\"\n\nif [[ \"$EUID\" -ne 0 ]]; then\n error \"Must be run as root\"\n exit 1\nfi\n\n# Validate openssl — required for all cert checks\nplatform_require_cmd \\\n \"$(command -v openssl 2>/dev/null || echo /usr/bin/openssl)\" \\\n \"version\" \"OpenSSL\" \\\n \"openssl\" || { error \"openssl not found — required for certificate checks\"; exit 1; }\n\n\nacquire_lock\n\n# detect_hosts() sets MY_ID and aliases HOST*_CERT_MONITOR_DOMAINS\ndetect_hosts\n\n# Empty array guard\nif [[ ${#CERT_MONITOR_DOMAINS[@]} -eq 0 ]]; then\n warn \"CERT_MONITOR_DOMAINS is empty for $MY_ID\"\n warn \"Check HOST*_CERT_MONITOR_DOMAINS in host*.conf\"\n exit 0\nfi\n\ninfo \"Domains to check: ${#CERT_MONITOR_DOMAINS[@]}\"\nlog \"$ICON_GEAR Config: warn=${CERT_WARN_DAYS}d crit=${CERT_CRIT_DAYS}d timeout=${CERT_TIMEOUT}s\"\nlog \"$ICON_GEAR Domains: ${CERT_MONITOR_DOMAINS[*]}\"\n\n[[ \"$DRY_RUN\" == true ]] && warn \"DRY RUN — results shown but no notifications sent\"\n\n# ==============================================================================================\n# ━━━ Status ━━━\n# ==============================================================================================\nif [[ \"$SHOW_STATUS\" == true ]]; then\n echo \"\"\n echo \"━━━━━ $ICON_SUMMARY STATUS ━━━━━\"\n echo \"$ICON_HOST Identity: $MY_ID ($LOCAL_SERVER_NAME)\"\n echo \"$ICON_CERT Domains: ${CERT_MONITOR_DOMAINS[*]}\"\n echo \"$ICON_WARN Warn at: ${CERT_WARN_DAYS} days remaining\"\n echo \"$ICON_ERROR Crit at: ${CERT_CRIT_DAYS} days remaining\"\n echo \"$ICON_TIME Timeout: ${CERT_TIMEOUT}s per domain\"\n echo \"$ICON_GEAR Dry Run: $DRY_RUN\"\n echo \"━━━━━━━━━━━━━━━━━━━━━━━\"\n exit 0\nfi\n\n# ==============================================================================================\n# ── CERT CHECK FUNCTION ───────────────────────────────────────────────────────────────────────\n# ==============================================================================================\n# Connects to domain:443 via openssl, extracts expiry date, calculates days remaining.\n# Returns:\n# 0 = healthy (> CERT_WARN_DAYS)\n# 1 = warning (<= CERT_WARN_DAYS)\n# 2 = critical (<= CERT_CRIT_DAYS)\n# 3 = failed (could not connect or parse)\n\ncheck_cert() {\n local domain=\"$1\"\n local port=\"${2:-443}\"\n _CERT_DAYS=\"\"\n _CERT_EXPIRY=\"\"\n\n local expiry_str\n expiry_str=$(echo | timeout \"$CERT_TIMEOUT\" openssl s_client \\\n -connect \"${domain}:${port}\" \\\n -servername \"$domain\" \\\n 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)\n\n if [[ -z \"$expiry_str\" ]]; then\n error \"$ICON_CERT $domain — could not retrieve certificate (unreachable or no TLS)\"\n return 3\n fi\n\n local expiry_epoch\n expiry_epoch=$(date -d \"$expiry_str\" +%s 2>/dev/null)\n\n if [[ -z \"$expiry_epoch\" ]]; then\n error \"$ICON_CERT $domain — could not parse expiry date: $expiry_str\"\n return 3\n fi\n\n local now days_remaining expiry_display\n now=$(date +%s)\n days_remaining=$(( (expiry_epoch - now) / 86400 ))\n expiry_display=$(date -d \"$expiry_str\" '+%Y-%m-%d' 2>/dev/null)\n _CERT_DAYS=$days_remaining\n _CERT_EXPIRY=$expiry_display\n\n if [[ \"$days_remaining\" -le \"$CERT_CRIT_DAYS\" ]]; then\n error \"$ICON_CERT $domain — CRITICAL: ${days_remaining} days remaining (expires $expiry_display)\"\n return 2\n elif [[ \"$days_remaining\" -le \"$CERT_WARN_DAYS\" ]]; then\n warn \"$ICON_CERT $domain — WARNING: ${days_remaining} days remaining (expires $expiry_display)\"\n return 1\n else\n log \"$ICON_CERT $domain — OK: ${days_remaining} days remaining (expires $expiry_display)\"\n return 0\n fi\n}\n\n# ==============================================================================================\n# ━━━ Certificate Monitor ━━━\n# ==============================================================================================\necho \"\"\necho \"━━━ $ICON_CERT Certificate Monitor — $(date '+%Y-%m-%d %H:%M:%S') ━━━\"\necho \"$ICON_HOST $MY_ID ($LOCAL_SERVER_NAME)\"\ninfo \"Warn threshold: ${CERT_WARN_DAYS} days\"\ninfo \"Crit threshold: ${CERT_CRIT_DAYS} days\"\necho \"\"\n\nSTART=$(date +%s)\nHEALTHY=()\nWARNING=()\nCRITICAL=()\nFAILED=()\ndeclare -A DOMAIN_STATUS DOMAIN_DAYS DOMAIN_EXPIRY\n\nfor domain in \"${CERT_MONITOR_DOMAINS[@]}\"; do\n [[ -z \"$domain\" ]] && continue\n check_cert \"$domain\"\n result=$?\n DOMAIN_DAYS[\"$domain\"]=\"${_CERT_DAYS:-}\"\n DOMAIN_EXPIRY[\"$domain\"]=\"${_CERT_EXPIRY:-}\"\n case $result in\n 0) HEALTHY+=(\"$domain\"); DOMAIN_STATUS[\"$domain\"]=\"OK\" ;;\n 1) WARNING+=(\"$domain\"); DOMAIN_STATUS[\"$domain\"]=\"WARN\" ;;\n 2) CRITICAL+=(\"$domain\"); DOMAIN_STATUS[\"$domain\"]=\"CRIT\" ;;\n 3) FAILED+=(\"$domain\"); DOMAIN_STATUS[\"$domain\"]=\"FAIL\" ;;\n esac\ndone\n\nEND=$(date +%s)\n\n# ── Send notifications — batched per severity ─────────────────────────────────────────────────\nif [[ \"$DRY_RUN\" == false ]]; then\n [[ ${#CRITICAL[@]} -gt 0 ]] && \\\n notify \"Certificate CRITICAL on $(hostname) — expiring within ${CERT_CRIT_DAYS} days: ${CRITICAL[*]}\" \\\n \"Certificate Monitor\" \"warning\"\n [[ ${#WARNING[@]} -gt 0 ]] && \\\n notify \"Certificate WARNING on $(hostname) — expiring within ${CERT_WARN_DAYS} days: ${WARNING[*]}\" \\\n \"Certificate Monitor\" \"warning\"\n [[ ${#FAILED[@]} -gt 0 ]] && \\\n notify \"Certificate check FAILED on $(hostname) — could not reach: ${FAILED[*]}\" \\\n \"Certificate Monitor\" \"warning\"\nfi\n\n# ==============================================================================================\n# ━━━ Summary ━━━\n# ==============================================================================================\necho \"\"\necho \"━━━━━ $ICON_SUMMARY CERTIFICATE MONITOR SUMMARY ━━━━━\"\necho \"$ICON_HOST Identity: $MY_ID ($LOCAL_SERVER_NAME)\"\necho \"$ICON_TIME Duration: $(format_duration $(( END - START )))\"\necho \"\"\necho \" $ICON_SUCCESS Healthy: ${#HEALTHY[@]}\"\n[[ ${#WARNING[@]} -gt 0 ]] && warn \"Warning: ${#WARNING[@]} — renewal recommended\"\n[[ ${#CRITICAL[@]} -gt 0 ]] && echo \"$ICON_ERROR Critical: ${#CRITICAL[@]} — ACTION REQUIRED\"\n[[ ${#FAILED[@]} -gt 0 ]] && echo \"$ICON_ERROR Failed: ${#FAILED[@]} — unreachable\"\necho \"\"\n\n# Per-domain results — problems always shown with days remaining; healthy only with --log\nfor domain in \"${CERT_MONITOR_DOMAINS[@]}\"; do\n [[ -z \"$domain\" ]] && continue\n local _days=\"${DOMAIN_DAYS[$domain]:-?}\" _exp=\"${DOMAIN_EXPIRY[$domain]:-unknown}\"\n case \"${DOMAIN_STATUS[$domain]:-UNKN}\" in\n OK) log \" $ICON_SUCCESS $domain — healthy (${_days}d, expires ${_exp})\" ;;\n WARN) warn \" $ICON_WARN $domain — warning (${_days}d, expires ${_exp})\" ;;\n CRIT) echo \" $ICON_ERROR $domain — CRITICAL (${_days}d, expires ${_exp})\" ;;\n FAIL) echo \" $ICON_ERROR $domain — unreachable\" ;;\n esac\ndone\necho \"\"\n\nif [[ \"$DRY_RUN\" == true ]]; then\n warn \"DRY RUN — no notifications sent\"\nelif [[ ${#CRITICAL[@]} -gt 0 || ${#FAILED[@]} -gt 0 ]]; then\n echo \"$ICON_ERROR Status: ACTION REQUIRED\"\nelif [[ ${#WARNING[@]} -gt 0 ]]; then\n warn \"Status: WARNINGS — renewal recommended\"\nelse\n echo \"$ICON_DONE Status: all ${#HEALTHY[@]} certs healthy ✅\"\nfi\necho \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\"\n\n# ── Write JSON status cache ───────────────────────────────────────────────────\n_CERT_CACHE_FILE=\"$SCRIPTS_DIR/State_Files/cert_status.json\"\n{\n printf '{\"checked_at\":%d,\"host\":\"%s\",\"warn_days\":%d,\"crit_days\":%d,\"dry_run\":%s,\"domains\":[\\n' \\\n \"$(date +%s)\" \"$MY_ID\" \"$CERT_WARN_DAYS\" \"$CERT_CRIT_DAYS\" \\\n \"$([[ $DRY_RUN == true ]] && echo true || echo false)\"\n _first=true\n for _d in \"${CERT_MONITOR_DOMAINS[@]}\"; do\n [[ -z \"$_d\" ]] && continue\n [[ \"$_first\" != true ]] && printf ','\n _first=false\n _days=\"${DOMAIN_DAYS[$_d]:-null}\"\n _exp=\"${DOMAIN_EXPIRY[$_d]:-}\"\n printf '{\"domain\":\"%s\",\"status\":\"%s\",\"days\":%s,\"expires\":\"%s\"}\\n' \\\n \"$_d\" \"${DOMAIN_STATUS[$_d]:-UNKN}\" \"$_days\" \"$_exp\"\n done\n printf ']}\\n'\n} > \"$_CERT_CACHE_FILE\" 2>/dev/null\n\n[[ ${#CRITICAL[@]} -gt 0 || ${#FAILED[@]} -gt 0 ]] && exit 1\nexit 0","numLines":307,"startLine":1,"totalLines":307}},"displayPath":"Monitors/cert_monitor.sh"},"type":"attachment","uuid":"3378c66a-fa88-4c43-8595-3c3dfd1a590e","timestamp":"2026-06-14T05:45:20.054Z","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"parentUuid":"3378c66a-fa88-4c43-8595-3c3dfd1a590e","isSidechain":false,"attachment":{"type":"file","filename":"/boot/config/plugins/varaverk/Monitors/zfs_memory_snapshot.sh","content":{"type":"text","file":{"filePath":"/boot/config/plugins/varaverk/Monitors/zfs_memory_snapshot.sh","content":"#!/bin/bash\n# ==============================================================================================\n# ============================= ZFS Memory Snapshot ============================================\n# ==============================================================================================\n#\n# PURPOSE\n# ─────────────────────────────────────────────────────────────────────────────\n# Weekly ZFS pool health and memory diagnostic report. Scheduled Sunday 6am —\n# first in the Sunday monitoring block, before other scripts run. Informational\n# only — system_watchdog.sh handles threshold-based intervention.\n#\n# Combines ZFS pool status, ARC statistics, Docker memory usage, and kernel\n# memory pressure into a single snapshot. In normal mode output goes to both\n# console (for User Scripts output log) and ZFS_REPORT_LOG for week-over-week\n# comparison. In --dry-run mode, console only — nothing written to the log.\n#\n# ==============================================================================================\n# OPERATIONAL MODEL\n# ==============================================================================================\n#\n# Five report sections (each skips gracefully if its data source is unavailable):\n#\n# ZFS pool health — status, state, errors per pool. Pools in\n# ZFS_REPORT_IGNORE_POOLS excluded from the report\n# (still fully monitored by unRAID — report-only exclusion).\n# ARC statistics — current ARC vs max, metadata pressure, hit rate.\n# Warns if ARC utilisation exceeds ZFS_REPORT_ARC_WARN_PCT.\n# Memory status — total, free, available RAM.\n# Warns if free < ZFS_REPORT_FREE_WARN_GB or\n# available < ZFS_REPORT_AVAIL_WARN_GB.\n# Docker memory — top ZFS_REPORT_DOCKER_TOP containers by memory usage.\n# Useful for spotting containers approaching watchdog limits.\n# Kernel pressure — vmstat snapshot (3 samples).\n#\n# ==============================================================================================\n# OPERATIONAL SAFEGUARDS\n# ==============================================================================================\n#\n# Single Instance Lock\n# acquire_lock prevents duplicate runs — zpool and docker stats are slow.\n#\n# Per-Host Pool Ignore List\n# detect_hosts() aliases HOST*_ZFS_REPORT_IGNORE_POOLS → ZFS_REPORT_IGNORE_POOLS.\n# Single-disk JBOD members excluded from report noise per server.\n#\n# ZFS Availability Guard\n# Skips pool and ARC sections gracefully if ZFS is not available on this server.\n#\n# Docker Availability Guard\n# Skips container memory section gracefully if Docker is not responding.\n#\n# Docker Stats Timeout\n# DOCKER_TIMEOUT caps docker stats calls. A hung daemon does not block the report.\n#\n# Notification Validated\n# platform_require_cmd confirms the notify script is present before use.\n#\n# ==============================================================================================\n# STATE FILES\n# ==============================================================================================\n#\n# ZFS_REPORT_LOG — /var/log/zfs-weekly-health.log (tmpfs, resets on reboot)\n# Weekly report written here for comparison across runs. Open the log to\n# see pool health trend week over week without remembering last week's values.\n# In dry-run mode, console only — nothing written.\n#\n# ==============================================================================================\n# CONFIGURATION\n# ==============================================================================================\n#\n# host*.conf\n#\n# HOST*_ZFS_REPORT_IGNORE_POOLS\n# Pools excluded from health reporting. Single-disk JBOD members generate\n# expected high-usage warnings — exclude them to reduce report noise.\n# Aliased by detect_hosts() → ZFS_REPORT_IGNORE_POOLS.\n#\n# master.conf\n#\n# ZFS_REPORT_LOG\n# Log file path for weekly reports. (default: /var/log/zfs-weekly-health.log)\n#\n# ZFS_REPORT_ARC_WARN_PCT\n# Warn if ARC is using more than this percentage of its configured max. (default: 90)\n#\n# ZFS_REPORT_FREE_WARN_GB\n# Warn if free RAM is below this threshold in GB. (default: 10)\n#\n# ZFS_REPORT_AVAIL_WARN_GB\n# Warn if available RAM is below this threshold in GB. (default: 20)\n#\n# ZFS_REPORT_DOCKER_TOP\n# Number of top Docker containers by memory usage to include. (default: 10)\n#\n# ==============================================================================================\n# RUNTIME MODES\n# ==============================================================================================\n#\n# zfs_memory_snapshot.sh\n# Generate report, write to ZFS_REPORT_LOG and console. Notify on warnings.\n#\n# zfs_memory_snapshot.sh --dry-run\n# Generate report to console only. No log write, no notifications.\n#\n# zfs_memory_snapshot.sh --status\n# Show pool ignore list and threshold configuration. Then exit.\n#\n# zfs_memory_snapshot.sh --log\n# Verbose output during report generation.\n#\n# ==============================================================================================\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\n\nsource \"$SCRIPT_DIR/../load_config.sh\"\n\nparse_args \"$@\"\n\nDOCKER_TIMEOUT=15\n\n# ==============================================================================================\n# ━━━ Setup ━━━\n# ==============================================================================================\nif [[ \"$EUID\" -ne 0 ]]; then\n error \"Must be run as root\"\n exit 1\nfi\n\n\nacquire_lock\n\n# detect_hosts() sets MY_ID and aliases HOST*_ZFS_REPORT_IGNORE_POOLS\ndetect_hosts\n\n# Build ignore pool lookup map — O(1) check per pool\ndeclare -A IGNORE_POOL_MAP\nfor pool in \"${ZFS_REPORT_IGNORE_POOLS[@]}\"; do\n [[ -n \"$pool\" ]] && IGNORE_POOL_MAP[\"$pool\"]=1\ndone\n\nlog \"Identity: $MY_ID ($LOCAL_SERVER_NAME)\"\nlog \"Ignoring pools: ${ZFS_REPORT_IGNORE_POOLS[*]:-none}\"\nlog \"$ICON_GEAR Config: arc-warn=${ZFS_REPORT_ARC_WARN_PCT}% free-warn=${ZFS_REPORT_FREE_WARN_GB}GB avail-warn=${ZFS_REPORT_AVAIL_WARN_GB}GB docker-top=${ZFS_REPORT_DOCKER_TOP}\"\n\n# Tee output to log file unless dry run\nif [[ \"$DRY_RUN\" == false ]]; then\n mkdir -p \"$(dirname \"$ZFS_REPORT_LOG\")\"\n exec > >(tee -a \"$ZFS_REPORT_LOG\") 2>&1\nfi\n\n[[ \"$DRY_RUN\" == true ]] && warn \"DRY RUN — output will not be written to log\"\n\n# ==============================================================================================\n# ━━━ Status ━━━\n# ==============================================================================================\nif [[ \"$SHOW_STATUS\" == true ]]; then\n echo \"\"\n echo \"━━━━━ $ICON_SUMMARY STATUS ━━━━━\"\n echo \"$ICON_HOST Identity: $MY_ID ($LOCAL_SERVER_NAME)\"\n echo \"$ICON_ZFS Log file: $ZFS_REPORT_LOG\"\n echo \"$ICON_ZFS ARC warn: ${ZFS_REPORT_ARC_WARN_PCT}%\"\n echo \"$ICON_MEM Free RAM warn: ${ZFS_REPORT_FREE_WARN_GB}GB\"\n echo \"$ICON_MEM Avail warn: ${ZFS_REPORT_AVAIL_WARN_GB}GB\"\n echo \"$ICON_CONTAINERS Docker top: $ZFS_REPORT_DOCKER_TOP\"\n echo \"$ICON_ZFS Ignore pools: ${ZFS_REPORT_IGNORE_POOLS[*]:-none}\"\n echo \"$ICON_GEAR Dry Run: $DRY_RUN\"\n echo \"━━━━━━━━━━━━━━━━━━━━━━━\"\n exit 0\nfi\n\n# ==============================================================================================\n# ━━━ Report ━━━\n# ==============================================================================================\nWARNINGS=()\nSTART=$(date +%s)\nDATE=$(date '+%Y-%m-%d %H:%M:%S')\n\necho \"\"\necho \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\"\necho \" $ICON_ZFS ZFS WEEKLY HEALTH REPORT — $DATE\"\necho \" $ICON_HOST $MY_ID — $LOCAL_SERVER_NAME\"\necho \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\"\n\n# ── ZFS Pool Health ───────────────────────────────────────────────────────────────────────────\necho \"\"\necho \"━━━ $ICON_ZFS ZFS Pool Health ━━━\"\n\nif ! command -v zpool >/dev/null 2>&1; then\n warn \"ZFS not available on this system — skipping pool checks\"\nelse\n # Pool status — filtered to key lines, ignoring specified pools\n CURRENT_POOL=\"\"\n while IFS= read -r line; do\n if [[ \"$line\" =~ ^[[:space:]]*pool:[[:space:]]*(.+) ]]; then\n CURRENT_POOL=\"${BASH_REMATCH[1]// /}\"\n fi\n [[ -n \"${IGNORE_POOL_MAP[$CURRENT_POOL]:-}\" ]] && continue\n echo \" $line\"\n done < <(zpool status 2>/dev/null | grep -E \"pool:|state:|status:|errors:|scan:\")\n\n echo \"\"\n\n # Pool list — filter out ignored pools\n zpool list 2>/dev/null | while IFS= read -r line; do\n if [[ \"$line\" == NAME* ]]; then\n echo \" $line\"\n continue\n fi\n pool_name=$(echo \"$line\" | awk '{print $1}')\n [[ -n \"${IGNORE_POOL_MAP[$pool_name]:-}\" ]] && continue\n echo \" $line\"\n done\n\n # Check for unhealthy non-ignored pools\n UNHEALTHY=$(zpool list -H -o name,health 2>/dev/null | \\\n while IFS=$'\\t' read -r name health; do\n [[ -n \"${IGNORE_POOL_MAP[$name]:-}\" ]] && continue\n [[ \"$health\" != \"ONLINE\" ]] && echo \"$name: $health\"\n done)\n\n if [[ -n \"$UNHEALTHY\" ]]; then\n error \"One or more ZFS pools are NOT ONLINE: $UNHEALTHY\"\n WARNINGS+=(\"ZFS pool unhealthy: $UNHEALTHY\")\n else\n echo \"All monitored ZFS pools are ONLINE ✅\"\n fi\n\n if [[ ${#ZFS_REPORT_IGNORE_POOLS[@]} -gt 0 ]]; then\n log \"Ignored pools: ${ZFS_REPORT_IGNORE_POOLS[*]}\"\n fi\nfi\n\n# ── ARC Statistics ────────────────────────────────────────────────────────────────────────────\necho \"\"\necho \"━━━ $ICON_ZFS ARC Statistics ━━━\"\n\nif [[ ! -f /proc/spl/kstat/zfs/arcstats ]]; then\n warn \"ZFS arcstats not available — skipping ARC section\"\nelse\n ARC_MAX=$(cat /sys/module/zfs/parameters/zfs_arc_max 2>/dev/null || \\\n awk '/^c_max / {print $3}' /proc/spl/kstat/zfs/arcstats)\n ARC_SIZE=$(awk '/^size / {print $3}' /proc/spl/kstat/zfs/arcstats)\n ARC_META_USED=$(awk '/^arc_meta_used / {print $3}' /proc/spl/kstat/zfs/arcstats)\n\n ARC_MAX_GB=$(awk \"BEGIN {printf \\\"%.1f\\\", $ARC_MAX / 1073741824}\")\n ARC_CUR_GB=$(awk \"BEGIN {printf \\\"%.1f\\\", $ARC_SIZE / 1073741824}\")\n ARC_META_GB=$(awk \"BEGIN {printf \\\"%.1f\\\", $ARC_META_USED / 1073741824}\")\n ARC_PCT=$(awk \"BEGIN {printf \\\"%.1f\\\", $ARC_SIZE * 100 / $ARC_MAX}\")\n ARC_PCT_INT=$(printf \"%.0f\" \"$ARC_PCT\")\n\n echo \" $ICON_ZFS ARC Max: ${ARC_MAX_GB}GB\"\n echo \" $ICON_ZFS ARC Current: ${ARC_CUR_GB}GB\"\n echo \" $ICON_ZFS ARC Meta Used: ${ARC_META_GB}GB\"\n echo \" $ICON_ZFS ARC Utilization: ${ARC_PCT}%\"\n\n if [[ \"$ARC_PCT_INT\" -ge \"$ZFS_REPORT_ARC_WARN_PCT\" ]]; then\n warn \"ARC utilization ${ARC_PCT}% — above ${ZFS_REPORT_ARC_WARN_PCT}% threshold\"\n WARNINGS+=(\"ARC high: ${ARC_PCT}%\")\n else\n log \"ARC utilization ${ARC_PCT}% — within threshold ✅\"\n fi\n\n echo \"\"\n META_MRU_GHOST=$(awk '/^mru_ghost_metadata / {print $3}' \\\n /proc/spl/kstat/zfs/arcstats 2>/dev/null || echo 0)\n META_MFU_GHOST=$(awk '/^mfu_ghost_metadata / {print $3}' \\\n /proc/spl/kstat/zfs/arcstats 2>/dev/null || echo 0)\n META_MISSES=$(awk '/^demand_metadata_misses / {print $3}' \\\n /proc/spl/kstat/zfs/arcstats 2>/dev/null || echo 0)\n\n MRU_GB=$(awk \"BEGIN {printf \\\"%.2f\\\", $META_MRU_GHOST / 1073741824}\")\n MFU_GB=$(awk \"BEGIN {printf \\\"%.2f\\\", $META_MFU_GHOST / 1073741824}\")\n\n echo \" $ICON_ZFS MRU Ghost: ${MRU_GB}GB\"\n echo \" $ICON_ZFS MFU Ghost: ${MFU_GB}GB\"\n echo \" $ICON_ZFS Metadata Misses: ${META_MISSES}\"\nfi\n\n# ── Memory Status ─────────────────────────────────────────────────────────────────────────────\necho \"\"\necho \"━━━ $ICON_MEM Memory Status ━━━\"\n\nFREE_HUMAN=$(free -h | awk '/Mem:/ {print $4}')\nAVAIL_HUMAN=$(free -h | awk '/Mem:/ {print $7}')\nTOTAL_HUMAN=$(free -h | awk '/Mem:/ {print $2}')\nFREE_GB=$(free -g | awk '/Mem:/ {print $4}')\nAVAIL_GB=$(free -g | awk '/Mem:/ {print $7}')\n\necho \" $ICON_MEM Total RAM: $TOTAL_HUMAN\"\necho \" $ICON_MEM Free RAM: $FREE_HUMAN\"\necho \" $ICON_MEM Available RAM: $AVAIL_HUMAN\"\n\nif [[ \"$FREE_GB\" -lt \"$ZFS_REPORT_FREE_WARN_GB\" ]]; then\n warn \"Free RAM ${FREE_HUMAN} — below ${ZFS_REPORT_FREE_WARN_GB}GB threshold\"\n WARNINGS+=(\"Low free RAM: ${FREE_HUMAN}\")\nelse\n log \"Free RAM ${FREE_HUMAN} — within threshold ✅\"\nfi\n\nif [[ \"$AVAIL_GB\" -lt \"$ZFS_REPORT_AVAIL_WARN_GB\" ]]; then\n warn \"Available RAM ${AVAIL_HUMAN} — below ${ZFS_REPORT_AVAIL_WARN_GB}GB threshold\"\n WARNINGS+=(\"Low available RAM: ${AVAIL_HUMAN}\")\nelse\n log \"Available RAM ${AVAIL_HUMAN} — within threshold ✅\"\nfi\n\n# ── Docker Memory ─────────────────────────────────────────────────────────────────────────────\necho \"\"\necho \"━━━ $ICON_CONTAINERS Top $ZFS_REPORT_DOCKER_TOP Docker Memory Users ━━━\"\n\nif ! command -v docker >/dev/null 2>&1; then\n warn \"Docker not available — skipping container memory section\"\nelse\n timeout \"$DOCKER_TIMEOUT\" docker stats --no-stream \\\n --format \"table {{.Name}}\\t{{.MemUsage}}\\t{{.MemPerc}}\" \\\n 2>/dev/null | head -n $(( ZFS_REPORT_DOCKER_TOP + 1 )) | \\\n while IFS= read -r line; do\n echo \" $line\"\n done\nfi\n\n# ── Kernel Pressure ───────────────────────────────────────────────────────────────────────────\necho \"\"\necho \"━━━ $ICON_GEAR Kernel Pressure ━━━\"\n\nif ! command -v vmstat >/dev/null 2>&1; then\n warn \"vmstat not available — skipping kernel pressure section\"\nelse\n vmstat 1 3 2>/dev/null | while IFS= read -r line; do\n echo \" $line\"\n done\nfi\n\nEND=$(date +%s)\n\n# ── Summary ───────────────────────────────────────────────────────────────────────────────────\necho \"\"\necho \"━━━━━ $ICON_SUMMARY ZFS REPORT SUMMARY ━━━━━\"\necho \"$ICON_HOST Identity: $MY_ID ($LOCAL_SERVER_NAME)\"\necho \"$ICON_TIME Duration: $(format_duration $(( END - START )))\"\necho \"$ICON_ZFS Log: $ZFS_REPORT_LOG\"\n[[ ${#ZFS_REPORT_IGNORE_POOLS[@]} -gt 0 ]] && \\\n log \"Ignored: ${ZFS_REPORT_IGNORE_POOLS[*]}\"\necho \"\"\n\nif [[ ${#WARNINGS[@]} -eq 0 ]]; then\n echo \"$ICON_DONE All checks within thresholds ✅\"\nelse\n echo \"$ICON_WARN Warnings: ${#WARNINGS[@]}\"\n for w in \"${WARNINGS[@]}\"; do\n echo \" $ICON_WARN $w\"\n done\n notify \"ZFS weekly report on $(hostname) — ${#WARNINGS[@]} warning(s): ${WARNINGS[*]}\" \\\n \"ZFS Report\" \"warning\"\nfi\necho \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\"\n\n[[ ${#WARNINGS[@]} -gt 0 ]] && exit 1\nexit 0","numLines":359,"startLine":1,"totalLines":359}},"displayPath":"Monitors/zfs_memory_snapshot.sh"},"type":"attachment","uuid":"7863b00e-dca3-4592-9770-1041c61af7e8","timestamp":"2026-06-14T05:45:20.045Z","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"parentUuid":"7863b00e-dca3-4592-9770-1041c61af7e8","isSidechain":false,"attachment":{"type":"file","filename":"/boot/config/plugins/varaverk/Tools/smart_long_test.sh","content":{"type":"text","file":{"filePath":"/boot/config/plugins/varaverk/Tools/smart_long_test.sh","content":"#!/bin/bash\n# ==============================================================================================\n# ============================= SMART Extended Self-Test =======================================\n# ==============================================================================================\n#\n# PURPOSE\n# ─────────────────────────────────────────────────────────────────────────────\n# Runs a SMART extended (long) self-test on all drives (or a specific drive),\n# waits for completion, and reports results. Extended tests do a full read-scan\n# of every sector — catches bad sectors that the short test skips. Monthly cadence\n# via the monthly maintenance orchestrator.\n#\n# NVMe drives are included — smartctl supports NVMe self-test via the same\n# -t long interface (NVMe 1.3+ specification).\n#\n# ==============================================================================================\n# OPERATIONAL MODEL\n# ==============================================================================================\n#\n# Starts long self-tests on all drives sequentially (NOT in parallel) to avoid\n# saturating I/O. One drive at a time: start, wait for completion, move to next.\n# Sequential order keeps test duration predictable and avoids thermal stacking.\n#\n# Drives already running a self-test are skipped. If a previous test did not\n# finish (interrupted mid-way), it is reported and the drive is re-tested.\n#\n# Each test is polled every 60 seconds. Typical durations:\n# HDD 2–4 TB : 60–120 min\n# HDD 8–12 TB: 90–180 min\n# SSD any : 5–15 min\n# NVMe any : 5–10 min\n#\n# ==============================================================================================\n# OPERATIONAL SAFEGUARDS\n# ==============================================================================================\n#\n# Single Instance Lock\n# acquire_lock prevents concurrent test runs — one long-test pass per server.\n#\n# Sequential Execution\n# Drives tested one at a time. Parallel long-tests thrash I/O and inflate temps.\n#\n# SIGTERM Trap\n# Poll loop exits cleanly on signal. Tests continue running in drive firmware.\n#\n# Tool Validation\n# platform_require_cmd confirms smartctl is present before use.\n#\n# Silent When Clean\n# Only failures and warnings produce notifications.\n#\n# ==============================================================================================\n# CONFIGURATION\n# ==============================================================================================\n#\n# host*.conf\n#\n# HOST*_SMART_IGNORE_DRIVES\n# Drives skipped in SMART testing. Aliased by detect_hosts() →\n# SMART_IGNORE_DRIVES. Typically includes the boot USB flash drive.\n#\n# master.conf\n#\n# ==============================================================================================\n# RUNTIME MODES\n# ==============================================================================================\n#\n# smart_long_test.sh\n# Run extended self-test on all drives not in SMART_IGNORE_DRIVES.\n#\n# smart_long_test.sh /dev/sda\n# Run extended self-test on a specific drive. Bypasses the ignore list.\n#\n# smart_long_test.sh --status\n# Show last self-test result for all drives and exit.\n#\n# smart_long_test.sh --dry-run\n# Show which drives would be tested. No tests started.\n#\n# smart_long_test.sh --log\n# Verbose progress output during polling.\n#\n# ==============================================================================================\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\n\nsource \"$SCRIPT_DIR/../load_config.sh\"\n\nparse_args \"$@\"\n\nTARGET_DRIVE=\"${PARSED_ARGS[0]:-}\"\n\n# ==============================================================================================\n# ━━━ Setup ━━━\n# ==============================================================================================\nif [[ \"$EUID\" -ne 0 ]]; then\n error \"Must be run as root\"\n exit 1\nfi\n\nplatform_require_cmd \\\n \"$(command -v smartctl 2>/dev/null || echo /usr/bin/smartctl)\" \\\n \"--version\" \"smartmontools\" \\\n \"smartctl\" || {\n error \"smartctl not found — install smartmontools\"\n notify \"SMART long test failed on $(hostname) — smartmontools not installed\" \\\n \"SMART Long Test\" \"warning\"\n exit 1\n }\n\n\nacquire_lock\n\ndetect_hosts\nget_unraid_temp_thresholds\n\nlog \"Identity: $MY_ID ($LOCAL_SERVER_NAME)\"\nlog \"Ignore: ${SMART_IGNORE_DRIVES[*]:-none}\"\n\n[[ \"$DRY_RUN\" == true ]] && warn \"DRY RUN — no tests will be started\"\n\ntrap 'warn \"SMART long test script interrupted — tests continue in drive firmware\"; exit 0' \\\n SIGTERM SIGINT\n\n# ==============================================================================================\n# ── Build drive list ──────────────────────────────────────────────────────────────────────────\n# ==============================================================================================\n_build_drive_list() {\n local drives=()\n if [[ -n \"$TARGET_DRIVE\" ]]; then\n if [[ ! -e \"$TARGET_DRIVE\" ]]; then\n error \"Drive not found: $TARGET_DRIVE\"\n exit 1\n fi\n drives=(\"$TARGET_DRIVE\")\n else\n for drive in /dev/sd? /dev/nvme?; do\n [[ ! -e \"$drive\" ]] && continue\n local drive_name\n drive_name=$(basename \"$drive\")\n local ignored=false\n for ignore in \"${SMART_IGNORE_DRIVES[@]:-}\"; do\n [[ \"$drive_name\" == \"$ignore\" ]] && ignored=true && break\n done\n [[ \"$ignored\" == true ]] && { log \"Skipping $drive_name (SMART_IGNORE_DRIVES)\"; continue; }\n if ! smartctl -i \"$drive\" 2>/dev/null | grep -q \"SMART support is: Enabled\"; then\n log \"Skipping $drive_name — SMART not enabled\"\n continue\n fi\n drives+=(\"$drive\")\n done\n fi\n echo \"${drives[@]}\"\n}\n\n# ==============================================================================================\n# ━━━ Status ━━━\n# ==============================================================================================\nif [[ \"$SHOW_STATUS\" == true ]]; then\n echo \"\"\n echo \"━━━━━ $ICON_SUMMARY SMART LONG TEST STATUS ━━━━━\"\n echo \"$ICON_HOST Identity: $MY_ID ($LOCAL_SERVER_NAME)\"\n echo \"\"\n for drive in /dev/sd? /dev/nvme?; do\n [[ ! -e \"$drive\" ]] && continue\n drive_name=$(basename \"$drive\")\n local_result=$(smartctl -l selftest \"$drive\" 2>/dev/null | \\\n grep -m1 \"Extended\" | awk '{print $NF}')\n ignored=false\n for ignore in \"${SMART_IGNORE_DRIVES[@]:-}\"; do\n [[ \"$drive_name\" == \"$ignore\" ]] && ignored=true && break\n done\n if [[ \"$ignored\" == true ]]; then\n echo \" $ICON_WARN $drive_name — ignored\"\n else\n echo \" $ICON_SMART $drive_name — last extended: ${local_result:-no result}\"\n fi\n done\n echo \"\"\n echo \" Ignored: ${SMART_IGNORE_DRIVES[*]:-none}\"\n echo \"━━━━━━━━━━━━━━━━━━━━━━━\"\n exit 0\nfi\n\n# ==============================================================================================\n# ━━━ Run Extended Tests — Sequential ━━━\n# ==============================================================================================\nread -r -a DRIVES_TO_TEST <<< \"$(_build_drive_list)\"\n\nif [[ ${#DRIVES_TO_TEST[@]} -eq 0 ]]; then\n warn \"No drives to test — all may be on ignore list or SMART not enabled\"\n exit 0\nfi\n\necho \"\"\necho \"━━━ $ICON_SMART SMART Extended Self-Test — $MY_ID — $(date '+%Y-%m-%d %H:%M:%S') ━━━\"\necho \"$ICON_HOST ${#DRIVES_TO_TEST[@]} drive(s) to test — running sequentially\"\necho \"\"\n\nWINDOW_START=$(date +%s)\nDRIVES_OK=()\nDRIVES_FAIL=()\nDRIVES_SKIP=()\n\nfor drive in \"${DRIVES_TO_TEST[@]}\"; do\n drive_name=$(basename \"$drive\")\n echo \"━━━ $ICON_SMART $drive_name ━━━\"\n\n if [[ \"$DRY_RUN\" == true ]]; then\n warn \"DRY RUN — would run extended self-test on $drive_name\"\n echo \"\"\n continue\n fi\n\n # Check if test already in progress\n if smartctl -l selftest \"$drive\" 2>/dev/null | grep -q \"Self-test routine in progress\"; then\n warn \"$drive_name — self-test already in progress — skipping\"\n DRIVES_SKIP+=(\"$drive_name\")\n echo \"\"\n continue\n fi\n\n # Start extended test\n if ! smartctl -t long \"$drive\" >/dev/null 2>&1; then\n error \"$drive_name — failed to start extended self-test\"\n DRIVES_FAIL+=(\"$drive_name\")\n echo \"\"\n continue\n fi\n echo \" Extended test started on $drive_name\"\n\n # Poll until complete\n DRIVE_START=$(date +%s)\n while true; do\n sleep 60\n\n STATUS_LINE=$(smartctl -l selftest \"$drive\" 2>/dev/null | grep -m1 \"Extended\")\n\n if echo \"$STATUS_LINE\" | grep -q \"Self-test routine in progress\"; then\n PCT=$(echo \"$STATUS_LINE\" | grep -oE \"[0-9]+% of test remaining\" || true)\n log \"$drive_name — test in progress ${PCT:+($PCT)}\"\n continue\n fi\n\n # Test finished — determine result\n DRIVE_ELAPSED=$(format_duration $(( $(date +%s) - DRIVE_START )))\n if echo \"$STATUS_LINE\" | grep -iq \"Completed without error\\|Successful\"; then\n echo \" $ICON_DONE $drive_name — extended test passed ✅ ($DRIVE_ELAPSED)\"\n DRIVES_OK+=(\"$drive_name\")\n elif echo \"$STATUS_LINE\" | grep -iq \"Failed\\|failed\"; then\n FAIL_DETAIL=$(echo \"$STATUS_LINE\" | awk '{print $NF}')\n error \"$drive_name — extended test FAILED — $FAIL_DETAIL ($DRIVE_ELAPSED)\"\n DRIVES_FAIL+=(\"$drive_name\")\n elif [[ -z \"$STATUS_LINE\" ]]; then\n warn \"$drive_name — no test result found — may not support extended test\"\n DRIVES_SKIP+=(\"$drive_name\")\n else\n warn \"$drive_name — unexpected result: $STATUS_LINE ($DRIVE_ELAPSED)\"\n DRIVES_SKIP+=(\"$drive_name\")\n fi\n echo \"\"\n break\n done\ndone\n\nWINDOW_END=$(date +%s)\n\n# ==============================================================================================\n# ━━━ Summary ━━━\n# ==============================================================================================\necho \"━━━━━ $ICON_SUMMARY SMART LONG TEST SUMMARY ━━━━━\"\necho \"$ICON_HOST Identity: $MY_ID ($LOCAL_SERVER_NAME)\"\necho \"$ICON_TIME Duration: $(format_duration $(( WINDOW_END - WINDOW_START )))\"\necho \"$ICON_SMART Drives: ${#DRIVES_TO_TEST[@]} tested\"\n[[ ${#DRIVES_OK[@]} -gt 0 ]] && echo \"$ICON_DONE Passed: ${DRIVES_OK[*]}\"\n[[ ${#DRIVES_FAIL[@]} -gt 0 ]] && echo \"$ICON_ERROR Failed: ${DRIVES_FAIL[*]}\"\n[[ ${#DRIVES_SKIP[@]} -gt 0 ]] && echo \"$ICON_WARN Skipped: ${DRIVES_SKIP[*]}\"\necho \"\"\n\nif [[ \"$DRY_RUN\" == true ]]; then\n warn \"DRY RUN — no tests started\"\nelif [[ ${#DRIVES_FAIL[@]} -gt 0 ]]; then\n echo \"$ICON_ERROR Status: FAILURES — ${DRIVES_FAIL[*]}\"\n notify \"SMART long test failures on $(hostname) ($MY_ID) — drives: ${DRIVES_FAIL[*]}\" \\\n \"SMART Long Test\" \"warning\"\nelif [[ ${#DRIVES_OK[@]} -gt 0 ]]; then\n echo \"$ICON_DONE Status: all ${#DRIVES_OK[@]} drive(s) passed ✅\"\nelse\n warn \"Status: no results — all drives skipped\"\nfi\necho \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\"\n\n[[ ${#DRIVES_FAIL[@]} -gt 0 ]] && exit 1\nexit 0\n","numLines":295,"startLine":1,"totalLines":295}},"displayPath":"Tools/smart_long_test.sh"},"type":"attachment","uuid":"cb26d262-48c2-4d0d-b8db-42ce204dfe8d","timestamp":"2026-06-14T05:45:21.724Z","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"parentUuid":"cb26d262-48c2-4d0d-b8db-42ce204dfe8d","isSidechain":false,"attachment":{"type":"compact_file_reference","filename":"/boot/config/plugins/varaverk/Partnership/ssh_setup.sh","displayPath":"Partnership/ssh_setup.sh"},"type":"attachment","uuid":"3926e7dd-74e9-4f3d-8464-6772676ec9f8","timestamp":"2026-06-14T05:45:21.745Z","userType":"external","entrypoint":"cli","cwd":"/boot/config/plugins/varaverk","sessionId":"685e6c5b-62c1-40bd-9cfd-2c9f7e15c50f","version":"2.1.177","gitBranch":"HEAD","slug":"mutable-sniffing-naur"} {"parentUuid":"3926e7dd-74e9-4f3d-8464-6772676ec9f8","isSidechain":false,"attachment":{"type":"file","filename":"/boot/config/plugins/varaverk/Transcodes/ramdisk_setup.sh","content":{"type":"text","file":{"filePath":"/boot/config/plugins/varaverk/Transcodes/ramdisk_setup.sh","content":"#!/bin/bash\n# ==============================================================================================\n# ================================= Ramdisk Setup ==============================================\n# ==============================================================================================\n#\n# PURPOSE\n# ─────────────────────────────────────────────────────────────────────────────\n# Creates the tmpfs ramdisk, SSD fallback directory, transcode symlink, and\n# pre-creates transcoding-temp on the ramdisk. Run once at array start via\n# array_started.sh (System_Essentials/). Idempotent — already-mounted ramdisk\n# reports status and exits cleanly. Always resets the symlink to the ramdisk\n# on boot, ensuring a clean state regardless of what state it was in before\n# shutdown.\n#\n# ==============================================================================================\n# OPERATIONAL MODEL\n# ==============================================================================================\n#\n# Creates four things in order:\n# 1. RAMDISK_PATH — tmpfs mount (size: HOST*_RAMDISK_SIZE ceiling, not a reservation)\n# 2. TRANSCODE_SSD — SSD fallback directory and transcoding-temp inside it\n# 3. TRANSCODE_LINK — symlink reset to RAMDISK_PATH (clean state at every boot)\n# 4. transcoding-temp/ inside RAMDISK_PATH — pre-created before Emby starts\n#\n# The transcoding-temp pre-creation is critical: if it doesn't exist on the ramdisk\n# when Emby starts, Emby searches all accessible paths for an existing one and finds\n# the SSD fallback version — routing all sessions there until Emby restarts.\n#\n# Initialises /tmp/transcode_state.db with current target and flip counters.\n# /tmp resets on reboot — correct, transcode state should not persist across boots.\n#\n# ==============================================================================================\n# OPERATIONAL SAFEGUARDS\n# ==============================================================================================\n#\n# Root Required\n# mount and symlink creation require root.\n#\n# Single Instance Lock\n# acquire_lock prevents duplicate runs at array start.\n#\n# Idempotent Mount Check\n# If RAMDISK_PATH is already a mountpoint, reports status and exits cleanly\n# without attempting to remount or changing anything.\n#\n# Notification Validated\n# platform_require_cmd confirms the notify script is present before use.\n#\n# Silent on Success\n# Startup script runs on every boot — no output when healthy.\n#\n# ==============================================================================================\n# CONFIGURATION\n# ==============================================================================================\n#\n# host*.conf\n#\n# HOST*_RAMDISK_SIZE\n# tmpfs ceiling (e.g. 10G). Must change together with WARN_GB and LOW_GB.\n# Aliased by detect_hosts() → RAMDISK_SIZE.\n#\n# HOST*_RAMDISK_WARN_GB\n# Usage level at which transcode_manager.sh flips symlink to SSD.\n#\n# HOST*_RAMDISK_LOW_GB\n# Usage level at which transcode_manager.sh flips back to ramdisk.\n#\n# HOST*_TRANSCODE_SSD\n# SSD fallback directory path.\n# Aliased by detect_hosts() → TRANSCODE_SSD.\n#\n# master.conf\n#\n# TRANSCODE_LINK\n# Symlink path Emby uses as its transcode directory. Must match the path\n# configured in Emby's transcoding settings.\n#\n# TRANSCODE_CHMOD / TRANSCODE_OWNER\n# Permissions applied to both ramdisk and SSD directories. (default: 755 / nobody:users)\n#\n# TRANSCODE_STATE_FILE\n# Override state file path. (default: ${STATE_DIR}/transcode_state.db)\n#\n# ==============================================================================================\n# STATE FILES\n# ==============================================================================================\n#\n# TRANSCODE_STATE_FILE (default: ${STATE_DIR}/transcode_state.db)\n# Current symlink target + flip count tracking. Lives in STATE_DIR\n# (ephemeral on Unraid — resets on reboot correctly).\n#\n# ==============================================================================================\n# RUNTIME MODES\n# ==============================================================================================\n#\n# ramdisk_setup.sh\n# Normal setup run. Called by array_started.sh at boot.\n#\n# ramdisk_setup.sh --dry-run\n# Show what would be created without creating anything.\n#\n# ramdisk_setup.sh --status\n# Show current ramdisk mount state, symlink target, and SSD directory state.\n#\n# ramdisk_setup.sh --log\n# Verbose output showing each creation step.\n#\n# ==============================================================================================\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\n\nsource \"$SCRIPT_DIR/../load_config.sh\"\n\nparse_args \"$@\"\n\n# ==============================================================================================\n# ━━━ Setup ━━━\n# ==============================================================================================\nif [[ \"$EUID\" -ne 0 ]]; then\n error \"Must be run as root — mount and symlink require root\"\n exit 1\nfi\n\n\nacquire_lock\n\n# detect_hosts() sets MY_ID and aliases RAMDISK_SIZE, TRANSCODE_SSD etc.\ndetect_hosts\n\nlog \"Identity: $MY_ID ($LOCAL_SERVER_NAME)\"\nlog \"Ramdisk: $RAMDISK_PATH ($RAMDISK_SIZE)\"\nlog \"Fallback: $TRANSCODE_SSD\"\nlog \"Symlink: $TRANSCODE_LINK\"\n\n[[ \"$DRY_RUN\" == true ]] && warn \"DRY RUN — no changes will be made\"\n\n# ==============================================================================================\n# ━━━ Status ━━━\n# ==============================================================================================\nif [[ \"$SHOW_STATUS\" == true ]]; then\n echo \"\"\n echo \"━━━━━ $ICON_SUMMARY STATUS ━━━━━\"\n echo \"$ICON_HOST Identity: $MY_ID ($LOCAL_SERVER_NAME)\"\n echo \"$ICON_RAM Ramdisk path: $RAMDISK_PATH\"\n echo \"$ICON_RAM Ramdisk size: $RAMDISK_SIZE\"\n echo \"$ICON_RAM Warn at: ${RAMDISK_WARN_GB}GB\"\n echo \"$ICON_RAM Flip at: ${RAMDISK_LOW_GB}GB\"\n echo \"$ICON_DISK SSD fallback: $TRANSCODE_SSD\"\n echo \"$ICON_LINK Symlink: $TRANSCODE_LINK\"\n echo \"$ICON_GEAR Owner: $TRANSCODE_OWNER\"\n echo \"$ICON_GEAR Mode: $TRANSCODE_CHMOD\"\n echo \"\"\n\n if mountpoint -q \"$RAMDISK_PATH\" 2>/dev/null; then\n USAGE=$(df -BG \"$RAMDISK_PATH\" | awk 'NR==2 {print $3}')\n AVAIL=$(df -BG \"$RAMDISK_PATH\" | awk 'NR==2 {print $4}')\n echo \" $ICON_RAM Ramdisk: mounted — $USAGE used / $AVAIL available ✅\"\n else\n echo \" $ICON_RAM Ramdisk: NOT mounted\"\n fi\n\n if [[ -L \"$TRANSCODE_LINK\" ]]; then\n TARGET=$(readlink \"$TRANSCODE_LINK\")\n echo \" $ICON_LINK Symlink: $TRANSCODE_LINK → $TARGET\"\n else\n echo \" $ICON_LINK Symlink: not set\"\n fi\n\n echo \"━━━━━━━━━━━━━━━━━━━━━━━\"\n exit 0\nfi\n\n# ==============================================================================================\n# ━━━ Ramdisk ━━━\n# ==============================================================================================\necho \"\"\necho \"━━━ $ICON_RAM Ramdisk — $MY_ID ━━━\"\nlog \"$ICON_RAM Path: $RAMDISK_PATH\"\nlog \"$ICON_RAM Size: $RAMDISK_SIZE\"\necho \"\"\n\nSTART=$(date +%s)\nSETUP_SUCCESS=true\n\nif mountpoint -q \"$RAMDISK_PATH\" 2>/dev/null; then\n USAGE=$(df -BG \"$RAMDISK_PATH\" | awk 'NR==2 {print $3}')\n AVAIL=$(df -BG \"$RAMDISK_PATH\" | awk 'NR==2 {print $4}')\n log \"Ramdisk already mounted — $USAGE used / $AVAIL available\"\n log \"Skipping mount — verifying symlink and permissions\"\nelse\n if [[ \"$DRY_RUN\" == true ]]; then\n warn \"DRY RUN — would create $RAMDISK_PATH\"\n warn \"DRY RUN — would mount tmpfs ${RAMDISK_SIZE} at $RAMDISK_PATH\"\n else\n log \"Creating ramdisk mount point: $RAMDISK_PATH\"\n mkdir -p \"$RAMDISK_PATH\" || {\n error \"Failed to create $RAMDISK_PATH\"\n notify \"Ramdisk setup failed on $(hostname) ($MY_ID) — could not create mount point\" \\\n \"Ramdisk Setup\" \"warning\"\n exit 1\n }\n\n log \"Mounting tmpfs ${RAMDISK_SIZE} at $RAMDISK_PATH...\"\n if mount -t tmpfs -o size=\"$RAMDISK_SIZE\" tmpfs \"$RAMDISK_PATH\"; then\n warn \"Ramdisk mounted — ${RAMDISK_SIZE} at $RAMDISK_PATH ✅\"\n else\n error \"Failed to mount ramdisk at $RAMDISK_PATH\"\n notify \"Ramdisk setup failed on $(hostname) ($MY_ID) — mount failed\" \\\n \"Ramdisk Setup\" \"warning\"\n exit 1\n fi\n fi\nfi\n\n# ==============================================================================================\n# ━━━ SSD Fallback ━━━\n# ==============================================================================================\necho \"\"\necho \"━━━ $ICON_DISK SSD Fallback ━━━\"\n\nif [[ \"$DRY_RUN\" == true ]]; then\n warn \"DRY RUN — would create SSD fallback: $TRANSCODE_SSD\"\nelse\n if [[ -d \"$TRANSCODE_SSD\" ]]; then\n log \"SSD fallback already exists: $TRANSCODE_SSD\"\n else\n log \"Creating SSD fallback directory: $TRANSCODE_SSD\"\n if mkdir -p \"$TRANSCODE_SSD\"; then\n log \"SSD fallback created: $TRANSCODE_SSD ✅\"\n else\n error \"Failed to create SSD fallback: $TRANSCODE_SSD\"\n SETUP_SUCCESS=false\n fi\n fi\nfi\n\n# ==============================================================================================\n# ━━━ Symlink ━━━\n# ==============================================================================================\necho \"\"\necho \"━━━ $ICON_LINK Symlink ━━━\"\n\nif [[ \"$DRY_RUN\" == true ]]; then\n warn \"DRY RUN — would set $TRANSCODE_LINK → $RAMDISK_PATH\"\nelse\n if [[ -L \"$TRANSCODE_LINK\" ]]; then\n CURRENT_TARGET=$(readlink \"$TRANSCODE_LINK\")\n if [[ \"$CURRENT_TARGET\" == \"$RAMDISK_PATH\" ]]; then\n log \"Symlink already points to ramdisk — no change needed ✅\"\n else\n log \"Updating symlink: $CURRENT_TARGET → $RAMDISK_PATH\"\n ln -sfn \"$RAMDISK_PATH\" \"$TRANSCODE_LINK\" || {\n error \"Failed to update symlink\"\n SETUP_SUCCESS=false\n }\n fi\n elif [[ -e \"$TRANSCODE_LINK\" ]]; then\n warn \"$TRANSCODE_LINK exists but is not a symlink — removing and replacing\"\n rm -rf \"$TRANSCODE_LINK\"\n ln -sfn \"$RAMDISK_PATH\" \"$TRANSCODE_LINK\" || {\n error \"Failed to create symlink\"\n SETUP_SUCCESS=false\n }\n else\n log \"Creating symlink: $TRANSCODE_LINK → $RAMDISK_PATH\"\n mkdir -p \"$(dirname \"$TRANSCODE_LINK\")\"\n ln -sfn \"$RAMDISK_PATH\" \"$TRANSCODE_LINK\" || {\n error \"Failed to create symlink\"\n SETUP_SUCCESS=false\n }\n fi\n\n [[ \"$SETUP_SUCCESS\" == true ]] && log \"Symlink: $TRANSCODE_LINK → $RAMDISK_PATH ✅\"\nfi\n\n# ==============================================================================================\n# ━━━ Transcoding-temp Directory ━━━\n# ==============================================================================================\n# Pre-created inside ramdisk so Emby always finds it there at session start.\n# Without this Emby creates it at its own first-writable path — which may be\n# SSD even when the symlink points at the ramdisk — locking all sessions onto SSD.\necho \"\"\necho \"━━━ $ICON_GEAR Transcoding Temp Directory ━━━\"\n\nTRANSCODE_TEMP_DIR=\"${RAMDISK_PATH}/transcoding-temp\"\n\nif [[ \"$DRY_RUN\" == true ]]; then\n warn \"DRY RUN — would create $TRANSCODE_TEMP_DIR\"\nelse\n if [[ -d \"$TRANSCODE_TEMP_DIR\" ]]; then\n log \"transcoding-temp already exists on ramdisk\"\n else\n if mkdir -p \"$TRANSCODE_TEMP_DIR\"; then\n log \"Created transcoding-temp on ramdisk ✅\"\n else\n error \"Failed to create transcoding-temp on ramdisk\"\n SETUP_SUCCESS=false\n fi\n fi\n\n if [[ -d \"$TRANSCODE_TEMP_DIR\" ]]; then\n chmod \"$TRANSCODE_CHMOD\" \"$TRANSCODE_TEMP_DIR\"\n chown \"$TRANSCODE_OWNER\" \"$TRANSCODE_TEMP_DIR\"\n log \"Permissions set on transcoding-temp ($TRANSCODE_CHMOD $TRANSCODE_OWNER)\"\n fi\nfi\n\n# ==============================================================================================\n# ━━━ Permissions ━━━\n# ==============================================================================================\necho \"\"\necho \"━━━ $ICON_GEAR Permissions ━━━\"\n\nif [[ \"$DRY_RUN\" == true ]]; then\n warn \"DRY RUN — would apply $TRANSCODE_CHMOD $TRANSCODE_OWNER to $RAMDISK_PATH and $TRANSCODE_SSD\"\nelse\n for path in \"$RAMDISK_PATH\" \"$TRANSCODE_SSD\"; do\n if [[ -d \"$path\" ]]; then\n chmod \"$TRANSCODE_CHMOD\" \"$path\"\n chown \"$TRANSCODE_OWNER\" \"$path\"\n log \"Permissions set: $path ($TRANSCODE_CHMOD $TRANSCODE_OWNER)\"\n fi\n done\nfi\n\n# ==============================================================================================\n# ━━━ Initialise State File ━━━\n# ==============================================================================================\nif [[ \"$DRY_RUN\" == false ]]; then\n STATE_FILE=\"${TRANSCODE_STATE_FILE:-${STATE_DIR:-/tmp}/transcode_state.db}\"\n NOW=$(date +%s)\n cat > \"$STATE_FILE\" <