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.
Files changed (48) hide show
  1. package/AGENTS.md +249 -0
  2. package/LICENSE +21 -0
  3. package/README.md +113 -0
  4. package/bin/cli.js +223 -0
  5. package/docs/agent-integration.md +200 -0
  6. package/docs/philosophy.md +131 -0
  7. package/docs/reference-authoring.md +117 -0
  8. package/docs/skill-authoring.md +126 -0
  9. package/examples/authorization-bypass.md +191 -0
  10. package/examples/frontend-review.md +244 -0
  11. package/examples/race-condition.md +128 -0
  12. package/examples/xp-reward-loop.md +123 -0
  13. package/package.json +45 -0
  14. package/references/engineering.yaml +88 -0
  15. package/references/frontend.yaml +139 -0
  16. package/references/product.yaml +54 -0
  17. package/references/research.yaml +88 -0
  18. package/references/security.yaml +85 -0
  19. package/references/ux.yaml +37 -0
  20. package/scripts/validate.py +454 -0
  21. package/skills/audit/adversarial-review/SKILL.md +190 -0
  22. package/skills/audit/business-logic-audit/SKILL.md +182 -0
  23. package/skills/audit/edge-case-hunter/SKILL.md +159 -0
  24. package/skills/audit/error-flow-audit/SKILL.md +184 -0
  25. package/skills/audit/state-consistency-audit/SKILL.md +174 -0
  26. package/skills/audit/user-flow-audit/SKILL.md +161 -0
  27. package/skills/frontend/accessibility-review/SKILL.md +186 -0
  28. package/skills/frontend/animation-review/SKILL.md +171 -0
  29. package/skills/frontend/interaction-design/SKILL.md +162 -0
  30. package/skills/frontend/ux-review/SKILL.md +172 -0
  31. package/skills/frontend/visual-quality-review/SKILL.md +160 -0
  32. package/skills/meta/research-router/SKILL.md +184 -0
  33. package/skills/meta/skill-router/SKILL.md +206 -0
  34. package/skills/product/gamification-audit/SKILL.md +213 -0
  35. package/skills/reliability/data-integrity-audit/SKILL.md +187 -0
  36. package/skills/reliability/idempotency-audit/SKILL.md +191 -0
  37. package/skills/reliability/race-condition-hunter/SKILL.md +181 -0
  38. package/skills/research/github-reference-research/SKILL.md +197 -0
  39. package/skills/research/implementation-research/SKILL.md +181 -0
  40. package/skills/research/market-research/SKILL.md +202 -0
  41. package/skills/research/reference-research/SKILL.md +186 -0
  42. package/skills/security/api-abuse-audit/SKILL.md +178 -0
  43. package/skills/security/authorization-audit/SKILL.md +176 -0
  44. package/skills/security/input-trust-audit/SKILL.md +178 -0
  45. package/templates/audit-report.md +89 -0
  46. package/templates/bug-report.md +107 -0
  47. package/templates/design-review.md +122 -0
  48. package/templates/research-report.md +96 -0
