jarvis-ai-framework 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 (240) hide show
  1. package/AGENTS.md +416 -0
  2. package/LICENSE +21 -0
  3. package/README.md +190 -0
  4. package/agents/AGENTS.md +234 -0
  5. package/agents/README.md +309 -0
  6. package/agents/engineering/data/eng.data-engineer.agent.md +309 -0
  7. package/agents/engineering/eng.agent.md +303 -0
  8. package/agents/engineering/eng.bug-hunter.md +386 -0
  9. package/agents/engineering/eng.cybersecurity.agent.md +503 -0
  10. package/agents/engineering/eng.dev-code-reviewer.md +148 -0
  11. package/agents/engineering/eng.docs-writer.md +152 -0
  12. package/agents/engineering/eng.frontend.agent.md +117 -0
  13. package/agents/engineering/eng.rpa.agent.md +215 -0
  14. package/agents/engineering/eng.tech-analyst.agent.md +102 -0
  15. package/agents/engineering/eng.ux-designer.agent.md +193 -0
  16. package/agents/engineering/qa/eng.qa.cypress-specialist.md +109 -0
  17. package/agents/engineering/qa/eng.qa.quality-champion-task-agent.md +85 -0
  18. package/agents/engineering/qa/eng.qa.quality-strategist.md +111 -0
  19. package/agents/engineering/qa/eng.qa.test-architect.md +400 -0
  20. package/agents/engineering/qa/eng.qa.test-planner.md +477 -0
  21. package/agents/engineering/qa/eng.qa.testing-engineer.md +339 -0
  22. package/agents/product/prod.pm-checker.md +52 -0
  23. package/bin/commands/docs-publish.js +184 -0
  24. package/bin/commands/docs-sync.js +139 -0
  25. package/bin/commands/info.js +87 -0
  26. package/bin/commands/init.js +237 -0
  27. package/bin/commands/install-rtk.js +90 -0
  28. package/bin/commands/list.js +48 -0
  29. package/bin/commands/qa-signoff.js +112 -0
  30. package/bin/commands/whoami.js +43 -0
  31. package/bin/jarvis.js +159 -0
  32. package/bin/lib/auth/session.js +56 -0
  33. package/bin/lib/config/constants.js +123 -0
  34. package/bin/lib/config/ide-config.js +233 -0
  35. package/bin/lib/core/scanner.js +124 -0
  36. package/bin/lib/core/sync-engine.js +551 -0
  37. package/bin/lib/docs/fetch-file.sh +41 -0
  38. package/bin/lib/docs/publish-file.sh +284 -0
  39. package/bin/lib/docs/validate-frontmatter.js +157 -0
  40. package/bin/lib/env-loader.js +198 -0
  41. package/bin/lib/tasks/comment.js +131 -0
  42. package/bin/lib/utils/git-parser.js +145 -0
  43. package/bin/lib/utils/logger.js +104 -0
  44. package/bin/lib/utils/npmrc-parser.js +106 -0
  45. package/bin/lib/utils/paths.js +55 -0
  46. package/bin/lib/utils/ui.js +59 -0
  47. package/bin/lib/vcs/api.js +312 -0
  48. package/bin/lib/vcs/create-issue.js +43 -0
  49. package/bin/lib/vcs/create-merge.js +43 -0
  50. package/bin/lib/vcs/fetch-raw.js +30 -0
  51. package/bin/postinstall.js +41 -0
  52. package/members.md +25 -0
  53. package/package.json +55 -0
  54. package/rules/AGENTS.md +205 -0
  55. package/rules/engineering/data/data-rules.md +200 -0
  56. package/rules/engineering/eng-rules.md +243 -0
  57. package/rules/engineering/eng-security-rules.md +186 -0
  58. package/rules/engineering/eng.breakdown-subtasks-rules.md +585 -0
  59. package/rules/engineering/eng.bump-rules.md +27 -0
  60. package/rules/engineering/eng.docs-scraping-rules.md +64 -0
  61. package/rules/engineering/eng.downstream-flow-rules.md +297 -0
  62. package/rules/engineering/eng.integrations-rules.md +73 -0
  63. package/rules/engineering/eng.plan-rules.md +333 -0
  64. package/rules/engineering/eng.pr-rules.md +359 -0
  65. package/rules/engineering/eng.pre-pr-rules.md +103 -0
  66. package/rules/engineering/eng.start-rules.md +246 -0
  67. package/rules/engineering/eng.tech-spec-rules.md +968 -0
  68. package/rules/engineering/eng.work-rules.md +312 -0
  69. package/rules/engineering/frontend/eng.frontend-rules.md +147 -0
  70. package/rules/engineering/qa/eng.qa.cypress-standards-rules.md +259 -0
  71. package/rules/engineering/qa/eng.qa.exploratory-session-rules.md +137 -0
  72. package/rules/engineering/qa/eng.qa.quality-gate-scoring-rules.md +181 -0
  73. package/rules/engineering/qa/eng.qa.tech-spec-validation-criteria-rules.md +120 -0
  74. package/rules/engineering/rpa/eng.rpa-rules.md +230 -0
  75. package/rules/product/README.md +24 -0
  76. package/rules/product/prod-rules.md +151 -0
  77. package/rules/rtk-rules.md +68 -0
  78. package/skills/AGENTS.md +290 -0
  79. package/skills/SKILLS-ROADMAP.md +333 -0
  80. package/skills/churn-audit/SKILL.md +385 -0
  81. package/skills/context-detect/SKILL.md +399 -0
  82. package/skills/context-detect/assets/context-profile-template.md +127 -0
  83. package/skills/docs-central/README.md +310 -0
  84. package/skills/docs-central/SKILL.md +423 -0
  85. package/skills/docs-index/SKILL.md +377 -0
  86. package/skills/eng-ai-engineer/SKILL.md +296 -0
  87. package/skills/eng-arch-c4/SKILL.md +358 -0
  88. package/skills/eng-arch-c4/assets/example-code.md +189 -0
  89. package/skills/eng-arch-c4/assets/example-component.md +105 -0
  90. package/skills/eng-arch-c4/assets/example-container.md +104 -0
  91. package/skills/eng-arch-c4/assets/example-context.md +81 -0
  92. package/skills/eng-backend/SKILL.md +776 -0
  93. package/skills/eng-browser-extension-builder/SKILL.md +385 -0
  94. package/skills/eng-cybersecurity/SKILL.md +645 -0
  95. package/skills/eng-data-bi/SKILL.md +199 -0
  96. package/skills/eng-data-debug/SKILL.md +307 -0
  97. package/skills/eng-data-engineer/SKILL.md +256 -0
  98. package/skills/eng-data-onboard/SKILL.md +310 -0
  99. package/skills/eng-data-orchestrator/SKILL.md +426 -0
  100. package/skills/eng-design-system/SKILL.md +619 -0
  101. package/skills/eng-docs-write/SKILL.md +312 -0
  102. package/skills/eng-frontend/SKILL.md +913 -0
  103. package/skills/eng-jira-comment/SKILL.md +17 -0
  104. package/skills/eng-microfrontend/SKILL.md +602 -0
  105. package/skills/eng-ms-trace/SKILL.md +469 -0
  106. package/skills/eng-nestjs/SKILL.md +791 -0
  107. package/skills/eng-performance-engineer/SKILL.md +312 -0
  108. package/skills/eng-pr/SKILL.md +339 -0
  109. package/skills/eng-qa-a11y-audit/SKILL.md +269 -0
  110. package/skills/eng-qa-bug-report/SKILL.md +1088 -0
  111. package/skills/eng-qa-bug-report/TASK_MANAGERS.md +138 -0
  112. package/skills/eng-qa-cypress-e2e/SKILL.md +177 -0
  113. package/skills/eng-qa-dev-guide/SKILL.md +164 -0
  114. package/skills/eng-qa-e2e/SKILL.md +400 -0
  115. package/skills/eng-qa-e2e-spec-writer/SKILL.md +322 -0
  116. package/skills/eng-qa-exploratory/SKILL.md +188 -0
  117. package/skills/eng-qa-gate/SKILL.md +370 -0
  118. package/skills/eng-qa-gate/assets/checklist-validacao.md +291 -0
  119. package/skills/eng-qa-graphql-contract/SKILL.md +256 -0
  120. package/skills/eng-qa-quality-report/SKILL.md +412 -0
  121. package/skills/eng-qa-test-plan/SKILL.md +466 -0
  122. package/skills/eng-qa-test-plan/assets/test-coverage-template.md +92 -0
  123. package/skills/eng-qa-test-plan/assets/test-patterns.md +178 -0
  124. package/skills/eng-qa-testsprite/SKILL.md +325 -0
  125. package/skills/eng-qa-testsprite/references/testsprite-mcp.md +224 -0
  126. package/skills/eng-qa-unit-test/SKILL.md +471 -0
  127. package/skills/eng-rabbitmq/SKILL.md +661 -0
  128. package/skills/eng-scraper/SKILL.md +683 -0
  129. package/skills/eng-scraper-robot-builder/SKILL.md +370 -0
  130. package/skills/eng-security-patch/SKILL.md +378 -0
  131. package/skills/eng-security-triage/SKILL.md +266 -0
  132. package/skills/eng-task-comment/SKILL.md +60 -0
  133. package/skills/eng-tech-analyst/SKILL.md +529 -0
  134. package/skills/eng-threat-model/SKILL.md +161 -0
  135. package/skills/init-jarvis/SKILL.md +1304 -0
  136. package/skills/init-jarvis/assets/mcp-configs.md +389 -0
  137. package/skills/init-jarvis/assets/onboarding-checklist.md +104 -0
  138. package/skills/init-jarvis/assets/setup-guide.md +360 -0
  139. package/skills/lovable-prompt-generator/SKILL.md +304 -0
  140. package/skills/prod-roadmap-report/README.md +303 -0
  141. package/skills/prod-roadmap-report/SKILL.md +198 -0
  142. package/skills/prod-roadmap-report/commands/status.compiled.single.team.md +23 -0
  143. package/skills/prod-roadmap-report/commands/status.list.projects.md +17 -0
  144. package/skills/prod-roadmap-report/commands/status.memory.md +192 -0
  145. package/skills/prod-roadmap-report/commands/status.roadmap.preview.md +94 -0
  146. package/skills/prod-roadmap-report/references/detailed-guide.md +236 -0
  147. package/skills/prod-roadmap-report/rules/detailed-guide.md +237 -0
  148. package/skills/prod-roadmap-report/rules/status-report-rules.md +44 -0
  149. package/skills/prod-roadmap-report/templates/template-multiple-teams-compiled-status.md +53 -0
  150. package/skills/prod-roadmap-report/templates/template-projects-list.md +23 -0
  151. package/skills/prod-roadmap-report/templates/template-single-team-compiled-status.md +60 -0
  152. package/skills/prod-roadmap-report/templates/template-single-team-status.md +49 -0
  153. package/skills/prod-specs/SKILL.md +108 -0
  154. package/skills/prod-specs/references/prod.spec.clarify.md +176 -0
  155. package/skills/prod-specs/references/prod.spec.epic.md +107 -0
  156. package/skills/prod-specs/references/prod.spec.frd.md +135 -0
  157. package/skills/prod-specs/references/prod.spec.issue.md +145 -0
  158. package/skills/prod-specs/references/prod.spec.prd.md +118 -0
  159. package/skills/prod-specs/rules/prod-spec-rules.md +186 -0
  160. package/skills/prod-specs/templates/prod-breakdown-template.md +136 -0
  161. package/skills/prod-specs/templates/prod-epic-template.md +76 -0
  162. package/skills/prod-specs/templates/prod-frd-template.md +172 -0
  163. package/skills/prod-specs/templates/prod-issue-template.md +68 -0
  164. package/skills/prod-specs/templates/prod-prd-full-template.md +159 -0
  165. package/skills/prod-specs/templates/prod-prd-template.md +173 -0
  166. package/skills/prod-specs-update/SKILL.md +272 -0
  167. package/skills/report-issue/SKILL.md +156 -0
  168. package/taxonomy.md +270 -0
  169. package/templates/AGENTS.md +189 -0
  170. package/templates/CDD aplicado a Prompts.md +182 -0
  171. package/templates/ENV-template.md +187 -0
  172. package/templates/engineering/AGENTS-template.md +71 -0
  173. package/templates/engineering/ARD-template.md +193 -0
  174. package/templates/engineering/CONTACTS-template.md +135 -0
  175. package/templates/engineering/PR-template.md +40 -0
  176. package/templates/engineering/RFC-Playbook.md +325 -0
  177. package/templates/engineering/RFC-template.md +199 -0
  178. package/templates/engineering/architecture-template.md +277 -0
  179. package/templates/engineering/breakdown-subtasks-template.md +582 -0
  180. package/templates/engineering/c4-model-template.md +516 -0
  181. package/templates/engineering/data-contract-template.md +135 -0
  182. package/templates/engineering/data-pipeline-template.md +163 -0
  183. package/templates/engineering/plan-template.md +255 -0
  184. package/templates/engineering/qa/eng.qa.quality-gate-examples-template.md +311 -0
  185. package/templates/engineering/qa/eng.qa.quality-gate-report-template.md +249 -0
  186. package/templates/engineering/qa/qa.cypress-test-template.md +172 -0
  187. package/templates/engineering/qa/qa.exploratory-session-template.md +148 -0
  188. package/templates/engineering/qa/qa.quality-report-template.md +130 -0
  189. package/templates/engineering/qa/qa.release-signoff-template.md +54 -0
  190. package/templates/engineering/qa/qa.sprint-plan-template.md +49 -0
  191. package/templates/engineering/swagger-template.md +145 -0
  192. package/templates/engineering/tech-spec-template.md +497 -0
  193. package/templates/engineering/work-progress-template.md +155 -0
  194. package/workflows/AGENTS.md +240 -0
  195. package/workflows/README.md +160 -0
  196. package/workflows/all-tools.md +11 -0
  197. package/workflows/engineering/data/data.contract.md +202 -0
  198. package/workflows/engineering/data/data.new-pipeline.md +234 -0
  199. package/workflows/engineering/eng.breakdown-subtasks.md +420 -0
  200. package/workflows/engineering/eng.bug-audit.md +591 -0
  201. package/workflows/engineering/eng.build-tech-spec.md +1116 -0
  202. package/workflows/engineering/eng.create-ard-from-code.md +259 -0
  203. package/workflows/engineering/eng.create-ard.md +382 -0
  204. package/workflows/engineering/eng.create-rfc.md +245 -0
  205. package/workflows/engineering/eng.debug.md +479 -0
  206. package/workflows/engineering/eng.docs.md +40 -0
  207. package/workflows/engineering/eng.light-arch.md +84 -0
  208. package/workflows/engineering/eng.plan.md +213 -0
  209. package/workflows/engineering/eng.pr.md +466 -0
  210. package/workflows/engineering/eng.pre-pr.md +167 -0
  211. package/workflows/engineering/eng.review.md +185 -0
  212. package/workflows/engineering/eng.rpa.robot.md +342 -0
  213. package/workflows/engineering/eng.security-audit.md +312 -0
  214. package/workflows/engineering/eng.security-incident.md +275 -0
  215. package/workflows/engineering/eng.security-pipeline.md +210 -0
  216. package/workflows/engineering/eng.security-review.md +235 -0
  217. package/workflows/engineering/eng.start.md +494 -0
  218. package/workflows/engineering/eng.work.md +558 -0
  219. package/workflows/engineering/frontend/eng.frontend-component.md +190 -0
  220. package/workflows/engineering/frontend/eng.frontend-perf-audit.md +375 -0
  221. package/workflows/engineering/frontend/eng.frontend-review.md +185 -0
  222. package/workflows/engineering/qa/eng.qa-dev-quality-guide.md +51 -0
  223. package/workflows/engineering/qa/eng.qa-e2e-test-generation.md +51 -0
  224. package/workflows/engineering/qa/eng.qa-exploratory-session.md +60 -0
  225. package/workflows/engineering/qa/eng.qa-quality-gate-validation.md +202 -0
  226. package/workflows/engineering/qa/eng.qa-quality-report.md +83 -0
  227. package/workflows/engineering/qa/eng.qa-refinement-entry.md +83 -0
  228. package/workflows/engineering/qa/eng.qa-release-signoff.md +170 -0
  229. package/workflows/engineering/qa/eng.qa-sprint-planning.md +100 -0
  230. package/workflows/engineering/ta/eng.ta.atendimento.md +93 -0
  231. package/workflows/product/prod.roadmap.preview.md +110 -0
  232. package/workflows/product/prod.spec.breakdown.md +163 -0
  233. package/workflows/product/prod.spec.clarify.md +178 -0
  234. package/workflows/product/prod.spec.epic.md +154 -0
  235. package/workflows/product/prod.spec.frd.md +96 -0
  236. package/workflows/product/prod.spec.issue.md +145 -0
  237. package/workflows/product/prod.spec.md +60 -0
  238. package/workflows/product/prod.spec.prd.md +100 -0
  239. package/workflows/taxonomy.md +92 -0
  240. package/workflows/warm-up.md +574 -0
