Pular para o conteúdo

Convencoes de Codigo

Padroes e convencoes para todas as contribuicoes de codigo e knowledge base ao Douto. Extraidos do CLAUDE.md e aplicados durante code review.

Quando principios conflitam, priorizar nesta ordem:

PrioridadePrincipioNa Pratica
1CorretudeDados juridicos, citacoes e metadados devem ser precisos. Uma classificacao errada de instituto e pior do que uma consulta lenta.
2Simplicidade e clarezaCodigo que outro agente (ou um humano daqui a seis meses) entende sem contexto. Nada de truques engenhosos.
3ManutenibilidadeFacil de alterar sem quebrar. Funcoes pequenas, interfaces claras, acoplamento minimo entre scripts.
4ReversibilidadePreferir decisoes que possam ser desfeitas. Usar --dry-run, manter dados originais, evitar operacoes destrutivas.
5PerformanceSo otimizar quando houver evidencia de problema. Nunca sacrificar corretude ou clareza por velocidade.
  • Python 3.10+ — necessario para sintaxe moderna de type hints
  • Type hints sao obrigatorios em todas as funcoes publicas
  • async/await apenas onde necessario (LlamaParse). O pipeline e majoritariamente sincrono.
  • Testes: pytest (quando implementados)
  • Linting: ruff (quando configurado)
ConvencaoRegraExemplo
Funcoes/variaveissnake_caseparse_frontmatter(), chunk_text
ConstantesUPPER_SNAKE_CASEMAX_CHUNK_CHARS, MODEL_NAME
Type hintsSintaxe modernatuple[dict, str], nao Tuple[Dict, str]
Formatacao de stringsf-strings preferencialmentef"Processed {count} chunks"
Importsstdlib, depois third-party, depois local, separados por linhas em brancoVeja abaixo
Tamanho de linhaSeguir defaults do ruff (quando configurado)~88 caracteres
# Import order example
import os
import json
import re
from pathlib import Path
import numpy as np
from sentence_transformers import SentenceTransformer
from pipeline.utils import parse_frontmatter, slugify
  • Excecoes especificas — nunca usar except Exception as e generico. Capturar o tipo de erro especifico.
  • Logar com contexto — incluir doc_id, chunk_id e traceback ao logar erros.
  • Falhar ruidosamente — se um chunk esta corrompido, logar e pular em vez de produzir lixo silenciosamente.

Obrigatorias para todas as funcoes publicas. Usar formato Google-style:

def parse_frontmatter(content: str) -> tuple[dict, str]:
"""Parse YAML frontmatter and body from a markdown string.
Args:
content: Full markdown content with optional frontmatter.
Returns:
Tuple of (metadata dict, body text without frontmatter).
If no frontmatter found, returns ({}, original content).
"""

Todo script do pipeline deve seguir estes padroes:

FuncionalidadeImplementacaoProposito
--helpargparseDocumentar uso via CLI
--dry-runVerificar antes de gravarMostrar o que aconteceria sem modificar dados
--forcePular verificacoes de idempotenciaReprocessar itens ja completos
IdempotenteMarcadores de processamento, logica de skipSeguro para re-executar sem efeitos colaterais
Logging estruturadoAppend em processing_log.jsonlRastrear sucessos, erros, skips
# CORRECT: use os.environ.get() with documented fallback
VAULT_PATH = Path(os.environ.get("VAULT_PATH", "/default/fallback/path"))
# INCORRECT: hardcoded absolute path
VAULT_PATH = Path("/home/sensd/.openclaw/workspace/vault")
# CORRECT: relative to script location
PROMPT_PATH = Path(__file__).parent / "enrich_prompt.md"
  • JSON para output de dados (embeddings, corpus, BM25 index)
  • YAML frontmatter para metadados em chunks markdown
  • JSONL para logs estruturados (append-only)
  • Output de progresso vai para stderr; resultados vao para stdout

Nao executar processos que consumam mais de 50% de CPU localmente. Para validacao:

Terminal window
python3 pipeline/rechunk_v3.py --limit 5 --dry-run # test with small subset
  • Fonte de verdade para dominios e navegacao
  • Lista todos os 8 dominios juridicos com wikilinks para seus MOCs
  • Deve ser atualizado ao adicionar novos dominios

