Spec triggers registry
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óriosdemeta/context/CLAUDE.mdé geradapor
koder-spec-audit triggers --writeentre 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 dacoluna "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 JITjit-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 SEMpathsnão são inferíveis por path (gatilho semântico — ex.: "escolher storage backend"); cobertura do hook cresce adicionandopathsaqui, sem mudar código. Calibrar pra baixo falso-positivo (RFC-014fp_budgetmindset): 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 (estadoatual 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 — exigekanon_bindingscomfp_budgetna spec alvo, RFC-014 R3). Promoverconsult→inject→gateé mudança normativa: exige menção no ticket que a promove. Nota fase 3: o hook JIT (PostToolUse, não-bloqueante) usapathscomo matcher e injeta lembrete mesmo emmode: consult— a promoção ainjectformaliza a obrigação, mas o lembrete-guia é universal onde houverpaths. - *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