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,426 @@
1
+ ---
2
+ name: eng-data-orchestrator
3
+ description: >
4
+ Playbook operacional para gerenciamento de DAGs e pipelines orquestrados:
5
+ criação de DAGs, retry strategies, monitoramento de tasks, alertas e troubleshooting.
6
+ Trigger: Use para criar, manter ou depurar DAGs no $DATA_ORCHESTRATOR.
7
+ license: AGPL-3.0
8
+ compatibility: Designed for Claude Code (or similar products)
9
+ allowed-tools: Read Write Edit Glob Grep Bash
10
+ metadata:
11
+ author: jarvis-team
12
+ version: "1.0"
13
+ argument-hint: "[criar|monitorar|retry|alerta|debug] [nome-do-dag]"
14
+ disable-model-invocation: false
15
+ ---
16
+
17
+ # Eng Data Orchestrator — Gerenciamento de DAGs e Orquestração
18
+
19
+ Você é um **especialista em orquestração de pipelines de dados** com domínio em criação e manutenção de DAGs, estratégias de retry, monitoramento de execução e resposta a falhas. Atua de forma agnóstica à ferramenta — a stack é lida de `$DATA_ORCHESTRATOR` no ENV.md.
20
+
21
+ ## Objetivo
22
+
23
+ Criar, manter e depurar DAGs de forma confiável — garantindo que os pipelines executem no horário correto, com retry adequado, alertas configurados e troubleshooting documentado.
24
+
25
+ ## Stack do Projeto
26
+
27
+ ```bash
28
+ grep -E "^DATA_" $IDE/ENV.md
29
+ ```
30
+
31
+ | Variável ENV | O que define |
32
+ |-------------|-------------|
33
+ | `DATA_ORCHESTRATOR` | Orquestrador (ex: airflow, prefect, dagster, glue-scheduler) |
34
+ | `DATA_ETL_TOOL` | Ferramenta ETL referenciada pelas tasks (ex: aws_glue, dbt, spark) |
35
+ | `DATA_REPO` | Repositório onde ficam os DAGs e scripts |
36
+ | `ALERTS_CHANNEL` | Canal Slack de alertas do projeto (genérico, compartilhado por todos os hubs) |
37
+
38
+ > Se `DATA_ORCHESTRATOR` não estiver definido, perguntar ao usuário antes de prosseguir.
39
+
40
+ ---
41
+
42
+ ## Referência por Orquestrador
43
+
44
+ Este skill adapta os exemplos ao `$DATA_ORCHESTRATOR` identificado no ENV.md:
45
+
46
+ | `DATA_ORCHESTRATOR` | UI de monitoramento | Unidade de agendamento | Unidade de execução |
47
+ |---------------------|--------------------|-----------------------|--------------------|
48
+ | `airflow` | Airflow Web UI / CLI | DAG | Task (Operator) |
49
+ | `prefect` | Prefect UI / CLI | Flow | Task |
50
+ | `dagster` | Dagster UI / CLI | Job | Op / Asset |
51
+ | `glue-scheduler` | AWS Console / CloudWatch | Trigger | Glue Job |
52
+
53
+ > Nos exemplos abaixo, os termos "DAG", "task" e "operador" se referem ao conceito equivalente no orquestrador do projeto.
54
+
55
+ ---
56
+
57
+ ## Fluxos de Trabalho
58
+
59
+ ### Fluxo A — Criar DAG novo
60
+
61
+ #### 1. Definir estrutura do DAG
62
+
63
+ Antes de escrever código, confirmar:
64
+
65
+ | Informação | Pergunta |
66
+ |---|---|
67
+ | Nome do pipeline | Qual o nome? (ex: `bronze_pedidos_erp`, `silver_clientes`) |
68
+ | Schedule | Qual a frequência? (ex: diária 06h, horária, sob demanda) |
69
+ | Dependências | Depende de outro DAG? (ex: silver só roda após bronze) |
70
+ | Owner | Qual o responsável? (email) |
71
+ | Canal de alerta | Para onde vai o alerta de falha? (`$ALERTS_CHANNEL`) |
72
+ | SLA | Até quando precisa terminar? |
73
+
74
+ #### 2. Estrutura padrão de DAG (Airflow)
75
+
76
+ ```python
77
+ """
78
+ DAG: {nome_pipeline}
79
+ Descrição: {o que faz}
80
+ Schedule: {cron ou @daily}
81
+ Owner: {email}
82
+ SLA: {horário limite}
83
+ """
84
+ from datetime import datetime, timedelta
85
+ from airflow import DAG
86
+ from airflow.operators.python import PythonOperator
87
+
88
+ DEFAULT_ARGS = {
89
+ 'owner': '{owner_email}',
90
+ 'depends_on_past': False,
91
+ 'start_date': datetime(2026, 1, 1),
92
+ 'email': ['{owner_email}'],
93
+ 'email_on_failure': True,
94
+ 'email_on_retry': False,
95
+ 'retries': 2,
96
+ 'retry_delay': timedelta(minutes=15),
97
+ 'sla': timedelta(hours=2), # alerta se task não terminar em 2h
98
+ }
99
+
100
+ with DAG(
101
+ dag_id='{nome_pipeline}',
102
+ default_args=DEFAULT_ARGS,
103
+ description='{descrição}',
104
+ schedule_interval='0 6 * * *', # diário às 06h UTC
105
+ catchup=False, # não reprocessar histórico ao ativar
106
+ tags=['{camada}', '{dominio}'],
107
+ ) as dag:
108
+
109
+ extract_task = PythonOperator(
110
+ task_id='extract',
111
+ python_callable=extract,
112
+ op_kwargs={'data_referencia': '{{ ds }}'}, # data de execução do DAG
113
+ )
114
+
115
+ load_task = PythonOperator(
116
+ task_id='load_bronze',
117
+ python_callable=load_bronze,
118
+ op_kwargs={'data_referencia': '{{ ds }}'},
119
+ )
120
+
121
+ # Dependência: extract → load
122
+ extract_task >> load_task
123
+ ```
124
+
125
+ #### 3. Equivalente Prefect
126
+
127
+ ```python
128
+ from prefect import flow, task
129
+ from prefect.schedules import CronSchedule
130
+ from datetime import timedelta
131
+
132
+ @task(retries=2, retry_delay_seconds=900)
133
+ def extract(data_referencia: str):
134
+ ...
135
+
136
+ @task(retries=2, retry_delay_seconds=900)
137
+ def load_bronze(data_referencia: str):
138
+ ...
139
+
140
+ @flow(
141
+ name="{nome_pipeline}",
142
+ description="{descrição}",
143
+ )
144
+ def pipeline_flow(data_referencia: str = None):
145
+ raw = extract(data_referencia)
146
+ load_bronze(data_referencia)
147
+ ```
148
+
149
+ #### 4. Equivalente Dagster
150
+
151
+ ```python
152
+ from dagster import job, op, schedule, OpExecutionContext
153
+
154
+ @op
155
+ def extract_op(context: OpExecutionContext):
156
+ data_referencia = context.op_config.get('data_referencia')
157
+ context.log.info(f"Extraindo {data_referencia}")
158
+ ...
159
+
160
+ @op
161
+ def load_bronze_op(context: OpExecutionContext, raw_data):
162
+ ...
163
+
164
+ @job
165
+ def bronze_pipeline():
166
+ load_bronze_op(extract_op())
167
+
168
+ @schedule(
169
+ cron_schedule="0 6 * * *",
170
+ job=bronze_pipeline,
171
+ execution_timezone="UTC",
172
+ )
173
+ def bronze_pipeline_schedule(_context):
174
+ return {}
175
+ ```
176
+
177
+ ---
178
+
179
+ ### Fluxo B — Configurar Retry Strategy
180
+
181
+ Regras de retry por criticidade do pipeline:
182
+
183
+ | Camada | Retries | Retry delay | Quando usar |
184
+ |--------|---------|-------------|-------------|
185
+ | Bronze (ingestão) | 3 | 15 min | Fonte pode ter instabilidade temporária |
186
+ | Silver (transformação) | 2 | 5 min | Falha raramente é transiente |
187
+ | Gold (modelagem) | 1 | 5 min | Falha geralmente é de dado ou lógica |
188
+ | Alertas / notificações | 1 | 1 min | Falha de alerta não deve bloquear pipeline |
189
+
190
+ **Regra para `retry_exponential_backoff`** (Airflow):
191
+
192
+ ```python
193
+ DEFAULT_ARGS = {
194
+ 'retries': 3,
195
+ 'retry_delay': timedelta(minutes=5),
196
+ 'retry_exponential_backoff': True, # 5m → 10m → 20m
197
+ 'max_retry_delay': timedelta(hours=1),
198
+ }
199
+ ```
200
+
201
+ **Quando NÃO usar retry**:
202
+ - ❌ Falha de schema (dado estruturalmente inválido) — retry não resolve
203
+ - ❌ Credencial inválida — retry não resolve, precisa de intervenção humana
204
+ - ✅ Timeout de rede, fonte temporariamente indisponível, lock de banco
205
+
206
+ ---
207
+
208
+ ### Fluxo C — Configurar Alertas
209
+
210
+ #### Alerta de falha de task (Airflow + Slack)
211
+
212
+ ```python
213
+ from airflow.providers.slack.operators.slack_webhook import SlackWebhookOperator
214
+
215
+ def alert_on_failure(context):
216
+ """Callback de alerta para falha de task."""
217
+ dag_id = context['dag'].dag_id
218
+ task_id = context['task_instance'].task_id
219
+ execution_date = context['execution_date'].strftime('%Y-%m-%d')
220
+ log_url = context['task_instance'].log_url
221
+
222
+ message = (
223
+ f":red_circle: *Pipeline falhou*\n"
224
+ f"• DAG: `{dag_id}`\n"
225
+ f"• Task: `{task_id}`\n"
226
+ f"• Data: `{execution_date}`\n"
227
+ f"• Logs: {log_url}"
228
+ )
229
+
230
+ SlackWebhookOperator(
231
+ task_id='slack_alert',
232
+ slack_webhook_conn_id='slack_data_alerts',
233
+ message=message,
234
+ ).execute(context)
235
+
236
+
237
+ DEFAULT_ARGS = {
238
+ 'on_failure_callback': alert_on_failure,
239
+ ...
240
+ }
241
+ ```
242
+
243
+ > Se `ALERTS_CHANNEL` estiver definido no ENV.md, usar esse canal.
244
+ > Para Prefect e Dagster, adaptar usando seus mecanismos nativos de notificação (automations / sensors).
245
+
246
+ #### SLA Miss (Airflow)
247
+
248
+ ```python
249
+ def sla_miss_callback(dag, task_list, blocking_task_list, slas, blocking_tis):
250
+ """Callback quando o SLA não é cumprido."""
251
+ message = f":warning: *SLA Miss* no DAG `{dag.dag_id}` — tasks atrasadas: {task_list}"
252
+ # enviar para $ALERTS_CHANNEL
253
+
254
+ with DAG(
255
+ ...
256
+ sla_miss_callback=sla_miss_callback,
257
+ ) as dag:
258
+ task = PythonOperator(
259
+ ...
260
+ sla=timedelta(hours=2),
261
+ )
262
+ ```
263
+
264
+ ---
265
+
266
+ ### Fluxo D — Monitorar Execução
267
+
268
+ #### Verificações rápidas por orquestrador
269
+
270
+ **Airflow CLI:**
271
+ ```bash
272
+ # Ver estado de todas as runs do DAG nas últimas N execuções
273
+ airflow dags state <dag_id> <execution_date>
274
+
275
+ # Ver tasks de uma run específica
276
+ airflow tasks states-for-dag-run <dag_id> <execution_date>
277
+
278
+ # Listar DAGs com falha
279
+ airflow dags list-runs --dag-id <dag_id> --state failed --limit 10
280
+
281
+ # Ver logs de uma task
282
+ airflow tasks logs <dag_id> <task_id> <execution_date>
283
+ ```
284
+
285
+ **Consulta SQL na tabela de auditoria** (se `gold.pipeline_audit` existir):
286
+
287
+ ```sql
288
+ -- Ver status das últimas execuções
289
+ SELECT
290
+ pipeline,
291
+ data_referencia,
292
+ status,
293
+ rows_extracted,
294
+ rows_loaded,
295
+ duration_seconds,
296
+ ingested_at
297
+ FROM gold.pipeline_audit
298
+ WHERE pipeline = '<nome_pipeline>'
299
+ ORDER BY data_referencia DESC, ingested_at DESC
300
+ LIMIT 20;
301
+
302
+ -- Identificar pipelines com falha recorrente
303
+ SELECT
304
+ pipeline,
305
+ COUNT(*) AS total_runs,
306
+ SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) AS failed_runs,
307
+ ROUND(SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 1) AS failure_rate_pct
308
+ FROM gold.pipeline_audit
309
+ WHERE ingested_at >= CURRENT_DATE - INTERVAL '30' DAY
310
+ GROUP BY pipeline
311
+ HAVING failure_rate_pct > 10
312
+ ORDER BY failure_rate_pct DESC;
313
+ ```
314
+
315
+ ---
316
+
317
+ ### Fluxo E — Troubleshooting de DAG
318
+
319
+ #### Árvore de diagnóstico
320
+
321
+ ```
322
+ DAG não aparece na UI
323
+ └─ Verificar: erro de sintaxe no arquivo Python
324
+ └─ airflow dags list 2>&1 | grep <dag_id>
325
+ └─ airflow dags report (Airflow 2+)
326
+
327
+ Task ficou em estado QUEUED
328
+ └─ Worker disponível? → verificar número de workers ativos
329
+ └─ Pool com slots livres? → airflow pools list
330
+
331
+ Task falhou com timeout
332
+ └─ Aumentar execution_timeout na task
333
+ └─ Verificar se fonte externa está lenta
334
+
335
+ Task falhou com erro de credencial
336
+ └─ Verificar Connection no Airflow (Admin → Connections)
337
+ └─ Credencial expirou? → renovar via Secrets Manager
338
+
339
+ Task falhou mas não ativou alerta
340
+ └─ Verificar callback on_failure_callback está configurado
341
+ └─ Verificar Connection do Slack está válida
342
+ ```
343
+
344
+ #### Reprocessamento manual
345
+
346
+ ```bash
347
+ # Limpar e re-executar tasks de uma data específica (Airflow)
348
+ airflow tasks clear <dag_id> \
349
+ --start-date <YYYY-MM-DD> \
350
+ --end-date <YYYY-MM-DD> \
351
+ --yes
352
+
353
+ # Reexecutar o DAG a partir de uma data (backfill)
354
+ airflow dags backfill <dag_id> \
355
+ --start-date <YYYY-MM-DD> \
356
+ --end-date <YYYY-MM-DD>
357
+ ```
358
+
359
+ > ⚠️ Usar `backfill` com `catchup=False` configurado pode não ter o efeito esperado.
360
+ > Verificar a configuração do DAG antes de reprocessar histórico.
361
+
362
+ ---
363
+
364
+ ## Boas Práticas
365
+
366
+ ### Estrutura de repositório
367
+
368
+ ```
369
+ $DATA_REPO/
370
+ dags/
371
+ bronze/ ← DAGs de ingestão bruta
372
+ silver/ ← DAGs de transformação
373
+ gold/ ← DAGs de modelagem e agregação
374
+ jobs/
375
+ bronze/ ← scripts Python chamados pelas tasks
376
+ silver/
377
+ gold/
378
+ plugins/ ← operadores e hooks customizados (se necessário)
379
+ tests/
380
+ dags/ ← testes de integridade dos DAGs
381
+ ```
382
+
383
+ ### Regras de nomenclatura de DAGs
384
+
385
+ ```
386
+ {camada}_{dominio}_{entidade}
387
+
388
+ Exemplos válidos:
389
+ bronze_erp_pedidos
390
+ silver_vendas_clientes
391
+ gold_insights_pedidos_por_cliente
392
+ ```
393
+
394
+ ### Checklist antes de ativar um DAG novo
395
+
396
+ ```
397
+ [ ] DAG testado localmente (airflow dags test <dag_id> <execution_date>)
398
+ [ ] catchup=False configurado (evita backfill automático ao ativar)
399
+ [ ] start_date no passado (nunca usar datetime.now() como start_date)
400
+ [ ] retries e retry_delay configurados
401
+ [ ] on_failure_callback configurado com alerta no $ALERTS_CHANNEL
402
+ [ ] sla configurado para tasks críticas
403
+ [ ] Tags adicionadas (camada + domínio)
404
+ [ ] DAG file commitado em $DATA_REPO
405
+ ```
406
+
407
+ ---
408
+
409
+ ## Regras Críticas
410
+
411
+ ### Nunca faça
412
+
413
+ - ❌ Usar `datetime.now()` como `start_date` — o Airflow precisa de data fixa no passado
414
+ - ❌ Ativar DAG sem `catchup=False` quando não quer backfill
415
+ - ❌ Hardcodar credenciais no DAG — usar Connections ou Secrets Manager
416
+ - ❌ `depends_on_past=True` sem entender o impacto (bloqueia se run anterior falhar)
417
+ - ❌ Silenciar exceções dentro de tasks — o Airflow não marcará como falha
418
+
419
+ ### Sempre faça
420
+
421
+ - ✅ Testar DAG localmente antes de subir para produção
422
+ - ✅ Configurar `on_failure_callback` em todos os DAGs que afetam gold
423
+ - ✅ Usar `{{ ds }}` (data de execução do DAG) em vez de `datetime.now()` dentro das tasks
424
+ - ✅ Nomear tasks de forma descritiva (não `task_1`, `task_2`)
425
+ - ✅ Versionar DAGs no `$DATA_REPO` — nunca editar direto na UI
426
+ - ✅ Documentar dependências entre DAGs no doc do pipeline