Field guide · hands-on research

14 amazing things to test in oh-my-pi.

Hard-core research edition: everything below was pulled from omp's own docs and source — and where marked verified, probed directly against a live v17.2.11 install. Each recipe: what it is, the exact commands, what you should see, and the gotchas.

Share this research
561/3000

Text copied — paste it as your post; the composer attaches the link. Draft is editable — make it yours before posting.

I

Zero setup — works right now

Nothing to configure. Open a terminal and go.
01

Magic keywords — one word changes the whole turn

docs-verified

Three lowercase words typed in normal prose inject hidden, expert-level instructions for that turn. The TUI even highlights them with animated gradients as you type — the visual hint that something is wired up.

The three words
  • ultrathinkrequests careful multi-step reasoning and cranks thinking to the highest effort the current model supports
  • orchestratescope the full task, delegate substantial independent work to parallel subagents, verify each phase
  • workflowzdeterministic multi-subagent workflow through the eval kernel's agent()/parallel()/pipeline() helpers (needs eval + task tools active)
Try it
ultrathink about the failure modes before changing this API
 
orchestrate the migration described in docs/plan.md
 
workflowz an adversarial review of the authentication changes
expectThe word gets a gradient highlight in the editor. Matching is exact-spelling and standalone-prose only: orchestrate, triggers, orchestrated / orchestrate.ts / orchestrate() don't — so code and paths never accidentally change behavior.
gotchaThe hidden notice applies only to that one turn. Disable any of them: omp config set magicKeywords.ultrathink false.

docs/magic-keywords.md

02

Benchmark your models — TTFT + tokens/sec, on your accounts

verified on a live install

omp bench runs the same prompt against N models and reports time-to-first-token and generation throughput — averaged over repeated runs, optionally with a cold/warm prompt-cache test. Fuzzy selectors work, so you can race the models you actually pay for.

Try it
# race two models, 3 runs each
omp bench opus sonnet --runs 3
 
# include prompt-cache cold/warm pairs
omp bench anthropic/claude-sonnet-4-5 openai-codex/gpt-5.5 --cache
 
# machine-readable
omp bench opus gpt-5.2 --runs 3 --json
expectA per-model table: TTFT and tokens/s. Keep --runs low — every run is a real billed request.

verified via omp bench --help on a live install

03

The usage dashboard + the keys you'll actually use

verified on a live install

omp usage shows quota bars for every authenticated account across providers — plan meters with reset timers. Then learn the TUI chords; this is where omp stops feeling like a chatbot.

The chords worth memorizing
Ctrl+P / Shift+Ctrl+PCycle models for the active role
Alt+M · Alt+PModel selector / temporary model pick
Alt+Shift+PToggle plan mode (read-only first)
Alt+AOpen the Agent Hub (recipe 05)
Ctrl+T · Shift+TabToggle thinking visibility · cycle thinking level
Ctrl+OExpand/collapse tool output
Ctrl+GEdit the draft in $EDITOR
Ctrl+QQueue a follow-up message while a turn runs
hold SpacePush-to-talk voice input (release to transcribe)
Ctrl+LLive voice mode
Alt+RRetry the last failed turn
Quota check
omp usage # bars per account, per plan, with reset timers
expect/hotkeys inside a session prints every active chord for your build, including remaps. Remap in ~/.omp/agent/keybindings.yml.

docs/keybindings.md · usage verified against live accounts

04

Vibe mode — you direct, persistent workers do

docsinteractive

/vibe turns your session into a director: your own toolset drops to read-only, and you drive persistent background worker sessions through five tools. Workers come in two tiers — fast (bundled sonic agent, cheap model, drafts & mechanical work) and good (bundled task agent, judgment calls, reviews the fast output).

Director tools you get
  • vibe_spawnstart a worker with a self-contained brief (workers never see your conversation)
  • vibe_sendsteer a running turn mid-stream, or queue the next one
  • vibe_waitblock until the first watched turn settles
  • vibe_list / vibe_killroster and cleanup
Try it
# inside an omp session:
/vibe fix the flaky test in packages/tui
# ...the director spawns workers; you steer with messages...
/vibe # run again to exit — kills every worker in scope
expectA Vibe indicator in the status line. Route drafts to fast, escalate to good when judgment is needed. Worker results self-deliver; you verify by reading touched files — a settled turn is not a correct claim.
gotchaMutually exclusive with plan/goal modes (exit those first). No session forking or handoff while active. Exiting the mode kills all in-flight workers — they never outlive it.

