[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M77KEY8YRNEQ04REF2FJQRWG":3,"skill-same:01M77KEY8YRNEQ04REF2FJQRWG":84},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":28,"commitSha":29,"skillDirectory":30,"forksCount":31,"repositoryHtmlUrl":32,"repositoryHomepageUrl":6,"ownerHtmlUrl":33,"ownerBlogUrl":34,"ownerDescription":35,"updatedAt":36,"install":37,"resources":49},"01M77KEY8YRNEQ04REF2FJQRWG","explore",null,"Explore the local codebase before changes; a folder outside any repo, or machine state, is research's. Persists EXPLORE.md via a fresh-context subagent. Use when: 'explore the codebase', 'what exists for X', 'how does this work', 'trace the dependencies', 'what tests cover this', or as step 1 before a code change. Skip a bare locate ('where is X', 'what calls Y'): dispatch the built-in Explore agent. Skip why it was built that way: '\u002Fdiscovery:trace-intent'.","melodic-software\u002Fclaude-code-plugins","melodic-software","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F58273638?v=4","01M77JVQTXNGKCE4MDFY2BC936","Melodic Software","01M77JVQVN9QDWKAH6W03ANP76",30,"MIT","https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fdiscovery\u002Fskills\u002Fexplore\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\ndescription: \"Explore the local codebase before changes; a folder outside any repo, or machine state, is research's. Persists EXPLORE.md via a fresh-context subagent. Use when: 'explore the codebase', 'what exists for X', 'how does this work', 'trace the dependencies', 'what tests cover this', or as step 1 before a code change. Skip a bare locate ('where is X', 'what calls Y'): dispatch the built-in Explore agent. Skip why it was built that way: '\u002Fdiscovery:trace-intent'.\"\nargument-hint: \"[--output change-prep|explain] [scope]\"\nuser-invocable: true\ndisable-model-invocation: false\nmetadata:\n  workflow-stage: explore\n  summary: Explore code, history, tests, and config before changing anything\n---\n\n**Arguments.** `[--output change-prep|explain] [scope]`. `--output` sets the reply shape for this run ([Reply shape](#reply-shape-explore_output)) and is not part of the scope. e.g., \u002Fdiscovery:explore payments module dependencies, \u002Fdiscovery:explore tests, \u002Fdiscovery:explore git, \u002Fdiscovery:explore config\n\n## Repository context. Gather first\n\nCollect these with **individual** Bash calls, one command per call, never combined into a single\ninvocation:\n\n- Current branch, `git branch --show-current`\n- Working tree status (empty = clean), `git status --porcelain | head -20`\n- Project root, `git rev-parse --show-toplevel`\n\nThe pipe is the bound and belongs in the command. A read-time cap (\"read only the first 20 entries\")\ncomes too late for whatever the command has already returned inline. What a result returns inline,\nand when it arrives as a saved file instead, is [Tools reference § Output\nlimits](https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Ftools-reference#output-limits).\n\nTreat a failure (not a repository, git unavailable) as an unknown value and carry on. Keep these as\nseparate body Bash calls rather than pre-compute lines ([gather-block convention](https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fdocs\u002Fconventions\u002Fgather-block\u002FREADME.md#the-pre-compute-block-runs-as-one-shell-invocation),\n\"The pre-compute block runs as one shell invocation\").\n\nThese values orient this session only. Resolve files against the project root, an absolute machine path, but never echo it into `EXPLORE.md`; the handoff artifact records relative paths (outcome gate below).\n\n## Reply shape: `explore_output`\n\nResolve `explore_output` before routing; it decides only the final reply. `EXPLORE.md` and its\nsidecars are written the same way under every value. Lowest layer first, a later one winning\n(key contract: [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fconfig.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fconfig.md)):\n\n1. the default, `auto`;\n2. the `userConfig` value, `${user_config.explore_output}` (a literal unexpanded token means unset;\n   `auto` here is reported as the default, since the two cannot be told apart);\n3. `explore_output` in `docs\u002Fconventions\u002Fdiscovery.yaml` at the project root;\n4. an `--output change-prep` or `--output explain` argument on this invocation.\n\nRead the file with the Read tool; a missing file or key leaves that layer unset, and the file does\nnot apply when the project root is unknown. No `~\u002F.claude` file, `.claude\u002F` file or personal override\nsets this key. A value other than `auto`, `change-prep` or\n`explain` in any layer (or an `--output` value other than the two) is named in the reply, with the\nfile or `userConfig` that held it, the key, and the value, and that layer is dropped. A valid\nhigher layer (such as `--output`) still wins; with none, the run continues on the default, `auto`,\nreported as the default level with the invalid value named. It never falls through to a lower\nlayer's value.\n\nUnder `auto`, pick the concrete shape:\n\n- `explain` only when a person asked, in their own message, how something works (\"how does the\n  retry scheduler work\", \"walk me through the login flow\").\n- `change-prep` for everything else: a request made before a change, and **every invocation from\n  another skill** (a skill body told you to run `\u002Fdiscovery:explore`, or you are a subagent another\n  skill dispatched), however its scope is worded. A calling skill that wants a walkthrough passes\n  `--output explain`.\n\nState one line in the reply: the concrete shape and the layer that supplied the value, e.g.\n`explore_output: explain (auto from the default; how-does-it-work request)` or\n`explore_output: change-prep (docs\u002Fconventions\u002Fdiscovery.yaml)`.\n\nThe two shapes:\n\n- **`change-prep`**: the handoff summary: what exists, the constraints and patterns a change must\n  respect, the open questions with recommended defaults, and the next stage\n  (`\u002Fdiscovery:research` or `\u002Fplanning:plan`).\n- **`explain`**: a walkthrough of how the scope works, in the order a request or call moves\n  through it, each step citing the `path:line` it rests on, from files the run Read. Open\n  questions are still surfaced. No next-stage recommendation unless the person asked for one.\n\n## Routing. Dispatch by default\n\n**From the main conversation, this skill dispatches the `discovery:explorer` subagent.** Exploration reads many files; keeping that out of the orchestrator's context window is the point. The agent loads the project's path-scoped rules, runs the six dimensions, writes the artifact set, and returns a bounded summary plus a file pointer, not the reads. The parent resolves the **pre-dispatch envelope** first, six fields (scope, reason, memory-slice path, memory root, budget, capability flags), written into the dispatch prompt as the labeled template in [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md), not as prose the agent has to parse, and owns the **post-dispatch boundary** after: re-surfacing `open_questions` to the user, dispatching the sibling verifier, and **writing its verdict back into `EXPLORE.md`** (which agent, its prompt, the literal `verification:` line, and what to write when no verifier can run: [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md), \"The sibling verifier, stated once\"), the explorer always returns `verification: pending` because it may not grade its own work, so an artifact left saying `pending` after the parent verified it cannot be told apart from one whose verifier never ran, and this artifact is the whole handoff a fresh session resumes from.\n\n**The spawn's `model`** follows the parent contract's \"The worker's model is the parent's call\":\npass one only when a multi-agent config layer moves the explorer's role off its pin.\n\n**The dispatch prompt also carries `Output: change-prep` or `Output: explain`**, the concrete shape\nresolved under Reply shape above, never `auto`: the explorer cannot see the request or who made it.\nAfter the acceptance gate passes, the reply to the person (or the calling skill) is the explorer's\nprose in that shape plus the `explore_output:` line.\n\n**Run inline instead when any of these holds**. Inline runs the identical workflow, and the escape hatch relaxes nothing:\n\n- **Tight turn-by-turn iteration**. ≤~5 known files, findings feeding a same-session edit, and you will redirect as results land.\n- **Cost**, a dispatched run pays the full six dimensions every time; a single-file question does not need an envelope.\n- **The invoking context is already a subagent**. Dispatch-by-default is scoped to the main-conversation boundary. Hoisting, not nesting: the outer dispatch already supplied the fresh context, so a second hop only spends the inner agent's own window.\n\n**When selecting the dispatched route:** probe `check-dispatch-artifact.sh --help` before dispatching; a denied or errored probe **halts**. An un-runnable post-dispatch gate is not a reason to take the inline escape hatch *to dodge the gate*. A legitimate inline run (tight iteration, cost, already-a-subagent) does not owe that script, it has no script verdict to self-grade, so do not apply this precondition to the inline path. Invocation forms: [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md).\n\n**Which agent, decided by four tests.** The named alternative is the **built-in Explore subagent**, and these four decide between it and `discovery:explorer`. **Any one YES routes to `discovery:explorer`**, and all four NO means this skill is the wrong entry point altogether, dispatch built-in Explore and do not invoke this skill:\n\n1. **Must a graded artifact survive the run?** Built-in Explore cannot write one.\n2. **Do project conventions constrain the answer** (`.claude\u002Frules\u002F`, a nested `AGENTS.md`, declared layer rules)? Built-in Explore never sees them.\n3. **Will a conclusion rest on the contents of a file** rather than its location? A built-in agent runs a prompt you cannot inspect and its report does not say how much of a file it read, so what it returns backs `verified: grep`, never `verified: read`.\n4. **Might the run truncate and need resuming?** Built-in Explore is one-shot.\n\nEach NO above is a harness denial, not a preference, and the four are recorded once with their basis in [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md), \"The built-in Explore agent cannot hold this plugin's contract\". Read it before arguing with a test; do not restate the denials anywhere else.\n\nBuilt-in Explore is therefore a **scout under a worker, never the worker**. Where it earns its place: the locate-tier legwork inside a larger exploration, per the fan-out rules below. When dispatching one, pass a thoroughness level (`quick`, `medium`, `very thorough`) and restate any convention that bounds the search, because it arrives convention-blind.\n\n**Preload-liveness sentinel.** A dispatched agent receives this body through its `skills:` preload, and we never count on the harness to tell the agent when that preload does not load. The record for that harness behavior is [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md), \"Harness facts the dispatch design rests on\". A dispatched run therefore echoes this token verbatim as `preload_token` in its return payload. The disk fallback Reads this same file, so a matching `preload_token` is file-identity, **not** proof that preload fired:\n\n```text\ndiscovery-explore-preload-8e2b7d\n```\n\nA missing or mismatched token is a **hard failure: the parent discards the run**, never downgrades or accepts the artifact. Without it, a preload miss produces an undisciplined run that still writes an artifact. Indistinguishable from success at every other seam. Provenance is `preload: fired | fallback`; `fallback` is the accepted recovery, not a discard. Rationale and the parent-side contract: [`${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fexplore\u002Freference\u002Fdispatch.md`](${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fexplore\u002Freference\u002Fdispatch.md), \"Discipline liveness\".\n\n**Post-dispatch acceptance gate. Parent-side, before the payload is believed.** `status: complete` is the agent's claim about its own run, and a claim is not evidence. Grade the run **off disk**, against the memory-slice path from the parent's own pre-dispatch envelope, **carry that path across the dispatch, because it is this gate's input**, and never a path read out of the payload, because the failure this gate exists to catch is a payload that comes back carrying no pointer at all. In order:\n\n**Pre-dispatch:** create the memory slice and touch `\u003Cthat slice>\u002F.explore-dispatch` as the gate's freshness baseline, then hand that file to the gate as `--newer-than`. Without it a slice that already holds an earlier run's artifact set passes every on-disk check even when this dispatch wrote nothing at all. **Both shell forms of that one command are in [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md) (\"The pre-dispatch baseline\"). Copy the one matching this session's shell, because the POSIX form's `touch` is not a command in PowerShell and its directory flag is a parameter error there. Same file carries the envelope template this dispatch also owes.** The memory root's self-ignoring `.gitignore` guard is a separate obligation this gate does not grade. Same file, \"What this gate does not grade\".\n\n1. **The payload is well-formed**. `preload_token` matches the sentinel verbatim, `preload:` is `fired` or `fallback`, and an `artifact:` pointer is present. Missing token or artifact is a **failed dispatch** whatever the `status` field says; a missing token is a discard, per the rule above. A missing or unrecognized `preload:` field is an out-of-date agent definition, not a pass. A matching token does not prove preload fired; `preload: fallback` is not a discard.\n\n   **And `scope_as_received` matches the scope the parent actually sent**. Compared against the envelope the parent wrote, not against what it meant. It is the only check here that fires on an input that is present and wrong. A mismatch is a **failed dispatch**: re-dispatch with the scope restated in a form that survives the trip (see the caveat under **Scope**); do not accept the artifact and mentally translate it. A well-formed payload carrying no `scope_as_received` is an out-of-date agent definition, not a pass.\n2. **The artifact set is actually on disk, and this run put it there:**\n\n   ```bash\n   \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fcheck-dispatch-artifact.sh\" \u003Cthe retained memory-slice path> \\\n     --index-name EXPLORE.md \\\n     --newer-than \u003Cthat slice>\u002F.explore-dispatch --expect-index \u003Cthe payload's artifact: value>\n   ```\n\n   `--index-name` is required, not defaulted, the same gate grades `\u002Fdiscovery:research` runs, the two artifact families differ only in that name, and a gate that fails closed everywhere else must not guess which family it is looking at.\n\n   The gate grades exactly the slice path it is given and never scans the slice for an index elsewhere, so on a collision the envelope's slice path is already the sub-slice the parent assigned pre-dispatch, and that same assigned path is the one handed here.\n\n   Cite the **exit status**, 0 usable, 1 no usable artifact set, 2 ungradeable, not a reading of the directory, because the context most motivated to call the dispatch finished is the one that would be doing the reading. Only the slice path and `--index-name` are required, and that bare form is still a real gate: every optional check reports `unchecked` rather than passing quietly. Append `--expect-sidecars \u003Cn>` when the payload reported a `sidecars:` count, and **drop any flag whose value the payload did not supply**.\n\n   **The `index=` path in that output is authoritative** downstream: the verifier's target and the handoff pointer both come from it, not from `artifact:`. `pointer=mismatch` means the payload named a file this gate never graded, a defect in the payload, not a naming preference to reconcile.\n\n   Before the sibling verifier, run `bash \"${CLAUDE_PLUGIN_ROOT}\u002Flib\u002Fread-verification.sh\" --plugin discovery --skill explore --file docs\u002Fconventions\u002Fdiscovery.yaml` and report its line: `light` and `off` skip that verifier and write `verification: skipped (\u003Clevel>)`, as the [parent contract](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md) \"The sibling verifier, stated once\" says.\n\n**Any non-zero exit halts the workflow, and a gate that could not run at all is a FAIL, never a skip.** An invocation above that is denied, prompts and is declined, or errors out halts exactly as a non-zero exit does; do not fall back to reading the directory. Do **not** proceed to research, planning, or an edit on the strength of an exploration that did not happen. Proceeding is the damage a silently-empty return actually causes; the missing artifact is only how it starts. Recovery ladder, and why a resume beats a re-dispatch: [`${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fexplore\u002Freference\u002Fdispatch.md`](${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fexplore\u002Freference\u002Fdispatch.md).\n\n**One named exception, and it is an exception to the halt, not to the gate.** Exit 1 with `persistence: by-value` in the payload means the agent finished and its environment refused every write, the one failure where a re-dispatch pays full price to reproduce the same refusal. There the parent **writes the slice itself** from the artifact bodies the payload carries verbatim, into the memory-slice path it resolved before dispatch (on that path the payload's `artifact:` value is a *destination* the agent names, never the anchor), and then **re-runs the identical gate command above**. The workflow proceeds only on a subsequent exit 0. If the second run is non-zero, the halt stands and the ladder resumes at the rung it was on. The freshness check needs nothing special: the parent writes after its own pre-dispatch `touch`, so the index is strictly newer than the baseline.\n\nRead the by-value rung before performing that write: [`${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fexplore\u002Freference\u002Fdispatch.md`](${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fexplore\u002Freference\u002Fdispatch.md). It carries the two conditions that bind the write (filename checking and the collision rule) and why a by-value payload of findings rather than artifact bodies is a failed dispatch rather than a fallback.\n\n**Coverage discipline** when fanning out: (1) write a numbered gap-list before any deepen pass; (2) fan out by disjoint area, never split the six dimensions across agents; (3) whoever holds the workflow writes `EXPLORE.md`. `discovery:explorer` writes its own, while built-in Explore agents cannot write one at all, so their caller does.\n\n**When to fan out, and to what.** Fan-out is the worker's, not the parent's: the parent dispatches **one** `discovery:explorer`, which scales inside its own run. Two triggers, either one: the scope names **two or more disjoint areas**, or the numbered gap-list after the first pass carries **four or more** entries in areas that share no files. Below that, go sequential; a scout costs a spawn and returns a pointer, which a single-area scope does not need. The worker type is the **built-in Explore scout** described above, one per disjoint area, each told what it owns and what it must not wander into. **Spawn at most a dozen scouts at once.** That is this plugin's own ceiling, not the session's, which [subagents: concurrent subagent limit](https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fsub-agents#concurrent-subagent-limit) governs, so a wave of twelve is not guaranteed to fit. Treat a refused spawn as an area **deferred, not dropped**: hold it and re-spawn it in the next wave, and let the gap-list rather than the first wave decide when coverage is done. The scout is locate-tier: its hits are pointers, and the worker Reads the file itself before any sidecar records `verified: read`.\n\n**One `EXPLORE.md`, one worker.** Do not fan the six dimensions across *parent-side* explorers, the shape the `\u002Fdiscovery:research` deep tier uses for N independent topics: codebase areas share a dependency graph, and a parent-side split severs dimension 3. Revisit only when an ask arrives as N genuinely separable modules with no cross-area dependency; then the sub-slice machinery this plugin already has applies unchanged.\n\n## Worker procedure\n\nLoad [reference\u002Fworkflow.md](reference\u002Fworkflow.md) when you are the worker (inline, or the dispatched `discovery:explorer`), before the first dimension. It holds purpose, the six dimensions, exploration modes, and the output format. The parent does not load it to dispatch. The outcome gate below still applies.\n\n## Outcome gate (before EXPLORE.md handoff)\n\nBefore writing EXPLORE.md (or returning the summary), check the artifact against **binary criteria read off it**, not a \"did I explore enough?\" recap. Any FAIL → return to the named dimension and fix before handoff:\n\n- **Every Output-format section populated with specifics**. Each of the 7 sections carries concrete findings, not placeholders or \"TBD\".\n- **Every load-bearing area covered OR listed as a numbered gap**. Nothing the task plausibly depends on is silently unexplored.\n- **Conclusion-driving claims are Read-verified, not inferred from a filename or grep hit**. Anything a downstream decision rests on came from reading the file or code.\n- **A pass\u002Ffail claim was run, not read**. Every claim that a test or check passes, fails or builds carries `verified: ran` with its `command:` and observed `result:`; a test that was only opened supports no such claim.\n- **The index pins and lists what it cites**. Its frontmatter `repos:` carries each explored repository's `sha` and `dirty` flag, its `## Code references` section opens with `coverage: exhaustive` or `coverage: key-files` followed by the staleness-check line, and every abstract states a finding rather than naming what was covered.\n- **Paths are machine-agnostic**. No finding in the artifact echoes an absolute machine path (notably the project root gathered above); every path it records is written relative to the repo root, or, when there is no repo root, to the current working directory, so the handoff stays portable across machines.\n- **Open questions handed off, never dropped**. Surfaced to the user inline, or carried in the payload's `open_questions` for the parent to surface under dispatch. Each with a recommended default.\n\nWhen dispatched work returns after you presented open questions and before the user answers, the next message that presents anything ends with every open question in full: `docs\u002Fcontracts\u002Fasync-round-presentation\u002FREADME.md` in the marketplace.\n\n## Scope\n\nExplore the following: $ARGUMENTS\n\nA leading `--output \u003Cvalue>` in that line is the reply shape, not part of the scope.\n\n**A dispatched run does not read that line.** The scope does not reach a preloaded body by argument substitution, and a non-fork subagent has no view of the conversation to fall back on, so **do not rely on seeing an unfilled slot**: for a dispatched run the scope arrives in the dispatch prompt, and its absence is a parent-envelope failure the agent reports rather than repairs, whatever the line above renders as. There is no unscoped orientation mode under dispatch: a general repository sweep would hand back a plausible artifact answering a question nobody asked. What is documented about that path, and what is not, in either direction, is recorded once in [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md). Running **inline** with no scope supplied above, infer it from the current conversation context. Identify what area of the codebase is relevant to the task at hand and explore that.\n\n**Caveat, a `${CLAUDE_…}`-shaped token in a scope may not arrive as you typed it**, which is a different question from the paragraph above and not evidence for or against it. What was observed, what is documented, what is not, and the practical rule: [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md) (\"A different question\"). The `scope_as_received` echo-back in the acceptance gate is what catches it whichever way the substitution actually runs.\n\n## Final step: persist artifact for handoff\n\nWrite the exploration output to `\u003Cmemory_dir>\u002F\u003Cslug>\u002FEXPLORE.md`, a memory-tier artifact, never committed. Destination and slug resolve per the lifecycle artifact protocol ([`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fartifact-protocol.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fartifact-protocol.md)).\n\nThis file is the authoritative stage summary, a fresh session must be able to resume external research or planning reading only this artifact.\n\n**`EXPLORE.md` is always an INDEX**, at every size, not only past an overflow threshold. It carries a task restatement, a one-line abstract per sidecar copied verbatim from that sidecar's header, a section → file + anchor table, a `## Code references` listing with its `coverage:` and staleness-check lines, and the closing Next-stage-handoff naming what external research (`\u002Fdiscovery:research`) or planning needs. The 7-point Output format's content lives in sibling `EXPLORE-\u003Csection>.md` sidecars in the same directory, each opening with a machine-readable YAML header so a consumer can grep headers and read exactly one file. Schema, the `repos:` commit pin, and the two load-bearing placement rules. Sidecars stay inside `\u003Cmemory_dir>\u002F\u003Cslug>\u002F`, and `EXPLORE.md` stays the entry point: [`${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fresearch\u002Fcontext\u002Fartifact-shape.md`](${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fresearch\u002Fcontext\u002Fartifact-shape.md).\n\n**Sidecar bodies match their length to what the section needs**: cover the substance, with no filler sections, redundant summaries, or boilerplate. The index's one-line abstracts and the outcome gate's specifics are the floor.\n\n**Sidecar filenames are keyed on the SECTION, not the scope**, a run has one scope and many sections, so a scope-keyed name gives every sidecar the same filename and later sections overwrite earlier ones. Use the same stable id the header's `section` field and the index anchor carry.\n\n**Sidecar headers use the EXPLORE schema, not the research one.** Local evidence is a repository path and whether the file was actually Read. `verified: read | ran | grep | inferred`, not a URL, a source tier, and a publishing pool. Handed the research header, a run either fabricates fields it has no values for or improvises a shape no consumer can parse; never borrow a research field, because filling one launders a grep hit into the field a fetched primary would occupy. Schema and why `verified` is load-bearing: the artifact-shape spoke's \"EXPLORE.md sidecar header\" section.\n\n**If an unrelated `EXPLORE.md` already exists** in that slice, do not clobber it, and do not rename the index to dodge it, since `EXPLORE-*.md` is the sidecar pattern and a renamed index collides with its own sidecars. Occupancy is the PARENT's to resolve, before any write: stat the slice root pre-dispatch, and when it is occupied assign a sub-slice `\u003Cmemory_dir>\u002F\u003Cslug>\u002F\u003Cscope-slug>\u002F` as the envelope's slice path, so the whole artifact set is written there under its normal names. A worker never picks a sub-slice itself, and on an inline run this session is the parent and applies the same check before writing. A prior exploration lost to a filename collision is silent and unrecoverable.\n\n## Boundary, the built-in `Explore` agent\n\nBoth answer \"what is in this codebase\", so a request to explore can route to either.\n\n- **`Explore` (built-in subagent)**: a one-shot locator that returns excerpts to its caller and\n  skips CLAUDE.md. It mutates nothing: it cannot write files. It is reached through the Agent\n  tool's `subagent_type`. Record: [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md),\n  \"Harness facts the dispatch design rests on\".\n- **This skill (marketplace plugin)**: the full exploration: six dimensions, the project's rules\n  loaded, and a persisted, verified `EXPLORE.md` a cleared session resumes from.\n\n**Routing.** When the built-in `Explore` agent resolves in this session, dispatch it directly for a\nbare locate (\"where is X\", \"what calls Y\"); use this skill when the four tests under Routing above\nsend the run to `discovery:explorer`. Inside this skill's run, `Explore` is the locate-tier scout,\nnever the worker.\n\n**Mutation gate.** `Explore` writes nothing. This skill writes the artifact set in the memory slice\nonly.\n\nThe four-part records live in [reference\u002Fnative-explore.md](reference\u002Fnative-explore.md).\n\n## Next\n\n- Findings raise a question about current external practice: `\u002Fdiscovery:research \u003Ctopic>`.\n- The picture is enough, no contract is locked, and the diff will not be quick to review and cheap to retry: `\u002Fplanning:interview`.\n- The contract is locked and the work adds types, contracts, or module boundaries: `\u002Fplanning:design`.\n- Unsure where this leaves the work, or arrived mid-flow: `\u002Fsession-flow:workflow`.\n\n## Gotchas\n\n- **Fan-out without a numbered gap-list**. Dispatching subagents before writing gaps produces duplicate reads and missed areas. The gap-list is the coverage-discipline gate.\n- **Handing off with placeholder sections**. Every Output-format section needs specifics or an explicit numbered gap. \"TBD\" fails the outcome gate.\n- **Inferring from filenames or git log without Read**. Grep hits are discovery only; conclusion-driving claims need Read verification. When uncertain, Read the file.\n- **Asking about a deleted file the git probe can settle**. Before archaeology on a referenced file that is not on disk, run the `git status` and `git log` probe in [reference\u002Fworkflow.md](reference\u002Fworkflow.md) dimension 2. A staged or committed delete is intentional: note it in the output and skip it. Investigate an unexplained one, and ask only when the probe does not settle which it is.\n\n## What this skill does NOT do\n\n- **Does not research externally**. That's `\u002Fdiscovery:research`. This skill reads local code, git, and file system only\n- **Does not make changes**. It explores. Execution is a separate step\n- **Does not make decisions**. It presents what IS. The planning step decides what SHOULD BE\n- **Does not skip dimensions for \"simple\" tasks**, a quick bug fix still benefits from reading the surrounding code and checking for tests\n","**Arguments.** `[--output change-prep|explain] [scope]`. `--output` sets the reply shape for this run ([Reply shape](#reply-shape-explore_output)) and is not part of the scope. e.g., \u002Fdiscovery:explore payments module dependencies, \u002Fdiscovery:explore tests, \u002Fdiscovery:explore git, \u002Fdiscovery:explore config\n\n## Repository context. Gather first\n\nCollect these with **individual** Bash calls, one command per call, never combined into a single\ninvocation:\n\n- Current branch, `git branch --show-current`\n- Working tree status (empty = clean), `git status --porcelain | head -20`\n- Project root, `git rev-parse --show-toplevel`\n\nThe pipe is the bound and belongs in the command. A read-time cap (\"read only the first 20 entries\")\ncomes too late for whatever the command has already returned inline. What a result returns inline,\nand when it arrives as a saved file instead, is [Tools reference § Output\nlimits](https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Ftools-reference#output-limits).\n\nTreat a failure (not a repository, git unavailable) as an unknown value and carry on. Keep these as\nseparate body Bash calls rather than pre-compute lines ([gather-block convention](https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fdocs\u002Fconventions\u002Fgather-block\u002FREADME.md#the-pre-compute-block-runs-as-one-shell-invocation),\n\"The pre-compute block runs as one shell invocation\").\n\nThese values orient this session only. Resolve files against the project root, an absolute machine path, but never echo it into `EXPLORE.md`; the handoff artifact records relative paths (outcome gate below).\n\n## Reply shape: `explore_output`\n\nResolve `explore_output` before routing; it decides only the final reply. `EXPLORE.md` and its\nsidecars are written the same way under every value. Lowest layer first, a later one winning\n(key contract: [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fconfig.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fconfig.md)):\n\n1. the default, `auto`;\n2. the `userConfig` value, `${user_config.explore_output}` (a literal unexpanded token means unset;\n   `auto` here is reported as the default, since the two cannot be told apart);\n3. `explore_output` in `docs\u002Fconventions\u002Fdiscovery.yaml` at the project root;\n4. an `--output change-prep` or `--output explain` argument on this invocation.\n\nRead the file with the Read tool; a missing file or key leaves that layer unset, and the file does\nnot apply when the project root is unknown. No `~\u002F.claude` file, `.claude\u002F` file or personal override\nsets this key. A value other than `auto`, `change-prep` or\n`explain` in any layer (or an `--output` value other than the two) is named in the reply, with the\nfile or `userConfig` that held it, the key, and the value, and that layer is dropped. A valid\nhigher layer (such as `--output`) still wins; with none, the run continues on the default, `auto`,\nreported as the default level with the invalid value named. It never falls through to a lower\nlayer's value.\n\nUnder `auto`, pick the concrete shape:\n\n- `explain` only when a person asked, in their own message, how something works (\"how does the\n  retry scheduler work\", \"walk me through the login flow\").\n- `change-prep` for everything else: a request made before a change, and **every invocation from\n  another skill** (a skill body told you to run `\u002Fdiscovery:explore`, or you are a subagent another\n  skill dispatched), however its scope is worded. A calling skill that wants a walkthrough passes\n  `--output explain`.\n\nState one line in the reply: the concrete shape and the layer that supplied the value, e.g.\n`explore_output: explain (auto from the default; how-does-it-work request)` or\n`explore_output: change-prep (docs\u002Fconventions\u002Fdiscovery.yaml)`.\n\nThe two shapes:\n\n- **`change-prep`**: the handoff summary: what exists, the constraints and patterns a change must\n  respect, the open questions with recommended defaults, and the next stage\n  (`\u002Fdiscovery:research` or `\u002Fplanning:plan`).\n- **`explain`**: a walkthrough of how the scope works, in the order a request or call moves\n  through it, each step citing the `path:line` it rests on, from files the run Read. Open\n  questions are still surfaced. No next-stage recommendation unless the person asked for one.\n\n## Routing. Dispatch by default\n\n**From the main conversation, this skill dispatches the `discovery:explorer` subagent.** Exploration reads many files; keeping that out of the orchestrator's context window is the point. The agent loads the project's path-scoped rules, runs the six dimensions, writes the artifact set, and returns a bounded summary plus a file pointer, not the reads. The parent resolves the **pre-dispatch envelope** first, six fields (scope, reason, memory-slice path, memory root, budget, capability flags), written into the dispatch prompt as the labeled template in [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md), not as prose the agent has to parse, and owns the **post-dispatch boundary** after: re-surfacing `open_questions` to the user, dispatching the sibling verifier, and **writing its verdict back into `EXPLORE.md`** (which agent, its prompt, the literal `verification:` line, and what to write when no verifier can run: [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md), \"The sibling verifier, stated once\"), the explorer always returns `verification: pending` because it may not grade its own work, so an artifact left saying `pending` after the parent verified it cannot be told apart from one whose verifier never ran, and this artifact is the whole handoff a fresh session resumes from.\n\n**The spawn's `model`** follows the parent contract's \"The worker's model is the parent's call\":\npass one only when a multi-agent config layer moves the explorer's role off its pin.\n\n**The dispatch prompt also carries `Output: change-prep` or `Output: explain`**, the concrete shape\nresolved under Reply shape above, never `auto`: the explorer cannot see the request or who made it.\nAfter the acceptance gate passes, the reply to the person (or the calling skill) is the explorer's\nprose in that shape plus the `explore_output:` line.\n\n**Run inline instead when any of these holds**. Inline runs the identical workflow, and the escape hatch relaxes nothing:\n\n- **Tight turn-by-turn iteration**. ≤~5 known files, findings feeding a same-session edit, and you will redirect as results land.\n- **Cost**, a dispatched run pays the full six dimensions every time; a single-file question does not need an envelope.\n- **The invoking context is already a subagent**. Dispatch-by-default is scoped to the main-conversation boundary. Hoisting, not nesting: the outer dispatch already supplied the fresh context, so a second hop only spends the inner agent's own window.\n\n**When selecting the dispatched route:** probe `check-dispatch-artifact.sh --help` before dispatching; a denied or errored probe **halts**. An un-runnable post-dispatch gate is not a reason to take the inline escape hatch *to dodge the gate*. A legitimate inline run (tight iteration, cost, already-a-subagent) does not owe that script, it has no script verdict to self-grade, so do not apply this precondition to the inline path. Invocation forms: [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md).\n\n**Which agent, decided by four tests.** The named alternative is the **built-in Explore subagent**, and these four decide between it and `discovery:explorer`. **Any one YES routes to `discovery:explorer`**, and all four NO means this skill is the wrong entry point altogether, dispatch built-in Explore and do not invoke this skill:\n\n1. **Must a graded artifact survive the run?** Built-in Explore cannot write one.\n2. **Do project conventions constrain the answer** (`.claude\u002Frules\u002F`, a nested `AGENTS.md`, declared layer rules)? Built-in Explore never sees them.\n3. **Will a conclusion rest on the contents of a file** rather than its location? A built-in agent runs a prompt you cannot inspect and its report does not say how much of a file it read, so what it returns backs `verified: grep`, never `verified: read`.\n4. **Might the run truncate and need resuming?** Built-in Explore is one-shot.\n\nEach NO above is a harness denial, not a preference, and the four are recorded once with their basis in [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md), \"The built-in Explore agent cannot hold this plugin's contract\". Read it before arguing with a test; do not restate the denials anywhere else.\n\nBuilt-in Explore is therefore a **scout under a worker, never the worker**. Where it earns its place: the locate-tier legwork inside a larger exploration, per the fan-out rules below. When dispatching one, pass a thoroughness level (`quick`, `medium`, `very thorough`) and restate any convention that bounds the search, because it arrives convention-blind.\n\n**Preload-liveness sentinel.** A dispatched agent receives this body through its `skills:` preload, and we never count on the harness to tell the agent when that preload does not load. The record for that harness behavior is [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md), \"Harness facts the dispatch design rests on\". A dispatched run therefore echoes this token verbatim as `preload_token` in its return payload. The disk fallback Reads this same file, so a matching `preload_token` is file-identity, **not** proof that preload fired:\n\n```text\ndiscovery-explore-preload-8e2b7d\n```\n\nA missing or mismatched token is a **hard failure: the parent discards the run**, never downgrades or accepts the artifact. Without it, a preload miss produces an undisciplined run that still writes an artifact. Indistinguishable from success at every other seam. Provenance is `preload: fired | fallback`; `fallback` is the accepted recovery, not a discard. Rationale and the parent-side contract: [`${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fexplore\u002Freference\u002Fdispatch.md`](${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fexplore\u002Freference\u002Fdispatch.md), \"Discipline liveness\".\n\n**Post-dispatch acceptance gate. Parent-side, before the payload is believed.** `status: complete` is the agent's claim about its own run, and a claim is not evidence. Grade the run **off disk**, against the memory-slice path from the parent's own pre-dispatch envelope, **carry that path across the dispatch, because it is this gate's input**, and never a path read out of the payload, because the failure this gate exists to catch is a payload that comes back carrying no pointer at all. In order:\n\n**Pre-dispatch:** create the memory slice and touch `\u003Cthat slice>\u002F.explore-dispatch` as the gate's freshness baseline, then hand that file to the gate as `--newer-than`. Without it a slice that already holds an earlier run's artifact set passes every on-disk check even when this dispatch wrote nothing at all. **Both shell forms of that one command are in [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md) (\"The pre-dispatch baseline\"). Copy the one matching this session's shell, because the POSIX form's `touch` is not a command in PowerShell and its directory flag is a parameter error there. Same file carries the envelope template this dispatch also owes.** The memory root's self-ignoring `.gitignore` guard is a separate obligation this gate does not grade. Same file, \"What this gate does not grade\".\n\n1. **The payload is well-formed**. `preload_token` matches the sentinel verbatim, `preload:` is `fired` or `fallback`, and an `artifact:` pointer is present. Missing token or artifact is a **failed dispatch** whatever the `status` field says; a missing token is a discard, per the rule above. A missing or unrecognized `preload:` field is an out-of-date agent definition, not a pass. A matching token does not prove preload fired; `preload: fallback` is not a discard.\n\n   **And `scope_as_received` matches the scope the parent actually sent**. Compared against the envelope the parent wrote, not against what it meant. It is the only check here that fires on an input that is present and wrong. A mismatch is a **failed dispatch**: re-dispatch with the scope restated in a form that survives the trip (see the caveat under **Scope**); do not accept the artifact and mentally translate it. A well-formed payload carrying no `scope_as_received` is an out-of-date agent definition, not a pass.\n2. **The artifact set is actually on disk, and this run put it there:**\n\n   ```bash\n   \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fcheck-dispatch-artifact.sh\" \u003Cthe retained memory-slice path> \\\n     --index-name EXPLORE.md \\\n     --newer-than \u003Cthat slice>\u002F.explore-dispatch --expect-index \u003Cthe payload's artifact: value>\n   ```\n\n   `--index-name` is required, not defaulted, the same gate grades `\u002Fdiscovery:research` runs, the two artifact families differ only in that name, and a gate that fails closed everywhere else must not guess which family it is looking at.\n\n   The gate grades exactly the slice path it is given and never scans the slice for an index elsewhere, so on a collision the envelope's slice path is already the sub-slice the parent assigned pre-dispatch, and that same assigned path is the one handed here.\n\n   Cite the **exit status**, 0 usable, 1 no usable artifact set, 2 ungradeable, not a reading of the directory, because the context most motivated to call the dispatch finished is the one that would be doing the reading. Only the slice path and `--index-name` are required, and that bare form is still a real gate: every optional check reports `unchecked` rather than passing quietly. Append `--expect-sidecars \u003Cn>` when the payload reported a `sidecars:` count, and **drop any flag whose value the payload did not supply**.\n\n   **The `index=` path in that output is authoritative** downstream: the verifier's target and the handoff pointer both come from it, not from `artifact:`. `pointer=mismatch` means the payload named a file this gate never graded, a defect in the payload, not a naming preference to reconcile.\n\n   Before the sibling verifier, run `bash \"${CLAUDE_PLUGIN_ROOT}\u002Flib\u002Fread-verification.sh\" --plugin discovery --skill explore --file docs\u002Fconventions\u002Fdiscovery.yaml` and report its line: `light` and `off` skip that verifier and write `verification: skipped (\u003Clevel>)`, as the [parent contract](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md) \"The sibling verifier, stated once\" says.\n\n**Any non-zero exit halts the workflow, and a gate that could not run at all is a FAIL, never a skip.** An invocation above that is denied, prompts and is declined, or errors out halts exactly as a non-zero exit does; do not fall back to reading the directory. Do **not** proceed to research, planning, or an edit on the strength of an exploration that did not happen. Proceeding is the damage a silently-empty return actually causes; the missing artifact is only how it starts. Recovery ladder, and why a resume beats a re-dispatch: [`${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fexplore\u002Freference\u002Fdispatch.md`](${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fexplore\u002Freference\u002Fdispatch.md).\n\n**One named exception, and it is an exception to the halt, not to the gate.** Exit 1 with `persistence: by-value` in the payload means the agent finished and its environment refused every write, the one failure where a re-dispatch pays full price to reproduce the same refusal. There the parent **writes the slice itself** from the artifact bodies the payload carries verbatim, into the memory-slice path it resolved before dispatch (on that path the payload's `artifact:` value is a *destination* the agent names, never the anchor), and then **re-runs the identical gate command above**. The workflow proceeds only on a subsequent exit 0. If the second run is non-zero, the halt stands and the ladder resumes at the rung it was on. The freshness check needs nothing special: the parent writes after its own pre-dispatch `touch`, so the index is strictly newer than the baseline.\n\nRead the by-value rung before performing that write: [`${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fexplore\u002Freference\u002Fdispatch.md`](${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fexplore\u002Freference\u002Fdispatch.md). It carries the two conditions that bind the write (filename checking and the collision rule) and why a by-value payload of findings rather than artifact bodies is a failed dispatch rather than a fallback.\n\n**Coverage discipline** when fanning out: (1) write a numbered gap-list before any deepen pass; (2) fan out by disjoint area, never split the six dimensions across agents; (3) whoever holds the workflow writes `EXPLORE.md`. `discovery:explorer` writes its own, while built-in Explore agents cannot write one at all, so their caller does.\n\n**When to fan out, and to what.** Fan-out is the worker's, not the parent's: the parent dispatches **one** `discovery:explorer`, which scales inside its own run. Two triggers, either one: the scope names **two or more disjoint areas**, or the numbered gap-list after the first pass carries **four or more** entries in areas that share no files. Below that, go sequential; a scout costs a spawn and returns a pointer, which a single-area scope does not need. The worker type is the **built-in Explore scout** described above, one per disjoint area, each told what it owns and what it must not wander into. **Spawn at most a dozen scouts at once.** That is this plugin's own ceiling, not the session's, which [subagents: concurrent subagent limit](https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fsub-agents#concurrent-subagent-limit) governs, so a wave of twelve is not guaranteed to fit. Treat a refused spawn as an area **deferred, not dropped**: hold it and re-spawn it in the next wave, and let the gap-list rather than the first wave decide when coverage is done. The scout is locate-tier: its hits are pointers, and the worker Reads the file itself before any sidecar records `verified: read`.\n\n**One `EXPLORE.md`, one worker.** Do not fan the six dimensions across *parent-side* explorers, the shape the `\u002Fdiscovery:research` deep tier uses for N independent topics: codebase areas share a dependency graph, and a parent-side split severs dimension 3. Revisit only when an ask arrives as N genuinely separable modules with no cross-area dependency; then the sub-slice machinery this plugin already has applies unchanged.\n\n## Worker procedure\n\nLoad [reference\u002Fworkflow.md](reference\u002Fworkflow.md) when you are the worker (inline, or the dispatched `discovery:explorer`), before the first dimension. It holds purpose, the six dimensions, exploration modes, and the output format. The parent does not load it to dispatch. The outcome gate below still applies.\n\n## Outcome gate (before EXPLORE.md handoff)\n\nBefore writing EXPLORE.md (or returning the summary), check the artifact against **binary criteria read off it**, not a \"did I explore enough?\" recap. Any FAIL → return to the named dimension and fix before handoff:\n\n- **Every Output-format section populated with specifics**. Each of the 7 sections carries concrete findings, not placeholders or \"TBD\".\n- **Every load-bearing area covered OR listed as a numbered gap**. Nothing the task plausibly depends on is silently unexplored.\n- **Conclusion-driving claims are Read-verified, not inferred from a filename or grep hit**. Anything a downstream decision rests on came from reading the file or code.\n- **A pass\u002Ffail claim was run, not read**. Every claim that a test or check passes, fails or builds carries `verified: ran` with its `command:` and observed `result:`; a test that was only opened supports no such claim.\n- **The index pins and lists what it cites**. Its frontmatter `repos:` carries each explored repository's `sha` and `dirty` flag, its `## Code references` section opens with `coverage: exhaustive` or `coverage: key-files` followed by the staleness-check line, and every abstract states a finding rather than naming what was covered.\n- **Paths are machine-agnostic**. No finding in the artifact echoes an absolute machine path (notably the project root gathered above); every path it records is written relative to the repo root, or, when there is no repo root, to the current working directory, so the handoff stays portable across machines.\n- **Open questions handed off, never dropped**. Surfaced to the user inline, or carried in the payload's `open_questions` for the parent to surface under dispatch. Each with a recommended default.\n\nWhen dispatched work returns after you presented open questions and before the user answers, the next message that presents anything ends with every open question in full: `docs\u002Fcontracts\u002Fasync-round-presentation\u002FREADME.md` in the marketplace.\n\n## Scope\n\nExplore the following: $ARGUMENTS\n\nA leading `--output \u003Cvalue>` in that line is the reply shape, not part of the scope.\n\n**A dispatched run does not read that line.** The scope does not reach a preloaded body by argument substitution, and a non-fork subagent has no view of the conversation to fall back on, so **do not rely on seeing an unfilled slot**: for a dispatched run the scope arrives in the dispatch prompt, and its absence is a parent-envelope failure the agent reports rather than repairs, whatever the line above renders as. There is no unscoped orientation mode under dispatch: a general repository sweep would hand back a plausible artifact answering a question nobody asked. What is documented about that path, and what is not, in either direction, is recorded once in [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md). Running **inline** with no scope supplied above, infer it from the current conversation context. Identify what area of the codebase is relevant to the task at hand and explore that.\n\n**Caveat, a `${CLAUDE_…}`-shaped token in a scope may not arrive as you typed it**, which is a different question from the paragraph above and not evidence for or against it. What was observed, what is documented, what is not, and the practical rule: [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md) (\"A different question\"). The `scope_as_received` echo-back in the acceptance gate is what catches it whichever way the substitution actually runs.\n\n## Final step: persist artifact for handoff\n\nWrite the exploration output to `\u003Cmemory_dir>\u002F\u003Cslug>\u002FEXPLORE.md`, a memory-tier artifact, never committed. Destination and slug resolve per the lifecycle artifact protocol ([`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fartifact-protocol.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fartifact-protocol.md)).\n\nThis file is the authoritative stage summary, a fresh session must be able to resume external research or planning reading only this artifact.\n\n**`EXPLORE.md` is always an INDEX**, at every size, not only past an overflow threshold. It carries a task restatement, a one-line abstract per sidecar copied verbatim from that sidecar's header, a section → file + anchor table, a `## Code references` listing with its `coverage:` and staleness-check lines, and the closing Next-stage-handoff naming what external research (`\u002Fdiscovery:research`) or planning needs. The 7-point Output format's content lives in sibling `EXPLORE-\u003Csection>.md` sidecars in the same directory, each opening with a machine-readable YAML header so a consumer can grep headers and read exactly one file. Schema, the `repos:` commit pin, and the two load-bearing placement rules. Sidecars stay inside `\u003Cmemory_dir>\u002F\u003Cslug>\u002F`, and `EXPLORE.md` stays the entry point: [`${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fresearch\u002Fcontext\u002Fartifact-shape.md`](${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fresearch\u002Fcontext\u002Fartifact-shape.md).\n\n**Sidecar bodies match their length to what the section needs**: cover the substance, with no filler sections, redundant summaries, or boilerplate. The index's one-line abstracts and the outcome gate's specifics are the floor.\n\n**Sidecar filenames are keyed on the SECTION, not the scope**, a run has one scope and many sections, so a scope-keyed name gives every sidecar the same filename and later sections overwrite earlier ones. Use the same stable id the header's `section` field and the index anchor carry.\n\n**Sidecar headers use the EXPLORE schema, not the research one.** Local evidence is a repository path and whether the file was actually Read. `verified: read | ran | grep | inferred`, not a URL, a source tier, and a publishing pool. Handed the research header, a run either fabricates fields it has no values for or improvises a shape no consumer can parse; never borrow a research field, because filling one launders a grep hit into the field a fetched primary would occupy. Schema and why `verified` is load-bearing: the artifact-shape spoke's \"EXPLORE.md sidecar header\" section.\n\n**If an unrelated `EXPLORE.md` already exists** in that slice, do not clobber it, and do not rename the index to dodge it, since `EXPLORE-*.md` is the sidecar pattern and a renamed index collides with its own sidecars. Occupancy is the PARENT's to resolve, before any write: stat the slice root pre-dispatch, and when it is occupied assign a sub-slice `\u003Cmemory_dir>\u002F\u003Cslug>\u002F\u003Cscope-slug>\u002F` as the envelope's slice path, so the whole artifact set is written there under its normal names. A worker never picks a sub-slice itself, and on an inline run this session is the parent and applies the same check before writing. A prior exploration lost to a filename collision is silent and unrecoverable.\n\n## Boundary, the built-in `Explore` agent\n\nBoth answer \"what is in this codebase\", so a request to explore can route to either.\n\n- **`Explore` (built-in subagent)**: a one-shot locator that returns excerpts to its caller and\n  skips CLAUDE.md. It mutates nothing: it cannot write files. It is reached through the Agent\n  tool's `subagent_type`. Record: [`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fparent-contract.md),\n  \"Harness facts the dispatch design rests on\".\n- **This skill (marketplace plugin)**: the full exploration: six dimensions, the project's rules\n  loaded, and a persisted, verified `EXPLORE.md` a cleared session resumes from.\n\n**Routing.** When the built-in `Explore` agent resolves in this session, dispatch it directly for a\nbare locate (\"where is X\", \"what calls Y\"); use this skill when the four tests under Routing above\nsend the run to `discovery:explorer`. Inside this skill's run, `Explore` is the locate-tier scout,\nnever the worker.\n\n**Mutation gate.** `Explore` writes nothing. This skill writes the artifact set in the memory slice\nonly.\n\nThe four-part records live in [reference\u002Fnative-explore.md](reference\u002Fnative-explore.md).\n\n## Next\n\n- Findings raise a question about current external practice: `\u002Fdiscovery:research \u003Ctopic>`.\n- The picture is enough, no contract is locked, and the diff will not be quick to review and cheap to retry: `\u002Fplanning:interview`.\n- The contract is locked and the work adds types, contracts, or module boundaries: `\u002Fplanning:design`.\n- Unsure where this leaves the work, or arrived mid-flow: `\u002Fsession-flow:workflow`.\n\n## Gotchas\n\n- **Fan-out without a numbered gap-list**. Dispatching subagents before writing gaps produces duplicate reads and missed areas. The gap-list is the coverage-discipline gate.\n- **Handing off with placeholder sections**. Every Output-format section needs specifics or an explicit numbered gap. \"TBD\" fails the outcome gate.\n- **Inferring from filenames or git log without Read**. Grep hits are discovery only; conclusion-driving claims need Read verification. When uncertain, Read the file.\n- **Asking about a deleted file the git probe can settle**. Before archaeology on a referenced file that is not on disk, run the `git status` and `git log` probe in [reference\u002Fworkflow.md](reference\u002Fworkflow.md) dimension 2. A staged or committed delete is intentional: note it in the output and skip it. Investigate an unexplained one, and ask only when the probe does not settle which it is.\n\n## What this skill does NOT do\n\n- **Does not research externally**. That's `\u002Fdiscovery:research`. This skill reads local code, git, and file system only\n- **Does not make changes**. It explores. Execution is a separate step\n- **Does not make decisions**. It presents what IS. The planning step decides what SHOULD BE\n- **Does not skip dimensions for \"simple\" tasks**, a quick bug fix still benefits from reading the surrounding code and checking for tests\n",{"metadata":24,"description":7,"argument-hint":26,"user-invocable":27,"disable-model-invocation":20},{"summary":25,"workflow-stage":5},"Explore code, history, tests, and config before changing anything","[--output change-prep|explain] [scope]",true,"main","4f2dcaaff35e8f9fccc6a9f4d82a5830ab17a5c5","plugins\u002Fdiscovery\u002Fskills\u002Fexplore",7,"https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins","https:\u002F\u002Fgithub.com\u002Fmelodic-software","https:\u002F\u002Fmelodicsoftware.com","Independent software studio building developer tools, automation, and application services, with roots in music.","2026-11-15 05:15:06",{"source":8,"skillName":5,"commands":38,"prompt":48,"zipAvailable":27},[39,42,45],{"tool":40,"command":41},"npx","npx skills add melodic-software\u002Fclaude-code-plugins --skill explore",{"tool":43,"command":44},"bunx","bunx skills add melodic-software\u002Fclaude-code-plugins --skill explore",{"tool":46,"command":47},"pnpm","pnpm dlx skills add melodic-software\u002Fclaude-code-plugins --skill explore","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fdiscovery\u002Fskills\u002Fexplore\u002FSKILL.md",[50,56,60,64,68,72,76,80],{"path":51,"resourceType":52,"resourceTypeDesc":53,"sizeBytes":54,"sourceHtmlUrl":55},"evals\u002Fevals.json","REFERENCE","参考文档",36741,"https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fdiscovery\u002Fskills\u002Fexplore\u002Fevals\u002Fevals.json",{"path":57,"resourceType":52,"resourceTypeDesc":53,"sizeBytes":58,"sourceHtmlUrl":59},"evals\u002Ffixtures\u002Fdiscovery-output-change-prep.yaml",111,"https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fdiscovery\u002Fskills\u002Fexplore\u002Fevals\u002Ffixtures\u002Fdiscovery-output-change-prep.yaml",{"path":61,"resourceType":52,"resourceTypeDesc":53,"sizeBytes":62,"sourceHtmlUrl":63},"evals\u002Ffixtures\u002Fdiscovery-output-explain.yaml",109,"https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fdiscovery\u002Fskills\u002Fexplore\u002Fevals\u002Ffixtures\u002Fdiscovery-output-explain.yaml",{"path":65,"resourceType":52,"resourceTypeDesc":53,"sizeBytes":66,"sourceHtmlUrl":67},"evals\u002Ffixtures\u002Fdiscovery-output-invalid.yaml",108,"https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fdiscovery\u002Fskills\u002Fexplore\u002Fevals\u002Ffixtures\u002Fdiscovery-output-invalid.yaml",{"path":69,"resourceType":52,"resourceTypeDesc":53,"sizeBytes":70,"sourceHtmlUrl":71},"reference\u002Fdispatch.md",15266,"https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fdiscovery\u002Fskills\u002Fexplore\u002Freference\u002Fdispatch.md",{"path":73,"resourceType":52,"resourceTypeDesc":53,"sizeBytes":74,"sourceHtmlUrl":75},"reference\u002Fecosystem-discovery.md",5170,"https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fdiscovery\u002Fskills\u002Fexplore\u002Freference\u002Fecosystem-discovery.md",{"path":77,"resourceType":52,"resourceTypeDesc":53,"sizeBytes":78,"sourceHtmlUrl":79},"reference\u002Fnative-explore.md",2036,"https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fdiscovery\u002Fskills\u002Fexplore\u002Freference\u002Fnative-explore.md",{"path":81,"resourceType":52,"resourceTypeDesc":53,"sizeBytes":82,"sourceHtmlUrl":83},"reference\u002Fworkflow.md",11268,"https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fdiscovery\u002Fskills\u002Fexplore\u002Freference\u002Fworkflow.md",[85,92,99,106,111,118],{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":19},"01M7DYYDG31B9YX7N9MB9QW2GW","track","Backlog reads through the bound tracker: search open and closed items, view one item with its comments and state history. Use when another skill searches or reads tracker items.","https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsession-flow\u002Fevals\u002Frecall-still-reports-reopened-bug\u002Fwork-items-stub\u002Fskills\u002Ftrack\u002FSKILL.md",[],[],{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":19},"01M7DYXVBAVG3NV30PA7GKW9Q6","reviewer-media","Reviewer media for one pull request: decides whether it needs a narrated walkthrough, builds the storyboard from \u002Freview:explain-change's digest, has \u002Fexplainer-video:produce render it and hands the manifest to \u002Fsource-control:pull-request media. Use when asked for 'reviewer media', 'a walkthrough video for this PR', 'a produced video of this change', or when pull-request ready or monitor hands a PR over.","https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Freview\u002Fskills\u002Freviewer-media\u002FSKILL.md",[],[],{"skillNo":100,"name":101,"nameZh":6,"description":102,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":105,"publishedAt":19},"01M7DYRZ5YD44AMYH26YR25GZ8","route","Model and effort per agent role (orchestrator, worker, verifier, retrieval) for a multi-agent run, resolved through the bundled defaults and the user, team and personal override config layers into fenced JSON with single-agent and fan-out variants and the layer behind each value. Use when asked 'which model for the subagents', 'route the roles' or 'model routing', or before a skill passes a role's model on a spawn.","https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fdiscovery\u002Fevals\u002Fex-model-pin-without-override\u002Fmulti-agent-stub\u002Fskills\u002Froute\u002FSKILL.md",[],[],{"skillNo":107,"name":101,"nameZh":6,"description":102,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":19},"01M7DYRTVT4FWTGDJY0HCCFJMZ","https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fdiscovery\u002Fevals\u002Fex-model-override-from-route\u002Fmulti-agent-stub\u002Fskills\u002Froute\u002FSKILL.md",[],[],{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":117,"publishedAt":19},"01M7DYNZC8PNW3T27V2ADKECKJ","principles","Module-design vocabulary for architecture findings, and the checks built on it. Use when: 'what is a deep module', 'what is a seam', 'deep vs shallow module', 'what is the deletion test', 'leverage and locality', 'module design vocabulary', 'which word do we use for X in architecture findings'. Scanning a codebase for friction is \u002Farchitecture:improve.","https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Farchitecture\u002Fskills\u002Fprinciples\u002FSKILL.md",[],[],{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":19},"01M7DYNMCZNEWBFHV9KTSS6H60","write","Structured five-field bug report (title, steps to reproduce, expected vs actual, justified severity, suggested fix location) from an informal description, read-only. Use when the user names a defect they observed, or asks for one written up ('report a bug', 'file a bug', 'write this up as a bug').","https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Farchitecture\u002Fevals\u002Fdeepening-defect-goes-to-bugs-write\u002Fbugs-stub\u002Fskills\u002Fwrite\u002FSKILL.md",[],[]]