Skip to content

v0.16.0

Choose a tag to compare

@github-actions github-actions released this 30 Jul 02:17

v0.16.0 — Autonomous exchanges now rest on fail-closed authority, durable retries, live MCP proof, and an exact release-candidate gate

Released 2026-07-29.

What changed

Ambiguous space authority and repository symlink writes fail closed

fix · high impact

One manifest-policy owner now rejects duplicate participant systems, duplicate active logins, missing active owners, overlapping sections, and departed participants attempting to authorize new writes. The same policy feeds manifest loading and the merge validator, so participant order can no longer choose an authorization result. Before any funnel mutation, every existing repository path component and final target is also checked with symlink-aware semantics. A committed link can no longer redirect an ordinary or infrastructure write outside the checkout. Skill discovery applies the same ownership principle: only a link resolving exactly to the configured install is managed without explicit --force.

Affects: a2a validate, a2a submit, a2a space update, a2a skill link

What to do (space): Existing valid manifests need no migration. If validation now reports REF-013, make participant systems, active GitHub owners, and top-level owned sections unambiguous before writing.

a2a validate

A semantic retry remains one operation across midnight and partial GitHub failures

fix · high impact

respond and contract deprecate now derive a private, versioned operation key from canonical command intent instead of relying on the public date-bearing artifact id for retry identity. The same intent resolves the original artifact and PR across UTC midnight, an orphaned remote branch, an open PR, or stale local pending state after merge. Changed body, actor, parents, result, successor, sunset, fields, or contract version produce a different operation; an unproven orphan is refused rather than overwritten. CLI and MCP call the same implementation. Doctor now also names historical PRs that are explicitly green, unmerged, and not armed for auto-merge, including the safe exact retry command. Contract retirement refusals list every consumer still missing its acknowledgement.

Affects: a2a respond, a2a contract deprecate, a2a doctor, a2a_contract

What to do (local): Retry the same semantic command after upgrading; it will recover the existing remote operation instead of minting a second one. Run doctor to expose older green PRs that predate this recovery path.

a2a doctor

Custom skill installs remain linked, refreshed, and visible to doctor

feat · normal impact

a2a skill install --dir now accepts only a normalized path beneath the project root and persists it as skill_dir in .a2a/config.yaml. Install, link, binary update, and both doctor skill checks resolve that one location. Existing configs keep .a2ahub/skill; repeating a2a init preserves a custom value and never moves or deletes the old tree implicitly. Doctor also treats the exact local version stamp dev as an unreleased-build advisory while continuing to fail every other malformed released version.

Affects: a2a skill install, a2a skill link, a2a update, a2a doctor, .a2a/config.yaml

What to do (local): No action is required for the default location. A custom location is now project-relative and team-visible; reinstall once with --dir to record an older untracked custom install.

a2a skill install --dir agent/skill
a2a skill link

A release verdict exercises the exact public commit that is tagged

fix · high impact

Publishing first creates a temporary public candidate ref without moving public main or creating a tag. The full live space pins both reusable workflow source and its a2a-ref input to that immutable commit SHA. Promotion then accepts only the proven SHA, restores branch protection, tags that same commit, verifies the remote tag, and deletes the candidate. A red run therefore leaves the current public release untouched. The validator emits structured authorization annotations, so the cross-section row requires the intended code and path rather than any red check. The live matrix also drives the nine missing CLI/MCP parity cells through the shipped JSON-RPC stdio server, bringing the declared release matrix from 40 to 49 cells.

Affects: release workflow, a2a validate, a2a mcp

The decomposition guide now cites one real three-document thread

fix · low impact

The shipped a2ahub skill previously illustrated announcement, question, and work request decomposition with three unrelated fixture documents and an explicit deviation. Its cited trio is now schema-valid on disk, carries three distinct single intents, and shares one thread. Agents can copy the demonstrated coordination shape without inventing links between independent examples.

Affects: a2ahub skill, schema fixtures

The shipped skill no longer warns agents away from fresh MCP reads

fix · high impact

MCP has refreshed the configured space before every tool call since the earlier read-freshness fix, but the installed skill and troubleshooting guide still described the old startup snapshot and told agents to switch to CLI. That stale instruction directly serialized autonomous loops that can safely use typed reads. The guide now matches the server: a successful pre-call refresh gives a current view; a failed refresh logs an explicit last-good-view warning that must not be treated as proof of absence. Troubleshooting also lists all fifteen current doctor checks, including the new historical stuck-green PR diagnostic and exact local dev version behavior.

Affects: a2ahub skill, a2a mcp, a2a doctor

What to do (local): Refresh the installed skill. MCP agents may keep using typed reads for decision-bearing loops; react only when the server reports a failed pre-call refresh.

a2a skill install

MCP refuses anonymous writes before mutation and live proof gates every lifecycle PR

fix · high impact

MCP write tools now resolve durable actor identity from explicit tool input, A2A_ACTOR_* environment values, then the local OS user. If no honest name exists, the tool returns actionable remedies before writing a draft, branch, or pull request. The schema engine classifies minLength failures as stable SCH-009 content violations instead of reporting internal registry drift. The live CLI and MCP lifecycle and contract-lifecycle rows also wait for the required check and merge of every created PR, including the final withdraw or retire operation; a parsed PR number can no longer hide a red candidate or leave main moving underneath the next scenario.

Affects: a2a mcp, a2a validate, live release gate

MCP contract submit carries its schema and executable fixtures

fix · high impact

a2a_new already scaffolded a starter schema plus valid and invalid fixtures for a JSON-Schema contract, but MCP a2a_submit omitted those sidecars from the first-publish commit. Real space CI therefore rejected an otherwise valid MCP-authored contract with POL-009. MCP submit now uses the same bounded, symlink-refusing sidecar collector as CLI submit and carries the descriptor, schema, both fixture classes, and publish event atomically. The CLI≡MCP equivalence suite now covers this complete contract-submit path.

