---
version: 0.30.0
date: 2026-06-20
headline: "GPU benchmarking readback works end-to-end — multi-session control bridge + a fixed result-extractor, live-validated against 8-GPU server."
themes:
  - "dgxbridge"
  - "dgx"
highlights:
  - "dgxbridge speaks the multi-session control bridge protocol: !sessions discovery, !dump <id> at channel top-level."
  - "Fixed the readback bug that failed every run: result sentinels now match whole lines, not substrings."
  - "New selftest preflight fails a broken bridge in ~90s with a typed reason instead of a 25-min timeout."
  - "Live-validated: read a real nvidia-smi (an 8-GPU datacenter server) back from the GPU server."
  - "New ground-truth probe (tools/_dgx_readback_probe.py) inspects the uploaded transcript to localize hub-vs-client faults."
---

**TL;DR** — GPU benchmarking can now actually run and return results. The GPU server is
reachable only through a multi-session Slack control bridge; this release teaches the Go
bridge that protocol and fixes the result-extraction bug that was silently breaking
every readback. Confirmed live against the real 8-GPU server box.

> Current status: the Go bridge code from this release was later moved out of the
> public tree. Live Slack/GPU-server control belongs in `fak-private`; public `fak` keeps
> scrubbed evidence and runbooks. See [`docs/dgx-slack-boundary.md`](../dgx-slack-boundary.md).

## control bridge: multi-session control bridge + working readback

- **Multi-session protocol** — the hub identifies sessions by a profile-scoped id
  (`default-1`), not the thread ts. `dgxbridge`/`dgxbench` now enumerate sessions
  (`!sessions`), auto-pick the newest running one, post `!dump <id>` at channel
  top-level, and match the hub's `<id>-transcript.jsonl` upload by suffix.
  - *Why:* the old single-session discovery couldn't address the right session, so
    `!dump` never read results back.
  - *How:* `internal/dgxbridge/sessions.go` (`ListSessions`/`PickRunning`),
    `Bridge.SessionID` in `internal/dgxbridge/rpc.go`.

- **Readback extractor fix** — the result sentinels (`<nonce>` / `<nonce>_DONE`) are
  now matched as **whole lines**, not substrings.
  - *Why:* the self-test payload `SELFTEST_<nonce>` contains the nonce, so the old
    substring scan latched onto it and returned an empty block → `echo_mismatch` on
    every session. This was a client-side bug, not a hub defect.
  - *How:* `extractBlock` in `internal/dgxbridge/rpc.go`; regression tests
    `TestExtractBlock_OutputContainsNonce` + `TestExtractBlock_DoneSubstringInOutput`.

- **Fast-fail self-test** — `dgxbench` preflights the readback path on a 2-minute
  budget (`dgxbridge selftest`), so a broken bridge fails with a typed reason in ~90s
  instead of after the 25-minute run timeout. `-skip-selftest` overrides.

- **Ground-truth probe** — `tools/_dgx_readback_probe.py` creates its own session,
  round-trips a nonce, and downloads the uploaded transcript to inspect raw bytes —
  the tool that localized this fault to the client rather than the hub.

Live-validated: `dgxbridge -session-id <id> selftest` → `readback OK`; a real
`exec "nvidia-smi"` read the full an 8-GPU datacenter server output back from the GPU server.

> Tag deferred: GitHub Actions is billing-blocked fleet-wide (jobs fail in ~1s
> before running), so this version ships unverified-by-CI per the standing local-verify
> practice. The Go change is green locally via WSL (`internal/dgxbridge`).
