# Trust rules

Glim asserts **presence and state**, not model correctness. How uncertainty is shown *is* the brand.

## When values show plainly

| Assertion | Plain when |
|---|---|
| `presence.state` | Host mapped it to a real phase (idle / listening / thinking / talking) |
| Caption from `say(text)` | Host passed the real reply string (or intentional demo line) |
| Theme / creature id | User or host selected it |

## When to qualify

| Situation | Qualifier |
|---|---|
| Site demo without model access | Status: local personality — not a live model |
| Streaming not wired | Do not imply tokens are arriving |
| Pro / Team CTA | “Notify me” / waitlist — checkout not live |
| Non-free creature in demo | Try-before-buy on demo; license to ship is Pro+ |

## When to withhold

- Do not show fake progress percentages.
- Do not show “live” if the request never left the browser.
- Do not show social proof counts that are not measured.

## How absence is expressed

| Absence | Expression |
|---|---|
| No caption | Leave caption empty or state line (`thinking…`) — not a grey fake number |
| Creature off-viewport | GPU context released / sleeping — no error |
| Checkout unavailable | Waitlist dialog copy — not a disabled Buy that looks broken-by-bug |
| Model error | Host shows error in product chrome; companion may return `idle` or stay — host chooses; Glim does not invent an excuse |

## Provenance with each assertion

| Field | Travels with |
|---|---|
| State | `presence.state` + optional `on('state')` |
| Spoken line | string to `say()`; `settle` when typed |
| Site mode | `#aiStatus` local vs live text |
| Builder signals | `localStorage` key `glim_events_v1` |

Model citations, tools used, and retrieval sources are **out of scope** for Glim — host responsibility.

## Refusal path

If there is nothing worth saying: remain `idle`, soft stir only, no invented “insight” line.  
A product that always produces a striking finding is inventing.

## Accessibility trust

- Default: companion host `aria-hidden` (decorative).
- Captions: `aria-live="polite"` when wired.
- Honour `prefers-reduced-motion` (see `tokens.json` motion.reducedMotion).
