[0.2.0] - 2026-05-01
M2 Web 端 MVP (Web MVP) milestone.
Added
Core Infrastructure:
- Vision observation schemas (
packages/core):VisionObservationSchemawith discriminated union for palm/face validation, 11 tests covering reason enums and observation fields (M2-004) - Rich reading schemas (
packages/core): EnhancedPalmReadingResultwith overview/mainLines/summary objects (9 tests),FaceReadingResultwith 3-4 mainLines + 5 face icons (9 tests),DailyFortuneResultwith ratings 1-5 and lucky number 0-9 validation (10 tests) (M2-001, M2-002, M2-003) - Prompt include system (
packages/core):expandIncludesfunction supporting<<include:foo>>tokens with nested resolution and error handling (4 tests) (M2-005) - Shared prompt modules (
packages/core):_shared/safety-rules.mdand_shared/tone-guidelines.mdwith 13 tests for section existence and include expansion (M2-006) - Vision prompts (
packages/core):vision-observe-palm.md(7 tests) andvision-observe-face.md(7 tests) with structured observation instructions (M2-007) - Reading prompts (
packages/core):reading-write-palm.md(12 tests with 2 complete examples and icon selection rules) andreading-write-face.md(12 tests with 4 compliance checkpoints) (M2-008, M2-009) - Daily fortune prompt (
packages/core):daily-fortune.mdwith 4 template variables and 14 tests (M2-010) - Fallback system (
packages/core): Soft fallback content with 15 tests for palm/face/daily scenarios (M2-014)
Server APIs:
- VLM client (
apps/server): Multi-provider vision model client with Qwen→GLM→GPT-4o fallback chain, API key redaction in logs, 403 fallback handling (9 tests) (M2-011) - LLM streaming client (
apps/server): DeepSeek→Qwen-Plus→GPT-4o-mini streaming chain with 0-chunk silent failover and mid-stream error propagation (8 tests) (M2-012) - Reading service (
apps/server): 3-stage pipeline orchestration (VLM observe → LLM interpret → result assembly) with status tracking and chunk streaming (11 tests) (M2-013) - Upload API (
/api/upload): Image upload with sharp processing, webp conversion, nanoid ID generation, and metadata storage (M2-020) - Analyze API (
/api/analyze): SSE-based reading pipeline withPipelineEventSchemavalidation and real-time progress events (M2-021) - Render API (
/api/render-image): Satori + resvg-js poster generation with automatic palm/face template selection and@resvg/resvg-jsexternalization (M2-022) - Result API (
/api/result/[id]): Result retrieval with 404/410 handling, 7-day expiry, and cache headers;/imageendpoint for poster download (M2-023) - Daily fortune API (
/api/daily): Date-based fortune generation with cache,generateDailyorchestration, and fallback support (M2-024)
Poster Components:
- Poster primitives (
packages/poster):Box,Text,Card,SectionNumber,Divider,Tagcomponents with 20 tests and undefined style defense (M2-015) - Poster icons (
packages/poster): 12+ icons including HeartLine, BrainLine, LeafLine, Signpost, Wave, Mountain, River, Cloud, Lotus, CornerOrnament, Watermark, PalmDiagram, plus 5 face icons (18 tests) (M2-016) - Palm reading poster (
packages/poster):PalmReadingPosterwith 6-module layout, watermark, QR code, and 4 illustrations (8 tests) (M2-017) - Face reading poster (
packages/poster):FaceReadingPosterwith 5 face icons and 4 mainLines rendering (9 tests) (M2-018) - Daily fortune card (
packages/poster):DailyFortuneCardwith ratings, lucky numbers, advice, and one-line summary (6 tests) (M2-019)
Canvas System:
- Canvas stage (
apps/web): 4-layer architecture with OffscreenCanvas, background layer, main rAF loop, and HTML overlay; DPR-aware scaling (M2-025) - Hit detection (
apps/web):HitRegistryclass with bbox collision detection, cursor callbacks, and performance optimization (1000 elements × 20 checks ≈ 1ms) (M2-026) - Crystal ball (
apps/web):CrystalBallclass with idle/hover states and 4-act animation sequence (setup/buildup/climax/resolution) (M2-027, M2-028) - Tarot group (
apps/web):TarotGroupwith 5-card idle float, hover 3D transform, click flip animation, and sibling dimming (M2-029) - Neon signs (
apps/web):NeonSignswith 4 signs, pre-rendered glow sprites, 8-12s random glitch effects, and reduced-motion fallback (M2-030) - Background layer (
apps/web):BackgroundLayer0with code rain, 40 data particles, 4 distant halos, and 0.2px parallax (M2-031) - Bagua diagram (
apps/web):BaguaDiagramwith HTML overlay panel for 年/月/日/时 inputs, Escape/outside-click dismissal (M2-032) - Palm diagram (
apps/web):PalmDiagramwith 3-line cycling animation, scan line effect, and click navigation to/upload?kind=palm(M2-033) - Fortune sticks (
apps/web):FortuneStickswith 3-container shake animation, spring physics, character reveal, and 8-fortune pool (M2-034) - Cyber cat (
apps/web):CyberCatwith idle tail/eye/LED animations and click trigger for fortune stick draw (M2-035) - Oracle girl (
apps/web):OracleGirlwith speech bubble HTML overlay and 3s auto-dismiss (M2-036) - Poetry scroll (
apps/web):PoetryScrollwith 5-state machine (idle→hover→expanding→typing→complete) and 4 hardcoded poems (M2-037) - Ambient particles (
apps/web): 150-particle pool with performance tier-aware count and reduced-motion → 0 fallback (M2-038) - Particle burst (
apps/web): 300-particle pool with buildup (200 purple) and resolution (50 gold) phases, lifecycle recycling (M2-039) - Performance tier (
apps/web): WebGL renderer detection, deviceMemory/hwConcurrency thresholds, reduced-motion forced low tier,window.__tierConfigdebug channel (M2-040) - Easter eggs (
apps/web): Midnight color temperature filter (hue-rotate 20deg, saturate 0.85), 10-tap belly button trigger, dev-only rhythm layer validation (13 elements across L0-L5) (M2-041)
Web Pages:
- Result page (
/result/[id]): EventSource SSE listener, progress bar, poster preview, export button, and section rendering (M2-042) - History system (
apps/web): Dexie IndexedDB integration with auto-pruning (20-item limit),/historypage with empty/save/clear states (4 Playwright tests) (M2-043) - Share page (
/share/[id]): Sticky CTA bar with iframe embed;/downloadpage with 3-platform buttons (disabled, "即将上线" state); SEO metadata (M2-044) - E2E tests (
apps/web): 4 Playwright specs covering full journey, history operations, share/download pages, and smoke tests (M2-045)
Changed
- Upgraded
@cyberoracle/coreschemas to rich nested objects (overview/mainLines/summary with heading/body structure) - Enhanced prompt system with include resolution and shared modules
- Refactored server to use multi-provider fallback chains for VLM and LLM
- Improved poster templates with comprehensive icon library and layout modules
- Expanded canvas system from basic stage to full interactive scene with 17 elements
Fixed
- Schema validation now covers all edge cases (ratings 1-5, lucky numbers 0-9, reason enums)
- VLM client properly redacts API keys from logs
- LLM streaming handles 0-chunk and mid-stream errors gracefully
- Result API returns proper 410 status for expired readings (>7 days)
- Canvas hit detection optimized for 1000+ interactive elements
Known Issues
- Result page schema field mapping uses
label/contentinstead ofname/body, causing real SSE data to fall back to stub content (high severity, blocks real data display) - SSE
vlm_observe:doneintermediate event missing, frontend cannot access stage-1 structured observations (medium severity) - Result page stub timer and SSE path run in parallel without mutual exclusion, stub may overwrite real data if SSE completes before T+3500ms (medium severity)
- Fallback content implemented as TypeScript module instead of
fallback-soft.mdprompt file (medium severity, breaks prompt file convention) - Daily fortune API uses placeholder
ganzhi(dateStr) instead of real lunar calendar calculation (medium severity) - Multiple
catch {}blocks silently swallow errors without logging (medium severity, affects observability) pnpm build:serverstill blocked by Windows symlink EPERM in standalone output (carryover from M1, requires Linux/Docker verification)
[0.1.0] - 2026-04-29
M1 共享基建 (Shared Infrastructure) milestone.