ADR-033: Harness Shaping — One OpenCode Runner

Architecture decision: one SRE Investigator runner shaped by SME catalog playbooks (Remuda slice, first tools, scout brief) — not a fleet of per-alert agents.

Field Value
Status Accepted
Date 2026-09-20
Author Federal Frontier AI
Deciders Federal Frontier Architecture
Related ADR-005 (Agent Harness), ADR-030 (Open Harness / Agent Lab), ADR-032 (OpenCode Runner local-first), Runner Interface Spec

Context

Unknown SRE alerts currently land on a single replaceable Job engine (RUNNER_RUNTIME=opencode|claude|grok). A tempting fork is to spawn per-use-case agents (one CrashLoop agent, one PVC agent, etc.). That multiplies images, prompts, RBAC, and lab ops without improving the hot path.

What actually varies per alert class is the harness shape: which Remuda namespace/tool slice to expose, which tools to force first, how short the local scout brief is, and the quality gate before Bedrock escalate.

Name collision: FFP posse Scout (posse role / product surface) is not this runner mode. This ADR’s “LOCAL SCOUT” is an opencode-runner prompt/MCP budget (OPENCODE_LOCAL_SCOUT) shaped by alert-class playbooks.


Decision

  1. ONE opencode-runner for unknown alerts. Do not spawn per-use-case agents or new runner binaries per alert class.

  2. Harness shapes (config, not forks):
    1. Remuda namespace/tool slice - playbook selects Remuda path (e.g. /ns-9/mcp for k8s pod/crash; /public/mcp or ns-0 for unknown/wide).
    2. Alert-class playbook - forced first tools + one-line scout brief (HARNESS_PLAYBOOK, HARNESS_FIRST_TOOLS).
    3. Local scout prompt budget - keep scout <=~2500 chars (ADR-032 LOCAL SCOUT).
    4. Quality gate before Bedrock escalate - local-first; escalate only when local miss / weak root_cause; pass local transcript to Opus.
  3. Inference paths:
    • Local model = hot path (Gemma / OpenAI-compat).
    • Opus (Bedrock) = cold path with local transcript attached.
    • Do not default OPENCODE_LOCAL_ONLY / LOCAL_ONLY on in lab or prod stubs (local-first + gate, not local-forever).
  4. Playbooks grow as YAML/JSON (or Python registry today), not new Harbor images. New alert classes = new playbook entries (id, remuda_path, first_tools, scout_brief, local_force_seconds).

  5. Dispatch wiring: sre-dispatch classifies the SRE event -> Playbook, composes REMUDA_MCP_BASE + path into Job MCP ConfigMap URL (overrides static REMUDA_MCP_URL when playbook selects), and passes harness env into the opencode Job.

SME catalog

An SME is a named playbook entry (id, display_name, domain, remuda_path, first_tools, scout_brief, status) - not a separate runner binary or Harbor image. This is the productization of FFP posse roles (Scout / Sage / Wrangler / Marshal) onto Remuda tool slices.

  • Investigator = ONE opencode-runner (local scout Gemma -> quality gate -> Opus escalate).
  • Catalog = living inventory of platform specialists the Investigator routes to.
  • status: ga / lab are auto-routed by classify_playbook_id(); planned entries remain visible roadmap depth until Remuda tools and classifiers are wired.
  • Source of truth: dispatch-controller/app/playbooks.py (export via python -m app.playbooks or GET /sme-catalog).

Consequences

Positive

  • One image to build/pin (opencode-runner); alert diversity is data.
  • Remuda slice + first-tools hints make local Gemma useful on CrashLoop/OOM/PVC without prompt bloat.
  • Clear separation from FFP posse Scout naming.
  • Aligns with ADR-032 local-first + quality gate (no Bedrock LOCAL_ONLY default).

Negative

  • Classifiers must stay conservative (unknown -> generic / public Remuda).
  • Wrong Remuda path yields empty tools - ops must keep REMUDA_MCP_BASE and namespace routes in sync with Wanaku.
  • Playbook IDs become a contract between dispatch and runner docs/tests.

Non-goals

  • Per-alert-class Docker images or GitLab cloud agents.
  • Renaming FFP posse Scout.
  • Flipping production default runtime away from Claude without lab trial.

Sequencing

  1. Shipped: ADR-033 + playbooks + Job env/MCP URL wiring + scout hints.
  2. Docs / harness surfacing: publish SME catalog inventory + operator harness-shaping guides; bump sre-dispatch v1.3.6 / opencode-runner v1.4.3 (SME display_name; MCP-only scout gate).
  3. Lab: enable OPENCODE_LOCAL_SCOUT=1, RUNNER_RUNTIME=opencode, set REMUDA_MCP_BASE; fire CrashLoop vs PVC alerts; confirm playbook id in Job env and scout prompt.
  4. Follow-up: externalize playbooks to ConfigMap YAML/JSON without code change.

Eupraxia Labs Confidential · 2026-09-20