Contract versions
The skin contract is version 9. Crossing a version reinstalls core, the affected items, and the skin together.
Where the contract stands
The current skin contract is version 9: registered component CSS knobs carry every visual decision, sizing included, published one
slice per paint family under /r/contract/, indexed by /r/contract/index.json.
A pack written against the current version installs and paints with no migration. Contract versions only matter when installed source and installed skin were written against different ones.
Crossing a version
Crossing a version reinstalls core, the affected components or their blocks, and the skin together. Updating one side alone is what leaves knobs declared by nobody.
After the crossing, control-ui:doctor reports clean and the components paint with the pack's own values — not
the browser's defaults where a knob went missing.
Version 9: CodeBlockEditor became Code
Version 9 removed the code-block-editor item. It was a second implementation of the code surface with the same
anatomy and a parallel --cui-code-block-editor-* knob set, so a skin had to paint the same code panel twice. From
version 8 or earlier, remove the old files before reinstalling code:
rm -f components/control-ui/code-block-editor.tsx components/control-ui/lib/code-block-shiki.tsrm -f components/control-ui/knob-contracts/code-block-editor-knobs.ts components/control-ui/styles/recipes/code-block-editor.cssrm -f src/components/control-ui/code-block-editor.tsx src/components/control-ui/lib/code-block-shiki.tsrm -f src/components/control-ui/knob-contracts/code-block-editor-knobs.ts src/components/control-ui/styles/recipes/code-block-editor.cssThen drop the CodeBlockEditor prefix from every part: CodeBlockEditorHeader becomes CodeHeader, CodeBlockEditorContent
becomes CodeContent, and so on. CodeBlockEditorTextarea becomes CodeEditable. highlightCodeToTokens moves to
highlightToTokens from lib/code-tokens. In a skin, repoint --cui-code-block-editor-* to the matching --cui-code-* knob
and any [data-control-family="code-block-editor"] selector to code; the editable textarea is [data-slot="editor"].
variant="command" is gone with no replacement — it set no paint of its own. A one-line command surface is a headerless
Code with density="compact" and overflow="wrap".
Version 4: ToolCall became Activity
Version 4 replaced ToolCall with Activity's typed tool variant. From version 3 or earlier, remove both old layouts
before reinstalling:
rm -f components/control-ui/tool-call.tsx components/control-ui/hooks/use-tool-call.tsrm -f src/components/control-ui/tool-call.tsx src/components/control-ui/hooks/use-tool-call.tsThen replace ToolCall with <Activity kind="tool" name="…"> and its Activity* parts — ActivityDetail,
ActivityDetailLabel, ActivityDetailContent — mapping provider status directly to ActivityState. Drop
useToolCall; no legacy selectors ship.