ganbatte-os 0.2.38 → 0.2.41

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.
@@ -0,0 +1,75 @@
1
+ # Component Reuse Gate
2
+
3
+ > Disciplina design-to-code aplicada a CADA divergência detectada por `audit-screenshots` (e por
4
+ > `plan-blueprint` Fase 1.3). Antes de virar task de correção, toda divergência que toca uma estrutura
5
+ > reusável passa por: **mapear → checar biblioteca → decidir reuse | create | merge**. O objetivo é
6
+ > nunca corrigir com patch one-off quando a correção certa é uma primitiva compartilhada.
7
+
8
+ ## Por que
9
+
10
+ Corrigir uma tela "na mão" (className solta, JSX duplicado) resolve a tela e multiplica dívida: a próxima
11
+ tela com a mesma table/card/form repete o bug. A correção correta promove (ou reusa) uma primitiva — o
12
+ delta entre telas vira só **dados**, não estrutura.
13
+
14
+ ## Heurística de decisão (score vs biblioteca)
15
+
16
+ Para cada divergência cujo alvo é uma estrutura reusável (table, card, form, list, modal, toolbar):
17
+
18
+ 1. **Mapear** o elemento → nome de componente candidato (estilo `plan-blueprint` Fase 1.3: indexar
19
+ `dirs.components/` + `.stories.tsx`).
20
+ 2. **Rodar `component-dedup`** (ou o equivalente inline: grep nome + comparar props/estrutura/variantes).
21
+ 3. **Decidir** pelo score:
22
+
23
+ | Score vs existente | Decisão | `component_decision` | Ação na task |
24
+ |--------------------|---------|----------------------|--------------|
25
+ | 71–100% (essencialmente o mesmo) | **REUSE** | `reuse` | `component_target` = primitiva existente; muda só dados/props |
26
+ | 31–70% (overlap parcial) | **MERGE** | `merge` | combinar features → estender a primitiva (nova variant/prop) |
27
+ | 0–30% (não existe equivalente) | **CREATE** | `create` | criar primitiva nova no DS; task de criação antes do uso |
28
+
29
+ A decisão grava no frontmatter da task (`component_decision`, `component_target`). REUSE/MERGE referenciam
30
+ o path da primitiva; CREATE gera task de criação que precede a task de uso (`depends_on`).
31
+
32
+ ## Padrão de referência: DataTable + TanStack (Fractus)
33
+
34
+ Caso canônico de **REUSE**. No Fractus, `src/components/ui/data-table.tsx` é a primitiva única:
35
+
36
+ ```tsx
37
+ interface DataTableProps<TData, TValue> {
38
+ columns: ColumnDef<TData, TValue>[]
39
+ data: TData[]
40
+ loading?: boolean
41
+ emptyMessage?: string
42
+ tableRef?: React.MutableRefObject<Table<TData> | null>
43
+ }
44
+ ```
45
+
46
+ Cada tela define só `columns` + `data` e compõe a primitiva:
47
+
48
+ ```tsx
49
+ // negocios-table.tsx — NÃO reimplementa <table>, reusa DataTable
50
+ const columns = getNegociosColumns(projectId, canDelete, onDelete, deletingId)
51
+ return <DataTable columns={columns} data={negocios} loading={loading} emptyMessage="Nenhum negócio encontrado" />
52
+ ```
53
+
54
+ `negocios-table`, `funders-table`, `impacto-tab-content` — **uma primitiva, N usos**. O que muda entre
55
+ telas: **as colunas (header + cell render) e os dados das rows**. Nada de estrutura de tabela duplicada.
56
+
57
+ **Regra prática para o audit:** divergência em qualquer tabela →
58
+ - existe `DataTable` (ou equivalente) no DS? → **REUSE**: a correção é nas `columns` daquela tela OU na
59
+ primitiva (se o defeito é compartilhado). Nunca um `<table>` novo na página.
60
+ - o defeito é da primitiva (afeta todas as telas)? → corrigir na primitiva (1 task, `component_target` = `data-table.tsx`).
61
+ - precisa de comportamento que a primitiva não suporta? → **MERGE** (nova prop/variant na primitiva).
62
+
63
+ O mesmo raciocínio vale para Card, Form, Toolbar, EmptyState etc.: se a estrutura se repete ou pode se
64
+ repetir, ela é primitiva; a tela só injeta dados.
65
+
66
+ ## Saída na task
67
+
68
+ ```yaml
69
+ component_decision: reuse # reuse | create | merge
70
+ component_target: src/components/ui/data-table.tsx
71
+ override_target: NegociosTable:area-column # quando a correção é cosmética de uso
72
+ ```
73
+
74
+ A task descreve a correção em termos de **dados/props da primitiva** (REUSE), **extensão da primitiva**
75
+ (MERGE) ou **nova primitiva + adoção** (CREATE) — seguindo o modelo O QUE / ONDE / COMO / POR QUE.
@@ -0,0 +1,86 @@
1
+ # Playbook — Auditoria visual streaming (audit-screenshots)
2
+
3
+ Guia de uso do fluxo de correção visual **plano-primeiro, task-por-insumo**. Confronta o app implementado
4
+ contra o Figma e gera UM plano de correção com tasks escritas na hora — cada divergência passa pelo gate
5
+ de reuso de componente (reuse / create / merge). Substitui o modelo antigo de fila (acumular prints →
6
+ materializar no `close`).
7
+
8
+ ## Quando usar
9
+
10
+ - Você tem N telas com divergências visuais (cola prints, ou aponta rotas) e quer UM plano de fix.
11
+ - Quer auditar sistematicamente um tipo de tela contra o Figma (`validate`).
12
+ - NÃO use para planejar tela nova (use `*plan` / plan-blueprint) nem para executar (use `*execute-plan`).
13
+
14
+ ## Pré-requisitos do workspace
15
+
16
+ 1. `.gos-local/plan-paths.json` configurado (campo `figma_screen_map`; default `docs/figma-screen-map.md`).
17
+ 2. `docs/figma-screen-map.md` — mapa canônico `Rota app ↔ node-id` (contrato tela↔Figma do projeto).
18
+ 3. **Figma MCP** ativo (expected) e **Playwright** disponível (actual, captura do app vivo).
19
+ 4. `progress.txt` na raiz (criado no primeiro `*plan`/`open`).
20
+
21
+ ## Fluxo end-to-end
22
+
23
+ ### 1. Abrir o plano (uma vez por auditoria)
24
+
25
+ ```
26
+ *audit-screenshots open [SLUG]
27
+ ```
28
+
29
+ Cria `docs/plans/PLAN-NNN-fix-<SLUG>/` com `plan.md` em **`status: aberto`** (draft) + `context.md` +
30
+ `tasks/` vazio + `audit-evidence/`. **Não** roda check-plan (o plano ainda é rascunho).
31
+
32
+ ### 2. Adicionar insumos (quantos quiser, a qualquer momento)
33
+
34
+ ```
35
+ # Cole o print + contexto, OU aponte a rota para o Playwright capturar:
36
+ *audit-screenshots add "a aba negocios esta sem a coluna Area" # + imagem colada
37
+ *audit-screenshots add /dashboard/projetos/123?tab=negocios # captura via Playwright
38
+ ```
39
+
40
+ Cada insumo, NA HORA: resolve tela no mapa → captura actual (print ou Playwright) → pull Figma (MCP) →
41
+ confronta via `figma-print-diff` (single-pass, lenses 1-6) → **gate de reuso** por divergência estrutural
42
+ → escreve `tasks/T-NN-*.md` (`status: pendente`) com evidência anexada. Sem fila, sem `close` no fim.
43
+
44
+ ### 3. (Opcional) Sweep de validação por tipo de tela
45
+
46
+ ```
47
+ *audit-screenshots validate listagem # todas as telas tipo "listagem" no mapa
48
+ *audit-screenshots validate --all # varre o mapa inteiro
49
+ ```
50
+
51
+ Itera o `figma-screen-map.md`, captura Playwright + pull Figma, confronta e escreve tasks — mesmo fluxo do `add`.
52
+
53
+ ### 4. Revisar e finalizar
54
+
55
+ ```
56
+ *audit-screenshots list # tasks escritas ate agora + decisoes de componente
57
+ *audit-screenshots finalize # flip status: pendente -> roda check-plan.js -> pronto p/ execute-plan
58
+ ```
59
+
60
+ `finalize` valida que cada task é self-contained, vira o plano para `status: pendente`, dispara
61
+ `ui-guardrails` e roda `check-plan.js` (gate determinístico). Exit 0 → o plano é input de `*execute-plan`.
62
+
63
+ ```
64
+ *execute-plan PLAN-NNN-fix-<SLUG>
65
+ ```
66
+
67
+ `*audit-screenshots discard` aborta o plano aberto a qualquer momento.
68
+
69
+ ## Gate de reuso de componente (design-to-code)
70
+
71
+ Cada divergência em estrutura reusável (table, card, form, list…) NÃO vira patch one-off. O fluxo mapeia o
72
+ elemento → checa a biblioteca (`component-dedup`) → decide **reuse | create | merge** (ver
73
+ `libraries/component-reuse-gate.md`). A task grava `component_decision` + `component_target`.
74
+
75
+ **Exemplo (Fractus):** divergência numa tabela → a primitiva `DataTable` (TanStack) já existe →
76
+ decisão **reuse**. A correção é nas `columns`/dados daquela tela OU na própria primitiva (se o defeito é
77
+ compartilhado) — nunca um `<table>` novo. `negocios-table`, `funders-table` etc. = 1 primitiva, N usos.
78
+
79
+ ## Por que mudou (vs modelo de fila)
80
+
81
+ | Antes (fila) | Agora (streaming) |
82
+ |--------------|-------------------|
83
+ | `add` acumula em `audit-session.json` | `open` cria plano draft; o diretório É o estado |
84
+ | Tasks só nascem no `close` (perda de contexto) | Task escrita NA HORA, por insumo, com evidência |
85
+ | Correção = patch da tela | Correção passa pelo gate de reuso (reuse/create/merge) |
86
+ | check-plan no `close` | check-plan só no `finalize` (plano `aberto` é estado válido) |
@@ -1,219 +1,259 @@
1
1
  ---
