@ankhorage/devtools 1.10.10 → 1.10.12

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.
@@ -2,20 +2,19 @@
2
2
  name: ankhorage-project-structure
3
3
  description: >
4
4
  Design, review, or migrate the source structure of Ankhorage repositories and generated
5
- applications. Use for directory ownership, package boundaries, architectural profiles,
6
- ports and adapters, package CLI layout, repository skill distribution, public entrypoints,
7
- or cross-repository cleanup.
5
+ applications. Use for directory ownership, package boundaries, package CLI layout, repository
6
+ skill distribution, public entrypoints, or cross-repository cleanup.
8
7
  ---
9
8
 
10
9
  # Ankhorage Project Structure
11
10
 
12
- Apply a repository profile instead of forcing one folder tree onto every package.
11
+ Apply the general ownership rules first. Only Studio currently has a mandated source taxonomy.
13
12
 
14
13
  Before deciding structure:
15
14
 
16
15
  1. Read the repository `AGENTS.md`, `package.json`, exports, source tree, and representative tests.
17
16
  2. Load `ankhorage-coding-rules` as the complementary implementation and testing authority.
18
- 3. Identify the repository's owning capability and its profile below.
17
+ 3. Identify the repository's owning capability.
19
18
  4. Identify current public subpaths and cross-package release boundaries.
20
19
 
21
20
  Repository-specific rules may refine this skill, but must not silently reverse package ownership
@@ -24,35 +23,23 @@ or dependency direction.
24
23
  ## Primary boundary
25
24
 
26
25
  An Ankhorage repository/package is the primary bounded capability and independently released
27
- unit. Do not create a generic `src/features/` layer that imitates package boundaries.
26
+ unit. Do not force a Studio directory tree onto libraries, providers, tooling, or generated
27
+ applications.
28
28
 
29
29
  - Independently bindable capabilities belong in standalone packages.
30
- - Substantial responsibilities inside a package use cohesive domain directories directly under
31
- `src/`.
30
+ - Substantial responsibilities inside a package use cohesive directories owned by the package.
32
31
  - Cross-package access uses published APIs and declared dependencies, never sibling source.
33
32
  - A package owns its application behavior; adapters belonging to another package are not copied
34
33
  or proxied locally.
35
34
 
36
- ## Select a profile
37
-
38
- Read [repository-profiles.md](references/repository-profiles.md), select one primary profile, and
39
- apply only the references routed by that profile.
40
-
41
- | Profile | Typical repositories | Required references |
42
- | ---------------------------------- | ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
43
- | Application, engine, or hybrid | Studio, Runtime, Orchestrator, Deploy, Infra | [hexagonal-architecture.md](references/hexagonal-architecture.md) |
44
- | React Native / Expo application | generated apps, Studio app host | [hexagonal-architecture.md](references/hexagonal-architecture.md), [expo-apps.md](references/expo-apps.md) |
45
- | Component or design-system library | ZORA, Surface | [ui-libraries.md](references/ui-libraries.md) |
46
- | Contracts or value library | Contracts and other portable models | [repository-profiles.md](references/repository-profiles.md) |
47
- | Utility library | Utility | [utilities.md](references/utilities.md) |
48
- | Platform/provider adapter | Expo Runtime, Supabase packages, orchestrator modules | [repository-profiles.md](references/repository-profiles.md) |
49
- | Tooling or CLI package | Ankh, Doctor, Devtools and any package exposing Ankh commands | [cli.md](references/cli.md) |
50
-
51
35
  When a package declares an Ankh provider or changes `src/cli/`, always read
52
- [cli.md](references/cli.md), regardless of its primary profile.
36
+ [cli.md](references/cli.md).
37
+
38
+ When classifying a local or cross-repository utility, also read
39
+ [utilities.md](references/utilities.md).
53
40
 
54
41
  When the task is a structural cleanup or migration, also read
55
- [migration.md](references/migration.md). For Studio specifically, read
42
+ [migration.md](references/migration.md). For `ankhorage/studio`, always also read
56
43
  [studio.md](references/studio.md).
57
44
 
58
45
  When adding, distributing, or synchronizing repository-local agent skills, read
