@tavaressan/vetor 0.1.0

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 (78) hide show
  1. package/README.md +42 -0
  2. package/bin/vetor.js +6 -0
  3. package/lib/banner.js +35 -0
  4. package/lib/commands/install.js +71 -0
  5. package/lib/commands/status.js +59 -0
  6. package/lib/commands/uninstall.js +119 -0
  7. package/lib/commands/update.js +63 -0
  8. package/lib/installer/command-exists.js +30 -0
  9. package/lib/installer/cursor-hooks.js +181 -0
  10. package/lib/installer/detector.js +79 -0
  11. package/lib/installer/manifest.js +76 -0
  12. package/lib/installer/prompts.js +97 -0
  13. package/lib/installer/writer.js +382 -0
  14. package/lib/router.js +50 -0
  15. package/package.json +39 -0
  16. package/templates/.gitkeep +0 -0
  17. package/templates/agents/code-review/agent.json +27 -0
  18. package/templates/agents/code-review/codex.toml +37 -0
  19. package/templates/agents/code-review.md +99 -0
  20. package/templates/agents/issue-worker/agent.json +33 -0
  21. package/templates/agents/issue-worker/codex.toml +57 -0
  22. package/templates/agents/issue-worker.md +112 -0
  23. package/templates/hooks/hooks-codex.json +48 -0
  24. package/templates/hooks/hooks.json +62 -0
  25. package/templates/opencode/agent/code-review.md +73 -0
  26. package/templates/opencode/agent/issue-coordinator.md +521 -0
  27. package/templates/opencode/agent/issue-worker.md +64 -0
  28. package/templates/opencode/mcp.jsonc +39 -0
  29. package/templates/opencode/plugin/vetor.ts +207 -0
  30. package/templates/opencode/scripts/agent-registration_test.ts +92 -0
  31. package/templates/opencode/scripts/check-edit.ts +147 -0
  32. package/templates/opencode/scripts/ensure-external-directory-permission.ts +110 -0
  33. package/templates/opencode/scripts/ensure-external-directory-permission_test.ts +142 -0
  34. package/templates/opencode/scripts/lib/guard.ts +45 -0
  35. package/templates/opencode/scripts/lib/model-health.ts +133 -0
  36. package/templates/opencode/scripts/lib/model-health_test.ts +181 -0
  37. package/templates/opencode/scripts/lib/project.ts +240 -0
  38. package/templates/opencode/scripts/lib/project_test.ts +45 -0
  39. package/templates/opencode/scripts/lib/status.ts +69 -0
  40. package/templates/opencode/scripts/lib/worktree.ts +41 -0
  41. package/templates/opencode/scripts/model-health.ts +50 -0
  42. package/templates/opencode/scripts/model-health_test.ts +80 -0
  43. package/templates/opencode/scripts/resolve-model.ts +112 -0
  44. package/templates/opencode/scripts/resolve-model_test.ts +185 -0
  45. package/templates/opencode/scripts/safety-check.ts +203 -0
  46. package/templates/opencode/scripts/vetor-checks.sh +217 -0
  47. package/templates/opencode/scripts/vetor-status.sh +99 -0
  48. package/templates/skills/architecture-review/SKILL.md +187 -0
  49. package/templates/skills/backlog-ideator/SKILL.md +277 -0
  50. package/templates/skills/design/SKILL.md +468 -0
  51. package/templates/skills/design/examples/design-contract-example.md +46 -0
  52. package/templates/skills/design/examples/prototype-handoff-example.md +142 -0
  53. package/templates/skills/fix-loop-agent/SKILL.md +255 -0
  54. package/templates/skills/guardian/SKILL.md +343 -0
  55. package/templates/skills/issue-coordinator/SKILL.md +596 -0
  56. package/templates/skills/retro/SKILL.md +156 -0
  57. package/templates/skills/shared/references/agent-status.template.md +68 -0
  58. package/templates/skills/shared/references/codebase-design-vocabulary.md +54 -0
  59. package/templates/skills/shared/references/conflict-resolution.md +94 -0
  60. package/templates/skills/shared/references/delegate-to-runtime.md +239 -0
  61. package/templates/skills/shared/references/design-vocabulary.md +508 -0
  62. package/templates/skills/shared/references/evidence-state.md +365 -0
  63. package/templates/skills/shared/references/frontend-design-enforcement.md +33 -0
  64. package/templates/skills/shared/references/grilling-conventions.md +64 -0
  65. package/templates/skills/shared/references/knowledge-provider-contract.md +150 -0
  66. package/templates/skills/shared/references/mcp-availability.md +104 -0
  67. package/templates/skills/shared/references/module-test-map.template.md +72 -0
  68. package/templates/skills/shared/references/planning-conventions.md +97 -0
  69. package/templates/skills/shared/references/project-conventions.md +63 -0
  70. package/templates/skills/shared/references/tdd-conventions.md +81 -0
  71. package/templates/skills/shared/references/touched-files-cache.md +30 -0
  72. package/templates/skills/spec/SKILL.md +524 -0
  73. package/templates/skills/spec-validate/SKILL.md +195 -0
  74. package/templates/skills/spec-validate/references/traceability.md +169 -0
  75. package/templates/skills/stack-practices/SKILL.md +151 -0
  76. package/templates/skills/vetor/SKILL.md +174 -0
  77. package/templates/skills/worktree-create/SKILL.md +142 -0
  78. package/templates/skills/worktree-ship/SKILL.md +394 -0
