dreative 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -34,17 +34,16 @@ Enumerate what your environment can actually produce, and write the result down
34
34
  Rules:
35
35
  - Probe by LOOKING (list your tools, `which ffmpeg`, check MCP config), never by
36
36
  assuming. A capability you didn't verify doesn't exist.
37
- - If a capability is missing but the design clearly wants it (e.g. a cinematic
38
- brief with no video-gen), you MUST ask a real question with a real choice —
39
- **stating the gap and moving on is not an offer, it's a disclosure.** The
40
- bug this catches: saying "video generation isn't available, so I'll use
41
- stills" and continuing is a FAILURE even though it's honest. The fix is a
42
- question with at least two live options: "install <concrete MCP/tool name>
43
- now and use it" vs "skip it, use <the specific fallback>". Ask it in the
44
- decision phase (§3), phrased as a genuine fork, not a heads-up. Never
45
- install tools silently; never silently degrade either.
46
- - The probe result changes the blueprint: no video-gen → hero loops become
47
- generated stills + ken-burns or a shader surface; **no image-gen → media
37
+ - Missing video, 3D, or separated source layers is not automatically a blocker.
38
+ First plan the strongest honest treatment available from generated/sourced
39
+ stills, local image processing, transparent cutouts, SVG, CSS, Canvas,
40
+ generated keyframes, or existing project assets. Ask for a tool or source
41
+ asset only when the requested result cannot be approximated convincingly;
42
+ present the concrete best-effort fallback in that question. Never install a
43
+ tool silently and never leave an "advanced animation later" placeholder.
44
+ - The probe result changes the blueprint: no video-gen stills become layered
45
+ scenes, masks, related keyframes, frame sequences, tiles/fragments, Canvas
46
+ samples, or shader textures as the concept warrants; **no image-gen → media
48
47
  cells become `source-image` (DESIGN.md §7's priority: verified stock/CDN
49
48
  photography), every planned cutout prop becomes a sourced-and-matted photo
50
49
  or is cut, and any 3D of an organic real-world subject is re-planned as a
@@ -59,7 +58,7 @@ Rules:
59
58
  Draft the page as a compact table BEFORE asking anything — the decision phase
60
59
  presents choices about a concrete plan, not abstractions. Per section:
61
60
 
62
- | section | layout family | media plan | motion treatment | interaction | intensity | fallback |
61
+ | section | layout family | media + preparation | motion class/treatment | interaction | intensity | fallback |
63
62
 
