Parts list: projects

Thirteen end-to-end projects: agent systems and LLM workflows, forecasting, machine learning, NLP, computer vision, reinforcement learning, and BI. Every metric below is reproducible from the linked repositories, or demonstrable online; three projects are deployed.

Pos.DesignationKey metricStackStatus
01Arkon Manufacturing AIML models 7XGBoost · PyTorch · n8n · Langflow · TableauLive
02AI-Brain Agent Systemscheduled workflows 19Claude Code · Codex · n8n · PythonPrivate
03FreshMart Demand PlannerRMSE 138.0Python · MLflow · StreamlitDemo
04Predictive Maintenance: Fleet Risk & CostPR-AUC 0.902XGBoost · SHAP · SQLGitHub
05AI Order Triage Agentanswer key 30/30n8n · Gemini · AirtableGitHub
06Retail KPI Dashboardmonths 48Tableau · LODLive
07Neuron Platformer RLheld-out success 80%PyTorch · Stable-Baselines3GitHub
08FX Random Walk Benchmarkerror explained r = 0.97Python · statsmodels · XGBoostGitHub
09CIFAR-10 Transfer Learning Studyaccuracy 82.7%TensorFlow · ResNet50GitHub
10NLP: Disaster Tweets Classificationaccuracy 0.819scikit-learn · DistilBERTGitHub
11Car Price Estimatormedian error 11.9%Python · XGBoostGitHub
12IATF Quality Report Promptno invented figures 7/7Claude · Python stdlibGitHub
13TravelTide: Customer Segmentationusers 5,998SQL · DatabricksGitHub
Pos. 01 · Jul–Sep 2026 Live
Screenshot of the Arkon Quality Steering Cell Executive view on Tableau Public, as of 6 Sep 2026 16:12 on the plant clock: the status sentence (20 of 50 open incidents open more than three days, the 6 raised in the last hour worked inside window), four KPI cards (overdue 14 of 50 open, 28 percent; open 50 with 169 raised, 113 closed and 6 resolved; time to acknowledge 48.7 min median against a window of 15 min for P1 and 60 min for P2; time to close 144.1 min median over 113 closed), open incidents by age band stacked by priority with the part past its window in red, the six slowest acknowledgements as a multiple of each incident's own window, and the six most recent transitions with who acted
Fig. 01Executive view on Tableau Public, as of 2026-09-06 16:12 · captured 2026-09-06

Arkon Manufacturing AI

An Industry 4.0 quality platform for a fictional heavy manufacturer, deployed on a NAS and running. Seven machine-learning models on real public datasets (remaining useful life of test engines, fleet fault classification, four kinds of visual inspection, a text model over consumer complaints) publish one twelve-field risk event, so nothing downstream knows which model spoke. A Quality Steering Cell on n8n validates the contract, suppresses repeats, writes an append-only incident store, assigns by department and puts a Telegram card in front of a named person for a P1 or P2. A Streamlit cockpit is the only surface that moves an incident; a Langflow assistant answers why, grounded in ten documents and the live store, and hands the operator a filled form instead of signing it, so the response-time KPI still measures the plant and not the agent. Two agents face opposite ways: the Langflow assistant inward, to the plant, and an n8n Customer Quality Desk outward, to the customer, which answers an OEM asking after a quality notice by its reference. They meet in exactly one file and the traffic runs one way: eight customer-safe fields out for one reference, no write endpoint back, and a guardrail in front of the desk and a sanitizer behind it. A live emitter raises a real re-timed incident every eight to twelve minutes and a simulated crew works it. The executive view is a Tableau workbook generated as XML from the same status API and published on Tableau Public.

ML models on public datasets 7 AI agents, facing opposite ways 2 n8n workflows deployed 12 tests in CI 203
XGBoostPyTorchn8nLangflowStreamlitTableau

Both agents answered as live demos on the internet until 15 September 2026, behind a login and on a temporary OpenRouter key that ends in mid-September 2026. Both public routes are closed now; the repository README shows screenshots of each agent at work, and the two Tableau views need no key at all. The plant, its crew and the incident stream are simulated and labelled so; the models, the datasets, every timestamp and the n8n, Langflow, Streamlit and Tableau layers are real.

