==================================================== TDD: Filtros 'sem' com semântica AND — designar_unificado.js ==================================================== ✅ [PASS] designar_unificado.js deve existir e ser legível --- 1. recomputeFilterSets: definição e atribuições --- ✅ [PASS] Deve existir o método recomputeFilterSets ✅ [PASS] recomputeFilterSets deve atribuir semBarrasIds a partir de !p.codigo_barras ❌ [FAIL] recomputeFilterSets deve atribuir semCubagemIds a partir de !p.cubagem || p.cubagem == 0 ❌ [FAIL] recomputeFilterSets deve atribuir semPesoIds a partir de !p.peso || p.peso == 0 ✅ [PASS] recomputeFilterSets deve atribuir semEnderecoIds a partir de !p.localizacao --- 2. recomputeFilterSets chamado no init (não inline) --- ✅ [PASS] init deve chamar this.recomputeFilterSets() ✅ [PASS] O bloco init não deve mais ter new Set() inline (deve delegar a recomputeFilterSets) --- 3. recomputeFilterSets chamado na troca de tab --- ✅ [PASS] Troca de tab deve chamar State.recomputeFilterSets() após atualizar rawPrimaryData --- 4. Semântica AND: cada filtro é um return false independente --- ✅ [PASS] AND: filter.semCodigoBarras verifica State.semBarrasIds e retorna false isoladamente ✅ [PASS] AND: filter.semCubagem verifica State.semCubagemIds e retorna false isoladamente ✅ [PASS] AND: filter.semPeso verifica State.semPesoIds e retorna false isoladamente ✅ [PASS] AND: filter.semEndereco verifica State.semEnderecoIds e retorna false isoladamente ✅ [PASS] Todos os 4 checks de filtro devem existir no arquivo ✅ [PASS] Os checks devem estar na ordem: barras → cubagem → peso → endereço (sequencial/AND) ✅ [PASS] O bloco dos 4 checks NÃO deve conter || (seria OR; deve ser AND sequencial) --- 5. Early-exit só bypassa quando NENHUM filtro está ativo (AND correto) --- ✅ [PASS] Early-exit usa && entre todos os !filter.semX (só sai cedo se TODOS inativos) ==================================================== RESULTADO GERAL: ❌ FALHA Passou: 15 Falhou: 2 ====================================================