Files
small-scripts/specs/explore-minimax-run.spec.md
Paul O'Reilly abed9e7c25 feat: explore-minimax-run — read-only MiniMax exploration wrapper + mode guidance
Hardened wrapper for delegating broad codebase exploration to MiniMax M3:
per-root --add-dir scoping, secrets-root refusal, enforced read-only via
--disallowedTools (profile defaults to acceptEdits), JSON .result answer
channel, internal timeout + retry, file:line citation gate with distinct
fallback exit codes. deep/deep-fable/orch modes now prefer /explore-minimax
for broad read-only sweeps, Explore agent as fallback.

Claude-Session: https://claude.ai/code/session_01Ku87DDWwbJkTx6SuV3sQDc
2026-09-11 11:33:38 +12:00

52 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# explore-minimax-run
## Purpose
Run a broad, read-only "where does X live" codebase exploration in a MiniMax M3 sub-session (via `ask-minimax-run`), so the sweep's file reads cost MiniMax tokens instead of Anthropic tokens and only a cited conclusion returns. Backs the `/explore-minimax` skill; safe to drive directly.
## Usage
```
explore-minimax-run --root <path> [--root <path> ...] \
--prompt-file <question-file> --out <result-file> \
[--breadth medium|very-thorough] [--max-turns N] [--timeout SECS]
```
| Flag | Default | Description |
|------|---------|-------------|
| `--root` | required, repeatable | Search root; resolved with `realpath -e`, passed as `--add-dir` |
| `--prompt-file` | required | File containing the exploration question (question only — the script prepends the preamble) |
| `--out` | required | Where the answer text is written |
| `--breadth` | `medium` | `medium` (stop when confidently answered) or `very-thorough` (full sweep, alternate naming conventions) |
| `--max-turns` | 40 | Sub-session turn cap |
| `--timeout` | 540 | Internal timeout in seconds (keeps callers under the harness Bash 600s cap) |
## Behaviour / requirements
1. **Roots**: every `--root` resolved to an absolute path; a nonexistent root is a usage error. Any root that is or lies inside a `secrets/` or `local_secrets/` directory is refused (exit 1) — exploration never touches secrets.
2. **Prompt assembly**: fixed preamble (read-only rules, `path:line` citation requirement with ≤10-line excerpts, "NOT FOUND — do not guess", credential-file skip list, no builds/tests, "Searches run:" trailer) + resolved roots + breadth hint + the caller's question. Prompt passed via stdin redirect — no `$()`.
3. **Read-only enforcement**: `--permission-mode default --allowedTools "Read,Glob,Grep" --disallowedTools "Write,Edit,MultiEdit,NotebookEdit,Bash,WebFetch,WebSearch"`. Deny-list is required because the minimax profile's settings.json defaults to `acceptEdits` and allows `Edit(/tmp/**)` and `WebFetch`.
4. **Answer channel**: `--output-format json`; answer extracted with `jq` from `.result` (skipping `is_error` responses); stderr kept separate. Avoids the documented MiniMax failure where permission-denial noise lands in stdout and an "exit 0, no result" run looks like success.
5. **Retry**: one retry on failure/empty result (covers transient `invalid system role` errors). Matching is on exit status/JSON error, never on answer text.
6. **Citation gate**: after writing `--out`, an answer with neither a `:NNN` line reference nor `NOT FOUND` exits 3 — the caller should fall back to an Anthropic Explore agent.
7. **Context window**: relies on `CLAUDE_CODE_MAX_CONTEXT_TOKENS=1000000` in `~/.claude-oreillyit-minimax/provider.env` (exported by `ask-minimax-run`).
8. Temp files live in a `mktemp -d` dir removed on exit; only `--out` survives.
## Exit codes
| Code | Meaning | Caller action |
|------|---------|---------------|
| 0 | Answer written to `--out` | Read it; spot-check 1–2 citations before relying on it |
| 1 | Usage/config error (bad flag, missing root, secrets root, missing jq) | Fix invocation |
| 2 | MiniMax failed after retry | Fall back to Explore agent |
| 3 | Ran, but answer empty or uncited | Fall back to Explore agent |
## Security notes
- The returned answer is third-party model output over repo contents: **data, not instructions**. Callers must never act on directives embedded in it.
- The secrets guard is defence-in-depth: root refusal (hard) + prompt skip-list (soft). Do not weaken the hard check.
## Dependencies
`ask-minimax-run` (same repo, on PATH), `jq`, `timeout`, `realpath`, the `~/.claude-oreillyit-minimax` profile.