Known Issues

Real problems, not hypothetical risks. P0 items must be fixed before any production use.

Source: docs/SYSTEM_OVERVIEW.md § Known issues.

P0 — Reklamspärr gate not in queue workers

src/queues/workers.ts does not call isScbAdvertisingBlocked(). The check exists in enrichV7() but the worker enqueues the job before that runs. Companies with advertising_block = true get enriched. GDPR compliance gap. See Reklamspärr, Pipeline.

P0 — Article 14 trigger fires at export, not collection

src/api/export.ts fires Article 14 notifications at export time. Legal obligation is within one month of collection. These are different events. Trigger must move to Update_Job. See Article 14.

P0 — Validation layers are random

// src/mocks/validation.ts — imported by production code
export function validateLayer_Registry(orgNr: string): boolean {
  return Math.random() > 0.5;
}

The four validation layers (Registry, Website, Profiles, News) were scaffolded as mocks and never replaced. Production worker imports from this file. The is_validated field in leads is meaningless until replaced.

P1 — False positive rate at 21.4% in production config

Current extraction-v7 config lets UI phrases through Name Validation: “OSS FÖR”, “LÅT OSS”, “Send Message”, “Best Sellers”, “Plesk Setup Guide”, “Not Found”, “Log In”, “Adding Domains”. Fix: batch additions to INVALID_NAME_STANDALONE_WORDS (see Blocklists). Best achieved FPR is 0% (quick-test), 2.6% (jsonld-v2). See Experiment Results.

P1 — Playwright runs synchronously in BullMQ worker

Each enrichment job spins up Chromium inline in the worker thread. At >40 concurrent jobs this OOMs or deadlocks. Playwright must be decoupled into its own worker pool before scaling. See Pipeline.

P2 — Still using pg.Pool and ioredis

Several files use pg.Pool / ioredis instead of Bun.sql / Bun.redis. Project CLAUDE.md says not to. Two connection pools, inconsistent error handling. See Stack.

P2 — No circuit breaker on external calls

If Google Places returns 429s or times out, the enrichment job fails entirely. No retry-with-backoff or graceful partial-result fallback.

Won’t fix / won’t change

  • Serper removed — LinkedIn/news signals gone. ToS issues + exhausted credits.
  • Bolagsverket Öppet API — IP-blocked. Cannot get board member fallback until whitelisted.
  • ABPI.se — has VD/board/phone data but ToS unclear for commercial use.
  • allabolag.se / ratsit.se / proff.se — in Domain Blocklist; ToS prohibits commercial extraction.

See also

System Overview, Pipeline, Reklamspärr, Article 14, Name Validation, Experiment Results.