dreative 0.5.3 → 0.5.4

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.
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Dreative</title>
7
- <script type="module" crossorigin src="/assets/index-CKwmbx2j.js"></script>
7
+ <script type="module" crossorigin src="/assets/index-BQhYTdSa.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="/assets/index-y0gVjC7u.css">
9
9
  </head>
10
10
  <body>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dreative",
3
- "version": "0.5.3",
4
- "description": "Frontend design skill for coding CLIs with typed planning, specialist treatments, verification, and an optional visual editor.",
3
+ "version": "0.5.4",
4
+ "description": "Frontend design skill for coding CLIs with typed planning, specialist treatments, verification, and an optional visual editor.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "dreative": "dist/cli/index.js"
@@ -14,9 +14,9 @@
14
14
  "build": "npm run build:server && npm run build:ui",
15
15
  "prepublishOnly": "npm run build",
16
16
  "build:server": "tsc -p tsconfig.json",
17
- "build:ui": "vite build",
18
- "test": "npm run build:server && node --test dist/shared/*.test.js dist/cli/*.test.js",
19
- "docs-check": "npm run build:server && node dist/cli/index.js docs-check",
17
+ "build:ui": "vite build",
18
+ "test": "npm run build:server && node --test dist/shared/*.test.js dist/cli/*.test.js",
19
+ "docs-check": "npm run build:server && node dist/cli/index.js docs-check",
20
20
  "dev": "concurrently \"tsx watch src/cli/index.ts --no-open\" \"vite\"",
21
21
  "start": "node dist/cli/index.js"
22
22
  },
