Harness: accept opencode2 as an alias of runner

Merged
AF
1d ago
+62-5

Thalamus's OpenCode 2 runner binds with harness opencode2 (live since 14:41Z), and AFT refused core's plan preflight for its first head: configure payload invalid field 'harness'.

THALAMUS confirmed what these sessions are: their AFT calls arrive over Thalamus's own scoped routes as tool-provider calls (call_key, schema pin), consent goes through core and Cingulate, and AFT's OpenCode plugin is never loaded on that server. So they are runner sessions.

  • Harness::from_str("opencode2") → Harness::Runner (storage namespace runner, consent through core, runner reply shape). Only the exact spelling is an alias. The route identity keeps the name the daemon sent, so wakes, pushes and catalog params still address opencode2.
  • (thalamus-harness, opencode2) joins (thalamus-harness, opencode) as a first-party pair; THALAMUS confirmed its routes bind as reserved:thalamus-harness. Any other module on opencode2 stays untrusted.

Tests: opencode2_parses_as_the_runner_harness, thalamus_harness_on_opencode2_is_first_party, and opencode2 (trailing space) added to the stays-untrusted list. Gate: 386 harness, subc trust, configure, subc_config, access-grant and semantic-admission tests, formatting and the Windows check.


Summary by cubic

Treats sessions Thalamus runs on an OpenCode 2 server as runner sessions so AFT's plan preflight no longer rejects them with configure payload invalid field 'harness'.

  • opencode2 now parses as Harness::Runner, keeping the runner storage namespace, consent route, and reply shape; only the exact spelling is aliased.
  • The route identity keeps the name the daemon sent, so wakes, pushes, and catalog params still address opencode2.
  • (thalamus-harness, opencode2) is now a first-party pair like the existing (thalamus-harness, opencode); any other module binding opencode2 stays untrusted.