I build the boring layer under AI agents: the part that records what they did, replays it, and refuses to let them ship something broken. Chemist first, software second — the lab habit of "write down every step or the result doesn't count" turned out to be the whole job.
Currently at @StuDocu, in the Netherlands.
| span | what it is | stack |
|---|---|---|
| samsara | Deterministic replay and fault injection for LLM agents. Record every effect an agent performs, replay it offline, fork it, and break it on purpose. | Rust WebAssembly |
| a11y-render-gate | An accessibility gate inside the agent loop. Renders the UI an agent just wrote and reports contrast, focus visibility, hit targets and label wiring as computed facts with fixes attached — then blocks the turn until they're fixed. | TypeScript Playwright MCP |
| asdesigned · maher-portfolio | Design-to-code experiments and the current portfolio rebuild. | TypeScript |
Both agent projects come from the same complaint: an agent will happily tell you it succeeded. Neither a replay log nor a contrast ratio is interested in what the agent claims.
| repo | what | status | |
|---|---|---|---|
✓ |
airbnb/lottie-ios | #2704 — a track matte referenced by tp was never decoded, so the matte layer rendered as an ordinary layer — usually a bright helper colour nobody meant to ship — and the layers that wanted it got matted by whatever happened to sit next to them. |
merged |
→ |
prettier/prettier | #20106 — wrapping could move inline HTML to the start of a line, where CommonMark stops reading it as inline. One paragraph quietly became three blocks. | open |
→ |
prettier/prettier | #20075 — unstable comment attachment on a parenthesized arrow body. Two handlers were fighting over the same comment, so formatting the same file twice gave two different files. | open |
→ |
expo/expo | #50215 — Exception dropped the description it was created with, so every promise.reject(code, description) reached JavaScript as undefined reason. |
open |
All four were found the same way: reproduce it, then build a differential harness and let it tell you how wide the bug actually is. The arrow-body one turned out to be 208 unstable cases, not 4. The HTML one was six of CommonMark's block conditions, not just the comment in the report. The lottie fix was checked against both implementations it replaced across all 366 compositions in the sample suite before it went up — which is how I knew it wouldn't move a single existing snapshot.
TypeScript pays the bills. Rust is where the systems work goes. The Swift and Dart at the bottom of the bar are 2022 — see the archive. The 2026 Swift is upstream, in someone else's repo.
Older spans, kept because deleting your own history is bad instrumentation:
textToSpeach · PhotoMania ·
SwiftUI-weatherApp Swift —
flutter_sub_reddit_app Dart —
Expensify-APP · SocialApe ·
isomorphic-react React
Language mix computed from the GitHub GraphQL API across 25 owned, non-fork repositories (2,375,272 bytes). Header and chart are hand-written SVG — no third-party stats service to rate-limit, expire, or quietly start serving someone else's numbers.