Pos. 02 · since Jun 2026
Screenshot of the Vault Mission Control board, worker grid only: 25 tiles, each with the worker name, its schedule, last run, 30-day run history and status; WARN states shown as found
Fig. 02Mission Control, the live status board · captured 2026-09-03

AI-Brain Agent System

A job search, a full-time data programme and a set of personal admin domains all generate the same shape of recurring work: gather from a source, deduplicate against history, judge each item, write the result to the right file, and lose nothing between sessions. Doing it by hand does not scale, and handing it wholesale to a chat assistant fails differently: an assistant has no memory between sessions, will redo work that is already done, and will produce a plausible answer rather than report that it could not get one. So the design question was never "can an agent do this" but "how do you stop it from silently doing the wrong thing". The answer is four rules that everything else follows from. Every recurring job names exactly one scheduled owner and one canonical output path, because several agents write the same files with no database lock. A deterministic Python layer does the fetching, parsing, deduplication and writing, and the model is handed only the judgement that actually needs judgement. Verification gates can fail a run: separate checks assert that every identifier claimed in a report exists in the registry and the archive, that no encoding corruption shipped, that generated PDFs are machine-readable in the right order, that no document claims a skill the source-of-truth file does not carry, and that the prose does not read like a template. And the watchdog runs on a machine that cannot fail together with the machine it watches, because a watchdog sharing fate with its subject reports nothing exactly when it matters. The failure modes are the real result and each one was found by running the thing: fabricated metrics offered as interview material, a drafting agent absorbing the source document's vocabulary into a description of the candidate, and the class no gate catches at all, where a documented method is escalated by the verb rather than the noun. That last one is written down as a stated limit, not as a solved problem.

scheduled workflows 19 LLM runtimes on one rule set 3 verification gates 5
Claude CodeCodexGeminin8nPythonlaunchd

No public repository: the system operates a private vault. Designed, specified and operated by me; the code was written largely with AI assistance. Demonstrable live by screen share.

Pos. 03 · Apr–May 2026 Demo · wakes in ~30 s
Screenshot of the FreshMart Demand Planner Streamlit app after Generate forecast: five KPI tiles (total forecasted sales 6,779, average daily 484, peak day 2014-01-05, peak sales 768, demand level high) above a line chart of recent sales and the 14-day forecast
Fig. 03Streamlit app, forecast screen · captured 2026-09-03

FreshMart Demand Planner

End-to-end retail demand forecasting: EDA, feature engineering, 10+ models compared (SARIMAX, Prophet, XGBoost, LSTM), HyperOpt tuning, and MLflow experiment tracking. Deployed as a Streamlit planning tool that speaks the language of store managers: total demand, peak day, average daily forecast.

champion RMSE 138.0 MAE 93.1 models 10+
PythonTimeSeriesXGBoostMLflowStreamlit
Pos. 04 · Apr–May 2026
Horizontal bar chart of the 20 most important features by mean absolute SHAP value; Brake_Condition dominates at about 2.8, every other feature is below 0.2
Fig. 04Mean |SHAP| feature importance, XGBoost · repository figure

Predictive Maintenance: Fleet Risk & Cost

Three business questions answered on a 92,000-row logistics fleet dataset: which vehicles need maintenance (classification), what it will cost (regression), and how to segment the fleet by risk (clustering). SHAP analysis identified brake condition as the dominant failure predictor, exactly what 17 years in vehicle engineering would suggest.

PR-AUC 0.902 0.885 rows 92k
PythonXGBoostSHAPSQLClustering
Pos. 05 · Jul 2026
n8n canvas excerpt: Assemble Order Context, the Volta Order Classifier Agent with Gemini as its model, Parse Agent Classification, a Switch routing to Standard, Needs Review and Needs Clarification, each branch logging to Airtable and notifying via Gmail draft or Slack
Fig. 05n8n workflow, decision zone · repository screenshot

AI Order Triage Agent

