⚠️ Requer acesso AIOX Enterprise ou AIOX Pro. O código é open (Elastic License v2) para transparência, auditoria e onboarding via Demo. Os modos Research, Bench e SINKRA Maps consomem artefatos gerados por pipelines internos disponíveis apenas em workspaces AIOX Enterprise e AIOX Pro. Sem um workspace AIOX provisionado, só o/observatory/democarrega.
Dashboard local-first para visualizar artefatos operacionais de Research, Bench e SINKRA Maps.
O app foi pensado para funcionar em instalações locais e parciais. Se uma instalação não tiver docs/ ou outputs/, a fonte correspondente simplesmente não aparece no menu. O Demo sempre fica disponível para onboarding.
| Tier | Acesso | O que funciona |
|---|---|---|
| Visitante público | Clone o repo, npm install, npm run dev |
Apenas /observatory/demo (dataset embutido) |
| AIOX Pro | Workspace AIOX provisionado com pipelines Research/Bench/SINKRA Maps | Demo + Research + Bench + SINKRA Maps apontando para seu workspace |
| AIOX Enterprise | Workspace AIOX completo + suporte dedicado + integrações | Tudo do Pro + integrações com ServiceBus, ClickUp, Google Workspace, ETL |
Os modos Research/Bench/SINKRA Maps não funcionam sem um workspace AIOX populado. Eles esperam estruturas específicas de pastas (docs/research/, docs/bench/, outputs/sinkra-squad/) geradas por pipelines proprietários AIOX. Apontar AIOX_DASH_ROOT para um diretório vazio ou para um projeto não-AIOX vai resultar apenas no Demo aparecendo no menu.
Como obter AIOX Pro ou Enterprise:
- Site: alanicolas.com (em breve aiox.com.br)
- Email: alan@alanicolas.com
Este software é licenciado sob a Elastic License v2 (source-available, não open source no sentido OSI).
Resumo das permissões e restrições:
- ✅ Permitido: clonar, modificar, distribuir, usar internamente (incluindo uso comercial dentro da sua empresa).
- ❌ Proibido: oferecer o software como serviço gerenciado/hospedado para terceiros (SaaS competidor).
- ❌ Proibido: remover ou contornar funcionalidade de licenciamento ou marcas AIOX.
- ❌ Proibido: remover, alterar ou ocultar avisos de copyright/licença/marca.
Em caso de dúvida sobre o que sua organização pode ou não fazer, contate alan@alanicolas.com antes de prosseguir.
# Dentro de sinkra-hub (apps/dash é submodule)
git submodule update --init --recursive apps/dash
cd apps/dash
npm install
cp .env.example .env.local # opcional, só se for apontar para dados reais
npm run dev -- --port 3001
# Abrir: http://localhost:3001/observatory/demoSem dados reais o app abre normalmente em /observatory/demo. Se a instalação for limpa e o Demo carregar, a instalação está saudável.
| Item | Versão | Observação |
|---|---|---|
| Node.js | 18.18+ ou 20+ | Requerido pelo Next 16 |
| npm | 9+ | Vem com Node 18.18+ |
| OS | Linux / macOS / Windows | Windows funciona via PowerShell ou WSL |
| Memória build | ~1 GB livre | Next 16 + webpack |
| Disco | ~500 MB | node_modules + .next |
Sem engines declarado no package.json (decisão consciente). Versões abaixo do mínimo do Next 16 vão falhar no next dev com erro claro.
Stack interno (todas instaladas via npm install, não precisam ser provisionadas):
- Next.js 16.2.6 (App Router, webpack explícito via flag
--webpack) - React 19.2.3
- Tailwind v4 (
@tailwindcss/postcss) - TypeScript 5 (strict)
react-markdown,remark-gfm,yaml,lucide-react
Sem banco de dados. Sem autenticação. Sem dependências externas em runtime — o app só lê o filesystem que você apontar.
apps/dash é um git submodule apontando para https://github.com/oalanicolas/aiox-dash-research.git.
Quando o Hub é clonado sem --recurse-submodules, o diretório apps/dash fica vazio e o app não roda. Sempre rode:
git submodule update --init --recursive apps/dashPara atualizar a versão pinada do dash dentro do Hub:
cd apps/dash
git fetch origin
git checkout <commit-ou-tag>
cd ../..
git add apps/dash
git commit -m "chore(dash): bump submodule to <ref>"Push do bump no Hub deve ser feito por @devops (Constitution Article II).
# Opção A — fresh clone do Hub
git clone --recurse-submodules https://github.com/<owner>/sinkra-hub.git
cd sinkra-hub
# Opção B — Hub já clonado, faltando submodules
git submodule update --init --recursive apps/dash
# Opção C — standalone (fora do Hub)
git clone https://github.com/oalanicolas/aiox-dash-research.git apps/dash
cd apps/dashcd apps/dash
npm installEm monorepo npm workspaces, force escopo local:
npm install --workspaces=falsecp .env.example .env.localSem .env.local o app continua funcionando: o loader detecta o root automaticamente ou cai no Demo.
# Dev (hot reload)
npm run dev -- --port 3001
# Produção
npm run build
npm run start -- --port 3001Validação de tipos (não é build):
npm run typecheckOrdem importa em instalação limpa: rode
buildantes detypecheck. O Next gera.next/types/, referenciado pelotsconfig.json.
Todas as variáveis ficam em .env.local (gitignored). O template oficial é .env.example.
| Variável | Obrigatória | Default | Descrição |
|---|---|---|---|
AIOX_DASH_ROOT |
não | auto-detect | Caminho absoluto para a pasta que contém docs/research, docs/bench e/ou outputs/sinkra-squad. Se omitida, o app caminha para cima a partir do cwd procurando uma das três pastas. |
PORT |
não | 3000 |
Porta HTTP. Sobrescrita pela flag CLI --port. |
HOSTNAME |
não | 0.0.0.0 |
Interface de bind do next start. Use 127.0.0.1 para restringir a localhost. |
NODE_ENV |
não | development em dev, production em start |
Setado automaticamente pelos scripts. Não sobrescrever. |
Exemplo de .env.local para apontar a uma instalação AIOX típica:
AIOX_DASH_ROOT=/srv/aiox/workspaceAIOX_DASH_ROOT deve apontar apenas para o diretório cujo conteúdo o app está autorizado a ler. Não aponte para / nem para a raiz home do usuário.
O app descobre estas pastas dentro de AIOX_DASH_ROOT em cada request:
| Fonte | Pasta esperada | Rota | Comportamento |
|---|---|---|---|
| Demo | nenhuma | /observatory/demo |
Exemplo completo de onboarding (Map, Slides, Roadmap, Evidências, Matriz, Duelo, Score, Personas, TCO, Decisão) |
| Research | docs/research/<slug>/ |
/observatory/research |
Leitor de pesquisas Markdown/YAML/JSON estruturado |
| Bench | docs/bench/<slug>/ |
/observatory/bench |
Relatórios comparativos, matriz, score, personas, TCO e decisão |
| SINKRA Maps | outputs/sinkra-squad/<group>/map/<slug>/ |
/observatory/sinkra-maps |
Mapas visuais de processo, fluxo, automação, governança, RACI, gaps e evidências |
Regras de descoberta:
Demosempre aparece e não depende de filesystem externo.- Se uma pasta não existir, a fonte não aparece no menu superior.
- Rota direta para fonte inexistente retorna
404. /observatoryredireciona para a primeira fonte disponível.- Instalações sem
docs/e semoutputs/continuam abrindo em/observatory/demo.
Após npm run dev ou npm run start, valide nesta ordem:
| Verificação | URL | Esperado |
|---|---|---|
| Demo carrega | http://localhost:3001/observatory/demo |
Página com Map/Slides/Evidências renderizada |
| Index do observatório | http://localhost:3001/observatory |
Redireciona para Demo ou primeira fonte presente |
| Tipos passam | npm run typecheck |
Exit code 0, zero error TS |
| Build limpo | npm run build |
Exit code 0, .next/ criado |
Smoke test mínimo via curl:
curl -fsS -o /dev/null -w "%{http_code}\n" http://localhost:3001/observatory/demo
# Esperado: 200O app não embute Dockerfile, configuração Vercel/Railway nem CI/CD nesta versão. Deploy é manual e baseado em next start.
Padrões aceitos para AIOX:
- systemd (recomendado em VMs): unit
aiox-dash.servicerodandonpm run start -- --port 3001comWorkingDirectory=/srv/aiox/sinkra-hub/apps/dasheEnvironment=AIOX_DASH_ROOT=/srv/aiox/workspace. - pm2:
pm2 start npm --name aiox-dash -- run start -- --port 3001. - Reverse proxy obrigatório se exposto à rede: nginx/Caddy na frente, terminando TLS e adicionando autenticação (Basic Auth, OAuth-proxy, Cloudflare Access). O app não tem auth.
Restart policy: o app é stateless. Pode reiniciar livremente, não há cache persistente em disco. Caches de listagem e payload são em memória, TTL 5 min.
SINKRA Maps pode ter muitos arquivos em outputs/. Para reduzir latência:
- Índice de mapeamentos em cache em memória por 5 min.
- Payload estruturado do mapeamento selecionado em cache em memória por 5 min.
- Payload carregado por aba —
map,flow,automation,governance,accountability,gaps,evidence,score,documentleem apenas os YAML/JSON necessários. - YAML/JSON estruturados da aba ativa carregados em paralelo.
- Conteúdo bruto de documentos carregado sob demanda.
- Views pesadas via
next/dynamic(code splitting).
Próximo passo recomendado pelo pipeline: materializar _index.json e observatory_payload.json no gerador dos mapeamentos. Evita varredura de filesystem e parse de YAML em runtime.
| Sintoma | Causa provável | Ação |
|---|---|---|
apps/dash está vazio após clone |
Submodule não inicializado | git submodule update --init --recursive apps/dash |
Cannot find module 'next' |
npm install não rodou |
cd apps/dash && npm install |
npm run typecheck falha em instalação limpa |
.next/types/ ainda não existe |
Rodar npm run build primeiro |
EADDRINUSE :3001 |
Porta ocupada | npm run dev -- --port 3002 (ou matar processo na 3001) |
/observatory/research retorna 404 |
docs/research/ não existe no AIOX_DASH_ROOT |
Criar a pasta com pelo menos um slug, ou usar /observatory/demo |
| Menu superior só mostra Demo | AIOX_DASH_ROOT não aponta para pasta com docs/ ou outputs/ |
Conferir .env.local, conferir caminho absoluto, conferir permissão de leitura |
Build trava com out of memory |
Heap padrão insuficiente em CI | NODE_OPTIONS=--max-old-space-size=4096 npm run build |
| Mudou YAML mas dashboard não atualiza | Cache de 5 min em memória | Reiniciar processo (npm run start ou systemd restart) |
| Tailwind não aplica estilos após upgrade | Cache antigo do Next | rm -rf .next && npm run dev |
| Submodule preso em commit antigo | git pull não atualiza submodules |
git submodule update --remote apps/dash |
# Buscar últimas refs do remote do dash
cd apps/dash
git fetch origin
git checkout main # ou um commit/tag específico
git pull origin main
# Registrar o novo pointer no Hub
cd ../..
git status # apps/dash deve aparecer como modified
git add apps/dash
git commit -m "chore(dash): bump submodule to <ref>"
# Push pelo @devopsPara reverter para o pointer registrado no Hub:
git submodule update --init apps/dashdocs/research/<slug>/
README.md
00-query-original.md
01-deep-research-prompt.md
02-research-report.md
03-recommendations.md
metrics.yaml
pipeline-state.yaml
execution-log.jsonl
sources.yaml
research-graph.json
matrices.yaml
curiosity_queue.yaml
players.yaml
ux-patterns.yaml
quick-wins.mdO Research Observatory não deve depender de leitura manual do Markdown para comunicar valor. Cada pesquisa deve tentar alimentar estas abas:
| Aba | Função narrativa | Artefatos principais |
|---|---|---|
Map |
visão executiva da descoberta | metrics.yaml, pipeline-state.yaml, matrices.yaml, ux-patterns.yaml, curiosity_queue.yaml |
Ações |
decisão, checklist, quick wins e roadmap | 03-recommendations.md, quick-wins.md, curiosity_queue.yaml, follow-ups Markdown |
Evidências |
confiança, fontes, grafo e materialidade da conclusão | sources.yaml, research-graph.json, metrics.yaml |
Waves |
evolução da investigação | execution-log.jsonl, arquivos wave*.md |
Fontes |
referências externas acionáveis | sources.yaml |
Players |
ferramentas, empresas ou alternativas analisadas | players.yaml |
Perguntas |
fila de dúvidas que podem mudar a decisão | curiosity_queue.yaml |
Doc |
leitura integral dos documentos | qualquer .md, .yaml, .json, .jsonl legível |
Arquivos estruturados podem ser gerados a partir dos Markdown existentes, desde que a regra de não invenção seja respeitada. Quando um valor for derivado por heurística, ele deve ser claramente marcado como inferido no próprio YAML/JSON ou no comentário do campo.
Use este processo para tornar qualquer pasta docs/research/<slug>/ compatível com o painel visual:
-
Inventariar
- Liste os arquivos do slug.
- Classifique o run como
rich,partialoulegacy. - Identifique quais abas ficariam vazias hoje.
-
Preservar
- Não apague nem reescreva os documentos originais.
- Não renomeie o slug sem aprovação.
- Não invente fonte, player, score ou decisão.
-
Normalizar o core
- Garanta, quando possível,
README.md,00-query-original.md,01-deep-research-prompt.md,02-research-report.mde03-recommendations.md. - Se o run antigo usa nomes diferentes (
report.md,recommendations.md), mantenha o original e crie uma versão canônica apenas quando o conteúdo estiver claro.
- Garanta, quando possível,
-
Gerar artefatos visuais
metrics.yaml:coverage_score,integrity_score,decision,stop_reason,coverage_breakdown.pipeline-state.yaml: fases executadas e status de cada fase.execution-log.jsonl: eventos em ordem temporal, quando houver evidência.sources.yaml: URLs, títulos, credibilidade e flags.research-graph.json: nós e edges entre query, prompt, waves, fontes, métricas, relatório e decisão.matrices.yaml: tabelas extraídas dos Markdown.curiosity_queue.yaml: perguntas abertas, prioridade e próximo movimento.players.yaml: ferramentas, empresas, frameworks ou alternativas citadas.ux-patterns.yaml: padrões reutilizáveis quando existirem achados de UX/produto.quick-wins.md: ações rápidas extraídas das recomendações.
-
Validar visualmente
- Abra
/observatory/research?slug=<slug>&view=map. - Abra
/observatory/research?slug=<slug>&view=evidence. - Abra
/observatory/research?slug=<slug>&view=recommendations. - Abra
/observatory/research?slug=<slug>&view=curiosity. - Verifique se cada aba tem uma narrativa clara e não apenas cards vazios.
- Abra
-
Registrar
- Registre quais slugs foram compatibilizados.
- Marque lacunas que exigem nova pesquisa em vez de preencher artificialmente.
Checklist mínimo por slug:
[ ] Map tem score, fases, gaps ou padrões úteis
[ ] Evidências tem fontes ou grafo
[ ] Ações tem decisão/checklist/roadmap quando há recomendações
[ ] Perguntas tem fila priorizada ou a aba não aparece
[ ] Doc preserva leitura dos arquivos originais
[ ] Dados inferidos estão marcadosHandoff detalhado para outro agente: apps/dash/HANDOFF-research-compatibility.md.
docs/bench/<slug>/
bench-output-dash.json
README.md
scorecard.json
executive-report.mdoutputs/sinkra-squad/<group>/map/<slug>/
observatory_map.yaml
workflow_definition.yaml
task_definitions.yaml
quality_gates.yaml
score_card.yaml
process_map.yaml
domain_map.yaml
dependency_graph.yaml
automation_specs.yaml
raci_matrix.yaml
capability_gaps.yaml
compliance_score.yamlNenhum arquivo individual é obrigatório. Quanto mais artefatos estruturados existirem, mais visual e completo fica o relatório.
- O app é read-only: lê arquivos locais e renderiza relatórios.
- Sem autenticação embutida. Em rede aberta, sempre atrás de reverse proxy com auth.
AIOX_DASH_ROOTdeve apontar apenas para a pasta autorizada. Nunca raiz do disco nem$HOME.- Não publique workspaces com dados sensíveis em repositórios abertos.
.env.localestá em.gitignore. Não comitar.
- Sem Dockerfile / vercel.json / railway.json — deploy é manual via
next start+ supervisor (systemd/pm2). - Sem lint script no
package.json(usenpm run typecheckcomo gate de qualidade). - Sem testes automatizados nesta versão.
- Sem CI/CD configurado para o submodule.
- Hot reload do Next ignora
node_modules,.git,.claude,outputs/,squads/— mudanças nesses paths não disparam rebuild (intencional para performance).
# Submodule
git submodule update --init --recursive apps/dash
git submodule update --remote apps/dash
# Dev
npm install
npm run dev -- --port 3001
# Prod
npm run build
npm run start -- --port 3001
# QA
npm run typecheck
# Smoke
curl -fsS -o /dev/null -w "%{http_code}\n" http://localhost:3001/observatory/demoAIOX Dash — local-first observatory · stack Next 16 / React 19 / Tailwind v4 · sem dependências externas em runtime