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.
- package/dist/cli/audit.js +87 -11
- package/dist/cli/audit.test.js +40 -1
- package/dist/server/index.js +10 -5
- package/dist/shared/artifacts.js +100 -5
- package/dist/shared/artifacts.test.js +101 -0
- package/dist/shared/design.js +209 -24
- package/dist/shared/design.test.js +70 -0
- package/dist/shared/ruleSystem.js +1 -1
- package/dist/ui/assets/{index-CKwmbx2j.js → index-BQhYTdSa.js} +11 -11
- package/dist/ui/index.html +1 -1
- package/package.json +5 -5
- package/skill/dreative/DESIGN.md +13 -9
- package/skill/dreative/PLAN.md +13 -3
- package/skill/dreative/SKILL.md +15 -4
- package/skill/dreative/references/ARTIFACTS.md +26 -8
- package/skill/dreative/references/TIERS.md +7 -1
- package/skill/dreative/schemas/plan.schema.json +87 -5
- package/skill/dreative/schemas/verify.schema.json +8 -2
- package/skill/dreative/skills/mobile.md +6 -1
package/dist/ui/index.html
CHANGED
|
@@ -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-
|
|
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.
|
|
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
|
},
|
package/skill/dreative/DESIGN.md
CHANGED
|
@@ -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
|
|
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.
|
|
553
|
-
`
|
|
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
|
|
649
|
-
|
|
650
|
-
|
|
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
|
|
667
|
-
|
|
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
|
package/skill/dreative/PLAN.md
CHANGED
|
@@ -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 `
|
|
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
|
package/skill/dreative/SKILL.md
CHANGED
|
@@ -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
|
|
137
|
-
|
|
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
|
|
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`
|
|
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:
|
|
11
|
-
|
|
12
|
-
|
|
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`.
|
|
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":
|
|
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
|
|
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,
|
|
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
|
|
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":
|
|
10
|
-
"doctrineVersion": { "const":
|
|
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": { "
|
|
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":
|
|
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,
|
|
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.
|