Personal entertainment-media skills for NanoClaw: Trakt watch-history sync, TV-show and audiobook recommendations, watchlist release checks, YouTube channel-comment digests, and Audible backup — with a weekly cadence companion. NanoClaw per-chat overlay tile.
73
91%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Process steps in order. Do not skip ahead.
A failed step does not stop the run: surface it and continue. Track each step as ran or failed for Step 6.
A step failed when its script exits non-zero or its Skill(...) invocation fails, and also when the inner skill reports an operational error itself: it surfaced an error message, or its own closing line reports an error instead of a clean or surfaced run.
Run silently. Each inner skill handles its own surfacing. The wrapper adds no surfaces beyond cadence-cursor management.
Fire-time precheck (scripts/precheck-entertainment-sync.py) gates wake-ups by the weekly cadence cap. See references/cadence-rationale.md.
Run the in-container fetch script (routes through the OneCLI gateway, writes /workspace/group/trakt-history.json on success):
python3 /home/node/.claude/skills/tessl__trakt-watch-history/scripts/trakt-watch-history.pySilent on success. Report on error (stdout {"error": ...} / non-zero exit) or total_shows: 0 (if sync hasn't run yet, skip silently).
If the script fails, surface its stdout/stderr verbatim via mcp__nanoclaw__send_message, mark Step 1 failed, and proceed to Step 2. Otherwise mark Step 1 ran and proceed to Step 2.
Invoke Skill(skill: "tessl__check-watchlist"). Inner skill notifies on released shows; silent otherwise.
If invocation fails, surface verbatim via mcp__nanoclaw__send_message and mark Step 2 failed. Proceed to Step 3.
Invoke Skill(skill: "tessl__recommend-shows") even when Step 1 failed. Sends on good matches; silent otherwise.
If invocation fails, surface via mcp__nanoclaw__send_message and mark Step 3 failed. Proceed to Step 4.
Invoke Skill(skill: "tessl__audible-backup"). Inner skill reports new books or errors; silent otherwise.
If invocation fails, surface via mcp__nanoclaw__send_message and mark Step 4 failed. Proceed to Step 5.
Invoke Skill(skill: "tessl__recommend-books"). Sends on good matches; silent otherwise.
If invocation fails, surface via mcp__nanoclaw__send_message and mark Step 5 failed. Proceed to Step 6.
Run it with the failed steps accumulated in Steps 1-5 (none when every step ran):
python3 /home/node/.claude/skills/tessl__entertainment-sync/scripts/summarize-run.py \
--date "$(date -u +%F)" --failed nonenone with the failed step numbers as a comma list when any step failed, e.g. --failed 1,3--surfaced when any inner skill sent the operator somethingStdout: {"advance_cursor": bool, "internal": "<internal>…</internal>"}. Proceed to Step 7.
Exit 2 (bad date or step list): surface stderr inside a short Russian sentence, skip Step 7, and emit <internal>entertainment-sync ran <utc_date>: partial — summary failed</internal> as your final turn text. Finish here.
Run only when Step 6 returned "advance_cursor": true; otherwise proceed to Step 8 and leave the cursor unchanged.
python3 /home/node/.claude/skills/tessl__entertainment-sync/scripts/stamp-cursor.pyAtomic-writes /workspace/group/state/entertainment-sync-cursor.json with {"schema_version": 1, "last_run": "<now UTC ISO Z>"}. Stdout: {"status": "stamped", "last_run": "<iso>", "cursor_path": "<path>"}. Proceed to Step 8 on exit 0.
Exit 2 (write failed): surface stderr quoted inside a short Russian sentence, and emit <internal>entertainment-sync ran <utc_date>: partial — cursor not stamped</internal> as your final turn text. Finish here.
Emit Step 6's internal line verbatim as your final turn text. The wrapper adds no user-facing output. Finish here.