2
2
  name: audit-screenshots
3
- description: Skill conversacional. Recebe N prints (anotados ou nao) da aplicacao em uma sessao. Mapeia print -> tela -> Figma frame via docs/figma-screen-map.md. Acumula divergencias entre inputs. Ao fechar, emite UM plano de correcao com tasks pendentes (sem executar). Mesmo template do *plan output e input direto pra *execute-plan.
4
- argument-hint: "<acao> [contexto] # acao: add | list | close [SLUG] | discard"
3
+ description: Skill conversacional de auditoria visual STREAMING. Abre UM plano de correcao (status aberto) e escreve cada task NA HORA por insumo (print/screenshot + Figma URL), em vez de enfileirar e processar no fim. Cada divergencia passa pelo gate de reuso de componente (design-to-code): mapeia -> checa biblioteca -> reuse/create/merge. Usa Figma MCP (expected), Playwright (actual), figma-print-diff (confronto). Modo validate confronta Figma x implementado varrendo figma-screen-map.md. check-plan.js roda so no finalize.
4
+ argument-hint: "<acao> [SLUG|tipo-tela] # acao: open | add | validate | list | finalize [SLUG] | discard"
5
5
  allowedTools: [Read, Glob, Grep, Bash, Write, Edit, AskUserQuestion]
6
6
  sourceDocs:
7
+ - skills/figma-print-diff/SKILL.md
8
+ - skills/component-dedup/SKILL.md
7
9
  - skills/plan-blueprint/SKILL.md
8
- - skills/plan-to-tasks/SKILL.md
10
+ - libraries/component-reuse-gate.md
11
+ - libraries/visual-diff-lenses.md
9
12
  - templates/planTemplate.md
10
13
  - templates/taskTemplate.md
14
+ - playbooks/audit-streaming-playbook.md
11
15
  use-when:
12
- - usuario cola print + diz "isso aqui esta errado"
13
- - usuario pede "compara essa tela com Figma e abre tasks"
14
- - usuario quer agrupar varias divergencias em UM plano de correcao
15
- - usuario menciona "auditoria visual" ou "tela X esta divergindo do Figma"
16
+ - usuario cola print + diz "isso aqui esta errado" (vira task na hora no plano aberto)
17
+ - usuario pede "compara essa tela com Figma e abre a correcao"
18
+ - usuario quer auditar varias telas de um tipo (validate) confrontando Figma x implementado
19
+ - acumular correcoes de N telas em UM plano de fix, com task escrita por insumo
16
20
  do-not-use-for:
17
- - executar correcao (use *execute-plan apos *audit-screenshots close)
18
- - planejar tela nova (use *plan)
21
+ - executar correcao (use *execute-plan apos *audit-screenshots finalize)
22
+ - planejar tela nova (use *plan / plan-blueprint)
19
23
  - validar plano executado (use *validate-plan)
20
24
  metadata:
21
25
  category: planning
22
26
  ---
23
27
 
24
- Voce esta executando como **Auditor Visual** via skill audit-screenshots. Acumula divergencias visuais detectadas pelo usuario em prints, mapeia cada uma pro Figma canonico, e ao fechar emite UM plano de correcao (OBJETIVO=correcao) com tasks pendentes — sem executar codigo.
28
+ Voce esta executando como **Auditor Visual Streaming** via skill `audit-screenshots`. Ao inves de
29
+ enfileirar prints e materializar o plano so no fim, voce **abre UM plano de correcao imediatamente**
30
+ (`status: aberto`) e **escreve cada task na hora** que recebe um insumo (print/screenshot + Figma URL +
31
+ contexto). Cada divergencia passa pelo **gate de reuso de componente** (design-to-code) antes de virar
32
+ task. O plano so e' fechado e validado por `check-plan.js` no `finalize`.
25
33
 
26
- ## Contrato de single-pass (CRITICO — fix do gargalo de contexto)
34
+ ## Por que streaming (pivot do modelo de fila)
27
35
 
