Objetivo: Estrutura mínima funcional para todos os integrantes começarem a trabalhar em paralelo.
Entregáveis:
- Repositório no GitHub criado, README inicial
- GitHub Project (Kanban) configurado com colunas e automações
-
docker-compose.ymlcom 3 serviços: nginx, frontend (skeleton React), backend (skeleton Flask) -
docker compose uplevanta tudo, página inicial responde em http://localhost - Projeto Supabase criado, Auth configurado
- Frontend tem tela de login funcionando (email/senha)
- Backend tem decorator
@verify_jwtvalidando token nos endpoints - Endpoint
/api/healthretorna{status: "ok"} - Pelo menos 1 PR mergeado por integrante (rodagem do fluxo)
Definition of Done: aluno consegue clonar o repo, rodar docker compose up, fazer login, ver health check verde.
Objetivo: UI principal pronta, ainda sem backend de compilação.
Entregáveis:
- Monaco Editor integrado na rota principal
- Linguagem custom
simplesregistrada com tokenizer Monarch (27 keywords) - Tema dark com keywords destacadas
- Layout 3-painéis: editor (esq.), painel NASM (dir.), terminal (inferior — placeholder)
- Splitter resizable entre editor e NASM (
react-resizable-panels), double-click colapsa - Botão Run (mockado — apenas mostra "compilando…")
- Painel NASM read-only com seu próprio Monaco em modo
asm
Definition of Done: aluno consegue digitar código SIMPLES, ver highlighting correto, redimensionar painéis. Botão Run não faz nada ainda.
Objetivo: Pipeline simplesc → nasm → ld funcional via REST (sem WebSocket ainda).
Entregáveis:
-
simplescempacotado no container backend (multi-stage Dockerfile) -
binutils-i686-linux-gnuinstalado, linker funciona - Endpoint
POST /api/compileaceita código, retorna NASM ou erros - Erros parseados em
{line, column, message}por fase (lexer/parser/semantic) - Frontend renderiza erros como Monaco markers (linha vermelha sublinhada)
- NASM gerado popula painel direito automaticamente
- Timeouts de compilação (15s) implementados
Definition of Done: aluno escreve programa SIMPLES válido, clica Run, vê NASM no painel direito. Programa inválido mostra linha do erro.
Objetivo: O coração do projeto. WebSocket + PTY + xterm.js + sandbox.
Entregáveis:
- WebSocket
/ws/runno backend (flask-sock + gevent worker) - xterm.js integrado no painel terminal do frontend
- Imagem
simples-runnercomqemu-user-static -
PtyExecutionStrategyimplementada (docker-py +attach_socket) - Bridge bidirecional: stdout/stderr → ws → xterm.js; xterm.js input → ws → pty
-
leiainterativo funciona end-to-end (programa pede número, usuário digita, programa continua) - Mensagens do protocolo WS implementadas (
compile_started,asm_generated,exec_started,stdout,stdin,exit)
Definition of Done: aluno escreve programa que faz leia x; escreva x, roda, é solicitado a digitar, digita, vê valor de volta no terminal.
Objetivo: Production-ready. Não cai sob carga, não vaza, observável.
Entregáveis:
- Botão Stop funcional (envia
{type: "stop"}→ SIGTERM → SIGKILL) - Timeout de execução wall-clock (10s) com
asyncio.wait_for - Hard limit Docker (
--stop-timeout=12) -
--cap-drop=ALL,--read-only,--network=none, cgroups configurados - Rate limit (30 execuções/min/user) com
flask-limiter - Logs estruturados JSON (
structlog) - Métricas Prometheus em
/metrics(interno apenas) - Audit do sandbox: tentativa de escrever em
/, fork bomb, network — todas bloqueadas - Documentação de incidente (
docs/INCIDENTS.md) — o que fazer se um aluno escapar
Definition of Done: code review de segurança feito por outro grupo. Loop infinito é interrompido em ≤11s. Stop interrompe em ≤2s.
Objetivo: Apresentável. Documentado. Pronto pra publicar.
Entregáveis:
- Testes E2E com Playwright (login, edit, run, stdin, stop, timeout)
- Cobertura de testes backend ≥ 70% (
pytest --cov) - README.md completo com GIFs/screenshots
- Vídeo de demonstração de 2-3 min (
docs/demo.mp4) - (Obrigatório para nota máxima) Deploy em Oracle Cloud Ampere A1 com TLS válido
- (Opcional) Domínio próprio (
*.edu.br) apontando pro IP - Apresentação final preparada (slides ou Notion)
- Retrospectiva da equipe (o que aprendemos)