@mir-code/specs-platform 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +460 -0
  3. package/assets/specs-usage-statusline.sh +77 -0
  4. package/assets/template/.agents/README.md +123 -0
  5. package/assets/template/.agents/RUNTIME.md +64 -0
  6. package/assets/template/.agents/agents/discovery-agent.md +15 -0
  7. package/assets/template/.agents/agents/drawing-agent.md +15 -0
  8. package/assets/template/.agents/agents/feature-runner.md +15 -0
  9. package/assets/template/.agents/agents/refinement-runner.md +15 -0
  10. package/assets/template/.agents/agents/refinement.md +15 -0
  11. package/assets/template/.agents/project.md +158 -0
  12. package/assets/template/.agents/scripts/check-commit.mjs +70 -0
  13. package/assets/template/.agents/scripts/validate-spec.mjs +345 -0
  14. package/assets/template/.agents/skills/discovery-agent/SKILL.md +80 -0
  15. package/assets/template/.agents/skills/discovery-writing/SKILL.md +76 -0
  16. package/assets/template/.agents/skills/drawing-agent/SKILL.md +85 -0
  17. package/assets/template/.agents/skills/drawing-writing/SKILL.md +100 -0
  18. package/assets/template/.agents/skills/execution-protocol/SKILL.md +110 -0
  19. package/assets/template/.agents/skills/execution-protocol/references/git.md +104 -0
  20. package/assets/template/.agents/skills/execution-protocol/references/relatorio-halt.md +103 -0
  21. package/assets/template/.agents/skills/feature-runner/SKILL.md +81 -0
  22. package/assets/template/.agents/skills/feature-runner/references/divergencias.md +38 -0
  23. package/assets/template/.agents/skills/feature-runner/references/implementar.md +80 -0
  24. package/assets/template/.agents/skills/feature-runner/references/localizar.md +46 -0
  25. package/assets/template/.agents/skills/mermaid-diagramming/SKILL.md +198 -0
  26. package/assets/template/.agents/skills/prototype-check/SKILL.md +90 -0
  27. package/assets/template/.agents/skills/refinement/SKILL.md +136 -0
  28. package/assets/template/.agents/skills/refinement/references/estrutura.md +27 -0
  29. package/assets/template/.agents/skills/refinement/references/mapear-terreno.md +46 -0
  30. package/assets/template/.agents/skills/refinement/references/validar-renderizacao.md +29 -0
  31. package/assets/template/.agents/skills/refinement-runner/SKILL.md +145 -0
  32. package/assets/template/.agents/skills/requirements-closure/SKILL.md +236 -0
  33. package/assets/template/.agents/skills/spec-writing/SKILL.md +258 -0
  34. package/assets/template/.agents/skills/test-strategy/SKILL.md +176 -0
  35. package/assets/template/.agents/skills/verification/SKILL.md +143 -0
  36. package/assets/template/.specs/config.json +39 -0
  37. package/assets/template/.specs/discoveries/meta.json +4 -0
  38. package/assets/template/.specs/drawings/meta.json +4 -0
  39. package/assets/template/.specs/specs/_templates/task-backend.md +75 -0
  40. package/assets/template/.specs/specs/_templates/task-frontend.md +89 -0
  41. package/assets/template/.specs/specs/_templates/task-integracao.md +72 -0
  42. package/assets/template/.specs/specs/exemplo/feat-exemplo-primeira-task.md +82 -0
  43. package/assets/template/.specs/specs/exemplo/meta.json +8 -0
  44. package/assets/template/.specs/specs/exemplo/overview.md +45 -0
  45. package/assets/template/.specs/specs/meta.json +4 -0
  46. package/assets/template/SPECS.md +213 -0
  47. package/dist/chunk-SOOETS3N.js +3490 -0
  48. package/dist/chunk-SOOETS3N.js.map +1 -0
  49. package/dist/cli.js +15 -0
  50. package/dist/cli.js.map +1 -0
  51. package/dist/index.d.ts +69 -0
  52. package/dist/index.js +16 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/ui/assets/abnfDiagram-VCTEODGH-DYXtkHNq.js +2 -0
  55. package/dist/ui/assets/abnfDiagram-VCTEODGH-DYXtkHNq.js.map +1 -0
  56. package/dist/ui/assets/arc-CJs0gz4E.js +2 -0
  57. package/dist/ui/assets/arc-CJs0gz4E.js.map +1 -0
  58. package/dist/ui/assets/architectureDiagram-5GKGNRK7-Br7ZNRfe.js +37 -0
  59. package/dist/ui/assets/architectureDiagram-5GKGNRK7-Br7ZNRfe.js.map +1 -0
  60. package/dist/ui/assets/blockDiagram-I7D4REHJ-172V7R5o.js +130 -0
  61. package/dist/ui/assets/blockDiagram-I7D4REHJ-172V7R5o.js.map +1 -0
  62. package/dist/ui/assets/c4Diagram-7LVT6UL2-B4AYFhRs.js +39 -0
  63. package/dist/ui/assets/c4Diagram-7LVT6UL2-B4AYFhRs.js.map +1 -0
  64. package/dist/ui/assets/channel-BfWO3B41.js +2 -0
  65. package/dist/ui/assets/channel-BfWO3B41.js.map +1 -0
  66. package/dist/ui/assets/chunk-2Q5K7J3B-B-u7gtZN.js +2 -0
  67. package/dist/ui/assets/chunk-2Q5K7J3B-B-u7gtZN.js.map +1 -0
  68. package/dist/ui/assets/chunk-5VM5RSS4-CjFDq_cq.js +16 -0
  69. package/dist/ui/assets/chunk-5VM5RSS4-CjFDq_cq.js.map +1 -0
  70. package/dist/ui/assets/chunk-F27PBJKO-BDYeB7B8.js +2 -0
  71. package/dist/ui/assets/chunk-F27PBJKO-BDYeB7B8.js.map +1 -0
  72. package/dist/ui/assets/chunk-IMKFNOWR-y2kXPnac.js +232 -0
  73. package/dist/ui/assets/chunk-IMKFNOWR-y2kXPnac.js.map +1 -0
  74. package/dist/ui/assets/chunk-JWPE2WC7-DyCryvDN.js +2 -0
  75. package/dist/ui/assets/chunk-JWPE2WC7-DyCryvDN.js.map +1 -0
  76. package/dist/ui/assets/chunk-POPQ4Y6H-DeaxKHvR.js +2 -0
  77. package/dist/ui/assets/chunk-POPQ4Y6H-DeaxKHvR.js.map +1 -0
  78. package/dist/ui/assets/chunk-SVP7TREG-CmcZEncL.js +89 -0
  79. package/dist/ui/assets/chunk-SVP7TREG-CmcZEncL.js.map +1 -0
  80. package/dist/ui/assets/chunk-TICWLB2K-Df1RRXWR.js +207 -0
  81. package/dist/ui/assets/chunk-TICWLB2K-Df1RRXWR.js.map +1 -0
  82. package/dist/ui/assets/chunk-XXDRQBXY-ClTat8Q0.js +2 -0
  83. package/dist/ui/assets/chunk-XXDRQBXY-ClTat8Q0.js.map +1 -0
  84. package/dist/ui/assets/classDiagram-ZZMXUADV-YTUiu8rF.js +2 -0
  85. package/dist/ui/assets/classDiagram-ZZMXUADV-YTUiu8rF.js.map +1 -0
  86. package/dist/ui/assets/classDiagram-v2-VYDZK3BY-YTUiu8rF.js +2 -0
  87. package/dist/ui/assets/classDiagram-v2-VYDZK3BY-YTUiu8rF.js.map +1 -0
  88. package/dist/ui/assets/cose-bilkent-JH36ORCC-QvqQLoy5.js +2 -0
  89. package/dist/ui/assets/cose-bilkent-JH36ORCC-QvqQLoy5.js.map +1 -0
  90. package/dist/ui/assets/cynefin-OW5HDTMX-BY6w3pAQ.js +179 -0
  91. package/dist/ui/assets/cynefin-OW5HDTMX-BY6w3pAQ.js.map +1 -0
  92. package/dist/ui/assets/cynefinDiagram-5FMLGOSQ-luPP4ha1.js +63 -0
  93. package/dist/ui/assets/cynefinDiagram-5FMLGOSQ-luPP4ha1.js.map +1 -0
  94. package/dist/ui/assets/cytoscape.esm-Ix0LnXOy.js +332 -0
  95. package/dist/ui/assets/cytoscape.esm-Ix0LnXOy.js.map +1 -0
  96. package/dist/ui/assets/dagre-GXQ25YYZ-DhpPwKqq.js +5 -0
  97. package/dist/ui/assets/dagre-GXQ25YYZ-DhpPwKqq.js.map +1 -0
  98. package/dist/ui/assets/defaultLocale-DX6XiGOO.js +2 -0
  99. package/dist/ui/assets/defaultLocale-DX6XiGOO.js.map +1 -0
  100. package/dist/ui/assets/diagram-S7CK7UJ4-B9wvQM0w.js +31 -0
  101. package/dist/ui/assets/diagram-S7CK7UJ4-B9wvQM0w.js.map +1 -0
  102. package/dist/ui/assets/diagram-UQ7AKVKN-gm1M_iZS.js +42 -0
  103. package/dist/ui/assets/diagram-UQ7AKVKN-gm1M_iZS.js.map +1 -0
  104. package/dist/ui/assets/diagram-VSXAHHWV-DkEB6nEx.js +4 -0
  105. package/dist/ui/assets/diagram-VSXAHHWV-DkEB6nEx.js.map +1 -0
  106. package/dist/ui/assets/diagram-VX7I27RA-Ce2F1bHi.js +25 -0
  107. package/dist/ui/assets/diagram-VX7I27RA-Ce2F1bHi.js.map +1 -0
  108. package/dist/ui/assets/diagram-Z3DM3KII-B5ArCh-E.js +25 -0
  109. package/dist/ui/assets/diagram-Z3DM3KII-B5ArCh-E.js.map +1 -0
  110. package/dist/ui/assets/ebnfDiagram-PWID7BFC-DgBM80MD.js +2 -0
  111. package/dist/ui/assets/ebnfDiagram-PWID7BFC-DgBM80MD.js.map +1 -0
  112. package/dist/ui/assets/erDiagram-RLTQ6QDP-C161af8G.js +100 -0
  113. package/dist/ui/assets/erDiagram-RLTQ6QDP-C161af8G.js.map +1 -0
  114. package/dist/ui/assets/flowDiagram-HODETNUW-B8N_WyW5.js +169 -0
  115. package/dist/ui/assets/flowDiagram-HODETNUW-B8N_WyW5.js.map +1 -0
  116. package/dist/ui/assets/ganttDiagram-EL5Y4UJY-CD2RJpTb.js +293 -0
  117. package/dist/ui/assets/ganttDiagram-EL5Y4UJY-CD2RJpTb.js.map +1 -0
  118. package/dist/ui/assets/gitGraphDiagram-WWUBYQGX-BrDAzeFT.js +107 -0
  119. package/dist/ui/assets/gitGraphDiagram-WWUBYQGX-BrDAzeFT.js.map +1 -0
  120. package/dist/ui/assets/index-CVWRdirI.css +32 -0
  121. package/dist/ui/assets/index-DoR97Zqf.js +408 -0
  122. package/dist/ui/assets/index-DoR97Zqf.js.map +1 -0
  123. package/dist/ui/assets/infoDiagram-27XIBGKW-HYGaMzrA.js +3 -0
  124. package/dist/ui/assets/infoDiagram-27XIBGKW-HYGaMzrA.js.map +1 -0
  125. package/dist/ui/assets/init-Gi6I4Gst.js +2 -0
  126. package/dist/ui/assets/init-Gi6I4Gst.js.map +1 -0
  127. package/dist/ui/assets/ishikawaDiagram-5VMMS53U-DXTLlBiw.js +71 -0
  128. package/dist/ui/assets/ishikawaDiagram-5VMMS53U-DXTLlBiw.js.map +1 -0
  129. package/dist/ui/assets/journeyDiagram-3NMN7TZE-DSJ8QN1S.js +140 -0
  130. package/dist/ui/assets/journeyDiagram-3NMN7TZE-DSJ8QN1S.js.map +1 -0
  131. package/dist/ui/assets/kanban-definition-UXKFOSKX-Bm5iz0k3.js +90 -0
  132. package/dist/ui/assets/kanban-definition-UXKFOSKX-Bm5iz0k3.js.map +1 -0
  133. package/dist/ui/assets/katex-C5jXJg4s.js +258 -0
  134. package/dist/ui/assets/katex-C5jXJg4s.js.map +1 -0
  135. package/dist/ui/assets/layout-DfJgW6eG.js +2 -0
  136. package/dist/ui/assets/layout-DfJgW6eG.js.map +1 -0
  137. package/dist/ui/assets/linear-B_kyVotV.js +2 -0
  138. package/dist/ui/assets/linear-B_kyVotV.js.map +1 -0
  139. package/dist/ui/assets/mermaid-block-CUJSBQFx.js +2 -0
  140. package/dist/ui/assets/mermaid-block-CUJSBQFx.js.map +1 -0
  141. package/dist/ui/assets/mermaid.core-ExHG1WnM.js +313 -0
  142. package/dist/ui/assets/mermaid.core-ExHG1WnM.js.map +1 -0
  143. package/dist/ui/assets/mindmap-definition-YA3MSWOX-B1Hh9dQz.js +97 -0
  144. package/dist/ui/assets/mindmap-definition-YA3MSWOX-B1Hh9dQz.js.map +1 -0
  145. package/dist/ui/assets/ordinal-Cboi1Yqb.js +2 -0
  146. package/dist/ui/assets/ordinal-Cboi1Yqb.js.map +1 -0
  147. package/dist/ui/assets/pegDiagram-XKGWAZYB-x242yOd7.js +2 -0
  148. package/dist/ui/assets/pegDiagram-XKGWAZYB-x242yOd7.js.map +1 -0
  149. package/dist/ui/assets/pieDiagram-E7YTZNPT-Dl-YP7Xs.js +40 -0
  150. package/dist/ui/assets/pieDiagram-E7YTZNPT-Dl-YP7Xs.js.map +1 -0
  151. package/dist/ui/assets/quadrantDiagram-AXDQQJYC-CMJ920V9.js +8 -0
  152. package/dist/ui/assets/quadrantDiagram-AXDQQJYC-CMJ920V9.js.map +1 -0
  153. package/dist/ui/assets/railroadDiagram-O6MQD6OU-1kV83y5t.js +2 -0
  154. package/dist/ui/assets/railroadDiagram-O6MQD6OU-1kV83y5t.js.map +1 -0
  155. package/dist/ui/assets/requirementDiagram-BXWQKSXE-BFd8ZZD3.js +85 -0
  156. package/dist/ui/assets/requirementDiagram-BXWQKSXE-BFd8ZZD3.js.map +1 -0
  157. package/dist/ui/assets/sankeyDiagram-P5KCCOFB-C0LZevnf.js +41 -0
  158. package/dist/ui/assets/sankeyDiagram-P5KCCOFB-C0LZevnf.js.map +1 -0
  159. package/dist/ui/assets/sequenceDiagram-WJ2MYXX4-BasIXLJ0.js +163 -0
  160. package/dist/ui/assets/sequenceDiagram-WJ2MYXX4-BasIXLJ0.js.map +1 -0
  161. package/dist/ui/assets/sizeCapture-INFHLROL-qAtnqB7N.js +2 -0
  162. package/dist/ui/assets/sizeCapture-INFHLROL-qAtnqB7N.js.map +1 -0
  163. package/dist/ui/assets/stateDiagram-D77RDMKH-CllWDWZP.js +2 -0
  164. package/dist/ui/assets/stateDiagram-D77RDMKH-CllWDWZP.js.map +1 -0
  165. package/dist/ui/assets/stateDiagram-v2-MP3YSRHH-Dwntf8Tk.js +2 -0
  166. package/dist/ui/assets/stateDiagram-v2-MP3YSRHH-Dwntf8Tk.js.map +1 -0
  167. package/dist/ui/assets/swimlanes-42K2YHIH-Bgt0KslH.js +2 -0
  168. package/dist/ui/assets/swimlanes-42K2YHIH-Bgt0KslH.js.map +1 -0
  169. package/dist/ui/assets/swimlanesDiagram-VR7AAH4N-C9abicdw.js +9 -0
  170. package/dist/ui/assets/swimlanesDiagram-VR7AAH4N-C9abicdw.js.map +1 -0
  171. package/dist/ui/assets/timeline-definition-24CTP7MA-BYO2h9Qr.js +121 -0
  172. package/dist/ui/assets/timeline-definition-24CTP7MA-BYO2h9Qr.js.map +1 -0
  173. package/dist/ui/assets/vennDiagram-4TSXK5OY-ZzyiwIUi.js +35 -0
  174. package/dist/ui/assets/vennDiagram-4TSXK5OY-ZzyiwIUi.js.map +1 -0
  175. package/dist/ui/assets/wardleyDiagram-VM6X3IG4-DfjKCK0N.js +79 -0
  176. package/dist/ui/assets/wardleyDiagram-VM6X3IG4-DfjKCK0N.js.map +1 -0
  177. package/dist/ui/assets/xychartDiagram-S5SC5T6Z-Z7daOfmM.js +8 -0
  178. package/dist/ui/assets/xychartDiagram-S5SC5T6Z-Z7daOfmM.js.map +1 -0
  179. package/dist/ui/favicon.svg +6 -0
  180. package/dist/ui/index.html +21 -0
  181. package/package.json +70 -0
  182. package/scripts/copy-ui.mjs +21 -0
  183. package/scripts/fix-node-pty-perms.cjs +73 -0