28
- Comparacao print vs Figma deve ser SEMPRE single-pass dentro da acao `add`:
36
+ O modelo antigo (`add` acumula em `audit-session.json` -> `close` materializa tudo) perdia contexto e
37
+ nao funcionava bem. O modelo novo:
29
38
 
30
- 1. Ao receber print -> imagem fica em contexto.
39
+ - **Plano-primeiro**: `open` cria `plan.md` (draft) antes de qualquer insumo. O diretorio do plano E' o
40
+ estado — nao existe mais `audit-session.json`.
41
+ - **Task-por-insumo**: cada print/tela vira task `status: pendente` na hora, com sua evidencia anexada.
42
+ - **Gate de reuso por divergencia**: divergencia de table/card/form -> reusa primitiva existente ou cria
43
+ (nunca patch one-off). Ver `libraries/component-reuse-gate.md`.
44
+
45
+ ## Contrato atomico x streaming (CRITICO — nao quebrar check-plan.js)
46
+
47
+ `check-plan.js` exige todas as tasks `status: pendente` NA CRIACAO e e' byte-identico ao canonico.
48
+ NUNCA modificar o gate. A conciliacao e' por status do plano:
49
+
50
+ 1. `open` escreve `plan.md` com **`status: aberto`** (draft). **NAO** roda check-plan.
51
+ 2. `add`/`validate` escrevem cada `T-NN*.md` ja com **`status: pendente`** (eager).
52
+ 3. `finalize` flipa `plan.md` para **`status: pendente`** e **so entao** roda `check-plan.js`.
53
+
54
+ Plano `aberto` e' um estado valido intermediario; plano so vira input de `*execute-plan` apos `finalize`.
55
+
56
+ ## Contrato single-pass do `add` (CRITICO — fix do gargalo de contexto)
57
+
58
+ A comparacao actual vs Figma deve ser SEMPRE single-pass dentro de `add`, delegada a `figma-print-diff`:
59
+
60
+ 1. Capturar actual (print colado OU Playwright) -> imagem em disco + em contexto.
31
61
  2. Pull do frame Figma via MCP -> 2 imagens em contexto.
32
- 3. Lenses 1-6 (ver `libraries/visual-diff-lenses.md`) executadas IMEDIATAMENTE, com ambas imagens visiveis.
33
- 4. Divergencias materializadas em texto descritivo COMPLETO no JSON da sessao (`expected`, `actual`, `where`) — NUNCA "ver imagem", "comparar depois".
34
- 5. Imagens do print/figma ficam em disco para audit-evidence; texto da divergencia ja e self-contained.
35
- 6. Acao `close` NUNCA re-compara. Apenas le `audit-session.json` (puro texto) + agrupa + escreve plan/tasks.
62
+ 3. `figma-print-diff` aplica lenses 1-6 (`libraries/visual-diff-lenses.md`) IMEDIATAMENTE, ambas visiveis.
63
+ 4. Divergencias materializadas em texto COMPLETO (`where`, `expected`, `actual`) — NUNCA "ver imagem".
64
+ 5. Gate de reuso de componente roda sobre as divergencias estruturais.
65
+ 6. Task escrita na hora, self-contained. Imagens ficam em `audit-evidence/` para historico.
36
66
 
37
- Violacao -> bug. Se acao `close` perceber que alguma divergencia esta vazia/incompleta, abortar com instrucao para o usuario re-rodar `add` daquele print.
67
+ Violacao -> bug. Insumo cuja task ficar incompleta/vazia: re-rodar `add` daquele print.
38
68
 
39
69
  ## Input
40
70
 
41
71
  $ARGUMENTS
42
72
 
43
- Formato: <acao> [SLUG-opcional]
73
+ Formato: `<acao> [SLUG-ou-tipo-tela]`
44
74
 
45
75
  Acoes:
46
- - add (default quando o usuario cola imagem) registra 1+ prints na sessao corrente
47
- - listimprime resumo da sessao (prints, telas resolvidas, divergencias acumuladas)
48
- - close [SLUG]fecha sessao + emite plano PLAN-NNN-fix-audit-<SLUG-ou-iso>
49
- - discardzera sessao corrente (apaga audit-session.json + audit-images/)
76
+ - `open [SLUG]` abre o plano de correcao (draft). Default do SLUG: `<projeto>-<iso-date>`.
77
+ - `add` (default quando o usuario cola imagem) registra 1+ insumos -> 1 task cada, NA HORA.
78
+ - `validate <tipo-tela|--all>`sweep: varre `figma-screen-map.md`, captura+confronta cada tela do tipo.
79
+ - `list`resumo do plano aberto (telas, tasks, decisoes de componente).
80
+ - `finalize [SLUG]` — fecha + valida (`check-plan.js`).
81
+ - `discard` — aborta o plano aberto.
50
82
 
51
- Quando o usuario simplesmente cola imagem sem comando explicito, assumir add automaticamente.
83
+ Quando o usuario cola imagem sem comando explicito: se existe plano aberto -> `add`; senao -> `open`
84
+ (criar plano com SLUG default) e em seguida `add`.
52
85
 
53
86
  ## Pre-requisitos (gate)
54
87
 
