Root cause
core/database.py defines pattern_detected and norm_tag as String(100) in both DatabaseFinding and FilesystemFinding.
In worst case (all default patterns matching + DOB_POSSIBLE_MINOR suffix + custom patterns), the concatenated pattern_detected and norm_tag strings can exceed 100 chars:
# Simulação: todos os padrões default + minor
pattern_detected = "LGPD_CPF, LGPD_CNPJ, LGPD_CNPJ_ALNUM, EMAIL, CREDIT_CARD, PHONE_BR, CCPA_SSN, DATE_DMY, DOB_POSSIBLE_MINOR, SUGGESTED_REVIEW"
# → 124 chars
norm_tag = "LGPD Art. 5; GDPR Art. 4(1); PCI/GLBA; CCPA; Personal data context; LGPD Art. 14 – possible minor data; GDPR Art. 8; Suggested review"
# → 133 chars
SQLite hoje: não enforça VARCHAR length — armazena sem truncar. Sem bug em runtime atual.
Risco:
- Migração futura para PostgreSQL/MySQL quebraria com
StringDataRightTruncationError em qualquer finding com múltiplos patterns
- O schema documentado no código (
String(100)) é enganoso para quem audita o schema
- Additive migration: novos
_ensure_* já existem para colunas extras; alargar via ALTER seria trivial
Fix sugerido
# core/database.py — DatabaseFinding e FilesystemFinding
pattern_detected = Column(String(500)) # era String(100)
norm_tag = Column(String(500)) # era String(100)
Aplicar additive migration para DBs existentes:
def _ensure_wide_pattern_columns(self) -> None:
"""Widen pattern_detected and norm_tag for multi-pattern findings (no-op when already wide or SQLite)."""
# SQLite ignores VARCHAR width at runtime; this migration is a no-op today
# but documents the intended schema width for future RDBMS migrations.
pass # No ALTER needed for SQLite; update column def in ORM only
Para SQLite: apenas atualizar a definição ORM (SQLite não usa a largura). Para futuros RDBMS: adicionar ALTER TABLE ... MODIFY COLUMN na migration.
Arquivos afetados
core/database.py: linhas 76-77 (DatabaseFinding) e 93-94 (FilesystemFinding)
- Nenhuma migração de dado necessária para SQLite
Critério de aceite
grep "String(100).*pattern_detected\|String(100).*norm_tag" core/database.py → 0 hits
pytest tests/test_database.py verde
- Nenhuma regressão em
tests/test_report_*.py
Ritual
- Commit:
fix(database): widen pattern_detected and norm_tag to String(500) (#515)
check-all gate → CI → PR/merge junto com outro fix de baixo risco
Out of scope
- Migração de RDBMS
- Mudanças na lógica de detector ou join de patterns
P3 — não bloqueia v1.7.4. Aberto por Claude (auditor READ-ONLY). Execução: Cursor.
Root cause
core/database.pydefinespattern_detectedandnorm_tagasString(100)in bothDatabaseFindingandFilesystemFinding.In worst case (all default patterns matching +
DOB_POSSIBLE_MINORsuffix + custom patterns), the concatenatedpattern_detectedandnorm_tagstrings can exceed 100 chars:SQLite hoje: não enforça VARCHAR length — armazena sem truncar. Sem bug em runtime atual.
Risco:
StringDataRightTruncationErrorem qualquer finding com múltiplos patternsString(100)) é enganoso para quem audita o schema_ensure_*já existem para colunas extras; alargar via ALTER seria trivialFix sugerido
Aplicar additive migration para DBs existentes:
Para SQLite: apenas atualizar a definição ORM (SQLite não usa a largura). Para futuros RDBMS: adicionar
ALTER TABLE ... MODIFY COLUMNna migration.Arquivos afetados
core/database.py: linhas 76-77 (DatabaseFinding) e 93-94 (FilesystemFinding)Critério de aceite
grep "String(100).*pattern_detected\|String(100).*norm_tag" core/database.py→ 0 hitspytest tests/test_database.pyverdetests/test_report_*.pyRitual
fix(database): widen pattern_detected and norm_tag to String(500) (#515)check-allgate → CI → PR/merge junto com outro fix de baixo riscoOut of scope
P3 — não bloqueia v1.7.4. Aberto por Claude (auditor READ-ONLY). Execução: Cursor.