Skip to content

The eight surfaces

A harness has eight parts an improver can edit. rematch maps each to one omp component and gives each its own activation rule: text in your personal scope activates as provisional, anything executable waits for your approval, anything beyond your machine waits for a merged PR.

Who approves what, and how team and fork changes leave your machine: the evidence boundary.

Harness² edits eight surfaces (research D3). Each maps to one omp component; activation follows SPEC §“Scope and who merges” (skill, rule and fact text automatic as provisional; subagents, system-prompt text, scripts and hooks behind a one-tap approval; team and fork only as a branch/PR the binary never merges).

Surface omp component Mechanism in rematch Activation Status
System prompt <repo>/AGENTS.md (context file); per-model prompt text in the omp fork AGENTS.fragment.md in an entry → personal: block ## rematch: <name> + the fragment appended to the system prompt of main sessions where the entry loads (omp and Pi before_agent_start, OpenCode experimental.chat.system.transform, Claude Code SessionStart additionalContext; Codex: not supported, skills only); team: section ## rematch: <name> of <repo>/AGENTS.md (ship --scope team); fork prompt files via fork_path (ship --scope fork) personal: one tap (digest kind prompt; bound to the fragment’s sha256, so an edit asks again); team / fork: PR only built; the user’s own AGENTS.md is never written; the fragment counts toward the 8 KB always-on budget and match.prompt_fragments is capped at it; disable, decline or retire removes it
Guardrails / rules laws in a triggered skill’s router SKILL.md ## Laws of a skill entry (kind: rule entries are skills); lint form order automatic as provisional, counters keep or retire built; standalone always-on rule files deferred (they would cost every session)
Memory / facts facts/*.md inside a skill (each with as_of), EXPERIENCE.md beside entries fact entries and units; stale on source drift; the reflector writes EXPERIENCE.md after keep/retire and the editor reads matching records automatic; domain facts never transfer built; omp’s own memory backend is not written
Tool guidance the fork’s tool descriptions / rules text fork_path (library set-fork-path or entry.fork_path from the editor) + fork/<basename> → ship --scope fork fork PR only built
Subagents ~/.omp/agent/agents/<name>.md (user), <extension-root>/agents/*.md kind: agent entry (AGENT.md + rematch.json); provisional, once approved: extension/agents → REMATCH_ROOT/agents/<name>.md → staging/<branch>/<name>/AGENT.md; kept: copied to ~/.omp/agent/agents/<name>.md (predecessor saved; with a profile copied to profile/agents/<name>.md and linked, §20); team: .omp/agents/<name>.md one tap for a provisional agent (digest kind agent; bound to the sha256 of AGENT.md without its rematch: block, so a body edit asks again): not linked or copied anywhere before; then visible in every session, counted where the glob hits built
Skills ~/.omp/agent/skills/<name>/SKILL.md linked into the shared dir REMATCH_ROOT/skills/ (below), which the factory adds to skills.customDirectories; kept: copied natively to ~/.omp/agent/skills/<name>/ (with a profile: to profile/skills/<name>/, linked from there, §20) and linked into the shared dir too (one skill by realpath, §0); team: .omp/skills/<name>/ automatic as provisional built
Scripts scripts/<n> inside a skill staged mode 0644; library approve (or the digest’s one tap) makes them 0755 one tap built
Hooks / plugins ~/.omp/agent/extensions/rematch-hooks/<id>.ts (data-only modules; with a profile links to profile/hooks/<id>.ts, §20), imported by the extension and run on tool_call (block, stuck) or context (truncate, retrieve) kind: hook entry (hook.json with a mode), compiled on approval; the three built-in entries (§10) are hook entries of the context modes one tap built: block verifiers, stuck detection, age-based tool-output truncation, harness-driven unit retrieval; other plugin shapes (error hints) are not generated