55
- 1. Resolver paths via .gos-local/plan-paths.json. Ausente -> abortar e instruir rodar *plan ou criar manualmente o arquivo.
56
- 2. Resolver dirs.figma_screen_map (campo figma_screen_map em plan-paths.json; default: <dirs.docs>/figma-screen-map.md). Arquivo ausente -> abortar com mensagem clara: "rode *audit-screenshots apenas em projetos que mantenham docs/figma-screen-map.md (mapa canonico tela->Figma)".
57
- 3. Resolver dirs.audit_state (campo audit_session_file; default: <projeto>/.gos-local/audit-session.json).
58
- 4. Ler dirs.audit_state se existir sessao em curso. Senao, criar sessao nova ao primeiro add.
59
-
60
- ## Estado da sessao
61
-
62
- Persistido em <dirs.audit_state> (default .gos-local/audit-session.json):
63
-
64
- {
65
- "session_id": "audit-2026-05-06T14-22-03",
66
- "created_at": "<iso>",
67
- "screenshots": [
68
- {
69
- "n": 1,
70
- "image_path": ".gos-local/audit-images/01.png",
71
- "user_context": "tabela negocios mostrando coluna Area com -",
72
- "resolved_screen": "/dashboard/projetos/[id]?tab=negocios",
73
- "figma_node_id": "9140-25431",
74
- "figma_url": "https://www.figma.com/design/.../?node-id=9140-25431",
75
- "figma_image_path": ".gos-local/audit-images/01.figma.png",
76
- "divergences": [
77
- { "kind": "data-missing", "where": "coluna Area", "fix": "seed/endpoint deve popular project.area" },
78
- { "kind": "token", "where": "row hover", "fix": "bg-muted/50 (Figma) vs bg-transparent (atual)" }
79
- ]
80
- }
81
- ]
82
- }
88
+ 1. Resolver paths via `.gos-local/plan-paths.json`. Ausente -> abortar e instruir rodar `*plan` ou criar manualmente.
89
+ 2. Resolver `dirs.figma_screen_map` (campo `figma_screen_map`; default `<dirs.docs>/figma-screen-map.md`).
90
+ Arquivo ausente -> abortar: "rode *audit-screenshots apenas em projetos que mantenham docs/figma-screen-map.md".
91
+ 3. Resolver `dirs.audit_evidence` (campo `audit_evidence`; default `<plano>/audit-evidence`).
92
+ 4. Resolver **plano aberto corrente** via `progress.txt` (set-current). Se o plano corrente nao tem
93
+ `status: aberto`, `add`/`validate` exigem um `open` antes (ou abrem um novo).
94
+
95
+ ## Acao open [SLUG]
96
+
97
+ 1. **Resolver SLUG**: argumento explicito > `<projeto-name>-<iso-date>`. Sanitizar (lowercase, hifens).
98
+ 2. **Calcular PLAN-NNN**: ler `<dirs.planos>/` e pegar maior NNN + 1.
99
+ 3. **Escrever `<dirs.planos>/PLAN-NNN-fix-<SLUG>/plan.md`** de `templates/planTemplate.md`:
100
+ - Frontmatter: `objetivo: correcao`, **`status: aberto`**, `audit_streaming: true`, `created_at: <iso>`,
101
+ `figma_url:` (preenchido no primeiro `add`).
102
+ - Secoes vazias prontas para append: `## Contexto`, `## Componentes mapeados`, `## Interacoes & Estados`,
103
+ `## Page-level overrides`, `## Backend pendings`, `## Drift map`.
104
+ 4. **Escrever `context.md`** (template `contextTemplate.md`).
105
+ 5. **Criar `tasks/` vazio** e `audit-evidence/`.
106
+ 6. **progress-tracker set-current** apontando o plano novo (status aberto).
107
+ 7. **NAO rodar check-plan.js** (plano e' draft).
108
+ 8. Output:
109
+
110
+ [audit] PLAN-NNN-fix-<SLUG> ABERTO (status: aberto)
111
+ cole prints (add) ou rode *audit-screenshots validate <tipo-tela> | finalize
83
112
 
84
113
  ## Acao add
85
114
 
86
- 1. **Salvar imagem(s)** colada(s) pelo usuario em .gos-local/audit-images/NN.png (n = ultimo + 1; multiplas imagens na mesma mensagem viram NN, NN+1, ...). Criar diretorio se necessario.
87
- 2. **Identificar tela** (prioridade):
88
- a) Mencao explicita do usuario na mesma mensagem ("e a aba negocios", "/dashboard/projetos/123") -> matchar no figma-screen-map.md.
89
- b) Heuristica visual: ler titulo/breadcrumb/URL visivel no print (use modelo multimodal pra extrair texto). Match por substring contra a coluna "Rota app" do mapa.
90
- c) Ambiguo ou sem sinal: AskUserQuestion listando 5 candidatos top do mapa + opcao "outro" (usuario digita rota).
91
- 3. **Resolver figma_node_id + URL** via lookup no mapa.
92
- 4. **Pull do frame Figma** via Figma MCP get_image pelo node-id. Salvar em .gos-local/audit-images/NN.figma.png. Se Figma MCP indisponivel: registrar figma_image_path: null e seguir (comparacao fica baseada apenas no print + node-id).
93
- 5. **Comparacao single-pass** (lenses 1-6 com ambas imagens em contexto AGORA):
94
- - Aplicar lenses na ordem (layout -> tokens -> estados -> conteudo -> interacao -> a11y) — ver `libraries/visual-diff-lenses.md`.
95
- - Listar divergencias em divergences[] (kind: anatomy | token | behavior | data-missing | state-missing | cleanup-legacy).
96
- - **CADA divergencia DEVE ter** `where` (localizacao precisa), `expected` (do Figma), `actual` (do print). Sem qualquer um, NAO persistir — re-aplicar lens.
97
- - **Anotacoes em vermelho do usuario** = high-signal: cada item anotado vira divergencia com peso 2x (quase certamente vira task no close).
98
- - Comentarios livres do usuario (user_context) = high-signal igual.
99
- - Validar self-contained: usuario que ler so o JSON (sem ver imagem) entende cada item? Se nao -> reescrever.
100
- 6. **Persistir** entrada nova no audit-session.json (somente apos validar self-contained).
101
- 7. **Output ao usuario** (curto):
102
-
103
- [audit] +1 print (total: N) tela: <rota> (node-id: NNNN-NNNNN)
104
- divergencias detectadas: <K> (alta-confianca: <H>)
105
- proximo: cole outro print, *audit-screenshots list, ou *audit-screenshots close
115
+ Para cada insumo (print colado OU rota a capturar):
116
+
117
+ 1. **Identificar tela** (prioridade):
118
+ a) Mencao explicita do usuario ("aba negocios", "/dashboard/projetos/123") -> match no figma-screen-map.
119
+ b) Heuristica visual: ler titulo/breadcrumb/URL do print (multimodal) -> substring contra "Rota app".
120
+ c) Ambiguo: `AskUserQuestion` com 5 candidatos top do mapa + "outro".
121
+ 2. **Resolver figma_node_id + URL** via lookup no mapa.
122
+ 3. **Capturar ACTUAL**:
123
+ - Print colado pelo usuario -> salvar em `<audit_evidence>/NN.png`.
124
+ - Sem print -> **Playwright** captura a rota viva (`browser_navigate` + `browser_take_screenshot`,
125
+ headless) -> `<audit_evidence>/NN.png`. Casos interativos (hover/drawer aberto) -> browser-use.
126
+ 4. **Pull EXPECTED**: Figma MCP `get_image` pelo node-id -> `<audit_evidence>/NN.figma.png`. MCP
127
+ indisponivel: seguir so com actual + node-id (registrar `figma_image_path: null`).
128
+ 5. **Confrontar (single-pass)**: invocar `figma-print-diff <audit_evidence>/NN.png <figma-url>` -> JSON de
129
+ divergencias (lenses 1-6, cada uma com `where`/`expected`/`actual`/`kind`/`severity`/`fix`).
130
+ 6. **Gate de reuso de componente** (`libraries/component-reuse-gate.md`) por divergencia estrutural
131
+ (table/card/form/list/modal/toolbar):
132
+ - Mapear elemento -> componente DS candidato (indexar `dirs.components/` + `.stories.tsx`, estilo
133
+ `plan-blueprint` Fase 1.3).
134
+ - Rodar `component-dedup` (candidato vs biblioteca) -> decisao `reuse | create | merge` + score.
135
+ - Heuristica DataTable: divergencia de tabela -> `component_target` = primitiva existente (ex.:
136
+ `components/ui/data-table.tsx`); correcao e' nas `columns`/dados OU na primitiva — nunca `<table>` novo.
137
+ 7. **Escrever task(s) NA HORA** em `tasks/T-NN-<componente>-<fix-slug>.md` (1 task por divergencia,
138
+ agrupando triviais por componente), modelo **O QUE / ONDE / COMO / POR QUE**:
139
+ - Frontmatter: **`status: pendente`**, `priority` (high-signal/anotacao vermelha -> P0), `area`
140
+ (`ui-ux` token/anatomy | `frontend` behavior/data-missing), `audit_evidence: audit-evidence/NN.png`,
141
+ `figma_url:`, `component_decision: reuse|create|merge`, `component_target:`, e quando aplicavel
142
+ `interaction_target:` / `override_target:` / `depends_on_backend:`.
143
+ - `## Contexto` (por que: a divergencia), `## Objetivo`+`### Entrega` (o que), `## Arquivos` (onde: path
144
+ concreto criar/editar), `## Plano de execucao` (como). Task sem path concreto e' malformada.
145
+ - `create` gera task de criacao da primitiva ANTES da task de uso (`depends_on`).
146
+ 8. **Append no plano**: 1 linha em `## Componentes mapeados`, divergencia em `## Drift map`, behavior em
147
+ `## Interacoes & Estados`, token em `## Page-level overrides` (decisao a/b/c), data-missing em
148
+ `## Backend pendings`.
149
+ 9. **Output curto**:
150
+
151
+ [audit] +1 tela: <rota> (node-id NNNN-NNNNN) -> <T> task(s) escritas
152
+ divergencias: <K> (alta <H>) | reuso: <reuse>R <merge>M <create>C
153
+ proximo: cole outro print | *audit-screenshots validate <tipo> | list | finalize
154
+
155
+ ## Acao validate <tipo-tela|--all>
156
+
157
+ Sweep sistematico Figma x implementado, alimentando o mesmo fluxo de `add`:
158
+
159
+ 1. Ler `figma-screen-map.md` e filtrar telas por `tipo-tela` (coluna de secao/categoria) ou todas (`--all`).
160
+ 2. Para cada tela: resolver rota + node-id; **Playwright** captura actual; Figma MCP pull expected;
161
+ `figma-print-diff` confronta; gate de reuso; **escrever task(s) na hora** (passos 5-8 do `add`).
162
+ 3. Telas sem node-id no mapa -> warning, pular (registrar em `## Notas` do plano).
163
+ 4. Output: tabela tela x divergencias x tasks geradas + total.
164
+
165
+ Requer `open` previo (ou abre plano novo `PLAN-NNN-fix-validate-<tipo>`).
106
166
 
