nexus-core-v3 3.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 (232) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/agents/README.md +133 -0
  4. package/agents/_protocol.md +107 -0
  5. package/agents/analyst.md +138 -0
  6. package/agents/architect.md +146 -0
  7. package/agents/data-engineer.md +170 -0
  8. package/agents/dev.md +134 -0
  9. package/agents/devops.md +141 -0
  10. package/agents/nexus-master.md +147 -0
  11. package/agents/pm.md +133 -0
  12. package/agents/po.md +138 -0
  13. package/agents/qa.md +192 -0
  14. package/agents/sm.md +122 -0
  15. package/agents/squad-creator.md +121 -0
  16. package/agents/ux-design-expert.md +165 -0
  17. package/artifact-manifest.json +903 -0
  18. package/bin/nexus.mjs +37 -0
  19. package/checklists/README.md +49 -0
  20. package/checklists/architect-checklist.md +47 -0
  21. package/checklists/change-checklist.md +61 -0
  22. package/checklists/db-predeploy-checklist.md +57 -0
  23. package/checklists/design-quality-checklist.md +57 -0
  24. package/checklists/discovery-checklist.md +36 -0
  25. package/checklists/foundation-checklist.md +39 -0
  26. package/checklists/launch-checklist.md +39 -0
  27. package/checklists/pm-checklist.md +48 -0
  28. package/checklists/po-master-checklist.md +64 -0
  29. package/checklists/reality-check-checklist.md +49 -0
  30. package/checklists/story-dod-checklist.md +52 -0
  31. package/checklists/story-draft-checklist.md +36 -0
  32. package/dist/bin/dashboard.html +279 -0
  33. package/dist/bin/nexus.mjs +20008 -0
  34. package/dist/constitution.yaml +76 -0
  35. package/knowledge/README.md +57 -0
  36. package/knowledge/architecture/architectural-styles-map.md +182 -0
  37. package/knowledge/architecture/design-patterns-gof.md +192 -0
  38. package/knowledge/architecture/distributed-patterns-cheatsheet.md +201 -0
  39. package/knowledge/architecture/saas-subscription-blueprint.md +355 -0
  40. package/knowledge/architecture/system-design-tradeoffs.md +231 -0
  41. package/knowledge/architecture/t3-fullstack-typesafe-stack.md +273 -0
  42. package/knowledge/copy/landing-copy-that-converts.md +168 -0
  43. package/knowledge/data/postgres-indexing-and-tuning.md +263 -0
  44. package/knowledge/data/schema-modeling-decisions.md +273 -0
  45. package/knowledge/data/supabase-rls-patterns.md +316 -0
  46. package/knowledge/data/zero-downtime-migrations.md +308 -0
  47. package/knowledge/devops/cicd-pipeline-best-practices.md +318 -0
  48. package/knowledge/devops/production-dockerfile.md +283 -0
  49. package/knowledge/devops/twelve-factor-app.md +398 -0
  50. package/knowledge/engineering/clean-code-principles.md +429 -0
  51. package/knowledge/engineering/effective-code-review.md +204 -0
  52. package/knowledge/engineering/testing-strategy-beyond-unit.md +307 -0
  53. package/knowledge/governance/risk-matrix.md +56 -0
  54. package/knowledge/integration/mcp-server-selection-matrix.md +235 -0
  55. package/knowledge/marketing/copy-que-converte.md +43 -0
  56. package/knowledge/marketing/funil-e-jornada.md +36 -0
  57. package/knowledge/negocios/proposta-vencedora.md +38 -0
  58. package/knowledge/negocios/roi-e-unit-economics.md +46 -0
  59. package/knowledge/pipeline/1-descobrir.md +26 -0
  60. package/knowledge/pipeline/2-estrategizar.md +26 -0
  61. package/knowledge/pipeline/3-estruturar.md +27 -0
  62. package/knowledge/pipeline/4-construir.md +27 -0
  63. package/knowledge/pipeline/5-endurecer.md +28 -0
  64. package/knowledge/pipeline/6-lancar.md +27 -0
  65. package/knowledge/pipeline/7-operar.md +27 -0
  66. package/knowledge/security/lgpd-conformidade-basica.md +35 -0
  67. package/knowledge/security/owasp-secure-coding-gates.md +220 -0
  68. package/knowledge/security/owasp-top10-threat-assessment.md +287 -0
  69. package/knowledge/security/threat-modeling-stride.md +34 -0
  70. package/knowledge/web-craft/a11y-audit-checklist.md +251 -0
  71. package/knowledge/web-craft/accessible-component-patterns.md +383 -0
  72. package/knowledge/web-craft/anti-ai-look.md +114 -0
  73. package/knowledge/web-craft/design-system-from-code.md +195 -0
  74. package/knowledge/web-craft/intrinsic-css-layout.md +420 -0
  75. package/knowledge/web-craft/style-cloning.md +185 -0
  76. package/knowledge/web-craft/visual-polish-review.md +183 -0
  77. package/package.json +55 -0
  78. package/runbooks/campanha-de-conteudo.md +36 -0
  79. package/runbooks/feature-em-projeto-existente.md +37 -0
  80. package/runbooks/mvp-startup.md +38 -0
  81. package/runbooks/resposta-a-incidente.md +37 -0
  82. package/squads/exemplo-conteudo/agents/editor-chefe.md +48 -0
  83. package/squads/exemplo-conteudo/agents/pesquisador.md +44 -0
  84. package/squads/exemplo-conteudo/agents/redator.md +45 -0
  85. package/squads/exemplo-conteudo/knowledge/estilo-editorial.md +21 -0
  86. package/squads/exemplo-conteudo/squad.yaml +19 -0
  87. package/squads/exemplo-conteudo/tasks/pesquisar-fontes.md +26 -0
  88. package/squads/exemplo-conteudo/tasks/planejar-pauta.md +27 -0
  89. package/squads/exemplo-conteudo/tasks/redigir-artigo.md +26 -0
  90. package/squads/exemplo-conteudo/tasks/revisar-artigo.md +27 -0
  91. package/squads/marketing/agents/analista.md +56 -0
  92. package/squads/marketing/agents/chefe-marketing.md +65 -0
  93. package/squads/marketing/agents/conteudo.md +55 -0
  94. package/squads/marketing/agents/copy.md +55 -0
  95. package/squads/marketing/agents/growth.md +56 -0
  96. package/squads/marketing/agents/social.md +55 -0
  97. package/squads/marketing/squad.yaml +17 -0
  98. package/squads/marketing/tasks/aprovar-campanha.md +43 -0
  99. package/squads/negocios/agents/chefe-negocios.md +65 -0
  100. package/squads/negocios/agents/financas-roi.md +55 -0
  101. package/squads/negocios/agents/suporte.md +55 -0
  102. package/squads/negocios/agents/vendas-proposta.md +56 -0
  103. package/squads/negocios/squad.yaml +17 -0
  104. package/squads/negocios/tasks/aprovar-proposta.md +40 -0
  105. package/squads/security/agents/appsec-reviewer.md +59 -0
  106. package/squads/security/agents/chefe-seguranca.md +65 -0
  107. package/squads/security/agents/compliance-auditor.md +60 -0
  108. package/squads/security/agents/threat-modeler.md +60 -0
  109. package/squads/security/squad.yaml +20 -0
  110. package/squads/security/tasks/aprovar-gate-seguranca.md +42 -0
  111. package/squads/security/tasks/emitir-parecer-conformidade.md +42 -0
  112. package/tasks/README.md +72 -0
  113. package/tasks/accessibility-wcag-checklist.md +69 -0
  114. package/tasks/advanced-elicitation.md +42 -0
  115. package/tasks/analyze-performance.md +54 -0
  116. package/tasks/analyze-project-structure.md +59 -0
  117. package/tasks/apply-qa-fixes.md +57 -0
  118. package/tasks/architect-analyze-impact.md +62 -0
  119. package/tasks/archive-squad.md +52 -0
  120. package/tasks/audit-codebase.md +53 -0
  121. package/tasks/build-component.md +61 -0
  122. package/tasks/calculate-roi.md +63 -0
  123. package/tasks/ci-cd-configuration.md +51 -0
  124. package/tasks/collect-visual-evidence.md +62 -0
  125. package/tasks/compose-molecule.md +57 -0
  126. package/tasks/consolidate-patterns.md +54 -0
  127. package/tasks/create-brownfield-prd.md +54 -0
  128. package/tasks/create-competitor-analysis.md +42 -0
  129. package/tasks/create-deep-research-prompt.md +62 -0
  130. package/tasks/create-doc.md +62 -0
  131. package/tasks/create-epic.md +49 -0
  132. package/tasks/create-front-end-spec.md +56 -0
  133. package/tasks/create-migration-plan.md +57 -0
  134. package/tasks/create-next-story.md +66 -0
  135. package/tasks/create-prd.md +53 -0
  136. package/tasks/create-project-brief.md +47 -0
  137. package/tasks/create-rls-policies.md +59 -0
  138. package/tasks/create-schema.md +57 -0
  139. package/tasks/create-service.md +55 -0
  140. package/tasks/create-squad.md +100 -0
  141. package/tasks/create-suite.md +62 -0
  142. package/tasks/db-apply-migration.md +56 -0
  143. package/tasks/db-domain-modeling.md +57 -0
  144. package/tasks/db-dry-run.md +50 -0
  145. package/tasks/db-env-check.md +57 -0
  146. package/tasks/db-load-csv.md +54 -0
  147. package/tasks/db-policy-apply.md +58 -0
  148. package/tasks/db-rollback.md +51 -0
  149. package/tasks/db-run-sql.md +61 -0
  150. package/tasks/db-seed.md +52 -0
  151. package/tasks/db-smoke-test.md +51 -0
  152. package/tasks/db-snapshot.md +48 -0
  153. package/tasks/db-verify-order.md +49 -0
  154. package/tasks/deliberate.md +46 -0
  155. package/tasks/design-indexes.md +59 -0
  156. package/tasks/dev-develop-story.md +61 -0
  157. package/tasks/document-project.md +59 -0
  158. package/tasks/execute-checklist.md +57 -0
  159. package/tasks/execute-epic-plan.md +52 -0
  160. package/tasks/execute-subtask.md +51 -0
  161. package/tasks/extend-pattern.md +63 -0
  162. package/tasks/extend-squad.md +60 -0
  163. package/tasks/extract-patterns.md +64 -0
  164. package/tasks/extract-tokens.md +59 -0
  165. package/tasks/facilitate-brainstorming-session.md +42 -0
  166. package/tasks/generate-ai-frontend-prompt.md +57 -0
  167. package/tasks/generate-documentation.md +60 -0
  168. package/tasks/generate-migration-strategy.md +57 -0
  169. package/tasks/generate-shock-report.md +56 -0
  170. package/tasks/mcp-management.md +66 -0
  171. package/tasks/orchestrate.md +50 -0
  172. package/tasks/perform-market-research.md +42 -0
  173. package/tasks/plan-create-context.md +57 -0
  174. package/tasks/plan-create-implementation.md +58 -0
  175. package/tasks/po-close-story.md +60 -0
  176. package/tasks/po-manage-story-backlog.md +59 -0
  177. package/tasks/po-pull-story.md +60 -0
  178. package/tasks/po-sync-story.md +59 -0
  179. package/tasks/pr-automation.md +50 -0
  180. package/tasks/pre-push-quality-gate.md +54 -0
  181. package/tasks/push.md +53 -0
  182. package/tasks/qa-browser-console-check.md +52 -0
  183. package/tasks/qa-create-fix-request.md +58 -0
  184. package/tasks/qa-evidence-requirements.md +55 -0
  185. package/tasks/qa-false-positive-detection.md +55 -0
  186. package/tasks/qa-fix-issues.md +55 -0
  187. package/tasks/qa-gate.md +53 -0
  188. package/tasks/qa-migration-validation.md +58 -0
  189. package/tasks/qa-nfr-assess.md +45 -0
  190. package/tasks/qa-review-story.md +56 -0
  191. package/tasks/qa-risk-profile.md +45 -0
  192. package/tasks/qa-security-checklist.md +64 -0
  193. package/tasks/qa-test-design.md +47 -0
  194. package/tasks/qa-trace-requirements.md +48 -0
  195. package/tasks/release-management.md +53 -0
  196. package/tasks/repository-cleanup.md +61 -0
  197. package/tasks/route.md +44 -0
  198. package/tasks/run-tests.md +50 -0
  199. package/tasks/security-audit.md +54 -0
  200. package/tasks/setup-database.md +60 -0
  201. package/tasks/setup-design-system.md +60 -0
  202. package/tasks/shard-doc.md +60 -0
  203. package/tasks/spec-assess-complexity.md +55 -0
  204. package/tasks/spec-critique.md +64 -0
  205. package/tasks/spec-gather-requirements.md +48 -0
  206. package/tasks/spec-research-dependencies.md +42 -0
  207. package/tasks/spec-write-spec.md +50 -0
  208. package/tasks/test-as-user.md +52 -0
  209. package/tasks/ux-create-wireframe.md +54 -0
  210. package/tasks/ux-user-research.md +55 -0
  211. package/tasks/validate-next-story.md +61 -0
  212. package/tasks/validate-squad.md +55 -0
  213. package/tasks/verify-subtask.md +52 -0
  214. package/tasks/version-management.md +45 -0
  215. package/templates/README.md +47 -0
  216. package/templates/architecture-tmpl.md +115 -0
  217. package/templates/competitor-analysis-tmpl.md +87 -0
  218. package/templates/epic-tmpl.md +83 -0
  219. package/templates/front-end-spec-tmpl.md +110 -0
  220. package/templates/market-research-tmpl.md +98 -0
  221. package/templates/migration-plan-tmpl.md +92 -0
  222. package/templates/prd-tmpl.md +95 -0
  223. package/templates/project-brief-tmpl.md +100 -0
  224. package/templates/qa-verdict-tmpl.md +73 -0
  225. package/templates/rls-policies-tmpl.md +93 -0
  226. package/templates/schema-design-tmpl.md +107 -0
  227. package/templates/spec-tmpl.md +88 -0
  228. package/templates/squad/agent-dna-tmpl.md +72 -0
  229. package/templates/squad/chief-dna-tmpl.md +98 -0
  230. package/templates/squad/squad-task-tmpl.md +50 -0
  231. package/templates/squad/squad-yaml-tmpl.md +47 -0
  232. package/templates/story-tmpl.md +63 -0
