Spec triggers registry

mandatory

SSOT machine-readable dos gatilhos obrigatórios ação→spec (stack-RFC-014 fase 2, R1/R2). A seção "Gatilhos obrigatórios" do CLAUDE.md é um ARTEFATO RENDERIZADO deste registry — editar a tabela à mão é drift detectado por `koder-spec-audit triggers --check` (CI). Renderer e consumidores programáticos (hook JIT meta/context#749, `applicable`) leem ESTE arquivo.

Document format reference: meta/docs/stack/policies/document-format.kmd

Contrato

  • Este arquivo é a fonte de verdade de TODOS os gatilhos obrigatórios

    ação→spec. O bloco YAML abaixo é o dado; tudo fora dele é documentação.

  • A seção ### Gatilhos obrigatórios de meta/context/CLAUDE.md é gerada

    por koder-spec-audit triggers --write entre marcadores <!-- BEGIN GENERATED: spec-triggers --> / <!-- END GENERATED: spec-triggers -->. triggers --check (CI) falha se render ≠ seção (drift) — inclusive edição manual da tabela.

  • Campos por entrada: id (slug estável, único) · action (markdown da

    coluna "Ação", exato) · reads (markdown da coluna "Spec", exato — pode conter anotações operacionais além de paths) · specs (paths resolvidos repo-relative dos documentos a ler — o dado consumível por máquina; todo path DEVE existir na árvore) · mode (consult | inject | gate) · paths (OPCIONAL — lista de globs repo-relative que tornam o gatilho casável por máquina contra o arquivo tocado; é o matcher do hook JIT jit-spec-inject.sh, meta/context#749).

  • Dialeto dos globs paths: casamento no path repo-relative completo;

    **/ = zero ou mais diretórios; ** final = qualquer sufixo; * = um segmento (não cruza /); ? = um caractere. Entradas SEM paths não são inferíveis por path (gatilho semântico — ex.: "escolher storage backend"); cobertura do hook cresce adicionando paths aqui, sem mudar código. Calibrar pra baixo falso-positivo (RFC-014 fp_budget mindset): glob largo demais vira spam de injeção e corrói a confiança no sinal.

  • Modos (RFC-014 §fases): consult = a IA lê a spec antes da ação (estado

    atual de 100% das entradas); inject = hook JIT injeta a spec no contexto quando o matcher dispara (fase 3, meta/context#749); gate = oráculo bloqueia a ação (fase 4 — exige kanon_bindings com fp_budget na spec alvo, RFC-014 R3). Promover consultinjectgate é mudança normativa: exige menção no ticket que a promove. Nota fase 3: o hook JIT (PostToolUse, não-bloqueante) usa paths como matcher e injeta lembrete mesmo em mode: consult — a promoção a inject formaliza a obrigação, mas o lembrete-guia é universal onde houver paths.

  • *linhamento com broadcast-alerts (RFC-014 fase 5 — alinhamento, NÃO

    fusão)* notices (specs/notices/broadcast-alerts.kmd) são avisos efêmeros entre sessões (expiram, têm audiência); triggers são obrigações permanentes ação→documento. Um lock/courtesy nunca vira trigger; uma obrigação que "expirou" nunca foi trigger. Quando um notice recorrente revelar uma obrigação permanente, a disposição correta é promovê-la a entrada AQUI (e deixar o notice morrer).

Dados

triggers:
  - id: landing-page-produto-koder
    action: "Landing page de **produto** Koder"
    reads: "`specs/landing-pages/products.kmd`"
    specs:
      - meta/docs/stack/specs/landing-pages/products.kmd
    mode: consult
    paths:
      - "products*/landing/**"
  - id: landing-page-area
    action: "Landing page de **Área**"
    reads: "`specs/landing-pages/areas.kmd`"
    specs:
      - meta/docs/stack/specs/landing-pages/areas.kmd
    mode: consult
  - id: landing-page-sector
    action: "Landing page de **Sector**"
    reads: "`specs/landing-pages/sectors.kmd`"
    specs:
      - meta/docs/stack/specs/landing-pages/sectors.kmd
    mode: consult
    paths:
      - "services*/landing/**"
      - "engines*/landing/**"
      - "infra*/landing/**"
  - id: landing-institucional
    action: "Landing **institucional**"
    reads: "`specs/landing-pages/institutional.kmd`"
    specs:
      - meta/docs/stack/specs/landing-pages/institutional.kmd
    mode: consult
  - id: landing-catalogo
    action: "Landing de **catálogo**"
    reads: "`specs/landing-pages/catalog.kmd`"
    specs:
      - meta/docs/stack/specs/landing-pages/catalog.kmd
    mode: consult
  - id: landing-spec-formato-aberto-kvg-kpkg
    action: "Landing de **spec / formato aberto** (KVG, KPKG, KMD, RFC pública)"
    reads: "`specs/landing-pages/specs.kmd`"
    specs:
      - meta/docs/stack/specs/landing-pages/specs.kmd
    mode: consult
  - id: pagina-pacote-hub
    action: "Página de **pacote** no Hub (`hub.koder.dev/{apps,skills,bundles}/{slug}`)"
    reads: "`specs/landing-pages/packages.kmd`"
    specs:
      - meta/docs/stack/specs/landing-pages/packages.kmd
    mode: consult
  - id: icone-produto
    action: "Ícone de produto"
    reads: "`specs/icons/products.kmd` + `specs/icons/generation-targets.kmd` (rodar `kicon generate`, nunca PNG à mão)"
    specs:
      - meta/docs/stack/specs/icons/products.kmd
      - meta/docs/stack/specs/icons/generation-targets.kmd
    mode: consult
    paths:
      - "**/icon.svg"
  - id: leva-icones-presentation
    action: "Apresentar uma **leva de ícones** candidatos pro owner escolher (aprovar/reprovar/excluir)"
    reads: "`policies/icon-batch-presentation.kmd` (engenharia obrigatória + batch durável em `meta/brand/icons/candidates/` + galeria de triagem padrão `triage-gen.py`; nunca folha PNG ad-hoc)"
    specs:
      - meta/docs/stack/policies/icon-batch-presentation.kmd
    mode: consult
    paths:
      - "meta/brand/icons/candidatesmanifest.toml"
  - id: leva-nomes-presentation
    action: "Apresentar uma **leva de nomes** candidatos pro owner escolher (aprovar/reprovar/excluir/guardar-pra-reuso); gerar sugestões de nome pra um componente"
    reads: "`policies/name-batch-presentation.kmd` (spec de naming rodada antes — colisão exact-match + slug R4; banco durável `meta/brand/names/bank.json` com reuso cross-componente; triagem padrão `name-triage.py serve`; nunca tabela ad-hoc no chat)"
    specs:
      - meta/docs/stack/policies/name-batch-presentation.kmd
    mode: consult
    paths:
      - "meta/brand/names/bank.json"
  - id: readme-produto
    action: "README de produto"
    reads: "`specs/readmes/products.kmd`"
    specs:
      - meta/docs/stack/specs/readmes/products.kmd
    mode: consult
    paths:
      - "products*/README.md"
  - id: tema-claro-escuro-ui-koder-mobile
    action: "Tema claro/escuro em qualquer UI Koder (mobile/desktop/TV/web/landing)"
    reads: "`specs/themes/light-dark.kmd`"
    specs:
      - meta/docs/stack/specs/themes/light-dark.kmd
    mode: consult
  - id: tokens-visuais-cor-forma-espaco-sombra
    action: "Tokens visuais (cor/forma/espaço/sombra/font) em qualquer UI Koder"
    reads: "`specs/themes/verge.kmd`"
    specs:
      - meta/docs/stack/specs/themes/verge.kmd
    mode: consult
  - id: tipografia-ui-koder
    action: "Tipografia / `@font-face` / `font-family` em qualquer UI Koder"
    reads: "`specs/fonts/typography.kmd`"
    specs:
      - meta/docs/stack/specs/fonts/typography.kmd
    mode: consult
  - id: strings-ui-suporte-i18n
    action: "Strings de UI / suporte a i18n"
    reads: "`policies/language.kmd` + `specs/koder-app/behaviors.kmd §9` + `specs/i18n/contract.kmd`"
    specs:
      - meta/docs/stack/policies/language.kmd
      - meta/docs/stack/specs/koder-app/behaviors.kmd
      - meta/docs/stack/specs/i18n/contract.kmd
    mode: consult
  - id: empacotar-renomear-binario-cli-desktop-app
    action: "Empacotar/renomear binário/CLI/desktop app"
    reads: "`specs/binaries-and-cli/naming.kmd`"
    specs:
      - meta/docs/stack/specs/binaries-and-cli/naming.kmd
    mode: consult
  - id: criar-binario-desktop-cli-tui-novo
    action: "Criar binário desktop/CLI/TUI novo, OU add/modificar argv parsing"
    reads: "`specs/binaries-and-cli/standard-flags.kmd`"
    specs:
      - meta/docs/stack/specs/binaries-and-cli/standard-flags.kmd
    mode: consult
  - id: mensagem-erro-user-facing-mobile-desktop
    action: "Mensagem de erro user-facing (mobile/desktop/web/CLI)"
    reads: "`specs/errors/user-facing-messages.kmd`"
    specs:
      - meta/docs/stack/specs/errors/user-facing-messages.kmd
    mode: consult
  - id: assinatura-digital-validade-juridica-br-pades
    action: "Assinatura digital com validade jurídica BR (PAdES/CAdES/XAdES, ICP-Brasil)"
    reads: "`specs/signing/icp-brasil.kmd`"
    specs:
      - meta/docs/stack/specs/signing/icp-brasil.kmd
    mode: consult
  - id: novo-app-koder-binding-sdk-auth
    action: "Novo app Koder ou binding SDK; auth/telemetria/updates/IPC/branding em UI"
    reads: "`specs/koder-app/behaviors.kmd`"
    specs:
      - meta/docs/stack/specs/koder-app/behaviors.kmd
    mode: consult
  - id: ipc-entre-apps-koder
    action: "IPC entre apps Koder"
    reads: "`specs/ipc/protocol.kmd`"
    specs:
      - meta/docs/stack/specs/ipc/protocol.kmd
    mode: consult
  - id: layout-tela-app-koder-mobile-desktop
    action: "Layout de tela em app Koder (mobile/desktop/TV/web PWA)"
    reads: "`specs/app-layout/safe-area.kmd`"
    specs:
      - meta/docs/stack/specs/app-layout/safe-area.kmd
    mode: consult
  - id: posicionar-avatar-placement
    action: "Posicionar `KoderUserBadge`/`KoderSignInButton`; avatar placement"
    reads: "`specs/app-layout/topbar-placement.kmd`"
    specs:
      - meta/docs/stack/specs/app-layout/topbar-placement.kmd
    mode: consult
  - id: navegacao-botao-voltar-esc-desktop
    action: "Navegação / botão voltar / ESC desktop"
    reads: "`specs/navigation/back-behavior.kmd`"
    specs:
      - meta/docs/stack/specs/navigation/back-behavior.kmd
    mode: consult
  - id: barra-titulo-customizada-desktop-variant-drag
    action: "Barra de título customizada em desktop variant (drag/duplo-clique)"
    reads: "`specs/desktop-apps/title-bar-double-click.kmd`"
    specs:
      - meta/docs/stack/specs/desktop-apps/title-bar-double-click.kmd
    mode: consult
  - id: url-web-app-oauth-web-deploy
    action: "URL de web app, OAuth `redirect_uri` web, deploy Flutter web"
    reads: "`specs/landing-pages/products.kmd §Padrão de URL`"
    specs:
      - meta/docs/stack/specs/landing-pages/products.kmd
    mode: consult
  - id: botao-download-landing
    action: "Botão **Download** em landing"
    reads: "`specs/landing-pages/download-button.kmd`"
    specs:
      - meta/docs/stack/specs/landing-pages/download-button.kmd
    mode: consult
  - id: login-sign-in-user-badge-app
    action: "Login / sign-in / user badge em app Koder"
    reads: "`specs/koder-app/behaviors.kmd §1` + `specs/auth/oauth-flow.kmd` + `specs/auth/oauth-flow-test-template.kmd`"
    specs:
      - meta/docs/stack/specs/koder-app/behaviors.kmd
      - meta/docs/stack/specs/auth/oauth-flow.kmd
      - meta/docs/stack/specs/auth/oauth-flow-test-template.kmd
    mode: consult
  - id: implementar-oauth-oidc-client-componente-koder
    action: "Implementar OAuth/OIDC client em qualquer componente Koder"
    reads: "`specs/auth/oauth-flow.kmd`"
    specs:
      - meta/docs/stack/specs/auth/oauth-flow.kmd
    mode: consult
  - id: passkey-webauthn-registro-login-passkey-first
    action: "Passkey / WebAuthn: registro, login passkey-first (passwordless), ou config do Relying Party (RPID/origins) em qualquer surface Koder"
    reads: "`specs/auth/passkeys.kmd`"
    specs:
      - meta/docs/stack/specs/auth/passkeys.kmd
    mode: consult
  - id: conectar-conta-externa-google-microsoft-github
    action: "Conectar conta externa (Google/Microsoft/GitHub) p/ ler dados do usuário (Gmail/Drive/Cloud/Outlook/repos); pedir escopo de provedor; guardar/refrescar token OAuth de terceiro"
    reads: "`specs/auth/oauth-client-external-providers.kmd`"
    specs:
      - meta/docs/stack/specs/auth/oauth-client-external-providers.kmd
    mode: consult
  - id: resolucao-campo-mail-login-bare-username
    action: "Resolução do campo \"E-mail\" do login (bare username vs email completo)"
    reads: "`specs/identity/login-resolution.kmd` + `specs/identity/login-resolution-test-template.kmd`"
    specs:
      - meta/docs/stack/specs/identity/login-resolution.kmd
      - meta/docs/stack/specs/identity/login-resolution-test-template.kmd
    mode: consult
  - id: criar-usuario-teste-fixture-seed-ambiente
    action: "Criar usuário de teste / fixture / seed em ambiente dev/stg"
    reads: "`policies/dev-default-password.kmd`"
    specs:
      - meta/docs/stack/policies/dev-default-password.kmd
    mode: consult
  - id: auto-update-verificacao-versao-tela-updates
    action: "Auto-update / verificação de versão / tela de updates"
    reads: "`specs/koder-app/behaviors.kmd §4`"
    specs:
      - meta/docs/stack/specs/koder-app/behaviors.kmd
    mode: consult
  - id: reporting-erro-botao-reportar-problema-auto
    action: "Reporting de erro / botão \"Reportar problema\" / auto-report toggle"
    reads: "`specs/errors/reporting.kmd`"
    specs:
      - meta/docs/stack/specs/errors/reporting.kmd
    mode: consult
  - id: wake-word-talk-mode-mic-capability
    action: "Wake-word / Talk Mode / mic capability"
    reads: "`specs/voice/wake-word.kmd`"
    specs:
      - meta/docs/stack/specs/voice/wake-word.kmd
    mode: consult
  - id: schema-endpoint-storage-queue-cron-novo
    action: "Schema/endpoint/storage/queue/cron novo que toca dado de usuário"
    reads: "`policies/multi-tenant-by-default.kmd` + `specs/multi-tenancy/contract.kmd`"
    specs:
      - meta/docs/stack/policies/multi-tenant-by-default.kmd
      - meta/docs/stack/specs/multi-tenancy/contract.kmd
    mode: consult
  - id: coletar-persistir-dado-autenticacao-koder-id
    action: "Coletar/persistir dado de autenticação no Koder ID (IP/UA/geo/device/ASN)"
    reads: "`policies/identity-data-retention.kmd`"
    specs:
      - meta/docs/stack/policies/identity-data-retention.kmd
    mode: consult
  - id: decisao-qual-storage-backend-postgres-kdb
    action: "Decisão de **qual** storage backend (Postgres/kdb-next/Redis/Timescale/S3/vector)"
    reads: "`rfcs/stack-RFC-001-kdb-as-unified-data-plane.kmd`"
    specs:
      - meta/docs/stack/rfcs/stack-RFC-001-kdb-as-unified-data-plane.kmd
    mode: consult
  - id: wire-format-rpc-protocolo-rollout-deploy
    action: "Wire format/RPC/protocolo; rollout/deploy; migrar schema; op longa sem checkpoint; single-region; cross-surface"
    reads: "`policies/always-on.kmd`"
    specs:
      - meta/docs/stack/policies/always-on.kmd
    mode: consult
  - id: instrumentar-log-metrica-trace-nomear-metrica
    action: "Instrumentar log/métrica/trace; nomear métrica ou label; definir SLO/alerta; logar dado com possível PII; escolher backend de telemetria"
    reads: "`policies/observability-first.kmd`"
    specs:
      - meta/docs/stack/policies/observability-first.kmd
    mode: consult
  - id: padrao-cross-cutting-tema-layout-nav
    action: "Padrão cross-cutting (tema/layout/nav/auth/erros/telemetria/update/i18n/IPC/log/store)"
    reads: "`policies/reuse-first.kmd`"
    specs:
      - meta/docs/stack/policies/reuse-first.kmd
    mode: consult
  - id: escolher-entre-opcoes-abordagens-arquiteturais-avaliar
    action: "Escolher entre opções/abordagens arquiteturais; avaliar trade-off de design; desempate do `/k-go`"
    reads: "`policies/architecture-quality.kmd` + `policies/stack-principles.kmd §2`"
    specs:
      - meta/docs/stack/policies/architecture-quality.kmd
      - meta/docs/stack/policies/stack-principles.kmd
    mode: consult
  - id: criar-modificar-ui-componente-koder-inclui
    action: "Criar/modificar UI em qualquer componente Koder (inclui bug fix em render/layout/input/animação)"
    reads: "`policies/headless-first.kmd`"
    specs:
      - meta/docs/stack/policies/headless-first.kmd
    mode: consult
  - id: inspecionar-ui-android-adb
    action: "Inspecionar UI Android via ADB"
    reads: "`policies/android-ui-inspection.kmd`"
    specs:
      - meta/docs/stack/policies/android-ui-inspection.kmd
    mode: consult
  - id: acessar-device-android-adb-usb-wi
    action: "Acessar device Android via ADB (USB ou Wi-Fi)"
    reads: "`policies/device-mirror-during-ai-access.kmd`"
    specs:
      - meta/docs/stack/policies/device-mirror-during-ai-access.kmd
    mode: consult
  - id: acessar-celular-owner-lock
    action: "Acessar o celular físico do owner via ADB/IRIS (tap/texto/screencap/am start/instalar/inspeção/mirror)"
    reads: "`policies/device-access-lock.kmd`"
    specs:
      - meta/docs/stack/policies/device-access-lock.kmd
    mode: consult
  - id: novo-doc-spec-rfc-readme-runbook
    action: "Novo doc/spec/RFC/README/runbook (criar/renomear/mover)"
    reads: "`policies/document-format.kmd`"
    specs:
      - meta/docs/stack/policies/document-format.kmd
    mode: consult
  - id: onde-colocar-novo-doc-spec-rfc
    action: "**Onde** colocar novo doc/spec/RFC/runbook/ADR/post-mortem/catálogo"
    reads: "`policies/content-location.kmd`"
    specs:
      - meta/docs/stack/policies/content-location.kmd
    mode: consult
  - id: vhost-tls-redirect-static-reverse-proxy
    action: "Vhost / TLS / redirect / static / reverse proxy / sugerir web server"
    reads: "`policies/web-server.kmd` (sempre Koder Jet)"
    specs:
      - meta/docs/stack/policies/web-server.kmd
    mode: consult
  - id: publicar-pagina-ambiente-dev-stg-prd
    action: "Publicar página em qualquer ambiente (dev/stg/prd)"
    reads: "`policies/environments.kmd`"
    specs:
      - meta/docs/stack/policies/environments.kmd
    mode: consult
  - id: escolher-entre-koder-externo-koda-vs
    action: "Escolher entre Koder e externo (Koda vs Rust, kodec vs FFmpeg, kdb-next vs Postgres)"
    reads: "`policies/self-hosted-first.kmd` + `registries/self-hosted-pairs.md`"
    specs:
      - meta/docs/stack/policies/self-hosted-first.kmd
      - meta/docs/stack/registries/self-hosted-pairs.md
    mode: consult
  - id: implementar-solucao-self-hosted-importa-dados
    action: "Implementar solução self-hosted que **importa** dados/pacotes/informação externa (geodados, células, modelos, espelhos, rankings de pesquisa)"
    reads: "`policies/self-hosted-data-refresh.kmd` (refresh periódico R1–R4 by design)"
    specs:
      - meta/docs/stack/policies/self-hosted-data-refresh.kmd
    mode: consult
  - id: versao-ui-plataforma-paridade-entre-instalacoes
    action: "\"Versão de UI/plataforma\" / paridade entre instalações"
    reads: "`specs/variants/taxonomy.kmd`"
    specs:
      - meta/docs/stack/specs/variants/taxonomy.kmd
    mode: consult
  - id: editar-build-ci-koda
    action: "Editar `engines/lang/koda/Makefile` ou build/CI de Koda"
    reads: "`engines/lang/koda/policies/full-self-hosted.kmd`"
    specs:
      - engines/lang/koda/policies/full-self-hosted.kmd
    mode: consult
    paths:
      - "engines/lang/koda/Makefile"
  - id: adicionar-modificar-value-type-intrinseco-koda
    action: "Adicionar/modificar value type ou intrínseco no Koda"
    reads: "`engines/lang/koda/policies/full-oop.kmd`"
    specs:
      - engines/lang/koda/policies/full-oop.kmd
    mode: consult
  - id: editar-runtime-koda-helpers-alocador-gc
    action: "Editar runtime do Koda (`_rt_*` helpers, alocador, GC, syscall wrappers)"
    reads: "`meta/docs/stack/policies/runtime-source-of-truth.kmd`"
    specs:
      - meta/docs/stack/policies/runtime-source-of-truth.kmd
    mode: consult
  - id: editar-policy-global-category-component
    action: "Editar qualquer policy `.kmd` (global/category/component)"
    reads: "`meta/docs/stack/rfcs/policies-RFC-003-component-policies-hierarchy.kmd`"
    specs:
      - meta/docs/stack/rfcs/policies-RFC-003-component-policies-hierarchy.kmd
    mode: consult
    paths:
      - "meta/docs/stack/policies
policies/*.kmd"
  - id: criar-comando-slash-novo-add-remover
    action: "Criar comando slash `/k-*` novo; add/remover argumento ou flag; editar `description` de comando em `meta/context/commands/`"
    reads: "`policies/command-arguments.kmd`"
    specs:
      - meta/docs/stack/policies/command-arguments.kmd
    mode: consult
    paths:
      - "meta/context/commands