You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Added the A2A bridge validation receipts template:
the community A2A validation track is now a set of reproducible receipts that survive
the bridge boundary — discovery, task lifecycle, webhook, proxy/TLS, replay, and
threat-model — rather than a single pass/fail, separating protocol compatibility from
operational safety. Adopted from a community contribution by Armorer Labs.
Added the read-only multi-hub follower (docs): the third
CRDT slice. core/multihub_follower.py's MultiHubFollower tracks a per-peer seq
cursor, fetches a peer's events past it through an injected transport (store_fetcher
reads a peer EventStore over the read_since ingest seam — a network transport slots
in the same way), folds the accumulated union, and returns the observed view. Polling is
incremental and idempotent. Observe-only by construction: it grants no claim, and on
losing a peer it simply stops advancing that cursor — the fail-closed posture. With the
merge and fold slices this completes the read-side CRDT layer; the cross-host mTLS
transport and the namespace-ownership claim protocol remain research. 100% line+branch.
Added the multi-hub observed-state fold (docs): the second
CRDT slice. core/multihub_fold.py folds a merged multi-hub log into the mergeable
view — the board (last-writer-wins per task), the grow-only progress ledger, and the observed claim view. The claim view is the safety-critical part: it records the
latest claim each peer reports, tagged with the authoring hub and marked observed
(advisory), and never grants a claim — a release clears it, and a follower routes a
real claim request to the namespace's owning hub. Pure and deterministic; 100%
line+branch. The network follower is the remaining slice.
Added the multi-hub event-log union (docs), the first
CRDT-shaped slice of multi-hub sync: core/multihub_merge.py tags each durable
event with its authoring hub (HubEvent), merges several hubs' logs into a grow-only
set keyed by (hub_id, seq) — duplicates collapse, a conflicting reused id keeps the
first — replays them in the deterministic (ts, hub_id, seq) total order, and reports
the per-hub high-water cursor a follower resumes from. Pure and I/O-free; it folds no
state and grants no claims (claims are mutual exclusion, never merged). 100%
line+branch. The state fold and the network follower are the remaining slices.
Added the Studio design system (A0) and its reference page (docs):
the dashboard begins growing from a read-only cockpit into an operator Studio. A new
dependency-free dashboard_assets/studio.css carries the instrument-panel language —
an ink-navy base, an indigo-violet brand hue, and red/amber/green reserved for
verdicts — as CSS custom properties plus a component kit (panels, cards, status dots,
verdict pills, mono data rows, the nav rail, an indigo focus ring; motion stilled
under prefers-reduced-motion). It is served at /studio.css, and /studio renders
a self-contained reference page exercising every component with no live data, so it
works with the hub offline and is the visual reference the live command centre builds
on. 100% covered; no new dependency.
Added synapse adapters list/install/uninstall (docs),
the cross-agent adapter installer: it detects the coding tools on a machine (Claude
Code, Codex, Cursor, Aider, Copilot, Windsurf, Gemini CLI) and writes a thin
claim-aware adapter — "claim before edit, release on commit, reach the hub" — into
each tool's native config. Two write shapes follow each tool's convention: a
dedicated file Synapse owns, or a marker-wrapped block appended to a shared file;
installs are idempotent (re-install replaces, never duplicates) and uninstall
removes exactly what was added, leaving the tool's other config intact. Persona- and
framework-neutral; adds no new coordination primitive — it only routes existing
tools to the claims, releases, and presence that already exist. Pure catalogue +
planning in adapters.py, thin I/O shell in cli_adapters.py, 100% line+branch.