@@ -63,13 +50,8 @@ When adding, distributing, or synchronizing repository-local agent skills, read
63
50
  - Keep only intentional package entrypoints and required declaration shims directly under `src/`.
64
51
  - Keep one abstraction level and responsibility among siblings.
65
52
  - Prefer domain ownership over technical dumping grounds such as `common`, `core`, `helpers`,
66
- `misc`, or `shared`.
67
- - `app/`, `cli/`, `host/`, and `platform/` are package-level edges or composition areas, not
68
- alternate owners of domain behavior.
69
- - Ports are owned by the application/domain code that requires the capability.
70
- - Adapters depend inward; domain/application code does not import concrete adapters.
71
- - Add a port only for a real external or replaceable boundary. Do not wrap every function in
72
- architecture ceremony.
53
+ `misc`, or `shared`. `utils/` is the canonical local directory for genuine package-level
54
+ utilities.
73
55
  - Colocate focused unit tests. Put cross-domain acceptance, E2E, smoke infrastructure, and large
74
56
  fixtures outside production source.
75
57
  - Public package subpaths may point to nested source. Do not keep files at `src/` merely because
@@ -88,3 +70,10 @@ For every file or new symbol, decide in order:
88
70
  4. Is it reusable enough to belong in `@ankhorage/utility` instead?
89
71
 
90
72
  If any answer is unclear, resolve ownership before moving or creating code.
73
+
74
+ ## Studio enforcement
75
+
76
+ Only `ankhorage/studio` has a mandatory source taxonomy and hexagonal feature architecture. Its
77
+ complete allowlist, exceptions, port/adapter rules, and generated-app policy are in
78
+ [studio.md](references/studio.md). Other repositories remain structurally unconstrained beyond the
79
+ universal invariants until their owning repository is deliberately brought into scope.
@@ -3,8 +3,8 @@
3
3
  Read this only for `ankhorage/studio`. It is a structural target and ownership checklist, not a
4
4
  license to move every file in one change.
5
5
 
6
- Studio is an application/hybrid package. The Studio package is the bounded capability; its internal
7
- responsibilities are domains, not independently bound `features`.
6
+ Studio is the bounded capability. `features/` is its internal organizational boundary; its contents
7
+ are not independently bound packages.
8
8
 
9
9
  ## Target source tree
10
10
 
@@ -13,29 +13,31 @@ src/
13
13
  index.ts
14
14
  root.ts
15
15
 
16
- app/ # React/RN application edge and composition
17
16
  cli/ # one Studio Ankh provider
18
17
  host/ # Bun/Fastify/filesystem edges and host composition
19
- platform/ # Studio-local native/web implementations only
20
-
21
- auth/
22
- bindings/
23
- canvas/
24
- deploy/
25
- diagnostics/
26
- external-apis/
27
- manifest/
28
- media/
29
- modules/
30
- projects/
31
- properties/
32
- routes/
33
- secrets/
34
- selection/
35
- templates/
36
- workspace/
18
+ apps/ # generated applications; Studio-only directory
19
+ <generated-app>/ # generated; never edited by hand
20
+ studio/ # temporary exception until Studio is generated
21
+
22
+ features/ # Studio-owned capabilities
23
+ auth/
24
+ bindings/
25
+ canvas/
26
+ deploy/
27
+ diagnostics/
28
+ external-apis/
29
+ manifest/
30
+ media/
31
+ modules/
32
+ projects/
33
+ properties/
34
+ routes/
35
+ secrets/
36
+ selection/
37
+ templates/
38
+ workspace/
37
39
 
38
- utils/
40
+ utils/ # the canonical Studio-local utility directory
39
41
 
40
42
  test/
41
43
  acceptance/
@@ -44,8 +46,20 @@ test/
44
46
  smoke/
