Skip to main content

Other harnesses

Codex, OpenCode, Oh My Pi, Crush, tuicr, and lgtm keep harness-native configuration. Shared agent instructions come from ~/AGENTS.md; Claude's workflow mods are not ported here.

Codex and OpenCodeโ€‹

ToolConfig sourceMerge
Codexhome/dot_codex/private_config.tomlrun_onchange_after_07-merge-codex-config.sh.tmpl injects MCP servers into ~/.codex/config.toml
OpenCodehome/dot_config/opencode/readonly_opencode.jsoncrun_onchange_after_07-merge-opencode-config.sh.tmpl

OpenCode loads plugins/readonly_intent-guard.ts.tmpl, the intent card adapter (Staying on the goal).

Interactive shells route codex through ~/bin/,codex, which injects the local llama.cpp model catalog when needed and then runs the real binary.

Codex settingsโ€‹

model = "gpt-6.1-sol", model_reasoning_effort = "ultra", tui.auto_recap = false, features.memories = false (,ai-kb is the only durable store). Codex discovers shared skills under ~/.agents/skills. k-review's Verify mode uses fresh native agents with the shared reviewer prompt; other modes stay inline. See Subagents.

Policy: approval_policy = "on-request", sandbox_mode = "danger-full-access".

Hooks: [[hooks.*]] entries run ,task hook codex on UserPromptSubmit, SessionStart (compact), PreToolUse (apply_patch|Write|Edit|Bash), PostToolUse, and Stop (Staying on the goal). Codex runs a config hook only after it is trusted once in /hooks; the merge keeps the trust hashes.

Codex reconciliationโ€‹

The merge rebuilds config.toml from source plus the MCP registry and keeps these runtime-owned entries from the live file:

Runtime-owned entryRule
mcp_servers.<server>.tools.<tool>.approval_modevalid values only
projects.*.trust_leveltrusted or untrusted
hooks.state.*.trusted_hashreattached
tui.model_availability_nux.*counters in 0..4294967295

