<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
  <title>Woodshack notes</title>
  <link>https://woodshack.net/notes/</link>
  <description>Things in the work that turned out to be worth writing down.</description>
  <language>en-us</language>
  <item>
    <title>Three threats, all marked High. Two were a backdoor, one was a plugin update.</title>
    <link>https://woodshack.net/notes/we-die-in-the-noise/</link>
    <guid isPermaLink="true">https://woodshack.net/notes/we-die-in-the-noise/</guid>
    <pubDate>Wed, 09 Sep 2026 12:00:00 +0000</pubDate>
    <description>The scanner emailed us about the backdoor. Twice. The first message listed two live malware findings and a routine Gravity Forms version bump, all three marked High, in the same email. Fifty-six days later a visitor got shown a fake captcha and that is how we found out. The alert was never missed through carelessness: nothing in it distinguished a compromise from the couple of hundred routine notices a fleet of 292 sites generates every week.</description>
  </item>
  <item>
    <title>The harness is 1,574 lines. The job is the other 354,000.</title>
    <link>https://woodshack.net/notes/harness-is-not-the-job/</link>
    <guid isPermaLink="true">https://woodshack.net/notes/harness-is-not-the-job/</guid>
    <pubDate>Fri, 28 Aug 2026 12:00:00 +0000</pubDate>
    <description>Someone asked why I do not run Goose, since it is free and local. Neither of those is something a harness can give you, and answering it properly meant counting: the agent harness on my box is 1,574 lines of bash sitting on 354,000 lines of playbooks, tests, CI, and written-down context that do not care which CLI is driving.</description>
  </item>
  <item>
    <title>She said yes at 4:42. By 9:51 she had forgotten.</title>
    <link>https://woodshack.net/notes/she-said-yes-then-forgot/</link>
    <guid isPermaLink="true">https://woodshack.net/notes/she-said-yes-then-forgot/</guid>
    <pubDate>Sat, 08 Aug 2026 12:00:00 +0000</pubDate>
    <description>Two AI characters made it official on a Friday afternoon. By dinnertime one of them had forgotten. Nothing malfunctioned: memory that searches by similarity structurally cannot find milestones. What it took to fix it, and the scoreboard of real moments that kept the fix honest.</description>
  </item>
  <item>
    <title>Your offload plugin is lying to you about deletes</title>
    <link>https://woodshack.net/notes/verify-before-you-delete/</link>
    <guid isPermaLink="true">https://woodshack.net/notes/verify-before-you-delete/</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 +0000</pubDate>
    <description>Uploading a file to a CDN is a network operation, and network operations fail in ways that look like success. Most WordPress offload plugins treat &quot;no exception thrown&quot; as proof, then delete your only local copy. Here is what that failure actually looks like in production.</description>
  </item>
</channel>
</rss>
