Obin

Verification workspace
design system

The system exists to serve one rule: a figure a machine asserted and a figure a human verified must never look the same. Every token, state, and motion below is downstream of that.

The one rule

Read this before changing anything. Most decisions in this system look arbitrary until you hold them against it.

Fluency is not evidenceWell written prose carrying an unverifiable number is the failure this product exists to prevent. Anything that makes machine output look more finished without making it more provable is a regression.
Attention is the scarce resource, not screen spaceSurfacing everything the agent did is the lazy answer. The system hides what has been proven and ranks what has not. Adding an always visible panel is a cost, not a feature.
Confidence is never displayedModel confidence and token probability measure fluency, not truth. Only measured historical accuracy appears anywhere in this product, and it is always attributed to a source class and a sample size.
Colour never carries state aloneEvery claim state is also distinguished by border style, a glyph, or a written label, because credit teams print memos and because roughly one in twelve male users cannot separate the amber and green states.

Colour

Four semantic families and one accent. The accent is reserved for things the analyst has not yet decided, which is why it reads as attention rather than as brand.

Surface

--bgWorkspace ground#EFF1F4
--panelDocuments and panels#FFFFFF
--sunkRecessed, disabled#F7F8FA
--ruleStructural borders#E2E5EA
--hairWithin a group#EDEFF3

Ink

--inkPrimary text, primary action#0E1116 · 17.4:1
--midSecondary and supporting text#59616D · 6.2:1
--faintLabels and metadata. Floor for text.#666E7A · 4.6:1

Semantic

--accOpen. Awaiting a human decision.#1B47C9
--passProved, or accepted by a person.#0E6B4F
--warnSources conflict, or question outstanding.#96590A
--failUnsupported by anything available.#AC231C
Do not

Do not introduce a fifth semantic colour. If a state needs one, the state model is wrong.

Do not use --pass for a figure the agent proved but a human has not seen. Green means a person is accountable for it, or a deterministic tool produced it. Those are the only two cases.

Type

Three registers, and the split is the argument. Monospace means a machine asserted the value. The document face carries everything a person wrote, including the memo's own headings and field labels. The interface face is for the tool around the document. Nothing a human wrote is ever set in the machine register.

The signature decision in this system. Prose is set in the interface sans. Every figure a machine asserted is set in monospace. The analyst can see which words a human chose and which numbers a machine claimed without reading either.

Memo heading12px / 1.2
--doc · .12em · uppercase
3  Cash and burn
Memo body15px / 1.78
--doc · 400
Cash of $9.14M against monthly net burn of $380,000. On the facility that gives 39 months of post draw runway.
Machine figure13.5px / 1
--mo · 500 · baseline locked
$8,412,000   112%   $421,300
Document title25px / 1.2
--ui · 600 · -.022em
Northwind Systems
Section label10px
--mo · .12em · upper
Key risks
Panel heading17px / 1.3
--ui · 600
Senior blanket lien
Supporting12px / 1.6
--ui · 400 · --mid
Cross checked the 9 files in the data room. No lien in any of them.
Source excerpt12px / 1.78
--mo · --mid
collateral  ·  all assets, blanket lien

The scale, in full

AxisPermitted values
Size10 label · 12 supporting · 13 UI · 15 prose · 17 panel · 21 figure · 25 title. 13.5 is the one exception: the machine figure, sized so monospace sits optically with 15px prose.
Weight400 body · 500 figures and numerals · 600 headings and emphasis. Nothing between, because 550 renders inconsistently on fallback fonts.
Leading1 figures · 1.2 display · 1.45 dense UI · 1.6 supporting · 1.78 prose.
Tracking-.02em display · .02em monospace body · .12em uppercase labels. Three values only.
Do not

Do not set a machine figure below 13px or unlock its baseline. Mono inside prose shifts the line box and the paragraph leading goes uneven.

Do not set analyst written prose in monospace. The distinction stops meaning anything the moment it is used decoratively.

Claim states

Every figure in the memo is in exactly one of six states. Five are visible to the analyst. The sixth, auto, is deliberately quiet: it was proved deterministically and is not the analyst's problem.

$9.14Mauto Proved by a tool without a person. Hairline underline, no colour. One of the 28.
35 monthsopen In the queue, no decision yet. Accent underline plus accent text.
$380,000conflict Two sources disagree. Warn underline, warn wash. The agent will not pick one.
112%unsupported Nothing available can check it. Fail underline, fail wash. Written, never dropped.
$421,300asked Question outstanding with the company. Dashed underline, so it differs from conflict without colour.
$8,412,000accepted A named person is accountable for it, with a timestamp on the receipt.

The state machine

