prometeu-runtime/docs/runtime/agendas/025-cartridge-manifest-entrypoint-removal-and-runtime-protocol.md

4.3 KiB

Agenda - Cartridge Manifest Entrypoint Removal and Runtime Protocol

Problema

O runtime ainda trata entrypoint como dado vindo do manifest.json.

Hoje isso aparece em mais de uma camada:

  • o manifest.json carrega entrypoint;
  • o loader desserializa e propaga esse campo;
  • o Cartridge e o CartridgeDTO preservam esse valor;
  • o runtime system passa esse valor para a VM;
  • e a VM ainda resolve boot usando string nominal, índice numérico ou fallback vazio.

Ao mesmo tempo, a linha nova do compiler/PBS está convergindo para outro modelo:

  • o compiler publica um wrapper sintético como entrypoint físico;
  • esse wrapper deve ocupar o índice físico 0;
  • e o entrypoint deixa de ser uma escolha configurável no manifesto para virar protocolo fixo do artefato.

Isso cria uma divergência concreta entre contrato atual do runtime e direção desejada do compiler.

Dor

  • O runtime mantém autoridade duplicada com o compiler sobre qual callable inicia o programa.
  • O loader continua aceitando modelo nominal de entrypoint que o compiler quer abandonar.
  • O manifest.json carrega responsabilidade que deveria pertencer ao protocolo executável.
  • O caminho atual mistura:
    • resolução nominal por export,
    • resolução por índice,
    • e fallback implícito.
  • Essa flexibilidade aumenta superfície de erro e enfraquece determinismo do boot.

Alvo da Discussao

Definir a remoção de entrypoint do manifest.json e a migração do runtime para um protocolo fixo em que o entrypoint executável do cartucho é sempre o índice 0.

O objetivo não é apenas "apagar um campo JSON".

Precisamos fechar:

  • novo contrato do loader;
  • impacto em CartridgeManifest, CartridgeDTO e Cartridge;
  • impacto em VirtualMachine::initialize(...);
  • impacto em VirtualMachineRuntime;
  • política de compatibilidade transitória;
  • e a superfície de erro quando o artefato não cumprir o protocolo esperado.

O Que Precisa Ser Definido

  1. Contrato final do manifest. O campo entrypoint deixa de existir por completo?

  2. Contrato final do loader. O loader deve parar de propagar qualquer entrypoint textual e assumir sempre boot pelo índice 0?

  3. Contrato final da VM. VirtualMachine::initialize(...) continua recebendo entrypoint: &str, ou a API deve ser endurecida para boot protocolar sem parâmetro textual?

  4. Compatibilidade transitória. O runtime aceita manifestos antigos com entrypoint por um período, ignora com warning, ou rejeita explicitamente?

  5. Superfície de erro. Qual erro canônico deve aparecer quando o artefato não tiver função válida no índice 0?

  6. Relação com exports nominais. Exports continuam existindo para linking/introspection, mas deixam de participar da autoridade de boot?

Contexto Atual Observado

Hoje o acoplamento aparece ao menos nestes pontos do runtime:

  • prometeu-hal:
    • CartridgeManifest.entrypoint
    • CartridgeDTO.entrypoint
    • Cartridge.entrypoint
  • cartridge_loader:
    • leitura e propagação de manifest.entrypoint
  • prometeu-system:
    • initialize_vm() repassa cartridge.entrypoint
    • current_entrypoint ainda é rastreado
  • prometeu-vm:
    • initialize(program_bytes, entrypoint)
    • resolução por string, índice ou fallback

Isso mostra que a mudança necessária é funcional e estrutural, não apenas uma validação de manifesto.

O Que Necessita Para Resolver

  • decisão clara sobre estado final do protocolo;
  • decisão clara sobre compatibilidade transitória;
  • inventário de tipos/APIs a alterar no runtime;
  • atualização de testes de loader, system runtime e VM init;
  • alinhamento com spec do cartridge manifest e com a política de func_id = 0.

Fora de Escopo

  • discutir novamente qual callable do usuário é o root lógico;
  • discutir wrapper sintético do compiler em detalhe;
  • discutir lowering FE/BE do compiler;
  • redesign geral do formato manifest.json além do campo entrypoint.

Critério de Saida Desta Agenda

Pode virar decision quando houver definição escrita de:

  • remoção ou não de entrypoint do manifest como contrato final;
  • política de transição para cartuchos antigos;
  • novo contrato do loader/VM para boot em índice 0;
  • erros canônicos quando o protocolo não for satisfeito;
  • e escopo mínimo de mudanças de código e testes no runtime.