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.
- package/.gos/libraries/component-reuse-gate.md +75 -0
- package/.gos/playbooks/audit-streaming-playbook.md +86 -0
- package/.gos/skills/audit-screenshots/SKILL.md +195 -155
- package/.gos/skills/figma-print-diff/SKILL.md +5 -0
- package/.gos/skills/plan-blueprint/SKILL.md +8 -0
- package/.gos/skills/plan-to-tasks/SKILL.md +9 -1
- package/.gos/templates/planTemplate.md +25 -4
- package/.gos/templates/taskTemplate.md +29 -5
- package/package.json +1 -1
|
@@ -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.
|
|
4
|
-
argument-hint: "<acao> [
|
|
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
|
-
-
|
|
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
|
|
14
|
-
- usuario quer
|
|
15
|
-
-
|
|
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
|
|
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
|
|
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
|
-
##
|
|
34
|
+
## Por que streaming (pivot do modelo de fila)
|
|
27
35
|
|
|
28
|
-
|
|
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
|
-
|
|
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.
|
|
33
|
-
4. Divergencias materializadas em texto
|
|
34
|
-
5.
|
|
35
|
-
6.
|
|
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.
|
|
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:
|
|
73
|
+
Formato: `<acao> [SLUG-ou-tipo-tela]`
|
|
44
74
|
|
|
45
75
|
Acoes:
|
|
46
|
-
-
|
|
47
|
-
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
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
|
|
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
|
|
56
|
-
2. Resolver dirs.figma_screen_map (campo figma_screen_map
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
|
110
|
-
|
|
111
|
-
[audit-
|
|
112
|
-
|
|
113
|
-
#
|
|
114
|
-
1
|
|
115
|
-
2
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
204
|
+
proximo passo: *execute-plan PLAN-NNN-fix-<SLUG>
|
|
167
205
|
|
|
168
206
|
## Acao discard
|
|
169
207
|
|
|
170
|
-
1. Confirmacao inline
|
|
171
|
-
2. Confirmado:
|
|
172
|
-
|
|
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
|
|
214
|
+
`figma-screen-map.md` e' markdown com tabelas `| Tela | ... | Rota app | node-id | ... |`.
|
|
177
215
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
|
192
|
-
-
|
|
193
|
-
-
|
|
194
|
-
-
|
|
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/merge — nao 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.
|
|
199
|
-
|
|
200
|
-
- **
|
|
201
|
-
- **
|
|
202
|
-
- **
|
|
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
|
|
210
|
-
|
|
|
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
|
|
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.
|
|
218
|
-
4.
|
|
219
|
-
5.
|
|
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`
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
29
|
+
## Contexto (POR QUE)
|
|
23
30
|
|
|
24
|
-
|
|
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
|
-
|
|
33
|
+
## Objetivo (O QUE)
|
|
27
34
|
|
|
28
|
-
|
|
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
|