Carl Wilcocks / Curriculum vitae

Carl Wilcocks

AI Engineer | Agents, skills and integrations

Profile

I graduated in Industrial Engineering in December 2025 and now work as a fullstack developer on a three-person team. My work includes a production agent for class action loss calculations, Claude skills used by the operations team, and AWS and Salesforce integrations. I also co-founded Eidetic, a Shopify app we developed to within a few weeks of App Store submission.

Experience

Fullstack Developer · WTax · Global tax reclaim firm

Jan 2026 – Present

Part of a three-person development team building on AWS and Salesforce for a global withholding tax reclaim firm.

Agent engineering

  • Sole engineer on an AI agent that calculates recognised losses for securities class action settlements. It reduced each case from days of manual work to about 10 minutes. Used on around 30 production cases, with results matching law-firm-verified losses to the cent.
  • Built the agent to write a case-specific Python calculator, then check it through static review, sandboxed Code Interpreter runs and property-based invariants. Failed checks feed into the next attempt. In model comparisons, GLM-4.7 needed 4–5 attempts; Claude Opus passed on the first or second.
  • Co-built the surrounding pipeline across 12 Step Functions state machines. It extracts notices from Salesforce with Textract, invokes the agent, runs the calculator in a temporary Lambda with up to 40 concurrent runs, returns results to Salesforce and removes the Lambda.

Claude skills and connectors

  • Built and tested 10+ Claude skills for manual operations tasks, comparing results with and without each skill and revising it. The e-filing skill reduced completing class action templates from about a day to a few minutes plus human review. The whole operations team uses it.
  • Connected Salesforce to Claude through a read-only MCP app. Operations staff use it for reporting, and developers use it to give Claude live context when building Salesforce features.
  • Led the rollout of a dedicated Claude organisation for the securities class action division. As admin, distribute skills across Claude Code, Desktop and chat, including a OneDrive-synced folder symlinked into Claude Code. Selected skills also run in Codex.

Salesforce and AWS development

  • Built Lightning record pages in App Builder and later as Lightning Web Components. Added an OAuth 2.0-secured route from Salesforce to Step Functions using API Gateway, Lambda and Cognito, plus a DynamoDB distributed lock with EventBridge Scheduler to prevent concurrent case-processing runs from colliding.
Loss Calculator agentHow I built it

Calculating losses across different settlements

Every securities class action settlement publishes its own Plan of Allocation: eligibility windows, per-share inflation tables and edge cases. Each case needs its own calculator. Manual calculation took days, with a wide margin of error. An earlier Claude skill improved results, but sometimes exceeded the context window.

The production system makes the model write a case-specific Python calculator once. A deterministic harness validates it, then a frozen script computes the losses. The same inputs produce the same outputs, with a trace from each number back to its rule.

Inputs and audit records

The invocation has two fields: caseId and bucket. The runtime fetches its inputs from S3, starts a fresh session for each run and works to completion while Step Functions waits. It returns a Lambda-ready final_script.py plus every attempt, prompt, response and validation result.

The surrounding system uses 12 Step Functions state machines, one Lambda action router and one AgentCore runtime per environment: development, UAT and production. All use the same CI pipeline.

The checks run in code and limit the number of attempts. They do not use a golden reference file or ask another model to grade the numbers.

Model benchmarking

Observed attempts needed to pass this harness:

AgentCore services used

  • Runtime: generation runs for minutes and drives a live sandbox.
  • Code Interpreter: executes the proposed code inside the validation boundary.
  • Identity: each environment has a role scoped to its own bucket, preventing development runs from writing production cases.
  • Observability: the S3 audit trail makes attempts and validation results replayable months later.
  • No Memory: settlement logic must never bleed across cases.
  • No Gateway: the inputs and output are files; there is no external tool to wrap.

Running the validated calculator

The frozen script is zipped into a new Lambda created during execution, named for the case and run, with a role scoped to one bucket. Once active, the pipeline fans out across four clients and ten account files, with up to 40 concurrent runs. Each lot gains a reason, loss per share and lot total. Results roll up from account to client to Salesforce, and the Lambda is deleted on success or failure.

