Experiment History

Complete record of all 29 enrichment optimization rounds

Each round tested on 10 Swedish companies. Composite score formula: extraction_rate×40 + min(avg_contacts/5,1)×20 + (1-FPR)×20 + email_coverage×10 + phone_coverage×10

Experiment Results Summary

TagDateScoreExtractionFPRAvg TimeCompaniesNotes
baseline46.760%37.5%10Initial config
jsonld-extraction65.480%6.3%10Added JSON-LD strategy
google-places-v22026-04-0276.180%23.4%24.7s10Enhanced Maps integration
jsonld-v22026-04-0281.690%21.2%19.4s10Best overall score
extraction-v72026-04-0263.750%21.4%43.8s10Production config
quick-test2026-04-0293.8100%0%26.6s1Single company (inviatech AB)
active-companies2026-04-0278.980%0%20.5s10Active company subset
final-clean2026-04-0276.770%0%28.0s10Clean run
db-companies2026-04-0210Real DB companies
current-test2026-04-0620.00%0%1.3s5Failed run (cache hit?)
current-test-32026-04-0650.767%0%23.5s3Partial test
stockholm-ab-v32026-04-02Stockholm subset
uppsala-ab-v22026-04-02Uppsala subset
email-association2026-04-02Email matching test

Key Learnings from Experiments

1. JSON-LD is the Biggest Quality Win

  • Round 1 added JSON-LD extraction: +18.7 composite score points vs baseline
  • jsonld-v2 achieved best-ever score: 81.6 (90% extraction, 21.2% FPR)
  • JSON-LD structured data (schema.org Person/Organization) is gold for contact extraction

2. Production Config Lags Best Config

MetricBest (jsonld-v2)Production (extraction-v7)Gap
Score81.663.7-17.9
Extraction90%50%-40%
FPR21.2%21.4%~same
Time19.4s43.8s+2.3x

Why the gap?

  • Production includes timeouts (konsultopia.se, frimedia.se)
  • One parked domain in test set
  • FPR still 21.4% — UI phrases slipping through name validation

3. False Positive Rate is the Hardest Problem

  • Best achieved: 0% (single well-structured site, quick-test)
  • jsonld-v2: 21.2% FPR
  • extraction-v7: 21.4% FPR
  • Root cause: UI phrases accepted as names (“Kontakta oss”, “Om oss”, etc.)
  • Fix is batchable: add UI phrases to INVALID_NAME_STANDALONE_WORDS

4. Name Validation Evolution

The blocklist has been refined through painful iteration:

ChangeReason
REMOVED ‘juni’, ‘juli’, ‘augusti’Too aggressive — blocked valid names like “Julia”
REMOVED ‘popular’, ‘cities’, ‘visit’Too aggressive — blocked valid names
REMOVED ‘hall’, ‘hallen’Valid Swedish surnames (e.g., “Rafaela Hall”)
REMOVED generic web/commerce wordsBlocked “Christoffersson”

Lesson: Aggressive blocklists hurt more than they help. Better to have 21% FPR than miss valid contacts.

5. Single-Company Best Case

  • quick-test on inviatech AB: 93.8 score, 100% extraction, 0% FPR, 26.6s
  • 32 contacts extracted from one company (best single result)
  • Shows the pipeline CAN achieve perfection on well-structured sites

6. Domain Discovery Accuracy

  • When contacts are found, domain accuracy is 100%
  • Domain discovery is NOT the bottleneck — contact extraction is
  • IIS .se zone registry (1.4M domains) + fuzzy matching works well

7. Time vs Quality Trade-off

  • jsonld-v2: 19.4s avg — fastest high-quality config
  • extraction-v7: 43.8s avg — slowest (includes Firecrawl fallback)
  • quick-test: 26.6s — single company baseline

Experiment System Architecture

FilePurpose
autoresearch/experiment.tsSingle-run experiment: domain discovery + Crawlee scraping
autoresearch/loop.tsAutonomous loop: run → analyze → suggest → repeat
autoresearch/loop-v2.tsProduction-style testing: real DB companies, all sources
autoresearch/loop-continuous.tsInfinite loop with live dashboard
autoresearch/analyze.tsResults analyzer: compare, rank, report, suggest
autoresearch/metrics.tsComposite score calculation
autoresearch/regression.test.tsGuards against quality degradation

Test Companies

10 Swedish companies with known domains:

  • More PR AB → morepr.se
  • VendFox AB → vendfox.se
  • Uppsala Innovation Centre AB → uic.se
  • Gordons Project AB → gordonsproject.se
  • Opusett AB → opusett.se
  • Ungdomsbarometern AB → ungdomsbarometern.se
  • Samkonsult AB → samkonsult.se
  • Navet Uppsala AB → navetuppsala.se
  • Aptus Uppsala AB → aptus.se
  • inviatech AB → inviatech.se (best performer)

Regression Tests

autoresearch/regression.test.ts guards against:

  • Name validation regressions (known valid/invalid names)
  • Role mapping regressions (known role → bucket mappings)
  • Must pass before any config change is committed

See also