Skip to content

feat(agent): improve readme, ci, resilience and skills#713

Open
OisinKyne wants to merge 9 commits into
mainfrom
oisin/v0-13-rc0
Open

feat(agent): improve readme, ci, resilience and skills#713
OisinKyne wants to merge 9 commits into
mainfrom
oisin/v0-13-rc0

Conversation

@OisinKyne

@OisinKyne OisinKyne commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Summary

v0.13.0-rc0 integration branch. This PR rolls the source PR stack and Renovate bumps into one release-candidate branch for validation against integration/v0.13.0-rc0.

The integration branch tip currently under validation is a29c8262398afc63044d0fad1b57977286699ab4.

Superseded source PRs

When this integration branch lands, these source PRs should be treated as superseded by the integrated RC branch rather than merged independently:

Conflict resolution

The source stacks overlapped in only two files during the initial rollup:

Validation

Local validation before release-smoke:

RC smoke status before #715:

  • PASS: flow-01, flow-03, flow-04, flow-05, flow-06, flow-07, flow-08, flow-09, flow-10, flow-11, flow-16, flow-17.
  • FAIL: flow-02 due kube-state-metrics image pull/bootstrap stall.
  • FAIL: flow-13 due stale smoke helper parsing /api/services.json as a bare array.
  • FAIL: flow-14 due timeout fetching bedag/raw-2.0.2.tgz during Hermes install.
  • Accounting issue: flow-11 completed but produced a report-level SKIP because registration was already reflected in ServiceOffer status while receipt lookup was unavailable.

Targeted validation after #715 merge:

  • flow-13-dual-stack-obol.sh was rerun from integration tip a29c8262.
  • The former failure is fixed: Bob's agent pod discovered alice-obol-inference in /api/services.json with HTTP 200 ... OBOL permit2, and the flow logged PASS for that catalog assertion.
  • The full flow still failed later at the agent-buy step: no PurchaseRequest was created after the retry. Treat that as the next blocker, separate from the fixed catalog-envelope bug.

This PR is not smoke-green until flow-02 dependency preflights are clean and the full release smoke is rerun from the current integration tip.

OisinKyne and others added 9 commits July 6, 2026 00:10
Phase 1 of the zero-downtime work for #321:

- obol model prefer no longer rolls the LiteLLM deployment. model_list
  order is an obol convention (Rank reads the ConfigMap); LiteLLM's
  router does not use it, so the restart was pure downtime.
- RestartLiteLLM now fails loudly when the rollout does not converge
  within 90s instead of warning and reporting success (#321 item 3).
- ReconcileRecorded's ConfigMap-only branch restarts explicitly now
  that Reloader no longer watches litellm-config.
- New drift safety net: obol model status compares the ConfigMap
  model_list against the live router /v1/models (CheckRouterDrift /
  DiffRouterModels) and reports missing/extra entries, replacing the
  Reloader annotation as the guard against silently-failed hot calls.

Claude-Session: https://claude.ai/code/session_01YLuXwN1A4tG3xmEMKvAzeD
…rollouts

Phase 2 of #321. The buyer's RWO consumed-auth PVC forced the litellm
Deployment onto replicas:1 + Recreate, turning every rollout (Reloader
secret rotation, image bump, config reload) into a full inference gap —
and the Reloader annotation on litellm-config triggered such a rollout
on every model add/remove/prefer and first-time purchase, defeating the
hot /model/new path shipped in #320.

- x402-buyer becomes its own Deployment (1 replica, Recreate, keeps the
  PVC and single-writer auth semantics) + ClusterIP Service. Buyer CM
  changes still hot-reload via /admin/reload; only buyer image bumps
  briefly gap paid/* routes.
- litellm is now stateless: RollingUpdate maxSurge:1 maxUnavailable:0 —
  a new pod must be Ready before the old one terminates. Reloader
  watches litellm-secrets only; litellm-config changes are hot-applied.
- Paid-route api_base moves to http://x402-buyer.llm.svc.cluster.local:8402/v1.
  The controller migrates legacy 127.0.0.1:8402 entries at startup and
  on per-purchase reconcile (upgraded-in-place clusters), hot-syncing
  the live router.
- Controller buyer probes (reload/remove/status) and buy.py target the
  x402-buyer pods; flow scripts reach the buyer via its Service.
- PodMonitor keeps its historical name but targets the buyer pods.

NetworkPolicy for :8402 is deliberately deferred: agent namespaces have
no common label and buy.py legitimately reads /status from them; the
Service changes addressing, not exposure (pod IP was already
cluster-reachable).

Claude-Session: https://claude.ai/code/session_01YLuXwN1A4tG3xmEMKvAzeD
CLAUDE.md and obol-stack-dev references: buyer is a standalone
Deployment + Service (port-forward svc/x402-buyer), paid routes point
at the buyer Service with the mandatory /v1 suffix, and Reloader
watches litellm-secrets only — litellm-config changes are hot-applied
with drift surfaced by obol model status (#321).

Claude-Session: https://claude.ai/code/session_01YLuXwN1A4tG3xmEMKvAzeD
Replica-stance hardening for multi-node clusters, follow-up to the
LiteLLM zero-downtime work (#321):

- PodDisruptionBudgets (minAvailable: 1) for x402-verifier and eRPC —
  on multi-node clusters a kubectl drain would otherwise silently evict
  the only pod of the payment gate (every /services/* route 5xxs) or
  the RPC front door. Same stance as the existing litellm PDB; rollouts
  are unaffected (both surge gaplessly behind readiness probes). The
  eRPC PDB lives in base/templates/erpc.yaml because the ethereum/erpc
  chart (0.0.4) has no PDB template — its podDisruptionBudget value is
  unwired. cloudflared already ships a PDB gated on an active tunnel.

- remote-signer pinned to strategy: Recreate post-helmfile-sync (hermes
  and openclaw runtimes). The obol/remote-signer chart (0.3.3) cannot
  express spec.strategy, so the deployment defaulted to RollingUpdate —
  a surge pod over the RWO keystore PVC wedges on multi-node volume
  attach and briefly double-runs the signer anywhere. Patching
  spec.strategy does not touch the pod template, so the pin never rolls
  the pod itself. Upstream follow-up: add strategy support to the chart.

Reviewed and deliberately unchanged: serviceoffer-controller already
has Lease-based leader election (cmd/serviceoffer-controller/main.go),
so its RollingUpdate surge is safe — the new pod blocks on the Lease.

Claude-Session: https://claude.ai/code/session_01YLuXwN1A4tG3xmEMKvAzeD
@OisinKyne OisinKyne changed the title feat( feat(agent): improve readme, ci, resilience and skills Jul 7, 2026
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