diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md
index 3b14ac29..1ff4f5c2 100644
--- a/.planning/REQUIREMENTS.md
+++ b/.planning/REQUIREMENTS.md
@@ -128,13 +128,66 @@ Which phases cover which requirements. Updated during roadmap creation.
| Requirement | Phase | Status |
|-------------|-------|--------|
-| — | — | — |
+| INFRA-01 | Phase 40 | Pending |
+| INFRA-02 | Phase 40 | Pending |
+| INFRA-03 | Phase 40 | Pending |
+| INFRA-04 | Phase 40 | Pending |
+| DIAG-01 | Phase 41 | Pending |
+| DIAG-02 | Phase 41 | Pending |
+| DIAG-03 | Phase 41 | Pending |
+| DIAG-04 | Phase 41 | Pending |
+| DIAG-05 | Phase 41 | Pending |
+| THEME-01 | Phase 41 | Pending |
+| THEME-02 | Phase 41 | Pending |
+| THEME-03 | Phase 41 | Pending |
+| THEME-04 | Phase 41 | Pending |
+| THEME-05 | Phase 41 | Pending |
+| THEME-06 | Phase 41 | Pending |
+| THEME-07 | Phase 41 | Pending |
+| ICON-01 | Phase 41 | Pending |
+| ICON-02 | Phase 41 | Pending |
+| ICON-03 | Phase 41 | Pending |
+| WALL-01 | Phase 42 | Pending |
+| WALL-02 | Phase 42 | Pending |
+| WALL-03 | Phase 42 | Pending |
+| WALL-04 | Phase 42 | Pending |
+| SOCIAL-01 | Phase 42 | Pending |
+| SOCIAL-02 | Phase 42 | Pending |
+| SOCIAL-03 | Phase 42 | Pending |
+| CONV-01 | Phase 42 | Pending |
+| CONV-02 | Phase 42 | Pending |
+| CONV-03 | Phase 42 | Pending |
+| CONV-04 | Phase 42 | Pending |
+| CONV-05 | Phase 42 | Pending |
+| CONV-06 | Phase 42 | Pending |
+| CONV-07 | Phase 42 | Pending |
+| CONV-08 | Phase 42 | Pending |
+| CONV-09 | Phase 42 | Pending |
+| VOICE-01 | Phase 42 | Pending |
+| VOICE-02 | Phase 42 | Pending |
+| VOICE-03 | Phase 42 | Pending |
+| DOC-01 | Phase 43 | Pending |
+| DOC-02 | Phase 43 | Pending |
+| DOC-03 | Phase 43 | Pending |
+| BRAND-01 | Phase 43 | Pending |
+| BRAND-02 | Phase 43 | Pending |
+| BRAND-03 | Phase 43 | Pending |
+| BRAND-04 | Phase 43 | Pending |
+| BRAND-05 | Phase 43 | Pending |
+| BRAND-06 | Phase 43 | Pending |
+| PRES-01 | Phase 44 | Pending |
+| PRES-02 | Phase 44 | Pending |
+| PRES-03 | Phase 44 | Pending |
+| PRES-04 | Phase 44 | Pending |
+| SKILL-01 | Phase 45 | Pending |
+| SKILL-02 | Phase 45 | Pending |
+| SKILL-03 | Phase 45 | Pending |
**Coverage:**
- v1.7 requirements: 52 total
-- Mapped to phases: 0
-- Unmapped: 52
+- Mapped to phases: 52
+- Unmapped: 0
---
*Requirements defined: 2026-04-04*
-*Last updated: 2026-04-04 after initial definition*
+*Last updated: 2026-04-04 after roadmap creation (v1.7)*
diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md
index 9f3ca9b2..c8eb4232 100644
--- a/.planning/ROADMAP.md
+++ b/.planning/ROADMAP.md
@@ -6,7 +6,8 @@
- ✅ **v1.3 Chat & PWA** - Phases 21-26 (shipped 2026-04-02)
- ✅ **v1.4 Hermes Default Provider** - Phases 27-29 (shipped 2026-04-02)
- ✅ **v1.5 Smart Onboarding + Personal AI Assistant** - Phases 30-35 (shipped 2026-04-03)
-- 🚧 **v1.6 Voice Pipeline + Minimal Message Bridge** - Phases 36-39 (in progress)
+- ✅ **v1.6 Voice Pipeline + Minimal Message Bridge** - Phases 36-39 (shipped 2026-04-04)
+- 🚧 **v1.7 Content Generation** - Phases 40-45 (in progress)
---
@@ -98,20 +99,8 @@ Plans:
----
-
-### 🚧 v1.6 Voice Pipeline + Minimal Message Bridge (In Progress)
-
-**Milestone Goal:** Transport-agnostic voice pipeline (Whisper STT + Piper TTS) integrated into web chat, plus a minimal Telegram bridge for phone access. Voice infrastructure designed to survive v2.2 Command Center migration.
-
-## Phases
-
-- [x] **Phase 36: Voice Pipeline Foundation** — Transport-agnostic VoicePipelineService (transcribe, synthesize, formatForVoice), voice.ts route, ffmpeg audio transcoding, voiceMode flag, dual output pattern (completed 2026-04-04)
-- [x] **Phase 37: Web Chat Voice UI** — VAD silence detection, waveform visualization, voice mode toggle, inline audio player, auto-play toggle, COOP/COEP headers (completed 2026-04-04)
-- [x] **Phase 38: Telegram Bridge** — grammY long polling relay, text + voice note bidirectional relay, agent identity prefix, BotFather onboarding setup (completed 2026-04-04)
-- [x] **Phase 39: Voice Polish** — Sentence-buffered TTS streaming, multi-language TTS output, onboarding STT/TTS hardware detection step (completed 2026-04-04)
-
-## Phase Details
+
+✅ v1.6 Voice Pipeline + Minimal Message Bridge (Phases 36-39) - SHIPPED 2026-04-04
### Phase 36: Voice Pipeline Foundation
**Goal**: The transport-agnostic voice pipeline is live and callable from any consumer — web chat, Telegram, or future integrations — with correct audio transcoding, voice mode flag propagation, and dual output formatting baked in from the start
@@ -171,37 +160,158 @@ Plans:
- [x] 39-01-PLAN.md — Sentence-buffered TTS streaming + multi-language synthesis
- [ ] 39-02-PLAN.md — Onboarding voice hardware capability probe
+
+
+---
+
+### 🚧 v1.7 Content Generation (In Progress)
+
+**Milestone Goal:** Agents produce real deliverables — diagrams, themes, PDFs, wallpapers, social assets, icons, and video — entirely on-device. Every content type is an installable skill. Long-running renders are async with SSE progress from the first request.
+
+## Phases
+
+- [ ] **Phase 40: Job Infrastructure** — content_jobs table, async render lifecycle, SSE progress events, namespaced storage without size limit (INFRA-01..04)
+- [ ] **Phase 41: Diagrams, Icons & Theme Engine** — Mermaid diagrams, SVG icon generation, OKLCH theme palette with WCAG AA and live preview (DIAG-01..05, ICON-01..03, THEME-01..07)
+- [ ] **Phase 42: Wallpapers, Social, Format Conversion & Voice** — Satori image pipeline, social content, format conversion registry with AI fallback, Whisper web chat mic (WALL-01..04, SOCIAL-01..03, CONV-01..09, VOICE-01..03)
+- [ ] **Phase 43: Documents & Branding** — Playwright PDF reports and invoices, full brand identity kit with zip export (DOC-01..03, BRAND-01..06)
+- [ ] **Phase 44: Video & Presentations** — Remotion workspace package, pitch decks and demo videos, SSE render progress (PRES-01..04)
+- [ ] **Phase 45: Content as Skills** — Markdown skill files for all content types, Creative skill group on generalist agent (SKILL-01..03)
+
+## Phase Details
+
+### Phase 40: Job Infrastructure
+**Goal**: Every content generation request returns a job ID immediately, progresses through a tracked lifecycle, and stores its output in namespaced storage — so nothing blocks and nothing is orphaned
+**Depends on**: Phase 39 (v1.6 shipped)
+**Requirements**: INFRA-01, INFRA-02, INFRA-03, INFRA-04
+**Success Criteria** (what must be TRUE):
+ 1. Submitting a content generation request returns HTTP 202 with a job ID within 200ms, regardless of how long the render takes
+ 2. A connected browser receives SSE events as a job progresses through queued → generating → ready (or error), with no polling required
+ 3. A generated video file larger than 10MB can be stored and retrieved without a size-limit error — the generated/ storage namespace bypasses the upload route limit
+ 4. Every generated asset in the database has a sourceTaskId linking it to the originating conversation task, visible via the asset list API
+**Plans**: TBD
+
+### Phase 41: Diagrams, Icons & Theme Engine
+**Goal**: Users can generate diagrams from natural language, produce SVG icon sets from descriptions, and create a complete OKLCH color theme from a single seed color — all without binary dependencies beyond what is already installed
+**Depends on**: Phase 40
+**Requirements**: DIAG-01, DIAG-02, DIAG-03, DIAG-04, DIAG-05, ICON-01, ICON-02, ICON-03, THEME-01, THEME-02, THEME-03, THEME-04, THEME-05, THEME-06, THEME-07
+**Success Criteria** (what must be TRUE):
+ 1. Describing an architecture in chat produces a rendered Mermaid diagram (SVG and PNG) attached to the conversation, with the editable Mermaid source visible in a collapsible panel
+ 2. Mermaid rendering uses strict security level — a diagram with a `click` directive or `%%{init}%%` override is stripped before render, and SVG output passes DOMPurify before reaching the DOM
+ 3. Requesting an icon set from a description returns a cohesive set of SVG icons downloadable in SVG and PNG formats at multiple sizes
+ 4. Picking a seed color produces a full palette (background, surface, overlay, text, accents) in OKLCH with separate dark and light variants, all passing WCAG AA contrast checks
+ 5. The generated theme can be previewed live in the Nexus UI via CSS custom property injection and applied permanently in one click; export works for CSS variables, Tailwind config, VS Code theme, and JSON
+**Plans**: TBD
+**UI hint**: yes
+
+### Phase 42: Wallpapers, Social, Format Conversion & Voice
+**Goal**: Users can generate platform-ready images (wallpapers, OG images, social banners) via the Satori pipeline, convert between any file format pair, and record voice directly in web chat via the Whisper mic button
+**Depends on**: Phase 40
+**Requirements**: WALL-01, WALL-02, WALL-03, WALL-04, SOCIAL-01, SOCIAL-02, SOCIAL-03, CONV-01, CONV-02, CONV-03, CONV-04, CONV-05, CONV-06, CONV-07, CONV-08, CONV-09, VOICE-01, VOICE-02, VOICE-03
+**Success Criteria** (what must be TRUE):
+ 1. Requesting a desktop wallpaper returns a 2560×1440 PNG; requesting an Instagram banner returns a correctly-dimensioned image — platform dimensions are constants, not magic numbers
+ 2. The format conversion UI allows drag-drop of a source file, selection of a target format, and download of the converted file; direct conversion pairs (image, audio/video, document, data) use native tools; any unsupported pair falls through to AI-bridged conversion rather than showing as unavailable
+ 3. Navigating to `/convert/png/svg` deep-links directly to the PNG→SVG conversion flow with source and target pre-selected
+ 4. An uploaded file is validated against its magic bytes before processing — a JPEG renamed to `.png` is rejected with a clear error, not silently misprocessed
+ 5. Clicking the mic button in web chat records audio, transcribes it via local Whisper, and populates the chat input — works offline with the locally cached model
+**Plans**: TBD
+**UI hint**: yes
+
+### Phase 43: Documents & Branding
+**Goal**: Users can generate polished PDF reports and invoices via Playwright, and create a complete brand identity (logo, avatars, social profiles, letterhead, guidelines PDF, zip package) from a single conversation
+**Depends on**: Phase 41
+**Requirements**: DOC-01, DOC-02, DOC-03, BRAND-01, BRAND-02, BRAND-03, BRAND-04, BRAND-05, BRAND-06
+**Success Criteria** (what must be TRUE):
+ 1. Generating a PDF report from a conversation produces a downloadable PDF with correct layout; generating an invoice from a template produces a filled invoice PDF with correct line items
+ 2. Generating a one-pager or API reference document produces a styled PDF with navigable headings
+ 3. Starting a brand identity conversation produces a logo mark (SVG), avatar at multiple sizes, platform-specific social images, an email signature, and a brand guidelines PDF — all in a single brand kit
+ 4. The complete brand kit can be downloaded as a single zip file with assets organized by type
+**Plans**: TBD
+**UI hint**: yes
+
+### Phase 44: Video & Presentations
+**Goal**: Agents can produce pitch deck presentations and demo videos rendered by Remotion from a conversation, with SSE progress updates throughout the render — which may take several minutes on the M4
+**Depends on**: Phase 40
+**Requirements**: PRES-01, PRES-02, PRES-03, PRES-04
+**Success Criteria** (what must be TRUE):
+ 1. Requesting a pitch deck from a conversation description produces a Remotion-rendered interactive web presentation or MP4; the render runs in a separate workspace package and does not block the main server process
+ 2. The Remotion bundle is compiled once at server startup and reused for all renders — submitting a second render request does not trigger a second webpack compilation
+ 3. A browser connected during a video render receives SSE progress events (percentage complete) throughout the render; the final event delivers the download URL
+ 4. Concurrent LLM inference and video rendering do not cause the server to become unresponsive — render concurrency is capped and serialized with LLM workloads
+**Plans**: TBD
+
+### Phase 45: Content as Skills
+**Goal**: Every content type built in Phases 41-44 is accessible to agents as an installable Markdown skill, and the generalist agent ships pre-loaded with the Creative skill group
+**Depends on**: Phase 44
+**Requirements**: SKILL-01, SKILL-02, SKILL-03
+**Success Criteria** (what must be TRUE):
+ 1. Each content type (diagram, theme, icon, wallpaper, social post, PDF, brand kit, video) has a corresponding skill file that an agent can load and use to call the correct content job API
+ 2. A freshly created generalist agent has the Creative skill group pre-loaded — it can generate diagrams and themes without any manual skill configuration
+ 3. A user can add or remove individual content type skills through the Skill Aggregator UI without touching configuration files
+**Plans**: TBD
+**UI hint**: yes
+
---
## Coverage Validation
-All 23 v1.6 requirements are mapped to exactly one phase. No orphans.
+All 52 v1.7 requirements are mapped to exactly one phase. No orphans.
| Requirement | Phase |
|-------------|-------|
-| VPIPE-01 | 36 |
-| VPIPE-02 | 36 |
-| VPIPE-03 | 36 |
-| VPIPE-04 | 36 |
-| VPIPE-05 | 36 |
-| VPIPE-06 | 36 |
-| WCHAT-01 | 37 |
-| WCHAT-02 | 37 |
-| WCHAT-03 | 37 |
-| WCHAT-04 | 37 |
-| WCHAT-05 | 37 |
-| WCHAT-06 | 37 |
-| TGRAM-01 | 38 |
-| TGRAM-02 | 38 |
-| TGRAM-03 | 38 |
-| TGRAM-04 | 38 |
-| TGRAM-05 | 38 |
-| TGRAM-06 | 38 |
-| ONBRD-03 | 38 |
-| VPIPE-07 | 39 |
-| VPIPE-08 | 39 |
-| ONBRD-01 | 39 |
-| ONBRD-02 | 39 |
+| INFRA-01 | 40 |
+| INFRA-02 | 40 |
+| INFRA-03 | 40 |
+| INFRA-04 | 40 |
+| DIAG-01 | 41 |
+| DIAG-02 | 41 |
+| DIAG-03 | 41 |
+| DIAG-04 | 41 |
+| DIAG-05 | 41 |
+| THEME-01 | 41 |
+| THEME-02 | 41 |
+| THEME-03 | 41 |
+| THEME-04 | 41 |
+| THEME-05 | 41 |
+| THEME-06 | 41 |
+| THEME-07 | 41 |
+| ICON-01 | 41 |
+| ICON-02 | 41 |
+| ICON-03 | 41 |
+| WALL-01 | 42 |
+| WALL-02 | 42 |
+| WALL-03 | 42 |
+| WALL-04 | 42 |
+| SOCIAL-01 | 42 |
+| SOCIAL-02 | 42 |
+| SOCIAL-03 | 42 |
+| CONV-01 | 42 |
+| CONV-02 | 42 |
+| CONV-03 | 42 |
+| CONV-04 | 42 |
+| CONV-05 | 42 |
+| CONV-06 | 42 |
+| CONV-07 | 42 |
+| CONV-08 | 42 |
+| CONV-09 | 42 |
+| VOICE-01 | 42 |
+| VOICE-02 | 42 |
+| VOICE-03 | 42 |
+| DOC-01 | 43 |
+| DOC-02 | 43 |
+| DOC-03 | 43 |
+| BRAND-01 | 43 |
+| BRAND-02 | 43 |
+| BRAND-03 | 43 |
+| BRAND-04 | 43 |
+| BRAND-05 | 43 |
+| BRAND-06 | 43 |
+| PRES-01 | 44 |
+| PRES-02 | 44 |
+| PRES-03 | 44 |
+| PRES-04 | 44 |
+| SKILL-01 | 45 |
+| SKILL-02 | 45 |
+| SKILL-03 | 45 |
---
@@ -225,7 +335,13 @@ All 23 v1.6 requirements are mapped to exactly one phase. No orphans.
| 33. Persistent Memory + Personal Assistant Mode | v1.5 | 3/3 | Complete | 2026-04-03 |
| 34. Voice | v1.5 | 2/2 | Complete | 2026-04-03 |
| 35. npx buildthis CLI | v1.5 | 1/1 | Complete | 2026-04-03 |
-| 36. Voice Pipeline Foundation | v1.6 | 2/3 | Complete | 2026-04-04 |
-| 37. Web Chat Voice UI | v1.6 | 3/4 | Complete | 2026-04-04 |
-| 38. Telegram Bridge | v1.6 | 3/3 | Complete | 2026-04-04 |
-| 39. Voice Polish | v1.6 | 1/2 | Complete | 2026-04-04 |
+| 36. Voice Pipeline Foundation | v1.6 | 2/3 | Complete | 2026-04-04 |
+| 37. Web Chat Voice UI | v1.6 | 3/4 | Complete | 2026-04-04 |
+| 38. Telegram Bridge | v1.6 | 3/3 | Complete | 2026-04-04 |
+| 39. Voice Polish | v1.6 | 1/2 | Complete | 2026-04-04 |
+| 40. Job Infrastructure | v1.7 | 0/TBD | Not started | - |
+| 41. Diagrams, Icons & Theme Engine | v1.7 | 0/TBD | Not started | - |
+| 42. Wallpapers, Social, Format Conversion & Voice | v1.7 | 0/TBD | Not started | - |
+| 43. Documents & Branding | v1.7 | 0/TBD | Not started | - |
+| 44. Video & Presentations | v1.7 | 0/TBD | Not started | - |
+| 45. Content as Skills | v1.7 | 0/TBD | Not started | - |
diff --git a/.planning/STATE.md b/.planning/STATE.md
index 8131b29a..f53c6514 100644
--- a/.planning/STATE.md
+++ b/.planning/STATE.md
@@ -7,7 +7,7 @@ stopped_at: ""
last_updated: "2026-04-04"
last_activity: 2026-04-04
progress:
- total_phases: 0
+ total_phases: 6
completed_phases: 0
total_plans: 0
completed_plans: 0
@@ -21,20 +21,21 @@ progress:
See: .planning/PROJECT.md (updated 2026-04-04)
**Core value:** A fresh onboard asks for ONE thing (root directory), auto-creates PM + Engineer agents, and drops you in the dashboard.
-**Current focus:** Defining requirements for v1.7
+**Current focus:** Phase 40 — Job Infrastructure (v1.7 start)
## Current Position
-Phase: Not started (defining requirements)
-Plan: —
-Status: Defining requirements
-Last activity: 2026-04-04 — Milestone v1.7 started
+Phase: 40 of 45 (Job Infrastructure)
+Plan: — (not yet planned)
+Status: Ready to plan
+Last activity: 2026-04-04 — v1.7 roadmap created, 52 requirements mapped to 6 phases
+
+Progress: [░░░░░░░░░░] 0%
## Performance Metrics
**Velocity:**
-
-- Total plans completed: 0 (v1.6)
+- Total plans completed: 0 (v1.7)
- Average duration: -
- Total execution time: 0 hours
@@ -43,30 +44,23 @@ Last activity: 2026-04-04 — Milestone v1.7 started
### Decisions
Decisions are logged in PROJECT.md Key Decisions table.
-Key constraints for v1.6:
+Key constraints for v1.7:
-- voicePipelineService is the keystone — Phase 37 and Phase 38 both depend on it; build Phase 36 first
-- Telegram bridge uses long polling (grammY `bot.start()`) — no public HTTPS required on Mac Mini
-- Audio transcoding via ffmpeg-static ^5.2.0 — NOT archived fluent-ffmpeg (archived May 2025)
-- Voice mode flag must survive every pipeline layer: client → Express → message persistence → agent codec
-- COOP/COEP headers required for @ricky0123/vad-react SharedArrayBuffer (add to Express static middleware)
-- Phase 37 and Phase 38 are independent once Phase 36 ships; sequential ordering for single-developer delivery
-- Telegram bridge must stay under 500 lines (TGRAM-06 is a hard constraint)
-- [Phase 36]: Export nexusSettingsSchema for direct testing, use nexusSettingsSchema.parse({}) for consistent defaults in catch blocks
-- [Phase 36]: Used manual execFileAsync wrapper instead of promisify(execFileCb) to avoid util.promisify.custom symbol incompatibility with vitest mocks
-- [Phase 36]: Voice routes are dedicated voice.ts module (not added to chat-files.ts) for clean separation — voice pipeline is its own subsystem
-- [Phase 36]: voiceMode typed as text|voice_input|full_voice union in stream endpoint, persisted as voice_full/voice_input messageType for downstream rendering
-- [Phase 37]: Cherry-picked Phase 36 commits to bring voice pipeline, nexus-settings, and voiceMode wiring to phase-37 branch
-- [Phase 37]: COOP/COEP headers placed as first Express middleware — applies to all responses including API, static, and Vite dev
-- [Phase 37]: VAD ONNX assets served from ui/public/ same-origin to avoid COEP blocking CDN-served binary files
-- [Phase 37]: useVadRecorder requests separate MediaStream ref for VoiceWaveform AnalyserNode — useMicVAD manages its own stream internally
-- [Phase 37]: AudioContext not closed on cleanup in VoiceWaveform — reused across recording cycles to avoid repeated autoplay unlock prompts
-- [Phase 37]: useVoiceMode hook created in plan 37-03 to unblock VoiceModeToggle during parallel execution
-- [Phase 37]: Auto-play preference stored in localStorage (nexus:voice:autoplay), not nexus-settings — avoids server round-trip for fast UX
-- [Phase 38-telegram-bridge]: TelegramStep uses onNext/onBack props; Continue disabled until token validated; Skip always available
-- [Phase 38-telegram-bridge]: telegramRoutes accepts service instance as second param — enables restart from token route
-- [Phase 38-telegram-bridge]: Long-polling: deleteWebhook first, then bot.start() fire-and-forget with catch logger
-- [Phase 38-telegram-bridge]: processVoiceMessage() extracted as top-level async function — keeps bot handler clean; botToken stored as module-level mutable ref for CDN URL construction
+- content_jobs table + renderPipelineService stub must exist before any renderer is built — Phase 40 is the hard dependency for all other phases
+- Async job pattern is mandatory — all render requests return 202 + job ID immediately; never block HTTP on render
+- sourceTaskId is required on every generated asset from day one (prevents SSD orphan accumulation)
+- MAX_GENERATED_ASSET_BYTES constant bypasses the 10MB upload limit for generated/namespace — separate from upload route
+- Mermaid securityLevel must be "strict" — strip %%{init}%% and click directives before render, DOMPurify on SVG output
+- OKLCH via culori for all theme generation — HSL is forbidden as an intermediate (perceptually non-uniform)
+- Remotion bundle() called once at startup, not per-render — cached bundle path passed to renderMedia() per request
+- Remotion isolated in packages/content-renderer/ workspace package — webpack bundler must not enter Vite/tsc server context
+- Phase 42 and Phase 41 both depend on Phase 40 but are independent of each other (can parallelize if needed)
+- Phase 43 (PDF/Brand) depends on Phase 41 because PDF templates may reuse satori/SVG pipeline components
+- Phase 44 (Remotion) depends only on Phase 40 (job infra) — can start after Phase 40, independent of 41-43
+- Phase 45 (Skills) is last — skill markdown files reference API contracts finalized in Phases 41-44
+- AI-bridged conversion (CONV-05) is the fallback for all format pairs — never show a format pair as blocked
+- CONV-08: converter availability detected at startup via probe; unavailable direct paths fall to AI bridge
+- CONV-09: magic-byte MIME validation before processing — reject misnamed files with a clear error
### Pending Todos
@@ -74,12 +68,13 @@ None yet.
### Blockers/Concerns
-- [v1.5 carryover] smart-whisper Apple Silicon acceleration unverified on Mac Mini M4 — fall back to `tiny.en` if `base.en` acceleration not confirmed
-- [v1.6] grammY session management approach not yet chosen: lightweight `Map` vs. grammY conversation plugin — decide at Phase 38 planning
-- [v1.6] Dual output prompt reliability on 7B models is ~90% — Approach B fallback (post-process markdown strip) must be implemented as safety net, not optional
+- [v1.7 pre-start] Verify correct resvg package name: `@resvg/resvg-js` (v2.6.2) vs `resvg-js` (v0.1.97) — run `npm info @resvg/resvg-js` before pnpm add in Phase 41
+- [v1.7 pre-start] Check whether playwright-chromium and @mermaid-js/mermaid-cli can share a Chromium binary via PUPPETEER_EXECUTABLE_PATH — could save ~300MB on Mac Mini SSD
+- [v1.7 pre-start] Run pnpm build after adding packages/content-renderer/ to verify no Vite/webpack conflicts before Phase 44 implementation
+- [v1.7 pre-start] Confirm pdf-lib scope: Playwright for design-rich PDFs, pdf-lib for data-driven invoices — decide at Phase 43 planning
## Session Continuity
-Last session: 2026-04-04T03:18:52.490Z
-Stopped at: Completed 38-02-PLAN.md — Telegram voice handling + TTS reply
+Last session: 2026-04-04
+Stopped at: v1.7 roadmap created — 52 requirements mapped, 6 phases defined (40-45), files written
Resume file: None