107
167
  ## Acao list
108
168
 
109
- Le audit-session.json e imprime tabela:
110
-
111
- [audit-session <session_id>] iniciada <created_at>
112
-
113
- # print tela divergencias
114
- 1 audit-images/01 /dashboard/projetos/[id]?tab=negocios 3 (1 alta)
115
- 2 audit-images/02 /dashboard/projetos 5 (3 alta)
116
- 3 audit-images/03 /dashboard/financiadores 2
117
-
118
- total: 10 divergencias em 3 telas
119
- proximo: *audit-screenshots close [SLUG-opcional] -> emite PLAN-NNN-fix-audit-<SLUG>
120
-
121
- Nao emite plano. Nao modifica estado.
122
-
123
- ## Acao close [SLUG]
124
-
125
- **REGRA CRITICA**: `close` opera SOMENTE sobre o JSON da sessao (texto). NUNCA re-le imagens. NUNCA re-aplica lenses. Se uma divergencia esta vazia/incompleta no JSON, abortar com mensagem ao usuario para re-rodar `add` daquele print especifico — close nao tenta consertar.
126
-
127
- 1. **Resolver SLUG**: argumento explicito > <projeto-name>-<iso-date>. Sanitizar (lowercase, hifens).
128
- 1.5. **Validar self-contained**: ler audit-session.json e verificar que cada divergencia tem `where`, `expected`, `actual`, `kind`, `fix`. Faltando -> abortar com lista de prints incompletos.
129
- 2. **Calcular PLAN-NNN**: ler <dirs.planos>/ e pegar maior NNN existente + 1.
130
- 3. **Agrupar divergencias por tela** (resolved_screen).
131
- 4. **Emitir <dirs.planos>/PLAN-NNN-fix-audit-<SLUG>/plan.md** baseado em templates/planTemplate.md:
132
- - Frontmatter: objetivo: correcao, audit_session: <session_id>, created_at: <iso>, status: pendente, figma_url: <primeiro figma_url da sessao>.
133
- - Secao ## Contexto: lista os prints com user_context resumido.
134
- - Secao ## Componentes mapeados: 1 linha por divergencia (Componente = inferir do where).
135
- - Secao ## Interacoes & Estados: 1 bullet por divergencia tipo behavior ou state-missing.
136
- - Secao ## Page-level overrides: 1 linha por divergencia tipo token (decisao default (a) className na pagina; usuario pode reclassificar depois).
137
- - Secao ## Backend pendings: 1 linha por divergencia tipo data-missing.
138
- - ## Drift map: copia das divergencias detectadas (usado por validate-plan no fechamento).
139
- - ## Cleanup de starter legado: divergencias tipo cleanup-legacy se houver.
140
- 5. **Emitir tasks/T-NN-<componente>-<fix-slug>.md** (1 task por divergencia, agrupando triviais por componente):
141
- - Frontmatter: status: pendente, priority: P1 (high-signal -> P0), area: ui-ux (token/anatomy) ou area: frontend (behavior/data-missing).
142
- - interaction_target: ou override_target: populado quando aplicavel.
143
- - Campo novo: audit_evidence: audit-evidence/NN.png apontando pro print original.
144
- 6. **Copiar evidencias** pra <dirs.planos>/PLAN-NNN-fix-audit-<SLUG>/audit-evidence/:
145
- - Prints originais (NN.png).
146
- - Figma frames capturados (NN.figma.png).
147
- - Cada um nomeado igual ao indice da sessao.
148
- 7. **Emitir context.md** padrao (template contextTemplate.md).
149
- 8. **Atualizar progress.txt** via progress-tracker set-current apontando pro plano novo.
150
- 9. **Rodar gate determistico** node <repo>/.gos/scripts/integrations/check-plan.js <plano>:
151
- - Exit 0 -> seguir.
152
- - Exit != 0 -> abortar e devolver saida do check-plan.
153
- 10. **Arquivar sessao**: mover audit-session.json pra .gos-local/audit-archive/<session_id>.json. NAO apagar imagens (ficam em audit-images/ pra historico).
154
- 11. **Output final**:
169
+ Le `tasks/` do plano aberto (NAO re-le imagens) e imprime:
170
+
171
+ [audit PLAN-NNN-fix-<SLUG>] status: aberto
172
+
173
+ # task tela decisao priority
174
+ 1 T-01-data-table-area-column /dashboard/projetos reuse P1
175
+ 2 T-02-stat-card-flat /dashboard merge P1
176
+
177
+ total: N tasks em K telas | reuso: R reuse / M merge / C create
178
+ proximo: *audit-screenshots finalize <SLUG> -> roda check-plan.js
155
179
 
