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.
| Repo | Stars | Impact |
|---|---|---|
| langgenius/dify | 149K+ | 3 PRs merged ✅ — email validator fix, audio-to-text 400 error, Agent node completion params. 5 open: MCP timeout, PG logical replication (approved), system message ordering, agent files by model feature, AGENT_BACKEND_BASE_URL error msg. 7 closed |
| NousResearch/hermes-agent | 217K+ | 27 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, progress narration detection, SSL cipher fix. 6 open, 21 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+ | 7 PRs — charset detection, ignoreRobotsTxt forwarding, community link fix merged ✅, batch pagination default, crawl pagination default. 4 open, 1 merged, 2 closed |
| openai/openai-python | 31.1K | 4 PRs — null output guard (reviewed by jbeckwith-oai), NO_PROXY sanitization (reviewed), stream drain, list merge by logical index (reviewed). All 4 open |
| andrewyng/openworker | — | 7 PRs — Qwen auth error guidance, MCP streamable-http compat, plan directory chat reply, run shell session allowlist, coverage measurement, tool-call pairing repair, PR approval gate. All 7 open |
| huggingface/smolagents | 28.5K+ | 3 PRs — managed-agent summary leak (reviewed), big-integer timeout bypass (reviewed), default model replacement. All 3 open |
| langchain-ai/langchain | 101K+ | 4 PRs — PydanticOutputParser type coercion, OpenAI phased response parsing, tracer copy, task cancel IndexError (all auto-closed, no assignment) |
| mem0ai/mem0 | 61.5K+ | 2 PRs — ImportError pattern (closed, duplicate), embedding dim propagation (reviewed by kartik-mem0). 1 open |
| topoteretes/cognee | 29.1K+ | 3 PRs — ACL raw-download for read-grant users merged via CI mirror ✅, Postgres import guard, + 1 merged. 2 closed |
| topoteretes/cognee-community | — | 1 PR merged ✅ — preserve nested map shape in FalkorDB param coercion |
| 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 (closed, not planned) |
| 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 (closed, solved by #14681) |
| mlflow/mlflow | 10.4K+ | 1 PR — bound duplicate-metric recovery cost by batch size, not run history (closed, maintainer let original reporter work on it) |
| 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 (closed, wrong domain) |
| Apex-Engineers-Inc/rustest | — | 1 PR — xfail bare decorator fix (closed, major overhaul in progress) |
| seevee/cap_alerts | — | 1 PR merged — BCP 47 language matching ✅ |
topoteretes/cognee — ACL readers blocked from downloading raw data — When a user with a dataset-level read grant tried to download raw data, the endpoint called get_data(user.id, data_id) which checked data.owner_id == user_id, blocking ACL-granted readers. Fix: use dataset-membership check instead. → Merged ✅ #4468 (CI mirror of #4200)
seevee/cap_alerts — BCP 47 language matching — Language matching didn't follow BCP 47 standards, causing bare primary subtags to fail. Fix: harden language matching for bare primary subtags. → Merged ✅ #60
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
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(), preserve nested model objects, and coerce dict responses before dereferencing. → Reviewed by jbeckwith-oai 💬 #3517
openai/openai-python — NO_PROXY newlines crash httpx — A trailing newline in NO_PROXY becomes part of the hostname, causing InvalidURL. Fix: temporarily sanitize NO_PROXY during client construction with a thread lock for concurrency safety. → Reviewed by jbeckwith-oai 💬 #3519
openai/openai-python — Duplicate tool-call indexes from speculative decoding — When the API sends multiple entries with the same index, the accumulator created duplicate physical entries that broke tool_calls[index] lookups. Fix: coalesce by logical index, handle sparse/out-of-order indexes, and detect dumped placeholders after model_dump round-trips. → Reviewed by jbeckwith-oai 💬 #3521
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. 27 regression tests added. → Reviewed by ErenAta16 💬 #2564
huggingface/smolagents — Managed-agent summary leaks tool messages — TOOL_CALL and TOOL_RESPONSE messages were included in the managed-agent summary, exposing internal tool I/O. Fix: filter tool messages from the summary before rendering. → Reviewed 💬 #2565
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
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 from embedder to vector store config. → Reviewed by kartik-mem0 💬 #6493
NousResearch/hermes-agent — Progress narration detected as final answer — The agent loop treats progress narration as a final answer, causing premature turn completion. Fix: detect progress narration and retry the turn. → Reviewed by GottZ 💬 #76013
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
andrewyng/openworker — Tool-call/result pairing breaks on load — Mismatched tool-call and tool-result IDs on session load caused unrecoverable 400 errors. Fix: repair pairing on load. → #350
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
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. → Closed (duplicate of #6119) #6490
mlflow/mlflow — Duplicate-metric recovery cost — Bounded duplicate-metric recovery cost by batch size instead of scanning full run history. → Closed (maintainer: let original reporter work on it) #24612
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.


