Contexto
Flagado por Copilot durante review do PR #12 (remoção do campo `route`).
Bug latente
`src/lib/module-register.ts` define o payload de registro como:
```ts
navigation: { label: string; path: string; required_permission?: string }[];
```
mas o payload é montado com `navigation: manifest.navigation` — e `manifest` vem de `module.json`, onde cada entrada usa `requiredPermission` (camelCase):
```json
"navigation": [
{ "label": "Overview", "path": "/my-module", "requiredPermission": "my-module:read" }
]
```
Resultado: se `registerModule()` for efetivamente chamado, o Shell API recebe `requiredPermission` em vez de `required_permission`, e o filtro por permissão na sidebar quebra silenciosamente.
Caminho real de registro (não afetado)
Em produção, o registro vai pelo init container do Helm (`charts/my-module/templates/deployment.yaml`) que lê o ConfigMap gerado a partir do bloco `module:` em `values.yaml` — esse bloco já está em snake_case corretamente (`required_permission`). Então o bug só afeta o caminho de self-registration via `src/register.ts`.
Suspeita de dead code
`src/register.ts` chama `registerModule()`, mas nada invoca `register.ts`:
- Nenhum script em `package.json` referencia.
- Nenhum `Dockerfile` usa como CMD/ENTRYPOINT.
- Nenhum manifest Kubernetes aponta pra ele.
Ou seja, é helper carregado de dead code na forma como o template é shippado hoje.
Opções
- Remover `src/register.ts` + `src/lib/module-register.ts` — consolidar todo o registro no init container do Helm, que é o que realmente roda.
- Manter e consertar — tipar o `manifest.navigation` com camelCase (como no `module.json`) e mapear para snake_case ao montar o payload antes do `fetch`, alinhando com o que o init container já faz.
Opção 1 é minha preferência porque dois caminhos de registro (um via init container, outro via runtime) mantêm duas fontes de verdade e aumentam a chance de dessync igual esse bug mostrou. Mas depende de ninguém ter caso de uso legítimo para o self-register.
Critérios de aceitação
Contexto
Flagado por Copilot durante review do PR #12 (remoção do campo `route`).
Bug latente
`src/lib/module-register.ts` define o payload de registro como:
```ts
navigation: { label: string; path: string; required_permission?: string }[];
```
mas o payload é montado com `navigation: manifest.navigation` — e `manifest` vem de `module.json`, onde cada entrada usa `requiredPermission` (camelCase):
```json
"navigation": [
{ "label": "Overview", "path": "/my-module", "requiredPermission": "my-module:read" }
]
```
Resultado: se `registerModule()` for efetivamente chamado, o Shell API recebe `requiredPermission` em vez de `required_permission`, e o filtro por permissão na sidebar quebra silenciosamente.
Caminho real de registro (não afetado)
Em produção, o registro vai pelo init container do Helm (`charts/my-module/templates/deployment.yaml`) que lê o ConfigMap gerado a partir do bloco `module:` em `values.yaml` — esse bloco já está em snake_case corretamente (`required_permission`). Então o bug só afeta o caminho de self-registration via `src/register.ts`.
Suspeita de dead code
`src/register.ts` chama `registerModule()`, mas nada invoca `register.ts`:
Ou seja, é helper carregado de dead code na forma como o template é shippado hoje.
Opções
Opção 1 é minha preferência porque dois caminhos de registro (um via init container, outro via runtime) mantêm duas fontes de verdade e aumentam a chance de dessync igual esse bug mostrou. Mas depende de ninguém ter caso de uso legítimo para o self-register.
Critérios de aceitação