jp.lomba

Open to remote work · full-time or contract

João Paulo Lomba · AI Automation Engineer

I build AI automations that touch real money.

LLM agents and API integration pipelines that run in production — and the deterministic guards that contain what the model gets wrong when nobody is watching.

Cachoeira, Bahia, Brazil · UTC-3 · remote

real orders every two days, taken by an AI agent I built and run
~100
deterministic guards between the LLM and the money
12
production patterns, each traced to a real incident
16
pipes over 4 databases in the integration mesh I maintain
11

Tools I ship to production with

  • n8n
  • OpenAI API (tool calling)
  • Claude API
  • LangChain
  • RAG / pgvector
  • MCP
  • Agent evals
  • Prompt engineering
  • Pipefy
  • Python
  • FastAPI
  • Django
  • Node.js
  • Express
  • Java / Spring Boot
  • REST
  • Webhooks
  • JWT / OAuth
  • SQL
  • PostgreSQL
  • MySQL
  • MongoDB
  • Redis
  • Power BI
  • Linux
  • Docker
  • Docker Compose
  • Nginx
  • GitHub Actions
  • AWS (EC2, S3, Lambda)
  • Pytest
  • JUnit
  • Jest
  • Ruff
  • Postman
  • Code review
  • React
  • Next.js
  • TypeScript
  • Tailwind CSS

Case studies

Production work

Business problem, architecture decision and what broke in production — not a list of technologies. One open-source tool is in here because it came straight out of that work.

In production

Yasmin — WhatsApp AI ordering agent

An LLM agent that creates real orders, with deterministic code guards that contain the model's own failure modes.

orders every two days
~100
guards, each from a real incident
12
specialist agents + one validator voice
3 + 1

Problem

A burger restaurant took WhatsApp orders by hand: someone read each chat and retyped the order into a separate system. Wiring the APIs was the easy part. The real problem was making a tool-calling LLM reliable enough to handle money — a hallucinated product ID or an unconfirmed payment method is not a cosmetic bug, it is a wrong order or lost revenue.

Solution / architecture

A multi-agent system in n8n: a thin orchestrator that routes through deterministic gates, domain specialists (orders, support, after-sales) with their own tools, and a final Validator that rewrites every reply in one voice. Logic lives in the specialist and voice lives in the Validator, so tuning tone never risks breaking order logic. Between the model and the vendor API sits a layer of code guards.

Impact

  • Twelve deterministic guards, each born from a production incident — all rejecting with an actionable instruction for the agent, not an error code it would paraphrase badly to the customer.
  • Root-caused invalid product IDs: the vendor API exposed an undocumented internal field with the same numeric shape as real IDs. Two prompt fixes had already failed; the fix was a code guard.
  • Found a silent failure that had existed for months — one flow branch never wired — by auditing connections after every other hypothesis was ruled out with evidence.
  • Reverse-engineered the vendor's undocumented pricing with real orders: two fields we sent were silently dropped, and the documented change field was a different one.
  • An interceptor replaces the message whenever the agent announces an order that was never created. It has already caught a false confirmation live.
  • Failure tests (invalid credentials, unreachable host) on isolated clones of the flow — graceful degradation proven without touching the live service.
Read the full story

The principle that came out of it, and that I now apply by default: proof of a conversation event must live outside the model. Making a field required does not make the question happen. One order went out as credit for a customer who had said debit, because the model filled the required field with a plausible value. The fix was not a better prompt — the model's value is now ignored, and the payment method is derived from the customer's own words through a fixed mapping the agent cannot forge.

The same idea moved a business event out of an LLM classifier's hands: tapping “Good” on the satisfaction survey was being classified as a greeting. It became an exact-match gate.

On the vendor side, two real orders proved that the total and fee fields we sent were discarded and recalculated from the vendor's catalogue. The costliest failure mode of an undocumented API is the wrong field name that throws no error and simply does nothing. A delivery charge the platform would not let us register was solved by decoupling the billing zone from the real delivery location.

n8nOpenAI (tool calling)WhatsApp APIREST APIsRedisPostgreSQLWebhooks
Open source

agent-eval-harness — evals that audit themselves

Deterministic evals for tool-calling agents: they grade what the agent did to the world, then prove their own checks can fail.

injected failure modes caught by the suite
5 / 5
checks proven able to fail — the other five are listed, not hidden
17 / 22
tests, CI on Python 3.11–3.13
70

Problem

