ADR-080 — Help content sync

Architecture decision record — status: Accepted.

Source: docs/adr/ADR-080-help-content-sync.md

ADR-080: Help content sync

Estado

Accepted — 2026-08-23

Contexto

IVPrior (ADR-045) trata Help como parte del producto: ninguna UI S-xxx se cierra sin artículo, registry e imagen en el mismo PR. IVPrior ya tiene apps/help (ADR-079) pero el sync estaba diferido. Sin gate, el desfase pantalla↔artículo se repite.

Decisión

Todo cambio que entrega o modifica una experiencia visible al usuario (S-xxx, copy operativo) MUST incluir Help en el mismo PR/slice, salvo excepciones abajo.

Mismo patrón IVPrior. Adaptaciones IVPrior:

  • Copy Help EN + ES, misma sustancia (ADR-035). Un locale stub no cumple el gate.
  • Artículos en apps/help/content/{en,es}/{module}/{slug}.md (Markdown). MDX cuando haya componentes.
  • Registry: apps/web/lib/screen-help-map.ts.
  • Gate: pnpm --filter @ivprior/web test (help-content-sync).
  • Icono ? contextual: mismo slice que la primera pantalla P0 que lo necesite; el registry se llena desde ya.

Entregables por pantalla

  1. Artículo EN y ES con barra de calidad (.specify/memory/help-content.md).
  2. Entrada en SCREEN_HELP_MAP + patrón de ruta cuando exista URL.
  3. Imagen en apps/help/public/help/{screen-id}/.
  4. Smoke: resolveContextualHelpUrl → artículo (cuando el header ? exista).
  5. Test del lector: un finance manager entiende KPIs/columnas/estados sin preguntar.

Excepciones

  • Infra / DX / CI sin UI.
  • Refactor interno invisible.
  • API sin pantalla ni copy user-facing.
  • Spikes y briefs.

SDLC

HerramientaGate
/speckit.tasksFase Help content si hay S-xxx
/opsx:proposeSección Help en tasks.md si apps/web / apps/help
/opsx:applyNo marcar UI [x] sin Help
/opsx:archive · /cierre-sessionChecklist .specify/checklists/help-content.md

Developer Docs (allowlist, OpenAPI, DX) es el paralelo contributor: .specify/memory/dev-docs-content.md.

Consecuencias

  • Primer slice UI P0 (p. ej. S-001) MUST traer artículo + registry + imagen.
  • Mapa vacío es válido hasta que exista la primera pantalla mapeada.