Code: mono/apps/cronnie (README has design + how to add a job). Runs in namespace
autoresearch as Argo CronWorkflows; no server, no Argo Events. Dashboard page /cronnie.
Contract
- Runtime tags every gateway call with
X-MLflow-Gateway-Caller: cronnie/<workflow uid>. MLflow stores it as trace metadatamlflow.gateway.caller; the dashboard searchesPOST /api/3.0/mlflow/traces/searchwithfilter: metadata.`mlflow.gateway.caller` = 'cronnie/<uid>'across the experiments listed byGET /api/3.0/mlflow/gateway/endpoints/list. Argo’smetadata.uidis the only join key. - Workflows carry
app.kubernetes.io/name=cronnieandcronnie.virdx.dev/job=<job>. Cron-created workflows needworkflows.argoproj.io/creator-preferred-username: autoresearchinworkflowMetadata: the cron controller runs as theargoSA and is exempt from the autoresearch identity-injection rule, so without it runs are unattributed. - Pi’s
openai-completionsAPI always streams; Bedrock via bearer token refuses streaming. The runtime’s loopback adapter does one non-streaming call and replays it as SSE (same trick asapps/autoresearch-box).
Traps (all hit live, 2026-09-18)
- MLflow gateway < 3.13 drops assistant
tool_callswhen converting to Bedrock Converse: every second turn after a tool call 400s with “toolResult blocks exceed toolUse blocks”. Fixed upstream in 3.13.0 (#23223) / 3.16.1 (#24309). Cluster upgraded tov3.16.1-full(infra_k8s#230); DB migration ran via the chart’s init container, traces/endpoints intact. - Argo needs an explicit
commandfor images in the private registry: the controller cannot read image config (secrets "zot-registry-credentials" is forbidden). - Output artifacts in
autoresearchfail: the executor cannot verifys3.fra.virdx.dev(IPA CA,x509: unknown authority) and Argo skips artifacts on mounted volumes anyway. Cronnie keeps no artifacts; the transcript lives in MLflow + pod log. Fix would be acaSecreton the namespace artifact repository. - zot rejects Docker-media-type manifests from
docker push(manifest invalid, HTTP 415) and is only reachable viakubectl port-forward -n zot svc/zot. Push withdocker buildx build --output type=image,oci-mediatypes=true,push=true,registry.insecure=truethrough adocker-containerbuilder withnetwork=host. - OTLP encodes JSON
nullas a kvlist entry withoutvalue; decoders must tolerate it. - Local dashboard against live Argo without Keycloak:
DASHBOARD_MOCK=trueplusDASHBOARD_DEV_TOKEN_COMMAND="kubectl oidc-login get-token ... | jq -r .status.token".