@@ -4,7 +4,7 @@ You MUST read this file before servicing any `propose-skeletons`, `propose-varia
4
4
  `design-page`, or `edit-element` request, and run §12 before every respond. It exists
5
5
  because LLM-designed UIs converge on one templated look. Every rule corrects a known
6
6
  model default, but its category determines how it governs. Requests may carry a `plan` (Dreative's
7
- pre-computed decision: dials, per-section layout families, budgets, lints) — execute
7
+ pre-computed constraints: dials, depth, source strategy, structural/mobile/expression contracts, budgets, and lints) — execute
8
8
  the plan, apply this doctrine to everything the plan doesn't specify. When
9
9
  `plan.skills` names specialist skills (`motion`, `3d`, `interaction`, `immersive`,
10
10
  `cinematic`, `refined`, `media`, `ux`, `mobile`), the matching
@@ -549,8 +549,11 @@ route slugs, nav labels, form field names, logo, legal copy; extract brand token
549
549
  before applying §4 (a purple brand stays purple); apply modernisation levers in
550
550
  order — typography → spacing/rhythm → color recalibration → motion layer → hero
551
551
  recomposition → full replacement only when unsalvageable. Honor existing
552
- accessibility wins and analytics hooks. Preserve prior element-level edits when
553
- `previousFile` is set.
552
+ accessibility wins and analytics hooks. `previousFile` is a composition source
553
+ only for `restyle`. For `relayout`, old code is a content/behavior inventory. For
554
+ `restructure` and `reimagine`, it is a wiring reference only: draft the new
555
+ blueprint independently, then reconcile routes, handlers, data, fields, states,
556
+ accessibility, analytics, required copy, and public APIs.
554
557
 
555
558
  ### The preservation contract (mandatory for ANY redesign of existing code)
556
559
 
@@ -645,9 +648,10 @@ coat of CSS on the old skeleton.
645
648
  **The drastic-change floor (rungs 3–4).** The chronic failure at these rungs is
646
649
  timidity: the agent rebuilds the components but reproduces the old page's shape,
647
650
  so a before/after glance reads as a re-theme. That is a failed restructure. At
648
- rung 3–4 the new page must be **unmistakably a different design at one glance**
649
- someone shown both screenshots should assume different products. Concretely,
650
- change at least TWO structural paradigms, not just their styling:
651
+ rung 3–4 the structural-delta contract must name material changes to page
652
+ architecture, component boundaries, navigation, workflow, or interaction model.
653
+ Tokens, cards, decoration, and entrance motion cannot satisfy it. Relevant
654
+ paradigms can include:
651
655
 
652
656
  - **Navigation model** — top bar → side rail / command palette / dock / sticky
653
657
  chapter nav / full-screen overlay menu.
@@ -659,12 +663,12 @@ change at least TWO structural paradigms, not just their styling:
659
663
  - **Hero concept** — a new signature idea (typographic monument, media plane,
660
664
  3D object, kinetic composition), not the old hero with new colors.
661
665
 
662
- Creativity is bounded by usability: every drastic move must still be MORE
666
+ These are diagnostic possibilities, not quotas. Creativity is bounded by usability: every drastic move must still be MORE
663
667
  user-friendly than what it replaces — clearer hierarchy, fewer steps to the key
664
668
  action, honest affordances, mobile ergonomics intact (§13, skills/ux.md). A
665
669
  restructure that confuses users is as failed as one that changed nothing. The
666
- self-critique pass at these rungs must answer: "name the two-plus structural
667
- paradigms that changed, and why each is easier to use than before." If mid-work you discover the chosen rung cannot
670
+ self-critique pass must explain why the implemented delta honestly satisfies the
671
+ chosen depth and how it improves use. If mid-work you discover the chosen rung cannot
668
672
  honestly deliver the requested outcome (the reference look demands structure the
669
673
  current markup can't express), say so and ask to move up one rung rather than
670
674
  shipping an imitation. Rungs 3–4 on an extracted app still honor §11 preservation
@@ -263,8 +263,17 @@ hard cap 7). Structured tools always offer an "Other" free-text option, so
263
263
  every question doubles as a remarks channel — and the last question asked
264
264
  should explicitly invite extra direction.
265
265
 
266
- 1. **Depth** (redesigns of existing code only) — the §11 transformation-depth
267
- ladder: restyle / re-layout / restructure / reimagine.
266
+ 1. **Depth** (redesigns of existing code only) — the §11 transformation-depth
267
+ ladder: restyle / re-layout / restructure / reimagine.
268
+ Record it independently from ambition. For every page, write the current and
269
+ proposed models/paradigms, material changes, surviving/rebuilt boundaries,
270
+ preserved contracts, retained patterns with rationale, forbidden carryovers,
271
+ and a depth-honesty assessment. Then write the page-level mobile blueprint
272
+ (task, first viewport, exact order, thumb action, safe areas, navigation,
273
+ desktop translations, media/motion/forms, 390px and 320px compositions, and
274
+ why it is not desktop DOM stacking). Classify the page register before
275
+ composing; transactional, account, admin, and utility pages do not inherit a
276
+ marketing shell.
268
277
  2. **Treatments** (multi-select — THE canonical skill-picker list). List every
269
278
  option **individually**, never pre-bundled into a combo choice (a
270
279
  "refined+motion+interaction+ux+mobile" single option is a bug — the user
@@ -504,7 +513,8 @@ Persist the approved plan first to `.dreative/plan.json` using
504
513
  `references/ARTIFACTS.md` and `schemas/plan.schema.json`; this is the delivery
505
514
  contract consumed by `dreative audit`. Render the same decisions as a readable
506
515
  `.dreative/plan.md` for the user and session re-entry. Keep section and asset
507
- statuses synchronized in JSON as the build progresses. Set `doctrineVersion: 2`,
516
+ statuses synchronized in JSON as the build progresses. Set `version: 3` and
517
+ `doctrineVersion: 3`,
508
518
  record `implementationStartedAt` immediately before code changes, and ensure all
509
519
  rule exceptions predate it. **The first time this run writes into
510
520
  `.dreative/`, also write `.dreative/README.md`** with exactly this content
@@ -76,6 +76,13 @@ Detailed doctrine belongs in those references, not in this orchestration file.
76
76
  motion treatment for every major section: static composition, start/end
77
77
  states, changes, pins, handoff, purpose, mechanism, mobile translation, and
78
78
  reduced-motion state.
79
+ - For every existing page, record its register, source strategy, concrete
80
+ existing-versus-proposed structural delta, page-level mobile blueprint, and
81
+ typed verification criteria. `restyle` uses `patch`, `relayout` uses
82
+ `recompose`, and `restructure`/`reimagine` use `rebuild-from-contracts`.
83
+ Expressive/award pages also need a content/state-specific expression contract
84
+ or a documented intentional-calm rationale. Record project coherence without
85
+ repeating one branded shell across unlike page registers.
79
86
  - Render a concise `.dreative/plan.md` for the user and for session re-entry.
80
87
 
81
88
  The approved plan is a delivery contract. A section ends as `shipped`,
@@ -133,8 +140,9 @@ must appear somewhere in the overall plan, but not on every page.
133
140
  - Implement blueprint sections in order. Keep the machine plan status current.
134
141
  - Do not open recipe catalogs before `conceptExploration` records three
135
142
  brand-native concepts. Record every recipe file and load time in `recipeAccess`.
136
- - A restructure or reimagine rebuilds markup/component boundaries when necessary;
137
- it is not a stylesheet-only restyle.
143
+ - A restructure or reimagine creates the new blueprint independently, uses old
144
+ code only as a behavior/wiring reference, and then reconciles preservation.
145
+ It is not a stylesheet-only restyle.
138
146
  - Every heavy effect ships with its planned reduced-motion, mobile, loading, and
139
147
  runtime fallback.
140
148
 
@@ -155,7 +163,8 @@ Verification is evidence, not prose asserting that something was checked.
155
163
 
156
164
  1. Run the repository's targeted tests, typecheck, and build.
157
165
  2. Run the page and perform the `ux` functional audit.
158
- 3. Verify desktop and approximately 390px mobile.
166
+ 3. Verify desktop (approximately 1280/1440px), 390×844 mobile, and a 320px
167
+ narrow-mobile fallback for every important page.
159
168
  4. Check the console, links, forms, keyboard path, states, reduced motion,
160
169
  responsive overflow, and pointer hit areas.
161
170
  5. For motion/WebGL/video, record runtime evidence and performance numbers.
@@ -164,7 +173,9 @@ Verification is evidence, not prose asserting that something was checked.
164
173
  6. Reconcile every plan section and asset against what visibly shipped.
165
174
  7. At expressive/award, visually inspect the captured states, make at least one
166
175
  refinement to timing, composition, readability, or continuity, and record it.
167
- 8. Write `.dreative/verify.json` and run `dreative audit`.
176
+ 8. Write `.dreative/verify.json` v2. Associate each row to a typed criterion,
177
+ page/section, evidence kind, viewport class, and artifact/test. Run
178
+ `dreative audit`.
168
179
  9. Fix every error. Warnings require either a fix or a recorded justification.
169
180
 
170
181
  Every evidence-backed substitution references passing evidence IDs whose proof
@@ -7,9 +7,9 @@ All paths are relative to the target project.
7
7
 
8
8
  Required top-level fields:
9
9
 
10
- - `version: 2`
11
- - `doctrineVersion: 2` for the bounded-creative-controls format. Legacy v2
12
- plans without this field remain readable and receive a migration warning.
10
+ - `version: 3`, `doctrineVersion: 3`. Legacy v2 plans remain readable only for
11
+ compatibility and receive a migration warning; they do not satisfy v3 depth,
12
+ mobile, expression, or evidence guarantees.
13
13
  - `request`, `createdAt`
14
14
  - `tier`: `solid | premium | expressive | award`
15
15
  - `depth`: `restyle | relayout | restructure | reimagine`
@@ -17,6 +17,8 @@ Required top-level fields:
17
17
  - `skillPolicy`: hybrid routing policy, global foundations, explicit user page
18
18
  assignments, and `routingApproved: true`
19
19
  - `designRead`: `{ register, concept, signature }`
20
+ - `coherence`: global visual/interaction languages, shared primitives,
21
+ page-specific register/task models, continuity, and prohibited repeated shells
20
22
  - `preservationManifest`: normally `.dreative/preservation.json`
21
23
  - `decisionLedger`: normally `.dreative/ledger.json`
22
24
  - `pages`: ordered pages, each with its assigned skills and delivery sections
@@ -33,10 +35,16 @@ Required top-level fields:
33
35
 
34
36
  Every selected skill must appear on at least one page. Every page includes `ux`
35
37
  and `mobile`, but optional treatments are assigned only where they serve that
36
- page. A section may use only skills assigned to its parent page.
38
+ page. A section may use only skills assigned to its parent page. Each page also
39
+ requires `register`, the depth-derived `sourceStrategy`, a concrete
40
+ `structuralDelta`, and a page-level `mobileBlueprint`. Expressive/award pages
41
+ require an `expression` contract or `intentionalCalm`; at least one page across
42
+ the product must carry authored expression.
37
43
 
38
44
  Each section requires `id`, `name`, `layoutFamily`, `skills`, `interactions`,
39
- `mobile`, `fallback`, `verification`, `assets`, and `status`. At expressive/
45
+ `mobile`, `fallback`, typed `verification`, `assets`, and `status`. Verification
46
+ criteria include a stable id, claim, evidence kind, page/section, and required
47
+ viewport classes. At expressive/
40
48
  award it also requires `motionTreatment`: class, static composition, start/end
41
49
  states, changes, pins, handoff, purpose, mechanism, mobile, and reduced motion. Status is
42
50
  `planned | shipped | fallback | cut`; fallback/cut requires `reason`.
@@ -108,7 +116,7 @@ category from the registry. Repeating a recent display font needs an additional
108
116
 
109
117
  ```json
