Travel assistant for NanoClaw: byAir flight notifications (delay, gate, connection risk, inbound aircraft delay, time-to-leave, arrival logistics), traffic-aware drive planning for in-person meetings (auto drive blocks + leave-by traffic rechecks), travel-booking gap checks, and nightly TripIt sync. Per-chat overlay plugin.
72
90%
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
This skill is an action router — pick the step that matches the user's intent and execute only that step. Do not run other steps; do not parallelize.
Available actions:
data.events)precheck_internal_error)Silence rule: produces NO user-visible output of its own. The precheck delegates wake-payload composition to skills/flight-assist/sync_tripit.py, which emits wake_agent: true only on tracked-flight added/removed events and on the sync outage events (byair_unreachable, byair_recovered, sync_internal_error, sync_internal_recovered).
skills/sync-tripit/precheck.py:_should_sync_now() is the sole authority on whether a 5-min fire becomes a byAir round-trip.skills/flight-assist/sync_tripit.py + skills/flight-assist/state.py.This step fires when the wake carries a non-empty data.events list. Compose one notification per event with the flight-assist reason table:
Skill(skill: "tessl__flight-assist")Use its Step 3 table and its composition rules. Source-level events carry flight_id: null and need no per-flight state. Finish here.
This step fires on an operator request while troubleshooting, never on a wake. A precheck that failed to execute emits {"wake_agent": false, "data": {"reason": "precheck_internal_error"}} and wakes nobody; the operator finds that reason in the run log. A sync that fails repeatedly does wake the agent, through Step 1's sync_internal_error event.
Inspect the agent-runner host log for the Python traceback the script wrote to stderr, then match against:
Corrupt state file — skills/flight-assist/state.py raises StateError on JSON corruption or schema-version mismatch. Inspect and remove:
python3 -m json.tool /workspace/state/flight-assist/active-flights.json
ls -la /workspace/state/flight-assist/flight-*.json
# remove any file that fails parse — next sync repopulates from byAir
rm /workspace/state/flight-assist/<bad-file>.jsonMissing flight-assist mount — the precheck imports from the co-shipped flight-assist skill. If only sync-tripit is installed, the precheck raises FileNotFoundError at import. Verify:
ls /home/node/.claude/skills/tessl__flight-assist/sync_tripit.pyIf absent, both skills must be reinstalled from the same plugin (jbaruch/nanoclaw-travel).
byAir subprocess timeout — the precheck enforces a budget on skills/flight-assist/sync_tripit.py (see skills/sync-tripit/precheck.py, _SYNC_SUBPROCESS_TIMEOUT constant). Persistent timeouts mean byAir is degraded; the next cadence cycle retries. Check the diagnostic log for the sync_subprocess_timeout reason:
grep sync_subprocess_timeout /workspace/state/flight-assist/precheck.log 2>/dev/null | tail -5Filesystem permissions — read access to /workspace/state/flight-assist/. Verify the mount:
ls -la /workspace/state/flight-assist/Finish here. Verify the fix by waiting for the next 5-min cadence fire and reading the host log for either a clean wake_agent: false (no precheck_internal_error payload) or a successful sync_tripit delegation. Do not retry inline; the next fire retries naturally.
state_dir()active-flights.json and per-flight state shapes.tessl-plugin
rules
skills
check-travel-bookings
drive-engine
expertflyer
flight-assist
scripts
nightly-travel-sync
sync-tripit