Production machine-learning engineering workflow for data contracts, reproducible training, model evaluation, deployment, monitoring, and rollback. Use when building, reviewing, or hardening ML systems beyond one-off notebooks.
Use this skill to turn model work into a production ML system with clear data contracts, repeatable training, measurable quality gates, deployable artifacts, and operational monitoring.
When to Activate
Planning or reviewing a production ML feature, model refresh, ranking system, recommender, classifier, embedding workflow, or forecasting pipeline
Converting notebook code into a reusable training, evaluation, batch inference, or online inference pipeline
Designing model promotion criteria, offline/online evals, experiment tracking, or rollback paths
Debugging failures caused by data drift, label leakage, stale features, artifact mismatch, or inconsistent training and serving logic
Adding model monitoring, canary rollout, shadow traffic, or post-deploy quality checks
Scope Calibration
Use only the lanes that fit the system in front of you. This skill is useful for ranking, search, recommendations, classifiers, forecasting, embeddings, LLM workflows, anomaly detection, and batch analytics, but it should not force one architecture onto all of them.
Do not assume every model has supervised labels, online serving, a feature store, PyTorch, GPUs, human review, A/B tests, or real-time feedback.
Do not add heavyweight MLOps machinery when a data contract, baseline, eval script, and rollback note would make the change reviewable.
Do make assumptions explicit when the project lacks labels, delayed outcomes, slice definitions, production traffic, or monitoring ownership.
Treat examples as interchangeable scaffolds. Replace metrics, serving mode, data stores, and rollout mechanics with the project-native equivalents.
Related Skills
python-patterns and python-testing for Python implementation and pytest coverage
pytorch-patterns for deep learning models, data loaders, device handling, and training loops
eval-harness and ai-regression-testing for promotion gates and agent-assisted regression checks
database-migrations, postgres-patterns, and clickhouse-io for data storage and analytics surfaces
deployment-patterns, docker-patterns, and security-review for serving, secrets, containers, and production hardening
Reuse the SWE Surface
Do not treat MLE as separate from software engineering. Most ECC SWE workflows apply directly to ML systems, often with stricter failure modes:
The recommended minimal --with capability:machine-learning install keeps the core agent surface available alongside this skill. For skill-only or agent-limited harnesses, pair skill:mle-workflow with agent:mle-reviewer where the target supports agents.
Version labels, feature snapshots, prediction logs, experiment metrics, and drift analytics
deployment-patterns / docker-patterns
Package reproducible training and serving images with health checks, resource limits, and rollback
canary-watch / dashboard-builder
Make rollout health visible with model-version, slice, drift, latency, cost, and delayed-label dashboards
security-review / security-scan
Check model artifacts, notebooks, prompts, datasets, and logs for secrets, PII, unsafe deserialization, and supply-chain risk
e2e-testing / browser-qa / accessibility
Test critical product flows that consume predictions, including explainability and fallback UI states
benchmark / performance-optimizer
Measure throughput, p95 latency, memory, GPU utilization, and cost per prediction or retrain
cost-aware-llm-pipeline / token-budget-advisor
Route LLM/embedding workloads by quality, latency, and budget instead of defaulting to the largest model
documentation-lookup / search-first
Verify current library behavior for model serving, feature stores, vector DBs, and eval tooling before coding
git-workflow / github-ops / opensource-pipeline
Package MLE changes for review with crisp scope, generated artifacts excluded, and reproducible test evidence
strategic-compact / dmux-workflows
Split long ML work into parallel tracks: data contract, eval harness, serving path, monitoring, and docs
Ten MLE Task Simulations
Use these simulations as coverage checks when planning or reviewing MLE work. A strong MLE workflow should reduce each task to explicit contracts, reusable SWE surfaces, automated evidence, and a reviewable artifact.
ID
Common MLE task
Streamlined ECC path
Required output
Pipeline lanes covered
MLE-01
Frame an ambiguous prediction, ranking, recommender, classifier, embedding, or forecast capability
Prediction endpoint or batch job with response envelope, timeout, batching, fallback, model version, confidence, feedback logging, and product-flow tests
serving, batch inference, fallback, user workflow
MLE-09
Roll out a model with shadow traffic, canary, A/B test, or rollback
Observation ledger and refresh plan with drift checks, delayed-label health, alert owners, runbook updates, retrain criteria, and PR evidence
monitoring, incident response, retraining
Iteration Compact
Before touching model code, compress the work into one reviewable artifact. This should be short enough to fit in a PR description and precise enough that another engineer can challenge the tradeoffs.
Goal:
Who cares:
Decision owner:
User or system action changed by the model:
Success metric:
Guardrail metrics:
Mistake budget:
Unacceptable mistakes:
Acceptable mistakes:
Assumptions:
Constraints:
Labels and data snapshot:
Baseline:
Candidate signals:
Threshold or config plan:
Eval slices:
Known risks:
Next experiment:
Rollback or fallback:
This compact is the MLE equivalent of a strong SWE design note. It keeps the team from optimizing a metric no one trusts, adding features that do not address the real error mode, or shipping complexity without a rollback.
Decision Brain
Use this loop whenever the task is ambiguous, high-impact, or metric-heavy:
Start from the decision, not the model. Name the action that changes downstream behavior.
Name who cares and why. Different stakeholders pay different costs for false positives, false negatives, latency, compute spend, opacity, or missed opportunities.
Convert ambiguity into hypotheses. Ask what signal would separate outcomes, what evidence would disprove it, and what simple baseline should be hard to beat.
Research prior art or a nearby known problem before inventing a bespoke system.
Score choices with (probability, confidence) x (cost, severity, importance, impact).
Consider adversarial behavior, incentives, selective disclosure, distribution shift, and feedback loops.
Prefer the simplest change that reduces the most important mistake. Simplicity is not laziness; it is a way to minimize blunders while preserving iteration speed.
Capture the decision, evidence, counterargument, and next reversible step.
Metric and Mistake Economics
Choose metrics from failure costs, not habit:
Use a confusion matrix early so the team can discuss concrete false positives and false negatives instead of abstract accuracy.
Favor precision when the cost of an incorrect positive decision dominates.
Favor recall when the cost of a missed positive dominates.
Use F1 only when the precision/recall tradeoff is genuinely balanced and explainable.
Use AUC or ranking metrics when ordering quality matters more than a single threshold.
Track latency, throughput, memory, and cost as first-class metrics because they shape feasible model complexity.
Compare against a baseline and the current production model before celebrating an offline gain.
Treat real-world feedback signals as delayed labels with bias, lag, and coverage gaps; do not treat them as ground truth without analysis.
Every metric choice should state which mistake it makes cheaper, which mistake it makes more likely, and who absorbs that cost.
Data and Feature Hypotheses
Features should come from a theory of separation:
Text, categorical fields, numeric histories, graph relationships, recency, frequency, and aggregates are candidate signal families, not automatic features.
For every feature family, state why it should separate outcomes and how it could leak future information.
For noisy labels, consider adjudication, label confidence, soft targets, or confidence weighting.
For class imbalance, compare weighted loss, resampling, threshold movement, and calibrated decision rules.
For missing values, decide whether absence is informative, imputable, or a reason to abstain.
For outliers, decide whether to clip, bucket, investigate, or preserve them as rare but important signal.
For correlated features, check whether they are redundant, unstable, or proxies for unavailable future state.
Do not add model complexity until error analysis shows that the baseline is failing for a reason additional signal or capacity can plausibly fix.
Error Analysis Loop
After each baseline, training run, threshold change, or config change:
Split mistakes into false positives, false negatives, abstentions, low-confidence cases, and system failures.
Cluster errors by shared traits: language, entity type, source, time, geography, device, sparsity, recency, feature freshness, label source, or model version.
Separate model mistakes from data bugs, label ambiguity, product ambiguity, instrumentation gaps, and serving mismatches.
Trace each major cluster to one of four moves: better labels, better features, better threshold/config, or better product fallback.
Preserve every important mistake as a regression test, eval slice, dashboard panel, or runbook entry.
Write the next iteration as a falsifiable experiment, not a vague "improve model" task.
The strongest MLE loop is not train -> metric -> ship. It is mistake -> cluster -> hypothesis -> experiment -> evidence -> simpler system.
Observation Ledger
Keep a compact decision and evidence trail beside the code, PR, experiment report, or runbook:
Use the ledger to make model work cumulative. The goal is for each iteration to make the next decision easier, not merely to produce another artifact.
Core Workflow
1. Define the Prediction Contract
Capture the product-level contract before writing model code:
Prediction target and decision owner
Input entity, output schema, confidence/calibration fields, and allowed latency
Batch, online, streaming, or hybrid serving mode
Fallback behavior when the model, feature store, or dependency is unavailable
Human review or override path for high-impact decisions
Privacy, retention, and audit requirements for inputs, predictions, and labels
Do not accept "improve the model" as a requirement. Tie the model to an observable product behavior and a measurable acceptance gate.
2. Lock the Data Contract
Every ML task needs an explicit data contract:
Entity grain and primary key
Label definition, label timestamp, and label availability delay
Feature timestamp, freshness SLA, and point-in-time join rules
Train, validation, test, and backtest split policy
Required columns, allowed nulls, ranges, categories, and units
PII or sensitive fields that must not enter training artifacts or logs
Dataset version or snapshot ID for reproducibility
Guard against leakage first. If a feature is not available at prediction time, or is joined using future information, remove it or move it to an analysis-only path.
3. Build a Reproducible Pipeline
Training code should be runnable by another engineer without hidden notebook state:
Use typed config files or dataclasses for all hyperparameters and paths
Pin package and model dependencies
Set random seeds and document any nondeterministic GPU behavior
Record dataset version, code SHA, config hash, metrics, and artifact URI
Save preprocessing logic with the model artifact, not separately in a notebook
Keep train, eval, and inference transformations shared or generated from one source
Make every step idempotent so retries do not corrupt artifacts or metrics
Prefer immutable values and pure transformation functions. Avoid mutating shared data frames or global config during feature generation.
import hashlib
from dataclasses import dataclass
from pathlib import Path
@dataclass(frozen=True)
class TrainingConfig:
dataset_uri: str
model_dir: Path
seed: int
learning_rate: float
batch_size: int
def artifact_name(config: TrainingConfig, code_sha: str) -> str:
config_key = f"{config.dataset_uri}:{config.seed}:{config.learning_rate}:{config.batch_size}"
config_hash = hashlib.sha256(config_key.encode("utf-8")).hexdigest()[:12]
return f"{code_sha[:12]}-{config_hash}"
4. Evaluate Before Promotion
Promotion criteria should be declared before training finishes:
Baseline model and current production model comparison
Primary metric aligned to product behavior
Guardrail metrics for latency, calibration, fairness slices, cost, and error concentration
Slice metrics for important cohorts, geographies, devices, languages, or data sources
Confidence intervals or repeated-run variance when metrics are noisy
Failure examples reviewed by a human for high-impact models
Explicit "do not ship" thresholds
PROMOTION_GATES = {
"auc": ("min", 0.82),
"calibration_error": ("max", 0.04),
"p95_latency_ms": ("max", 80),
}
def assert_promotion_ready(metrics: dict[str, float]) -> None:
missing = sorted(name for name in PROMOTION_GATES if name not in metrics)
if missing:
raise ValueError(f"Model promotion metrics missing required gates: {missing}")
failures = {
name: value
for name, (direction, threshold) in PROMOTION_GATES.items()
for value in [metrics[name]]
if (direction == "min" and value < threshold)
or (direction == "max" and value > threshold)
}
if failures:
raise ValueError(f"Model failed promotion gates: {failures}")
Use offline metrics as gates, not guarantees. When the model changes product behavior, plan shadow evaluation, canary rollout, or A/B testing before full rollout.
5. Package for Serving
An ML artifact is production-ready only when the serving contract is testable:
Model artifact includes version, training data reference, config, and preprocessing
Input schema rejects invalid, stale, or out-of-range features
Output schema includes model version and confidence or explanation fields when useful
Serving path has timeout, batching, resource limits, and fallback behavior
CPU/GPU requirements are explicit and tested
Prediction logs avoid PII and include enough identifiers for debugging and label joins
Integration tests cover missing features, stale features, bad types, empty batches, and fallback path
Never let training-only feature code diverge from serving feature code without a test that proves equivalence.
6. Operate the Model
Model monitoring needs both system and quality signals:
Availability, error rate, timeout rate, queue depth, and p50/p95/p99 latency
Feature null rate, range drift, categorical drift, and freshness drift
Prediction distribution drift and confidence distribution drift
Label arrival health and delayed quality metrics
Business KPI guardrails and rollback triggers
Per-version dashboards for canaries and rollbacks
Every deployment should have a rollback plan that names the previous artifact, config, data dependency, and traffic-switch mechanism.
Review Checklist
Prediction contract is explicit and testable
Data contract defines entity grain, label timing, feature timing, and snapshot/version
Leakage risks were checked against prediction-time availability
Training is reproducible from code, config, data version, and seed
Metrics compare against baseline and current production model
Slice metrics and guardrails are included for high-risk cohorts
Promotion gates are automated and fail closed
Training and serving transformations are shared or equivalence-tested
Model artifact carries version, config, dataset reference, and preprocessing
Serving path validates inputs and has timeout, fallback, and rollback behavior
Monitoring covers system health, feature drift, prediction drift, and delayed labels
Sensitive data is excluded from artifacts, logs, prompts, and examples
Anti-Patterns
Notebook state is required to reproduce the model
Random split leaks future data into validation or test sets
Feature joins ignore event time and label availability
Offline metric improves while important slices regress
Thresholds are tuned on the test set repeatedly
Training preprocessing is copied manually into serving code
Model version is missing from prediction logs
Monitoring only checks service uptime, not data or prediction quality
Rollback requires retraining instead of switching to a known-good artifact
Output Expectations
When using this skill, return concrete artifacts: data contract, promotion gates, pipeline steps, test plan, deployment plan, or review findings. Call out unknowns that block production readiness instead of filling them with assumptions.
Also appears in:affaan-m/ECC/.kiro/skills/mle-workflow/SKILL.md, affaan-m/ECC/.agents/skills/mle-workflow/SKILL.md
1---2name: mle-workflow3description: Production machine-learning engineering workflow for data contracts, reproducible training, model evaluation, deployment, monitoring, and rollback. Use when building, reviewing, or hardening ML systems beyond one-off notebooks.4---5# Machine Learning Engineering Workflow
67Use this skill to turn model work into a production ML system with clear data contracts, repeatable training, measurable quality gates, deployable artifacts, and operational monitoring.
89## When to Activate
1011- Planning or reviewing a production ML feature, model refresh, ranking system, recommender, classifier, embedding workflow, or forecasting pipeline
12- Converting notebook code into a reusable training, evaluation, batch inference, or online inference pipeline
13- Designing model promotion criteria, offline/online evals, experiment tracking, or rollback paths
14- Debugging failures caused by data drift, label leakage, stale features, artifact mismatch, or inconsistent training and serving logic
15- Adding model monitoring, canary rollout, shadow traffic, or post-deploy quality checks
1617## Scope Calibration
1819Use only the lanes that fit the system in front of you. This skill is useful for ranking, search, recommendations, classifiers, forecasting, embeddings, LLM workflows, anomaly detection, and batch analytics, but it should not force one architecture onto all of them.
2021- Do not assume every model has supervised labels, online serving, a feature store, PyTorch, GPUs, human review, A/B tests, or real-time feedback.
22- Do not add heavyweight MLOps machinery when a data contract, baseline, eval script, and rollback note would make the change reviewable.
23- Do make assumptions explicit when the project lacks labels, delayed outcomes, slice definitions, production traffic, or monitoring ownership.
24- Treat examples as interchangeable scaffolds. Replace metrics, serving mode, data stores, and rollout mechanics with the project-native equivalents.
2526## Related Skills
2728- `python-patterns` and `python-testing` for Python implementation and pytest coverage
29- `pytorch-patterns` for deep learning models, data loaders, device handling, and training loops
30- `eval-harness` and `ai-regression-testing` for promotion gates and agent-assisted regression checks
31- `database-migrations`, `postgres-patterns`, and `clickhouse-io` for data storage and analytics surfaces
32- `deployment-patterns`, `docker-patterns`, and `security-review` for serving, secrets, containers, and production hardening
3334## Reuse the SWE Surface
3536Do not treat MLE as separate from software engineering. Most ECC SWE workflows apply directly to ML systems, often with stricter failure modes:
3738The recommended `minimal --with capability:machine-learning` install keeps the core agent surface available alongside this skill. For skill-only or agent-limited harnesses, pair `skill:mle-workflow` with `agent:mle-reviewer` where the target supports agents.
3940| SWE surface | MLE use |
41|-------------|---------|
42| `product-capability` / `architecture-decision-records` | Turn model work into explicit product contracts and record irreversible data, model, and rollout choices |
43| `repo-scan` / `codebase-onboarding` / `code-tour` | Find existing training, feature, serving, eval, and monitoring paths before introducing a parallel ML stack |
44| `plan` / `feature-dev` | Scope model changes as product capabilities with data, eval, serving, and rollback phases |
45| `tdd-workflow` / `python-testing` | Test feature transforms, split logic, metric calculations, artifact loading, and inference schemas before implementation |
46| `code-reviewer` / `mle-reviewer` | Review code quality plus ML-specific leakage, reproducibility, promotion, and monitoring risks |
47| `build-fix` / `pr-test-analyzer` | Diagnose broken CI, flaky evals, missing fixtures, and environment-specific model or dependency failures |
48| `quality-gate` / `test-coverage` | Require automated evidence for transforms, metrics, inference contracts, promotion gates, and rollback behavior |
49| `eval-harness` / `verification-loop` | Turn offline metrics, slice checks, latency budgets, and rollback drills into repeatable gates |
50| `ai-regression-testing` | Preserve every production bug as a regression: missing feature, stale label, bad artifact, schema drift, or serving mismatch |
51| `api-design` / `backend-patterns` | Design prediction APIs, batch jobs, idempotent retraining endpoints, and response envelopes |
52| `database-migrations` / `postgres-patterns` / `clickhouse-io` | Version labels, feature snapshots, prediction logs, experiment metrics, and drift analytics |
53| `deployment-patterns` / `docker-patterns` | Package reproducible training and serving images with health checks, resource limits, and rollback |
54| `canary-watch` / `dashboard-builder` | Make rollout health visible with model-version, slice, drift, latency, cost, and delayed-label dashboards |
55| `security-review` / `security-scan` | Check model artifacts, notebooks, prompts, datasets, and logs for secrets, PII, unsafe deserialization, and supply-chain risk |
56| `e2e-testing` / `browser-qa` / `accessibility` | Test critical product flows that consume predictions, including explainability and fallback UI states |
57| `benchmark` / `performance-optimizer` | Measure throughput, p95 latency, memory, GPU utilization, and cost per prediction or retrain |
58| `cost-aware-llm-pipeline` / `token-budget-advisor` | Route LLM/embedding workloads by quality, latency, and budget instead of defaulting to the largest model |
59| `documentation-lookup` / `search-first` | Verify current library behavior for model serving, feature stores, vector DBs, and eval tooling before coding |
60| `git-workflow` / `github-ops` / `opensource-pipeline` | Package MLE changes for review with crisp scope, generated artifacts excluded, and reproducible test evidence |
61| `strategic-compact` / `dmux-workflows` | Split long ML work into parallel tracks: data contract, eval harness, serving path, monitoring, and docs |
6263## Ten MLE Task Simulations
6465Use these simulations as coverage checks when planning or reviewing MLE work. A strong MLE workflow should reduce each task to explicit contracts, reusable SWE surfaces, automated evidence, and a reviewable artifact.
6667| ID | Common MLE task | Streamlined ECC path | Required output | Pipeline lanes covered |
68|----|-----------------|----------------------|-----------------|------------------------|
69| MLE-01 | Frame an ambiguous prediction, ranking, recommender, classifier, embedding, or forecast capability | `product-capability`, `plan`, `architecture-decision-records`, `mle-workflow` | Iteration Compact naming who cares, decision owner, success metric, unacceptable mistakes, assumptions, constraints, and first experiment | product contract, stakeholder loss, risk, rollout |
70| MLE-02 | Define metric goals, labels, data sources, and the mistake budget | `repo-scan`, `database-reviewer`, `database-migrations`, `postgres-patterns`, `clickhouse-io` | Data and metric contract with entity grain, label timing, label confidence, feature timing, point-in-time joins, split policy, and dataset snapshot | data contract, metric design, leakage, reproducibility |
71| MLE-03 | Build a baseline model and scoring path before adding complexity | `tdd-workflow`, `python-testing`, `python-patterns`, `code-reviewer` | Baseline scorer with confusion matrix, calibration notes, latency/cost estimate, known weaknesses, and tests for score shape and determinism | baseline, scoring, testing, serving parity |
72| MLE-04 | Generate features from hypotheses about what separates outcomes | `python-patterns`, `pytorch-patterns`, `docker-patterns`, `deployment-patterns` | Feature plan and transform module covering signal source, missing values, outliers, correlations, leakage checks, and train/serve equivalence | feature pipeline, leakage, training, artifacts |
73| MLE-05 | Tune thresholds, configs, and model complexity under tradeoffs | `eval-harness`, `ai-regression-testing`, `quality-gate`, `test-coverage` | Threshold/config report comparing precision, recall, F1, AUC, calibration, group slices, latency, cost, complexity, and acceptable error classes | evaluation, threshold, promotion, regression |
74| MLE-06 | Run error analysis and turn mistakes into the next experiment | `eval-harness`, `ai-regression-testing`, `mle-reviewer`, `silent-failure-hunter` | Error cluster report for false positives, false negatives, ambiguous labels, stale features, missing signals, and bug traces with lessons captured | error analysis, bug trace, iteration, regression |
75| MLE-07 | Package a model artifact for batch or online inference | `api-design`, `backend-patterns`, `security-review`, `security-scan` | Versioned artifact bundle with preprocessing, config, dependency constraints, schema validation, safe loading, and PII-safe logs | artifact, security, inference contract |
76| MLE-08 | Ship online serving or batch scoring with feedback capture | `api-design`, `backend-patterns`, `e2e-testing`, `browser-qa`, `accessibility` | Prediction endpoint or batch job with response envelope, timeout, batching, fallback, model version, confidence, feedback logging, and product-flow tests | serving, batch inference, fallback, user workflow |
77| MLE-09 | Roll out a model with shadow traffic, canary, A/B test, or rollback | `canary-watch`, `dashboard-builder`, `verification-loop`, `performance-optimizer` | Rollout plan naming traffic split, dashboards, p95 latency, cost, quality guardrails, rollback artifact, and rollback trigger | deployment, canary, rollback |
78| MLE-10 | Operate, debug, and refresh a production model after launch | `silent-failure-hunter`, `dashboard-builder`, `mle-reviewer`, `doc-updater`, `github-ops` | Observation ledger and refresh plan with drift checks, delayed-label health, alert owners, runbook updates, retrain criteria, and PR evidence | monitoring, incident response, retraining |
7980## Iteration Compact
8182Before touching model code, compress the work into one reviewable artifact. This should be short enough to fit in a PR description and precise enough that another engineer can challenge the tradeoffs.
8384```text
85Goal:
86Who cares:
87Decision owner:
88User or system action changed by the model:
89Success metric:
90Guardrail metrics:
91Mistake budget:
92Unacceptable mistakes:
93Acceptable mistakes:
94Assumptions:
95Constraints:
96Labels and data snapshot:
97Baseline:
98Candidate signals:
99Threshold or config plan:
100Eval slices:
101Known risks:
102Next experiment:
103Rollback or fallback:
104```
105106This compact is the MLE equivalent of a strong SWE design note. It keeps the team from optimizing a metric no one trusts, adding features that do not address the real error mode, or shipping complexity without a rollback.
107108## Decision Brain
109110Use this loop whenever the task is ambiguous, high-impact, or metric-heavy:
1111121. Start from the decision, not the model. Name the action that changes downstream behavior.
1132. Name who cares and why. Different stakeholders pay different costs for false positives, false negatives, latency, compute spend, opacity, or missed opportunities.
1143. Convert ambiguity into hypotheses. Ask what signal would separate outcomes, what evidence would disprove it, and what simple baseline should be hard to beat.
1154. Research prior art or a nearby known problem before inventing a bespoke system.
1165. Score choices with `(probability, confidence) x (cost, severity, importance, impact)`.
1176. Consider adversarial behavior, incentives, selective disclosure, distribution shift, and feedback loops.
1187. Prefer the simplest change that reduces the most important mistake. Simplicity is not laziness; it is a way to minimize blunders while preserving iteration speed.
1198. Capture the decision, evidence, counterargument, and next reversible step.
120121## Metric and Mistake Economics
122123Choose metrics from failure costs, not habit:
124125- Use a confusion matrix early so the team can discuss concrete false positives and false negatives instead of abstract accuracy.
126- Favor precision when the cost of an incorrect positive decision dominates.
127- Favor recall when the cost of a missed positive dominates.
128- Use F1 only when the precision/recall tradeoff is genuinely balanced and explainable.
129- Use AUC or ranking metrics when ordering quality matters more than a single threshold.
130- Track latency, throughput, memory, and cost as first-class metrics because they shape feasible model complexity.
131- Compare against a baseline and the current production model before celebrating an offline gain.
132- Treat real-world feedback signals as delayed labels with bias, lag, and coverage gaps; do not treat them as ground truth without analysis.
133134Every metric choice should state which mistake it makes cheaper, which mistake it makes more likely, and who absorbs that cost.
135136## Data and Feature Hypotheses
137138Features should come from a theory of separation:
139140- Text, categorical fields, numeric histories, graph relationships, recency, frequency, and aggregates are candidate signal families, not automatic features.
141- For every feature family, state why it should separate outcomes and how it could leak future information.
142- For noisy labels, consider adjudication, label confidence, soft targets, or confidence weighting.
143- For class imbalance, compare weighted loss, resampling, threshold movement, and calibrated decision rules.
144- For missing values, decide whether absence is informative, imputable, or a reason to abstain.
145- For outliers, decide whether to clip, bucket, investigate, or preserve them as rare but important signal.
146- For correlated features, check whether they are redundant, unstable, or proxies for unavailable future state.
147148Do not add model complexity until error analysis shows that the baseline is failing for a reason additional signal or capacity can plausibly fix.
149150## Error Analysis Loop
151152After each baseline, training run, threshold change, or config change:
1531541. Split mistakes into false positives, false negatives, abstentions, low-confidence cases, and system failures.
1552. Cluster errors by shared traits: language, entity type, source, time, geography, device, sparsity, recency, feature freshness, label source, or model version.
1563. Separate model mistakes from data bugs, label ambiguity, product ambiguity, instrumentation gaps, and serving mismatches.
1574. Trace each major cluster to one of four moves: better labels, better features, better threshold/config, or better product fallback.
1585. Preserve every important mistake as a regression test, eval slice, dashboard panel, or runbook entry.
1596. Write the next iteration as a falsifiable experiment, not a vague "improve model" task.
160161The strongest MLE loop is not train -> metric -> ship. It is mistake -> cluster -> hypothesis -> experiment -> evidence -> simpler system.
162163## Observation Ledger
164165Keep a compact decision and evidence trail beside the code, PR, experiment report, or runbook:
166167```text
168Iteration:
169Change:
170Why this mattered:
171Metric movement:
172Slice movement:
173False positives:
174False negatives:
175Unexpected errors:
176Decision:
177Tradeoff accepted:
178Lesson captured:
179Regression added:
180Debt created:
181Next iteration:
182```
183184Use the ledger to make model work cumulative. The goal is for each iteration to make the next decision easier, not merely to produce another artifact.
185186## Core Workflow
187188### 1. Define the Prediction Contract
189190Capture the product-level contract before writing model code:
191192- Prediction target and decision owner
193- Input entity, output schema, confidence/calibration fields, and allowed latency
194- Batch, online, streaming, or hybrid serving mode
195- Fallback behavior when the model, feature store, or dependency is unavailable
196- Human review or override path for high-impact decisions
197- Privacy, retention, and audit requirements for inputs, predictions, and labels
198199Do not accept "improve the model" as a requirement. Tie the model to an observable product behavior and a measurable acceptance gate.
200201### 2. Lock the Data Contract
202203Every ML task needs an explicit data contract:
204205- Entity grain and primary key
206- Label definition, label timestamp, and label availability delay
207- Feature timestamp, freshness SLA, and point-in-time join rules
208- Train, validation, test, and backtest split policy
209- Required columns, allowed nulls, ranges, categories, and units
210- PII or sensitive fields that must not enter training artifacts or logs
211- Dataset version or snapshot ID for reproducibility
212213Guard against leakage first. If a feature is not available at prediction time, or is joined using future information, remove it or move it to an analysis-only path.
214215### 3. Build a Reproducible Pipeline
216217Training code should be runnable by another engineer without hidden notebook state:
218219- Use typed config files or dataclasses for all hyperparameters and paths
220- Pin package and model dependencies
221- Set random seeds and document any nondeterministic GPU behavior
222- Record dataset version, code SHA, config hash, metrics, and artifact URI
223- Save preprocessing logic with the model artifact, not separately in a notebook
224- Keep train, eval, and inference transformations shared or generated from one source
225- Make every step idempotent so retries do not corrupt artifacts or metrics
226227Prefer immutable values and pure transformation functions. Avoid mutating shared data frames or global config during feature generation.
228229```python
230import hashlib
231from dataclasses import dataclass
232from pathlib import Path
233234235@dataclass(frozen=True)
236class TrainingConfig:
237 dataset_uri: str
238 model_dir: Path
239 seed: int
240 learning_rate: float
241 batch_size: int
242243244def artifact_name(config: TrainingConfig, code_sha: str) -> str:
245 config_key = f"{config.dataset_uri}:{config.seed}:{config.learning_rate}:{config.batch_size}"
246 config_hash = hashlib.sha256(config_key.encode("utf-8")).hexdigest()[:12]
247 return f"{code_sha[:12]}-{config_hash}"
248```
249250### 4. Evaluate Before Promotion
251252Promotion criteria should be declared before training finishes:
253254- Baseline model and current production model comparison
255- Primary metric aligned to product behavior
256- Guardrail metrics for latency, calibration, fairness slices, cost, and error concentration
257- Slice metrics for important cohorts, geographies, devices, languages, or data sources
258- Confidence intervals or repeated-run variance when metrics are noisy
259- Failure examples reviewed by a human for high-impact models
260- Explicit "do not ship" thresholds
261262```python
263PROMOTION_GATES = {
264 "auc": ("min", 0.82),
265 "calibration_error": ("max", 0.04),
266 "p95_latency_ms": ("max", 80),
267}
268269270def assert_promotion_ready(metrics: dict[str, float]) -> None:
271 missing = sorted(name for name in PROMOTION_GATES if name not in metrics)
272 if missing:
273 raise ValueError(f"Model promotion metrics missing required gates: {missing}")
274275 failures = {
276 name: value
277 for name, (direction, threshold) in PROMOTION_GATES.items()
278 for value in [metrics[name]]
279 if (direction == "min" and value < threshold)
280 or (direction == "max" and value > threshold)
281 }
282 if failures:
283 raise ValueError(f"Model failed promotion gates: {failures}")
284```
285286Use offline metrics as gates, not guarantees. When the model changes product behavior, plan shadow evaluation, canary rollout, or A/B testing before full rollout.
287288### 5. Package for Serving
289290An ML artifact is production-ready only when the serving contract is testable:
291292- Model artifact includes version, training data reference, config, and preprocessing
293- Input schema rejects invalid, stale, or out-of-range features
294- Output schema includes model version and confidence or explanation fields when useful
295- Serving path has timeout, batching, resource limits, and fallback behavior
296- CPU/GPU requirements are explicit and tested
297- Prediction logs avoid PII and include enough identifiers for debugging and label joins
298- Integration tests cover missing features, stale features, bad types, empty batches, and fallback path
299300Never let training-only feature code diverge from serving feature code without a test that proves equivalence.
301302### 6. Operate the Model
303304Model monitoring needs both system and quality signals:
305306- Availability, error rate, timeout rate, queue depth, and p50/p95/p99 latency
307- Feature null rate, range drift, categorical drift, and freshness drift
308- Prediction distribution drift and confidence distribution drift
309- Label arrival health and delayed quality metrics
310- Business KPI guardrails and rollback triggers
311- Per-version dashboards for canaries and rollbacks
312313Every deployment should have a rollback plan that names the previous artifact, config, data dependency, and traffic-switch mechanism.
314315## Review Checklist
316317- [ ] Prediction contract is explicit and testable
318- [ ] Data contract defines entity grain, label timing, feature timing, and snapshot/version
319- [ ] Leakage risks were checked against prediction-time availability
320- [ ] Training is reproducible from code, config, data version, and seed
321- [ ] Metrics compare against baseline and current production model
322- [ ] Slice metrics and guardrails are included for high-risk cohorts
323- [ ] Promotion gates are automated and fail closed
324- [ ] Training and serving transformations are shared or equivalence-tested
325- [ ] Model artifact carries version, config, dataset reference, and preprocessing
326- [ ] Serving path validates inputs and has timeout, fallback, and rollback behavior
327- [ ] Monitoring covers system health, feature drift, prediction drift, and delayed labels
328- [ ] Sensitive data is excluded from artifacts, logs, prompts, and examples
329330## Anti-Patterns
331332- Notebook state is required to reproduce the model
333- Random split leaks future data into validation or test sets
334- Feature joins ignore event time and label availability
335- Offline metric improves while important slices regress
336- Thresholds are tuned on the test set repeatedly
337- Training preprocessing is copied manually into serving code
338- Model version is missing from prediction logs
339- Monitoring only checks service uptime, not data or prediction quality
340- Rollback requires retraining instead of switching to a known-good artifact
341342## Output Expectations
343344When using this skill, return concrete artifacts: data contract, promotion gates, pipeline steps, test plan, deployment plan, or review findings. Call out unknowns that block production readiness instead of filling them with assumptions.
345346---
347348**Source:** [`affaan-m/ECC`](https://github.com/affaan-m/ECC) → `skills/mle-workflow/SKILL.md`
349350**Also appears in:** `affaan-m/ECC/.kiro/skills/mle-workflow/SKILL.md`, `affaan-m/ECC/.agents/skills/mle-workflow/SKILL.md`
Run npx skillmds add thedixitjain/mle-workflow in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Production machine-learning engineering workflow for data contracts, reproducible training, model evaluation, deployment, monitoring, and rollback. Use when building, reviewing, or hardening ML systems beyond one-off notebooks. It is listed under DevOps & Infra on SkillMD.
This skill has not completed SkillMD's automated safety review yet. Capability flags: makes network calls, reads secrets. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
thedixitjain (@thedixitjain) published this skill. Their other Agent Skills are listed on their SkillMD profile.