ADR-033: Harness Shaping — Shared Investigator Harness

Architecture decision: shared SRE Investigator harness (OpenCode Runner or Claude Code runner) shaped by SME playbooks — specialization via configuration, not per-domain binaries.

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 — and English problem briefs — land on a replaceable Job engine (RUNNER_RUNTIME=opencode|claude). First-party runners are OpenCode Runner or Claude Code runner on the shared Investigator harness.

A tempting fork is to mint per-domain binaries (one CrashLoop image, one PVC image, 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. Product surface: dispatch many purpose-built SRE agent Jobs, each task-configured for the incident class — shared harness, specialization by configuration.

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. Shared Investigator harness for problem→agent Jobs. Runners are OpenCode Runner or Claude Code runner (RUNNER_RUNTIME). Do not mint per-domain runner binaries or Harbor images per alert class. Many Jobs, shared harness shape; specialize via playbook.

  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 (or accepts an English problem brief) -> 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 Job for the selected runner.

SME catalog

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

  • Shared harness = Investigator Jobs on OpenCode Runner or Claude Code runner (local scout Gemma -> quality gate -> Opus escalate on the OpenCode path) used by many purpose-built Jobs.
  • Catalog (public) = GA specialists as auto-route accelerators for known classes on the primary path; same Job shape for unknown / English briefs.
  • Source of truth: dispatch-controller/app/playbooks.py (export via python -m app.playbooks or GET /sme-catalog).

Consequences

Positive

  • One harness shape; alert diversity is data; dual first-party runners.
  • 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.
  • Treating Claude Code as a laptop metaphor — it is a first-party runner option.

Sequencing

  1. Shipped: ADR-033 + playbooks + Job env/MCP URL wiring + scout hints.
  2. Docs / harness surfacing: publish GA SME catalog + 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, set RUNNER_RUNTIME to opencode or claude, 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