Agentic system architecture & system design
I'm interested in the machinery around the model: how agents get context, choose tools, keep state and recover when work breaks halfway through.
My work spans source-linked memory and retrieval projects, plus merged fixes in agent runtimes and model gateways. I care about the failure modes: a retry that duplicates an artifact, an approval that runs twice, or a tool restriction lost between providers.
My focus: context → tools → execution → recovery → evaluation.
I work as an Analyst at MiQ across MENA markets. This is the systems work I build and contribute to outside that role.
Projects · Merged work · Writing · Portfolio
| Project | The system-design question | What is there today |
|---|---|---|
| IntelliRAG | Can a retrieval pipeline show which evidence it kept, lost or refused to answer from? | A source-to-answer browser lab with citations, retrieval traces and a measured diagnostic. The public no-key demo uses keyword retrieval and cited extracts; production hybrid retrieval and model-answer evaluation remain open. |
| Finsight | How do ingestion, analysis and storage agents share knowledge an answer can be checked against? | Separate agents, versioned knowledge and a confidence rubric based on freshness and source diversity. A project, not a claim of reliable financial advice. |
| memoRABLE | How does information become reusable memory without losing its source? | Six source-linked memory blocks, click-through provenance and email/web/document outputs. Local-first; AI is optional. |
These are different parts of the problem, not one finished autonomous-agent platform.
| Boundary | Merged contribution |
|---|---|
| Tool selection across providers | Kept allowed-tool subsets intact through Gemini and Responses translation in Magpie #164. |
| Approval and execution identity | Bound an approved action to one call ID, rejecting reuse under a fresh ID in OpenDots #137. |
| Checkpoints and retries | Made file-producing retries recover the original artifact after a lost checkpoint in openmuse #45. |
| Agent network boundaries | Closed a NAT64-address gap in the cloud-metadata deny check in OpenBot #745. |
These are scoped fixes in existing systems, not claims that I designed the frameworks. The full ledger below also includes general library and UI work.
if it isn't merged, it isn't here. badges up top; every fix in words folded below.
hermes-agent · the agent that grows with you
I made the gateway show an enabled platform whose adapter is missing in hermes status. My commit is on main with my authorship, merged through a maintainer's salvage PR that also reconnects the platform once its plugin loads. merged via NousResearch/hermes-agent#130613 → · Oct 2026
I fixed every request to a llama.cpp server failing with HTTP 400 "failed to parse grammar", by dropping the maxLength: 8000 from the clarify tool's choices schema; the runtime length check is untouched, and tests guard against any bound of 2000 or more. merged in NousResearch/hermes-agent#131286 → · Oct 2026
magpie · every agent's model, one place - Codex on DeepSeek, Claude Code on Kimi, from the menu bar
I stopped Gemini ANY mode and Responses allowed_tools from leaking the full tool list, so an allowed subset stays a subset. merged in yetone/magpie#164 → · Sep 2026
I made Gemini VALIDATED mode filter declarations down to the allowed list on translated routes, so the model only sees tools it may call. merged in yetone/magpie#170 → · Sep 2026
I made a required tool choice that filters down to nothing callable fail with a clear 400, instead of a silent plain-text 200 the caller never asked for. merged in yetone/magpie#169 → · Sep 2026
every merged fix, in words · the other 35 repos, plus the full magpie history
rea · reverse engineer anything with agents, from app behavior down to native binaries
I added an opt-in Swift module cache to REA's macOS ownership helper: REA_DARWIN_MODULE_CACHE_PATH gives the compiler a caller-owned cache that survives helper close, and REA_DARWIN_SWIFTC_PATH with an absolute SDKROOT invokes an installed Swift compiler directly, bypassing xcrun's lookup cache. merged in morluto/rea#2252 → · Oct 2026
vite · next generation frontend tooling
I stopped Vite's dependency optimizer from warning about packages that intentionally empty an import in the browser, so a browser: false mapping loads an empty module while genuinely unsupported imports still warn. merged in vitejs/vite#23590 → · Sep 2026
prettier · an opinionated code formatter
I stopped a leading comment between export and a decorator from growing a fresh blank line on every reformat, by leaving out the extra hardline the decorator printer added on top of the comment's own separator. merged in prettier/prettier#20180 → · Oct 2026
react-hook-form · react hooks for form state management and validation
I restored blur validation on a Controller after reset(), so a field that lost its registration without rerendering registers again on blur and validates in onTouched mode instead of skipping the check. merged in react-hook-form/react-hook-form#13817 → · Oct 2026
I stopped removing a row from an outer useFieldArray with shouldUnregister on from wiping the nested field array values of the row that shifts into its place, by skipping the nested unregister while the parent reindexes. merged in react-hook-form/react-hook-form#13828 → · Oct 2026
I fixed useFieldArray.remove so duplicated indexes like remove([1, 1]) no longer remove extra rows, and the array you pass in is no longer sorted in place. merged in react-hook-form/react-hook-form#13830 → · Oct 2026
I made useForm reset an option to its default when it is left out of the props on a later render, so a dropped resolver stops running on submit and mode goes back to onSubmit. merged in react-hook-form/react-hook-form#13831 → · Oct 2026
I stopped getValues with dirtyFields from throwing when a form has a field literally named hasOwnProperty, so the dirty check no longer mistakes the field's value for the Object method. merged in react-hook-form/react-hook-form#13832 → · Oct 2026
I fixed blur and setValue for fields named after Object.prototype members like hasOwnProperty, so they get marked touched instead of crashing the touched-fields lookup. merged in react-hook-form/react-hook-form#13833 → · Oct 2026
I made cloneObject keep the length of sparse arrays, so a sparse array passed through defaultValues or reset no longer collapses to [] on the way back out of getValues. merged in react-hook-form/react-hook-form#13834 → · Oct 2026
agno · build, run, and manage agent platforms
I made the model response cache key include the response schema, so two output classes with different fields no longer share a cached answer for identical messages. merged in agno-agi/agno#10621 → · Oct 2026
recharts · redefined chart library built with React and D3
I fixed a lone negative bar in a BarStack rounding its corners at the zero line instead of the outer end, by running a single rectangle through the same normalization as a stack of several. merged in recharts/recharts#7896 → · Oct 2026
I stopped Bar, RadialBar and Brush writing the text undefined into the DOM when a name or className is missing; the attribute is now left out, and Brush aria labels fall back to the dataKey value. merged in recharts/recharts#7914 → · Oct 2026
I kept a Brush start or end index from falling outside the data and drawing NaN positions, by clamping both indexes to the data range when the data or the props change. merged in recharts/recharts#7916 → · Oct 2026
I fixed the ease-out and ease-in-out animation curves being swapped, so easing="ease-out" now runs the real CSS ease-out curve instead of ease-in-out. merged in recharts/recharts#7931 → · Oct 2026
I gave each Funnel entry its own tooltip color and legend item, so the tooltip and legend reflect the entry instead of a shared chart-level color or an empty legend. merged in recharts/recharts#7985 → · Oct 2026
I made Scatter tooltips use each point's own color and stopped data-entry IDs from leaking onto rendered symbols, while keeping the original ID in the point's payload. merged in recharts/recharts#7986 → · Oct 2026
kivy · open source UI framework written in Python, running on Windows, Linux, macOS, Android and iOS
I fixed Image crashing on data URIs without ;base64, which handed a plain string to BytesIO; the payload is now percent-decoded to bytes first, per RFC 2397, and base64 handling is unchanged. merged in kivy/kivy#9394 → · Oct 2026
I fixed KV rules crashing on an or or and inside an f-string, such as f"{a or b}", by splitting the boolean branch from the f-string branch so both operands are found and stay reactive. merged in kivy/kivy#9393 → · Oct 2026
scalar · open-source API references and API client
I fixed multipart file uploads in Scalar's generated code examples, starting with the missing fileName on file params. The maintainer built on it so examples keep real file bytes and matching boundaries across clients. merged in scalar/scalar#10460 → · Oct 2026
I escaped quotes and backslashes in the PHP cURL example bodies, so a copied snippet with an apostrophe in the body is still valid PHP. merged in scalar/scalar#10495 → · Oct 2026
I escaped special characters in the Dart HTTP examples and taught them to send plain text bodies, so copied Dart code compiles and includes the body it should. merged in scalar/scalar#10496 → · Oct 2026
I made the Python Requests and HTTPX examples send bodies for JSON media types with parameters and for text types, instead of dropping them. merged in scalar/scalar#10497 → · Oct 2026
I kept every value of a repeated form field in the PHP Guzzle examples, so tag=a&tag=b arrives with both values instead of only the last. merged in scalar/scalar#10499 → · Oct 2026
I escaped strings in the C# HttpClient examples, so a URL, header or form value with a quote or backslash still compiles and sends as written. merged in scalar/scalar#10503 → · Oct 2026
I kept multiline bodies and unusual header or form names valid in the clj-http examples, by writing line breaks as escapes and falling back to string keys when a name is not a valid keyword. merged in scalar/scalar#10507 → · Oct 2026
I made the raw HTTP/1.1 examples send the body for JSON media types with parameters and for text bodies, instead of sending a Content-Type header with no body behind it. merged in scalar/scalar#10510 → · Oct 2026
I made Scalar's document download convert flow-style YAML to real JSON, so a spec that starts with { no longer downloads as YAML wearing a .json name. merged in scalar/scalar#10545 → · Oct 2026
react-jsonschema-form · a React component for building web forms from JSON Schema
I fixed a root value of false, 0 or '' failing validation, so a boolean form with false no longer errors with "must be boolean" and can submit. merged in rjsf-team/react-jsonschema-form#5423 → · Oct 2026
I fixed a false "Circular reference ($ref cycle) detected" notice when dependencies oneOf branches share a definition, by resolving each branch against its own recurse list so a sibling's resolved ref no longer reads as a cycle. merged in rjsf-team/react-jsonschema-form#5435 → · Oct 2026
I made makeAllReferencesAbsolute skip non-string $ref and $id values, so a schema property that happens to be named $ref keeps its schema instead of being rewritten as a URL with [object Object] in it. merged in rjsf-team/react-jsonschema-form#5459 → · Oct 2026
I stopped sanitizeDataForNewSchema from deleting legitimately entered array items when an unrelated sibling field's schema changed: the old items schema now resolves against the previous form data, so the enum filter only runs when the items schema really changed. merged in rjsf-team/react-jsonschema-form#5460 → · Oct 2026
I named the shadcn multiple SelectWidget's cmdk combobox from the field's title or a ui:title override, so its search input no longer renders without an accessible name. merged in rjsf-team/react-jsonschema-form#5475 → · Oct 2026
I made the daisyui SelectWidget's empty-selection fallback go through translateString, so a SelectPlaceholder translation reaches it the way it already reached the shadcn widget. merged in rjsf-team/react-jsonschema-form#5512 → · Oct 2026
agent-framework · a framework for building, orchestrating and deploying AI agents and multi-agent workflows
I fixed data URIs with parameters like charset=utf-8 raising ContentError and parameterless ones losing their media type, and tightened media detection so plain text no longer reads as BMP or arbitrary XML as SVG. merged in microsoft/agent-framework#8918 → · Oct 2026
semantica · graph-native infrastructure for context and accountable AI systems
I made all five semantica temporal subcommands work again on v0.7.0, remapping each one from engine methods that no longer exist onto the APIs that do, with a smoke test per subcommand. merged in semantica-agi/semantica#1987 → · Oct 2026
nitro · next generation server toolkit
I made the build refuse to run when cleaning the output directory would delete the public assets inside it, so it fails with an error naming both paths instead of reporting success on an empty deploy. merged in nitrojs/nitro#4685 → · Oct 2026
I stopped the Cloudflare preset from answering a missing public asset with a 404 carrying the one-year immutable cache header, so browsers no longer cache "this module does not exist" until a hard reload. merged in nitrojs/nitro#4727 → · Oct 2026
I fixed the Vercel preset ignoring a redirect: false rule without headers, so those paths no longer get pulled into broader redirects in the build output. merged in nitrojs/nitro#4728 → · Oct 2026
kedro · a toolbox for production-ready data science
I fixed unnamed pipeline nodes built from callable objects failing with AttributeError, so a callable without __name__ now gets its class name, including under functools.partial. merged in kedro-org/kedro#5797 → · Oct 2026
I made generator nodes wrapped in functools.wraps stream chunk by chunk again, by unwrapping the callable before the runner's generator check, so a decorated generator saves each chunk instead of the generator object once. merged in kedro-org/kedro#5798 → · Oct 2026
I let OmegaConfigLoader register custom resolvers with keyword options such as use_cache through a (callable, kwargs) tuple, while leaving existing plain-callable resolvers unchanged. merged in kedro-org/kedro#5813 → · Oct 2026
mcp-use · the fullstack MCP framework - MCP apps for ChatGPT and Claude, servers for agents
I wrapped Gemini array tool results in an object, so serialized tool output survives the round trip back to the model. merged in mcp-use/mcp-use#2675 → · Sep 2026
harness-sdk · build an agent harness and control it end-to-end
I made TypeScript FileStorage return a portable filename instead of a machine-specific artifact path, while keeping older references inside the configured artifact directory readable. merged in strands-agents/harness-sdk#4668 → · Oct 2026
I gave the OpenAI Responses model the location-source guard every other provider already had, so a document backed by an S3 location is skipped with a warning instead of crashing the request. merged in strands-agents/harness-sdk#4706 → · Sep 2026
I stopped a finished Gemini reply from crashing token accounting, so a final response without usage metadata completes normally instead of throwing. merged in strands-agents/harness-sdk#4724 → · Sep 2026
I made the Ollama model forward numeric keep_alive values like 0, which were dropped as falsy, so "unload immediately" now reaches the server. merged in strands-agents/harness-sdk#4725 → · Oct 2026
I mapped Gemini's RECITATION finish reason to content_filtered instead of end_turn, so a response cut off for recitation no longer reads as a normal completion. merged in strands-agents/harness-sdk#4898 → · Oct 2026
dynamo · a datacenter scale distributed inference serving framework
I fixed the 500 on vLLM-Omni video requests that set a negative prompt, by putting it in the prompt's dict entry instead of assigning it as an attribute. merged in ai-dynamo/dynamo#15402 → · Oct 2026
jedi · awesome autocompletion, static analysis and refactoring library for Python
I stopped importing Jedi from changing the process-wide recursion limit; it now raises the limit only while its own parsing and inference run, then restores it, and never lowers a higher one. merged in davidhalter/jedi#2113 → · Oct 2026
OpenBot · a template for running your own agent bots, built to be cloned and made your own
I stopped the Bot's computer reaching the cloud metadata address through the NAT64 prefix, by unwrapping a 64:ff9b::/96 address to the IPv4 it carries before the deny check. merged in CopilotKit/OpenBot#745 → · Oct 2026
I stopped a public name that merely starts with 127. from counting as loopback for OPENBOT_SINGLE_USER, so the no-sign-in administrator can no longer be served on a public address. merged in CopilotKit/OpenBot#744 → · Oct 2026
I made the Bot's browser refuse every name under .localhost, which resolves to loopback without asking DNS, not just the bare name. merged in CopilotKit/OpenBot#743 → · Oct 2026
I made command telemetry redact the curl password in every spelling -u allows, so -uuser:pass, --user=user:pass and quoted pairs no longer keep it in clear. merged in CopilotKit/OpenBot#742 → · Oct 2026
I stopped a malformed percent-escape in a stream URL from crashing the server with a 500; it now falls through to normal routing. merged in CopilotKit/OpenBot#699 → · Oct 2026
I made the provider and Bot registries ignore inherited keys like constructor and __proto__, so a missing Bot name hits the existing startup error instead of returning undefined fields. merged in CopilotKit/OpenBot#697 → · Oct 2026
openmuse · a personal agent with a browser, terminal, files, and work that keeps going
I made a price watch recognize amounts written with a space after the dollar sign, so $ 9.99 trips the same threshold as $9.99. merged in CopilotKit/openmuse#126 → · Oct 2026
I made file-producing task retries idempotent, so a retry after a lost checkpoint recovers the original file instead of writing a duplicate under a new ID. merged in CopilotKit/openmuse#45 → · Oct 2026
I made a pasted transaction CSV that starts with a byte order mark parse instead of failing with "Invalid quoted CSV field", by dropping the mark before parsing. merged in CopilotKit/openmuse#146 → · Oct 2026
I fixed a race where the server and worker starting together on a fresh data directory could crash on the session-signing key; the key is now published with an atomic hard link and the loser reads the winner's. merged in CopilotKit/openmuse#125 → · Oct 2026
I stopped one bad attachment filename with an unpaired surrogate from breaking the whole Gmail inbox listing and from failing sends, by replacing the bad character before encoding. merged in CopilotKit/openmuse#121 → · Oct 2026
I made the spending analysis reject a CSV with a repeated date, description, amount or category header, so it no longer silently reports one of two conflicting amounts. merged in CopilotKit/openmuse#114 → · Oct 2026
OpenDots · your always-on AI coworkers that move between text, calls, and Slack
I kept edits made while "Load latest" is reading a remote page from being discarded when the read finishes, so replacing an earlier confirmed draft no longer overwrites newer work. merged in CopilotKit/OpenDots#130 → · Oct 2026
I bound an approved connection action to one toolCallId, so reusing the same approval with a fresh call ID gets a 409 instead of running it twice; retries of the original call still recover its saved result. merged in CopilotKit/OpenDots#137 → · Oct 2026
I kept balanced brackets in URLs inside research prompts, so a link like Rust_(programming_language) is read whole instead of cut at the parenthesis. merged in CopilotKit/OpenDots#99 → · Oct 2026
I made the workspace routes answer 404 for a conversation, call or Dot that does not exist, instead of a 503 that sent the user to check the server configuration. merged in CopilotKit/OpenDots#98 → · Oct 2026
I made the home composer submit on Enter like the in-thread one, with Shift+Enter still adding a new line. merged in CopilotKit/OpenDots#95 → · Oct 2026
I made the server accept the key name the Copilotkit CLI writes, CPK_INTELLIGENCE_API_KEY, as well as INTELLIGENCE_API_KEY, so setup no longer stays incomplete after a successful CLI login. merged in CopilotKit/OpenDots#72 → · Oct 2026
I stopped a store error in the background runner's scheduler tick from rejecting unhandled and taking down the always-on server; later ticks now keep running. merged in CopilotKit/OpenDots#12 → · Oct 2026
I made the Dot turn that runs past the 90 second limit end with a clear time-limit error instead of an incomplete stream blamed on the runtime connection. merged in CopilotKit/OpenDots#85 → · Oct 2026
I made the "Ready for your review" card render Markdown tables as tables instead of raw pipe text, by adding GFM support. merged in CopilotKit/OpenDots#78 → · Oct 2026
I made a WebRTC voice call wait five seconds on disconnected before hanging up, so a short network blip that recovers no longer ends the call; failed still ends it at once. merged in CopilotKit/OpenDots#26 → · Oct 2026
I made the red connection banner clear once polling recovers after an API restart; action errors still need a dismiss. merged in CopilotKit/OpenDots#73 → · Oct 2026
I made an unknown or foreign page conversation id return a 404 instead of a generic 503 that blamed the Intelligence setup; real Intelligence errors still return 503. merged in CopilotKit/OpenDots#14 → · Oct 2026
I stopped a failed voice compute from staying in the cache and using up one of the six turns, so retrying with the same toolCallId can now succeed. merged in CopilotKit/OpenDots#13 → · Oct 2026
msgspec · a fast serialization and validation library, with builtin support for JSON, MessagePack, YAML, and TOML
I made msgspec propagate an error raised while looking up ClassVar on the typing module, instead of reporting "not a ClassVar" with the exception still pending, which was terminating debug CPython builds on an assert. merged in msgspec/msgspec#1223 → · Oct 2026
tududi · a calm, open system for organizing life and work - tasks, projects, notes, areas and smart workflows
I fixed CalDAV pushes to Radicale failing with a 412 and the task getting stuck as a conflict, by sending the stored ETag as a properly quoted entity-tag in If-Match. merged in chrisvel/tududi#1779 → · Oct 2026
urwid · console user interface library for Python
I stopped ListBox from rendering the same items repeatedly when a short list sits on a wrapping walker, by tracking visited positions so each fill pass stops at one it has already seen. merged in urwid/urwid#1381 → · Oct 2026
I made alarm callbacks from set_alarm_in and set_alarm_at safe to raise, so a mis-shaped or throwing callback gets logged with its traceback and the main loop keeps running instead of tearing down the whole app. merged in urwid/urwid#1418 → · Oct 2026
I made FloatEdit turn exponent defaults into editable fixed-point values, reject non-finite defaults and quantize long inputs without exceeding the decimal context precision. merged in urwid/urwid#1447 → · Oct 2026
anyio · high level asynchronous concurrency and networking framework on Trio or asyncio
I stopped connect_tcp() from leaking a connected socket when the surrounding cancel scope fires after a connection attempt wins but before the internal task group exits, by closing the winning stream before the cancellation re-raises. merged in agronholm/anyio#1367 → · Oct 2026
pydeps · python module dependency graphs
I stopped --externals foo from dropping foobar, so packages that share a name prefix with the target stay in the output while foo.internal stays internal. merged in thebjorn/pydeps#290 → · Oct 2026
I made pydeps warn when a dependency diagram comes out with no edges, naming the target and pointing to filters, --include-missing and debug logging, instead of silently drawing a blank graph. merged in thebjorn/pydeps#291 → · Oct 2026
simplejson · simple, fast, extensible JSON encoder and decoder for Python
I made check_circular catch cycles that run through a custom for_json() or _asdict(), so a self-returning object raises the usual circular-reference error instead of exhausting recursion, in both the Python and C encoders. merged in simplejson/simplejson#390 → · Oct 2026
filesystem_spec · a specification that python filesystems should adhere to
I made async HTTP streaming files reject position-changing seeks with a ValueError and report seekable() as false, so a seek can no longer look like it worked while returning bytes from the wrong offset. merged in fsspec/filesystem_spec#2214 → · Oct 2026
I made DirFileSystem report async support from the filesystem it wraps, so a directory view over a synchronous backend no longer claims async_impl. merged in fsspec/filesystem_spec#2213 → · Oct 2026
I made DirFileSystem forward the local_file flag of the filesystem it wraps, so a directory view over local files passes the open_local check instead of failing it. merged in fsspec/filesystem_spec#2212 → · Oct 2026
I stopped sync() from hanging forever when the default fsspec IO thread has already stopped, so it raises RuntimeError instead, and stays quiet during interpreter shutdown. merged in fsspec/filesystem_spec#2210 → · Oct 2026
bottleneck · fast NumPy array functions written in C
I made the reducer memory test measure retained allocations with tracemalloc instead of process peak RSS, so unrelated growth stops failing it and a real leak can't hide under an old peak. merged in pydata/bottleneck#602 → · Oct 2026
typesafe-computer-use · browser agents should read the page, not just the buttons
I gave the browser loop the visible text it was missing, so Jev can see a price or error before calling the job done. merged in awlevin/typesafe-computer-use#23 → · Sep 2026
astroid · a common base representation of python source code for pylint and other projects
I taught astroid to infer values += (1, 2) on a list, so augmented concatenation with a tuple infers a list instead of Uninferable. merged in pylint-dev/astroid#3357 → · Oct 2026
gcsfs · Pythonic filesystem interface for Google Cloud Storage
I made size-integrity mismatches raise ChecksumError instead of relying on assertions, so consistency="size" still checks for corrupt transfers under python -O. merged in fsspec/gcsfs#1107 → · Oct 2026
pydantic-extra-types · extra Pydantic types
I made card number validation check the Verve ranges before the broader Discover prefix, so a Verve card in 650002 to 650027 no longer reports as Discover and a 17-digit one is rejected. merged in pydantic/pydantic-extra-types#429 → · Oct 2026
I made S3Path keep newlines in object keys, so a key with a newline in its prefix is no longer silently trimmed to a different last key. merged in pydantic/pydantic-extra-types#430 → · Oct 2026
I let DomainStr accept internal hyphens in punycode top-level domains, so delegated TLDs like xn--vermgensberater-ctb stop being rejected. merged in pydantic/pydantic-extra-types#431 → · Oct 2026
opencompany · run a hive mind of agents to focus on a specific goal
I removed the dead ChannelAdapter::inbound() stream that every adapter stubbed with an empty stream and nothing read, so the trait is now an honest outbound-only sink; a deprecated default keeps out-of-tree adapters compiling. merged in tinyhumansai/opencompany#2408 → · Oct 2026
I made the reserved-path test expect the right status for /acp (404 without the feature, 405 with it) and added the missing CI lane for server::routes, so the check that only failed on unscoped runs now runs in CI. merged in tinyhumansai/opencompany#2410 → · Oct 2026
I stopped the empty-retry from sending the user message twice: on retry the agent reloaded the failed turn's saved transcript and re-added the message, so I suppress that autoload on the retry and added regression tests. merged in tinyhumansai/opencompany#2421 → · Oct 2026
I made a setup answer cut off by the output limit report that instead of "model unreachable", and raised the setup output budget from 1,500 to 4,000 tokens so a reasoning model can think and still answer. merged in tinyhumansai/opencompany#2556 → · Oct 2026
I gave a setup run that stops on the output limit its own fallback reason, output_budget_exhausted, and both setup screens now say the model ran out of output room and offer a retry. merged in tinyhumansai/opencompany#2562 → · Oct 2026
click-repl · subcommand REPL for click apps
I stopped import click_repl from crashing when stdin is unavailable (sys.stdin is None), by treating that as non-interactive and keeping the isatty() check for a real stream. merged in click-contrib/click-repl#140 → · Oct 2026
models-web-app · KServe UI
I stopped an old SSE watcher from delivering callbacks to reconnected clients or overwriting their replay snapshot, by checking watcher generations before recording and sending events. merged in kserve/models-web-app#206 → · Oct 2026
more magpie fixes · the other twenty-four merged PRs
magpie · every agent's model, one place - Codex on DeepSeek, Claude Code on Kimi, from the menu bar
I made Gemini PDFs and audio survive text-only routes, so Magpie no longer treats every file part as an image. merged in yetone/magpie#95 → · Sep 2026
I stopped a reply translated from a dying gateway stream from reading as complete, so a dead upstream can't pass a cut-off answer off as finished. merged in yetone/magpie#78 → · Sep 2026
I stopped group images from being retried on text-only fallbacks, so a vision failure skips them instead of mangling the picture into text. merged in yetone/magpie#87 → · Sep 2026
I cleared the 400 on Responses images referenced by file_id, so stored images survive translation to Chat routes. merged in yetone/magpie#166 → · Sep 2026
I fixed usage accounting for SSE events split across data lines or missing a trailing newline, so streamed token counts stop vanishing. merged in yetone/magpie#94 → · Sep 2026
I fixed the Codex prompt cache so two accounts saving in the same mtime tick both keep their instructions. merged in yetone/magpie#74 → · Sep 2026
I made the long-turn router count providers hidden from the model picker, so a growing turn no longer stays pinned to the small model. merged in yetone/magpie#86 → · Sep 2026
I stopped disabled keys from being fetched during model refresh, with a regression test proving zero requests to them. merged in yetone/magpie#76 → · Sep 2026
I gave Gemini's session-affinity fallback a hash of the conversation to stick to, so keyless requests stop scattering across upstreams. merged in yetone/magpie#165 → · Sep 2026
I kept Gemini session affinity when the first turn omits its role, treating it as the user turn Gemini says it is. merged in yetone/magpie#171 → · Sep 2026
I stopped a multi-choice Chat stream from being flattened into one reply, so translation keeps the first readable choice instead of joining the rest. merged in yetone/magpie#168 → · Sep 2026
I fixed the TestSmartRouting hour-boundary flake by anchoring its reset fixture within one hour, so the five-hour tie-breaker stays deterministic. merged in yetone/magpie#77 → · Sep 2026
I kept YAML top-level strings as strings, so a model named like null or true is no longer read back as nil or bool, and single-quoted values with escaped quotes now decode whole. merged in yetone/magpie#431 → · Oct 2026
I kept large integers exact in the Cursor gateway's tool history, so IDs and results above 2^53 are no longer rounded when a call is replayed or its result is stored. merged in yetone/magpie#434 → · Oct 2026
I stopped inline comments from leaking into dotenv values in two readers, so GEMINI_API_KEY=abc123 # my key reads back as the key alone while quoted values keep their #. merged in yetone/magpie#439 → · Oct 2026
I made the Kimi model picker read TOML literal-quoted keys like [models.'kimi k2.5'], so models with spaces in their names stop being silently skipped. merged in yetone/magpie#446 → · Oct 2026
I escaped backslashes when quoting dotenv values on write, so a Windows path like C:\new folder\tmp round-trips instead of reading back with a newline and a tab. merged in yetone/magpie#450 → · Oct 2026
I kept a CRLF file's line endings when the dotenv, TOML and top-level YAML setters add or replace lines, so a Windows config file no longer comes back with bare \n on every edited line. merged in yetone/magpie#829 → · Oct 2026
I did the same for JSON and JSONC edits, so SetJSON on a CRLF file keeps \r\n on the lines it adds. merged in yetone/magpie#830 → · Oct 2026
I did the same for the YAML round trip, so SetYAML, DelYAML and EditYAMLStrings no longer rewrite every line of a CRLF file as LF. merged in yetone/magpie#831 → · Oct 2026
I made a dotenv key that appears twice read and write its last line, as dotenv does, so wiring Gemini CLI to the gateway edits the line the CLI actually uses. merged in yetone/magpie#832 → · Oct 2026
I held a catalog model's prompt cap to its context window, so rows like opencode/hy3-free no longer serve an input limit above the window the gateway advertises. merged in yetone/magpie#1288 → · Oct 2026
I made a background quota reading write the account's quota history too, so a magpie serving only other magpies no longer keeps an empty history, with the writes batched off the routing wait path. merged in yetone/magpie#1318 → · Oct 2026
I made the sessions page limit count nonempty sessions only, so a newest empty session file no longer eats the whole page or wins an mtime tie. merged in yetone/magpie#1324 → · Oct 2026
I stopped Hermes compression from copying long user messages into summaries; the maintainer carried my fix into the merged PR, with credit in its history. merged via NousResearch/hermes-agent#124966 → · Sep 2026
I traced why Anthropic tool_result images died with a 400 on Chat translation; the maintainer shipped his own version of the fix in v0.1.348, crediting the find in the commit message. fixed via yetone/magpie@504b470 → · Sep 2026
I made unanswered user text survive the next turn's persist override; after my PR was closed unmerged, the maintainer carried all four of my commits to main with authorship intact. merged via NousResearch/hermes-agent#126615 → · Sep 2026
I kept clarify and connection cards open for /btw side tasks; the maintainer's expanded take (/bg too, plus an attachment guard) carried two of my commits to main and co-credited me on his. merged via NousResearch/hermes-agent#127051 → · Sep 2026
I made scaffold generation read the vendored AIP specs instead of the sibling checkout; another contributor's PR carried the approach to main, crediting it in the description. merged via agentproto/ts#1622 → · Sep 2026
- What state must survive a retry, and what must never run twice?
- Where should a tool's permission boundary live when providers translate requests differently?
- How can memory and retrieval preserve the exact evidence behind an answer?
- Which latency and quality measurements reflect the real system rather than a friendly demo?
Implementation notes, demos and adjacent projects
IntelliRAG
I wanted to know where RAG actually breaks.
ingestion → chunking → hybrid retrieval → rerank → citations → evaluation → observability
The live browser lab exposes issue ingestion, cited retrieval traces and a lexical knowledge graph. The public demo currently uses temporary keyword/extractive mode; persistent hybrid retrieval and real-provider evaluation are next. The Python platform has separate deterministic CI benchmarks.
Graph-first vector retrieval with weighted shortest-path ranking is now in main (PR #9).
try the live lab → · read the measured audit →
memoRABLE
What if documents became memory?
Six source-linked blocks. Click a memory, the original lines light up. Publish once to email / web / doc without rewriting the truth. Local-first.
ThermoSense · hyperlocal temperature forecasting
Can a forecast know your rooftop?
Ground truth → commercial API bias → ensemble forecast → public leaderboard → retrain. The product is the loop, not the model name.
Finsight
Can an AI answer also explain how much it should be trusted?
Multi-agent research with freshness, source diversity, versioned knowledge, and a confidence score you can inspect.
infer-tab
What changes between prefill and decode?
CPU-only KV-cache experiments write traces of attention arithmetic and tensor bytes; a Next.js visualizer replays them. No model download needed.
| Work | One thing you can check |
|---|---|
| IntelliRAG | On 15 answerable questions from one pinned README, required-evidence recall improved from 36.7% to 70.0%; plain BM25 scored 73.3%. Retrieval-only, no LLM accuracy claim. Protocol and raw evidence. |
| memoRABLE | Six source-linked memory blocks with click-through to the original lines. |
| ThermoSense | Live dashboard and a public forecast leaderboard. |
| infer-tab | CPU-only KV-cache / prefill-decode traces, replayed in a Next.js visualizer. |
| magpie | Twenty-seven merged PRs: #74, #76, #77, #78, #86, #87, #94, #95, #164, #165, #166, #168, #169, #170, #171, #431, #434, #439, #446, #450, #829, #830, #831, #832, #1288, #1318, #1324. |
| openmuse | #45 fixes duplicate artifacts on interrupted file steps - merged Oct 6. |
My analytics work keeps the design question honest: which failure matters to the user, and how would we measure the fix? I want the architecture to explain a product's behavior, not just name its components.
The 2 seconds you never see
I thought I knew what happened after you hit enter. I was wrong.
More when I have something worth saying → Substack
measure → build → break → learn → repeat
Write the tradeoff down. Keep eval next to the code. Prefer systems that fail in known ways. Same rule for product: if I can't explain the funnel step, I don't trust the feature yet.
→ execution identity, checkpoints and retry-safe side effects
→ memory and retrieval with inspectable provenance
→ tool contracts across model providers
→ evaluation that separates retrieval quality, answer quality and system latency
The niche is agentic systems. The method is to make the boundaries visible, then test where they fail.
GitHub · Substack · Portfolio · Email
BITS Pilani · dual degree · class of 2026 · MiQ analyst, MENA · ex-Flipkart product analytics
Older experiments stay public. The four above are the ones that still feel like me.


