@siddicky/oh-my-musecode 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/.claude-plugin/marketplace.json +18 -0
  2. package/.claude-plugin/plugin.json +30 -0
  3. package/.muse-plugin/plugin.json +94 -0
  4. package/LICENSE +32 -0
  5. package/README.md +190 -0
  6. package/dist/mcp/state-server.d.ts +13 -0
  7. package/dist/mcp/state-server.js +109 -0
  8. package/dist/mcp/state-server.js.map +1 -0
  9. package/dist/paths.d.ts +58 -0
  10. package/dist/paths.js +167 -0
  11. package/dist/paths.js.map +1 -0
  12. package/dist/personas.d.ts +40 -0
  13. package/dist/personas.js +93 -0
  14. package/dist/personas.js.map +1 -0
  15. package/dist/state.d.ts +38 -0
  16. package/dist/state.js +59 -0
  17. package/dist/state.js.map +1 -0
  18. package/docs/recipe.md +253 -0
  19. package/hooks/hooks.json +34 -0
  20. package/hooks/lib.mjs +66 -0
  21. package/hooks/routing.mjs +99 -0
  22. package/hooks/session-start.mjs +34 -0
  23. package/hooks/stop.mjs +52 -0
  24. package/hooks/user-prompt-submit.mjs +16 -0
  25. package/package.json +57 -0
  26. package/personas/architect/SOUL.md +27 -0
  27. package/personas/code-reviewer/SOUL.md +30 -0
  28. package/personas/critic/SOUL.md +28 -0
  29. package/personas/debugger/SOUL.md +28 -0
  30. package/personas/executor/SOUL.md +25 -0
  31. package/personas/explore/SOUL.md +24 -0
  32. package/personas/manifest.json +119 -0
  33. package/personas/planner/SOUL.md +25 -0
  34. package/personas/test-engineer/SOUL.md +27 -0
  35. package/personas/verifier/SOUL.md +29 -0
  36. package/personas/writer/SOUL.md +27 -0
  37. package/scripts/install.mjs +303 -0
  38. package/scripts/preflight.mjs +121 -0
  39. package/scripts/settings-install.mjs +155 -0
  40. package/scripts/verify-manifest.mjs +211 -0
  41. package/scripts/verify-skills.mjs +78 -0
  42. package/skills/cancel/SKILL.md +76 -0
  43. package/skills/deep-dive/SKILL.md +73 -0
  44. package/skills/deep-interview/SKILL.md +101 -0
  45. package/skills/ralph/SKILL.md +111 -0
  46. package/skills/ralplan/SKILL.md +96 -0
  47. package/skills/team/SKILL.md +94 -0
  48. package/skills/trace/SKILL.md +75 -0
