Health check for TTS and Telegram bot subsystems. TRIGGERS - health check, bot health, kokoro health
Scanned 9/2/2026
Install to Claude Code
npx -y skills add terrylica/cc-skills --skill health --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Health?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/terrylica-health-dc3e1c53)More formats (shields.io, HTML) on the badges page.
---
name: health
description: Health check for TTS and Telegram bot subsystems. TRIGGERS - health check, bot health, kokoro health
allowed-tools: Read, Bash, Glob, AskUserQuestion
---
# System Health Check
Run a comprehensive 10-subsystem health check across the TTS engine, Telegram bot, and supporting infrastructure. Produces a pass/fail report table with actionable fix recommendations.
> **Platform**: macOS (Apple Silicon)
> **Self-Evolving Skill**: This skill improves through use. If instructions are wrong, parameters drifted, or a workaround was needed — fix this file immediately, don't defer. Only update for real, reproducible issues.
## When to Use This Skill
- Diagnose why TTS or Telegram bot is not working
- Verify system readiness after bootstrap or configuration changes
- Routine health check before a demo or presentation
- Investigate intermittent failures in the TTS pipeline
- Check for stale locks, zombie processes, or orphaned temp files
## Requirements
- Bun runtime (for bot process)
- Python 3.14 with Kokoro venv at `~/.local/share/kokoro/.venv`
- Telegram bot token in `~/.claude/.secrets/ccterrybot-telegram`
- mise.toml configured in `~/.claude/automation/claude-telegram-sync/`
## Workflow Phases
### Phase 1: Setup
Load environment variables from mise to ensure `BOT_TOKEN` and other secrets are available:
```bash
cd ~/.claude/automation/claude-telegram-sync && eval "$(mise env)"
```
### Phase 2: Run All 10 Health Checks
Execute each check and collect results. Each check returns `[OK]` or `[FAIL]` with a brief diagnostic message.
#### Check 1: Bot Process
```bash
pgrep -la 'bun.*src/main.ts'
```
Pass if exactly one process is found. Fail if zero or more than one.
#### Check 2: Telegram API
```bash
BOT_TOKEN=$(cat ~/.claude/.secrets/ccterrybot-telegram)
curl -s "https://api.telegram.org/bot${BOT_TOKEN}/getMe" | jq .ok
```
Pass if response is `true`. Fail if `false`, null, or connection error.
#### Check 3: Kokoro venv
```bash
[[ -d ~/.local/share/kokoro/.venv ]]
```
Pass if the directory exists.
#### Check 4: MLX-Audio Import
```bash
~/.local/share/kokoro/.venv/bin/python -c "from mlx_audio.tts.utils import load_model; print('MLX OK')"
```
Pass if import succeeds with exit code 0.
#### Check 5: Apple Silicon
```bash
[[ "$(uname -m)" == "arm64" ]]
```
Pass if architecture is arm64. MLX-Audio requires Apple Silicon (M1+).
#### Check 6: Lock State
```bash
LOCK_FILE="/tmp/kokoro-tts.lock"
if [[ -f "$LOCK_FILE" ]]; then
LOCK_PID=$(cat "$LOCK_FILE")
LOCK_AGE=$(( $(date +%s) - $(stat -f %m "$LOCK_FILE") ))
if kill -0 "$LOCK_PID" 2>/dev/null; then
if [[ $LOCK_AGE -gt 30 ]]; then
echo "STALE (PID $LOCK_PID alive but lock age ${LOCK_AGE}s > 30s threshold)"
else
echo "ACTIVE (PID $LOCK_PID, age ${LOCK_AGE}s)"
fi
else
echo "ORPHANED (PID $LOCK_PID not running, age ${LOCK_AGE}s)"
fi
else
echo "NO LOCK (idle)"
fi
```
Pass if no lock or active lock with age under 30s. Fail if stale or orphaned.
#### Check 7: Audio Processes
```bash
pgrep -x afplay
pgrep -x say
```
Informational check. Reports count of running audio processes. Not a pass/fail -- just reports state.
#### Check 8: Secrets File
```bash
[[ -f ~/.claude/.secrets/ccterrybot-telegram ]]
```
Pass if the file exists and is non-empty.
#### Check 9: Stale WAV Files
```bash
find /tmp -maxdepth 1 -name "kokoro-tts-*.wav" -mmin +5 2>/dev/null
```
Pass if no stale WAV files found (older than 5 minutes). Fail if orphaned WAVs exist.
#### Check 10: Shell Symlinks
```bash
[[ -L ~/.local/bin/tts_kokoro.sh ]] && readlink ~/.local/bin/tts_kokoro.sh
```
Pass if symlink exists and points to a valid target within the plugin.
### Phase 3: Report
Display results as a table:
```
| # | Subsystem | Status | Detail |
|---|------------------|--------|---------------------------------|
| 1 | Bot Process | [OK] | PID 12345 |
| 2 | Telegram API | [OK] | Bot @ccterrybot responding |
| 3 | Kokoro venv | [OK] | ~/.local/share/kokoro/.venv |
| 4 | MLX-Audio Import | [OK] | mlx_audio module loaded |
| 5 | Apple Silicon | [OK] | arm64 (MLX Metal) |
| 6 | Lock State | [OK] | No lock (idle) |
| 7 | Audio Processes | [OK] | 0 afplay, 0 say |
| 8 | Secrets File | [OK] | ccterrybot-telegram present |
| 9 | Stale WAVs | [OK] | No orphaned files |
|10 | Shell Symlinks | [OK] | tts_kokoro.sh -> plugin script |
```
### Phase 4: Summary and Recommendations
- Report total pass/fail counts (e.g., "9/10 checks passed")
- For each failure, recommend the appropriate fix or skill to invoke
## TodoWrite Task Templates
```
1. [Setup] Load environment variables from mise in bot source directory
2. [Run] Execute all 10 health checks and collect results
3. [Report] Display results table with [OK]/[FAIL] status for each subsystem
4. [Summary] Show pass/fail counts (e.g., 9/10 passed)
5. [Recommend] Suggest fixes for any failures, referencing relevant skills
```
## Post-Change Checklist
- [ ] All 10 checks executed (none skipped due to early exit)
- [ ] Results table displayed with consistent formatting
- [ ] Each failure has an actionable recommendation
- [ ] No sensitive values (tokens, secrets) exposed in output
---
## Troubleshooting
| Issue | Cause | Solution |
| --------------------------------- | ----------------------------------- | ----------------------------------------------------------------------- |
| All checks fail | Environment not set up | Run `full-stack-bootstrap` skill first |
| Only Kokoro checks fail (3-4) | Kokoro venv missing or broken | Run `kokoro-install.sh --health` for detailed report |
| Lock stuck (check 6) | Stale lock from crashed TTS process | Check lock age and PID; see `diagnostic-issue-resolver` skill |
| Bot process missing (check 1) | Bot crashed or was never started | See `bot-process-control` skill |
| Telegram API fails (check 2) | Token expired or network issue | Verify token in `~/.claude/.secrets/ccterrybot-telegram`; check network |
| Not Apple Silicon (check 5) | Running on Intel Mac or Linux | MLX-Audio requires Apple Silicon (M1+) |
| Stale WAVs found (check 9) | TTS process crashed mid-generation | Clean with `rm /tmp/kokoro-tts-*.wav`; investigate crash cause |
| Shell symlinks missing (check 10) | Bootstrap incomplete | Re-run symlink setup from `full-stack-bootstrap` skill |
## Reference Documentation
- [Health Checks](./references/health-checks.md) - Detailed description of each check, failure meaning, and remediation
- [Evolution Log](./references/evolution-log.md) - Change history for this skill
## Post-Execution Reflection
After this skill completes, reflect before closing the task:
0. **Locate yourself.** — Find this SKILL.md's canonical path (Glob for this skill's name) before editing. All corrections target THIS file and its sibling references/ — never other documentation.
1. **What failed?** — Fix the instruction that caused it. If it could recur, add it as an anti-pattern.
2. **What worked better than expected?** — Promote it to recommended practice. Document why.
3. **What drifted?** — Any script, reference, or external dependency that no longer matches reality gets fixed now.
4. **Log it.** — Every change gets an evolution-log entry with trigger, fix, and evidence.
Do NOT defer. The next invocation inherits whatever you leave behind.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!