Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/semantic-model-starter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@design-intelligence/ghost": minor
---

The starter package follows the semantic model: kinds are `standard`, `foundation`, and `context`; the median floor ships as `standard.model-defaults` with rules labeled as shared Defaults; foundation and context bodies use `Usage`/`Rules`/`Never` sections; `ghost checks init` pairs the median check with the new node id and still supports legacy `cliche.median` packages.
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ Core workflow:

| Command | Description |
| --- | --- |
| `ghost init` | Scaffold `.ghost/` with the starter package: manifest, glossary, a `brand.md` cover, foundation chapters, context nodes, and the cliche floor. `--body vessel-light` installs a full inhabited package instead. `--with checks` also adds the checks directory. |
| `ghost init` | Scaffold `.ghost/` with the starter package: manifest, glossary, a `brand.md` cover, foundation chapters, context nodes, and the shared model-defaults floor. `--body vessel-light` installs a full inhabited package instead. `--with checks` also adds the checks directory. |
| `ghost checks init` | Scaffold `.ghost/checks/` with an example review assertion. |
| `ghost validate` | Validate the package: manifest shape, node validity, material locators, check references, and glossary kind prefixes. |
| `ghost gather [ask…]` | Emit the complete guidance menu so the agent can pull applicable nodes. |
Expand Down
2 changes: 1 addition & 1 deletion packages/context-control/demo/asks.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ poison: context.conversation
Build a pricing landing page with a hero, three plan tiers, a customer quote,
and a closing call to action.

expect: foundation.composition, foundation.color, foundation.type, cliche.median
expect: foundation.composition, foundation.color, foundation.type, standard.model-defaults
poison: context.conversation

## Ask 3 — assistant conversation
Expand Down
50 changes: 25 additions & 25 deletions packages/ghost/src/init-payloads/median/median-tells.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,77 +3,77 @@ name: Median tells
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.
severity: high
references:
- cliche.median > Hover-lift
- cliche.median > Indigo accent
- cliche.median > Dark theme
- cliche.median > Gradients
- cliche.median > Glassmorphism
- cliche.median > Side-stripe
- cliche.median > Cream surface
- cliche.median > Chat bubbles
- cliche.median > Stock copy
- cliche.median > Celebration
- cliche.median > Hero metric
- cliche.median > Eyebrow kicker
- standard.model-defaults > Hover-lift
- standard.model-defaults > Indigo accent
- standard.model-defaults > Dark theme
- standard.model-defaults > Gradients
- standard.model-defaults > Glassmorphism
- standard.model-defaults > Side-stripe
- standard.model-defaults > Cream surface
- standard.model-defaults > Chat bubbles
- standard.model-defaults > Stock copy
- standard.model-defaults > Celebration
- standard.model-defaults > Hero metric
- standard.model-defaults > Eyebrow kicker
---

These flags target the measured convergence patterns of unsteered model
generation, the deterministic floor the median node licenses, and tells
specific to individual models. Each is mechanically detectable in a diff.
Pruning a rule from `cliche.median` orphans its paired reference here —
Pruning a rule from `standard.model-defaults` orphans its paired reference here —
`ghost validate` warns; delete the flag and its reference together.

Flag `transform` with `translateY` inside a `:hover` rule on cards,
buttons, or list items, especially paired with a shadow increase. Hover
confirmation in this package is color and background change, not lift.
(`cliche.median > Hover-lift`)
(`standard.model-defaults > Hover-lift`)

Flag accent values in the indigo/blue/purple default family (`#4f46e5`,
`#6366f1`, `#2563eb`, `#3b82f6`, `#8b5cf6`, and close neighbors)
unless the diff shows the user asked for them. They are model defaults, not
palette members. (`cliche.median > Indigo accent`)
palette members. (`standard.model-defaults > Indigo accent`)

Flag whole-page dark backgrounds when the ask did not request dark mode.
Dark surfaces are a declared brand choice or an explicit theme, never an
unprompted default. (`cliche.median > Dark theme`)
unprompted default. (`standard.model-defaults > Dark theme`)