156
- [audit-screenshots] PLAN-NNN-fix-audit-<SLUG> criado
180
+ ## Acao finalize [SLUG]
181
+
182
+ **REGRA**: `finalize` opera sobre os arquivos ja escritos (tasks + plan). NAO re-le imagens, NAO re-confronta.
183
+
184
+ 1. **Resolver plano aberto** (progress.txt set-current) ou pelo SLUG.
185
+ 2. **Validar self-contained**: cada `T-NN*.md` tem `## Arquivos` com path concreto, `## Objetivo`,
186
+ `## Plano de execucao`, e frontmatter `status: pendente`. Faltando -> abortar listando tasks incompletas
187
+ (instruir re-rodar `add` daquele insumo). `finalize` nao conserta.
188
+ 3. **Flip do plano**: `plan.md` frontmatter `status: aberto` -> **`status: pendente`**. Preencher `## Contexto`
189
+ consolidado (lista de telas auditadas).
190
+ 4. **Disparar `ui-guardrails <plano>`** — trava task de UI sem estados/responsivo/a11y/tokens.
191
+ 5. **progress-tracker set** (status pendente).
192
+ 6. **Rodar gate deterministico** `node <repo>/.gos/scripts/integrations/check-plan.js <plano>`:
193
+ - Exit 0 -> seguir.
194
+ - Exit != 0 -> abortar e devolver a saida literal do check-plan.
195
+ 7. Output final:
157
196
 
158
- prints processados: <N>
159
- telas afetadas: <K>
160
- tasks criadas: <T> (<P0> P0 / <P1> P1)
197
+ [audit-screenshots] PLAN-NNN-fix-<SLUG> FINALIZADO (status: pendente)
161
198
 
162
- plano: docs/plans/PLAN-NNN-fix-audit-<SLUG>/plan.md
163
- tasks: docs/plans/PLAN-NNN-fix-audit-<SLUG>/tasks/ (T tasks)
164
- progress: atualizado (status=pendente)
199
+ telas auditadas: <K>
200
+ tasks: <T> (<P0> P0 / <P1> P1) | reuso: <R>R <M>M <C>C
201
+ plano: docs/plans/PLAN-NNN-fix-<SLUG>/plan.md
202
+ progress: atualizado (status=pendente)
165
203
 
166
- proximo passo: *execute-plan PLAN-NNN-fix-audit-<SLUG> (Codex IDE)
204
+ proximo passo: *execute-plan PLAN-NNN-fix-<SLUG>
167
205
 
168
206
  ## Acao discard
169
207
 
170
- 1. Confirmacao inline obrigatoria: AskUserQuestion com 2 opcoes (Sim, descartar tudo / Nao, manter sessao).
171
- 2. Confirmado: apagar .gos-local/audit-session.json + diretorio .gos-local/audit-images/ (todos os prints + frames Figma da sessao corrente).
172
- 3. Output: [audit] sessao descartada (N prints removidos).
208
+ 1. Confirmacao inline (`AskUserQuestion`: Sim, descartar / Nao, manter).
209
+ 2. Confirmado: remover `<dirs.planos>/PLAN-NNN-fix-<SLUG>/` (plano + tasks + audit-evidence) e limpar
210
+ progress set-current. Output: `[audit] plano aberto descartado (T tasks, N evidencias removidas)`.
173
211
 
174
212
  ## Resolver de tela (parser do figma-screen-map.md)
175
213
 
176
- figma-screen-map.md e markdown com tabelas | Tela | ... | Rota app | node-id | ... |.
214
+ `figma-screen-map.md` e' markdown com tabelas `| Tela | ... | Rota app | node-id | ... |`.
177
215
 
178
- Algoritmo:
179
- 1. Ler arquivo.
180
- 2. Extrair todas tabelas via regex (linhas iniciando com |).
181
- 3. Pra cada tabela, identificar coluna Rota app e node-id (case-insensitive, varia entre tabelas).
182
- 4. Construir lookup {rota_normalizada: {node_id, secao, label}} (normalizar = lowercase, remover query strings opcionais).
183
- 5. Match por:
184
- - Equality exato: rota visivel no print bate com chave do lookup -> resolvido.
185
- - Substring: rota do print contem chave do lookup -> resolvido com warning.
186
- - Multiplos matches: AskUserQuestion listando candidatos.
187
- 6. Suportar query strings (?tab=negocios) como parte da rota (mapas separam abas).
216
+ 1. Ler arquivo. Extrair todas as tabelas (linhas iniciando com `|`).
217
+ 2. Identificar colunas `Rota app` e `node-id` por tabela (case-insensitive).
218
+ 3. Construir lookup `{rota_normalizada: {node_id, secao, label}}` (lowercase, query strings opcionais).
219
+ 4. Match: equality exato > substring (warning) > multiplos (`AskUserQuestion`).
220
+ 5. Suportar query strings (`?tab=negocios`) como parte da rota.
188
221
 
189
222
  ## Acoplamento com pipeline
190
223
 
191
- - Plano gerado e input direto pra *execute-plan e *validate-plan — segue 100% o template padrao + frontmatter compativel.
192
- - Sub-fases 1.5 (drift map) e 1.6 (cleanup legado) do plan-blueprint NAO rodam aqui (audit JA e o drift map empirico). Mas se legacy_starter_dirs declarado em plan-paths.json, divergencias tipo cleanup-legacy sao detectadas durante add e viram tasks T-NN-cleanup-legacy-<slug>.
193
- - Schema gate (Fase 2.4) NAO roda aqui divergencias tipo data-missing viram entrada em ## Backend pendings direto, sem confronto com Postman/Prisma (audit assume usuario sabe o que esta vendo).
194
- - progress-tracker segue identico plano de audit aparece no progress.txt como qualquer outro.
224
+ - Plano gerado e' input direto de `*execute-plan` e `*validate-plan` — segue o template padrao + frontmatter.
225
+ - `figma-print-diff` e' a primitiva de confronto (single-pass) esta skill nao reimplementa lenses.
226
+ - `component-dedup` + `libraries/component-reuse-gate.md` resolvem reuse/create/mergenao duplicar.
227
+ - Sub-fases 1.5 (drift) e 1.6 (cleanup legado) do `plan-blueprint` NAO rodam aqui (o audit JA e' drift
228
+ empirico). Se `legacy_starter_dirs` em plan-paths.json, divergencias `cleanup-legacy` viram task.
229
+ - Schema gate (Fase 2.4) NAO roda; divergencias `data-missing` viram `## Backend pendings` direto.
230
+ - `plan-blueprint` e' "1 tela = 1 plano"; o audit e' "N telas -> 1 plano de fix" (orquestracao por cima).
195
231
 
196
232
  ## Regras criticas
197
233
 
