~/aspesi.dev

Writing the whole archive, failure modes left in.

Notes from actually shipping things: Swift and SwiftUI in production, TypeScript agents on LangGraph, and the agentic-dev harness I keep sharpening around Claude Code. Newest first. Nothing here is a tutorial I haven't run myself.

14 posts

2026

9 posts
  1. Teaching Claude Code to review its own PRs

    A judge agent, two independent reviewers, and a rule file per repo. What a self-review pipeline catches, what it confidently invents, and the prompt changes that closed the gap.

    #agents#claude-code 11 min

  2. LangGraph checkpoints as a debugging superpower

    Checkpoints aren't just resumability — they're a time machine. Replaying a misbehaving agent from any node, diffing state between runs, and the checkpointer I ended up writing.

    #langgraph#typescript 9 min

  3. The case for boring test infrastructure

    Clever test frameworks rot faster than the code they test. Why I keep choosing flat fixtures, real assertions, and one slow end-to-end suite over anything exciting.

    #testing#opinion 7 min

  4. Writing an MCP server a model will actually use correctly

    Tool descriptions are prompts, and most MCP servers write them like API reference docs. Naming, argument shape, and error strings that steer a model back on task instead of into a retry loop.

    #agents#claude-code 10 min

  5. Evals for agents that edit code

    Diffing against a golden patch is the wrong metric — a real edit has many correct shapes. The rubric I settled on, why I run every suite twice, and how much variance to tolerate before calling it a regression.

    #agents#testing 13 min

2025

5 posts
  1. Snapshot tests I don't regret

    Most SwiftUI snapshot suites become a wall of noise nobody reads. Pinning the device matrix, testing states instead of screens, and deleting every test that only ever failed on a system font update.

    #testing#swift 8 min

  2. Structured output beat every prompt trick I tried

    Months of prompt tuning to stabilize one agent's output, undone in an afternoon by a Zod schema. Where schema-constrained generation is a free win, and where it quietly costs you reasoning quality.

    #langgraph#typescript 9 min

  3. CLAUDE.md is a product surface

    Written like documentation, an agent instruction file gets long and ignored. Written like an API — few rules, each testable, each naming the failure it prevents — it starts doing work.

    #claude-code#agents 7 min

  4. Shipping a SwiftUI app with no view-model layer

    I cut MVVM out of a real app to find out what would break. Mostly nothing — but the two places it genuinely hurt are worth knowing before you copy the experiment.

    #swift#ios 11 min