Everything else in the live file is replaced. Narrow exact-command approvals can live in ~/.codex/rules/*.rules.

Provider wrappersโ€‹

WrapperBackend
,claude-openrouter, ,codex-openrouterOpenRouter; default xiaomi/mimo-v2.6-pro at high
,claude-llama-cpp, ,codex-llama-cpp, ,opencode-llama-cpplocal llama.cpp router; see launchers

The OpenRouter wrappers read OPENROUTER_API_KEY, falling back to pass show openrouter/api/token. --model <id> and --effort <level> (aliases --reasoning-effort, --thinking; --no-thinking = minimal) compose <model>@preset/effort-<level>. Before launch each wrapper ensures the effort-<level> preset exists in the active OpenRouter account (created with only reasoning.effort; an existing preset is used unchanged). --context short|long selects the working window.

  • ,claude-openrouter sets ANTHROPIC_BASE_URL=https://openrouter.ai/api (no /v1; the SDK appends /v1/messages) and maps every Claude alias to the selected wire id.
  • ,codex-openrouter adds a per-run Responses provider (wire_api="responses", env_key="OPENROUTER_API_KEY") and leaves model_reasoning_effort unset so the preset is the only effort source.

Fish completions for --model/--effort share ~/.config/fish/functions/__openrouter_catalog.fish (cache ~/.cache/,openrouter/models.tsv, from GET /api/v1/models?supported_parameters=reasoning).

Oh My Piโ€‹

SurfaceSourceTarget
Confighome/dot_omp/private_agent/readonly_config.yml.tmpl~/.omp/agent/config.yml
Modelsreadonly_models.yml~/.omp/agent/models.yml
MCP serversmcp_servers.yaml via generate_mcp_configs.py omp~/.omp/agent/mcp.json
Instructionssymlink_AGENTS.md, readonly_APPEND_SYSTEM.md (workflow overlay: inline work, scout, reviewer use, and static verification per AGENTS.md ยง3 step 4, which replaces the base prompt's verification defaults), readonly_RULES.md (sticky ยง5 git and publication rules plus ยง2 evidence and static verification with the live-check definition, for subagents that do not load AGENTS.md); readonly_config.yml.tmpl sets personality: none and tui.reactions: false, so OMP's prompt adds no tone rules of its own~/.omp/agent/
Skillssymlink_skills โ†’ ~/.agents/skills~/.omp/agent/skills
Advisorsreadonly_WATCHDOG.yml~/.omp/agent/WATCHDOG.yml
Reviewerexact_agents/k-agent-reviewer.md.tmpl~/.omp/agent/agents/
Extensionsextensions/intent-guard.ts.tmpl (intent card); extensions/advisor-followup.ts (acts on late Gate notes, below)~/.omp/agent/extensions/
Install@oh-my-pi/pi-coding-agent in home/readonly_dot_default-pnpm-pkgspnpm global, unpinned

OMP uses native /extended-context on|off|status and per-model compaction limits (/models โ†’ Roles โ†’ k). The managed default is off, so OMP uses each model's native default window: openai-codex/gpt-6.1-sol is 500,000 tokens; Astra and Luna are 272,000. Codex's own catalog advertises those same defaults. There is no provider-wide 272K default or custom GPT context override. Native extended context opens 922,000 input tokens for Sol and Astra where supported. These are local context budgets, not billing or server-capacity guarantees. The former /context-mode extension is retired: OMP's native policy could override its requested window while its status still reported success. Restart the OMP process after applying the removal; reloading the session or extension dashboard does not unload the already-imported extension. Old transcript mode entries no longer control OMP after restart. Pi retains its own working-context selection.

Key settings:

SettingValue
modelRolesdefault/slow/plan: anthropic/claude-opus-5-5:medium; task/smol/vision: anthropic/claude-sonnet-5-5:medium; tiny/commit/web: anthropic/claude-haiku-5-5:medium; advisor: openai-codex/gpt-6.1-sol:xhigh
modelProviderOrderanthropic, openai-codex, openrouter, openai
advisor.enabledtrue; the Sol advisor uses a different model family from the Opus root; advisor.syncBacklog: "1" (a string; a bare number reads as off)
task.agentAdvisor.task"off"; child advisors stay disabled
memory.backend, autolearn.enabled, recap.enabledoff, false, false
task.maxRecursionDepth1 (children cannot spawn)
task.disabledAgentsreviewer, security-reviewer (the repo k-agent-reviewer replaces them)
extendedContext, defaultThinkingLevelfalse, medium
compaction.methodOrdersnapcompact, remote, soft: local image-frame archive first (models with image input only), then provider-native compaction, then a summary
dev.autoqaConsentgranted

WATCHDOG.yml replaces OMP's default advisor, which reviewed every turn, with one advisor, Gate. The default advisor made the root wait for it every turn and could steer mid-run every turn. OMP keeps one interrupt cooldown (advisor.immuneTurns) for all advisors, so a cooldown to quiet it would also mute Gate's final concern. OMP steers the agent after the final answer only for a blocker or an agent-end concern; otherwise the user sees the notes as a card. Gate is the final-answer reviewer: reviewMode: agent-end with Gate's own syncBacklog: 1 (the global setting is the string "1") makes the root wait for its review for at most 30 seconds (strict would wait with no cap). A note that lands later, while the session is idle, becomes a follow-up turn through advisor-followup.ts; if the user already started a new prompt, OMP may steer that note into the new run. Like stop-review, it holds no rules of its own: it judges against ~/AGENTS.md (an advisor context file), sends a concern for every break the agent can fix now (the 3 most severe if more), skips preferences, judges the answer against the intent card first when the intent-guard extension added one to the prompt, and checks ยง2, ยง1, ยง3 steps 3 and 8, and ยง5 first. It sends every concern in its first review of a run, so the run goes back once with all of them; a later review of the same run sends only a break the agent's last change introduced or a concern held back for the 3-note cap. OMP steers at most one continuation turn per final review. It steers only a concern or blocker, and only while no user interrupt is in effect. A prompt or a queued message clears its interrupt flag, but the empty Enter that interrupts a run to send a queued message sets it again, as does cancelling an ask; the resumed run keeps it. In those runs, and for any nit, the final note became a passive card and the agent stopped until the user replied. advisor-followup.ts closes that gap in the main session: when an advisor note lands after a finished answer (stopReason: stop) and the agent has not answered it by the terminal agent_end, or lands while the session is idle, it steers a hidden advisor-followup message that starts a turn to weigh the notes and rewrite the final answer. When OMP continues the settle itself (willContinue, for example a session_stop or todo continuation, a retry, or background work), that turn's reply does not count as an answer; the terminal settle resolves the note: a follow-up after a finished answer, else the note is dropped. A message that starts a user turn by OMP's own rule (a prompt, a /skill: prompt, a collab peer's prompt) drops a pending note; other user-attributed messages, such as a /tan breadcrumb riding along with a continuation, do not. advisor-followup.ts also relabels OMP's spinner "Advisor reviewing the final answer" when a final answer ends, since OMP otherwise keeps showing the last tool's label during the review wait, and restores the default label once, at the next agent_end or turn_start. Gate reviews the follow-up turn like any other run, so the exchange goes on until Gate has no new note; OMP's emission guard drops a note it already sent. It leaves a run alone whose last answer was interrupted or ended in a tool call. Extensions get no interrupt signal, so an Esc pressed after a finished answer and before the follow-up starts does not stop it; an Esc that cancels a continuation OMP had scheduled leaves the note to the user. It also starts turns in plan mode, where OMP keeps advisor notes as cards; extensions cannot see plan-mode state.

Web search uses modelRoles.web (Haiku) as its primary. OMP 18.11.1 migrates the legacy providers.webSearchOrder into retry.fallbackChains.web, replacing its leading Codex selector with the explicit Haiku role. The effective fallbacks are web/startpage, web/duckduckgo, web/ecosia, web/google, web/mojeek, web/public, then web/hosted. Perplexity remains excluded.

Crushโ€‹

Crush auto-discovers project-local context files (such as AGENTS.md) from the working directory only. The home SOP is injected into every session through a global crushrc.

SurfacePathTarget
Global confighome/dot_config/crush/readonly_crushrc~/.config/crush/crushrc
Home SOPhome/readonly_AGENTS.md โ†’ ~/AGENTS.mdglobal context path

The crushrc sets option global-context-path "$HOME/AGENTS.md", so Crush loads the home instructions in every session regardless of cwd. It also runs model large openrouter/z-ai/glm-5.3-flash --reasoning-effort high, using Crush's native full model context. Project repos keep their own local AGENTS.md, which is discovered automatically; project-local instructions may add constraints but must not weaken the global SOP. Crush's runtime data JSON has higher precedence than crushrc, so deployment reconciles the saved selection separately.

tuicr (review TUI)โ€‹

tuicr is a terminal UI for code review, not an LLM harness. Its config is single-sourced and read-only.

SurfacePathTarget
Confighome/dot_config/tuicr/readonly_config.toml~/.config/tuicr/config.toml

The config defines the review comment types (issue, suggestion, question, nit, praise) that tuicr exports as [LABEL] prefixes in the markdown an agent consumes.

These are actionable categories, not severity. Severity (CRITICAL/HIGH/MEDIUM/LOW) stays in the k-review finding format and is intentionally not encoded here, so tuicr labels and the review skill's severity model do not collide.

lgtm (live diff reviewer)โ€‹

lgtm is a terminal diff reviewer that runs in a tmux pane beside the agent and sends path:line references into its input box. Its config is single-sourced and read-only.

SurfacePathTarget
Confighome/dot_config/lgtm/readonly_config.toml~/.config/lgtm/config.toml

The config sets the catppuccin theme, nerd-font icons, inline comment rendering, lockfile ignores, and the compose-box question presets; every other setting stays compiled-in default.

Per-repo .lgtm/ state (comments, reviews, read marks) and refs/lgtm/** snapshots are runtime-owned and intentionally unmanaged by chezmoi.

Secretsโ€‹

Some API keys are loaded into the shell from pass in home/dot_config/fish/readonly_config.fish.tmpl. That means your password-store is part of the runtime wiring for AI tools.

echo "${GEMINI_API_KEY:+set}"
echo "${OPENROUTER_API_KEY:+set}"

Do not commit literal secrets into tool config files; keep them in pass and load at runtime. See Security and secrets.