Summary
Who I am on a team
Senior software developer with eight years building high-performance, scalable web and mobile
applications across e-commerce, government and broadcast media. Deep expertise in PHP 8.x and
Symfony backend architecture, custom Magento module development, REST and GraphQL integration,
and Flutter mobile development.
What I'm doing now is narrower: putting large language models to work inside a product people
pay for. That means the parts nobody demos — schema-constrained output, tool and capability
boundaries, prompt-injection hardening on untrusted input, deterministic fallbacks, spend caps,
and health checks on every model dependency. I hold seven Adobe Commerce certifications, three
of them Adobe Certified Expert, and I still lead code reviews and mentor developers.
AI in production
Shipped, not proposed
Seven of these run on Easy Apply today, handling real customers and real money. Each one is
here because of what it does when the model misbehaves, not because it calls an API.
LLM personalisation pipeline
Anthropic Messages API (direct HTTP, no SDK) · JSON-schema structured output · Batch API
- Every outbound email is written per recipient from that company's own site content, pinned
to a strict JSON schema via
output_config.format so nothing downstream ever
parses free text.
- Scraped pages are treated as attacker-controlled — model output is sanitised before
it can reach an HTML sink, closing the prompt-injection route.
- A refusal falls back to a hand-authored template; a transport error retries. A bad model
turn can neither send garbage nor silently drop a lead.
Multi-agent engineering pipeline over MCP
Claude Agent SDK · Slack MCP server · git worktree isolation · per-agent tool scoping
- A request in a Slack thread runs to reviewed code: a read-only triage agent plans it
against real files, fixer agents work in parallel — one per sub-task, each in its own
git worktree so edits can't collide — and an adversarial reviewer gates the combined
diff.
- Least privilege at the agent boundary: triage and reviewer hold no write tools at all, and
each role runs on the cheapest model tier that fits its job.
- Slack is wired in as an MCP tool surface, so a run stays auditable by someone who wasn't
watching it.
AI content moderation, with a net under the model
Google Gemini on Vertex AI · service-account OAuth2 · cached scoring · admin review queue
- Screens all user-generated content for toxicity, fraud, exposed personal data and unfair
rental criteria, returning a verdict plus per-category scores.
- An escalate-only guard sits over it: because a model's written verdict can contradict
its own scores, thresholds can make a decision stricter but never more lenient. It catches
what the model waved through, and can never release what it flagged.
- Day-long result caching, a daily request cap, and degradation to human review rather than a
failed request.
Document understanding — PDF to validated records
Claude document content blocks · constrained JSON schema · nested output
- Turns an arbitrary menu PDF into nested menus, categories, products and size variants by
handing the document straight to the model against a hand-written schema.
- The schema fixes shape; prices, defaults and currency are validated afterwards in
typed code. Extraction saves nothing, so a hallucinated row can never reach the order flow.
Self-hosted automation with a hard boundary
n8n (Docker) · HMAC-SHA256 signed webhooks · capability registry
- Two signed seams join n8n to the app: HMAC-SHA256 over timestamp and body with a bounded
replay window going out, a constant-time token check coming back.
- The automation engine gets no database credentials. Everything a workflow may ask the
app to do is an explicit, reviewable capability class, so a canvas edit can never bypass
validation — adding one is a code review.
- Exception triage with back-pressure: reports deduplicate by fingerprint and remember the
ticket already open, so an outage can't become thousands of runs with an LLM bill attached.
Python pipeline and self-hosted screening
Python 3 · ETL to FollowTheMoney JSON · Elasticsearch entity matching · Docker Compose
- A Python ETL ingests public government sanctions lists, normalises them with alias
enrichment and emits a versioned manifest that triggers a reindex — replacing a per-call
commercial API with data we own and can audit.
- Screening fails closed: a check that can't run is never recorded as a clean result.
Spend governance and model observability
Budget and metering service · pluggable health checks · CLI and dashboard
- One spend brake for every metered API: kill switch, per-operation daily caps derived
from a monthly ceiling, per-IP limits, and a strict split between asking "may we call?" and
recording a call — so a cache hit never eats budget.
- Health checks across tiers, including live reachability of the model APIs, as both a CLI
command and a dashboard. Ships with real defaults, so a forgotten setting can't become a
surprise invoice.
Certifications
3 expert · 4 professional
Stack
What runs Easy Apply and my wider work
Filter
How I work with AI
Force multiplier, not autopilot
Running a 14-vertical platform alone is only possible because I lean on AI deliberately. The
judgement that matters isn't which tool to use — it's knowing when to trust the output and when
to verify it, and never letting "the AI wrote it" stand in for a review.
How I build
AI-native development
- Claude Code daily for agentic, multi-file changes, refactors and migrations
- Cursor and GitHub Copilot for scaffolding, tests and rubber-ducking
- Custom subagents defined per repo, each scoped to only the tools its job needs
How I choose
Model judgement
- Model tiering per workload — the cheapest tier that clears the bar, not the biggest available
- Batch over real-time wherever latency doesn't matter, at half the price
- Token, latency and failure-mode budgeting treated as design inputs, not afterthoughts
How I keep it safe
Guardrails
- JSON-schema-constrained output so nothing downstream parses free text
- Prompt-injection defence on any content a stranger can influence
- Deterministic fallbacks, escalate-only thresholds and human review queues
Where I draw the line
Review stays human
- I'm the last reviewer on every line that ships — AI authorship is never an excuse
- Adversarial self-review and edge-case hunting before merge, not after an incident
- Money, auth and personal-data paths get read line by line, every time
Education
BSc Honours in Information Technology
Software Engineering · Chinhoyi University of Technology, Zimbabwe
Honours degree