"subject":"Couple rebuilt in React on the shared Clarté kit, ICP-tested, deployed behind auth",
"completedAt":"2026-09-22",
"learnings":"CSS modules reject :root even via :global under Next 15 flight loader — design tokens belong in a plain global stylesheet imported by layout. Mount-time document listeners freeze on first-render closures unless the subtree remounts per screen (key=qid:pos). nginx location ^~ /couple/ (trailing slash) does not match /couple — an auth gate must use the bare prefix. The ICP persona workflow (icp-user-test) caught a keyboard blocker 82 jest tests called correct."
},
{
"id":"clarte-5",
"subject":"Full Clarté migration done: TDAH FR/EN React at /tdah + /adhd, couple share-all + PDF + compare",
"completedAt":"2026-09-23",
"learnings":"React client components render an empty shell in static export: grep-based smoke tests must be replaced by headless-browser probes. New JSX transform means no React import, but any stray 'React.' reference crashes at runtime only — jest + RTL catches it, raw build does not. Fragment-keyed share payloads: one key (#p=) per questionnaire, a second (#a=) for the whole journey; the decode layer dispatches on kind."