@design-intelligence/ghost 0.20.0 → 0.21.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.
Files changed (95) hide show
  1. package/dist/commands/checks-command.d.ts.map +1 -1
  2. package/dist/commands/checks-command.js +8 -1
  3. package/dist/commands/checks-command.js.map +1 -1
  4. package/dist/commands/init-command.d.ts.map +1 -1
  5. package/dist/commands/init-command.js +23 -8
  6. package/dist/commands/init-command.js.map +1 -1
  7. package/dist/commands/review-command.d.ts.map +1 -1
  8. package/dist/commands/review-command.js +1 -0
  9. package/dist/commands/review-command.js.map +1 -1
  10. package/dist/init-payloads/median/anti-goal.median.md +86 -0
  11. package/dist/init-payloads/median/median-tells.md +117 -0
  12. package/dist/init-payloads/skeleton/glossary.md +44 -0
  13. package/dist/init-payloads/skeleton/grammar.color-roles.md +26 -0
  14. package/dist/init-payloads/skeleton/grammar.conversation.md +23 -0
  15. package/dist/init-payloads/skeleton/grammar.hierarchy.md +39 -0
  16. package/dist/init-payloads/skeleton/grammar.motion.md +24 -0
  17. package/dist/init-payloads/skeleton/grammar.rhythm.md +23 -0
  18. package/dist/init-payloads/skeleton/grammar.surfaces.md +26 -0
  19. package/dist/init-payloads/skeleton/index.md +27 -0
  20. package/dist/init-payloads/skeleton/signature.palette.md +24 -0
  21. package/dist/init-payloads/skeleton/signature.shape.md +19 -0
  22. package/dist/init-payloads/skeleton/signature.temperature.md +20 -0
  23. package/dist/init-payloads/skeleton/signature.type.md +22 -0
  24. package/dist/init-payloads/vessel-light/anti-goal.median.md +86 -0
  25. package/dist/init-payloads/vessel-light/anti-goal.tells.md +37 -0
  26. package/dist/init-payloads/vessel-light/checks/conversation-grammar.md +20 -0
  27. package/dist/init-payloads/vessel-light/checks/median-tells.md +103 -0
  28. package/dist/init-payloads/vessel-light/checks/motion-restraint.md +20 -0
  29. package/dist/init-payloads/vessel-light/checks/relationships.md +33 -0
  30. package/dist/init-payloads/vessel-light/checks/values.md +51 -0
  31. package/dist/init-payloads/vessel-light/glossary.md +45 -0
  32. package/dist/init-payloads/vessel-light/grammar.color-roles.md +30 -0
  33. package/dist/init-payloads/vessel-light/grammar.conversation.md +30 -0
  34. package/dist/init-payloads/vessel-light/grammar.hierarchy.md +48 -0
  35. package/dist/init-payloads/vessel-light/grammar.motion.md +27 -0
  36. package/dist/init-payloads/vessel-light/grammar.rhythm.md +27 -0
  37. package/dist/init-payloads/vessel-light/grammar.surfaces.md +35 -0
  38. package/dist/init-payloads/vessel-light/index.md +37 -0
  39. package/dist/init-payloads/vessel-light/manifest.yml +2 -0
  40. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Black.woff2 +0 -0
  41. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Bold.woff2 +0 -0
  42. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-ExtraBold.woff2 +0 -0
  43. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Light.woff2 +0 -0
  44. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Medium.woff2 +0 -0
  45. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Regular.woff2 +0 -0
  46. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-SemiBold.woff2 +0 -0
  47. package/dist/init-payloads/vessel-light/materials/primitives.css +388 -0
  48. package/dist/init-payloads/vessel-light/materials/ref/composition.conversation.html +63 -0
  49. package/dist/init-payloads/vessel-light/materials/ref/composition.editorial.html +69 -0
  50. package/dist/init-payloads/vessel-light/materials/ref/composition.form.html +89 -0
  51. package/dist/init-payloads/vessel-light/materials/ref/composition.overlay.html +60 -0
  52. package/dist/init-payloads/vessel-light/materials/ref/composition.table.html +104 -0
  53. package/dist/init-payloads/vessel-light/materials/ref/email.html +80 -0
  54. package/dist/init-payloads/vessel-light/materials/tokens.css +242 -0
  55. package/dist/init-payloads/vessel-light/register.data-density.md +39 -0
  56. package/dist/init-payloads/vessel-light/register.editorial.md +41 -0
  57. package/dist/init-payloads/vessel-light/register.email.md +43 -0
  58. package/dist/init-payloads/vessel-light/signature.palette.md +45 -0
  59. package/dist/init-payloads/vessel-light/signature.shape.md +27 -0
  60. package/dist/init-payloads/vessel-light/signature.temperature.md +37 -0
  61. package/dist/init-payloads/vessel-light/signature.type.md +36 -0
  62. package/dist/review/resolve.d.ts +2 -2
  63. package/dist/review/resolve.d.ts.map +1 -1
  64. package/dist/review/resolve.js +8 -4
  65. package/dist/review/resolve.js.map +1 -1
  66. package/dist/review/review-packet.d.ts +2 -0
  67. package/dist/review/review-packet.d.ts.map +1 -1
  68. package/dist/review/review-packet.js +9 -1
  69. package/dist/review/review-packet.js.map +1 -1
  70. package/dist/scan/check-scaffold.d.ts +1 -0
  71. package/dist/scan/check-scaffold.d.ts.map +1 -1
  72. package/dist/scan/check-scaffold.js +17 -1
  73. package/dist/scan/check-scaffold.js.map +1 -1
  74. package/dist/scan/fingerprint-package.d.ts +7 -1
  75. package/dist/scan/fingerprint-package.d.ts.map +1 -1
  76. package/dist/scan/fingerprint-package.js +25 -12
  77. package/dist/scan/fingerprint-package.js.map +1 -1
  78. package/dist/scan/packed-payloads.d.ts +4 -0
  79. package/dist/scan/packed-payloads.d.ts.map +1 -0
  80. package/dist/scan/packed-payloads.js +55 -0
  81. package/dist/scan/packed-payloads.js.map +1 -0
  82. package/dist/scan/templates.d.ts +20 -2
  83. package/dist/scan/templates.d.ts.map +1 -1
  84. package/dist/scan/templates.js +83 -11
  85. package/dist/scan/templates.js.map +1 -1
  86. package/dist/skill-bundle/SKILL.md +1 -0
  87. package/dist/skill-bundle/references/adapting-a-starter.md +102 -0
  88. package/dist/skill-bundle/references/authoring-scenarios.md +40 -1
  89. package/dist/skill-bundle/references/blocks.md +1 -1
  90. package/dist/skill-bundle/references/capture.md +5 -5
  91. package/package.json +2 -2
  92. package/dist/scan/steering-template.d.ts +0 -8
  93. package/dist/scan/steering-template.d.ts.map +0 -1
  94. package/dist/scan/steering-template.js +0 -266
  95. package/dist/scan/steering-template.js.map +0 -1