The pipeline checks that the output file exists. Reruns reuse the frozen calculator unless a fresh one is requested; notices without a usable Plan of Allocation are flagged.

Results: around 30 production cases; about 10 minutes per case; results match law-firm-verified losses to the cent.

My contribution: sole engineer on the agentic part and about half of the surrounding pipeline.

Stack: Amazon Bedrock AgentCore · Strands Agents SDK · Claude Opus · Step Functions · Lambda · S3 · Textract · Salesforce · Python.

Skills & adoptionHow I built it

Building and testing skills

I start with a manual operations task, build a skill for it, then compare the same task with and without the skill. I revise it before distributing it to the team.

I built 10+ Claude skills and led the dedicated Claude organisation rollout for the securities class action division. As administrator, I distribute skills across Claude Code, Desktop and chat, with a OneDrive-synced folder symlinked into Claude Code. Selected skills also run in Codex.

E-filing: completing class action templates fell from about a day to a few minutes plus human review. The whole operations team of 2–3 people uses the skill.

Testing was a with/without comparison and iteration against the real task.

Salesforce & ClaudeHow I built it

Salesforce reporting and development

I connected a read-only Salesforce app to Claude through MCP. The operations team uses it to run organisation reporting directly from Claude; developers use it to give Claude live context when building new Salesforce features.

The connector was configured, with default read permissions.

Carl Wilcocks · AI Engineer01 / 02
Carl WilcocksAI Engineer

Experience continued

Co-founder & Lead Engineer · Eidetic

Feb 2026 – Jul 2026

  • Built a Shopify app that audits stores for AI-search (GEO) visibility and drafts content changes for merchants to approve. Used Next.js, Supabase Edge Functions and the Claude API. Completed Shopify OAuth, App Bridge, billing and GDPR webhooks; the app was close to App Store submission.
  • Restricted the content agent to approved Shopify fields, with merchant-reviewed diffs, a source-hash check to block stale changes, and rollback to the stored original. Used Haiku for extraction, Sonnet for brand voice and Opus for content.
  • Stopped development before launch after competitive analysis showed Shopify had released most of the same features natively and for free. This met the criteria we had agreed for closing the product.
Eidetic developmentHow I built it

The Shopify app

Eidetic audits a store's GEO visibility and drafts content fixes for a merchant to review before publishing. As co-founder and Lead Engineer, I took the app to within a few weeks of App Store submission.

One Next.js 16 deployment served the website and embedded Shopify app. The backend used Postgres and Deno Edge Functions, with production and development deployments on Vercel. Merchants could enter through an App Store installation or website-first Google sign-up.

Completed features

  • Shopify OAuth, App Bridge session tokens, token exchange and automatic recovery from expired tokens.
  • Billing API with two plans and a 14-day trial, verified on a test store.
  • Webhooks including all three GDPR compliance topics.
  • A five-check GEO audit, brand inference, tone extraction, brand claims and target-query generation.
  • Content proposal review, a deterministic publish plan and rollback.
  • Approximately 13 test suites across the Shopify library.

Reviewing and publishing changes

Generate a proposal and store the original → merchant approves the diff → re-check the source hash → write allowed fields → check mutation errors and record per-field results → retain the original for rollback.

Writes are restricted to an allowlist of native Shopify fields: product and collection descriptions, selected About and FAQ page bodies, existing metafield values, SEO metadata and image alt text. Theme files are excluded, with least-privilege scopes.

Model routing: Haiku for audit workflows, brand inference and tone extraction; Sonnet for brand voice, claims and target queries; Opus for content proposals.

A /context monorepo and CLAUDE.md router kept shared context for two co-founders across Claude Code and Cowork.

Why we stopped before launch

Our competitive analysis found that Shopify had released most of the same features natively and for free, while existing SEO apps bundled GEO features. This met our agreed criteria for stopping development. We closed the product 2–4 weeks from submission.

Projects

Local receipt agent

