The bold budget — one bold per region (km2w9)
The accent budget above rations hue; nothing rationed WEIGHT. A census of src/tui found bold set at 106 sites: every field label (task, verdict, chain, routing, live, tools, skills, name, detail, step, time), every stat value in the header, every status glyph, every selected row, every stale row, the vim-mode badge, the diff hunk headers and the whole label of every fuzzy-picker row. A screen that bolds twenty things has emphasised none of them, and it has done it in the one channel that cannot be dimmed back down.
The standing rule, declared as BOLD_BUDGET_PER_REGION in src/tui/theme.ts beside the accent budget and the spacing scale: a rendered REGION may spend bold on at most ONE element — the one that NAMES the region. A region is a component-level block of chrome (a bordered box, a pane, a header bar, a titled list, a compose/reply bar); a row inside a list is not a region, so a folder header, a group header and a step header spend no weight.
Why weight is the STRUCTURE channel and not a state channel: hue says what state a thing is in (stateColor / TONE, rationed by ACCENT_CLAIM_BUDGET), luminance says how subordinate it is (the k8ev5 neutral ladder, which steps in both directions), and background says which row you are on (kf6br's SURFACE_SEL band — the selection signal precisely because the three weak signals it replaced, gutter tick plus accent recolour plus bold, did not read at a glance). Weight has no ladder, does not combine with anything, and is the only one of the four that renders on a terminal with no colour at all. So a selected row is a band plus the accent and is not bold; a stale run is TONE.error and is not bold; a status glyph is its state colour and is not bold; a field label is MUTED_STRONG over its MUTED value and is not bold.
Enforcement is structural rather than advisory. bold is now WRITTEN in exactly one component — src/tui/components/RegionTitle.tsx — and every legitimate title routes through it:
<RegionTitle>{lastCrumb}</RegionTitle> // header breadcrumb, primary tone
<RegionTitle color={ACCENT}>Cyberine v{VERSION}</RegionTitle> // brand / section mark
<RegionTitle color={tone}>{title}</RegionTitle> // TitledBox, tone tracks focusRun recipe:
npm run selftest:bold-budget # offline; source census + renders 16 regions through InkThe guard makes two independent assertions, because either alone has a hole. The SOURCE half walks all of src/tui, counts written bold props (comments and string literals excluded) and fails if any file other than RegionTitle.tsx and the two named exemptions carries one — without it, a new <Text bold> in a component the smoke does not render would sail through. The RENDER half renders each region through Ink with colour forced on and counts BOLD SPANS in the raw ANSI — without it, source could route twenty RegionTitles into one pane and still satisfy the census. A span is one maximal stretch of adjacent bold-painted glyph cells: whitespace inside the stretch does not split it, a newline does not split it (a wrapped title is one element), a non-bold cell does, and a stretch of pure whitespace is discarded because bold on a bare space paints nothing. Each region is additionally checked for having rendered at all, through the smoke's own React error boundary — a component that throws scores zero spans and would otherwise pass the budget for free.
Extend recipe. A new region gets an entry in the regions array of scripts/km2w9-bold-budget-smoke.tsx: a name and a node that renders it at the given width. A new title uses <RegionTitle>; anything that is not the region's name uses MUTED_STRONG or a state tone instead. Treat a failing budget as "this element is not the region's name, demote it", never as "the budget is too tight" — weight has no second rung, so a second bold in a region does not add a level of hierarchy, it deletes the one the first bold made.
Known Limitations and Deferred Work. Two exemptions are documented by name in theme.ts and asserted by the smoke, and there are no others: components/chat/Markdown.tsx renders the AUTHOR's **bold**, headings, table headers and diff hunk markers (content fidelity — the weight is the document's, not ours), and components/FuzzyPicker.tsx keeps weight on the matched characters OF THE SELECTED ROW, because kenqx measured raw ACCENT at 1.83:1 against the light variant's selection band and hue therefore cannot carry the highlight there; the smoke asserts that exemption stays scoped (hits.has(ci) && selected, never ||) and that every bold cell in a picker frame sits on one row. The render half covers 16 regions plus the picker; components outside that list — WorkflowMonitor, DiffViewer, TrajectoryReplay, WorkerPeek, HelpOverlay, ChatApp's panels, WelcomeBanner — are held only by the source census, which prevents a new bold appearing but does not count spans per region for them. The measurement is also SGR-1 only: a terminal that renders bold as a brighter colour rather than a heavier face is indistinguishable here, and inverse (used by the vim-mode badge) is a separate channel this budget does not govern.
Divider and border weight (k6shr)
Two related fixes to how a Divider (src/tui/components/Divider.tsx) sits next to the chrome around it, documented in full beside the accent budget and the spacing scale in src/tui/theme.ts:
The border vocabulary is corner-less, by decision (kwk4f)
The TUI's chrome draws a top edge and a bottom edge and nothing else. There is exactly ONE border archetype, chromeBorder() in src/tui/theme.ts, no boxed variant, no left or right edge, and no...