Four actions move a claim. Only two of them close it. Rejecting does not mark a figure wrong, it re-reasons the step and returns a new answer, which may be the same answer.

scroll sideways to follow the flow →
open conflict unsupported accept ask the company reject accepted asked memo circulates re-reasons the step, returns a new answer conditional

Asked does not block circulation. The memo goes to committee marked conditional rather than waiting on a reply, because blocking on the company is where throughput actually dies.

Components

ComponentPurposeRules
Queue rowOne unresolved claim Always carries three signals: leverage bar, accuracy percentage for its source class, and state chip. Never sorted by document order except in the explicit comparison mode.
Proof panelEvidence for one claim Fixed order: consequence, side by side proof, inline source, track record, actions. The consequence comes first because it decides whether the analyst reads the rest.
Inline sourceThe document region cited Tabbed when a claim cites more than one document. Max height 196px then scrolls. The cited region is always marked. Never the only way to reach the full document.
Accuracy dialMeasured track record Always a button. Always opens the sample behind it, including the rows where the agent lost. Never displays a value the analyst cannot audit.
Margin markerSection level state Count of open figures, or a tick. Clicking jumps to the first open claim in that section.
Status stampMemo disposition Three values only: held, conditional, cleared. Derived from claim states, never set directly.
ReceiptWhat travels with the memo Machine proved, human accepted, open, spot checks, exceptions, attention spent. Generated, never composed.
SheetFull document, queue, calibration Max 680px. Header, body, footer with a provenance note on the left and a ghost Close on the right. Escape always closes. Header and footer are pinned and only the body scrolls, so the line that is the reason the sheet exists is never below the fold.
Boundary blockWhat left the firm's environment Deliberately neutral, --sunk on --rule, never a semantic colour. An outbound lookup is neither a pass nor a warning, it is a fact the security team is entitled to see, and colouring it would assert a judgement the product has not earned. States what was sent and what was not. Appears only on claims that made a call outside the network.
Assumption tagThis is my call, not their fact Dashed border, --faint, sits against the block label. Marks anything inferred about the customer rather than told to us. Never on a figure, only on a design position. If it is on a figure the state model is being used wrongly.

Motion

Four moments. Each carries information the static frame cannot. Anything else does not ship. All of it is suppressed under prefers-reduced-motion.

Reshuffle500ms · 14ms stagger Rows travel to their new rank when the sort changes, so the cost of document order is seen rather than described.
Propagation170ms interval A decision walks down its dependents in order, at the speed an eye moves down a page. Numbers count rather than cut.
Settle500ms wipe A resolved figure closes left to right, so it reads as the claim resolving rather than the page repainting.
Running1150ms loop A re-reasoning step sweeps its status chip, visible from the queue without the panel open.
Seal500ms border The memo is circulated. The card seals and the stamp becomes a time. The only motion about the document rather than a figure.
Do not

No entrance animation on load. No motion on hover beyond a 140ms colour or border change. No spring easing. A credit tool that bounces reads as a toy.

Layout and space

4px base unit. Three columns collapse in a fixed order as width is lost, and the queue is the last thing to go because it carries the thesis.

WidthQueueMemoProof
1440px and up336px680px428px
1200 to 1440296pxfills392px
1100 to 1200264pxfills352px
720 to 1100236pxfillsbecomes a sheet
Below 720hiddenfull widthsheet

Under a coarse pointer every target grows to at least 28px and memo leading opens to 2.0, because the memo is read on a phone far more often than it is edited there.

Accessibility floor

RequirementStandard
Text contrast4.5:1 minimum against its own background, verified in browser at six viewports. --faint at 4.6:1 is the floor and nothing lighter carries text.
Type floor10px, and only for uppercase monospace labels with .1em tracking or more.
State encodingNever colour alone. Border style, glyph, or written label accompanies every state.
KeyboardFull review loop without a mouse: ] [ to move, Enter to accept, X to reject, A to ask, Esc to close.
Focus2px accent ring on every interactive element, at 2px offset. Controls inside a container that clips, the sort toggle, the tab strip, the list of 28, draw the ring inside themselves at -2px instead, because an outset ring is cut off there and the control reads as unfocused.
ReachabilityAnything clickable is a real control, never a div or li with a click handler. The 28 proved figures are buttons for this reason: hidden is not the same as withheld, and a row a keyboard cannot reach is withheld.
DialogsA sheet carries role="dialog" and aria-modal, is labelled by its own heading, takes focus when it opens, traps Tab and Shift Tab inside itself, and returns focus to whatever opened it. Without the trap a keyboard user tabs through the rail behind an overlay they cannot reach.
MotionAll animation suppressed under prefers-reduced-motion, in CSS and at four JavaScript call sites.