What's Changed
- fix(upgrade): strip kernel
(deleted)exe marker before it reaches units + PATH check (#274, #276) by @laulpogan in #280 - fix(upgrade): don't kill stale daemons the supervisor won't respawn (#275) by @laulpogan in #282
- fix(pairing): honor --relay in claim/add/accept-invite (#279) by @laulpogan in #283
- fix(tail): flag undecryptable enc DMs instead of dumping ciphertext (#281) by @laulpogan in #285
- fix(add): warn when not federation-reachable on a federation add (#278) by @laulpogan in #286
- fix(mcp): flag undecryptable enc DMs on agent-facing read surfaces (#281 follow-up) by @laulpogan in #287
- fix(config): make write_trust atomic + lock-serialized (part of #246) by @laulpogan in #288
- feat(pairing): surface DID+fingerprint + refuse poisoned cards on discovery (part of #247) by @laulpogan in #289
- fix(relay): validate claim relay_url + responder-health slot_id; fix false rate-limit comment (security audit) by @laulpogan in #290
- fix(send): classify peer_unknown + expose MCP wire_send queue (#284 parts 6-7) by @laulpogan in #292
- feat(mcp): wire_whoami flags stale_binary on server/daemon version drift (part of #247) by @laulpogan in #293
- fix(trust): refuse pin-overwrite by a colliding nick from a different identity (part of #245) by @laulpogan in #295
- fix(trust): atomic update_trust RMW transaction to close pin lost-updates (part of #246) by @laulpogan in #299
- feat(relay): per-nick intro rate-limit to stop the unauth pair-intro flood (part of #247) by @laulpogan in #304
- fix(tests): unblock cargo test/clippy on Windows local dev by @laulpogan in #294
- feat(relay): wire unclaim + DELETE /v1/handle/claim/:nick (part of #247) by @laulpogan in #305
- feat(relay): backstop count ceilings on slots/handles/pairs/invites (part of #291) by @laulpogan in #306
- docs(integrations): add Local LLM recipe (Ollama/llama.cpp/LM Studio/vLLM) (part of #145) by @laulpogan in #307
- feat(probe): wire ping + daemon auto-respond — RFC-004 Tier-1 (part of #142) by @laulpogan in #308
- feat(pairing): rotation-refresh — already-trusted peer re-pairs without manual accept (part of #15) by @laulpogan in #309
- fix(config): bound relay.lock acquisition + reclaim from stale owners (#284.5) by @laulpogan in #296
- fix(session): Windows adapter for identity-collision detection (#247.4) by @laulpogan in #297
- fix(platform): bound Windows shell-outs so wire status/up/doctor can't hang (#284.1) by @laulpogan in #298
- feat(status): bounded
--wait-daemon-runningfor SessionStart loops (#284.2) by @laulpogan in #300 - fix(upgrade): stream prebuilt-download with progress so it can't silent-hang (#284.3) by @laulpogan in #301
- fix(session): fail-fast (or warn loudly) when launcher dropped session key (#284.4) by @laulpogan in #302
- docs: GB10 Spark wire 0.14→0.16 upgrade field notes (#274, #275, #276) by @laulpogan in #310
- feat(identity): same-machine signed attestation — sessions on one box auto-pair (#182) by @laulpogan in #311
- feat(nostr): dual-key transport binding — secp256k1 npub cross-signed by Ed25519 identity (#227 D3.1) by @laulpogan in #312
- feat(nostr): NIP-01 event codec — wire event ⇄ Nostr event (#227 D3.2a) by @laulpogan in #313
- feat(nostr): NIP-01 relay protocol — client/relay message framing (#227 D3.2b-i) by @laulpogan in #314
- feat(nostr): NostrWs WebSocket transport — publish + pull over wss:// (#227 D3.2b-ii) by @laulpogan in #315
- feat(nostr): NIP-44 v2 encrypted DMs — Nostr confidentiality layer (#227 D3.3) by @laulpogan in #316
- test(nostr): prove NIP-44 interop against the official vectors (#227 D3.3 follow-up) by @laulpogan in #317
- feat(nostr): NIP-W1 wire pairing over Nostr — no-SPAKE2 codec (#227 D3.4) by @laulpogan in #318
- feat(cli):
wire nostr— pair + fetch over a Nostr relay (#227 D3.4) by @laulpogan in #319 - feat(cli):
wire nostr accept— complete a bilateral pair over Nostr (#227 D3.4) by @laulpogan in #320 - feat(nostr): record peer Nostr reachability on accept (#227 D3.4) by @laulpogan in #321
- feat(nostr): route
wire sendover Nostr when no HTTP slot reaches the peer (#227 D3.4) by @laulpogan in #322 - fix(rfc-006): close Part B stragglers — kill the last stale peer-flat reads (#277) by @laulpogan in #323
- ci: promote the hello-world first-connection round-trip to a CI gate (ROAD_TO_1.0 §3) by @laulpogan in #324
- docs(1.0): threat-model truth pass + ANTI_FEATURES↔SSO honesty + disarm the SSO timer by @laulpogan in #325
- feat(1.0): golden-lock the 27-tool MCP catalog + publish the deprecation policy (ROAD_TO_1.0 §6) by @laulpogan in #326
- docs(1.0): outward-truth audit — README says v0.16, not v0.15 (ROAD_TO_1.0 §7) by @laulpogan in #327
- docs: ROAD_TO_1.0 progress — items 1–6 landed, only hygiene + soak remain by @laulpogan in #328
- chore: prune internal/scratch docs from the public repo — cut 6.7k LOC by @laulpogan in #329
- docs(1.0): promote org-SSO to a supported 1.0 feature (revises #325 scoping) by @laulpogan in #330
- fix(#277): MCP accept pins a routable peer + accept flags loopback-only reply path by @laulpogan in #331
- feat(nostr): daemon pull-loop — receive over Nostr, completing RFC-007 D3 (#227) by @laulpogan in #332
- feat(nostr): persist self nostr relays — pull-loop correct when pairing is asymmetric (#227) by @laulpogan in #333
- fix: 4 security issues from code audit by @HermanShermanBot in #334
- test(relay): lock the handle_intro security filter against regression (#334 follow-up) by @laulpogan in #335
- fix(relay): bound SSE subscribers per slot + evict stale intro-rate nicks by @laulpogan in #336
- refactor: dedup wire-send body parsing + collapse hex32/hex64 to a generic by @laulpogan in #337
- fix(daemon): route daemon push through endpoints[] (fixes silent push=0) by @laulpogan in #339
- fix(supervisor): keep a daemon for unbound, idle sessions that have queued mail by @laulpogan in #340
- test(it): clear a leaked relay off the fixed port before booting by @laulpogan in #341
- fix(relay): raise concurrency ceiling + bump VM (fixes read-path saturation) by @laulpogan in #342
- fix(security): fail closed on corrupt trust.json (no silent plaintext send) by @laulpogan in #343
- fix(rotate-slot): preserve self.endpoints[] + reach endpoints[]-only peers by @laulpogan in #344
- fix(supervisor): keep a daemon for any real identity, not just queued mail by @laulpogan in #345
- fix(daemon): drain delivered outbox + back off instant-EOF stream reconnects by @laulpogan in #346
- fix(relay): stop cloning whole slots under the lock + leaking dead SSE subs by @laulpogan in #347
- perf(relay): sweep intro_times on the background tick, off the hot intro path by @laulpogan in #348
- fix(daemon-stream): reset reconnect backoff after a long-healthy stream dies dirty by @laulpogan in #349
- fix(mcp): wire_send uses a cheap pidfile liveness check, not the full scan (#350) by @laulpogan in #353
- fix(dial): bare-nick dial surfaces the same unsendable reason
wire sendemits by @laulpogan in #354 - harden + validate wire for sandboxes (Docker / OpenShell) by @laulpogan in #357
- feat(pairing): dial loopback relays by handle (E4) + close MCP poisoned-card gap by @laulpogan in #358
- chore(deps): bump anyhow + quinn-proto to clear RUSTSEC-2026-0190 / -0185 by @laulpogan in #359
- wire dash + the "open BAND" positioning (P1 + P3) by @laulpogan in #360
- fix(identity): self-heal the "two names" split + self-report (#351) by @laulpogan in #362
- release: cut v0.17.0 (observability + identity self-heal) by @laulpogan in #363
New Contributors
- @HermanShermanBot made their first contribution in #334
Full Changelog: v0.16.0...v0.17.0