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,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.
|