2026-06-06T06:08:49.4660000Z Job is about to start running on the runner: gravity
2026-06-06T06:08:49.4630000Z Requested labels: self-hosted, Linux, gravity
2026-06-06T06:08:49.4630000Z Job defined at: SaberMage/spt-core/.github/workflows/ci.yml@refs/heads/dev-freeform
2026-06-06T06:08:49.4630000Z Waiting for a runner to pick up this job...
2026-06-06T06:08:49.4620000Z Evaluating twohost-b.if
2026-06-06T06:08:49.4620000Z Evaluating: (success() && (contains(github.event.head_commit.message, '[twohost]')))
2026-06-06T06:08:49.4620000Z Expanded: (true && contains('test(ci): M7 D5 [twohost] — product-surface join rung + quickstart e2e rewrite

The CI & acceptance deliverable (M7-PLAN.md D5):

- twohost ladder rung 1 is now the PRODUCT surface (int->REQ-SUBNET-2):
  role A drives the exact `spt subnet join` path — brain pair-join IPC →
  broker joiner leg → the unchanged SPAKE2 ceremony — against role B''s
  daemon-hosted always-on responder (role B arms NOTHING anymore: no
  dedicated pairing endpoint, no manual run_responder loop; the rung
  passing proves a stock member daemon pairs a joiner). The explicit
  responder address is a new pair-join seam (PairJoinReq.responder_addr,
  mirroring meet_at''s static-ip:port form — the rig has no relay or
  discovery for the rendezvous to resolve through); the guided CLI never
  sets it. SPT_TWO_HOST_PORT_PAIR retired — the responder rides the
  broker port.
- quickstart_e2e rewritten step for step against the M7 D4 guide:
  lea/sergey, `ready` / `ready --once`,...(trunc
2026-06-06T06:08:49.4620000Z Result: true