<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Antifailure</title>
    <link>https://antifailure.dev/blog</link>
    <description>A disposable copy of your production stack for every pull request: masked Postgres, contained third-party APIs, and agents that use your app like people.</description>
    <language>en</language>
    <atom:link href="https://antifailure.dev/blog/rss.xml" rel="self" type="application/rss+xml" />
    <lastBuildDate>Sat, 29 Aug 2026 00:00:00 GMT</lastBuildDate>
    <docs>https://www.rssboard.org/rss-specification</docs>
    <item>
      <title>Staging cannot tell you how long a lock is held</title>
      <link>https://antifailure.dev/blog/what-staging-misses-about-migrations</link>
      <guid isPermaLink="true">https://antifailure.dev/blog/what-staging-misses-about-migrations</guid>
      <pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate>
      <description>A migration that runs instantly against a seeded table can hold an exclusive lock for minutes against a real one. The difference is row count, and staging does not have it.</description>
      <category>Postgres</category>
      <category>Migrations</category>
      <category>Testing</category>
    </item>
    <item>
      <title>Masking data is easy. Proving it worked is the product.</title>
      <link>https://antifailure.dev/blog/proving-the-masking-worked</link>
      <guid isPermaLink="true">https://antifailure.dev/blog/proving-the-masking-worked</guid>
      <pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate>
      <description>Any UPDATE statement can overwrite an email column. The hard part is showing that nothing identifying survived anywhere, and that nobody can skip the check.</description>
      <category>Postgres</category>
      <category>Data masking</category>
      <category>Privacy</category>
    </item>
    <item>
      <title>There are five useful answers to an outbound HTTP call in a test environment</title>
      <link>https://antifailure.dev/blog/five-answers-to-an-outbound-call</link>
      <guid isPermaLink="true">https://antifailure.dev/blog/five-answers-to-an-outbound-call</guid>
      <pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate>
      <description>Most environments have two: let it through, or break. Neither is right for a payment processor, and the gap is where test runs charge real cards.</description>
      <category>Testing</category>
      <category>Networking</category>
      <category>Third-party APIs</category>
    </item>
  </channel>
</rss>
