[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M698SC251PP5YCWAXYMJTDBE":3,"skill-same:01M698SC251PP5YCWAXYMJTDBE":94},{"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":25,"publishedAt":46,"linkOnly":47,"markdownContent":48,"markdownBody":49,"frontMatter":50,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":56,"ownerHtmlUrl":57,"ownerBlogUrl":56,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M698SC251PP5YCWAXYMJTDBE","slack-e2e",null,"Test Slack with Convex-leased user OAuth or QA bots; check credentials, exercise owned messages, prove Gateway behavior, and distinguish API evidence from real Slack client interactions.","openclaw\u002Fopenclaw","openclaw","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F252820863?v=4","01M698P3FSAZ6B4R928ZF19KPT","01M698PDMDRVH56MV30D253NFP",394302,"MIT","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fslack-e2e\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000005","邮件与沟通","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量",[26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"slack e2e","slack","e2e","prove","convex","with","client","bots","evidence","user","behavior","check","exercise","api","credentials","OAuth","messages","gateway","qa","test","2026-11-10 10:12:30",false,"---\nname: slack-e2e\ndescription: Test Slack with Convex-leased user OAuth or QA bots; check credentials, exercise owned messages, prove Gateway behavior, and distinguish API evidence from real Slack client interactions.\n---\n\n# Slack agent E2E\n\n## Choose the proof\n\n| Goal                                                      | Entry point                 | Boundary                                                           |\n| --------------------------------------------------------- | --------------------------- | ------------------------------------------------------------------ |\n| Check shared user OAuth                                   | Read-only command below     | User\u002Fworkspace identity and channel history; no Gateway            |\n| Exercise user-authored text                               | Same command with `--smoke` | Create, read, edit, delete, verify absence; no Gateway reply claim |\n| Prove OpenClaw ingress, replies, tools, files, or restart | Existing QA Lab lane below  | Leased driver\u002FSUT bots and an isolated Gateway                     |\n| Prove real clicks, slash commands, or rendering           | Authorized Slack client     | Actual client observation, not reconstructed API data              |\n\nStart from a source checkout with normal dependencies and an existing Convex\nlogin. If needed, ask the operator to run `convex login` or the cached\n`bunx --no-install convex login`. The broker provides the authorized pool;\nagents do not need to copy Slack tokens. Login alone cannot supply a missing\npool credential or grant Slack permissions.\n\n## User OAuth: no QA Lab run\n\n```bash\nnode .agents\u002Fskills\u002Fslack-e2e\u002Fscripts\u002Fuser-oauth-smoke.mjs\nnode .agents\u002Fskills\u002Fslack-e2e\u002Fscripts\u002Fuser-oauth-smoke.mjs --smoke\n```\n\nThe default is read-only **in Slack**; both modes acquire, heartbeat, and release\na Convex lease. `--smoke` creates one synthetic, unmentioned top-level message,\nchecks stored authorship, edits it, and deletes that exact message. Existing\nworkspace listeners can still observe it. Each command uses a new private\nartifact directory and prints a safe result plus its path.\n\nRead [user OAuth setup and recovery](user-oauth.md) for the pool payload,\npermissions, result interpretation, and failure handling. This skill-owned\ncommand reuses the existing lease helper; it changes no QA Lab code or release\nlane and starts no Gateway or model. It does not add a user-driver option to\n`qa slack`.\n\n## Existing Gateway lane\n\nUse the source-checkout QA Lab owner for Gateway proof, not a separate bot\nrunner. A run owns a leased driver\u002FSUT pair, a temporary Gateway, native fixture\nreceipts, and private artifacts. The driver has no Socket Mode connection:\nthe SUT Gateway exclusively owns the app token and event delivery.\n\n1. Use the existing Convex login above. No Slack tokens, broker secrets, model\n   credentials, app creation, or scope grants belong in the command line.\n2. Inspect the available scenarios and run readiness:\n\n   ```bash\n   pnpm openclaw qa slack --list-scenarios\n   pnpm openclaw qa slack --doctor --output-dir .artifacts\u002Fqa-e2e\u002Fslack-doctor\n   ```\n\n   Doctor checks the **actual lease**: distinct bot identities in one workspace,\n   both bots' channel access, the owned Gateway connection, and advertised OAuth\n   scopes. Known missing scopes fail with their actor and exact names. Missing\n   scope metadata means mutation capability is **unverified**, not granted.\n   Missing optional file\u002Freaction scopes do not block text-only flows; they\n   block the affected native operations before dispatch. Doctor's full lifecycle\n   capability verdict remains separate from mandatory connection readiness.\n   A pool\u002Flogin\u002Fpermission failure is an owner prerequisite, not a reason to\n   rotate credentials until one passes. Every subsequent run checks its own lease.\n\n3. Run the native lifecycle recipe:\n\n   ```bash\n   pnpm openclaw qa slack \\\n     --scenario-file qa\u002Fscenarios\u002Fchannels\u002Fslack-e2e-lifecycle.yaml \\\n     --output-dir .artifacts\u002Fqa-e2e\u002Fslack-lifecycle\n   ```\n\n   `--doctor` and `--scenario-file` default to Convex, the CI role, and\n   `mock-openai`. This is real Slack\u002FGateway transport with a deterministic model.\n   Explicit overrides remain available; ordinary curated `qa slack` defaults do\n   not change. Use a unique output directory per run. Additional\n   `--scenario-file` arguments select additional complete YAML scenarios.\n\n4. Read the summary, evidence, and cleanup result before claiming success.\n   Choose [feature recipes](features.md) for native operations or model-tool\n   evidence, and [runtime recipes](runtime.md) for config\u002Frestart, custom flows,\n   cancellation, artifacts, and recovery.\n\n## Evidence boundary\n\n| Surface                                                                                 | What automation proves                                                               |\n| --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |\n| Mention\u002Fquiet ingress, owned edits\u002Fdeletes, reactions, upload, thread replies           | Fixture\u002FAPI operations and explicit stored readback; not model tool calls            |\n| Correlated SUT reply                                                                    | A stored reply from the leased SUT after ingress; mock or live model must be named   |\n| Gateway debug-proxy capture                                                             | Slack accepted a Gateway API write; neither Socket Mode event delivery nor rendering |\n| Block Kit, file IDs, reaction state                                                     | Stored structure\u002Fidentity only                                                       |\n| Human slash invocation, real button clicks, Agent View, visible rendering, human typing | Manual\u002FMantis client lane; bot\u002FAPI evidence is insufficient                          |\n\nFor visual or human-interaction requests, use an authorized, logged-in Slack\nclient; the maintained Mantis workflow is in\n`docs\u002Fconcepts\u002Fqa-e2e-automation\u002Foperator-flow.md`. Check which surface it actually\ncaptured: `--approval-checkpoints` renders API message data, not the Slack client.\nA Slack sign-in screenshot is not proof of a workspace action.\nPreserve inspected client screenshots alongside native evidence. Posting slash\ntext through the API is not a slash invocation; Gateway approval RPCs are not\nbutton clicks. Do not infer typing from assistant status or start another Socket\nMode recorder with the SUT app token.\n\n## Completion\n\nReport scenario\u002Fmodel lane, stored native identities or safe counts, artifact\npaths, cleanup outcome, missing permissions, and any manual-only gap. Keep raw\nGateway capture, channel IDs, messages, media, and lease material private; publish\nonly sanitized proof. A successful API response with failed stored readback, an\nuncertain send, or failed cleanup is not an end-to-end pass.\n","# Slack agent E2E\n\n## Choose the proof\n\n| Goal                                                      | Entry point                 | Boundary                                                           |\n| --------------------------------------------------------- | --------------------------- | ------------------------------------------------------------------ |\n| Check shared user OAuth                                   | Read-only command below     | User\u002Fworkspace identity and channel history; no Gateway            |\n| Exercise user-authored text                               | Same command with `--smoke` | Create, read, edit, delete, verify absence; no Gateway reply claim |\n| Prove OpenClaw ingress, replies, tools, files, or restart | Existing QA Lab lane below  | Leased driver\u002FSUT bots and an isolated Gateway                     |\n| Prove real clicks, slash commands, or rendering           | Authorized Slack client     | Actual client observation, not reconstructed API data              |\n\nStart from a source checkout with normal dependencies and an existing Convex\nlogin. If needed, ask the operator to run `convex login` or the cached\n`bunx --no-install convex login`. The broker provides the authorized pool;\nagents do not need to copy Slack tokens. Login alone cannot supply a missing\npool credential or grant Slack permissions.\n\n## User OAuth: no QA Lab run\n\n```bash\nnode .agents\u002Fskills\u002Fslack-e2e\u002Fscripts\u002Fuser-oauth-smoke.mjs\nnode .agents\u002Fskills\u002Fslack-e2e\u002Fscripts\u002Fuser-oauth-smoke.mjs --smoke\n```\n\nThe default is read-only **in Slack**; both modes acquire, heartbeat, and release\na Convex lease. `--smoke` creates one synthetic, unmentioned top-level message,\nchecks stored authorship, edits it, and deletes that exact message. Existing\nworkspace listeners can still observe it. Each command uses a new private\nartifact directory and prints a safe result plus its path.\n\nRead [user OAuth setup and recovery](user-oauth.md) for the pool payload,\npermissions, result interpretation, and failure handling. This skill-owned\ncommand reuses the existing lease helper; it changes no QA Lab code or release\nlane and starts no Gateway or model. It does not add a user-driver option to\n`qa slack`.\n\n## Existing Gateway lane\n\nUse the source-checkout QA Lab owner for Gateway proof, not a separate bot\nrunner. A run owns a leased driver\u002FSUT pair, a temporary Gateway, native fixture\nreceipts, and private artifacts. The driver has no Socket Mode connection:\nthe SUT Gateway exclusively owns the app token and event delivery.\n\n1. Use the existing Convex login above. No Slack tokens, broker secrets, model\n   credentials, app creation, or scope grants belong in the command line.\n2. Inspect the available scenarios and run readiness:\n\n   ```bash\n   pnpm openclaw qa slack --list-scenarios\n   pnpm openclaw qa slack --doctor --output-dir .artifacts\u002Fqa-e2e\u002Fslack-doctor\n   ```\n\n   Doctor checks the **actual lease**: distinct bot identities in one workspace,\n   both bots' channel access, the owned Gateway connection, and advertised OAuth\n   scopes. Known missing scopes fail with their actor and exact names. Missing\n   scope metadata means mutation capability is **unverified**, not granted.\n   Missing optional file\u002Freaction scopes do not block text-only flows; they\n   block the affected native operations before dispatch. Doctor's full lifecycle\n   capability verdict remains separate from mandatory connection readiness.\n   A pool\u002Flogin\u002Fpermission failure is an owner prerequisite, not a reason to\n   rotate credentials until one passes. Every subsequent run checks its own lease.\n\n3. Run the native lifecycle recipe:\n\n   ```bash\n   pnpm openclaw qa slack \\\n     --scenario-file qa\u002Fscenarios\u002Fchannels\u002Fslack-e2e-lifecycle.yaml \\\n     --output-dir .artifacts\u002Fqa-e2e\u002Fslack-lifecycle\n   ```\n\n   `--doctor` and `--scenario-file` default to Convex, the CI role, and\n   `mock-openai`. This is real Slack\u002FGateway transport with a deterministic model.\n   Explicit overrides remain available; ordinary curated `qa slack` defaults do\n   not change. Use a unique output directory per run. Additional\n   `--scenario-file` arguments select additional complete YAML scenarios.\n\n4. Read the summary, evidence, and cleanup result before claiming success.\n   Choose [feature recipes](features.md) for native operations or model-tool\n   evidence, and [runtime recipes](runtime.md) for config\u002Frestart, custom flows,\n   cancellation, artifacts, and recovery.\n\n## Evidence boundary\n\n| Surface                                                                                 | What automation proves                                                               |\n| --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |\n| Mention\u002Fquiet ingress, owned edits\u002Fdeletes, reactions, upload, thread replies           | Fixture\u002FAPI operations and explicit stored readback; not model tool calls            |\n| Correlated SUT reply                                                                    | A stored reply from the leased SUT after ingress; mock or live model must be named   |\n| Gateway debug-proxy capture                                                             | Slack accepted a Gateway API write; neither Socket Mode event delivery nor rendering |\n| Block Kit, file IDs, reaction state                                                     | Stored structure\u002Fidentity only                                                       |\n| Human slash invocation, real button clicks, Agent View, visible rendering, human typing | Manual\u002FMantis client lane; bot\u002FAPI evidence is insufficient                          |\n\nFor visual or human-interaction requests, use an authorized, logged-in Slack\nclient; the maintained Mantis workflow is in\n`docs\u002Fconcepts\u002Fqa-e2e-automation\u002Foperator-flow.md`. Check which surface it actually\ncaptured: `--approval-checkpoints` renders API message data, not the Slack client.\nA Slack sign-in screenshot is not proof of a workspace action.\nPreserve inspected client screenshots alongside native evidence. Posting slash\ntext through the API is not a slash invocation; Gateway approval RPCs are not\nbutton clicks. Do not infer typing from assistant status or start another Socket\nMode recorder with the SUT app token.\n\n## Completion\n\nReport scenario\u002Fmodel lane, stored native identities or safe counts, artifact\npaths, cleanup outcome, missing permissions, and any manual-only gap. Keep raw\nGateway capture, channel IDs, messages, media, and lease material private; publish\nonly sanitized proof. A successful API response with failed stored readback, an\nuncertain send, or failed cleanup is not an end-to-end pass.\n",{"name":5,"description":7},"main","f1c93577085244aa96aa87b53a2df9b59d293bd7",".agents\u002Fskills\u002Fslack-e2e",82862,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw","https:\u002F\u002Fopenclaw.ai","https:\u002F\u002Fgithub.com\u002Fopenclaw","Your personal, open source AI assistant.","2026-11-11 08:46:30",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add openclaw\u002Fopenclaw --skill slack-e2e",{"tool":66,"command":67},"bunx","bunx skills add openclaw\u002Fopenclaw --skill slack-e2e",{"tool":69,"command":70},"pnpm","pnpm dlx skills add openclaw\u002Fopenclaw --skill slack-e2e","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fslack-e2e\u002FSKILL.md",true,[74,80,84,90],{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"features.md","REFERENCE","参考文档",7754,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fslack-e2e\u002Ffeatures.md",{"path":81,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":82,"sourceHtmlUrl":83},"runtime.md",5531,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fslack-e2e\u002Fruntime.md",{"path":85,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":88,"sourceHtmlUrl":89},"scripts\u002Fuser-oauth-smoke.mjs","SCRIPT","脚本",12735,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fslack-e2e\u002Fscripts\u002Fuser-oauth-smoke.mjs",{"path":91,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":92,"sourceHtmlUrl":93},"user-oauth.md",6743,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fslack-e2e\u002Fuser-oauth.md",[95,101,123,140,162,184],{"skillNo":96,"name":97,"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":98,"categories":99,"keywords":100,"publishedAt":46},"01M698VP84FNM6G9MR1HPX7MF7","lobster","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fextensions\u002Flobster\u002FSKILL.md",[],[97],{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":107,"publishedAt":46},"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",[],[103,108,39,109,110,111,112,113,114,115,116,117,118,119,120,121,122],"for","calls","replies","posts","upload","tap","install","brew","node","Media","search","npm","status","auth","cli",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":129,"publishedAt":46},"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",[],[125,130,131,114,132,115,133,134,135,136,137,138,108,139,31],"travel planning","travel","fetch","curl","https","help","planning","web","back","temperature",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":151,"publishedAt":46},"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",[146],{"categoryNo":147,"categoryName":148,"taxonomyType":149,"taxonomyTypeDesc":150},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[142,152,153,154,155,108,31,156,157,158,159,160,9,161],"widgets","openclaw dashboard","author","inline","show","code","create","visuals","dashboard","widget",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":174,"publishedAt":46},"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",[168,171],{"categoryNo":169,"categoryName":170,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":172,"categoryName":173,"taxonomyType":149,"taxonomyTypeDesc":150},"01JBSEEDCAT000000000000030","开发工程师",[164,134,175,176,177,178,179,180,114,115,181,133,39,182,183],"cloud","manage","via","rest api","token","atlassian","jq","REST","developer",{"skillNo":185,"name":186,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":190,"publishedAt":46},"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",[],[186,114,191,192,108,193,194,195,196,197,198,199,115,200,201,202,203,204,205],"send","darwin","keys","paste","output","control","prompts","interactive","list","capture","panes","text","monitor","sessions","linux"]