docs/vibe-mode.md

05

Agent Hub — mission control for every subagent

docsinteractive

While subagents run, hit Alt+A and get a live roster: status, model, cost, tokens, request and tool-call counts per agent — with an inspector showing the current tool call, context usage, and lineage. You can open any subagent's live transcript and type into it: steering a running turn, prompting an idle one, reviving a parked one, or killing a stuck one with x — all without touching the parent session.

Try it
# ask omp to fan out first, then:
press Alt+A # roster — press t to toggle parent/child tree
press Enter on a row # focus that agent's transcript, type to steer
press Esc / ←← # back to the main session
expectResumed sessions rediscover their parked subagents from artifacts — historical rows with saved usage, plus read-only advisor transcript rows. Missing metrics show usage —, never estimates.

docs/agent-hub.md

06

The git trio: /review, omp commit, omp cleanse

verified on a live install

Three commands that turn the messy parts of git into agent work: a P0–P3 ranked review with a ship/don't-ship verdict, atomic multi-commit splitting with dependency ordering, and a diagnostic cleanse by weighted parallel subagents.

Try them
# 1 · code review with priorities and a verdict (inside a session)
/review # or /review <branch> / single commit / uncommitted
 
# 2 · atomic commits: reads the tree, splits unrelated changes,
# orders by dependency, rejects cycles, scores source > tests > docs
omp commit --dry-run
omp commit --push
 
# 3 · detect + fix project diagnostics with parallel subagents
omp cleanse -n 4 # 4 file-disjoint workers
omp cleanse -t # also run the project test suites
expectReview: every issue ranked P0–P3 with confidence, blocks-release-first. Commit: lock files excluded from analysis; --dry-run previews the split before anything is written. Note the 17.2.11 hardening: commit now exits non-zero when it falls back to a mechanical commit.

README §10, §16 · subcommand help verified locally

II

Five-minute setups

One config edit or one small file each. Biggest behavior-per-minute in the whole tool.
07

Time-Traveling Stream Rules — rules that abort mid-token and re-steer

schema source-verified

The signature feature. A rule sits dormant until a regex (or ast-grep pattern) matches the live output stream — then omp aborts the generation mid-token, injects the rule as a system reminder, and retries from the same point. Course-correction with zero context cost on every other turn. Injections survive compaction.

Write a rule — .omp/rules/no-any.md
---
description: ban explicit any in TypeScript
condition: "const \w+: any\b|as any"
scope: [text, tool]
interruptMode: always # never | prose-only | tool-only | always
---
Don't use explicit `any`. Use a concrete type, `unknown` with a
narrowing check, or a generic. If truly untyped, say why.
Or AST-level (edit/write streams only)
---
astCondition: "console.log($$$)"
scope: [tool:edit, tool:write]
---
No console.log in production paths; use the logger.
Test it without spending a token
omp ttsr list
omp ttsr test 'const x: any = 1'
omp ttsr test --rule .omp/rules/no-any.md --source tool --path src/foo.ts 'const x: any = 1'
omp ttsr scan # which rules would fire across the repo
expectWhen the model starts writing const x: any: red abort → amber “Injecting rule” card → regenerated output that avoids it. Scope shorthands work too: condition: "*.rs" auto-becomes tool:edit(*.rs) + tool:write(*.rs).
gotchaInvalid regexes are ignored with a warning (session still starts). Defaults: interruptMode always, repeatMode once with a 10-turn gap. Cursor MDC / Cline / Windsurf rule files on disk are inherited automatically.

docs/ttsr-injection-lifecycle.md · frontmatter schema confirmed in src/capability/rule.ts of the installed package · omp ttsr --help verified locally

08

The advisor — a second model watching every turn

docs

Pair a reviewer model to the advisor role. It reads every turn the main agent takes — reasoning, tool calls, results — on its own context and model, then injects notes with severity: nit (batched aside), concern (interrupting), blocker (interrupting even at a terminal answer). It catches what the doer rushed past.

