Expands the slice from a single 300x250 banner to four IAB sizes
(300x600, 300x250, 728x90, 160x600) driven by a designer-authored
TypeSystem and a per-row strip review surface.
Layout engine
- TypeSystem with role-based typography (headline/subheadline/cta/legal)
and piecewise size-class derivation: half_page / rectangle /
leaderboard / skyscraper / mobile_banner.
- resolveLayout now derives per-size font/leading from the role +
artboard size, then clamps to a legibility floor and emits a
constraint_signal when copy does not fit at the floor.
- Four reference templates with character constraints per size.
AI pipeline (Shape B)
- One extract + one generate per feed row; generate returns per-size
copy keyed by artboard_id plus a shared rationale block.
- Constraint-signal retry: orchestrator tightens per-(artboard, field)
limits and re-calls generate before giving up.
- orchestrateRow returns specs[] + rationale + constraint_signals.
Review UI
- /review renders one strip per feed row, all four sizes side-by-side
at true pixel dimensions, synced on a single GSAP master timeline.
- AiReasoningDrawer shows a per-size copy table, shared rationale, and
any constraint signals that fired.
- /api/generate response grouped by row; /api/export accepts the same
shape and writes exports/row-N/artboard_id.zip.
Render worker
- render-to-zip / render-many accept optional subdir + filename
overrides so multi-size exports can be grouped by feed row.
Docs
- VERTICAL_SLICE and BUILD_SEQUENCE updated for the multi-size scope.
- RESOLVED_FEED.md documents the V1 Resolved Creative Feed proposal.
- SLICE_DEVIATIONS.md records where the slice diverges from V1.
Tests: 56 pass (28 layout-engine + 14 api-lib + 14 render-worker).
Web app: tsc clean, next build succeeds.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>