v0.99.25
Added
-
Add a repeatable JavaScript SDK integration check against an isolated,
authenticated Python hub, covering delivery, claim conflicts, release,
snapshots, and reconnect. -
Add an opt-in, separately granted Fleet mirror feed and read-only Studio
panel, with versioned bounded file inputs and no Fleet package dependency. -
Add the read-only host-session monitor:
synapse pid-monitorrenders
same-user process identity (PID, parent, kernel start ticks, state, comm),
tmux session and pane joins through revalidated ancestry, per-field
opt-in working-directory and open-context-pathname evidence, coordination
presence, waiter and claim facts, and a kernel-derived process start time
(started_at, boot time plus start ticks, about one-second resolution)
whose distance toobserved_atis the runtime age. The dashboard serves
the same frozen wire record at/host-sessions.jsonbehind explicit
owner-only observer grants (--host-sessions-access-file) and a
--host-sessions-context-rootselector; the cockpit adds a Host sessions
view in five languages showing observation age and runtime separately. Every
missing value carries an evidence status instead of being coerced to false,
bounded scans reportpartialorunavailable, and no process control,
transcript body, argv or environment is read or exposed. -
Add
synapse waker install|status|stop|resumeand the hardened
synapse-waker@.serviceuser unit for unattended exact-seat prompt delivery.
Systemd recreates a dead bridge and watchdogs the advancing delivery loop;
an owner-only generation-guarded configuration persists explicit
armed/inhibitedintent. Stopping a waker records the inhibit before it
stops only that bridge, so automatic restart cannot undo an agent-requested
malfunction stop and the provider terminal remains untouched. Persistent
credentials are accepted only by owner-only token-file path, never embedded
as token values. -
Add
synapse setup verification-plan|authorize-verification|verifyto the
synapse-setup.v1contract. The separate, single-use transaction binds the
original application lineage and a fresh inspection, sends one directed
canary, requires the exact waiter's durable ACK, restarts only the authorized
local hub PID, proves replay through a different PID, re-inspects the bound
executable generation, preserves declared processes, and emits a redacted
digest-bound verification receipt. Owner-only replay state stores a
domain-separated nonce digest. Failed verification records stable evidence
without claiming rollback or recovery. -
Add the versioned
synapse setup spec|inspect|plan|authorize|apply
machine-readable contract for agent-assisted host setup. The initial
local-single-userprofile reports
installed package, Python, platform, executable, identity, hub, waiter, and
optional service-manager evidence without writing files, installing services,
restarting terminals, or accepting secrets on the command line. Its strict
JSON Schema ships inside the wheel. Planning binds one exact inspection and
profile specification, including its credential-free target, to canonical
SHA-256 digests and allow-listed proposed effects. Authorization then emits a
30–900 second envelope bound to the exact plan digest, target, unique replay
nonce, and any exact restart PID authority. Specification, inspection, plan,
and authorization documents remain inert; mutation requires the separate
explicitapplycommand. -
Make the setup authorization boundary execution-ready. Inspection records
the active user hubMainPID; planning uses
ordinary confirmation for a first start and binds restart authority to that
exact PID. Environment and identity changes without safe installed-package
adapters are blocked. Add an owner-only SQLite lifecycle ledger that
atomically reserves a domain-separated nonce digest, rejects cross-process
replay, and retains separate effect and recovery receipt digests for each
apply/recover transaction. -
Add the fail-closed
synapse setup applyconsumer for the initial Linux
systemd-user profile. Plans bind the package, Python, Synapse executable,
platform, and service-manager generation. The executor freshly re-inspects
that generation and target, serializes host mutation, protects declared
PIDs, reserves each nonce exactly once, uses only fixed-argv package-owned hub
and waiter effects, verifies active service PIDs, emits owner-only
digest-bound receipts, and restores prior unit bytes, modes, and service state
after partial failure. Managed directory traversal rejects symlink leaves and
unsafe child permissions; restoration preserves arbitrary prior unit bytes.
Package, environment, and identity changes plus non-Linux service adapters
remain blocked.
Fixed
-
Exclude the separate GitHub App test tree from Python source distributions,
preserving the release wheel/sdist parity contract. -
Register setup, verification, Fleet mirror and waker exceptions in the
common error taxonomy while preserving their historical exception bases
and concrete setup refusal reasons. Classify errors by their frozen class
code independently of instance-specific reasons. -
Make cockpit and concurrent CLI test processes use the selected Python
interpreter; bound subprocess waits and clean up unfinished children. -
Align setup execution tests with the Linux/systemd-user contract and verify
that native unsupported-host refusal leaves no ledger or receipt. -
Exercise process metadata under descriptor churn, command changes, process
reaping and invalid kernel-input mounts without reporting partial context
as a stable identity. -
Check the generated JSON capability inventory alongside README, rejecting
missing, unreadable or stale machine-readable metadata without rewriting it. -
Reject process discovery time budgets outside the floating-point range with
the documented validation error, before inspecting processes. -
Ignore directories and named pipes with rollout-like names when identifying
host-session context; only open regular files provide context evidence. -
Align Studio snapshot request deadlines with server collection budgets,
bound identity-queue waits and label failed refreshes stale rather than offline. -
Send the session bearer with Studio snapshots, bound requests using the
server-derived collection budget, prevent duplicate polling loops and label
retained data non-current. -
Bound Studio access-descriptor requests and ignore superseded completions,
preserving newer role downgrades and recovering polling after timeouts. -
Prevent superseded Fleet mirror responses or errors from replacing a newer
export or locked state; cancel the previous request on refresh. -
Preserve Fleet mirror task disclosures and keyboard focus across changed
exports and pagination; use the panel status when a focused row disappears. -
Keep reachable Studio peers with unknown log lag amber instead of green,
with separate unknown-lag counts and an explicit explanation. -
Reject comma-joined
lock --pathsvalues that name no existing path before
acquiring a lease or running the wrapped command; repeat the flag per path. -
Make one
SynapseAgent.connect()call one connection attempt that owns its
state: readiness is cleared when the attempt starts and ends,runningis
re-armed, the previous close diagnostics are reset, and the attempt's
heartbeat task is cancelled and awaited before the call returns. A
disconnected agent no longer reports ready, a laterconnect()on the same
agent dispatches its fresh welcome instead of exiting immediately, the mailbox
cursor and owner lease carry over, and an overlappingconnect()raises
RuntimeErrorinstead of racing the live listener. -
Give the JS/TS client the same lifecycle contract:
isReadyis true only
while the current socket is open and welcomed; a hub close, transport error,
welcome timeout orclose()leaves the client not ready, stops the heartbeat
and detaches the socket so the same instance canconnect()again; callbacks
from a superseded socket are ignored;close()rejects a pendingconnect();
aconnect()while a socket is open or pending rejects. -
Make the workflow driver's deadline one budget over the whole run: it is checked
before task declaration, every board reading, every assignment or retirement and
every sleep; each hub await is bounded by the remaining budget; the sleep is
shortened to it. An already-expired deadline posts and writes nothing, expiry
during a reading produces no further writes, an operation cut off in flight is
listed underinterruptedwith its board effect declared unknown, andstate
isnullwhen no reading completed instead of an invented empty board. The
exit code contract (0for an incomplete run) is unchanged and now documented. -
Refuse a
synapse git-claim --pathsvalue that contains a comma and names no
existing path (for examplea.py,b.py): it was registered as one literal path
that no staged file could match, so the claim covered nothing while appearing to
cover several files and the staged-claim gate could never be satisfied by it. The
command now exits 2 with guidance to repeat--pathsper path; a real path that
contains a comma is still accepted when it exists.
Artifact checksums (SHA-256)
7151fbe7828bc120762b75477159ba2575625e07100d8b91c4bf6f0aa66f29f1 synapse_channel-0.99.25-py3-none-any.whl
3d33e7eada36e8762682508ba1e244636df5b13b8030a99fce61f2ed3aa9f7de synapse_channel-0.99.25.tar.gz
39f745d74b92a5852dea25a2a2b6f2011c957be95d99cfe05b0e64d7af76f1c5 synapse-channel-v0.99.25-sbom.cdx.json