From claude-reachy-mini
Triage logs from a Reachy Mini app session and classify the observed failure against the canonical Common Issues catalogue from `reachy-mini/app-logging`. Activate on phrasings like "triage app logs", "warum läuft die App nicht", "classify this failure", "diagnose this crash", "check what went wrong with the app", "log triage for Reachy Mini app". Do not activate for on-device test lifecycles (use the `reachy-mini-on-device` agent), production-host triage on provisioned hosts (use `host-provisioning`), behavior or motion development (use `reachy-mini-sdk` and `app-scaffold`), or hardware recovery (use Pollen's hardware-troubleshooting docs).
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-reachy-mini:app-log-triageThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Spec: <https://github.com/nolte/claude-reachy-mini/blob/develop/spec/claude/app-log-triage/de.md> (DE canonical) / [`en.md`](https://github.com/nolte/claude-reachy-mini/blob/develop/spec/claude/app-log-triage/en.md).
Spec: https://github.com/nolte/claude-reachy-mini/blob/develop/spec/claude/app-log-triage/de.md (DE canonical) / en.md.
Knowledge base: https://github.com/nolte/claude-reachy-mini/blob/develop/spec/reachy-mini/app-logging/de.md — every classification, log pattern, and recovery hint in this skill mirrors that spec; this skill operationalises the knowledge.
Use this skill when the developer wants to:
reachy-mini-on-devicereachy-app@<slug>.service on a provisioned device) → reachy-mini/host-provisioningreachy-mini-sdk and app-scaffoldreachy-mini-on-device (handles big volumes with artefact persistence)| Field | Required | Default | Notes |
|---|---|---|---|
platform | yes (auto-derive when missing) | — | wireless / lite / simulation. Auto-derive via mDNS lookup on reachy-mini.local, local daemon-port probe, or a clarifying question to the user. |
run_mode | no | direct | daemon-hosting / direct / pytest. The default reflects reachy-mini/app-logging's recommended development path (direct mode keeps app and SDK loggers in the same terminal). |
since | no | 5 min ago | journalctl --since-format time anchor for the log window. |
host | no | reachy-mini.local | Hostname for wireless; per Pollen's mDNS convention. |
symptom | no | — | Free-text description of the observed failure (e.g. "robot doesn't move", "connection refused", "audio fails"). Sharpens classification. |
connection-refused directly — the lack of a daemon is the diagnosis.reachy-mini-on-device agent.reachy-mini/app-logging § Common Issues, never invented. On no match, return the pseudo class unclassified and propose the verify-basics-first sanity check.wireless: SSH probe (ssh pollen@<host> true) plus systemctl status reachy-mini-daemon.service for the daemon heartbeatlite: local daemon presence (pgrep -f reachy-mini-daemon) or daemon port probe (lsof -i :8000)simulation: no pre-flight needed (same process as the developer)connection-refused and stop; do not attempt log capture.since would pull more than two hours of logs, confirm with the user before tailing.Source-of-truth tables live in reachy-mini/app-logging § Plattform-Profile. Apply the row that matches the inputs.
The default HTTP-noise filter is applied to every capture that actually runs:
... | grep -v "uvicorn\|GET \|POST "
Same convention as the reachy-mini-on-device agent's watch-and-sample step.
In daemon-hosting mode, read the three logger trees jointly (reachy_mini.*, reachy_mini.daemon.*, reachy_mini.apps.manager.runner) — an app action typically leaves traces across more than one tree.
Match against the canonical Common Issues classes from reachy-mini/app-logging § Common-Issues-Triage-Katalog. The expected log pattern per class is the spec's text verbatim — do not paraphrase.
| Class | Expected log pattern (anchor) |
|---|---|
connection-refused | ConnectionRefusedError in the app logger tree, or no daemon heartbeat in journald |
app-lock-held | RobotAppLock: rejected — held by <app_name> via the reachy_mini.daemon.robot_app_lock logger |
no-motion | set_target calls in the app logger without errors, but no motion; SDK logger raises no warning |
jerky-motion | usually no clean log trace — almost always a code-path issue (single-owner loop violation; goto_target mixed with set_target) |
import-error | ModuleNotFoundError: reachy_mini in the app subprocess stderr → surfaces as runner.error in the daemon log |
audio-fail | Failed to initialize media server in the daemon logger; possibly a GStreamer warning |
motors-different-states | sporadic effort / position out-of-range warnings in the daemon logger |
When several classes match, return the most specific one with the highest confidence and list the alternatives as candidates with lower confidence. On no match, return the pseudo class unclassified and propose the sanity check (next section).
Motion-anomaly cross-classification. When the triage class points at motion-side root causes (jerky-motion, motors-different-states, or a connection-refused after a previous start-app), the report SHOULD also map the symptom to one of the four canonical motion-anomaly classes from reachy-mini/motion-anomaly-detection — this skill is the post-hoc consumer of that spec. Concretely: connection-refused after start-app plus a ConnectionError: Could not connect to daemon on localhost traceback in the app log is the post-hoc fingerprint of Class A (head-against-body self-collision); a kinematics exception traceback is Class D (Stewart-limit / IK-unsolvable). The skill emits the anomaly-event-record in the binding shape (class, phase=post-hoc, severity, detected_at, verification_basis) alongside the standard triage classification.
On class unclassified, the first recovery step in the report is always Pollen's verify-basics-first heuristic — run examples/minimal_demo.py against the same daemon, in the same run mode. The skill recommends; the developer executes. If the sanity check fails too, the failure belongs to a different class than the original symptom suggested.
On class no-motion, additionally recommend the sanity check as the first step — when minimal_demo.py itself produces no motion, the problem is connectivity / hardware, not app logic.
Markdown with these sections, in order:
high / medium / low).For class motors-different-states, point at Pollen's safe-torque.md directly. For class app-lock-held, extract the holding app name from the match pattern and surface it in the report. For class unclassified, include the examples/minimal_demo.py command and a one-liner asking the developer to report the result back.
reachy-mini/app-loggingreachy-mini-on-devicereachy-mini-sdkreachy-mini/host-provisioningapp-scaffoldExternal canonical sources (cited via the knowledge spec, not duplicated here):
debugging.md — Common Issues inventory, verify-basics-first heuristicsafe-torque.md — recovery pattern for motor state mismatchesexamples/minimal_demo.py — canonical sanity checkProvides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
npx claudepluginhub nolte/claude-reachy-mini --plugin claude-reachy-mini