64
63
  - **media plan** — one of: `generate-image` (subject + exact aspect + palette/
65
64
  light-temperature prompt notes), `generate-video` (loop subject, 5-10s,
@@ -72,8 +71,7 @@ presents choices about a concrete plan, not abstractions. Per section:
72
71
  where media itself becomes the visitor-controlled spectacle, not a specific
73
72
  catalog effect. A different solution uses a registered planning-time
74
73
  substitution with observable success criteria and evidence IDs.
75
- When the set-piece uses a depth dive (the default for image-led `award`
76
- concepts with depth-capable assets), its
74
+ When a concept-led set-piece uses a depth dive, its
77
75
  `generate-image` cell must plan a DEPTH-CAPABLE composition (a corridor,
78
76
  room, landscape, machinery receding — something a camera can enter) and
79
77
  the companion assets in the same cell: the depth map and/or the separated
@@ -102,17 +100,18 @@ presents choices about a concrete plan, not abstractions. Per section:
102
100
  Every 3D prop cell also names its BERTH (3d.md §3): which lane/stage of
103
101
  the section it occupies and what the layout does to make room — a prop
104
102
  planned "over the hero image" or with no berth is an invalid cell.
105
- At the `award` tier the outcome gate is one unmistakable dimensional or
106
- spatial signature. The proven default is a recognizable real GLB or photoreal
107
- cutout prop with a berth and asset source. A typography, photographic, data,
108
- scene-instrument, or other alternative must use `award.spatialSignature` and
109
- prove equivalent depth, recurrence, interaction, and dominance on desktop
110
- and mobile. Generic orbs/blobs/toruses remain invalid.
111
- At dial ≥ 8 the media column marks each hero/key image quiet-class or
112
- PIXEL-class. The proven default is at least half pixel-class (minimum three,
113
- set-piece included), each a different mechanism. A coherent alternative may
114
- substitute `media.award.pixelCoverage` only when it visibly develops through
115
- at least three materially different roles or states and carries runtime proof.
103
+ At the `award` tier the outcome gate is one unmistakable spatial, media,
104
+ typographic, or material signature that shapes the journey. If the concept
105
+ calls for a recognizable physical subject, use a real GLB or photoreal cutout
106
+ with a berth and source. Typography, layered photography, data, SVG/Canvas,
107
+ or a scene instrument may be the stronger direct choice; no substitution is
108
+ needed merely because 3D is absent. Generic orbs/blobs/toruses remain invalid.
109
+ At expressive/award, the media column records whether each hero/key image
110
+ stays flat or becomes motion-ready through cutouts, depth layers, masks,
111
+ fragments, maps, alternate states, a frame sequence, or a Canvas/WebGL
112
+ texture. Transform only where it strengthens the concept; a still may remain
113
+ flat as an intentional rest. The default in `media.keyAssetTreatment` is a
114
+ coherent asset-preparation decision, not a pixel-effect quota.
116
115
  - **Travel map (mandatory when any element persists across sections).** If
117
116
  the blueprint contains a fixed canvas object, a recurring signature, or any
118
117
  scroll-morphing prop that lives through more than one section, add a travel
@@ -121,35 +120,67 @@ presents choices about a concrete plan, not abstractions. Per section:
121
120
  it never sits over text or controls (DESIGN.md §15). No berth fits ⇒ the
122
121
  object is scripted HIDDEN for that section. A persistent object without a
123
122
  travel map is an unplanned collision that verify will find later — plan it
124
- now. The set-piece at dial 8 must also be pixel-transforming per
125
- media.md §3 (placement choreography like orbit/collapse doesn't qualify).
123
+ now. When the set-piece claims transformation, its pixels, layers, form, or
124
+ role must visibly change; placement choreography alone does not qualify.
126
125
  - **Diversity or development (dial ≥ 7 / expressive+).** Choose and record one
127
- path in `creativeStrategy`. Diversity uses at least four distinct mechanisms
128
- across three distinct drivers. Development uses one coherent signature
129
- mechanism that changes through at least three materially different roles or
130
- states, supported by two quieter secondary mechanisms and two drivers. The
131
- same reveal repeated with different values is neither path. This keeps the
132
- proven anti-repetition safeguard without forcing unrelated effects into a
133
- coherent concept.
134
- - **motion treatment** from motion.md/immersive.md/cinematic.md vocabulary,
135
- with the dial-appropriate ambition. **motion.md §5's verification inventory is a hard
136
- plan gate, not a target:** at `expressive`/`award` ambition the blueprint
137
- must enumerate every §9 item for its dial — which element carries it, what
138
- triggers it — or explicitly name the item as cut with a reason. A plan that
139
- neither covers nor justifies a §9 item is incomplete; rework it before
140
- presenting, don't ship the gap to the build.
126
+ path in `creativeStrategy`. Diversity uses only the mechanisms and drivers the
127
+ concept needs, tied together by a shared language. Development evolves one
128
+ coherent signature through materially different roles with quieter support.
129
+ The same reveal repeated with different values is neither path. Do not add
130
+ unrelated mechanisms to satisfy a count.
131
+ - **motion treatment** from motion.md/immersive.md/cinematic.md vocabulary,
132
+ with dial-appropriate ambition. At `expressive`/`award`, complete every
133
+ `motionTreatment` field below and name the element/driver for each planned
134
+ moment. A generic or incomplete treatment is reworked before presentation.
141
135
  - **intensity (the pacing map)** — 1–10 per section: how loud this section is
142
136
  (motion + media + visual weight combined). The page must read as a CURVE, not
143
137
  a flat line: uniform intensity fails in both directions (all loud = exhausting,
144
- all quiet = the set-piece feels bolted on). Place deliberate rests (≤ 3)
145
- immediately before and after the set-piece so it lands; the hero and the
146
- set-piece section are the peaks, nothing else matches them. A blueprint whose
138
+ all quiet = the set-piece feels bolted on). Place deliberate rests around
139
+ hero moments where the content permits so they land; supporting sections
140
+ should not compete with them. A blueprint whose
147
141
  intensity column is all the same number is incomplete — rework the pacing
148
142
  before presenting.
149
- - **fallback** — for every ambitious cell (WebGL, sim, scrubbed sequence,
150
- generated video), the concrete boring version that ships if the fancy one
151
- fails runtime verification. A plan cell without a fallback is not ambitious,
152
- it's fragile.
143
+ - **fallback** — for every ambitious cell (WebGL, sim, scrubbed sequence,
144
+ generated video), the concrete boring version that ships if the fancy one
145
+ fails runtime verification. A plan cell without a fallback is not ambitious,
146
+ it's fragile.
147
+
148
+ ### Motion treatment and complexity budget
149
+
150
+ At expressive/award, write a coherent scene sequence before implementation. For
151
+ every major section record in `motionTreatment`:
152
+
153
+ - static composition and motion class (`none`, `decorative`, `structural`, or
154
+ `transformational`);
155
+ - starting and ending visual states;
156
+ - what changes, persists, pins, enters, transforms, combines, fragments, or exits;
157
+ - the handoff into the next composition;
158
+ - narrative/emotional purpose;
159
+ - rendering mechanism;
160
+ - mobile translation and reduced-motion state.
161
+
162
+ Decorative motion introduces or responds. Structural motion controls hierarchy,
163
+ pacing, pinning, and composition. Transformational motion changes form or turns
164
+ one composition into the next. Opacity, translate, scale, and light parallax are
165
+ not sufficient evidence of structural or transformational motion.
166
+
167
+ Record `motionComplexityBudget`: normally two or three hero moments (one is valid
168
+ for a short page), calm sections around them, shared motion language, target-
169
+ device limits, and progressive enhancement. Spend complexity where the story
170
+ changes state; do not distribute medium-complexity effects evenly.
171
+
172
+ Choose the simplest mechanism capable of producing the intended transformation
173
+ convincingly. Simplicity means implementation suitability, not visual blandness.
174
+ Choose deliberately among CSS, Motion, GSAP/ScrollTrigger, SVG masks/filters,
175
+ `clip-path`, DOM fragments, Canvas 2D, WebGL/shaders, image sequences, video,
176
+ Lottie/vector animation, and 3D. Neither basic transforms nor WebGL/3D/pixels are
177
+ an unexamined default.
178
+
179
+ Before approving the plan, record `antiDefaultReview` answers: are images mostly
180
+ fading/scaling/sliding; are sections independent reveals; where is the major
181
+ composition handoff; how does motion change visual state; could this system fit
182
+ an unrelated site; what is memorable; and how does movement express the concept?
183
+ If the result is generic at expressive/award, revise the scene plan now.
153
184
 
154
185
  Plus four page-level lines: register + design read (DESIGN.md §2), signature
155
186
  element, animation stack (ONE system: GSAP+Lenis or motion/react — motion.md §2),
@@ -160,10 +191,11 @@ discovered at build time: if the signature is a visual OBJECT, it must be a
160
191
  subject a stranger names correctly (3d.md §1–2's subject test). An abstract
161
192
  crude coded organic form is a hard-gate failure. Generic spheres/orbs/rings/
162
193
  blobs/toruses with no brand-native function remain invalid signatures. The
163
- proven `award` default is a real GLB or rung-2 transparent photoreal cutout;
164
- an alternative spatial typography, layered photography, data structure, or
165
- interactive instrument uses a registered substitution and must outperform the
166
- default on depth, recurrence, input response, and visual dominance. **Coded custom 3D is
194
+ award work chooses the medium that makes the signature most legible and
195
+ concept-specific. A real GLB or rung-2 transparent photoreal cutout is preferred
196
+ when the signature is a recognizable physical subject; spatial typography,
197
+ layered photography, data structure, or an interactive instrument can be the
198
+ direct plan when the concept supports it. **Coded custom 3D is
167
199
  capability-gated at the probe (§1):** offer/plan it only when the probe
168
200
  verified an actual quality path — a real GLB in reach, image-gen for
169
201
  albedo/label textures, an HDRI/environment source. No verified texture path
@@ -72,17 +72,23 @@ Detailed doctrine belongs in those references, not in this orchestration file.
72
72
  work, show a page × skill matrix: the user can assign treatments to specific
73
73
  pages, and approve routing for selected skills left unassigned. Every section
74
74
  names its layout family, skills, assets, interactions, mobile translation,
75
- fallback, and verification criteria.
75
+ fallback, and verification criteria. Expressive/award plans also include a
76
+ motion treatment for every major section: static composition, start/end
77
+ states, changes, pins, handoff, purpose, mechanism, mobile translation, and
78
+ reduced-motion state.
76
79
  - Render a concise `.dreative/plan.md` for the user and for session re-entry.
77
80
 
78
81
  The approved plan is a delivery contract. A section ends as `shipped`,
79
82
  `fallback`, or `cut` with a reason—never silently omitted.
80
83
 
81
84
  At `expressive` and `award`, choose one coherent quality path: `diversity`
82
- (several mechanisms across several drivers) or `development` (one signature
83
- mechanism evolving through at least three materially different roles, supported
84
- by two quieter mechanisms). Experimental work explores one non-obvious candidate
85
- per major section, then selects only the strongest two or three to ship.
85
+ (several concept-related mechanisms/drivers) or `development` (one signature
86
+ mechanism evolving through materially different roles with quiet support).
87
+ Allocate a contextual motion-complexity budget: concentrate effort into a small
88
+ number of hero moments, name calm sections, and run the anti-default review.
89
+ Do not satisfy ambition through mechanism quotas. Experimental work explores one
90
+ non-obvious candidate per major section, then selects only the strongest two or
91
+ three to ship.
86
92
 
87
93
  ### 3.3 Select skills
88
94
 
@@ -117,8 +123,10 @@ must appear somewhere in the overall plan, but not on every page.
117
123
 
118
124
  ### 3.4 Build
119
125
 
120
- - Prepare planned media before section implementation. Record each asset and its
121
- delivery status in the plan.
126
+ - Prepare planned media before section implementation. Treat generated stills as
127
+ raw material: decide whether each asset stays flat or needs cutouts, depth
128
+ layers, masks, fragments, variants, maps, or a frame sequence. Record the
129
+ decision, derivatives, rationale, and delivery status in the plan.
122
130
  - Follow the chosen framework adapter and the repository's established patterns.
123
131
  - Preserve the manifest unless the user explicitly approved a change; record
124
132
  approved divergence with a reason.
@@ -151,9 +159,13 @@ Verification is evidence, not prose asserting that something was checked.
151
159
  4. Check the console, links, forms, keyboard path, states, reduced motion,
152
160
  responsive overflow, and pointer hit areas.
153
161
  5. For motion/WebGL/video, record runtime evidence and performance numbers.
162
+ Capture initial, early, mid-transition, final, handoff, mobile, and
163
+ reduced-motion states; add pinned midpoint/exit states when pinning exists.
154
164
  6. Reconcile every plan section and asset against what visibly shipped.
155
- 7. Write `.dreative/verify.json` and run `dreative audit`.
156
- 8. Fix every error. Warnings require either a fix or a recorded justification.
165
+ 7. At expressive/award, visually inspect the captured states, make at least one
166
+ refinement to timing, composition, readability, or continuity, and record it.
167
+ 8. Write `.dreative/verify.json` and run `dreative audit`.
168
+ 9. Fix every error. Warnings require either a fix or a recorded justification.
157
169
 
158
170
  Every evidence-backed substitution references passing evidence IDs whose proof
159
171
  meets its declared success criteria. Vague reasons such as "it did not fit",
@@ -21,6 +21,30 @@ in `recipeAccess`.
21
21
  - Sticky CSS for simple pinning; cap pin length and remove/shorten on mobile.
22
22
  - Velocity treatments use damped/clamped derivatives, never raw scroll deltas.
23
23
 
24
+ ## Optional transformation patterns
25
+
26
+ Choose only patterns that express the concept:
27
+
28
+ - **Image fragmentation:** split a source into aligned DOM/SVG/Canvas tiles or
29
+ sampled pixels; disperse, filter, and reconstruct the actual image.
30
+ - **Composition handoff:** carry an object, mask, grid, or type structure from
31
+ one section into the next instead of resetting the page.
32
+ - **Layered image dive:** separate depth planes or use a depth map and move the
33
+ camera through the composition.
34
+ - **Mask migration:** evolve one mask window across images or sections.
35
+ - **Object persistence:** keep a key subject staged while its environment,
36
+ scale, supporting content, and berth change.
37
+ - **Generated-keyframe morph:** blend related still states through masking,
38
+ displacement, or a bounded frame sequence.
39
+ - **Pixel-to-object reconstruction:** assemble sampled text/image particles into
40
+ a recognizable subject.
41
+ - **Typography-to-image:** use readable type as mask, grid, path, or fragment
42
+ source that becomes imagery.
43
+ - **Environmental system:** drive texture, light, particles, type, and objects
44
+ from the same scroll/interaction state.
45
+ - **Editorial sequence:** treat a long section as one pinned timeline with
46
+ deliberate internal states rather than independent blocks.
47
+
24
48
  ## Type
25
49
 
26
50
  - Split lines/words/characters only for selected display moments; keep accessible
@@ -24,6 +24,8 @@ Required top-level fields:
24
24
  declared during planning
25
25
  - `ruleExceptions`: bounded substitutions of evidence-backed defaults
26
26
  - `creativeStrategy`: `diversity` or `development` at expressive/award tiers
27
+ - `motionComplexityBudget`: hero moments, calm sections, shared language,
28
+ device limits, progressive enhancement, and anti-default review
27
29
  - `fontDecision`: candidates, reflex markers, ledger history, and justification
28
30
  - `experimentalPlan`: per-section candidates and the selected two or three peaks
29
31
  - `conceptExploration` and `recipeAccess`: proof recipes were loaded only after
@@ -34,11 +36,14 @@ and `mobile`, but optional treatments are assigned only where they serve that
34
36
  page. A section may use only skills assigned to its parent page.
35
37
 
36
38
  Each section requires `id`, `name`, `layoutFamily`, `skills`, `interactions`,
37
- `mobile`, `fallback`, `verification`, `assets`, and `status`. Status is
39
+ `mobile`, `fallback`, `verification`, `assets`, and `status`. At expressive/
40
+ award it also requires `motionTreatment`: class, static composition, start/end
41
+ states, changes, pins, handoff, purpose, mechanism, mobile, and reduced motion. Status is
38
42
  `planned | shipped | fallback | cut`; fallback/cut requires `reason`.
39
43
 
40
- Each asset requires `id`, `path`, `purpose`, and `status`. A shipped asset must
41
- exist when `dreative audit` runs.
44
+ Each asset requires `id`, `path`, `purpose`, `importance`, `preparation`, and
45
+ `status`. Preparation records flat/decompose/variants/sequence, named
46
+ derivatives, and rationale. A shipped asset must exist when `dreative audit` runs.
42
47
 
43
48
  ### Routing authority
44
49
 
@@ -59,16 +64,16 @@ evidence IDs. The exception must predate `implementationStartedAt`.
59
64
 
60
65
  ```json
61
66
  {
62
- "ruleId": "award.spatialSignature",
67
+ "ruleId": "media.keyAssetTreatment",
63
68
  "decision": "substituted",
64
69
  "declaredAt": "2026-01-01T00:30:00.000Z",
65
- "reason": "The archival concept has no physical subject, so a product prop would misrepresent the material.",
70
+ "reason": "The archive contains no raster key imagery, so inventing photography would misrepresent the supplied material.",
66
71
  "alternative": "A persistent variable-type specimen becomes index, spatial architecture, and interactive control.",
67
72
  "successCriteria": [
68
- "The specimen appears in at least three materially different roles",
69
- "Pointer and scroll input visibly reshape its depth"
73
+ "The specimen appears in materially different structural roles",
74
+ "Pointer and scroll input visibly reshape the specimen"
70
75
  ],
71
- "evidenceIds": ["spatial-type-desktop", "spatial-type-mobile"]
76
+ "evidenceIds": ["type-system-desktop", "type-system-mobile"]
72
77
  }
73
78
  ```
74
79
 
@@ -76,9 +81,15 @@ evidence IDs. The exception must predate `implementationStartedAt`.
76
81
 
77
82
  At `expressive` and `award`, `creativeStrategy.path` is either:
78
83
 
79
- - `diversity`: at least four distinct mechanisms and three drivers; or
80
- - `development`: one named mechanism with three materially different states,
81
- two quieter secondary mechanisms, and two drivers.
84
+ - `diversity`: the concept-related mechanisms and drivers the experience needs;
85
+ or
86
+ - `development`: one named mechanism with materially different states and
87
+ quieter support.
88
+
89
+ `motionComplexityBudget` concentrates complexity into one to three hero moments
90
+ (normally two or three; one for a short page), names calm sections and the
91
+ shared language, and records the anti-default review. It is contextual, not a
92
+ mechanism quota.
82
93
 
83
94
  When `experimental` is selected, `experimentalPlan` records one candidate for
84
95
  every major section and marks only two or three as selected. Other sections
@@ -149,6 +160,11 @@ and rejects passing commands with nonzero exits or passing runs with console
149
160
  errors. `fail` blocks completion. Use `not-applicable` only with a concrete
150
161
  explanation and proof of why the criterion does not apply.
151
162
 
163
+ For expressive/award motion, tag evidence with `timelineState`: initial, early,
164
+ mid-transition, final, handoff, mobile, and reduced-motion; add pinned midpoint
165
+ and exit states when relevant. Record the post-inspection refinement in
166
+ `refinement` with findings, changes, and passing evidence IDs.
167
+
152
168
  ## `.dreative/ledger.json`
153
169
 
154
170
  The ledger is append-only design memory:
@@ -105,9 +105,9 @@
105
105
  "id": "award.spatialSignature",
106
106
  "category": "evidence-backed-default",
107
107
  "observedFailure": "Award builds used a generic orb or had no recurring dimensional system beyond the hero.",
108
- "defaultRemedy": "Use a recognizable real GLB or photoreal cutout prop staged in a designed berth.",
108
+ "defaultRemedy": "Plan one concept-specific spatial, media, typographic, or material signature that recurs and changes state.",
109
109
  "exceptionAllowed": true,
110
- "exceptionTest": "A named alternative creates equivalent depth, recurrence, interaction, and visual dominance on desktop and mobile.",
110
+ "exceptionTest": "A named alternative creates equivalent recurrence, interaction, visual dominance, and journey continuity on desktop and mobile.",
111
111
  "reviewAfterRuns": 5
112
112
  },
113
113
  {
@@ -123,27 +123,27 @@
123
123
  "id": "media.award.participatoryMoment",
124
124
  "category": "evidence-backed-default",
125
125
  "observedFailure": "Award media remained something visitors only watched while the page claimed immersion.",
126
- "defaultRemedy": "Use an image or video depth dive when the concept and assets support depth.",
126
+ "defaultRemedy": "Create one concept-specific point where the visitor affects, enters, transforms, or controls the media's visual logic.",
127
127
  "exceptionAllowed": true,
128
128
  "exceptionTest": "The visitor affects, enters, transforms, scrubs, drags, refracts, or controls the media's visual logic with equal perceptual impact.",
129
129
  "reviewAfterRuns": 5
130
130
  },
131
131
  {
132
- "id": "media.award.pixelCoverage",
132
+ "id": "media.keyAssetTreatment",
133
133
  "category": "evidence-backed-default",
134
134
  "observedFailure": "Award builds shipped one set-piece while all other key images remained static or used basic fade-and-zoom.",
135
- "defaultRemedy": "At least half of key images, minimum three, use distinct pixel-class treatments.",
135
+ "defaultRemedy": "Give every key image an explicit flat-or-decompose decision and concentrate meaningful transformation where the narrative changes state.",
136
136
  "exceptionAllowed": true,
137
- "exceptionTest": "One coherent alternative media system visibly develops through at least three materially different roles or states.",
137
+ "exceptionTest": "A coherent alternative media system makes key imagery intentional while preserving calm sections and asset feasibility.",
138
138
  "reviewAfterRuns": 5
139
139
  },
140
140
  {
141
- "id": "motion.expressive.diversityOrDevelopment",
141
+ "id": "motion.expressive.architecture",
142
142
  "category": "evidence-backed-default",
143
143
  "observedFailure": "Multiple sections repeated the same simple reveal or used unrelated effects only to satisfy a catalog.",
144
- "defaultRemedy": "Use four distinct mechanisms across three input drivers.",
144
+ "defaultRemedy": "Plan the page as connected visual states with a small number of hero moments, calm sections, and a concept-specific handoff language.",
145
145
  "exceptionAllowed": true,
146
- "exceptionTest": "One coherent signature mechanism develops through at least three materially different states with two quieter secondary mechanisms and two drivers.",
146
+ "exceptionTest": "A coherent signature mechanism develops through materially different states without requiring unrelated mechanisms or gimmick quotas.",
147
147
  "reviewAfterRuns": 5
148
148
  },
149
149
  {
@@ -22,8 +22,10 @@ all lower-tier requirements.
22
22
  ## Expressive (`expressive`)
23
23
 
24
24
  - Everything in Premium.
25
- - A recorded diversity-or-development path: several distinct mechanisms/drivers,
26
- or one signature mechanism developing through three states with quiet support.
25
+ - A recorded diversity-or-development path: concept-related mechanisms/drivers,
26
+ or one signature mechanism developing through materially different states.
27
+ - A section-by-section motion treatment and contextual complexity budget
28
+ concentrate structural/transformational motion into a few hero moments.
27
29
  - At least one input-driven treatment; entrances alone do not satisfy the tier.
28
30
  - Mobile translations and reduced-motion fallbacks are implemented, not noted.
29
31
  - Frame behavior and heavy asset cost are measured.
@@ -32,11 +34,11 @@ all lower-tier requirements.
32
34
 
33
35
  - Everything in Expressive.
34
36
  - A distinctive persistent spatial, media, or material system shapes the journey.
35
- - One unmistakable dimensional or spatial signature is subject-honest, staged,
36
- and resilient. A real GLB/cutout is the proven default, not the only medium.
37
+ - One unmistakable spatial, media, typographic, or material signature is
38
+ subject-honest, staged, and resilient. WebGL/3D is used only when justified.
37
39
  - Runtime evidence covers effects, transferred weight, frame time, occlusion,
38
40
  context loss/loading, and fallbacks.
39
- - The page has three memorable moments without sacrificing function.
41
+ - The page has a small number of memorable moments without sacrificing function.
40
42
 
41
43
  Do not force Award requirements on product dashboards, checkout, forms, or users
42
44
  who asked for calm professional work. Ambition is a product decision, not a score.
@@ -48,6 +48,7 @@
48
48
  "implementationStartedAt": { "type": "string", "format": "date-time" },
49
49
  "ruleExceptions": { "type": "array", "items": { "$ref": "#/$defs/ruleException" } },
50
50
  "creativeStrategy": { "$ref": "#/$defs/creativeStrategy" },
51
+ "motionComplexityBudget": { "$ref": "#/$defs/motionComplexityBudget" },
51
52
  "fontDecision": { "$ref": "#/$defs/fontDecision" },
52
53
  "experimentalPlan": { "$ref": "#/$defs/experimentalPlan" },
53
54
  "conceptExploration": { "$ref": "#/$defs/conceptExploration" },
@@ -92,8 +93,8 @@
92
93
  "required": ["path", "mechanisms", "drivers"],
93
94
  "properties": {
94
95
  "path": { "const": "diversity" },
95
- "mechanisms": { "type": "array", "minItems": 4, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
96
- "drivers": { "type": "array", "minItems": 3, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } }
96
+ "mechanisms": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
97
+ "drivers": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } }
97
98
  }
