Intelligence is the new infrastructure. I'm the architect.
Not the kind who draws boxes on whiteboards. The kind who sits with the numbers, finds what they are actually saying, and builds systems that make organisations act on it. Autonomously. At scale. Reliably.
Over 10 years in IT, from business analyst to GenAI architect always following the data. I've led cross-functional teams across the US and Middle East, engaged C-suite stakeholders on AI strategy, and driven real transformation in financial services (BFSI), consumer goods (CPG), energy (EPG), and healthcare (HLM).
MBA from Liverpool Business School, UK not to step away from technology, but to understand the business problems well enough to solve them with it.
What drives me: the 10-day process that becomes 2 hours. The 3% error rate that drops to under 0.5%. The alert noise cut by 30%. The best AI systems are the ones nobody notices, because they just work.
I build the systems that make AI useful in production — not demos, not prototypes. The work that turns a model into a reliable, observable, autonomous system that enterprises can actually depend on.
Agent Harness Engineering Designing the scaffolding around frontier models: context resets, structured handoffs, generator-evaluator loops, and sprint contracts that keep long-running agents coherent across multi-hour sessions. Inspired by Anthropic's harness design research and the GAN-inspired generator-evaluator pattern.
Loop Engineering Building self-correcting agent loops where an evaluator agent grades outputs against concrete criteria, feeds critique back to the generator, and iterates until quality thresholds are met. Turning subjective judgments ("is this good?") into gradable, testable contracts.
Context Engineering Managing what enters the context window, when, and in what form. Compaction, retrieval-augmented context, and structured artifacts (progress files, feature lists) that let agents pick up where the last session left off without guessing.
Multi-Agent Orchestration Planner → generator → evaluator architectures, A2A and MCP protocols, and frameworks like LangGraph, CrewAI, and the OpenAI Agents SDK. Orchestrating specialized agents that each own a slice of the SDLC.
LLM Platform & Vector Infrastructure AWS Bedrock, Azure OpenAI & Foundry, Vertex AI for model serving; Pinecone, FAISS, ChromaDB, and Azure AI Search for retrieval. Building the retrieval and serving layer that production agents depend on.
Open to freelance, collaboration, and technical co-founder conversations.
An architect who ships without a governance layer is shipping liability. I build AI systems that are not just capable but accountable — designed to pass audit, survive regulatory scrutiny, and earn the trust of the business and its customers.
Regulatory Alignment I design against the frameworks that matter in 2026: the EU AI Act (risk-tiered obligations, high-risk system conformity assessments, GPAI transparency duties, now in force), the NIST AI Risk Management Framework (Govern–Map–Measure–Manage lifecycle), and ISO/IEC 42001 (the first certifiable AI management system standard). For any system touching EU users or regulated sectors, compliance is designed in from day one — not bolted on after launch.
Responsible AI by Design Bias detection and mitigation in training data and model outputs. Human-in-the-loop checkpoints for high-stakes decisions. Explainability and audit trails so every automated decision can be traced, justified, and challenged. Model cards and system documentation as living artifacts, not afterthoughts.
Agent Containment & Safety As agents grow more autonomous, blast radius grows with them. I design containment boundaries, permission scoping, and tool-use guardrails so an agent that goes off-script cannot take production systems with it. Inspired by Anthropic's containment research for Claude Code and Cowork.
Data Governance PII handling, retention policies, and data lineage that satisfy GDPR and sector-specific privacy regimes. Retrieval pipelines that respect access controls — no leaking privileged context across tenants or user boundaries.
Transparency & Disclosure AI-generated content labelling, chatbot disclosure, and deepfake detection readiness — aligned with the EU AI Act's transparency obligations taking effect August 2026.
Governance is not a brake on innovation. It is the foundation that lets an enterprise deploy AI with confidence.
I fix real bugs in production-grade AI infrastructure the kind that silently corrupt data, break under concurrency, or fail in edge cases that only surface at scale. Every single one is a genuine bug fix not a typo, not a docs tweak.
| Repo | Stars | Impact |
|---|---|---|
| langgenius/dify | 149K+ | 3 PRs merged ✅ — email validator fix, audio-to-text 400 error, Agent node completion params. 4 open: MCP timeout, PG logical replication, system message ordering, agent files by model feature. 3 closed |
| NousResearch/hermes-agent | 217K+ | 19 PRs — cwd-shaped path detection, Telegram caption retry, environment shutdown guard, model override rehydration, KANBAN guidance gating, gateway env var expansion, recon loop continuation guard. 16 closed (high dup rate from hermes-sweeper bot) |
| chroma-core/chroma | 28.8K | 9 PRs — path normalization, fixture registration, NUL byte FTS5 corruption, include-list mutation, dependency cleanup, naming bugs. 8 open, 1 closed |
| firecrawl/firecrawl | 153K+ | 6 PRs — charset detection, ignoreRobotsTxt forwarding, community link fix merged ✅, batch pagination default, crawl pagination default. 4 open, 1 merged, 1 closed |
| openai/openai-python | 31.1K | 4 PRs — null output guard, NO_PROXY sanitization, stream drain, list merge by logical index |
| langchain-ai/langchain | 101K+ | 4 PRs — PydanticOutputParser type coercion, OpenAI phased response parsing, tracer copy, task cancel IndexError (all auto-closed, no assignment) |
| andrewyng/openworker | — | 4 PRs — Qwen auth error guidance, MCP streamable-http compat, plan directory chat reply, run shell session allowlist |
| huggingface/smolagents | 28.5K+ | 2 PRs — managed-agent summary leak (redact tool messages), big-integer timeout bypass (sequence + integer guards) |
| mem0ai/mem0 | 61.5K+ | 2 PRs — ImportError pattern, embedding dim propagation |
| topoteretes/cognee | 29.1K+ | 2 PRs — ACL raw-download for read-grant users, Postgres import guard |
| agno-agi/agno | 41.3K+ | 2 PRs — mutable default arguments, team history subteam query (closed, no assignment) |
| QwenLM/qwen-code | 26.2K+ | 1 PR — npm path resolution with mise/asdf Node version managers (closed, same fix merged separately) |
| crewAIInc/crewAI | 56.0K+ | 1 PR — async tools in native tool loop |
| pydantic/pydantic-ai | 18.7K+ | 1 PR — AG-UI round-trip metadata loss |
| langchain-ai/langgraph | — | 1 PR — Message IDs and additional_kwargs lost in OpenAI format round-trip |
| openai/openai-agents-python | 28.1K+ | 1 PR — incomplete tool call stream guard (closed, maintainer wanted repro) |
| Comfy-Org/ComfyUI | 70K+ | 1 PR — clean up dead code, docstring, and add regression tests for Preview Text fix |
| mlflow/mlflow | 10.4K+ | 1 PR — bound duplicate-metric recovery cost by batch size, not run history |
| earendil-works/pi | 76.1K+ | 1 PR merged — wl-copy exit code + xclip fallback ✅ |
| Q00/ouroboros | — | 1 PR merged — don't require LiteLLM for ouroboros interview list ✅ |
| thomas-villani/all2md | — | 1 PR merged — parallel test races in TestSplitCLIE2E ✅ |
| AlphaSlayer1964/kemono-dl | — | 1 PR — pawchive image URL fix |
| Apex-Engineers-Inc/rustest | — | 1 PR — xfail bare decorator fix |
| seevee/cap_alerts | — | 1 PR — BCP 47 language matching |
thomas-villani/all2md — Parallel test races in TestSplitCLIE2E — Tests sharing a temp directory clobbered each other's files. Fix: use tmp_path_factory for unique per-test directories. → Merged ✅ #187
langgenius/dify — Email validator rejects trailing newlines — re.search matched valid emails even with trailing newlines, causing silent validation bypass. Fix: re.fullmatch. → Merged ✅ #39320
langgenius/dify — Audio-to-text returns 400 instead of 500 — Missing file field caused an unhandled server error. Fix: return proper 400 with clear message. → Merged ✅ #39322
earendil-works/pi — wl-copy exit code ignored — The /copy command always set copied=true after spawning wl-copy without awaiting its exit code. When wl-copy failed, the xclip/OSC 52 fallbacks never ran. Fix: await exit code, fall through on failure. → Merged ✅ #7009
langgenius/dify — Agent node completion params not populated from model schema — When creating an Agent node, completion_params was left empty instead of inheriting defaults from the model schema. Fix: populate completion_params from model schema defaults at node creation time. → Merged ✅ #39590
Q00/ouroboros — ouroboros interview list crashes without LiteLLM — The CLI command unconditionally imported LiteLLM at module level, crashing when LiteLLM wasn't installed. Fix: defer the import to only when the interview subcommand actually runs. → Merged ✅ #1748
firecrawl/firecrawl — Community link points to old URL — The README's "join our community" link was outdated. Fix: update to point to the Discord invite. → Merged ✅ #4067
langgenius/dify — PG logical replication breaks on generated columns — PostgreSQL with wal_level=logical rejects STORED GENERATED columns in replica identity. Fix: replace generated column + unique constraint with a partial unique index. → Approved ✅ #39473
langchain-ai/langgraph — Message IDs and additional_kwargs lost in OpenAI format round-trip — convert_to_openai_messages() stripped IDs and non-standard fields. Fix: pass include_id=True, save kwargs by message ID before conversion, restore lost fields after. → Reviewed 💬 #7273
huggingface/smolagents — 10 ** 10**8 freezes entire process — CPython computes arbitrary-precision integers in C while holding the GIL. The thread-based timeout() decorator never fires because the worker never reaches a bytecode boundary. After timeout, the leaked thread still holds the GIL, blocking all subsequent executor submissions. Fix: pre-check bit-length before allowing exponentiation. → #2564
crewAIInc/crewAI — asyncio.run() crash in async native tools — When the async native tool path calls tool.run() → asyncio.run(), it crashes with RuntimeError: asyncio.run() cannot be called from a running event loop. Fix: add async variants that use asyncio.gather and await tool.arun(). → #6622
pydantic/pydantic-ai — Metadata loss across AG-UI round-trip — Seven categories of part-level fields (id, provider_name, provider_details) were silently dropped when messages were round-tripped through dump_messages()/load_messages(). Fix: extend existing carrier mechanisms to preserve metadata. → #6682
openai/openai-python — Streamed output lost on null response.completed — The streaming accumulator never updated the snapshot on done events, so a null output field caused silent data loss. Fix: handle all four done event types in accumulate_event(). → #3517
chroma-core/chroma — NUL bytes corrupt FTS5 index — Embedded null bytes in documents bypassed validation and corrupted the SQLite FTS5 index. Fix: reject NUL bytes before storage. → #7474
NousResearch/hermes-agent — write_file creates doubled paths — A cwd-shaped relative path like home/user/dev/notes/x.md produced /home/user/dev/home/user/dev/notes/x.md. Fix: structural detection in path resolver. → #67426
NousResearch/hermes-agent — Model override lost on session rehydration — When a session with a model override was rehydrated, the target model name was not forwarded to provider resolution, causing aggregator providers to resolve the wrong api_mode. Fix: pass target_model through the rehydration path. Another contributor independently identified the same issue, kindly closed their PR as a duplicate of ours, and contributed a regression test. → #70184
firecrawl/firecrawl — Charset detection in fire-engine — Responses without UTF-8 charset produced garbled text. Fix: detect charset from Content-Type and HTML meta tags. → #4088
topoteretes/cognee — ACL read-grant users blocked from downloading raw data — The endpoint called get_data(user.id, data_id) which checks data.owner_id == user_id, blocking users with dataset-level read grants. Fix: use the already-verified membership result instead. → #4200
QwenLM/qwen-code — npm path resolution fails with mise/asdf — Node version managers replace bin/npm with a bash shim. fs.realpathSync succeeds but spawning node /path/to/bash-wrapper fails with Syntax Error. Fix: validate resolved path ends with .js. → #7591
andrewyng/openworker — Qwen API key auth error guidance — When Qwen API key authentication fails, the error message is cryptic. Fix: add friendly error guidance for Qwen API key authentication failures. → #277
andrewyng/openworker — MCP streamable-http compatibility — The MCP client doesn't support streamable-http transport. Fix: try streamable-http first and catch httpx timeouts in MCP client fallback. → #299
andrewyng/openworker — Plan directory chat reply — The plan directory command doesn't reply in chat. Fix: ensure plan directory operations reply in the chat thread. → #300
andrewyng/openworker — Run shell session allowlist — The run shell session command doesn't respect the allowlist. Fix: enforce session allowlist for run shell commands. → #301
NousResearch/hermes-agent — KANBAN guidance gating — KANBAN_GUIDANCE runs even when HERMES_KANBAN_TASK is not set, wasting tokens. Fix: gate KANBAN_GUIDANCE on HERMES_KANBAN_TASK being present. → #73263
NousResearch/hermes-agent — Gateway env var expansion — Environment variables in gateway config are not expanded. Fix: expand env vars in gateway configuration values. → #72879
NousResearch/hermes-agent — Recon loop continuation guard — The recon loop continues even when the session is cancelled. Fix: add continuation guard to stop recon loop on session cancellation. → #72851
mem0ai/mem0 — ImportError on no input or exit — The CLI crashes with ImportError when no input or exit is provided. Fix: guard the import with a try/except for graceful fallback. → #6490
mem0ai/mem0 — Embedding dims not auto-propagated — When embedding dimensions change, the system doesn't auto-propagate the new dims. Fix: auto-propagate embedding dimensions on config change. → #6493
AlphaSlayer1964/kemono-dl — Pawchive image URL parsing — The pawchive image URL format changed, breaking downloads. Fix: update URL parsing to match the new format. → #261
Apex-Engineers-Inc/rustest — xfail bare decorator — @pytest.mark.xfail without a reason argument causes issues. Fix: support bare xfail decorator without arguments. → #138
seevee/cap_alerts — BCP 47 language matching — Language matching doesn't follow BCP 47 standards. Fix: implement proper BCP 47 language tag matching. → #60
langchain-ai/langchain — PydanticOutputParser type coercion — List-to-str and str-to-list field types in PydanticOutputParser failed silently. Fix: coerce types at parse boundary. → Auto-closed (no issue assignment) #38996
openai/openai-agents-python — Incomplete tool call stream guard — Non-buffered Chat Completions stream could emit incomplete tool calls that crashed the parser. Fix: guard against partial tool call payloads. → Closed (maintainer wanted real-provider repro) #3912
I'm open to architecture challenges, enterprise AI strategy, freelance engagements, or startup ideas in the GenAI space.
If you're building something that matters, let's talk.
Data first. Always.
