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.
- causaganha-1.0.2/LICENSE +21 -0
- causaganha-1.0.2/PKG-INFO +289 -0
- causaganha-1.0.2/README.md +256 -0
- causaganha-1.0.2/pyproject.toml +157 -0
- causaganha-1.0.2/setup.cfg +4 -0
- causaganha-1.0.2/src/causaganha/__init__.py +11 -0
- causaganha-1.0.2/src/causaganha/analysis/__init__.py +1 -0
- causaganha-1.0.2/src/causaganha/analysis/keyword_classifier.py +243 -0
- causaganha-1.0.2/src/causaganha/analysis/llm_analyzer.py +575 -0
- causaganha-1.0.2/src/causaganha/analysis/models.py +310 -0
- causaganha-1.0.2/src/causaganha/config.py +199 -0
- causaganha-1.0.2/src/causaganha/consolidate/__init__.py +5 -0
- causaganha-1.0.2/src/causaganha/consolidate/__main__.py +7 -0
- causaganha-1.0.2/src/causaganha/consolidate/candidates.py +196 -0
- causaganha-1.0.2/src/causaganha/consolidate/checkpoint.py +106 -0
- causaganha-1.0.2/src/causaganha/consolidate/cli.py +481 -0
- causaganha-1.0.2/src/causaganha/consolidate/consolidation_manifest.py +124 -0
- causaganha-1.0.2/src/causaganha/consolidate/exporter.py +200 -0
- causaganha-1.0.2/src/causaganha/consolidate/manifest_reader.py +159 -0
- causaganha-1.0.2/src/causaganha/consolidate/ndjson_validator.py +124 -0
- causaganha-1.0.2/src/causaganha/consolidate/schema_registry.py +327 -0
- causaganha-1.0.2/src/causaganha/consolidate/transforms.py +413 -0
- causaganha-1.0.2/src/causaganha/consolidate/validation.py +483 -0
- causaganha-1.0.2/src/causaganha/consolidate/zip_processor.py +174 -0
- causaganha-1.0.2/src/causaganha/decisoes/__init__.py +21 -0
- causaganha-1.0.2/src/causaganha/decisoes/planner.py +130 -0
- causaganha-1.0.2/src/causaganha/decisoes/published.py +189 -0
- causaganha-1.0.2/src/causaganha/decisoes/search.py +367 -0
- causaganha-1.0.2/src/causaganha/pipeline/__init__.py +1 -0
- causaganha-1.0.2/src/causaganha/pipeline/ia_s3.py +301 -0
- causaganha-1.0.2/src/causaganha/processos/__init__.py +8 -0
- causaganha-1.0.2/src/causaganha/processos/cnj.py +60 -0
- causaganha-1.0.2/src/causaganha/processos/models.py +104 -0
- causaganha-1.0.2/src/causaganha/processos/query_plan_fixtures.py +153 -0
- causaganha-1.0.2/src/causaganha/processos/service.py +471 -0
- causaganha-1.0.2/src/causaganha/publicacoes/__init__.py +1 -0
- causaganha-1.0.2/src/causaganha/publicacoes/models.py +83 -0
- causaganha-1.0.2/src/causaganha/publicacoes/service.py +578 -0
- causaganha-1.0.2/src/causaganha/storage/__init__.py +1 -0
- causaganha-1.0.2/src/causaganha/storage/connection.py +64 -0
- causaganha-1.0.2/src/causaganha/storage/djen_schema.py +239 -0
- causaganha-1.0.2/src/causaganha.egg-info/PKG-INFO +289 -0
- causaganha-1.0.2/src/causaganha.egg-info/SOURCES.txt +189 -0
- causaganha-1.0.2/src/causaganha.egg-info/dependency_links.txt +1 -0
- causaganha-1.0.2/src/causaganha.egg-info/entry_points.txt +8 -0
- causaganha-1.0.2/src/causaganha.egg-info/requires.txt +22 -0
- causaganha-1.0.2/src/causaganha.egg-info/top_level.txt +10 -0
- causaganha-1.0.2/src/causaganha_mcp/__init__.py +3 -0
- causaganha-1.0.2/src/causaganha_mcp/__main__.py +34 -0
- causaganha-1.0.2/src/causaganha_mcp/_generated/__init__.py +0 -0
- causaganha-1.0.2/src/causaganha_mcp/_generated/domain_models.py +560 -0
- causaganha-1.0.2/src/causaganha_mcp/agents_examples.py +62 -0
- causaganha-1.0.2/src/causaganha_mcp/http_server.py +183 -0
- causaganha-1.0.2/src/causaganha_mcp/knowledge.py +55 -0
- causaganha-1.0.2/src/causaganha_mcp/processo_contract.py +214 -0
- causaganha-1.0.2/src/causaganha_mcp/profiles.py +98 -0
- causaganha-1.0.2/src/causaganha_mcp/py.typed +0 -0
- causaganha-1.0.2/src/causaganha_mcp/server.py +21 -0
- causaganha-1.0.2/src/causaganha_mcp/tools/__init__.py +1 -0
- causaganha-1.0.2/src/causaganha_mcp/tools/datajud.py +406 -0
- causaganha-1.0.2/src/causaganha_mcp/tools/datajud_processo.py +401 -0
- causaganha-1.0.2/src/causaganha_mcp/tools/decisoes.py +404 -0
- causaganha-1.0.2/src/causaganha_mcp/tools/djen_backup.py +100 -0
- causaganha-1.0.2/src/causaganha_mcp/tools/processo.py +309 -0
- causaganha-1.0.2/src/causaganha_mcp/tools/publicacoes.py +247 -0
- causaganha-1.0.2/src/causaganha_mcp/tools/status.py +554 -0
- causaganha-1.0.2/src/causaganha_mcp/tools/stj_acordaos.py +85 -0
- causaganha-1.0.2/src/causaganha_mcp/tools/tjro_juris.py +85 -0
- causaganha-1.0.2/src/causaganha_mcp/workflow_runs.py +172 -0
- causaganha-1.0.2/src/common/__init__.py +3 -0
- causaganha-1.0.2/src/common/relay.py +114 -0
- causaganha-1.0.2/src/datajud/__init__.py +6 -0
- causaganha-1.0.2/src/datajud/__main__.py +196 -0
- causaganha-1.0.2/src/datajud/archive.py +241 -0
- causaganha-1.0.2/src/datajud/client.py +377 -0
- causaganha-1.0.2/src/datajud/dedup.py +83 -0
- causaganha-1.0.2/src/datajud/manifest.py +132 -0
- causaganha-1.0.2/src/datajud/models.py +227 -0
- causaganha-1.0.2/src/datajud/process_service.py +62 -0
- causaganha-1.0.2/src/datajud/service.py +409 -0
- causaganha-1.0.2/src/datajud/state.py +314 -0
- causaganha-1.0.2/src/djen_backup/__init__.py +3 -0
- causaganha-1.0.2/src/djen_backup/__main__.py +646 -0
- causaganha-1.0.2/src/djen_backup/archive.py +289 -0
- causaganha-1.0.2/src/djen_backup/circuit_breaker.py +132 -0
- causaganha-1.0.2/src/djen_backup/credentials.py +48 -0
- causaganha-1.0.2/src/djen_backup/djen.py +259 -0
- causaganha-1.0.2/src/djen_backup/drain.py +246 -0
- causaganha-1.0.2/src/djen_backup/engine.py +755 -0
- causaganha-1.0.2/src/djen_backup/inventory.py +280 -0
- causaganha-1.0.2/src/djen_backup/manifest.py +911 -0
- causaganha-1.0.2/src/djen_backup/probe.py +216 -0
- causaganha-1.0.2/src/djen_backup/published.py +268 -0
- causaganha-1.0.2/src/djen_backup/py.typed +0 -0
- causaganha-1.0.2/src/djen_backup/retry.py +104 -0
- causaganha-1.0.2/src/djen_backup/segments.py +170 -0
- causaganha-1.0.2/src/djen_backup/service.py +182 -0
- causaganha-1.0.2/src/djen_backup/tribunais.py +58 -0
- causaganha-1.0.2/src/segmenter_dataset/__init__.py +8 -0
- causaganha-1.0.2/src/segmenter_dataset/__main__.py +176 -0
- causaganha-1.0.2/src/segmenter_dataset/candidate_mining.py +136 -0
- causaganha-1.0.2/src/segmenter_dataset/dataset_card.py +182 -0
- causaganha-1.0.2/src/segmenter_dataset/dedup.py +79 -0
- causaganha-1.0.2/src/segmenter_dataset/gates.py +135 -0
- causaganha-1.0.2/src/segmenter_dataset/iaa.py +262 -0
- causaganha-1.0.2/src/segmenter_dataset/ids.py +82 -0
- causaganha-1.0.2/src/segmenter_dataset/mechanical.py +215 -0
- causaganha-1.0.2/src/segmenter_dataset/model_eval.py +655 -0
- causaganha-1.0.2/src/segmenter_dataset/okf_markdown.py +147 -0
- causaganha-1.0.2/src/segmenter_dataset/ontology.py +153 -0
- causaganha-1.0.2/src/segmenter_dataset/opf_export.py +158 -0
- causaganha-1.0.2/src/segmenter_dataset/provenance.py +61 -0
- causaganha-1.0.2/src/segmenter_dataset/py.typed +0 -0
- causaganha-1.0.2/src/segmenter_dataset/region_eval.py +439 -0
- causaganha-1.0.2/src/segmenter_dataset/release.py +635 -0
- causaganha-1.0.2/src/segmenter_dataset/schemas.py +450 -0
- causaganha-1.0.2/src/segmenter_dataset/splits.py +508 -0
- causaganha-1.0.2/src/segmenter_dataset/store.py +969 -0
- causaganha-1.0.2/src/stj_acordaos/__init__.py +3 -0
- causaganha-1.0.2/src/stj_acordaos/__main__.py +178 -0
- causaganha-1.0.2/src/stj_acordaos/archive.py +124 -0
- causaganha-1.0.2/src/stj_acordaos/client.py +227 -0
- causaganha-1.0.2/src/stj_acordaos/dedup.py +76 -0
- causaganha-1.0.2/src/stj_acordaos/manifest.py +179 -0
- causaganha-1.0.2/src/stj_acordaos/service.py +314 -0
- causaganha-1.0.2/src/tcu_acordaos/__init__.py +21 -0
- causaganha-1.0.2/src/tcu_acordaos/acquisition.py +95 -0
- causaganha-1.0.2/src/tcu_acordaos/catalog.py +69 -0
- causaganha-1.0.2/src/tcu_acordaos/coverage.py +44 -0
- causaganha-1.0.2/src/tcu_acordaos/identity_candidates.py +100 -0
- causaganha-1.0.2/src/tcu_acordaos/ingest.py +174 -0
- causaganha-1.0.2/src/tcu_acordaos/materialize.py +80 -0
- causaganha-1.0.2/src/tcu_acordaos/publish.py +180 -0
- causaganha-1.0.2/src/tcu_acordaos/schema_diff.py +37 -0
- causaganha-1.0.2/src/tjro_juris/__init__.py +3 -0
- causaganha-1.0.2/src/tjro_juris/__main__.py +142 -0
- causaganha-1.0.2/src/tjro_juris/archive.py +161 -0
- causaganha-1.0.2/src/tjro_juris/client.py +301 -0
- causaganha-1.0.2/src/tjro_juris/crawler.py +463 -0
- causaganha-1.0.2/src/tjro_juris/dedup.py +46 -0
- causaganha-1.0.2/src/tjro_juris/manifest.py +107 -0
- causaganha-1.0.2/src/tjro_juris/service.py +400 -0
- causaganha-1.0.2/src/tse_processual/__init__.py +13 -0
- causaganha-1.0.2/src/tse_processual/acquisition.py +102 -0
- causaganha-1.0.2/src/tse_processual/catalog.py +57 -0
- causaganha-1.0.2/src/tse_processual/inspection.py +189 -0
- causaganha-1.0.2/src/tse_processual/profiling.py +241 -0
- causaganha-1.0.2/tests/test_canary_check.py +420 -0
- causaganha-1.0.2/tests/test_canary_heartbeat_check.py +51 -0
- causaganha-1.0.2/tests/test_candidates.py +218 -0
- causaganha-1.0.2/tests/test_catalog_parsing.py +286 -0
- causaganha-1.0.2/tests/test_check_agent_run_completeness.py +326 -0
- causaganha-1.0.2/tests/test_cobogo_core_adoption.py +55 -0
- causaganha-1.0.2/tests/test_consolidation.py +246 -0
- causaganha-1.0.2/tests/test_consolidation_manifest.py +164 -0
- causaganha-1.0.2/tests/test_contrast_ratios.py +128 -0
- causaganha-1.0.2/tests/test_data_contract_manifest.py +99 -0
- causaganha-1.0.2/tests/test_deployment_hygiene.py +31 -0
- causaganha-1.0.2/tests/test_ensemble_compare.py +50 -0
- causaganha-1.0.2/tests/test_exporter.py +73 -0
- causaganha-1.0.2/tests/test_footer_navigation.py +17 -0
- causaganha-1.0.2/tests/test_item_naming.py +14 -0
- causaganha-1.0.2/tests/test_keyword_classifier.py +290 -0
- causaganha-1.0.2/tests/test_llm_analyzer_key_rotation.py +70 -0
- causaganha-1.0.2/tests/test_ndjson_validator.py +123 -0
- causaganha-1.0.2/tests/test_notebooks_legacy_taxonomy.py +39 -0
- causaganha-1.0.2/tests/test_privacy_filter_segmenter.py +234 -0
- causaganha-1.0.2/tests/test_public_catalog_contract.py +33 -0
- causaganha-1.0.2/tests/test_reconcile_processos.py +732 -0
- causaganha-1.0.2/tests/test_reconstruct_regions.py +147 -0
- causaganha-1.0.2/tests/test_recurso_outcome_normalization.py +49 -0
- causaganha-1.0.2/tests/test_render_manifest_compaction.py +207 -0
- causaganha-1.0.2/tests/test_render_manifest_retry.py +158 -0
- causaganha-1.0.2/tests/test_render_manifest_writeback.py +148 -0
- causaganha-1.0.2/tests/test_render_queries.py +581 -0
- causaganha-1.0.2/tests/test_schema_registry.py +214 -0
- causaganha-1.0.2/tests/test_scripts_db_hygiene.py +24 -0
- causaganha-1.0.2/tests/test_segment_decision.py +134 -0
- causaganha-1.0.2/tests/test_tcu_acordaos_acquisition.py +101 -0
- causaganha-1.0.2/tests/test_tcu_acordaos_catalog.py +117 -0
- causaganha-1.0.2/tests/test_tcu_acordaos_coverage.py +57 -0
- causaganha-1.0.2/tests/test_tcu_acordaos_docs.py +63 -0
- causaganha-1.0.2/tests/test_tcu_acordaos_identity_candidates.py +146 -0
- causaganha-1.0.2/tests/test_tcu_acordaos_identity_investigation.py +160 -0
- causaganha-1.0.2/tests/test_tcu_acordaos_ingest.py +202 -0
- causaganha-1.0.2/tests/test_tcu_acordaos_materialize.py +88 -0
- causaganha-1.0.2/tests/test_tcu_acordaos_prove_bulk.py +62 -0
- causaganha-1.0.2/tests/test_tcu_acordaos_publish.py +163 -0
- causaganha-1.0.2/tests/test_tcu_acordaos_publish_teor.py +63 -0
- causaganha-1.0.2/tests/test_tcu_acordaos_schema_diff.py +38 -0
- causaganha-1.0.2/tests/test_update_catalog_workflow.py +92 -0
causaganha-1.0.2/LICENSE
ADDED
|
@@ -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
|
+

|
|
37
|
+

|
|
38
|
+

|
|
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
|
+

|
|
4
|
+

|
|
5
|
+

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