Affects: a2a mcp, a2a_new, a2a_submit, contract publishing

Live verification tolerates GitHub list propagation without weakening its verdict

fix · normal impact

A newly-created pull request can be returned by GitHub's create endpoint before the same PR appears in the list endpoint. The live harness now waits within a small bounded window for that exact visibility gap instead of falsely failing a healthy write and forcing another full matrix. A dependent transition starts only after the merged commit is present on origin/main and the mirror working tree is parked on that base tip. Host idempotency lookup also recognises merged list entries through merged_at, matching GitHub's list response while retaining the older merged-boolean response shape.

Affects: live release gate, GitHub retry recovery

Destructive live-space resets no longer collide with retained semantic-operation history

fix · normal impact

GitHub correctly retains merged pull requests even when the dedicated throwaway live space force-resets main. Contract scenarios previously reused fixed standing ids, so an identical deprecation in a new reset generation could be mistaken for the prior merged semantic operation. Every live contract scenario that submits such an operation now scopes its standing slug to the post-reset PR watermark. Product idempotency remains unchanged; only disposable release-test data becomes generation-specific.

Affects: live release gate

Live required-check polling can no longer hang on one GitHub request

fix · normal impact

The live matrix already bounded how long it would poll for a required check, but its product CheckStatus path used Go's default HTTP client, whose individual requests have no timeout. A stalled GitHub round trip could therefore consume the entire matrix budget before the poll deadline was evaluated. Every live-harness GitHub client now shares a 30-second transport timeout beneath its existing fail-closed poll ceilings.

Affects: live release gate

Live merge verification tolerates delayed smart-Git visibility

fix · normal impact

GitHub can report a pull request merged through REST several minutes before the same base commit becomes visible through the authenticated smart-Git endpoint used by a2a sync. The live harness previously gave this split three minutes, producing a false failure twice at measured delays of nearly five minutes. It now polls for up to seven minutes and still passes only after the exact merge commit is present on origin/main and checked out in the mirror tree. The retry arithmetic includes both endpoints of that declared window, and a permanent CLI testscript now advances a real local origin between sync invocations to prove the remote-tracking ref and reader-visible tree both move.

Affects: live release gate

Maintainers can rerun one exact happy-path live matrix cell

feat · normal impact

A2A_LIVE_E2E_CELLS accepts an exact scenario/system/surface triple for diagnostic reruns inside the happy family. Unknown or unsupported selections refuse before the first write, while every unselected cell remains not-run, so a three-PR repair probe cannot be mistaken for the full release verdict.

Affects: live release gate, maintainer workflow

Live verification follows semantic-operation branches without scraping artifact IDs

fix · normal impact

D6 moved respond and contract deprecate from composite artifact-ID branches to opaque keys derived from canonical command intent. The live harness still searched those branches for generated artifact IDs, so a correct checked and merged deprecation PR could be reported missing and later response scenarios would fail the same way. Every affected scenario now derives the exact operation branch through the product's core helper and recovers generated response or announcement IDs only from the funnel-owned PR metadata used by retry recovery. A structural regression rejects any future composite lookup for these verbs.

Affects: live release gate

MCP contract submit validates the descriptor without misreading its baseline

fix · high impact

MCP first-publish now carries a contract descriptor, schema, valid fixtures, invalid fixtures, and publish event through one atomic write without treating the JSON sidecars as envelope frontmatter. The CLI, MCP, and merge validator consume one layout-owned reverse classifier for the contract descriptor and baseline path family, preventing the two submit adapters from drifting on which files are artifacts. Schema and fixture policy remains owned by the existing contract publishability and compatibility checks; this correction only routes each file to its canonical validator.

Affects: a2a mcp, a2a_submit, contract publishing

Live contract-integrity verification follows run-scoped contract paths

fix · normal impact

Contract-integrity scenarios now derive staged schemas, fixtures, and landed-schema reads from the actual contract ID returned by authoring. Previously they created a run-scoped contract but later edited the unscoped base slug, so two healthy contract workflows were reported as missing local schema files. A path regression and structural wiring check keep both scenario families on the same destructive-space generation.

Affects: live release gate

Known issues

The macOS companion remains ad-hoc signed and may require manual approval

known issue · normal impact

The release cohort authenticates the exact macOS app and ad-hoc signing protects its bundle integrity, but the app is not identified or notarized through a paid Apple Developer account. A quarantined download may require one explicit System Settings → Privacy & Security → Open Anyway decision. Interactive Notification Center, Focus, Login Items, VS Code trust/profile, and remote-window checks remain release-environment evidence rather than claims inferred from hermetic tests.

Affects: macOS notifications, VS Code notifications

Current guidance: Keep Gatekeeper enabled and approve only the A2A Notifier version obtained through the verified a2a release cohort.

Release verification

Full GitHub release gate: 50 of 50 declared live cells passed against the exact immutable public candidate (commit 5336d871ac7fa9ff25cf63425eb78545004152b9). The catalogue covers CLI and MCP writes, lifecycle and contract transitions, authorization boundaries, failure recovery, and space health; it does not claim every theoretically possible state.

Install or update

macOS and Linux:

curl -fsSL https://raw.githubusercontent.com/ydnikolaev/a2ahub/main/scripts/install.sh | sh

Already installed? Run a2a update --yes. Windows archives and manual downloads are in the assets below.

Release artifacts include checksums, per-asset Sigstore bundles, SBOMs, and SLSA provenance. See SECURITY.md for verification commands.