evals
Compiled from coding-agent history.
type Inter + mono for machine textvibe instrument panelcolor near-white + ink steps, six mark huesmotion noneradius squaredensity dense analystcontrast hairline borders, high ink
v1 · updated 2026-09-03
the spec — files of this taste raw
tastefile.md
Analyst chrome: borders not shadows, machine-text in mono, every number honest — including the missing ones.
Core direction
- Reading surfaces are columns, not canvases — cap content measure (~960px) and let the page breathe vertically instead of sprawling.
- Instrument panel, not marketing page. The UI reports facts about runs, URLs, statuses; ornament is subtracted, not added.
- Additive only. New UI gets appended; existing layout, copy, and styling stay untouched unless the change was explicitly signed off.
- Never render a single sample as a verdict. One run is not a score — show counts, attempts, distributions, and the window they cover.
- Missing data is a state, not a zero. Null renders as its own visible mark with a reason; never coerce to 0, "unknown", or an empty cell that reads as good news.
- Minimal first: ship the smallest honest version, skip edge-case polish until asked.
Color & surfaces
- Near-white ground (
#fff), two step-downs for subtle/muted panels; ink in four steps from near-black-navy to light grey — hierarchy comes from ink level, not from weight or size. - Borders carry all structure: one hairline rule token plus a lighter and a heavier variant. No drop shadows. The one sanctioned shadow is an *inset* on an unfold/expand affordance.
- Six semantic "mark" hues (green / blue / amber / orange / red / purple) each paired with an 8–10% alpha background for chips and badges. Grades and outcomes always come from that mark scale via one shared color function — never hand-picked per component.
- Hover = a 3% black wash, nothing else.
- Full dark mode is a peer, not an afterthought: same token names, borders become low-alpha white.
- A non-production environment tints the nav bar a translucent yellow — the environment must be visible without reading a URL.
Typography
- One sans for everything human (Inter, system fallbacks).
- Mono (JetBrains Mono) is reserved for machine text only: ids, slugs, hosts, URLs, statuses, commands, counts, trace payloads. Never mono for prose or section headings.
- Product copy is sentence case, capitalized — the lowercase register is for chat, never for shipped UI strings.
- No "v2"/version numbers in user-facing names; name the thing, not its revision.
- Labels name the *entity the user thinks in* (the user's word), not the internal table name.
Density & spacing
- 4px spacing unit; layout rhythm lives in CSS custom properties, not scattered utility guesses.
- Dense over airy: data tables and list rows are scan-first, tight leading, generous horizontal rules.
- Content column capped at ~960px so a title, its adjacent action, and a multi-column footer all fit one measure.
- Expansion happens inline — expanded rows open in place, they don't navigate away or open a drawer.
Components
- Tables are the primary surface. Sort deterministically with an explicit tiebreaker (count desc, then name asc, nulls last) so the same data never reorders between loads. Columns carry status chips, not bare counts, when the count hides a mix of outcomes.
- Chips/badges: mark-hue text on the matching 8% background, hairline border, no radius flourish. A three-state outcome renders three distinct chips — success / failure / unrecorded — never two with unknowns folded into one.
- Filters sit above the data, recompute the visible aggregates rather than only hiding rows, drop options with zero rows, and offer an explicit "none / not linked" option when that case exists in the data.
- Empty states distinguish "nothing here yet" (valid) from "the query failed" (must render the error). Never show a friendly empty state on top of an error.
- Nav: translucent sticky bar, environment-tinted; global destinations get a persistent link rather than being buried.
- Modals do not close on backdrop click when they hold unsaved input.
- Triage / review surfaces favor one card at a time with a decisive action per screen; onboarding and question flows are one question per screen.
- Traces / long machine output: show the full thing, not a tail; keep the explicit warning banner when the content is emulated or synthetic.
Motion
- Effectively none. No entrance animations, no parallax, no attention-seeking transitions. State changes are instant; the only movement is inline expand/collapse.
Anti-patterns
- Never a drop shadow, never a rounded-corner "card" look — borders only.
- Never mono for prose, never lowercase product copy.
- Never
?? 0,|| "unknown", or a fabricated placeholder to fill a hole — a missing value renders as missing, with its reason. - Never present one run/one sample as a headline score.
- Never restyle or "improve" adjacent UI while making a narrow change — no scope creep, no drive-by restyles.
- Never introduce a second component or data path for a surface that already has one; grep for the existing component and reuse it.
- Never invent an abstraction that only makes sense inside one screen — inline it instead. Extract only real building blocks.
- Never hide an environment or draft/redacted state; badge it visibly.
- Never over-polish edge cases before the main path is shipped.
- Never leave a version suffix, internal table name, or admin-only hint in user-facing labels.
installed verbatim by tastefile sync — agents read exactly this
versions
v12026-09-03
the same probe pages every taste renders — differences are the taste