Shared memory and context tools for agentic work.
Code Rooms
@tailwind base;
@tailwind components;
@tailwind utilities;
/*
* Self-hosted fonts (HUMAN-LAYER-PRD §6.5): "All self-hosted (the served UI must
* work air-gapped; no CDN fonts)." The woff2 live in public/fonts/ (OFL-licensed,
* license text alongside them) and are served from loopback — ZERO external
* requests. Faces are scoped to exactly what the design system uses:
* Instrument Sans 400/500/600 (UI + body), IBM Plex Mono 400/500 (every number,
* verdict chip, claim id — §6.4), Fraunces 400 italic (the hedge voice, §6.5).
* font-display: swap so first paint never blocks on a font fetch.
*/
@font-face {
font-family: 'Instrument Sans';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('/fonts/instrument-sans-latin-400-normal.woff2') format('woff2');
}
font-weight: 500;
src: url('/fonts/instrument-sans-latin-500-normal.woff2') format('woff2');
font-weight: 600;
src: url('/fonts/instrument-sans-latin-600-normal.woff2') format('woff2');
font-family: 'IBM Plex Mono';
src: url('/fonts/ibm-plex-mono-latin-400-normal.woff2') format('woff2');
src: url('/fonts/ibm-plex-mono-latin-500-normal.woff2') format('woff2');
font-family: 'Fraunces';
font-style: italic;
src: url('/fonts/fraunces-latin-400-italic.woff2') format('woff2');
* SOFT PROOF design tokens (HUMAN-LAYER-PRD §6.1).
* The abstain wears the brand color (Iris violet #7C3AED) and NOTHING else does
* — the violet family is QUARANTINED to the abstain/unknown token names below and
* enforced by scripts/violet-lint.mjs. "Nothing glows": matte contact shadows only,
* no emission gradients (§6.3).
:root {
/* Foundation */
--porcelain: #f7f4ef; /* app ground */
--bone: #efeae2; /* cards, post-it paper */
--ink: #2b2836; /* text */
--ink-soft: #5b5566; /* secondary text */
/* Violet family — QUARANTINED to abstain / honest-unknown only */
--wisteria: #a78bfa; /* violet tint */
--iris: #7c3aed; /* violet primary (the brand color) */
--veil: #ede9fe; /* violet wash */
--iris-deep: #4c1d95; /* ink-level violet accent */
/* Verdict tokens (semantic) */
--verdict-act: #6fa287; /* fired sage — low risk / act */
--verdict-act-tint: #dee9dc;
--verdict-reverify: #c89b3c; /* ochre — medium risk / reverify */
--verdict-reverify-tint: #f0e3c0;
--verdict-abstain: #7c3aed; /* IRIS — abstain / insufficient_evidence */
--verdict-abstain-tint: #ede9fe;
/* State tokens */
--state-unverified: #b8b2a8; /* unfired grey — stale / no-evidence */
--state-unverified-tint: #e9e5de;
--state-failure: #b0563b; /* fired brick — losses, hard errors */
--state-failure-tint: #edcec3;
/* Matte contact shadow (no colored halos, no emission) */
--shadow-contact: 0 1px 2px rgb(43 40 54 / 0.08);
--shadow-card: 0 1px 3px rgb(43 40 54 / 0.1);
* Human View v2 — Build Map ARTKIT tokens (HUMAN-VIEW-V2-SCREENS §0/§10).
* Only the four the SOFT PROOF palette did not already carry; the block STATES
* reuse the verdict/state families above (coabitação):
* evidence-backed → --verdict-act · needs-evidence → --verdict-reverify
* broken/drifting → --state-failure · unknown/unpainted → --state-unverified
--socket-blue: #3d6f8e; /* ARTKIT socket-blue — wires/sockets + runtime axis */
--stale-lilac: #8a7ba8; /* ARTKIT stale-lilac — candidate/ratification accent */
--warm-paper: #fcfaf6; /* ARTKIT warm-paper — block card fill */
--hairline: #d8d1c6; /* ARTKIT hairline — neutral card/no-socket border */
html, body, #root {
height: 100%;
width: 100%;
margin: 0;
padding: 0;
overflow: hidden;
background: var(--porcelain);
color: var(--ink);
* The tremor breath — the single sanctioned ambient animation (§6.3).
* Opacity ±0.15, period ≥ 3s. Never a strobe. Abstain-class elements NEVER
* carry this (enforced by the abstain-never-animates component test, INV-02).
@keyframes tremor-breath {
0%, 100% { opacity: 1; }
50% { opacity: 0.85; }
.tremor-breath {
animation: tremor-breath 3.4s ease-in-out infinite;
/* Quiet toast slide-in (≤200ms, ease-out) */
@keyframes soft-slide-in {
from { opacity: 0; transform: translateY(-4px); }
to { opacity: 1; transform: translateY(0); }
.animate-soft-slide-in {
animation: soft-slide-in 0.18s ease-out;
* Reduced motion is a CONTRACT, not a courtesy (HUMAN-LAYER-PRD §4A.5). Under
* `prefers-reduced-motion: reduce` the single sanctioned ambient animation (the
* tremor breath) stands down — a static tick replaces it, so §3.2's INFORMATION
* survives while its motion does not — and every transition/animation is zeroed.
* This extends §6.3 mechanically and is asserted by a component test alongside
* abstain-never-animates.
@media (prefers-reduced-motion: reduce) {
animation: none;
*,
*::before,
*::after {
animation-duration: 0.001ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.001ms !important;
scroll-behavior: auto !important;