# `uk-h1-2026-split` — design provenance

Companion to the `branded-infographic` bundle at `infographics/01/`. The skill writes its own
per-datum provenance table at `infographics/01/provenance.md`; this file carries the design
decisions, the chart choice, the checklist result and the residual risks.

- **Agent:** `suf-data-visualisation`
- **Skill:** `branded-infographic` (D01, hard rule 5 — a numeric figure is produced via the skill)
- **Piece:** `05_outputs/piece.md`, section "The money did not spread"
- **Date:** 2026-08-09

---

## 1. Chart choice, and why it beats the alternative

**Shipped: a sorted dot plot — six components of one total, on one shared horizontal scale
anchored at zero, largest at top, each dot direct-labelled with its value.** Encoding selected
by the skill as `rangeplot` from `intent: comparison` + a declared `scale`.

**One line on why this beats the alternative:** the brief's other candidate — the late-stage
share shift, 42% → 68% against a European 59% — is a *stage* story, and the section's claim is
a *destination* story ("None of that money was spreading out to look for companies. It already
knew what kind it wanted."); this figure answers the question the section actually asks, and it
answers it inside one source and one window.

**Why the composition, decomposed.** The brief offered "AI $12.6bn within the $17bn total".
Drawn as two marks that is a sentence, not a chart, and the body already carries it as its one
anchor. Splitting the $17bn one level down — the four AI sub-sectors HSBC names, plus the two
residuals — costs no extra source, stays in the same window, and makes the section's second
claim visible for the first time: the concentration is not just *into AI*, it is into one
corner of AI. It also pays off the piece's opening scene, a biotech founder pitching to
"investors who had just made enterprise AI software the biggest bet in AI" — $5.2bn, until now
demoted to the Evidence note and unseen.

**What was tried first, and why it was abandoned.** The first build declared
`intent: composition`, which the skill deterministically renders as a **treemap**. It failed
the skill's rendered-DOM honesty gate:

> `rendered-chart-inspection`: honesty: `ai-enterprise-software`/`ai-other` measure ratio 2.271
> deviates from value ratio 4.333 by 47.6% (tolerance 5%) — likely truncated baseline or
> mis-scaled tile. Fix-repass failed; degraded to card.

Diagnosis: the treemap's measured element is the tile `<g>`, which unions the rectangle *and*
its text. Honest category names ("AI: other sectors (computed)") overflow a small tile, so the
smallest tiles measure far larger than they encode. The available fix was to cut the labels to
about eight characters — which would have deleted both the AI/non-AI distinction and the
`(computed)` markers, i.e. bought a green gate by removing the honesty defences. The gate was
right and the encoding was wrong.

That is also what `tufte/chart-selection.md` says without being asked: "One variable, many
items → **sorted dot plot or horizontal bar**; *don't use*: pie chart, donut, **treemap**", and
"Part-to-whole, small n (≤6) → **sorted bar with direct labels, or a small table**". The
treemap is the skill's deliberate house override for composition cards and says so in its own
template header. Here the prescribed form is the shipped form; the gate simply forced the
issue.

**Kill-list overrides:** none. No pie, no donut, no 3D, no dual axis, no rainbow scale, no
gridline wall, no legend. The treemap — which *is* on the kill list for part-to-whole — was
attempted and not shipped.

---

## 2. What is encoded

Units: US$ billion, H1 2026 (1 January – 30 June 2026). One source, one window.

| Row | Value | Basis | Anchor |
|---|---:|---|---|
| AI: enterprise software | $5.2bn | **Sourced** | `04_sources/hsbc-dealroom-h1-2026.txt:24` — "Enterprise software attracted the highest levels of AI investment ($5.2 billion)" |
| Everything not AI (computed) | $4.4bn | **Computed** — $17bn total less $12.6bn AI | `infographics/sources.md:16`, deriving from dump lines 18 and 22 |
| AI: health | $2.6bn | **Sourced** | `04_sources/hsbc-dealroom-h1-2026.txt:24` — "followed by Health ($2.6 billion)" |
| AI: hosting | $2.1bn | **Sourced** | `04_sources/hsbc-dealroom-h1-2026.txt:24` — "Hosting ($2.1 billion)" |
| AI: robotics | $1.5bn | **Sourced** | `04_sources/hsbc-dealroom-h1-2026.txt:24` — "and Robotics ($1.5 billion)" |
| AI: other sectors (computed) | $1.2bn | **Computed** — $12.6bn AI less the four named sectors ($11.4bn) | `infographics/sources.md:17`, deriving from dump lines 22 and 24 |

The six rows sum to $17.0bn. Publisher on every row: HSBC Innovation Banking / Dealroom, "UK
Innovation update H1 2026", published approximately 4 July 2026, dump fetched 2026-08-09.

**No Beauhurst figure appears anywhere in this chart.** The Q2 material (the eight £100m+
raises, the ~80%, the £1.47bn) is a different provider and a different window, and the
fact-checker has already corrected this piece once for implying two windows corroborated each
other. One source, one window, one encoding.

---

## 3. Assumptions, declared

1. **[Assumption] The four named AI sectors do not overlap.** HSBC ranks them — "Enterprise
   software … followed by Health …, Hosting … and Robotics" — which implies a partition but
   does not state one. If they overlapped, the $1.2bn residual would be too small. Their sum
   ($11.4bn) sitting comfortably inside the $12.6bn AI total is consistent with a partition.
2. **[Assumption, bounded] $17bn is a rounded total.** HSBC prints "$17bn" and "$17 billion",
   never a decimal. The non-AI remainder therefore carries that rounding: $4.4bn ±0.5bn. The
   figure's one annotated claim — enterprise-software AI ($5.2bn) took more than everything
   outside AI — survives the entire band ($5.2bn > $4.9bn at the unfavourable end).
3. **The two computed rows are marked `(computed)` on the face of the chart**, in the alt text,
   and in the caption. That is a structural defence and costs almost no ink (register T5); the
   arithmetic itself is a prose defence and lives in the alt and the D01c table.
4. **$12.6bn is not drawn.** It is the body's single anchor number for this section and stays
   there; the figure shows where it landed rather than restating it.

---

## 4. Encoding and colour rationale

- **Position, not area.** One shared linear scale, `min: 0` (enforced by gate-0's
  `scale_min_nonzero`), `max: 6`. Position is the most precisely-read encoding available and it
  is what the failed treemap could not deliver honestly.
- **Sorted descending, largest at top** — `tufte/chart-selection.md` § ordering.
- **One accent.** Ember (`#E85D2F`) on the primary row only: its dot, its value label, and a
  faint vertical reference rule dropped at $5.2bn through the full chart height. Everything else
  is bone on ink. The rule is the annotation made structural — it lets the reader see that no
  other row reaches enterprise-software AI without being told.
- **Direct labelling throughout.** Category names in the left gutter, values above each dot. No
  legend, no axis ticks — a tick number would carry no manifest provenance, and every dot
  already states its own value.
- **Nothing else.** No gridlines, no frame box, no shadows, no second colour.
- **Colour-blind safety:** the ember/bone distinction is a lightness contrast on a dark ground,
  and the accented row is additionally the top row and the rightmost dot. Colour is never the
  only channel.

---

## 5. Gate and check results

| Gate | Verdict | Detail |
|---|---|---|
| `gate-0` (schema, cross-field, source resolvability, alt coverage) | **pass** | "schema, cross-field, sources resolvable, alt covers the rendered text" |
| `brand-check` | **pass** | frame invariants intact |
| `tufte-lint` (static) | **pass** | no pie, no 3D, no dual axes, direct labelling, no gridline wall |
| `rendered-chart-inspection` (rendered DOM) | **pass** | "proportionality + coverage truthful" |
| `rendered-numbers-lint` (rendered DOM) | **pass** | every rendered number traces to the manifest |
| `inline-svg-emit` | **pass** | `render/01-uk-h1-2026-split.svg` written |
| `check-alt-text.py --strict` (bare SVG vs the proposed placement alt) | **CLEAN** | 0 findings; headline enforcement heuristic, so all twelve rendered text runs were also read against the alt by hand |
| `degraded` | **false** | shipped encoding = attempted encoding = `rangeplot` |

Renderer pinned: `HeadlessChrome/145.0.7632.6`, browse `71e2eddd716e3bbc`. `tokens_cost`: 0
tokens, 0 model calls — deterministic gates only. Full record: `infographics/01/gate-results.json`.

**Visual verification performed.** The framed PNG was rendered and read back as an image, and
checked against the squint test and `tufte/checklist.md`. This is not a static read of the
source: the chart was looked at.

### `tufte/checklist.md` — 13 boxes

| # | Item | Result |
|---|---|---|
| 1 | Sorted by the value the reader cares about | **Yes** — descending by US$bn |
| 2 | All data points visible | **Yes** — six rows, six marks |
| 3 | "Other" groups small enough not to mislead | **Partial** — "AI: other sectors" is the smallest row at $1.2bn, fine; "Everything not AI" is $4.4bn and internally unresolved, because HSBC publishes no non-AI sector split. It is directly labelled, marked computed, and is the comparison the chart exists to make, not a swept tail |
| 4 | Lie factor 0.95–1.05 | **Yes** — `rendered-chart-inspection` fits one value→pixel line across every mark and requires each residual ≤5% of the axis span; pass |
| 5 | Bars start at zero | **Yes (as scale)** — `scale.min: 0`, enforced |
| 6 | Truncated axis baseline labelled | **N/A** — not truncated |
| 7 | No area or volume encoding a single number | **Yes** — position only; this is why the treemap was dropped |
| 8 | Gridlines light or absent | **Yes** — absent |
| 9 | No chart border / frame box | **Yes** in the embedded SVG. The framed PNG has brand chrome *outside* the plot; the artefact proposed for the piece is the bare SVG |
| 10 | No redundant encoding | **Yes** — dot position plus one value label; no axis ticks repeating it |
| 11 | One accent colour, focal data only | **Yes** — ember on the primary row alone |
| 12 | Direct labels, not a legend | **Yes** — category left, value above the mark |
| 13 | Numbers formatted readably | **Yes** — "$5.2bn", not "5,200,000,000" |

### Residuals a green run does not cover

- **No visible zero anchor.** The scale starts at zero by contract but the origin is not drawn,
  and the rangeplot template ships no range frame. A reader cannot see where zero is. Mitigated
  by every dot carrying its own value, so no magnitude has to be estimated — but a reader
  eyeballing *ratios* between dots would be reading a distance from an unmarked origin. Named,
  not fixed: fixing it means editing the skill's template, which is out of scope for one figure.
- **The whole is asserted, not encoded.** "$17bn" is in the title and the caption; the dot plot
  does not show the rows summing to it. That is the price of leaving the treemap, and it is the
  right price.
- **`check-alt-text.py` headline enforcement is heuristic here** (the SVG is not `isoforge`-built,
  so it carries no `data-sf-text` markers). A CLEAN result verifies the numbers, not the
  headline; the headline was verified by hand instead.
- **The alt-text gate covers the framed PNG (manifest `alt`) and the bare SVG (placement alt)
  separately.** They are different images with different text and deliberately different alt.

---

## 6. Reproducing this figure

The manifest is the source of truth. From the website repo root — the `cd` matters, because the
headless renderer refuses file paths outside the invoking working directory:

```sh
cd /Users/faraz/Documents/Admin/SpinUp/website
bash ~/.claude/skills/branded-infographic/bin/render-bundle.sh \
  --manifest drafts/2026-08-09/mechanism-readiness/05_outputs/infographics/01-uk-h1-2026-split.manifest.json \
  --out      drafts/2026-08-09/mechanism-readiness/05_outputs/infographics/01 \
  --source-root /Users/faraz/Documents/Admin/SpinUp/website \
  --eyebrow "UK VENTURE CAPITAL" --week-date "H1 2026" --slug uk-h1-2026-split
```

There is no bespoke generator script: the skill *is* the generator, and the manifest plus the
source ledger are the inputs. A data or brand change is a manifest change plus a re-run.

Bundle outputs: `01/manifest.json`, `01/render/01-uk-h1-2026-split.{html,png,svg}`,
`01/provenance.md` (per-datum), `01/gate-results.json`. The embedded copy of the SVG lives at
`05_outputs/figures/mechanism-readiness/uk-h1-2026-split.svg`.

---

## 7. Where this figure could still mislead

Stated plainly, because a chart this clean can carry an argument further than its data.

- It shows **where H1 2026's biggest cheques went**. It does not show that no money reached
  anyone else, and it says nothing about deal *counts* — a $1.2bn residual could be one round or
  four hundred. The piece's own counter-argument paragraph ("Specialist funds in quantum, in
  life sciences, in advanced materials, are still active") is not contradicted by this chart and
  should not be softened on account of it.
- "AI: health" at $2.6bn is HSBC's *AI* health figure, not UK life-sciences venture capital in
  the round. A reader could take the $2.6bn row as "life sciences got $2.6bn". It did not; that
  is AI investment inside health. The row label says "AI:" for exactly this reason.
- The chart supports "the money concentrated". It does **not** support "class-B companies cannot
  raise", and it is not evidence for the piece's practitioner inference that the "AI-enabled"
  label routes a founder toward the class-A pool. That claim is marked in the body as the
  author's own read and this figure does not upgrade it.
