Button morfo declared `commit-action` with verb `action` (not in canon)
and full intent range. Per «Diseñando lo que ocurre»:
- Cap 22 §10: "Botón: contact.press" — the press is reception of the
gesture, not the commit.
- Cap 22 §11: "el intent fuerte no debería vivir en el contacto, sino
en la señal o consecuencia posterior. La interfaz puede anticipar el
peso mediante forma, color o señal previa."
- Cap 22 §8: "Error típico: contact.press + fulfill — Esto hace que el
sistema diga 'ya terminó' cuando solo ha empezado."
Strict book reading applied:
- Morfo event renamed: `commit-action` → `contact-activate`
(family: `contact`, verb: `activate`, no intent binding)
- Soma provider trigger string + comments updated
- `intent` prop survives as VISUAL signal only — drives `data-color`
and chip variant (anticipatory weight via form/color per cap. 22 §11)
- README + types JSDoc updated with the book's prescription and the
composition pattern: perceptual richness emerges from the OTHER
morfos in the flow (Dialog warning, Item being deleted, etc.) firing
their own commit/signal events at the actual moment of the
consequence
- `EVENT_NAME_ALLOWLIST` in morfo-vocabulary-check.ts emptied — no
exceptions to the canon needed
No `declaresOutcome` props, no imperative sema escape hatches: the
morfo remains the single source of truth for events. If a flow loses
perceptual differentiation, the answer is to model the missing morfo,
not to overload the Button.
Verification:
- npm run morfo:vocabulary → EXIT 0 (zero allowlisted)
- npx vitest src/uix/sema src/uix/morfo → 194/194 pass
- npm run check → no new errors from these changes
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per book cap. 22 §10 ("Botón: `contact.press`"), the Button's morfo
event is just the *reception* of the user's gesture — pre-evaluation,
no intent on the event itself. The `intent` prop drives visual weight
(`data-color`, chip variant) but does NOT load the contact event with
threat/loss/etc. tonality. For the evaluative consequence (the actual
save sound, the delete haptic), consumers fire downstream semantic
events when the real outcome lands:
The semantic event's `intent` is taken from the `intent` prop, so the visual layer can tint the press-flash and the sound channel can pick the right note.