# Skill Meta

> Interactive system builder. Invoke for /meta command to create tasks for .claude/ system changes.

- Skill: `benbrastmckie/skill-meta-3` (Agent Skill)
- Install (CLI): `npx skillmds@latest add benbrastmckie/skill-meta-3`
- Raw SKILL.md: https://api.skillmd.com/api/skills/benbrastmckie/skill-meta-3/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: benbrastmckie (https://skillmd.com/u/benbrastmckie)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/benbrastmckie/skill-meta-3

---


# Meta Skill

Thin wrapper that delegates system building to `meta-builder-agent` subagent. This skill handles all three modes of /meta: interactive interview, prompt analysis, and system analysis.

**IMPORTANT**: This skill implements the skill-internal postflight pattern. After the subagent returns,
this skill handles all postflight operations (git commit if tasks created) before returning.
This eliminates the "continue" prompt issue between skill return and orchestrator.

## Context References

Reference (do not load eagerly):
- Path: `.claude/context/formats/return-metadata-file.md` - Metadata file schema
- Path: `.claude/context/patterns/postflight-control.md` - Marker file protocol
- Path: `.claude/context/patterns/file-metadata-exchange.md` - File I/O helpers

Note: This skill is a thin wrapper with internal postflight. Context is loaded by the delegated agent.

## Trigger Conditions

This skill activates when:
- /meta command is invoked (with any arguments)
- User requests system building or task creation for .claude/ changes
- System analysis is requested (--analyze flag)

---

## Anti-Bypass Constraint

**PROHIBITION**: This skill and its delegated agent (meta-builder-agent) MUST NOT write to `.claude/` paths using Write or Edit tools. The /meta workflow creates TASKS only. All `.claude/` file modifications happen through the /implement lifecycle with proper skill delegation.

**Detected by**: PostToolUse hook `validate-meta-write.sh` provides corrective context if bypass is attempted.

**Legitimate writes**: Only `specs/` paths (TODO.md, state.json, task directories) are valid write targets for this skill chain.

---

## Execution

### 1. Input Validation

Validate and classify mode from arguments:

**Mode Detection Logic**:
```bash
# Parse arguments
args="$ARGUMENTS"

# Target resolution: global-by-default, --local is the only opt-out, no interactive prompt.
# Note: parse-command-args.sh is NOT sourced here — its Step 6 task-number validation gate
# hard-fails on /meta's free-form argument grammar (/meta takes a prompt, never N[,N-N]).
# This standalone check is a deliberate, same-shaped parallel to that script's --local handling
# (LOCAL_FLAG regex-match + sed-strip convention), not a redundant reimplementation of it.
GLOBAL_ROOT="${CLAUDE_AGENT_GLOBAL_ROOT:-$HOME/.config/nvim}"
local_mode="false"
if [[ "$args" =~ --local ]]; then
  local_mode="true"
fi
args=$(echo "$args" | sed 's/--local//g' | xargs)

# Determine mode (classified AFTER --local is stripped, so `/meta --local` does not
# mis-classify as mode=prompt with prompt="--local")
if [ -z "$args" ]; then
  mode="interactive"
elif [ "$args" = "--analyze" ]; then
  mode="analyze"
else
  mode="prompt"
  prompt="$args"
fi

# Resolve target_root from local_mode. This is a genuine no-op when invoked from within
# $GLOBAL_ROOT — the same code path runs and resolves to the same repo; there is no
# special-casing branch for "already at the global root".
if [ "$local_mode" = "true" ]; then
  target_root="$(git rev-parse --show-toplevel)"
  mode_target="local"
else
  target_root="$GLOBAL_ROOT"
  mode_target="global"
fi
```

No task_number validation needed - /meta creates new tasks rather than operating on existing ones.

### 2. Context Preparation

Prepare delegation context:

```json
{
  "session_id": "sess_{timestamp}_{random}",
  "delegation_depth": 1,
  "delegation_path": ["orchestrator", "meta", "skill-meta"],
  "timeout": 7200,
  "mode": "interactive|prompt|analyze",
  "prompt": "{user prompt if mode=prompt, null otherwise}",
  "mode_target": "global|local",
  "target_root": "{resolved absolute path — $GLOBAL_ROOT in global mode, current repo root in local mode}"
}
```

### 3. Invoke Subagent

**CRITICAL**: You MUST use the **Agent** tool to spawn the subagent.

The `agent` field in this skill's frontmatter specifies the target: `meta-builder-agent`

**Required Tool Invocation**:
```
Tool: Agent (NOT Skill, NOT Plan)
Parameters:
  - subagent_type: "meta-builder-agent"
  - prompt: [Include mode, prompt if provided, delegation_context (with mode_target/target_root),
             AND the path-qualification imperative below]
  - description: "Execute meta building in {mode} mode"
```

**DO NOT** use `Skill(meta-builder-agent)` - this will FAIL.
Agents live in `.claude/agents/`, not `.claude/skills/`.
The Skill tool can only invoke skills from `.claude/skills/`.

