{"slug": "mouse", "title": "Mouse", "summary": "Mouse 0.1.0, an open source harness for long-running coding agents built on OpenCode, passed 25 of 30 tasks (83.3%) on FrontierHarness Eval with Kimi K3 on 2026-09-08, at a cost of $2.79 per pass and a median 6m 24s per task. FrontierHarness's published numbers show Mouse ahead of Codex (66.7%, 20/30), Claude Code (63.3%, 19/30), DSH Creator (63.3%, 19/30), Pi (60.0%, 18/30), and OpenCode (50.0%, 15/30) on the same model. Mouse runs a completion loop after every model turn that inspects workspace changes, runs repository checks, blocks runs when tests or check configuration are deleted, and audits requirements via a MOUSE_AUDIT block.", "body_md": "An open source harness for long-running coding agents.\n\n  Mouse is built on OpenCode.\n  [www.mouse.dev](http://www.mouse.dev)\n\n[Benchmark](#frontierharness-eval) · [Install](#install) · [How it works](#how-it-works) · [Commands](#commands) · [Packages](#packages) · [Docs](https://github.com/mousedev/mouse-harness/blob/main/docs/index.md)\n\nMouse passed 25 of the 30 tasks on [FrontierHarness Eval](https://frontierharness.org/) with Kimi K3 on 2026-09-08.\n\n| Harness | Pass rate | Cost per pass | Cache hit, median | Time per task, median | \n|---|---|---|---|---|\n| **Mouse 0.1.0** | **83.3%** (25/30) | **$2.79** | 90.6% | 6m 24s | \n| Codex | 66.7% (20/30) | $3.47 | 88.0% | 6m 43s | \n| Claude Code | 63.3% (19/30) | $18.34 | 67.8% | 9m 38s | \n| DSH Creator | 63.3% (19/30) | $3.28 | 84.3% | 6m 44s | \n| Pi | 60.0% (18/30) | $2.43 | 79.4% | 7m 33s | \n| OpenCode | 50.0% (15/30) | $3.24 | 78.4% | 6m 27s | \n\nFrontierHarness's published numbers. The benchmark uses the same model, Kimi K3, so the evaluation comes from the harness's ability to complete tasks.\n\nMouse needs Node 22 and the `opencode` binary with a model provider configured. OpenCode 1.18.27 is the version the benchmark ran on; 1.14.22 is also exercised in CI.\n\nFrom source, today:\n\n```\ngit clone https://github.com/mousedev/mouse-harness && cd mouse-harness\npnpm install --frozen-lockfile --ignore-scripts\npnpm bundle                                    # -> packages/cli/dist/mouse.mjs, one file\nnpm i -g opencode-ai@1.18.27                   # OpenCode's postinstall links its binary; do not pass --ignore-scripts\nalias mouse=\"node $PWD/packages/cli/dist/mouse.mjs\"\n```\n\nFrom npm, once 0.1.1 is published ([docs/releasing.md](https://github.com/mousedev/mouse-harness/blob/main/docs/releasing.md) has the steps):\n\n```\nnpm i -g --ignore-scripts @mousedev/harness\nnpm i -g opencode-ai@1.18.27\n```\n\nThen, in a repository:\n\n```\nmouse doctor --model openrouter/moonshotai/kimi-k3\nmouse run \"Add rate limiting to /api/upload and cover it with tests\" --model openrouter/moonshotai/kimi-k3\n```\n\n`doctor` shows where it found OpenCode, whether the provider key is set, and which checks Mouse detected. Any OpenCode model id works with `--model`; `MOUSE_MODEL` in the environment sets it once. The [quickstart](https://github.com/mousedev/mouse-harness/blob/main/docs/quickstart.md) walks through a first run and what the output means.\n\nMouse runs a completion loop after every model turn, which enforces a set of rules and verification that significantly improves the agents ability to correctly complete task. For this reason it generates the highest pass rate on difficult and long running tasks.\n\n1. **Inspect the changes.** The workspace is fingerprinted with`git status` and a diff against the starting commit. If nothing changed, the model is told so and asked to continue.\n2. **Run the checks.** When files changed, the repository's checks run. Failing output goes back to the model with the instruction to fix the failure and leave the tests alone.\n3. **Scan for deleted tests.** Deleting a test, spec, or workflow file that existed at the starting commit ends the run as`blocked` . Co-located tests (`foo.test.ts` ,`x_test.go` ,`conftest.py` ) and check configuration (`vitest.config.ts` ,`pytest.ini` ,`Makefile` ) count too. The loop enforces this in code, not in the prompt.\n4. **Audit the requirements.** Once the checks pass, the model is asked to go back over the original task and end its reply with a`MOUSE_AUDIT` block, one line per requirement, each marked`done` with the evidence or`todo` . Any`todo` sends it round again.\n\nA run is `satisfied` when the workspace changed, no checks have failed, and the audit has no more `todo` items. It stops early when progress stalls for a configurable number of rounds or step budget runs our. You can also hit Ctrl-C. Every stop reason has its own exit code, which is documented.\n\nMouse is designed to enforce certain behaviors from the agent, which prevents an agent from cheating or hallucinating on a task or goal. The Test scan is specifically useful for long running agents that try to hide their failed tests or work. Because Mouse stays in the same session, the majority of the re-work is cached, and cheap.\n\nEach run writes a JSONL trace under `~/.mouse/runs/`, outside the repository. Nothing is written into your repository, and with the default `local` profile nothing is written under `~/.config/opencode` either.\n\n[Completion loop](https://github.com/mousedev/mouse-harness/blob/main/docs/loop.md) · [Audit protocol](https://github.com/mousedev/mouse-harness/blob/main/docs/audit-protocol.md) · [Trace format](https://github.com/mousedev/mouse-harness/blob/main/docs/trace.md)\n\nMouse detects checks from the repository's manifests. No Mouse configuration file is needed.\n\n| Repository | Checks | \n|---|---|\n| JavaScript / TypeScript | `package.json` scripts:`build` or`typecheck` ,`test` ,`lint` , run with the package manager the lockfile names | \n| Python | `pytest` , through`uv` or`poetry` when their lockfile is present | \n| Go | `go test ./...` | \n| Rust | `cargo test` | \n| Make | `make test` , when nothing else was detected | \n\nTo declare your own, run `mouse init`. It writes a `.mouse/policy.json` skeleton with every default spelled out; [docs/config.md](https://github.com/mousedev/mouse-harness/blob/main/docs/config.md) has the field reference, the flags, and the environment variables.\n\n| Command | Purpose | \n|---|---|\n| `mouse run` | Run a task, from a string or `--instruction-file` | \n| `mouse doctor` | Report the engine, the model's key, the git state, the detected checks, and the trace directory | \n| `mouse init` | Write a `.mouse/policy.json` skeleton | \n| `mouse config` | Print the OpenCode config Mouse sends ( `local` ), or write the`bench` profile's`opencode.json` | \n| `mouse --version` | `mouse/<version> opencode/<version>` | \n\n## Flags\n\n```\nmouse run [\"task\" | --instruction-file F]\n          [--model provider/model] [--workspace DIR]\n          [--profile local|bench] [--yolo]\n          [--format text|json] [--log FILE] [--session ID]\n          [--max-wall-sec N] [--max-steps N]\n          [--non-progress-rounds N] [--idle-timeout-sec N]\n          [--config-home DIR] [--opencode-bin PATH]\nmouse config [--profile local|bench] [--model M] [--out DIR]\nmouse init [--workspace DIR]\nmouse doctor [--model M] [--workspace DIR] [--strict-compat]\nmouse --version\n```\n\nDefaults come from `.mouse/policy.json` or, without one, from the built-in policy: 780 seconds of wall clock, 600 model steps, 3 non-progress rounds, a 600 second idle watchdog per turn. Flags win over the policy file. Without a terminal, `--format json` is the default and OpenCode's event stream passes through on stdout unchanged, which is what benchmark runners parse.\n\n| Code | Meaning | \n|---|---|\n| 0 | Satisfied: the workspace changed, no check failed, the audit is clean | \n| 1 | Harness error | \n| 2 | Invalid usage | \n| 3 | Budget: stalled, wall clock, or step ceiling | \n| 4 | Blocked: a test, spec, workflow, or check-configuration file was deleted | \n| 130 | Interrupted | \n\nMouse runs with the permissions of the user who starts it and has no sandbox of its own. Use a container for a repository you do not trust.\n\n| How you run Mouse | What OpenCode enforces | \n|---|---|\n| In a terminal, without `--yolo` | The build agent's permission block, including the `bash` deny patterns from`.mouse/policy.json` | \n| With `--yolo` | Nothing. Mouse passes `--dangerously-skip-permissions` to OpenCode | \n| Without a terminal on stdin (CI, cron, `< /dev/null` ) | The same as `--yolo` , with one warning on stderr.`opencode run` reads no stdin, so a prompt could never be answered. Piping only stdout (`mouse run ... \\| tee` ) keeps the prompts | \n\n| Package | Contents | Runtime dependencies | \n|---|---|---|\n| [`@mousedev/harness-core`](https://github.com/mousedev/mouse-harness/blob/main/packages/core) | The completion loop, task-state bookkeeping, the agent prompt, check detection, policy parsing, the workspace probe, the trace writer | None | \n| [`@mousedev/harness-opencode`](https://github.com/mousedev/mouse-harness/blob/main/packages/opencode) | The `opencode run` transport, the`local` and`bench` profiles, the compat manifest, the tool-output prune plugin, binary discovery | core, `@opencode-ai/sdk` | \n| [`@mousedev/harness`](https://github.com/mousedev/mouse-harness/blob/main/packages/cli) | The `mouse` command, shipped as one bundled file | core, the OpenCode adapter | \n\nThe three share a version and release together. [`examples/sdk-run`](https://github.com/mousedev/mouse-harness/blob/main/examples/sdk-run) drives the loop from your own code in forty lines; [`examples/policy-file`](https://github.com/mousedev/mouse-harness/blob/main/examples/policy-file) is a complete `.mouse/policy.json`; [` examples/harbor-run`](https://github.com/mousedev/mouse-harness/blob/main/examples/harbor-run) runs one benchmark task the way FrontierHarness does.\n\nThis repository is just for the harness. Skills live in `.agents/skills/` inside your repository. There is no plugin system or marketplace, and no telemetry, install ping, or update check.\n\nThe hosted product at [mouse.dev](https://www.mouse.dev) adds sandboxes, a relay, and a mobile app on top of this loop. That code is separate and closed source.\n\nNot in 0.1, in rough order:\n\n- Interactive permission prompts routed to the terminal, and an `--auto` mode that answers them from the policy file.\n- `mouse serve` for driving a run over a socket.\n\nChanges to the loop, the prompt, or the profiles start as an issue; see [CONTRIBUTING.md](https://github.com/mousedev/mouse-harness/blob/main/CONTRIBUTING.md).\n\nRead [CONTRIBUTING.md](https://github.com/mousedev/mouse-harness/blob/main/CONTRIBUTING.md) first. It is short, and the rules about prompt bytes and the golden snapshot are the ones that matter. Report security issues privately per [SECURITY.md](https://github.com/mousedev/mouse-harness/blob/main/SECURITY.md). Questions go to [Discussions](https://github.com/mousedev/mouse-harness/discussions) or [SUPPORT.md](https://github.com/mousedev/mouse-harness/blob/main/SUPPORT.md).\n\n[Documentation](https://github.com/mousedev/mouse-harness/blob/main/docs/index.md) · [Changelog](https://github.com/mousedev/mouse-harness/blob/main/CHANGELOG.md) · [Blog: Mouse on FrontierHarness](https://www.mouse.dev/blog/mouse-on-frontierharness)\n\nMIT. Attribution for the work Mouse builds on is in [NOTICE](https://github.com/mousedev/mouse-harness/blob/main/NOTICE). Mouse is an independent project, not affiliated with or endorsed by OpenCode or Anomaly.", "url": "https://wpnews.pro/news/mouse", "canonical_source": "https://github.com/mousedev/mouse-harness/tree/main", "published_at": "2026-09-15 02:44:26+00:00", "updated_at": "2026-09-15 03:01:39.083400+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "ai-research"], "entities": ["Mouse", "OpenCode", "Kimi K3", "FrontierHarness Eval", "Codex", "Claude Code", "DSH Creator", "Pi"], "alternates": {"html": "https://wpnews.pro/news/mouse", "markdown": "https://wpnews.pro/news/mouse.md", "text": "https://wpnews.pro/news/mouse.txt", "jsonld": "https://wpnews.pro/news/mouse.jsonld"}}