A 26-node n8n workflow that triages free-text wholesale orders in English and Portuguese. Deterministic Airtable lookups gather every fact first; one bounded LLM agent makes the single call a rule cannot express; logic routes and logs every order, and a human stays the sender: the workflow never contacts a customer. Across three runs of each of the ten sample orders, all 30 recorded classifications matched the reference answer key, and no input ever produced two different classifications. Built on a fictional wholesale case, Volta Coffee Roasters in Porto.

answer-key match 30 / 30 AI steps 2 of 8 nodes 26
n8nGeminiAirtableSlackGmail API
Pos. 06 · Feb 2026 Live
Screenshot of the Retail KPI Dashboard on Tableau Public: four KPI tiles with sparklines (quantity 37,873, sales 2,297,355 dollars, profit 286,347 dollars, average discount 15.62 percent), a top and bottom five products by profit table, a US map of regional profit by product category, and region, year and category filters
Fig. 06Tableau Public, Main Dashboard · captured 2026-09-03

Retail KPI Dashboard

Interactive Tableau dashboard tracking sales, profit, discount, and orders with drill-downs by region, product category, and time. LOD expressions and dashboard actions give non-technical users self-service analysis, the same logic as a quality trend board in a plant.

rows ~10k months 48 states 49
TableauLODDashboardActions
Pos. 07 · Jul–Aug 2026
Two rows of three panels: the rendered level, the 84x84 stacked-frame CNN input, and the Grad-CAM attention map highlighting platform edges and gaps
Fig. 07Grad-CAM saliency on held-out levels · repository figure

Neuron Platformer RL

Reinforcement learning demos usually run inside somebody else's environment, which hides the hard parts: reward design, observation design, and whether the task is solvable at all. Here the whole stack is built, including a level generator whose every gap is capped by the exact jump physics and an audit that re-proves solvability across 1,200 seeds. Then the real question: an agent reading raw 84x84 pixels, with no coordinates, velocities or object lists, beats the hand-crafted state-vector baseline 80% to 64% at equal training budget on 200 held-out levels, and a difficulty curriculum carries it to 52% medium and 55% hard. Grad-CAM shows where it looks: platform edges before a jump, the gap, the enemy. A fourth phase replaces the frame stack with an LSTM reading one frame at a time: recurrence does learn the game, but lands behind the frame stack on every tier - 29.5% medium against the curriculum's 52%. Getting these numbers honest took four extra experiments: doubling the LSTM's budget refuted the write-up's own excuse (typical performance rose, the peak did not), a noise analysis showed a 30-episode evaluation is worth about plus or minus 14 points, and a 200-seed re-measurement of all four models replaced every headline figure - the state baseline's published 50% was really 27% - and a budget control a month later showed the baseline had trained on a fifth of the pixel agent's steps: at equal budget it reads 64%, and the headline gap shrank from 53 points to 16. The write-up was rewritten rather than left flattering, twice.

pixel agent 80% state baseline 64% impossible transitions 0 of 11,619
PythonPyTorchStable-Baselines3GymnasiumGrad-CAM
Pos. 08 · Jul 2026
Bar chart of every model's RMSE divided by the naive RMSE for CNY and SGD per USD at horizons 1 and 5; the line at 1.0 is the random walk and no model sits below it
Fig. 08RMSE ratio to the random walk, horizons 1 and 5 · repository figure

FX Random Walk Benchmark

A banking brief asked for an exchange-rate forecaster. The project asked the question the brief did not: compared to what? Twenty years of daily SGD/USD and CNY/USD, the naive "tomorrow equals today" baseline built first, then ARIMA, SARIMA and gradient boosting scored against it across 42,924 walk-forward forecasts. Not one beat the baseline at any significance level, AIC selected ARIMA(0,1,0), which is the random walk itself, and a purpose-built move_ratio measure explains every model's error at r = 0.97. The no-leakage claim is not an assurance but a mechanical proof: rewrite every observation after the cut date and the earlier features must come back byte-identical.

walk-forward forecasts 42,924 models beating naive 0 error explained r = 0.97
PythonstatsmodelsXGBoostDiebold-MarianoBacktesting
Pos. 09 · May 2026
Bar chart of four runs: baseline 10K 66.0 percent, best 10K 76.9 percent, baseline 50K 76.4 percent, best 50K 82.7 percent, with training times from 2 min 43 s to 14 min 27 s and the 10 percent random baseline as a dashed line
Fig. 09Ablation: test accuracy and training time · repository figure

