[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M698QACP9J2N60M1RYE2QGAN":3,"skill-same:01M698QACP9J2N60M1RYE2QGAN":91},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":53,"ownerHtmlUrl":54,"ownerBlogUrl":53,"ownerDescription":55,"updatedAt":56,"install":57,"resources":70},"01M698QACP9J2N60M1RYE2QGAN","discord-e2e",null,"Test Discord with Convex-leased QA bots: check credentials without a Gateway, exercise owned messages, or prove OpenClaw replies, files, threads, reactions, streaming, and typing. Distinguish API and Gateway evidence from manual user interactions.","openclaw\u002Fopenclaw","openclaw","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F252820863?v=4","01M698P3FSAZ6B4R928ZF19KPT","01M698PDMDRVH56MV30D253NFP",394352,"MIT","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdiscord-e2e\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[23,24,25,26,9,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"discord e2e","discord","e2e","prove","manual","replies","with","typing","bots","files","evidence","check","exercise","api","messages","gateway","streaming","qa","test","convex","2026-11-10 10:12:30",false,"---\nname: discord-e2e\ndescription: \"Test Discord with Convex-leased QA bots: check credentials without a Gateway, exercise owned messages, or prove OpenClaw replies, files, threads, reactions, streaming, and typing. Distinguish API and Gateway evidence from manual user interactions.\"\n---\n\n# Discord E2E\n\nChoose the smallest boundary that proves the requested behavior:\n\n| Goal                                  | Entry point                      | What it proves                                                            |\n| ------------------------------------- | -------------------------------- | ------------------------------------------------------------------------- |\n| Check the shared bot pair and channel | Read-only command below          | Bot identities, pinned SUT, guild text channel, and history access        |\n| Exercise bot-authored mutations       | Existing `channelE2e` lifecycle  | Owned messages, reactions, files, threads, and cleanup                    |\n| Prove OpenClaw behavior               | Existing QA Lab flow             | Real Discord events, an isolated SUT Gateway, and the selected model lane |\n| Prove human interactions or rendering | Authorized manual Discord client | Actual user action or inspected client capture                            |\n\nThe API probe starts no Gateway, event recorder, or model. QA Lab remains the\nowner for product E2E: it controls its lease, temporary Gateway, provider,\ncancellation, and cleanup. Neither path changes app permissions or provisions\ncredentials.\n\n## 1. Choose the evidence\n\nRead [feature recipes](features.md) for the changed behavior. Native fixture\ncalls prove Discord API operations, **not** that a model invoked a tool. A SUT\nround trip additionally proves Gateway ingress and a stored public reply. Model-tool\nclaims also require the tool trace and provider request evidence.\n\nHuman slash commands, component clicks, modals, ephemeral interactions, and\nhuman-to-bot DMs need an authorized manual client. A bot posting `\u002Fstatus` sends\ntext, not a slash interaction. Use official bot tokens from the lease only.\nDiscord [prohibits user-token\u002Fself-bot automation](https:\u002F\u002Fsupport.discord.com\u002Fhc\u002Fen-us\u002Farticles\u002F115002192352-Automated-User-Accounts-Self-Bots);\nSlack's user OAuth route has no equivalent here.\n\n## 2. Prepare and check the current lease\n\nUse the dependency-ready OpenClaw checkout under test. The setup prerequisite is\nan existing authenticated Convex CLI with access to the published QA broker.\nThe existing shared lease helper discovers the repository's broker binding and\nCI credential in memory; you do not need to copy bot tokens, guild IDs, or broker secrets. If authentication\nis absent, have the operator run `convex login` (or the already cached\n`bunx --no-install convex login`) once. Do not install a CLI or log in on the\noperator's behalf. Network\u002Fpermission errors are not evidence that another\nlogin is needed.\n\nFor a fast check without QA Lab:\n\n```bash\nnode .agents\u002Fskills\u002Fdiscord-e2e\u002Fscripts\u002Fbot-readiness.mjs\n```\n\nThe check is read-only **in Discord**, but it acquires, renews, and releases a\nConvex lease. It creates no Discord objects and has no mutation mode. Read\n[bot API readiness](bot-api.md) for the payload, permission limits, private\nresult, and failure handling.\n\nThis probe does not verify Gateway intents, event delivery, model behavior, or\nall native fixture permissions. For an OpenClaw claim, continue with QA Lab:\n\n```bash\npnpm openclaw qa discord --list-scenarios\npnpm openclaw qa discord --doctor \\\n  --output-dir .artifacts\u002Fqa-e2e\u002Fdiscord-doctor\n```\n\nRequire a passing QA Lab doctor for this lane. It sends no fixture messages; it checks the leased\nidentities, guild text channel, effective permissions, driver Gateway intents,\nand connected SUT Gateway. Every scenario repeats readiness on its own lease;\na released doctor's result never qualifies a later run.\n\n`--doctor` and `--scenario-file` default to Convex, CI role, and `mock-openai`.\nExisting explicit credential\u002Fprovider flags still work; ordinary curated\n`qa discord` defaults remain unchanged. Preprovisioned private broker environment\nvariables are an alternative to discovery, not a prerequisite.\n\n## 3. Run one scoped proof\n\nFor a native lifecycle plus real Gateway reply:\n\n```bash\npnpm openclaw qa discord \\\n  --scenario-file qa\u002Fscenarios\u002Fchannels\u002Fdiscord-e2e-lifecycle.yaml \\\n  --output-dir .artifacts\u002Fqa-e2e\u002Fdiscord-lifecycle\n```\n\nFor a changed feature, adapt that YAML using [feature recipes](features.md).\n`--scenario-file` is repeatable and uses the existing QA flow schema. Set\n`retryCount: 0` for native write scenarios. Use a new output directory for each\nproof. These examples are opt-in, not additions to the curated default suite.\n\nRead [runtime and recovery](runtime.md) when changing config, restarting the SUT,\nchoosing a real provider, diagnosing cancellation, or reconciling failed cleanup.\n\n## 4. Judge and report\n\nFor the API probe, require `status: ready` and `leaseReleased: true`.\nAn empty history list is `inconclusive` (exit 2): it can mean an empty channel\nor missing Read Message History permission. Use QA Lab doctor to distinguish\nthose cases; do not call either one a proven permission failure.\nReport a ready result as bot identity and observed read-access proof, not\nmutation or Gateway E2E. Private `result.json` contains leased identities and\ncheck statuses, not tokens or history.\n\nFor QA Lab, inspect `qa-suite-summary.json`, `qa-suite-report.md`, the Gateway\u002Fprovider\nartifacts, and each private `discord-e2e-*\u002Fevents.ndjson` under the output directory.\nJoin native receipts to recorder rows by message ID; use `actor: sut`, channel,\nsequence, and trigger correlation for SUT claims. A marker alone does not prove\nedits, reactions, typing, deletion, formatting, or a model tool call. Event logs\nare not visual proof; visual claims need an actual Discord client screenshot.\n\nCompletion requires the requested evidence and successful owned cleanup after\nGateway stop, before lease release. Existing permissions decide whether owned\nthreads are **deleted** or **archived**; report the recorded disposition, never\ncall archival deletion. Preserve private evidence on failure. Report the sanitized\ncommand, exact revision, claim, relevant evidence, manual-only gaps, and cleanup\noutcome. Redact identities, unrelated content, private paths, and credentials\nbefore sharing artifacts.\n","# Discord E2E\n\nChoose the smallest boundary that proves the requested behavior:\n\n| Goal                                  | Entry point                      | What it proves                                                            |\n| ------------------------------------- | -------------------------------- | ------------------------------------------------------------------------- |\n| Check the shared bot pair and channel | Read-only command below          | Bot identities, pinned SUT, guild text channel, and history access        |\n| Exercise bot-authored mutations       | Existing `channelE2e` lifecycle  | Owned messages, reactions, files, threads, and cleanup                    |\n| Prove OpenClaw behavior               | Existing QA Lab flow             | Real Discord events, an isolated SUT Gateway, and the selected model lane |\n| Prove human interactions or rendering | Authorized manual Discord client | Actual user action or inspected client capture                            |\n\nThe API probe starts no Gateway, event recorder, or model. QA Lab remains the\nowner for product E2E: it controls its lease, temporary Gateway, provider,\ncancellation, and cleanup. Neither path changes app permissions or provisions\ncredentials.\n\n## 1. Choose the evidence\n\nRead [feature recipes](features.md) for the changed behavior. Native fixture\ncalls prove Discord API operations, **not** that a model invoked a tool. A SUT\nround trip additionally proves Gateway ingress and a stored public reply. Model-tool\nclaims also require the tool trace and provider request evidence.\n\nHuman slash commands, component clicks, modals, ephemeral interactions, and\nhuman-to-bot DMs need an authorized manual client. A bot posting `\u002Fstatus` sends\ntext, not a slash interaction. Use official bot tokens from the lease only.\nDiscord [prohibits user-token\u002Fself-bot automation](https:\u002F\u002Fsupport.discord.com\u002Fhc\u002Fen-us\u002Farticles\u002F115002192352-Automated-User-Accounts-Self-Bots);\nSlack's user OAuth route has no equivalent here.\n\n## 2. Prepare and check the current lease\n\nUse the dependency-ready OpenClaw checkout under test. The setup prerequisite is\nan existing authenticated Convex CLI with access to the published QA broker.\nThe existing shared lease helper discovers the repository's broker binding and\nCI credential in memory; you do not need to copy bot tokens, guild IDs, or broker secrets. If authentication\nis absent, have the operator run `convex login` (or the already cached\n`bunx --no-install convex login`) once. Do not install a CLI or log in on the\noperator's behalf. Network\u002Fpermission errors are not evidence that another\nlogin is needed.\n\nFor a fast check without QA Lab:\n\n```bash\nnode .agents\u002Fskills\u002Fdiscord-e2e\u002Fscripts\u002Fbot-readiness.mjs\n```\n\nThe check is read-only **in Discord**, but it acquires, renews, and releases a\nConvex lease. It creates no Discord objects and has no mutation mode. Read\n[bot API readiness](bot-api.md) for the payload, permission limits, private\nresult, and failure handling.\n\nThis probe does not verify Gateway intents, event delivery, model behavior, or\nall native fixture permissions. For an OpenClaw claim, continue with QA Lab:\n\n```bash\npnpm openclaw qa discord --list-scenarios\npnpm openclaw qa discord --doctor \\\n  --output-dir .artifacts\u002Fqa-e2e\u002Fdiscord-doctor\n```\n\nRequire a passing QA Lab doctor for this lane. It sends no fixture messages; it checks the leased\nidentities, guild text channel, effective permissions, driver Gateway intents,\nand connected SUT Gateway. Every scenario repeats readiness on its own lease;\na released doctor's result never qualifies a later run.\n\n`--doctor` and `--scenario-file` default to Convex, CI role, and `mock-openai`.\nExisting explicit credential\u002Fprovider flags still work; ordinary curated\n`qa discord` defaults remain unchanged. Preprovisioned private broker environment\nvariables are an alternative to discovery, not a prerequisite.\n\n## 3. Run one scoped proof\n\nFor a native lifecycle plus real Gateway reply:\n\n```bash\npnpm openclaw qa discord \\\n  --scenario-file qa\u002Fscenarios\u002Fchannels\u002Fdiscord-e2e-lifecycle.yaml \\\n  --output-dir .artifacts\u002Fqa-e2e\u002Fdiscord-lifecycle\n```\n\nFor a changed feature, adapt that YAML using [feature recipes](features.md).\n`--scenario-file` is repeatable and uses the existing QA flow schema. Set\n`retryCount: 0` for native write scenarios. Use a new output directory for each\nproof. These examples are opt-in, not additions to the curated default suite.\n\nRead [runtime and recovery](runtime.md) when changing config, restarting the SUT,\nchoosing a real provider, diagnosing cancellation, or reconciling failed cleanup.\n\n## 4. Judge and report\n\nFor the API probe, require `status: ready` and `leaseReleased: true`.\nAn empty history list is `inconclusive` (exit 2): it can mean an empty channel\nor missing Read Message History permission. Use QA Lab doctor to distinguish\nthose cases; do not call either one a proven permission failure.\nReport a ready result as bot identity and observed read-access proof, not\nmutation or Gateway E2E. Private `result.json` contains leased identities and\ncheck statuses, not tokens or history.\n\nFor QA Lab, inspect `qa-suite-summary.json`, `qa-suite-report.md`, the Gateway\u002Fprovider\nartifacts, and each private `discord-e2e-*\u002Fevents.ndjson` under the output directory.\nJoin native receipts to recorder rows by message ID; use `actor: sut`, channel,\nsequence, and trigger correlation for SUT claims. A marker alone does not prove\nedits, reactions, typing, deletion, formatting, or a model tool call. Event logs\nare not visual proof; visual claims need an actual Discord client screenshot.\n\nCompletion requires the requested evidence and successful owned cleanup after\nGateway stop, before lease release. Existing permissions decide whether owned\nthreads are **deleted** or **archived**; report the recorded disposition, never\ncall archival deletion. Preserve private evidence on failure. Report the sanitized\ncommand, exact revision, claim, relevant evidence, manual-only gaps, and cleanup\noutcome. Redact identities, unrelated content, private paths, and credentials\nbefore sharing artifacts.\n",{"name":5,"description":7},"main","f1c93577085244aa96aa87b53a2df9b59d293bd7",".agents\u002Fskills\u002Fdiscord-e2e",82861,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw","https:\u002F\u002Fopenclaw.ai","https:\u002F\u002Fgithub.com\u002Fopenclaw","Your personal, open source AI assistant.","2026-11-12 03:01:25",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":69},[59,62,65],{"tool":60,"command":61},"npx","npx skills add openclaw\u002Fopenclaw --skill discord-e2e",{"tool":63,"command":64},"bunx","bunx skills add openclaw\u002Fopenclaw --skill discord-e2e",{"tool":66,"command":67},"pnpm","pnpm dlx skills add openclaw\u002Fopenclaw --skill discord-e2e","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdiscord-e2e\u002FSKILL.md",true,[71,77,81,85],{"path":72,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":75,"sourceHtmlUrl":76},"bot-api.md","REFERENCE","参考文档",5609,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdiscord-e2e\u002Fbot-api.md",{"path":78,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":79,"sourceHtmlUrl":80},"features.md",7416,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdiscord-e2e\u002Ffeatures.md",{"path":82,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":83,"sourceHtmlUrl":84},"runtime.md",5676,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdiscord-e2e\u002Fruntime.md",{"path":86,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":89,"sourceHtmlUrl":90},"scripts\u002Fbot-readiness.mjs","SCRIPT","脚本",7552,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdiscord-e2e\u002Fscripts\u002Fbot-readiness.mjs",[92,98,119,136,158,180],{"skillNo":93,"name":94,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":43},"01M698VP84FNM6G9MR1HPX7MF7","lobster","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fextensions\u002Flobster\u002FSKILL.md",[],[94],{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":43},"01M698YY8QGQ7S8TJNKJG6VTPH","xurl","xurl CLI for authenticated X posts, replies, reads\u002Fsearch, DMs, media upload, followers, auth status, or raw v2 API calls.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fxurl\u002FSKILL.md",[],[100,105,36,106,28,107,108,109,110,111,112,113,114,115,116,117,118],"for","calls","posts","upload","tap","install","brew","node","Media","search","npm","status","auth","cli",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":43},"01M698YWT1CJ0WK88WB909R9RT","weather","Current weather and forecasts with web_fetch, falling back to wttr.in curl for locations, rain, temperature, travel planning.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fweather\u002FSKILL.md",[],[121,126,127,110,128,111,129,130,131,132,133,134,105,135,29],"travel planning","travel","fetch","curl","https","help","planning","web","back","temperature",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":147,"publishedAt":43},"01M698YV2Q0R0JJKAWGFS21K0N","visualize","Create inline visuals for code and explanations, or author persistent OpenClaw dashboard widgets with show_widget.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fvisualize\u002FSKILL.md",[142],{"categoryNo":143,"categoryName":144,"taxonomyType":145,"taxonomyTypeDesc":146},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[138,148,149,150,151,105,29,152,153,154,155,156,9,157],"widgets","openclaw dashboard","author","inline","show","code","create","visuals","dashboard","widget",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":170,"publishedAt":43},"01M698YS2TRJH9ENG28HD9CD87","trello","Manage Trello boards, lists, and cards via the Trello REST API.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Ftrello\u002FSKILL.md",[164,167],{"categoryNo":165,"categoryName":166,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":168,"categoryName":169,"taxonomyType":145,"taxonomyTypeDesc":146},"01JBSEEDCAT000000000000030","开发工程师",[160,130,171,172,173,174,175,176,110,111,177,129,36,178,179],"cloud","manage","via","rest api","token","atlassian","jq","REST","developer",{"skillNo":181,"name":182,"nameZh":6,"description":183,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":184,"categories":185,"keywords":186,"publishedAt":43},"01M698YQ9Q3M4W78EWV2KSCSVW","tmux","Control tmux sessions\u002Fpanes for interactive CLIs: list, capture output, send keys, paste text, monitor prompts.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Ftmux\u002FSKILL.md",[],[182,110,187,188,105,189,190,191,192,193,194,195,111,196,197,198,199,200,201],"send","darwin","keys","paste","output","control","prompts","interactive","list","capture","panes","text","monitor","sessions","linux"]