Fastest taste (one flag, nothing persisted)
omp -p --advisor "Review this task."
Proper setup — ~/.omp/agent/config.yml
modelRoles:
advisor: anthropic/claude-sonnet-4-5:medium
advisor:
enabled: true
Then in-session
/advisor status # runtime state, model, context + token usage, cost
/advisor dump # copy its transcript to the clipboard
/advisor configure # TUI editor for WATCHDOG.yml rosters (multi-advisor)
expectAdvisory cards inline in the transcript, e.g. <advisory severity="concern">. It never approves actions or mutates state; default tools are read/grep/glob only (WATCHDOG.yml can grant more — including mutating tools — only if you trust the advisor model).
gotchaIt's a second model on its own context — real extra token spend. Notes are advice, not authority: the primary agent weighs them and may decline.

docs/advisor-watchdog.md

09

Autonomous memory — the agent curates what it learns

docs

Off by default. Enable it and a background pipeline reads your past sessions, extracts durable signal (decisions, constraints, resolved failures, workflows), and consolidates it into MEMORY.md + a compact summary injected at every session start — plus generated skill playbooks. Lessons you capture with learn land in learned.md, secret-redacted, capped, deduped.

Enable — ~/.omp/agent/config.yml
memory:
backend: local # off | local | hindsight | mnemopi
autolearn:
enabled: true # unlocks the learn tool
Inspect
# inside a session:
/memory view # what will be injected
/memory stats
/memory enqueue # force consolidation now (picked up next startup)
 
# memory is readable as URLs:
memory://root # the injected summary
memory://root/MEMORY.md # full long-term document
memory://root/learned.md # explicit lessons
expectProject-scoped by default: what it learns about this repo stays with this repo. The next session opens already knowing your conventions. Backends: local (files, this pipeline), mnemopi (local SQLite), hindsight (remote bank with recall/retain/reflect tools).
gotchaThe local backend has no recall/retain search tools. Extraction skips sessions active in the last 12h and older than 30 days — memory builds from genuinely finished work.

docs/memory.md · docs/mnemosyne-memory-backend.md

10

Internal URLs — PRs, issues, and subagent fields are just paths

verified on a live install

Sixteen :// schemes resolve inside every file-shaped tool. read pr://1428 returns the same shape as read src/foo.ts. grep walks a diff like a directory. Merge conflicts become writable URLs: write @theirs to conflict://1 and the file resolves.

Preview any of them from your shell — no session needed
omp read pr://can1357/oh-my-pi/1063 # a PR as a file
omp read issue://123 # an issue
omp read skill://tdd # a skill's instructions
omp read ssh://host/etc/hosts # remote file over ssh
omp read "agent://<id>/findings.0.path" # a field out of a subagent's output
expectomp read prints exactly what the agent's read tool would return — great for understanding what the model sees. In-session, conflict://N accepts @theirs / @ours / @base (bulk: conflict://*).

README §12, §17, §18 · omp read --help verified locally

III

Weekend projects

Half an hour of setup each, then permanently upgraded.
11

Drive a real debugger — DAP, 28 operations

docs

A C binary segfaults: the agent attaches lldb, steps to the bad pointer, reads the frame. A Go service hangs: it attaches dlv and walks the goroutines. A Python process is wedged: debugpy, pause, inspect, evaluate. The debug tool speaks DAP: launch/attach, breakpoints, stepping, threads, stack, scopes, variables, memory, disassembly. omp setup installs what's missing.

One-time, per language you want
omp setup # guided install for optional features
 
pip install debugpy # python
go install github.com/go-delve/delve/cmd/dlv@latest # go
# lldb-dap: ships with Xcode/LLVM on macOS (used in the README demo)
# js/ts: js-debug-adapter via Mason, tarball, or JS_DEBUG_DAP_SERVER
Then just ask, in a repo with a real bug
"the demo binary segfaults — attach the debugger and find where"
"this request handler hangs under load — attach dlv and walk the goroutines"
expectLive DAP cards in the TUI: adapter, stopped frame, instruction pointer, scopes and variables — the README's poster capture shows exactly this against a segfaulting xorshift32.

README §03 · docs cover adapters incl. the 17.2.11 js-debug-adapter path notes

12

Collab — hand someone the link, they're in your session

docs

/collab puts your live session on a relay and hands back a link and a QR code. A teammate joins from another terminal with omp join or just opens the link in a browser — no omp install on the guest side. Guests render your session natively: streaming text, tool cards, footer state, even Agent Hub control. Every frame is sealed with AES-256-GCM client-side; the relay sees only ciphertext.