@@ -0,0 +1,184 @@
1
+ ---
2
+ name: research-router
3
+ description: Decides where to research based on the problem type (animation, UX, architecture, security, product, implementation), routing to the right sources in references/ and the right research skills.
4
+ category: meta
5
+ triggers:
6
+ - "where should I research"
7
+ - "route a problem to sources"
8
+ - "which references to consult"
9
+ - "select research sources"
10
+ - "research router"
11
+ priority: high
12
+ ---
13
+
14
+ # Research Router
15
+
16
+ ## Objective
17
+
18
+ Decidir **onde pesquisar** com base no tipo de problema. O `skill-router` decide *quais
19
+ skills*; o `research-router` decide *quais fontes*. É o estágio "RESEARCH ROUTER" do
20
+ workflow de auditoria (ver `AGENTS.md` § 4).
21
+
22
+ ## When to Use
23
+
24
+ * Quando uma tarefa não-trivial precisa de pesquisa antes de implementar (estágio
25
+ "RESEARCH" do workflow).
26
+ * Quando o `skill-router` ativou skills de research ou sinalizou que pesquisa é
27
+ necessária.
28
+ * Quando você precisa saber a que fontes de `references/` recorrer.
29
+ * **Composição:** despacha para `reference-research` (catálogo), `github-reference-research` (GitHub), `market-research` (produtos), `implementation-research`
30
+ (problemas técnicos). Consome o catálogo em `references/*.yaml`.
31
+
32
+ ## Mental Model
33
+
34
+ O router usa **o tipo de problema** para escolher as fontes. Cada tipo de problema tem
35
+ uma combinação de fontes que o resolve melhor:
36
+
37
+ | Tipo de problema | Fontes (da mais para menos relevante) |
38
+ |---|---|
39
+ | **Animation** | Animate UI, Impeccable, Interfaces, GitHub, real products |
40
+ | **UX** | Laws of UX, Interfaces, real products, design systems |
41
+ | **Visual / craft** | Impeccable, Impeccable Slop, Interfaces, Dribbble, dark.design |
42
+ | **Architecture** | GitHub, official documentation, production implementations, technical literature |
43
+ | **Security** | OWASP, PortSwigger, CWE, GitHub (middleware real) |
44
+ | **Engineering/reliability** | OWASP Cheat Sheet, PortSwigger, GitHub (production), Google Testing Blog |
45
+ | **Product/gamification** | Reforge, Product Hunt, GitHub (reward systems real) |
46
+ | **Implementation técnica** | official documentation → GitHub/issues → production code → articles |
47
+ | **Discovery de fontes** | LazyWeb, Shoogle, Hacker News |
48
+
49
+ E a **classes de conhecimento** determina como usar a fonte (do `plan.md` §12):
50
+
51
+ ```text
52
+ methodology — fundamento (Laws of UX, OWASP) → pesa como base
53
+ heuristic — princípios (Impeccable, Interfaces) → calibra decisão
54
+ inspiration — estética (Dribbble, dark.design) → inspira, não decide
55
+ implementation — código (Animate UI, GitHub) → referência, não cópia
56
+ discovery — descoberta (LazyWeb, Shoogle) → acha mais fontes
57
+ ```
58
+
59
+ Não tratar todas como igualmente confiáveis (ver `docs/reference-authoring.md` para
60
+ `authority`).
61
+
62
+ ## Investigation Procedure
63
+
64
+ 1. **Classificar o problema** — animation / ux / visual / architecture / security /
65
+ engineering / product / implementation / discovery.
66
+ 2. **Consultar o catálogo** — abrir os `references/*.yaml` do domínio. Cruzar o
67
+ `use_when` de cada entrada com o problema.
68
+ 3. **Selecionar as fontes** — pela tabela acima + `authority` (established primeiro).
69
+ 4. **Determinar a classe de uso** — o que cada fonte oferece (metodologia/princípio/
70
+ inspiração/código/descoberta) e como usá-la.
71
+ 5. **Despachar** — para as research skills apropriadas (`reference-research` para o
72
+ catálogo, `market-research` para produtos, etc.).
73
+ 6. **Priorizar** — começar por established/vendor, depois community/curated.
74
+ 7. **Justificar** a seleção — quais fontes, por quê, e quais foram descartadas.
75
+
76
+ ## Questions to Ask
77
+
78
+ * Qual é o tipo de problema? (animation/ux/visual/architecture/security/engineering/
79
+ product/implementation/discovery)
80
+ * Quais arquivos de `references/` cobrem este domínio?
81
+ * Qual `use_when` corresponde ao problema?
82
+ * Qual a classe de conhecimento necessária? (metodologia/princípio/inspiração/código/
83
+ descoberta)
84
+ * Qual a autoridade de cada fonte candidata? (established > community > curated)
85
+ * Que research skill executa a coleta? (reference/github/market/implementation)
86
+ * Quais fontes NÃO ajudam este problema? (evitar ruído — ver `AGENTS.md` § 6)
87
+
88
+ ## Attack Patterns
89
+
90
+ O router não "ataca", mas decide. Os padrões de despacho (do `plan.md` §15):
91
+
92
+ ```text
93
+ Animation problem
94
+
95
+ Animate UI
96
+ Impeccable
97
+ Interfaces
98
+ GitHub
99
+ real products
100
+
101
+ UX problem
102
+
103
+ Laws of UX
104
+ Interfaces
105
+ real products
106
+ design systems
107
+
108
+ Architecture problem
109
+
110
+ GitHub
111
+ official documentation
112
+ production implementations
113
+ technical literature
114
+
115
+ Security problem
116
+
117
+ OWASP (Top 10 + Cheat Sheets)
118
+ PortSwigger
119
+ CWE
120
+ GitHub (middleware real)
121
+
122
+ Implementation problem
123
+
124
+ official documentation
125
+ GitHub issues/PRs
126
+ production code
127
+ technical articles
128
+
129
+ Discovery problem (fontes insuficientes)
130
+
131
+ LazyWeb
132
+ Shoogle
133
+ Hacker News
134
+ ```
135
+
136
+ ## Evidence Requirements
137
+
138
+ O router produz uma **decisão de despacho**, não um finding. Mas a decisão deve ser
139
+ rastreável:
140
+
141
+ * **Listar as fontes selecionadas**, com `type` e `authority`.
142
+ * **Citar o tipo de problema** que levou à seleção.
143
+ * **Listar as fontes descartadas** e por quê (não ajuda o problema / autoridade baixa /
144
+ fora de escopo).
145
+ * **Indicar a research skill** que executará a coleta.
146
+ * **Indicar o nível de pesquisa** (nenhuma / proporcional / completa) — ver `AGENTS.md`
147
+ § 6.
148
+
149
+ ## False Positives
150
+
151
+ * **Consultar tudo sempre** — viola a proporcionalidade. Um problema de UX não precisa
152
+ de OWASP; um problema de segurança não precisa de Dribbble.
153
+ * **Inspiração tratada como evidência** — fontes `type: inspiration` (Dribbble,
154
+ dark.design) calibram gosto, não justificam decisão técnica.
155
+ * **Fonte de baixa autoridade como base** — community/curated não substitui
156
+ established/vendor para decisões críticas.
157
+ * **Despachar para fonte inexistente no catálogo** — o router só pode despachar para o
158
+ que existe em `references/`. Verificar antes.
159
+ * **Ignorar o catálogo** — o catálogo existe justamente para não espalhar URLs pelas
160
+ skills; consultá-lo primeiro.
161
+
162
+ ## Output Format
163
+
164
+ ```markdown
165
+ ## Research Router — Routing
166
+
167
+ **Problem type:** <animation | ux | visual | architecture | security | engineering |
168
+ product | implementation | discovery>
169
+ **Research level:** <none | proportional | full>
170
+
171
+ ### Sources selected (ordered)
172
+ 1. <fonte> — <type> / <authority> — <por quê: use_when corresponde>
173
+ 2. ...
174
+
175
+ ### Sources discarded
176
+ - <fonte> — <razão>
177
+
178
+ ### Research skill to execute
179
+ <reference-research | github-reference-research | market-research |
180
+ implementation-research>
181
+ ```
182
+
183
+ Após o despacho, a research skill executa a coleta e sintetiza no formato obrigatório
184
+ (ver `AGENTS.md` § 5 e o "Output Format" de `reference-research`).
@@ -0,0 +1,206 @@
1
+ ---
2
+ name: skill-router
3
+ description: Analyzes a task and selects which audit, security, reliability, product, frontend, and research skills to activate, with composition tables mapping task phrases to ordered skill sets.
4
+ category: meta
5
+ triggers:
6
+ - "which skills should I run"
7
+ - "route a task to skills"
8
+ - "select skills for an audit"
9
+ - "compose skills for a feature"
10
+ - "start an audit"
11
+ priority: high
12
+ ---
13
+
14
+ # Skill Router
15
+
16
+ ## Objective
17
+
18
+ Analisar uma tarefa e **selecionar quais skills ativar**. Nem toda tarefa precisa de
19
+ todas as skills. O router é a camada de despacho: lê o pedido, classifica, e retorna um
20
+ conjunto ordenado de skills a executar. É a porta de entrada do workflow de auditoria
21
+ (ver `AGENTS.md` § 4).
22
+
23
+ ## When to Use
24
+
25
+ * No início de qualquer auditoria ou revisão não-trivial — é o estágio "SKILL ROUTER"
26
+ do workflow.
27
+ * Quando você precisa decidir *quais* skills aplicar a um pedido vago ("audit this
28
+ feature").
29
+ * Para composição — combinar skills que se complementam.
30
+ * **Composição:** o router *é* a composição. Ele referencia todas as outras skills e
31
+ despacha para elas. Não há skill "abaixo" dele; há as skills que ele seleciona.
32
+
33
+ ## Mental Model
34
+
35
+ O router usa três sinais para despachar:
36
+
37
+ 1. **Categoria do problema** — lógica/estado vs UX/visual vs pesquisa vs segurança vs
38
+ confiabilidade.
39
+ 2. **Palavras-gatilho** — mapeadas aos `triggers` de cada skill.
40
+ 3. **Risco/impacto** — fluxos com valor transferível (pagamento, recompensa, permissão)
41
+ ativam mais skills; UI cosmética ativa menos.
42
+
43
+ Princípio de **proporcionalidade** (ver `AGENTS.md` § 6): não ative todas as skills por
44
+ default. Uma mudança trivial e reversível não precisa de auditoria completa; uma mudança
45
+ em fluxo de pagamento, irreversível e de alto impacto, justifica o conjunto máximo.
46
+
47
+ O router **não** executa as skills — ele só seleciona e ordena. A ordem importa: skills
48
+ que geram hipóteses (ex: `adversarial-review`) vêm antes das que confirmam (ex:
49
+ `race-condition-hunter`, `idempotency-audit`). Skills de frontend/research vêm depois
50
+ das de lógica quando o problema é misto.
51
+
52
+ ## Investigation Procedure
53
+
54
+ 1. **UNDERSTAND** — reformule o pedido em uma frase precisa: qual sistema/fluxo, qual
55
+ mudança ou risco.
56
+ 2. **CLASSIFY** — determine a categoria dominante (audit / security / reliability /
57
+ product / frontend / research) e se há valor transferível, estado compartilhado, ou
58
+ permissões envolvidas.
59
+ 3. **MATCH triggers** — compare o pedido com os `triggers` de cada skill (listados no
60
+ frontmatter de cada `SKILL.md`).
61
+ 4. **APPLY a tabela de composição** abaixo para o conjunto base, depois ajuste pelos
62
+ sinais específicos.
63
+ 5. **ORDENE** — hipóteses primeiro, confirmação depois; lógica antes de visual quando
64
+ misto.
65
+ 6. **JUSTifique a seleção** — diga quais skills e por quê, e quais *não* foram
66
+ selecionadas e por quê (evita overengineering e mostra cobertura).
67
+ 7. **Despache** — entregue a lista ordenada; o executor roda cada skill e deduplica
68
+ findings.
69
+
70
+ ## Questions to Ask
71
+
72
+ * Qual é a categoria dominante do problema?
73
+ * Há valor transferível (dinheiro, XP, moeda, estoque)? → ativa lógica + reliability.
74
+ * Há permissões/ownership? → ativa security.
75
+ * Há estado compartilhado ou concorrência? → ativa reliability.
76
+ * Há UI/visual envolvido? → ativa frontend.
77
+ * Preciso pesquisar referências antes de concluir? → ativa research (via
78
+ `research-router`).
79
+ * O risco/impacto justifica o conjunto completo, ou um subconjunto basta?
80
+
81
+ ## Attack Patterns
82
+
83
+ O router não "ataca", mas despacha. Os padrões de composição são a sua saída:
84
+
85
+ ```text
86
+ "Adicionar reações que dão XP"
87
+
88
+ gamification-audit
89
+ business-logic-audit
90
+ idempotency-audit
91
+ race-condition-hunter
92
+ api-abuse-audit
93
+ user-flow-audit
94
+
95
+ "Melhorar a tela de criação de personagem"
96
+
97
+ ux-review
98
+ visual-quality-review
99
+ interaction-design
100
+ accessibility-review
101
+ reference-research
102
+ market-research
103
+
104
+ "payment"
105
+
106
+ business-logic-audit
107
+ idempotency-audit
108
+ race-condition-hunter
109
+ data-integrity-audit
110
+ error-flow-audit
111
+ authorization-audit
112
+
113
+ "social reactions"
114
+
115
+ gamification-audit
116
+ business-logic-audit
117
+ idempotency-audit
118
+ race-condition-hunter
119
+ api-abuse-audit
120
+ ```
121
+
122
+ ### Tabela de composição por domínio
123
+
124
+ | Sinal / palavra-gatilho | Skills a ativar (ordenadas) |
125
+ |---|---|
126
+ | recompensa, XP, pontos, streak, achievement | `gamification-audit`, `business-logic-audit`, `idempotency-audit`, `race-condition-hunter`, `api-abuse-audit`, `user-flow-audit` |
127
+ | payment, cobrança, checkout, reembolso | `business-logic-audit`, `idempotency-audit`, `race-condition-hunter`, `data-integrity-audit`, `error-flow-audit`, `authorization-audit` |
128
+ | permissão, role, ownership, admin, moderator | `authorization-audit`, `input-trust-audit`, `business-logic-audit`, `api-abuse-audit` |
129
+ | API, endpoint, rate limit, bypass UI | `api-abuse-audit`, `input-trust-audit`, `authorization-audit`, `edge-case-hunter` |
130
+ | concorrência, race, simultâneo, double-spend | `race-condition-hunter`, `idempotency-audit`, `data-integrity-audit`, `business-logic-audit` |
131
+ | fluxo, onboarding, wizard, steps, dead end | `user-flow-audit`, `state-consistency-audit`, `error-flow-audit`, `edge-case-hunter` |
132
+ | erro, rollback, retry, timeout, partial | `error-flow-audit`, `idempotency-audit`, `data-integrity-audit`, `state-consistency-audit` |
133
+ | cache, stale, desync, refresh, back button | `state-consistency-audit`, `user-flow-audit`, `data-integrity-audit` |
134
+ | UX, usabilidade, fluxo de usuário, hierarquia | `ux-review`, `interaction-design`, `accessibility-review`, `reference-research` |
135
+ | visual, tipografia, spacing, AI slop | `visual-quality-review`, `ux-review`, `reference-research` |
136
+ | animação, transição, motion, reduced motion | `animation-review`, `interaction-design`, `accessibility-review` |
137
+ | acessibilidade, keyboard, screen reader, contraste | `accessibility-review`, `ux-review` |
138
+ | regra de negócio, invariant, limite, cota | `business-logic-audit`, `data-integrity-audit`, `input-trust-audit` |
139
+ | descoberta de referências, como outros fazem | `reference-research`, `market-research`, `implementation-research`, `github-reference-research` |
140
+ | auditoria genérica / "ataque o sistema" | `adversarial-review` + o subconjunto relevante acima |
141
+
142
+ ### Quando ativar o conjunto mínimo vs completo
143
+
144
+ | Risco | Conjunto |
145
+ |---|---|
146
+ | trivial + reversível (botão, label, cor) | nenhum, ou só o skill de domínio único |
147
+ | médio, reversível, sem estado compartilhado | 1–2 skills do domínio |
148
+ | alto, estado compartilhado, valor transferível | conjunto completo do domínio |
149
+ | crítico, irreversível, valor transferível (pagamento, permissão) | conjunto máximo + `adversarial-review` + `research-router` |
150
+
151
+ ## Evidence Requirements
152
+
153
+ O router produz uma **decisão de despacho**, não um finding. Mas a decisão deve ser
154
+ rastreável:
155
+
156
+ * **Listar as skills selecionadas** (ordenadas).
157
+ * **Citar o gatilho** que levou a cada (qual palavra/sinal do pedido matchou qual
158
+ `trigger`).
159
+ * **Listar skills NÃO selecionadas** e por quê (fora de escopo, risco insuficiente).
160
+ * **Indicar o nível de pesquisa** (nenhuma / proporcional / completa) — conecta ao
161
+ `research-router`.
162
+ * Se uma skill não existe no repositório, **dizer explicitamente** e marcar como gap —
163
+ nunca inventar uma skill.
164
+
165
+ A "evidência" do router é a consistência entre o pedido, os triggers das skills, e a
166
+ tabela de composição. Se a seleção não consegue ser justificada pelos triggers, o
167
+ router errou.
168
+
169
+ ## False Positives
170
+
171
+ * **Ativar tudo "por segurança"** — viola o princípio de proporcionalidade. Se o risco
172
+ é baixo, um subconjunto basta. Overengineering é um anti-padrão (ver `AGENTS.md` § 6).
173
+ * **Despachar para skill inexistente** — o router só pode selecionar skills que existem
174
+ em `skills/`. Verificar antes de listar.
175
+ * **Ignorar pesquisa quando o problema é novo** — para arquitetura nova ou padrão não
176
+ trivial, omitir research é um falso negativo. Conectar ao `research-router`.
177
+ * **Duplicar findings por não ordenar** — sem ordem (hipóteses→confirmação), skills
178
+ redundantes produzem findings sobrepostos. A ordem e a dedup downstream importam.
179
+ * **Confundir categoria** — despachar um problema de concorrência só para frontend, ou
180
+ um problema visual só para lógica. A classificação dominante guia; os sinais
181
+ secundários adicionam.
182
+
183
+ ## Output Format
184
+
185
+ ```markdown
186
+ ## Skill Router — Dispatch
187
+
188
+ **Task:** <reformulação precisa>
189
+ **Dominant category:** <audit | security | reliability | product | frontend | research>
190
+ **Risk level:** <trivial | medium | high | critical>
191
+ **Research level:** <none | proportional | full>
192
+
193
+ ### Selected skills (ordered)
194
+ 1. <skill> — <gatilho que matchou>
195
+ 2. <skill> — <gatilho>
196
+ ...
197
+
198
+ ### Not selected
199
+ - <skill> — <razão: fora de escopo / risco insuficiente>
200
+
201
+ ### Research routing
202
+ <delegar a research-router? quais fontes? ou "none — tarefa rotineira">
203
+ ```
204
+
205
+ Após o despacho, o executor roda cada skill na ordem e consolida findings via
206
+ `templates/audit-report.md`, deduplicando sobreposições (ver `AGENTS.md` § 7).
@@ -0,0 +1,213 @@
1
+ ---
2
+ name: gamification-audit
3
+ description: Detects abuse of XP, points, coins, reputation, achievements, streaks, likes, reactions, and referrals using the TRIGGER → CONDITION → REWARD → REVERSAL model, including self-reward, multi-account, replay, concurrency, and automation.
4
+ category: product
5
+ triggers:
6
+ - "audit gamification"
7
+ - "xp points coins reputation abuse"
8
+ - "streak and achievement farming"
9
+ - "like reaction referral abuse"
10
+ - "reward loop manipulation"
11
+ priority: high
12
+ ---
13
+
14
+ # Gamification Audit
15
+
16
+ ## Objective
17
+
18
+ Ensinar o agente a modelar qualquer sistema de gamificação como um **loop de
19
+ recompensa** e a procurar onde o loop pode ser manipulado para produzir recompensa sem
20
+ o comportamento que ele deveria incentivar:
21
+
22
+ ```text
23
+ TRIGGER
24
+
25
+ CONDITION
26
+
27
+ REWARD
28
+
29
+ REVERSAL
30
+ ```
31
+
32
+ Abusos em foco (do `plan.md` §9): XP, pontos, moedas, reputação, achievements,
33
+ streaks, likes, reactions, referrals.
34
+
35
+ ## When to Use
36
+
37
+ * Em qualquer sistema com recompensa (XP, pontos, moedas, reputação, achievements,
38
+ streaks, likes, reactions, referrals, rank).
39
+ * Quando uma recompensa tem valor real (rank, desbloqueio, moeda, status) — o incentivo
40
+ à fraude cresce com o valor.
41
+ * Quando o pedido menciona "gamification", "XP farming", "streak", "referral abuse",
42
+ "reward loop", "self-reward", "multi-account".
43
+ * **Composição:** núcleo de produto. Pareia com `business-logic-audit` (regras de
44
+ recompensa), `idempotency-audit` (recompensa duplicada), `race-condition-hunter`
45
+ (farming concorrente), `api-abuse-audit` (recompensa via API direta),
46
+ `input-trust-audit` (XP/reward do cliente), `user-flow-audit` (fluxo do loop).
47
+
48
+ ## Mental Model
49
+
50
+ Um sistema de gamificação é uma **máquina que emite valor**. O eixo é o loop
51
+ TRIGGER → CONDITION → REWARD → REVERSAL: algo dispara, uma condição é checada, uma
52
+ recompensa é emitida, e (idealmente) há um caminho de reversão.
53
+
54
+ Todo loop é manipulável quando uma destas quatro falha:
55
+
56
+ 1. **CONDITION frágil** — a condição que impede o abuso pode ser falsificada
57
+ (self-reward, multi-account, automação).
58
+ 2. **REWARD sem reversão** — a ação pode ser desfeita e refeita ganhando de novo sem
59
+ perder o ganho anterior (farming infinito).
60
+ 3. **REWARD não-idempotente** — o mesmo trigger disparado N vezes (replay, retry,
61
+ concurrency) concede N vezes.
62
+ 4. **TRIGGER fabricável** — o trigger pode ser gerado artificialmente (bot, request
63
+ direto, referral de si mesmo).
64
+
65
+ O teste canônico (do `plan.md` §9):
66
+
67
+ ```text
68
+ ACTION
69
+ → REWARD
70
+ → REVERSE
71
+ → ACTION
72
+ → REWARD ← farming se a reward não foi removida na reversão
73
+ ```
74
+
75
+ E os vetores de abuso:
76
+
77
+ ```text
78
+ self-reward — dar a recompensa a si mesmo quando deveria ser de outro
79
+ multi-account — contas paralelas para colher recompensas por-referral/conta
80
+ replay — repetir o trigger depois de já colhido
81
+ concurrency — disparar o trigger simultaneamente N vezes
82
+ automation — bots executando o comportamento "incentivado"
83
+ ```
84
+
85
+ ## Investigation Procedure
86
+
87
+ 1. **Mapear cada recompensa como um loop** TRIGGER → CONDITION → REWARD → REVERSAL.
88
+ Liste o trigger (ação), a condição (quem/quando), a reward (quantidade, como
89
+ emitida), e a reversão (existe? remove a reward?).
90
+ 2. **Para cada loop, aplicar o teste ACTION → REWARD → REVERSE → ACTION → REWARD.**
91
+ A segunda ACTION concede de novo? Se sim, farming.
92
+ 3. **Testar os vetores:**
93
+ * **self-reward** — posso conceder a mim mesmo (reagir ao meu post, votar em mim)?
94
+ * **multi-account** — posso criar contas paralelas e referir a mim mesmo?
95
+ * **replay** — posso repetir o trigger após colhido (mesma ação, mesma entidade)?
96
+ * **concurrency** — disparar o trigger N vezes simultâneas — N rewards?
97
+ * **automation** — um bot consegue gerar o trigger artificialmente (não há
98
+ proof-of-human / rate limit / captcha)?
99
+ 4. **Verificar a reversão** — quando a ação é desfeita, a reward é removida de fato?
100
+ (senão: reverse → action → reward = farming)
101
+ 5. **Verificar idempotência da reward** — a mesma entidade × mesma ação é protegida por
102
+ unique/check server-side? (dedup)
103
+ 6. **Verificar a fonte da reward** — é calculada server-side pelo evento, ou confiável
104
+ no payload? (input trust overlap)
105
+ 7. **Confirmar com evidência** — reproduza o farming e observe a reward dupla.
106
+ 8. **Reportar** via `templates/audit-report.md`.
107
+
108
+ ## Questions to Ask
109
+
110
+ * Qual o loop completo de cada recompensa? TRIGGER → CONDITION → REWARD → REVERSAL?
111
+ * ACTION → REWARD → REVERSE → ACTION → REWARD: a segunda ACTION concede de novo?
112
+ * Self-reward é possível (reagir/curtir/votar no próprio conteúdo)?
113
+ * Multi-account pode colher reward por-conta (referral, bônus de novo usuário)?
114
+ * O mesmo trigger repetido (replay) concede de novo?
115
+ * N requests simultâneos para o mesmo trigger — N rewards?
116
+ * Um bot pode gerar o trigger artificialmente? (rate limit? captcha? assinatura?)
117
+ * A reversão (unreact, cancel referral) realmente remove a reward?
118
+ * A reward é determinada server-side ou aceita do cliente?
119
+ * A mesma (entidade, ação) é deduplicada por unique constraint?
120
+
121
+ ## Attack Patterns
122
+
123
+ ```text
124
+ farming infinito (reversal ausente)
125
+ react → +10 XP
126
+ unreact → -0 XP (reversão não remove!)
127
+ react → +10 XP ← farming: XP acumula sem limite por uma única ação
128
+
129
+ reversal que re-concede
130
+ react → +10 XP
131
+ unreact → -10 XP
132
+ react → +10 XP ← correto SE unreact removeu de fato. Testar se removou.
133
+
134
+ self-reward
135
+ react no próprio post → +XP? (deveria ser proibido ou sem reward)
136
+ vote em si mesmo → reputation?
137
+
138
+ multi-account referral
139
+ criar conta B (via referral de A) → A ganha bônus
140
+ repetir com B, C, D... → A ganha N bônus
141
+ (defesa: restrição por IP/device/unique identidade — contornável?)
142
+
143
+ replay
144
+ completar streak hoje → reward
145
+ repetir o request do streak → reward de novo?
146
+ (defesa: unique (user, day) no banco)
147
+
148
+ concurrency farming
149
+ N requests simultâneos para /claim-streak
150
+ todos passam a checagem read-then-write → N rewards
151
+ (defesa: unique constraint, lock, ou idempotency key)
152
+
153
+ automation
154
+ bot gera o "comportamento incentivado" artificialmente
155
+ (se o reward exige comportamento humano e não há prova, a economia infla)
156
+
157
+ like/reaction abuse
158
+ curtir/descurtir repetidamente para manter "engajamento"
159
+ (se cada curti dá algo, o toggle é farming)
160
+
161
+ achievement farm
162
+ condição de achievement forjável (ex: "compartilhe" sem share real)
163
+ → achievement concedido sem o comportamento real
164
+ ```
165
+
166
+ ## Evidence Requirements
167
+
168
+ * **Mapear o loop completo** da recompensa (TRIGGER → CONDITION → REWARD → REVERSAL)
169
+ no finding.
170
+ * **Nomear o vetor de abuso** (farming/reversal/self/multi-account/replay/concurrency/
171
+ automation) e a fase do loop que falha (condição frágil, reversão ausente, reward
172
+ não-idempotente, trigger fabricável).
173
+ * **Mostrar o mecanismo** — onde a condição é checada (server-side? só na UI?),
174
+ onde a reversão não remove, onde o dedup falta.
175
+ * **Escalar confiança:**
176
+ * `CONFIRMED` — reproduziu a recompensa dupla/injusta (ACTION→REWARD→REVERSE→
177
+ ACTION→REWARD observado).
178
+ * `HIGH CONFIDENCE` — código mostra condição frágil / reversão ausente em loop de
179
+ reward claro.
180
+ * `POSSIBLE` — loop plausivelmente manipulável, não confirmado.
181
+ * `SPECULATIVE` — "pode ser farmável" sem rastrear o loop.
182
+ * Farming que infla economia com valor real (moeda/rank) = mínimo `HIGH CONFIDENCE`
183
+ se o loop for claro.
184
+
185
+ ## False Positives
186
+
187
+ * **Reversão correta** — se unreact remove a XP de fato (e é idempotente), o teste
188
+ ACTION→REWARD→REVERSE→ACTION não concede de novo. Confirmar a remoção real.
189
+ * **Dedup por (entidade, ação)** — se há unique constraint server-side, replay e
190
+ concurrency não concedem de novo. Confirmar antes de reportar.
191
+ * **Self-reward proibido e enforced** — se o servidor rejeita reagir ao próprio
192
+ conteúdo, não há self-reward. Confirmar no handler.
193
+ * **Multi-account é risco de negócio aceito** — alguns produtos toleram (sem valor
194
+ real). Marcar `POSSIBLE` se o valor da reward não justifica a defesa.
195
+ * **Rate limit/anti-bot suficiente** — se bot é barrado por rate limit + captcha +
196
+ assinatura, automation é mitigado. Confirmar a barreira antes de reportar.
197
+ * **Reward é cosmética** — se XP não compra nada e não afeta rank, o farming é
198
+ cosmetic; reportar com severidade baixa ou como nota de produto.
199
+ * **Streak com janela intencional** — reset diário é o design; não é bug.
200
+
201
+ ## Output Format
202
+
203
+ Para cada loop manipulável, um finding via `templates/audit-report.md`. Em
204
+ **Affected flow**, nomeie a recompensa e o vetor. Em **Reproduction**, dê a sequência
205
+ concreta (ACTION→REWARD→REVERSE→ACTION ou os N requests) e o saldo final observado. Em
206
+ **Root cause**, diga qual fase do loop falha (condição frágil / reversão ausente /
207
+ reward não-idempotente / trigger fabricável). Em **Recommendation**, indique a defesa
208
+ (unique constraint por entidade+ação+janela; reversão que remove de fato; restrição de
209
+ self; rate limit + anti-bot; cálculo server-side da reward).
210
+
211
+ Apresente a tabela por recompensa (reward | trigger | condição | reversão? | dedup? |
212
+ vetor vulnerável | ✓/✗). Farming infinito e abuso com valor real primeiro; self-reward
213
+ e multi-account depois; automation e replay em seguida.