> **⚠️ Status update 2026-04-21:** Google removed Gemini / Imagen image-gen from the universal free API tier in December 2025. Claims in this document about "~1,500 free images/day" or "Nano Banana free tier" now refer only to the AI Studio **web UI** (https://aistudio.google.com), which is still free for interactive generation. For **programmatic** free image-gen, prefer Cloudflare Workers AI (Flux-1-Schnell, 10k neurons/day), HF Inference (free HF_TOKEN), or Pollinations. Paid Gemini: $0.039/img Nano Banana; $0.02/img Imagen 4 Fast. # Research → implementation map Every research category in [`docs/research/`](./research/) is listed below with a pointer to the file(s) / function(s) where the finding is actually applied. If a line reads **not yet wired** the research is still at the "sticky note on the wall" stage; opening an issue to wire it is welcome. The research corpus runs 20 categories × 104 angle files. Rather than cite every angle individually, this map cites the load-bearing ones. Each tool source file also carries `// Source: docs/research/…` comments at decision points so the linkage survives refactors. ## Orientation before you read - **Wired** means the file/function cited contains production code that reads the research finding at runtime (routing table, rewriter dialect, safe-zone number, dimension constant). - **Reference-only** means the research shaped a decision during design but isn't consulted at runtime. Two whole categories are in this state and that's intentional: - `docs/research/21-oss-deep-dive/` (20 files — OSS imagegen survey) - `docs/research/22-repo-deep-dives/` (20 files — specific codebase reads) - **Deferred** research lives at [`docs/research/future/`](./research/future/). Twelve asset-research files moved there during the 2026-04-20 triage because they described tooling (pHash, visual diff, moderation, motion, mockups, stock APIs, audio, etc.) that isn't on the v1 critical path. Each one is listed in [future/README.md](./research/future/README.md) with a status note. --- ## 01 — Prompt Engineering Theory | Angle | Implementation | | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 1a CFG / negative-prompt | `data/model-registry.json` encodes `negative_prompt_support` per model (`ignored`, `native`, `error`, `supported`, `--no flag`). `src/rewriter.ts` emits `negative_prompt` only for SD family; **drops it on Flux** (documented in the registry as `"error"`). | | 1c LLM prompt expansion | `src/rewriter.ts` does LLM-style prompt expansion deterministically (no LLM call). Pads Imagen/Gemini prompts to ≥30 words so their invisible rewriter does not fire. | | 1d Prompt-weighting syntax | Partially wired. Tag-salad mode emits flat tags with `BREAK` separator (subject before BREAK, background after — prevents color leakage on SDXL); token-weighting (`(word:1.2)`) deferred until a caller requests it. | ## 02 — Image Generation Models | Angle | Implementation | | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | 2b gpt-image-1 autoregressive | `data/model-registry.json` `gpt-image-1` entry (`native_rgba: true`, `text_ceiling_chars: 50`). Router primary for transparent-mark rule. | | 2c Flow-matching / Flux | `flux-pro` / `flux-2` registry entries, `negative_prompt_support: "error"` encoded, used by router `hero-photoreal` and `illustration-no-brand`. | | 2e Imagen technical reports | `imagen-3`, `imagen-4` registered with `native_rgba: false` + 30-word rewriter note in rewriter. | ## 03 — Evaluation Metrics | Angle | Implementation | | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 3a CLIP / VQAScore | `src/pipeline/validate.ts` tier-0 (deterministic). VQAScore (tier-1) not yet wired; tier-2 VLM-as-judge is a POST-to-URL shim at `src/pipeline/validate.ts::tier2Vlm` — set `PROMPT_TO_BUNDLE_VLM_URL` to enable. | | 3e Asset-specific eval | tier-0 implemented: dimensions exact, alpha probe, tile-luma checkerboard heuristic with alternation check, OCR Levenshtein (tesseract.js; bundled `eng.traineddata` used when present), palette ΔE2000 against brand bundle, WCAG contrast vs #FFF and #0F172A, safe-zone bbox. Source: `src/pipeline/validate.ts`. | ## 04 — Gemini / Imagen Prompting | Angle | Implementation | | -------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 4b Nano Banana | `data/paste-targets.json` entry for `gemini-3-flash-image` references Nano Banana by nickname and routes to Google AI Studio. Used by external_prompt_only mode. | | 4c **Transparent-background checkerboard problem** | **Load-bearing.** `data/routing-table.json` `transparent-mark` rule has `never: [imagen-3, imagen-4, gemini-3-flash-image, …]`. `src/rewriter.ts::buildBackgroundClause` warns if transparency requested against a non-RGBA model and requests solid white + post-matte. Multiple skill `SKILL.md` files document it. | ## 05 — OpenAI DALL·E / gpt-image | Angle | Implementation | | --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 5b gpt-image-1 API + transparency | `src/providers/openai.ts` calls `/v1/images/generations` with `background: "transparent"` when `transparency: true`. Primary for `transparent-mark` and `sticker` routing rules. | | 5c Logo / icon generation | Router `logo-with-text-1-3-words` rule places `gpt-image-1` as second-choice after Ideogram (because Ideogram has better wordmark rendering). | ## 06 — Stable Diffusion / Flux | Angle | Implementation | | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 6b Flux family prompting | `src/rewriter.ts` dialect `"prose"` branch, with the explicit guard that drops `negative_prompt` and converts do-not clauses to positive anchors. Warning emitted when the caller attempts to set negatives for Flux. | | 6d LoRA training for brand style | `BrandBundle.lora` field flows through to `illustration-branded` routing rule (`params.lora: "brand.lora"`). Actually dispatching LoRA to Flux.2 / SDXL requires a provider with LoRA support wired — Flux.2 provider accepts `lora` in params; SDXL provider not yet wired. | ## 07 — Midjourney / Ideogram / Recraft | Angle | Implementation | | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 7a Midjourney v6/v7 | `src/rewriter.ts` dialect `"prose+flags"` branch emits `--ar`, `--v 7`, `--style raw`, optional `--sref`. `data/paste-targets.json` routes MJ to web + Discord (no API). | | 7b Ideogram wordmark rendering | Router `logo-with-text-1-3-words` primary = `ideogram-3-turbo` with `magic_prompt: OFF`. `data/model-registry.json` records `text_ceiling_chars: 60`. Transparency via dedicated `/ideogram-v3/generate-transparent` endpoint with `rendering_speed` param (not `style: "transparent"`). `src/rewriter.ts` `"prose+quoted"` dialect keeps the wordmark in quotes. | | 7c Recraft V3/V4 native SVG | `data/model-registry.json` `recraft-v3` and `recraft-v4` both have `native_svg: true`. Router `logo-text-free-vector` primary = `recraft-v4` (higher quality); V3 fallback for brand-style pipelines requiring `style_id` (V4 dropped style support). `src/providers/recraft.ts` requests `output_format: "svg"`. | ## 08 — Logo Generation | Angle | Implementation | | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 8c Text rendering in logos | Rewriter `buildTextClause` drops wordmarks > 3 words with a warning. Router `logo-with-text-many-words` primary = `composite` strategy (mark + SVG typography). | | 8d Palette control | `BrandBundle.palette` → rewriter prose injects `"Palette strictly limited to these colors: …"`. Recraft provider uses `controls.colors`. | | 8e **SVG vector logo pipeline** | **Load-bearing.** Four paths: (a) Recraft native SVG (router primary for `logo-text-free-vector`), (b) LLM-author SVG (**this is the `inline_svg` mode** — `src/modes.ts`, `src/svg-briefs.ts`), (c) raster → matte → `vtracer` on PATH → SVGO, (d) raster → matte → `potrace` on PATH → SVGO. If neither binary is installed, `src/pipeline/vectorize.ts` emits a posterize run-length fallback and warns. SVGO cleanup runs via `src/pipeline/svgo.ts` when the optional dep is installed. | ## 09 — App Icon Generation | Angle | Implementation | | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 9a iOS HIG specs | `src/tools/enhance-prompt.ts::safeZoneForAssetType` returns `{ width: 824, height: 824 }` (iOS 80% of 1024). `src/svg-briefs.ts::appIconBrief` enforces the 824² safe zone. | | 9b Android adaptive / themed | `src/pipeline/export.ts::exportAppIconBundle` emits foreground + background + monochrome layers. | | 9c PWA maskable | Same exporter emits 192 / 512 / 512-maskable with 80% safe zone. | ## 10 — UI Illustrations | Angle | Implementation | | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | 10 (category) | `src/rewriter.ts::composeContext` illustration branch. Router `illustration-branded` / `illustration-no-brand` rules. `src/svg-briefs.ts::iconPackBrief` for the icon-pack sub-case. | ## 11 — Favicon / Web Assets | Angle | Implementation | | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | 11 (category) | `src/svg-briefs.ts::faviconBrief` enforces 16×16 legibility, ≤8 paths, 2-color palette. `src/pipeline/export.ts::exportFaviconBundle` emits `.ico`, `icon.svg`, `apple-touch-icon.png`, PWA 192/512/512-maskable + `` snippet. | ## 12 — Vector / SVG Generation | Angle | Implementation | | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 12 (category) | `src/pipeline/vectorize.ts` (raster → SVG). `src/svg-briefs.ts` (inline_svg authoring). `data/routing-table.json` favicon + icon_pack rules reference `llm_author_svg` strategy. | ## 13 — Transparent Backgrounds | Angle | Implementation | | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 13 (category) | `src/pipeline/matte.ts` — BiRefNet / RMBG / difference / local chroma key. Used by every generator when `transparency_required && !native_rgba`. Also `src/tools/ingest-external.ts` runs matte on pasted-back images. | ## 14 — Negative Prompting / Artifacts | Angle | Implementation | | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 14 (category) | `src/rewriter.ts::positiveAnchorsFromDoNot` rewrites "no drop shadows" → "flat matte surfaces with no cast shadows" so the guidance survives models that ignore negative_prompt (Imagen / gpt-image-1 silently ignore) or error on it (Flux). | ## 15 — Style Consistency / Brand | Angle | Implementation | | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 15 (category) | `BrandBundle` type (`src/types.ts`). Rewriter injects palette, do-not, sref_code. Router `illustration-branded` uses bundle fields. `src/brand.ts::hashBundle` content-addresses a bundle for cache keys. | ## 16 — Background Removal / Vectorization | Angle | Implementation | | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | 16 (category) | `src/pipeline/matte.ts` + `src/pipeline/vectorize.ts` + `src/tools/remove-background.ts` + `src/tools/vectorize.ts` + `src/tools/ingest-external.ts`. | ## 17 — Upscaling / Refinement | Angle | Implementation | | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 17 (category) | `src/pipeline/upscale.ts` + `src/tools/upscale-refine.ts`. Asset-type-aware routing (DAT2 for flat, Real-ESRGAN/SUPIR for photoreal, img2img for diffusion polish). | ## 18 — Asset Pipeline Tools | Angle | Implementation | | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 18 (category) | `src/pipeline/export.ts` fan-out for AppIconSet / Android adaptive / PWA maskable / visionOS master / favicon bundle — all hand-rolled `sharp` with optional `png-to-ico` for the multi-res `.ico`. `src/pipeline/og-render.ts` prefers Satori + @resvg/resvg-js when a font is available (`PROMPT_TO_BUNDLE_OG_FONT` or the optional `@fontsource/inter` dep), else falls back to a hand-authored SVG + `sharp` rasterization path. BullMQ/R2 pipeline in 18e is reference architecture for a future hosted mode; the current MCP server is synchronous and stateless. | ## 19 — Agentic / MCP / Skills Architectures | Angle | Implementation | | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 19 (category) | The whole tool surface: **16 small tools** (not one god-tool), stdio transport, readOnlyHint / idempotentHint annotations for auto-approve, data-driven routing. **The three-mode surface (inline_svg / external_prompt_only / api) is also the direct application of this category's finding that "an MCP server whose output has one delivery channel is brittle."** Source: `src/modes.ts`, `src/tools/capabilities.ts`, `src/tools/ingest-external.ts`. | ## 20 — Open Source Repos Landscape | Angle | Implementation | | ------------- | ----------------------------------------------------------------------------------------------------------------- | | 20 (category) | `data/paste-targets.json` is the output — every "where do users actually go to generate" is an item in that JSON. | ## 21 & 22 — Deep Dives Standalone reference reading. Not directly wired; informs routing decisions. ## 23 — Combinations Cross-category findings (e.g. "text rendering + transparency + vector output is only viable via Ideogram-then-composite"). Encoded in the `logo-with-text-many-words` routing rule and the rewriter's text-clause logic. --- ## 24 — Agentic Orchestration Patterns | Angle | Implementation | | ------------------------------ | --------------------------------------------------------------------------------------- | | 24a multi-agent handoff | Use agents-as-tools (not handoffs) for validate-regenerate loop. Not yet wired. | | 24b plan-execute-react | ReAct for single-asset; Plan-and-Execute for brand kits. Not yet wired. | | 24c parallel fan-out best-of-N | `Promise.allSettled` across providers, fan-in by validation score. Not yet wired. | | 24d retry-fallback chains | Layered: backoff → circuit-breaker per provider → fallback chain. Not yet wired. | | 24e state machine pipelines | LangGraph checkpointing for resume-without-regeneration. Not yet wired. | | 24f-g GitHub repo survey | Reference reading. `lastmile-ai/mcp-agent` is the only MCP-native evaluator loop found. | ## 25 — Structured Generation & Constrained Decoding | Angle | Implementation | | -------------------------------------- | ----------------------------------------------------------------------------------------------------------- | | 25a constrained decoding | Outlines/LMFE/Guidance require logit access — cannot constrain Claude API. Not wired. | | 25b Instructor / TypeScript validation | Instructor-JS for complex validation; Claude native SO for high-volume. Not yet wired. | | 25c SVG grammar enforcement | Post-hoc pipeline: xmldom parse → path-count → viewBox → palette → SVGO. Partial in `src/pipeline/svgo.ts`. | | 25d AssetSpec schema design | TypeBox + `additionalProperties: false` + `spec_version` literal. Not yet wired. | | 25e runtime validation | TypeBox `TypeCompiler.Compile()` at startup (~10× faster than Zod). Not yet wired. | | 25f-g MCP tool design | STRAP consolidation (7 `asset_generate_*` → 1 with `asset_type` enum). Not yet wired. | ## 26 — Reflection & Self-Refinement | Angle | Implementation | | ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | 26a Reflexion / Self-Refine | Two-critic design: deterministic tier-0 then VLM rubric. Hard cap 4 iterations. Not yet wired. | | 26b VLM-as-judge rubric | Prometheus-Vision 1–5 Likert format; two-critic beats unified. Not yet wired. | | 26c asset critique templates | Ready-to-use 4–5 criteria rubrics per asset type. See `docs/research/26-reflection-self-refinement/26c-asset-specific-critique-templates.md`. | | 26d convergence criteria | Return best-seen not latest. Stop if score plateau < 0.15 over 2 rounds. Not yet wired. | | 26e critique-to-prompt repair | Alpha failures → re-route (not re-prompt). Palette drift → inject hex. Not yet wired. | ## 27 — Agent Evaluation Frameworks | Angle | Implementation | | ------------------------ | --------------------------------------------------------------------------------- | | 27a benchmarking | DeepEval `TextToImageMetric` (GPT-4V, 0–1 score). Not yet wired. | | 27b image eval pipelines | VQAScore outperforms CLIP by 2–3× on compositional prompts. Not yet wired. | | 27c golden dataset | ~44 prompts across all asset types; invariants as JSON not pixels. Not yet built. | | 27d automated metrics CI | Tier-0/1 on every PR, Tier-2 nightly. Not yet wired. | | 27e provider regression | Never use "latest" model alias — pin explicit version strings. Not yet enforced. | ## 28 — CI/CD Asset Automation | Angle | Implementation | | --------------------------------- | -------------------------------------------------------------------------------------------- | | 28a GitHub Actions image pipeline | artifact-upload@v4 (v3 retired Jan 2025), dorny/paths-filter for scoped jobs. Not yet wired. | | 28b PR preview generation | Two-workflow fork-safe pattern (pull_request + workflow_run). Not yet wired. | | 28c MCP server testing | In-memory SDK transport (no subprocess); vitest-image-snapshot. Not yet wired. | | 28d release automation | Changesets + npm OIDC; `server.json` for MCP Registry missing and must be created. | | 28e secrets management | GitHub OIDC does not solve third-party AI provider key management. | ## 29 — RAG for Brand Knowledge | Angle | Implementation | | ------------------------------ | ------------------------------------------------------------------------------------------------ | | 29a brand guideline extraction | Dembrandt (Playwright + CSS analysis), Brandfetch REST, LlamaIndex PDF. Not yet wired. | | 29b CLIP style embeddings | CSD (arXiv:2404.01292) for pure style similarity; LanceDB for embedding storage. Not yet wired. | | 29c brand bundle storage | Git for JSON; LanceDB for embeddings; S3+SHA256 for binary blobs. Not yet wired. | | 29d Figma tokens pipeline | Figma Variables API requires Enterprise plan; Style Dictionary v4 for transforms. Not yet wired. | | 29e cross-session consistency | SQLite + Recraft `style_id`; CSD cosine drift detection. Not yet wired. | ## 30 — Agent Memory & State | Angle | Implementation | | ---------------------------- | ------------------------------------------------------------------------------------------------------------ | | 30a memory architectures | Borrow patterns from Letta/MemGPT, not the full framework. SQLite WAL is practical middle ground. | | 30b session vs long-term | In-process dict for session; SQLite for cross-session. Not yet wired. | | 30c MCP resources | URI `asset-memory://projects/{name}/brand-bundle`; resources are read-only passive injection. Not yet wired. | | 30d user preference learning | PAHF framework; Anthropic TTL now 5min (dropped from 1h in March 2026). Not yet wired. | | 30e asset set coherence | Recraft `style_id` as strongest coherence primitive; dual-layer dedup (hash + semantic). Not yet wired. | ## 31 — Cost Optimization | Angle | Implementation | | -------------------------- | ------------------------------------------------------------------------------------------------------ | | 31a provider-level caching | `asset_enhance_prompt` system prompt is immediate target for Anthropic `cache_control`. Not yet wired. | | 31b model routing | RouteLLM matrix-factorization; Haiku 4.5 for simple brief-length heuristic routing. Not yet wired. | | 31c batch APIs | OpenAI Batch API covers `/v1/images/generations` — gpt-image-1 at ~$0.02 (50% off). Not yet wired. | | 31d thumbnail-first | Generate 256×256, validate, upscale only on pass. 62% cost reduction. Not yet wired. | | 31e semantic dedup | GPTCache; cosine threshold ≥ 0.85; pHash Hamming ≤ 8 as fast pre-filter. Not yet wired. | ## 32 — Streaming & Real-Time UX | Angle | Implementation | | -------------------------------- | -------------------------------------------------------------------------------------------------------------- | | 32a MCP Streamable HTTP progress | `notifications/progress` with `message` strings; stdio silently discards (Cursor activates it). Not yet wired. | | 32b SSE long-running tools | `/events/:jobId` sidecar SSE endpoint works regardless of host transport. Not yet wired. | | 32c incremental SVG rendering | Claude `eager_input_streaming: true`; split at complete `` boundaries. Not yet wired. | | 32d BullMQ + SSE | `job.updateProgress()` → `QueueEvents` → EventEmitter → SSE. Only needed for multi-user HTTP deployment. | | 32e optimistic previews | Cloud providers (gpt-image-1, Ideogram, Recraft) return full image only; fal.ai gives queue position only. | ## 33 — Model Routing & Ensembling | Angle | Implementation | | ------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | | 33a routing frameworks | Structured feature vectors beat text embeddings for asset routing (categorical: asset_type, transparency, text_length). | | 33b confidence-based escalation | 4-tier cascade (SVG → flux-schnell → flux-pro → gpt-image-1) as `cascade[]` field in routing-table.json. Not yet wired. | | 33c best-of-N | `Promise.any` not `Promise.race`; break-even when failure rate > ~30%. Not yet wired. | | 33d ELO / A/B testing | Artificial Analysis Arena ELO as priors; Bradley-Terry MLE for local scores. Not yet wired. | | 33e async race with validation | fal.ai cancellation free while IN_QUEUE, partial cost once IN_PROGRESS. | ## 34 — Installable Skills Survey | Angle | Implementation | | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | nano-banana-skills | `gemini-3-pro-image-preview` shut down March 9 2026 — strip from asset_capabilities(). Live model: `gemini-3.1-flash-image-preview`. | | fal-ai-skills | Official bash scripts, no npm/pip, just `FAL_KEY`. Image restoration pre-pass (deblur before matting) is top gap. | | multi-provider-mcp-servers | Recraft MCP has 16 tools (inpainting, bg-replace, style training) not in prompt-to-asset. comfyui-mcp has 31 tools. | | web-asset-skills | No SVG icon set skill exists anywhere. jezweb optical correction rules + VLM QA loop worth borrowing. | | video-generation-skills | No zero-key video path exists. Narrow `video-gen` skill: App Store preview + splash animation + animated logo. | | audio-tts-skills | `audio-gen` skill scoped to notification sounds + voiceover, routed through elevenlabs-mcp. | | awesome-collections | Not a single skill across 12 high-star repos produces RGBA-transparent PNGs. Zero overlap with prompt-to-asset vocab (logo/favicon/app-icon). | | composio-volt-collections | Zero of 119 media skills implement alpha validation, checkerboard FFT, safe-zone bbox, OCR Levenshtein, or SVG authoring. | | openai-official-skills | Codex imagegen uses built-in `image_gen` tool — not portable to Claude Code. Figma suite (8 skills) fully portable. | | diagram-svg-skills | VoltAgent/awesome-claude-design (475 DESIGN.md files) is ready test corpus for `asset_brand_bundle_parse`. | | flux-and-antigravity-skills | No standalone Flux SKILL.md exists. shipdeckai covers 10 providers including BFL direct. `comfyui-gateway` has `sprite_transparent_bg` + `icon_512` workflows. | | free-nokey-generation-skills | Nakkas MCP (`npx nakkas@latest`) — structured SVGConfig JSON, zero key, better than freehand SVG authoring. MCPollinations for RGB raster. | | figma-design-tool-skills | `figma.createNodeFromSvgAsync(svgString)` pushes SVG as native Figma vector nodes. REST API has zero write capability. | | 3d-realtime-emerging-skills | Lottie-animate from SVG master: zero API key, fills animated logo gap. TripoSR (<0.5s, $0.07) for 3D preview. | | SYNTHESIS + ROADMAP | Priority 1: `nano-banana` + `flux` skills. Priority 2: `video-gen` + `audio-gen`. Priority 3: `3d-gen` + `lottie-animate`. | --- ## How to add research citations to code When you add a decision (routing rule, dialect switch, safe-zone size, text ceiling, etc.) that is grounded in a research angle, add a one-line source comment at the declaration: ```ts // Source: docs/research/09-app-icon-generation/9a-ios-app-icon-hig-specs.md // iOS safe zone is 80% of 1024 = 824×824. case "app_icon": return { width: 824, height: 824 }; ``` If a decision has no research backing and is pure product judgment, say so explicitly: ```ts // Product judgment, not from research: we prefer inline_svg in auto-mode // because zero-friction onboarding is worth more than marginal fidelity. if (avail.includes("inline_svg")) return { mode: "inline_svg", reason: "…" }; ``` This keeps the research corpus honest: every load-bearing line either cites an angle or explicitly marks itself as product judgment.