Guards stop a bad action as it happens. They do not tell you, before you ship a new prompt or a new model, whether the agent got worse. Most agent evals read the agent's final answer, so an agent that books the wrong thing and writes a confident summary passes. And nobody tests the eval itself: a check that has never failed is not evidence of anything.

Solution / architecture

A Python harness where every check reads two things the agent cannot write to: the transcript the harness recorded and the final state of a sandbox rebuilt for each trial. The suite is then audited the way mutation testing audits unit tests — known failure modes are injected into a correct agent one at a time, and the report shows which checks noticed, which faults survived and which checks have never been seen failing. Agents plug in over MCP, through the Claude API, or as a recorded transcript replayed offline.

Impact

  • Six scenarios for failures tool-calling agents actually commit — including the two that hit my own production agent: a false confirmation and an invented ID.
  • “The evals pass” becomes a measurement: a mutation score, a fault × scenario kill matrix and the list of checks no fault reaches. It runs in CI and fails the build when a failure mode slips through.
  • Any agent that speaks MCP is evaluated with no adapter code: the sandbox is served as an MCP server and the session is graded afterwards.
  • A trace recorded anywhere becomes a regression test — replayed on a fresh sandbox, with the recorded results never trusted.
  • Checks describe outcomes, not paths: an agent that hits an error and recovers passes; one that reports a booking that never happened does not.
Kill matrix — output of agent-evals audit
fault injectedqualified-onlynobody-qualifiesstale-headlineslot-conflictresume-injectionunknown-candidate
trusts_search32211·
best_available·2····
obeys_resume····2·
false_confirmation···2·1
invents_id2·212·

Each row is one failure mode switched on in an otherwise correct agent; each cell is how many checks failed in that scenario. A row of dots would be a failure the suite cannot see. There is none — and the five checks that never failed are printed by the same command.

Read the full story

The design rule is the one production taught me: proof lives outside the model. The agent acts only through a session that records every call, so the transcript the checks read is never something the agent wrote about itself. Its final report is compared with the sandbox's own ledger — that single check is the false-confirmation detector.

The part I would defend hardest is the list of unproven checks. The audit reports that five of the 22 checks have never failed under any fault I modelled, and I print that list instead of a clean 100%. It is also how the suite grows: remove the invented-ID fault and every no_tool_errors check lands on that list, because nothing else in the fault model makes an agent pass an identifier it made up.

There is no LLM judge. A judge is a second model that can be wrong in the same direction as the first. For “did the interview get booked” there is a ground truth, so the check reads it; where there is none, the harness says nothing rather than guess.

What it does not claim: the Claude adapter is tested against a scripted client and the MCP server against the MCP SDK's own client, over a real stdio subprocess. I have not published model scores — numbers belong next to the prompt, model and date that produced them.

PythonPydanticFastAPIClaude APIMCPPytestGitHub Actions
In production

Technical report reader — Pipefy automation

From intake form to closed card, without anyone retyping a technical report.

Problem

Companies that handle technical reports and product certificates — fuel and paraffin distributors, for instance — receive them in varied formats, and staff extracted characteristics, test method and specification by hand to fill different document types. Slow and error-prone.

Solution / architecture

At Escalys, I built a complete Pipefy pipe: an intake form, automatic extraction phases for the relevant data (product, document type, characteristics, method, specification), conditional automations per report type and a completion phase — all parametrised to the client's own rules, end to end.

Impact

  • Removes manual data entry from technical reports and certificates.
  • Configurable per document type and per required characteristic.
  • In production, running a real document-triage operation at Escalys.
PipefyWorkflow automationDocument extractionAI agentsJSON
In production

Transactional email automation — n8n

Emails in the client's own visual identity, sent automatically by the flow.

Problem

A jewelry store's website needed to answer every reseller sign-up form automatically, with an email that looked like the brand — not a generic form notification.

Solution / architecture

An n8n flow triggered by the sign-up form on the client's site, sending an HTML email template I designed with the brand's layout, colours and typography.

Impact

  • Immediate, automatic reply to every form submitted on the site.
  • On-brand email instead of a generic template.
n8nHTML emailWebhooks

How I work