@@ -0,0 +1,468 @@
1
+ ---
2
+ name: design
3
+ description: Skill de design do Vetor — (1) detecta o modo de operação (Prototype-first/System-first/Vetor-first #213), importa um Design System existente sem duplicá-lo e mantém a Design Direction persistente em .vetor/design/; (2) Handoff de protótipo para Design Contract, com estados de interface além do happy path (#229); (3) Frontend Self-Correction Loop (Design Contract → Build → Run → Inspect → Screenshot → Accessibility Snapshot → Critique → Fix → Verify → Done) com Visual Critique em 10 dimensões e degradação graciosa sem MCP de browser. Consumida por issue-worker/fix-loop-agent ao implementar ou corrigir UI de frontend.
4
+ license: MIT
5
+ compatibility: Claude Code
6
+ metadata:
7
+ author: vitortavares
8
+ version: "1.2.0"
9
+ ---
10
+
11
+ Você é a skill de design do Vetor. Cobre três responsabilidades sequenciais do fluxo de frontend
12
+ (#213):
13
+
14
+ 1. **Setup** — detectar quais fontes de design já existem no projeto-alvo (protótipo, Design System,
15
+ ou nenhum dos dois) e adaptar o processo: importar/referenciar o Design System existente (nunca
16
+ duplicá-lo) e manter uma Design Direction persistente e específica do produto (#228).
17
+ 2. **Handoff** — quando o modo é Prototype-first, extrair do protótipo estrutura de telas,
18
+ hierarquia, componentes, tokens observáveis, conteúdo, interações, estados e responsividade, e
19
+ transformar isso em um Design Contract (#227) que preserva
20
+ `prototype intent + dados reais +
21
+ estados reais + restrições técnicas reais` — nunca uma cópia
22
+ de pixels (#229).
23
+ 3. **Loop** — depois que uma implementação de UI compila e roda, levá-la do Design Contract até um
24
+ estado verificado: corrigindo sozinha o que é objetivo e reversível, escalando ao usuário o que é
25
+ decisão de produto/design (#230).
26
+
27
+ ---
28
+
29
+ ## Sintaxe
30
+
31
+ ```
32
+ /vetor:design [<diretório>]
33
+ ```
34
+
35
+ - `<diretório>`: opcional — raiz do projeto a varrer para o Setup (modo de operação + import).
36
+ Default: raiz do projeto atual (`.`).
37
+
38
+ O Loop (self-correction) não é tipicamente invocado por um comando de usuário — é consumido por
39
+ `issue-worker`/`fix-loop-agent` (via `frontend-design-enforcement.md`) depois que a implementação de
40
+ uma tela/fluxo de UI compila e roda. Também pode ser invocado manualmente com
41
+ `Skill({skill: "vetor:design"})` para verificar uma tela de frontend já implementada.
42
+
43
+ ---
44
+
45
+ ## Referências
46
+
47
+ > Paths relativos abaixo resolvem a partir do diretório desta própria skill (informado ao carregar,
48
+ > ex. "Base directory for this skill: ..."), não do `cwd` de execução. Em comandos `bash`/`deno run`,
49
+ > prefixe o path absoluto desse diretório ao caminho relativo antes de executar — defina uma vez:
50
+ > ```bash
51
+ > SKILL_DIR="<path absoluto informado como 'Base directory for this skill' no carregamento>"
52
+ > ```
53
+ > e use `"$SKILL_DIR/../../scripts/..."` em todo comando abaixo, nunca o path relativo isolado.
54
+
55
+ - `../shared/references/design-vocabulary.md` — Design System, Design
56
+ Direction, Design Signature e o formato do Design Contract (entrada do Loop, passo 1). Não
57
+ replique as definições aqui — cite os campos. §4.4 aplica os 4 estados de Evidence State às
58
+ Decisões do Design Contract — exemplo completo em
59
+ `skills/design/examples/design-contract-example.md`. §6 documenta a árvore completa de artefatos
60
+ em `.vetor/design/`; §7 o conflito Specification × Design Contract (#231); §8 os pontos de
61
+ extensão futuros — Design Drift, Visual Debt, integração com Guardian (#231, não implementados
62
+ nesta issue).
63
+ - `../shared/references/evidence-state.md` — `OPEN_QUESTION` usado em
64
+ `patterns.md` (Setup, passo 2) quando um padrão de interação não é detectável por varredura de
65
+ filesystem.
66
+ - `../shared/references/frontend-design-enforcement.md` — direção
67
+ estética/tipográfica via skill nativa `frontend-design`, aplicada **antes** de escrever o código.
68
+ O Loop é complementar e roda **depois**: verifica o que foi construído, não decide como desenhar.
69
+ - `../shared/references/mcp-availability.md` — mecanismo de checagem de
70
+ disponibilidade (procurar `mcp__<server>__` na lista de ferramentas). Servidores relevantes aqui:
71
+ browser (`mcp__chrome-devtools__`, `mcp__playwright__`) para os passos 4-6 e 9 do Loop, Context7
72
+ para qualquer comportamento de framework/lib consultado durante o Fix (Loop, passo 8).
73
+ - `scripts/lib/design-mode.ts` — lógica de detecção/renderização do Setup (pura, testada em
74
+ `scripts/tests/design-mode_test.ts`).
75
+ - `scripts/detect-design-mode.ts` — CLI que orquestra a escrita em disco do Setup a partir da lib
76
+ acima.
77
+ - `scripts/lib/design-handoff.ts` — renderiza o Design Contract a partir da extração estruturada do
78
+ protótipo (pura, testada em `scripts/tests/design-handoff_test.ts`). Ver Handoff, abaixo.
79
+ - `scripts/handoff-prototype.ts` — CLI que lê a extração (JSON) e grava o Design Contract em
80
+ `.vetor/design/handoff/` via a lib acima.
81
+ - `scripts/lib/design-loop-mcp.ts` — `detectBrowserMcpServer`/`reportLoopStep`: formaliza o relato
82
+ de cada passo do Loop dependente de MCP de browser quando ele não está disponível, para nunca
83
+ pular uma etapa em silêncio nem fingir que a inspeção ocorreu (ver Loop §"Sem MCP de browser").
84
+ - `scripts/lib/spec-design-conflict.ts` — `detectFieldConflict`/`detectPrimaryActionConflict`:
85
+ compara um valor de decisão já extraído do Design Contract e da Specification e relata a
86
+ divergência sem escolher um lado (design-vocabulary.md §7). Usado no Loop, passo 1 (abaixo) e
87
+ passo 8.
88
+ - `../shared/references/tdd-conventions.md` — disciplina de teste aplicada
89
+ ao Fix (Loop, passo 8): reproduza o problema objetivo antes de corrigi-lo, quando o módulo tiver
90
+ suíte.
91
+
92
+ ---
93
+
94
+ ## Artefatos
95
+
96
+ Toda a árvore gravada em `.vetor/design/` — `system/`, `direction/`, `prototype/`, `handoff/` — está
97
+ documentada em `design-vocabulary.md` §6. Resumo:
98
+
99
+ ```text
100
+ .vetor/
101
+ └── design/
102
+ ├── system/ ← Setup, passo 2 (abaixo)
103
+ ├── direction/ ← Setup, passo 3 (abaixo)
104
+ ├── prototype/ ← origem observada pelo agente (Handoff, passo 1)
105
+ └── handoff/ ← Design Contract gerado (Handoff, passo 4)
106
+ ```
107
+
108
+ ---
109
+
110
+ ## Setup — Modo de operação, Design System Import, Design Direction
111
+
112
+ ### 1 — Detectar o modo de operação
113
+
114
+ ```bash
115
+ deno run -A "$SKILL_DIR/../../scripts/detect-design-mode.ts" <diretório>
116
+ ```
117
+
118
+ Saída JSON: `mode`, `hasPrototype`, `evidence`, `written`, `skipped`.
119
+
120
+ Modos, nesta ordem de prioridade (ver #213 "Modos de operação"):
121
+
122
+ 1. **Prototype-first** — existe `.vetor/design/prototype/`. Prossiga para a seção Handoff, abaixo,
123
+ para transformar o protótipo em Design Contract.
124
+ 2. **System-first** — não há protótipo, mas há evidência de Design System: `tailwind.config.*`,
125
+ `tokens.*`, `components/`/`ui/` (raiz ou `src/`), `.storybook/`, ou dependência de design em
126
+ `package.json` (`tailwindcss`, `styled-components`, `@mui/material`, `@chakra-ui/react`,
127
+ `@storybook/react`, `@emotion/styled`).
128
+ 3. **Vetor-first** — nenhuma das fontes acima. A Design Direction (passo 3) é a única fonte visual
129
+ disponível além da Specification.
130
+
131
+ Reporte o modo detectado e a evidência encontrada antes de prosseguir para os passos seguintes.
132
+
133
+ ### 2 — Design System Import (quando há evidência)
134
+
135
+ Quando `evidence` não está vazio, o script do passo 1 já escreveu (ou já existiam — ver `skipped`)
136
+
137
+ ```text
138
+ .vetor/
139
+ └── design/
140
+ └── system/
141
+ ├── tokens.md
142
+ ├── components.md
143
+ ├── patterns.md
144
+ └── evidence.md
145
+ ```
146
+
147
+ Cada arquivo:
148
+
149
+ - referencia a fonte original via frontmatter `source`/`version`/`authority: project` — **nunca
150
+ copia** valores de token, cor, tipografia, espaçamento, radius, elevation ou motion;
151
+ - é criado **uma única vez**: uma segunda execução nunca sobrescreve um arquivo já existente — a
152
+ representação em `.vetor/` é "criada/atualizável" manualmente, não regenerada a cada varredura.
153
+
154
+ `patterns.md` nunca é preenchido com um padrão de interação inferido de forma especulativa — padrões
155
+ de interação (ex.: "ações destrutivas sempre pedem confirmação") não são deriváveis de uma varredura
156
+ de arquivos, então o arquivo registra um `OPEN_QUESTION` (ver `evidence-state.md`) em vez de um
157
+ default plausível.
158
+
159
+ Se `skipped` incluir algum desses arquivos, reporte que já existiam e não foram tocados.
160
+
161
+ ### 3 — Design Direction persistente
162
+
163
+ O mesmo script garante `.vetor/design/direction/product.md`, com o esqueleto:
164
+
165
+ ```markdown
166
+ # Design Direction
167
+
168
+ ## Product
169
+
170
+ ## Audience
171
+
172
+ ## Primary job
173
+
174
+ ## Visual personality
175
+
176
+ ## Density
177
+
178
+ ## Typography
179
+
180
+ ## Palette
181
+
182
+ ## Layout
183
+
184
+ ## Design Signature
185
+
186
+ ## Motion
187
+
188
+ ## Avoid
189
+ ```
190
+
191
+ Ao preencher o esqueleto (seja você preenchendo agora, seja orientando o usuário a preencher),
192
+ aplique a regra central:
193
+
194
+ ```text
195
+ DEFAULT ≠ FORBIDDEN
196
+ ```
197
+
198
+ Um padrão comum continua permitido quando há justificativa funcional ou estética derivada do
199
+ produto, conteúdo ou interação (ver `design-vocabulary.md` §2). Nunca transforme "isso é comum em
200
+ interfaces genéricas geradas por IA" em "isso está proibido aqui" sem essa justificativa — a seção
201
+ `Avoid` documenta o que evitar **e por quê**, não uma lista de proibições universais.
202
+
203
+ Assim como os arquivos do passo 2, `product.md` é criado uma única vez — execuções seguintes
204
+ preservam qualquer edição feita nele.
205
+
206
+ ### 4 — Reportar
207
+
208
+ Resuma ao final:
209
+
210
+ - modo detectado (Prototype-first/System-first/Vetor-first) e a evidência que sustentou a decisão;
211
+ - arquivos criados nesta execução vs. arquivos que já existiam e foram preservados;
212
+ - se o Design System referenciado tem uma versão conhecida (campo `version` do frontmatter) ou
213
+ `unknown` (nenhuma dependência de design com versão detectável em `package.json`).
214
+
215
+ ---
216
+
217
+ ## Handoff — Protótipo → Design Contract
218
+
219
+ Só se aplica quando o Setup detectou `mode: "prototype-first"` (passo 1, acima). Transforma o
220
+ protótipo em `.vetor/design/prototype/` no Design Contract consumido pelo Loop — nunca uma cópia
221
+ visual do protótipo (design-vocabulary.md §4.1).
222
+
223
+ ### 1 — Observar o protótipo
224
+
225
+ A origem é a ferramenta de design suportada pelo workflow, ou qualquer outro artefato visual
226
+ disponível ao agente (imagens, export estático, MCP de design quando presente). Este passo é
227
+ trabalho do agente, não deste script: leia/observe o conteúdo de `.vetor/design/prototype/` e
228
+ extraia, conforme aplicável (design-vocabulary.md §4.2):
229
+
230
+ ```text
231
+ objetivo da experiência, telas, hierarquia, componentes, tokens observáveis, conteúdo real,
232
+ interações, estados, responsividade, restrições técnicas reais, decisões, questões abertas
233
+ ```
234
+
235
+ **Preserve, nunca copie pixels:**
236
+
237
+ ```text
238
+ prototype intent + real application data + real application states + real technical constraints
239
+ ```
240
+
241
+ Conteúdo (`content`) é sempre real — textos, labels e mensagens do produto, nunca lorem ipsum.
242
+ Restrições (`constraints`) documentam limitações técnicas reais que o protótipo pode não refletir
243
+ (ex.: um campo que o protótipo mostra sempre preenchido, mas que a API real pode retornar vazio).
244
+
245
+ ### 2 — Estados de interface (além do happy path)
246
+
247
+ O protótipo tipicamente mostra só o happy path. Avalie cada um dos 9 estados canônicos de
248
+ `design-vocabulary.md` §4.3 para a tela/fluxo:
249
+
250
+ ```text
251
+ loading, empty, populated, error, partial failure, permission denied, offline, disabled, success
252
+ ```
253
+
254
+ Para cada estado, **ou**:
255
+
256
+ - especifique-o (`states`): `trigger`, `expectedBehavior`, `primaryAction`/`visualTreatment` quando
257
+ aplicável, e `evidence` (`"Prototype"`, `"Specification"`, ou a combinação);
258
+ - marque-o como não aplicável a esta tela (`notApplicableStates`), com a razão — ex.: uma tela sem
259
+ controle de acesso por usuário não precisa de "permission denied";
260
+
261
+ **nunca omita um estado em silêncio.** `renderDesignContract` (`scripts/lib/design-handoff.ts`)
262
+ garante isso: qualquer um dos 9 estados que não for especificado nem marcado como não aplicável
263
+ aparece no documento como um bloco `OPEN_QUESTION` — a lacuna fica visível, nunca escondida.
264
+
265
+ ### 3 — Decisões e Evidence State
266
+
267
+ Classifique cada decisão de design usando `design-vocabulary.md` §4.4 (`CONFIRMED`/`INFERRED` citam
268
+ `source`; `ASSUMED` cita `reason`, nunca `source`). O que ainda não foi decidido vai para
269
+ `openQuestions` (`impact`), nunca para `decisions`. Nunca promova `INFERRED`/`ASSUMED` a `CONFIRMED`
270
+ sem evidência qualificada nova (`evidence-state.md` §5) — implementar uma leitura não a confirma.
271
+
272
+ ### 4 — Gerar o Design Contract
273
+
274
+ Monte a extração como `PrototypeExtraction` (`scripts/lib/design-handoff.ts`) num JSON e rode:
275
+
276
+ ```bash
277
+ deno run -A "$SKILL_DIR/../../scripts/handoff-prototype.ts" <extração.json> <diretório>
278
+ ```
279
+
280
+ Saída JSON: `written`, `skipped`, `unaddressedStates`. O Design Contract é gravado em
281
+ `.vetor/design/handoff/<slug-do-título>.md` — nunca sobrescreve um já existente (mesmo contrato de
282
+ `writeDesignFiles`, Setup passo 2). Exemplo completo (Painel de Worktrees, com estados Empty/Error)
283
+ em `skills/design/examples/prototype-handoff-example.md`.
284
+
285
+ ### 5 — Reportar
286
+
287
+ Resuma: título do Design Contract gerado (ou já existente, preservado), estados especificados vs.
288
+ `notApplicableStates` vs. `unaddressedStates` (estes últimos precisam de decisão humana antes da
289
+ implementação), e as questões abertas pendentes.
290
+
291
+ ---
292
+
293
+ ## Loop — Frontend Self-Correction
294
+
295
+ ### 0 — Quando aplicar
296
+
297
+ Mesmos sinais de `frontend-design-enforcement.md` §"Como detectar": label `ui`/`frontend`/`design`,
298
+ ou menção a UI, interface, layout, componente visual, tela, página, CSS, estilo, tipografia, design
299
+ system, mockup, wireframe. Não aplique a módulos puramente backend/CLI/infra.
300
+
301
+ ### 1 — Design Contract
302
+
303
+ Entrada do loop: o Design Contract da tela/fluxo (`design-vocabulary.md` §4) — objetivo, hierarquia,
304
+ componentes, tokens, estados, responsividade, acessibilidade. Se o modo é Prototype-first (Setup,
305
+ passo 1), procure primeiro um Design Contract já gerado pelo Handoff em
306
+ `.vetor/design/handoff/<slug>.md`; se ainda não existir para esta tela/fluxo, rode o Handoff (seção
307
+ acima) antes de prosseguir, em vez de tratar o protótipo como se não existisse. Só na ausência de
308
+ protótipo e de Design Contract explícito, trate a Specification + código de referência do Design
309
+ System (ver Setup, acima) como a melhor aproximação disponível e **registre isso como premissa** no
310
+ relatório final do loop — nunca invente decisões de design que deveriam vir do contrato.
311
+
312
+ Ao ler o Design Contract, confira também se ele diverge da Specification da mesma tela/fluxo em
313
+ alguma decisão relevante (ex.: ação primária) — ver `design-vocabulary.md` §7 e
314
+ `scripts/lib/spec-design-conflict.ts`. Encontrar essa divergência aqui, antes do Build, evita
315
+ implementar uma tela sobre uma base já conflitante.
316
+
317
+ ### 2 — Build
318
+
319
+ Rode o build do módulo alterado (comando do `module-test-map.md`, ou o comando de build do
320
+ projeto-alvo quando distinto do de teste). Build quebrado é sempre autocorrigível (é um erro
321
+ objetivo) — corrija e repita antes de prosseguir; não avance para Run com build vermelho.
322
+
323
+ ### 3 — Run
324
+
325
+ Suba a aplicação (dev server, preview build, ou o mecanismo que a skill `run` já usa para o
326
+ projeto). Se subir falhar, trate como o mesmo tipo de erro objetivo do passo 2.
327
+
328
+ **Sem MCP de browser disponível**, você ainda pode confirmar que o processo subiu (porta aberta, log
329
+ de inicialização) por CLI — isso não depende de MCP. O que depende de MCP são os passos 4-6.
330
+
331
+ ### 4 — Inspect
332
+
333
+ Com MCP de browser disponível: navegue até a tela (`navigate_page`), interaja com os fluxos que a
334
+ mudança afeta (`click`/`fill`/`fill_form`), e colete o estado renderizado.
335
+
336
+ **Sem MCP de browser:** chame `reportLoopStep("inspect", <ferramentas disponíveis>)` de
337
+ `scripts/lib/design-loop-mcp.ts` (ou aplique o mesmo raciocínio manualmente) e inclua a `limitation`
338
+ retornada no relatório final. Prossiga o loop com o que é verificável sem browser: leitura do
339
+ código, dos testes existentes e do Design Contract. Nunca pule esta etapa em silêncio, nunca marque
340
+ como verificada sem tê-la executado.
341
+
342
+ ### 5 — Screenshot
343
+
344
+ Com MCP: `take_screenshot` da tela em pelo menos o viewport padrão do Design Contract.
345
+
346
+ Sem MCP: mesmo tratamento do passo 4 — `reportLoopStep("screenshot", ...)`, sem inventar uma
347
+ descrição visual do que não foi capturado.
348
+
349
+ ### 6 — Accessibility Snapshot
350
+
351
+ Com MCP: capture a árvore de acessibilidade (ex.: `take_snapshot`/accessibility tree do MCP de
352
+ browser em uso) — papéis (roles), rótulos (labels), ordem de foco.
353
+
354
+ Sem MCP: mesmo tratamento — `reportLoopStep("accessibility_snapshot", ...)`. A verificação estática
355
+ ainda é possível e deve ser feita: leia o JSX/HTML alterado e confira `alt`, `aria-*`, associação
356
+ `label`/`input`, ordem de tab implícita pela ordem do DOM — mas isso é revisão de código, não
357
+ inspeção ao vivo, e o relatório final deve dizer isso explicitamente.
358
+
359
+ ### 7 — Critique (Visual Critique)
360
+
361
+ Avalie a implementação nas **10 dimensões** abaixo. Cada dimensão recebe um veredito objetivo: `ok`,
362
+ `problema encontrado` (com o achado descrito), ou `não verificável sem MCP de browser` (para as
363
+ dimensões que dependem de renderização real quando não há MCP — ver coluna "Sem MCP").
364
+
365
+ | # | Dimensão | O que avalia | Sem MCP |
366
+ | -- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------- |
367
+ | 1 | Specification fidelity | A implementação cobre o que a Specification pede — nenhum requisito perdido ou reinterpretado | Verificável (leitura de código × spec) |
368
+ | 2 | Design fidelity | A implementação reflete o Design Contract (componentes, tokens, hierarquia) — não uma interpretação livre | Parcialmente verificável (código × contrato); confirmação visual fica pendente |
369
+ | 3 | Hierarquia visual | Primário/secundário/terciário estão visualmente distinguíveis, conforme o campo "Hierarquia" do contrato | Não verificável sem MCP |
370
+ | 4 | Domain specificity | A interface tem características do produto ou poderia ser de qualquer app parecido (genérica)? | Não verificável sem MCP |
371
+ | 5 | Repetição sem justificativa semântica | Padrões repetidos (mesmo componente, mesmo layout) têm razão de domínio, não só conveniência de copiar-colar | Parcialmente verificável (código) |
372
+ | 6 | Tipografia | Escala, peso, tracking conforme Design System/Direction | Não verificável sem MCP |
373
+ | 7 | Layout | Grid/colunas/regiões conforme o campo "Layout" do contrato | Não verificável sem MCP |
374
+ | 8 | Interação/estados | Os estados de `design-vocabulary.md` §4.3 (loading/empty/error/etc.) estão implementados e navegáveis | Parcialmente verificável (código dos handlers/estados); navegação ao vivo fica pendente |
375
+ | 9 | Acessibilidade | Foco, contraste, navegação por teclado, semântica (ver passo 6) | Parcialmente verificável (estática) |
376
+ | 10 | Comportamento responsivo | Breakpoints do contrato se comportam como especificado | Não verificável sem MCP |
377
+
378
+ Cada `problema encontrado` vira um item do passo 8 (Fix ou Escalação, conforme o critério abaixo).
379
+ Cada `não verificável sem MCP de browser` entra no relatório final como limitação explícita — nunca
380
+ como `ok`.
381
+
382
+ ### 8 — Fix vs. Escalação
383
+
384
+ **Autocorrija** (objetivo e reversível):
385
+
386
+ - overflow;
387
+ - elemento ausente;
388
+ - erro JS;
389
+ - interação quebrada;
390
+ - erro de responsividade;
391
+ - console/network error;
392
+ - componente divergente do Design Contract.
393
+
394
+ **Escale ao usuário** (decisão de produto/design — nunca decida sozinho):
395
+
396
+ - interpretações legítimas conflitantes do protótipo;
397
+ - conflito Specification × Prototype;
398
+ - conflito Specification × Design Contract (ver `design-vocabulary.md` §7 e
399
+ `detectFieldConflict`/`detectPrimaryActionConflict` de `scripts/lib/spec-design-conflict.ts`);
400
+ - mudança de information architecture;
401
+ - ausência de ação primária definida;
402
+ - mudança de identidade visual;
403
+ - conflito Design System × Prototype.
404
+
405
+ Ao escalar, siga o mecanismo padrão de `BLOCKED_WAITING` (`agent-status.template.md`): descreva a
406
+ opção em conflito nos blocos `Blocked on`/`Options`/`Recommendation` — nunca escolha por conta
407
+ própria entre interpretações de design legitimamente divergentes.
408
+
409
+ Para os itens autocorrigíveis, aplique TDD quando o módulo tiver suíte (`tdd-conventions.md`):
410
+ reproduza o problema objetivo antes de corrigi-lo — uma fatia por vez, sem refatoração especulativa
411
+ fora do escopo do achado.
412
+
413
+ ### 9 — Verify
414
+
415
+ Repita os passos 2-7 que foram afetados pelo fix (não o loop inteiro, apenas o que o fix pode ter
416
+ mudado). Se um fix tocar um passo que dependia de MCP indisponível, o relatório final continua
417
+ carregando a mesma limitação daquele passo — corrigir código não substitui uma verificação visual
418
+ que nunca ocorreu.
419
+
420
+ ### 10 — Done
421
+
422
+ Produza um relatório curto com: o veredito de cada uma das 10 dimensões do passo 7, os fixes
423
+ aplicados, as escalações pendentes (se houver) e a lista de passos marcados como
424
+ `não verificável sem MCP de browser`. **Nunca** declare a tela "verificada visualmente" quando essa
425
+ lista não está vazia — declare exatamente o que foi e o que não foi confirmado.
426
+
427
+ ### Sem MCP de browser (degradação graciosa)
428
+
429
+ Este loop nunca falha nem trava por falta de MCP de browser, e nunca finge que a inspeção ocorreu.
430
+ Quando nenhum servidor de browser (`mcp__chrome-devtools__*`, `mcp__playwright__*`) está na lista de
431
+ ferramentas da sessão:
432
+
433
+ 1. Os passos 4, 5, 6 e a parte visual do 7/9 usam `reportLoopStep(<step>, <ferramentas>)` de
434
+ `scripts/lib/design-loop-mcp.ts`, que retorna `verdict: "unverified"` com uma `limitation`
435
+ explícita nomeando a etapa pulada — nunca `verdict: "verified"` sem MCP, e a função nunca lança.
436
+ 2. O loop **continua** com o que é verificável por código: build, testes existentes, leitura
437
+ estática do componente contra o Design Contract (dimensões 1, 2, 5, 8 e 9 parcialmente).
438
+ 3. O relatório final (passo 10) lista cada limitação — a ausência de MCP é um fato reportado, não um
439
+ detalhe omitido silenciosamente nem um motivo para `BLOCKED_WAITING` (a verificação visual ao
440
+ vivo é sempre opcional; sua ausência não bloqueia entrega, só limita a confiança do veredito).
441
+ 4. Confirmação visual/acessibilidade ao vivo, quando não houver MCP, fica marcada como validação
442
+ manual pendente pós-merge — nunca como critério de `GREEN` do worker.
443
+
444
+ ---
445
+
446
+ ## Restrições
447
+
448
+ - Nunca duplica ou substitui tokens/componentes de um Design System já existente — a representação
449
+ em `.vetor/design/system/` é referência/handoff, nunca uma segunda fonte concorrente de tokens.
450
+ - Nunca sobrescreve `.vetor/design/system/*.md` ou `.vetor/design/direction/product.md` já
451
+ existentes.
452
+ - Nunca varre recursivamente o filesystem em busca de evidência — só os caminhos candidatos fixos de
453
+ `scripts/lib/design-mode.ts` (raiz + primeiro nível comum), evitando falso positivo em
454
+ `node_modules/`, `dist/`, `build/`.
455
+ - Nunca promove um padrão comum a proibição universal na Design Direction sem justificativa ligada
456
+ ao produto (`DEFAULT ≠ FORBIDDEN`).
457
+ - O Handoff nunca produz um Design Contract que seja cópia do protótipo (posição de pixel,
458
+ screenshot anotada, cópia de camadas) — sempre decisões que sobrevivem à transferência para código
459
+ (design-vocabulary.md §4.1).
460
+ - O Handoff nunca omite em silêncio um dos 9 estados canônicos: cada um é especificado, marcado como
461
+ não aplicável (com razão), ou vira `OPEN_QUESTION` no documento gerado.
462
+ - O Handoff nunca promove `INFERRED`/`ASSUMED` a `CONFIRMED` sem evidência qualificada nova
463
+ (`evidence-state.md` §5).
464
+ - O conflito Specification × Design Contract nunca é resolvido silenciosamente — sempre relatado
465
+ (`spec-design-conflict.ts`) e escalado via `BLOCKED_WAITING` (#231, design-vocabulary.md §7).
466
+ - Design Drift, Visual Debt e a integração com Guardian são pontos de extensão **documentados, não
467
+ implementados** nesta issue (#231, design-vocabulary.md §8) — sem mecanismo de detecção/tracking
468
+ automático nesta skill ainda.
@@ -0,0 +1,46 @@
1
+ # Design Contract — Exemplo (Painel de Worktrees)
2
+
3
+ Fixture de referência para a integração do Design Contract com o Evidence State
4
+ (`skills/shared/references/evidence-state.md`, #214 — ver `design-vocabulary.md` §4.4). Cobre os
5
+ campos mínimos necessários para demonstrar as Decisões e a Questão aberta; não é um Design Contract
6
+ completo (campos como Tokens, Responsividade e Acessibilidade foram omitidos por não serem
7
+ necessários para este exemplo).
8
+
9
+ ## Objetivo da experiência
10
+
11
+ Permitir ao usuário visualizar os worktrees ativos do projeto e criar um novo sem sair da
12
+ aplicação.
13
+
14
+ ## Telas
15
+
16
+ Painel de Worktrees (lista) → Modal de criação de worktree.
17
+
18
+ ## Decisões
19
+
20
+ ```text
21
+ CONFIRMED
22
+ Ação primária da tela é "Criar worktree".
23
+ Source: Prototype
24
+
25
+ INFERRED
26
+ A sidebar representa navegação persistente entre projetos.
27
+ Source: Prototype + Specification
28
+
29
+ ASSUMED
30
+ Navegação desktop permanece expandida acima de 1024px.
31
+ Reason: Nenhuma tela do protótipo cobre breakpoints intermediários; premissa necessária para
32
+ avançar a especificação.
33
+ ```
34
+
35
+ ## Questões abertas
36
+
37
+ ```text
38
+ OPEN_QUESTION
39
+ Os filtros da lista de worktrees devem persistir entre sessões?
40
+ Impact: Afeta se o estado do filtro precisa ser persistido em storage do cliente ou servidor.
41
+ ```
42
+
43
+ ## Referências
44
+
45
+ - Prototype: (link do protótipo)
46
+ - Specification: (link da spec)
@@ -0,0 +1,142 @@
1
+ > Exemplo de handoff completo (#229): Design Contract gerado por
2
+ > `renderDesignContract`/`handoff-prototype.ts` (`scripts/lib/design-handoff.ts`) a partir de uma
3
+ > extração estruturada do protótipo do Painel de Worktrees. Cobre os 9 estados canônicos de
4
+ > `design-vocabulary.md` §4.3 — 4 especificados (`empty`, `error`, `loading`, `populated`) e 5
5
+ > marcados explicitamente como não aplicáveis a esta tela, cada um com a razão registrada; nenhum é
6
+ > omitido em silêncio. Continuação do exemplo mínimo de Evidence State em
7
+ > `design-contract-example.md` (#214), agora com a extração completa do handoff.
8
+
9
+ # Design Contract — Painel de Worktrees
10
+
11
+ ## Objetivo da experiência
12
+
13
+ Permitir ao usuário visualizar os worktrees ativos do projeto e criar um novo sem sair da aplicação.
14
+
15
+ ## Telas
16
+
17
+ Painel de Worktrees (lista) → Modal de criação de worktree.
18
+
19
+ ## Hierarquia
20
+
21
+ Ação primária ('Criar worktree') é o botão sólido no topo direito da tela; a lista de worktrees é o conteúdo primário abaixo dela; a sidebar é navegação secundária persistente.
22
+
23
+ ## Componentes
24
+
25
+ Button (primary/ghost), Card (item de worktree), Modal (criação), Badge (status).
26
+
27
+ ## Conteúdo
28
+
29
+ Título da tela: 'Worktrees ativos'. Botão primário: 'Criar worktree'. Cada card mostra o nome da branch e o status (ativo/stale).
30
+
31
+ ## Interações
32
+
33
+ Clique em 'Criar worktree' abre o Modal de criação. Clique num card de worktree navega para o detalhe. Clique fora do Modal ou Esc fecha sem salvar.
34
+
35
+ ## Estados
36
+
37
+ ### State: empty
38
+
39
+ Trigger:
40
+ Nenhum worktree ativo no projeto.
41
+
42
+ Expected behavior:
43
+ Explicar que não há worktree ativo no momento, sem tratar como erro.
44
+
45
+ Primary action:
46
+ Criar worktree.
47
+
48
+ Visual treatment:
49
+ Ilustração mínima + texto + botão primário, centralizado na área de conteúdo.
50
+
51
+ Evidence:
52
+ Prototype + Specification
53
+
54
+ ### State: error
55
+
56
+ Trigger:
57
+ Falha ao carregar a lista de worktrees (erro de rede ou filesystem).
58
+
59
+ Expected behavior:
60
+ Exibir mensagem de erro específica (não genérica) com opção de tentar novamente; nunca falhar silenciosamente para uma lista vazia.
61
+
62
+ Primary action:
63
+ Tentar novamente.
64
+
65
+ Evidence:
66
+ Specification
67
+
68
+ ### State: loading
69
+
70
+ Trigger:
71
+ Lista de worktrees ainda sendo carregada.
72
+
73
+ Expected behavior:
74
+ Exibir skeleton dos cards, sem layout shift quando os dados chegarem.
75
+
76
+ Evidence:
77
+ Specification
78
+
79
+ ### State: populated
80
+
81
+ Trigger:
82
+ Um ou mais worktrees ativos.
83
+
84
+ Expected behavior:
85
+ Listar cada worktree com nome da branch e status.
86
+
87
+ Evidence:
88
+ Prototype
89
+
90
+ ### State: permission denied
91
+
92
+ Not applicable:
93
+ O painel roda localmente, sem controle de permissão por usuário nesta versão.
94
+
95
+ ### State: offline
96
+
97
+ Not applicable:
98
+ Ferramenta de desenvolvimento local — não depende de conectividade externa.
99
+
100
+ ### State: disabled
101
+
102
+ Not applicable:
103
+ A ação 'Criar worktree' nunca fica desabilitada nesta tela — sempre disponível.
104
+
105
+ ### State: success
106
+
107
+ Not applicable:
108
+ Coberto pelo fluxo do Modal de criação (fora do escopo desta extração de tela).
109
+
110
+ ### State: partial failure
111
+
112
+ Not applicable:
113
+ A listagem é uma única chamada — não há sub-operações que possam falhar parcialmente.
114
+
115
+ ## Responsividade
116
+
117
+ Acima de 1024px: sidebar expandida + grid de 3 colunas de cards. Abaixo de 1024px: sidebar colapsada + lista de 1 coluna (ASSUMED — ver Decisões).
118
+
119
+ ## Referências
120
+
121
+ - Prototype: .vetor/design/prototype/painel-de-worktrees
122
+ - Specification: docs/specs/painel-de-worktrees.md
123
+
124
+ ## Decisões
125
+
126
+ CONFIRMED
127
+ Ação primária da tela é 'Criar worktree'.
128
+ Source: Prototype
129
+
130
+ INFERRED
131
+ A sidebar representa navegação persistente entre projetos.
132
+ Source: Prototype + Specification
133
+
134
+ ASSUMED
135
+ Navegação desktop permanece expandida acima de 1024px.
136
+ Reason: Nenhuma tela do protótipo cobre breakpoints intermediários; premissa necessária para avançar a especificação.
137
+
138
+ ## Questões abertas
139
+
140
+ OPEN_QUESTION
141
+ Os filtros da lista de worktrees devem persistir entre sessões?
142
+ Impact: Afeta se o estado do filtro precisa ser persistido em storage do cliente ou servidor.