feat(a2a-contract): freeze runtime tenant-registration contract (v1.3.0) - #204
feat(a2a-contract): freeze runtime tenant-registration contract (v1.3.0)#204claude[bot] wants to merge 3 commits into
Conversation
Additive MINOR bump within the frozen A2A contract v1 for the runtime tenant-registration topology (#203): consumers self-register into a DB registry owned by the orchestrator and push their projected Agent Card as data; the stateless A2A server resolves the tenant set over HTTP instead of from the static a2a.tenants[] values ConfigMap. Frozen surface (interface only — no server, migration or handlers): - schema/tenant-registration.schema.json: RegisteredTenant (the a2a_tenants record), RegisterTenantRequest/Response, TenantList. The `card` field reuses agent-card.schema.json by reference (byte-identical projected card, not redefined); a pushed card must additionally satisfy fuze-profile.schema.json. - tenant-registration.md: NORMATIVE spec for POST /a2a/tenants/register and GET /a2a/tenants[/{tenant}] — idempotent upsert keyed on `tenant`, the OIDC caller-repo self-registration rule (tenant/repo != authenticated identity => 403, never written), and the two-schema card-validation rule. - Generated client: registration_models.py + fuze_a2a_client exports; package and VERSION bumped to 1.3.0; CHANGELOG + README updated. Purely additive: values-interface.schema.json and the static a2a.tenants[] topology are unchanged; wire_models/card_models are byte-identical after regen; the two topologies serve byte-identical cards. Conformance suite green (68 passed). GET /a2a/tenants is x-pagination: exempt (bounded whole-set config read). RegisterTenantRequest is x-client-assigned-id: allowed (`tenant` is the natural key). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SVW8cHupvBPDfiuB9jdXsF
|
I'm not porting a fix here: bumping Every other check is green; this contract slice is otherwise ready for human review. Generated by Claude Code |
…ackage The orchestrator connects to the FuzeInfra-provisioned ChromaDB via chromadb.HttpClient (services/orchestrator/rag_integration.py) — it never embeds a ChromaDB server. Pinning the full `chromadb` package dragged in the vulnerable server surface (CVE-2026-45830/45831/45833 in 1.1.1), failing dependency-check and backend-security-scan. The thin `chromadb-client` package provides chromadb.HttpClient + chromadb.config.Settings (API-identical for our usage) and pip-audit reports no known vulnerabilities. Server provisioning stays FuzeInfra's; the product repo carries the client only. Co-authored-by: Israel Weinberg <99821070+izzywdev@users.noreply.github.com>
|
Update — fixed properly (not suppressed). Pushed The orchestrator only ever connects via Generated by Claude Code |
The chromadb-client swap could not clear the CVE: crewai (used by agent_manager.py and claude_code_wrapper.py) declares chromadb~=1.1.0 as a core dependency, so the full chromadb 1.1.1 is installed transitively no matter what the orchestrator's own line says — and shipping chromadb-client alongside it would clash on the chromadb module namespace. Every chromadb release (1.1.1 through 1.5.9) is flagged for CVE-2026-45830/45831/45833 with no fixed version, so there is no dependency-level fix. Restoring the original line; the chromadb/crewai remediation is a separate security decision, pre-existing and independent of this contract PR. Co-authored-by: Israel Weinberg <99821070+izzywdev@users.noreply.github.com>
|
Correction — the
So there is no dependency-level fix for this check. It is pre-existing (fails on Two real remediation paths, both a separate security decision (not this contract PR's to make):
Generated by Claude Code |
Frozen A2A contract v1.3.0 — runtime tenant registration (Slice 4 gate)
Additive MINOR bump within the frozen A2A contract v1 for the runtime-registration topology decided in #203. This is the first slice and it GATES all implementation (Slice 1 migration, orchestrator handlers, Slice 3 server reader, tests, docs). Contract + generated client only — no server, migration, or handlers.
What changes (the move, from #203)
The shared A2A server stops learning its tenants at git/build time from the static
a2a.tenants[]values ConfigMap (+ initContainer repo clone). Instead:auth.callerClaimthe A2A server validates today); a registration whosetenant/repo≠ the authenticated identity is rejected403and never written.Frozen surface
schema/tenant-registration.schema.jsonRegisteredTenant— the canonicala2a_tenantsrecord (tenantunique key,repo,ref,entryRole,servingRoles[],external,provider,card,enabled,createdAt,updatedAt), frozen once so the DB migration and the server reader target one shape.RegisterTenantRequest/RegisterTenantResponse— self-registration payload + upsert result.TenantList—GET /a2a/tenantsresponse, markedx-pagination: exempt(bounded whole-set config read the A2A server resolves atomically).cardreusesagent-card.schema.jsonby reference (not redefined); a pushed card MUST additionally satisfyfuze-profile.schema.json.tenant-registration.md— NORMATIVE:POST /a2a/tenants/register,GET /a2a/tenants(+/{tenant}), idempotent-upsert semantics (201 create / 200 update, keyed ontenant), the OIDC self-registration security rule, the two-schema card-validation rule.client/fuze_a2a_client/registration_models.py(viaregenerate.sh, which now bundles the cross-file card ref for single-file codegen), exported fromfuze_a2a_client. Package +VERSIONbumped 1.0.0 → 1.3.0 (first bump since freeze that changes the generated surface).examples/registration/fuzeplan.tenant-registration.json— worked fixture.Backward compatibility
Purely additive.
values-interface.schema.jsonand the statica2a.tenants[]topology are unchanged and still valid;agent-card/fuze-profile/a2a-wireschemas,card-projection.md,binding.md,state-mapping.md,authz.mdare untouched;wire_models/card_modelsare byte-identical after regeneration; both topologies serve byte-identical cards. A v1 consumer that does not use runtime registration is unaffected.Validation
tenant-registration.schema.jsonvalid Draft 2020-12; example validates end-to-end (cross-file card ref resolves); negatives rejected (additionalProperties:false, required fields).Identifier / pagination standards
RegisterTenantRequestisx-client-assigned-id: allowed—tenantis the natural registry key (must equal the card'sAgentInterface.tenantand be derivable from the authenticated repo), no server-minted surrogate;additionalProperties:falsethroughout.GET /a2a/tenantsisx-pagination: exemptwith a stated reason.Out of scope — NOT in this PR (fan out AFTER freeze)
Slice 1 DB migration (
a2a_tenants), the orchestratorPOST /a2a/tenants/register+GET /a2a/tenantshandlers, the Slice 3 stateless A2A server reader, acceptance/conformance tests for the live endpoints, and any chart/Argo wiring. This PR is the gate they build on.Refs #203.
Generated by Claude Code