Flag `linear-gradient` or `radial-gradient` as page or section
backgrounds, and gradient-filled buttons. (`cliche.median > Gradients`)
backgrounds, and gradient-filled buttons. (`standard.model-defaults > Gradients`)

Flag `backdrop-filter: blur` used for glassmorphism cards.
(`cliche.median > Glassmorphism`)
(`standard.model-defaults > Glassmorphism`)

Flag `background-clip: text` (with or without the `-webkit-` prefix)
paired with a gradient. Emphasis comes from weight or size in a single
solid color.

Flag a thick colored border on one side of an element (`border-left` or a
`border-l-*` utility at 2px or more in a non-neutral color) while the
other sides stay thin. (`cliche.median > Side-stripe`)
other sides stay thin. (`standard.model-defaults > Side-stripe`)

Flag warm off-white page backgrounds in the cream/sand/beige band, and token
names like `--cream`, `--sand`, `--parchment`, `--linen` introduced
by the diff. (`cliche.median > Cream surface`)
by the diff. (`standard.model-defaults > Cream surface`)

Flag assistant messages rendered as bubbles with initials-circle avatars.
(`cliche.median > Chat bubbles`)
(`standard.model-defaults > Chat bubbles`)

Flag emoji used as icons or imagery in interface chrome. Text labels carry
meaning.

Flag stock template copy in headings: "Simple, transparent pricing",
"Welcome back", and interchangeable-with-a-competitor phrasing. Recommend
copy that states what this product specifically does.
(`cliche.median > Stock copy`)
(`standard.model-defaults > Stock copy`)

Flag exclamation-marked success copy, confetti language, and celebratory UI
("You did it!", "Awesome!"). Confirmation is quiet and factual.
(`cliche.median > Celebration`)
(`standard.model-defaults > Celebration`)

Flag the hero-metric template — a big number, small label, and supporting
stats as default proof — unless the metric shows real user data. Recommend
evidence specific to the product, or nothing.
(`cliche.median > Hero metric`)
(`standard.model-defaults > Hero metric`)

Deterministic floor — licensed by the median node, verified here, never
steered in prose:
Expand All @@ -95,7 +95,7 @@ Frequency tells — the crime is repetition, not the move (advisory):

Flag three or more uppercase, tracked eyebrow kickers above section headings
in one page. One named kicker is voice; a kicker on every section is model
grammar. (`cliche.median > Eyebrow kicker`)
grammar. (`standard.model-defaults > Eyebrow kicker`)

Flag five or more em-dashes in body copy in one view.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@
for: Any greenfield visual surface or first-draft copy.
---

This is the model's median, not your brand. Each rule is reject→replace.
Delete every line your brand legitimately violates — `ghost validate` will
warn on any check reference the deletion orphans — delete the paired flag too.
Shared defaults: the model's median, not your brand. Every rule below is a
**Default** — a starting position that protects unsteered work from generic
model behavior, never an obligation. Explicit brand guidance in the cover, a
foundation, or a matching context may deliberately replace any of them.
Each rule is reject→replace. Delete every line your brand legitimately
violates — `ghost validate` will warn on any check reference the deletion
orphans — delete the paired flag too.

