v0.99.0
Added
-
Zero-config trust-on-first-use identity (ownership keystone P-C). The
first command that connects auto-provisions one Ed25519 keypair for the
whole machine under$XDG_DATA_HOME/synapse/identity/(owner-only,
exclusive-create, race-safe); the production waiter signs its registration
with it and carries the public half in a new additiveidentity_public_key
registration field. A hub running the default loopback posture verifies the
self-contained proof with the same signed-event primitives the operator
bundle uses (freshness, replay, sender binding) and pins the name to
the key on first valid use — durably (synapse hub --identity-pins,
default~/synapse/identity-pins.json; empty string keeps pins in
memory). From then on the name binds only to a connection proving
possession of the pinned key, across reconnects and hub restarts: a
different key or a missing signature is refused with close code4013
(identity pin mismatch) and a recovery path naming the pin file. Names
that never sign keep classic first-come semantics, so no existing client
is locked out, and--require-identity-bindingstill takes precedence
with its operator-bundle semantics unchanged. The waiter yields (exit4)
on an identity refusal instead of retrying. Provisioning is best-effort: a
read-only home degrades to an unsigned connection, never a startup
failure. The4013close code is now shared between the capacity refusal
and identity refusals — clients disambiguate on the reason text
(is_identity_refused_close). -
Hub-authoritative name-ownership lease (ownership keystone P-B). A name
now has exactly one owner across reconnects, not merely per socket: a
registration that declareslease: trueon a free name is granted an opaque
owner_leasetoken in a directedlease_grantedframe (the hub keeps only
a SHA-256 digest), and while the lease is live any claim on that name must
present the token or it is refused with the new close code4016
(name owned) — thetakeoverflag does not override it. A claim that
presents the token still crosses the takeover damping, so the oscillation
quarantine holds for lease holders too. The lease survives the holder's
disconnect for--lease-offline-ttlseconds (default 3600,synapse hub
flag /SynapseHub(lease_offline_ttl=…)/TakeoverDamping), then the name
self-heals to first-come-first-owned, so a lost token file is a bounded
wait, never a bricked name. The production waiter opts in end to end:
synapse wait/armpersist the granted token per connect name under
~/synapse/owner-lease/(atomic,0600) and present it on every re-arm, so
a re-arm re-takes its own-rxidentity and a stranger cannot squat the
waiter in the gap — closing the squatting half of the 2026-07-10 identity
incident class. A refusal is a yield verdict for the waiter (exit4,
actionable message), not a retry.SynapseAgentexposes the same opt-in
(request_lease/owner_lease/on_lease_granted) for any embedder;
ephemeral one-shot verbs stay classic until the zero-config TOFU keypair
(P-C) covers every verb uniformly. Fully additive on the wire: a pre-lease
hub ignores the fields and a pre-lease client is never locked out of its
own names.
Changed
-
Ambient
$SYN_IDENTITYis never a silent identity source (ownership
keystone P-A). It is honoured only when$SYN_PROJECTis also set and
agrees with its project segment — the pair the shell hook exports together
is the opt-in. An unqualifiedsyncommand in a shell carrying a lone or
disagreeingSYN_IDENTITY(the borrowed-shell signature behind the
2026-07-10 directed-delivery incident) now proceeds as the local identity
and says so on stderr, or refuses (exit 2) when the local fallback also
looks accidental;syn namereports the dropped ambient identity on an
ambient:line. Behaviour change for shells that exported only
SYN_IDENTITY: setSYN_PROJECTalongside it (what
synapse install-shell-hookalready does) or pass--project/--id.
Pinned end to end against a live hub: the productionsyn saypath in a
poisoned shell authors as the local project, never as the borrowed name. -
The free tier now carries the ecosystem's standard donation surface: a
low-key coffee line (Buy Me a Coffee, GitHub Sponsors, PayPal) with the
canonical branded QR code underassets/bmc_qr.png, the BTC/ETH/LTC
donation addresses and the TWINT link published at anulum.li, and
buy_me_a_coffee: anulumjoins.github/FUNDING.ymlso the repository
Sponsor button offers it too. Free tier only — paid surfaces stay
donation-free. -
The footer logos render at one shared height (aspect ratios preserved)
instead of one shared width, which had drawn them visibly unequal. -
README readability: the dense prose runs — the
syncommand ergonomics,
the discovery/advisory-routing surfaces, the A2A bridge description, and
the eleven security/governance profile paragraphs — are restructured into
scannable tables, with the profile statuses corrected against the current
design docs (identity+ACL: implemented in shadow mode with opt-in
enforcement; policy engine: first tranche implemented, advisory; signed
events + mTLS: runtime primitives shipped). New section: Beyond one
machine — SYNAPSE CHANNEL Fleet, a factual description and topology map
of the commercial multi-machine tier, cross-linked from the
single-machine limitation and the licensing section.