Painel operacional para rastreio marítimo com foco em consistência de domínio, auditabilidade e visibilidade de exceções.
- Acessa o painel e busca um processo de embarque pelo número de referência ou container.
- Visualiza o status atual derivado automaticamente (ex.: em trânsito, descarregado, entregue), sem precisar reconciliar manualmente dados de múltiplos carriers.
- Consulta a timeline do processo para entender o que já aconteceu (ACTUAL) e o que era esperado (EXPECTED), incluindo mudanças de previsão.
- Recebe alertas operacionais para agir cedo em risco de atraso, conflitos de informação ou ausência de atualização.
- Usa o histórico preservado para auditoria: cada atualização é rastreável ao snapshot bruto recebido do carrier.
- O sistema coleta atualizações de transportadoras diferentes.
- Cada atualização original é guardada exatamente como veio, sem sobrescrever histórico.
- Depois, essas atualizações são convertidas em fatos padronizados (observações).
- A partir desses fatos, o sistema calcula status, timeline e alertas.
- Se houver incerteza ou conflito, isso é mostrado explicitamente em vez de ser escondido.
Resumo: o sistema não “chuta” estado. Ele deriva estado a partir de eventos reais e preserva todo o histórico para explicar qualquer decisão.
- Bounded Contexts claros em
src/modules/*:process: agrupamento/logística de processocontainer: identidade e associação de containertracking: snapshots, observações e derivações (status/timeline/alerts)
- Capabilities em
src/capabilities/*orquestram casos cross-context sem capturar semântica de domínio. - Regras de dependência evitam acoplamento acidental: módulo não depende de capability; UI não define verdade de domínio.
- Invariantes fortes de rastreio:
- snapshot imutável
- observação append-only
- status sempre derivado
- conflito/incerteza expostos
- Contratos e fronteiras documentados em:
docs/MASTER_v2.mddocs/TYPE_ARCHITECTURE.mddocs/BOUNDARIES.mddocs/TRACKING_INVARIANTS.mddocs/TRACKING_EVENT_SERIES.mddocs/ALERT_POLICY.md
- Node.js
>= 22 - TypeScript
- SolidStart/SolidJS (Vinxi)
- Zod para validação
- Vitest para testes
- Biome + ESLint para qualidade de código
pnpm install
pnpm run devAplicação em desenvolvimento via vinxi dev.
pnpm run build # build de produção
pnpm run start # sobe build de produção
pnpm run test # testes (vitest)
pnpm run type-check # checagem de tipos
pnpm run lint # lint + regras
pnpm run check # fix/lint + type-check + test
pnpm run i18n:check # valida chaves de i18n
pnpm run maersk:smoke:puppeteer # smoke técnico de launch headless do PuppeteerUse este comando para validar rapidamente se o browser do devcontainer está compatível com launch headless:
pnpm run maersk:smoke:puppeteerSaída esperada em sucesso: [maersk-smoke] PASS.
Em falha, o comando classifica a causa com hints acionáveis:
missing_browser_binary: Chrome/Chromium não encontrado no ambiente.invalid_chrome_path:CHROME_PATHdefinido para caminho inválido/não executável.launch_incompatibility: browser encontrado, maspuppeteer.launch(...)falhou.
Procedimento reproduzível para validar que o browser deixou de ser o bloqueio principal:
- Em um terminal no devcontainer, valide primeiro o launch técnico:
pnpm run maersk:smoke:puppeteer- Suba a aplicação local:
pnpm run dev- Em outro terminal, chame o endpoint Maersk:
CONTAINER=MRKU1234567
curl -sS "http://localhost:3000/api/refresh-maersk/${CONTAINER}?headless=1&hold=0&timeout=70000" \
| tee /tmp/maersk-refresh-smoke.json- Verifique o critério mínimo de sucesso:
if grep -q "Browser launch failed" /tmp/maersk-refresh-smoke.json; then
echo "FAIL: browser launch ainda bloqueando o endpoint"
else
echo "PASS: browser launch não é o bloqueio atual"
fiRegras de avaliação:
- Critério mínimo: a saída do endpoint não pode conter
Browser launch failed. - Erros externos do provider (por exemplo
403 Access Denied by Akamaiou502 No API response captured) não reprovam este smoke, desde que o erro de launch não apareça. - Se aparecer
Browser launch failed, reviseCHROME_PATHe repitapnpm run maersk:smoke:puppeteerantes de depurar integração Maersk.
- A versão do browser é controlada explicitamente em
.devcontainer/devcontainer.jsonviabuild.args.CHROMIUM_VERSION. - O build instala
chromium=$CHROMIUM_VERSIONem.devcontainer/Dockerfilee aplicaapt-mark hold chromiumpara evitar drift acidental. - Não existe etapa de auto-update de Chromium em
.devcontainer/post-create.sh,.devcontainer/post-start.shou nos fluxos de refresh da aplicação.
- Identifique a versão alvo disponível para Debian Bookworm:
apt-cache madison chromium- Atualize o valor de
build.args.CHROMIUM_VERSIONem.devcontainer/devcontainer.json. - Abra uma PR explícita de bump de versão (ex.:
chore(devcontainer): bump chromium to <version>). - Rebuild do devcontainer e valide:
pnpm run maersk:smoke:puppeteer
pnpm run checkGuia completo de setup, comandos ai:loop:*, fluxo container/host e troubleshooting:
docs/AI_LOOP_CODEX.md
- Workflow obrigatório:
.github/workflows/quality.yml - Checks executados em
pull_requestepushparamain:pnpm run lintpnpm run type-checkpnpm run test
- Recomenda-se branch protection exigindo os três checks acima antes de merge.
src/
modules/ # contexto de domínio
capabilities/ # orquestração cross-context
routes/ # camada de interface web
shared/ # utilitários e infraestrutura compartilhada
Estados são derivados de eventos.
Eventos são derivados de snapshots.
Snapshots nunca são descartados.