Advertise delegated A2A write capabilities - #2831
Conversation
|
Here's a visual recap of what changed: Open the full interactive recap |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Builder reviewed your changes and has a few items to flag 🟡
Review Details
Incremental Code Review Summary
The latest revision fixes the previously reported explicit-endpoint audience issue. canonicalA2AAudience now strips both /_agent-native/a2a and /a2a, and the added capability-cache test verifies that a full endpoint URL produces the receiver’s base-path audience. I resolved that stale review thread.
Two independent review passes found no new confirmed bugs in the current changes. They verified the endpoint and base-path canonicalization, authenticated card behavior, token issuance/verification consistency, and focused A2A test coverage. The existing delegated-write external-agent policy finding remains open and was not reposted.
Risk remains standard because this is shared A2A authentication and capability-discovery behavior.
✅ No new actionable findings in this incremental review.
🧪 Browser testing: Skipped — PR only modifies backend/framework logic, tests, types, docs, and a changeset; no user-facing UI impact.

Problem
Workspace agents discover what sibling apps can do from authenticated Agent-to-Agent (A2A) cards. Today those cards describe only the small set of read-only Actions that a caller may invoke directly. An app can already define an authenticated write Action and opt it into
publicAgent, but that capability disappears from discovery entirely.As a result, a coordinating agent cannot deterministically learn that the owning app can create or update a resource. It either guesses from prose, accumulates app-specific routing knowledge, or reaches for a granular direct-action design. That undercuts the framework's intended model: define an Action once, then delegate work to the agent that owns the app and its data.
Approach
Project one Action definition into two distinct authenticated A2A capability shapes:
The caller learns that the receiving app can perform the work, but must send a natural-language objective. The receiving agent keeps ownership of interpretation, local tool choice, validation, authorization, and approval. Anonymous discovery remains unchanged. Direct reads appear only for audience-bound JWTs that satisfy the same boundary enforced by
actions/invoke; verified legacy JWTs without an audience can discover message-delegated capabilities but not direct-read schemas.What changed
publicAgent: { expose: true, readOnly: false, requiresAuth: true }.agentTool: falseandexternalAgents.denyActionsas authenticated-surface vetoes.Safety and operations
This does not add a direct write execution path.
actions/invokestill re-filters through the existing read-only gate, and tests prove the advertised mutation is absent from both direct invocation and the anonymous card. Consequential or approval-gated work remains owned by the receiving agent's normal Action path.The discovery renderer keeps its existing summary/detail/description caps, and write capabilities carry no input schemas, avoiding a mutation-schema flood in agent context. An authenticated token without an audience no longer receives a direct-read contract it cannot invoke. There are no schema migrations, data writes, credential changes, permission changes, or backfills. Rollback is a code revert.
Verification
pnpm --filter @agent-native/core typecheckpasses on commitbab695266.pnpm guard:workspace-skillspasses, proving generated guidance remains synchronized.pnpm test:content-product-impactpasses all 30 declaration and workflow-policy tests.pnpm guard:no-silent-coercionpasses on the exact head. The full guard matrix still has one unrelatedguard:i18n-catalogsfailure ontemplates/slides/app/components/editor/SlideEditor.tsx:5012, unchanged fromorigin/mainand absent from this PR's diff.Review focus
publicAgentthe right single opt-in for message-only write discovery, without requiring a second connector registry?agentTool: false, the deny list, authenticated cards, and anonymous cards applied at the correct disclosure boundaries?Follow-up
A separately scoped second PR will annotate Content's existing database discovery/intake Actions, expose user-authored database descriptions, and prove the deployed delegated intake workflow end to end. This framework PR intentionally does not claim that Content workflow yet.