45
47
  ```
46
48
 
47
- Substantial domains may contain `contracts`, `domain`, `application`, `ports`, and domain-local
48
- `utils` when those roles genuinely exist. Do not pre-create all role directories.
49
+ `index.ts`, `root.ts`, `cli/`, `host/`, `apps/`, `features/`, and `utils/` are the complete Studio
50
+ root taxonomy, apart from required declaration shims. Do not create `app/`, `platform/`, `common/`,
51
+ `core/`, `helpers/`, or `shared/`.
52
+
53
+ Substantial features may contain `contracts`, `domain`, `application`, `ports`, `adapters`, and
54
+ focused colocated `tests` when those roles genuinely exist. Do not pre-create role directories.
55
+
56
+ `apps/` contains complete generator-owned applications. Nothing under it is manually maintained.
57
+ `apps/studio/` is a temporary exception while Studio is still hand-authored; it must disappear when
58
+ the Studio app is generated.
59
+
60
+ `utils/` is the one canonical local utility directory. It contains only reusable Studio-local,
61
+ framework-neutral helpers; behavior with feature semantics remains in that feature, and behavior
62
+ reused across repositories belongs in `@ankhorage/utility`.
49
63
 
50
64
  ## Studio CLI
51
65
 
@@ -73,41 +87,73 @@ ankh studio projects list -> commands/projects/list.ts
73
87
  ankh studio projects sync -> commands/projects/sync.ts
74
88
  ```
75
89
 
90
+ `cli/commands/` contains inbound adapters only: parse command input, invoke a feature application
91
+ operation, and render the result. It must not own feature rules or external-package integrations.
92
+
93
+ ## Studio host
94
+
95
+ ```text
96
+ src/host/
97
+ createStudioHost.ts
98
+ middleware/
99
+ routes/
100
+ <feature>/
101
+ ```
102
+
103
+ `host/` contains inbound HTTP, filesystem, and process adapters plus their composition. Route and
104
+ middleware modules translate into feature application operations; they do not own feature rules.
105
+
76
106
  `ankh studio workspace install` is not part of the target. Generated apps are standalone and own
77
107
  their installation. Remove the obsolete command, handler, capability, tests, and documentation
78
108
  rather than relocating them.
79
109
 
80
110
  ## Current directory disposition
81
111
 
82
- - Root `binding*` modules move into `bindings/`.
83
- - Root `canvas*` and insert/placement behavior move into `canvas/`.
84
- - Root `projectDeploy*`, host deploy code, deploy routes, and deploy UI converge under the `deploy`
85
- domain and package-level edges.
86
- - Root auth settings/health/OAuth behavior and host auth implementations converge under `auth` and
87
- package-level edges.
112
+ - Root `binding*` modules move into `features/bindings/`.
113
+ - Root `canvas*` and insert/placement behavior move into `features/canvas/`.
114
+ - Root `projectDeploy*`, host deploy code, deploy routes, and deploy UI converge under
115
+ `features/deploy/`, with host routes remaining in `host/routes/deploy/`.
116
+ - Root auth settings/health/OAuth behavior and host auth implementations converge under
117
+ `features/auth/`, with host routes remaining in `host/routes/auth/`.
88
118
  - Root external API contracts/model code, host API services, routes, and UI converge under
89
- `external-apis` and package-level edges.
90
- - Root media authoring code, host media implementations, and media UI converge under `media` and
91
- package-level edges.
92
- - Root module admin code and host module integration converge under `modules` and package-level
93
- edges.
94
- - Root project/workspace models, current app project screens, hooks, project store/generation
95
- operations, and matching adapters converge under `projects`, `templates`, or `workspace` according
96
- to actual ownership.
97
- - Root secret API/usage/response behavior, host secret implementations, routes, and UI converge
98
- under `secrets` and package-level edges.
99
- - Route and admin-route behavior moves under `routes`.
119
+ `features/external-apis/`, with host routes remaining in `host/routes/external-apis/`.
120
+ - Root media authoring code, host media implementations, and media UI converge under
121
+ `features/media/`.
122
+ - Root module admin code and host module integration converge under `features/modules/`.
123
+ - Root project/workspace models, project screens, hooks, project store/generation operations, and
124
+ matching adapters converge under `features/projects/`, `features/templates/`, or
125
+ `features/workspace/` according to actual ownership.
126
+ - Root secret API/usage/response behavior and host secret implementations converge under
127
+ `features/secrets/`, with host routes remaining in `host/routes/secrets/`.
128
+ - Route and admin-route policy moves under `features/routes/`; the corresponding host adapters stay
129
+ in `host/routes/`.
100
130
  - Selection, measurement, stationary selection, and canvas interaction behavior must be separated
