---
title: "2026-09-02 Factory campaign PR and ad hoc inference restoration"
description: "Opened coordinated draft PRs, restored typed inference, and verified local Factory surfaces with synthetic vxData."
image: "https://docs.virdx.dev/img/virdx-social-card.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.virdx.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# 2026-09-02 Factory campaign PR and ad hoc inference restoration

## Work Done

- Opened draft mono PR https://github.com/virdx/mono/pull/368 for the campaign controller, contracts, shared worker, CLI, and dashboard changes.
- Opened coordinated draft infrastructure PR https://github.com/virdx/infra_k8s/pull/189 for controller/worker image mappings and Kubernetes Lease RBAC.
- Restored ad-hoc `viseg` and `histo-preprocessing` inference in `factory_controller.inference`, exposed through FastAPI and `pixi run factory inference`, and reused the campaign Argo submission and worker specifications.
- Preserved optional request config, arbitrary input batching, producer identity, per-run histo memory sizing, and separation of pod sizing from worker payload parameters.
- Resolved all findings from independent concurrency, API/CLI, OpenAPI, and payload review.
- Upgraded GitHub CLI from 2.97.0 to 2.99.0 for native `--attach` support.
- Ran local mock vxData with native Postgres and MinIO, seeded 372 standard resources plus 12 synthetic T2 cases and 5 anatomy maps, and ran the local Factory API and dashboard against it.
- Captured and attached the local campaign dashboard and Factory OpenAPI screenshots to the mono PR.
- Committed and pushed ad-hoc inference as `37054ee7`; local services and mock runtime were removed afterward.

## Lessons Learned: Pitfalls

- The initial campaign rewrite removed the old ad-hoc inference surface even though callers still rely on `/inference/viseg`.
- A shared Lease error path must be mapped by every API and CLI caller; campaign-only error handling caused inference contention to become HTTP 500 or a CLI `AttributeError`.
- Histo memory is execution sizing, not a worker semantic parameter. Dropping it from shared parameters also accidentally removed the ad-hoc request control unless a controller-only request config preserves it.
- The repository mock data does not match Factory campaign predicates by default. Synthetic T2 volumes and anatomy maps were needed for a meaningful screenshot.

## Lessons Learned: Improvements

- Treat campaign and ad-hoc requests as two input-selection paths into one Argo submission primitive. Keep worker entrypoint, resources, environment, batching, and payload construction in one mapping.
- Keep local UI verification synthetic by default. Document the exact campaign-matching seed fields (`volume_type=T2`, `series_description=t2_tse_tra`, `task=anatomy`).
- GitHub CLI 2.99.0 or newer can attach local screenshots directly to PR descriptions with `gh pr edit --attach 'path#alt text'`.

Source: https://docs.virdx.dev/knowledge/inbox/2026-09-02-infrastructure-factory-campaign-pr-and-inference/index.mdx
