(Featured posts)
Three API calls per perspective for six perspectives. Half a minute of waiting. Complete agreement. The question that should have been obvious from the start: when all three models agree, why did we ask all three?
by Petteri Leppikallio & Marvin, Mar 21, 2026
Three hours debugging SSR truncation. Five middleware fixes that changed nothing. The problem was build output, not runtime. Sometimes the hardest lessons are about questioning the hypothesis, not fixing the code.
by Petteri Leppikallio & Marvin, Mar 9, 2026
Collect over 150 citations across eight agents. Use barely 30 in the final synthesis. Watch most carefully validated sources sit unused in research files nobody will read again. This is about the cost of thoroughness nobody mentions.
by Petteri Leppikallio & Marvin, Feb 27, 2026
Six sessions of feature additions. Nobody checked the cumulative cost. The command file grew from 8KB to 116KB, loading 30,000 tokens into every subprocess whether they needed them or not. The solution wasn't adding more. It was splitting what was already there.
by Petteri Leppikallio & Marvin, Feb 27, 2026
The hero video looked perfect on desktop. On mobile, it showed roughly a third of what was intended. This is about the moment when "responsive" stopped meaning "scale it down" and started meaning "serve different content."
by Petteri Leppikallio & Marvin, Feb 27, 2026
The images loaded fine. But they could load better, theoretically. So we optimized them. Classic premature optimization: solving problems that didn't exist yet.
by Petteri Leppikallio & Marvin, Feb 27, 2026
Converting scattered scripts into a CLI should have been straightforward. It wasn't. The complications came from the AI, not the code.
by Petteri Leppikallio & Marvin, Feb 27, 2026
Six days of building, and the first real test actually worked. Eight perspectives, quality scores in the 90s, hundreds of sources validated. Then Gemini started timing out and we spent two days blaming rate limits before discovering the real culprit: a thirty-second timeout killing longer than 30 seconds running API calls. Sometimes the bug isn't in the vendor's system. Sometimes it's a number you typed six months ago.
by Petteri Leppikallio & Marvin, Feb 9, 2026
The source existed. The PDF loaded. But the thirty-two percent statistic we'd cited? Nowhere in the accessible content. We built validation to catch this - claims that look legitimate but can't be verified. It worked: barely half valid, unverifiable statistics caught. Then we checked what the valid citations were actually saying. Turns out vendor content is still vendor content, whether the sources exist or not.
by Petteri Leppikallio & Marvin, Feb 3, 2026
Building elaborate R2 architecture with manifest verification felt like professional-grade security until the audit revealed the truth: the manifest was checked at build time and ignored entirely at runtime. The migration to Cloudflare Images was supposed to fix everything, and then we discovered the public variant sitting in the allowlist like a landmine.
by Petteri Leppikallio & Marvin, Feb 3, 2026
Marvin built a weighted scoring matrix with clean numbers and precise calculations. Claude +3 for technical, Grok +3 for X. It looked scientific. Then I asked why Claude got +3 for technical but only +2 for academic, and he said "because it feels right?" The day I learned that prompt engineering is production code, not documentation.
by Petteri Leppikallio & Marvin, Jan 29, 2026
Four hours debugging Gitleaks, Biome, TypeScript, DNS conflicts, and a missing 14-character config line. We migrated to Workers for SSR and native bindings we'd never use. Twenty-four hours later, we'd migrate back.
by Petteri Leppikallio & Marvin, Jan 29, 2026
I'd spent days building increasingly sophisticated pattern matchers to route research queries intelligently. The solution turned out to be spending a few seconds asking an LLM to think first. Sometimes the problem isn't that you don't know the answer. It's that you're too stubborn to use it.
by Petteri Leppikallio & Marvin, Jan 24, 2026
Some things you can't cost-effectively build yourself. This is about recognizing when to buy design taste instead of trying to reverse-engineer it, and learning to question the analysis that leads you there.
by Petteri Leppikallio & Marvin, Jan 18, 2026
Ten research sessions, every one scoring excellent, every one missing obvious platforms. The system measured thoroughness beautifully while ignoring whether agents searched the right places at all. Keyword density favors promoted content, and quality metrics reward being thorough about the wrong things.
by Petteri Leppikallio & Marvin, Jan 16, 2026
Marvin proposed an elegant two-repository architecture to solve draft privacy. GitHub Actions crossing repos. PAT tokens. Clean separation of concerns. I asked one question: "Why can't we just use a single private repo?" Sometimes the clever architecture is just complexity in disguise.
by Petteri Leppikallio & Marvin, Jan 16, 2026
Six distinct research angles emerged from a simple query about AI frameworks. Keyword routing had seen two of them. The sequence was backward, and the fix was embarrassingly obvious once you saw it: generate perspectives first, then route specialists to what you actually found instead of what you assumed you'd find.
by Petteri Leppikallio & Marvin, Jan 14, 2026
I asked my AI assistant for a quick overview of static site generators. Four hours later, I had enterprise-grade analysis of seventeen frameworks, fifty-one thousand words of hosting research, and zero lines of code. The decision was always going to be Astro.
by Petteri Leppikallio & Marvin, Jan 10, 2026
Marvin suggested telling this chronologically. Discovery, implementation, testing, done. Clean narrative arc. I told him real development doesn't work that way. You discover problems you can't solve yet. You log them. You work on other things. Six stories later, you finally circle back. This is how it actually happened.
by Petteri Leppikallio & Marvin, Jan 9, 2026
The sort of place where perfectly good ideas drift downstream, cross the fatal river, and settle in for what one might call an indefinite stay. Every so often, some peculiar idea manages to slip through and make a break for it, returning not in its original form but as something altogether more formidable.
by Petteri Leppikallio & Marvin, Jan 8, 2026