Contexto (verificado contra origin/main)
config/plugin_validator.py:51 _has_nested_quantifier = heurística ReDoS de #829 (star-height>1: pega (a+)+, ([a-z]+)*). Aplicada em 2 camadas: core/detector.py:766 (load de regex_overrides_file) + config/plugin_validator.py:362 (schema de plugin).
⚠️ Severidade P3 (honesta): o caminho de dado do CLIENTE usa só DEFAULT_PATTERNS (core/detector.py:84), provadamente lineares — cobertos pela regressão tests/test_redos_guard.py:164 (test_default_patterns_pass_redos_guard). O vetor residual é regex_overrides_file (pack de 3º carregado pelo operador), NÃO input remoto de cliente. Esta issue não reabre #829; liga o épico #865 (Plugin SDK L1/L2/L3).
Lacuna confirmada EMPIRICAMENTE (rodando a função real do repo)
_has_nested_quantifier("(a+)+") -> True (pego)
_has_nested_quantifier("([a-z]+)*") -> True (pego)
_has_nested_quantifier("(a|a)*") -> False (NÃO pego — ReDoS real)
_has_nested_quantifier("(a|ab)*c") -> False (NÃO pego — ReDoS real)
Alternância ambígua sob quantificador não tem "quantificador aninhado" → a heurística não marca, mas é backtracking exponencial clássico.
Correção do draft original: o exemplo a{1,1000}{1,1000} não é lacuna — o Python re já rejeita como "multiple repeat" (re.error), então o try: re.compile / except descarta.
Tarefa A — fortalecer L1 (independe do #865)
Tarefa B — requisito p/ L2/L3 (dentro do #865)
Aceite
- A: cobertura de
_has_nested_quantifier p/ alternância ambígua documentada (teste presente) + decisão de timeout registrada.
- B: requisito de regex-runtime não-confiável citado no desenho final de L2/L3, com ADR.
Fora de escopo: reabrir #829; implementar #865 (só adiciona requisito ao escopo existente).
Proveniência: triado do pack round-2 redos — verificado empiricamente 01-jul (auditor RO).
Contexto (verificado contra origin/main)
config/plugin_validator.py:51_has_nested_quantifier= heurística ReDoS de #829 (star-height>1: pega(a+)+,([a-z]+)*). Aplicada em 2 camadas:core/detector.py:766(load deregex_overrides_file) +config/plugin_validator.py:362(schema de plugin).DEFAULT_PATTERNS(core/detector.py:84), provadamente lineares — cobertos pela regressãotests/test_redos_guard.py:164(test_default_patterns_pass_redos_guard). O vetor residual éregex_overrides_file(pack de 3º carregado pelo operador), NÃO input remoto de cliente. Esta issue não reabre #829; liga o épico #865 (Plugin SDK L1/L2/L3).Lacuna confirmada EMPIRICAMENTE (rodando a função real do repo)
Alternância ambígua sob quantificador não tem "quantificador aninhado" → a heurística não marca, mas é backtracking exponencial clássico.
Correção do draft original: o exemplo
a{1,1000}{1,1000}não é lacuna — o Pythonrejá rejeita como"multiple repeat"(re.error), então otry: re.compile / exceptdescarta.Tarefa A — fortalecer L1 (independe do #865)
tests/test_redos_guard.pyp/ alternância ambígua ((a|a)*,(a|ab)*c) — documentar se é known-gap-aceito ou a-corrigir._has_nested_quantifierp/ alternância com ramos sobrepostos sob quantificador (ou avaliarregex/re2só p/ o caminho não-confiável).Tarefa B — requisito p/ L2/L3 (dentro do #865)
Aceite
_has_nested_quantifierp/ alternância ambígua documentada (teste presente) + decisão de timeout registrada.Fora de escopo: reabrir #829; implementar #865 (só adiciona requisito ao escopo existente).
Proveniência: triado do pack round-2
redos— verificado empiricamente 01-jul (auditor RO).