Codifies the doctrinal source for the semantic system per the user's
book at src/docs/Disenando_lo_que_ocurre_manuscrito_completo_revisado_v2.docx.
Canon (book cap. 8 + cap. 22-29 + cap. 10):
- 8th family `delegate` added (offer/plan/authorize/act/review/escalate/return)
- `signal.inform` added (book cap. 24 listed 7 signal verbs; we had 6)
- Commit contextual verbs from case studies: apply, partial, block, move, upload
- `sustain.upload` added
- SemaFamily union, SEMA_FAMILY_POLICY, sema-map, visual chan, morfo schema
all extended to include delegate (intentPolicy: 'optional' — no intent by
default per cap. 29 §4)
Lint (scripts/morfo-vocabulary-check.ts):
- Hard-fails on declared `semantic.verb` not in family canon (the doctrinal
contract: subscribers query by family+verb)
- Soft-warns on event name shape drift (declared verb is the truth, name is
informational)
- Allowlists `button.commit-action` with TODO referencing Plan B commit 2
(Button's intent vs contact question per cap. 22 §11 needs design sign-off)
3 mechanical violation fixes:
- textarea: `shift-count-overflow` (family shift, verb limit) → `signal-warn-count-overflow`
(signal.warn + risk per cap. 24 — corregible warning, not context shift)
- password-field: `shift-toggle-visibility` → `commit-toggle-visibility`
(commit.toggle + affirm per cap. 23 — state fixation, not context shift)
- password-field: `shift-caps-state` → `signal-notify-caps-state`
(signal.notify + neutral per cap. 24 — system orients attention without urgency)
- month-grid + year-grid: `nav-step` → `shift-navigate-step` (family/verb
already canonical, name aligned to {family}-{verb}-{variant})
Verification:
- npm run morfo:vocabulary → EXIT 0 (1 allowlisted, 59 pre-existing name-shape
warns documenting visible drift for future sprints)
- npx vitest src/uix/sema src/uix/morfo → 194/194 pass
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
`WARN ${loc}${values} no canonical vocabulary matches. Consider if this should use one of: ${Object.keys(CANONICAL_VOCABULARIES).join(', ')}`
);
break;
}
}
console.log('');
console.log(
`These are WARNINGS — novel vocabularies may be legitimate. If the value set SHOULD match a canonical vocabulary, align it. If the component introduces a NEW canonical vocabulary, add it to CANONICAL_VOCABULARIES in src/uix/morfo/schema.ts.`
`WARN ${loc}${values} no canonical vocabulary matches. Consider if this should use one of: ${Object.keys(CANONICAL_VOCABULARIES).join(', ')}`
` Verb "${f.declaredVerb}" is not in SEMA_VERBS.${f.declaredFamily} (see src/uix/sema/verbs.ts).`
);
);
break;
}
console.log('');
console.log(
`Declared semantic.verb must be in the canon in sema/verbs.ts (which mirrors «Diseñando lo que ocurre» cap. 22-29). If a new verb is genuinely needed in the canon, add it after a design discussion and ensure at least two components share it. If the divergence is deliberate and time-bounded, add it to EVENT_NAME_ALLOWLIST in this script with a TODO.`
);
hadHardErrors=true;
}
}
}
}
console.log('');
if(nameFindings.length>0){
console.log(
console.log('');
`These are WARNINGS — novel vocabularies may be legitimate. Review each above: if the value set SHOULD match a canonical vocabulary, align it. If the component introduces a NEW canonical vocabulary, add it to CANONICAL_VOCABULARIES in src/uix/morfo/schema.ts.`
console.log(
);
`Found ${nameFindings.length} event name${nameFindings.length===1?'':'s'} that don't follow the canonical shape (warn):`
);
console.log('');
for(constfofnameFindings){
console.log(`WARN ${f.morfo}.${f.eventName} does not parse to {family}-{verb}[-{variant}]`);
}
console.log('');
console.log(
`These are WARNINGS — the declared semantic.verb is canonical, but the event name doesn't surface the family+verb (which makes \`[data-event^="..."]\` selectors and verb-grouped sema cascades harder to author). Consider renaming to \`{family}-{verb}-{domain-label}\`.`
para cualquier shift del header (PrevButton / NextButton / PageUp / PageDown).
Family `shift.navigate` semánticamente correcto.
Family `shift.navigate` semánticamente correcto, variant `step` por paso
discreto.
## Gaps
## Gaps
@ -80,4 +81,4 @@ fuera del DatePicker (filtros, reportes, año fiscal).
| Multi-año selection (range) | **diferir** | Caso de uso emergente; resolver con un MonthRangePicker dedicado cuando llegue demanda real. |
| Multi-año selection (range) | **diferir** | Caso de uso emergente; resolver con un MonthRangePicker dedicado cuando llegue demanda real. |
| Quick-jump dropdown del año | **diferir** | Útil para escalar años pero el patrón actual (PrevButton/NextButton + PageUp/Down) cubre. |
| Quick-jump dropdown del año | **diferir** | Útil para escalar años pero el patrón actual (PrevButton/NextButton + PageUp/Down) cubre. |
| Localized month names en el cell | **implementar** | Hoy se renderiza el número/short label desde el snippet; las locales que necesitan formatos mes-largo no se aplican automáticamente. Backlog i18n. |
| Localized month names en el cell | **implementar** | Hoy se renderiza el número/short label desde el snippet; las locales que necesitan formatos mes-largo no se aplican automáticamente. Backlog i18n. |
| Renombrar `nav-step` a `shift-step` o `navigate-page` | **diferir** | El warning A-3.6 sugiere {verb}-X. Cambiar requiere actualizar consumidores; bajo prioridad. |
| Renombrar `nav-step` a forma canónica | **resuelto** | Renombrado a `shift-navigate-step` (verb `navigate` + variant `step`) per book cap. 27 §5. |
`first-year`/`last-year`/`next-page`/`prev-page` como focus moves
`first-year`/`last-year`/`next-page`/`prev-page` como focus moves
@ -77,5 +78,5 @@ nuevo en UIX; sirve para escenarios de selección de año aislada
| --- | --- | --- |
| --- | --- | --- |
| Multi-año selection (range) | **diferir** | Resolver con YearRangePicker cuando llegue caso real. |
| Multi-año selection (range) | **diferir** | Resolver con YearRangePicker cuando llegue caso real. |
| Quick-jump a una década específica (input + go) | **diferir** | Útil para escalar 100+ años; la paginación cubre el caso común. |
| Quick-jump a una década específica (input + go) | **diferir** | Útil para escalar 100+ años; la paginación cubre el caso común. |
| Renombrar `nav-step` a `shift-step` o `navigate-page` | **diferir** | El warning A-3.6 sugiere {verb}-X. Cambiar requiere actualizar consumidores; bajo prioridad. |
| Renombrar `nav-step` a forma canónica | **resuelto** | Renombrado a `shift-navigate-step` (verb `navigate` + variant `step`) per book cap. 27 §5. |
| Highlight visual de la década actual (extra al año) | **diferir** | Hoy se marca sólo el año actual con `data-current`. La década podría marcarse en el heading. |
| Highlight visual de la década actual (extra al año) | **diferir** | Hoy se marca sólo el año actual con `data-current`. La década podría marcarse en el heading. |