Skip to content
cccskills
FreePublished on GitHub

runtime-triage

Triage a JellyRock runtime failure (crash, freeze, unexpected behavior) from a pasted Roku log / crash report end-to-end. Parses the log, classifies the failure category (render-thread-crash / task-crash / api-error / registry-corruption / nav-error / unknown), maps to the probable code area, writes a handoff packet to `.claude/handoffs/`, and continues into the investigation contract at sibling [`INVESTIGATION.md`](INVESTIGATION.md). No dedup check: each runtime log is unique. Use when you have a Roku BrightScript log, debug-console output, or a crash report.

The English summary is being prepared. Showing the original description.

jellyrock/jellyrock46 stars(GitHub 46 + cccskills 0)

Run score Not tested

See how to install

Files included (2)

  • SKILL.md7.0 KB
  • INVESTIGATION.md9.1 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

/runtime-triage: paste a Roku log, get a focused investigation

One workflow, preparation then investigation, run end to end on opus in the main conversation with no sub-agents. The mechanical preparation (Steps 1 to 6) extracts the failure signal and writes a handoff packet to .claude/handoffs/, so the work survives compaction, can resume in another session, and shows in /catchup. Then the main conversation follows the investigation contract in INVESTIGATION.md.

There is no dedup step: each runtime log is unique enough that scanning earlier handoffs costs more than it finds.

Inputs

The arguments are the pasted log: debug-console output, a crash report, or a specific description of the failure. With no arguments, ask for the paste.

Step 1: Extract the failure signal

A paste can run to hundreds of lines; the investigation needs the few lines around the error. Walk the paste:

  1. Find the line that names the error. Roku prints a BrightScript runtime error as <message> (runtime error &hXX) in pkg:/<file>(<line>), for example 'Dot' Operator attempted with invalid BrightScript Component or interface reference. (runtime error &hec). A component error starts BRIGHTSCRIPT: ERROR:. Other signals: an HTTP status (401, 500) on a Jellyfin path, or a Task that stopped mid-run.
  2. Keep 5 to 10 lines of context above and below it.
  3. Note the pkg:/ path and line the error names, and the backtrace if the paste has one. The log names the transpiled .brs; the source is the .bs (or .xml) of the same name, and the line is a .brs line. Map it with the .brs.map beside the file in build/, from a build of the same commit. A release build ships without maps: crash-reports.md says how /crash-report rebuilds the tagged version.

