[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CCNAPZXTRXRVJMFNFWPS96":3,"skill-same:01M6CCNAPZXTRXRVJMFNFWPS96":81},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":46,"repositoryHtmlUrl":47,"repositoryHomepageUrl":48,"ownerHtmlUrl":49,"ownerBlogUrl":48,"ownerDescription":50,"updatedAt":51,"install":52,"resources":65},"01M6CCNAPZXTRXRVJMFNFWPS96","add-voice",null,"Use when the user runs \u002Fadd-voice, types Voice Mode, or asks to add Grok realtime voice to an app, including replacing an STT-LLM-TTS cascade or OpenAI Realtime.   Wire speech-to-speech, safe auth, and app mic. Composer: waveform button, mic icon reserved for dictation. For mic-to-text only use \u002Fadd-dictation; to speak text replies use \u002Fadd-read-aloud. To add debug logging and fix from logs use \u002Fdebug-voice.","stigmer\u002Fstigmer","stigmer","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F255479904?v=4","01M6CCFBFXXRZC4ZVNS3JSDV4W","Stigmer","01M6CCFBKY7M8QGR4GH9TT35MY",9,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fstigmer\u002Fstigmer\u002Fblob\u002Fmain\u002Fplugins\u002Fgrok-voice\u002Fskills\u002Fadd-voice\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"voice","add voice","text","auth","grok","only","use","fix","user","read","speak","debug","safe","tts","logs","logging","speech","openai","realtime","2026-11-10 10:12:30",false,"---\nname: add-voice\ndescription: >-\n  Use when the user runs \u002Fadd-voice, types Voice Mode, or asks to add Grok\n  realtime voice to an app, including replacing an STT-LLM-TTS cascade or\n  OpenAI Realtime.   Wire speech-to-speech, safe auth, and app mic. Composer: waveform button,\n  mic icon reserved for dictation. For mic-to-text only use \u002Fadd-dictation; to speak text replies use\n  \u002Fadd-read-aloud. To add debug logging and fix from logs use \u002Fdebug-voice.\n---\n\n# Add Voice\n\nAdd Grok Speech to Speech to an existing app. Run on `\u002Fadd-voice`, typed **Voice Mode**, or clear “add Grok voice” intent.\n\n## Goal\n\nWorking duplex path: user-app mic in, audio out, `wss:\u002F\u002Fapi.x.ai\u002Fv1\u002Frealtime?model=grok-voice-latest`, safe auth. Cursor has no native mic; wire the **app** (or a sample client), not the IDE.\n\n## Protocol first\n\nLanguage-agnostic event loop. **TypeScript samples default.** Short Python twins only where the client API differs (e.g. `ws` vs `websockets`).\n\n## Docs\n\n- https:\u002F\u002Fdocs.x.ai\u002Fdevelopers\u002Fmodel-capabilities\u002Faudio\u002Fspeech-to-speech\n- https:\u002F\u002Fdocs.x.ai\u002Fdevelopers\u002Fmodel-capabilities\u002Faudio\u002Fephemeral-tokens\n- Pricing (cite docs only): https:\u002F\u002Fdocs.x.ai\u002Fdevelopers\u002Fpricing (~$0.08\u002Fmin STS + $0.004\u002Ftext item; max session 120 min)\n\n## Steps\n\n1. **Map the app**\n   - Stack: none, OpenAI Realtime, STT→LLM→TTS cascade, TTS\u002FSTT only.\n   - Client: web \u002F Node \u002F iOS \u002F Android \u002F server.\n   - If a cascade or OpenAI Realtime exists: replace it with the single duplex loop below (URL, model, voice, event diffs); keep standalone `\u002Fv1\u002Fstt` or `\u002Fv1\u002Ftts` only if the product still needs one-shot listen or speak outside the agent.\n\n2. **Auth**\n   - Server: Bearer `XAI_API_KEY`.\n   - Browser\u002Fmobile: backend `POST https:\u002F\u002Fapi.x.ai\u002Fv1\u002Frealtime\u002Fclient_secrets`, client uses ephemeral token (Bearer or browser `sec-websocket-protocol`: `xai-client-secret.\u003Ctoken>`).\n   - Never put a long-lived key in client bundles. Do not paste keys in chat.\n\n3. **Connect + session**\n   - URL: `wss:\u002F\u002Fapi.x.ai\u002Fv1\u002Frealtime?model=grok-voice-latest`\n   - On open: `session.update` with `voice` (default `eve`), `instructions`, `turn_detection: { type: \"server_vad\" }` (or `null` for push-to-talk), PCM 24 kHz unless the app already standardizes elsewhere.\n   - Set `audio.input.transcription.model: \"grok-transcribe\"` or no user transcript arrives (`conversation.item.input_audio_transcription.updated` is cumulative, not a delta).\n   - Tools if needed: `web_search`, `x_search`, `file_search`, `mcp`, custom `function`.\n\n4. **Audio I\u002FO (app-side)**\n   - One `AudioContext` per session for capture and playback, created inside the user gesture (autoplay policy). Ask for 24 kHz; if the browser gives another rate, resample before sending.\n   - Mic → AudioWorklet in ~100 ms chunks → `input_audio_buffer.append` (or binary transport). Start WS and mic in parallel; buffer early audio, flush on open.\n   - Play `response.output_audio.delta` immediately; schedule with a ~150 ms lead so chunks butt together. On `input_audio_buffer.speech_started`, stop everything queued (barge-in).\n   - Transcript rows: create the user row on `input_audio_buffer.committed` (`item_id`), fill it on `…transcription.updated`; assistant text from `response.output_audio_transcript.delta` \u002F `.done`, close the turn on `response.done`.\n   - On function tools: `function_call_output`, finish playback, then `response.create`.\n\n5. **Composer UI convention**\n   - One primary button, right side of the composer. Empty composer → **waveform** icon (stroked, e.g. Phosphor `WaveformIcon weight=\"bold\"`; never the `fill` weight, which renders as a blob at 16 px), starts voice mode. Any text present → classic **send** arrow; in voice mode that text goes into the live session (`conversation.item.create` + `response.create`). Text reply streaming → stop square.\n   - While voice is live the same button shows an **animated waveform** (4 bars, ~3 px wide, 2 px gap, ~16 px tall, min scale 0.4 so they stay legible in a 28 px button) and ends the session on click. Phase drives the animation: listening slow, speaking fast, connecting\u002Fthinking slower and slightly dimmed (opacity ≥ 0.75). Honor `prefers-reduced-motion`. No X button, no pulsing ring.\n   - Status lives **in the composer, not around it**: the placeholder reads `Connecting…` \u002F `Listening…` \u002F `Thinking…` \u002F `Speaking…`, plus an `sr-only` `role=\"status\"`. No separate status row.\n   - The **microphone icon is reserved for dictation** (`\u002Fadd-dictation`). Never use it for voice mode.\n\n6. **TS skeleton (default)**\n\n```ts\nconst url = \"wss:\u002F\u002Fapi.x.ai\u002Fv1\u002Frealtime?model=grok-voice-latest\";\n\u002F\u002F Node: pass Authorization header. Browser: use xai-client-secret.\u003Ctoken> protocol.\nconst ws = new WebSocket(url \u002F* , { headers: { Authorization: `Bearer ${token}` } } *\u002F);\n\nws.addEventListener(\"open\", () => {\n  ws.send(JSON.stringify({\n    type: \"session.update\",\n    session: {\n      voice: \"eve\",\n      instructions: \"You are a helpful voice agent.\",\n      turn_detection: { type: \"server_vad\" },\n    },\n  }));\n});\n\nws.addEventListener(\"message\", (ev) => {\n  const event = JSON.parse(String(ev.data));\n  if (event.type === \"response.output_audio.delta\") {\n    \u002F\u002F decode base64 PCM and play\n  }\n});\n```\n\n7. **Python twin (only if the app is Python)**\n\n```python\nimport json, os, websockets\n\nurl = \"wss:\u002F\u002Fapi.x.ai\u002Fv1\u002Frealtime?model=grok-voice-latest\"\nheaders = {\"Authorization\": f\"Bearer {os.environ['XAI_API_KEY']}\"}\n\nasync with websockets.connect(url, additional_headers=headers) as ws:\n    await ws.send(json.dumps({\n        \"type\": \"session.update\",\n        \"session\": {\n            \"voice\": \"eve\",\n            \"instructions\": \"You are a helpful voice agent.\",\n            \"turn_detection\": {\"type\": \"server_vad\"},\n        },\n    }))\n    async for raw in ws:\n        event = json.loads(raw)\n        if event.get(\"type\") == \"response.output_audio.delta\":\n            pass  # decode and play\n```\n\n8. **Instrument (before the first human test)**\n   - Run `\u002Fdebug-voice`: it proposes a plan, then installs a dev-only log sink (`POST \u002Fapi\u002Fvoice\u002Flog` → `.voice-logs\u002F\u003CsessionId>.ndjson`, gitignored), a client logger with audio reduced to byte counts, and the session id in the UI, in the app's own language.\n   - The same skill carries the fix loop and the symptom → log signature → fix table.\n\n9. **Smoke**\n   - Text turn via `conversation.item.create` + `response.create`; confirm audio or transcript events.\n   - Confirm no long-lived key in client (grep the built client bundle for the env name and `client_secrets`).\n   - Hand the app to the user with **headphones**. On speakers the mic hears the reply and the model answers itself; that is echo, not a bug in the loop.\n   - Iterate with `\u002Fdebug-voice`.\n\n## Out of scope\n\n- Speech-to-text only (`\u002Fadd-dictation`), speaking text (`\u002Fadd-read-aloud`)\n- Image generation and text-only inference\n- Invented endpoints, events, or CLI flags\n","# Add Voice\n\nAdd Grok Speech to Speech to an existing app. Run on `\u002Fadd-voice`, typed **Voice Mode**, or clear “add Grok voice” intent.\n\n## Goal\n\nWorking duplex path: user-app mic in, audio out, `wss:\u002F\u002Fapi.x.ai\u002Fv1\u002Frealtime?model=grok-voice-latest`, safe auth. Cursor has no native mic; wire the **app** (or a sample client), not the IDE.\n\n## Protocol first\n\nLanguage-agnostic event loop. **TypeScript samples default.** Short Python twins only where the client API differs (e.g. `ws` vs `websockets`).\n\n## Docs\n\n- https:\u002F\u002Fdocs.x.ai\u002Fdevelopers\u002Fmodel-capabilities\u002Faudio\u002Fspeech-to-speech\n- https:\u002F\u002Fdocs.x.ai\u002Fdevelopers\u002Fmodel-capabilities\u002Faudio\u002Fephemeral-tokens\n- Pricing (cite docs only): https:\u002F\u002Fdocs.x.ai\u002Fdevelopers\u002Fpricing (~$0.08\u002Fmin STS + $0.004\u002Ftext item; max session 120 min)\n\n## Steps\n\n1. **Map the app**\n   - Stack: none, OpenAI Realtime, STT→LLM→TTS cascade, TTS\u002FSTT only.\n   - Client: web \u002F Node \u002F iOS \u002F Android \u002F server.\n   - If a cascade or OpenAI Realtime exists: replace it with the single duplex loop below (URL, model, voice, event diffs); keep standalone `\u002Fv1\u002Fstt` or `\u002Fv1\u002Ftts` only if the product still needs one-shot listen or speak outside the agent.\n\n2. **Auth**\n   - Server: Bearer `XAI_API_KEY`.\n   - Browser\u002Fmobile: backend `POST https:\u002F\u002Fapi.x.ai\u002Fv1\u002Frealtime\u002Fclient_secrets`, client uses ephemeral token (Bearer or browser `sec-websocket-protocol`: `xai-client-secret.\u003Ctoken>`).\n   - Never put a long-lived key in client bundles. Do not paste keys in chat.\n\n3. **Connect + session**\n   - URL: `wss:\u002F\u002Fapi.x.ai\u002Fv1\u002Frealtime?model=grok-voice-latest`\n   - On open: `session.update` with `voice` (default `eve`), `instructions`, `turn_detection: { type: \"server_vad\" }` (or `null` for push-to-talk), PCM 24 kHz unless the app already standardizes elsewhere.\n   - Set `audio.input.transcription.model: \"grok-transcribe\"` or no user transcript arrives (`conversation.item.input_audio_transcription.updated` is cumulative, not a delta).\n   - Tools if needed: `web_search`, `x_search`, `file_search`, `mcp`, custom `function`.\n\n4. **Audio I\u002FO (app-side)**\n   - One `AudioContext` per session for capture and playback, created inside the user gesture (autoplay policy). Ask for 24 kHz; if the browser gives another rate, resample before sending.\n   - Mic → AudioWorklet in ~100 ms chunks → `input_audio_buffer.append` (or binary transport). Start WS and mic in parallel; buffer early audio, flush on open.\n   - Play `response.output_audio.delta` immediately; schedule with a ~150 ms lead so chunks butt together. On `input_audio_buffer.speech_started`, stop everything queued (barge-in).\n   - Transcript rows: create the user row on `input_audio_buffer.committed` (`item_id`), fill it on `…transcription.updated`; assistant text from `response.output_audio_transcript.delta` \u002F `.done`, close the turn on `response.done`.\n   - On function tools: `function_call_output`, finish playback, then `response.create`.\n\n5. **Composer UI convention**\n   - One primary button, right side of the composer. Empty composer → **waveform** icon (stroked, e.g. Phosphor `WaveformIcon weight=\"bold\"`; never the `fill` weight, which renders as a blob at 16 px), starts voice mode. Any text present → classic **send** arrow; in voice mode that text goes into the live session (`conversation.item.create` + `response.create`). Text reply streaming → stop square.\n   - While voice is live the same button shows an **animated waveform** (4 bars, ~3 px wide, 2 px gap, ~16 px tall, min scale 0.4 so they stay legible in a 28 px button) and ends the session on click. Phase drives the animation: listening slow, speaking fast, connecting\u002Fthinking slower and slightly dimmed (opacity ≥ 0.75). Honor `prefers-reduced-motion`. No X button, no pulsing ring.\n   - Status lives **in the composer, not around it**: the placeholder reads `Connecting…` \u002F `Listening…` \u002F `Thinking…` \u002F `Speaking…`, plus an `sr-only` `role=\"status\"`. No separate status row.\n   - The **microphone icon is reserved for dictation** (`\u002Fadd-dictation`). Never use it for voice mode.\n\n6. **TS skeleton (default)**\n\n```ts\nconst url = \"wss:\u002F\u002Fapi.x.ai\u002Fv1\u002Frealtime?model=grok-voice-latest\";\n\u002F\u002F Node: pass Authorization header. Browser: use xai-client-secret.\u003Ctoken> protocol.\nconst ws = new WebSocket(url \u002F* , { headers: { Authorization: `Bearer ${token}` } } *\u002F);\n\nws.addEventListener(\"open\", () => {\n  ws.send(JSON.stringify({\n    type: \"session.update\",\n    session: {\n      voice: \"eve\",\n      instructions: \"You are a helpful voice agent.\",\n      turn_detection: { type: \"server_vad\" },\n    },\n  }));\n});\n\nws.addEventListener(\"message\", (ev) => {\n  const event = JSON.parse(String(ev.data));\n  if (event.type === \"response.output_audio.delta\") {\n    \u002F\u002F decode base64 PCM and play\n  }\n});\n```\n\n7. **Python twin (only if the app is Python)**\n\n```python\nimport json, os, websockets\n\nurl = \"wss:\u002F\u002Fapi.x.ai\u002Fv1\u002Frealtime?model=grok-voice-latest\"\nheaders = {\"Authorization\": f\"Bearer {os.environ['XAI_API_KEY']}\"}\n\nasync with websockets.connect(url, additional_headers=headers) as ws:\n    await ws.send(json.dumps({\n        \"type\": \"session.update\",\n        \"session\": {\n            \"voice\": \"eve\",\n            \"instructions\": \"You are a helpful voice agent.\",\n            \"turn_detection\": {\"type\": \"server_vad\"},\n        },\n    }))\n    async for raw in ws:\n        event = json.loads(raw)\n        if event.get(\"type\") == \"response.output_audio.delta\":\n            pass  # decode and play\n```\n\n8. **Instrument (before the first human test)**\n   - Run `\u002Fdebug-voice`: it proposes a plan, then installs a dev-only log sink (`POST \u002Fapi\u002Fvoice\u002Flog` → `.voice-logs\u002F\u003CsessionId>.ndjson`, gitignored), a client logger with audio reduced to byte counts, and the session id in the UI, in the app's own language.\n   - The same skill carries the fix loop and the symptom → log signature → fix table.\n\n9. **Smoke**\n   - Text turn via `conversation.item.create` + `response.create`; confirm audio or transcript events.\n   - Confirm no long-lived key in client (grep the built client bundle for the env name and `client_secrets`).\n   - Hand the app to the user with **headphones**. On speakers the mic hears the reply and the model answers itself; that is echo, not a bug in the loop.\n   - Iterate with `\u002Fdebug-voice`.\n\n## Out of scope\n\n- Speech-to-text only (`\u002Fadd-dictation`), speaking text (`\u002Fadd-read-aloud`)\n- Image generation and text-only inference\n- Invented endpoints, events, or CLI flags\n",{"name":5,"description":7},"main","49002d2ddc1f123a8d1148f6c6d73d7b385bb0b1","plugins\u002Fgrok-voice\u002Fskills\u002Fadd-voice",6,"https:\u002F\u002Fgithub.com\u002Fstigmer\u002Fstigmer","https:\u002F\u002Fstigmer.ai","https:\u002F\u002Fgithub.com\u002Fstigmer","The open-source backend for the agents in your product.","2026-11-11 20:28:47",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add stigmer\u002Fstigmer --skill add-voice",{"tool":58,"command":59},"bunx","bunx skills add stigmer\u002Fstigmer --skill add-voice",{"tool":61,"command":62},"pnpm","pnpm dlx skills add stigmer\u002Fstigmer --skill add-voice","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fstigmer\u002Fstigmer\u002Fblob\u002Fmain\u002Fplugins\u002Fgrok-voice\u002Fskills\u002Fadd-voice\u002FSKILL.md",true,[66,71,77],{"path":67,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":69,"sourceHtmlUrl":70},"LICENSE","许可证",1069,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fdefi\u002Funiswap-official-cca-deployer\u002FLICENSE",{"path":72,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":75,"sourceHtmlUrl":76},"SOURCE.md","REFERENCE","参考文档",160,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fdefi\u002Funiswap-official-cca-deployer\u002FSOURCE.md",{"path":78,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":79,"sourceHtmlUrl":80},"TRUST.auto.yaml",2220,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fdefi\u002Funiswap-official-cca-deployer\u002FTRUST.auto.yaml",[82,111,130,148,162,178],{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":101,"publishedAt":38},"01M6CCSERKR4YRSZJ2TB6B0X60","writing-hookify-rules","This skill should be used when the user asks to \"create a hookify rule\", \"write a hook rule\", \"configure hookify\", \"add a hookify rule\", or needs guidance on hookify rule syntax and patterns.","https:\u002F\u002Fgithub.com\u002Fstigmer\u002Fstigmer\u002Fblob\u002Fmain\u002Ftest\u002Fsupport\u002Ffixtures\u002Fclaude-plugins\u002Fhookify\u002Fskills\u002Fwriting-rules\u002FSKILL.md",[88,93,96],{"categoryNo":89,"categoryName":90,"taxonomyType":91,"taxonomyTypeDesc":92},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",{"categoryNo":94,"categoryName":95,"taxonomyType":91,"taxonomyTypeDesc":92},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":97,"categoryName":98,"taxonomyType":99,"taxonomyTypeDesc":100},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[102,103,104,105,106,107,27,108,109,110],"writing","Writing Hookify Rules","Rules","hookify rules","create","guidance","write","configure","syntax",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":123,"publishedAt":38},"01M6CCSC63RKCGC2S1EZDEMXZE","sql-migrations","Write safe database schema migrations - reversible steps, online index builds, and backfills in batches.","https:\u002F\u002Fgithub.com\u002Fstigmer\u002Fstigmer\u002Fblob\u002Fmain\u002Ftest\u002Fconformance\u002Ffixtures\u002Fworking-agent\u002Fskills\u002Fsql-migrations\u002FSKILL.md",[117,120],{"categoryNo":118,"categoryName":119,"taxonomyType":91,"taxonomyTypeDesc":92},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":121,"categoryName":122,"taxonomyType":99,"taxonomyTypeDesc":100},"01JBSEEDCAT000000000000033","数据分析师",[124,125,126,127,108,128,129,31],"sql","sql migrations","migrations","schema","index","database",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":136,"publishedAt":38},"01M6CCS9Q8E0R3TYHPZHCPN0JZ","repo-conventions","How to change Go code in this repository - error wrapping, table-driven tests, doc comments, no new dependencies, and running go test before finishing.","https:\u002F\u002Fgithub.com\u002Fstigmer\u002Fstigmer\u002Fblob\u002Fmain\u002Ftest\u002Fconformance\u002Ffixtures\u002Fworking-agent\u002Fskills\u002Frepo-conventions\u002FSKILL.md",[],[137,138,139,140,141,142,143,144,145,146,147],"repo","repo conventions","table","go","test","change","doc comments","code","repository","doc","how",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":152,"categories":153,"keywords":154,"publishedAt":38},"01M6CCS7F2D1YZ9H3N63XTEV09","incident-postmortem","Write a blameless incident postmortem - timeline, impact, root cause, contributing factors and follow-up actions with owners.","https:\u002F\u002Fgithub.com\u002Fstigmer\u002Fstigmer\u002Fblob\u002Fmain\u002Ftest\u002Fconformance\u002Ffixtures\u002Fworking-agent\u002Fskills\u002Fincident-postmortem\u002FSKILL.md",[],[155,156,108,157,158,159,160,161],"incident postmortem","postmortem","contributing","actions","timeline","owners","up",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":172,"publishedAt":38},"01M6CCS4W1D2K257KHC40HS8JG","data-analysis","Summarise a data export or table - lead with the key finding and give every number its baseline or comparison.","https:\u002F\u002Fgithub.com\u002Fstigmer\u002Fstigmer\u002Fblob\u002Fmain\u002Ftest\u002Fconformance\u002Ffixtures\u002Fworking-agent\u002Fskills\u002Fdata-analysis\u002FSKILL.md",[168,171],{"categoryNo":169,"categoryName":170,"taxonomyType":91,"taxonomyTypeDesc":92},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":121,"categoryName":122,"taxonomyType":99,"taxonomyTypeDesc":100},[173,174,175,176,139,177],"analysis","data analysis","data","baseline","export",{"skillNo":179,"name":180,"nameZh":6,"description":181,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":182,"categories":183,"keywords":184,"publishedAt":38},"01M6CCS2MNQYK9S24AYHJAVPWF","customer-support","Answer customer questions about orders, returns and refunds from the written policies and the order system, ending with a clear next step.","https:\u002F\u002Fgithub.com\u002Fstigmer\u002Fstigmer\u002Fblob\u002Fmain\u002Ftest\u002Fconformance\u002Ffixtures\u002Fworking-agent\u002Fskills\u002Fcustomer-support\u002FSKILL.md",[],[185,186,187,188,189,190],"support","customer","customer support","system","refunds","returns"]