CIFAR-10 Transfer Learning Study

A controlled ablation study with ResNet50: isolating the impact of dataset size, augmentation, learning-rate scheduling, and partial unfreezing, tested individually and combined. Grad-CAM visualizations show what the model actually attends to. The same mechanism drives automated visual inspection in manufacturing.

accuracy 66% → 82.7% images 60k
TensorFlowKerasResNet50GradCAM
Pos. 10 · Jun 2026
Two bar charts of the tuned logistic regression: words pushing toward disaster (hiroshima, fire, wildfire, kill, storm) and words pushing toward not disaster (upheaval, traumatise, love); held-out test split of 1,523 tweets
Fig. 10Largest logistic-regression coefficients · repository figure

NLP: Disaster Tweets Classification

Does a tweet report a real disaster, or is "this album is fire" just slang? I shipped an interpretable TF-IDF + Logistic Regression classifier and stress-tested it against a from-scratch CNN and a fine-tuned DistilBERT. The explainable model won the trade-off: every flagged tweet can be defended word by word, which matters more than the last two points of accuracy.

accuracy 0.819 Kaggle public 0.791 DistilBERT bench 0.839
Pythonscikit-learnNLTKPyTorchDistilBERT
Pos. 11 · Jul 2026
Horizontal bar chart titled What the model leans on: share of total permutation importance per feature, age 62.5 percent, make 9.9, volume 9.4, segment 7.6, model 4.5, mileage 2.2, fuel type 1.6, transmission 1.4, drive unit 0.8, color 0.2
Fig. 11Permutation importance per feature · repository figure

Car Price Estimator

A pricing tool that returns a calibrated price range instead of a single number, built on 56,244 used-car listings. Two of the three required model families lost to a dealer-style lookup table; XGBoost won, and its real gain sits on cars the lookup has never seen: 46% better. The finding worth arguing about after 17 years in automotive: mileage barely predicts price once age is known, at 2.2% of permutation importance against 62.5% for age.

median error 11.9% lookup baseline 13.3% MAE $1,016
PythonpandasXGBoostConformal prediction
Pos. 12 · Jul 2026
PowerShell window listing seven report files, each with verdict PASS, the number of gap markers found and the sections they were marked in, ending with 7 of 7 passed
Fig. 12Marker checker run, 7 of 7 passed · repository screenshot

IATF Quality Report Prompt

Can a language model be stopped from filling a gap in a controlled record? A three-zone prompt drafts German ISO 9001 / IATF 16949 quality reports and is forbidden to derive any figure it was not given: in a QMS record a derived figure is an audit finding even when the arithmetic is right. A negative-control test withheld one figure and left both operands in as bait. No run computed it; the gap marker appeared in both required places in only 5 of 7 runs, and that weaker number is published as found, prompt deliberately unfixed.

no invented figures 7 of 7 runs gap marked twice 5 of 7 own defects published 3
Claude Opus 5Prompt engineeringTest designPython
Pos. 13 · Mar–Apr 2026
Bar chart of user counts per rule-based segment: exclusive discounts about 1,390, free hotel meal about 1,260, no cancellation fees about 1,250, free hotel night with flight about 1,130, free checked bag about 970
Fig. 13Rule-based segment sizes · notebook output

TravelTide: Customer Segmentation

Retention targeting for a travel platform: a SQL pipeline in Databricks aggregated 49,211 sessions into 30+ behavioral features for 5,998 users, then a rule-based perk-fit score assigned each user the most relevant reward. K-Means and DBSCAN served as benchmarks; the interpretable approach won on stability and deployment readiness.

users 5,998 segments 5 balanced features 30+
SQLSparkSQLDatabricksPython

More projects and work in progress on GitHub and Tableau Public.

Want the story behind these projects?

17 years of automotive engineering shaped how I approach every dataset: root cause first, business impact second, tooling third.

Metrics reproduciblefrom linked repositories