Como os arquétipos de função são modelados
A semântica do enum role_archetype, a FK succeeds_role_id, o portão de citações que reforça itens fundamentados em SMC em funções prontas para o futuro, e o registro de mudanças.
O enum role_archetype
A tabela roles do RPF carrega uma coluna role_archetype (enum Postgres) com três valores mais um estado NULL explícito. O enum é o que cada consumidor do catálogo de funções utiliza como chave — o distintivo de arquétipo, o filtro de catálogo, o seletor de alvo da diferença, o mapa metrô (M18.4) e o contexto dos chips do agente.
legacyFunção de hoje — ponto de partida de uma transformação. Publicada sem fechamento por citações. Documenta a prática atual.
future_readyA função para a qual estamos nos transformando. O portão de citações é aplicado no momento da publicação: cada item deve carregar ≥1 citação SMC.
hybridUm passo de transição entre legada e pronta para o futuro. Publicada sem fechamento por citações; útil para marcar movimentos parciais que um mercado está fazendo hoje.
NULL significa "ainda não classificada". Linhas publicadas antes da M18.3.1 são NULL até que um administrador as abra no builder e escolha um arquétipo. O distintivo é suprimido para linhas NULL.
succeeds_role_id — a FK de sucessor
Cada função pode carregar succeeds_role_id, uma chave estrangeira autorreferenciada apontando para a função da qual esta se transforma. A restrição é definida no nível do banco (db/schema.ts §40-47), com um índice em (succeeds_role_id) para que a busca do alvo de diferença seja O(1).
A FK é nula. Funções prontas para o futuro tipicamente não têm sucessor (são o destino); funções legadas e híbridas tipicamente apontam para a frente para uma sucessora pronta para o futuro publicada. A FK não reforça consistência de formato de arquétipo — isso é uma regra de validação no momento da publicação, não uma restrição do banco.
O portão de citações (Transformation Citations)
Na publicação de uma função cujo arquétipo é future_ready, o RPF valida que cada item anexado à função carrega pelo menos uma fonte citada do registro SMC. O portão é implementado no caminho de publicação de função (a PR #217 entregou isso) — ele retorna um erro de validação estruturado por item-faltando-citação, que o builder de funções renderiza em linha próximo à linha ofensora.
O portão não valida em salvamento como rascunho nem em propostas intermediárias; apenas o caminho final de publicação o aplica. Isso mantém a experiência de autoria fluida: você pode esboçar uma função pronta para o futuro com itens não citados em rascunho e, em seguida, percorrer a lista de citações antes de publicar.
Arquétipos legada e híbrida são isentos do portão. Eles documentam prática observada, que é fundamentada na própria superfície em vez de em uma citação. Se quiser citar itens híbridos mesmo assim, a UI padrão de fontes citadas continua disponível — o portão simplesmente não obriga.
Casos limite
- Uma função com role_archetype = NULL renderiza sem distintivo e é excluída dos filtros por arquétipo, a menos que o filtro "não definido" seja escolhido explicitamente. É publicável até que um administrador defina o arquétipo, ponto em que o fechamento de pronto para o futuro entra em vigor retroativamente.
- Uma função não pode suceder a si mesma (succeeds_role_id = id). A FK no nível do banco não impõe isso; o validador do caminho de publicação captura.
- Se succeeds_role_id aponta para uma função arquivada/não publicada, o vínculo de sucessor na UI mostra um aviso "sucessor arquivado"; o alvo da diferença recai para o override ?vs=.
- Citações em itens de rascunho não contam para o portão de citações até que o próprio item seja publicado; o portão é executado sobre o conjunto de itens publicados da função no momento da publicação.
- Mudar o arquétipo de legada → pronta para o futuro em uma função publicada existente reexecuta o portão de citações na próxima publicação; itens não citados bloqueiam a troca até que carreguem citações ou sejam removidos.
Camada de estabilidade
O enum role_archetype e a FK succeeds_role_id estão na camada de estabilidade beta. Adicionar um quarto arquétipo (por exemplo "experimental") seria uma mudança aditiva no enum e não exigiria uma versão maior; remover ou renomear um valor existente exigiria. Mudanças de esquema são guiadas pelo journal (db/migrations/meta/_journal.json); mudanças de formato serão chamadas no registro de mudanças.