With no error line, the paste may describe a behavioral failure (the UI didn't respond as expected, no crash). Treat the whole paste as the signal then.

Step 2: Classify

Match the signal to one category:

CategoryTells
render-thread-crashA runtime error &hXX line naming a component file or a function the render thread runs
task-crashA runtime error &hXX line in a Task's file, or a Task that stopped without delivering
api-errorAn HTTP 4xx or 5xx, a timeout, an unreachable server, a Jellyfin API path
registry-corruptionMigration console lines (Migrating …, No … migration needed), or a setting reading its default when the user had changed it
nav-errorNo crash, but confused UI state: focus stuck, Back does nothing, the OSD doesn't hide, a dialog won't close
unknownNone of the above fits

If several fit, pick the most specific. State the category once, briefly. With unknown, the investigation starts wider.

Step 3: Identify the probable area

Map the failing path or symbol to an area, with the area map in /issue-triage's ## This repo:

Paths or names in the logProbable area
pkg:/components/video/, VideoPlayerView, OSD, Trickplaycomponents/video
pkg:/components/data/, SceneManager, ContentNodecomponents/data
pkg:/source/api/, ApiTask, ApiClient, apiPoolsource/api
pkg:/source/utils/, registry, config, translationsource/utils
migrations.bs, migration linessource
any other pkg:/components/ pathcomponents

When the log names no path (often the case for a nav error), apply /issue-triage's keyword map to the user's description.

Step 4: Gather the first files to read

For the probable area, list two to five files to read first:

# Files in the area
git ls-files <area>/ | head -20

# Recent commits there (a regression often follows a recent change)
git log --oneline -10 -- <area>/

# The architecture doc that covers it
grep -lE "^  - <area>" docs/architecture/*.md

For a crash, the file the error line names is almost always the place to start. For api-error, the source/api/ file that builds the request and the Task in components/api/ that runs it. For registry-corruption, source/migrations.bs and the setting's read and write sites.

Step 5: Build the handoff packet

Give the packet YAML frontmatter, the same shape the other triage skills use in .claude/handoffs/:

---
created: <ISO-8601 UTC timestamp from `date -u +%Y-%m-%dT%H:%M:%SZ`>
target: runtime
branch: <git rev-parse --abbrev-ref HEAD>
sha: <git rev-parse --short HEAD>
cited-files:
  - <path-1>
  - <path-2>
---

Runtime failure
Source: pasted log / crash report

Classification: <category>
Probable area: <area>
Initial file context:
  - <path> (<function or whole file>): <why it is relevant, in one line>
  - ...

Failure signal (relevant log excerpt):
  <the error line and 5 to 10 lines around it>

Full pasted log (untruncated):
<the paste, verbatim>

Step 6: Write the handoff and continue into the investigation

  1. Take the timestamps: date +%Y%m%d-%H%M%S for the file name and date -u +%Y-%m-%dT%H:%M:%SZ for the frontmatter.

  2. Write the packet to .claude/handoffs/runtime-<YYYYMMDD-HHMMSS>.md.

  3. Print one confirmation line in this shape:

    Saved the handoff: .claude/handoffs/runtime-<timestamp>.md (classification: <X>, probable area: <Y>, <count> files cited). Now following INVESTIGATION.md; adjust scope freely.

  4. Then continue at once into INVESTIGATION.md. Don't stop or wait.

When not to use

  • The paste is a CI failure log: use /ci-triage.
  • The paste is a GitHub issue body with a log in it: use /issue-triage <N>, whose investigation reads the log.
  • The paste is a description with no log or error: the investigation can work from a description, but a log narrows it a lot. Ask for one if it exists.

Sub-agent invocation

To run only the preparation from a sub-agent (rare), the parent passes Read .claude/skills/runtime-triage/SKILL.md and follow Steps 1-6 for the pasted log <pasted-log>; write the handoff file but stop before INVESTIGATION.md, and report the handoff path so the parent can decide what next in the Agent prompt. The sub-agent this section starts runs only the preparation: INVESTIGATION.md needs the user.

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

Session-start briefing: where did I leave off, what is in flight, what needs attention. One tested script reads git, the journal (followups, running work, cadences) and tracked projects and prints every fixed-threshold check that fires; JellyRock's own aggregator adds open PRs, high-engagement bugs, recent bug reports, current-branch CI, pending handoffs, open upstream-watch issues (Jellyfin releases and release candidates, Roku OS), recent ADRs, tech debt and architecture-doc staleness. Ends with one Suggested next move that hands off to /log, /done, /issue-triage, /runtime-triage, /ci-triage or /server-upgrade. Mandated by AGENTS.md's catchup-discipline rule: run at the start of any genuine new session, after a multi-day gap, or whenever you ask what the state of the world is.

The English summary is being prepared. Showing the original description.

jellyrock/jellyrock46Updated Oct 26, 2026

Diagnose a failed CI workflow run and fix it the /snag way. A tested read-only script fetches the run, reports every failed job and step with the log region around its errors (not the post-job cleanup), and classifies each against this repo's gates.tsv, printing the banner a gate carries when its obvious fix is the wrong one. Then: re-run only what is transient, reproduce locally, find the root cause, and show one decision screen; the chosen fix is built test-first and committed on a fix branch, never pushed. Use when a CI run failed on a pull request or on the default branch.

The English summary is being prepared. Showing the original description.

jellyrock/jellyrock46Updated Oct 26, 2026

DEPRECATED, replaced by the `enrich` phase built into /crash-report. The old flow filed crash issues first and enriched them one by one afterward. The new flow (stage, then enrich, then file) pulls the dashboard backtrace before filing, so issues are born complete and architectural-class crashes go to their epic instead of becoming standalone issues. Do not invoke it for new work: run /crash-report and paste the backtraces during its enrich step. It stays only as a redirect; the `enrich-issue` script subcommand still exists as a legacy escape hatch for a crash issue filed before the change.

The English summary is being prepared. Showing the original description.

jellyrock/jellyrock46Updated Oct 26, 2026

Process a Roku weekly crash-report CSV (or a zip holding one or more CSVs) into tracked GitHub issues and architectural-epic evidence, enriching before filing (stage, then enrich, then file). STAGE parses and filters the CSV, groups by pkg-path signature, builds each cited app version in a temporary git worktree, maps the transpiled `.brs` line back to the source `.bs` line, runs the GitHub dedup search, and writes a local worksheet where every crash starts pending; a mechanism hint (task-launch, network, other) orders which to pull first but never authorizes a file. ENRICH folds in the per-crash backtraces you paste from Roku's dashboard (a 7-day window, one click per crash, no bulk export), extracts each `&hNN` exception code, and routes every crash to a disposition (nothing files or aggregates without a backtrace): `file` (a scoped bug becomes a new per-signature [crash] issue, born enriched), `aggregate` (a known architectural class: `&h29` big-library too-many-task-threads, `&h23` render-thread execution timeouts, the `&hec` init `m.global.constants` race; upserted as one flat record comment per `file·function·line·version` onto the class epic, never a standalone issue), or `watch` (accepted noise, a spike comment only). FILE performs the GitHub writes (create, comment or reopen for scoped bugs; the epic record upsert for architectural classes) and writes a run-summary handoff. Dedup-aware and idempotent. Use when a fresh Roku crash CSV arrives (weekly). A deep dive on one crash goes to `/issue-triage <N>` after filing.

The English summary is being prepared. Showing the original description.

jellyrock/jellyrock46Updated Oct 26, 2026

Draft a GitHub issue body for the JellyRock repo from a Reddit/Discord post or free-form bug report and submit it via forge.sh. Reads the YAML form templates under .github/ISSUE_TEMPLATE/ to know which fields are required, fills them by extracting from the input, asks for any missing required fields, validates the body matches the chosen template's schema, then runs forge.sh issue create with the auto-labels the template defines. Use when you have a user report (paste from anywhere) and want to formalize it into a properly-structured GitHub issue.

The English summary is being prepared. Showing the original description.

jellyrock/jellyrock46Updated Oct 26, 2026

Walk a major dependency-version bump (a Renovate major PR, possibly a grouped one carrying several deps, or a package you name) through JellyRock's major-bump SOP so the judgment steps run the same way every time. Resolves each package and its from and to versions, fetches the upstream changelog/migration guide for that range, classifies the breaking changes, greps the codebase for the call sites those breaks actually hit, runs the mechanical gate that fits the dependency's type (a runtime BrightScript lib: validate, build, lint:bs, then test:unit and test:rta on a device; JS or Node tooling: test:scripts, then run the affected script; GitHub Actions: the PR's own CI plus a trace of the conditional paths CI doesn't exercise), and returns a go/no-go with any required migration surfaced (and applied on request). Majors never automerge (the org Renovate config), so this is the human-review path. Use when a Renovate major PR appears, or before bumping a dependency's major version by hand. Not for patch or minor bumps (those automerge after a soak) or for Jellyfin server releases (use /server-upgrade).

The English summary is being prepared. Showing the original description.

jellyrock/jellyrock46Updated Oct 26, 2026

See all skills by jellyrock

Report a problem with this skill