101
- between `selection` and `canvas` by actual invariant ownership.
102
- - The current generic `core/` directory disappears; each file moves to its owning domain or package
103
- edge.
131
+ between `features/selection/` and `features/canvas/` by actual invariant ownership.
132
+ - The current generic `core/` directory disappears; each file moves to its owning feature role or
133
+ package edge.
104
134
  - The current generic `runtime/` directory is reviewed symbol by symbol. Shared runtime behavior
105
- moves to `@ankhorage/runtime`; Studio-specific application integration moves to `app/` or its
106
- owning domain.
107
- - Feature-specific UI moves beside its owning domain. Only package-wide UI composition remains in
108
- `app/`.
135
+ moves to `@ankhorage/runtime`; Studio-specific integration becomes a feature-local adapter.
136
+ - Feature-specific UI becomes generated-app code under `apps/`; it is never rehomed in a generic
137
+ Studio UI directory.
109
138
  - Host smoke and acceptance infrastructure moves outside production source to `test/`.
110
139
 
140
+ ## External package integrations
141
+
142
+ An Ankhorage or third-party package is connected in the owning feature, not in a global
143
+ `platform/` directory. For example:
144
+
145
+ ```text
146
+ src/features/templates/
147
+ ports/
148
+ templateCatalogPort.ts
149
+ adapters/
150
+ createAnkhorageTemplatesAdapter.ts
151
+ ```
152
+
153
+ The port states the capability that Templates requires. The adapter imports
154
+ `@ankhorage/templates`, translates its API, and implements that port. The composition root chooses
155
+ the adapter. Do not duplicate an adapter in `host/`, `cli/`, or another feature.
156
+
111
157
  ## Utility gates
112
158
 
113
159
  The existing own-property helpers explicitly marked for Utility extraction should move through
@@ -1,29 +1,33 @@
1
1
  ---
2
2
  name: zora-designer
3
3
  description: >
4
- Design one application screen or an ordered screen series, audit a URL or supplied image
5
- evidence, and author an Ankhorage Templates manifest or starter using installed ZORA metadata
6
- and theme APIs. Use for category-driven design decisions, design audits and scoring, visual
7
- reconstruction with ZORA elements, or template creation. Do not use for illustration-only work.
4
+ Configure an owner-backed application design, generate one screen or a coherent screen series,
5
+ audit supplied evidence, and author portable Ankhorage templates. Use for category-driven design
6
+ decisions, ZORA screen generation, visual audits, or template creation.
8
7
  ---
9
8
 
10
9
  # ZORA Designer
11
10
 
12
- Design, audit, and author through the target repository's released owner APIs. Keep
13
- `zora-designer.md` as review evidence; the application manifest and owner contracts remain runtime
14
- authority.
11
+ Design, audit, and author through the target repository's released owner APIs. The complete
12
+ `AppManifest` is runtime authority; `zora-designer.md` and generated screen images are design
13
+ evidence.
15
14
 
16
15
  ## Route the request
17
16
 
18
- - `interactive`: resolve a design configuration without silently creating code or images.
19
- - `screen`: design one screen and, when requested, produce a concept image or implementation.
20
- - `screens`: design a coherent ordered series with shared navigation, state, and tokens.
21
- - `audit`: evaluate a URL, one supplied image, or an ordered image series with explicit evidence.
22
- - `template`: compose a canonical `AppManifest`; in Templates, scaffold the normal starter source
23
- and registry entry.
24
-
25
- Natural language is enough. Ask only when an unresolved choice would materially change the output.
26
- Read [workflow.md](references/workflow.md) for the ordered process and capability gates.
17
+ - `interactive`: run the progressive configuration conversation in
18
+ [workflow.md](references/workflow.md). Do not create code or images before confirmation.
19
+ - `screen`: resolve the configuration, then read [screens.md](references/screens.md) and design one
20
+ screen.
21
+ - `screens`: resolve the configuration, then read [screens.md](references/screens.md) and design an
22
+ ordered series with shared navigation, state, geometry, and tokens.
23
+ - `audit`: read [audit.md](references/audit.md) and evaluate supplied image or runtime evidence.
24
+ - `template`: resolve the configuration and screen model, then author one portable template through
25
+ the workflow below.
26
+
27
+ Natural language is enough. Treat short replies as answers to the current question, not permission
28
+ to infer later decisions. A reply such as “go on” advances to the next unresolved decision. Only an
29
+ explicit request such as “accept all recommended values” resolves the remaining recommendations at
30
+ once.
27
31
 
