114 job descriptions read end to end, then held against my own work
26 of 41 demonstrated.
Here are the other 15.
I read 114 job posts from clients who actually pay, wrote down every requirement and every screening question, and then scored my own work against the list instead of against a shortlist I liked the look of. A script checks it, not me: to count as demonstrated a page has to be live and contain the thing it claims, or the claim fails and the build fails with it.
The gaps are on this page at the same size as the wins. A portfolio that lists only what somebody can do is a portfolio you have to take on trust.
Things you can open and operate right now
Every requirement, ordered by how many of the 114 clients named it
The count is the most any one search slice gave it. The slices overlap, so adding them would inflate every number on this page.
| 22 | API integration, REST Type a repository and watch every request: auth, Link-header pagination, the rate budget read before being refused, retries, and ETags. Run it twice and the budget stops moving. 62 tests on the decisions with no network in them. Two exist because the official Anthropic SDK gets Retry-After wrong in two ways. | /integration |
| 20 | Python in production, not notebooks A FastAPI service in a container on its own box, reading PDFs with PyMuPDF, deployed by a script that waits for the health check rather than assuming. 86 pytest tests, 72 of them on an address guard rewritten in Python from what the TypeScript one’s 74 tests taught. | |
| 18 | Agents, agentic workflows, tool calling An agent that plans, calls the other tools on this site, retries a failure with backoff, and is refused by a gate in code rather than a rule in a prompt. The whole trace is streamed. 42 tests with no model and no network. A checkbox removes the rules from the prompt and the same calls are still refused. | /agent |
| 16 | Workflow automation A real scheduled job in n8n on a VPS probing every service every ten minutes, writing rows, and going red in the execution list when something is down. Never a platform cron. One place to see what is scheduled and one place a failure shows up. | /status |
| 15 | Production deployment, operating a live system Everything is deployed and probed on a schedule, with real uptime and latency from recorded history rather than a check made when the page loads. | /status |
| 14 | Evals, graders, rubrics, regression testing A golden set of 34 pages scored on precision and recall, fixture split against holdout, run fresh on every request. | /evals |
| 12 | Error handling, retries, idempotency, failure modes A failing tool retried with backoff and then handed back to the model, and a failed WRITE never retried because it may have succeeded before the answer was lost. Two of the retry tests exist because the official Anthropic SDK gets Retry-After wrong in two ways. | /agent |
| 12 | Databases, SQL, Postgres, data modelling Six tables across three migrations, run through the Management API rather than pasted into an editor, behind the status history, the MCP audit log and the webhook idempotency store. A unique violation on the idempotency key is handled as a lost race rather than an error, which is the case that only appears under concurrency. | /status |
| 12 | MCP server development A public MCP endpoint whose tools write, with the tool list filtered by the session grant. | /mcp |
| 11 | Claude Code as a daily tool The rules from the CLAUDE.md with the behaviour that caused each, four things the agent got wrong building this site with how each was caught, and what gets checked before a large diff is approved. Three of the four defects were caught by something written down rather than by somebody noticing, which is the argument for the rules rather than for me. | /claude-code |
| 10 | RAG, embeddings, vector search Search this codebase and read how often the right file comes back first. 18 questions with an answer key written before anything ran, plus five it must refuse. The eval found a corpus gap that looked like a retrieval failure: the file that answered one question had never been indexed. | /rag |
| 10 | Monitoring, observability, tracing Probes that do the smallest real version of each job, recorded over time, plus the agent trace and the MCP audit log. The guard probe passes only when an attack is refused, because a control that stopped working looks healthy to a check that only wants a 200. | /status |
| 9 | Tool calling, function calling Real function calling against six tools, with the arguments the model chose printed in the trace. | /agent |
| 9 | Webhooks A public receiver you can fire seven deliveries at. Signature over the raw body, a window that looks both ways, and a repeat that answers 200 and does nothing twice. 25 tests with no network. The browser signs each delivery, so the signatures are genuine rather than prepared. | /webhooks |
| 9 | n8n, Make, Zapier The estate counted off the n8n API when the page loads, and the one workflow built for this site with its last self-triggered runs. Names are never returned. Most of these are built for clients and the names say who. | /automations |
| 8 | Claude Code Skills Fifty-one skills counted off the filesystem by a script rather than from memory, with the date it counted. One of them, a 1,485 line n8n expression reference, has its rule table written as code and running on the page, so a visitor pastes an expression and gets the finding, the reason and the correction. Names and sizes only. Several skills describe client outreach and their descriptions are deliberately not published. | /skills |
| 8 | Structured output, JSON schema validation A strict schema requested from the model AND validated here, with every field carrying the quote it came from and the quote looked up in the source. 30 tests with no API call. Asking a provider for strict JSON is not the same as checking it. | /extract |
| 8 | Guardrails, gates, human-in-the-loop approval Two gates. The refusing one turns down invented tools, duplicate writes and loops on the tool loop. The parking one stops before a public write, stores what the agent wanted to do, and finishes the run so nothing waits on a person. Anybody can approve on the demo, and the page says so. Identity on the decide endpoint is the one thing a real deployment adds. | /approvals |
| 8 | CI/CD, GitHub Actions Three workflows. Every push checks the types and runs the offline suites and the Python service tests, and the run posts its own result to the site because the repository is private and a badge needs a public one. A separate scheduled workflow audits the live site against this ledger. The Next.js build is not in the pipeline, because it reads environment variables CI does not hold. The page says so. | /ci |
| 8 | Docker, containers A two-stage image with the package manager deleted, running as a fixed non-root uid on a read-only filesystem with every Linux capability dropped, no-new-privileges, and hard limits on memory, swap, CPU and processes. The deploy waits on the health check the container defines, then reads every limit back off the running container and publishes it. One container on one box. No orchestrator, no rolling deploy, no second copy, and the page says so. | /container |
| 7 | Security: least privilege, audit trails, OAuth Open a session, write inside the grant, get refused one step outside it, read the audit trail back. Least privilege and audit trails are covered. OAuth is not, so this is not the whole requirement. | /mcp |
| 5 | Token cost reduction, inference cost control The same question four ways with token counts read off the response, cold, primed, warm and on a smaller model. | /cost |
| 5 | Hallucination reduction, source traceability Every extracted value cites a span, and the span is looked up in the text, so an invented citation is caught by a string search. The page shows a live case where this FAILS: a real quote misread as answering a different question. That boundary is stated rather than hidden. | /extract |
| 4 | Hooks (Claude Code) The proposal gate hook, described with the failure that caused it: a job posted six minutes earlier collected fifty proposals while a deck was being rebuilt. It fires on any prompt mentioning a proposal or a cover letter and refuses to release client copy until a checklist is ticked. Described rather than published. The hook body is the sales process itself. | /skills |
| 3 | Model routing, choosing model plus reasoning settings The same question on a large and a small model, both answers printed, both prices measured. | /cost |
| 2 | Prompt caching Cold against warm on an identical prefix, with the cached token count printed and the saving computed from it. OpenAI caches automatically. The Anthropic half of the script shows explicit cache_control and needs credit. | /cost |
| 10 | Cloud, AWS/Azure/GCP Something running on a cloud primitive rather than a platform, with the cost and the failure mode stated. | not built |
| 9 | CRM and ERP integration One real CRM object created and reconciled, with the duplicate and rejection paths shown. | not built |
| 8 | React, TypeScript Six pages of it. Shown by existing rather than by being demonstrated, which is the weakest kind of evidence. | half done |
| 7 | Self-hosted and open-weight models An open-weight model answering the same question as the cost page, on the VPS, with the price per token computed. | not built |
| 7 | Data pipelines, ETL A pipeline with a row count that reconciles at both ends and a deliberately corrupt input that it rejects. | not built |
| 6 | Memory stores, context management, persistent state An agent that remembers across sessions, and a demonstration of what it forgets and why. | not built |
| 5 | Prompt and model config versioning Two versions of a prompt scored against the same eval, with the diff and both scores. | not built |
| 5 | Document processing, OCR, extraction Structure, headings, tables and text coverage come out. It says which pages need OCR rather than doing OCR, and that gap is stated on the page. Not the whole requirement: it detects that OCR is needed and does not perform it. | half done |
| 5 | Microsoft stack, Graph, Power Automate, Fabric Lowest priority. Skip unless a specific job needs it. | not built |
| 4 | Latency, first-token, sub-200ms decisioning A decision endpoint measured under load, with the p50, p95 and p99 and the point it degrades. | not built |
| 4 | Voice and telephony, Twilio, LiveKit, ElevenLabs Latency broken down by stage on a real call, since that is what the voice posts actually ask. | not built |
| 3 | Fine-tuning, LoRA, SFT, DPO, RL Needs a GPU budget. Park it until a job justifies the spend. | not built |
| 3 | Prompt injection defence, red teaming A honeypot holding a secret the agent must never reveal, and the attempts logged. | not built |
| 3 | Browser automation, scraping at scale A scraper with the detection that tells you it broke silently, which is the half the client said they care about most. | not built |
| 2 | Batch APIs The same job through the batch API with the price and latency difference measured. | not built |
Why this page exists in this shape
The first version of this work was six pages built against a seven item list I wrote myself, while the research had produced 41 requirements and 59 screening questions. Every progress report was true and the overall impression was false.
So the list is no longer mine. It is parsed out of the research document, and the only way to remove a requirement is to remove it from the evidence. A separate script reads the live site and refuses to let a row here say demonstrated unless the page answers and contains what it claims.
2 rows say half done. That word is doing real work: it means the code exists and nothing on this site lets you check it, which is worth less than it sounds.