{
  "summary": "Public CLI confirms RC requires a broker-held spt-hosted session, but captured list/info JSON does not expose hosting authority or broker-session existence. Both endpoints look equally alive/controlled; process metadata proves doyle resumed whereas emphasys launched fresh under the same currently running daemon. No culprit is established.",
  "files": [
    {
      "path": "local://rc-cli-evidence.json",
      "description": "Main-captured successful read-only rc help, endpoint list JSON, and endpoint-info JSON for both endpoints; capture timestamp not embedded."
    },
    {
      "path": "local://rc-process-evidence.json",
      "description": "Main-captured process ancestry, executable paths, launch/resume argv, listener session IDs, and process creation timestamps."
    },
    {
      "path": "adapter/omp-spt.toml:49-56,84-98,126-129",
      "description": "Post-spawn session identity, native omp ancestor key, matching fresh/resume launch templates, SPT_ENDPOINT_ID injection."
    },
    {
      "path": "tools/omp-spt/src/launch_omp.rs:63-96,469-654",
      "description": "Native argv/env handling, Windows job coupling and parent watcher, inherited stdio, warning-only coupling failure."
    },
    {
      "path": "tools/omp-spt/tests/launch_omp.rs:608-681",
      "description": "Existing Windows lifecycle tests cover shim kill and parent death reaping a lingering descendant; inspected, not executed."
    },
    {
      "path": "tests/native-launch-manifest.sh:20-49",
      "description": "Existing manifest assertions cover matching fresh/resume commands and prohibit --mode rpc in declared spawn commands; inspected, not executed."
    },
    {
      "path": "docs/KNOWN-HAZARDS.md:201-238,367-379",
      "description": "Historical hosted-tree orphan/demotion mechanism and warning not to confuse durable rest_state with current liveness."
    },
    {
      "path": "docs-site/src/reference/harness-contract.md",
      "description": "OMP-specific ownership, create/start/resume behavior, post-start bind/listener lifecycle, and immutable session identity contract."
    }
  ],
  "architecture": "spt owns endpoint and broker hosting state; manifest launches omp-spt, which launches native OMP with the packaged extension. Fresh/resume differ by OMP -r <session-id>. The extension binds the endpoint to its native session and owns delivery listeners. Windows launch shim couples descendants to its own lifetime and watches its immediate parent; actual broker hosting authority remains outside adapter-owned state.",
  "report": "## Evidence and timestamps\n\nThe CLI/process captures were supplied by Main during this investigation; their files do not embed capture timestamps, so I do not invent one. Process CreationDate values below are exact UTC epoch milliseconds from the capture. Existing log events separately supplied in the assignment have explicit UTC timestamps.\n\n### Public command contract — observed CLI output\n\n` spt rc --help ` exited 0 and says: “Attach a local terminal to a broker-held endpoint PTY,” connecting to an “spt-hosted session.” `--view` renders output without forwarding input; `--take` kicks the current controller and drives. Neither is a diagnostic-only status request, and neither was invoked. The global `--json` text explicitly says it is honored by read/status commands and ignored by action commands; it is not a way to obtain classification safely from rc.\n\nMain captured these nonmutating commands, all status 0 and empty stderr:\n- `spt endpoint list --json`\n- `spt api endpoint-info doyle --json`\n- `spt api endpoint-info emphasys --json`\n\n### Observed endpoint comparison\n\n| Field | doyle | emphasys |\n|---|---|---|\n| list local alive / ready | true / true | true / true |\n| list local unbound | false | false |\n| subnet status | Active | Active |\n| type / adapter | live_agent / omp-spt | live_agent / omp-spt |\n| endpoint-info controlled | true | true |\n| local_node / attached_node label | HFENDULEAM / HFENDULEAM | HFENDULEAM / HFENDULEAM |\n| activity | idle | busy |\n| local address | 127.0.0.1:65289 | 127.0.0.1:60625 |\n| project | github-com-bigscreenvr-spt-bs-core | github-com-bigscreenvr-omp-spt |\n\nThe exact returned list/info objects have no explicit hosting_authority/hosted-vs-harness classification, broker PTY/session existence, session ID, launch argv, or host PID. That absence is a demonstrated limitation of these captured surfaces, not proof no other public diagnostic exists. `controlled=true` alone cannot resolve the user-reported RC contrast. Own hazard documentation agrees liveness should be read from list alive/ready/activity rather than durable rest_state (docs/KNOWN-HAZARDS.md:367-379).\n\n### Process launch evidence\n\nCurrent daemon is PID4732, created epoch-ms 1789100273340, running `spt.exe daemon run --detached`; current brain PID15856 is its child.\n\nDoyle:\n- daemon4732 → launch-omp41420 → omp36044 → bun/OMP20196 → listener40128.\n- launch helper creation epoch-ms 1789101475050; OMP20196 creation 1789101475742.\n- helper has `launch-omp --id doyle --node HFENDULEAM --resume 01a08dfc-b817-7000-9e6a-9db8db87462e --extension <installed adapter>/strings/omp-spt.mjs`.\n- OMP argv has `-r 01a08dfc-b817-7000-9e6a-9db8db87462e` and the same extension.\n- listener40128 created epoch-ms 1789101717988; argv `spt api --adapter omp-spt listen doyle --session-id 01a08dfc-b817-7000-9e6a-9db8db87462e`.\n\nEmphasys:\n- daemon4732 → launch-omp2104 → omp21528 → bun/OMP29032 → listener24168.\n- helper creation epoch-ms 1789101967013; OMP29032 creation 1789101967572.\n- helper uses the same installed launch helper and extension with `--id emphasys --node HFENDULEAM`, no resume argument.\n- OMP argv loads the same extension without `-r`.\n- listener24168 created epoch-ms 1789101969051; session ID `01a08ec9-8c74-7000-a4ef-4524d230fea1`.\n\nBoth helper and OMP executable paths match across endpoints. This is same-path evidence, not an independent binary hash comparison. Neither current OMP launch argv includes --mode rpc. The process capture supplies session IDs and launch metadata unavailable in these CLI JSON responses; these are OS process facts, not authoritative broker records.\n\n### Existing timestamped log evidence supplied by assignment\n\nFor doyle PID20196, 2026-09-11 04:37:59.193Z initial listener startup emits SID_BIND no-live-seed, BOUND, READY. At 04:41:57.722Z emit-silence (taken10/received9) triggers restart; at 04:41:58.038Z restarted listener emits SID_BIND and BOUND, with READY at 04:41:58.051Z. These timestamps align with the current listener's later creation. This establishes listener replacement occurred; it does not establish when hosting classification changed or that replacement caused it. Bind/auth tokens are deliberately omitted.\n\n## Own adapter contract and possible topology seams\n\n1. Manifest identity is post_spawn with `parent_ancestor_name = \"omp\"`; helper name is intentionally not the host match key. Fresh and resume both call launch-omp, with resume adding only the recorded session ID. Endpoint ID is injected through SPT_ENDPOINT_ID (adapter/omp-spt.toml:49-56,84-98,126-129).\n2. launch_omp::omp_argv translates resume to `-r <sid>` and always passes --extension. apply_identity_env adds OMP_SPT_NODE, OMP_SPT_PROJECT and PI_RPC_EMIT_TITLE=1; run sets resolved OMP_SPT_OMP_BIN and inherits the remaining environment and all stdio. No host-authority declaration or explicit SPT session-ID override is added by the inspected launch code (tools/omp-spt/src/launch_omp.rs:63-96,625-654).\n3. Windows uses a kill-on-close job assigned before OMP spawn and watches its immediate parent. Failures print `session-tree lifetime coupling unavailable` or `parent-death watch unavailable`, then continue launch (same file:469-620). These are concrete warning signatures to correlate if already captured; no failure in either live process is demonstrated here.\n4. Hazard §9 documents a historical, reproduced Windows orphan tree: daemon dies, relay survives and reconnects to a new daemon with no broker session, causing HOSTING_AUTHORITY_DEMOTED / ONLINE - HARNESS ONLY. The current source contains the intended fix and two existing regression cases, inspected only. Current ancestry has both trees directly below the same still-present daemon; therefore the captured evidence does NOT demonstrate that historical orphan/new-daemon sequence for doyle. It also cannot prove job membership or broker PTY retention.\n5. Resume versus fresh is the principal demonstrated launch difference. [INFERENCE] It is a useful comparison axis for the authoritative broker record, not proof resume is defective. Listener restart is another timestamped comparison axis, not proof of a bind regression.\n6. There is a documentation inconsistency: apply_identity_env's comment says core hosts OMP over RPC, whereas launch module docs, argv, manifest tests, and live command lines describe/show native interactive argv without --mode rpc. The env flag exists, but its comment cannot establish current transport topology.\n\n## Public documentation accessibility\n\n- https://sabermage.github.io/spt-releases returned HTTP404; /llms.txt and /terminal/overview.html also returned HTTP404.\n- https://localhost:5474/ failed connection.\n- http://localhost:5474/ was accessible and redirected to http://localhost:5474/hfenduleam/, an adapter served-resources index. /docs/ and its listed omp-spt adapter root returned HTTP404.\n\nConsequently the installed CLI help is the direct public RC contract obtained here; own docs at docs-site/src/reference/harness-contract.md and historical hazard records provide adapter-side context, not a substitute for unavailable current generic core documentation.\n\n## Conclusion and boundary\n\nUser-reported emphasys RC success versus doyle harness-hosted refusal is accepted, not re-tested. Demonstrated: both endpoints are alive/ready/controlled through the captured public queries; both launch beneath the same daemon using matching executable paths; doyle resumed and its listener restarted, emphasys launched fresh. Unknown: authoritative per-endpoint broker session/PTY presence, hosting authority provenance/transitions, and whether another public status command exposes them. No spt-core source was read. No files edited, tests/build/lint/format run, or rc attach/view/take, bind, restart, or state-changing actions executed."
}
