@design-intelligence/ghost 0.20.0 → 0.22.0
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/README.md +47 -33
- package/dist/commands/checks-command.d.ts.map +1 -1
- package/dist/commands/checks-command.js +8 -1
- package/dist/commands/checks-command.js.map +1 -1
- package/dist/commands/fingerprint-commands.d.ts.map +1 -1
- package/dist/commands/fingerprint-commands.js +1 -6
- package/dist/commands/fingerprint-commands.js.map +1 -1
- package/dist/commands/gather-command.d.ts.map +1 -1
- package/dist/commands/gather-command.js +26 -30
- package/dist/commands/gather-command.js.map +1 -1
- package/dist/commands/init-command.d.ts.map +1 -1
- package/dist/commands/init-command.js +23 -13
- package/dist/commands/init-command.js.map +1 -1
- package/dist/commands/pull-command.d.ts.map +1 -1
- package/dist/commands/pull-command.js +12 -19
- package/dist/commands/pull-command.js.map +1 -1
- package/dist/commands/pulse-command.js +1 -10
- package/dist/commands/pulse-command.js.map +1 -1
- package/dist/commands/review-command.d.ts.map +1 -1
- package/dist/commands/review-command.js +1 -0
- package/dist/commands/review-command.js.map +1 -1
- package/dist/ghost-core/catalog/assemble.d.ts +0 -4
- package/dist/ghost-core/catalog/assemble.d.ts.map +1 -1
- package/dist/ghost-core/catalog/assemble.js +0 -10
- package/dist/ghost-core/catalog/assemble.js.map +1 -1
- package/dist/ghost-core/catalog/index.d.ts +1 -1
- package/dist/ghost-core/catalog/index.d.ts.map +1 -1
- package/dist/ghost-core/catalog/index.js +1 -1
- package/dist/ghost-core/catalog/index.js.map +1 -1
- package/dist/ghost-core/catalog/menu.d.ts +1 -11
- package/dist/ghost-core/catalog/menu.d.ts.map +1 -1
- package/dist/ghost-core/catalog/menu.js +1 -6
- package/dist/ghost-core/catalog/menu.js.map +1 -1
- package/dist/ghost-core/catalog/types.d.ts +0 -6
- package/dist/ghost-core/catalog/types.d.ts.map +1 -1
- package/dist/ghost-core/glossary.d.ts +0 -13
- package/dist/ghost-core/glossary.d.ts.map +1 -1
- package/dist/ghost-core/glossary.js +0 -7
- package/dist/ghost-core/glossary.js.map +1 -1
- package/dist/ghost-core/index.d.ts +2 -2
- package/dist/ghost-core/index.d.ts.map +1 -1
- package/dist/ghost-core/index.js +1 -1
- package/dist/ghost-core/index.js.map +1 -1
- package/dist/ghost-core/package-manifest.d.ts +7 -0
- package/dist/ghost-core/package-manifest.d.ts.map +1 -1
- package/dist/ghost-core/package-manifest.js +10 -0
- package/dist/ghost-core/package-manifest.js.map +1 -1
- package/dist/init-payloads/median/cliche.median.md +86 -0
- package/dist/init-payloads/median/median-tells.md +117 -0
- package/dist/init-payloads/skeleton/brand.md +22 -0
- package/dist/init-payloads/skeleton/context.conversation.md +24 -0
- package/dist/init-payloads/skeleton/foundation.color.md +39 -0
- package/dist/init-payloads/skeleton/foundation.composition.md +30 -0
- package/dist/init-payloads/skeleton/foundation.controls.md +29 -0
- package/dist/init-payloads/skeleton/foundation.layout.md +45 -0
- package/dist/init-payloads/skeleton/foundation.motion.md +34 -0
- package/dist/init-payloads/skeleton/foundation.type.md +44 -0
- package/dist/init-payloads/skeleton/foundation.voice.md +29 -0
- package/dist/init-payloads/skeleton/glossary.md +39 -0
- package/dist/init-payloads/vessel-light/anti-goal.median.md +86 -0
- package/dist/init-payloads/vessel-light/anti-goal.tells.md +38 -0
- package/dist/init-payloads/vessel-light/checks/conversation-grammar.md +20 -0
- package/dist/init-payloads/vessel-light/checks/median-tells.md +103 -0
- package/dist/init-payloads/vessel-light/checks/motion-restraint.md +20 -0
- package/dist/init-payloads/vessel-light/checks/relationships.md +33 -0
- package/dist/init-payloads/vessel-light/checks/shape-matches-job.md +43 -0
- package/dist/init-payloads/vessel-light/checks/values.md +51 -0
- package/dist/init-payloads/vessel-light/glossary.md +44 -0
- package/dist/init-payloads/vessel-light/grammar.color-roles.md +30 -0
- package/dist/init-payloads/vessel-light/grammar.conversation.md +30 -0
- package/dist/init-payloads/vessel-light/grammar.deletion.md +35 -0
- package/dist/init-payloads/vessel-light/grammar.hierarchy.md +58 -0
- package/dist/init-payloads/vessel-light/grammar.job.md +54 -0
- package/dist/init-payloads/vessel-light/grammar.motion.md +27 -0
- package/dist/init-payloads/vessel-light/grammar.rhythm.md +27 -0
- package/dist/init-payloads/vessel-light/grammar.surfaces.md +35 -0
- package/dist/init-payloads/vessel-light/index.md +33 -0
- package/dist/init-payloads/vessel-light/manifest.yml +3 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Black.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Bold.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-ExtraBold.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Light.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Medium.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Regular.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-SemiBold.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/primitives.css +351 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.conversation.html +63 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.editorial.html +74 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.form.html +89 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.overlay.html +66 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.table.html +104 -0
- package/dist/init-payloads/vessel-light/materials/ref/email.html +80 -0
- package/dist/init-payloads/vessel-light/materials/tokens.css +191 -0
- package/dist/init-payloads/vessel-light/register.data-density.md +39 -0
- package/dist/init-payloads/vessel-light/register.editorial.md +41 -0
- package/dist/init-payloads/vessel-light/register.email.md +43 -0
- package/dist/init-payloads/vessel-light/signature.palette.md +45 -0
- package/dist/init-payloads/vessel-light/signature.shape.md +27 -0
- package/dist/init-payloads/vessel-light/signature.temperature.md +44 -0
- package/dist/init-payloads/vessel-light/signature.type.md +37 -0
- package/dist/observability-events.d.ts +0 -3
- package/dist/observability-events.d.ts.map +1 -1
- package/dist/observability-events.js.map +1 -1
- package/dist/review/resolve.d.ts +3 -4
- package/dist/review/resolve.d.ts.map +1 -1
- package/dist/review/resolve.js +12 -9
- package/dist/review/resolve.js.map +1 -1
- package/dist/review/review-packet.d.ts +2 -1
- package/dist/review/review-packet.d.ts.map +1 -1
- package/dist/review/review-packet.js +9 -20
- package/dist/review/review-packet.js.map +1 -1
- package/dist/scan/check-files.d.ts.map +1 -1
- package/dist/scan/check-files.js +0 -15
- package/dist/scan/check-files.js.map +1 -1
- package/dist/scan/check-scaffold.d.ts +1 -0
- package/dist/scan/check-scaffold.d.ts.map +1 -1
- package/dist/scan/check-scaffold.js +17 -1
- package/dist/scan/check-scaffold.js.map +1 -1
- package/dist/scan/fingerprint-package-lint.d.ts +8 -0
- package/dist/scan/fingerprint-package-lint.d.ts.map +1 -0
- package/dist/scan/fingerprint-package-lint.js +284 -0
- package/dist/scan/fingerprint-package-lint.js.map +1 -0
- package/dist/scan/fingerprint-package-loader.d.ts.map +1 -1
- package/dist/scan/fingerprint-package-loader.js +2 -29
- package/dist/scan/fingerprint-package-loader.js.map +1 -1
- package/dist/scan/fingerprint-package.d.ts +16 -8
- package/dist/scan/fingerprint-package.d.ts.map +1 -1
- package/dist/scan/fingerprint-package.js +41 -241
- package/dist/scan/fingerprint-package.js.map +1 -1
- package/dist/scan/node-files.d.ts.map +1 -1
- package/dist/scan/node-files.js +1 -3
- package/dist/scan/node-files.js.map +1 -1
- package/dist/scan/packed-payloads.d.ts +4 -0
- package/dist/scan/packed-payloads.d.ts.map +1 -0
- package/dist/scan/packed-payloads.js +55 -0
- package/dist/scan/packed-payloads.js.map +1 -0
- package/dist/scan/templates.d.ts +20 -2
- package/dist/scan/templates.d.ts.map +1 -1
- package/dist/scan/templates.js +106 -26
- package/dist/scan/templates.js.map +1 -1
- package/dist/skill-bundle/SKILL.md +16 -13
- package/dist/skill-bundle/references/adapting-a-starter.md +104 -0
- package/dist/skill-bundle/references/authoring-scenarios.md +42 -5
- package/dist/skill-bundle/references/blocks.md +1 -1
- package/dist/skill-bundle/references/brief.md +5 -6
- package/dist/skill-bundle/references/capture.md +52 -41
- package/dist/skill-bundle/references/concrete-tiers.md +95 -0
- package/dist/skill-bundle/references/recall.md +6 -12
- package/dist/skill-bundle/references/schema.md +15 -24
- package/dist/skill-bundle/references/self-check.md +2 -2
- package/dist/skill-bundle/references/steering-audit.md +7 -10
- package/package.json +2 -2
- package/dist/scan/steering-template.d.ts +0 -8
- package/dist/scan/steering-template.d.ts.map +0 -1
- package/dist/scan/steering-template.js +0 -266
- package/dist/scan/steering-template.js.map +0 -1
- package/dist/skill-bundle/references/wild.md +0 -30
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Median tells
|
|
3
|
+
description: Flags the measured defaults of unsteered generation, the deterministic floor, and current model-signature tells — hover-lift, default accents, unprompted dark theme, gradient text, contrast, frequency tells, and per-model signatures.
|
|
4
|
+
severity: high
|
|
5
|
+
references:
|
|
6
|
+
- cliche.median > Hover-lift
|
|
7
|
+
- cliche.median > Indigo accent
|
|
8
|
+
- cliche.median > Dark theme
|
|
9
|
+
- cliche.median > Gradients
|
|
10
|
+
- cliche.median > Glassmorphism
|
|
11
|
+
- cliche.median > Side-stripe
|
|
12
|
+
- cliche.median > Cream surface
|
|
13
|
+
- cliche.median > Chat bubbles
|
|
14
|
+
- cliche.median > Stock copy
|
|
15
|
+
- cliche.median > Celebration
|
|
16
|
+
- cliche.median > Hero metric
|
|
17
|
+
- cliche.median > Eyebrow kicker
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
These flags target the measured convergence patterns of unsteered model
|
|
21
|
+
generation, the deterministic floor the median node licenses, and tells
|
|
22
|
+
specific to individual models. Each is mechanically detectable in a diff.
|
|
23
|
+
Pruning a rule from `cliche.median` orphans its paired reference here —
|
|
24
|
+
`ghost validate` warns; delete the flag and its reference together.
|
|
25
|
+
|
|
26
|
+
Flag `transform` with `translateY` inside a `:hover` rule on cards,
|
|
27
|
+
buttons, or list items, especially paired with a shadow increase. Hover
|
|
28
|
+
confirmation in this fingerprint is color and background change, not lift.
|
|
29
|
+
(`cliche.median > Hover-lift`)
|
|
30
|
+
|
|
31
|
+
Flag accent values in the indigo/blue/purple default family (`#4f46e5`,
|
|
32
|
+
`#6366f1`, `#2563eb`, `#3b82f6`, `#8b5cf6`, and close neighbors)
|
|
33
|
+
unless the diff shows the user asked for them. They are model defaults, not
|
|
34
|
+
palette members. (`cliche.median > Indigo accent`)
|
|
35
|
+
|
|
36
|
+
Flag whole-page dark backgrounds when the ask did not request dark mode.
|
|
37
|
+
Dark surfaces are a declared brand choice or an explicit theme, never an
|
|
38
|
+
unprompted default. (`cliche.median > Dark theme`)
|
|
39
|
+
|
|
40
|
+
Flag `linear-gradient` or `radial-gradient` as page or section
|
|
41
|
+
backgrounds, and gradient-filled buttons. (`cliche.median > Gradients`)
|
|
42
|
+
|
|
43
|
+
Flag `backdrop-filter: blur` used for glassmorphism cards.
|
|
44
|
+
(`cliche.median > Glassmorphism`)
|
|
45
|
+
|
|
46
|
+
Flag `background-clip: text` (with or without the `-webkit-` prefix)
|
|
47
|
+
paired with a gradient. Emphasis comes from weight or size in a single
|
|
48
|
+
solid color.
|
|
49
|
+
|
|
50
|
+
Flag a thick colored border on one side of an element (`border-left` or a
|
|
51
|
+
`border-l-*` utility at 2px or more in a non-neutral color) while the
|
|
52
|
+
other sides stay thin. (`cliche.median > Side-stripe`)
|
|
53
|
+
|
|
54
|
+
Flag warm off-white page backgrounds in the cream/sand/beige band, and token
|
|
55
|
+
names like `--cream`, `--sand`, `--parchment`, `--linen` introduced
|
|
56
|
+
by the diff. (`cliche.median > Cream surface`)
|
|
57
|
+
|
|
58
|
+
Flag assistant messages rendered as bubbles with initials-circle avatars.
|
|
59
|
+
(`cliche.median > Chat bubbles`)
|
|
60
|
+
|
|
61
|
+
Flag emoji used as icons or imagery in interface chrome. Text labels carry
|
|
62
|
+
meaning.
|
|
63
|
+
|
|
64
|
+
Flag stock template copy in headings: "Simple, transparent pricing",
|
|
65
|
+
"Welcome back", and interchangeable-with-a-competitor phrasing. Recommend
|
|
66
|
+
copy that states what this product specifically does.
|
|
67
|
+
(`cliche.median > Stock copy`)
|
|
68
|
+
|
|
69
|
+
Flag exclamation-marked success copy, confetti language, and celebratory UI
|
|
70
|
+
("You did it!", "Awesome!"). Confirmation is quiet and factual.
|
|
71
|
+
(`cliche.median > Celebration`)
|
|
72
|
+
|
|
73
|
+
Flag the hero-metric template — a big number, small label, and supporting
|
|
74
|
+
stats as default proof — unless the metric shows real user data. Recommend
|
|
75
|
+
evidence specific to the product, or nothing.
|
|
76
|
+
(`cliche.median > Hero metric`)
|
|
77
|
+
|
|
78
|
+
Deterministic floor — licensed by the median node, verified here, never
|
|
79
|
+
steered in prose:
|
|
80
|
+
|
|
81
|
+
Flag text/background pairs below WCAG AA contrast: 4.5:1 for body text,
|
|
82
|
+
3:1 for large text (24px and up, or 18.7px bold and up). Check the worst
|
|
83
|
+
stop when the background is a gradient.
|
|
84
|
+
|
|
85
|
+
Flag animation or transition without a `prefers-reduced-motion: reduce`
|
|
86
|
+
alternative — a crossfade or instant state change.
|
|
87
|
+
|
|
88
|
+
Flag ad-hoc z-index values (`999`, `9999`, or any value outside a
|
|
89
|
+
declared scale). Layering wants a semantic scale, not an arms race.
|
|
90
|
+
|
|
91
|
+
Flag `cubic-bezier` easings whose control points overshoot the 0–1 range,
|
|
92
|
+
and keyframe names matching bounce, elastic, wobble, or jiggle.
|
|
93
|
+
|
|
94
|
+
Frequency tells — the crime is repetition, not the move (advisory):
|
|
95
|
+
|
|
96
|
+
Flag three or more uppercase, tracked eyebrow kickers above section headings
|
|
97
|
+
in one page. One named kicker is voice; a kicker on every section is model
|
|
98
|
+
grammar. (`cliche.median > Eyebrow kicker`)
|
|
99
|
+
|
|
100
|
+
Flag five or more em-dashes in body copy in one view.
|
|
101
|
+
|
|
102
|
+
Flag three or more instances of the aphoristic rebuttal cadence ("Not X. Y."
|
|
103
|
+
/ "Sentence. No qualifiers.") in one page's copy.
|
|
104
|
+
|
|
105
|
+
Model-signature tells — skip any block whose model did not produce the diff
|
|
106
|
+
(advisory):
|
|
107
|
+
|
|
108
|
+
Codex: flag a 1px border paired with a box-shadow of 16px blur or more on
|
|
109
|
+
the same element — pick a solid border or a tight shadow, not both. Flag
|
|
110
|
+
border-radius of 32px or more on cards, sections, or inputs unless an
|
|
111
|
+
answered shape dial (`signature.shape`) sanctions large radii — then it is
|
|
112
|
+
fidelity, not a tell. Flag 1px linear-gradient grid or repeating-stripe
|
|
113
|
+
backgrounds used as decoration.
|
|
114
|
+
|
|
115
|
+
Gemini: flag `transform` (scale, rotate, translate) on `img` inside a
|
|
116
|
+
`:hover` rule, including group-hover utilities targeting a child image.
|
|
117
|
+
Animate the card's background, border, or shadow instead.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "The brand on one page — always in context; what this brand is, how it feels, and what only it refuses."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
This cover is unwritten. It is the one page always in an agent's context, so
|
|
6
|
+
it carries only what cannot be retrieved by task: what this brand is about,
|
|
7
|
+
in one paragraph, in the brand's own voice. The temperature its words and
|
|
8
|
+
motion share. And the refusals only this brand makes — not generic don'ts
|
|
9
|
+
(those live in each foundation's misuse list, and the model's cliches live
|
|
10
|
+
in the cliche nodes), but the lines this brand alone draws.
|
|
11
|
+
|
|
12
|
+
Until a human writes it, the working stance is: quiet, precise, content
|
|
13
|
+
first, decoration never. Treat that as provisional and say so in your
|
|
14
|
+
report.
|
|
15
|
+
|
|
16
|
+
One test admits a sentence to this page: where would a violation show? In a
|
|
17
|
+
single element, it belongs in that element's chapter. In a single view, it
|
|
18
|
+
belongs in the composition foundation. Only across the whole body of work —
|
|
19
|
+
temperature, density, restraint — it belongs here.
|
|
20
|
+
|
|
21
|
+
The budget is one screen. When this page is real, delete every sentence of
|
|
22
|
+
scaffolding above — including this one.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "AI conversation threads — assistant text on the page surface, compact user turns, collapsed tool calls, one structured prompt input. Read only for chat threads, agent consoles, and prompt composers."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
In this context: AI conversation threads, agent consoles, review assistants,
|
|
6
|
+
and prompt composers. Elsewhere, the defaults hold.
|
|
7
|
+
|
|
8
|
+
Conversation UI is not chat cosplay. The assistant speaks on the page
|
|
9
|
+
surface as plain text: no bubble, no border, no fill. Wrapping assistant
|
|
10
|
+
messages in cards makes the system look defensive and wastes density —
|
|
11
|
+
hierarchy comes from prose, spacing, and type.
|
|
12
|
+
|
|
13
|
+
User turns are compact muted surfaces aligned right. They mark authorship
|
|
14
|
+
without turning the thread into alternating balloons.
|
|
15
|
+
|
|
16
|
+
Tool calls are operational evidence. Collapse them to a labeled one-line
|
|
17
|
+
summary with status; expand only when the user asks, then show mono content
|
|
18
|
+
inside the disclosed area.
|
|
19
|
+
|
|
20
|
+
The prompt input is one bordered surface. The textarea stays empty of
|
|
21
|
+
controls so writing remains the focus; attachments, model choice, and send
|
|
22
|
+
live in a single row below it. There is one primary send action — stop and
|
|
23
|
+
send are mutually exclusive states of the same action area, never two
|
|
24
|
+
competing primaries.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Color — the role system, status meanings, expression rules, and misuse; palette values are an open question. Read before choosing any color."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
Color is assigned by role, not by taste. The roles are the source of truth;
|
|
8
|
+
raw color values are implementation detail, never product language. If a
|
|
9
|
+
container needs a color, it first needs a role: `background`, `foreground`,
|
|
10
|
+
`card`, `popover`, `primary`, `secondary`, `muted`, `accent`, `border`,
|
|
11
|
+
`input`, `ring`, and the status roles.
|
|
12
|
+
|
|
13
|
+
The status roles — destructive, success, warning, info — exist only when
|
|
14
|
+
meaning demands them. Destructive means destructive or error. Success means
|
|
15
|
+
success. None of them are brand accents.
|
|
16
|
+
|
|
17
|
+
One view does not perform a color palette. If a status color is present, the
|
|
18
|
+
rest of the view stays on the base roles. Richness beyond this comes from a
|
|
19
|
+
closed expression set (`--expression-*`), used at the volume the situation
|
|
20
|
+
allows — a marketing page may turn it up; a settings form stays quiet.
|
|
21
|
+
|
|
22
|
+
## Palette
|
|
23
|
+
|
|
24
|
+
Open — ask the human; do not freehand. The fixed relationship: a quiet base
|
|
25
|
+
spine is the default atmosphere in every medium, and a closed expression set
|
|
26
|
+
supplies the rest, its volume set by situation, never by taste. The open
|
|
27
|
+
question: what is this brand's base spine, and what are the named hues of
|
|
28
|
+
its expression set — how many, and which? When the human answers, restate
|
|
29
|
+
this section as the brand's current answer and record the values where your
|
|
30
|
+
materials live. Until then, proceed with a quiet provisional spine and label
|
|
31
|
+
it provisional.
|
|
32
|
+
|
|
33
|
+
## Misuse
|
|
34
|
+
|
|
35
|
+
- Status colors never moonlight as atmosphere, in any context.
|
|
36
|
+
- Expression never touches what you click. Buttons, inputs, and links stay
|
|
37
|
+
on the base roles everywhere. A colored control is a different design
|
|
38
|
+
system.
|
|
39
|
+
- No one-off hex values. If a color has no role, it has no place.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Composition — how a view is assembled: one focal point, one primary action, actions land last, separation escalates. Read before assembling any view."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
Composition is the layer above layout: layout gives the stacks and gaps;
|
|
8
|
+
composition decides what dominates, what recedes, and what comes last.
|
|
9
|
+
|
|
10
|
+
Every view has exactly one focal point — one element at the largest scale.
|
|
11
|
+
If two elements compete for primacy, demote or delete one; never resolve
|
|
12
|
+
the tie by making both big.
|
|
13
|
+
|
|
14
|
+
One primary action per view: the action the view exists to complete.
|
|
15
|
+
Everything else steps down the control ladder (see the controls
|
|
16
|
+
foundation). If two buttons both look primary, the composition failed.
|
|
17
|
+
|
|
18
|
+
Actions land last. Calls to action render at the end of reading order —
|
|
19
|
+
the user reads, then decides.
|
|
20
|
+
|
|
21
|
+
Separation escalates: whitespace first, then a divider, then a container —
|
|
22
|
+
in that order, never skipping a step.
|
|
23
|
+
|
|
24
|
+
## Misuse
|
|
25
|
+
|
|
26
|
+
- Never fake a focal point with decoration. Primacy comes from scale,
|
|
27
|
+
position, and space.
|
|
28
|
+
- Never promote a second action to primary because something wants
|
|
29
|
+
emphasis; step the other one down instead.
|
|
30
|
+
- Never separate with a container when whitespace would do.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Controls — the five-rung emphasis ladder, quiet fields, and misuse. Read for any view with actions or inputs."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
The control emphasis ladder is exactly five rungs: primary, secondary,
|
|
8
|
+
outline, ghost, link. Primary is for the action the screen exists to
|
|
9
|
+
complete; everything else steps down the ladder. How many primaries a view
|
|
10
|
+
may hold is a composition rule — see the composition foundation: one.
|
|
11
|
+
|
|
12
|
+
Destructive is a meaning, not a rung. It is rare, it names the destructive
|
|
13
|
+
act directly, and it is never borrowed for urgency, emphasis, or brand heat.
|
|
14
|
+
|
|
15
|
+
Fields are quiet until active: hairline border, muted placeholder, clear
|
|
16
|
+
label, and a focus ring when the user engages. The ring is guidance, not
|
|
17
|
+
decoration. Errors state facts next to the field that caused them — never
|
|
18
|
+
hidden in modals, toasts, or generic banners when the user needs to fix one
|
|
19
|
+
input.
|
|
20
|
+
|
|
21
|
+
Controls take the control radius; see the layout foundation for the two
|
|
22
|
+
radius roles.
|
|
23
|
+
|
|
24
|
+
## Misuse
|
|
25
|
+
|
|
26
|
+
- Never two competing primary buttons.
|
|
27
|
+
- Never destructive styling as attention-getting.
|
|
28
|
+
- Never expression color on a control — what you click stays on the base
|
|
29
|
+
roles everywhere.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Layout — stacks with five gap steps, surface roles, three elevation tiers, the two radius roles, and misuse; radius values are an open question. Read before laying anything out."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
All layout is stacks. Rhythm comes from relationships between siblings, not
|
|
8
|
+
from isolated margins pasted onto whichever element was last touched. The
|
|
9
|
+
gap steps are exactly five: `--gap-xs` through `--gap-xl`. Choose the gap
|
|
10
|
+
that states the relationship; do not tune by single pixels to make a
|
|
11
|
+
screenshot pass. The default is column, medium gap. Columns are for almost
|
|
12
|
+
everything — forms, cards, modal bodies, settings, page sections. Rows are
|
|
13
|
+
conditional: controls, metadata lines, paired label/value moments. If a row
|
|
14
|
+
wraps awkwardly, it wanted to be a column.
|
|
15
|
+
|
|
16
|
+
Surface is the only way an element gets a background, border, radius, or
|
|
17
|
+
shadow. The vocabulary is closed: role, padding, radius, border, elevation.
|
|
18
|
+
The default surface is flat — no border, no shadow. We do not outline
|
|
19
|
+
everything to prove layout exists.
|
|
20
|
+
|
|
21
|
+
The elevation tiers are exactly three: card, popover, modal. Elevation
|
|
22
|
+
implies hierarchy — a card sits in flow, a popover floats above it, a modal
|
|
23
|
+
interrupts the task. Pick the tier that matches the interaction.
|
|
24
|
+
|
|
25
|
+
Borders are structural — inputs and overlays — not decorative frames around
|
|
26
|
+
ordinary text. Use space, tone, and type hierarchy instead.
|
|
27
|
+
|
|
28
|
+
## Radius
|
|
29
|
+
|
|
30
|
+
Open — ask the human; do not freehand. The fixed relationship: controls and
|
|
31
|
+
surfaces carry different radius roles, and the two never swap. Buttons and
|
|
32
|
+
inputs take `--radius-control`; cards and containers take
|
|
33
|
+
`--radius-surface`. One radius for what you click, one for what contains.
|
|
34
|
+
The open question: how round is a control, and how round is a surface? When
|
|
35
|
+
answered, restate this section as the brand's current answer. Until then,
|
|
36
|
+
choose provisional values and label them.
|
|
37
|
+
|
|
38
|
+
## Misuse
|
|
39
|
+
|
|
40
|
+
- No ad-hoc margins between siblings — they hide the rhythm. Change the
|
|
41
|
+
stack gap or split the stack.
|
|
42
|
+
- No custom shadows because a composition feels flat, and no modal gravity
|
|
43
|
+
on a routine card. Component shadows belong to the primitives that own
|
|
44
|
+
them.
|
|
45
|
+
- Never one radius everywhere by reflex.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Motion — evidence of state change, three durations and one ease, nothing loops, and misuse; the ease's character is an open question shared with voice. Read for any transition or hover treatment."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
Motion is evidence of a state change. It confirms hover, press, reveal,
|
|
8
|
+
collapse, entrance, exit, and spatial movement. It does not entertain.
|
|
9
|
+
|
|
10
|
+
The entire vocabulary is three duration roles and one ease. Fast is for
|
|
11
|
+
hover and press. Normal is for reveals, fades, and small state changes. Slow
|
|
12
|
+
is reserved for spatial transitions where the user needs to understand
|
|
13
|
+
movement. Prefer opacity and small transforms.
|
|
14
|
+
|
|
15
|
+
In editorial and marketing contexts, entrances may be staged — scroll
|
|
16
|
+
reveals and section transitions are part of editorial rhythm, still built
|
|
17
|
+
from the three durations and the one ease. In product UI the same staging is
|
|
18
|
+
decoration.
|
|
19
|
+
|
|
20
|
+
## Character
|
|
21
|
+
|
|
22
|
+
Open — ask the human; do not freehand. Motion and voice share one
|
|
23
|
+
temperature: however warm or cool the brand's words are, its movement
|
|
24
|
+
matches. See the voice foundation for the other half of this answer. The
|
|
25
|
+
open question here: what character does the one ease carry? When answered,
|
|
26
|
+
restate this section. Until then, use a quiet standard ease and label it
|
|
27
|
+
provisional.
|
|
28
|
+
|
|
29
|
+
## Misuse
|
|
30
|
+
|
|
31
|
+
- Nothing loops except explicit loading states. Decorative pulsing,
|
|
32
|
+
floating, glowing, and attention-seeking keyframes are off-language.
|
|
33
|
+
- No novelty easings because a surface feels static.
|
|
34
|
+
- If removing an animation does not reduce comprehension, it was decoration.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Type — six text variants, seven tones, the one-voice rule, and misuse; the typeface is an open question. Read for any view that contains text."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
Hierarchy is a closed vocabulary, not a size slider. Every piece of text
|
|
8
|
+
picks from a named set; anything outside the set is a broken primitive, not
|
|
9
|
+
a variant.
|
|
10
|
+
|
|
11
|
+
The text variants are exactly six: display, headline, title, body, label,
|
|
12
|
+
mono. Variant names are jobs. Display leads a rare editorial moment.
|
|
13
|
+
Headline names a section. Title anchors a card, dialog, or compact region.
|
|
14
|
+
Body carries reading. Label names structure — field labels, category tags,
|
|
15
|
+
metadata, compact status. Mono carries code and machine detail.
|
|
16
|
+
|
|
17
|
+
The tones are exactly seven: default, muted, inverse, success, warning,
|
|
18
|
+
info, destructive. Tone is part of the message. Hierarchy starts with tone
|
|
19
|
+
and weight before size — a secondary note usually wants muted body or label,
|
|
20
|
+
not a smaller custom font. If prose needs emphasis, improve the sentence
|
|
21
|
+
before adding a style.
|
|
22
|
+
|
|
23
|
+
The heading scale is editorial: it exists for pages composed outside the
|
|
24
|
+
text variants — heroes and editorial moments. Product UI never mixes the two
|
|
25
|
+
vocabularies in one view. A modal title is not a poster.
|
|
26
|
+
|
|
27
|
+
Balanced text is for headings and compact statements, never long body copy.
|
|
28
|
+
|
|
29
|
+
## Typeface
|
|
30
|
+
|
|
31
|
+
Open — ask the human; do not freehand. The fixed relationship: one typeface
|
|
32
|
+
is the voice of the interface, everywhere, with a mono partner only for
|
|
33
|
+
code, tool detail, and machine output. The open question: what typeface is
|
|
34
|
+
this brand's voice, what mono partners it, and what rhythm does the
|
|
35
|
+
editorial heading scale carry? When answered, restate this section as the
|
|
36
|
+
brand's current answer. Until then, choose a quiet provisional pair and
|
|
37
|
+
label it provisional.
|
|
38
|
+
|
|
39
|
+
## Misuse
|
|
40
|
+
|
|
41
|
+
- No faked hierarchy with arbitrary font sizes. Choose the variant that
|
|
42
|
+
matches the job.
|
|
43
|
+
- Status tones appear only when the words carry that state meaning.
|
|
44
|
+
- Never a second display face to make a view feel branded.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Voice and tone — copy states facts, no performed personality, and misuse; warmth is an open question shared with motion. Read for any copy."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
Copy states what happened, what is possible, or what the user must decide.
|
|
8
|
+
It does not perform personality. Confidence comes from precision, not
|
|
9
|
+
enthusiasm.
|
|
10
|
+
|
|
11
|
+
Voice and motion carry the same temperature: a brand whose copy is warm does
|
|
12
|
+
not move coldly, and a brand whose copy is spare does not bounce. When you
|
|
13
|
+
set one, check the other.
|
|
14
|
+
|
|
15
|
+
## Warmth
|
|
16
|
+
|
|
17
|
+
Open — ask the human; do not freehand. The open question: how warm or cool
|
|
18
|
+
does this brand sound — and, by the shared temperature, how does it move?
|
|
19
|
+
See the motion foundation for the other half. When answered, restate this
|
|
20
|
+
section as the brand's current answer. Until then, write plainly and label
|
|
21
|
+
the tone provisional.
|
|
22
|
+
|
|
23
|
+
## Misuse
|
|
24
|
+
|
|
25
|
+
- No exclamation points as a substitute for having something to say.
|
|
26
|
+
- No apologizing for the interface ("Oops!"). State the fact and the next
|
|
27
|
+
step.
|
|
28
|
+
- Never restate this section as answered when it was your own provisional
|
|
29
|
+
choice.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
kinds:
|
|
3
|
+
- name: foundation
|
|
4
|
+
- name: context
|
|
5
|
+
- name: cliche
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# foundation
|
|
9
|
+
|
|
10
|
+
The core elements — color, type, controls, layout, motion, voice — plus
|
|
11
|
+
composition, the rules for assembling them into a view. Each foundation
|
|
12
|
+
node is a chapter: usage rules that hold no matter what the brand values
|
|
13
|
+
turn out to be, the brand's open questions (unanswered in this starter,
|
|
14
|
+
marked as decisions only a human can make), and the chapter's misuse list.
|
|
15
|
+
Follow the usage rules as written. Never fill in an open value and present
|
|
16
|
+
it as the brand's.
|
|
17
|
+
|
|
18
|
+
# context
|
|
19
|
+
|
|
20
|
+
Where the defaults bend: a context names a situation — an AI conversation
|
|
21
|
+
thread, a data-dense console, a transactional email — and states only what
|
|
22
|
+
inverts there. Read a context only when its situation matches the task.
|
|
23
|
+
Rules from the wrong context are contamination, not guidance.
|
|
24
|
+
|
|
25
|
+
# cliche
|
|
26
|
+
|
|
27
|
+
The defaults a generative model falls back on when no brand is steering it.
|
|
28
|
+
These are nobody's brand. Each entry pairs the tired move with the honest
|
|
29
|
+
replacement. Gather before styling anything greenfield; enforced by paired
|
|
30
|
+
checks at review.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
The cover node (`brand.md`, declared in the manifest) is the one page always
|
|
35
|
+
in context: what the brand is, its temperature, and the refusals only it
|
|
36
|
+
makes. The ghost skill's `adapting-a-starter` recipe is the procedure for
|
|
37
|
+
growing this skeleton into a real fingerprint: write the cover, answer each
|
|
38
|
+
chapter's open question, prune the cliches your chapters absorb, then add
|
|
39
|
+
materials and refs.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "The model's median defaults this fingerprint refuses — gather for any greenfield visual surface or first-draft copy. Each rule is reject→replace; delete lines your brand legitimately violates."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
This is the model's median, not your brand. Each rule is reject→replace.
|
|
6
|
+
Delete every line your brand legitimately violates — `ghost validate` will
|
|
7
|
+
warn on any check reference the deletion orphans — delete the paired flag too.
|
|
8
|
+
|
|
9
|
+
These are not aesthetic opinions. Where a count is given, it is the measured
|
|
10
|
+
convergence of 300 unsteered generations across three frontier models (the
|
|
11
|
+
antimedian experiment): the defaults a model reaches for when nobody hands it
|
|
12
|
+
a brand. An output showing several of these tells reads as generated,
|
|
13
|
+
whatever else it does right. A deterministic floor rides alongside these
|
|
14
|
+
rules in the paired check — mechanical tells like gradient-filled text,
|
|
15
|
+
emoji as interface icons, em-dash pileups, and aphoristic cadence —
|
|
16
|
+
verified at review, never steered in prose.
|
|
17
|
+
|
|
18
|
+
### Hover-lift
|
|
19
|
+
Reject hover-lift (`translateY` + growing shadow) as the default interaction
|
|
20
|
+
→ confirm with color and background change at the fingerprint's fast
|
|
21
|
+
duration. (measured: 341)
|
|
22
|
+
|
|
23
|
+
### Indigo accent
|
|
24
|
+
Reject the indigo/blue/purple default accent (`#4f46e5`, `#2563eb`,
|
|
25
|
+
`#8b5cf6` family; purple/violet hue 260–310) → the fingerprint's declared
|
|
26
|
+
palette; absent one, monochrome plus a single functional accent.
|
|
27
|
+
|
|
28
|
+
### Dark theme
|
|
29
|
+
Reject unprompted dark theme → the fingerprint's declared surface.
|
|
30
|
+
Dark-to-look-cool and light-to-be-safe are the same retreat from a decision.
|
|
31
|
+
(measured: 271)
|
|
32
|
+
|
|
33
|
+
### Gradients
|
|
34
|
+
Reject gradient page and section backgrounds and gradient-filled CTAs → flat
|
|
35
|
+
surfaces in semantic roles.
|
|
36
|
+
|
|
37
|
+
### Side-stripe
|
|
38
|
+
Reject side-stripe borders (a thick colored border on one side of a rounded
|
|
39
|
+
card) — the single most recognizable tell of AI-generated UI → a full
|
|
40
|
+
hairline border, a 4–8% surface tint, or a leading glyph.
|
|
41
|
+
|
|
42
|
+
### Cream surface
|
|
43
|
+
Reject the cream/sand/beige default surface (warm off-white; token names
|
|
44
|
+
like `--cream`, `--sand`, `--parchment` are the tell) → a true off-white,
|
|
45
|
+
the brand's own hue, or a committed color; warmth via accent and type, not
|
|
46
|
+
the ground.
|
|
47
|
+
|
|
48
|
+
### Glassmorphism
|
|
49
|
+
Reject glassmorphism (decorative backdrop blur) → flat surfaces with real
|
|
50
|
+
borders and the fingerprint's elevation tiers.
|
|
51
|
+
|
|
52
|
+
### Chat bubbles
|
|
53
|
+
Reject chat bubbles with initials-circle avatars for assistant turns →
|
|
54
|
+
assistant text plain on the page surface; user turns marked compactly.
|
|
55
|
+
|
|
56
|
+
### Stock copy
|
|
57
|
+
Reject stock template copy ("Simple, transparent pricing") → headings that
|
|
58
|
+
state what this product specifically does.
|
|
59
|
+
|
|
60
|
+
### Celebration
|
|
61
|
+
Reject celebration copy and UI (exclamation success, confetti language) →
|
|
62
|
+
quiet factual confirmation.
|
|
63
|
+
|
|
64
|
+
### Nested cards
|
|
65
|
+
Reject nested cards and everything-in-cards → one surface level per region;
|
|
66
|
+
interior hierarchy from spacing and type; spacing and alignment group
|
|
67
|
+
without card overhead.
|
|
68
|
+
|
|
69
|
+
### Hero metric
|
|
70
|
+
Reject the hero-metric template (big number + small label + supporting stats
|
|
71
|
+
as default proof) → evidence specific to the product, or nothing. A
|
|
72
|
+
prominent metric showing real user data is fine.
|
|
73
|
+
|
|
74
|
+
### Every button primary
|
|
75
|
+
Reject every button a primary button → one primary per view; the rest step
|
|
76
|
+
down the fingerprint's emphasis ladder.
|
|
77
|
+
|
|
78
|
+
### Eyebrow kicker
|
|
79
|
+
Reject an eyebrow kicker on every section → at most one, where the register
|
|
80
|
+
sanctions it; one named kicker is voice, every-section is AI grammar.
|
|
81
|
+
|
|
82
|
+
### Decorative motion
|
|
83
|
+
Reject decorative looping animation (pulse/float/shimmer) and uniform
|
|
84
|
+
fade-and-rise on every scrolled section → motion as evidence of state
|
|
85
|
+
change; loops only for genuine loading; decoration never compensates for
|
|
86
|
+
weak structure — fix spacing, copy, and hierarchy first.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Failure modes specific to this brand's own signature — gather alongside any signature node you pull."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
These are the near-misses of Vessel's own signature: outputs that got close
|
|
6
|
+
enough to cite the brand and still missed it. Each reject names its
|
|
7
|
+
replacement. When a tell fires, the fix direction is always toward the
|
|
8
|
+
token, the role, or deletion — never toward adding a compensating style on
|
|
9
|
+
top of the miss.
|
|
10
|
+
|
|
11
|
+
Reject rectangular buttons. A rectangular button is not a variant; it is a
|
|
12
|
+
different design system → controls take `--radius-control`, the pill.
|
|
13
|
+
|
|
14
|
+
Reject swapped radius roles: the surface radius on a control, the pill on a
|
|
15
|
+
surface, or 20px cells in a data table → `--radius-control` on what you
|
|
16
|
+
click, `--radius-surface` on what contains, small radius on data cells.
|
|
17
|
+
|
|
18
|
+
Reject expression hues on interactive controls, an invented sixth hue, or a
|
|
19
|
+
tinted gray posing as monochrome → the five named expression hues at their
|
|
20
|
+
register's volume, and a true gray spine. An invented hue is not a bolder
|
|
21
|
+
Vessel; it is a different brand.
|
|
22
|
+
|
|
23
|
+
Reject custom shadows that sit near a tier → the exact tier — card, popover,
|
|
24
|
+
or modal — chosen by interaction importance.
|
|
25
|
+
|
|
26
|
+
Reject borrowing `--shadow-btn` for layout → component shadows belong to the
|
|
27
|
+
primitives that own them; layout elevation comes from the three tiers.
|
|
28
|
+
|
|
29
|
+
Reject editorial display type in product UI, and product type timidity in
|
|
30
|
+
editorial → each register keeps its own vocabulary; a modal title is not a
|
|
31
|
+
poster, and a hero at product scale reads as timid.
|
|
32
|
+
|
|
33
|
+
Reject borders around assistant text → the assistant speaks as plain text on
|
|
34
|
+
the page surface; use space, tone, and type hierarchy instead.
|
|
35
|
+
|
|
36
|
+
Fidelity note: pills and fluid clamp display headings are medians Vessel
|
|
37
|
+
deliberately shares — their presence is fidelity, not drift. Convergence is
|
|
38
|
+
not the crime; surrendering the choice is.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Conversation grammar
|
|
3
|
+
description: Flags conversation UI that breaks plain assistant text, prompt-input structure, primary-action discipline, or collapsed tool output.
|
|
4
|
+
severity: high
|
|
5
|
+
references:
|
|
6
|
+
- grammar.conversation
|
|
7
|
+
- grammar.surfaces
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Apply this check to diffs that touch AI threads, agent consoles, prompt composers, chat messages, or tool-call rendering.
|
|
11
|
+
|
|
12
|
+
Flag assistant messages wrapped in bordered, filled, elevated, or card-like surfaces. Assistant turns should sit as plain text on the page surface.
|
|
13
|
+
|
|
14
|
+
Flag user messages that are not compact muted surfaces aligned to the right when the layout has a conversational thread.
|
|
15
|
+
|
|
16
|
+
Flag controls placed inside the prompt-input textarea region. The textarea is for writing only; controls belong in the single row below it.
|
|
17
|
+
|
|
18
|
+
Flag more than one primary button in the input row. Send, stop, retry, attach, model select, and tools must not compete as primary actions.
|
|
19
|
+
|
|
20
|
+
Flag tool output shown expanded by default. The default state is a one-line labeled summary with status; mono detail appears after expansion.
|