{"id":"action-runner","name":"action-runner","summary":"スキルの推奨を実際の実行行動に変える――チケットを開き、問題を提出し、更新を投稿する――安全に:予行プレビュー、リスク分類、承認ゲート、そして脳に記録する。","body":"# Action Runner Skill\n\nThe library is great at *recommending* work. This skill executes it — the action layer of the\n[Professional Brain](../professional-brain/SKILL.md) (Phase 2). A skill says \"open a ticket per\nchecklist item\"; this turns that into real GitHub/Linear/Slack actions, **safely**: previewed,\nrisk-rated, approved, then recorded. The cardinal rule: **nothing acts silently.**\n\n## What This Skill Produces\n\n1. A **dry-run actions plan** — every proposed action with its target, operation, and **risk**.\n2. After approval, the **executed actions** (via the connected action MCP) — outbound/destructive\n   ones gated individually.\n3. A **record back to the brain** of what was actually done, with provenance.\n\n## Required Inputs\n\nAsk for (if not already provided):\n- **The recommendations to act on** (a launch checklist, PRD requirements, postmortem follow-ups…).\n- **The connected action MCP** and **targets** — which GitHub repo / Linear project / Slack channel. Scope is limited to what the user names; never act outside it.\n- **Approval posture** — what may run with a single OK vs. what needs per-action confirmation.\n\n## How it works\n\n```\nrecommend → build an actions plan (JSON) → preview + risk-gate → approve → execute → record\n```\n\n1. **Build the plan** — express each action as JSON: `{\"target\",\"op\",\"args\",\"why\",\"risk?\"}`.\n2. **Preview + gate** — run the helper; it prints a dry-run, classifies risk (🟢 low / 🟡 medium /\n   🔴 high), and **refuses to proceed while any 🔴 outbound/destructive action is unapproved**:\n   ```bash\n   echo '<plan json>' | python3 scripts/action_preview.py -\n   # after the user approves the risky ones:\n   echo '<plan json>' | python3 scripts/action_preview.py - --allow-high\n   ```\n3. **Approve** — low/medium can run on a single confirmation; every 🔴 (post, send, delete, deploy,\n   merge, charge…) needs explicit per-action approval. Default is **do nothing** until told.\n4. **Execute** — only approved actions, only via the connected action MCP (e.g. Composio/GitHub\n   `create_issue`). One target at a time; stop and report on the first failure.\n5. **Record** — append what was actually done to the brain so the loop closes:\n   ```bash\n   python3 ../professional-brain/scripts/brain_write.py ./brain decisions \"Filed launch tickets\" \\\n     --tag external --body \"Opened 7 issues in acme/app from the launch checklist\" --commit\n   ```\n\n## Supported action targets\n\nAny action MCP can be wired in; these are the common targets, with example operations and the\n**default risk** the gate applies. Reads are 🟢; anything outbound, destructive, or that spends is 🔴.\n\n| Target | Example operations | Default risk |\n|---|---|---|\n| **GitHub** | `create_issue`, `comment`, `open_pr` · (`merge_pr`, `close` 🔴) | 🟡 (🔴 for merge/close) |\n| **Linear / Jira** | `create_issue`, `update_status`, `comment` | 🟡 |\n| **Slack** | `post_message`, `reply_in_thread` (outbound → always confirm) | 🔴 |\n| **Notion** | `append_block`, `create_page`, `update_property` | 🟡 (🔴 if it overwrites) |\n| **Email / Gmail** | `send_email` (outbound) | 🔴 |\n| **Calendar** | `create_event`, `invite` (outbound) | 🟡 (🔴 if it emails invitees) |\n\nPick the narrowest target and op that does the job, scope to exactly what the user named, and let the\nrisk gate decide what needs explicit approval. Outbound messages (Slack/email) are 🔴 by default —\nthe model never posts on someone's behalf without a per-action yes.\n\n## Safety rules (non-negotiable)\n\n- **Dry-run by default.** The plan is shown before anything runs.\n- **Approval-gated.** No execution without a yes; 🔴 actions are confirmed one by one.\n- **Scope-limited.** Only the repos/channels/projects the user named.\n- **Logged.** Every executed action is recorded to the brain with an `[external]` tag and a link.\n- **No silent retries, no bulk outbound.** If a step fails, stop and surface it.\n\n## The contract for other skills\n\nAn action-aware skill adds a short **\"Proposes Actions\"** section: after producing its artifact,\nit lists the actions it *could* take (target · op · why), then hands off to `action-runner` —\nwhich previews, gates, executes, and records. The skill never executes directly.\n\n## Output Format\n\n1. **Proposed actions** — a table: # · target · operation · why · risk.\n2. **Gate result** — the preview output; the 🔴 actions needing approval called out explicitly.\n3. **Executed** (after approval) — what ran, with links/IDs returned by the MCP.\n4. **Recorded to the brain** — the line(s) appended, with provenance.\n\n## Quality Checks\n\n- [ ] A dry-run plan is shown before anything executes\n- [ ] Every action has a risk level; 🔴 actions are individually approved\n- [ ] Execution stays within the named scope and uses only the connected MCP\n- [ ] Each executed action is recorded back to the brain with an `[external]` tag\n- [ ] On failure, it stops and reports rather than retrying blindly\n\n## Anti-Patterns\n\n- Executing anything without showing the dry-run plan first\n- Treating an outbound/destructive action (post, email, delete, deploy) as low-risk\n- Acting outside the scope the user named, or fanning out to many targets\n- \"Helpfully\" doing more than was approved\n- Forgetting to record what was done — the brain must reflect reality","author":"@mohitagw15856","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/mohitagw15856/pm-claude-skills/tree/main/exports/openclaw/action-runner","license":"MIT","category":null,"lang":"en","tokens":1324,"stars":0,"calls30d":2,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[{"code":"injection.preauthorise","kind":"injection","where":"SKILL.md:55","excerpt":"always confirm","message":"pre-authorises approvals on the user’s behalf","severity":"warn"}],"scannedAt":"2026-08-22","hasScripts":false,"networkEndpoints":[]}}