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.
Install with the open skills CLI (global, non-interactive — available in every Claude Code session):
npx skills add nearai/ironclaw --skill "ceo-setup" -g -a claude-code -yOr manually — copy the SKILL.md below into:
~/.claude/skills/ceo-setup/SKILL.md---
name: ceo-setup
version: 0.4.0
description: 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.
activation:
setup_marker: projects/commitments/.ceo-setup-complete
keywords:
- ceo assistant
- executive assistant
- manager assistant
- delegation setup
- meeting prep
- action items
- leadership workflow
patterns:
- "(?i)I'm a (CEO|manager|executive|director|VP|founder)"
- "(?i)set ?up.*(executive|manager|leadership|delegation)"
- "(?i)help me manage my (day|schedule|team|obligations)"
tags:
- commitments
- executive
- delegation
- setup
max_context_tokens: 2500
requires:
skills:
- commitment-triage
- commitment-digest
- decision-capture
- delegation-tracker
- idea-parking
---
# CEO / Manager — Commitment System Setup
**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.
## Order of operations (sequential, one tool call at a time)
1. Write `projects/commitments/AGENTS.md` — declares the project, seeds the mission system prompt
2. Write `projects/commitments/context.md` — records the executive's current delegation patterns
3. Write the schema README and calibration
4. Create `commitment-triage` and `commitment-digest` missions scoped to this project
5. Install two dashboard widgets under `projects/commitments/.system/widgets/`
6. Write the setup-complete marker
7. Only after every tool call above has succeeded, emit the Step 8 confirmation text
## Step 1: Declare the project
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
)
```
## Step 2: Write context
```
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
)
```
## Step 3: Schema and calibration
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
)
```
## Step 4: Create missions scoped to the project
### Triage — 3x daily, shorter signal TTL
```
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"
)
```
### Digest — morning + evening weekdays, grouped by responsibility
```
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"
)
```
## Step 5: Install dashboard widgets
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:
### Widget 1: `commitments-this-week`
```
memory_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
)
```
### Widget 2: `delegations-waiting`
```
memory_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
)
```
## Step 6: Mark setup complete
```
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/`).
## Step 7: Companion skills
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" |
## Step 8: Confirm
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
You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.
Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies
Use when you have a written implementation plan to execute in a separate session with review checkpoints