@@ -0,0 +1,231 @@
1
+ ---
2
+ id: system-design-tradeoffs
3
+ domain: architecture
4
+ agents: [architect]
5
+ when: "ao desenhar a arquitetura de um sistema e precisar pesar trade-offs de escala, latência e consistência"
6
+ ---
7
+
8
+ # System Design Trade-offs — pesando escala, latência e consistência
9
+
10
+ ## O problema
11
+
12
+ Arquitetura medíocre escolhe componentes por reflexo: "vamos usar cache", "vamos shardar o banco",
13
+ "coloca um load balancer". Sem nomear o trade-off, sem estimar a ordem de grandeza, sem dizer **por
14
+ que esse e não o default**. O resultado é um diagrama bonito que desmorona na primeira pergunta de
15
+ "e quando dobrar a carga?".
16
+
17
+ O tell do desenho genérico:
18
+
19
+ - Decisão de consistência implícita ("o banco resolve") — quando *forte vs eventual* muda toda a UX.
20
+ - Cache jogado em cima sem definir a **estratégia de escrita** nem a **invalidação** (a parte difícil).
21
+ - "Vamos escalar horizontalmente" sem back-of-the-envelope: nenhum número de RPS, storage, banda.
22
+ - Replicação master-slave assumida sem citar o custo (lag de replicação, promoção manual de slave).
23
+ - L4 vs L7 no load balancer tratados como detalhe, quando definem o que você consegue rotear.
24
+
25
+ A régua deste pack: **toda escolha de componente carrega um trade-off nomeado e uma estimativa de
26
+ ordem de grandeza.** Se você não consegue dizer o que perdeu ao ganhar, não escolheu — chutou.
27
+ Fonte canônica das tabelas abaixo: *System Design Primer* (donnemartin).
28
+
29
+ ## Os princípios / o conhecimento
30
+
31
+ ### 1. Números de latência que ancoram qualquer estimativa
32
+
33
+ Decoreba útil: as ordens de grandeza relativas. Memória é ~100 ns, datacenter round-trip é ~500 us
34
+ (5000x), disco HDD seek é ~10 ms (20x o datacenter), e ir da Califórnia à Holanda e voltar é ~150 ms.
35
+
36
+ | Operação | Latência | Relativo |
37
+ |---|---|---|
38
+ | L1 cache reference | 0.5 ns | — |
39
+ | Branch mispredict | 5 ns | 10x L1 |
40
+ | L2 cache reference | 7 ns | 14x L1 |
41
+ | Mutex lock/unlock | 25 ns | — |
42
+ | Main memory reference (RAM) | 100 ns | 20x L2, 200x L1 |
43
+ | Compress 1 KB com Zippy/Snappy | 10.000 ns (10 us) | — |
44
+ | Send 1 KB sobre rede 1 Gbps | 10.000 ns (10 us) | — |
45
+ | Read 4 KB random de SSD | 150.000 ns (150 us) | ~1 GB/s |
46
+ | Read 1 MB sequencial da memória | 250.000 ns (250 us) | — |
47
+ | Round trip dentro do mesmo datacenter | 500.000 ns (500 us) | — |
48
+ | Read 1 MB sequencial de SSD | 1.000.000 ns (1 ms) | ~1 GB/s, 4x memória |
49
+ | HDD seek | 10.000.000 ns (10 ms) | 20x datacenter |
50
+ | Read 1 MB sequencial sobre rede 1 Gbps | 10.000.000 ns (10 ms) | 40x memória |
51
+ | Read 1 MB sequencial de HDD | 30.000.000 ns (30 ms) | 120x memória, 3x SSD |
52
+ | Round trip CA → Holanda → CA | 150.000.000 ns (150 ms) | — |
53
+
54
+ **Métricas de mão (throughput sequencial):**
55
+
56
+ | Mídia | Leitura sequencial |
57
+ |---|---|
58
+ | HDD | ~30 MB/s |
59
+ | Ethernet 1 Gbps | ~100 MB/s |
60
+ | SSD | ~1 GB/s |
61
+ | Memória principal | ~4 GB/s |
62
+
63
+ Conclusões operacionais: SSD é ~4x a banda do disco e ~6x a banda da rede 1 Gbps; round trips
64
+ mundiais cabem ~6–7 por segundo, contra ~2.000 round trips/s dentro do datacenter. **Evite o disco
65
+ quando puder; mantenha dados quentes na memória; minimize round trips cross-region.**
66
+
67
+ ### 2. Estimativa back-of-the-envelope (potências de 2 e RPS)
68
+
69
+ | Potência | Valor exato | Aprox. | Bytes |
70
+ |---|---|---|---|
71
+ | 2^10 | 1.024 | mil | 1 KB |
72
+ | 2^20 | 1.048.576 | milhão | 1 MB |
73
+ | 2^30 | 1.073.741.824 | bilhão | 1 GB |
74
+ | 2^40 | 1.099.511.627.776 | trilhão | 1 TB |
75
+
76
+ **Regra de RPS:** divida as requisições por dia por **86.400 segundos**. Ex.: 2,5 milhões de
77
+ requisições/dia ÷ 86.400 ≈ **~29 req/s**. Sempre traduza "X por dia" em "Y por segundo" antes de
78
+ dimensionar load balancer, fila ou banco.
79
+
80
+ ### 3. Modelos de consistência (a escolha que muda a UX)
81
+
82
+ | Modelo | Garantia após write | Replicação | Use quando | Exemplos reais |
83
+ |---|---|---|---|---|
84
+ | **Fraca (weak)** | reads podem ou não ver o write; best-effort | — | latência > exatidão; perda tolerável | memcached; VoIP, vídeo-chat, jogos multiplayer em tempo real |
85
+ | **Eventual** | reads *eventualmente* veem (tipicamente ms); async | assíncrona | alta disponibilidade vale mais que ler-na-hora | DNS, e-mail |
86
+ | **Forte (strong)** | reads sempre veem o write | síncrona | transações, dinheiro, integridade | sistemas de arquivo, RDBMS |
87
+
88
+ Trade-off central: **consistência forte custa latência e disponibilidade** (write síncrono, espera
89
+ confirmação). Eventual ganha disponibilidade e throughput, mas exige UX que tolere janela de
90
+ desatualização. *Read-after-write* (ler o próprio write) é a expectativa que mais quebra com
91
+ eventual — trate explicitamente quando a tela mostra o que o usuário acabou de gravar.
92
+
93
+ ### 4. Disponibilidade em números (os "noves") e como compõem
94
+
95
+ | Disponibilidade | Downtime/ano | Downtime/dia |
96
+ |---|---|---|
97
+ | 99,9% (três 9s) | 8h 45min 57s | 1min 26,4s |
98
+ | 99,99% (quatro 9s) | 52min 35,7s | 8,6s |
99
+
100
+ **Composição** — dois componentes mudam o número total conforme a topologia:
101
+
102
+ | Topologia | Fórmula | Efeito |
103
+ |---|---|---|
104
+ | Em **sequência** | `A_total = A_foo * A_bar` | **derruba** (90% * 90% = 81%) |
105
+ | Em **paralelo** | `A_total = 1 - (1 - A_foo) * (1 - A_bar)` | **eleva** (90% ∥ 90% = 99%) |
106
+
107
+ Lição: caminho crítico com muitos componentes em série degrada a disponibilidade; redundância em
108
+ paralelo a recupera. Conte os componentes em série antes de prometer SLA.
109
+
110
+ ### 5. Padrões de disponibilidade: fail-over e replicação
111
+
112
+ | Padrão | Como funciona | Custo / risco |
113
+ |---|---|---|
114
+ | **Active-passive** | heartbeat entre ativo e standby; se o heartbeat cai, o passivo assume o IP | capacidade ociosa; janela até o standby assumir |
115
+ | **Active-active** | ambos servem tráfego, dividindo carga | exige lidar com estado/sessão em ambos |
116
+ | **Master-slave** | master serve read+write, replica para slaves (read) | promover slave a master exige lógica extra; risco de perda se o master cai antes de replicar |
117
+ | **Master-master** | ambos servem read+write | precisa de LB ou lógica na app; quase sempre *loosely consistent* (viola ACID) ou aumenta latência de write; conflitos de escrita |
118
+
119
+ Custo geral de replicação: **writes são replayados nas réplicas de leitura**. Muitos writes
120
+ afogam as réplicas; quanto mais read slaves, maior o **replication lag**.
121
+
122
+ ### 6. Escalar o banco: federation, sharding, denormalização, SQL tuning
123
+
124
+ | Técnica | O que faz | Ganho | Custo |
125
+ |---|---|---|---|
126
+ | **Federation** | divide o banco por **função** (ex.: users / products / forums) | menos replication lag, menos tráfego por banco, mais cache locality | inútil se o schema exige funções/tabelas enormes que cruzam domínios; joins cross-DB na app |
127
+ | **Sharding** | distribui dados entre bancos por chave (ex.: por usuário) | menos read/write por shard, menos replicação, mais cache hits | distribuição pode ficar desbalanceada (hot shard); rebalancear adiciona complexidade; joins cross-shard difíceis |
128
+ | **Denormalização** | duplica dados para evitar joins caros | melhora **leitura** | piora a **escrita**; sob carga pesada de write pode ficar pior que normalizado; manter cópias em sincronia |
129
+ | **SQL tuning** | índices nas colunas consultadas; `CHAR` p/ tamanho fixo, `VARCHAR` p/ variável; particionar tabelas | leitura rápida sem trocar de paradigma | índice custa escrita e storage; é o primeiro passo, não o último |
130
+
131
+ Ordem de ataque recomendada: **otimize o que tem (SQL tuning) → federation → sharding → denormalização**.
132
+ Não pule direto pro sharding: ele é o mais caro de operar.
133
+
134
+ ### 7. Cache: onde cachear e a estratégia de escrita
135
+
136
+ **Camadas de cache** (do cliente ao banco): client caching (browser/SO) · CDN · web server (reverse
137
+ proxy) · database caching · application caching (Memcached/Redis em memória).
138
+
139
+ A parte difícil não é cachear — é **escrever e invalidar**. As quatro estratégias:
140
+
141
+ | Estratégia | Como funciona | Vantagem | Custo / risco |
142
+ |---|---|---|---|
143
+ | **Cache-aside** (lazy loading) | app lê cache; no miss, lê o banco e popula o cache | só cacheia o que é pedido; resiliente a falha do cache | cada miss = **3 trips** (cache → banco → cache), latência no miss; dados podem ficar stale após write no banco |
144
+ | **Write-through** | app escreve no cache, que escreve **síncrono** no banco | leitura sempre consistente com o write | latência de write maior; nó novo não tem entradas até serem atualizadas (cache frio) |
145
+ | **Write-behind** (write-back) | app escreve no cache; cache escreve no banco **async** | write rápido, absorve picos | **perda de dados** se o cache cai antes de persistir; complexidade |
146
+ | **Refresh-ahead** | cache recarrega proativamente entradas quentes antes de expirar | esconde latência em dados previsíveis | previsão errada = recarga desperdiçada, pior que não fazer |
147
+
148
+ Regra: **cache-aside** é o default seguro para a maioria; **write-through** quando read-after-write
149
+ importa; **write-behind** quando o write é o gargalo e você tolera perda; **refresh-ahead** só com
150
+ padrão de acesso previsível.
151
+
152
+ ### 8. CDN: push vs pull
153
+
154
+ | Tipo | Como funciona | Bom para | Custo |
155
+ |---|---|---|---|
156
+ | **Pull CDN** | busca o conteúdo da sua origem no **primeiro request** do usuário, depois cacheia | sites de **tráfego alto** (cache se mantém quente) | primeiro request é mais lento; conteúdo pode ficar stale antes do TTL |
157
+ | **Push CDN** | **você** sobe o conteúdo direto pro CDN e gerencia o que existe lá | sites de **tráfego baixo** ou conteúdo que muda raramente | você assume a responsabilidade de subir/expirar; storage de conteúdo pouco acessado |
158
+
159
+ ### 9. Load balancer e reverse proxy
160
+
161
+ **L4 vs L7:**
162
+
163
+ | Camada | Inspeciona | Custo | Quando |
164
+ |---|---|---|---|
165
+ | **Layer 4** (transporte) | IP origem/destino e portas | menos tempo e recursos | roteamento simples, throughput máximo, sem precisar olhar o conteúdo |
166
+ | **Layer 7** (aplicação) | headers, mensagem, cookies | mais caro que L4 | roteamento por conteúdo (ex.: `/video` → cluster de vídeo, `/api` → cluster de API) |
167
+
168
+ **Benefícios do load balancer:** SSL termination (descarrega cripto dos backends) · session
169
+ persistence via cookie (mesma instância) · evita mandar request para servidor não-saudável · remove
170
+ ponto único de falha (em par active-active/active-passive) · evita sobrecarga de recursos.
171
+
172
+ **Reverse proxy vs load balancer:** o LB roteia para um **conjunto de servidores com a mesma função**;
173
+ o reverse proxy **centraliza serviços internos atrás de uma interface pública unificada** e faz sentido
174
+ **mesmo com um único web server**. Ambos oferecem SSL termination, compressão, cache e serviço de
175
+ estático. Use LB quando o motivo é distribuir carga; reverse proxy quando é unificar/proteger.
176
+
177
+ ### 10. Assincronismo: tirar trabalho do caminho crítico
178
+
179
+ | Componente | Faz | Quando |
180
+ |---|---|---|
181
+ | **Message queue** | recebe, segura e entrega mensagens; app publica job, worker processa async | desacoplar produtor de consumidor; absorver pico |
182
+ | **Task queue** | recebe tarefas, executa e entrega resultado; suporta agendamento | trabalho pesado/agendado fora do request |
183
+ | **Back pressure** | limita o tamanho da fila; retorna **HTTP 503** quando cheia | proteger memória e dar feedback de degradação ao cliente |
184
+
185
+ Princípio: se a operação não precisa do resultado **na resposta**, tire-a do caminho síncrono. Fila
186
+ custa complexidade operacional e consistência eventual — só vale quando o pico/latência justifica.
187
+
188
+ ## Checklist — o método (requisitos → estimativa → desenho → deep dive → gargalos)
189
+
190
+ Antes de fechar um desenho, percorra as quatro etapas. Pular a 1 ou a 2 é o erro mais comum.
191
+
192
+ - [ ] **1. Requisitos e escopo.** Levantei os casos de uso e as restrições? Perguntei quem usa, qual
193
+ volume, o que é leitura vs escrita, qual a tolerância a inconsistência?
194
+ - [ ] **2. Estimativa back-of-the-envelope.** Traduzi requisições/dia em **req/s** (÷ 86.400)? Estimei
195
+ storage (potências de 2), banda e QPS de leitura vs escrita? Os números cabem nas ordens de
196
+ grandeza de latência (memória vs disco vs rede)?
197
+ - [ ] **3. Desenho high-level.** Esbocei os componentes principais e as conexões, e **justifiquei**
198
+ cada um? Defini o modelo de consistência de cada caminho (forte vs eventual)?
199
+ - [ ] **4. Deep dive nos componentes core.** Para cada parte crítica detalhei: estratégia de cache
200
+ (aside/through/behind/refresh-ahead) **e** invalidação? Estratégia de banco (tuning → federation
201
+ → sharding → denorm)? Replicação (master-slave vs master-master) com o custo nomeado?
202
+ - [ ] **5. Gargalos.** Identifiquei e tratei o gargalo dado as restrições? Preciso de LB (L4 ou L7),
203
+ escala horizontal, cache, sharding? Calculei a disponibilidade composta (série derruba, paralelo
204
+ eleva)?
205
+ - [ ] Cada componente carrega um **trade-off nomeado** — eu sei o que perdi ao ganhar?
206
+
207
+ ## Tabela de decisão "use X quando Y"
208
+
209
+ | Use X | Quando Y |
210
+ |---|---|
211
+ | **Consistência forte** | dinheiro, transações, read-after-write obrigatório; tolera latência de write síncrono |
212
+ | **Consistência eventual** | alta disponibilidade e throughput valem mais que ler-na-hora; UX tolera janela de ms |
213
+ | **Consistência fraca** | tempo real (voz/vídeo/jogo); perder um update é melhor que esperar |
214
+ | **Master-slave** | leitura domina; escrita centralizada num nó é aceitável; tolera promoção manual no fail |
215
+ | **Master-master** | precisa de write em mais de um nó/região; aceita loose consistency ou conflito a resolver |
216
+ | **Federation** | o banco divide por função natural (users/products/...); funções não cruzam domínios |
217
+ | **Sharding** | uma tabela/dataset não cabe nem escala num nó; existe chave de partição balanceável |
218
+ | **Denormalização** | leitura é o gargalo e os joins são caros; carga de write é moderada |
219
+ | **SQL tuning primeiro** | sempre — antes de federar/shardar; é o passo mais barato |
220
+ | **Cache-aside** | default; tolera staleness pós-write e o custo do miss (3 trips) |
221
+ | **Write-through** | leitura precisa refletir o write na hora; aceita write mais lento |
222
+ | **Write-behind** | write é o gargalo, picos altos; tolera risco de perda se o cache cair |
223
+ | **Refresh-ahead** | padrão de acesso previsível em dados quentes; vale o custo de recarga proativa |
224
+ | **Pull CDN** | tráfego alto; conteúdo dinâmico/atualizado; quer simplicidade de operação |
225
+ | **Push CDN** | tráfego baixo ou conteúdo raramente atualizado; quer controle do que está no edge |
226
+ | **Load balancer L4** | roteamento simples, throughput máximo, sem decisão por conteúdo |
227
+ | **Load balancer L7** | roteamento por path/header/cookie; precisa inspecionar a aplicação |
228
+ | **Reverse proxy** | unificar/proteger serviços internos; faz sentido mesmo com 1 web server |
229
+ | **Active-passive** | redundância onde standby ocioso é aceitável; fail-over com janela tolerável |
230
+ | **Active-active** | precisa usar toda a capacidade; resolveu estado/sessão compartilhado |
231
+ | **Message/Task queue + back pressure** | trabalho fora do caminho síncrono; absorver pico; degradar com 503 em vez de cair |
@@ -0,0 +1,273 @@
1
+ ---
2
+ id: t3-fullstack-typesafe-stack
3
+ domain: architecture
4
+ agents: [architect]
5
+ when: "ao montar um app full-stack type-safe do zero (especialmente para quem não é programador experiente)"
6
+ ---
7
+
8
+ # T3 Stack — full-stack type-safe do tipo na ponta, sem escrever tipo
9
+
10
+ A T3 stack (`create-t3-app`) é o scaffolder que entrega o tipo fluindo do banco até o
11
+ `onClick` do botão **sem você declarar nenhuma interface compartilhada**. Você muda a coluna
12
+ de uma tabela; o front-end quebra no `tsc` na hora, no campo certo. Esse é o produto: não é um
13
+ "template bonito", é uma **arquitetura de boundaries tipados** que deixa um não-programador
14
+ montar algo sólido porque o compilador vira o revisor.
15
+
16
+ ## O problema
17
+
18
+ Quem está montando um app full-stack do zero cai em três armadilhas que a T3 resolve por
19
+ construção:
20
+
21
+ 1. **O contrato API duplicado e dessincronizado.** O back-end retorna `{ userId }`, o front
22
+ espera `{ user_id }`, e ninguém percebe até dar `undefined` em produção. A solução ingênua
23
+ (escrever tipos à mão em dois lugares, ou um OpenAPI/GraphQL gigante) é trabalho que
24
+ apodrece. A T3 elimina o contrato escrito: o tipo da API **é inferido** do código do
25
+ servidor.
26
+ 2. **O env var que falta só aparece em produção.** `process.env.STRIPE_KEY` é `string |
27
+ undefined` em todo lugar, e o deploy sobe sem a chave. A T3 valida env no build e te dá
28
+ tipos.
29
+ 3. **A escolha de stack que trava você.** "Uso Prisma ou Drizzle? Pages ou App Router? Que
30
+ banco?" Sem critério, você escolhe por hype. A T3 expõe **uma flag por decisão**, com
31
+ default seguro, e te força a entender o trade-off de cada peça em vez de copiar um boilerplate
32
+ opaco.
33
+
34
+ A filosofia oficial é dura e vale citar porque ela explica *por que* a stack é montada assim:
35
+ **"Typesafety isn't optional. Any decision that compromises the typesafe nature of Create T3
36
+ App is a decision that should be made in a different project."** A consequência prática: a T3
37
+ **não** vem com gerenciador de estado, biblioteca de componentes, ou solução de deploy. **"We
38
+ expect you to bring your own libraries that solve the needs of YOUR application."** Cada peça
39
+ que está lá resolve um problema específico das tecnologias-core — nada de bloat.
40
+
41
+ ## O conhecimento
42
+
43
+ ### As peças e o que CADA uma resolve
44
+
45
+ | Peça | Resolve | Por que está na T3 (e não outra) |
46
+ |---|---|---|
47
+ | **Next.js (App Router)** | Roteamento + Server/Client Components + bundling | Base; Server Components deixam chamar a API no servidor sem round-trip HTTP |
48
+ | **TypeScript** | A linguagem do contrato | É o eixo: tudo existe pra preservar a inferência ponta a ponta |
49
+ | **tRPC** | API type-safe sem schema escrito | Tipo flui por inferência (`typeof appRouter`), sem codegen, sem OpenAPI. Switching cost baixo = "bleed responsibly" |
50
+ | **Zod** | Validação no boundary (input da API + env) | Schema único que **é** runtime-validator **e** fonte do tipo TS |
51
+ | **Prisma** *ou* **Drizzle** | ORM type-safe (escolha uma) | Prisma = DX mais alta, schema próprio. Drizzle = mais perto do SQL, sem engine binário |
52
+ | **NextAuth.js** | Auth (sessão, OAuth, adapter de banco) | "When you need flexible, secure, scalable auth" — integra no banco que você já tem |
53
+ | **Tailwind CSS** | Estilo utility-first | Opt-in; não impõe design system |
54
+ | **@t3-oss/env-nextjs** | Env vars validadas com Zod no build | Build não passa sem as env vars necessárias |
55
+
56
+ > Filosofia "**Bleed responsibly**": tecnologia mais nova só entra onde o custo de troca é
57
+ > baixo (tRPC, sim; banco experimental, não).
58
+
59
+ ### As flags do `create-t3-app` — uma decisão por flag
60
+
61
+ Modo interativo (recomendado pra aprender): `npm create t3-app@latest`. Cada prompt é uma
62
+ decisão arquitetural explícita. Para automação existe o modo CI.
63
+
64
+ **Flags gerais (sempre valem):**
65
+
66
+ | Flag | O que faz |
67
+ |---|---|
68
+ | `[dir]` | Nome/diretório do projeto |
69
+ | `-y`, `--default` | Bootstrap com **todas** as opções selecionadas, pula os prompts |
70
+ | `--noGit` | Não inicializa repositório git |
71
+ | `--noInstall` | Gera o projeto **sem** rodar o install de dependências |
72
+
73
+ **Flags experimentais de CI (só funcionam junto com `--CI`):**
74
+
75
+ | Flag | O que ativa |
76
+ |---|---|
77
+ | `--CI` | Liga o modo não-interativo; **sem ela, as flags abaixo não têm efeito** |
78
+ | `--trpc` | Inclui tRPC (API type-safe) |
79
+ | `--prisma` | Inclui Prisma como ORM |
80
+ | `--drizzle` | Inclui Drizzle como ORM (alternativa ao Prisma — escolha **uma**) |
81
+ | `--nextAuth` | Inclui NextAuth.js |
82
+ | `--tailwind` | Inclui Tailwind CSS |
83
+ | `--appRouter` | Usa o App Router do Next.js (em vez do Pages Router) |
84
+ | `--dbProvider [provider]` | Configura o banco. Valores: `mysql`, `postgres`, `planetscale`, `sqlite`. **Default: `sqlite`** |
85
+
86
+ Exemplos reais da doc:
87
+ ```bash
88
+ pnpm dlx create-t3-app@latest --CI --trpc --tailwind
89
+ pnpm dlx create-t3-app@latest --CI --nextAuth --tailwind --drizzle --dbProvider postgres
90
+ ```
91
+
92
+ > Regra: você **não** precisa opt-out do que não quer — basta não passar a flag. Se quiser ser
93
+ > explícito, passe `false` (ex.: `--nextAuth false`).
94
+
95
+ ### A organização de pastas (App Router) — `src/server` é a parede
96
+
97
+ O eixo da arquitetura é **uma fronteira física entre o que roda no servidor e o que vai pro
98
+ browser**. Isso não é estético: é o que garante que código de servidor (e segredos) nunca
99
+ vaze pro bundle do cliente.
100
+
101
+ ```
102
+ prisma/ (ou drizzle.config.ts)
103
+ schema.prisma # conexão + schema do banco, migrations, seed
104
+ public/
105
+ favicon.ico # assets estáticos
106
+ src/
107
+ env.js # validação e tipos das env vars (Zod)
108
+ app/ # TODAS as rotas do Next (page.tsx, layout.tsx com providers)
109
+ _components/ # componentes da app
110
+ server/ # código que SÓ roda no servidor (a "parede")
111
+ api/
112
+ trpc.ts # config principal do back-end tRPC (context + helpers de procedure)
113
+ root.ts # faz merge dos routers e exporta o router + o TIPO dele
114
+ routers/ # sub-routers (post.ts, user.ts, ...)
115
+ auth/ # config do NextAuth (config.ts)
116
+ db/ # cliente Drizzle/Prisma (index.ts) + schema (schema.ts)
117
+ trpc/ # ponte pra CHAMAR tRPC do cliente e dos server components
118
+ server.ts # entrypoint pra usar tRPC em Server Components
119
+ react.tsx # entrypoint front-end do tRPC (tipos de input/output do router)
120
+ query-client.ts # cria o Query Client (cache + dedupe nos client components)
121
+ styles/
122
+ postcss.config.js # Tailwind via PostCSS
123
+ ```
124
+
125
+ Regra de ouro: **nada em `src/app` importa de `src/server`**. O cliente importa só o **tipo**
126
+ `AppRouter` — nunca a implementação. É isso que mantém o type-safety sem mandar o servidor pro
127
+ browser.
128
+
129
+ ### tRPC — o tipo flui por inferência, não por contrato escrito
130
+
131
+ **1. Um sub-router define procedures. Input validado com Zod:**
132
+ ```typescript
133
+ const userRouter = createTRPCRouter({
134
+ getById: publicProcedure.input(z.string()).query(({ ctx, input }) => {
135
+ return ctx.prisma.user.findFirst({
136
+ where: { id: input },
137
+ });
138
+ }),
139
+ });
140
+ ```
141
+
142
+ **2. `root.ts` junta os sub-routers e exporta SÓ o tipo:**
143
+ ```typescript
144
+ const appRouter = createTRPCRouter({
145
+ users: userRouter,
146
+ posts: postRouter,
147
+ messages: messageRouter,
148
+ });
149
+
150
+ export type AppRouter = typeof appRouter; // <- isto, e só isto, vai pro cliente
151
+ ```
152
+
153
+ **3. O cliente chama com type-safety total (input e output inferidos):**
154
+ ```typescript
155
+ const userQuery = api.users.getById.useQuery(query.id);
156
+ ```
157
+ Erre o nome do campo, ou mude o retorno no servidor, e o `tsc` acusa **aqui**. Sem codegen,
158
+ sem step de build, sem schema duplicado.
159
+
160
+ **O context (`trpc.ts`) tem duas camadas:**
161
+ - `createInnerTRPCContext` — o que **não** depende da request (ex.: conexão de banco). Útil pra
162
+ testes.
163
+ - `createTRPCContext` — o que **depende** da request (ex.: a sessão do usuário).
164
+
165
+ ### `publicProcedure` vs `protectedProcedure` — auth é um middleware
166
+
167
+ `protectedProcedure` é só um `publicProcedure` com um middleware que checa a sessão (que veio
168
+ do context). Se não há usuário, dispara `UNAUTHORIZED` **antes** do seu resolver rodar:
169
+ ```typescript
170
+ export const protectedProcedure = t.procedure.use(({ ctx, next }) => {
171
+ if (!ctx.session?.user) {
172
+ throw new TRPCError({ code: "UNAUTHORIZED" });
173
+ }
174
+ return next({ /* ctx com session garantida não-nula */ });
175
+ });
176
+ ```
177
+ Dentro de uma `protectedProcedure`, `ctx.session.user` é tipado como existente. Você não
178
+ escreve `if (!user) return 401` em cada handler — a parede já é o tipo.
179
+
180
+ ### NextAuth — sessão no servidor e no cliente
181
+
182
+ | Onde | Como pega a sessão |
183
+ |---|---|
184
+ | Server Component (App Router) | `const session = await auth();` (de `~/server/auth`) |
185
+ | Client Component | `const { data: session } = useSession();` (de `next-auth/react`, precisa `SessionProvider` no topo) |
186
+ | Dentro de uma procedure tRPC | `ctx.session` (injetada via `createTRPCContext`) |
187
+
188
+ - **Adapter de banco:** ao escolher Prisma **+** NextAuth (ou Drizzle + NextAuth), você ganha um
189
+ sistema de auth funcional com **todos os models pré-configurados** (User/Account/Session).
190
+ - **Provider padrão:** Discord OAuth. Você só preenche `DISCORD_CLIENT_ID` /
191
+ `DISCORD_CLIENT_SECRET` no `.env` e registra o callback `<app url>/api/auth/callback/discord`.
192
+ - **Adicionar campo na sessão** (ex.: `role`): use module augmentation em
193
+ `server/auth/config.ts` e inclua o campo no callback de sessão:
194
+ ```typescript
195
+ declare module "next-auth" {
196
+ interface Session extends DefaultSession {
197
+ user: { id: string } & DefaultSession["user"];
198
+ }
199
+ }
200
+ ```
201
+ Se adicionar coluna nova no model do adapter, **dê um default** (ex.: `role Role
202
+ @default(USER)`) — o adapter não conhece o campo extra.
203
+
204
+ ### Env vars — o Zod também guarda a fronteira do ambiente
205
+
206
+ `src/env.js` define server, client e o mapeamento `runtimeEnv`:
207
+ ```javascript
208
+ export const env = createEnv({
209
+ server: {
210
+ NODE_ENV: z.enum(["development", "test", "production"]),
211
+ },
212
+ client: {
213
+ // NEXT_PUBLIC_CLIENTVAR: z.string(),
214
+ },
215
+ runtimeEnv: {
216
+ NODE_ENV: process.env.NODE_ENV,
217
+ },
218
+ });
219
+ ```
220
+ Regras:
221
+ - Variável de servidor vai em `server`; variável que o browser pode ver **precisa** do prefixo
222
+ `NEXT_PUBLIC_` e vai em `client`.
223
+ - Acessar variável de servidor no cliente dispara erro de runtime — a fronteira é tipada.
224
+ - **O build não completa** sem as env vars validadas (validação no build *e* runtime).
225
+ - Para cada nova var: (1) põe no `.env`, (2) define o validador Zod, (3) destrutura em
226
+ `runtimeEnv` como `KEY: process.env.KEY`. "By destructuring it manually, you ensure that the
227
+ variable will never be stripped out from the bundle."
228
+ - Conversão de tipo: `z.coerce.number()`, `z.coerce.boolean()` (env é sempre string crua).
229
+
230
+ ## Checklist
231
+
232
+ Antes de considerar o scaffold "pronto pra construir em cima":
233
+
234
+ - [ ] Sei justificar **cada flag** que liguei (não rodei `--default` no automático sem
235
+ entender)?
236
+ - [ ] O cliente importa **só o tipo** `AppRouter` — nenhum import de `src/server` em `src/app`?
237
+ - [ ] Todo input de procedure tem `.input(z.…)` — nenhum `query`/`mutation` recebe dado cru não
238
+ validado?
239
+ - [ ] Rotas que exigem login usam `protectedProcedure`, não `publicProcedure` + check manual?
240
+ - [ ] Toda env var que uso está declarada nos três lugares (`.env`, schema Zod, `runtimeEnv`)?
241
+ - [ ] Variável sensível **não** está com prefixo `NEXT_PUBLIC_` (senão vaza pro bundle)?
242
+ - [ ] Escolhi **um** ORM (Prisma OU Drizzle), não os dois?
243
+ - [ ] O `dbProvider` está coerente com o banco real do deploy (não ficou em `sqlite` default por
244
+ esquecimento)?
245
+ - [ ] Defini default para qualquer coluna nova que adicionei nos models do adapter NextAuth?
246
+
247
+ ## Tabela de decisão
248
+
249
+ | Sua necessidade | A peça / flag | Observação |
250
+ |---|---|---|
251
+ | API type-safe sem escrever contrato | `--trpc` | O retorno do servidor vira o tipo do cliente por inferência |
252
+ | Validar input da API e env vars | Zod (vem junto) | Mesmo schema = validação runtime + tipo TS |
253
+ | ORM com DX máxima, schema declarativo | `--prisma` | Engine própria; ótimo pra quem está aprendendo |
254
+ | ORM perto do SQL, sem binário, edge-friendly | `--drizzle` | Mais controle; `drizzle.config.ts` + `db/schema.ts` |
255
+ | Banco de dev rápido, zero setup | `--dbProvider sqlite` | Default; troque para `postgres`/`mysql` no deploy |
256
+ | Postgres / MySQL / PlanetScale em prod | `--dbProvider postgres\|mysql\|planetscale` | Defina **antes** de gerar migrations |
257
+ | Login, OAuth, sessão | `--nextAuth` | Combine com `--prisma`/`--drizzle` → models de auth prontos |
258
+ | Proteger uma rota de API | `protectedProcedure` | Middleware de sessão, não check manual por handler |
259
+ | Buscar dados no servidor sem HTTP | `src/trpc/server.ts` em Server Component | Chama a procedure direto, sem round-trip |
260
+ | Buscar/mutar dados no cliente com cache | `api.x.y.useQuery/useMutation` (`trpc/react.tsx`) | Cache + dedupe via `query-client.ts` |
261
+ | Estilo utility-first | `--tailwind` | Opt-in; sem design system imposto |
262
+ | Gerenciador de estado / UI lib / deploy | **nenhuma flag** | Filosofia: "bring your own" — adicione você |
263
+ | Automatizar a geração (CI/script) | `--CI` + flags | Sem `--CI`, as flags de pacote são ignoradas |
264
+
265
+ ---
266
+
267
+ **Fontes (verificadas na doc oficial):** create.t3.gg —
268
+ [Introduction](https://create.t3.gg/en/introduction),
269
+ [Installation](https://create.t3.gg/en/installation),
270
+ [Folder Structure (App)](https://create.t3.gg/en/folder-structure-app),
271
+ [tRPC](https://create.t3.gg/en/usage/trpc),
272
+ [NextAuth.js](https://create.t3.gg/en/usage/next-auth),
273
+ [Environment Variables](https://create.t3.gg/en/usage/env-variables).