Campos obrigatorios no frontmatter:

---
type: moc
domain: civil
description: "Obrigacoes, contratos, responsabilidade civil, propriedade"
---

Campos obrigatorios no frontmatter:

---
knowledge_id: "contratos-orlando-gomes-cap05-001"
tipo: chunk
titulo: "Titulo do chunk"
livro_titulo: "Contratos"
autor: "Orlando Gomes"
area_direito: civil
status_enriquecimento: completo # "completo" | "pendente" | "lixo"
---

Regras:

  • Chunks com status_enriquecimento: "completo" devem ter instituto e tipo_conteudo preenchidos
  • Nunca sobrescrever chunks enriquecidos sem --force explicito
  • Nunca deixar status_enriquecimento: "pendente" apos execucao do enriquecimento
  • Usar "lixo" para chunks ruidosos (prefacios, agradecimentos, fichas catalograficas)
  • Sempre usar wikilinks: [[MOC_CIVIL]]
  • Nunca usar links relativos markdown: [text](../mocs/MOC_CIVIL.md)
  • Wikilinks habilitam o graph view e o rastreamento de backlinks no Obsidian
  • UTF-8 para todos os arquivos
  • Quebras de linha LF (estilo Unix)
RegraDetalhe
Modelo unicorufimelo/Legal-BERTimbau-sts-base (768-dim)
NormalizacaoSempre normalize_embeddings=True para cosine similarity
Composicao de textoUsar compose_embedding_text() — nunca fazer embedding de texto bruto do chunk
Nomenclatura de outputembeddings_{area}.json, search_corpus_{area}.json, bm25_index_{area}.json
CompatibilidadeOutput deve ser compativel com a infraestrutura do Valter/Juca

O formato do texto composto:

[categoria | instituto_1, instituto_2 | tipo_conteudo | titulo | corpo]

Isso garante que o embedding capture tanto o contexto de metadados quanto o conteudo real.

feat/SEN-XXX-description # nova feature vinculada a issue do Linear
fix/SEN-XXX-description # bug fix vinculado a issue do Linear
docs/description # alteracoes de documentacao
refactor/description # reestruturacao de codigo

Adicionar sufixo -claude para branches criadas pelo Claude Code, -codex para branches criadas pelo Codex.

Seguir o formato Conventional Commits:

feat: add bibliography detection to rechunker
fix: handle colons in frontmatter values
docs: update environment variable reference
refactor: extract parse_frontmatter to utils.py
test: add fixtures for smart_split edge cases
chore: pin dependency versions

Incluir a referencia do ticket Linear quando aplicavel:

feat: standardize env vars across pipeline -- SEN-358

Quando commits sao produzidos com assistencia de IA:

Co-Authored-By (execucao): Claude Opus 4.6 <noreply@anthropic.com>

O termo (execucao) indica que a IA auxiliou na implementacao. Toda concepcao, arquitetura, decisoes de produto e propriedade intelectual pertencem ao dono do projeto.

  • Arquivos .env ou API keys
  • Arquivos JSON de embeddings (muito grandes, artefatos gerados)
  • Diretorios __pycache__/
  • Pesos de modelo ou cache do HuggingFace
  • Node modules (caso alguma ferramenta frontend seja adicionada)

Nao fazer o seguinte sem autorizacao explicita:

Non-goalRazao
Introduzir abstracoes sem necessidade claraSimplicidade acima de elegancia
Adicionar dependencias para problemas ja resolvidos no codebaseMinimizar superficie de dependencias
Refatorar codigo funcionando sem issue especificaSe funciona, nao mexa
Otimizar sem evidencia de problemas de performanceOtimizacao prematura e a raiz de todo mal
Expandir escopo alem da issue sendo trabalhadaManter o foco
Criar API/MCP server antes do pipeline estar estavelFundacao antes de features
Gerenciar casos (trabalho do Joseph)O escopo do Douto e apenas doutrina
Buscar jurisprudencia (trabalho do Juca/Valter)O escopo do Douto e apenas doutrina
Buscar legislacao (trabalho da Leci)O escopo do Douto e apenas doutrina
Gerenciar infraestrutura (trabalho do Valter)Douto e um pipeline de processamento, nao um servico