---
name: v0191-published
description: v0.19.1 PUBLISHED — counter-39 field-bug follow-up (3 field bugs + write-durability hardening)
metadata: 
  node_type: memory
  type: project
  originSessionId: d095b3e4-b4dc-4ff4-8597-17c8faaa35fc
---

v0.19.1 PUBLISHED 2026-07-02 03:22:32Z. Counter **39** (published v0.19.0=38, monotonic, rollback floor intact). Tag v0.19.1 → merge commit **fc92ac2** (PR#43 counter39-field-bugs→main; tree byte-identical to CI-validated @827697b, bump-in-PR; code gated by doyle @f4b43c2, receipt RELPR-C39-827697B-OK). **NO [twohost]** — all-local seams (resolve/roster/atomic/liveness/info-lock). Base was origin/main @aebabaa (v0.19.0's bac50fc + post-release docs merge PR#42 digest-fetcher prose, which is adapter-author facing → rightly excluded from CHANGELOG).

**Content (3 operator field bugs + 2 hardening):**
1. `spt rc <id>` no longer falsely refuses "exists in several subnets" for the SAME node advertised into multiple subnets (subnet is not a disambiguation axis; ADR-0006 §1). [REQ-INST-10]
2. NUL-corrupt info.json (hard-reset power-loss zero-fill) no longer reads ONLINE forever: perch/identity records written durably (fsync-before-rename); present-but-unparseable = NOT-alive/Suspended, distinct from absent.
3. Corrupt local perch now shows OFFLINE in `spt endpoint list` + picker Local/Project (was invisible locally while ONLINE under Subnet).
Hardening (folded into #2 durability bullet, no new user surface): unique tmp per atomic write (no cross-writer rename collision); info.json writers serialize under per-perch lock (no torn/lost bind record).

**deployah drove full flow end-to-end** (todlando delivered build + doyle GATE2, then deployah authored bump-in-PR + merged + tagged + published). Authored: Cargo.toml→0.19.1, Cargo.lock first-party only (11 crates: mock-adapter/spt/spt-daemon/spt-live/spt-msg/spt-net/spt-proto/spt-runtime/spt-store/spt-term/xtask; vte 0.13.1 + third-party untouched — NO collision this cut), CHANGELOG [0.19.1], xtask gen (reference.md = no content delta, dropped CRLF churn). Commit 827697b.

Publish: bins verified vs SHA256SUMS (linux bb6d79a1…, win 5def2dc5…) → signed both (pubkey 54188f12…) → update-set v39 → PUBLIC+Latest. Both .release.json version=39 product 0.19.1.

**FLAKE (cleared on rerun):** PR#43 first CI attempt — 1/1344 fail on Windows `spt-daemon::sync two_tier_sync_lands_and_gate_refuses_server_side` (+8 leaky). Zero code delta from doyle full-green tree + Linux passed same tree = confirmed flake. Test = 2 real net_brokers + connect_retry + over-wire PullLink + real git → net/subprocess/fs-heavy, reds under loaded-box broker-bind/connect race + leaked-daemon contention (kin [[seedmap-test-collides-live-daemon]]). `gh run rerun <id> --failed` BLOCKED while run still in_progress ("already running") → wait for run complete, then rerun. Cleared on attempt 2. [[gate-int-tests-with-nextest-not-bare-cargo-test]].

Roles unchanged: doyle final independent gate-verify → published-confirmed; todlando relays operator + kicks perri manifest (min_spt_core→0.19.1). deployah = publisher.

**GOTCHA (doyle gate-verify, publish-tail asset window):** first `update-set.json` download minutes after publish-complete returned the STALE v0.19.0 envelope (version 38, old shas) while both `.release.json` already read v39; re-download minutes later = correct v39/0.19.1. Cause: release.yml draft-upload vs xtask release-publish's update-set replace land in sequence — Latest briefly serves the old envelope (an updater fetching in that window sees counter 38 → skips the update). Deployah tracking; candidate fix = upload update-set FIRST or settle-check last. RULE for future gate-verifies: a stale-looking update-set right after publish → RE-DOWNLOAD before declaring RED. Verified-final: linux bb6d79a1…, win 5def2dc5…, key rel-primary-2026, draft=false/pre=false/Latest, monotonic 38→39. Token PUBLISHED-CONFIRMED-C39-39.
