Sparli Aman · production agent engineer

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

I wire tool-using agents into CRMs, telephony, repos and regulated comms. I get called when one is doing something wrong.

7y client-side delivery live in US · CA · UK UTC+5 full EU overlap

Sparli Aman
sparli aman · pakistan → everywhere

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
Side project
The terminal automated state is prepared. submitted is a human attestation, and nothing reaches it without one.
applications

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.

01

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
02

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
03

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.

03In flight

Designed, being built now.

Listed separately from shipped work on purpose. Neither has results yet, and a page that blurs the two is not worth reading.

EduImmersion
An orchestration layer for an education platform live with Québec school boards: content, assessment and analytics agents around one shared learner record. I own the architecture, wrote the specification the team builds from, and picked the team.
architecture
jobhunt-agent
A job pipeline built to measure its own scorer: hand labels, chance-corrected agreement, a measured human ceiling, baselines it has to beat. No results published yet. Deliberately so, rather than placeholder numbers. github.com/Sparli/jobhunt-agent
public repo

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 · Amazon Ads API · 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.

sparli@croncore.com Hiring for a forward-deployed role? Send a real integration problem. Faster than a screening call.