Skip to content

v0.99.25

Choose a tag to compare

@github-actions github-actions released this 05 Sep 17:02

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-monitor renders
    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 to observed_at is the runtime age. The dashboard serves
    the same frozen wire record at /host-sessions.json behind explicit
    owner-only observer grants (--host-sessions-access-file) and a
    --host-sessions-context-root selector; 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 report partial or unavailable, and no process control,
    transcript body, argv or environment is read or exposed.

  • Add synapse waker install|status|stop|resume and the hardened
    synapse-waker@.service user 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/inhibited intent. 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|verify to the
    synapse-setup.v1 contract. 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-user profile 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
    explicit apply command.

  • Make the setup authorization boundary execution-ready. Inspection records
    the active user hub MainPID; 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 apply consumer 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 --paths values 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, running is
    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 later connect() on the same
    agent dispatches its fresh welcome instead of exiting immediately, the mailbox
    cursor and owner lease carry over, and an overlapping connect() raises
    RuntimeError instead of racing the live listener.

  • Give the JS/TS client the same lifecycle contract: isReady is true only
    while the current socket is open and welcomed; a hub close, transport error,
    welcome timeout or close() leaves the client not ready, stops the heartbeat
    and detaches the socket so the same instance can connect() again; callbacks
    from a superseded socket are ignored; close() rejects a pending connect();
    a connect() 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 under interrupted with its board effect declared unknown, and state
    is null when no reading completed instead of an invented empty board. The
    exit code contract (0 for an incomplete run) is unchanged and now documented.

  • Refuse a synapse git-claim --paths value that contains a comma and names no
    existing path (for example a.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 --paths per 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