causaganha 1.0.2__tar.gz

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 (191) hide show
  1. causaganha-1.0.2/LICENSE +21 -0
  2. causaganha-1.0.2/PKG-INFO +289 -0
  3. causaganha-1.0.2/README.md +256 -0
  4. causaganha-1.0.2/pyproject.toml +157 -0
  5. causaganha-1.0.2/setup.cfg +4 -0
  6. causaganha-1.0.2/src/causaganha/__init__.py +11 -0
  7. causaganha-1.0.2/src/causaganha/analysis/__init__.py +1 -0
  8. causaganha-1.0.2/src/causaganha/analysis/keyword_classifier.py +243 -0
  9. causaganha-1.0.2/src/causaganha/analysis/llm_analyzer.py +575 -0
  10. causaganha-1.0.2/src/causaganha/analysis/models.py +310 -0
  11. causaganha-1.0.2/src/causaganha/config.py +199 -0
  12. causaganha-1.0.2/src/causaganha/consolidate/__init__.py +5 -0
  13. causaganha-1.0.2/src/causaganha/consolidate/__main__.py +7 -0
  14. causaganha-1.0.2/src/causaganha/consolidate/candidates.py +196 -0
  15. causaganha-1.0.2/src/causaganha/consolidate/checkpoint.py +106 -0
  16. causaganha-1.0.2/src/causaganha/consolidate/cli.py +481 -0
  17. causaganha-1.0.2/src/causaganha/consolidate/consolidation_manifest.py +124 -0
  18. causaganha-1.0.2/src/causaganha/consolidate/exporter.py +200 -0
  19. causaganha-1.0.2/src/causaganha/consolidate/manifest_reader.py +159 -0
  20. causaganha-1.0.2/src/causaganha/consolidate/ndjson_validator.py +124 -0
  21. causaganha-1.0.2/src/causaganha/consolidate/schema_registry.py +327 -0
  22. causaganha-1.0.2/src/causaganha/consolidate/transforms.py +413 -0
  23. causaganha-1.0.2/src/causaganha/consolidate/validation.py +483 -0
  24. causaganha-1.0.2/src/causaganha/consolidate/zip_processor.py +174 -0
  25. causaganha-1.0.2/src/causaganha/decisoes/__init__.py +21 -0
  26. causaganha-1.0.2/src/causaganha/decisoes/planner.py +130 -0
  27. causaganha-1.0.2/src/causaganha/decisoes/published.py +189 -0
  28. causaganha-1.0.2/src/causaganha/decisoes/search.py +367 -0
  29. causaganha-1.0.2/src/causaganha/pipeline/__init__.py +1 -0
  30. causaganha-1.0.2/src/causaganha/pipeline/ia_s3.py +301 -0
  31. causaganha-1.0.2/src/causaganha/processos/__init__.py +8 -0
  32. causaganha-1.0.2/src/causaganha/processos/cnj.py +60 -0
  33. causaganha-1.0.2/src/causaganha/processos/models.py +104 -0
  34. causaganha-1.0.2/src/causaganha/processos/query_plan_fixtures.py +153 -0
  35. causaganha-1.0.2/src/causaganha/processos/service.py +471 -0
  36. causaganha-1.0.2/src/causaganha/publicacoes/__init__.py +1 -0
  37. causaganha-1.0.2/src/causaganha/publicacoes/models.py +83 -0
  38. causaganha-1.0.2/src/causaganha/publicacoes/service.py +578 -0
  39. causaganha-1.0.2/src/causaganha/storage/__init__.py +1 -0
  40. causaganha-1.0.2/src/causaganha/storage/connection.py +64 -0
  41. causaganha-1.0.2/src/causaganha/storage/djen_schema.py +239 -0
  42. causaganha-1.0.2/src/causaganha.egg-info/PKG-INFO +289 -0
  43. causaganha-1.0.2/src/causaganha.egg-info/SOURCES.txt +189 -0
  44. causaganha-1.0.2/src/causaganha.egg-info/dependency_links.txt +1 -0
  45. causaganha-1.0.2/src/causaganha.egg-info/entry_points.txt +8 -0
  46. causaganha-1.0.2/src/causaganha.egg-info/requires.txt +22 -0
  47. causaganha-1.0.2/src/causaganha.egg-info/top_level.txt +10 -0
  48. causaganha-1.0.2/src/causaganha_mcp/__init__.py +3 -0
  49. causaganha-1.0.2/src/causaganha_mcp/__main__.py +34 -0
  50. causaganha-1.0.2/src/causaganha_mcp/_generated/__init__.py +0 -0
  51. causaganha-1.0.2/src/causaganha_mcp/_generated/domain_models.py +560 -0
  52. causaganha-1.0.2/src/causaganha_mcp/agents_examples.py +62 -0
  53. causaganha-1.0.2/src/causaganha_mcp/http_server.py +183 -0
  54. causaganha-1.0.2/src/causaganha_mcp/knowledge.py +55 -0
  55. causaganha-1.0.2/src/causaganha_mcp/processo_contract.py +214 -0
  56. causaganha-1.0.2/src/causaganha_mcp/profiles.py +98 -0
  57. causaganha-1.0.2/src/causaganha_mcp/py.typed +0 -0
  58. causaganha-1.0.2/src/causaganha_mcp/server.py +21 -0
  59. causaganha-1.0.2/src/causaganha_mcp/tools/__init__.py +1 -0
  60. causaganha-1.0.2/src/causaganha_mcp/tools/datajud.py +406 -0
  61. causaganha-1.0.2/src/causaganha_mcp/tools/datajud_processo.py +401 -0
  62. causaganha-1.0.2/src/causaganha_mcp/tools/decisoes.py +404 -0
  63. causaganha-1.0.2/src/causaganha_mcp/tools/djen_backup.py +100 -0
  64. causaganha-1.0.2/src/causaganha_mcp/tools/processo.py +309 -0
  65. causaganha-1.0.2/src/causaganha_mcp/tools/publicacoes.py +247 -0
  66. causaganha-1.0.2/src/causaganha_mcp/tools/status.py +554 -0
  67. causaganha-1.0.2/src/causaganha_mcp/tools/stj_acordaos.py +85 -0
  68. causaganha-1.0.2/src/causaganha_mcp/tools/tjro_juris.py +85 -0
  69. causaganha-1.0.2/src/causaganha_mcp/workflow_runs.py +172 -0
  70. causaganha-1.0.2/src/common/__init__.py +3 -0
  71. causaganha-1.0.2/src/common/relay.py +114 -0
  72. causaganha-1.0.2/src/datajud/__init__.py +6 -0
  73. causaganha-1.0.2/src/datajud/__main__.py +196 -0
  74. causaganha-1.0.2/src/datajud/archive.py +241 -0
  75. causaganha-1.0.2/src/datajud/client.py +377 -0
  76. causaganha-1.0.2/src/datajud/dedup.py +83 -0
  77. causaganha-1.0.2/src/datajud/manifest.py +132 -0
  78. causaganha-1.0.2/src/datajud/models.py +227 -0
  79. causaganha-1.0.2/src/datajud/process_service.py +62 -0
  80. causaganha-1.0.2/src/datajud/service.py +409 -0
  81. causaganha-1.0.2/src/datajud/state.py +314 -0
  82. causaganha-1.0.2/src/djen_backup/__init__.py +3 -0
  83. causaganha-1.0.2/src/djen_backup/__main__.py +646 -0
  84. causaganha-1.0.2/src/djen_backup/archive.py +289 -0
  85. causaganha-1.0.2/src/djen_backup/circuit_breaker.py +132 -0
  86. causaganha-1.0.2/src/djen_backup/credentials.py +48 -0
  87. causaganha-1.0.2/src/djen_backup/djen.py +259 -0
  88. causaganha-1.0.2/src/djen_backup/drain.py +246 -0
  89. causaganha-1.0.2/src/djen_backup/engine.py +755 -0
  90. causaganha-1.0.2/src/djen_backup/inventory.py +280 -0
  91. causaganha-1.0.2/src/djen_backup/manifest.py +911 -0
  92. causaganha-1.0.2/src/djen_backup/probe.py +216 -0
  93. causaganha-1.0.2/src/djen_backup/published.py +268 -0
  94. causaganha-1.0.2/src/djen_backup/py.typed +0 -0
  95. causaganha-1.0.2/src/djen_backup/retry.py +104 -0
  96. causaganha-1.0.2/src/djen_backup/segments.py +170 -0
  97. causaganha-1.0.2/src/djen_backup/service.py +182 -0
  98. causaganha-1.0.2/src/djen_backup/tribunais.py +58 -0
  99. causaganha-1.0.2/src/segmenter_dataset/__init__.py +8 -0
  100. causaganha-1.0.2/src/segmenter_dataset/__main__.py +176 -0
  101. causaganha-1.0.2/src/segmenter_dataset/candidate_mining.py +136 -0
  102. causaganha-1.0.2/src/segmenter_dataset/dataset_card.py +182 -0
  103. causaganha-1.0.2/src/segmenter_dataset/dedup.py +79 -0
  104. causaganha-1.0.2/src/segmenter_dataset/gates.py +135 -0
  105. causaganha-1.0.2/src/segmenter_dataset/iaa.py +262 -0
  106. causaganha-1.0.2/src/segmenter_dataset/ids.py +82 -0
  107. causaganha-1.0.2/src/segmenter_dataset/mechanical.py +215 -0
  108. causaganha-1.0.2/src/segmenter_dataset/model_eval.py +655 -0
  109. causaganha-1.0.2/src/segmenter_dataset/okf_markdown.py +147 -0
  110. causaganha-1.0.2/src/segmenter_dataset/ontology.py +153 -0
  111. causaganha-1.0.2/src/segmenter_dataset/opf_export.py +158 -0
  112. causaganha-1.0.2/src/segmenter_dataset/provenance.py +61 -0
  113. causaganha-1.0.2/src/segmenter_dataset/py.typed +0 -0
  114. causaganha-1.0.2/src/segmenter_dataset/region_eval.py +439 -0
  115. causaganha-1.0.2/src/segmenter_dataset/release.py +635 -0
  116. causaganha-1.0.2/src/segmenter_dataset/schemas.py +450 -0
  117. causaganha-1.0.2/src/segmenter_dataset/splits.py +508 -0
  118. causaganha-1.0.2/src/segmenter_dataset/store.py +969 -0
  119. causaganha-1.0.2/src/stj_acordaos/__init__.py +3 -0
  120. causaganha-1.0.2/src/stj_acordaos/__main__.py +178 -0
  121. causaganha-1.0.2/src/stj_acordaos/archive.py +124 -0
  122. causaganha-1.0.2/src/stj_acordaos/client.py +227 -0
  123. causaganha-1.0.2/src/stj_acordaos/dedup.py +76 -0
  124. causaganha-1.0.2/src/stj_acordaos/manifest.py +179 -0
  125. causaganha-1.0.2/src/stj_acordaos/service.py +314 -0
  126. causaganha-1.0.2/src/tcu_acordaos/__init__.py +21 -0
  127. causaganha-1.0.2/src/tcu_acordaos/acquisition.py +95 -0
  128. causaganha-1.0.2/src/tcu_acordaos/catalog.py +69 -0
  129. causaganha-1.0.2/src/tcu_acordaos/coverage.py +44 -0
  130. causaganha-1.0.2/src/tcu_acordaos/identity_candidates.py +100 -0
  131. causaganha-1.0.2/src/tcu_acordaos/ingest.py +174 -0
  132. causaganha-1.0.2/src/tcu_acordaos/materialize.py +80 -0
  133. causaganha-1.0.2/src/tcu_acordaos/publish.py +180 -0
  134. causaganha-1.0.2/src/tcu_acordaos/schema_diff.py +37 -0
  135. causaganha-1.0.2/src/tjro_juris/__init__.py +3 -0
  136. causaganha-1.0.2/src/tjro_juris/__main__.py +142 -0
  137. causaganha-1.0.2/src/tjro_juris/archive.py +161 -0
  138. causaganha-1.0.2/src/tjro_juris/client.py +301 -0
  139. causaganha-1.0.2/src/tjro_juris/crawler.py +463 -0
  140. causaganha-1.0.2/src/tjro_juris/dedup.py +46 -0
  141. causaganha-1.0.2/src/tjro_juris/manifest.py +107 -0
  142. causaganha-1.0.2/src/tjro_juris/service.py +400 -0
  143. causaganha-1.0.2/src/tse_processual/__init__.py +13 -0
  144. causaganha-1.0.2/src/tse_processual/acquisition.py +102 -0
  145. causaganha-1.0.2/src/tse_processual/catalog.py +57 -0
  146. causaganha-1.0.2/src/tse_processual/inspection.py +189 -0
  147. causaganha-1.0.2/src/tse_processual/profiling.py +241 -0
  148. causaganha-1.0.2/tests/test_canary_check.py +420 -0
  149. causaganha-1.0.2/tests/test_canary_heartbeat_check.py +51 -0
  150. causaganha-1.0.2/tests/test_candidates.py +218 -0
  151. causaganha-1.0.2/tests/test_catalog_parsing.py +286 -0
  152. causaganha-1.0.2/tests/test_check_agent_run_completeness.py +326 -0
  153. causaganha-1.0.2/tests/test_cobogo_core_adoption.py +55 -0
  154. causaganha-1.0.2/tests/test_consolidation.py +246 -0
  155. causaganha-1.0.2/tests/test_consolidation_manifest.py +164 -0
  156. causaganha-1.0.2/tests/test_contrast_ratios.py +128 -0
  157. causaganha-1.0.2/tests/test_data_contract_manifest.py +99 -0
  158. causaganha-1.0.2/tests/test_deployment_hygiene.py +31 -0
  159. causaganha-1.0.2/tests/test_ensemble_compare.py +50 -0
  160. causaganha-1.0.2/tests/test_exporter.py +73 -0
  161. causaganha-1.0.2/tests/test_footer_navigation.py +17 -0
  162. causaganha-1.0.2/tests/test_item_naming.py +14 -0
  163. causaganha-1.0.2/tests/test_keyword_classifier.py +290 -0
  164. causaganha-1.0.2/tests/test_llm_analyzer_key_rotation.py +70 -0
  165. causaganha-1.0.2/tests/test_ndjson_validator.py +123 -0
  166. causaganha-1.0.2/tests/test_notebooks_legacy_taxonomy.py +39 -0
  167. causaganha-1.0.2/tests/test_privacy_filter_segmenter.py +234 -0
  168. causaganha-1.0.2/tests/test_public_catalog_contract.py +33 -0
  169. causaganha-1.0.2/tests/test_reconcile_processos.py +732 -0
  170. causaganha-1.0.2/tests/test_reconstruct_regions.py +147 -0
  171. causaganha-1.0.2/tests/test_recurso_outcome_normalization.py +49 -0
  172. causaganha-1.0.2/tests/test_render_manifest_compaction.py +207 -0
  173. causaganha-1.0.2/tests/test_render_manifest_retry.py +158 -0
  174. causaganha-1.0.2/tests/test_render_manifest_writeback.py +148 -0
  175. causaganha-1.0.2/tests/test_render_queries.py +581 -0
  176. causaganha-1.0.2/tests/test_schema_registry.py +214 -0
  177. causaganha-1.0.2/tests/test_scripts_db_hygiene.py +24 -0
  178. causaganha-1.0.2/tests/test_segment_decision.py +134 -0
  179. causaganha-1.0.2/tests/test_tcu_acordaos_acquisition.py +101 -0
  180. causaganha-1.0.2/tests/test_tcu_acordaos_catalog.py +117 -0
  181. causaganha-1.0.2/tests/test_tcu_acordaos_coverage.py +57 -0
  182. causaganha-1.0.2/tests/test_tcu_acordaos_docs.py +63 -0
  183. causaganha-1.0.2/tests/test_tcu_acordaos_identity_candidates.py +146 -0
  184. causaganha-1.0.2/tests/test_tcu_acordaos_identity_investigation.py +160 -0
  185. causaganha-1.0.2/tests/test_tcu_acordaos_ingest.py +202 -0
  186. causaganha-1.0.2/tests/test_tcu_acordaos_materialize.py +88 -0
  187. causaganha-1.0.2/tests/test_tcu_acordaos_prove_bulk.py +62 -0
  188. causaganha-1.0.2/tests/test_tcu_acordaos_publish.py +163 -0
  189. causaganha-1.0.2/tests/test_tcu_acordaos_publish_teor.py +63 -0
  190. causaganha-1.0.2/tests/test_tcu_acordaos_schema_diff.py +38 -0
  191. causaganha-1.0.2/tests/test_update_catalog_workflow.py +92 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 CausaGanha Project Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,289 @@
1
+ Metadata-Version: 2.4
2
+ Name: causaganha
3
+ Version: 1.0.2
4
+ Summary: Public, auditable archive and structured data layer for Brazilian judicial publications (DJEN)
5
+ Author: CausaGanha Team
6
+ License: MIT
7
+ Requires-Python: >=3.12
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE
10
+ Requires-Dist: duckdb>=0.10.0
11
+ Requires-Dist: internetarchive>=5.4.0
12
+ Requires-Dist: pandas>=2.3.0
13
+ Requires-Dist: python-dateutil>=2.8.0
14
+ Requires-Dist: rich>=13.7.0
15
+ Requires-Dist: typer>=0.12.0
16
+ Requires-Dist: pydantic>=2.10.0
17
+ Requires-Dist: pydantic-settings>=2.0.0
18
+ Requires-Dist: ibis-framework[duckdb]>=9.0
19
+ Requires-Dist: httpx>=0.27
20
+ Requires-Dist: structlog>=24.1
21
+ Requires-Dist: tenacity>=9.1
22
+ Requires-Dist: click>=8.1
23
+ Requires-Dist: numpy>=2.0.0
24
+ Requires-Dist: holidays>=0.40.0
25
+ Requires-Dist: pyyaml>=6.0.3
26
+ Requires-Dist: aiolimiter>=1.2.1
27
+ Requires-Dist: anyio>=4.0
28
+ Requires-Dist: aiohttp>=3.9.0
29
+ Requires-Dist: fastmcp>=3.4.2
30
+ Requires-Dist: okf-parser<0.46,>=0.45.4
31
+ Requires-Dist: cyclopts>=4.22.0
32
+ Dynamic: license-file
33
+
34
+ # CausaGanha
35
+
36
+ ![Collect ZIPs](https://github.com/franklinbaldo/causaganha/actions/workflows/collect-zips.yml/badge.svg)
37
+ ![Deploy Web](https://github.com/franklinbaldo/causaganha/actions/workflows/deploy-web.yml/badge.svg)
38
+ ![Status](https://img.shields.io/badge/status-alpha-orange?style=for-the-badge)
39
+
40
+ **CausaGanha é uma camada pública e verificável para acompanhar o rastro de processos judiciais brasileiros.** O projeto preserva o que foi publicado, reconcilia fontes oficiais e mantém explícito de onde veio cada fato — inclusive quando uma fonte não tem aquele processo, está indisponível ou representa apenas um snapshot no tempo.
41
+
42
+ O site permite consultar um processo por número CNJ, pesquisar publicações por texto/OAB/parte e explorar a cobertura do arquivo. Os mesmos dados também podem ser reutilizados diretamente via Internet Archive + DuckDB ou consultados por assistentes através do servidor MCP read-only.
43
+
44
+ **Site público:** [franklinbaldo.github.io/causaganha](https://franklinbaldo.github.io/causaganha/)
45
+
46
+ ## O produto em três perguntas
47
+
48
+ Um processo deixa rastros diferentes em fontes diferentes. O CausaGanha evita fundi-los numa resposta opaca:
49
+
50
+ | Pergunta | Evidência | Papel no CausaGanha |
51
+ |---|---|---|
52
+ | **O que foi publicado e preservado?** | arquivo | DJEN preservado no Internet Archive, Parquets e catálogo reproduzível |
53
+ | **Onde o processo está / o que aconteceu na linha processual?** | estado | metadata e movimentação processual, especialmente DataJud |
54
+ | **O que a decisão ou documento efetivamente diz?** | teor | documentos de jurisprudência e acórdãos quando a fonte correspondente está disponível |
55
+
56
+ Arquivo, estado e teor podem divergir no tempo. Um documento local antigo não prova que o processo parou; um movimento chamado “Sentença” não prova qual foi o fundamento da sentença. A proveniência continua visível para que o consumidor saiba exatamente o que cada fonte sustenta.
57
+
58
+ ## Quatro fontes, quatro papéis
59
+
60
+ O knowledge corpus do projeto modela quatro fontes oficiais e os pipelines que as consomem:
61
+
62
+ | Fonte | O que ela traz | Papel principal |
63
+ |---|---|---|
64
+ | **DJEN (CNJ)** | comunicações judiciais diárias | preservação, busca de publicações, cobertura histórica |
65
+ | **TJRO JURIS** | decisões e documentos de jurisprudência do TJRO | teor estruturado e corpus de decisões |
66
+ | **STJ Acórdãos** | acórdãos do Superior Tribunal de Justiça | teor/metadata de decisões do STJ e reconciliação processual |
67
+ | **DataJud (CNJ)** | capa, classe, assuntos, órgão, grau, datas e movimentos | estado processual, enriquecimento e facetas |
68
+
69
+ A existência de um pipeline **não implica cobertura completa nem maturidade operacional idêntica**. Cada superfície deve expor freshness, cobertura e limitações de sua própria fonte em vez de transformar integração em promessa de completude.
70
+
71
+ ## Três interfaces do mesmo sistema
72
+
73
+ ### 1. Site
74
+
75
+ A home aceita dois jobs principais:
76
+
77
+ - um **CNJ** leva ao dossiê reconciliado em `/processo`;
78
+ - texto livre, OAB ou parte leva à busca de publicações do DJEN.
79
+
80
+ O dossiê por CNJ usa `indice_processual.parquet` como índice fino: ele descobre quais fontes têm registro para o processo e consulta os Parquets de origem sem copiar todo o conteúdo para uma tabela monolítica.
81
+
82
+ ### 2. Dados públicos
83
+
84
+ O produto suportado continua tendo como fundação o **arquivo público**. ZIPs originais, manifestos e derivados ficam no Internet Archive. O catálogo público é distribuído como SQL auditável, não como um banco DuckDB opaco:
85
+
86
+ ```bash
87
+ curl -L https://archive.org/download/causaganha-catalog/catalog.sql -o catalog.sql
88
+ duckdb causaganha.duckdb < catalog.sql
89
+ duckdb causaganha.duckdb "SELECT * FROM comunicacoes LIMIT 100;"
90
+ ```
91
+
92
+ Artefatos centrais:
93
+
94
+ - `sync-manifest.parquet` — fonte de verdade da sincronização DJEN;
95
+ - `catalog.sql` — contrato reconstruível das views públicas;
96
+ - `indice_processual.parquet` — índice fino que liga CNJs às fontes/arquivos de origem;
97
+ - Parquets específicos de DJEN, JURIS, STJ e DataJud conforme disponibilidade de cada pipeline.
98
+
99
+ ### 3. Agentes / MCP
100
+
101
+ `causaganha-mcp` expõe uma superfície read-only para assistentes. Hoje são **dez tools**:
102
+
103
+ <!-- mcp-tools:start -->
104
+ Tools de produto (respondem ARQUIVO/ESTADO/TEOR sem exigir conhecimento de schemas ou pipelines):
105
+
106
+ - `processo_consultar` — ARQUIVO: publicações preservadas, decisões/documentos e metadados do snapshot para um CNJ;
107
+ - `publicacoes_buscar` — ARQUIVO: pesquisa publicações preservadas por processo, OAB, parte, advogado, texto, tribunal ou período;
108
+ - `processo_estado` — ESTADO: movimentos, graus e último marco de um CNJ no DataJud oficial;
109
+ - `decisoes_buscar` — TEOR: busca temática por decisão, acórdão, ementa ou tese.
110
+
111
+ Tools operacionais/diagnóstico (saúde e freshness dos coletores, nunca pré-requisito para uma consulta de produto):
112
+
113
+ - `causaganha_status`
114
+ - `djen_backup_status`
115
+ - `tjro_juris_status`
116
+ - `stj_acordaos_status`
117
+ - `datajud_status`
118
+ - `datajud_facetas`
119
+ <!-- mcp-tools:end -->
120
+
121
+ As seis tools operacionais leem estado local dos pipelines ou, no caso de `datajud_facetas`, agregados da API pública do DataJud. Nenhuma tool dispara ingestão, upload ou backfill.
122
+
123
+ Hosts que suportam MCP local por stdio podem iniciar o servidor com:
124
+
125
+ ```json
126
+ {
127
+ "mcpServers": {
128
+ "causaganha": {
129
+ "command": "uv",
130
+ "args": ["run", "--directory", "/caminho/para/causaganha", "causaganha-mcp"]
131
+ }
132
+ }
133
+ }
134
+ ```
135
+
136
+ Estado do transporte HTTP, em três partes:
137
+
138
+ - **stdio local**: suportado hoje via `causaganha-mcp` (acima);
139
+ - **artefato HTTP/deploy**: já existe no repositório em `deployment/mcp/` (`causaganha-mcp-http`, Dockerfile e `cloudbuild.yaml`), com limites de timeout e concorrência documentados ali;
140
+ - **URL pública estável**: ainda bloqueada — o rollout e a divulgação de uma URL dependem da prova de smoke descrita em #950.
141
+
142
+ ## Fundação: o arquivo DJEN
143
+
144
+ O DJEN (Diário de Justiça Eletrônico Nacional) publica comunicações judiciais com efeitos jurídicos e existência frequentemente efêmera na superfície de origem. O CausaGanha preserva os ZIPs no Internet Archive e mantém um manifesto auditável por par `(tribunal, data)`.
145
+
146
+ O motor canônico fica em `src/djen_backup/` e opera com pools independentes de check, download e upload. O estado é um log append-only de segmentos compactados em `sync-manifest.parquet`; o projeto não trata um código HTTP isolado como veredito de disponibilidade.
147
+
148
+ ### Invariantes importantes
149
+
150
+ - `403` do DJEN **não significa ausência**; pode ser bloqueio/rate-limit e deve continuar desconhecido/retriável.
151
+ - `200` também **não basta para dizer disponível**: o DJEN pode responder `{"status": "Sem comunicações"}` sem URL de download.
152
+ - o arquivo distingue ausência confirmada de erro transitório, nunca verificado e pendência real.
153
+ - uploads do Internet Archive usam `httpx` e headers `x-archive-meta-*`; não `boto3`.
154
+
155
+ ### Workflows principais
156
+
157
+ | Workflow | Trigger | Papel |
158
+ |---|---|---|
159
+ | `collect-zips.yml` | a cada 20 min | consultar DJEN, baixar e arquivar ZIPs |
160
+ | `upload-backlog.yml` | a cada 15 min | drenar ZIPs já confirmados |
161
+ | `render-manifest-parquet.yml` | a cada 30 min | compactar o event log no manifesto base |
162
+ | `consolidate-parquet.yml` | diário | ZIPs → Parquet |
163
+ | `update-catalog.yml` | após consolidação | atualizar catálogo/índice e contratos derivados |
164
+ | `deploy-web.yml` | push / catálogo | renderizar dados e publicar o site |
165
+ | `canary.yml` | diário | provar o caminho DJEN/deploy contra o sistema real |
166
+
167
+ ## Arquitetura
168
+
169
+ ```mermaid
170
+ flowchart LR
171
+ DJEN[DJEN] --> ARCHIVE[Arquivo DJEN / IA]
172
+ JURIS[TJRO JURIS] --> SOURCES[Parquets por fonte]
173
+ STJ[STJ Acórdãos] --> SOURCES
174
+ DATAJUD[DataJud] --> SOURCES
175
+ ARCHIVE --> SOURCES
176
+ SOURCES --> INDEX[indice_processual.parquet]
177
+ INDEX --> DOSSIER[Dossiê por CNJ]
178
+ SOURCES --> CATALOG[catalog.sql / DuckDB]
179
+ ARCHIVE --> STATUS[coverage / freshness]
180
+ DOSSIER --> WEB[Site]
181
+ CATALOG --> WEB
182
+ STATUS --> WEB
183
+ INDEX --> MCP[causaganha-mcp]
184
+ SOURCES --> MCP
185
+ ```
186
+
187
+ Há duas superfícies de runtime principais:
188
+
189
+ - backend Python/CLIs em `src/`;
190
+ - frontend Astro + Svelte em `web/`.
191
+
192
+ Metadados estáveis de produto (fontes e pipelines) vivem no bundle OKF de `knowledge/`; contratos físicos continuam no código, Parquet e Zod. O OKF participa do `causaganha_status`, mas não substitui schema registry nem contratos de dados.
193
+
194
+ ## CLIs
195
+
196
+ Entry points registrados em `pyproject.toml`:
197
+
198
+ | Comando | Papel |
199
+ |---|---|
200
+ | `djen-backup` | sincronização/arquivo DJEN |
201
+ | `tjro-juris` | coleta de jurisprudência TJRO |
202
+ | `stj-acordaos` | coleta de acórdãos STJ |
203
+ | `datajud` | enriquecimento processual DataJud |
204
+ | `causaganha-mcp` | servidor MCP read-only |
205
+
206
+ Exemplos:
207
+
208
+ ```bash
209
+ uv run djen-backup --workers 8
210
+ uv run djen-backup check --workers 8
211
+ uv run djen-backup upload --workers 4
212
+ uv run --env-file .env datajud enrich --tribunal tjro --skip-upload
213
+ ```
214
+
215
+ A consolidação Parquet é um module CLI: `python -m causaganha.consolidate`.
216
+
217
+ ## Frontend e contratos de consulta
218
+
219
+ O frontend usa Astro 5, Svelte 5, DuckDB WASM, Vitest e Zod.
220
+
221
+ As necessidades de dados do site são declaradas em `web/src/queries/*.qmd`. Cada contrato define output/formato e uma consulta SQL. `scripts/render_queries.py` materializa JSON em `web/public/data/`, e os payloads renderizados são validados contra o registry Zod do frontend em CI.
222
+
223
+ Para adicionar uma view:
224
+
225
+ 1. criar `web/src/queries/minha_view.qmd`;
226
+ 2. adicionar o schema/registry em `web/src/lib/data/contracts.ts`;
227
+ 3. executar `uv run python scripts/render_queries.py`.
228
+
229
+ Veja `web/src/queries/README.md` para o contrato completo.
230
+
231
+ ## Lab experimental
232
+
233
+ Classificação de resultados, embeddings, segmentação de decisões, treinamento de modelos e outros experimentos ficam sob a fronteira **Lab**. Eles podem usar o arquivo público como matéria-prima, mas **não definem a confiabilidade do produto suportado** e não devem ser apresentados como fatos equivalentes aos registros oficiais.
234
+
235
+ Notebooks são autorados em marimo (`notebooks/*.py`) e exportados para `.ipynb` em CI. A governança da camada analítica está em `docs/GOVERNANCE.md`.
236
+
237
+ ## Desenvolvimento
238
+
239
+ Pré-requisitos: Python 3.12+, [`uv`](https://docs.astral.sh/uv/) e Node.js 22+.
240
+
241
+ ```bash
242
+ uv sync --dev
243
+ cp .env.example .env
244
+ uv run pre-commit install
245
+ uv run pytest -q
246
+ ```
247
+
248
+ Gates usuais:
249
+
250
+ ```bash
251
+ uv run ruff format --check
252
+ uv run ruff check
253
+ uvx vulture src/ scripts/ vulture_whitelist.py --min-confidence 100
254
+ cd web && npm ci && npm run lint && npm test && npm run build
255
+ ```
256
+
257
+ ## Estrutura do repositório
258
+
259
+ ```text
260
+ knowledge/ fatos estáveis de fontes/pipelines (OKF)
261
+ src/causaganha/ domínio, consolidação e processo como recurso
262
+ src/causaganha_mcp/ superfície MCP
263
+ src/djen_backup/ motor de sincronização DJEN
264
+ src/datajud/ client/service/archive DataJud
265
+ src/tjro_juris/ pipeline JURIS
266
+ src/stj_acordaos/ pipeline STJ
267
+ web/ site Astro + Svelte
268
+ scripts/ pipelines e operações auxiliares
269
+ notebooks/ Lab / marimo + exports
270
+ .github/workflows/ CI/CD e jobs de dados
271
+ ```
272
+
273
+ ## Documentação
274
+
275
+ - [`docs/PRODUCT.md`](docs/PRODUCT.md) — modelo de produto, proveniência e fronteiras
276
+ - [`CONTRIBUTING.md`](CONTRIBUTING.md) — setup e regras de contribuição
277
+ - [`FRONTEND.md`](FRONTEND.md) — arquitetura/design do frontend
278
+ - [`web/src/queries/README.md`](web/src/queries/README.md) — contratos `.qmd`
279
+ - [`docs/GOVERNANCE.md`](docs/GOVERNANCE.md) — preservação, correção/restrição e licenciamento
280
+ - [`docs/SERVICE_OBJECTIVES.md`](docs/SERVICE_OBJECTIVES.md) — objetivos operacionais e canário
281
+
282
+ Se documentação e código divergirem, o código/workflow é a evidência operacional e a documentação deve ser corrigida na mesma mudança.
283
+
284
+ ## Licença
285
+
286
+ - **Código:** [MIT](LICENSE).
287
+ - **Dados derivados pelo projeto:** direitos que pertençam ao CausaGanha são disponibilizados sob [CC0 1.0](https://creativecommons.org/publicdomain/zero/1.0/).
288
+
289
+ Textos de atos oficiais têm regime próprio (Lei 9.610/98, art. 8º, IV), sem prejuízo de direitos de terceiros eventualmente reproduzidos, privacidade ou proteção de dados. A política completa de preservação, correção e restrição está em [`docs/GOVERNANCE.md`](docs/GOVERNANCE.md).
@@ -0,0 +1,256 @@
1
+ # CausaGanha
2
+
3
+ ![Collect ZIPs](https://github.com/franklinbaldo/causaganha/actions/workflows/collect-zips.yml/badge.svg)
4
+ ![Deploy Web](https://github.com/franklinbaldo/causaganha/actions/workflows/deploy-web.yml/badge.svg)
5
+ ![Status](https://img.shields.io/badge/status-alpha-orange?style=for-the-badge)
6
+
7
+ **CausaGanha é uma camada pública e verificável para acompanhar o rastro de processos judiciais brasileiros.** O projeto preserva o que foi publicado, reconcilia fontes oficiais e mantém explícito de onde veio cada fato — inclusive quando uma fonte não tem aquele processo, está indisponível ou representa apenas um snapshot no tempo.
8
+
9
+ O site permite consultar um processo por número CNJ, pesquisar publicações por texto/OAB/parte e explorar a cobertura do arquivo. Os mesmos dados também podem ser reutilizados diretamente via Internet Archive + DuckDB ou consultados por assistentes através do servidor MCP read-only.
10
+
11
+ **Site público:** [franklinbaldo.github.io/causaganha](https://franklinbaldo.github.io/causaganha/)
12
+
13
+ ## O produto em três perguntas
14
+
15
+ Um processo deixa rastros diferentes em fontes diferentes. O CausaGanha evita fundi-los numa resposta opaca:
16
+
17
+ | Pergunta | Evidência | Papel no CausaGanha |
18
+ |---|---|---|
19
+ | **O que foi publicado e preservado?** | arquivo | DJEN preservado no Internet Archive, Parquets e catálogo reproduzível |
20
+ | **Onde o processo está / o que aconteceu na linha processual?** | estado | metadata e movimentação processual, especialmente DataJud |
21
+ | **O que a decisão ou documento efetivamente diz?** | teor | documentos de jurisprudência e acórdãos quando a fonte correspondente está disponível |
22
+
23
+ Arquivo, estado e teor podem divergir no tempo. Um documento local antigo não prova que o processo parou; um movimento chamado “Sentença” não prova qual foi o fundamento da sentença. A proveniência continua visível para que o consumidor saiba exatamente o que cada fonte sustenta.
24
+
25
+ ## Quatro fontes, quatro papéis
26
+
27
+ O knowledge corpus do projeto modela quatro fontes oficiais e os pipelines que as consomem:
28
+
29
+ | Fonte | O que ela traz | Papel principal |
30
+ |---|---|---|
31
+ | **DJEN (CNJ)** | comunicações judiciais diárias | preservação, busca de publicações, cobertura histórica |
32
+ | **TJRO JURIS** | decisões e documentos de jurisprudência do TJRO | teor estruturado e corpus de decisões |
33
+ | **STJ Acórdãos** | acórdãos do Superior Tribunal de Justiça | teor/metadata de decisões do STJ e reconciliação processual |
34
+ | **DataJud (CNJ)** | capa, classe, assuntos, órgão, grau, datas e movimentos | estado processual, enriquecimento e facetas |
35
+
36
+ A existência de um pipeline **não implica cobertura completa nem maturidade operacional idêntica**. Cada superfície deve expor freshness, cobertura e limitações de sua própria fonte em vez de transformar integração em promessa de completude.
37
+
38
+ ## Três interfaces do mesmo sistema
39
+
40
+ ### 1. Site
41
+
42
+ A home aceita dois jobs principais:
43
+
44
+ - um **CNJ** leva ao dossiê reconciliado em `/processo`;
45
+ - texto livre, OAB ou parte leva à busca de publicações do DJEN.
46
+
47
+ O dossiê por CNJ usa `indice_processual.parquet` como índice fino: ele descobre quais fontes têm registro para o processo e consulta os Parquets de origem sem copiar todo o conteúdo para uma tabela monolítica.
48
+
49
+ ### 2. Dados públicos
50
+
51
+ O produto suportado continua tendo como fundação o **arquivo público**. ZIPs originais, manifestos e derivados ficam no Internet Archive. O catálogo público é distribuído como SQL auditável, não como um banco DuckDB opaco:
52
+
53
+ ```bash
54
+ curl -L https://archive.org/download/causaganha-catalog/catalog.sql -o catalog.sql
55
+ duckdb causaganha.duckdb < catalog.sql
56
+ duckdb causaganha.duckdb "SELECT * FROM comunicacoes LIMIT 100;"
57
+ ```
58
+
59
+ Artefatos centrais:
60
+
61
+ - `sync-manifest.parquet` — fonte de verdade da sincronização DJEN;
62
+ - `catalog.sql` — contrato reconstruível das views públicas;
63
+ - `indice_processual.parquet` — índice fino que liga CNJs às fontes/arquivos de origem;
64
+ - Parquets específicos de DJEN, JURIS, STJ e DataJud conforme disponibilidade de cada pipeline.
65
+
66
+ ### 3. Agentes / MCP
67
+
68
+ `causaganha-mcp` expõe uma superfície read-only para assistentes. Hoje são **dez tools**:
69
+
70
+ <!-- mcp-tools:start -->
71
+ Tools de produto (respondem ARQUIVO/ESTADO/TEOR sem exigir conhecimento de schemas ou pipelines):
72
+
73
+ - `processo_consultar` — ARQUIVO: publicações preservadas, decisões/documentos e metadados do snapshot para um CNJ;
74
+ - `publicacoes_buscar` — ARQUIVO: pesquisa publicações preservadas por processo, OAB, parte, advogado, texto, tribunal ou período;
75
+ - `processo_estado` — ESTADO: movimentos, graus e último marco de um CNJ no DataJud oficial;
76
+ - `decisoes_buscar` — TEOR: busca temática por decisão, acórdão, ementa ou tese.
77
+
78
+ Tools operacionais/diagnóstico (saúde e freshness dos coletores, nunca pré-requisito para uma consulta de produto):
79
+
80
+ - `causaganha_status`
81
+ - `djen_backup_status`
82
+ - `tjro_juris_status`
83
+ - `stj_acordaos_status`
84
+ - `datajud_status`
85
+ - `datajud_facetas`
86
+ <!-- mcp-tools:end -->
87
+
88
+ As seis tools operacionais leem estado local dos pipelines ou, no caso de `datajud_facetas`, agregados da API pública do DataJud. Nenhuma tool dispara ingestão, upload ou backfill.
89
+
90
+ Hosts que suportam MCP local por stdio podem iniciar o servidor com:
91
+
92
+ ```json
93
+ {
94
+ "mcpServers": {
95
+ "causaganha": {
96
+ "command": "uv",
97
+ "args": ["run", "--directory", "/caminho/para/causaganha", "causaganha-mcp"]
98
+ }
99
+ }
100
+ }
101
+ ```
102
+
103
+ Estado do transporte HTTP, em três partes:
104
+
105
+ - **stdio local**: suportado hoje via `causaganha-mcp` (acima);
106
+ - **artefato HTTP/deploy**: já existe no repositório em `deployment/mcp/` (`causaganha-mcp-http`, Dockerfile e `cloudbuild.yaml`), com limites de timeout e concorrência documentados ali;
107
+ - **URL pública estável**: ainda bloqueada — o rollout e a divulgação de uma URL dependem da prova de smoke descrita em #950.
108
+
109
+ ## Fundação: o arquivo DJEN
110
+
111
+ O DJEN (Diário de Justiça Eletrônico Nacional) publica comunicações judiciais com efeitos jurídicos e existência frequentemente efêmera na superfície de origem. O CausaGanha preserva os ZIPs no Internet Archive e mantém um manifesto auditável por par `(tribunal, data)`.
112
+
113
+ O motor canônico fica em `src/djen_backup/` e opera com pools independentes de check, download e upload. O estado é um log append-only de segmentos compactados em `sync-manifest.parquet`; o projeto não trata um código HTTP isolado como veredito de disponibilidade.
114
+
115
+ ### Invariantes importantes
116
+
117
+ - `403` do DJEN **não significa ausência**; pode ser bloqueio/rate-limit e deve continuar desconhecido/retriável.
118
+ - `200` também **não basta para dizer disponível**: o DJEN pode responder `{"status": "Sem comunicações"}` sem URL de download.
119
+ - o arquivo distingue ausência confirmada de erro transitório, nunca verificado e pendência real.
120
+ - uploads do Internet Archive usam `httpx` e headers `x-archive-meta-*`; não `boto3`.
121
+
122
+ ### Workflows principais
123
+
124
+ | Workflow | Trigger | Papel |
125
+ |---|---|---|
126
+ | `collect-zips.yml` | a cada 20 min | consultar DJEN, baixar e arquivar ZIPs |
127
+ | `upload-backlog.yml` | a cada 15 min | drenar ZIPs já confirmados |
128
+ | `render-manifest-parquet.yml` | a cada 30 min | compactar o event log no manifesto base |
129
+ | `consolidate-parquet.yml` | diário | ZIPs → Parquet |
130
+ | `update-catalog.yml` | após consolidação | atualizar catálogo/índice e contratos derivados |
131
+ | `deploy-web.yml` | push / catálogo | renderizar dados e publicar o site |
132
+ | `canary.yml` | diário | provar o caminho DJEN/deploy contra o sistema real |
133
+
134
+ ## Arquitetura
135
+
136
+ ```mermaid
137
+ flowchart LR
138
+ DJEN[DJEN] --> ARCHIVE[Arquivo DJEN / IA]
139
+ JURIS[TJRO JURIS] --> SOURCES[Parquets por fonte]
140
+ STJ[STJ Acórdãos] --> SOURCES
141
+ DATAJUD[DataJud] --> SOURCES
142
+ ARCHIVE --> SOURCES
143
+ SOURCES --> INDEX[indice_processual.parquet]
144
+ INDEX --> DOSSIER[Dossiê por CNJ]
145
+ SOURCES --> CATALOG[catalog.sql / DuckDB]
146
+ ARCHIVE --> STATUS[coverage / freshness]
147
+ DOSSIER --> WEB[Site]
148
+ CATALOG --> WEB
149
+ STATUS --> WEB
150
+ INDEX --> MCP[causaganha-mcp]
151
+ SOURCES --> MCP
152
+ ```
153
+
154
+ Há duas superfícies de runtime principais:
155
+
156
+ - backend Python/CLIs em `src/`;
157
+ - frontend Astro + Svelte em `web/`.
158
+
159
+ Metadados estáveis de produto (fontes e pipelines) vivem no bundle OKF de `knowledge/`; contratos físicos continuam no código, Parquet e Zod. O OKF participa do `causaganha_status`, mas não substitui schema registry nem contratos de dados.
160
+
161
+ ## CLIs
162
+
163
+ Entry points registrados em `pyproject.toml`:
164
+
165
+ | Comando | Papel |
166
+ |---|---|
167
+ | `djen-backup` | sincronização/arquivo DJEN |
168
+ | `tjro-juris` | coleta de jurisprudência TJRO |
169
+ | `stj-acordaos` | coleta de acórdãos STJ |
170
+ | `datajud` | enriquecimento processual DataJud |
171
+ | `causaganha-mcp` | servidor MCP read-only |
172
+
173
+ Exemplos:
174
+
175
+ ```bash
176
+ uv run djen-backup --workers 8
177
+ uv run djen-backup check --workers 8
178
+ uv run djen-backup upload --workers 4
179
+ uv run --env-file .env datajud enrich --tribunal tjro --skip-upload
180
+ ```
181
+
182
+ A consolidação Parquet é um module CLI: `python -m causaganha.consolidate`.
183
+
184
+ ## Frontend e contratos de consulta
185
+
186
+ O frontend usa Astro 5, Svelte 5, DuckDB WASM, Vitest e Zod.
187
+
188
+ As necessidades de dados do site são declaradas em `web/src/queries/*.qmd`. Cada contrato define output/formato e uma consulta SQL. `scripts/render_queries.py` materializa JSON em `web/public/data/`, e os payloads renderizados são validados contra o registry Zod do frontend em CI.
189
+
190
+ Para adicionar uma view:
191
+
192
+ 1. criar `web/src/queries/minha_view.qmd`;
193
+ 2. adicionar o schema/registry em `web/src/lib/data/contracts.ts`;
194
+ 3. executar `uv run python scripts/render_queries.py`.
195
+
196
+ Veja `web/src/queries/README.md` para o contrato completo.
197
+
198
+ ## Lab experimental
199
+
200
+ Classificação de resultados, embeddings, segmentação de decisões, treinamento de modelos e outros experimentos ficam sob a fronteira **Lab**. Eles podem usar o arquivo público como matéria-prima, mas **não definem a confiabilidade do produto suportado** e não devem ser apresentados como fatos equivalentes aos registros oficiais.
201
+
202
+ Notebooks são autorados em marimo (`notebooks/*.py`) e exportados para `.ipynb` em CI. A governança da camada analítica está em `docs/GOVERNANCE.md`.
203
+
204
+ ## Desenvolvimento
205
+
206
+ Pré-requisitos: Python 3.12+, [`uv`](https://docs.astral.sh/uv/) e Node.js 22+.
207
+
208
+ ```bash
209
+ uv sync --dev
210
+ cp .env.example .env
211
+ uv run pre-commit install
212
+ uv run pytest -q
213
+ ```
214
+
215
+ Gates usuais:
216
+
217
+ ```bash
218
+ uv run ruff format --check
219
+ uv run ruff check
220
+ uvx vulture src/ scripts/ vulture_whitelist.py --min-confidence 100
221
+ cd web && npm ci && npm run lint && npm test && npm run build
222
+ ```
223
+
224
+ ## Estrutura do repositório
225
+
226
+ ```text
227
+ knowledge/ fatos estáveis de fontes/pipelines (OKF)
228
+ src/causaganha/ domínio, consolidação e processo como recurso
229
+ src/causaganha_mcp/ superfície MCP
230
+ src/djen_backup/ motor de sincronização DJEN
231
+ src/datajud/ client/service/archive DataJud
232
+ src/tjro_juris/ pipeline JURIS
233
+ src/stj_acordaos/ pipeline STJ
234
+ web/ site Astro + Svelte
235
+ scripts/ pipelines e operações auxiliares
236
+ notebooks/ Lab / marimo + exports
237
+ .github/workflows/ CI/CD e jobs de dados
238
+ ```
239
+
240
+ ## Documentação
241
+
242
+ - [`docs/PRODUCT.md`](docs/PRODUCT.md) — modelo de produto, proveniência e fronteiras
243
+ - [`CONTRIBUTING.md`](CONTRIBUTING.md) — setup e regras de contribuição
244
+ - [`FRONTEND.md`](FRONTEND.md) — arquitetura/design do frontend
245
+ - [`web/src/queries/README.md`](web/src/queries/README.md) — contratos `.qmd`
246
+ - [`docs/GOVERNANCE.md`](docs/GOVERNANCE.md) — preservação, correção/restrição e licenciamento
247
+ - [`docs/SERVICE_OBJECTIVES.md`](docs/SERVICE_OBJECTIVES.md) — objetivos operacionais e canário
248
+
249
+ Se documentação e código divergirem, o código/workflow é a evidência operacional e a documentação deve ser corrigida na mesma mudança.
250
+
251
+ ## Licença
252
+
253
+ - **Código:** [MIT](LICENSE).
254
+ - **Dados derivados pelo projeto:** direitos que pertençam ao CausaGanha são disponibilizados sob [CC0 1.0](https://creativecommons.org/publicdomain/zero/1.0/).
255
+
256
+ Textos de atos oficiais têm regime próprio (Lei 9.610/98, art. 8º, IV), sem prejuízo de direitos de terceiros eventualmente reproduzidos, privacidade ou proteção de dados. A política completa de preservação, correção e restrição está em [`docs/GOVERNANCE.md`](docs/GOVERNANCE.md).