two¢ents

The traps

Most of these take five minutes to fix.

YOLO is the default.

omp doesn’t ask before risky actions the way Claude Code does. It runs tool calls, shell included, without asking. Set tools.approvalMode: write first (setup, step 4).

Arrays replace the global list.

A project-level enabledModels or disabledProviders becomes that project’s entire list, so allowing one model in a repo blocks the rest. The settings docs call this “the most common surprise”. Write the full array.

Typos in model ids cost money quietly.

Unknown models and broken fallback chains only show up as startup warnings. Miss them and the entry is skipped, so work often lands on the expensive default. After each config edit, restart and read the first ten lines.

Subscription logins have terms.

omp supports logging into your Claude, Copilot or Cursor plan. Whether the plan allows third-party harness traffic is up to the provider, and terms change. If the account matters, read its usage policy and keep an API-key fallback in the chain.

Too cheap on smol.

If the small model can’t finish subagent work, the frontier model redoes it and you pay twice. Step down one model at a time and check output for a day. With advisor, every turn is billed twice.

Pin a version.

Five releases shipped in the five days before I wrote this (v17.0.5 to v17.0.9). For CI or scripted omp -p jobs, pin with mise use -g github:can1357/oh-my-pi and read release notes for config changes.

Local context windows.

A local model declares its own contextWindow in models.yml. Get it wrong, or send long-context work to a 32k model, and you get strange truncated output with no clear error. Declare accurate limits and keep slow and plan on models that can hold the repo.

Disagree? Pin a note on it →