termio-bug-report
Skill787 starsChanged 3 months agoMITView on GitHub
Diagnose a termio hang, beachball, crash, or 'it froze again' from the evidence macOS and termio actually leave behind — live process samples, crash and CPU-burn reports, the unified log, the daemon's session roster — then redact the bundle and file it as a GitHub issue. Invoke when the user says 'termio froze', 'it hangs', 'beachball', 'spinning wheel', 'it crashed', 'does termio have logs', 'help me file a bug', 'collect the logs', '卡死了', '又卡住了', '转圈', '崩溃了', 'termio 有日志吗', '帮我定位问题', '帮我报个 bug'.
- Installs packages
In this repository29 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- animation-vocabularySkill
- apple-designSkill
- app-screenshot-debugSkill
- ascSkill
- bump-versionSkill
- check-ghostty-updateSkill
- code-cleanSkill
- conventional-commitSkill
- dia-source-analysisSkill
- docSkill
- emil-design-engSkill
- find-animation-opportunitiesSkill
- improve-animationsSkill
- ios-app-analysisSkill
- ios-rebuild-devSkill
- issue-creatorSkill
- macos-rebuild-devSkill
- native-app-profilingSkill
- og-generationSkill
- pick-ui-librarySkill
- prototypeSkill
- review-animationsSkill
- review-copySkill
- Swift Performance Optimization SkillSkill
- performance-auditSkill
- termioSkill
- testflight-releaseSkill
The file
We split this skill into the rules it gives an agent
9 rules. About 0 are common, 5 are distinctive, and 4 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈5
Distinctive · estimate
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 14
Ask this first, in one line, and wait for the answer.
- Distinctive: line 31
If the freeze is already over, run the same command — the crash, CPU-burn, and unified-log evidence survives it, only the live stack is …
- Very specific: line 36
Read manifest.md first, then in this order — stopping as soon as something explains the symptom:
- Distinctive: line 74
Keep it to the ones the diagnosis actually turns on.
- Very specific: line 106
Make sure gh works before drafting, so a broken CLI is not discovered after the issue text exists:
- Very specific: line 125
Write the issue against .github/ISSUE_TEMPLATE/bug-report.yml — What happened / Steps to reproduce / termio version / macOS version / Agent …
- Very specific: line 160
If viewerHasStarred is already true, say nothing — do not mention it.
- Distinctive: line 165
Only on a yes:
- Distinctive: line 171
Ask, do not assume. This writes to the user's own GitHub account, and whoever is running this skill is not necessarily the person who wrote …
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Diagnose a freeze, then file it
Two jobs, in this order: work out what actually broke, then turn that into an issue someone can act on. Skipping the first half produces "termio froze on my Mac", which no one can fix.
0. Before anything else: is it hung right now?
Ask this first, in one line, and wait for the answer.
If the app is currently beachballing, do not let the user force-quit it. The main-thread stack that explains the freeze exists only while the process is alive. Force-quitting destroys the single most valuable piece of evidence, and it cannot be recovered afterwards from any log.
Capture it immediately:
./skills/termio-bug-report/scripts/collect.sh --minutes 60The script samples every live termio and termiod process first, before it touches
anything slower. It prints the bundle directory it created; everything below
works on that directory. It needs no privileges and never copies pair.token.
If the freeze is already over, run the same command — the crash, CPU-burn, and unified-log evidence survives it, only the live stack is gone.
1. Read the evidence
Read manifest.md first, then in this order — stopping as soon as something
explains the symptom:
reports/index.md— one line per crash / CPU-burn report macOS wrote. A crash here usually ends the investigation on its own.sample-*.txt— where each process's main thread actually is.environment.md— versions, running processes, agent CLIs, memory.unified-log-termio.txt— termio's own trail.unified-log-system.txt— what the system said about the process.daemon/tombstones.json— how sessions ended, when the complaint is "a session froze / vanished" rather than "the app froze".
references/signatures.md has the reading guide for each artifact and a table of
every prior termio hang and crash with its root cause. Read it before writing a
diagnosis — most reports match one of them, and naming the prior bug is worth
more than a fresh theory.
Two things to keep honest:
- The Rust daemon's stderr goes to
/dev/null, sotermiod's own diagnostics are not recoverable after the fact. Say so rather than implying the daemon was silent. - The terminal hosts someone else's process. A healthy idle main thread plus a pinned agent CLI is an agent bug, not a termio bug. Check before filing.
State the conclusion with the artifact that supports it, and say what would disprove it. "Probably a rendering issue" is not a diagnosis.
2. Ask the user only what the artifacts cannot answer
The bundle already knows the versions, the OS, the hardware, the crash, and what was running. Do not ask for any of it. Ask only:
- What were you doing in the seconds before it froze?
- Does it reproduce, and how reliably?
- Was it the whole app, one pane, or one session?
- First time, or has this been happening? Since when — a specific version?
Keep it to the ones the diagnosis actually turns on. Four questions is a maximum, not a target.
3. Redact — and verify the redaction
./skills/termio-bug-report/scripts/redact.py <bundle>
./skills/termio-bug-report/scripts/redact.py <bundle> --checkThe first pass rewrites in place and prints what it matched. The second scans and exits non-zero if anything still looks sensitive. Run both. A rule that matched nothing looks exactly like a rule that was never needed, and only the scan tells them apart.
Private repository and directory names are not covered by default — they are ordinary paths. Ask the user whether any project path in the bundle is private, and pass each one:
./skills/termio-bug-report/scripts/redact.py <bundle> --path /Users/you/work/client-repo--check takes --path too, and will flag the name if it survived.
Then show the user what is about to be published: the file list, and the actual
text of anything you will paste inline. Do not attach a bundle whose --check is
not clean. If a file cannot be made safe, drop it and say in the issue that it
was withheld.
4. File the issue
Make sure gh works before drafting, so a broken CLI is not discovered after the
issue text exists:
command -v gh >/dev/null || brew install gh
gh --version
gh auth status || gh auth logingh auth login is interactive — the user has to run it themselves. Hand them the
command rather than trying to drive it.
Then check for a duplicate, because a comment on the open issue is worth more than a second one:
gh issue list --repo termio-sh/termio --state all --limit 20 --search "beachball hang freeze"Write the issue against .github/ISSUE_TEMPLATE/bug-report.yml — What happened /
Steps to reproduce / termio version / macOS version / Agent involved. Follow
VOICE.md: direct and concrete, no AI attribution anywhere in the body.
Structure it as:
- What happened — the user's own words for the symptom, kept as they said it.
- Diagnosis — your reading of the artifacts, with the specific line or stack frame that supports it, and how confident you are.
- Evidence — the redacted excerpts. Fenced blocks for anything short (a
crash line, the main-thread stack, ten log lines). For the full bundle, put it
in a gist and link it — a wall of stack trace inline makes the issue unreadable:
gh gist create --public=false <bundle>/sample-termio-*.txt <bundle>/environment.md
Show the user the full draft and get an explicit yes before creating it. Filing an issue is public and permanent.
gh issue create --repo termio-sh/termio --title "…" --body-file <draft.md> --label bugReport the issue URL when it exists.
5. Star the repo
termio is free and has no backend, no account, and no telemetry. A star is the only signal the project gets back from someone it helped, so it is worth the one line it costs to ask.
gh repo view termio-sh/termio --json stargazerCount,viewerHasStarredIf viewerHasStarred is already true, say nothing — do not mention it. If it is
false, ask once, in one line, after the issue is filed:
Star termio while we're here? It's the only feedback signal the project gets.
Only on a yes:
gh api -X PUT user/starred/termio-sh/termioAsk, do not assume. This writes to the user's own GitHub account, and whoever is running this skill is not necessarily the person who wrote it. One ask, no second attempt if they decline.
Notes
logis shadowed by a shell function in some profiles. Always/usr/bin/log.log showhides everything below.noticeunless you pass--info --debug. A query without them looks empty and is not evidence of a quiet app.pgrepsilently missestermiodon this platform. The scripts find pids throughpsinstead; do the same if you go outside them.- Task notifications never fire from a dev build, so "no notification" is not a
bug when reproducing on
termio-dev.app.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