28
32
  ## Start with the owners
29
33
 
@@ -33,57 +37,60 @@ From the target repository, run:
33
37
  bun .agents/skills/zora-designer/scripts/owner-api.mjs inspect
34
38
  ```
35
39
 
36
- The helper loads public exports from installed `@ankhorage/templates`, `@ankhorage/zora/theme`, and
37
- `@ankhorage/zora/metadata`. If it reports a missing or outdated owner, update the released package
38
- through the repository's normal dependency workflow. Never copy a catalog, token inventory, color
39
- algorithm, theme compiler, component schema, or manifest implementation into this skill.
40
-
41
- Use owner terminology verbatim: `GeneratedColorRole`, `ThemeTokens.colors`, `ThemeSemantics`, and
42
- `SemanticColorToken`. Do not introduce aliases or naming cleanup here.
40
+ Use its installed owner output for categories, recommendations, harmonies, tone pairs, navigation
41
+ types, ZORA elements, events, recipes, and version provenance. Never copy owner catalogs, component
42
+ schemas, token inventories, color algorithms, action types, or manifest implementations into this
43
+ skill.
43
44
 
44
- ## Preserve decisions and evidence
45
+ Compile chosen values with the same helper before composing screens. Inspect both computed modes,
46
+ including their resolved Surface themes and all owner diagnostics. Never hand-calculate a value the
47
+ owner exposes.
45
48
 
46
- Resolve values in this order: current request, current session, verified project state, confirmed
47
- existing brief target, category preset, then safe global default. Record an origin for each value.
48
- Keep target design separate from observed runtime state and report drift rather than overwriting one
49
- with the other.
49
+ ## Preserve the complete UX
50
50
 
51
- For scoring, evidence limits, release gates, and finding rules, read
52
- [audit.md](references/audit.md). For deterministic `zora-designer.md` shape and serialization, read
53
- [artifact.md](references/artifact.md).
51
+ For every screen region, prefer the exact semantic ZORA element supported by current metadata.
52
+ Visual resemblance alone is insufficient. If no exact element exists, preserve the requested UX
53
+ with an obvious supported placeholder such as a secondary-surface `Box`, and record the capability
54
+ gap. Do not invent props, application components, or successful behavior.
54
55
 
55
- ## Compose only supported ZORA elements
56
+ Bind every interaction expressible by installed Contracts and ZORA event metadata. Leave an
57
+ unsupported interaction visibly present and explicitly unbound without blocking unrelated design
58
+ work. Release validation still decides whether the complete manifest is shippable.
56
59
 
57
- Inspect `ZORA_COMPONENT_META` and `ZORA_THEME_RECIPE_META`. Map a source region only when the
58
- element's semantic responsibility, structure, states/interactions, accessibility contract, props,
59
- events, and data requirements fit. Visual resemblance alone is insufficient.
60
+ ## Template output
60
61
 
61
- If no exact element fits:
62
+ A Templates repository template is exactly one portable unit:
62
63
 
63
- 1. use the metadata-backed `MissingElement` draft node at that location;
64
- 2. record the evidence, warning, requested capability, and application blocker;
65
- 3. create or link a ZORA owner issue;
66
- 4. stop release application until a released real element replaces it.
64
+ ```text
65
+ src/templates/categories/{appCategory}/{slug}/
66
+ createAppManifest.ts
67
+ assets/
68
+ screens/
69
+ images/
70
+ ```
67
71
 
68
- Never disguise the gap with a generic container, invented prop, or custom application workaround.
72
+ `createAppManifest.ts` default-exports a function returning the complete `AppManifest`.
73
+ `assets/screens/` contains design evidence only. Runtime media uses real application image regions
74
+ under `assets/images/`; rebuild text, controls, icons, surfaces, and layout with ZORA.
69
75
 
70
- ## Capability truthfulness
76
+ Scaffold only a reviewed, release-valid manifest:
71
77
 
72
- - Concept image output requires an available image-generation capability.
73
- - URL intake and authoritative runtime screenshots require a browser/runtime capture capability.
74
- - Image audits require the supplied original image or ordered series.
78
+ ```text
79
+ bun .agents/skills/zora-designer/scripts/scaffold-template.mjs scaffold-input.json
80
+ ```
75
81
 
76
- When a required capability or source is unavailable, report that deliverable or evidence scope as
77
- blocked. Do not simulate an image, browser observation, or runtime proof. Clearly distinguish
78
- generated concept images from authoritative runtime captures.
82
+ The helper creates the template directory and regenerates discovery from the filesystem. Do not add
83
+ category registries, seed definitions, fallback templates, compatibility paths, or per-template
84
+ barrels.
79
85
 
80
86
  ## Validate before handoff
81
87
 
82
- - Compile the category design and both theme modes through installed owner APIs.
83
- - Validate manifest composition and preserve every owner diagnostic.
84
- - Confirm every manifest node and recipe against current ZORA metadata.
85
- - Run deterministic audit arithmetic when an audit is in scope.
86
- - Keep screenshot-only behavior `not-assessable`.
87
- - Require a ready application gate before release; a score never overrides a blocker.
88
- - Update `zora-designer.md` and report target/runtime drift, unsupported capabilities, and owner
89
- issues.
88
+ - confirm the interactive decision sequence completed or the user explicitly accepted remaining
89
+ recommendations;
90
+ - compile light and dark independently through installed owner APIs;
91
+ - validate selected ZORA nodes, props, events, actions, and complete manifest contracts;
92
+ - run the screen composition gate from [screens.md](references/screens.md) before returning screen
93
+ output;
94
+ - keep unsupported interactions and capability gaps explicit;
95
+ - keep concept screens separate from runtime assets;
96
+ - for deterministic artifact shape, read [artifact.md](references/artifact.md).
@@ -67,8 +67,10 @@ Aggregate validation in this order: blocker, failure, not run, pass with non-blo
67
67
  pass. Resolve the application gate separately. A runtime blocker affects aggregate status only when
68
68
  runtime application is in the requested scope.
69
69
 
70
- Every unresolved `MissingElement` records a blocker, owner issue link when one exists, and the
71
- condition for replacing it with a released real ZORA element.
70
+ Every capability that lacks an exact metadata-supported ZORA element records a non-blocking
71
+ capability gap and uses a visible `Box` placeholder in the concept composition. An owner diagnostic
72
+ with `severity: error` is a blocker. Record an owner issue link when one exists and the condition
73
+ for replacing the placeholder with a released real ZORA element.
72
74
 
73
75
  ## Deterministic audit fields
74
76
 
@@ -89,5 +91,5 @@ state that it was not persisted.
89
91
 
90
92
  Before returning, confirm the artifact matches the requested mode, every resolved value has an
91
93
  origin, owner identifiers were inspected, exact measurements came from tools, invisible behavior
92
- was not passed from screenshots, gaps block application, and the manifest remains canonical runtime
93
- authority.
94
+ was not passed from screenshots, owner errors block release, capability gaps are explicit, and the
95
+ manifest remains canonical runtime authority.
@@ -0,0 +1,90 @@
1
+ # Screen and Screen-Series Design
2
+
3
+ Read this reference for `screen` and `screens` after the interactive configuration is confirmed.
4
+ Generated images are concept evidence; the manifest and ZORA metadata remain implementation
5
+ authority.
6
+
7
+ ## Preconditions
8
+
9
+ Do not generate or implement a screen until these are resolved:
10
+
11
+ - audience and primary task;
12
+ - platform, input modes, theme coverage, and an explicit target viewport or responsive range;
13
+ - primary color, harmony, per-mode tone pairs, typography/profile, and compiled owner themes;
14
+ - ordered screen list with one purpose and primary action per screen;
15
+ - navigator type, route topology, and back/cancel behavior.
16
+
17
+ If the user supplies only `mobile`, recommend a neutral 390 by 844 logical-point portrait concept
18
+ viewport. Ask about iOS- or Android-specific chrome only when it changes the requested result.
19
+
20
+ ## Compose the series before rendering
21
+
22
+ For every screen record:
23
+
24
+ 1. purpose, primary task, primary action, and success outcome;
25
+ 2. content hierarchy and exact visible copy;
26
+ 3. default plus relevant loading, empty, partial, error, offline, disabled, pressed, selected, and
27
+ focus states;
28
+ 4. route relationship and continuity of selected item, filters, progress, drafts, or other state;
29
+ 5. exact metadata-backed ZORA elements, supported events/actions, data needs, and capability gaps;
30
+ 6. safe areas, keyboard/overlay behavior, scroll ownership, and narrow/wide behavior;
31
+ 7. real image content that must become an application asset rather than screenshot UI.
32
+
33
+ Create one shared shell specification for a series: viewport, safe areas, gutters, header geometry,
34
+ navigation geometry, surface treatment, type roles, icon family, content density, and state styling.
35
+ Reuse it unchanged unless a screen has a documented immersive or modal exception.
36
+
37
+ ## Mobile geometry and typography gate
38
+
39
+ Use compiled Surface/ZORA tokens when they define these values. Where the owner leaves a design-
40
+ brief decision open, use these starting constraints and record them rather than asking an image
41
+ model to improvise:
42
+
43
+ - 16–24 logical-point horizontal gutters and preserved top/bottom safe areas;
44
+ - at least 44 by 44 pt touch bounds, or the stricter target-platform convention;
45
+ - screen title uses the semantic `h1` role, normally near 32/40 on mobile, one line when practical
46
+ and never more than two; reserve `display` for splash, onboarding, or genuine marketing moments;
47
+ - section titles use `h2`/`h3`; body content normally starts near 16/24; metadata never becomes tiny
48
+ merely to fit more content;
49
+ - prose measures approximately 45–75 characters per line, with reading surfaces optimized near the
50
+ comfortable middle of that range;
51
+ - bottom navigation uses one stable height, label baseline, icon family, selected treatment, and
52
+ safe-area inset across the series;
53
+ - a screen must expose its purpose, primary content, and primary action without competing giant
54
+ headings or decorative elements.
55
+
56
+ Inspect the skill-owned design rules before rendering:
57
+
58
+ ```text
59
+ bun .agents/skills/zora-designer/scripts/audit.mjs catalog
60
+ ```
61
+
62
+ Apply every relevant `generation` rule from that catalog. The rubric belongs to this skill; owner
63
+ catalogs and design-system algorithms do not.
64
+
65
+ ## Concept-image specification
66
+
67
+ Generate one image per distinct screen or state. Every prompt must include:
68
+
69
+ - exact logical viewport and portrait/landscape orientation;
70
+ - shared shell and active navigator item;
71
+ - resolved owner palette and type-role sizes, not only mood adjectives;
72
+ - exact screen title, copy that must be legible, hierarchy, components, and primary action;
73
+ - content quantity that fits the viewport at the declared type scale;
74
+ - invariants shared with the other screens;
75
+ - prohibitions against device frames, presentation boards, watermarks, illegible labels, invented
76
+ tabs, and oversized marketing typography on ordinary application screens.
77
+
78
+ For a series, keep the resolved configuration and shell verbatim across prompts. Do not generate a
79
+ single contact sheet as a substitute for individual screens unless the user explicitly requests one.
80
+
81
+ ## Review and iterate
82
+
83
+ Inspect each output at its original dimensions. Reject and regenerate a screen when its title,
84
+ navigation, copy, safe areas, hierarchy, component semantics, or geometry diverges from the brief.
85
+ Use one targeted correction per iteration. Review the full ordered series together for shared shell,
86
+ type scale, navigation, color allocation, state continuity, and visual rhythm.
87
+
88
+ A visual review can validate visible composition only. It cannot prove runtime actions,
89
+ accessibility semantics, focus order, text scaling, or responsive behavior; record those as
90
+ not-assessable until implementation evidence exists.