URL: https://api.github.com/repos/SaberMage/spt-releases/releases/tags/v0.19.0
Content-Type: application/json
Method: json

---

{
  "url": "https://api.github.com/repos/SaberMage/spt-releases/releases/347720823",
  "assets_url": "https://api.github.com/repos/SaberMage/spt-releases/releases/347720823/assets",
  "upload_url": "https://uploads.github.com/repos/SaberMage/spt-releases/releases/347720823/assets{?name,label}",
  "html_url": "https://github.com/SaberMage/spt-releases/releases/tag/v0.19.0",
  "id": 347720823,
  "author": {
    "login": "SaberMage",
    "id": 1035144,
    "node_id": "MDQ6VXNlcjEwMzUxNDQ=",
    "avatar_url": "https://avatars.githubusercontent.com/u/1035144?v=4",
    "gravatar_id": "",
    "url": "https://api.github.com/users/SaberMage",
    "html_url": "https://github.com/SaberMage",
    "followers_url": "https://api.github.com/users/SaberMage/followers",
    "following_url": "https://api.github.com/users/SaberMage/following{/other_user}",
    "gists_url": "https://api.github.com/users/SaberMage/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/SaberMage/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/SaberMage/subscriptions",
    "organizations_url": "https://api.github.com/users/SaberMage/orgs",
    "repos_url": "https://api.github.com/users/SaberMage/repos",
    "events_url": "https://api.github.com/users/SaberMage/events{/privacy}",
    "received_events_url": "https://api.github.com/users/SaberMage/received_events",
    "type": "User",
    "user_view_type": "public",
    "site_admin": false
  },
  "node_id": "RE_kwDOSyQ2Vs4Uucx3",
  "tag_name": "v0.19.0",
  "target_commitish": "main",
  "name": "spt v0.19.0",
  "draft": false,
  "immutable": false,
  "prerelease": false,
  "created_at": "2026-06-07T05:12:56Z",
  "updated_at": "2026-07-01T21:16:11Z",
  "published_at": "2026-07-01T21:16:11Z",
  "assets": [
    {
      "url": "https://api.github.com/repos/SaberMage/spt-releases/releases/assets/463627849",
      "id": 463627849,
      "node_id": "RA_kwDOSyQ2Vs4bomZJ",
      "name": "manifest.schema.json",
      "label": "",
      "uploader": {
        "login": "SaberMage",
        "id": 1035144,
        "node_id": "MDQ6VXNlcjEwMzUxNDQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1035144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/SaberMage",
        "html_url": "https://github.com/SaberMage",
        "followers_url": "https://api.github.com/users/SaberMage/followers",
        "following_url": "https://api.github.com/users/SaberMage/following{/other_user}",
        "gists_url": "https://api.github.com/users/SaberMage/gists{/gist_id}",
        "starred_url": "https://api.github.com/users/SaberMage/starred{/owner}{/repo}",
        "subscriptions_url": "https://api.github.com/users/SaberMage/subscriptions",
        "organizations_url": "https://api.github.com/users/SaberMage/orgs",
        "repos_url": "https://api.github.com/users/SaberMage/repos",
        "events_url": "https://api.github.com/users/SaberMage/events{/privacy}",
        "received_events_url": "https://api.github.com/users/SaberMage/received_events",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "content_type": "application/json",
      "state": "uploaded",
      "size": 40441,
      "digest": "sha256:2ebf9ea56198e08dcedd957f044c2bf247cb0580c524056b88cf7db9e49542ae",
      "download_count": 0,
      "created_at": "2026-07-01T21:14:43Z",
      "updated_at": "2026-07-01T21:14:43Z",
      "browser_download_url": "https://github.com/SaberMage/spt-releases/releases/download/v0.19.0/manifest.schema.json"
    },
    {
      "url": "https://api.github.com/repos/SaberMage/spt-releases/releases/assets/463627850",
      "id": 463627850,
      "node_id": "RA_kwDOSyQ2Vs4bomZK",
      "name": "mock-adapter.zip",
      "label": "",
      "uploader": {
        "login": "SaberMage",
        "id": 1035144,
        "node_id": "MDQ6VXNlcjEwMzUxNDQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1035144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/SaberMage",
        "html_url": "https://github.com/SaberMage",
        "followers_url": "https://api.github.com/users/SaberMage/followers",
        "following_url": "https://api.github.com/users/SaberMage/following{/other_user}",
        "gists_url": "https://api.github.com/users/SaberMage/gists{/gist_id}",
        "starred_url": "https://api.github.com/users/SaberMage/starred{/owner}{/repo}",
        "subscriptions_url": "https://api.github.com/users/SaberMage/subscriptions",
        "organizations_url": "https://api.github.com/users/SaberMage/orgs",
        "repos_url": "https://api.github.com/users/SaberMage/repos",
        "events_url": "https://api.github.com/users/SaberMage/events{/privacy}",
        "received_events_url": "https://api.github.com/users/SaberMage/received_events",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "content_type": "application/zip",
      "state": "uploaded",
      "size": 8617,
      "digest": "sha256:c43970d8d706e87e0c5443575af1d4ec2bce74bcaf9d398c0b9a639b0787283c",
      "download_count": 0,
      "created_at": "2026-07-01T21:14:43Z",
      "updated_at": "2026-07-01T21:14:43Z",
      "browser_download_url": "https://github.com/SaberMage/spt-releases/releases/download/v0.19.0/mock-adapter.zip"
    },
    {
      "url": "https://api.github.com/repos/SaberMage/spt-releases/releases/assets/463627852",
      "id": 463627852,
      "node_id": "RA_kwDOSyQ2Vs4bomZM",
      "name": "SHA256SUMS",
      "label": "",
      "uploader": {
        "login": "SaberMage",
        "id": 1035144,
        "node_id": "MDQ6VXNlcjEwMzUxNDQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1035144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/SaberMage",
        "html_url": "https://github.com/SaberMage",
        "followers_url": "https://api.github.com/users/SaberMage/followers",
        "following_url": "https://api.github.com/users/SaberMage/following{/other_user}",
        "gists_url": "https://api.github.com/users/SaberMage/gists{/gist_id}",
        "starred_url": "https://api.github.com/users/SaberMage/starred{/owner}{/repo}",
        "subscriptions_url": "https://api.github.com/users/SaberMage/subscriptions",
        "organizations_url": "https://api.github.com/users/SaberMage/orgs",
        "repos_url": "https://api.github.com/users/SaberMage/repos",
        "events_url": "https://api.github.com/users/SaberMage/events{/privacy}",
        "received_events_url": "https://api.github.com/users/SaberMage/received_events",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "content_type": "application/octet-stream",
      "state": "uploaded",
      "size": 172,
      "digest": "sha256:4541ef12e956a9d77a8ed9098892f8be60c1181085a7b4e7f2dcf31f44a8e9be",
      "download_count": 2,
      "created_at": "2026-07-01T21:14:43Z",
      "updated_at": "2026-07-01T21:14:43Z",
      "browser_download_url": "https://github.com/SaberMage/spt-releases/releases/download/v0.19.0/SHA256SUMS"
    },
    {
      "url": "https://api.github.com/repos/SaberMage/spt-releases/releases/assets/463627851",
      "id": 463627851,
      "node_id": "RA_kwDOSyQ2Vs4bomZL",
      "name": "spt-x86_64-linux",
      "label": "",
      "uploader": {
        "login": "SaberMage",
        "id": 1035144,
        "node_id": "MDQ6VXNlcjEwMzUxNDQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1035144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/SaberMage",
        "html_url": "https://github.com/SaberMage",
        "followers_url": "https://api.github.com/users/SaberMage/followers",
        "following_url": "https://api.github.com/users/SaberMage/following{/other_user}",
        "gists_url": "https://api.github.com/users/SaberMage/gists{/gist_id}",
        "starred_url": "https://api.github.com/users/SaberMage/starred{/owner}{/repo}",
        "subscriptions_url": "https://api.github.com/users/SaberMage/subscriptions",
        "organizations_url": "https://api.github.com/users/SaberMage/orgs",
        "repos_url": "https://api.github.com/users/SaberMage/repos",
        "events_url": "https://api.github.com/users/SaberMage/events{/privacy}",
        "received_events_url": "https://api.github.com/users/SaberMage/received_events",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "content_type": "application/octet-stream",
      "state": "uploaded",
      "size": 41590112,
      "digest": "sha256:7aff6be361812ce26b94be74d84836f2aaf41eb1dbef6e2af4decb46ad77b588",
      "download_count": 2,
      "created_at": "2026-07-01T21:14:43Z",
      "updated_at": "2026-07-01T21:14:47Z",
      "browser_download_url": "https://github.com/SaberMage/spt-releases/releases/download/v0.19.0/spt-x86_64-linux"
    },
    {
      "url": "https://api.github.com/repos/SaberMage/spt-releases/releases/assets/463628848",
      "id": 463628848,
      "node_id": "RA_kwDOSyQ2Vs4bomow",
      "name": "spt-x86_64-linux.release.json",
      "label": "",
      "uploader": {
        "login": "SaberMage",
        "id": 1035144,
        "node_id": "MDQ6VXNlcjEwMzUxNDQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1035144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/SaberMage",
        "html_url": "https://github.com/SaberMage",
        "followers_url": "https://api.github.com/users/SaberMage/followers",
        "following_url": "https://api.github.com/users/SaberMage/following{/other_user}",
        "gists_url": "https://api.github.com/users/SaberMage/gists{/gist_id}",
        "starred_url": "https://api.github.com/users/SaberMage/starred{/owner}{/repo}",
        "subscriptions_url": "https://api.github.com/users/SaberMage/subscriptions",
        "organizations_url": "https://api.github.com/users/SaberMage/orgs",
        "repos_url": "https://api.github.com/users/SaberMage/repos",
        "events_url": "https://api.github.com/users/SaberMage/events{/privacy}",
        "received_events_url": "https://api.github.com/users/SaberMage/received_events",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "content_type": "application/json",
      "state": "uploaded",
      "size": 449,
      "digest": "sha256:aefa51255986f8e03745aff69a462d807c30f0a796734ae2b4c096bc0049781b",
      "download_count": 3,
      "created_at": "2026-07-01T21:16:09Z",
      "updated_at": "2026-07-01T21:16:10Z",
      "browser_download_url": "https://github.com/SaberMage/spt-releases/releases/download/v0.19.0/spt-x86_64-linux.release.json"
    },
    {
      "url": "https://api.github.com/repos/SaberMage/spt-releases/releases/assets/463627853",
      "id": 463627853,
      "node_id": "RA_kwDOSyQ2Vs4bomZN",
      "name": "spt-x86_64-windows.exe",
      "label": "",
      "uploader": {
        "login": "SaberMage",
        "id": 1035144,
        "node_id": "MDQ6VXNlcjEwMzUxNDQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1035144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/SaberMage",
        "html_url": "https://github.com/SaberMage",
        "followers_url": "https://api.github.com/users/SaberMage/followers",
        "following_url": "https://api.github.com/users/SaberMage/following{/other_user}",
        "gists_url": "https://api.github.com/users/SaberMage/gists{/gist_id}",
        "starred_url": "https://api.github.com/users/SaberMage/starred{/owner}{/repo}",
        "subscriptions_url": "https://api.github.com/users/SaberMage/subscriptions",
        "organizations_url": "https://api.github.com/users/SaberMage/orgs",
        "repos_url": "https://api.github.com/users/SaberMage/repos",
        "events_url": "https://api.github.com/users/SaberMage/events{/privacy}",
        "received_events_url": "https://api.github.com/users/SaberMage/received_events",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "content_type": "application/octet-stream",
      "state": "uploaded",
      "size": 30526976,
      "digest": "sha256:3671533d4a1812b02960197a64bd03bb26afdf633cd250f8a23f8e1cd0a7bc8e",
      "download_count": 2,
      "created_at": "2026-07-01T21:14:43Z",
      "updated_at": "2026-07-01T21:14:46Z",
      "browser_download_url": "https://github.com/SaberMage/spt-releases/releases/download/v0.19.0/spt-x86_64-windows.exe"
    },
    {
      "url": "https://api.github.com/repos/SaberMage/spt-releases/releases/assets/463628845",
      "id": 463628845,
      "node_id": "RA_kwDOSyQ2Vs4bomot",
      "name": "spt-x86_64-windows.exe.release.json",
      "label": "",
      "uploader": {
        "login": "SaberMage",
        "id": 1035144,
        "node_id": "MDQ6VXNlcjEwMzUxNDQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1035144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/SaberMage",
        "html_url": "https://github.com/SaberMage",
        "followers_url": "https://api.github.com/users/SaberMage/followers",
        "following_url": "https://api.github.com/users/SaberMage/following{/other_user}",
        "gists_url": "https://api.github.com/users/SaberMage/gists{/gist_id}",
        "starred_url": "https://api.github.com/users/SaberMage/starred{/owner}{/repo}",
        "subscriptions_url": "https://api.github.com/users/SaberMage/subscriptions",
        "organizations_url": "https://api.github.com/users/SaberMage/orgs",
        "repos_url": "https://api.github.com/users/SaberMage/repos",
        "events_url": "https://api.github.com/users/SaberMage/events{/privacy}",
        "received_events_url": "https://api.github.com/users/SaberMage/received_events",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "content_type": "application/json",
      "state": "uploaded",
      "size": 449,
      "digest": "sha256:d99862a26916e9c038de5014cf3fa1c051562eb5587a4419a728323033dd1e44",
      "download_count": 2,
      "created_at": "2026-07-01T21:16:09Z",
      "updated_at": "2026-07-01T21:16:10Z",
      "browser_download_url": "https://github.com/SaberMage/spt-releases/releases/download/v0.19.0/spt-x86_64-windows.exe.release.json"
    },
    {
      "url": "https://api.github.com/repos/SaberMage/spt-releases/releases/assets/463628847",
      "id": 463628847,
      "node_id": "RA_kwDOSyQ2Vs4bomov",
      "name": "update-set.json",
      "label": "",
      "uploader": {
        "login": "SaberMage",
        "id": 1035144,
        "node_id": "MDQ6VXNlcjEwMzUxNDQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1035144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/SaberMage",
        "html_url": "https://github.com/SaberMage",
        "followers_url": "https://api.github.com/users/SaberMage/followers",
        "following_url": "https://api.github.com/users/SaberMage/following{/other_user}",
        "gists_url": "https://api.github.com/users/SaberMage/gists{/gist_id}",
        "starred_url": "https://api.github.com/users/SaberMage/starred{/owner}{/repo}",
        "subscriptions_url": "https://api.github.com/users/SaberMage/subscriptions",
        "organizations_url": "https://api.github.com/users/SaberMage/orgs",
        "repos_url": "https://api.github.com/users/SaberMage/repos",
        "events_url": "https://api.github.com/users/SaberMage/events{/privacy}",
        "received_events_url": "https://api.github.com/users/SaberMage/received_events",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "content_type": "application/json",
      "state": "uploaded",
      "size": 742,
      "digest": "sha256:949393b2f767488e3aae6d77e7c90d3133a4508ef5e3e2c93d5a9e0d568d2476",
      "download_count": 4,
      "created_at": "2026-07-01T21:16:09Z",
      "updated_at": "2026-07-01T21:16:10Z",
      "browser_download_url": "https://github.com/SaberMage/spt-releases/releases/download/v0.19.0/update-set.json"
    }
  ],
  "tarball_url": "https://api.github.com/repos/SaberMage/spt-releases/tarball/v0.19.0",
  "zipball_url": "https://api.github.com/repos/SaberMage/spt-releases/zipball/v0.19.0",
  "body": "\nA field-hardening release. Twelve bugs surfaced by running `spt` across real remote nodes are fixed: cross-node attach and messaging now work and tell the truth, remote presence and counts read correctly, attaching to a running terminal session repaints cleanly instead of corrupting scrollback, `spt rc` works on Windows 10 / raw PowerShell, and adapter update and digest handle relocated installs.\n\n### Added\n\n- **`spt rc` can now attach to an endpoint running on another node.** Previously `spt rc <endpoint>` only resolved endpoints with a live session on the local machine — a cross-node `Active` endpoint (visible in `spt endpoint list`) failed with `no live session for endpoint`. `rc` now resolves the owning node from the registry and attaches over the network, so you can drive a remote endpoint the same way you drive a local one.\n\n### Changed\n\n- **`spt endpoint list` now labels the local machine by name.** The `LOCAL (this node)` header is now `This node: <node-id>`, so a listing captured from one machine is unambiguous about which node produced it.\n- **`spt endpoint list` uses the same status codes and colored markers as the `spt endpoint run` picker.** The non-interactive listing previously printed raw, text-only status; it now renders the picker's colored square glyphs and status vocabulary, so both surfaces read identically.\n- **`spt endpoint run` groups endpoints by machine instead of by subnet.** A machine that shares two subnets with you used to appear twice (once per subnet) with duplicate endpoints; it now shows as a single group with the shared subnets listed beneath the machine name.\n- **A lone detached endpoint no longer reads as `Dormant`.** `Dormant` is the multi-instance routing state; a single detached instance now displays as online instead of borrowing that label.\n- **The top-right endpoint ID badge is off.** The one-shot corner badge scrolled off screen and left artifacts as the hosted TUI animated or resized; it is disabled pending a proper sticky overlay.\n\n### Fixed\n\n- **Attaching to a running terminal session no longer corrupts the scrollback.** Cold-attaching to a full-screen TUI (e.g. Claude Code) used to replay the raw output ring into a fresh terminal — flipping the alternate screen on and off mid-stream and spilling TUI frames into history. The broker now keeps an authoritative screen model and synthesizes a clean repaint of the current screen on a cold attach, so you get the live frame, not a corrupt transcript. (A resume from a known point still re-fetches raw output as before.)\n- **`spt rc` to an already-running endpoint no longer prints garbled escape codes on Windows 10 / raw PowerShell.** The garbling was the same raw-ring replay problem as above (not a client terminal-mode issue — `spt endpoint run --attach` rendered fine in the same terminal); the clean-repaint-on-attach fix resolves it. VT output is also enabled defensively on legacy Windows consoles.\n- **`spt rc` to a live local endpoint no longer times out with `brain IPC read deadline elapsed` after a self-update.** A single panic while the broker's effect journal was locked could poison it and brick every subsequent attach; the journal now recovers from a poisoned lock, and the loopback attach path fails fast with a real error instead of an opaque 10-second deadline.\n- **`spt send` across nodes no longer reports `SENT(WAN)` when nothing was delivered.** A cross-node send was a fire-and-forget local buffer write — a refused or no-perch delivery was silently dropped while the sender printed success. The receiver now writes the delivery outcome back and the sender waits for it, so a real failure prints an honest line; the dial also tries the last-known direct address first (mirroring the gossip path) instead of forcing a cold discovery on every send.\n- **The remote endpoint count no longer drifts as endpoints are added and purged.** A remote viewer's `--nodes` count counted non-routable ghost rows in the denominator and never evicted purged endpoints, producing wrong ratios like `0/2` or `1/3`. The count now uses a routable-only denominator, and rows left offline past a grace window are evicted from the gossiped snapshot instead of leaking forever.\n- **A locally-controlled endpoint no longer shows as \"ready to control\" on other machines.** Remote viewers only learned about a *remote* controller; a locally-driven endpoint gossiped as uncontrolled. The broker now advertises whether *anyone* (local or remote) is driving an endpoint, so remote viewers see it as controlled.\n- **`spt adapter add` no longer swallows install errors.** Errors from the install-as-first-update step were discarded; the failing step's output is now surfaced, and the composite post-install step runs at install time.\n- **`spt adapter update` no longer fails to re-register after fetching.** The update derived the install directory from the `[update]` repo name rather than the adapter's registered source directory — so after a repo rename it wrote to a fresh empty directory and then failed re-register with `os error 2`. Update now targets the registered source directory and tolerates a changed update repo.\n- **`spt endpoint digest` now works for endpoints whose transcript lives under a relocated profile.** A profile that relocates the harness transcript tree (via a runtime env like `CLAUDE_CONFIG_DIR`) produced `NO_DIGEST` because the on-demand extractor ran without that environment. The digest path now carries the profile's transcript-location environment to the extractor, which locates and reads the transcript itself.\n\n"
}