**REQUIRED path-qualification imperative in the Agent-tool prompt**: because Write/Edit tool path
resolution is completely independent of shell cwd (no `cd` in any Bash call affects it), the prompt
sent to `meta-builder-agent` MUST include an explicit, unambiguous instruction that every
task-directory Write/Edit path be qualified by `target_root` (or be an absolute path) — NEVER a
bare `specs/...` relative path. For example: "All task-directory paths (TODO.md, state.json, task
dirs) MUST be written as `{target_root}/specs/...`, never as a bare `specs/...` relative path."
This instruction is carried by the prompt today; a dependent follow-up task makes it durable in the
agent definition itself (`meta-builder-agent.md`) rather than relying on prompt text alone.

The subagent will:
- Load component guides on-demand based on mode
- Execute mode-specific workflow:
  - **Interactive**: Run 7-stage interview with AskUserQuestion
  - **Prompt**: Analyze request and propose task breakdown
  - **Analyze**: Inventory existing components and provide recommendations
- Create task entries (TODO.md, state.json, task directories) for non-analyze modes
- Return standardized JSON result

### 4. Return Validation

Validate return matches `return-metadata-file.md` schema:
- Status is one of: completed, partial, failed, blocked
- Summary is non-empty and <100 tokens
- Artifacts array present (task directories for interactive/prompt modes)
- Metadata contains session_id, agent_type, delegation info

### 5. Return Propagation

Return validated result to caller without modification.

---

## Return Format

See `.claude/context/formats/return-metadata-file.md` for full specification.

### Expected Return: Interactive Mode (tasks created)

```json
{
  "status": "tasks_created",
  "summary": "Created 2 tasks for command creation workflow. Tasks start in NOT STARTED status.",
  "artifacts": [
    {
      "type": "task",
      "path": "specs/430_create_export_command/",
      "summary": "Task directory for new command"
    },
    {
      "type": "task",
      "path": "specs/431_export_command_tests/",
      "summary": "Task directory for tests"
    }
  ],
  "metadata": {
    "session_id": "sess_1736700000_abc123",
    "agent_type": "meta-builder-agent",
    "delegation_depth": 1,
    "delegation_path": ["orchestrator", "meta", "meta-builder-agent"],
    "mode": "interactive",
    "tasks_created": 2,
    "tasks_status": "not_started"
  },
  "next_steps": "Run /research 430 to begin research on first task"
}
```

**Note**: Tasks created via `/meta` start in NOT STARTED status. Run `/research N` to begin the standard research -> plan -> implement lifecycle.

### Expected Return: Analyze Mode (read-only)

```json
{
  "status": "analyzed",
  "summary": "System analysis complete. Found 9 commands, 9 skills, 6 agents, and 15 active tasks.",
  "artifacts": [],
  "metadata": {
    "session_id": "sess_1736700000_xyz789",
    "agent_type": "meta-builder-agent",
    "delegation_depth": 1,
    "delegation_path": ["orchestrator", "meta", "meta-builder-agent"],
    "mode": "analyze",
    "component_counts": {
      "commands": 9,
      "skills": 9,
      "agents": 6,
      "active_tasks": 15
    }
  },
  "next_steps": "Review analysis and run /meta to create tasks if needed"
}
```

### Expected Return: User Cancelled

```json
{
  "status": "cancelled",
  "summary": "User cancelled task creation at confirmation stage. No tasks created.",
  "artifacts": [],
  "metadata": {
    "session_id": "sess_1736700000_def456",
    "agent_type": "meta-builder-agent",
    "delegation_depth": 1,
    "delegation_path": ["orchestrator", "meta", "meta-builder-agent"],
    "mode": "interactive",
    "cancelled": true
  },
  "next_steps": "Run /meta again when ready to create tasks"
}
```

---

## Error Handling

### Input Validation Errors
Return immediately with failed status if arguments are malformed.

### Subagent Errors
Pass through the subagent's error return verbatim.

### User Cancellation
Return completed status (not failed) when user explicitly cancels at confirmation stage.

### Timeout
Return partial status if subagent times out (default 7200s for interactive sessions).

---

## MUST NOT (Postflight Boundary)

After the agent returns, this skill MUST NOT:

1. **Edit .claude/ files** - All system building is done by agent
2. **Create task directories** - Task creation is done by agent
3. **Run analysis commands** - Analysis is agent work
4. **Write documentation** - Artifact creation is agent work
5. **Use AskUserQuestion** - User interaction is agent work

The postflight phase is LIMITED TO:
- Reading agent return
- Git commit (if tasks were created)

### Postflight Git Commit

If the agent return indicates tasks were created, commit at `target_root` (resolved in Section 1).
This MUST be issued as a **single Bash tool call** — shell cwd from a `cd` in one Bash invocation
does not persist into a later, separate Bash invocation, so `GLOBAL_ROOT`/`target_root` must be
re-derived and chained inline at the point of use, every time:

```bash
GLOBAL_ROOT="${CLAUDE_AGENT_GLOBAL_ROOT:-$HOME/.config/nvim}"
cd "$GLOBAL_ROOT" && git add specs/ && git commit -m "task {N}: create {title}

Session: {session_id}
"
```

In local mode, the identical block runs with `target_root` (the current repo root) substituted
for `$GLOBAL_ROOT` — this is the same code path, not a separate branch; when the current repo
already IS `$GLOBAL_ROOT`, both modes resolve to an identical commit target (the no-op case).

Reference: @.claude/context/standards/postflight-tool-restrictions.md

