chore(a2a-maintain): fix keys-broker card/bundle skill conflation - #189
chore(a2a-maintain): fix keys-broker card/bundle skill conflation#189izzywdev wants to merge 1 commit into
Conversation
…role.json gate_a2a.py --all flagged fatal S2 (always fatal, never ratcheted): role.json `skills[]` still carried the four A2A card skill-ids (`keys.grant`, `keys.redeem`, `keys.mint_token`, `keys.revoke`) alongside their real home in `a2a.examples` — the exact card-skill/bundle-skill conflation governance/a2a-runtime-standard.md §4 names as this repo's live bug. The 2026-08-21 reshape moved the four operations into `a2a.examples` but left them duplicated in the bundle-skill field too. - role.json `skills[]` now names one real filesystem bundle, `.claude/skills/credential-broker-mediation/SKILL.md`, which documents the session's operating contract over the already-implemented deterministic core (backend/app/broker) — the non-disclosure/transport-identity/ human-gating invariants already documented in backend/app/broker/README.md. No broker behavior was added or changed. - This also clears S3 (anti-vacuous: an a2a.enabled repo whose serving role declares zero bundle skills), since it was the only serving role. - Verified: role.json validates against agent-templates/schema/role-manifest.schema.json (jsonschema.validate). gate_a2a.py --all before: 6 findings, 6 fatal (I0, S2 x4, S3). gate_a2a.py --all after: 1 finding, 1 fatal (I0 only — expected; see PR body). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session-Id: fe3aa738-cb24-4315-a29b-29834ddea892
fuze-code-review — automated verdictNo verdict was reached — this run is NOT an approval. fuze-code-action conclusion was 'failure', not 'success' — no review was produced, so none can be approved. See the per-rung 'fuze-code-action' notices in the job log for the specific classification (availability / task / declined) and, on an availability failure, the named provider error that triggered it. This is reported as a failed check deliberately: a review that could not run must never be silently indistinguishable from a clean one. |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #189 +/- ##
=======================================
Coverage 41.06% 41.06%
=======================================
Files 81 81
Lines 6171 6171
Branches 252 252
=======================================
Hits 2534 2534
Misses 3634 3634
Partials 3 3
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Summary
Fleet-wide A2A verification pass (a2a-maintainer) for this repo. FuzeKeys already had
its own side of the A2A surface built (
a2a.enabled: true,keys-brokerserving rolewith a real
description,providesTopopulated, rootCLAUDE.md, deterministicbroker core at
backend/app/broker) — this PR fixes the one thing that was stillwrong and adds the one thing that was missing, per
governance/a2a-runtime-standard.md(FuzeSDLC) and its enforcement,
scripts/gate_a2a.py.agent-templates/roles/keys-broker/role.jsonskills[]still carriedkeys.grant/keys.redeem/keys.mint_token/keys.revoke.Those are A2A card skill-ids (they already live correctly in
a2a.examplesand inbackend/app/broker/mcp_tools.py), not filesystem skill bundles — exactly thecard-skill/bundle-skill conflation the standard names as this repo's live bug (§4).
Removed them from
skills[].declared zero bundle skills, which the standard treats as a finding, not a pass ("an
A2A pod with no skills is a Claude SDK with no product knowledge"). Added a real
bundle,
.claude/skills/credential-broker-mediation/SKILL.md, naming that inskills[]. The skill documents the session's operating contract over thealready-implemented deterministic core (
backend/app/broker, see itsREADME.md) — non-disclosure of raw secret material, transport-identity-only authz,human-gating of high-sensitivity releases, attenuation-only-narrows. It adds no new
broker behavior; it packages the existing documented invariants for the mounted
session.
role.json'smetadata.skillsFixnote to record why this changed.Verified
Also verified
role.jsonstill validates againstagent-templates/schema/role-manifest.schema.json(jsonschema.validate, passes).I0 is expected here, not something this PR fixes
The remaining
I0finding (a2a.enabled: true, no charta2a:block) is this repo'sdocumented, intentional design, not an unbuilt pod:
docs/a2a-tenant-registration.mdand the
.fuze/manifest.jsona2a._noteboth explain that FuzeKeys is served as atenant of FuzeAgent's shared multi-tenant A2A server
(
ghcr.io/izzywdev/fuzeagent-a2a), not a per-product pod in this chart — the cardgenerator's
IN_CLUSTER_URLis a structural constant, so a local pod here would start,pass its probes, and publish the shared server's endpoint, serving nothing. Building a
chart pod to silence this finding would contradict that documented design and would be
exactly the "green because nothing checks the real thing" pattern the standard exists to
prevent. The actual precondition (the FuzeKeys tenant entry in FuzeAgent's
deploy/helm/a2a-shared/values-prod.yaml) is a cross-repo change inizzywdev/FuzeAgent,outside this repo's PR.
providesTo(18 entries) was reconciled against FuzeSDLC'sgovernance/a2a-dependency-graph.jsonrepos.FuzeKeys.providesTo— identical sets(order differs only), so no change made.
No secret value was read, printed, or written at any point — only names/keys/refs.
Test plan
python3 scripts/gate_a2a.py <clone> --allrun before and after (output above)role.jsonvalidated againstrole-manifest.schema.jsonharden-gate.yml/a2a-maintain.yml) green on this PR