Ray Swan_

AI/ML Ops Factory

2026 · Platform · Architect, Engineer & Technical Product Lead

The opinionated factory so teams stop reinventing scaffolding and start where the value is — manifest in, governed Azure ML repo out.

01 · Problem

The constraint

Enterprise MLOps usually collapses into a notebook, a portal click, or a generator that pretends Databricks, Foundry, and Azure ML are one lifecycle. The factory had to generate self-contained project repos without importing a taxi demo or a churn prototype as the platform, and without claiming live Azure proof from local tests.

02 · Built

What shipped

Started as a Databricks medallion + telecom-churn product (azuredev-3d78, private): bronze/silver/gold, MLflow train/register (sklearn on gold_feature_snapshots from the IBM Telco corpus), FastAPI /churn-score that calls a Databricks model-serving endpoint, Foundry explanation client. Then stood up Microsoft’s MLOps v2 accelerator as a live taxi instance (azure-mlops) and added scheduled KS drift → retrain. Re-engineered a separate generator, AIML-SCAFFOLD: manifest in, deterministic generate, doctor. Public generated project is azure-aiml-ops. R1 does not generate Databricks, Foundry, online serving, or auto-retrain. Foundry GenAI ops remains in process on the churn prototype.

03 · Decisions

The path

  1. 01
    Churn prototype first, not the factory

    azuredev-3d78 runs IBM Telco churn through Databricks bronze/silver/gold, trains sklearn in MLflow from gold_feature_snapshots, registers the candidate, and scores through FastAPI → Databricks serving. No project generator.

  2. 02
    Run the Microsoft accelerator for real

    azure-mlops is a live MLOps v2 taxi project. Dev and Prod resource groups, registered taxi-model, working batch endpoints. Template bugs (OIDC id-token, conda setuptools, SKU) were fixed. Online endpoint was not deployed.

  3. 03
    Opinionated monitor and retrain on the taxi path

    Added check_drift.py plus a Monday cron workflow: DRIFT_DETECTED dispatches training. That path is on azure-mlops. AIML-SCAFFOLD’s own ledger still marks drift/retrain experimental and excluded from R1 generate.

  4. 04
    A generator that is not the taxi

    AIML-SCAFFOLD is independent of the churn prototype and is not how azure-mlops was created. Manifest → validate → plan → generate → doctor. Terraform only for R1. Generated example: azure-aiml-ops.

  5. 05
    Foundry stays in process

    Scaffold holds Foundry YAML contracts. azuredev holds a Foundry chat client with explicit foundry_llm vs deterministic_fallback. Neither is R1 generated output.

04 · Architecture

How it is built

Deterministic project generator

aiml-scaffold validate / plan / generate / doctor. source-manifest.yaml, resolved-plan.json, generation-receipt.json. CLI does not deploy Azure resources.

Terraform as the R1 setup path

Generated Azure ML workspace, identity-based storage, Key Vault/Log Analytics as configured, GitHub OIDC. Digest-bound plan artifacts; apply is a separate manual dispatch.

Local-first, cloud-honest lifecycle

Same Python modules for prepare → train → evaluate → conditionally register → explicit-version batch score. Local green does not count as Azure ML execution.

Live taxi reference (not generated by SCAFFOLD)

azure-mlops: rg-azmlops-0001dev/prod, taxi-model in both, working batch endpoints. GitHub Actions + OIDC. Scheduled KS drift can trigger retrain. Online serving deferred.

Generated R1 project

azure-aiml-ops: local lifecycle runner, Terraform, OIDC smoke, train/deploy-batch workflows when enabled, KS drift workflow that does not auto-retrain.

Databricks telecom churn (not generated)

azuredev-3d78: medallion tables, MLflow train/validate/promote on Telco features, inference via Databricks model serving invoked from FastAPI /churn-score.

Not R1 (yet)

Databricks, Foundry agents, Azure AI Search, online endpoints, and auto-retrain are not AIML-SCAFFOLD generate output.

05 · Surfaces

What it looks like to operate

Factory control plane
Plate
Factory control plane

Intake through monitoring as a product metaphor. The generator instantiates Terraform + lifecycle repos, not a hologram UI.

06 · Standing

What this proves

Proves: I can build a deterministic ML project factory — Terraform, OIDC, and digest-bound apply — and run a live MLOps v2 taxi with scheduled drift retrain.

Three evidenced slices: AIML-SCAFFOLD generates Terraform Azure ML repos; azure-aiml-ops is a generated Dev tree; azure-mlops is the taxi instance that trained, registered, and batch-served in Dev and Prod. Separately, azuredev-3d78 is the Databricks telecom-churn path (train on gold features, infer via model serving + FastAPI). This portfolio hosts the write-up, not a fake factory UI.

AIML-SCAFFOLD generator (validate → plan → generate → doctor), live azure-mlops taxi with Dev/Prod RGs, and azuredev-3d78 Databricks medallion with FastAPI serving.

01 / 06 · Problem