110
118
  {
111
- "version": 1,
119
+ "version": 2,
112
120
  "createdAt": "2026-01-01T00:00:00.000Z",
113
121
  "items": [
114
122
  {
@@ -138,6 +146,11 @@ Schema: `schemas/verify.schema.json`.
138
146
  {
139
147
  "id": "mobile-nav",
140
148
  "criterion": "Mobile navigation opens and closes",
149
+ "kind": "interaction",
150
+ "criterionId": "navigation-mobile",
151
+ "pageId": "home",
152
+ "sectionId": "navigation",
153
+ "viewportClass": "mobile",
141
154
  "status": "pass",
142
155
  "evidence": "Escape closes and focus returns to trigger",
143
156
  "proof": {
@@ -153,7 +166,11 @@ Schema: `schemas/verify.schema.json`.
153
166
  }
154
167
  ```
155
168
 
156
- Every evidence row requires a timestamp and concrete proof: an existing artifact
169
+ Every evidence row is joined to its planned criterion by id, page, section,
170
+ evidence kind, and viewport class. Every important page requires desktop
171
+ (approximately 1280/1440px), mobile (approximately 390×844), and narrow-mobile
172
+ (approximately 320px) evidence; deep redesigns also require structural-depth
173
+ evidence and every page requires preservation evidence. Every row requires a timestamp and concrete proof: an existing artifact
157
174
  path, command + exit code, tested URL/console count, FPS/frame-time measurement,
158
175
  or Playwright test identifier. `dreative audit` checks referenced artifact paths
159
176
  and rejects passing commands with nonzero exits or passing runs with console
@@ -192,5 +209,6 @@ store secrets, personal notes, or unrelated conversation.
192
209
  ## Audit
193
210
 
194
211
  Run `dreative audit`. It validates schemas, skill dependency closure, section
195
- completion, shipped assets, preservation needles, verification evidence, and the
212
+ completion, shipped assets, preservation needles, exact criterion/evidence
213
+ associations, required viewports, structural depth, anti-slop warnings, and the
196
214
  decision ledger. `--json` emits a machine-readable report.
@@ -26,7 +26,11 @@ all lower-tier requirements.
26
26
  or one signature mechanism developing through materially different states.
27
27
  - A section-by-section motion treatment and contextual complexity budget
28
28
  concentrate structural/transformational motion into a few hero moments.
29
- - At least one input-driven treatment; entrances alone do not satisfy the tier.
29
+ - At least one project-specific mechanism communicates content, state,
30
+ progression, selection, navigation, transformation, or spatial relationship.
31
+ Entrances, hover elevation, gradients, and large type alone do not satisfy
32
+ the tier. A calm page may document why while the wider product retains a
33
+ coherent authored expression system.
30
34
  - Mobile translations and reduced-motion fallbacks are implemented, not noted.
31
35
  - Frame behavior and heavy asset cost are measured.
32
36
 
@@ -42,3 +46,5 @@ all lower-tier requirements.
42
46
 
43
47
  Do not force Award requirements on product dashboards, checkout, forms, or users
44
48
  who asked for calm professional work. Ambition is a product decision, not a score.
49
+ Transformation depth remains separate: `restructure + solid` changes page
50
+ architecture, while `restyle + expressive` may retain it honestly.
@@ -4,10 +4,10 @@
4
4
  "title": "Dreative Multi-Page Direct Design Plan",
5
5
  "type": "object",
6
6
  "additionalProperties": false,
7
- "required": ["version", "request", "createdAt", "tier", "depth", "skills", "skillPolicy", "designRead", "pages", "preservationManifest", "decisionLedger"],
7
+ "required": ["version", "doctrineVersion", "request", "createdAt", "tier", "depth", "skills", "skillPolicy", "designRead", "coherence", "pages", "preservationManifest", "decisionLedger"],
8
8
  "properties": {
9
- "version": { "const": 2 },
10
- "doctrineVersion": { "const": 2 },
9
+ "version": { "const": 3 },
10
+ "doctrineVersion": { "const": 3 },
11
11
  "request": { "type": "string", "minLength": 1 },
12
12
  "createdAt": { "type": "string", "format": "date-time" },
13
13
  "tier": { "enum": ["solid", "premium", "expressive", "award"] },
@@ -53,6 +53,7 @@
53
53
  "experimentalPlan": { "$ref": "#/$defs/experimentalPlan" },
54
54
  "conceptExploration": { "$ref": "#/$defs/conceptExploration" },
55
55
  "recipeAccess": { "type": "array", "items": { "$ref": "#/$defs/recipeAccess" } },
56
+ "coherence": { "$ref": "#/$defs/coherence" },
56
57
  "pages": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/page" } },
57
58
  "preservationManifest": { "type": "string", "minLength": 1 },
58
59
  "decisionLedger": { "type": "string", "minLength": 1 }
@@ -270,7 +271,7 @@
270
271
  "motionTreatment": { "$ref": "#/$defs/motionTreatment" },
271
272
  "mobile": { "type": "string", "minLength": 1 },
272
273
  "fallback": { "type": "string", "minLength": 1 },
273
- "verification": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
274
+ "verification": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/verificationCriterion" } },
274
275
  "assets": { "type": "array", "items": { "$ref": "#/$defs/asset" } },
275
276
  "status": { "$ref": "#/$defs/status" },
276
277
  "reason": { "type": "string", "minLength": 1 }
@@ -294,13 +295,94 @@
294
295
  "reducedMotion": { "type": "string", "minLength": 12 }
295
296
  }
296
297
  },
298
+ "verificationCriterion": {
299
+ "type": "object",
300
+ "additionalProperties": false,
301
+ "required": ["id", "claim", "kind", "pageId", "viewports"],
302
+ "properties": {
303
+ "id": { "type": "string", "minLength": 1 },
304
+ "claim": { "type": "string", "minLength": 12 },
305
+ "kind": { "enum": ["visual", "interaction", "responsive", "preservation", "structural-depth"] },
306
+ "pageId": { "type": "string", "minLength": 1 },
307
+ "sectionId": { "type": "string", "minLength": 1 },
308
+ "viewports": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "enum": ["desktop", "mobile", "narrow-mobile", "non-visual"] } }
309
+ }
310
+ },
311
+ "pageRegister": { "enum": ["marketing-storytelling", "discovery-browse", "task-transaction", "account-status", "administration", "data-dense-utility", "authentication", "system-state"] },
312
+ "structuralDelta": {
313
+ "type": "object",
314
+ "additionalProperties": false,
315
+ "required": ["existingModel", "proposedModel", "existingParadigm", "proposedParadigm", "materialChanges", "survivingBoundaries", "rebuiltBoundaries", "preservedContracts", "retainedPatterns", "forbiddenCarryovers", "depthHonesty"],
316
+ "properties": {
317
+ "existingModel": { "type": "string", "minLength": 12 },
318
+ "proposedModel": { "type": "string", "minLength": 12 },
319
+ "existingParadigm": { "type": "string", "minLength": 12 },
320
+ "proposedParadigm": { "type": "string", "minLength": 12 },
321
+ "materialChanges": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 12 } },
322
+ "survivingBoundaries": { "type": "array", "items": { "type": "string", "minLength": 1 } },
323
+ "rebuiltBoundaries": { "type": "array", "items": { "type": "string", "minLength": 1 } },
324
+ "preservedContracts": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
325
+ "retainedPatterns": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["pattern", "rationale"], "properties": { "pattern": { "type": "string", "minLength": 1 }, "rationale": { "type": "string", "minLength": 12 } } } },
326
+ "forbiddenCarryovers": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
327
+ "depthHonesty": { "type": "string", "minLength": 20 }
328
+ }
329
+ },
330
+ "mobileBlueprint": {
331
+ "type": "object",
332
+ "additionalProperties": false,
333
+ "required": ["primaryTask", "firstViewportPurpose", "contentOrder", "beforeFirstScroll", "primaryThumbAction", "stickyElements", "safeArea", "navigationModel", "mobileOnlyComposition", "desktopTranslation", "mediaStrategy", "motionStrategy", "keyboardAndForms", "composition390", "fallback320", "stackingRejection", "verificationChecks"],
334
+ "properties": {
335
+ "primaryTask": { "type": "string", "minLength": 1 },
336
+ "firstViewportPurpose": { "type": "string", "minLength": 12 },
337
+ "contentOrder": { "type": "array", "minItems": 2, "items": { "type": "string", "minLength": 1 } },
338
+ "beforeFirstScroll": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
339
+ "primaryThumbAction": { "type": "object", "additionalProperties": false, "required": ["action", "placement"], "properties": { "action": { "type": "string", "minLength": 1 }, "placement": { "type": "string", "minLength": 12 } } },
340
+ "stickyElements": { "type": "array", "items": { "type": "string", "minLength": 1 } },
341
+ "safeArea": { "type": "string", "minLength": 12 },
342
+ "navigationModel": { "type": "string", "minLength": 12 },
343
+ "mobileOnlyComposition": { "type": "string", "minLength": 12 },
344
+ "desktopTranslation": { "type": "object", "additionalProperties": false, "required": ["retained", "translated", "removed", "replaced"], "properties": { "retained": { "type": "array", "items": { "type": "string" } }, "translated": { "type": "array", "items": { "type": "string" } }, "removed": { "type": "array", "items": { "type": "string" } }, "replaced": { "type": "array", "items": { "type": "string" } } } },
345
+ "mediaStrategy": { "type": "string", "minLength": 12 },
346
+ "motionStrategy": { "type": "string", "minLength": 12 },
347
+ "keyboardAndForms": { "type": "string", "minLength": 12 },
348
+ "composition390": { "type": "string", "minLength": 12 },
349
+ "fallback320": { "type": "string", "minLength": 12 },
350
+ "stackingRejection": { "type": "string", "minLength": 12 },
351
+ "verificationChecks": { "type": "array", "minItems": 13, "uniqueItems": true, "items": { "enum": ["no-horizontal-overflow", "no-clipped-content", "fixed-elements-clear-content", "safe-area-spacing", "primary-task-discoverable", "primary-action-reachable", "touch-targets", "software-keyboard-usable", "no-hover-only", "intentional-mobile-composition", "mobile-content-order", "motion-media-translated", "no-decorative-task-blocker"] } }
352
+ }
353
+ },
354
+ "expression": {
355
+ "type": "object",
356
+ "additionalProperties": false,
357
+ "required": ["mechanism", "communicates", "projectFit", "location", "mobileTranslation", "reducedMotion", "fallback", "verification"],
358
+ "properties": {
359
+ "mechanism": { "type": "string", "minLength": 12 }, "communicates": { "type": "string", "minLength": 12 }, "projectFit": { "type": "string", "minLength": 12 }, "location": { "type": "string", "minLength": 12 }, "mobileTranslation": { "type": "string", "minLength": 12 }, "reducedMotion": { "type": "string", "minLength": 12 }, "fallback": { "type": "string", "minLength": 12 }, "verification": { "type": "string", "minLength": 12 }
360
+ }
361
+ },
362
+ "coherence": {
363
+ "type": "object", "additionalProperties": false,
364
+ "required": ["globalVisualLanguage", "globalInteractionLanguage", "sharedPrimitives", "pageSpecificCompositions", "crossPageContinuity", "prohibitedRepeatedShells"],
365
+ "properties": {
366
+ "globalVisualLanguage": { "type": "string", "minLength": 12 }, "globalInteractionLanguage": { "type": "string", "minLength": 12 },
367
+ "sharedPrimitives": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
368
+ "pageSpecificCompositions": { "type": "array", "minItems": 1, "items": { "type": "object", "additionalProperties": false, "required": ["pageId", "register", "taskModel", "expressionLevel"], "properties": { "pageId": { "type": "string", "minLength": 1 }, "register": { "$ref": "#/$defs/pageRegister" }, "taskModel": { "type": "string", "minLength": 12 }, "expressionLevel": { "enum": ["calm", "authored"] } } } },
369
+ "crossPageContinuity": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
370
+ "prohibitedRepeatedShells": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }
371
+ }
372
+ },
297
373
  "page": {
298
374
  "type": "object",
299
375
  "additionalProperties": false,
300
- "required": ["id", "name", "skills", "sections"],
376
+ "required": ["id", "name", "register", "sourceStrategy", "structuralDelta", "mobileBlueprint", "skills", "sections"],
301
377
  "properties": {
302
378
  "id": { "type": "string", "minLength": 1 },
303
379
  "name": { "type": "string", "minLength": 1 },
380
+ "register": { "$ref": "#/$defs/pageRegister" },
381
+ "sourceStrategy": { "enum": ["patch", "recompose", "rebuild-from-contracts"] },
382
+ "structuralDelta": { "$ref": "#/$defs/structuralDelta" },
383
+ "mobileBlueprint": { "$ref": "#/$defs/mobileBlueprint" },
384
+ "expression": { "$ref": "#/$defs/expression" },
385
+ "intentionalCalm": { "type": "string", "minLength": 20 },
304
386
  "skills": { "$ref": "#/$defs/skillList" },
305
387
  "sections": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/section" } }
306
388
  }
@@ -6,17 +6,23 @@
6
6
  "additionalProperties": false,
7
7
  "required": ["version", "generatedAt", "evidence"],
8
8
  "properties": {
9
- "version": { "const": 1 },
9
+ "version": { "const": 2 },
10
10
  "generatedAt": { "type": "string", "format": "date-time" },
11
11
  "evidence": {
12
12
  "type": "array",
13
13
  "items": {
14
14
  "type": "object",
15
15
  "additionalProperties": false,
16
- "required": ["id", "criterion", "status", "evidence", "proof"],
16
+ "required": ["id", "criterion", "kind", "criterionId", "pageId", "viewportClass", "status", "evidence", "proof"],
17
17
  "properties": {
18
18
  "id": { "type": "string", "minLength": 1 },
19
19
  "criterion": { "type": "string", "minLength": 1 },
20
+ "kind": { "enum": ["visual", "interaction", "responsive", "preservation", "structural-depth"] },
21
+ "criterionId": { "type": "string", "minLength": 1 },
22
+ "pageId": { "type": "string", "minLength": 1 },
23
+ "sectionId": { "type": "string", "minLength": 1 },
24
+ "viewportClass": { "enum": ["desktop", "mobile", "narrow-mobile", "non-visual"] },
25
+ "mobileChecks": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "enum": ["no-horizontal-overflow", "no-clipped-content", "fixed-elements-clear-content", "safe-area-spacing", "primary-task-discoverable", "primary-action-reachable", "touch-targets", "software-keyboard-usable", "no-hover-only", "intentional-mobile-composition", "mobile-content-order", "motion-media-translated", "no-decorative-task-blocker"] } },
20
26
  "status": { "enum": ["pass", "fail", "not-applicable"] },
21
27
  "evidence": { "type": "string", "minLength": 1 },
22
28
  "timelineState": {
@@ -6,7 +6,8 @@ Universal foundation: ux and baseline mobile apply to every web page.
6
6
 
7
7
  Follow `../references/SKILL_CONTRACT.md`. Dependency: `ux`. This skill is
8
8
  universal for web work. Deliver a section-by-section mobile translation, touch
9
- targets, responsive media/effect budgets, and approximately 390px verification.
9
+ targets, responsive media/effect budgets, a page-level mobile blueprint, and
10
+ 390×844 plus 320px verification.
10
11
  It is never satisfied by shrinking desktop. Done means navigation, content,
11
12
  forms, orientation/viewport behavior, performance, and reduced motion pass on a
12
13
  coarse pointer.
@@ -34,6 +35,10 @@ choreography.
34
35
  screenful like one (hero = one headline + one visual + one CTA, nothing
35
36
  else). If a desktop section held three things, the mobile version stacks
36
37
  them as three clean beats or cuts to the strongest one.
38
+ - **Task pages are task-first.** The first viewport exposes what the user needs
39
+ to act, the current state, and the primary action. Supporting explanation
40
+ follows; promotional or decorative panels never block the task without a
41
+ page-specific reason recorded in the blueprint.
37
42
  - **Tidy is the aesthetic.** Consistent gutters (20-24px), one column
38
43
  discipline, generous vertical rhythm (56-80px between sections), no element
39
44
  closer than 8px to another. Clutter reads twice as loud at 390px.