@@ -0,0 +1,19 @@
1
+ ---
2
+ description: "Gather before setting any radius or corner treatment. The shape dial: controls take --radius-control, surfaces take --radius-surface — this dial is unanswered; ask the human or flag the gap, don't freehand it."
3
+ ---
4
+
5
+ This dial is unanswered — ask the human or flag the gap. Do not freehand a
6
+ value and present it as brand-backed.
7
+
8
+ The relationship is fixed: controls and surfaces carry different radius
9
+ roles, and the two never swap. Buttons and text inputs use
10
+ `--radius-control`; cards and other surfaces use `--radius-surface`. One
11
+ radius for what you click, one for what contains — that split is the part
12
+ worth keeping, whatever the values turn out to be.
13
+
14
+ The open question: what are this brand's two radii — how round is a control,
15
+ and how round is a surface? When the human answers, restate this node as
16
+ "this brand's current answer is …" and record the values where your
17
+ materials live. If the task can't wait for an answer, proceed with a quiet
18
+ provisional choice, honor the fixed relationship, label the choice
19
+ provisional in your report — and never restate this node as answered.
@@ -0,0 +1,20 @@
1
+ ---
2
+ description: "Gather for any copy and for motion character. The temperature dial: how the brand sounds and how it moves, one shared temperature — this dial is unanswered; ask the human or flag the gap, don't freehand it."
3
+ ---
4
+
5
+ This dial is unanswered — ask the human or flag the gap. Do not freehand a
6
+ value and present it as brand-backed.
7
+
8
+ The relationship is fixed: voice and motion carry the same temperature. Copy
9
+ states what happened, what is possible, or what the user must decide — it
10
+ does not perform personality — and motion confirms rather than entertains.
11
+ The coupling — words and motion sharing one temperature — is the part worth
12
+ keeping.
13
+
14
+ The open question: where does this brand sit — how warm or cool is its copy,
15
+ what does its motion feel like, and what character does its one ease carry?
16
+ When the human answers, restate this node as "this brand's current answer
17
+ is …" and record the values where your materials live. If the task can't
18
+ wait for an answer, proceed with a quiet provisional choice, honor the fixed
19
+ relationship, label the choice provisional in your report — and never
20
+ restate this node as answered.
@@ -0,0 +1,22 @@
1
+ ---
2
+ description: "Gather for any text, and for heroes, landing pages, and editorial moments. The type dial: one voice typeface plus a mono for machine detail, editorial scale kept separate from product text — this dial is unanswered; ask the human or flag the gap, don't freehand it."
3
+ ---
4
+
5
+ This dial is unanswered — ask the human or flag the gap. Do not freehand a
6
+ value and present it as brand-backed.
7
+
8
+ The relationship is fixed: one typeface is the voice of the interface,
9
+ everywhere, with a mono variant only for code, tool detail, and machine
10
+ output. The heading scale is editorial — it exists for pages composed
11
+ outside the text variants, heroes and editorial moments — and product UI
12
+ never mixes the two vocabularies in one view. A modal title is not a poster.
13
+ The one-voice rule and the editorial/product split are the parts worth
14
+ keeping.
15
+
16
+ The open question: what typeface is this brand's voice, what mono partners
17
+ it, and what rhythm does the editorial heading scale carry? When the human
18
+ answers, restate this node as "this brand's current answer is …" and record
19
+ the values where your materials live. If the task can't wait for an answer,
20
+ proceed with a quiet provisional choice, honor the fixed relationship, label
21
+ the choice provisional in your report — and never restate this node as
22
+ answered.
@@ -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,37 @@
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.
8
+
9
+ Reject rectangular buttons. A rectangular button is not a variant; it is a
10
+ different design system → controls take `--radius-control`, the pill.
11
+
12
+ Reject swapped radius roles: the surface radius on a control, the pill on a
13
+ surface, or 20px cells in a data table → `--radius-control` on what you
14
+ click, `--radius-surface` on what contains, small radius on data cells.
15
+
16
+ Reject expression hues on interactive controls, an invented sixth hue, or a
17
+ tinted gray posing as monochrome → the five named expression hues at their
18
+ register's volume, and a true gray spine. An invented hue is not a bolder
19
+ Vessel; it is a different brand.
20
+
21
+ Reject custom shadows that sit near a tier → the exact tier — card, popover,
22
+ or modal — chosen by interaction importance.
23
+
24
+ Reject borrowing `--shadow-btn` or `--shadow-kbd` for layout → component
25
+ shadows belong to the primitives that own them; layout elevation comes from
26
+ the three tiers.
27
+
28
+ Reject editorial display type in product UI, and product type timidity in
29
+ editorial → each register keeps its own vocabulary; a modal title is not a
30
+ poster, and a hero at product scale reads as timid.
31
+
32
+ Reject borders around assistant text → the assistant speaks as plain text on
33
+ the page surface; use space, tone, and type hierarchy instead.
34
+
35
+ Fidelity note: pills and fluid clamp display headings are medians Vessel
36
+ deliberately shares — their presence is fidelity, not drift. Convergence is
37
+ 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.
@@ -0,0 +1,103 @@
1
+ ---
2
+ name: Median tells
3
+ description: Flags the measured defaults of unsteered generation and current model-signature tells — hover-lift, default accents, unprompted dark theme, gradient text, frequency tells, and per-model signatures.
4
+ severity: high
5
+ references:
6
+ - anti-goal.median > Hover-lift
7
+ - anti-goal.median > Indigo accent
8
+ - anti-goal.median > Dark theme
9
+ - anti-goal.median > Gradients
10
+ - anti-goal.median > Glassmorphism
11
+ - anti-goal.median > Side-stripe
12
+ - anti-goal.median > Cream surface
13
+ - anti-goal.median > Chat bubbles
14
+ - anti-goal.median > Stock copy
15
+ - anti-goal.median > Celebration
16
+ - anti-goal.median > Hero metric
17
+ - anti-goal.median > Eyebrow kicker
18
+ ---
19
+
20
+ This is Vessel's adaptation of the shared median check; the fidelity carve-outs
21
+ below are the body's own. These flags target the measured convergence patterns
22
+ of unsteered model generation, plus tells specific to individual models. Each
23
+ is mechanically detectable in a diff. Pruning a rule from `anti-goal.median`
24
+ orphans its paired reference here — `ghost validate` warns; delete the flag and
25
+ its reference together.
26
+
27
+ Flag `transform` with `translateY` inside a `:hover` rule on cards, buttons,
28
+ or list items, especially paired with a shadow increase. Hover confirmation
29
+ in Vessel is color and background change, not lift.
30
+ (`anti-goal.median > Hover-lift`)
31
+
32
+ Flag accent values in the indigo/blue/purple default family (`#4f46e5`,
33
+ `#6366f1`, `#2563eb`, `#3b82f6`, `#8b5cf6`, and close neighbors) unless the
34
+ diff shows the user asked for them. They are model defaults, not palette
35
+ members. (`anti-goal.median > Indigo accent`)
36
+
37
+ Flag whole-page dark backgrounds when the ask did not request dark mode.
38
+ Dark surfaces in Vessel are the editorial dark band or an explicit `.dark`
39
+ theme, never an unprompted default. (`anti-goal.median > Dark theme`)
40
+
41
+ Flag `linear-gradient` or `radial-gradient` as page or section backgrounds,
42
+ and gradient-filled buttons. (`anti-goal.median > Gradients`)
43
+
44
+ Flag `backdrop-filter: blur` used for glassmorphism cards.
45
+ (`anti-goal.median > Glassmorphism`)
46
+
47
+ Flag `background-clip: text` (with or without the `-webkit-` prefix) paired
48
+ with a gradient. Emphasis comes from weight or size in a single 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 other
52
+ sides stay thin. (`anti-goal.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 by the
56
+ diff. (`anti-goal.median > Cream surface`)
57
+
58
+ Flag assistant messages rendered as bubbles with initials-circle avatars.
59
+ (`anti-goal.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
+ (`anti-goal.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
+ (`anti-goal.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
+ (`anti-goal.median > Hero metric`)
77
+
78
+ Frequency tells — the crime is repetition, not the move (advisory):
79
+
80
+ Flag three or more uppercase, tracked eyebrow kickers above section headings
81
+ in one page. One named kicker is voice; a kicker on every section is model
82
+ grammar. (`anti-goal.median > Eyebrow kicker`)
83
+
84
+ Flag five or more em-dashes in body copy in one view.
85
+
86
+ Flag three or more instances of the aphoristic rebuttal cadence ("Not X. Y."
87
+ / "Sentence. No qualifiers.") in one page's copy.
88
+
89
+ Model-signature tells — skip any block whose model did not produce the diff
90
+ (advisory):
91
+
92
+ Codex: flag a 1px border paired with a box-shadow of 16px blur or more on
93
+ the same element — pick a solid border or a tight shadow, not both. Flag
94
+ border-radius of 32px or more on cards, sections, or inputs. Flag 1px
95
+ linear-gradient grid or repeating-stripe backgrounds used as decoration.
96
+
97
+ Gemini: flag `transform` (scale, rotate, translate) on `img` inside a
98
+ `:hover` rule, including group-hover utilities targeting a child image.
99
+ Animate the card's background, border, or shadow instead.
100
+
101
+ Do not flag pill-shaped controls or fluid clamp display headings — those
102
+ median patterns are deliberately shared by Vessel and their presence is
103
+ fidelity.
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: Motion restraint
3
+ description: Flags non-token motion, looping decoration, and keyframes that do not explain state change.
4
+ severity: medium
5
+ references:
6
+ - grammar.motion
7
+ - signature.temperature
8
+ ---
9
+
10
+ Review changed transitions and animations for vocabulary first.
11
+
12
+ Flag durations that do not use `--duration-fast`, `--duration-normal`, or `--duration-slow`. A hard-coded millisecond value is a drift even when it matches the token today.
13
+
14
+ Flag custom easing unless it uses the fingerprint's one ease or a browser default already required by the primitive.
15
+
16
+ Flag looping animations outside explicit loading states. Loading must be tied to ongoing work, not ambient motion.
17
+
18
+ Flag decorative keyframes: glow, float, shimmer, bounce, pulse, parallax, or any motion that can be removed without making a state change harder to understand.
19
+
20
+ Recommend the smallest opacity or transform transition that explains the state change.
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: Relationship discipline
3
+ description: Flags structural violations of the grammar — emphasis-ladder breaks, sibling margins, decorative borders, nested cards. These rules survive any adaptation.
4
+ severity: high
5
+ references:
6
+ - grammar.hierarchy
7
+ - grammar.rhythm
8
+ - grammar.surfaces
9
+ - anti-goal.median > Nested cards
10
+ ---
11
+
12
+ These assertions test relationships between token roles, not the values behind
13
+ them. They hold for any brand built on this grammar; an adapted package keeps this check
14
+ unchanged.
15
+
16
+ Flag more than one primary-variant button per view. Secondary actions step
17
+ down the emphasis ladder: secondary, outline, ghost, or link.
18
+
19
+ Flag `margin` set on siblings inside a stack in changed CSS or inline styles.
20
+ Rhythm comes from the gap scale; recommend changing the stack gap or splitting
21
+ the stack.
22
+
23
+ Flag borders, fills, gradients, glass effects, or colored accents used to make
24
+ ordinary structure feel designed. Recommend semantic surfaces, stack spacing,
25
+ text tone, or the existing elevation tier instead.
26
+
27
+ Flag card-like surfaces nested inside card-like surfaces. One surface level
28
+ per region; interior hierarchy comes from spacing and type, not another
29
+ container.
30
+
31
+ Flag `box-shadow` values that belong to no declared elevation tier and no
32
+ component-owned shadow. Do not accept a custom shadow because it is visually
33
+ close to a tier — elevation is a closed set, whatever the values are.
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: Value discipline
3
+ description: Flags off-signature values — non-pill controls, off-palette hues, raw color literals, expression over budget. Adapting the dials rewrites this check alongside the signature nodes.
4
+ severity: high
5
+ references:
6
+ - signature.shape
7
+ - signature.palette
8
+ - grammar.color-roles
9
+ - register.data-density
10
+ - register.editorial
11
+ - register.email
12
+ ---
13
+
14
+ These assertions test Vessel's current answers to the signature dials. A
15
+ adaptation that changes the dials rewrites this check with them; the paired
16
+ relationship check stays.
17
+
18
+ Review changed HTML and CSS by view, not just by file. Classify the register
19
+ of each changed view first: table layout, `bgcolor`, or a 600px wrapper means
20
+ email; display-scale headings, `--section-padding-vertical`, or
21
+ `--surface-dark-*` means editorial; compressed smallest-gap-step layouts with
22
+ mono numerals means data-density; otherwise product.
23
+
24
+ Flag buttons or text inputs that are not pill-radius (`--radius-control`).
25
+ A rectangular control is a token violation, not a style choice.
26
+
27
+ Flag surfaces that carry a radius other than `--radius-surface`, and radius
28
+ roles swapped across the boundary: control radius on a surface, surface
29
+ radius on a control.
30
+
31
+ Count distinct non-gray colors visible in each view, then judge against that
32
+ register's expression budget: product views get one functional accent, with
33
+ expression hues permitted only inside chart or visualization markup; data
34
+ consoles get one status hue family with the same chart carve-out; email gets
35
+ one expressive moment in one hue; editorial pages get at most two expression
36
+ hues. Flag anything over budget, and flag expression hues used
37
+ atmospherically outside their register. Status colors count toward the total
38
+ unless the view compares two or more distinct statuses side by side.
39
+
40
+ Flag any color that is neither a gray, a status token, nor one of the five
41
+ expression hues (`--expression-1` through `--expression-5`, or their hex
42
+ values in email). Invented hues are drift in every register.
43
+
44
+ Flag expression hues on buttons, inputs, or links in every register. Controls
45
+ stay monochrome; no budget covers them.
46
+
47
+ Flag raw hex, rgb, hsl, or named color values in changed CSS or inline styles
48
+ when a Vessel token could express the same role. The authoring vocabulary is
49
+ semantic tokens, not literal color. Exception: email files — hardcoded values
50
+ transcribed from tokens are the contract there; flag only values that
51
+ correspond to no token and no expression hue.
@@ -0,0 +1,45 @@
1
+ ---
2
+ kinds:
3
+ - name: grammar
4
+ - name: signature
5
+ - name: register
6
+ - name: anti-goal
7
+ posture: guard
8
+ ---
9
+
10
+ # grammar
11
+
12
+ The brand's decision logic: closed sets, role vocabularies, and assembly
13
+ rules, stated in token roles and never in literal values. Grammar survives an
14
+ adaptation unchanged — adapt the package, swap every value, and these nodes still
15
+ hold. Gather grammar before inventing structure.
16
+
17
+ # signature
18
+
19
+ The dials: the choices that make this brand this brand, each stated as a
20
+ current answer that stands until you replace it. Signature nodes name real
21
+ values because they are the values — on adaptation, edit the token roles in
22
+ `materials/tokens.css` and restate the node. Gather signature before setting
23
+ any value a dial governs.
24
+
25
+ # register
26
+
27
+ A condition-scoped contract: a situation — data-dense consoles, editorial
28
+ pages, transactional email — where parts of the default rules invert. Each
29
+ register names its condition first. Truths from the wrong register are
30
+ poison, not context; gather a register only when its condition matches the
31
+ task.
32
+
33
+ # anti-goal
34
+
35
+ What this package refuses, each reject paired with its replacement.
36
+ `anti-goal.median` is the model's floor, not the brand's taste;
37
+ `anti-goal.tells` is the near-miss map of this brand's own signature. Gather
38
+ anti-goals before styling anything greenfield.
39
+
40
+ ---
41
+
42
+ To adapt this package to another brand, follow the `adapting-a-starter`
43
+ recipe in the ghost skill bundle. In short: new manifest id, prune the
44
+ median rules your brand legitimately violates, answer each signature node,
45
+ edit `materials/tokens.css`, regenerate the refs, rewrite the tells.
@@ -0,0 +1,30 @@
1
+ ---
2
+ description: "Semantic color roles and the rules that govern them — gather before choosing any color; roles not raw values, status is meaning, expression is register-gated and never on controls."
3
+ materials:
4
+ - materials/tokens.css
5
+ - "**/*.css"
6
+ - "**/*.html"
7
+ ---
8
+
9
+ The token file is the source of truth. An agent may combine tokens, but it
10
+ may not author around them. Raw color values are implementation detail, never
11
+ product language.
12
+
13
+ Author with semantic roles: `background`, `foreground`, `card`, `popover`,
14
+ `primary`, `secondary`, `muted`, `accent`, `border`, `input`, `ring`, and the
15
+ status roles. If a container needs a color, it first needs a role.
16
+
17
+ The status roles — destructive, success, warning, info — exist only when
18
+ meaning demands them. Destructive means destructive or error. Success means
19
+ success. Warning means warning. Info means information. None of them are
20
+ brand accents, and they never moonlight as atmosphere, in any register.
21
+
22
+ One view should not perform a color palette. If a status color is present,
23
+ let the rest of the view stay on the base roles. Richness beyond this is
24
+ register-gated: a closed expression set (`--expression-*`) exists, but its
25
+ size, members, and volume ladder are a brand answer — see the palette
26
+ signature — and each register caps how loud they may be.
27
+
28
+ The constant that holds across every register: expression never touches what
29
+ you click. Buttons, inputs, and links stay on the base roles everywhere. A
30
+ colored control is a different design system.
@@ -0,0 +1,30 @@
1
+ ---
2
+ description: "Conversation grammar — plain assistant text, compact user surfaces, collapsed tool calls, one structured prompt input; gather for any AI thread, agent console, review assistant, or prompt composer."
3
+ materials:
4
+ - materials/ref/composition.conversation.html
5
+ - "**/*.html"
6
+ ---
7
+
8
+ Conversation UI is not chat cosplay. The assistant speaks on the page surface
9
+ as plain text: no bubble, no border, no fill.
10
+
11
+ User turns are compact muted surfaces aligned right. They mark authorship
12
+ without turning the thread into alternating balloons.
13
+
14
+ Assistant hierarchy comes from prose, spacing, and type. Wrapping assistant
15
+ messages in cards makes the system look defensive and wastes density.
16
+
17
+ Tool calls are operational evidence. Collapse them to a labeled one-line
18
+ summary with status. Expand only when the user asks for detail, then show
19
+ mono content inside the disclosed area.
20
+
21
+ The prompt input is one bordered surface. The textarea region stays empty of
22
+ controls so writing remains the focus. Attachments, model choices, secondary
23
+ tools, and send live in a single row below it.
24
+
25
+ There is one primary send action. Stop and send are mutually exclusive states
26
+ of the same action area, not two competing primary buttons.
27
+
28
+ Use the conversation reference when building any AI thread, agent console,
29
+ review assistant, or prompt composer. It carries the grammar that agents most
30
+ often get wrong.
@@ -0,0 +1,48 @@
1
+ ---
2
+ description: "The closed hierarchy vocabulary — six text variants, seven tones, a five-rung control emphasis ladder, one primary per view — gather for any view that contains text or actions."
3
+ materials:
4
+ - materials/primitives.css
5
+ - materials/ref/composition.form.html
6
+ - "**/*.html"
7
+ - "**/*.css"
8
+ ---
9
+
10
+ Hierarchy is a closed vocabulary, not a size slider. Every piece of text and
11
+ every control picks from a named set; anything outside the set is a broken
12
+ primitive, not a variant.
13
+
14
+ The text variants are exactly six: display, headline, title, body, label,
15
+ mono. Variant names are jobs, not decoration. Display leads a rare editorial
16
+ moment. Headline names a section. Title anchors a card, dialog, or compact
17
+ region. Body carries reading. Label names structure — category tags, field
18
+ labels, bylines, metadata, compact status. Mono carries code and machine
19
+ detail. Do not fake hierarchy with arbitrary font sizes; choose the tier that
20
+ matches the job, then use tone, weight, and spacing for the rest.
21
+
22
+ The tones are exactly seven: default, muted, inverse, success, warning, info,
23
+ destructive. Tone is part of the message. Default is the main reading plane.
24
+ Muted carries secondary information. Inverse is for dark or primary surfaces.
25
+ The four status tones appear only when the words have that state meaning.
26
+ Hierarchy starts with tone and weight before size — a secondary note usually
27
+ wants muted body or label, not a smaller custom font. If the prose needs
28
+ emphasis, improve the sentence before adding a style.
29
+
30
+ The control emphasis ladder is exactly five rungs: primary, secondary,
31
+ outline, ghost, link. One primary action per view is the rule; everything
32
+ else steps down the ladder. Primary is for the action the screen exists to
33
+ complete — if two buttons both look primary, the hierarchy failed.
34
+ Destructive is a meaning, not a rung: it is rare, it names the destructive
35
+ act directly, and it is never borrowed for urgency, emphasis, or brand heat.
36
+
37
+ Fields are quiet until they are active: hairline border, muted placeholder,
38
+ clear label, and a focused ring when the user engages. The focus ring is
39
+ guidance, not decoration. Errors state facts next to the field that caused
40
+ them — do not hide field errors in modals, toasts, or generic banners when
41
+ the user needs to fix one input.
42
+
43
+ Balanced text is for headings and compact statements. Do not balance long
44
+ body copy into jagged reading.
45
+
46
+ The form reference shows the intended decision order: stacked labels and
47
+ fields, compact helper text, one submit, secondary escape. Copy the decision
48
+ order before adjusting surface detail.
@@ -0,0 +1,27 @@
1
+ ---
2
+ description: "Motion doctrine — motion is evidence of state change, never decoration; a closed vocabulary of three duration roles and one ease; gather for any transition, animation, or hover treatment."
3
+ materials:
4
+ - materials/tokens.css
5
+ - "**/*.css"
6
+ - "**/*.html"
7
+ ---
8
+
9
+ Motion is evidence of a state change. It confirms hover, press, reveal,
10
+ collapse, entrance, exit, and spatial movement. It does not entertain.
11
+
12
+ The entire vocabulary is three duration roles and one ease. Fast is for hover
13
+ and press. Normal is for reveals, fades, and small state changes. Slow is
14
+ reserved for spatial transitions where the user needs to understand movement.
15
+ Do not introduce novelty easings because a surface feels static; the ease's
16
+ character is a brand answer — see the temperature signature.
17
+
18
+ Nothing loops except explicit loading states. A spinner may continue because
19
+ work continues. Decorative pulsing, floating, glowing, and attention-seeking
20
+ keyframes are off-language.
21
+
22
+ Prefer opacity and small transform changes. If removing an animation does not
23
+ reduce comprehension, the animation was decoration.
24
+
25
+ Condition: marketing and editorial surfaces may stage entrances — scroll reveals and
26
+ section transitions are part of editorial rhythm, still built from the three
27
+ durations and the one ease. In product UI the same staging is decoration.
@@ -0,0 +1,27 @@
1
+ ---
2
+ description: "Layout rhythm — all layout is stacks with a closed gap step set; gather before laying anything out; never ad-hoc sibling margins."
3
+ materials:
4
+ - materials/primitives.css
5
+ - "**/*.html"
6
+ - "**/*.css"
7
+ ---
8
+
9
+ All layout is stacks. Rhythm comes from relationships between siblings, not
10
+ from isolated margins pasted onto whichever element was last touched.
11
+
12
+ The gap steps are exactly five: `--gap-xs`, `--gap-sm`, `--gap-md`,
13
+ `--gap-lg`, `--gap-xl`. Choose the gap that states the relationship. Do not
14
+ tune by single pixels to make a screenshot pass.
15
+
16
+ The default is column, medium gap, stretch alignment, start justification.
17
+ That is the ordinary reading rhythm.
18
+
19
+ Columns are for almost everything: forms, cards, message lists, modal bodies,
20
+ settings, empty states, and page sections. A column lets the user scan.
21
+
22
+ Rows are conditional. Use them for controls, metadata lines, compact status,
23
+ and paired label/value moments. If a row starts wrapping awkwardly, it
24
+ probably wanted to be a column.
25
+
26
+ Ad-hoc margins between siblings are forbidden because they hide the rhythm.
27
+ When spacing feels wrong, change the stack gap or split the stack.