What you see
I work with companies that have poured money into AI and got very little back. The kit looks promising on a slide deck. Day to day, it is often brittle scripts, odd outputs, slow responses, and cloud bills that nobody enjoys signing off.
Common log lines and errors I see:
Model inference time exceeded threshold: 1200ms > 300ms— expected under 300ms, actual 1,200ms.Permission denied: SELECT on table customer_pii— expected read access, actual 403.HTTP 500 from /v1/predict— expected 200 with JSON payload, actual 500 and stack trace.
Diagnostics I run first:
curl -s -w "%{http_code}" -o /tmp/resp.json http://model:8080/predict— expected 200, actual 500.kubectl logs deployment/model-server --since=1h | tail -n 50— look for memory OOMs.psql -c "dp customer_data"— expected role has SELECT, actual no grants.
The metric should be clear enough to argue about in a meeting: cost reduction, revenue increase, cycle time, or error rate. If an “enterprise AI” project does not affect one of those, it is a lab exercise wearing a production badge.
Where it happens
These failures turn up in a few places more than others.
Areas of failed deployment:
- Data pipelines. ETL jobs choke on schema drift and lose context.
- Model serving. Containers restart under load, or inference scales badly.
- Integration layer. APIs are undocumented or return changing shapes.
Departments that struggle:
- Customer operations. Chatbots give wrong advice or hallucinate.
- Finance. Forecasts are noisy and ignored.
- Sales. Lead scoring models bias decisions without transparency.
Project types that fail most often:
- Large platform builds without a clear first use case.
- Proofs of concept that never get past a demo.
- Vendor-led rollouts where the tool cannot reach core data.
One example I have seen: a fraud model pushed to production with no shadow testing. Expected false positive rate was 2%; actual was 12%. Log: alert: spike in FPR at 2025-01-10 09:12. Manual checks went up and costs followed.
Find the cause
Strip back the noise and the same three causes keep showing up.
Data access
Symptoms: models trained on subsets, missing labels, inconsistent timestamps.
Check:
SELECT count(*) FROM events WHERE event_time > now() - interval '30 days';
Compare that with ingestion logs.
Common fix: give the model read-only views or a secure data replica. Keep the schema stable and set a clear refresh cadence.
Talent gaps
Symptoms: ML code mixed with business rules, no clear owner, slow iterations.
Check the recent history of the repository and ask for a technical runbook.
git log -5 ml-repo
Remediation: hire a specialist or bring in a delivery engineer. Make the roles plain: who owns model drift, who owns infra.
Governance and oversight
Symptoms: no rollback plan, unclear SLAs, no accept/reject criteria.
Search the deployment scripts for rollback handling.
grep -R rollback deployment/
If it is missing, note it. Document acceptance criteria. Add a kill switch:
kubectl scale deployment/model-server --replicas=0
or flip the feature flag.
Another root cause example:
ps aux | grep model-server— expected a single process per pod, actual zombie processes.journalctl -u ingestion.service -n 200— expected steady logs, actual repeatedconnection refused.
The cause there was flaky access to the data lake from the model cluster. The fix was a read replica closer to compute, plus retries with exponential backoff.
Fix
Fixes need to be testable and timeboxed. I split the work into immediate patches, tactical stabilisation, and structural changes.
What helps:
- Narrow the objective. Pick one measure: lower average handle time, reduce false positives, increase conversion rate.
- Timebox it. Run a six-week sprint with a clear success test and a stop condition.
- Start small. If the simple approach works, scale it later.
Testing and validation methods:
- Shadow testing. Route live traffic to the model without affecting decisions. Compare decisions and log diffs.
- Canary releases. Route 5% of traffic, watch latency and error changes, then ramp up.
- Holdout evaluation. Keep a strict validation set and log model performance on it daily.
Example commands and expected output:
curl -s -X POST http://gateway/v1/predict -d @sample.json | jq '.score'— expected numeric score, actualnullpoints to an input mapping failure.kubectl rollout status deployment/model-server— expectedsuccessfully rolled out, actualtimed out.
Resource allocation matters too:
- Put money behind the person who owns the outcome, not the platform for the sake of it.
- Give engineers time for observability. Add request latency, model AUC, and data freshness lag.
- Use partners where skills are missing. Buy delivery capacity, not promises.
Check it is fixed
Verification prevents surprises.
Post-implementation reviews:
- Run a 30/60/90-day review. Track the chosen measure and cost against baseline.
- Capture exact errors after launch. Example log:
i/o timeout contacting db-replicaand what fixed it.
Monitoring ongoing performance:
- Add dashboards for inference latency, error rate, model drift score, and data freshness.
- Set alerts with clear thresholds. Example: alert if 24h mean latency is more than 2x baseline or FPR rises by 50%.
Adjusting strategy from feedback:
- If the model fails in shadow but passes tests, reduce input variability and retrain with new examples.
- If cost rises without behaviour change, throttle batch jobs or reduce model size.
Checklist to close the loop:
- Confirm read access to key tables, run permission tests, and keep the output.
- Validate a canary run and record expected versus actual metrics.
- Archive decision logs for 90 days.
AI deployment usually falls over for boring reasons: bad data access, vague ownership, and weak validation. Pick one measurable outcome, give controlled data access, test in shadow, and set a hard stop. If the metric moves the right way and costs drop while revenue signals improve, the setup is working. If not, stop it.



