
Part 7: How to Test a System That Answers Differently Every Time
assertEquals dies on contact with an LLM. Here is what we asserted instead: schema conformance, retrieval provenance, guardrails and adversarial UAT.
Senior AI Automation Engineer
Full-Stack Software Engineer
Sole engineer behind an Australian staffing firm's automation programme — event-driven AWS pipelines with Claude as the reasoning layer, built on the tools the business already runs on. Backed by 7 years shipping production web, mobile and cloud systems across four countries' clients.

Currently
Senior AI Automation Engineer at Outsourced Staff Pty Ltd, working directly with the founder. The brief is unusual and I like it: take a description of how a team already works and turn it into automated flows on the tools they already have — no process change, nothing new for anyone to learn.
That means owning each initiative end to end — scope and estimate, architecture, build, testing, rollout, and the runbook someone else can operate it from.
An AWS serverless pipeline that turns Lever ATS activity into client-ready candidate scorecards, with Claude as the assessment layer. Removes hours of manual scorecard preparation per role while keeping a human in front of every client-facing document.
A config-driven HR and client communications engine on Make.com, Google Workspace, Reply.io and the WhatsApp Business API. The Admin can reword an email, change its timing or recipients, switch it off, or add a whole new message type by adding one row to a spreadsheet — no developer involved.
How I build
7 years of production delivery, most recently owning an automation programme end to end — scope, estimate, build, rollout and the support afterwards. These are the six things I bring to that, and the evidence behind each one.
The full background arrow_forwardLLMs behind a contract, not a demo. Forced tool-calling schemas, confidence gates, retrieval grounded in the customer’s own documents, and a human in front of anything a client sees.
Claude · AWS Bedrock · RAG on OpenSearch
Webhooks, queues and schedulers instead of cron jobs and hope. Work is decoupled behind SQS with a dead-letter queue, so a downstream outage delays a message rather than losing it.
Lambda · API Gateway · SQS/DLQ · EventBridge
At-least-once delivery means every handler will run twice eventually. Provisioning locks, property-keyed upserts and checksum change detection make the second run a no-op.
DynamoDB conditional writes · content hashing
Signature verification on every inbound webhook, least-privilege roles per function, secrets that never reach source control, and tenant data isolated in the query layer rather than the prompt.
HMAC · OAuth · least-privilege IAM · KMS
Unit and integration suites with in-memory fakes, plus live end-to-end runs against the real third-party APIs. Structured JSON logs you can build a metric filter on, and alerts on the DLQ.
Contract tests · JSON logging · DLQ alerting
Third-party systems live behind an adapter contract, so swapping an ATS, a CRM or a mail provider is a new adapter rather than a rewrite. Proven on a 60+ brand multi-tenant platform.
Adapter pattern · DTO boundaries · Clean Architecture
Writing
Long-form engineering notes on AI automation, AWS architecture, cloud security and the decisions behind them — including a seven-part teardown of a production RAG agent.

assertEquals dies on contact with an LLM. Here is what we asserted instead: schema conformance, retrieval provenance, guardrails and adversarial UAT.

In an LLM pipeline a duplicate email is a billing event, so we keyed idempotency to the Message-ID and let a dead-letter queue hold the rest.

Amazon Bedrock Guardrails mask PII before inference, and an agent with no send capability turns the Drafts folder into a zero-UI approval queue.
Get in touch
If you have a process someone is doing by hand, a pipeline that keeps double-processing under retry, or an LLM feature that needs to be safe enough to put in front of a client — that is the work I want.