Python · Ollama · Qwen2.5-VL · Jul 2026

  • Built a receipt organiser for South African slips that runs entirely on a MacBook. A local vision model extracts receipt fields into a fixed schema. Python handles duplicates, SA VAT rules including zero-rated groceries, validation flags, merchant memory and an append-only ledger.
  • Receipts require human review by default. Automated processing is gated by a field-level evaluation harness, with accuracy targets of at least 95% for totals and dates and 90% for category.
Local receipt agentHow I built it

Local receipt processing

A local vision model reads South African receipts into a fixed schema. Deterministic code handles the ledger and review decisions. The system preserves the original receipts and uses a fixed list of categories. Automated processing remains disabled until the evaluation targets are met.

Pipeline: SHA-256 deduplication → HEIC conversion → vision extraction into a fixed schema → merchant normalisation and SQLite memory → constrained categorisation → VAT resolution → deterministic flags → commit, hold for review or quarantine → append-only CSV ledger and yearly export.

Handling South African receipts

The system prefers the printed VAT amount. If none is printed, it can calculate total × 15/115 and label that value as calculated. Grocery baskets are flagged because zero-rated basics can make that fallback overstate VAT.

Review and accuracy targets

Receipts require human review by default. Code checks the extracted fields and flags problems. The evaluation harness uses hand-labelled slips, with targets of at least 95% accuracy for totals and dates and 90% for category before automated processing can be enabled.

Stack: Python 3.12 · Ollama · Qwen2.5-VL 7B · Pillow / pillow-heif · RapidFuzz · SQLite · PyYAML.

Lynnwood Cyclery concept site

Next.js · GSAP · Lenis · Sep 2026

  • Built a website redesign to pitch to a Pretoria bike shop: scroll-driven animations, a 22-product catalogue, service and test-ride booking, and a finance calculator. The proposed migration keeps Shopify as the headless backend.
Lynnwood Cyclery: concept galleryHow I built it

Lynnwood Cyclery website concept

A header with scroll-driven animation and a bike rotation scene lead into a catalogue of 22 real bikes. The demo includes service and test-ride booking, fit and flex studios, and a finance repayment calculator.

GSAP ScrollTrigger and Lenis share one animation loop; every scroll scene respects reduced-motion preferences. The proposed migration retains Shopify as the headless backend through the Storefront API.

Stack: Next.js · GSAP · Lenis.

Skills

  • Agents & LLMs: Amazon Bedrock AgentCore (Runtime, Code Interpreter, Identity, Observability) · Strands Agents SDK · Claude API (model routing across Opus / Sonnet / Haiku) · local vision models via Ollama (Qwen2.5-VL) · structured outputs
  • Skills & MCP: Claude skills (build, test, distribute) · MCP connectors (Salesforce, Blender) · Claude Code · Codex · Claude org administration
  • Evals & reliability: validation harnesses · property-based invariants · sandboxed execution · model benchmarking · field-level accuracy evals · human-in-the-loop gates
  • Cloud & backend: AWS Lambda, Step Functions, S3, DynamoDB, EventBridge Scheduler, API Gateway, Cognito, Textract · Supabase (Postgres, Edge Functions) · Python, TypeScript, SQL
  • Frontend: Next.js, React, Tailwind, GSAP · Salesforce Lightning Web Components & App Builder · Shopify App Bridge & Polaris
  • Integrations & delivery: Salesforce · Shopify Admin API (OAuth, Billing, webhooks) · OAuth 2.0 · Vercel · GitHub · Vitest

Education

BEng Industrial Engineering · University of Pretoria · 2025

  • Studied operations research, simulation modelling and systems engineering.
  • Final-year project: inventory management system for J-Mount using EOQ and reorder-point models.

Certifications

  • AWS Certified AI Practitioner: in progress
  • Prompt Engineering Specialization: Vanderbilt University (Coursera)

Languages

English · Afrikaans

Other experience

Earlier experience

Part-time Salesman & Inventory Manager · Lynnwood Cyclery, Pretoria
Jan 2021 – Dec 2022

Vacation work · Faces Advendurance
Logistics & event planning · Jun – Jul 2024

In progress

A 3D scroll site using agent-made exploded-view renders animated on scroll, with Blender MCP set up across Claude, Codex and Antigravity.

Carl Wilcocks · Email