a2ahub design system v4

Quiet paper, soft white cards, plain words.

v4 keeps the warm paper canvas and the semantic colour meanings of v3, and changes the delivery: hairline boxes become white cards with a quiet shadow, small print becomes a 16px base, machine codes step behind human words, and every label survives being twice as long in Russian.

One token set serves the Astro public site, the self-contained Go-rendered dashboard and a future Nuxt UI. No remote icon kits. Onest and IBM Plex Mono only.

1 · Foundation

Colour carries meaning, never decoration. Ochre is the human authority and drift branch, teal is the agent path, red is literal blockage, green is a verified fact, plum marks a multi-party decision.

Every colour below is a semantic token, so the same markup serves both themes: the hex values in this section are the light values, and the dark theme only re-points the tokens. Hue is preserved across themes — teal stays teal, red stays red — while lightness flips. Light is the default; the choice is remembered per reader.

Surfaces

canvasvar(--hairline)
pagevar(--page)
surfacevar(--surface)
sink#E8E3D7
inversevar(--text)

Ink

primary textvar(--text)
body#453F31
muted#6F6853
faint — decorative only#8A8269
row separatorvar(--hairline)

Semantics

agent pathvar(--focus)
human gate · drift · stalevar(--ochre)
blocked · failedvar(--red)
verified fact#3E7A4C
multi-party decision#7A3B62

Type scale

Hero52 / 600 / -3%
View title32 / 600
Panel title28 / 600
Row title19 / 600
Lead paragraph18 / 400
Body — the floor for prose16 / 400
Meta and secondary15 / 400
XW-checkout-20260728-c3d4mono 14 — ids only

Radius, elevation, motion

6 badge 8 chip 10 button
11 inner card 14 card 18 panel AT
card shadow panel shadow popover shadow
Themes: :root holds the light values, html[data-theme="dark"] re-points the same names. Selection is a 2px teal ring, never a colour fill. Motion: 120ms state, 200ms disclosure, none under reduced motion. Spacing steps 4 · 8 · 10 · 14 · 18 · 26 · 40.

2 · Artifact types

Eight document types, one grammar. The human word leads, the prefix stays visible for machine correlation. Colour plus word plus prefix — never colour alone.

Contract XCA versioned interface a system provides Requirement XRA published demand on another capability or contract Question XQA clarification, defect report or choice Work request XWA request for data, a feature, a fix, an investigation or a change Decision XDA multi-party decision with explicit approvers Handoff XHImplemented and tested work transferred with evidence Response XSAn answer or result attached to a parent exchange Announcement XAA release, deprecation, migration, incident, notice or status broadcast

3 · Components

Every part below is expressible as semantic HTML plus CSS, so the Go-rendered single file and a future Nuxt build can share it.

Status pills

Tinted fill, dark text, 6px radius. Sized by content so a Russian label just gets wider.

Blocking · p1 Your approval pending resolved · digest matches in progress stale 18m unreadable not evaluated

System monograms

Two letters, one tint. Round only here and on status dots — everything else is softly rectangular.

AT CH BI RI LE teal = you · outline = system that left

Controls

Buttons are 10px, tall enough for touch, sentence case.

Open thread Copy id Show evidence →
Needs you · 3 All · 11

Fact table

Label–value pairs are always a table: label left, value right-aligned, hairline row separators.

spacecheckout-core created2026-07-28 09:00 UTC effortmedium

List row

Type, consequence, title, route. Selected state is a teal ring.

Work request Blocking · p1 2 days overdue
Prevent duplicate payment capture after a worker retry
CH checkout AT you·checkout-core

Contract line

Drift is a property of one consumer line, never of the contract as a whole.

checkout → risk missing pinned major 4 · available 2, 3
atlas → risk current pinned 3.2.0 · provider 3.2.0

Exchange lane

The network unit. Two monograms, a lane, a count. Solid lane is a contract dependency, dashed is an open exchange.

CH 2 open · p1 blocking AT
AT 2 open · p3 CO

Unavailable block

Missing context is stated in words. Never green, never zero, never a guess.

Whole-snapshot verdict
Not evaluated in this static read — no persisted validation run with timestamp, scope, inputs and codes is mounted here.

4 · Patterns

Three layouts cover every dashboard view.

Master–detail

Overview, Work, Threads, Contracts, Integrity. Narrow list, first item open by default, detail never pushes the list.

Map

Network and Spaces. Grouped by space, lanes inside, no free-floating graph and no physics.

Ledger

Versions and long fact lists. One table, right-aligned values, no card per row.

5 · Rules that keep it honest

Two languages, one layout; product truth over decoration.

Bilingual by construction

No uppercase letterspaced micro-labels — Russian swells and stops being readable.
Pills and buttons size to content; nothing is a fixed width.
Label columns use minmax(120px,auto) and are allowed to wrap.
Ids, versions, digests and commands stay mono, LTR and untranslated.
Titles are sentence case, so both languages read the same way.
Label ink is #6F6853 at 15px and above — #8A8269 is decorative only, never a label or a value.

Data honesty

Only committed facts are shown. Nothing is inferred to fill a slot.
Unknown is a stated word, not an empty cell or a zero.
Protocol flags are surfaced next to the thing they are about.
Stale is ochre with an age; red is reserved for literal blockage.
No invented percentages, savings or error-rate metrics anywhere.

Dropped from v3

Serif display type.
11–12px body text.
Coloured left borders with rounded corners.
Five equally weighted panels per screen.
Machine codes as the primary label.

6 · Surface parts

The public site adds narrative and machine-readable actions on top of the same vocabulary. Everything below is live: buttons copy, disclosures open, states switch.

Copyable command block