@@ -0,0 +1,73 @@
1
+ ---
2
+ name: deep-dive
3
+ description: Two-stage front door for a fuzzy problem that might be a bug or might be a product question — run trace first to establish what is actually happening, then deep-interview to turn the confirmed problem into a spec. Use ONLY when the user explicitly asks for a deep dive or invokes /deep-dive, typically when they are not yet sure whether the issue is a defect or a scope question. Do NOT use when the nature of the problem is already clear: go straight to /trace for a known bug, or straight to /deep-interview for a known scoping gap.
4
+ ---
5
+
6
+ # Deep Dive
7
+
8
+ A front door for requests where it is not yet clear whether the real problem
9
+ is "something is broken" or "the scope is unclear." Runs two existing skills
10
+ in sequence rather than duplicating their logic.
11
+
12
+ Explicit invocation only, like every skill in this corpus. This skill does
13
+ not get triggered by Muse noticing an ambiguous or complex request on its
14
+ own — you invoke it, or the user does.
15
+
16
+ ## When to use this
17
+
18
+ Use it when a request arrives as something like "this whole area feels off"
19
+ or "users are complaining about X but I don't know if it's a bug or a
20
+ missing feature" — genuine uncertainty about which lane the problem belongs
21
+ in. Do not use it when the lane is already obvious: a reproducible crash
22
+ goes straight to `/trace`; a clear "we need to decide how this should work"
23
+ goes straight to `/deep-interview`. Using this skill on an already-clear
24
+ request just adds a redundant stage.
25
+
26
+ ## Stage 1 — Trace
27
+
28
+ Read the `trace` skill's body (`read_skill trace` or invoke it directly) and
29
+ run its method against the reported symptom: state the symptom, generate
30
+ competing hypotheses, spawn parallel evidence-gatherers via `subagent_spawn`,
31
+ and converge on a best-evidenced explanation. Do this stage in full — do not
32
+ skip straight to interviewing because the report sounds product-shaped; the
33
+ trace stage is what tells you whether it actually is.
34
+
35
+ Stop and evaluate after stage 1:
36
+
37
+ - **Root cause found, fix is small and well-understood** — this is no longer
38
+ a deep-dive matter. Report the cause and the fix in prose and ask the user
39
+ whether to apply it. Do not proceed to stage 2 for a confirmed simple bug.
40
+ - **Root cause found, but fixing it right implies a real design decision**
41
+ (multiple valid approaches, user-facing tradeoffs, or scope beyond the
42
+ original symptom) — proceed to stage 2.
43
+ - **No clear cause, but the investigation surfaced that the actual ask is
44
+ underspecified product scope rather than a defect** — proceed to stage 2.
45
+ - **No clear cause and no scope question — genuinely still stuck** — report
46
+ the trace's evidence table and the next most informative probe. Do not
47
+ force a transition into stage 2 just to have something to hand off.
48
+
49
+ ## Stage 2 — Deep Interview
50
+
51
+ Read the `deep-interview` skill's body and run its method, seeded with the
52
+ trace stage's findings: state what was confirmed, what was ruled out, and
53
+ what remains genuinely open. Do not re-ask questions the trace stage already
54
+ answered — hand its evidence in as established fact base, not as unknowns to
55
+ reopen.
56
+
57
+ Carry the interview through to its own approval gate. Deep-interview owns
58
+ its own spec-writing and approval flow (`.omm/specs/<slug>.md`, explicit
59
+ `Approve`/`Request changes`/`Cancel`); do not shortcut it here.
60
+
61
+ ## State
62
+
63
+ Trace state and interview state are each owned by their own skill
64
+ (`.omm/state/trace-<slug>.md`, `.omm/specs/<slug>.md`). This skill does not
65
+ introduce a separate state file — it is a sequencing wrapper, not an
66
+ independent stage with its own persistence.
67
+
68
+ ## Handoff
69
+
70
+ Once the interview stage reaches an approved spec, follow deep-interview's
71
+ own handoff: tell the user in prose to run `/ralplan .omm/specs/<slug>.md`
72
+ next. If stage 1 alone resolved the matter, there is no further handoff —
73
+ say so and stop.
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: deep-interview
3
+ description: Run a Socratic interview that turns a vague request into a decision-complete spec, gated by a measured ambiguity score instead of a fixed question count. Use ONLY when the user explicitly asks for a deep interview, invokes /deep-interview, or asks to turn a fuzzy idea into a spec before planning. Do NOT use for ordinary implement/fix/debug requests, for questions with an obvious single answer, or as an automatic first step on complex-looking work — this skill never fires itself; the user or another skill's prose must name it.
4
+ ---
5
+
6
+ # Deep Interview
7
+
8
+ Convert an ambiguous request into a spec that `ralplan` can plan from, by asking
9
+ targeted questions and tracking how much ambiguity remains after each round.
10
+
11
+ This skill only runs when explicitly invoked (`/deep-interview`, or a direct user
12
+ ask). Muse never auto-selects a skill because a task looks complex or vague —
13
+ there is no hook or heuristic that fires this skill on your behalf. If you are
14
+ reading this body, something explicitly asked for it.
15
+
16
+ ## When to use this
17
+
18
+ Use it when the user's goal is real but underspecified: "build something like
19
+ X", "make onboarding better", "port Y into this repo" with no locked scope.
20
+ Do not use it for requests that already have a clear, bounded shape — implement
21
+ those directly. Do not use it merely because a task touches many files; breadth
22
+ is not the same as ambiguity.
23
+
24
+ ## Setup
25
+
26
+ State lives under `.omm/` at the workspace root — never under `.agents/` or
27
+ `.muse/`, both of which are muse-protected: a mediated `edit_file` write there
28
+ is held for human review with no standing grant, and a shell write fails
29
+ read-only at the sandbox. Create `.omm/specs/` if it does not exist (`.omm/`
30
+ is ordinary unprotected workspace state, so `edit_file` and shell writes both
31
+ work normally).
32
+
33
+ ## Ambiguity model
34
+
35
+ Track an explicit ambiguity score (0-100%) across rounds, not a fixed question
36
+ budget:
37
+
38
+ 1. Before round 1, enumerate the entities implied by the request (nouns like
39
+ "user", "state directory", "critic", "acceptance criteria") and mark each
40
+ Unknown, Assumed, or Locked.
41
+ 2. Each round, ask the smallest set of questions (usually 1-3) that would lock
42
+ the most Unknown/Assumed entities. Prefer questions that collapse several
43
+ unknowns at once over exhaustive coverage.
44
+ 3. After each answer, recompute ambiguity as the fraction of entities still
45
+ Unknown or Assumed, weighted by how load-bearing each entity is to the
46
+ final spec (a naming detail counts for less than a topology decision).
47
+ 4. Stop asking and move to drafting when ambiguity falls below the configured
48
+ threshold (default 10%; read `execution.ambiguity_threshold` from muse
49
+ config if the project sets one, otherwise use the default and say so).
50
+ 5. If ambiguity has not measurably dropped for two consecutive rounds, stop
51
+ the interview and report the stall rather than looping — hand the user a
52
+ partial spec with the stuck questions listed as open items instead of
53
+ asking indefinitely.
54
+
55
+ Optionally probe with a challenge mode for one round when the ontology looks
56
+ too comfortable — a Contrarian round ("what would make this the wrong
57
+ approach entirely?") or a Simplifier round ("what would the smallest version
58
+ that still satisfies the goal look like?"). Use at most one challenge round
59
+ unless the user asks for more; note which mode ran in the spec header.
60
+
61
+ ## Producing the spec
62
+
63
+ Write the interview's output to `.omm/specs/<slug>.md` with:
64
+
65
+ - One-sentence goal.
66
+ - Fact base: what was established (from the codebase, from the user, from
67
+ probing tools) versus assumed.
68
+ - Locked decisions, each with the round it was settled in and why.
69
+ - Any stated-but-unconfirmed assumptions, flagged explicitly.
70
+ - Acceptance criteria the eventual implementation must satisfy.
71
+ - Final ambiguity percentage and threshold used.
72
+
73
+ Do not silently invent scope to fill a section. If a section has nothing real
74
+ to say (no risks, no deferred items), write "None" rather than padding it.
75
+
76
+ ## Explicit approval gate
77
+
78
+ Present the complete spec in a normal reply and ask the user to `Approve`,
79
+ `Request changes`, or `Cancel`. Do not treat silence, a topic change, or your
80
+ own confidence as approval. On `Request changes`, revise the same spec file
81
+ and re-present it. On `Cancel`, stop and leave the spec file as a draft,
82
+ clearly marked unapproved at the top.
83
+
84
+ ## Handoff
85
+
86
+ This skill does not chain into the next stage automatically — nothing in Muse
87
+ reads a "next-skill" field from frontmatter; that field does not exist here.
88
+ Once the spec is approved, say so in plain prose and tell the user the next
89
+ step in the pipeline: "Spec approved and saved to `.omm/specs/<slug>.md`. Run
90
+ `/ralplan .omm/specs/<slug>.md` next to turn this into a plan." Then stop.
91
+ Do not start planning or implementation yourself from inside this skill.
92
+
93
+ ## Notes on personas
94
+
95
+ If parts of the interview benefit from a second perspective (for example,
96
+ probing technical feasibility of a locked decision), you may
97
+ `subagent_spawn` the `architect` or `explore` persona with a narrow objective
98
+ and read its result back with `subagent_read_result` before continuing the
99
+ interview. These are prompt personas rendered into the spawn call, not muse
100
+ Agent Definitions — muse rejects `agents` as a plugin capability, so no
101
+ persona is registered as a first-class agent type.
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: ralph
3
+ description: Run a PRD-driven implementation loop against .omm/state/prd.json, iterating story by story until every acceptance criterion passes, then a final reviewer verification pass. Use ONLY when explicitly invoked (/ralph) against an approved PRD, normally right after /ralplan. Do NOT use without an approved prd.json (run /ralplan first), and do not invoke this for a single small edit — the loop overhead only pays for itself across multiple testable stories.
4
+ ---
5
+
6
+ # Ralph
7
+
8
+ Execute an approved PRD to completion: iterate its stories, implement each
9
+ one, verify its acceptance criteria, and loop until all pass or the loop
10
+ cannot make further progress. Named for the self-referential "Ralph Wiggum"
11
+ loop pattern — run the same verification cycle until it stops finding
12
+ problems, not for a fixed number of turns.
13
+
14
+ Explicit invocation only. This skill does not start itself when `ralplan`
15
+ finishes — ralplan's own body tells the user to invoke `/ralph` next in
16
+ prose; nothing in frontmatter chains them.
17
+
18
+ ## Precondition
19
+
20
+ Require `.omm/state/prd.json` to exist and be approved (per `ralplan`'s
21
+ gate). If it is missing, stop and tell the user to run `/ralplan` first —
22
+ do not improvise a PRD inline just to proceed.
23
+
24
+ ## Loop
25
+
26
+ For each story in `prd.json` with `status: "pending"`, in order unless the
27
+ PRD marks explicit parallelizable groups:
28
+
29
+ 1. Set the story `status` to `"in_progress"` in `prd.json`.
30
+ 2. Implement the story's described change directly, or delegate to the
31
+ `executor` persona via `subagent_spawn("executor", <story objective +
32
+ acceptance criteria>, worktree_isolation: true)` when the story is large
33
+ enough to isolate — worktree isolation matters here specifically because
34
+ multiple ralph iterations or a parallel `team` run may be touching the
35
+ same repo; an isolated worktree keeps one story's half-finished edits
36
+ from bleeding into another's verification.
37
+ 3. Check every acceptance criterion for that story against real evidence —
38
+ run the command it names, inspect the output, do not mark a criterion
39
+ passed on the basis of "this should work." A criterion that cannot be
40
+ checked as written is a defect in the PRD, not a license to skip it;
41
+ fix the criterion's wording in `prd.json` and say so, rather than
42
+ silently treating it as satisfied.
43
+ 4. If all criteria pass, set `status: "done"` and record what evidence
44
+ confirmed each criterion. If any fail, keep `status: "in_progress"`,
45
+ record what failed, and retry the implementation step. Cap retries per
46
+ story (default 3) — after the cap, mark `status: "blocked"` with the
47
+ failure detail and move to the next story rather than looping forever on
48
+ one blocker.
49
+ 5. Move to the next pending story.
50
+
51
+ Stop the loop when every story is `"done"` or `"blocked"`. A run that ends
52
+ with any `"blocked"` story is not complete — report it as such.
53
+
54
+ ## Reviewer verification pass
55
+
56
+ Once the loop ends with no pending stories, run a separate verification pass
57
+ — never self-approve inside the same implementation context that just wrote
58
+ the code:
59
+
60
+ - Default: `subagent_spawn("verifier", "verify every done story in
61
+ .omm/state/prd.json against its acceptance criteria with independent
62
+ evidence")`, then read its result.
63
+ - **`--critic=codex` or `--critic=claude` option.** Route this verification
64
+ pass through the named external CLI instead. This requires the session to
65
+ have been launched with `muse --disable-sandbox` (or `--yolo`). If it was
66
+ not, stop and tell the user rather than quietly downgrading to the
67
+ in-process verifier, since that is a materially different check.
68
+
69
+ **State the tradeoff plainly, every time this option is used, not just
70
+ once at setup.** Two distinct costs, and neither should be blurred into
71
+ the other:
72
+
73
+ 1. The external critic's work happens outside Muse's append-only audit
74
+ trail. Its reasoning and any files it touches are not captured the way
75
+ an in-session `subagent_spawn` result is.
76
+ 2. The escalation is **session-wide, not scoped to the critic call**.
77
+ `--disable-sandbox` removes filesystem and network sandboxing for
78
+ everything in that session, not just the one process that needed it.
79
+
80
+ There is no narrower route on this build: muse 1.0.3 exposes no way to
81
+ create a named permission profile (`muse exec --permission-profile <id>`
82
+ reports `profile does not exist`, and `execution.permission_profiles`
83
+ validates as `field_not_activated`). So the broad carve-out is the whole
84
+ cost of the external critic, not an implementation shortcut. This is a
85
+ deliberate, user-reaffirmed tradeoff — it buys genuine cross-model
86
+ adversarial review — but say as much in the final report rather than
87
+ letting it pass unmentioned.
88
+
89
+ ## Enterprise policy interaction
90
+
91
+ If the workspace's execution policy sets `execution.forbid_sandbox_bypass`,
92
+ `--disable-sandbox` and `--yolo` are refused and the external critic cannot
93
+ run at all, regardless of `--critic`. Fail with a clear message naming the
94
+ policy and the blocked step — do not silently fall back to the in-process
95
+ critic/verifier and present it as if the requested external check ran.
96
+
97
+ ## Completion report
98
+
99
+ Report, per story: id, final status, and the evidence that justified it.
100
+ Report the verification pass's mode (in-process or external) and its
101
+ verdict. If any story ended `"blocked"`, list it prominently — do not bury a
102
+ blocked story under a headline "done."
103
+
104
+ ## Handoff
105
+
106
+ Ralph is a terminal stage in this pipeline. There is nothing further to
107
+ chain to automatically; report completion (or the blocked/failed state) and
108
+ stop. If new scope surfaces during implementation that the PRD did not
109
+ cover, say so in prose and suggest the user run `/deep-interview` or
110
+ `/ralplan` again for that new scope — do not silently fold unplanned work
111
+ into the current loop.
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: ralplan
3
+ description: Turn an approved spec into a consensus-reviewed plan with a PRD (prd.json) of testable stories, gating vague /ralph or /team requests before they run unattended. Use ONLY when explicitly invoked (/ralplan), typically right after deep-interview hands off a spec, or when the user asks to plan before a ralph/team run. Do NOT use for direct small edits, and do not treat an invocation of /ralph or /team as implicitly requesting this — ralplan only runs when named.
4
+ ---
5
+
6
+ # Ralplan
7
+
8
+ Convert an approved spec (or a request specific enough to skip straight to
9
+ planning) into a `prd.json` of testable stories, reviewed for consensus
10
+ before `ralph` is allowed to run unattended against it.
11
+
12
+ Explicit invocation only — there is no hook that auto-routes a vague `/ralph`
13
+ or `/team` request into this skill. If you want that gating, say so in
14
+ prose to the user yourself: "this looks underspecified for an unattended
15
+ ralph run — recommend `/ralplan` first," and let the user decide.
16
+
17
+ ## Inputs
18
+
19
+ - An approved spec at `.omm/specs/<slug>.md` (preferred), or
20
+ - A request detailed enough to plan directly, when the user explicitly says
21
+ to skip the interview stage.
22
+
23
+ ## Producing the PRD
24
+
25
+ Write `.omm/state/prd.json` (create `.omm/state/` if missing) shaped as:
26
+
27
+ ```json
28
+ {
29
+ "goal": "one sentence",
30
+ "source_spec": ".omm/specs/<slug>.md",
31
+ "stories": [
32
+ {
33
+ "id": "US-001",
34
+ "title": "short title",
35
+ "description": "what this story delivers",
36
+ "acceptance_criteria": [
37
+ "testable, falsifiable statement",
38
+ "another testable statement"
39
+ ],
40
+ "status": "pending"
41
+ }
42
+ ]
43
+ }
44
+ ```
45
+
46
+ Every story's acceptance criteria must be testable by inspection, command
47
+ output, or reproducible check — not by opinion. "Code is cleaner" is not a
48
+ valid criterion; "muse skills validate <path> reports valid: true with zero
49
+ unsupported-skill-field diagnostics" is. `ralph` will iterate against this
50
+ file story by story, so vague criteria become the loop's failure mode later.
51
+
52
+ ## Consensus review
53
+
54
+ Before presenting the plan, get a second opinion:
55
+
56
+ 1. Default reviewer is the `critic` persona in-process:
57
+ `subagent_spawn("critic", "review prd.json at .omm/state/prd.json against
58
+ the spec for gaps, untestable criteria, and scope creep")`, then
59
+ `subagent_wait` / `subagent_read_result`.
60
+ 2. **`--critic=codex` or `--critic=claude` option.** When the user passes
61
+ this, route the review through the named external CLI instead of the
62
+ in-process critic persona. This requires the session to have been
63
+ launched with `muse --disable-sandbox` (or `--yolo`) — say so explicitly
64
+ if it was not, and stop rather than silently falling back to the
65
+ in-process critic, since that changes what was actually reviewed.
66
+
67
+ **Be honest about the tradeoff.** Shelling out to an external `codex` or
68
+ `claude` CLI process costs two separate things. First, that review's work
69
+ happens outside Muse's append-only audit trail — the external process's
70
+ reasoning and any files it touches are not captured the way an in-session
71
+ `subagent_spawn` result is. Second, the escalation is session-wide:
72
+ `--disable-sandbox` removes filesystem and network sandboxing for
73
+ everything in the session, not just the critic call.
74
+
75
+ There is no narrower route on muse 1.0.3 — named permission profiles are
76
+ not creatable on this build — so the broad carve-out is the actual price
77
+ of an external critic. State this plainly in the review summary; do not
78
+ soft-pedal it as equivalent to the in-process critic.
79
+ 3. Incorporate the critic's findings into the PRD before presenting it.
80
+ Untestable criteria, missing stories implied by the spec, and scope the
81
+ critic flags as unjustified should be fixed, not just noted.
82
+
83
+ ## Approval gate
84
+
85
+ Present the final `prd.json` contents (or a readable summary of every story
86
+ and its criteria) in a normal reply, state which critic mode reviewed it,
87
+ and ask for `Approve`, `Request changes`, or `Cancel`. Do not let `ralph`
88
+ start from an unapproved PRD.
89
+
90
+ ## Handoff
91
+
92
+ On approval, say in prose: "PRD approved at `.omm/state/prd.json`. Run
93
+ `/ralph` next (add `--critic=codex` or `--critic=claude` to keep the same
94
+ external reviewer for verification, and remember that needs the session
95
+ launched with `muse --disable-sandbox`)." There is no frontmatter field that
96
+ wires this handoff automatically — it exists only because this body says it.
@@ -0,0 +1,94 @@
1
+ ---
2
+ name: team
3
+ description: Run N coordinated persona subagents in parallel against a shared task list, each isolated in its own worktree, for work that splits cleanly into independent units. Use ONLY when explicitly invoked (/team) for genuinely parallelizable work — several independent files, stories, or investigations with no shared-state conflicts. Do NOT use for a single sequential task, for work with heavy cross-file coupling that would fight worktree isolation, or as an automatic response to "this is a big task."
4
+ ---
5
+
6
+ # Team
7
+
8
+ Coordinate multiple persona subagents working in parallel on a shared task
9
+ list, each isolated in its own worktree so simultaneous writers do not
10
+ collide on the same files.
11
+
12
+ Explicit invocation only. Nothing infers that a task "is big enough" to
13
+ warrant a team on its own — you decide that and invoke `/team`, or another
14
+ skill's prose (such as `ralph`, for a PRD with an explicit parallel group)
15
+ tells the user to.
16
+
17
+ ## When to use this
18
+
19
+ Use it when the task list has real independence: separate stories, separate
20
+ files or modules, separate investigations that do not need to see each
21
+ other's intermediate state. Do not use it when tasks are tightly coupled —
22
+ sequential work through one context (or a single `ralph` loop) is both
23
+ simpler and avoids merge friction. Do not use it for a task list of one.
24
+
25
+ ## Building the task list
26
+
27
+ Source the task list from, in order of preference:
28
+ 1. An explicit list the user gives in the invocation.
29
+ 2. `.omm/state/prd.json`, if it declares an explicit parallel group (see
30
+ `ralph`) — use exactly that group, not the whole PRD.
31
+ 3. A list you derive directly from the request, stated back to the user
32
+ before spawning anything if it required real judgment to split.
33
+
34
+ Each task needs: an id, a scope narrow enough for one persona to own without
35
+ touching another task's files, and a definition of done.
36
+
37
+ ## Spawning
38
+
39
+ For each task, choose the persona that fits its shape (`executor` for
40
+ implementation, `test-engineer` for test work, `writer` for docs,
41
+ `debugger` for isolated bug fixes, etc.) and:
42
+
43
+ ```
44
+ subagent_spawn(role, objective, worktree_isolation: true)
45
+ ```
46
+
47
+ Always set `worktree_isolation: true` for team members that write files —
48
+ this is the mechanism that keeps parallel writers from stepping on each
49
+ other; without it, concurrent edits to overlapping files are a real risk,
50
+ not a hypothetical one. Read-only investigation tasks may skip isolation if
51
+ they touch nothing.
52
+
53
+ Track every spawned id against its task. Do not spawn more than the
54
+ session's concurrent-child limit at once (muse caps concurrent subagent
55
+ children); queue remaining tasks and spawn the next as a slot frees up
56
+ rather than firing them all and hoping.
57
+
58
+ ## Coordination
59
+
60
+ - Poll with `subagent_status` / `subagent_wait` rather than assuming
61
+ completion order matches spawn order.
62
+ - If one task's output changes what another in-flight task should do, use
63
+ `subagent_send_message` to update it rather than letting it finish on a
64
+ stale premise.
65
+ - If a task is no longer needed (superseded by another's findings, or the
66
+ user narrows scope mid-run), `subagent_cancel` it explicitly rather than
67
+ leaving it to finish pointless work.
68
+ - Read every terminal result with `subagent_read_result` before reporting —
69
+ a `subagent_wait` timeout is not a terminal state; keep waiting or check
70
+ status again rather than treating a timeout as failure.
71
+
72
+ ## Merging results
73
+
74
+ Worktree isolation means each task's changes live in its own worktree until
75
+ merged. Review each task's diff before merging — do not merge blind because
76
+ the subagent reported success. Merge in an order that respects real
77
+ dependencies between tasks (a task that renamed a shared interface merges
78
+ before tasks that consume it, even if it finished later). Surface merge
79
+ conflicts to the user rather than silently picking a resolution when the
80
+ conflict touches logic, not just formatting.
81
+
82
+ ## Completion report
83
+
84
+ Report per task: id, persona used, terminal status, whether its worktree was
85
+ merged, and any conflicts or cancellations. If any task is blocked or
86
+ failed, list it prominently rather than only reporting the successes.
87
+
88
+ ## Handoff
89
+
90
+ Team has no fixed successor — what comes next depends on what the parallel
91
+ work was for. If it was a `ralph` parallel group, say so and return control
92
+ to the ralph loop's per-story verification. Otherwise, state completion and
93
+ let the user decide the next step; do not chain into another skill on your
94
+ own initiative.
@@ -0,0 +1,75 @@
1
+ ---
2
+ name: trace
3
+ description: Investigate a specific observed problem (a bug, a regression, an unexpected behavior) by running competing tracer hypotheses in parallel and converging on the best-evidenced explanation. Use ONLY when the user explicitly asks to trace, diagnose, or root-cause a concrete symptom, or invokes /trace. Do NOT use for vague goal-shaping ("make this better") — that belongs to deep-interview — and do not use it for routine debugging you can resolve with a single direct read; this skill is for when the cause is genuinely unclear and evidence needs to be gathered from multiple angles at once.
4
+ ---
5
+
6
+ # Trace
7
+
8
+ Find the real cause of an observed problem by running multiple competing
9
+ hypotheses against evidence in parallel, instead of debugging serially under
10
+ one assumption.
11
+
12
+ Explicit invocation only. Nothing in Muse decides on its own that a bug
13
+ "looks hard enough" to warrant this skill — you or the user must name it
14
+ directly, or another skill's prose must tell the user to invoke it (see
15
+ `deep-dive`, which routes here first).
16
+
17
+ ## When to use this
18
+
19
+ Use it when: the symptom is clear (a failing test, a wrong output, a crash,
20
+ a regression between two known-good points) but the cause is not, and a
21
+ single obvious read of the code will not settle it. Do not use it for a bug
22
+ whose cause is already apparent from the error message or a quick grep —
23
+ just fix that directly. Do not use it for open-ended product questions;
24
+ route those to `deep-interview` instead.
25
+
26
+ ## Setup
27
+
28
+ Write working state to `.omm/state/trace-<slug>.md` (create `.omm/state/` if
29
+ missing). Never write trace scratch files under `.agents/` or `.muse/` —
30
+ both are muse-protected paths that reject unmediated writes.
31
+
32
+ ## Method
33
+
34
+ 1. **State the symptom precisely.** Exact observed behavior, exact expected
35
+ behavior, and the smallest reproduction you have. If you cannot state a
36
+ precise symptom, this is not ready for tracing — ask the user to narrow
37
+ it or fall back to ordinary debugging.
38
+ 2. **Generate competing hypotheses.** List 2-4 genuinely different candidate
39
+ causes, not variations on the same guess. Each hypothesis should predict
40
+ a different piece of evidence if true.
41
+ 3. **Spawn parallel evidence-gatherers.** For each hypothesis, `subagent_spawn`
42
+ an `explore` or `debugger` persona with an objective narrowly scoped to
43
+ confirming or falsifying that one hypothesis — not to fixing anything.
44
+ Use `worktree_isolation` only if a hypothesis requires running code with
45
+ local mutations; pure read/grep investigation does not need it. Track the
46
+ spawned ids and poll with `subagent_status`/`subagent_wait`.
47
+ 4. **Collect evidence, not verdicts.** Read each result with
48
+ `subagent_read_result`. Record what was found for and against each
49
+ hypothesis, including negative results — a hypothesis a subagent could not
50
+ confirm is evidence too.
51
+ 5. **Score and converge.** Rank hypotheses by evidence weight. If one
52
+ hypothesis is clearly best-supported, state it and the confirming
53
+ evidence. If two remain close, say so plainly rather than picking one to
54
+ look decisive — an honest "still ambiguous between A and B, next probe
55
+ would be X" is a valid outcome of this skill.
56
+ 6. **Recommend the next probe or the fix.** If the cause is confirmed,
57
+ describe the fix (do not apply it unless the user also asked for a fix in
58
+ the same request). If not confirmed, name the single most informative
59
+ next piece of evidence to gather.
60
+
61
+ ## Output
62
+
63
+ Write the hypothesis table (hypothesis, evidence for, evidence against,
64
+ verdict) to the state file, then present it in a normal reply. Keep it
65
+ evidence-first: a hypothesis with no cited evidence is not a valid entry in
66
+ the table.
67
+
68
+ ## Handoff
69
+
70
+ Trace does not automatically start a fix or hand off to another skill; there
71
+ is no frontmatter mechanism to chain skills. If the traced cause implies real
72
+ scope decisions (not just a one-line fix), say in prose: "Cause identified —
73
+ this touches enough surface that it's worth a spec before changing anything.
74
+ Run `/deep-interview` next if you want that, or ask me to apply the fix
75
+ directly." Then stop and let the user choose.