Sparli Aman · senior AI engineer · agentic systems & data pipelines

Agents are easy to demo. Running one in someone else’s production is a different job.

I build agents that take real actions in ad platforms, CRMs and phone systems, and the data pipelines they run on. Four years of that inside one SaaS product, Shurq, from idea stage to 200+ concurrent users.

7y client-side delivery clients in US · CA · UK · Gulf remote or relocation

Sparli Aman
sparli aman · remote or relocation

How my agents run in production

live loop · css only, zero js

task arrives cron · webhook · call agent proposes tools · context · plan pending_actions preview · audit row human approves then, only then: execute run · drafting a client status email from repo + tickets run · action queued: send_report → waiting for approval run · approved by human · executed · audit row written

01The pattern

Every system I build puts the irreversible action behind a human.

Not caution: asymmetry. You cannot recall a bad message to a customer, or unspend an ad budget. I have made this call three times, in three unrelated domains, without anyone asking me to.

Shurq
The progressive autonomy ladder I designed: read-only, then approval on every write, then earned autonomy under spend caps. Every action returns a preview requiring confirm_action, fully audited.
live ad spend
Croncore
The agent has no tool that sends. Proposed actions land in a pending_actions row and wait. The send path does not exist rather than being disabled.
client email
leadflow-agent
Public repo. The model can only propose HubSpot records; the code writes them, and only after a human approves. Every write goes to a ledger with one-command undo. github.com/Sparli/leadflow-agent
CRM writes

02Case studies

Three things that broke, and how they were found.

Client work under NDA, so these describe architecture and outcomes rather than source. The frames below are engineered for screen recordings; until those are exported, each shows the actual architecture, drawn and moving.

The agent hung up on people after four seconds

SEO SaaS, Canada · 2025

The prospect said “hello”. Speech-to-text, working on a noisy first packet, heard “no”, and a perfectly reasonable end-call rule did the rest. Two correct behaviours composing into a wrong one. The logs were structurally incapable of showing it: every line in them was correct. Found by listening to the recordings.

after 0 false hang-ups
Read the full write-up
replay · what the caller experienced connect noise “hello” → “no” end-call call terminated · 00:04 0s
recording slot · the drawn timeline is the real failure sequence

An agent with access to client inboxes that cannot send email

Croncore internal, daily production use · 2025

A prompt saying “always ask before sending” is a request, and its failure is silent. So the send capability does not exist: no tool emails a client, no tool posts to ClickUp. Proposed actions land in a table and wait for a human. The worst case stops being a wrong message to a customer and becomes a badly worded row that gets rejected.

today 0 code paths that send
Read the full write-up
replay · the approval queue pending_actions croncore/delivery draft: status report → client@… · awaiting approval ✓ approved by human · executed · audit row written
recording slot · the drawn queue is the real mechanism

A language no vendor served, and a PBX that could not change

Telephony, language services client · 2024

The client needed Mongolian speech in a running call flow. No commercial vendor offered it, and the telephony side was a live Asterisk/FreePBX install whose audio contract could not change: sample rate, encoding, timing, all fixed. I built and operated the serving stack; I did not train the models, and I will say which part was mine before you ask.

result nothing on the telephony side changed
Read the full write-up

A self-hosted FastAPI service running two off-the-shelf speech engines behind one interface, with fallback between them, producing audio that dropped straight into the existing call flow.

03Products

Products I build and run, not just demo.

Two live products with real users, and one public repo you can read line by line. Client work under NDA is in the case studies above.

Shurq
UK Amazon-analytics SaaS I joined at the idea stage, now a paid product with a 10+ person team, 200+ concurrent users and 21 marketplaces. I own the hourly data pipeline that turns Amazon sales, fee and ad data into true per-product profit. I led and built the MCP server (1,080 tools, 29 of them write actions, scoped API keys) and the AI Ad Manager, where nothing touches a live ad account without a rule or a human. The Shurq work in depth · shurq.com
lead engineer
Learning platform
Took a Québec EdTech client from raw requirements to two products, now in pilot: a learner platform that generates lessons and quizzes by grade, language and pace (with a paid tier on Stripe), and a role-based dashboard suite for schools, teachers and parents. Both EN/FR, data hosted in Canada. I designed both and built most of the core with a small team.
in pilot
leadflow-agent
A tool-using agent that turns a raw sales enquiry into de-duplicated HubSpot records. Pydantic-guarded tools, a human approval step before any write, a ledger with undo, cost per run, strict mypy and gitleaks in CI. github.com/Sparli/leadflow-agent
public repo

