All notes

Field note 2

This site is built by Claude Code, running in Claude's cloud sessions. Every change goes through a pull request that I read and merge. One of those changes took the site down.

What happened

Cause

Embedded files are named from their folder path:

<EmbeddedResource Include="Content\**\*" LogicalName="packs/%(RecursiveDir)%(Filename)%(Extension)" />

%(RecursiveDir) uses the build machine's separator. CI builds on Linux: packs/aspnet-web-api/01-commands.md. The deploy builds on Windows: packs/aspnet-web-api\01-commands.md.

The packs loader split names on /. With no / after the prefix, it sliced past the end of the string and threw ArgumentOutOfRangeException in the constructor of a singleton, on every request that resolved it.

The gallery loader, written earlier in the same solution, already replaced \ with /. The packs loader did not reuse it.

Why nothing caught it

Reproduced on a Windows runner: 26 catalog tests failed on main after the revert, 79 with the gallery change.

What changed

Checks worth stealing

None of Aibysitter's pull request checks would have caught this. P001 to P004 flag placeholder identifiers, TODO stubs, tests that assert nothing and files outside the declared scope; the change had none of those. It was a difference between build environments, not a pattern in the diff. Reviewing agent output after the fact has that limit.