Dark panel, mono 14–15px, a role label and one control with success and failure states. Never a fake terminal window with prompts and cursors.

install.sh
{{ install.text }}
Copy Copied Copy failed

“Ask an agent” menu

One control in the sticky header, on every public page. It opens on click — never on hover — and every machine-readable action lives inside it, so the page body stays free of utility buttons.

This page has a Markdown twin at docs/threads.md.
Copy Markdown View Markdown Copy Markdown URL Ask ChatGPT to read it Ask Claude to read it Give an agent the whole corpus llms-full.txt

Header order, left to right: language (EN default, RU in the popover), theme (light default), Ask an agent, Install a2a.

Evidence strip

Earned facts only, each with its own scope. No certification marks, no uptime, no customer logos.

50 / 50 declared live cells SHA256SUMS keyless cosign bundle provenance · SBOM Apache-2.0

A bounded live-evidence claim always names its immutable candidate. It is never a standing badge.

Plain-language disclosure

Machine codes stay available; the human sentence leads. Click, not hover — essential information is never hover-only.

A committed event claimed in_progress while the fold resolved responded. The event stays in history; the claim is not accepted.
state-claim-mismatch

Lifecycle marker and transition rail

One current state per artifact, and the transitions the fold table allows from it. Legal next moves name the systems allowed to make them.

submitted acknowledged in_progress closed
Legal now
respond — atlas · block — atlas · dispute — checkout

Provenance chip

Every fact belongs to one of three classes, and the class is visible wherever it matters.

canonical derived unavailable
Derived facts name the source fields they were joined from. Unavailable facts name the missing execution context.

Causal rail and event row

Documents and events on one rail, in committed order. Not chat bubbles — nobody is speaking here.

checkout → atlas
Prevent duplicate payment capture after a worker retry
acknowledge by atlas · committed 29.07.2026 08:12 UTC

Next-owner panel

One panel per thread answers whose move it is and why. The reason is a sentence, not a code.

AT Your move since 5h
Checkout disputed your response, so the work request is open again and waiting on atlas. Order strength: committed.

Snapshot / compatibility ribbon

Four independent axes. Never infer one from another, and never average them into one health score.

local binary0.16.1 writer floor0.16.2 CI workflow pin0.16.2 snapshot agestale 18m

Degraded and empty states

Five distinct shapes. None of them is a blank panel, a zero or a green tick.

{{ s.name }}
{{ s.text }}

Changelog entry and impact block

Kind, impact and affected surfaces first; then whether a human has to do anything, and exactly what to run.

impact behavior statusline · cache
A stale statusline starts one leased, detached cache refresh for the next render
Update the binary to pick up the refresh behaviour.
{{ update.text }}

Autonomy boundary

The signature gesture: ochre is the human authority branch, teal is the agent path. The human sits beside the loop, never inside every turn.

HU policy, identity, irreversible choices — once, and on exception
exception branch
AG draft → validate → PR → validated space → next agent

Roadmap horizon marker

Three visibly different commitment states, and never a progress percentage.

Shipped now installable today
Next proposal Design gates open No release target
Exploring later no design work committed

Docs shell parts

Section nav, working search, local table of contents, heading anchors, and a source note. Normal page scrolling — never a nested viewport.

Search the docs
thread, contract, retire…
Threads: one intent, one chain Contract versions #anchor

Reading measure 34em ≈ 68 characters. A page whose body is not owned by the site shows an honest injection block instead of invented prose.

Agent-compatibility row

Named surfaces are examples the binary can detect — not integrations, not endorsements. The neutral row prevents a logo wall.

Claude Code
Codex
Any CLI or MCP-capable agent

7 · Implementation note

What the three surfaces share, what belongs to one of them, and which data the Go assembler has to project so the browser never computes protocol truth.

Token names

Three layers. Component tokens resolve to semantic tokens, semantic to primitives — never the reverse.

primitive--paper-100 · --ink-900 · --teal-600 · --ochre-600 · --red-600 · --green-600 · --plum-600 · --size-14…52 · --space-4…40 · --radius-6…18 · --shadow-card/panel/popover · --dur-120/200 semantic--canvas · --page · --surface · --sink · --inverse · --text · --text-body · --text-muted · --border · --focus · --link · --selected · --agent · --attention · --blocking · --healthy · --decision · --stale · --unknown component--pill-* · --type-badge-* · --row-* · --lane-* · --rail-* · --code-* · --callout-* · --nav-* · --ribbon-*

Shared by all three surfaces

Semantic HTML plus CSS plus small vanilla JS, so Astro, the Go renderer and a future Nuxt build can express the same component.

StatusPill TypeBadge FactTable ArtifactRow ArtifactDetail NetworkMap CausalRail NextOwnerPanel ContractWindow DriftBadge SnapshotRibbon UnavailableBlock CommandBlock

In this prototype the first six are real files; the rest are compositions of the same tokens and are named so a Vue or Astro implementation keeps the boundary.

Surface-specific

public site onlySiteHeader (LanguageMenu · ThemeSwitch · AskAgentMenu) · SiteFooter · InstallBlock · SeedAction · RoadmapHorizon · ChangelogEntry · EvidenceStrip · NotFound local dashboard onlyViewTabs · SpaceChips · UpdateBanner · IntegrityList · SpacesLedger · VersionsLedger — all read-only, no write control anywhere future NuxtNothing is designed for it now. It inherits the token names, the component boundaries and the data contract — and none of the two shells above.

Data projections this design needs from the Go assembler

The browser must never reimplement fold tables, authorization, severity, drift, deadline policy or validation. Each row below is a fact the HTML consumes already computed.

{{ p.name }} {{ p.text }}
Public home → Local dashboard Docs Dashboard example Security Install Roadmap Changelog 404