6.3 KiB
id, title, status, wave, depends_on, plan, requirements, acceptance_criteria, system_design
| id | title | status | wave | depends_on | plan | requirements | acceptance_criteria | system_design | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 01-render-math | Render math across shared Markdown | done | 1 | plan.md |
|
|
|
Task 01: Render Math Across Shared Markdown
Summary
Integrate KaTeX throughout the shared Markdown pipeline. Preserve ordinary text, sanitizer safety, source positions, and phone readability.
In scope
- Install the requested packages through pnpm and update the workspace lockfile.
- Add stylesheet assets, shared plugins, and narrowly scoped syntax compatibility where required.
- Wire every shared-plugin consumer listed in the system design.
- Preserve preview sanitization and comment task-link behavior.
- Add meaningful unit, component, desktop, and phone coverage through TDD.
- Add the public syntax reference and record validation results.
Out of scope
- Editor extensions, specialized Markdown pipelines, backend changes, and new settings.
- Unrelated renderer refactoring or broader sanitizer changes.
Acceptance
- All mapped formula and compatibility criteria pass with the real rendering pipelines.
- Desktop and phone render readable formulas without page overflow or executable untrusted content.
- Required checks pass, documentation matches the implementation, and durable statuses reflect the results.
ASCII UI preview
UI-01: Formula reading, desktop and phone
Energy: E = mc^2
a
---
b
Cost: $100 and $200
See the full preview. Inline math stays in prose. Display math occupies its own region. Phone overflow stays local to that region. The existing view owns vertical scrolling. Spacing is illustrative. Applies to AC-UI-MARKDOWN-MATH-001.1 through 001.6 and 002.1.
Verification
Run from the repository root unless the command changes directories. If dependencies are absent, install them before running pnpm checks.
cd apps && pnpm install --frozen-lockfile
Install feature dependencies during the implementation phase:
cd apps/web && pnpm add remark-math rehype-katex katex
cd apps/web && pnpm add -D @types/katex
Run each command from a fresh repository-root shell:
cd apps/web && pnpm vitest run components/shared/markdown-components.test.tsx
cd apps/web && pnpm vitest run components/shared/markdown-math-renderers.test.tsx components/shared/memoized-markdown.test.tsx components/shared/chat-markdown-motion.test.tsx components/task/markdown-preview-content.test.ts components/task/markdown-preview-content.external-link.test.tsx
cd apps/web && pnpm run typecheck
cd apps/web && pnpm run lint
cd apps/web && pnpm e2e:run --project chromium e2e/tests/chat/markdown-math.spec.ts e2e/tests/chat/markdown-preview.spec.ts
cd apps/web && pnpm e2e:run --project mobile-chrome e2e/tests/chat/mobile-markdown-math.spec.ts
python3 scripts/list-docs.py validate
python3 scripts/lint-spec-files.py --all
node --test scripts/validate-public-docs.test.mjs
node scripts/validate-public-docs.mjs
git diff --check
If compatibility code is required, also run its focused tests:
cd apps/web && pnpm vitest run lib/markdown/remark-math-compat.test.ts
Record the failing test before implementation, then the passing result. The E2E runner rebuilds production assets. Run suites sequentially with the configured worker budget. Inspect desktop and phone screenshots in both themes. Record any unavailable runtime dependency as a blocker. Do not claim browser validation from component snapshots alone.
Files likely touched
apps/web/package.json,apps/pnpm-lock.yaml,apps/web/app/globals.css.apps/web/components/shared/markdown-components.tsxand its test file.- The eleven consumers listed in the system design, including the four primary renderers.
- Proposed
apps/web/lib/markdown/remark-math-compat.tsand its test file, if parser gaps require them. - Proposed
apps/web/lib/markdown/math-sanitize-schema.ts, if needed to share exact marker allowances. apps/web/lib/markdown/chat-text-motion-plugin.ts, only if motion integration tests require a subtree exclusion.apps/web/components/shared/{markdown-math-renderers,memoized-markdown,chat-markdown-motion}.test.tsx.apps/web/components/task/markdown-preview-content.test.tsand.external-link.test.tsx.apps/web/e2e/tests/chat/{markdown-math,mobile-markdown-math}.spec.ts.docs/public/sessions-and-review.mdand this design package's statuses/results.
Dependencies
None. Implementation is authorized by the current user request.
Risks
See the plan risks. Preserve existing schema attributes when extending the class allowlist. Do not weaken the currency assertion to accept KaTeX output.
Parallelism
sequential
Inputs
- Requirements.
- System design.
apps/web/AGENTS.mdandapps/web/components/task/chat/AGENTS.md.- Existing
markdown-components.test.tsx,mobile-markdown-wrap.spec.ts, andmarkdown-preview.spec.tspatterns. - Repository
/tdd,/e2e,/mobile-parity, and/docs-maintainerskills.
Results
Implemented shared KaTeX Markdown rendering across the shared plugin consumers. Added parsed-node compatibility for currency literals and single-line display formulas, preserved sanitizer ordering and chat motion boundaries, bundled KaTeX fonts through the Vite entry, added local phone overflow styling, and documented the supported syntax.
TDD RED was recorded before plugin wiring. The final focused suite passed 10 files and 63 tests, including preview source/comment mapping, raw delimiter whitespace, and sanitizer marker regressions. Typecheck, lint, production build, Chromium coverage (11 tests across light and dark themes), mobile Chromium coverage (2 tests for chat and the native file preview viewer), specification validation, public docs validation, and whitespace checks all passed on 2026-09-22.