198
- - **Sem execucao**: skill NUNCA modifica codigo da aplicacao. Ela cria plano + tasks (status: pendente). User roda *execute-plan separado se quiser.
199
- - **Sessao persistente**: state em .gos-local/audit-session.json permite acumular prints entre invocacoes ate close. Sessao orfa (nao fechada por dias) eh ok — discard limpa.
200
- - **Mapeamento canonico obrigatorio**: sem figma-screen-map.md, skill aborta. Esse arquivo eh o contrato tela<->Figma do projeto.
201
- - **Anotacoes em vermelho = high-signal**: peso 2x na decisao de virar task. Sem anotacao, ainda detecta automaticamente, mas com peso menor.
202
- - **Output e input do pipeline existente**: nao reinventa template, usa templates/planTemplate.md + taskTemplate.md.
234
+ - **Sem execucao**: skill NUNCA modifica codigo da aplicacao. So cria plano + tasks (status: pendente).
235
+ User roda `*execute-plan` separado.
236
+ - **Plano-primeiro**: `open` antes de qualquer insumo. O diretorio do plano E' o estado (sem audit-session.json).
237
+ - **Eager + self-contained**: cada insumo vira task na hora, com evidencia textual completa. `finalize` so valida.
238
+ - **Gate de reuso obrigatorio**: divergencia estrutural sempre passa por reuse/create/merge antes de virar task.
239
+ - **check-plan.js so no finalize**: nunca na abertura. Nunca modificar o gate.
240
+ - **Mapeamento canonico obrigatorio**: sem `figma-screen-map.md`, skill aborta.
241
+ - **Anotacoes em vermelho = high-signal**: peso 2x (P0).
203
242
 
204
243
  ## Model guidance
205
244
 
206
245
  | Escopo | Modelo |
207
246
  |--------|--------|
208
247
  | add com 1-2 prints simples | sonnet |
209
- | add com print complexo (10+ divergencias visiveis) | opus |
210
- | close com 5+ telas / 20+ tasks geradas | opus |
248
+ | add com print complexo (10+ divergencias) / gate de reuso denso | opus |
249
+ | validate sweep (5+ telas) | opus |
211
250
  | list / discard | haiku |
212
251
 
213
252
  ## Instructions
214
253
 
215
- 1. Ao receber imagem sem comando explicito, assumir *audit-screenshots add.
254
+ 1. Ao receber imagem sem comando: plano aberto existe -> `add`; senao -> `open` + `add`.
216
255
  2. NUNCA executar codigo da aplicacao — skill so planeja.
217
- 3. Sessao persiste em .gos-local/ ate close ou discard.
218
- 4. Plano gerado SEMPRE roda check-plan.js antes de devolver controle ao usuario.
219
- 5. Ao final do close, instruir o usuario do proximo passo (*execute-plan PLAN-NNN-fix-audit-<SLUG>).
256
+ 3. Estado vive no diretorio do plano aberto (status: aberto) ate `finalize` ou `discard`.
257
+ 4. `add`/`validate` escrevem tasks `status: pendente` na hora; `finalize` flipa o plano e roda check-plan.js.
258
+ 5. Confronto visual delegado a `figma-print-diff`; reuso a `component-dedup` + `component-reuse-gate.md`.
259
+ 6. Ao final do `finalize`, instruir `*execute-plan PLAN-NNN-fix-<SLUG>`.
@@ -23,6 +23,11 @@ metadata:
23
23
 
24
24
  Voce esta executando como **Visual Diff Auditor** via skill `figma-print-diff`. Faz UMA comparacao em UM unico passo, sem persistir sessao. Imagem do print + frame Figma DEVEM permanecer no contexto da inferencia ate o output final.
25
25
 
26
+ > **Primitiva de confronto**: esta skill e' o passo de confronto chamado por `audit-screenshots` (orquestrador
27
+ > streaming) a cada insumo. Mantem-se pura print<->Figma — nao abre plano, nao escreve task, nao decide reuso.
28
+ > O `actual` (print) pode ser um screenshot colado pelo usuario OU um PNG capturado por Playwright pelo
29
+ > orquestrador (rota viva); aqui e' so um `print-path` que ja existe em disco.
30
+
26
31
  ## Contrato critico
27
32
 
28
33
  1. **Single-pass**: ler print + Figma + comparar + emitir output em UMA chamada do agente. NAO enfileirar.
@@ -212,6 +212,9 @@ Para cada elemento mapeado:
212
212
 
213
213
  Regras de geração de tasks (cobertura de comportamento + overrides):
214
214
 
215
+ - **Modelo O QUE / ONDE / COMO / POR QUE**: cada task nasce respondendo as 4 perguntas (Contexto=por que, Objetivo+Entrega=o que, Arquivos=onde, Plano de execução=como). O `plan-to-tasks` materializa isso a partir do `## Plano de execução` (como) + `context.md` `## Arquivos relevantes` (onde). Task sem path concreto em `## Arquivos` é malformada.
216
+ - **Tabela de regressão + Anti-padrões**: o `plan.md` preenche `## Tabela de regressão` (fluxos a não quebrar) e `## Anti-padrões` (proibições, derivadas das memórias do projeto). `validate-plan` confere ambos no fechamento.
217
+
215
218
  - Toda interação em `## Interações & Estados` deve gerar **ao menos 1 task** com `interaction_target:` apontando pra ela. Se uma task cobre múltiplas interações, listar todos os slugs.
216
219
  - Toda linha de `## Page-level overrides` com decisão **(b)** gera task de variant na story (`area: ui-ux`, `agent:ux-design-expert`); decisões **(a)** e **(c)** geram tasks na página (`area: frontend`, `agent:dev`). Em ambos os casos, frontmatter da task declara `override_target:` apontando pro slug.
217
220
  - Tasks de seed data (quando aplicável — Tabela ou Form com fields no Figma) declaram fields obrigatórios e referenciam o checklist "Seed popula TODOS os campos exibidos".
