# OpenUI report language The report is elements, not markdown. `lib/report-spec.ts` defines the component vocabulary and the library prompt with `@openuidev/lang-core`; `lib/report-ui.ts` attaches the React renderers. The split exists because `@openuidev/react-lang` calls `React.createContext` at module scope, which breaks the API route's server-side collection. A route that needs the prompt must not import a React-backed module. Components: Headline, MetricGrid, Finding, OptionTable, ActionSteps, SqlBlock, ScoreBar, Callout, VerdictBlock. The report renders while `oul` is still arriving, so the headline appears before the option table. Every numeric the model supplies passes through `num` and `conf` guards. Before that, a `null` confidence inside ScoreBar threw and OpenUI dropped the whole block — visible live as "runtime/render-error: Component ScoreBar render failed". Related: [[SSE stream]], [[Analyst model]], [[Console runner]].