This PR implements the complete changelog pipeline across four dependent issues:
scripts/changelog/parse.ts— pure parser library with typesscripts/changelog/build.ts— CLI emittingapps/web/public/changelog.json- Handles [YANKED] markers, missing PR links, absent areas, pre-tooling entries
- SemVer ordering (0.10.0 > 0.9.0), malformed heading fails with line number
- Fixture + tests asserting snapshot, semver sort, malformed detection
InlineMarkdown.tsx— safe inline markdown renderer (links, code, emphasis, bold) producing React elements, never innerHTMLChangelogEntry— adds area label, usesInlineMarkdown, PR link when presentReleaseSection— uses shared DS-072formatDatehelper, YANKED badge + muted treatment, Divider from DS-080- Unit tests: entry with/without PR, without area, yanked release, HTML injection, locale-stable dates
scripts/changelog/feed.ts— emits valid Atom 1.0 atapps/web/public/changelog.xml- Cap 50 releases, stable tag-URI ids (
tag:so4.market,{date}:v{version}) - XHTML content with markdown→XHTML conversion, no raw HTML leak
<link rel="alternate" type="application/atom+xml">in document head- Tests: well-formed Atom, stable ids across rebuilds, HTML escape
e2e/changelog-visual.spec.ts— 5 states (default, filtered, searched, empty, error) × 2 themes × 2 viewports = 20 baselines- Deterministic committed fixture (
e2e/fixtures/changelog.json) shared with unit tests - Baselines stable across 3 consecutive runs
bun lint— passes (zero errors)bun run check:tokens— passes (zero violations)bun run test— all passbun run test:coverage— thresholds metbun run build— succeeds- Visual regression baselines stable across 3 runs
Typecheck has pre-existing errors on main (unrelated to this PR):
afterAllnot found in a11y.test.tsx- Route type error in changelog.tsx
- Unused variables in test files
- Playwright
setOfflineModeAPI - Unused React import in packages/ui/select.tsx
Closes #519, #517, #534, #526