skills/ceo-setup/SKILL.md
One-time onboarding for the executive/manager commitment workflow — delegation-heavy, meeting prep, decision capture, morning and evening digests. Creates a `commitments` project and installs two dashboard widgets. After successful setup this skill is excluded from selection until the marker file is deleted.
npx skillsauth add nearai/ironclaw ceo-setupInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
IMPORTANT — tool calls are not optional. This skill is a setup procedure, not a summary to narrate. Do NOT emit any confirmation text (no "Done", no "✅ Your system is ready") until every tool call in Steps 1 through 7 has actually been executed and succeeded. If you skip to FINAL with a confirmation message, you have failed the task.
You are configuring the commitments system for an executive or manager. Their day is dominated by back-to-back meetings where decisions are made verbally, constant delegation (most commitments are "make sure someone else does X"), and information flowing both directions — team to executive (synthesis needed) and executive to team (tracking needed).
The system lives as a project at projects/commitments/. The project
is declared by writing files into that directory; no separate
project_create is needed.
projects/commitments/AGENTS.md — declares the project, seeds the mission system promptprojects/commitments/context.md — records the executive's current delegation patternscommitment-triage and commitment-digest missions scoped to this projectprojects/commitments/.system/widgets/Writing any file under projects/commitments/ is the declaration that
the project exists — the engine auto-registers it and scopes missions
to it. Start with the agent instructions:
memory_write(
target: "projects/commitments/AGENTS.md",
content: "# Commitments (Executive)\n\nThis project tracks obligations, delegations, decisions, and parked ideas for an executive.\n\n## Operating principles\n\n- Most commitments are delegations — default `delegated_to` when someone else is mentioned.\n- Signals expire after 24 hours unless promoted — executives move fast, stale signals are noise.\n- Group digests by responsibility type: DELEGATED vs OWNED vs DECISIONS PENDING.\n- For `agent_can_handle` items, ask permission before acting.\n- Start conservative; increase autonomy only after the user confirms patterns.\n",
append: false
)
memory_write(
target: "projects/commitments/context.md",
content: "# Commitments — Context\n\n## Current state\n\n{Fresh setup — no existing commitments yet.}\n\n## How the user works\n\n- Lots of delegation, often implicit (\"have Sarah handle X\")\n- Decisions captured in meetings, frequently revisited\n- Morning triage + evening wrap-up is the typical rhythm\n",
append: false
)
Reuse the shared schema from the commitment-setup skill by writing
projects/commitments/README.md with the complete schema (signals,
commitments, decisions, parked ideas — see that skill's Step 3 for the
full content). Then write executive calibration:
memory_write(
target: "projects/commitments/calibration.md",
content: "# Executive Commitment Calibration\n\n- Group commitments by responsibility type in digests — delegated items shown separately from owned items\n- For delegation follow-ups, draft a polite check-in rather than a blunt status request\n- Only capture explicit decisions, not brainstorming or hypotheticals ('yeah let's do X' = decision; 'maybe we should' = not a decision)\n- Signal expiration is 24 hours — executives move fast, stale signals are noise\n- Most CEO commitments are delegations, not personal tasks — default delegated_to when someone else is mentioned\n- When capturing decisions, note who was present and what it affects — executives revisit decisions frequently\n- Keep all communications scannable: bullet points, one-liners, no paragraphs\n- Start conservative: surface everything, don't auto-promote signals or auto-dispatch agent_can_handle without approval\n",
append: false
)
mission_create(
name: "commitment-triage",
goal: "Executive triage. Read projects/commitments/README.md for schema. Priority order: (1) Check delegated items (status=waiting, delegated_to set) — if not updated in 2 days, flag for follow-up and draft a polite check-in message. (2) Check overdue items — escalate urgency. (3) Expire signals older than 24 hours. (4) For signals with immediacy=realtime, broadcast immediately via message tool. (5) Promote high-confidence signals to commitments — default resolution_path to needs_decision for ambiguous items. (6) Route informational signals to intelligence (write MemoryDoc to context/intel/). (7) Append triage summary to projects/commitments/triage-log.md. (8) Refresh projects/commitments/widgets/state.json with current counts for the dashboard widgets. (9) If anything needs attention, send a concise alert.",
cadence: "0 9,13,18 * * *",
project_id: "commitments"
)
mission_create(
name: "commitment-digest",
goal: "Executive commitments digest. Read projects/commitments/README.md for schema. Gather all open commitments via memory_tree and memory_read. Group by responsibility: (1) DELEGATED — items where delegated_to is set, with days since delegation and follow-up status. (2) OWNED — items you need to act on personally, sorted by urgency. For agent_can_handle items, note what the agent would do and ask permission. (3) DECISIONS PENDING — items with resolution_path=needs_decision. (4) RECENT DECISIONS — decisions captured in the last 7 days (from projects/commitments/decisions/), including any needing outcome assessment. Keep each item to one line. End with pending signal count and 'Did I miss anything?' Send via message tool.",
cadence: "0 8,17 * * 1-5",
project_id: "commitments"
)
Two widgets live at projects/commitments/.system/widgets/. The
triage mission refreshes projects/commitments/widgets/state.json
each run; both widgets poll it and render. Write these six files
verbatim:
commitments-this-weekmemory_write(
target: "projects/commitments/.system/widgets/commitments-this-week/manifest.json",
content: "{\n \"id\": \"commitments-this-week\",\n \"name\": \"Commitments This Week\",\n \"slot\": \"tab\",\n \"icon\": \"📅\",\n \"position\": \"after:memory\"\n}\n",
append: false
)
memory_write(
target: "projects/commitments/.system/widgets/commitments-this-week/index.js",
content: "(function () {\n var root = document.querySelector('[data-widget=\"commitments-this-week\"]');\n if (!root) return;\n root.innerHTML = '<div class=\"cw-loading\">Loading…</div>';\n\n async function fetchState() {\n try {\n var resp = await fetch('/api/memory/read?path=' + encodeURIComponent('projects/commitments/widgets/state.json'), { credentials: 'same-origin' });\n if (!resp.ok) throw new Error('status ' + resp.status);\n var body = await resp.json();\n var raw = typeof body === 'string' ? body : (body && body.content) || '{}';\n return JSON.parse(raw);\n } catch (err) { return { __error: String(err) }; }\n }\n\n function esc(s) {\n return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');\n }\n\n function render(state) {\n if (!state || state.__error) {\n root.innerHTML = '<div class=\"cw-empty\">No triage data yet. Run the triage mission to populate.</div>';\n return;\n }\n var week = state.this_week || {};\n var overdue = (state.overdue && state.overdue.length) || 0;\n var due = (week.due && week.due.length) || 0;\n var completed = (week.completed && week.completed.length) || 0;\n var html = '';\n html += '<div class=\"cw-row cw-row-overdue\"><span class=\"cw-label\">Overdue</span><span class=\"cw-count\">' + overdue + '</span></div>';\n html += '<div class=\"cw-row\"><span class=\"cw-label\">Due this week</span><span class=\"cw-count\">' + due + '</span></div>';\n html += '<div class=\"cw-row cw-row-done\"><span class=\"cw-label\">Completed this week</span><span class=\"cw-count\">' + completed + '</span></div>';\n if (week.due && week.due.length) {\n html += '<ul class=\"cw-list\">';\n week.due.slice(0, 8).forEach(function (item) {\n html += '<li><span class=\"cw-title\">' + esc(item.title || item.path) + '</span>';\n if (item.due) html += ' <span class=\"cw-date\">' + esc(item.due) + '</span>';\n html += '</li>';\n });\n html += '</ul>';\n }\n root.innerHTML = html;\n }\n\n render({ __pending: true });\n fetchState().then(render);\n setInterval(function () { fetchState().then(render); }, 60000);\n})();\n",
append: false
)
memory_write(
target: "projects/commitments/.system/widgets/commitments-this-week/style.css",
content: "[data-widget=\"commitments-this-week\"] { font-family: system-ui, sans-serif; padding: 12px; }\n[data-widget=\"commitments-this-week\"] .cw-row { display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid var(--border, #eee); }\n[data-widget=\"commitments-this-week\"] .cw-label { color: var(--text-secondary, #666); }\n[data-widget=\"commitments-this-week\"] .cw-count { font-weight: 600; }\n[data-widget=\"commitments-this-week\"] .cw-row-overdue .cw-count { color: #c33; }\n[data-widget=\"commitments-this-week\"] .cw-row-done .cw-count { color: #090; }\n[data-widget=\"commitments-this-week\"] .cw-list { list-style: none; padding: 0; margin: 12px 0 0; }\n[data-widget=\"commitments-this-week\"] .cw-list li { padding: 6px 0; display: flex; justify-content: space-between; gap: 8px; font-size: 14px; }\n[data-widget=\"commitments-this-week\"] .cw-title { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n[data-widget=\"commitments-this-week\"] .cw-date { color: var(--text-secondary, #888); font-variant-numeric: tabular-nums; }\n[data-widget=\"commitments-this-week\"] .cw-empty, [data-widget=\"commitments-this-week\"] .cw-loading { color: var(--text-secondary, #888); padding: 16px 0; }\n",
append: false
)
delegations-waitingmemory_write(
target: "projects/commitments/.system/widgets/delegations-waiting/manifest.json",
content: "{\n \"id\": \"delegations-waiting\",\n \"name\": \"Delegations Waiting\",\n \"slot\": \"tab\",\n \"icon\": \"⏳\",\n \"position\": \"after:commitments-this-week\"\n}\n",
append: false
)
memory_write(
target: "projects/commitments/.system/widgets/delegations-waiting/index.js",
content: "(function () {\n var root = document.querySelector('[data-widget=\"delegations-waiting\"]');\n if (!root) return;\n root.innerHTML = '<div class=\"dw-loading\">Loading…</div>';\n\n async function fetchState() {\n try {\n var resp = await fetch('/api/memory/read?path=' + encodeURIComponent('projects/commitments/widgets/state.json'), { credentials: 'same-origin' });\n if (!resp.ok) throw new Error('status ' + resp.status);\n var body = await resp.json();\n var raw = typeof body === 'string' ? body : (body && body.content) || '{}';\n return JSON.parse(raw);\n } catch (err) { return { __error: String(err) }; }\n }\n\n function esc(s) {\n return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');\n }\n\n function render(state) {\n if (!state || state.__error) {\n root.innerHTML = '<div class=\"dw-empty\">No delegation data yet.</div>';\n return;\n }\n var delegations = state.delegations_waiting || [];\n if (!delegations.length) {\n root.innerHTML = '<div class=\"dw-empty\">No delegations waiting — nice.</div>';\n return;\n }\n var html = '<ul class=\"dw-list\">';\n delegations.forEach(function (item) {\n var stale = (item.days_waiting || 0) >= 2;\n html += '<li class=\"dw-item' + (stale ? ' dw-stale' : '') + '\">';\n html += '<div class=\"dw-title\">' + esc(item.title || item.path) + '</div>';\n html += '<div class=\"dw-meta\">';\n if (item.delegated_to) html += '<span class=\"dw-who\">' + esc(item.delegated_to) + '</span>';\n if (item.days_waiting !== undefined) html += '<span class=\"dw-age\">' + item.days_waiting + 'd</span>';\n html += '</div>';\n html += '</li>';\n });\n html += '</ul>';\n root.innerHTML = html;\n }\n\n render({ __pending: true });\n fetchState().then(render);\n setInterval(function () { fetchState().then(render); }, 60000);\n})();\n",
append: false
)
memory_write(
target: "projects/commitments/.system/widgets/delegations-waiting/style.css",
content: "[data-widget=\"delegations-waiting\"] { font-family: system-ui, sans-serif; padding: 12px; }\n[data-widget=\"delegations-waiting\"] .dw-list { list-style: none; padding: 0; margin: 0; }\n[data-widget=\"delegations-waiting\"] .dw-item { padding: 10px 0; border-bottom: 1px solid var(--border, #eee); }\n[data-widget=\"delegations-waiting\"] .dw-title { font-size: 14px; font-weight: 500; }\n[data-widget=\"delegations-waiting\"] .dw-meta { display: flex; gap: 12px; margin-top: 4px; font-size: 12px; color: var(--text-secondary, #666); }\n[data-widget=\"delegations-waiting\"] .dw-stale .dw-age { color: #c33; font-weight: 600; }\n[data-widget=\"delegations-waiting\"] .dw-empty, [data-widget=\"delegations-waiting\"] .dw-loading { color: var(--text-secondary, #888); padding: 16px 0; }\n",
append: false
)
memory_write(
target: "projects/commitments/.ceo-setup-complete",
content: "# CEO Setup Complete\n\nCompleted: <today's UTC date>\n\nMissions installed: commitment-triage, commitment-digest\nWidgets installed: commitments-this-week, delegations-waiting\n",
append: false
)
To re-trigger setup, delete projects/commitments/.ceo-setup-complete
(and optionally the project entirely under projects/commitments/).
These activate automatically when the user mentions obligations, delegations, decisions, or parked ideas:
| Skill | Trigger |
|---|---|
| commitment-triage | pending signals, overdue items |
| commitment-digest | "show commitments", "who owes me what" |
| decision-capture | "let's go with X", "decided to…" |
| delegation-tracker | "tell Sarah to…", "waiting on…" |
| idea-parking | "park this", "save for later" |
Only after every tool call above succeeded, send the user:
Your executive commitment system is ready:
- Project:
projects/commitments/— visible in your workspace and project dashboard- Triage runs 3x daily (9am, 1pm, 6pm) — delegation follow-ups after 2 days, signals expire after 24h
- Digest runs morning (8am) and evening (5pm) on weekdays — grouped by delegated vs owned vs decisions pending
- Dashboard widgets: "Commitments this week" + "Delegations waiting" — refresh every minute from the triage state file
- I'll capture decisions from our conversations and track delegations automatically
- For items I can handle (PR reviews, drafts, research), I'll ask your permission first
- Say "show commitments" anytime, or "who owes me what?" for delegation status
- Use
/plan <description>to create a structured execution plan for complex initiatives- I start conservative — I'll learn your preferences over time as you confirm or override my suggestions
development
Linear issue tracker API integration. Covers first-use identity bootstrap (viewer + teams cached), raw GraphQL for list/search/create/update, and the rules for handling "my issues" / "assigned to me" requests.
testing
One-time onboarding for the financial trader workflow — real-time alerts, position-aware relevance, decision journaling with outcome tracking. After successful setup this skill is excluded from selection until the marker file is deleted.
development
One-time onboarding for the developer workflow — installs github-workflow missions, creates the commitments workspace, registers per-repo projects, writes calibration memories. After successful setup this skill is excluded from selection until the marker file is deleted.
devops
One-time onboarding for the content creator workflow — content pipeline stages, trend expiration, cross-platform cascades, heavy idea parking. After successful setup this skill is excluded from selection until the marker file is deleted.