Wanderland

Advaita Service: foxfire

foxfire is the Nextflow pipeline observability receiver — the third tier of the echo reference application. It ingests signed pipeline lifecycle events, stores them append-only, and serves per-task cost and run history over HTTP and GraphQL. It runs on Kubernetes (CoreWeave for dev/prod, OrbStack for local).

What it does

Why it exists

Nextflow's built-in trace carries observability (timing, resource use, exit codes) but no provenance: events are unsigned, there is no hash chain, and a TraceRecord is a mutable map updated in place. foxfire is the append-only signed store that turns each lifecycle callback into an auditable, billable event with its own timestamp and content hash. It is the receiver half of the Nextflow → platform provenance bridge.

How it works

Deployment (k8s)

Env Context Host Store Image stage
local orbstack foxfire.localhost SQLite (PVC) build → ECR (arm64)
dev useast13-dev foxfire-dev.cw.advaitabio.com Postgres (foxfire-pg) build → ECR (amd64)
prod useast13-prod foxfire.cw.advaitabio.com Postgres (CW managed) promote (k8s_live_image, no rebuild)

Configuration

Local build & deploy

vivarta-drones/scenarios/apps/foxfire/foxfire-deploy-local.yml scripts the OrbStack-local deploy: rsync wanderland-core and the three :deploy packs to $WORKSPACE siblings (checkout-extra, real copies — Docker won't follow a symlink), docker build the receiver tagged to the local overlay's image, kubectl --context orbstack apply -k k8s/overlays/local, then wait for the rollout. The receiver image builds and boots on OrbStack — a running container serves /health ({"ok":true,"service":"foxfire"}).

Local image pull mirrors CoreWeave at the k8s-contract level: an ecr-creds dockerconfigjson secret in vivarta-echo, attached to the namespace default ServiceAccount. On CW an ESO ExternalSecret + ECRAuthorizationToken generator mints it hourly; locally vivarta-platform/local-k8s/ecr-pull/refresh-ecr-creds.sh mints the same secret from the developer's AWS credentials (~12h token) and default-sa-pull-secret.yaml attaches it. With imagePullPolicy: IfNotPresent, a locally-built image tagged as the ECR ref runs without a pull; ecr-creds covers the real ECR pull path.

Dependencies

Dependency Use Endpoint / id
ECR image registry advaita/foxfire
Route53 (dev/prod) public DNS A record zone Z09954442XO6C5WWVED2R (cw.advaitabio.com)
cert-manager (dev/prod) TLS issuance letsencrypt-prod ClusterIssuer
SSM (planned) public verification key path: TBD

Dependents

Dependent Use
echo-backend proxies GraphQL reads (foxfire_graphql); points launched driver Jobs at /events/signed
nf-driver the driver's nf-foxfire plugin POSTs signed events to /events/signed
wisp reads the rolled-up job-type envelope to size a run; posts the plan back at launch
reaper posts placement (where each pod landed) for plan-vs-actual reconcile
puck the launched sorties read run/reconcile/placement to verify their submissions

Impact when down

No new run/task telemetry is stored; workflow execution is unaffected (the driver runs regardless). The echo dashboard shows stale or empty data, and provenance/billing has a gap for the outage window. Whether the driver's shipper queues, drops, or fails the run when the receiver is unreachable: TBD. Blast radius is the observability plane, not the compute plane.

The code

Open questions