@@ -0,0 +1,198 @@
1
+ ---
2
+ name: mermaid-diagramming
3
+ description: Como escrever diagramas Mermaid elegantes, legíveis e que renderizam de primeira na Specs Platform — escolha do tipo de diagrama, layout, paleta e classDef do tema escuro, limites de tamanho, e a lista de armadilhas de sintaxe que quebram o render. Carregue antes de escrever ou alterar qualquer bloco ```mermaid, em desenhos, specs ou discoveries.
4
+ ---
5
+
6
+ # Diagramas Mermaid
7
+
8
+ Esta skill é sobre **o desenho**, não sobre o arquivo que o contém. O formato do arquivo de um
9
+ desenho (frontmatter, tipos, `meta.json`) está em `drawing-writing`.
10
+
11
+ ## O renderer que vai desenhar isto
12
+
13
+ A Specs Platform renderiza com **Mermaid 11.17**, `theme: 'dark'`, layout **dagre** (o padrão),
14
+ fonte Inter, e estas `themeVariables`:
15
+
16
+ | variável | valor |
17
+ |---|---|
18
+ | `background` | `#1f1f1f` |
19
+ | `primaryColor` | `#986dff` (roxo do accent) |
20
+ | `primaryTextColor` | `#f9fafb` |
21
+ | `primaryBorderColor` | `#2a2a2a` |
22
+ | `lineColor` | `#6b7280` |
23
+ | `secondaryColor` | `#151515` |
24
+ | `tertiaryColor` | `#111111` |
25
+
26
+ Consequências práticas, todas verificadas neste repositório:
27
+
28
+ - **Fundo é escuro.** Toda cor que você escolher precisa contrastar com `#1f1f1f`. Preencher com
29
+ `#fff` ou usar texto `#000` sem `fill` explícito produz um bloco ilegível.
30
+ - **`layout: elk` NÃO está disponível.** O pacote `@mermaid-js/layout-elk` não está instalado; um
31
+ bloco que pede elk falha no render e a página mostra "Erro no diagrama Mermaid". Use dagre —
32
+ ou seja, não declare `layout` nenhum.
33
+ - **`securityLevel` é o padrão (`strict`).** `<br/>` funciona em rótulos; HTML arbitrário, não.
34
+ Não conte com `click`/callbacks.
35
+ - Todo bloco ```mermaid vira um card com **zoom e pan em tela cheia**. Um diagrama que não cabe na
36
+ largura da página não é um problema fatal — mas ainda é um diagrama ruim se só se lê no zoom.
37
+
38
+ ## Escolha do tipo de diagrama
39
+
40
+ Escolha pelo **tipo de pergunta**, não pelo que é mais bonito:
41
+
42
+ | A pergunta é... | Use |
43
+ |---|---|
44
+ | Que peças existem e quem fala com quem? | `flowchart` com `subgraph` por camada |
45
+ | Em que ordem as coisas acontecem, e quem espera por quem? | `sequenceDiagram` |
46
+ | Em que estados uma entidade pode estar e o que a move? | `stateDiagram-v2` |
47
+ | Como os dados se relacionam? | `erDiagram` (tabelas) ou `classDiagram` (objetos) |
48
+ | Onde estão as fronteiras de sistema/infra? | `flowchart` com subgraphs nomeados pela fronteira |
49
+
50
+ `flowchart` resolve a grande maioria. Prefira-o a `architecture-beta`, `C4Context`, `journey`,
51
+ `mindmap` e afins: são mais frágeis, menos familiares e rendem pior no tema escuro. Só use um
52
+ deles quando o `flowchart` genuinamente não expressa a ideia — e diga na legenda por quê.
53
+
54
+ ## Layout: como não produzir um diagrama largo demais
55
+
56
+ - **`flowchart TB` no topo, `direction LR` dentro de cada `subgraph`.** Faixas horizontais
57
+ empilhadas rendem um diagrama equilibrado; `LR` puro no topo produz diagramas larguíssimos que
58
+ só se leem com scroll horizontal.
59
+ - **Nunca ligue uma aresta a um `subgraph` inteiro.** Ligue sempre a um nó específico: uma aresta
60
+ apontando para o subgraph faz o Mermaid **ignorar o `direction` interno dele** — é a causa nº 1
61
+ de "por que meu diagrama ficou torto".
62
+ - **Máximo ~15 nós por diagrama.** Passou disso, o problema não é o diagrama: é o recorte. Quebre
63
+ em dois blocos ```mermaid — um panorâmico e um de detalhe — em vez de espremer tudo.
64
+ - Agrupe por **camada, fronteira ou etapa** — o que fizer o leitor achar a peça que procura.
65
+ - Prefira poucos tipos de seta. `-->` para o caminho normal, `-.->` para o assíncrono/eventual,
66
+ `==>` para o caminho crítico. Três significados já é bastante; documente-os na legenda.
67
+
68
+ ## Cor: a paleta do tema escuro
69
+
70
+ Use `classDef` — nunca `style` inline nó a nó, que é impossível de manter. Duas paletas,
71
+ dependendo do que o desenho está dizendo.
72
+
73
+ **Desenho de mudança** (o que esta task/feature vai mexer) — mesma paleta das specs:
74
+
75
+ ```
76
+ classDef changed fill:#3b2f00,stroke:#eab308,color:#fde68a
77
+ classDef added fill:#052e1a,stroke:#22c55e,color:#bbf7d0
78
+ classDef removed fill:#3b0d0d,stroke:#ef4444,color:#fecaca
79
+ classDef untouched fill:#151515,stroke:#2a2a2a,color:#9ca3af
80
+ ```
81
+
82
+ Legenda: `> 🟡 alterado · 🟢 adicionado · 🔴 removido · ⚪ inalterado (contexto)`
83
+
84
+ **Desenho de arquitetura** (como o sistema é, sem noção de mudança):
85
+
86
+ ```
87
+ classDef service fill:#241a3d,stroke:#986dff,color:#e9d5ff
88
+ classDef store fill:#0b2a3d,stroke:#38bdf8,color:#bae6fd
89
+ classDef queue fill:#3b2f00,stroke:#eab308,color:#fde68a
90
+ classDef external fill:#151515,stroke:#4b5563,color:#9ca3af
91
+ classDef actor fill:#052e1a,stroke:#22c55e,color:#bbf7d0
92
+ ```
93
+
94
+ Legenda: `> 🟣 serviço · 🔵 armazenamento · 🟡 fila/tópico · 🟢 ator · ⚪ externo`
95
+
96
+ Regras que valem para as duas:
97
+
98
+ - **A cor precisa significar uma coisa só** — natureza da mudança **ou** natureza do componente,
99
+ nunca as duas no mesmo desenho.
100
+ - **Toda paleta usada vira legenda.** Diagrama colorido sem legenda é decoração.
101
+ - Aplique com `:::classe` no nó (`SQS[notification-q]:::queue`) ou com `class A,B,C queue` no fim.
102
+ Escolha um dos dois estilos e mantenha no arquivo inteiro.
103
+
104
+ ### Onde a legenda mora
105
+
106
+ Depende de onde o diagrama está:
107
+
108
+ - **Em `.specs/drawings/`** — a página renderiza **só o diagrama**, então a legenda tem de estar
109
+ **dentro dele**, como um nó solto sem arestas:
110
+
111
+ ```
112
+ leg[[legenda: roxo servico · amarelo fila/topico · verde ator · cinza externo<br/>pontilhado = redrive automatico, nao uma chamada]]:::legend
113
+ classDef legend fill:#111111,stroke:#2a2a2a,color:#9ca3af
114
+ ```
115
+
116
+ Sem aresta ligando o nó de legenda a nada — o dagre o encosta num canto livre, que é onde ele
117
+ deve ficar. Evite acentos e `·` colados em pontuação problemática dentro do rótulo.
118
+
119
+ - **Em specs e discoveries** — o markdown em volta é renderizado, então a legenda é uma linha de
120
+ citação logo abaixo do bloco:
121
+ `> 🟡 alterado · 🟢 adicionado · 🔴 removido · ⚪ inalterado (contexto)`
122
+
123
+ ## Rótulos
124
+
125
+ - **Um nó por recurso real** — fila, tabela, use case, endpoint, serviço, job. Nada de "o backend"
126
+ ou "a camada de dados": se não dá para apontar no repositório, o nó não ajuda ninguém.
127
+ - Nomeie pelo **nome real do recurso** (`notification-q`, `ProcessEventService`,
128
+ `dev.samir.notification.adapter.out.dynamodb`), não por uma paráfrase.
129
+ - **Sem aspas duplas dentro do rótulo.** Quando precisar de caractere problemático (`(`, `)`, `:`,
130
+ `,`, `#`), envolva o rótulo inteiro em aspas duplas: `A["POST /v1/notifications (async)"]`.
131
+ Para uma aspa literal, use a entidade `#quot;`.
132
+ - **`<br/>` para quebrar linha**, nunca `\n`.
133
+ - Duas linhas por rótulo é o teto. A terceira linha vira texto abaixo do diagrama.
134
+ - IDs de nó em `camelCase` ou `kebab-case` curtos e estáveis (`snsTopic`, `notif-q`). Evite `end`
135
+ como id — é palavra reservada e quebra o parser.
136
+
137
+ ## Antes de gravar: a checklist que evita o card vermelho
138
+
139
+ 1. Todo `subgraph` tem `end`.
140
+ 2. Nenhuma aresta aponta para um `subgraph` (só para nós).
141
+ 3. Todo `classDef` declarado é usado, e todo `:::classe` referencia um `classDef` existente.
142
+ 4. Nenhum rótulo tem aspas duplas soltas nem `\n`.
143
+ 5. Não há `layout:` no frontmatter do diagrama.
144
+ 6. Contagem de nós ≤ 15.
145
+ 7. A legenda existe — nó `:::legend` dentro do diagrama num desenho, linha de citação abaixo do
146
+ bloco numa spec ou discovery.
147
+
148
+ Se puder, valide de fato antes de entregar:
149
+
150
+ ```bash
151
+ npx -y @mermaid-js/mermaid-cli -i <arquivo>.md -o /tmp/check.svg
152
+ ```
153
+
154
+ Se o mmdc não estiver disponível, diga que a validação foi só a checklist — não afirme que
155
+ renderizou.
156
+
157
+ ## Exemplo completo (arquivo de `.specs/drawings/`)
158
+
159
+ ````markdown
160
+ ---
161
+ title: "Fan-out do SNS domain-events"
162
+ type: architecture
163
+ date: 2026-09-01
164
+ ---
165
+
166
+ ```mermaid
167
+ flowchart TB
168
+ subgraph pub[Publicacao]
169
+ direction LR
170
+ prod[Publisher do evento]:::actor --> topic[SNS domain-events]:::queue
171
+ end
172
+
173
+ subgraph fanout[Fan-out]
174
+ direction LR
175
+ topic -->|filter policy<br/>PAYMENT_APPROVED, ORDER_CREATED| nq[SQS notification-q]:::queue
176
+ topic -->|sem filtro<br/>recebe tudo| aq[SQS audit-q]:::queue
177
+ nq -.->|maxReceiveCount estourado| dlq[SQS notification-dlq]:::queue
178
+ end
179
+
180
+ subgraph cons[Consumo]
181
+ direction LR
182
+ nq --> svc[notification-service]:::service
183
+ aq --> aud[consumidor de auditoria<br/>ainda nao implementado]:::external
184
+ dlq --> ops[inspecao manual<br/>via awslocal]:::external
185
+ end
186
+
187
+ leg[[legenda: roxo servico · amarelo fila/topico · verde ator · cinza externo<br/>pontilhado = redrive automatico do SQS, nao uma chamada do servico]]:::legend
188
+
189
+ classDef service fill:#241a3d,stroke:#986dff,color:#e9d5ff
190
+ classDef queue fill:#3b2f00,stroke:#eab308,color:#fde68a
191
+ classDef external fill:#151515,stroke:#4b5563,color:#9ca3af
192
+ classDef actor fill:#052e1a,stroke:#22c55e,color:#bbf7d0
193
+ classDef legend fill:#111111,stroke:#2a2a2a,color:#9ca3af
194
+ ```
195
+ ````
196
+
197
+ Repare no que **não** está no arquivo: nenhum parágrafo, nenhuma seção, nenhum título no corpo.
198
+ Todo o significado está nos rótulos dos nós e das arestas.
@@ -0,0 +1,90 @@
1
+ ---
2
+ name: prototype-check
3
+ description: Como consultar o protótipo do projeto antes de escrever ou implementar qualquer entregável visual — primeiro identificando a ferramenta (Claude Design ou Pencil) pelo bloco `prototype` do `.specs/config.json`, e só então aplicando o fluxo daquela ferramenta (abrir o canvas e ler as notas no Claude Design; Pencil MCP, node IDs e breakpoints no Pencil). Carregue em qualquer task que crie ou altere tela, componente visual ou fluxo de UI.
4
+ ---
5
+
6
+ # Consulta ao protótipo
7
+
8
+ A consulta é **bloqueante**: sem protótipo conferido, não se escreve critério de aceite visual nem
9
+ se implementa tela. Mas o *como* muda conforme a ferramenta — então a primeira coisa a fazer nunca
10
+ é abrir o protótipo, e sim **descobrir qual ferramenta o projeto usa**.
11
+
12
+ ## Passo 1 — Identificar a ferramenta (sempre primeiro)
13
+
14
+ Leia o bloco `prototype` do `.specs/config.json`:
15
+
16
+ ```json
17
+ {
18
+ "prototype": {
19
+ "tool": "claude-design",
20
+ "title": "Finance — redesign",
21
+ "url": "https://claude.ai/code/artifact/<id>",
22
+ "designDir": "design/finance-redesign",
23
+ "artboards": ["Desktop", "Mobile", "Loading"]
24
+ }
25
+ }
26
+ ```
27
+
28
+ - `tool: "claude-design"` → canvas do Claude Design, endereçado por `url`.
29
+ - `tool: "pencil"` → arquivo `.pen` local, endereçado por `file` (e opcionalmente `nodeIds`).
30
+ - Bloco ausente ou `null` → **o projeto não tem protótipo**: siga sem fase visual e diga isso no
31
+ relatório. Não invente um.
32
+
33
+ O `meta.json` da feature pode declarar o seu próprio bloco `prototype`, e ele **substitui** o do
34
+ projeto por completo — uma feature pode estar em outra ferramenta que o resto do repositório.
35
+ Cheque o `meta.json` da feature antes de assumir o default.
36
+
37
+ Sem bloco algum e com suspeita de que existe protótipo, confirme por heurística **e depois peça ao
38
+ usuário para declarar**: `.pen` versionado ⇒ Pencil; `design/**/README.md` com link
39
+ `claude.ai/code/artifact` ⇒ Claude Design.
40
+
41
+ ## Passo 2A — Claude Design
42
+
43
+ O canvas é a fonte da verdade; ele **não vive no repositório** e não há MCP para lê-lo.
44
+
45
+ 1. Abra a `url` (ou peça ao usuário que abra e descreva/exporte o artboard em questão). Na Specs
46
+ Platform, o painel **Protótipo** da task já traz o botão que abre o canvas.
47
+ 2. Leia `<designDir>/README.md` — é onde ficam registradas as decisões de design, os artboards, os
48
+ estados de erro/vazio e o mapa de componentes. É a parte versionada do protótipo, e a única
49
+ consultável offline.
50
+ 3. Confira, para a tela da task: estrutura e hierarquia; estados (loading, erro, vazio); os
51
+ breakpoints que o protótipo cobre; e quais componentes do design system entram.
52
+ 4. **Não há node ID no Claude Design.** Referencie os artboards pelo nome ("Finance · Mobile"),
53
+ nunca por id inventado.
54
+ 5. Alterações no protótipo se pedem pelo slash command `/design` do Claude Code — é o mesmo caminho
55
+ do botão "Pedir alteração" da Specs Platform. Nunca edite o canvas por outro meio.
56
+ 6. A Specs Platform embute o protótipo a partir de um **snapshot local** (`prototype.snapshot`,
57
+ default `<designDir>/canvas.html`) — o canvas publicado recusa iframe cross-origin. Depois de
58
+ alterar o design, regrave esse arquivo: leia o canvas com a tool `Artifact` (`action: "read"`) e
59
+ grave o HTML devolvido no caminho do snapshot. É o que o botão **Sincronizar** faz.
60
+
61
+ Divergência entre o README e o canvas: o **canvas ganha**, e o README deve ser atualizado na mesma
62
+ task.
63
+
64
+ ## Passo 2B — Pencil
65
+
66
+ O `.pen` é **encriptado**: nunca use `Read`/`Grep` nele. Só as tools do Pencil MCP.
67
+
68
+ As tools `pencil` normalmente **não estão disponíveis dentro de subagentes de execução** — delegue
69
+ a consulta a um sub-agente que as tenha, ou faça-a na sessão principal antes de delegar.
70
+
71
+ 1. Confirme a conexão e o arquivo aberto (estado do editor).
72
+ 2. **Obtenha os node IDs** dos nós relevantes: se o `meta.json`/`config.json` declarar `nodeIds`,
73
+ parta deles; senão, localize os nós por busca semântica pelo nome da tela/componente e confirme
74
+ com o usuário quais são os alvos antes de seguir.
75
+ 3. Para cada nó alvo, extraia: estrutura e hierarquia, tokens (cores, espaçamentos, tipografia),
76
+ estados e os **3 breakpoints** (desktop, tablet, mobile).
77
+ 4. Registre os node IDs consultados no relatório — é o que torna a consulta auditável.
78
+ 5. Alterações se pedem pelo mesmo MCP, devolvendo o antes/depois de cada nó afetado.
79
+
80
+ ## Regras comuns
81
+
82
+ - **Nada de tokens fixos na spec** (hex, px, pesos): eles mudam no protótipo e a doc passa a
83
+ mentir. Descreva estrutura e intenção; quem implementa extrai os valores no momento da
84
+ implementação.
85
+ - Tela que deveria existir e não está no protótipo: **pare e informe o usuário**. Não desenhe por
86
+ conta própria.
87
+ - No relatório da task, inclua uma seção **Validação contra o protótipo** com a ferramenta usada, o
88
+ que foi conferido (✅/❌) e — no Pencil — os node IDs.
89
+ - Ferramenta indisponível, sem resposta ou falhando após 2–3 tentativas: **pare e informe**, não
90
+ siga por aproximação.
@@ -0,0 +1,136 @@
1
+ ---
2
+ name: refinement
3
+ description: Transforma uma descrição livre em task ou feature documentada em `.specs/specs/` — contextualiza com as features existentes, valida contra o código real, fecha os requisitos sem deixar ambiguidade em silêncio e entrega uma spec pronta para o feature-runner executar. Carregue ao refinar, detalhar, especificar, quebrar ou planejar uma atividade do projeto.
4
+ ---
5
+
6
+ # refinement
7
+
8
+ Transforma uma descrição vaga em documentação **acionável, detalhada e alinhada com o estado real
9
+ do projeto** — pronta para o `feature-runner` executar.
10
+
11
+ Equivalências de tools Claude Code ↔ Cursor: `.agents/RUNTIME.md`.
12
+
13
+ ## Princípios invioláveis
14
+
15
+ 1. **Nunca altere código de produção.** Seu output é documentação em `.specs/specs/`. Leia o código
16
+ à vontade; não o modifique.
17
+ 2. **Sempre valide contra o estado real.** `Glob`, `Grep` e `Read` antes de referenciar qualquer
18
+ rota, componente, tipo ou tabela em critério de aceite. Siga a cadeia de verificação de
19
+ conhecimento da skill `requirements-closure` (código → docs → context7 → web → declarar
20
+ incerteza). **Nunca fabrique** API, campo ou comportamento — requisito inventado vira teste que
21
+ passa provando a coisa errada.
22
+ 3. **Sempre pergunte** diante de ambiguidade real de escopo, prioridade ou encaixe:
23
+ `AskUserQuestion` / `AskQuestion` com 2–4 opções concretas, recomendando uma quando tiver
24
+ opinião informada ("(Recomendado)").
25
+ 4. **Respeite as convenções** de `CLAUDE.md` (raiz), `.specs/specs/CLAUDE.md` e dos `CLAUDE.md` das
26
+ apps. Nunca invente formato novo.
27
+ 5. **Opere com paths absolutos** e **responda em português brasileiro**.
28
+ 6. **Não commite nem crie branches.**
29
+ 7. **Não altere o `status` de uma task** — isso é do `feature-runner`.
30
+
31
+ ## Skills por camada
32
+
33
+ `spec-writing` (contrato do arquivo) e `requirements-closure` (como o critério é escrito e quando
34
+ está fechado) são **obrigatórias** — carregue as duas antes de redigir qualquer critério. As demais,
35
+ conforme o que a task toca:
36
+
37
+ | Carregue | Quando |
38
+ |---|---|
39
+ | `test-strategy` | a task produz código testável — define `**Tipo:**` e `**Gate:**` do bloco de Testes. Quase sempre |
40
+ | `input-security` | a task recebe input do usuário (formulário, body, query/path param, cookie, header, upload, webhook) (opcional — só se o projeto adotar essa skill) |
41
+ | `ui-standards` | a task cria ou altera tela/componente (opcional — só se o projeto adotar essa skill) |
42
+ | `prototype-check` | a task tem entregável visual — define como identificar a ferramenta e consultar o protótipo |
43
+
44
+ Não carregue o que não vai usar.
45
+
46
+ ## Fluxo
47
+
48
+ **0. Protótipo (quando o usuário fornecer node IDs).** Consulta ao protótipo é **bloqueante**, antes
49
+ de ler código. Carregue `prototype-check` e siga o fluxo de delegação de lá. Conexão falhou ou os
50
+ nós não retornaram ⇒ **PARE e informe o usuário**.
51
+
52
+ **1. Entender a atividade.** Fixe **o quê** (funcionalidade, melhoria, correção), **por quê**
53
+ (problema que resolve) e **onde** (frontend, backend, ambos, infra, docs). Descrição vaga do tipo
54
+ "melhorar a performance" ⇒ `AskUserQuestion` para delimitar parte do sistema, comportamento atual
55
+ vs. esperado e restrições.
56
+
57
+ **2. Mapear o terreno.** → [mapear-terreno.md](references/mapear-terreno.md)
58
+
59
+ **3. Decidir a estrutura.** → [estrutura.md](references/estrutura.md)
60
+
61
+ **4. Fechar os requisitos.** → skill `requirements-closure`: o sweep das 9 dimensões implícitas
62
+ (cada uma vira requisito **ou** `N/A porque <motivo>` — nunca em branco), a redação em EARS, os IDs
63
+ de requisito e o portão de fechamento. **Esta fase não é opcional em task média ou grande.** O que
64
+ não foi resolvido com o usuário vira linha na tabela de premissas, nunca sumiço silencioso.
65
+
66
+ **5. Redigir.** Use `.specs/specs/_templates/` como ponto de partida, adaptando ao escopo real (não
67
+ copie seção que não se aplica). Siga `spec-writing` para estrutura, diagrama, blocos `<details>` e
68
+ frontmatter. Depois de escrever, atualize o `meta.json` correspondente — e o `overview.md` da
69
+ feature quando a task nova mudar o desenho macro.
70
+
71
+ **6. Validar.** → [validar-renderizacao.md](references/validar-renderizacao.md)
72
+
73
+ **7. Reportar.** → formato abaixo.
74
+
75
+ Leia cada referência **por completo** no momento em que a fase começa.
76
+
77
+ ## Regras que valem sempre ao redigir
78
+
79
+ - Task com input do usuário **tem** bloco de segurança. Sem input, o relatório declara
80
+ "Segurança de inputs: N/A — a task não processa inputs externos".
81
+ - Task de frontend **tem** blocos de responsividade, estados de UI e acessibilidade/animações.
82
+ - Decisão que depende de versão de lib (ver a stack no `project.md`): consulte a doc atual via
83
+ sub-agente com MCP `context7` antes de fixar o critério, e registre a referência no relatório.
84
+ - **Nada de token visual fixo** (hex, px, pesos) — eles vivem no protótipo, não na spec.
85
+ - Decisão que vira restrição de projeto (outra feature precisaria saber dela) ⇒ proponha ao usuário
86
+ uma entrada `AD-NNN` em `.specs/STATE.md`. Decisão feature-local fica no arquivo da task.
87
+
88
+ ## Relatório
89
+
90
+ ```markdown
91
+ ## Refinamento concluído
92
+
93
+ **Tipo:** <Nova task em feature existente | Nova feature | Refinamento de task existente>
94
+ **Feature:** <título> (`.specs/specs/<slug>/`)
95
+ **Task(s) criada(s)/refinada(s):**
96
+ - `feat-<slug>-<task>.md` — <descrição curta>
97
+
98
+ ### Resumo do escopo
99
+ - <bullet>
100
+
101
+ ### Sweep das dimensões implícitas
102
+ - <dimensão> → <requisito criado | N/A porque ...>
103
+
104
+ ### Premissas registradas
105
+ - <premissa> — default: <o que vamos fazer> — <racional>
106
+
107
+ ### Arquivos criados/modificados
108
+ - <path> (criado/editado)
109
+
110
+ ### Dependências identificadas
111
+ - <task X> (status) — <relação>
112
+
113
+ ### Decisões tomadas
114
+ - <decisão e motivo, ou "nenhuma — tudo estava claro">
115
+
116
+ ### Validação
117
+ - `node .agents/scripts/validate-spec.mjs <path>` — <0 erros / o que foi corrigido>
118
+ - Renderização conferida em `/features/<slug>/<task>` — <ok / o que falhou>
119
+
120
+ ### Pontos que merecem atenção
121
+ - <risco, ambiguidade remanescente ou sugestão de split>
122
+
123
+ ### Próximos passos
124
+ - Para **executar**: `executar feat-<slug>-<task>`
125
+ - Para **ajustar**: "Ajustar: <o que mudar>"
126
+ ```
127
+
128
+ **Entrada "Ajustar: ..."** ⇒ releia o arquivo com `Read` antes de editar, aplique **apenas** o
129
+ solicitado (não expanda escopo) e volte ao relatório atualizado.
130
+
131
+ ## Notas
132
+
133
+ - Chame tools em paralelo quando forem independentes (leituras, greps).
134
+ - Seja específico: o `feature-runner` usa seus critérios como spec de implementação.
135
+ - Gap descoberto no projeto (tipo compartilhado que falta, endpoint que deveria existir) vira
136
+ **ponto de atenção** no relatório — não expanda o escopo por conta própria.
@@ -0,0 +1,27 @@
1
+ # Decidir a estrutura
2
+
3
+ | Caso | Quando | O que produzir |
4
+ |---|---|---|
5
+ | **A** — nova task em feature existente | a atividade cabe numa feature já documentada | novo `feat-<slug>-<nome>.md` + entrada em `pages` do `meta.json` da feature |
6
+ | **B** — feature nova | a atividade não pertence a nenhuma feature existente | pasta + `meta.json` + `overview.md` + tasks + slug no `.specs/specs/meta.json` raiz |
7
+ | **C** — refinar task existente | já existe task cobrindo isso, mas rasa ou desatualizada | enriquecer o arquivo atual |
8
+
9
+ Dúvida entre A e B ⇒ `AskUserQuestion` com prós e contras.
10
+
11
+ ## Heurísticas de quebra em tasks
12
+
13
+ A fonte de verdade é a skill **`spec-writing`**, seção "Heurísticas de quebra em tasks" — quando
14
+ quebrar, quando não quebrar e como ordenar o array `pages`. Carregue-a antes de decidir o recorte;
15
+ não duplique a regra aqui.
16
+
17
+ O usuário prefere **tasks quebradas por seção**, para ter controle sobre cada entrega. Na dúvida
18
+ entre uma task grande e duas menores coesas, proponha as duas e deixe a escolha com ele.
19
+
20
+ ## Antes de escrever: a atividade merece spec?
21
+
22
+ Se a atividade é pequena e coesa (≤3 arquivos, uma camada, nenhum contrato novo), documentar custa
23
+ mais do que fazer. Diga isso ao usuário e ofereça o caminho do `refinement-runner` — refinar e
24
+ executar direto, sem produzir documento. A decisão é dele.
25
+
26
+ O inverso também vale: atividade que se quebraria em três ou mais tasks independentes **precisa** de
27
+ spec, mesmo que tenha chegado como "faz rapidinho".
@@ -0,0 +1,46 @@
1
+ # Mapear o terreno
2
+
3
+ Em paralelo, antes de decidir qualquer coisa:
4
+
5
+ - **`Glob` em `.specs/specs/*/meta.json`**, lidos todos — mapa completo de features e tasks. Para
6
+ as features relevantes, leia o `overview.md` e o frontmatter de cada task (inclusive `status`).
7
+ - **`CLAUDE.md`** da raiz, `.specs/specs/CLAUDE.md` e o `CLAUDE.md` da app afetada.
8
+ - **`.specs/STATE.md`, seção `## Decisions`** — leitura **obrigatória** antes de qualquer decisão
9
+ arquitetural. Detalhes abaixo.
10
+ - **Código relacionado** via `Grep`/`Glob`: endpoints existentes, componentes, schema do banco,
11
+ tipos e utilitários compartilhados (ver a estrutura de pacotes no `project.md`).
12
+ - **Dependências cruzadas:** o que é pré-requisito desta atividade e o que dependerá dela.
13
+ - **Discoveries** em `.specs/discoveries/` que toquem o assunto — referencie em vez de duplicar.
14
+
15
+ Escopo amplo demais para `Glob`/`Grep`: no máximo **1** chamada `Agent` com
16
+ `subagent_type: Explore`, com foco específico.
17
+
18
+ ## Decisões ativas de projeto
19
+
20
+ Toda entrada `AD-NNN` de `.specs/STATE.md` com `Status: active` é uma **restrição** que esta task
21
+ precisa respeitar. Se uma decisão de feature anterior conflita com o que é melhor aqui, você tem
22
+ duas saídas — ambas exigem escolha explícita:
23
+
24
+ 1. **Conformar** — desenhe dentro da restrição ativa.
25
+ 2. **Superar** — pergunte ao usuário e, aprovado, acrescente um `AD-NNN` novo em `.specs/STATE.md`
26
+ que substitui o antigo (marcando o antigo como `superseded by AD-NNN`) e documente o motivo. A
27
+ decisão nova passa a ser o padrão do projeto.
28
+
29
+ **Ignorar uma decisão ativa em silêncio não é opção** — cria inconsistência invisível entre
30
+ features, que só aparece meses depois.
31
+
32
+ Quando a decisão merecer documento longo (comparação de alternativas, benchmark, plano de adoção),
33
+ a discovery tipo `adr`/`rfc` é o documento e a entrada `AD-NNN` é o índice que aponta para ela.
34
+
35
+ ## Sinalizar riscos encontrados no caminho
36
+
37
+ Enquanto lê o código, anote o que encontrar de problemático **nas áreas que esta task toca**:
38
+
39
+ - código frágil — acoplamento forte, função gigante, estado implícito;
40
+ - dívida técnica — gambiarra, workaround, API deprecada;
41
+ - risco de segurança — input não validado, brecha de auth, segredo exposto;
42
+ - gargalo — N+1, loop sem limite, índice faltando;
43
+ - lacuna de teste — caminho não testado do qual esta task depende.
44
+
45
+ Cada achado vai para **Pontos que merecem atenção** no relatório, com `file:line` e o que você
46
+ sugere fazer. Não conserte nada: você não altera código de produção.
@@ -0,0 +1,29 @@
1
+ # Validar
2
+
3
+ Duas checagens. Nenhuma é opcional — erro de frontmatter, slug inconsistente ou typo no `meta.json`
4
+ quebra a página na Specs Platform.
5
+
6
+ ## 1. Validação determinística
7
+
8
+ ```bash
9
+ node .agents/scripts/validate-spec.mjs .specs/specs/<slug>/feat-<slug>-<task>.md
10
+ ```
11
+
12
+ Checa por código o que a skill `spec-writing` exige de memória: frontmatter e `status` válido,
13
+ ordem das seções, ausência de H1 no corpo, `**Depende de:**`, `### Fora de escopo`, os quatro
14
+ `classDef` do Mermaid, linha em branco nos `<details>`, heading proibido dentro de `<details>`,
15
+ critério fora de EARS, ID de requisito malformado, premissa com célula vazia, e presença do arquivo
16
+ em `pages` do `meta.json`.
17
+
18
+ **Saída ≠ 0 ⇒ corrija antes de apresentar.** Rode no arquivo que você tocou; `--all` existe para
19
+ inventário e hoje acusa as specs no formato antigo, que não são escopo do seu refinamento.
20
+
21
+ ## 2. Renderização
22
+
23
+ 1. `curl -sf http://localhost:4321/health` (UI e API na mesma porta). Não respondeu? rode
24
+ `specs status`; se não estiver no ar, peça ao usuário para rodar `specs start` na raiz.
25
+ 2. Abra as páginas criadas/editadas (`/features/<slug>` e `/features/<slug>/feat-<slug>-<task>`) —
26
+ via sub-agente com a ferramenta de E2E, ou pelos endpoints `/api/tree` e `/api/content`.
27
+ 3. Confirme: sem erro de console, título e seções renderizando, diagrama Mermaid sem erro, blocos
28
+ expansíveis abrindo, sidebar na ordem certa.
29
+ 4. Falhou algo? consulte a seção **Troubleshooting** de `SPECS.md` antes de mexer na configuração.