98
99
  },
99
100
  {
@@ -103,13 +104,50 @@
103
104
  "properties": {
104
105
  "path": { "const": "development" },
105
106
  "signatureMechanism": { "type": "string", "minLength": 1 },
106
- "states": { "type": "array", "minItems": 3, "uniqueItems": true, "items": { "type": "string", "minLength": 12 } },
107
- "secondaryMechanisms": { "type": "array", "minItems": 2, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
108
- "drivers": { "type": "array", "minItems": 2, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } }
107
+ "states": { "type": "array", "minItems": 2, "uniqueItems": true, "items": { "type": "string", "minLength": 12 } },
108
+ "secondaryMechanisms": { "type": "array", "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
109
+ "drivers": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } }
109
110
  }
110
111
  }
111
112
  ]
112
113
  },
114
+ "motionComplexityBudget": {
115
+ "type": "object",
116
+ "additionalProperties": false,
117
+ "required": ["heroMoments", "calmSectionIds", "sharedLanguage", "deviceLimits", "progressiveEnhancement", "antiDefaultReview"],
118
+ "properties": {
119
+ "heroMoments": {
120
+ "type": "array",
121
+ "minItems": 1,
122
+ "maxItems": 3,
123
+ "items": {
124
+ "type": "object",
125
+ "additionalProperties": false,
126
+ "required": ["sectionId", "reason"],
127
+ "properties": {
128
+ "sectionId": { "type": "string", "minLength": 1 },
129
+ "reason": { "type": "string", "minLength": 20 }
130
+ }
131
+ }
132
+ },
133
+ "calmSectionIds": { "type": "array", "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
134
+ "sharedLanguage": { "type": "string", "minLength": 20 },
135
+ "deviceLimits": { "type": "string", "minLength": 20 },
136
+ "progressiveEnhancement": { "type": "string", "minLength": 20 },
137
+ "antiDefaultReview": {
138
+ "type": "object",
139
+ "additionalProperties": false,
140
+ "required": ["basicMotionAssessment", "compositionHandoff", "visualStateChange", "conceptSpecificity", "memorableMoment"],
141
+ "properties": {
142
+ "basicMotionAssessment": { "type": "string", "minLength": 20 },
143
+ "compositionHandoff": { "type": "string", "minLength": 20 },
144
+ "visualStateChange": { "type": "string", "minLength": 20 },
145
+ "conceptSpecificity": { "type": "string", "minLength": 20 },
146
+ "memorableMoment": { "type": "string", "minLength": 20 }
147
+ }
148
+ }
149
+ }
150
+ },
113
151
  "fontDecision": {
114
152
  "type": "object",
115
153
  "additionalProperties": false,
@@ -199,11 +237,22 @@
199
237
  "asset": {
200
238
  "type": "object",
201
239
  "additionalProperties": false,
202
- "required": ["id", "path", "purpose", "status"],
240
+ "required": ["id", "path", "purpose", "importance", "preparation", "status"],
203
241
  "properties": {
204
242
  "id": { "type": "string", "minLength": 1 },
205
243
  "path": { "type": "string", "minLength": 1 },
206
244
  "purpose": { "type": "string", "minLength": 1 },
245
+ "importance": { "enum": ["supporting", "key"] },
246
+ "preparation": {
247
+ "type": "object",
248
+ "additionalProperties": false,
249
+ "required": ["decision", "derivatives", "rationale"],
250
+ "properties": {
251
+ "decision": { "enum": ["flat", "decompose", "variants", "sequence"] },
252
+ "derivatives": { "type": "array", "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
253
+ "rationale": { "type": "string", "minLength": 12 }
254
+ }
255
+ },
207
256
  "status": { "$ref": "#/$defs/status" },
208
257
  "reason": { "type": "string", "minLength": 1 }
209
258
  }
@@ -218,6 +267,7 @@
218
267
  "layoutFamily": { "type": "string", "minLength": 1 },
219
268
  "skills": { "type": "array", "uniqueItems": true, "items": { "$ref": "#/$defs/skill" } },
220
269
  "interactions": { "type": "array", "items": { "type": "string" } },
270
+ "motionTreatment": { "$ref": "#/$defs/motionTreatment" },
221
271
  "mobile": { "type": "string", "minLength": 1 },
222
272
  "fallback": { "type": "string", "minLength": 1 },
223
273
  "verification": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
@@ -226,6 +276,24 @@
226
276
  "reason": { "type": "string", "minLength": 1 }
227
277
  }
228
278
  },
279
+ "motionTreatment": {
280
+ "type": "object",
281
+ "additionalProperties": false,
282
+ "required": ["class", "staticComposition", "startState", "endState", "changes", "pinnedElements", "handoff", "purpose", "mechanism", "mobile", "reducedMotion"],
283
+ "properties": {
284
+ "class": { "enum": ["none", "decorative", "structural", "transformational"] },
285
+ "staticComposition": { "type": "string", "minLength": 12 },
286
+ "startState": { "type": "string", "minLength": 12 },
287
+ "endState": { "type": "string", "minLength": 12 },
288
+ "changes": { "type": "array", "items": { "type": "string", "minLength": 1 } },
289
+ "pinnedElements": { "type": "array", "items": { "type": "string", "minLength": 1 } },
290
+ "handoff": { "type": "string", "minLength": 12 },
291
+ "purpose": { "type": "string", "minLength": 12 },
292
+ "mechanism": { "type": "string", "minLength": 12 },
293
+ "mobile": { "type": "string", "minLength": 12 },
294
+ "reducedMotion": { "type": "string", "minLength": 12 }
295
+ }
296
+ },
229
297
  "page": {
230
298
  "type": "object",
231
299
  "additionalProperties": false,
@@ -19,6 +19,9 @@
19
19
  "criterion": { "type": "string", "minLength": 1 },
20
20
  "status": { "enum": ["pass", "fail", "not-applicable"] },
21
21
  "evidence": { "type": "string", "minLength": 1 },
22
+ "timelineState": {
23
+ "enum": ["initial", "early", "mid-transition", "final", "handoff", "pinned-midpoint", "pinned-exit", "mobile", "reduced-motion"]
24
+ },
22
25
  "proof": {
23
26
  "type": "object",
24
27
  "additionalProperties": false,
@@ -56,6 +59,17 @@
56
59
  }
57
60
  }
58
61
  }
62
+ },
63
+ "refinement": {
64
+ "type": "object",
65
+ "additionalProperties": false,
66
+ "required": ["inspectedAt", "findings", "changes", "evidenceIds"],
67
+ "properties": {
68
+ "inspectedAt": { "type": "string", "format": "date-time" },
69
+ "findings": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
70
+ "changes": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
71
+ "evidenceIds": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } }
72
+ }
59
73
  }
60
74
  }
61
75
  }