<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Willian Pinho — Blog</title>
    <link>https://willianpinho.com/blog</link>
    <description>Thoughts on software architecture, AI/ML systems, production engineering, and building products as a solo founder.</description>
    <language>en-us</language>
    <lastBuildDate>Mon, 05 Oct 2026 21:03:28 GMT</lastBuildDate>
    <atom:link href="https://willianpinho.com/rss.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Recall is not enforcement</title>
      <link>https://willianpinho.com/blog/recall-is-not-enforcement</link>
      <guid isPermaLink="true">https://willianpinho.com/blog/recall-is-not-enforcement</guid>
      <pubDate>Tue, 18 Aug 2026 14:00:03 GMT</pubDate>
      <description>Palantir published this discipline in 2017 and Anthropic files it under debugging rather than auditing. I borrowed the protocol from Atomic Red Team and ran it against all ninety guard hooks in my own harness: 28 of the 31 that can refuse were watched refusing, two cannot fire at all, and two more block correctly while not being armed.</description>
      <category>ai</category>
      <category>agents</category>
      <category>guardrails</category>
      <category>process</category>
    </item>

    <item>
      <title>The API layer that was fake all the way down</title>
      <link>https://willianpinho.com/blog/api-layer-that-was-fake</link>
      <guid isPermaLink="true">https://willianpinho.com/blog/api-layer-that-was-fake</guid>
      <pubDate>Sat, 15 Aug 2026 13:00:03 GMT</pubDate>
      <description>A generated client with a baseUrl nothing ever reads, and no transport anywhere. I wrote the retry and error layer the usual advice asks for, ran it against that boundary and then against a real one, and counted what the switch turned on: three dead branches, one that was wrong in a way nothing local could reveal, and a timeout that cancels nothing. Then six classifiers instead of one, because the first three defects might have been mine.</description>
      <category>architecture</category>
      <category>api</category>
      <category>integration</category>
      <category>testing</category>
    </item>

    <item>
      <title>The guard that would have blocked its own investigation</title>
      <link>https://willianpinho.com/blog/guard-that-blocked-its-own-investigation</link>
      <guid isPermaLink="true">https://willianpinho.com/blog/guard-that-blocked-its-own-investigation</guid>
      <pubDate>Sat, 08 Aug 2026 13:00:04 GMT</pubDate>
      <description>Deny-by-default is the right posture for agent tool access and the wrong one for a workflow guard. The difference is which error you cannot recover from, and a hook that blocked cat, grep and git diff on the very script it was guarding is what taught me to check.</description>
      <category>devtools</category>
      <category>automation</category>
      <category>ai</category>
      <category>agents</category>
    </item>

    <item>
      <title>Do your agent system prompts do anything? I measured 19 of mine</title>
      <link>https://willianpinho.com/blog/do-your-agent-system-prompts-do-anything</link>
      <guid isPermaLink="true">https://willianpinho.com/blog/do-your-agent-system-prompts-do-anything</guid>
      <pubDate>Thu, 06 Aug 2026 14:00:03 GMT</pubDate>
      <description>A null-prompt ablation across 19 agent configurations: 13 survive the noise floor, four say more about the tests than about the prompts, and two stay unresolved because their assertion graded a literal output signature rather than behaviour. Anthropic runs the same kind of ablation on Claude Code and reports the opposite direction. The difference is scope.</description>
      <category>ai</category>
      <category>llm</category>
      <category>testing</category>
      <category>agents</category>
    </item>

    <item>
      <title>A success code that hides a failure</title>
      <link>https://willianpinho.com/blog/success-code-that-hides-a-failure</link>
      <guid isPermaLink="true">https://willianpinho.com/blog/success-code-that-hides-a-failure</guid>
      <pubDate>Sat, 01 Aug 2026 13:00:04 GMT</pubDate>
      <description>An HTTP 200 means the request came back, not that the work happened. A rotated token, an alerting path that went silent for days, and why the same trap gets worse once agents are wired to real tools.</description>
      <category>observability</category>
      <category>api</category>
      <category>ai</category>
      <category>agents</category>
    </item>

    <item>
      <title>Multi-LLM routing in production: the failure modes nobody warns you about</title>
      <link>https://willianpinho.com/blog/multi-llm-routing-production-failure-modes</link>
      <guid isPermaLink="true">https://willianpinho.com/blog/multi-llm-routing-production-failure-modes</guid>
      <pubDate>Wed, 29 Jul 2026 16:14:03 GMT</pubDate>
      <description>Multi-LLM routing looks clean on a whiteboard. In production the real risk is the cost math that hides its own downside, latency treated as a single number instead of a distribution, and the silent failures that return a clean HTTP 200.</description>
      <category>llm</category>
      <category>routing</category>
      <category>ai</category>
      <category>production</category>
    </item>

    <item>
      <title>Fail-close: the tool-access default every AI agent should ship with</title>
      <link>https://willianpinho.com/blog/fail-close-agent-tool-access-default</link>
      <guid isPermaLink="true">https://willianpinho.com/blog/fail-close-agent-tool-access-default</guid>
      <pubDate>Wed, 15 Jul 2026 14:45:18 GMT</pubDate>
      <description>Why AI agents wired to real tools through MCP should default to deny, and how to build the per-operation, audited RBAC that makes fail-close real.</description>
      <category>mcp</category>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
    </item>

    <item>
      <title>MCP in production: what I learned maintaining a server that works in Claude Code, Cursor, and Gemini</title>
      <link>https://willianpinho.com/blog/mcp-in-production</link>
      <guid isPermaLink="true">https://willianpinho.com/blog/mcp-in-production</guid>
      <pubDate>Fri, 03 Jul 2026 16:38:59 GMT</pubDate>
      <description>What survived contact with real usage maintaining an MCP server across three clients I never built for: fail-close defaults, replayable observability, and tool descriptions as the real interface.</description>
      <category>mcp</category>
      <category>agent-engineering</category>
      <category>software-engineering</category>
      <category>observability</category>
    </item>

    <item>
      <title>I ran an MCP-gateway production-readiness audit on a popular open-source LLM gateway. Here&apos;s what it found.</title>
      <link>https://willianpinho.com/blog/mcp-gateway-production-readiness-audit</link>
      <guid isPermaLink="true">https://willianpinho.com/blog/mcp-gateway-production-readiness-audit</guid>
      <pubDate>Tue, 30 Jun 2026 20:40:31 GMT</pubDate>
      <description>I ran an MCP-gateway production-readiness audit on a popular open-source LLM gateway. Here&apos;s what it found.</description>
      <category>mcp</category>
      <category>llm</category>
      <category>ai</category>
      <category>security</category>
    </item>

    <item>
      <title>Pre-mortem as plan debugger</title>
      <link>https://willianpinho.com/blog/pre-mortem-as-plan-debugger</link>
      <guid isPermaLink="true">https://willianpinho.com/blog/pre-mortem-as-plan-debugger</guid>
      <pubDate>Tue, 23 Jun 2026 17:00:48 GMT</pubDate>
      <description>The pre-mortem is the cheapest way I know to catch the preventable failures before they ship. The 25-minute version I actually run, and when not to bother.</description>
      <category>engineering</category>
      <category>planning</category>
      <category>productivity</category>
      <category>career</category>
    </item>

    <item>
      <title>I wrote a read-only scanner for MCP / agent-gateway production-readiness</title>
      <link>https://willianpinho.com/blog/mcp-gateway-scan-production-readiness</link>
      <guid isPermaLink="true">https://willianpinho.com/blog/mcp-gateway-scan-production-readiness</guid>
      <pubDate>Tue, 09 Jun 2026 12:00:00 GMT</pubDate>
      <description>A free MIT CLI that scans a repo for seven classes of AI-agent-gateway anti-patterns — tool-access/RBAC, fail-close, supply-chain pinning, observability, multi-LLM routing, secrets, production-readiness — runs as a CI gate, and exposes itself as an MCP server.</description>
      <category>mcp</category>
      <category>ai</category>
      <category>security</category>
      <category>devops</category>
      <category>agents</category>
    </item>

    <item>
      <title>The cross-origin observability tax</title>
      <link>https://willianpinho.com/blog/the-cross-origin-observability-tax</link>
      <guid isPermaLink="true">https://willianpinho.com/blog/the-cross-origin-observability-tax</guid>
      <pubDate>Fri, 05 Jun 2026 12:00:00 GMT</pubDate>
      <description>When one team adds a request header, the backend CORS allowlist becomes a coordination point. Here is what that tax actually costs, why it fails silently, and four patterns for handling it.</description>
      <category>observability</category>
      <category>cors</category>
      <category>otel</category>
      <category>reliability</category>
      <category>distributed-tracing</category>
    </item>

    <item>
      <title>The agent runtime event model</title>
      <link>https://willianpinho.com/blog/the-agent-runtime-event-model</link>
      <guid isPermaLink="true">https://willianpinho.com/blog/the-agent-runtime-event-model</guid>
      <pubDate>Sun, 24 May 2026 12:00:00 GMT</pubDate>
      <description>Four runtime events, four policy-attachment surfaces, and the hook coverage at each event is what separates a demo from something a regulated buyer will sign for. Framework selection is a distraction.</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>architecture</category>
      <category>mcp</category>
    </item>

    <item>
      <title>Large File MCP: Handle Massive Files in Claude with Intelligent Chunking</title>
      <link>https://willianpinho.com/blog/large-file-mcp-intelligent-chunking</link>
      <guid isPermaLink="true">https://willianpinho.com/blog/large-file-mcp-intelligent-chunking</guid>
      <pubDate>Wed, 15 Apr 2026 12:00:00 GMT</pubDate>
      <description>A production-ready MCP server that makes working with large files in Claude Desktop and AI assistants effortless — smart chunking by file type, line-level navigation, regex search, and streaming for files up to 10 GB.</description>
      <category>mcp</category>
      <category>ai</category>
      <category>claude</category>
      <category>typescript</category>
      <category>developer-tools</category>
    </item>
  </channel>
</rss>