These are not aesthetic opinions. Where a count is given, it is the measured
convergence of 300 unsteered generations across three frontier models (the
Expand Down
10 changes: 7 additions & 3 deletions packages/ghost/src/init-payloads/skeleton/brand.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@ This cover is unwritten. ghost gather always places this page in an agent's
context; that is delivery status, not a claim that every sentence applies to
every task. Use it for what cannot be retrieved by task: what this brand is about,
in one paragraph, in the brand's own voice. The temperature its words and
motion share. And the refusals only this brand makes — not generic don'ts
(those live in each foundation's misuse list, and the model's cliches live
in the cliche nodes), but the lines this brand alone draws.
motion share. And the refusals only this brand makes — not generic don'ts,
but the lines this brand alone draws.

Until a human writes it, the working stance is: quiet, precise, content
first, decoration never. Treat that as provisional and say so in your
Expand All @@ -19,5 +18,10 @@ single element, it belongs in that element's chapter. In a single view, it
belongs in the composition foundation. Only across the whole body of work —
temperature, density, restraint — it belongs here.

Generic don'ts do not live here either: element-scoped rejections live in
each foundation's Never section, and the model's measured defaults live in
the shared `standard.model-defaults` node. This page holds only the refusals
this brand alone makes.

The budget is one screen. When this page is real, delete every sentence of
scaffolding above — including this one.
35 changes: 22 additions & 13 deletions packages/ghost/src/init-payloads/skeleton/context.conversation.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,29 @@ for: Chat threads, agent consoles, and prompt composers.
In this context: AI conversation threads, agent consoles, review assistants,
and prompt composers. Elsewhere, the defaults hold.

## Usage

Conversation UI is not chat cosplay. The assistant speaks on the page
surface as plain text: no bubble, no border, no fill. Wrapping assistant
messages in cards makes the system look defensive and wastes density —
hierarchy comes from prose, spacing, and type.
surface as plain text — hierarchy comes from prose, spacing, and type.
Wrapping assistant messages in cards makes the system look defensive and
wastes density. Tool calls are operational evidence, not conversation.

## Rules

User turns are compact muted surfaces aligned right. They mark authorship
without turning the thread into alternating balloons.
- Assistant turns render as plain text on the page surface: no bubble, no
border, no fill.
- User turns are compact muted surfaces aligned right — authorship marked
without turning the thread into alternating balloons.
- Tool calls collapse to a labeled one-line summary with status; expand only
when the user asks, then show mono content inside the disclosed area.
- The prompt input is one bordered surface. The textarea stays empty of
controls; attachments, model choice, and send live in a single row below
it.
- Stop and send are mutually exclusive states of the same action area.

Tool calls are operational evidence. Collapse them to a labeled one-line
summary with status; expand only when the user asks, then show mono content
inside the disclosed area.
## Never

The prompt input is one bordered surface. The textarea stays empty of
controls so writing remains the focus; attachments, model choice, and send
live in a single row below it. There is one primary send action — stop and
send are mutually exclusive states of the same action area, never two
competing primaries.
- Never wrap assistant messages in cards or bubbles — plain text on the
page surface.
- Never render two competing primary actions in the composer — stop and
send share one action area.
61 changes: 33 additions & 28 deletions packages/ghost/src/init-payloads/skeleton/foundation.color.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,34 +9,39 @@ until a human edits or confirms this chapter.

Color is assigned by role, not by taste. The roles are the source of truth;
raw color values are implementation detail, never product language. If a
container needs a color, it first needs a role: `background`, `foreground`,
`card`, `popover`, `primary`, `secondary`, `muted`, `accent`, `border`,
`input`, `ring`, and the status roles.

The status roles — destructive, success, warning, info — exist only when
meaning demands them. Destructive means destructive or error. Success means
success. None of them are brand accents.

One view does not perform a color palette. If a status color is present, the
rest of the view stays on the base roles. Richness beyond this comes from a
closed expression set (`--expression-*`), used at the volume the situation
container needs a color, it first needs a role. Richness beyond the base
spine comes from a closed expression set, used at the volume the situation
allows — a marketing page may turn it up; a settings form stays quiet.

## Palette

Open — ask the human; do not freehand. The fixed relationship: a quiet base
spine is the default atmosphere in every medium, and a closed expression set
supplies the rest, its volume set by situation, never by taste. The open
question: what is this brand's base spine, and what are the named hues of
its expression set — how many, and which? When the human answers, restate
this section as the brand's current answer and record the values where your
materials live. Until then, proceed with a quiet provisional spine and label
it provisional.

## Misuse

- Status colors never moonlight as atmosphere, in any context.
- Expression never touches what you click. Buttons, inputs, and links stay
on the base roles everywhere. A colored control is a different design
The status roles exist only when meaning demands them. None of them are
brand accents.

## Rules

- Every colored element uses a named role: `background`, `foreground`,
`card`, `popover`, `primary`, `secondary`, `muted`, `accent`, `border`,
`input`, `ring`, or a status role.
- Status roles carry their meaning exactly: destructive means destructive or
error, success means success, warning warns, info informs.
- When a status color is present, the rest of the view stays on the base
roles. One view does not perform a color palette.
- Expression color comes only from the closed `--expression-*` set, at the
volume the situation allows.
- Known gap — the palette is unanswered. The fixed relationship: a quiet
base spine is the default atmosphere in every medium, and a closed
expression set supplies the rest, its volume set by situation, never by
taste. The open question: what is this brand's base spine, and what are
the named hues of its expression set — how many, and which? Ask the human;
do not invent values. Until answered, proceed with a quiet provisional
spine and label it provisional. When answered, restate this rule as the
brand's current answer and record the values where your materials live.

## Never

- Never use status colors as atmosphere, in any context — status color
appears only where its meaning applies.
- Never put expression color on what you click. Buttons, inputs, and links
stay on the base roles everywhere; a colored control is a different design
system.
- No one-off hex values. If a color has no role, it has no place.
- Never use a one-off hex value — if a color has no role, it has no place;
give it a role or delete it.
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,24 @@ until a human edits or confirms this chapter.

Composition is the layer above layout: layout gives the stacks and gaps;
composition decides what dominates, what recedes, and what comes last.
Primacy comes from scale, position, and space. Actions land last — the user
reads, then decides.

Every view has exactly one focal point — one element at the largest scale.
If two elements compete for primacy, demote or delete one; never resolve
the tie by making both big.
## Rules

One primary action per view: the action the view exists to complete.
Everything else steps down the control ladder (see the controls
foundation). If two buttons both look primary, the composition failed.
- Every view has exactly one focal point — one element at the largest scale.
If two elements compete for primacy, demote or delete one.
- One primary action per view: the action the view exists to complete.
Everything else steps down the control ladder (see the controls
foundation).
- Calls to action render at the end of reading order.
- Separation escalates: whitespace first, then a divider, then a container —
in that order, never skipping a step.

Actions land last. Calls to action render at the end of reading order —
the user reads, then decides.
## Never

Separation escalates: whitespace first, then a divider, then a container —
in that order, never skipping a step.

## Misuse

- Never fake a focal point with decoration. Primacy comes from scale,
- Never fake a focal point with decoration — primacy comes from scale,
position, and space.
- Never promote a second action to primary because something wants
emphasis; step the other one down instead.
emphasis step the other one down instead.
- Never separate with a container when whitespace would do.
35 changes: 20 additions & 15 deletions packages/ghost/src/init-payloads/skeleton/foundation.controls.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,23 @@ may hold is a composition rule — see the composition foundation: one.
Destructive is a meaning, not a rung. It is rare, it names the destructive
act directly, and it is never borrowed for urgency, emphasis, or brand heat.

Fields are quiet until active: hairline border, muted placeholder, clear
label, and a focus ring when the user engages. The ring is guidance, not
decoration. Errors state facts next to the field that caused them — never
hidden in modals, toasts, or generic banners when the user needs to fix one
input.

Controls take the control radius; see the layout foundation for the two
radius roles.

## Misuse

- Never two competing primary buttons.
- Never destructive styling as attention-getting.
- Never expression color on a control — what you click stays on the base
roles everywhere.
Fields are quiet until active. The focus ring is guidance, not decoration.

## Rules

- Every action picks a rung from the five-rung ladder; no invented emphasis
levels.
- Fields render with a hairline border, muted placeholder, clear label, and
a focus ring when the user engages.
- Errors state facts next to the field that caused them — never hidden in
modals, toasts, or generic banners when the user needs to fix one input.
- Controls take the control radius; see the layout foundation for the two
radius roles.

## Never

- Never render two competing primary buttons — step one down the ladder.
- Never use destructive styling as attention-getting — destructive names a
destructive act, nothing else.
- Never put expression color on a control — what you click stays on the
base roles everywhere.
Loading
Loading