Shurq

The data and AI layer of a paid Amazon-analytics SaaS.

shurq · architecture DATA Amazon APIs SP-API · Ads API hourly pipeline sales · fees · ads profit data per product · 21 markets dashboards · alerts every number in the app ACTION Claude · ChatGPT Cursor · scoped keys MCP server 1,080 tools · 29 write AI Ad Manager rules · AI employees approval queue logged · reversible both read the same profit data only then: bid, budget and keyword writes go live 200+ concurrent users · 10+ person team joined at idea stage, July 2022
drawn from the live product · outlined in blue: the parts I own or led
Shurq's Ad Manager workflows screen, with an approval queue tab, a note that every write step asks the user first, and starter templates such as Bid Guardrails, ACOS ladder and Pause bleeders.
1/4 shurq · ad manager workflows: an approval queue, and every write step asks first
Shurq's AI Workforce screen. An AI employee card shows a trust score out of 100 and three autonomy modes, Observe, Co-pilot and Autopilot.
2/4 shurq · AI employees act alone only on Autopilot, at trust ≥ 70
Shurq Creative Studio's Image Builder: generate nine listing images plus copy for an ASIN, using real CTR and CVR from the niche, with claims checked before rendering.
3/4 shurq · creative studio: listing images from data, claims checked before rendering
The Shurq Data API reference, with an endpoint list, a Copy OpenAPI spec button and version notes.
4/4 shurq · the partner Data API, versioned with its own changelog

The Shurq work in depth, area by area

Bilingual AI learning platform

Québec EdTech client, in pilot. A learner app that generates lessons, quizzes and reflections, and role-based dashboards for school networks, schools, teachers and parents. Client name withheld at their request.

The learner dashboard in French: streak, XP, level, weekly goal, quiz submission and accuracy rates, and shortcuts to generate content, browse it and rate it.
1/6 learner app · dashboard in French: progress, streaks and AI generation in one place
The learner's content library: generated units across citizenship, science, maths and music, each with a lesson, a quiz and a reflection, in English or French.
2/6 learner app · every generated topic becomes a lesson, a quiz and a reflection
A generated secondary-level lesson on chemical reactions, with sections on core concepts and reaction types, and a PDF download.
3/6 learner app · a generated lesson, pitched to grade level, downloadable as PDF
A generated multiple-choice quiz on chemical reactions with six questions and four options each.
4/6 learner app · the matching quiz, generated from the same lesson
A teacher's class view with tabs for students, attendance, notes, assignments, quizzes and grades, listing each student's attendance, quiz submission and score.
5/6 school dashboards · a teacher's class view, demo data
A school service centre's network dashboard with totals for schools, teachers and students and a table of schools with attendance, assignment and quiz averages.
6/6 school dashboards · the school-network view for a service centre, demo data

04Method

Measure on the real path, not the benchmark

I moved a production voice agent between models because latency on live calls was too high, not because of a leaderboard. Same instinct: stress-testing to 200+ concurrent users before release, not after.

The gate is architecture, not a prompt

A system prompt is a request. A missing code path is a guarantee. When the failure is irreversible, I build the guarantee.

Compliance is part of the build

Dialling windows, DNC scrubbing, consent logging, CASL unsubscribe: built in-house, per jurisdiction, because the penalty lands on the client’s phone numbers.

Say what I did not do

I build, integrate, deploy and operate these systems. I do not train models, and where a project involved one I will tell you which part was mine.

05In production with

Twilio · Asterisk/FreePBX · Deepgram · ElevenLabs · Pipedrive · ClickUp · GitHub · Gmail · HubSpot · Amazon Ads & SP-API · BigQuery · MCP · Meta Ads · Google Places · Stripe. Each wired up and debugged in production, not read about.

06 · Colophon

This site is built the way I build client systems.

The claims above are the kind that should be checkable, so the site itself is a small demonstration. Every number below is enforced by a script that fails the build when it regresses, including the animation above, which cost zero bytes of JavaScript.

0 B client JavaScript: a CI budget fails the build above zero
0 req external requests: no fonts, no CDN, no analytics
<20 KB largest page, gzipped, styles inlined, budget-capped in CI
5 widths overflow-checked in a real browser, 320 to 1280px

Astro static · hand-written CSS · a content schema that refuses to build a case study without an evidence field · CI actions pinned to commit SHAs · deployed through the same gates it advertises. Read the source.

hello@sparli.dev Hiring an AI engineer for agents, integrations or data pipelines? Remote, or relocation with sponsorship. Send a real problem; it is faster than a screening call.