---
title: "2026-09-17 Replace existing Factory with framework jobs"
description: "Rescope the second mono PR to replace apps/factory rather than add factory-histo."
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-17 Replace existing Factory with framework jobs

## Work Done

User explicitly superseded the earlier requirement to leave legacy Factory unchanged.
Updated [mono #406](https://github.com/virdx/mono/pull/406), stacked on #404, at
7eba9a96. Removed apps/factory-histo and migrated all seven current jobs into
apps/factory: six fixed histo cohorts and Viseg T2/t2_tse_tra anatomy. Registration
is factory.deployment:factory. Replaced legacy API/sync/rules/custom Argo/container
modules with framework check/infer/worker behavior. Old inference/rules/sync/status
endpoints and in-flight suppression are intentionally gone; dashboard unchanged.

One CUDA13 image, Dockerfile.api, retains the existing Tekton factory-api mapping;
Dockerfile.inference and its second build were removed. Deployment docs identify
external infra_k8s/current/inference/deployment.yaml changes needed to reuse
inference/inference-api: same immutable digest for API/workers, backend and SDK
env, secret-backed raw Argo bearer. Existing mounted SA token is not read by the
framework REST backend. No actual build, rollout, cluster writes or GPU runs.
Framework still owns worker secrets, scratch/shm/GPU; no host mounts or consumer
pod-spec option. Do not put HF-specific plumbing back into either mono PR.

Nx format/lint/typecheck/build, dependency boundaries, shell syntax, 14-route
model-free API startup, and worker pod checks pass. No new test suite. User dirty
framework pyproject.toml restored exactly and left unstaged; framework tree clean.

Rollout blockers: release [histo #345](https://github.com/virdx/histo/pull/345) and
update current0.0.122 pin; provision fixed Viseg model c2fe25b446484539bf8318bb48fe6c76
checkpoints under /opt/models/viseg-anatomy/5fold_anatomy_ensemble_25-08-202512:03:26.
The image does not yet bundle those files and old MinIO is unavailable. Audit old
callers before replacing the API. Read-only inspection found no Factory CronJob
or /sync caller in infra_k8s current; external callers remain unverified.

The separate histo #345 validation finished: all four existing GrandQC tests pass;
real pinned file download/hash and loading into real model on CPU pass. Full mypy
only reports existing macOS posix_fadvise diagnostics. PR body updated accordingly.

## Lessons Learned: Pitfalls

Path-limited git stash can retain already staged changes outside its path. Here,
previously staged factory-histo deletions conflicted with committed migration renames
on apply. Kept committed migration files, unstaged restored user manifest and verified
its original bytes. Avoid staged changes before stashing an unrelated user edit.
A child inspected the wrong checkout and incorrectly assumed raw pod-spec support;
corrected it against the explicitly assigned worktree before documenting behavior.

## Lessons Learned: Improvements

Keep the consumer registration and per-service check/infer implementations; delete
old orchestration rather than wrapping it. Separate code migration from actual
GitOps rollout and model provisioning, and state the remaining blockers explicitly.

Source: https://docs.virdx.dev/knowledge/inbox/2026-09-17-infrastructure-factory-replace-existing-app/index.mdx