Try it with a second terminal or your phone
/collab # full control link (read + prompt + interrupt + hub)
/collab view # read-only link — watch but never steer
/collab status # link + participants
omp join "<link>" # from any machine, any directory
/collab stop
expectA my.omp.sh deep link plus QR. Full links carry a 48-byte secret (AES-256-GCM key + write token); view links carry only the key. Possession of the link is the trust boundary — share both like secrets. The relay is content-blind, and it's a small Go service you can self-host.

docs/collab.md

13

Browser + desktop reach — real Chromium, real Slack, real macOS

docs

The browser tool drives real Chromium with stealth on by default — or, with the relay extension, it adopts the Chrome tabs you already have open without stealing focus. The same API drives any Electron app in place: point it at Slack and it reads your DMs. And computer reaches the desktop itself: windows, screenshots, native input, the accessibility tree, the clipboard.

Set up
omp setup # Chromium + optional pieces
omp browser-relay # local CDP relay for driving your own tabs
# install the "OMP Browser Relay" Chrome extension for the relay path
Then ask things like
"open hacker news and summarize the front page" # headless
"read the tab I have open on stripe.com" # relay
"screenshot the current screen and tell me what's focused" # computer
gotchaDesktop control touches your real machine — native input and clipboard. Treat it like handing someone your keyboard. On macOS, screen recording / accessibility prompts will appear the first time.

README §20, §21 · docs/computer-use.md

14

Write an extension — same primitives the built-ins use

examples on disk

An extension is a TypeScript module with the same tool API, slash-command registry, hotkey table, and TUI primitives the built-ins use — nothing is reserved. Ask omp to write the piece you're missing, then /reload-plugins. 17.2.11 added the Agent Plugins 1.0.0 standard for signed, validated packages.

Working examples already on disk
ls ~/.bun/install/global/node_modules/@oh-my-pi/pi-coding-agent/examples
# → custom-tools/ extensions/ hooks/ sdk/
 
# load one ad-hoc:
omp -e ./my-extension.ts
omp --hook ./my-hook.ts
Or embed the whole engine in your own Node app
import { createAgentSession, SessionManager, ModelRegistry,
discoverAuthStorage } from "@oh-my-pi/pi-coding-agent"
 
// ModelRegistry → createAgentSession → session.prompt("...")
// plus --mode rpc / --mode rpc-ui for non-Node embedders, and `omp acp`
// to run omp inside Zed as an editor agent
expectFirst run already inherited rules/skills/MCP from your .claude, .cursor, .codex and friends — no migration. Publish extensions locally, as a marketplace, or to npm.

README §extensibility · docs/extensions.md · docs/sdk.md · examples dir verified in a global install

Quick reference

The paths and switches you'll keep coming back to.
Path / switchWhat lives there
~/.omp/agent/config.ymlUser settings — modelRoles, memory, advisor, ttsr, magicKeywords, compaction…
~/.omp/agent/models.ymlCustom OpenAI-compatible providers
~/.omp/agent/keybindings.ymlChord remaps (namespaced action IDs)
~/.omp/agent/agents/Task agents (omp agents unpack exports the 7 bundled ones here)
<repo>/.omp/rules/*.mdProject rules incl. TTSR frontmatter; Cursor/Cline/Windsurf formats also inherited
<repo>/WATCHDOG.ymlNamed advisor roster (multi-advisor setups)
omp config listEvery setting and its current value
omp modelsFull catalog: context windows, thinking levels, image support
omp --from-claude / --from-codexImport sessions from Claude Code / Codex
/debug · /hotkeys · /settingsIn-session: profiling & bug reports · active chords · settings TUI

Research sources — all primary: can1357/oh-my-pi README · docs/magic-keywords.md, keybindings.md, vibe-mode.md, agent-hub.md, ttsr-injection-lifecycle.md, advisor-watchdog.md, collab.md, memory.md, lsp-config.md (fetched raw from GitHub main) · TTSR rule schema confirmed in src/capability/rule.ts of the installed v17.2.11 package · CHANGELOG.md 17.2.10–17.2.11 · live probes of a v17.2.11 install: omp --version / --help / usage / models / bench --help / ttsr --help / agents unpack — no secrets captured.