- Jest under Yarn PnP: `transformIgnorePatterns` now transforms the ESM-only unified chain (PnP cache zips carry `/node_modules/` segments, so the old exclusion skipped them) (#blog-5, 4ea7f05).
- Blog content ships as neutral fixtures — prose is the owner's via git; no Claude-authored "draft in your voice" scaffolds (see memory `feedback_no-claudespeak-prose`).
- Builder briefs carry: fixture-final clause, report-don't-fix clause, and the documented zero-test baseline means "No tests found" IS green.
"learnings":"Static export default (no trailingSlash) emits out/blog.html + out/blog/<slug>.html — the erable vhost try_files $uri $uri.html matches it natively; no mode drift between next.config and nginx needed."
},
{
"id":"blog-4",
"subject":"Repo rationalization: origin → git.nech.pl, next/ detritus deleted, main reconciled",
"completedAt":"2026-09-06",
"learnings":"git.nech.pl main had a stray feat/v0.2 merge (merge-base 1fd386d, not ancestor of HEAD); `merge -s ours` absorbed it with empty content diff — history reconciled without data change."
},
{
"id":"exit-1",
"subject":"me.nech.pl cutover: vhost + certbot webroot + TLS + 301, HTTPS live on erable",
"completedAt":"2026-09-06",
"learnings":"nginx 1.10.3 won't blink on the wire when -t fails — reload refuses and the old in-memory config keeps serving; the catch happens pre-reload. Also: a real-DNS 200 during cutover is ambiguous (Vercel still answers) — fingerprint via a route only one server has (/blog) or Server headers."
"learnings":"PNG is the wrong codec for photographic renders at any resize; JPEG q84 at 1600px was 64× lighter. Incident: something pruned Node 20's lib/node_modules (likely a disk-hygiene pass) leaving broken bin shims — nvm trees are toolchain, not cache; guard cleanup there."