agent-engineering-skills 1.0.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.
- package/AGENTS.md +249 -0
- package/LICENSE +21 -0
- package/README.md +113 -0
- package/bin/cli.js +223 -0
- package/docs/agent-integration.md +200 -0
- package/docs/philosophy.md +131 -0
- package/docs/reference-authoring.md +117 -0
- package/docs/skill-authoring.md +126 -0
- package/examples/authorization-bypass.md +191 -0
- package/examples/frontend-review.md +244 -0
- package/examples/race-condition.md +128 -0
- package/examples/xp-reward-loop.md +123 -0
- package/package.json +45 -0
- package/references/engineering.yaml +88 -0
- package/references/frontend.yaml +139 -0
- package/references/product.yaml +54 -0
- package/references/research.yaml +88 -0
- package/references/security.yaml +85 -0
- package/references/ux.yaml +37 -0
- package/scripts/validate.py +454 -0
- package/skills/audit/adversarial-review/SKILL.md +190 -0
- package/skills/audit/business-logic-audit/SKILL.md +182 -0
- package/skills/audit/edge-case-hunter/SKILL.md +159 -0
- package/skills/audit/error-flow-audit/SKILL.md +184 -0
- package/skills/audit/state-consistency-audit/SKILL.md +174 -0
- package/skills/audit/user-flow-audit/SKILL.md +161 -0
- package/skills/frontend/accessibility-review/SKILL.md +186 -0
- package/skills/frontend/animation-review/SKILL.md +171 -0
- package/skills/frontend/interaction-design/SKILL.md +162 -0
- package/skills/frontend/ux-review/SKILL.md +172 -0
- package/skills/frontend/visual-quality-review/SKILL.md +160 -0
- package/skills/meta/research-router/SKILL.md +184 -0
- package/skills/meta/skill-router/SKILL.md +206 -0
- package/skills/product/gamification-audit/SKILL.md +213 -0
- package/skills/reliability/data-integrity-audit/SKILL.md +187 -0
- package/skills/reliability/idempotency-audit/SKILL.md +191 -0
- package/skills/reliability/race-condition-hunter/SKILL.md +181 -0
- package/skills/research/github-reference-research/SKILL.md +197 -0
- package/skills/research/implementation-research/SKILL.md +181 -0
- package/skills/research/market-research/SKILL.md +202 -0
- package/skills/research/reference-research/SKILL.md +186 -0
- package/skills/security/api-abuse-audit/SKILL.md +178 -0
- package/skills/security/authorization-audit/SKILL.md +176 -0
- package/skills/security/input-trust-audit/SKILL.md +178 -0
- package/templates/audit-report.md +89 -0
- package/templates/bug-report.md +107 -0
- package/templates/design-review.md +122 -0
- package/templates/research-report.md +96 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: input-trust-audit
|
|
3
|
+
description: Identifies values that should never be trusted from the client (userId, role, price, XP, permissions, ownership, status, reward, timestamps) and verifies the server derives them from the session or database instead of the request payload.
|
|
4
|
+
category: security
|
|
5
|
+
triggers:
|
|
6
|
+
- "audit input trust"
|
|
7
|
+
- "what should not be trusted from the client"
|
|
8
|
+
- "server-side derivation of role price xp"
|
|
9
|
+
- "mass assignment and client-supplied ownership"
|
|
10
|
+
- "never trust the frontend"
|
|
11
|
+
priority: high
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Input Trust Audit
|
|
15
|
+
|
|
16
|
+
## Objective
|
|
17
|
+
|
|
18
|
+
Ensinar o agente a identificar **quais valores nunca devem ser confiados ao cliente** e
|
|
19
|
+
a verificar que o servidor os deriva da sessão ou do banco, não do payload do request.
|
|
20
|
+
A regra central (também em `AGENTS.md`): não confiar no frontend.
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
userId role price XP permissions ownership status reward timestamps
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Cada um destes é um valor de *autoridade* — algo que determina identidade, permissão,
|
|
27
|
+
valor, ou ordem. Se o servidor lê do payload, o cliente pode forjar.
|
|
28
|
+
|
|
29
|
+
## When to Use
|
|
30
|
+
|
|
31
|
+
* Em qualquer endpoint que aceita um body/params com campos sensíveis.
|
|
32
|
+
* Ao auditar mass assignment, client-supplied IDs, preços/XP do cliente, timestamps do
|
|
33
|
+
cliente.
|
|
34
|
+
* Quando o pedido menciona "input trust", "never trust the frontend", "mass
|
|
35
|
+
assignment", "client-supplied role/price/ownerId".
|
|
36
|
+
* **Composição:** pareia com `authorization-audit` (ownership/role do cliente =
|
|
37
|
+
bypass de authz), `api-abuse-audit` (campos extra = mass assignment), `business-logic-audit` (price/XP/reward como regras), `gamification-audit` (XP/reward do
|
|
38
|
+
cliente), `edge-case-hunter` (valores forjados como edge cases).
|
|
39
|
+
|
|
40
|
+
## Mental Model
|
|
41
|
+
|
|
42
|
+
Todo input do cliente é *não-confiável por default*. A pergunta não é "isto é seguro?"
|
|
43
|
+
mas "o servidor *deriva* este valor ou *aceita* este valor?". Derivar = ler da sessão
|
|
44
|
+
autenticada, do banco, ou calcular server-side. Aceitar = ler do body/params e gravar.
|
|
45
|
+
|
|
46
|
+
A lista canônica de valores de autoridade (do `plan.md` §7):
|
|
47
|
+
|
|
48
|
+
| Valor | Por que não confiar | De onde derivar |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| `userId` | forjar identidade | sessão/token (`token.sub`) |
|
|
51
|
+
| `role` | escalar privilégio | sessão/DB, nunca body |
|
|
52
|
+
| `price` | zerar/inverter custo | catálogo/DB server-side |
|
|
53
|
+
| `XP` | inflar recompensa | calcular server-side pelo evento |
|
|
54
|
+
| `permissions` | auto-conceder | sessão/DB |
|
|
55
|
+
| `ownership` | reivindicar recurso alheio | DB (recurso.ownerId == caller) |
|
|
56
|
+
| `status` | forçar estado (paid/active) | transição server-side validada |
|
|
57
|
+
| `reward` | auto-recompensar | determinado server-side pelo trigger |
|
|
58
|
+
| `timestamps` | manipular ordem/expiração | `now()` server-side ou DB default |
|
|
59
|
+
|
|
60
|
+
O bug: o handler faz `user.role = body.role` ou `order.price = body.price` ou
|
|
61
|
+
`grant.xp = body.xp`. O cliente envia o que quiser.
|
|
62
|
+
|
|
63
|
+
Variante: **mass assignment** — o servidor binda todo o body ao modelo e grava campos
|
|
64
|
+
que a UI nem envia (`role`, `isAdmin`), porque não há allowlist.
|
|
65
|
+
|
|
66
|
+
## Investigation Procedure
|
|
67
|
+
|
|
68
|
+
1. **Listar todos os campos** que cada endpoint relevante aceita no body/params.
|
|
69
|
+
2. **Rotular cada campo**: não-sensível (nome, bio, preferência) vs **valor de
|
|
70
|
+
autoridade** (qualquer da lista canônica, ou qualquer campo que determine
|
|
71
|
+
identidade/permissão/valor/estado/ordem).
|
|
72
|
+
3. **Para cada valor de autoridade, perguntar: o servidor deriva ou aceita?**
|
|
73
|
+
* `userId` — vem de `token.sub`/sessão, ou do body?
|
|
74
|
+
* `role` — vem da sessão/DB, ou do body?
|
|
75
|
+
* `price` — vem do catálogo/DB, ou do body?
|
|
76
|
+
* `XP`/`reward` — calculado server-side pelo evento, ou do body?
|
|
77
|
+
* `ownership` — validado contra o DB, ou confiado no body?
|
|
78
|
+
* `status` — transição validada server-side, ou setado do body?
|
|
79
|
+
* `timestamps` — `now()`/DB, ou do body?
|
|
80
|
+
4. **Testar mass assignment** — envie campos não-enviados pela UI. Gravados?
|
|
81
|
+
5. **Testar forjamento** — envie um valor de autoridade forjado (role=admin,
|
|
82
|
+
price=0, xp=99999). O servidor aceita e age?
|
|
83
|
+
6. **Confirmar com evidência** — reproduza o forjamento e observe o efeito.
|
|
84
|
+
7. **Reportar** via `templates/audit-report.md`.
|
|
85
|
+
|
|
86
|
+
## Questions to Ask
|
|
87
|
+
|
|
88
|
+
* Quais campos o endpoint aceita? Qual é a allowlist (se houver)?
|
|
89
|
+
* `userId` no handler vem da sessão ou do body/query? (se do body, forja identidade)
|
|
90
|
+
* `role`/`permissions` — lidos da sessão/DB ou do payload?
|
|
91
|
+
* `price`/`amount` — do catálogo server-side ou do body?
|
|
92
|
+
* `XP`/`reward`/`points` — calculados server-side ou enviados pelo cliente?
|
|
93
|
+
* `ownerId`/`assignedTo` — validado contra o DB ou confiado?
|
|
94
|
+
* `status` — o cliente pode setar direto (paid/active/deleted)?
|
|
95
|
+
* `timestamps` (`createdAt`, `expiresAt`) — `now()` server-side ou do body?
|
|
96
|
+
* Há bind automático do body ao modelo (mass assignment)? Qual allowlist o impede?
|
|
97
|
+
* Um campo que a UI nunca envia — se eu enviar, é gravado?
|
|
98
|
+
|
|
99
|
+
## Attack Patterns
|
|
100
|
+
|
|
101
|
+
```text
|
|
102
|
+
userId from body
|
|
103
|
+
POST /comment {postId, userId: <other>} → comentário em nome de outro?
|
|
104
|
+
(correto: userId = token.sub, ignorar body.userId)
|
|
105
|
+
|
|
106
|
+
role from body (mass assignment)
|
|
107
|
+
PUT /profile {bio, role:"admin"} → role gravado?
|
|
108
|
+
|
|
109
|
+
price from body
|
|
110
|
+
POST /checkout {itemId, price: 0} → checkout grátis?
|
|
111
|
+
POST /checkout {itemId, price: -50} → reembolso invertido?
|
|
112
|
+
|
|
113
|
+
XP from body
|
|
114
|
+
POST /grant {userId, xp: 99999} → quem chama define o XP?
|
|
115
|
+
(correto: xp calculado pela ação/evento server-side)
|
|
116
|
+
|
|
117
|
+
ownership from body
|
|
118
|
+
POST /transfer {resourceId, toOwnerId} → caller é dono? validado?
|
|
119
|
+
|
|
120
|
+
status from body
|
|
121
|
+
POST /order/{id}/update {status:"paid"} → cliente marca como pago?
|
|
122
|
+
(correto: transição só via gateway callback verificado)
|
|
123
|
+
|
|
124
|
+
timestamps from body
|
|
125
|
+
POST /post {content, createdAt:"1970-..."} → data forjada? expired reanimado?
|
|
126
|
+
|
|
127
|
+
permissions from body
|
|
128
|
+
PUT /user/{id} {permissions:["*"]} → auto-concessão?
|
|
129
|
+
|
|
130
|
+
mass assignment via generic bind
|
|
131
|
+
handler: model.update(req.body) → sem allowlist → todos os campos
|
|
132
|
+
enviar {isAdmin: true} → gravado?
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Evidence Requirements
|
|
136
|
+
|
|
137
|
+
* **Nomear o campo** e classificá-lo (valor de autoridade da lista canônica, ou outro
|
|
138
|
+
sensível).
|
|
139
|
+
* **Mostrar de onde o servidor lê** — session/DB vs body/params. Cite a linha/mecanismo.
|
|
140
|
+
* **Mostrar o forjamento** — request com o valor forjado e o efeito observado.
|
|
141
|
+
* **Escalar confiança:**
|
|
142
|
+
* `CONFIRMED` — reproduziu o forjamento e observou o efeito (role virou admin, price
|
|
143
|
+
zerou, XP inflou).
|
|
144
|
+
* `HIGH CONFIDENCE` — handler visivelmente lê do body um valor de autoridade, sem
|
|
145
|
+
reprodução.
|
|
146
|
+
* `POSSIBLE` — campo suspeito aceito, efeito não confirmado.
|
|
147
|
+
* `SPECULATIVE` — "deveria ser derivado" sem rastrear.
|
|
148
|
+
* Forjamento de `role`/`permissions`/`ownership` que escala privilégio = mínimo
|
|
149
|
+
`HIGH CONFIDENCE` se reproduzido.
|
|
150
|
+
|
|
151
|
+
## False Positives
|
|
152
|
+
|
|
153
|
+
* **Servidor deriva corretamente** — se `userId = token.sub`, `role` da sessão, `price`
|
|
154
|
+
do catálogo, "campo no body" é ignorado. Confirmar que o servidor *ignora* o campo
|
|
155
|
+
antes de reportar.
|
|
156
|
+
* **Allowlist de campos** — se o bind usa uma allowlist explícita (`{bio, name}`) e
|
|
157
|
+
descarta o resto, mass assignment é defendido. Confirmar a allowlist.
|
|
158
|
+
* **Campo é legítimo do cliente** — `bio`, `displayName`, `preferences` *devem* vir do
|
|
159
|
+
cliente. Não reportar como "input trust" o que é input legítimo.
|
|
160
|
+
* **Timestamp do cliente é referência, não autoridade** — se `scheduledAt` é um input
|
|
161
|
+
legítimo de agendamento (com validação), não é o mesmo que forjar `createdAt`.
|
|
162
|
+
* **Status via callback verificado** — se `paid` só é setado pelo callback do gateway
|
|
163
|
+
com assinatura/verificação, o cliente não pode forjar. Confirmar o caminho.
|
|
164
|
+
* **Role do body é validado contra a sessão** — se o servidor aceita `role` no body mas
|
|
165
|
+
só permite transições que o caller já tem, é defensivo. Raro; confirmar.
|
|
166
|
+
|
|
167
|
+
## Output Format
|
|
168
|
+
|
|
169
|
+
Para cada valor de autoridade aceito (não derivado) do cliente, um finding via
|
|
170
|
+
`templates/audit-report.md`. Em **Reproduction**, dê o request com o valor forjado e o
|
|
171
|
+
efeito. Em **Affected component**, nomeie o endpoint e o campo. Em **Root cause**, diga
|
|
172
|
+
que o servidor lê do body em vez de derivar (cite onde), ou que falta allowlist (mass
|
|
173
|
+
assignment). Em **Recommendation**, indique derivação server-side (token.sub, catálogo,
|
|
174
|
+
cálculo por evento) e allowlist de campos no bind.
|
|
175
|
+
|
|
176
|
+
Apresente a tabela de campos por endpoint (campo | sensível? | derivado ou aceito? |
|
|
177
|
+
✓/✗). Privilégios (`role`/`permissions`/`ownership`) e valor (`price`/`XP`/`reward`)
|
|
178
|
+
primeiro; timestamps e status depois.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Audit Report Template
|
|
2
|
+
|
|
3
|
+
Template para relatórios de auditoria. Toda skill de auditoria produz findings neste
|
|
4
|
+
formato. Copie este template e preencha. Ver `AGENTS.md` § 2 para a escala de evidência
|
|
5
|
+
e `docs/skill-authoring.md` para a estrutura de skills.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Audit Report — <target>
|
|
10
|
+
|
|
11
|
+
**Date:** <YYYY-MM-DD>
|
|
12
|
+
**Target:** <system / component / feature audited>
|
|
13
|
+
**Scope:** <what was in scope; what was explicitly out of scope>
|
|
14
|
+
**Skills used:** <comma-separated skill names, e.g. adversarial-review, business-logic-audit>
|
|
15
|
+
**References consulted:** <names from references/*.yaml, or "none">
|
|
16
|
+
|
|
17
|
+
## Summary
|
|
18
|
+
|
|
19
|
+
<1–3 paragraphs. Número total de findings por severidade. As 2–3 conclusões mais
|
|
20
|
+
importantes. Não listar todos os findings aqui — apenas o que um humano precisa saber
|
|
21
|
+
primeiro.>
|
|
22
|
+
|
|
23
|
+
### Findings by severity
|
|
24
|
+
|
|
25
|
+
| Severity | Count |
|
|
26
|
+
|---|---|
|
|
27
|
+
| Critical | <n> |
|
|
28
|
+
| High | <n> |
|
|
29
|
+
| Medium | <n> |
|
|
30
|
+
| Low | <n> |
|
|
31
|
+
|
|
32
|
+
### Findings by confidence
|
|
33
|
+
|
|
34
|
+
| Confidence | Count |
|
|
35
|
+
|---|---|
|
|
36
|
+
| CONFIRMED | <n> |
|
|
37
|
+
| HIGH CONFIDENCE | <n> |
|
|
38
|
+
| POSSIBLE | <n> |
|
|
39
|
+
| SPECULATIVE | <n> |
|
|
40
|
+
|
|
41
|
+
> Findings `SPECULATIVE` são riscos a verificar, **não** bugs confirmados. Não devem
|
|
42
|
+
> bloquear implementação.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Findings
|
|
47
|
+
|
|
48
|
+
### Finding 1 — <short title>
|
|
49
|
+
|
|
50
|
+
| Field | Value |
|
|
51
|
+
|---|---|
|
|
52
|
+
| **Severity** | Critical \| High \| Medium \| Low |
|
|
53
|
+
| **Confidence** | CONFIRMED \| HIGH CONFIDENCE \| POSSIBLE \| SPECULATIVE |
|
|
54
|
+
| **Affected component** | <file(s) / module(s) / endpoint(s)> |
|
|
55
|
+
| **Affected flow** | <the user or system flow this breaks> |
|
|
56
|
+
| **Reproduction** | <step-by-step, or request sequence; concrete enough to redo> |
|
|
57
|
+
| **Expected behavior** | <what should happen> |
|
|
58
|
+
| **Actual behavior** | <what does happen> |
|
|
59
|
+
| **Root cause** | <the mechanism — why it happens, not just that it does> |
|
|
60
|
+
| **Impact** | <what an attacker or user can achieve; blast radius> |
|
|
61
|
+
| **Recommendation** | <concrete fix; where to enforce it (server, DB, both)> |
|
|
62
|
+
|
|
63
|
+
**Evidence:** <logs, test output, request/response, or "no reproduction yet — reasoning only". Link or paste.>
|
|
64
|
+
|
|
65
|
+
**False-positive check:** <why this is NOT an acceptable/intended behavior — or "considered: <X>; ruled out because <Y>". If you cannot rule it out, lower confidence.>
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
### Finding 2 — <short title>
|
|
70
|
+
|
|
71
|
+
<repeat the block above for each finding>
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Deduplication note
|
|
76
|
+
|
|
77
|
+
<Se múltiplas skills apontaram o mesmo defeito, registre aqui quais foram consolidadas
|
|
78
|
+
em um único finding e por quê. Se nenhuma sobreposição, escreva "No overlapping findings
|
|
79
|
+
across skills.">
|
|
80
|
+
|
|
81
|
+
## Out of scope / not investigated
|
|
82
|
+
|
|
83
|
+
<Quais áreas foram deixadas de fora e por quê — para que um leitor saiba o que NÃO foi
|
|
84
|
+
verificado. Honestidade sobre limites é parte do relatório.>
|
|
85
|
+
|
|
86
|
+
## Next steps
|
|
87
|
+
|
|
88
|
+
<Ordenado por prioridade. Quais findings exigem ação imediata, quais são riscos a
|
|
89
|
+
monitorar, quais precisam de mais investigação para subir de POSSIBLE para CONFIRMED.>
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Bug Report Template
|
|
2
|
+
|
|
3
|
+
Template para relatórios de bugs individuais. Cada bug é um documento autônomo que pode
|
|
4
|
+
ser referenciado, anexado a uma issue, ou consolidado em um `audit-report.md` maior.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Bug Report — <short title>
|
|
9
|
+
|
|
10
|
+
**Date:** <YYYY-MM-DD>
|
|
11
|
+
**Target version:** <version / commit / environment>
|
|
12
|
+
**Reported by:** <skill name(s) + methodology>
|
|
13
|
+
|
|
14
|
+
## Summary
|
|
15
|
+
|
|
16
|
+
<1-3 frases. O que está acontecendo e por que é um bug.>
|
|
17
|
+
|
|
18
|
+
## Severity
|
|
19
|
+
|
|
20
|
+
| Critical | High | Medium | Low |
|
|
21
|
+
|---|---|---|---|
|
|
22
|
+
|
|
23
|
+
## Confidence
|
|
24
|
+
|
|
25
|
+
| CONFIRMED | HIGH CONFIDENCE | POSSIBLE | SPECULATIVE |
|
|
26
|
+
|---|---|---|---|
|
|
27
|
+
|
|
28
|
+
*Ver `AGENTS.md` § 2 para a escala de evidência.*
|
|
29
|
+
|
|
30
|
+
## Affected component
|
|
31
|
+
|
|
32
|
+
<file(s) / module(s) / endpoint(s) / route(s) — ex: `src/app/api/checkout/route.ts`>
|
|
33
|
+
|
|
34
|
+
## Affected flow
|
|
35
|
+
|
|
36
|
+
<O fluxo que este bug afeta — ex: "fluxo de criação de pedido, etapa de cobrança">
|
|
37
|
+
|
|
38
|
+
## Reproduction
|
|
39
|
+
|
|
40
|
+
### Steps
|
|
41
|
+
|
|
42
|
+
1. `<passo 1>`
|
|
43
|
+
2. `<passo 2>`
|
|
44
|
+
3. `<passo 3>`
|
|
45
|
+
|
|
46
|
+
### Request/response
|
|
47
|
+
|
|
48
|
+
```http
|
|
49
|
+
<request exato — método, path, headers, body>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```http
|
|
53
|
+
<response observada>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Environment
|
|
57
|
+
|
|
58
|
+
- **Browser:** Chrome 120 / Firefox 115 / Safari 17
|
|
59
|
+
- **Platform:** Mobile / Desktop / Tablet
|
|
60
|
+
- **Auth state:** Authenticated / Unauthenticated / Role: admin
|
|
61
|
+
- **Data state:** <estado prévio necessário: saldo, recursos, flags>
|
|
62
|
+
|
|
63
|
+
## Expected behavior
|
|
64
|
+
|
|
65
|
+
<O que deveria acontecer, segundo a especificação, regra de negócio, ou princípio.>
|
|
66
|
+
|
|
67
|
+
## Actual behavior
|
|
68
|
+
|
|
69
|
+
<O que de fato acontece — o comportamento incorreto.>
|
|
70
|
+
|
|
71
|
+
## Root cause
|
|
72
|
+
|
|
73
|
+
<O mecanismo — por que acontece, não só que acontece. Ex: "o handler não checa
|
|
74
|
+
ownership porque o middleware de authz não cobre esta rota", "o incremento é lido do
|
|
75
|
+
cache e reescrito sem atomicidade".>
|
|
76
|
+
|
|
77
|
+
## Impact
|
|
78
|
+
|
|
79
|
+
* **Blast radius:** <quantos usuários, recursos, transações?>
|
|
80
|
+
* **Data loss:** <sim / não / parcial — qual dado?>
|
|
81
|
+
* **Exploitability:** <trivial / médio / difícil — o que o atacante precisa?>
|
|
82
|
+
|
|
83
|
+
## Recommendation
|
|
84
|
+
|
|
85
|
+
```text
|
|
86
|
+
<Ação concreta. Onde e como corrigir. Ex: "Adicionar checagem de ownership no handler
|
|
87
|
+
DELETE /order/{id} antes de executar a deleção.">
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Evidence
|
|
91
|
+
|
|
92
|
+
<logs, screenshots, video, request/response adicional, ou "não reproduzido — apenas
|
|
93
|
+
análise de código".>
|
|
94
|
+
|
|
95
|
+
## False-positive check
|
|
96
|
+
|
|
97
|
+
*Por que isto NÃO é comportamento aceitável ou intencional:*
|
|
98
|
+
|
|
99
|
+
- <se já considerou: "talvez seja intencional porque..."> → <ruled out: documentação /
|
|
100
|
+
regra de negócio / produto confirma>
|
|
101
|
+
- <se não consegue ruled out: baixar confiança para POSSIBLE e marcar como "precisa
|
|
102
|
+
decisão de produto">
|
|
103
|
+
|
|
104
|
+
## References
|
|
105
|
+
|
|
106
|
+
<skills usadas, referências consultadas em `references/*.yaml`, links para código
|
|
107
|
+
relevante.>
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Design Review Template
|
|
2
|
+
|
|
3
|
+
Template para revisões de design de frontend (UX + visual + interação + animação +
|
|
4
|
+
acessibilidade + referências externas). Consolida a saída das skills de frontend em um
|
|
5
|
+
relatório único, com síntese de pesquisa quando aplicável.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Design Review — <screen / flow>
|
|
10
|
+
|
|
11
|
+
**Date:** <YYYY-MM-DD>
|
|
12
|
+
**Target:** <tela/fluxo/componente revisado>
|
|
13
|
+
**Skills used:** <ex: ux-review, visual-quality-review, interaction-design,
|
|
14
|
+
animation-review, accessibility-review>
|
|
15
|
+
**References consulted:** <fontes de references/frontend.yaml + ux.yaml usadas>
|
|
16
|
+
|
|
17
|
+
## Executive summary
|
|
18
|
+
|
|
19
|
+
<2-3 parágrafos. O que está bom, o que está quebrado, e o que deve ser corrigido antes
|
|
20
|
+
de lançar. Prioridade geral (ship / ship-with-fixes / fix-first).>
|
|
21
|
+
|
|
22
|
+
## Verdict
|
|
23
|
+
|
|
24
|
+
| **Ship** | **Ship with fixes** | **Fix first** |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
|
|
27
|
+
## Dimensions
|
|
28
|
+
|
|
29
|
+
Para cada dimensão, um veredicto resumido + pointer para os findings detalhados:
|
|
30
|
+
|
|
31
|
+
| Dimension | Verdict | Findings |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| UX (clareza, hierarquia, carga cognitiva, feedback, affordances, consistência, navegação, empty states, erros, loading) | ✅ / ⚠️ / ❌ | #F1..F5 |
|
|
34
|
+
| Visual (tipografia, spacing, hierarchy, density, contrast, composition, noise, AI slop) | ✅ / ⚠️ / ❌ | #F6..F8 |
|
|
35
|
+
| Interaction (hover, focus, pressed, disabled, loading, transitions, feedback, micro-interactions) | ✅ / ⚠️ / ❌ | #F9..F10 |
|
|
36
|
+
| Animation (propósito, timing, easing, hierarchy, continuity, interruption, reduced motion) | ✅ / ⚠️ / ❌ | #F11 |
|
|
37
|
+
| Accessibility (keyboard, SR, focus, semantic HTML, contrast, touch targets, reduced motion, forms, errors) | ✅ / ⚠️ / ❌ | #F12..F14 |
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Findings
|
|
42
|
+
|
|
43
|
+
### Finding 1 — <short title>
|
|
44
|
+
|
|
45
|
+
| Field | Value |
|
|
46
|
+
|---|---|
|
|
47
|
+
| **Severity** | Critical \| High \| Medium \| Low |
|
|
48
|
+
| **Confidence** | CONFIRMED \| HIGH CONFIDENCE \| POSSIBLE \| SPECULATIVE |
|
|
49
|
+
| **Dimension** | UX \| Visual \| Interaction \| Animation \| Accessibility |
|
|
50
|
+
| **Affected component** | <elemento/tela> |
|
|
51
|
+
| **Affected flow** | <fluxo> |
|
|
52
|
+
| **Reproduction** | <o que o usuário vê vs o que deveria ver> |
|
|
53
|
+
| **Expected behavior** | <esperado> |
|
|
54
|
+
| **Actual behavior** | <observado> |
|
|
55
|
+
| **Root cause** | <princípio violado — ex: "contraste 2.9:1 falha WCAG 1.4.3", "focus ring removido com `outline: none`", "empty state sem CTA"> |
|
|
56
|
+
| **Impact** | <consequência para o usuário> |
|
|
57
|
+
| **Recommendation** | <correção concreta> |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
### Finding N — <short title>
|
|
62
|
+
|
|
63
|
+
<repetir o bloco acima>
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Research synthesis (se pesquisa foi realizada)
|
|
68
|
+
|
|
69
|
+
*Usar o formato de síntese de pesquisa do `AGENTS.md` § 5. Ex:*
|
|
70
|
+
|
|
71
|
+
## Research
|
|
72
|
+
|
|
73
|
+
### Reference
|
|
74
|
+
[Impeccable]
|
|
75
|
+
|
|
76
|
+
### Relevant Pattern
|
|
77
|
+
Espaçamento consistente baseado em 4px, hierarquia tipográfica clara, ausência de
|
|
78
|
+
decoração sem função.
|
|
79
|
+
|
|
80
|
+
### Why It Matters
|
|
81
|
+
O que separa design de "amador" de "profissional" é a consistência rítmica e a
|
|
82
|
+
disciplina visual.
|
|
83
|
+
|
|
84
|
+
### Adaptation
|
|
85
|
+
Aplicar o sistema de 4px no spacing dos cards da dashboard, que hoje varia
|
|
86
|
+
aleatoriamente.
|
|
87
|
+
|
|
88
|
+
### Trade-offs
|
|
89
|
+
Requer auditoria de todos os componentes existentes para uniformizar.
|
|
90
|
+
|
|
91
|
+
### Recommendation
|
|
92
|
+
Adotar as 3 primeiras regras do Impeccable (spacing system, type scale, no-orphan
|
|
93
|
+
decoration) como padrão do projeto.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Accessibility checklist (WCAG spot-check)
|
|
98
|
+
|
|
99
|
+
| Check | Pass | Fail | N/A |
|
|
100
|
+
|---|---|---|---|
|
|
101
|
+
| Keyboard reachable (all interactive elements) | | | |
|
|
102
|
+
| Focus visible (no `outline: none` without substitute) | | | |
|
|
103
|
+
| Focus trap correct in modals | | | |
|
|
104
|
+
| Alt text on informative images | | | |
|
|
105
|
+
| aria-label on semantic icons | | | |
|
|
106
|
+
| aria-live on dynamic content | | | |
|
|
107
|
+
| Semantic HTML (`<button>`, `<nav>`, `<h1-h6>`) | | | |
|
|
108
|
+
| Text contrast ≥ 4.5:1 | | | |
|
|
109
|
+
| Touch targets ≥ 44×44px | | | |
|
|
110
|
+
| `<label>` on every form input | | | |
|
|
111
|
+
| Errors text + aria-live (not color-only) | | | |
|
|
112
|
+
| `prefers-reduced-motion` respected | | | |
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Out of scope / not reviewed
|
|
117
|
+
|
|
118
|
+
<O que não foi revisado e por quê.>
|
|
119
|
+
|
|
120
|
+
## Next steps
|
|
121
|
+
|
|
122
|
+
<Priorizado. Fix-first findings primeiro; riscos a monitorar depois.>
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Research Report Template
|
|
2
|
+
|
|
3
|
+
Template para relatórios de pesquisa. Consolida a saída das research skills
|
|
4
|
+
(`reference-research`, `github-reference-research`, `market-research`,
|
|
5
|
+
`implementation-research`) em um documento único com síntese obrigatória — nunca apenas
|
|
6
|
+
uma lista de links (ver `AGENTS.md` § 5).
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Research Report — <question / feature / problem>
|
|
11
|
+
|
|
12
|
+
**Date:** <YYYY-MM-DD>
|
|
13
|
+
**Research question:** <a pergunta que guiou a pesquisa>
|
|
14
|
+
**Problem type:** <animation | ux | visual | architecture | security | engineering |
|
|
15
|
+
product | implementation | discovery>
|
|
16
|
+
**Research level:** <none | proportional | full> *(proporcional a uncertainty +
|
|
17
|
+
impact + irreversibility — ver `AGENTS.md` § 6)*
|
|
18
|
+
**Skills used:** <ex: reference-research, github-reference-research, market-research>
|
|
19
|
+
**Router:** <research-router → qual despacho>
|
|
20
|
+
|
|
21
|
+
## Executive summary
|
|
22
|
+
|
|
23
|
+
<1-2 parágrafos. A resposta direta à research question, a recomendação principal, e o
|
|
24
|
+
nível de confiança geral.>
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Research
|
|
29
|
+
|
|
30
|
+
### Reference
|
|
31
|
+
[Name]
|
|
32
|
+
|
|
33
|
+
### Relevant Pattern
|
|
34
|
+
O que foi encontrado.
|
|
35
|
+
|
|
36
|
+
### Why It Matters
|
|
37
|
+
Por que este padrão é útil.
|
|
38
|
+
|
|
39
|
+
### Adaptation
|
|
40
|
+
Como ele poderia se aplicar ao projeto atual.
|
|
41
|
+
|
|
42
|
+
### Trade-offs
|
|
43
|
+
Que problemas ele introduz.
|
|
44
|
+
|
|
45
|
+
### Recommendation
|
|
46
|
+
O que deve de fato ser adotado.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
### Reference 2 — <name>
|
|
51
|
+
|
|
52
|
+
<repetir o bloco de síntese. Consolidar em um bloco quando múltiplas fontes dão a mesma
|
|
53
|
+
recomendação; citar as fontes no cabeçalho.>
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Convergence & divergence (para market research)
|
|
58
|
+
|
|
59
|
+
### Convergência (adotar)
|
|
60
|
+
- <onde os produtos/fontes concordam — padrão maduro>
|
|
61
|
+
|
|
62
|
+
### Divergência (avaliar)
|
|
63
|
+
- <onde divergem — espaço para diferenciação ou decisão>
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Sources & authority
|
|
68
|
+
|
|
69
|
+
| Source | Type | Authority | Used for |
|
|
70
|
+
|---|---|---|---|
|
|
71
|
+
| <name> | methodology \| heuristic \| inspiration \| implementation \| discovery | established \| vendor \| community \| curated | <o que se extraiu> |
|
|
72
|
+
|
|
73
|
+
> **Inspiração ≠ evidência** — fontes `type: inspiration` / `authority: curated`
|
|
74
|
+
> (ex: Dribbble, dark.design) calibram gosto, nunca justificam uma decisão técnica
|
|
75
|
+
> (ver `AGENTS.md` § 1).
|
|
76
|
+
|
|
77
|
+
## Confidence assessment
|
|
78
|
+
|
|
79
|
+
*Classifique a confiança da recomendação como um todo, não por fonte:*
|
|
80
|
+
|
|
81
|
+
| CONFIRMED | HIGH CONFIDENCE | POSSIBLE | SPECULATIVE |
|
|
82
|
+
|---|---|---|---|
|
|
83
|
+
|
|
84
|
+
- **O que confirmaria/subiria a confiança:** <ex: "protótipo com usuários reais",
|
|
85
|
+
"teste de carga", "prova de conceito no contexto">
|
|
86
|
+
- **O que é incerto:** <ex: "padrão observado em 1 produto apenas", "benchmark de
|
|
87
|
+
artigo de 2023">
|
|
88
|
+
|
|
89
|
+
## Out of scope / not researched
|
|
90
|
+
|
|
91
|
+
<O que não foi pesquisado e por quê (proporcionalidade, custo, irrelevância).>
|
|
92
|
+
|
|
93
|
+
## Next steps
|
|
94
|
+
|
|
95
|
+
<Próximas ações: prova de conceito, teste com usuários, protótipo, ou decisão de
|
|
96
|
+
implementação já tomada.>
|