The initiative's real remaining scope (verified 2026-07-10 against the repo;
the "uncommitted work" memory was stale — builder landed in b3d0e290, picker
in f5eb8acb):
- contracts.test: remove gradient-builder/gradient-picker from
ACTIVE_DEV_TRACK. The catalogue guards found exactly ONE violation — the
missing soma barrel exports — now added (GradientBuilder, GradientPicker).
Post-graduation: same 13 pre-existing failures (knob/menu-dial/metrics/
onion-menu debris from other WIP), zero gradient mentions.
- apg declared on both morfos: builder cites slider (every stop + the angle
dial IS a slider thumb — the keyboard-a11y differentiator); picker cites
dialog-modal via the composed Popover (same rationale as date-picker/ntp).
- Both eidos READMEs upgraded to dossier form (Baseline / Comparativa /
Decisiones / Gaps) transplanting the CONTINUE.md competitive research
(OKLCH model shared with the token engine; keyboard-editable stops — the
field is mouse-only RGBA exporters). Stale "active dev track" recipe notes
corrected.
- gradient-builder demo: D-1.2 was a false negative — the tab union was the
correct v2 9-tab set, just formatted multi-line; joined to one line
(canary format). SSR smoke: 200 + 40 data-gradient-builder attrs.
Remaining on both: D-1.5/D-3.1/D-4.3 — the catalog-wide demo-census (fails
on 10/7 components INCLUDING the button canary), tracked in the dossiers'
Gaps, not gradient-specific.
Gates: component-audit 102 PASS · contracts 24 pass/13 pre-existing ·
vocab exit 0 · type baseline 57.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
los del sistema; lo único bespoke es el track de stops (que ES el patrón
slider propio).
- **Pack sema**: handle pick/drag sobre el track (la firma del slider) +
commit-set/reset.
- **Sin prop `color`** — GradientBuilder pinta el gradiente del usuario, no un
rol de paleta; el palette-picker de la demo está ausente por diseño.
## Gaps
| Gap | Disposición | Detalle |
| --- | --- | --- |
| Mesh editor (puntos 2D) | **diferir** (fast-follow declarado) | El eje ya publica `aurora()`; el editor de mesh reutilizará el patrón stop=slider. Diamond descartado en el research. |
| Midpoints (color hints) + `parseGradient` (paste-to-edit) | **diferir** (Phase-2.5 declarada) | Con el research ya hecho en CONTINUE.md. |
| Gizmo on-canvas (superficie dual barra + lienzo) | **diferir** | v1 = la barra precisa; el gizmo espera el caso mesh. |
| API pública de tokens (`--gradient-builder-*` en recipes/base.ts) | **diferir** | Los privados pasan las R-rules; registrar cuando haya demanda real de theming del editor. |
| Demo v2 (D-1.2/D-3.1 de la máquina) | **implementar** | Pase de demos de esta iniciativa (ver sesión S9). |
## Notes
- **No `color` prop** — GradientBuilder paints the user's gradient, not a palette
role. The demo's palette picker is therefore absent by design.
(el editor y su research) · patrón §2 en [`../date-picker/`](../date-picker/).
## Decisiones
- **Identity wrapper over the composed Popover (§2)**: este morfo no declara
semántica de diálogo (role/trap/open-close) — pertenece al Popover; el
footer es chrome compartido de `picker-shell`.
- **Eventos propios = el desenlace transaccional**: `commit-reset` (Clear) /
`commit-save` (Save) / `commit-remove`, con pack propio; los eventos de
EDICIÓN suenan por el contrato del GradientBuilder embebido. Dos voces, dos
dueños.
- **El value bridge es commit-only + ref guard** (sección arriba): el builder
edita un `draft` local; solo los valores asentados suben al provider; los
resets externos bajan por `$effect` con guard — sin bucle.
- **Sin prop `color`** (como el builder).
## Gaps
| Gap | Disposición | Detalle |
| --- | --- | --- |
| Persistencia de presets guardados | **descartar** (nivel componente) | Como ColorPicker: los presets/save son del CONSUMIDOR; el panel de presets ya compone. |
| Migración a `PickerProvider<TValue>` (deferValue genérico) | **diferir** | Task #31 de la memoria — pasada conjunta de los pickers POST audit-fix. |
| Demo v2 (D-1.5/D-3.1 de la máquina) | **implementar** | Pase de demos de esta iniciativa (ver sesión S9). |