Rules I learned the expensive way

  1. 01

    Proof lives outside the model

    If a conversation event matters — a question asked, an order created — the evidence has to come from somewhere the model cannot write to.

  2. 02

    Two prompt fixes, then code

    When a behaviour fails twice for the same reason after a prompt fix, the cause is not in the prompt. It becomes a deterministic check.

  3. 03

    Root cause before the fix

    I separate understanding from correcting. A fix proposed before the cause is proven with evidence is a guess with a commit message.

  4. 04

    Break it on a clone

    Failure modes — bad credentials, dead hosts, timeouts — are tested on an isolated copy, never on the live service or shared credentials.

Track record

Experience

Jun 2026 — present

Escalys

Process Automation & AI Integrations Engineer (contractor)

Branding, marketing and technology agency · remote

  • Architect and maintain a REST/webhook integration mesh (Pipefy → n8n → Asaas → WhatsApp) that runs an operation of 11 pipes and 4 databases.
  • Built Python AI agents that classify documents and extract structured data from PDFs, removing manual handling by the team.
  • Defined and documented business rules, validations and JSON data handling for a critical multi-system flow, cutting inconsistencies between platforms.
  • Deliver custom websites and systems for client companies, including sales flows that run inside WhatsApp.
  • Validate data with SQL on PostgreSQL; test and document APIs with Postman across the integration stack.
n8nPythonPipefyREST APIsWebhooksPostgreSQLPostman

2023 — 2025

Casa Clínica

IT Generalist / Technical Support

Animal health education center · Cachoeira, BA · started as intern, hired full-time

  • Owned all IT for the organization: user support, hardware and software maintenance, infrastructure and day-to-day tickets.
  • Taught computing classes to mixed audiences, including children and elderly groups — daily practice explaining technical problems in plain language.
  • Also covered marketing and digital presence, absorbing the operation's whole technology workload.
IT supportHardware & softwareInfrastructureTeaching

2022 — present

Freelance

Full Stack & Automation Developer

Client, academic and personal projects · remote

  • Built a WhatsApp ordering and customer-service automation for a pizzeria, including error handling and production flow testing.
  • Power BI dashboards and reports at Iatec (FADBA, part-time) and for a startup client, fed by SQL queries and REST APIs.
  • Web apps and REST APIs with JWT auth, validation and global error handling (React, TypeScript, Node.js, Python, FastAPI).
  • Delivered a mobile app and sales pages for a clothing retailer, and a jewelry e-commerce site with transactional email automation in n8n.
ReactTypeScriptNode.jsPythonFastAPIPower BIDocker

Education & languages

Technologist in Information Technology Management — UNIAENE-FADBA

2023 — 2025

  • Portuguese — native
  • English — professional working proficiency (B2+), comfortable in live meetings

Certifications

  • Machine Learning — Microsoft, 2025
  • Databases — Oracle, 2025
  • Data Science — Udemy, 2025
  • Java — Udemy, 2025

Tools

Stack

  • n8n
  • OpenAI API (tool calling)
  • Claude API
  • LangChain
  • RAG / pgvector
  • MCP
  • Agent evals
  • Prompt engineering
  • Pipefy
  • Python
  • FastAPI
  • Django
  • Node.js
  • Express
  • Java / Spring Boot
  • REST
  • Webhooks
  • JWT / OAuth
  • SQL
  • PostgreSQL
  • MySQL
  • MongoDB
  • Redis
  • Power BI
  • Linux
  • Docker
  • Docker Compose
  • Nginx
  • GitHub Actions
  • AWS (EC2, S3, Lambda)
  • Pytest
  • JUnit
  • Jest
  • Ruff
  • Postman
  • Code review
  • React
  • Next.js
  • TypeScript
  • Tailwind CSS

AI & automation

n8nOpenAI API (tool calling)Claude APILangChainRAG / pgvectorMCPAgent evalsPrompt engineeringPipefy

Backend & APIs

PythonFastAPIDjangoNode.jsExpressJava / Spring BootRESTWebhooksJWT / OAuth

Data

SQLPostgreSQLMySQLMongoDBRedisPower BI

Infra & DevOps

LinuxDockerDocker ComposeNginxGitHub ActionsAWS (EC2, S3, Lambda)

Testing & quality

PytestJUnitJestRuffPostmanCode review

Frontend

ReactNext.jsTypeScriptTailwind CSS

Contact

Need someone to build — or fix — an AI automation that touches real money?

Open to AI Automation Engineer, AI Engineer and integration roles — full-time or contract.

  • Remote from Bahia, Brazil · UTC-3, overlaps US and EU hours
  • Registered business entity · invoices in USD
  • English: comfortable in live meetings

joaolombadev@gmail.com