Harness: accept opencode2 as an alias of runner
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 namespacerunner, 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 addressopencode2.(thalamus-harness, opencode2)joins(thalamus-harness, opencode)as a first-party pair; THALAMUS confirmed its routes bind asreserved:thalamus-harness. Any other module onopencode2stays 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'.
opencode2now parses asHarness::Runner, keeping therunnerstorage 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 bindingopencode2stays untrusted.