Skip to content

feat(a2a): image + Helm chart (enabled-gated) + Argo Application - #85

Merged
izzywdev merged 6 commits into
mainfrom
feat/a2a-deploy
Jul 22, 2026
Merged

feat(a2a): image + Helm chart (enabled-gated) + Argo Application#85
izzywdev merged 6 commits into
mainfrom
feat/a2a-deploy

Conversation

@izzywdev

@izzywdev izzywdev commented Jul 22, 2026

Copy link
Copy Markdown
Owner

DevOps delivery slice for A2A Phase 2 (contract v1 frozen). Draft.

Scope delivered

  • Image + CI: agent-templates/a2a/Dockerfile (context = agent-templates/, packages the server + the frozen fuze_a2a_client, runs as non-root uid 10001) + starter requirements.txt; wired into release.yml (build/push ghcr.io/izzywdev/fuzeagent-a2a + SHA tag-bump into the a2a overlay).
  • Helm chart deploy/helm/a2a-shared/ — dedicated, a2a.enabled-gated, one shared server (tenants are DATA, not a chart-per-repo). a2a: block is byte-conformant to contracts/a2a/v1/schema/values-interface.schema.json; deploy mechanics kept in a separate deploy: block. Service hardcoded a2a-shared ClusterIP:8080 (the frozen in-cluster URL); tenant routing ConfigMap; per-external-tenant Ingress (a2a.<slug>.prod.fuzefront.com); OIDC/card-signing/mTLS from secretRefs; non-root securityContext.
  • Argo CD: deploy/argocd/applications/a2a-shared.yaml (hybrid-Argo, own app, prune+selfHeal).
  • CI validation: helm-validate.yml extended to lint + kubeconform the new chart (via ci/enabled-values.yaml, since prod/default render empty while gated off).

Verified

helm lint clean (default/prod/ci); kubeconform -strict -ignore-missing-schemas k8s 1.29.0 → 4/4 valid; gated overlays render empty; docker build green; helm-validate + Semgrep OSS pass on PR head.

Ships DISABLED — go-live preconditions (out of scope for this PR)

Server image (backend-engineer), providesTo backfill (authz.md §3 fail-closed), card-signing SealedSecret. See deploy/helm/a2a-shared/README.md.

Follow-up (not blocking this PR)

  • gate-localup A2A stand-up for live-integration tests: the test-engineer's live acceptance tier expects A2A_SERVER_BASE_URL + A2A_TEST_OIDC_TOKEN/A2A_TEST_UNAUTH_TOKEN. Standing up the shared A2A server in the local/kind stack (so those tests can go green) is a natural fit for this chart + CI once the server image lands. Tracked as a devops follow-up; it depends on backend-engineer's agent-templates/a2a/*.py entrypoint (see the TODO(server-entrypoint) markers) and a local OIDC issuer/token mint. Will wire gate-localup to helm install a2a-shared with an enabled local overlay + export those env vars for the live tier in a subsequent PR.

OUT OF SCOPE — NOT DONE

A2A server code, contract/acceptance tests, handoff-MCP client, onboarding docs — owned by their agents.

🤖 Generated with Claude Code

Comment thread agent-templates/a2a/Dockerfile Fixed
izzywdev added a commit that referenced this pull request Jul 22, 2026
Resolves Semgrep OSS dockerfile.security.missing-user finding on PR #85.
Non-root uid 10001 in the image + matching runAsNonRoot/drop-ALL-caps in the
Deployment. Re-validated: helm lint clean, kubeconform 4/4, docker build green.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session-Id: 17fb89fd-3579-433b-a6c4-9c9e7f3ec549
izzywdev added a commit that referenced this pull request Jul 22, 2026
Resolves Semgrep OSS dockerfile.security.missing-user finding on PR #85.
Non-root uid 10001 in the image + matching runAsNonRoot/drop-ALL-caps in the
Deployment. Re-validated: helm lint clean, kubeconform 4/4, docker build green.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session-Id: 17fb89fd-3579-433b-a6c4-9c9e7f3ec549
izzywdev and others added 6 commits July 22, 2026 20:41
Validated locally:
- helm lint clean on default/prod/ci overlays (helm v4.2.1)
- helm template renders Deployment/Service/ConfigMap + per-external-tenant Ingress
- default+prod overlays render empty (enabled:false gate)
- kubeconform -strict -ignore-missing-schemas: 4/4 valid (k8s 1.29.0)
- docker build of agent-templates/a2a/Dockerfile succeeds

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session-Id: 17fb89fd-3579-433b-a6c4-9c9e7f3ec549
Resolves Semgrep OSS dockerfile.security.missing-user finding on PR #85.
Non-root uid 10001 in the image + matching runAsNonRoot/drop-ALL-caps in the
Deployment. Re-validated: helm lint clean, kubeconform 4/4, docker build green.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session-Id: 17fb89fd-3579-433b-a6c4-9c9e7f3ec549
…t, values doc)

Rebased onto main (server PR #87 + mcp #86 merged). Reconciled the deploy slice
with the now-real server (agent-templates/a2a/):

- requirements.txt: took main's canonical (server-owned) set; ADDED cryptography
  (runtime._build_verifier decodes RS256/ES256 JWKS tokens; PyJWT needs it).
- Dockerfile: entrypoint python -m a2a.runtime (was a2a.server); vendor providers/
  + sync/ (runtime imports 'providers'; anthropic adapter delegates to sync/);
  env = the 4 vars runtime.build_from_env actually reads (A2A_VALUES_FILE,
  A2A_REPOS_DIR, AGENT_PROVIDER, HOST) + FUZE_STATE_DIR; drop unread PORT/OIDC/
  card-signing envs.
- chart: replace tenants.yaml ConfigMap with values.json (the whole a2a block via
  toJson) that the server reads via A2A_VALUES_FILE; add repo-sync init container
  cloning each enabled tenant's repo at its ref into /repos (LocalRepoResolver);
  optional ANTHROPIC_API_KEY / git token / id-state ConfigMap wiring; probes now
  hit the server's real GET /healthz.

Verified:
- helm lint clean (default/prod/ci); kubeconform 4/4 valid (k8s 1.29.0).
- gated overlays render empty (enabled:false).
- rendered values.json parses through the MERGED server's a2a.config.load_config
  (both tenants, auth, keyId resolved).
- docker build green; in-image import of a2a.*/providers/fuze_a2a_client + cryptography;
  build_from_env() composes the Starlette app (routes /rpc, /.well-known/agent-card.json,
  /extendedAgentCard, /healthz) from the chart's values.json.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session-Id: 17fb89fd-3579-433b-a6c4-9c9e7f3ec549
@izzywdev
izzywdev marked this pull request as ready for review July 22, 2026 17:47
@izzywdev
izzywdev merged commit 4e06762 into main Jul 22, 2026
29 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants