用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/fossasia/voxbento --skill incident-investigation命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Use this skill to review pull requests for VoxBento. Covers correctness, security, architecture compliance, and testing.
Ask which skill or flow fits your situation. A router over the user-invoked skills in this repo.
Shared vocabulary for designing deep modules. Use when the user wants to design or improve a module's interface, find deepening opportunities, decide where a seam goes, make code more testable or AI-navigable, or when another skill needs the deep-module vocabulary.
基于 SOC 职业分类
正在显示 SKILL.md
| name | incident-investigation |
| description | Use this skill to diagnose and resolve production incidents in VoxBento. |
Use this skill to diagnose and resolve production incidents in VoxBento.
curl http://localhost:8000/healthz
# Expected: {"ok": true, "server": "fastapi", "mediamtx_ok": true}
curl http://localhost:9997/v3/paths/list
# Expected: 200 with paths array
docker-compose ps mediamtx
docker-compose logs mediamtx --tail=50
docker-compose logs portal --tail=100
# Look for: ERROR, WebSocketDisconnect, DB errors, transcription errors
# Check live booth count from admin panel: /admin/
# Or query DB directly:
docker-compose exec portal uv run python -c "
import asyncio
from portal.database import get_session, list_events
async def main():
async with get_session() as s:
events = await list_events(s)
for e in events:
print(e.slug, e.display_name)
asyncio.run(main())
"
Symptoms: "Go Live" button clicked but WHIP fails or spinner never resolves.
Diagnosis:
GET /api/events/{slug}/booths/{lang}/whip-url.
booth:state WS message.booth:join message sent successfully?/healthz → mediamtx_ok.MEDIAMTX_WHIP_BASE is browser-reachable (not Docker-internal URL).Fix: If not active interpreter: coordinator must reassign via booth:set-active. If MediaMTX down: docker-compose restart mediamtx.
Symptoms: Listener page loads but WHEP connection shows "disconnected" or audio is silent.
Diagnosis:
ingest_status == 'connected' in booth state.MEDIAMTX_WHIP_BASE in listener page source — must be browser-reachable HTTPS.whep-listener.js.GET http://localhost:9997/v3/paths/get/{event_slug}/{language_code}.alwaysAvailable: true on the path — if not set, WHEP fails when no publisher.Fix: Ensure _ensure_mediamtx_path was called. Manually: PATCH http://mediamtx:9997/v3/config/paths/patch/{path} with {"alwaysAvailable": true}.
Symptoms: Interpreters see connection status flickering; participants disappear and reappear.
Diagnosis:
WebSocketDisconnect.asyncio.Lock deadlock in portal/booth_state.py — portal becomes unresponsive._handle_* functions (portal logs).Fix: Restart portal if deadlocked. Fix token scope if 4003 (token was generated for different booth).
Symptoms: Booth is live, transcription enabled, but no captions appear.
Diagnosis:
active_workers state — portal logs should show worker start: Starting {provider} transcription worker for booth {booth_id}.docker-compose exec portal ffmpeg -rtsp_transport tcp -i rtsp://mediamtx:8554/{event_slug}/{language_code} -f null - -t 5.API key missing or Failed to decrypt.event.transcription_api_enabled is True for external providers.MAX_TOTAL_WORKERS (10) not exceeded: count workers in portal logs.db_booth.transcription_enabled, db_booth.transcription_provider, db_booth.transcription_model.Fix: Restart transcription worker via admin panel → booth detail → transcription settings (re-save). Or call stop_transcription_worker(booth_id) + start_transcription_worker(...) via debug endpoint if available.
Symptoms: /admin/login with correct password → still shows error.
Diagnosis:
ADMIN_PASSWORD env var is set and not empty.admin_token cookie is being set (DevTools → Application → Cookies).settings.effective_jwt_secret).is_admin=True — uses /login + user_token cookie.Symptoms: 500 errors on any page involving DB; portal logs show SQLAlchemy errors.
Diagnosis:
DATABASE_URL env var.uv run alembic current should show head.portal-data volume is mounted and has write permission.Fix: Run uv run alembic upgrade head. If corrupt SQLite: restore from backup volume.
# Restart portal only
docker-compose restart portal
# View live logs
docker-compose logs portal -f
# Force-stop all services
docker-compose down
# Full restart
docker-compose up -d
# Apply pending migrations manually
docker-compose exec portal uv run alembic upgrade head
# Check DB migration state
docker-compose exec portal uv run alembic current