Shared primitives go to oficina/estilo, not rastrillo/ui
Paul's ruling, confirmed directly rather than on either of the two relays that reported it: the design system stays rastrillo's, and the CARLOS suite gets its own variant. An inspector panel shared by a document editor and a spreadsheet is the suite's component, not the framework's. Repo created the same day. The distinction that produced the correction is worth more than the outcome: two callers at design time is the bar for extraction, and says nothing about destination. Both consuming sessions were told to propose to the library and applied the right bar to the wrong question, because the first answer looked like it settled the second. It will recur for every piece either app hands upward, so it is recorded rather than left in a message thread. Creating estilo now rather than building app-local first, because two consumers already exist at design time — the extraction bar is met, not pending, and building locally would guarantee merging two implementations later, which is the outcome the bar exists to prevent. I had recommended the opposite to ui-guidelines-52 an hour ago, applying one-consumer logic to a two-consumer situation; docs-e6 caught it. The colour engine is unaffected and stays in ui: Pair and allocation are contrast arithmetic against floors the framework already gates, so they are a function rather than a component, and both apps call the same one wherever their components live.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01APtNStXDZ5H2fAc1ZuGqtS
1 file changed,
+28
−5
docs/superpowers/specs/2026-08-30-sheets-design.md+28 −5
No CI script — run details
Intent
diff --git a/docs/superpowers/specs/2026-08-30-sheets-design.md b/docs/superpowers/specs/2026-08-30-sheets-design.md| index 825a28f..6f5f234 100644 |
| --- a/docs/superpowers/specs/2026-08-30-sheets-design.md |
| +++ b/docs/superpowers/specs/2026-08-30-sheets-design.md |
| @@ -765,11 +765,34 @@ three as unavailable and keep the §10.3 shim.** |
| - **Menus go shallow:** File, Edit, Insert, Format, Data, Help. |
| - **Home is your sheets by recency and a New button.** No template carousel. |
| -The app shell is **app-local**, handed upstream when a second app wants it. |
| -Primitives split with Docs: we own **toolbar groups**; Docs owns inspector |
| -panel, presence stack and **comment thread** (their anchoring case is |
| -harder, so it owns the design; we consume it — a cross-repo dependency |
| -inside slice one, noted in §13's risk). |
| +The app shell is **app-local**. Shared primitives are not. |
| + |
| +**Destination: `oficina/estilo`** — a CARLOS suite design-system variant, |
| +**not** rastrillo's `ui` (Paul, 2026-08-30; repo created same day). A |
| +variant depends on `ui`, keeps its bones — tokens, the partial vocabulary, |
| +the accessibility floors — and adds components, themes and its own gallery. |
| +Not a fork, and more than a theme, since a theme cannot add a component. |
| +`cmd/dsgen` went public 2026-08-30 and generates a gallery for any module's |
| +own vocabulary; **read it before anyone writes a second one.** |
| + |
| +**The distinction that produced this, worth keeping** (ui-guidelines-52, |
| +2026-08-30): *two callers at design time is the bar for **extraction**, and |
| +it says nothing about **destination**.* Both consuming sessions were told |
| +"propose it to the library" and applied the right bar to the wrong question, |
| +because the first answer looked like it settled the second. It will recur |
| +for every piece either app hands upward. |
| + |
| +**Primitives split with Docs:** we own **toolbar groups**; Docs owns |
| +inspector panel, presence stack and **comment thread** (their anchoring case |
| +is harder, so it owns the design and we consume it — a cross-repo dependency |
| +inside slice one, noted in §13's risk). Same standards either way: twelve |
| +locales, the script-required line stated per primitive, 24×24 targets, 320px |
| +reflow, colour never carrying meaning alone. |
| + |
| +**The colour engine is unaffected and stays in `ui`.** `Pair` and allocation |
| +are contrast arithmetic against floors the framework already gates — a |
| +function, not a component — so our cell fills and Docs' highlights are |
| +callers of the same thing regardless of where their components live. |
| ### 10.3 Cell fill colour |