235 lines
9.6 KiB
Markdown
235 lines
9.6 KiB
Markdown
---
|
|
id: AGD-0001
|
|
ticket: runtime-edge-test-plan
|
|
title: Agenda - Runtime Edge Test Plan
|
|
status: done
|
|
created: 2026-03-27
|
|
resolved: 2026-04-20
|
|
decision: DEC-0020
|
|
tags: []
|
|
---
|
|
|
|
# Agenda - Runtime Edge Test Plan
|
|
|
|
## Problema
|
|
|
|
A borda do runtime deixou de ser "quase sem testes", mas continua sem contrato claro de suficiência por dominio.
|
|
|
|
Hoje já existe cobertura relevante para runtime edge, `VirtualFS`, asset/preload, status-first surfaces e parte do host. O problema atual não é ausência total de testes, e sim falta de uma régua explícita que diga quando um domínio está aceitavelmente coberto e que tipo de mudança deve obrigar novos testes.
|
|
|
|
## Dor
|
|
|
|
- Coverage global do workspace não prova que os domínios de maior risco estão realmente cobertos.
|
|
- Regressões de firmware, boot, host integration e superfícies status-first ainda podem passar com números globais "bons".
|
|
- Sem gates por domínio, futuras PRs tendem a melhorar percentuais agregados sem fechar cenários obrigatórios.
|
|
- A suíte atual está funcional, mas concentrada demais, o que dificulta enxergar lacunas e manter responsabilidade por domínio.
|
|
|
|
## Alvo da Discussao
|
|
|
|
Definir uma política mínima de cobertura para a borda do runtime proporcional ao risco da plataforma.
|
|
|
|
Essa agenda deve produzir uma visão clara de:
|
|
|
|
- quais domínios têm gate próprio;
|
|
- quais cenários mínimos cada domínio deve cobrir;
|
|
- como coverage entra como evidência operacional, sem substituir a matriz qualitativa;
|
|
- que mudanças devem obrigar teste novo antes de merge.
|
|
|
|
## O Que Precisa Ser Definido
|
|
|
|
1. Matriz de cobertura por domínio.
|
|
- system/runtime
|
|
- fs
|
|
- asset/bank
|
|
- firmware transitions
|
|
- host-dependent surfaces quando aplicável
|
|
|
|
2. Tipos de teste.
|
|
- unitário puro
|
|
- integração entre runtime e VM
|
|
- testes de firmware
|
|
- testes host-dependentes isolados
|
|
|
|
3. Gates de aceitação por domínio.
|
|
Cada domínio precisa definir ao menos:
|
|
- cenários obrigatórios;
|
|
- tipo de evidência esperada;
|
|
- leitura de coverage por domínio como evidência obrigatória de revisão;
|
|
- como o gate por domínio evolui ao longo do tempo sem bloquear a adoção inicial.
|
|
|
|
4. Critério de severidade.
|
|
Que mudanças exigem teste novo obrigatório antes de merge, mesmo que o percentual global de coverage continue aceitável.
|
|
|
|
5. Organização.
|
|
Onde os testes vivem para nao voltar a concentrar tudo em arquivos gigantes e para manter ownership claro por domínio.
|
|
|
|
## O Que Ainda Precisa Ser Fechado
|
|
|
|
- definição dos domínios canônicos e seus respectivos gates;
|
|
- definição dos cenários mínimos obrigatórios por domínio;
|
|
- política mínima para testes host-dependentes e `#[ignore]`;
|
|
- regra de convivência entre gate global de coverage e leitura segmentada por domínio;
|
|
- diretriz de organização para quebrar suites monolíticas de runtime.
|
|
|
|
## Opcoes
|
|
|
|
### Opcao A - Gate apenas global de coverage
|
|
|
|
- **Abordagem:** manter somente o percentual agregado do workspace como barra de aceitação.
|
|
- **Pro:** simples de operar e fácil de automatizar no CI.
|
|
- **Con:** permite que domínios sensíveis continuem subcobertos enquanto o número global sobe.
|
|
- **Manutenibilidade:** boa operacionalmente, ruim como governança de risco.
|
|
|
|
### Opcao B - Gate percentual rígido por domínio desde o início
|
|
|
|
- **Abordagem:** exigir percentuais mínimos por domínio já na primeira versão da política.
|
|
- **Pro:** força disciplina quantitativa explícita por área.
|
|
- **Con:** cria atrito alto de adoção, exige segmentação mais sofisticada e pode travar a convergência inicial por falta de baseline confiável.
|
|
- **Manutenibilidade:** média; forte no longo prazo, pesada demais para o ponto atual do projeto.
|
|
|
|
### Opcao C - Gate global de coverage + gate por domínio com coverage como evidência incremental
|
|
|
|
- **Abordagem:** manter gate global obrigatório no CI e adotar gate por domínio baseado em cenários mandatórios e leitura de coverage segmentada como evidência. Baselines percentuais por domínio podem começar em `0` e subir com o tempo conforme a suíte amadurece.
|
|
- **Pro:** combina disciplina prática imediata com caminho realista para endurecer a barra por domínio sem bloquear a adoção.
|
|
- **Con:** exige revisão mais criteriosa, porque a aceitação não fica reduzida a um único número.
|
|
- **Manutenibilidade:** alta; permite endurecimento progressivo sem perder governança qualitativa.
|
|
|
|
## Sugestao / Recomendacao
|
|
|
|
Fechar esta agenda com a `Opcao C`: uma matriz pequena de domínios canônicos, gate global obrigatório de coverage e gate por domínio baseado em cenários mandatórios, usando leitura segmentada de `llvm-cov` como evidência de revisão e baseline quantitativo incremental.
|
|
|
|
### Domínios canônicos propostos
|
|
|
|
1. `system/runtime`
|
|
2. `fs`
|
|
3. `asset/bank`
|
|
4. `firmware`
|
|
5. `host-dependent`
|
|
|
|
### Gates propostos por domínio
|
|
|
|
#### `system/runtime`
|
|
|
|
Cenários mínimos:
|
|
|
|
- `init`
|
|
- `reset / cleanup`
|
|
- `trap vs panic`
|
|
- `pause / breakpoint`
|
|
- fronteira de `FRAME_SYNC` e budget
|
|
|
|
Regra de aceitação:
|
|
|
|
- qualquer mudança em lifecycle, tick, crash/report, pause/debug flow ou syscall de sistema deve adicionar ou ajustar testes desse domínio;
|
|
- coverage global não substitui a obrigação de cobrir o cenário alterado.
|
|
|
|
#### `fs`
|
|
|
|
Cenários mínimos:
|
|
|
|
- happy path;
|
|
- path inválido / traversal;
|
|
- backend unhealthy;
|
|
- cleanup de handles e estado após reset/unmount quando aplicável.
|
|
|
|
Regra de aceitação:
|
|
|
|
- qualquer mudança em normalização de path, mount/unmount, handles ou contrato guest-host de filesystem deve adicionar ou ajustar testes desse domínio.
|
|
|
|
#### `asset/bank`
|
|
|
|
Cenários mínimos:
|
|
|
|
- preload;
|
|
- `load / status / commit / cancel`;
|
|
- asset ausente;
|
|
- slot inválido;
|
|
- erro estrutural de bootstrap vs erro operacional em runtime.
|
|
|
|
Regra de aceitação:
|
|
|
|
- qualquer mudança em cartridge loader, preload, asset bridge, slot telemetry ou semântica status-first deve adicionar ou ajustar testes desse domínio.
|
|
|
|
#### `firmware`
|
|
|
|
Cenários mínimos:
|
|
|
|
- fluxo de load do cart;
|
|
- branch por `AppMode`;
|
|
- falha de init levando ao crash path;
|
|
- coordenação básica de boot target e transição de estado.
|
|
|
|
Regra de aceitação:
|
|
|
|
- qualquer mudança em boot flow, cartridge launch, state transition ou crash path deve adicionar ou ajustar testes desse domínio.
|
|
|
|
Observação:
|
|
|
|
- este é o domínio com maior lacuna atual e deve ser a prioridade principal de expansão da suíte.
|
|
|
|
#### `host-dependent`
|
|
|
|
Cenários mínimos:
|
|
|
|
- superfícies que dependem de socket, janela ou integração desktop devem ficar isoladas;
|
|
- quando possível, a parte determinística da regra deve existir também em teste console/runtime.
|
|
|
|
Regra de aceitação:
|
|
|
|
- testes `#[ignore]` são permitidos quando dependem de infraestrutura local real, mas devem trazer justificativa explícita;
|
|
- mudanças host-only não podem empurrar comportamento determinístico para testes exclusivamente desktop quando esse comportamento puder ser validado abaixo do host.
|
|
|
|
Observação:
|
|
|
|
- `host-dependent` não é um subsistema funcional paralelo a `fs` ou `firmware`; é um corte transversal de testabilidade e execução que governa onde certos testes podem viver e como devem ser justificados.
|
|
|
|
### Uso de coverage
|
|
|
|
- `coverage` global via `cargo llvm-cov` continua como gate operacional mínimo do CI;
|
|
- leitura segmentada por domínio deve ser usada como evidência obrigatória de revisão quando uma mudança tocar área sensível;
|
|
- percentuais por domínio podem começar em baseline `0` e subir progressivamente conforme o projeto estabiliza a segmentação e a matriz de testes;
|
|
- percentual global aceitável não dispensa cobertura dos cenários mandatórios do domínio afetado.
|
|
|
|
### Prioridades sugeridas
|
|
|
|
1. expandir cobertura de `firmware`;
|
|
2. consolidar política de `host-dependent`;
|
|
3. quebrar a suíte monolítica de `system/runtime` por responsabilidade, conforme os domínios forem sendo tocados;
|
|
4. manter `fs` e `asset/bank` como domínios já relativamente encaminhados, mas ainda sob gate explícito.
|
|
|
|
### Barra sugerida para PRs
|
|
|
|
- nenhum PR que altere domínio canônico deve entrar sem tocar testes do domínio afetado, ou sem justificar explicitamente por que o contrato observável não mudou;
|
|
- melhoria de coverage agregada é desejável, mas não conta como evidência suficiente sem cenário alinhado ao domínio alterado.
|
|
|
|
## Perguntas em Aberto
|
|
|
|
- Nenhuma ambiguidade arquitetural substantiva restante para fechar a política base.
|
|
- O endurecimento quantitativo por domínio fica explicitamente como evolução incremental a partir de baseline inicial `0`, sem bloquear a adoção imediata da política.
|
|
|
|
## Estado Atual Relevante
|
|
|
|
- O repositório já possui targets de coverage com `cargo llvm-cov` no `Makefile`.
|
|
- O CI já aplica gate global mínimo de coverage via Jenkins.
|
|
- O runtime já possui cobertura relevante para traps, status-first, assets, composer, audio, memcard e reset.
|
|
- `VirtualFS` já cobre parte importante do contrato de path normalization e rejeições antes do backend.
|
|
- Ainda falta tratar firmware transitions e superfícies host-dependent como domínios explicitamente governados pela agenda.
|
|
|
|
## Fora de Escopo
|
|
|
|
- benchmark/performance suite;
|
|
- fuzzing completo de toda a ISA;
|
|
- troca de ferramenta de coverage;
|
|
- perseguir 100% global como objetivo primário;
|
|
- transformar coverage percentual em substituto de cenários normativos.
|
|
|
|
## Critério de Saida Desta Agenda
|
|
|
|
Pode virar PR quando houver:
|
|
|
|
- matriz de gates por domínio aprovada;
|
|
- lista de cenários mínimos por domínio;
|
|
- política explícita para testes host-dependent / `#[ignore]`;
|
|
- uso de `llvm-cov` encaixado como evidência operacional;
|
|
- barra clara para aceitar novas syscalls, mudanças de runtime e transições de firmware.
|