Status: Approved · v1 · SPEC-DELIVERY-SDD-DASHBOARD-001
Dashboard operacional do SDD e adapters de skill do Claude Code
Documento gerado por
raizfc-reverse-engineer-brancha partir do branchfeat/sdd-dashboard, registrando de forma descritiva um trabalho construído fora do fluxo CR/IS/EP. Escopo aprovado pelo owner em 2026-08-29 — verhuman_approvalemCR-SDD-DASHBOARD-001. Lockfile/testes/CI e a decisão sobre virar EP/IS formal seguem abertos empending_decisionsda mesma CR.
Cenário / objetivo
O branch feat/sdd-dashboard não tinha CR, IS ou EP formal. O trabalho foi pedido diretamente
pelo usuário, em sessão, com dois objetivos distintos que acabaram no mesmo branch:
- Dar visibilidade operacional ao estado do SDD (bloqueios, backlog, execuções, evidência, hierarquia CR/IS/EP/SPEC) sem exigir leitura manual de YAML/JSON ou comandos de CLI.
- Fechar uma lacuna descoberta durante a própria sessão: skills do fluxo RaizFC vivem em
.agents/skills/, mas o Claude Code só descobre skills invocáveis por/em.claude/skills/. Três das quatro skills canônicas não tinham o adapter espelho e por isso não apareciam no autocomplete.
Contexto técnico
- App Streamlit somente leitura (
tools/sdd-dashboard/app.py), lançado porpnpm sdd:board→scripts/sdd/board.mjs(porta 8501, com fallback automático de porta se ocupada). - Lê os artefatos canônicos diretamente do working tree e, quando possível, via
git show <ref>:<path>usandomastercomo ref de leitura (fallback paraHEAD), para refletir o estado mesclado em vez do branch de feature local. - Não escreve em nenhum artefato do SDD; todas as operações são leitura (
.sdd/state.yaml,.sdd/changes/,.sdd/evidence/,raizfc.manifest.yaml,docs/index.json,increments/index.yaml,.ai/execution/index.yaml,.agents/skills/). - Dependências Python novas no monorepo:
streamlit,pandas,pyyaml(tools/sdd-dashboard/requirements.txt), sem lockfile. - Vive em
tools/, não emapps/:apps/*é glob do workspace pnpm (pnpm-workspace.yaml) escripts/check-workspace-boundaries.mjsexigepackage.jsonválido em todo diretório ali. O CI pegou isso na primeira versão da PR (INVALID_MANIFESTemapps/sdd-dashboard), e o diretório foi movido em vez de ganhar umpackage.jsonartificial. - Padrão de adapter de skill (já usado antes só por
raizfc-review-validate-ep): o conteúdo canônico e completo mora em.agents/skills/<nome>/SKILL.md;.claude/skills/<nome>/SKILL.mdé um stub curto com o mesmoname/descriptionno frontmatter, que só aponta para o canônico e instrui a não replicar nem relaxar o protocolo.
Arquivos relevantes
tools/sdd-dashboard/app.py,README.md,requirements.txtscripts/sdd/board.mjspackage.json(scriptsdd:board).claude/launch.json(preview local do dashboard).claude/skills/raizfc-execute-ep/SKILL.md.claude/skills/raizfc-list-enabled-eps/SKILL.md.claude/skills/raizfc-reverse-engineer-branch/SKILL.md.gitignore(artefatos Python/Streamlit — já commitado em94e49bb)
Comportamento observado
- O dashboard abre em
http://127.0.0.1:8501e mostra: Overview (foco atual, métricas, distribuição por status, timeline de execução, backlog priorizado, bloqueios, snapshot de CRs, últimas execuções), Hierarchy, Entity Detail (EP/IS/CR), Execution Log (com detalhe rico por execução: comandos, findings, artefatos, metadados técnicos, command log), Prompt Snippets, Skills (lê.agents/skills/*/SKILL.md) e Docs. - Os três adapters novos em
.claude/skills/foram confirmados funcionando nesta mesma sessão: cada um apareceu no índice de skills do Claude Code assim que o arquivo foi criado, e/raizfc-reverse-engineer-branchfoi invocado com sucesso para gerar este próprio documento. - O schema de
findingsem.sdd/evidence/*/metadata.yamlnão é uniforme entre execuções (algumas usamarea/resolution, outrasid/disposition); o dashboard trata isso de forma defensiva, mas o schema em si não foi alterado por este trabalho.
Dependências e risco
requirements.txtusa faixas de versão (>=,<) sem lockfile — risco de drift de versão entre máquinas.- Nenhum teste automatizado cobre
tools/sdd-dashboard/app.py. - Não há verificação automática de que todo
.agents/skills/<nome>/tenha o adapter espelho em.claude/skills/<nome>/— hoje é um passo manual; uma nova skill sem esse passo volta a ficar invisível no autocomplete, como aconteceu com as três skills fechadas por este trabalho. - O dashboard usa
subprocessparagit show, mas orefsó vem demaster/HEADresolvidos internamente, nunca de input externo — sem superfície de injeção conhecida. - Regra de manutenção (owner, 2026-08-29): qualquer mudança estrutural no SDD que afete o que o
dashboard lê ou exibe deve vir acompanhada da atualização correspondente em
tools/sdd-dashboard/app.pyno mesmo trabalho. Não há checagem automática disso ainda — verpending_decisionsemCR-SDD-DASHBOARD-001.
Impacto de uso / arquitetura
- Ferramenta interna, uso local, sem autenticação, sem deploy remoto e sem qualquer mudança de produto/UX voltada ao usuário final do RaizFC.
- Não altera o protocolo de nenhuma skill canônica; os adapters só redirecionam para o conteúdo
já existente em
.agents/skills/.
Itens não resolvidos ou assumidos
- Aprovação humana explícita do escopo recebida em 2026-08-29 — ver
human_approval.status: approvedemCR-SDD-DASHBOARD-001.yaml. Lockfile, testes/CI e a decisão de virar EP/IS formal seguem abertos empending_decisionsda mesma CR. - Este trabalho não foi decomposto em IS/EP formais: é tooling interno, não um incremento de produto, e forçar essa estrutura seria inventar status que o SDD não confirma.
- Este documento entra em
docs/index.json/docs/07_delivery/README.mdviapnpm sdd:generate— não editei esses dois arquivos manualmente porque são catálogos gerados pelo próprio SDD.