Funnet av N18-roundtrip-røyken: render-suiten var grønn 1 av 4 kjøringer, ikke
"grønn siden N13" som STATE påsto. Rotårsaken er produksjonskode, ikke en test-flake.
runChromeScreenshot.finish() sender SIGKILL til forelder-Chrome og resolver
umiddelbart uten å vente på at prosessen dør. SIGKILL på forelderen dreper ikke
dens renderer/GPU-barn, som fortsetter å skrive inn i --user-data-dir under
workDir mens finally-blokken traverserer samme katalog. rmSync tømmer den, nye
filer dukker opp, og fjerning av selve katalogen feiler med ENOTEMPTY. Ren
timing-race — derav de ~50 %.
Brukerkonsekvensen var den verste sorten: PNG-en skrives til outPath UTENFOR
workDir og er allerede ferdig når dette skjer, så oppryddingen veltet et render
som faktisk lyktes.
Fix: cleanupWorkDir() — eksplisitt retry-løkke (testbar med injisert rm) pluss
fs sine egne maxRetries/retryDelay, og den kaster aldri. En temp-katalog som blir
liggende er en bagatell mot å miste et ferdig bilde; OS rydder tmpdir.
TDD: rødt bevist først (manglende eksport), så 3 tester på kontrakten — svelger
ENOTEMPTY og forsøker på nytt, fjerner katalogen i normaltilfellet, gir seg stille
når den allerede er borte.
render 60/0 -> 63/0, grønn 5 av 5 kjøringer (var 1 av 4). test-runner 270/0.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QxvWAjte7vPcF79QeSRvRJ
Plugin eier hele render/ (KTG-go 16.07, eierskapsvalg a). Portet fra
maskinrommets tools/build-html.mjs (read-only): flerlinjers blockquote
(avsnitt i quote), [tekst](url)-lenker med http/https/mailto-whitelist,
FIGUR-markoer -> inline SVG med figcaption + fallback til blockquote.
CSS for de tre konstruktene. 7 nye paritetstester (repoets testtilfeller
kopiert + med-SVG-case); paritetsbevis: samme fixture gjennom begge
motorer = byte-identisk parser-HTML. Render-floor 53 -> 60.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: c61b308e-e4fa-4a49-9ff0-a3ce725cf703