Hybrid ML + LLM product categorization
Pilot project for a Moldovan e-commerce marketplace · May 2026 – present
Supplier listings arrive in Romanian, Russian and English and have to land in the right leaf of a 3,520-category taxonomy. Six candidate sources, including a fine-tuned multilingual encoder, lexical matching and bge-m3 nearest neighbours, feed an MLP ranker with isotonic calibration. The calibrated score decides whether a row is assigned automatically, goes to a constrained LLM choice among the candidates, or goes to a person.
The taxonomy has duplicate leaves, so the metric counts any answer from the acceptable set. Gold labels came from blind LLM double labelling with adjudication, and the test set was fixed in advance and read once. At the automatic tier, 63.6% of rows go out at 95.5% precision.
Limits. The 84.8% is an in-supplier figure: without a supplier's own rows in the index, the ranker's top-1 on that supplier fell from 80.7% to 45.7%. On 300 rows from sources the system had never indexed it scores 79.0%, short of my target. It has been evaluated offline; deployment is not confirmed.
Python, PyTorch, Transformers, scikit-learn, ONNX Runtime, ROCm, bge-m3, OpenAI API, FastAPI, MariaDB, Docker
Agent-orchestrated delivery of a marketplace buyer app
Pilot project for a Moldovan multi-seller marketplace · May 2026 – present
A React Native / TypeScript buyer app built by two developers, now a release candidate. The app itself has no AI features; the AI is in how it was delivered. An orchestrator hands work to builder, API-contract-auditor and adversarial-reviewer subagents, each in its own git worktree. Across 26 tracked campaigns, 1,202 of 1,550 commits are co-authored with Claude Code.
One command runs type checks, lint, unit tests, import-cycle and translation-parity checks, then the Maestro flows on a fresh emulator. One audit found that the HTTP client's retry default could resend a checkout request after a network drop and duplicate an order; retries are now limited to idempotent requests and pinned by a test.
Limits. Not yet published in the app stores.
TypeScript, Expo / React Native, TanStack Query, Zustand, Jest, Maestro, EAS, Claude Code subagents
Supporting: agent harness and federated RAG
Personal tooling · May 2026 – present · github.com/malmurk/agent-ops-harness
The hooks, skills and retrieval I use to run the agents above. Federated retrieval over five knowledge bases, with bge-m3 embeddings served on my own GPU. On a 20-query evaluation with a Romanian/Russian subset, switching the embedding model and fixing a chunking bug took recall@1 from 0.467 to 0.733 and MRR from 0.598 to 0.771.