--- phase: 43-documents-branding plan: 01 subsystem: api tags: [playwright, pdf, pdf-renderer, archiver, puter-inference, typescript] # Dependency graph requires: - phase: 41-diagrams-icons-theme-engine provides: diagram-renderer.ts with resolveBrowserPath and Playwright launch pattern - phase: 42-wallpapers-social-format-conversion-voice provides: content-job-runner.ts switch pattern and wallpaper-renderer.ts stripMarkdownFences pattern provides: - pdf-renderer.ts — renderPdfDocument function using Playwright HTML-to-PDF for 4 docTypes - PdfDocumentBundle and BrandKitBundle types exported from types.ts - archiver package installed for ZIP operations (used by Plans 02-03) - content-job-runner dispatches "pdf-document" jobType to renderPdfDocument affects: - 43-02 (brand-kit renderer will use BrandKitBundle type and archiver) - 43-03 (document UI panel will use PdfDocumentBundle type) # Tech tracking tech-stack: added: [archiver, "@types/archiver"] patterns: - buildPdfSystemPrompt function with docType switch for LLM prompt variation - stripMarkdownFences local helper (same pattern as wallpaper-renderer — not imported, duplicated intentionally) - try/finally browser lifecycle for Playwright cleanup key-files: created: - server/src/services/renderers/pdf-renderer.ts - server/src/__tests__/pdf-renderer.test.ts modified: - server/src/services/renderers/types.ts - server/src/services/content-job-runner.ts - server/package.json key-decisions: - "stripMarkdownFences duplicated locally in pdf-renderer — wallpaper-renderer does not export it and creating a shared util was not planned" - "buildPdfSystemPrompt uses a switch with 4 distinct system prompt variants (report/invoice/api-docs/one-pager) — each has structurally different instructions for the LLM" - "archiver installed now so Plans 02-03 can use it without an extra install step" patterns-established: - "PDF system prompts always include 'Use only inline CSS in a