autoresearch/results/ mixes three structurally distinct artefact families. Knowing which is which matters when scripting against the directory or comparing scores.

Type A — Single-shot experiment summary

Produced by autoresearch/experiment.ts. One file per --tag invocation, named <tag>.json. Shape (key fields):

{ "tag": "jsonld-v2", "timestamp": "2026-04-02T15:59:52.531Z",
  "total_companies": 10, "companies_with_contacts": 9, "extraction_rate": 0.9,
  "total_contacts": 52, "avg_contacts": 5.2, "valid_names": 41,
  "false_positive_rate": 0.21, "contacts_with_email": 38, ... }

Examples: jsonld-v2.json, google-places-v2.json, extraction-v7.json, stockholm-ab-v3.json, uppsala-ab-v2.json, final-clean.json, email-association.json, db-companies.json, active-companies.json. Most files in the directory are this type. The composite-score formula in Autoresearch Loop is computed from this shape.

Type B — Smoke / regression snapshot

Same shape as Type A but written by ad-hoc test runs (often n=1 or n=3) rather than a tagged experiment round. They look identical structurally but are not part of the 29-round progression.

Examples: current-test.json, current-test-3.json, fixed-test.json, quick-test.json, latest.json.

latest.json is a copy of the most recent run regardless of tag — do not treat it as a fixed reference point.

Type C — Append-only history log (*.jsonl)

JSON Lines, one record per line. Two files in this family.

history.jsonl

Written by experiment.ts. One line per completed tag, slim summary suitable for time-series analysis:

{"tag":"quick-test","timestamp":"2026-04-06T03:18:43.135Z","composite_score":93.8,"extraction_rate":1,"total_contacts":21,"false_positive_rate":0,"avg_time_seconds":26.637}

continuous-history.jsonl (new, 2026-04-06)

Written by loop-continuous.ts. One line per company test rather than per tag — much higher cardinality. Schema is per-source rather than per-experiment:

{
  "org_nr": "5562745926",
  "name": "Ren Jämt i Uppsala AB",
  "city": "Uppsala",
  "domain": "renjamt.se",
  "domain_time_ms": 0,
  "crawlee":   { "contacts": 9, "emails": 7, "phones": 8, "time_ms": 19386 },
  "firecrawl": { "contacts": 0, "emails": 0, "phones": 0, "time_ms": 0 },
  "maps":      { "contacts": 1, "emails": 0, "phones": 1, "time_ms": 252 },
  "best_source": "crawlee",
  "total_contacts": 10,
  "timestamp": "2026-04-06T03:47:31.080Z"
}

Use this when you need to compare sources head-to-head or track per-company drift over time, not when you want a roll-up score.

How to tell them apart in scripts

  • File extension .json and contains "tag":"..." and "total_companies":N → Type A or B.
  • File extension .jsonl → Type C, parse line by line.
  • total_companies <= 3 → most likely Type B (smoke), excluded from aggregate stats.
  • Presence of nested crawlee / firecrawl / maps keys → only continuous-history.jsonl.

See also

Autoresearch Loop, Experiment Results, Crawlee Scraper, Firecrawl, Google Places.