@@ -225,6 +228,11 @@ Se a análise identificar mais de 3 seções autônomas (modais, drawers, sub-ro
225
228
 
226
229
  Frontmatter linka via `parent_plan` / `children_plans`.
227
230
 
231
+ > **Quando NAO usar plan-blueprint**: `plan-blueprint` e' "1 tela = 1 plano" (implantacao do zero). Para
232
+ > auditoria visual que acumula correcoes de **N telas em UM plano de fix** (confronto Figma x implementado,
233
+ > task por insumo), use `audit-screenshots` (orquestrador streaming) — ele reusa esta Fase 1.3 (mapeamento +
234
+ > reuso de componente) e `figma-print-diff` como primitivas.
235
+
228
236
  ## Saída
229
237
 
230
238
  Para cada plano (incluindo filhos), os 4 passos abaixo são **obrigatórios e atômicos** — `*plan` NÃO termina sem todos. Falhar qualquer um aborta com erro explícito (não retornar plano-sem-tasks ao usuário; foi exatamente isso que motivou o bug do PLAN-006).
@@ -84,7 +84,15 @@ Campos obrigatórios do frontmatter (do `taskTemplate.md`, presentes em CADA T-N
84
84
  - **`status: pendente`** — invariante. Sem isso o `progress-tracker` não consegue transicionar e o `*execute-plan`/`*validate-plan` quebram.
85
85
  - `valida_em`, `depends_on_backend: []`, `interaction_target: []`, `override_target: []`, `assignees: []`, `links: []`
86
86
 
87
- Body: copiar as seções do `taskTemplate.md` (`## Contexto`, `## Objetivo`, `## Plano de execução`, `## Critérios de aceitação (DoD)`, `## Riscos & Rollback`) — **NÃO** adicionar seção `## Status` no body. Status vive APENAS no frontmatter.
87
+ Body: copiar as seções do `taskTemplate.md` — **NÃO** adicionar seção `## Status` no body. Status vive APENAS no frontmatter.
88
+
89
+ **Modelo O QUE / ONDE / COMO / POR QUE (obrigatório)**: toda task gerada DEVE responder às 4 perguntas, sem placeholder:
90
+ - **POR QUE** → `## Contexto` (gap/motivação, link ao plano pai).
91
+ - **O QUE** → `## Objetivo` + `### Entrega` (entregável observável).
92
+ - **ONDE** → `## Arquivos` (tabela com `criar`/`editar`/`deletar` + path exato — extraído do `context.md` `## Arquivos relevantes` e do `## Plano de execução` do plano pai).
93
+ - **COMO** → `## Plano de execução` (passos acionáveis).
94
+
95
+ Task com `## Arquivos` vazio ou genérico (sem path concreto) é malformada — o executor não pode adivinhar onde mexer. Regenerar.
88
96
 
89
97
  ### Phase 3.5 — Verificação pós-geração (gate)
90
98
 
@@ -15,7 +15,13 @@ validated_at: null
15
15
 
16
16
  # <Título da tela>
17
17
 
18
- ## Contexto
18
+ > **Modelo O QUE / ONDE / COMO / POR QUE** — este plano (e cada task que ele gera) responde às 4 perguntas:
19
+ > - **POR QUE** → `## Contexto` (motivação, PRD/ticket, problema).
20
+ > - **O QUE** → `## Componentes mapeados` + `## Interações & Estados` + `## Checklist de aceite` (o entregável).
21
+ > - **ONDE** → `context.md` (`## Arquivos relevantes`) + coluna de paths nas tasks (`## Arquivos`).
22
+ > - **COMO** → `## Aderência à Stack` + `## Plano de execução` (abordagem técnica, fetching, composição).
23
+
24
+ ## Contexto (POR QUE)
19
25
 
20
26
  <Por que esta tela existe — referência ao PRD, ticket, decisão de produto.>
21
27
 
@@ -140,10 +146,11 @@ Decisões possíveis:
140
146
  > Gaps detectados confrontando Postman/regras-de-negocio com a necessidade da tela. Cada item vira task ClickUp atribuída ao Douglas (default) ou ao `ASSIGNEE` informado. Vazio = backend completo para esta tela.
141
147
 
142
148
  > Coluna `Bloqueia tasks` lista os T-IDs frontend cujo frontmatter declara `depends_on_backend:` apontando para a `gap-key` desta linha (ex.: `migration-20260501150000`).
149
+ > Coluna `Bypass frontend` declara COMO o frontend entrega sem o backend pronto (fallback, mock, toast "em breve", cast + null-coalesce). Sem bypass declarado, a tarefa frontend fica `bloqueada-backend`. **Princípio: frontend nunca bloqueado por gap de backend — sempre há bypass OU a task é explicitamente bloqueada.**
143
150
 
144
- | gap-key | Gap | Endpoint/Coleção esperada | ClickUp ID | Status | Bloqueia tasks |
145
- |---------|-----|---------------------------|------------|--------|----------------|
146
- | | | | | | |
151
+ | gap-key | Gap | Bypass frontend | Endpoint/Coleção esperada | ClickUp ID | Status | Bloqueia tasks |
152
+ |---------|-----|-----------------|---------------------------|------------|--------|----------------|
153
+ | | | | | | | |
147
154
 
148
155
  ## Mock strategy
149
156
 
@@ -157,6 +164,20 @@ Decisões possíveis:
157
164
  - **Postman**: `<lista de coleções/endpoints relevantes em docs/postman/>`
158
165
  - **Stack ref**: `<sha de stack.md>`
159
166
 
167
+ ## Tabela de regressão
168
+
169
+ > Fluxos/telas existentes que este plano NÃO pode quebrar. `validate-plan` confere que nenhum item regrediu. Vazio = plano greenfield sem superfície a preservar.
170
+
171
+ - <rota/fluxo 1 — o que deve continuar funcionando (fetching + markup preservados)>
172
+ - <rota/fluxo 2>
173
+
174
+ ## Anti-padrões
175
+
176
+ > Proibições explícitas desta entrega. O executor recusa qualquer task que viole. Derivado das memórias do projeto + decisões deste plano.
177
+
178
+ - ❌ <ação proibida 1 — ex.: criar primitiva nova quando componente X já cobre; estender via prop>
179
+ - ❌ <ação proibida 2 — ex.: hardcode de RBAC inline em JSX; centralizar em helper>
180
+
160
181
  ## Riscos & Rollback
161
182
 
162
183
  - <risco>
@@ -17,15 +17,39 @@ assignees: []
17
17
  links: []
18
18
  ---
19
19
 
20
- ## Contexto
20
+ <!--
21
+ MODELO DE TASK: toda task DEVE responder às 4 perguntas, nesta ordem:
22
+ POR QUE → ## Contexto
23
+ O QUE → ## Objetivo + ## Entrega
24
+ ONDE → ## Arquivos
25
+ COMO → ## Plano de execução
26
+ Nenhuma seção pode ficar com placeholder. Se não há resposta para uma das 4, a task não está pronta para execução.
27
+ -->
21
28
 
22
- <Por que esta task existe — referência direta ao plano pai e ao critério de aceite.>
29
+ ## Contexto (POR QUE)
23
30
 
24
- ## Objetivo
31
+ <Por que esta task existe — referência direta ao plano pai e ao critério de aceite. Qual problema/gap motiva.>
25
32
 
26
- <Resultado esperado em 1-2 frases.>
33
+ ## Objetivo (O QUE)
27
34
 
28
- ## Plano de execução
35
+ <Resultado esperado em 1-2 frases — o entregável concreto, observável.>
36
+
37
+ ### Entrega
38
+
39
+ - <artefato 1 que esta task produz (componente, action, migration, story...)>
40
+ - <artefato 2>
41
+
42
+ ## Arquivos (ONDE)
43
+
44
+ > Caminhos exatos. Marque a operação. Sem isso o executor adivinha — proibido.
45
+
46
+ | Operação | Path | Nota |
47
+ |----------|------|------|
48
+ | criar | `src/.../novo.tsx` | <o que é> |
49
+ | editar | `src/.../existente.ts:NN` | <o que muda> |
50
+ | deletar | `src/.../legado.tsx` | <só se `cleanup_target`> |
51
+
52
+ ## Plano de execução (COMO)
29
53
 
30
54
  - [ ] Passo 1
31
55
  - [ ] Passo 2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ganbatte-os",
3
- "version": "0.2.38",
3
+ "version": "0.2.41",
4
4
  "description": "Framework operacional para design-to-code, squads de entrega e sprint sync com ClickUp.",
5
5
  "bin": {
6
6
  "gos": ".gos/scripts/cli/gos-cli.js"