@@ -0,0 +1,378 @@
1
+ ---
2
+ name: eng-security-patch
3
+ description: Gera diffs candidatos para achados confirmados de segurança. Consome triage.json (preferencial) filtrado por status == "confirmed". Executa 1 subagente de patch por achado + 1 reviewer independente por diff (sem ver a prosa do finding). Escreve PATCHES/bug_NN/{patch.diff,patch_result.json}, PATCHES.md e PATCHES.json como texto inerte para revisão humana — nunca aplica diffs. Usar quando pedido "gerar fixes", "patch dos achados", "fechar o loop do triage", "gerar correções candidatas".
4
+ argument-hint: "<triage.json> [--repo PATH] [--top N] [--id F-NNN] [--fresh]"
5
+ allowed-tools:
6
+ - Read
7
+ - Glob
8
+ - Grep
9
+ - Write
10
+ - Task
11
+ - AskUserQuestion
12
+ - Bash(git log:*)
13
+ ---
14
+
15
+ # eng-security-patch
16
+
17
+ Terceira peça do pipeline estático (`/eng-threat-model` → `/eng.security-audit` → `/eng-security-triage` → `/eng-security-patch`).
18
+ Transforma uma lista ranqueada de achados verificados em diffs candidatos.
19
+
20
+ O skill **nunca aplica um diff** ao repositório-alvo. O output é texto inerte em `./.security/outputs/PATCHES/` para o TL revisar e aplicar fora de banda. Não existe flag `--apply` ou `--approve` por design: a capacidade está ausente e portanto não pode ser prompt-injetada.
21
+
22
+ **Argumentos** (parsear de `$ARGUMENTS`):
23
+ - `<triage.json>` (posicional, obrigatório): `triage.json` filtrado por `status == "confirmed"`. Aceita `security-findings.json` com warning.
24
+ - `--repo PATH`: codebase-alvo, read-only (default: cwd). O skill para se os arquivos citados não resolverem sob esse path.
25
+ - `--top N`: patchar apenas os N achados de maior severidade.
26
+ - `--id F-NNN`: patchar apenas o achado com este id.
27
+ - `--fresh`: ignorar checkpoint `.security/state/patch-state.json` e recomeçar do zero.
28
+
29
+ **Escopo de Write.** A ferramenta Write pode escrever SOMENTE em `./.security/outputs/PATCHES/` e `./.security/state/`. Nunca escrever em `--repo`, nunca `git apply`, nunca `patch`, nunca editar código-alvo.
30
+
31
+ ---
32
+
33
+ ## Checkpointing (`.security/state/patch-state.json`)
34
+
35
+ Estado persiste em `.security/state/patch-state.json` para que uma nova sessão `/eng-security-patch` retome sem re-spawnar subagentes.
36
+
37
+ **Formato do estado:**
38
+ ```json
39
+ {
40
+ "status": "running|complete",
41
+ "phase_done": 0,
42
+ "args": { "repo": ".", "top": null, "id": null, "findings_path": "triage.json" },
43
+ "findings": [],
44
+ "patches": []
45
+ }
46
+ ```
47
+
48
+ **Início da execução:**
49
+ - Read `.security/state/patch-state.json` se existir.
50
+ - Se `status == "complete"` OU arquivo ausente OU `--fresh` em `$ARGUMENTS` → começar do zero. Write estado inicial com `{"status": "running", "phase_done": 0, ...}` para `.security/state/patch-state.json`.
51
+ - Se `status == "running"` com `phase_done == N` → retomar. Print `Retomando checkpoint: Fase N concluída`. Pular para Fase N+1.
52
+
53
+ **Fim de cada fase N:**
54
+ Write o estado atualizado (com `phase_done: N` e dados acumulados) para `.security/state/patch-state.json`.
55
+
56
+ **Fim da execução:**
57
+ Write `{"status": "complete", "phase_done": 4, ...}` para `.security/state/patch-state.json`.
58
+
59
+ ---
60
+
61
+ ## Fase 0: Parse de argumentos e validação
62
+
63
+ ### 0a. Parsear `$ARGUMENTS`
64
+
65
+ Extrair: findings path (primeiro posicional), `--repo` (default `.`), `--top`, `--id`, `--fresh`.
66
+ Se nenhum findings path: usar AskUserQuestion para solicitar.
67
+
68
+ ### 0b. Validar o input
69
+
70
+ Ler o arquivo de findings:
71
+
72
+ - **`triage.json`** — ler `.findings[]`. **Filtrar por `status == "confirmed"`**. Este é o input canônico: já verificado, deduplicado, ranqueado, com owner.
73
+ - **`security-findings.json`** — ler `.findings[]`. Não verificado; print `Warning: security-findings.json não passou por triage. Execute /eng-security-triage primeiro para melhor precisão.` e continuar.
74
+ - **JSON genérico** com lista top-level ou array `findings`/`results`/`issues`/`vulnerabilities`.
75
+
76
+ Print: `N achados confirmados encontrados em <findings_path>`.
77
+
78
+ **Checkpoint:** Write `.security/state/patch-state.json` com `{"status": "running", "phase_done": 0, "args": {...}}`.
79
+
80
+ ---
81
+
82
+ ## Fase 1: Ingest e normalização
83
+
84
+ ### 1a. Aliases de campos (canônico ← também aceito)
85
+
86
+ | Canônico | Também aceitar |
87
+ |------------------|-------------------------------------------------------------|
88
+ | `file` | `path`, `location.file`, `filename` |
89
+ | `line` | `line_number`, `location.line`, `lineno` |
90
+ | `category` | `type`, `cwe`, `rule_id` |
91
+ | `severity` | `severity_rating`, `level`, `priority`, `severity_derived` |
92
+ | `title` | `name`, `summary`, `message` |
93
+ | `description` | `details`, `report`, `body`, `evidence` |
94
+ | `recommendation` | `fix`, `remediation`, `mitigation` |
95
+ | `owner_hint` | `owner`, `component` |
96
+
97
+ Preservar `id` do triage.json (padrão `F-NNN`). Adicionar `source` (path relativo do arquivo de input).
98
+
99
+ ### 1b. Filtro e ordem
100
+
101
+ - Se `--id F-NNN`: manter apenas esse achado.
102
+ - Se `--top N`: ordenar por `severity` (HIGH > MEDIUM > LOW) depois `exploitability_rank` asc, manter os N primeiros.
103
+ - Descartar achados sem `file` (não é possível patchar o que não tem localização). Registrar como `patch_status: "skipped"` com razão `"no source location"`.
104
+
105
+ ### 1c. Localizar o codebase-alvo
106
+
107
+ Resolver `--repo`. Para os primeiros 5 achados com `file`, verificar se o path resolve sob o repo (tentar como está, depois com prefixos comuns removidos). Se nenhum resolver: **parar** e informar o usuário com sugestão de valor para `--repo`.
108
+
109
+ **Checkpoint:** Write `.security/state/patch-state.json` com `phase_done: 1` + `findings` normalizados + `skipped`.
110
+
111
+ ---
112
+
113
+ ## Fase 2: Gerar patches (1 subagente por achado)
114
+
115
+ Um Task por achado, **todos em UMA única mensagem** para execução paralela. `subagent_type: "general-purpose"`. Nunca usar `run_in_background` — você precisa do texto do diff, não de um handle assíncrono.
116
+
117
+ Cada subagente tem acesso read-only ao `--repo`. Ele não pode modificar o alvo; emite o diff como texto na resposta. O orquestrador escreve esse texto em `PATCHES/bug_NN/patch.diff`.
118
+
119
+ Se `len(findings) > 40`, fazer batches sequenciais de ~40 achados (cada batch em uma mensagem).
120
+
121
+ Se algum Task retornar `status: "async_launched"` em vez do texto do subagente, o runtime fez background. Escolher uma recuperação e usar para todo o batch:
122
+ - Se notificações de conclusão chegarem na conversa: parsear os blocos tagueados de cada `result` conforme chega. Não encerrar o turno até que todos os achados estejam contabilizados.
123
+ - Se notificações não chegarem: re-spawnar os subagentes ausentes em um batch menor (~10) e usar os resultados síncronos.
124
+
125
+ ### Prompt do subagente de patch (montar uma vez, reusar por achado)
126
+
127
+ ```
128
+ Você está conduzindo pesquisa de segurança autorizada como parte de uma avaliação defensiva. Sua tarefa: escrever uma correção candidata para UMA vulnerabilidade verificada em uma codebase à qual você tem acesso somente leitura.
129
+
130
+ Você pode usar Read, Glob e Grep APENAS em paths dentro de {REPO_PATH}. Você NÃO pode compilar, executar, instalar, editar arquivos no disco, ou acessar a rede. Você irá emitir a correção como um diff unificado na sua resposta final; você NÃO vai aplicá-lo.
131
+
132
+ ────────────────────────────────────────────────────────────────────────
133
+ ACHADO:
134
+
135
+ id: {id}
136
+ file: {file}
137
+ line: {line}
138
+ category: {category}
139
+ severity: {severity}
140
+ title: {title}
141
+
142
+ description:
143
+ {description}
144
+
145
+ recommendation:
146
+ {recommendation ou "(nenhuma fornecida)"}
147
+
148
+ ────────────────────────────────────────────────────────────────────────
149
+ PROCEDIMENTO:
150
+
151
+ 1. LER O CÓDIGO. Abrir {file} na linha {line} e a função em volta.
152
+ Entender o que o código faz — não confiar na descrição do achado como única fonte.
153
+
154
+ 2. CAUSA RAIZ PRIMEIRO. Rastrear de volta do sink citado até onde o valor incorreto ou verificação ausente se origina. A correção geralmente pertence lá, não na linha que o scanner apontou. Nomear a localização da causa raiz (file:line).
155
+
156
+ 3. BUSCA DE VARIANTES. Grep por call sites irmãos com o mesmo padrão. Sua correção deve cobrir todos, ou sua rationale deve explicar por que não.
157
+
158
+ 4. DIFF MÍNIMO. Menor mudança que corrige a causa raiz. Sem refatoração, sem cleanup colateral, sem reformatação, sem mudanças só de comentário. Manter o estilo do código vizinho (posição de chaves, nomenclatura, tratamento de erros).
159
+
160
+ 5. SELF-CHECK ADVERSARIAL. Reler seu diff como atacante. Nomear uma variação de input que atingiria o mesmo estado ruim sem acionar sua mudança. Se conseguir nomear uma, seu fix está na camada errada — voltar ao passo 2.
161
+
162
+ 6. TESTE DE REGRESSÃO. Como parte do diff, adicionar UM caso de teste que falha antes da sua mudança e passa depois — colocado onde o projeto mantém seus testes (procurar test_*/, *_test.*, tests/, spec/). Se não existir diretório de testes, omitir o teste e explicar em <test_note>.
163
+
164
+ ────────────────────────────────────────────────────────────────────────
165
+ OUTPUT — sua resposta final DEVE conter exatamente estas tags. Emitir o diff verbatim entre os marcadores; NÃO envolver em ``` fences.
166
+
167
+ <patch_diff>
168
+ --- a/path/to/file
169
+ +++ b/path/to/file
170
+ @@ ... @@
171
+ linha de contexto
172
+ -linha removida
173
+ +linha adicionada
174
+ </patch_diff>
175
+ <rationale>o que mudou e por que, mecanicamente — file:line da causa raiz, o que a mudança garante</rationale>
176
+ <variants_checked>pares file:function que você inspecionou para o mesmo padrão, e se cada um precisou da correção</variants_checked>
177
+ <bypass_considered>a variação de input que você tentou no passo 5 e por que ela não atinge mais o estado ruim</bypass_considered>
178
+ <test_note>onde o teste de regressão foi adicionado, ou por que nenhum foi incluído</test_note>
179
+
180
+ Se você determinar que o achado NÃO é corrigível como descrito (arquivo errado, código já corrigido, achado é falso-positivo), emitir:
181
+
182
+ <patch_diff>NONE</patch_diff>
183
+ <rationale>por que nenhum patch é apropriado</rationale>
184
+ ```
185
+
186
+ ### Parsear resultados
187
+
188
+ De cada resultado de Task, extrair os cinco blocos tagueados. Tolerar whitespace extra, ``` fences extras, e entidades HTML escapadas (`&lt;` `&gt;` `&amp;`).
189
+
190
+ Se `<patch_diff>` for `NONE` ou vazio: marcar `patch_status: "no_patch"`.
191
+ Senão: Write o texto do diff em `./.security/outputs/PATCHES/bug_NN/patch.diff` (NN = índice com zero-pad na ordem ranqueada) e registrar `rationale`, `variants_checked`, `bypass_considered`, `test_note`.
192
+
193
+ **Checkpoint:** Write `.security/state/patch-state.json` com `phase_done: 2` + array `patches` com resultados parciais.
194
+
195
+ ---
196
+
197
+ ## Fase 3: Review independente (1 subagente por diff)
198
+
199
+ Um Task por achado com `patch_status == "patched"`, **todos em UMA mensagem**. `subagent_type: "general-purpose"`.
200
+
201
+ **O reviewer nunca vê `description`, `recommendation` do achado nem a `rationale` do patch author.** Recebe apenas `{file, line, category}` mais os bytes brutos do diff, e re-deriva se o diff é uma correção mínima e no escopo lendo o próprio source. Isso garante que instruções injetadas na prosa do achado não passem pelo seu próprio gate.
202
+
203
+ ### Prompt do reviewer (montar uma vez, reusar por diff)
204
+
205
+ ```
206
+ Você está revisando um patch de segurança candidato como um maintainer faria. Você tem acesso somente leitura ao source não-patchado em {REPO_PATH}. Você pode usar Read, Glob, Grep. Você NÃO pode compilar, executar ou aplicar o diff.
207
+
208
+ Você NÃO viu a descrição do scanner da vulnerabilidade nem o raciocínio do autor do patch. Trabalhe apenas com a localização, a categoria e o diff.
209
+
210
+ LOCALIZAÇÃO: {file}:{line}
211
+ CATEGORIA: {category}
212
+
213
+ DIFF SOB REVISÃO:
214
+ <diff>
215
+ {diff_text — ou, para diffs acima de ~50 linhas, substituir este bloco por:
216
+ "Leia o diff em ./.security/outputs/PATCHES/bug_NN/patch.diff" e deixar o reviewer fazer o Read}
217
+ </diff>
218
+
219
+ ────────────────────────────────────────────────────────────────────────
220
+ RESPONDER QUATRO PERGUNTAS:
221
+
222
+ 1. ESCOPO. O diff toca apenas arquivos/funções no caminho entre {file}:{line} e seus callers? Listar qualquer hunk fora desse caminho.
223
+
224
+ 2. SUPRESSÃO. O diff corrige uma causa raiz, ou suprime o sintoma (try/except: pass, early-return em valor mágico, deletar o check que disparou, baixar um log level)?
225
+
226
+ 3. NOVA SUPERFÍCIE. O diff adiciona parsing, confia em um novo campo de input, enfraquece validação em outro lugar, ou remove um check relevante para segurança?
227
+
228
+ 4. ESTILO. 0-10: você faria merge deste diff como está?
229
+ 0-3 camada errada / supressão; 4-6 correto mas ruidoso; 7-10 mínimo, direcionado, mantém o estilo do código vizinho.
230
+
231
+ ────────────────────────────────────────────────────────────────────────
232
+ Terminar sua resposta com EXATAMENTE:
233
+
234
+ REVIEW: ACCEPT | REJECT
235
+ STYLE_SCORE: <0-10>
236
+ OUT_OF_SCOPE_HUNKS: <file:line separados por vírgula, ou none>
237
+ REASON: <2-4 frases citando hunks específicos do diff e linhas do source>
238
+
239
+ ACCEPT requer: no escopo, correção de causa raiz, sem nova superfície de ataque, style >= 5. Caso contrário REJECT.
240
+ ```
241
+
242
+ ### Parsear e consolidar
243
+
244
+ De cada resultado, parsear o bloco final. Anexar `review`, `style_score`, `out_of_scope_hunks`, `review_reason` ao achado. Definir `verified: "static_review_only"` para **todo** resultado estático — o label descreve a classe de verificação, não o resultado.
245
+
246
+ **Checkpoint:** Write `.security/state/patch-state.json` com `phase_done: 3` + `patches` completos.
247
+
248
+ ---
249
+
250
+ ## Fase 4: Output
251
+
252
+ ### 4a. `patch_result.json` por achado
253
+
254
+ Para cada achado, Write `./.security/outputs/PATCHES/bug_NN/patch_result.json`:
255
+
256
+ ```json
257
+ {
258
+ "id": "F-003",
259
+ "source": "triage.json#2",
260
+ "title": "...",
261
+ "file": "...",
262
+ "line": 0,
263
+ "category": "...",
264
+ "severity": "HIGH",
265
+ "owner_hint": "...",
266
+ "patch_status": "patched|no_patch|skipped",
267
+ "verified": "static_review_only",
268
+ "review": "ACCEPT|REJECT|null",
269
+ "style_score": 0,
270
+ "out_of_scope_hunks": [],
271
+ "rationale": "...",
272
+ "variants_checked": "...",
273
+ "bypass_considered": "...",
274
+ "test_note": "...",
275
+ "review_reason": "..."
276
+ }
277
+ ```
278
+
279
+ ### 4b. `./.security/outputs/PATCHES.json`
280
+
281
+ Write `./.security/outputs/PATCHES.json`:
282
+
283
+ ```json
284
+ {
285
+ "patch_completed": true,
286
+ "repo": "...",
287
+ "input_file": "triage.json",
288
+ "summary": {
289
+ "input_count": 0,
290
+ "patched": 0,
291
+ "no_patch": 0,
292
+ "skipped": 0,
293
+ "accepted": 0,
294
+ "rejected": 0
295
+ },
296
+ "findings": [ { "...": "mesmo shape do patch_result.json" } ]
297
+ }
298
+ ```
299
+
300
+ ### 4c. `./.security/outputs/PATCHES.md` (incremental)
301
+
302
+ **Passo 1 — header.** Write `./.security/outputs/PATCHES.md` (sobrescreve se existir):
303
+
304
+ ````markdown
305
+ # Patches Candidatos
306
+
307
+ > **Somente revisão estática.** Estes diffs foram criados e revisados por
308
+ > agentes independentes lendo o source. Eles NÃO foram compilados, executados
309
+ > ou re-atacados. Leia cada diff antes de aplicar — verifique: (1) escopo mínimo,
310
+ > (2) causa raiz corrigida (não supressão de sintoma), (3) nenhuma nova superfície de ataque.
311
+
312
+ **Input:** {findings_path} · **Repo:** {repo} · {N} achados → {M} diffs
313
+
314
+ ---
315
+ ````
316
+
317
+ **Passo 2 — por achado** (ordenar: ACCEPT primeiro, depois por severity). Para cada achado, append a `./.security/outputs/PATCHES.md`:
318
+
319
+ ````markdown
320
+ ## bug_{NN}: [{severity}] {title} ({id})
321
+
322
+ `{file}:{line}` · {category} · owner: {owner_hint ou "?"}
323
+ **Status:** {verified} · review {review ou "n/a"} · style {style_score ou "n/a"}/10
324
+ **Diff:** `.security/outputs/PATCHES/bug_{NN}/patch.diff`
325
+
326
+ **Rationale:** {rationale}
327
+ **Variantes verificadas:** {variants_checked}
328
+ **Bypass considerado:** {bypass_considered}
329
+ {se review == "REJECT":}
330
+ > **Rejeitado pelo reviewer:** {review_reason}
331
+ {se out_of_scope_hunks:}
332
+ > **Hunks fora do escopo:** {out_of_scope_hunks}
333
+
334
+ ---
335
+ ````
336
+
337
+ **Passo 3 — rodapé.** Append tabela `## Skipped` para achados sem `file` ou `patch_status == "no_patch"`, uma linha cada com a razão.
338
+
339
+ **Checkpoint final:** Write `.security/state/patch-state.json` com `{"status": "complete", "phase_done": 4, ...}`.
340
+
341
+ ### 4d. Sumário terminal
342
+
343
+ Máximo ~10 linhas:
344
+
345
+ ```
346
+ Patches gerados (modo estático): {N} achados → {M} diffs.
347
+
348
+ Aceitos: {n} {título do top aceito}
349
+ Rejeitados: {n}
350
+ Sem patch: {n}
351
+ Skipped: {n}
352
+
353
+ Escrito em ./.security/outputs/PATCHES/bug_NN/, ./.security/outputs/PATCHES.md, ./.security/outputs/PATCHES.json
354
+ Estes são rascunhos. Revise cada diff antes de aplicar.
355
+ ```
356
+
357
+ ---
358
+
359
+ ## Guard Rails
360
+
361
+ - **O skill nunca aplica diffs.** Sem `git apply`, sem `patch`, sem Edit contra `--repo`. Se parecer necessário, o design está errado.
362
+ - **Write somente em `./.security/outputs/PATCHES/` e `.security/state/`.**
363
+ - **Isolamento do reviewer.** O prompt do reviewer recebe `{file, line, category, diff}` e nada mais do achado. Não passar `description`, `recommendation` nem a `rationale` do autor do patch.
364
+ - **Todos os Task calls de uma fase em UMA mensagem.** Spawn serial está correto mas N× mais lento.
365
+ - **`verified: "static_review_only"` sempre** em modo estático, independente de ACCEPT/REJECT.
366
+ - **Checkpoint antes de iniciar a próxima fase**, sempre.
367
+ - **Input canônico é `triage.json` com `status == "confirmed"`.** Patchar achado não-verificado gasta tokens em falso-positivo.
368
+
369
+ ---
370
+
371
+ ## Pipeline completo
372
+
373
+ ```
374
+ /eng-threat-model → /eng.security-audit → /eng-security-triage → /eng-security-patch
375
+ (mapa) (scan guiado) (verifica+ranqueia) (fix candidato)
376
+ ```
377
+
378
+ Schemas de todos os artefatos em `docs/SECURITY-ARTIFACTS-SCHEMA.md`.
@@ -0,0 +1,266 @@
1
+ ---
2
+ name: eng-security-triage
3
+ description: >-
4
+ Triage de achados de seguranca. Consome um ou mais security-findings.json (output de
5
+ eng.security-audit ou eng.security-review), deduplica em 2 passadas (deterministica +
6
+ semantica), verifica cada achado com N votos independentes, re-rankeia por exploitabilidade
7
+ e escreve triage.json. Use apos eng.security-audit ou eng.security-review.
8
+ argument-hint: "<findings-file> [<findings-file2> ...] [--auto] [--votes N]"
9
+ allowed-tools:
10
+ - Read
11
+ - Glob
12
+ - Grep
13
+ - Write
14
+ - AskUserQuestion
15
+ - Task
16
+ - Bash(git log:*)
17
+ - Bash(find:*)
18
+ ---
19
+
20
+ # eng-security-triage
21
+
22
+ Recebe o output bruto do scan (`security-findings.json`) e produz lista limpa, verificada e ranqueada (`triage.json`).
23
+
24
+ **Problema que resolve:** scanners de seguranca tem alta taxa de falso-positivo (~45%) e achados duplicados entre focus areas. Triage resolve em 4 fases: normalizar → deduplicar → verificar com N votos → re-rankear por exploitabilidade.
25
+
26
+ **Subagentes de verificacao rodam sem MCP** — apenas o texto do achado como contexto. Menos tool = veredicto mais deterministico, mais barato, sem distração por acesso ao codigo.
27
+
28
+ ---
29
+
30
+ ## Checkpointing
31
+
32
+ Em lotes grandes (>20 achados × N votos), a triage pode esgotar contexto ou atingir rate limit mid-run.
33
+ Estado persiste em `.security/state/` via Write tool — sem dependencia de Python.
34
+
35
+ **Verificacao de resume (sempre antes do Step 0):**
36
+
37
+ Verificar se `.security/state/triage-state.json` existe.
38
+ - Nao existe ou `--fresh` em `$ARGUMENTS`: fresh start.
39
+ - `status == "running"` com `phase_done == N`: ler `.security/state/triage-phase-N.json` e pular direto para Fase N+1.
40
+ - `status == "complete"`: fresh start.
41
+
42
+ **Ao final de cada fase N:** dois Writes:
43
+ 1. `.security/state/triage-phase-N.json` — estado completo da fase (achados com campos preenchidos ate aqui).
44
+ 2. `.security/state/triage-state.json` — `{"status": "running", "phase_done": N}`.
45
+
46
+ **Ao escrever o `triage.json` final:**
47
+ `.security/state/triage-state.json` → `{"status": "complete", "phase_done": 6}`.
48
+
49
+ `.security/state/` e scratch — adicionar ao `.gitignore` do projeto.
50
+
51
+ ---
52
+
53
+ ## Step 0 — Entrevista (pular com `--auto`)
54
+
55
+ Antes de processar, coletar contexto via `AskUserQuestion`:
56
+
57
+ 1. **Fronteira de confianca:** "Qual a fronteira de confianca do sistema? (ex: usuarios autenticados podem fazer upload, mas nao modificar dados de outros)"
58
+ 2. **Threat model:** "Existe `THREAT_MODEL.md`? Qual o path? (ou 'nao existe')"
59
+ 3. **Tolerancia a ruido:** "Preferencia de precisao? `low` (menos falsos positivos) | `medium` (default) | `high` (manter tudo duvidoso para revisao humana)"
60
+ 4. **Padrao de score:** "Usar CVSS (impacto x likelihood) ou `exploitability-first` (priorizar por facilidade de exploracao)?"
61
+
62
+ `--auto`: pular entrevista — defaults: `noise_tolerance=medium`, `scoring=exploitability-first`, threat model = buscar `THREAT_MODEL.md` na raiz.
63
+
64
+ Salvar respostas em `.security/state/triage-context.json` para sobreviver a compactacao.
65
+
66
+ ---
67
+
68
+ ## Fase 1 — Normalizar
69
+
70
+ 1. Ler todos os `security-findings.json` passados como argumento.
71
+ 2. Flatten em lista unica de achados.
72
+ 3. Normalizar IDs para `F-001`, `F-002`, ... (ordenado por impact desc, likelihood desc, file, linha).
73
+ 4. Registrar `input_files[]` e `total_input` para o `summary` final.
74
+
75
+ Se um arquivo nao existir ou nao for JSON valido: reportar ao usuario e continuar com os restantes.
76
+
77
+ ---
78
+
79
+ ## Fase 2 — Deduplicar
80
+
81
+ **Passada 1 — Deterministica:**
82
+ Agrupar achados onde:
83
+ - Mesmo `file`
84
+ - Mesma `category`
85
+ - `line` dentro de ±10 linhas entre si
86
+
87
+ Para cada grupo: manter o achado com `description` mais longa (mais informativo). Registrar descartados com `dedup_group: <id do canonico>`.
88
+
89
+ **Passada 2 — Semantica:**
90
+ Para pares que sobreviveram a passada 1 com mesma `category` mas arquivos diferentes ou linha fora do range, spawnar 1 subagente de comparacao (sem MCP):
91
+
92
+ ```
93
+ Dois achados de seguranca. Corrigir um necessariamente corrige o outro?
94
+
95
+ ACHADO A: {title_a} em {file_a}:{line_a}
96
+ Descricao: {description_a}
97
+
98
+ ACHADO B: {title_b} em {file_b}:{line_b}
99
+ Descricao: {description_b}
100
+
101
+ Responda exatamente:
102
+ is_duplicate: true | false
103
+ reasoning: <uma linha>
104
+ ```
105
+
106
+ Se `is_duplicate: true`: manter o de maior `confidence`, descartar o outro com `dedup_group`.
107
+ Incrementar `duplicates_removed` no `summary`.
108
+
109
+ ---
110
+
111
+ ## Fase 3 — Verificacao Multi-Voto
112
+
113
+ Para cada achado nao-descartado, spawnar **N subagentes de voto independentes** (default N=3; sobrescrever com `--votes N`).
114
+
115
+ Cada subagente recebe apenas o texto do achado — **sem acesso ao codigo-fonte, sem MCP**:
116
+
117
+ ```
118
+ Voce e um revisor de seguranca independente. Avaliar este achado:
119
+
120
+ ID: {id}
121
+ TITULO: {title}
122
+ CATEGORIA: {category} ({file}:{line})
123
+ IMPACTO: {impact} | LIKELIHOOD: {likelihood}
124
+
125
+ DESCRICAO:
126
+ {description}
127
+
128
+ EVIDENCIA:
129
+ {evidence}
130
+
131
+ FRONTEIRA DE CONFIANCA DO SISTEMA: {trust_boundary}
132
+
133
+ Sua postura padrao: o scanner esta ERRADO. Re-derive a conclusao a partir da descricao e evidencia fornecidas.
134
+
135
+ REGRAS DE EXCLUSAO — se o achado se encaixa em qualquer uma, e FALSO POSITIVO mesmo que tecnicamente preciso:
136
+
137
+ 1. DoS volumetrico ou rate-limiting ausente (tratado na camada de infraestrutura). ReDoS, complexidade algoritmica e recursao ilimitada SAO findings validos.
138
+ 2. Codigo de teste, codigo morto, codigo de exemplo/fixture ou crash sem impacto de seguranca.
139
+ 3. Comportamento intencional do design (middleware de compressao, algoritmo fraco oferecido ao lado de um forte com opt-in).
140
+ 4. Memory-safety em linguagens memory-safe fora de blocos unsafe/FFI.
141
+ 5. SSRF onde o atacante controla apenas o path, nao o host ou protocolo.
142
+ 6. Input de usuario fluindo para prompt de IA/LLM (prompt injection nao e vulnerabilidade de codigo no alvo).
143
+ 7. Path traversal em object storage (S3/GCS) onde ../ nao escapa uma fronteira de confianca.
144
+ 8. Inputs confiaveis usados como vetor (env vars, flags CLI definidos pelo operador), a menos que o sistema marque-os como nao-confiaveis.
145
+ 9. Codigo client-side flagrado para classes de vulnerabilidade server-side.
146
+ 10. Versoes desatualizadas de dependencias (gerenciado por processo separado; use npm audit para isso).
147
+ 11. Randomness fraca usada para fins nao-seguranca (jitter, shuffling, fallbacks de dev).
148
+ 12. Issues de baixo impacto: log spoofing, CSRF em logout, self-XSS, open redirect, tabnabbing, injecao de regex.
149
+ 13. Gap de hardening sem caminho de exploit concreto: headers de seguranca ausentes, sem audit logging, config permissiva nao alcancada por input nao-confiavel.
150
+ 14. XSS em framework com auto-escape padrao (React, Angular, Vue, Jinja2 autoescape=on) a menos que o sink seja escape hatch de HTML raw (dangerouslySetInnerHTML, v-html, |safe).
151
+ 15. Identificadores construidos para serem inesgotaveis (UUIDv4, tokens de 128+ bits aleatorios) flagrados como "previsiveis" ou "precisam de validacao".
152
+ 16. Race conditions ou TOCTOU apenas teoricos — sem janela realista ou sem mudanca de estado com relevancia de seguranca entre check e use.
153
+
154
+ Este achado e real e exploravel dado a fronteira de confianca declarada? Avalie contra as regras acima e a evidencia fornecida.
155
+
156
+ Responda exatamente:
157
+ verdict: confirmed | rejected | inconclusive
158
+ verify_verdict: exploitable | mitigated | needs_manual_test
159
+ exploitable: caminho de ataque realista, sem mitigacao efetiva
160
+ mitigated: achado real mas controle existente reduz o risco (nomear o controle no reasoning)
161
+ needs_manual_test: conclusao depende de comportamento runtime — recomendar PoC humano
162
+ (para verdict=rejected: sempre needs_manual_test)
163
+ reasoning: <uma linha — citar regra de exclusao se aplicavel, ex: "Regra 1: DoS volumetrico">
164
+ confidence: <0.0-1.0>
165
+ ```
166
+
167
+ **Consolidacao:**
168
+
169
+ | Votos confirmed | Resultado | Status final |
170
+ |---|---|---|
171
+ | >= ceil(N/2) confirmed | Confirmado | `confirmed` |
172
+ | >= ceil(N/2) rejected | Falso positivo | `rejected` |
173
+ | Outro | Inconcluso | `inconclusive` |
174
+
175
+ Registrar `vote_result{votes_total, votes_confirmed, verdict, reasoning}` em cada achado.
176
+ `verify_verdict` do achado: valor modal entre os votos (se todos rejected: `needs_manual_test`).
177
+ Incrementar `rejected_by_vote` no `summary`.
178
+
179
+ ---
180
+
181
+ ## Fase 4 — Re-rankear por Exploitabilidade
182
+
183
+ Ordenar achados `confirmed` e `inconclusive` por exploitability score (1 subagente por achado, sem MCP):
184
+
185
+ ```
186
+ Dado este achado confirmado:
187
+ {id} | {title} | {category}
188
+ impact (scanner): {impact} | likelihood: {likelihood}
189
+ trust_boundary: {trust_boundary}
190
+ verify_verdict: {verify_verdict}
191
+
192
+ PASSO 1: Listar TODAS as pre-condicoes para exploracao (estado de auth, configuracao especifica, posicao de rede, janela de race).
193
+
194
+ PASSO 2: Identificar nivel de acesso minimo necessario:
195
+ unauthenticated_remote | authenticated | local | physical
196
+
197
+ PASSO 3: Derivar severidade — aplicar tabela e tomar o resultado MENOR:
198
+ | Pre-condicoes | Acesso | Severidade |
199
+ | 0 | unauthenticated_remote | HIGH |
200
+ | 1-2 | authenticated | MEDIUM |
201
+ | 3+ | local / sem demo path | LOW |
202
+ Exemplo: 0 pre-condicoes mas so authenticated → MEDIUM, nao HIGH.
203
+
204
+ PASSO 4: Comparar com impact declarado pelo scanner (severity_alignment -5..+5):
205
+ +3..+5 justificado ou subestimado | 0..+2 adequado | -1..-3 inflado | -4..-5 muito inflado
206
+
207
+ PASSO 5: Score de explorabilidade 1-10 para desempate no ranking:
208
+ 10=trivial, tooling publico; 7-9=habilidade media; 4-6=conhecimento especializado; 1-3=acesso privilegiado
209
+
210
+ Responda exatamente:
211
+ preconditions: <lista separada por ponto e virgula>
212
+ access_level: <unauthenticated_remote|authenticated|local|physical>
213
+ severity_derived: <HIGH|MEDIUM|LOW>
214
+ severity_alignment: <-5..+5>
215
+ exploitability_score: <1-10>
216
+ reasoning: <uma linha>
217
+ ```
218
+
219
+ Ordenar por `severity_derived` (HIGH > MEDIUM > LOW) → `exploitability_score` desc → `impact` desc → `likelihood` desc.
220
+ Atribuir `exploitability_rank` (1 = mais critico).
221
+
222
+ ---
223
+
224
+ ## Fase 5 — Atribuicao de Owner
225
+
226
+ Para cada achado `confirmed` ou `inconclusive`, identificar o dono mais especifico inferivel. Parar na primeira regra que produzir resultado:
227
+
228
+ 1. **CODEOWNERS**: buscar `CODEOWNERS`, `.github/CODEOWNERS`, `docs/CODEOWNERS` no repo. Se encontrado, fazer match do `file` do achado contra os padroes (ultimo match vence). Registrar como `"CODEOWNERS: <padrao> → <owner(s)>"`.
229
+
230
+ 2. **git log**: executar `git log --format='%an' -n 50 -- "{file}" | sort | uniq -c | sort -rn | head -3`. Registrar como `"top committer: <nome> (<n>/<total> commits recentes); sem entrada CODEOWNERS"`.
231
+
232
+ 3. **Fallback de modulo**: registrar como `"componente: <diretorio-raiz do file>/; sem CODEOWNERS ou historico git"`.
233
+
234
+ Salvar como `owner_hint` no achado. Para achados `rejected` ou `duplicate`: `owner_hint: null`.
235
+
236
+ ---
237
+
238
+ ## Step 2 — Escrever output
239
+
240
+ Ler `docs/SECURITY-ARTIFACTS-SCHEMA.md` secao 3 antes de escrever.
241
+
242
+ Escrever `.security/outputs/triage.json`. Criar `.security/outputs/` se não existir.
243
+
244
+ Salvar `.security/state/triage-meta.json`:
245
+
246
+ ```json
247
+ {
248
+ "triage_date": "<ISO-8601>",
249
+ "input_files": ["<path>"],
250
+ "total_input": 0,
251
+ "confirmed": 0,
252
+ "top_finding": "<F-001: titulo>"
253
+ }
254
+ ```
255
+
256
+ ---
257
+
258
+ ## Step 3 — Sumario ao usuario
259
+
260
+ Apos escrever:
261
+
262
+ 1. Path do `.security/outputs/triage.json`.
263
+ 2. Tabela: top 5 por `exploitability_rank` (id, titulo, categoria, file:line, impact, rank, owner_hint).
264
+ 3. Contadores: `{total_input} input → {duplicates_removed} dedup → {rejected_by_vote} rejeitados por voto → {confirmed} confirmados`.
265
+ 4. Achados `inconclusive`: listar ids para revisao humana.
266
+ 5. Proximo passo: *"Achados confirmados prontos para cards no $TASK_MANAGER."*