# Changelog of CA DIR Registrations: Car Wash, Janitorial, Garment, Farm Labor (`overlookdata/ca-dir-registration-search`) Actor

- **URL**: https://apify.com/overlookdata/ca-dir-registration-search/changelog.md
- **Full Actor documentation**: https://apify.com/overlookdata/ca-dir-registration-search.md

## Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

### \[0.5.0] - 2026-09-03

#### Changed

- Actor description now says "one deduplicated dataset" instead of "one
  verified dataset". "Verified" implies independent validation of registrant
  data that the actor does not perform (it verifies its own sweep coverage
  against the site's counts, which is a different claim); the wording also
  broke the overlookdata.com build, which rejects that word in product copy.
  `actor.json` version synced to 0.5.

### \[0.4.0] - 2026-08-23

#### Added

- Store icon assets (Golden Seal, "CA / Registrations") at
  `docs/assets/icon-golden-seal.{svg,png}`. `actor.json` version synced to 0.4.

### \[0.3.0] - 2026-08-23

#### Changed

- Actor description shortened to 300 characters or fewer; `apify push`
  rejects longer descriptions with "Description must be at most 300
  characters long". `actor.json` version synced to 0.3.

### \[0.2.0] - 2026-08-23

#### Changed

- Actor title shortened to "CA DIR Registrations: Car Wash, Janitorial, Garment,
  Farm Labor" (63 characters) so `apify push` accepts it; the platform rejects
  longer titles with "Actor name must be at most 63 characters long". The full
  list of the six registration types stays in the README and description.
  `actor.json` version synced to 0.2.

### \[0.1.0] - 2026-08-22

#### Added

- Visualforce JavaScript Remoting client for the DIR Registration Search:
  bootstrap parser that lifts the remoting context out of the results page,
  request builder for the 19 positional search arguments, and a response
  parser that decodes the remoting reference encoding (`{"s","v"}` /
  `{"ref"}`), nested at any depth.
- Date-sliced sweep across all six registration types (Car Wash, Farm Labor
  Contractor, Garment Manufacturers and Contractors, Janitorial, Talent
  Agency, Entertainment Permit to Employ Minors), one effective-date year
  slice at a time, with per-type record deduplication by Salesforce ID.
- Self-verification: an optional second sweep by expiration date, compared
  against the effective-date sweep per type inside the window both sweeps could
  see (records effective before the first swept year, or with no expiration
  date or one beyond the check window, are counted separately and do not flip
  the match). Written to the `VERIFICATION` key-value record with counts,
  slices fetched and split, failing slices, the IDs found by only one sweep,
  and the sweep window.
- Union output: registrations found only by the expiration-date sweep (DIR has
  a live record whose effective date is typed as the year 2120) are merged into
  the dataset and counted as `merged_from_check`.
- Response-cap handling: a slice that returns DIR's 15 MB
  `statusCode 414` is halved and re-fetched down to single days, with the
  split count reported. `Too many query rows` and unrecoverable slices are
  recorded as errors without aborting the sweep.
- Session recovery: a remoting call that comes back as HTML or with an
  unexpected status code re-bootstraps the remoting context once and retries
  the slice before giving up. A type whose bootstrap fails is recorded as an
  error and the remaining types still sweep; no failure inside a slice can
  abort the run.
- Async client (httpx) with semaphore-bounded concurrency, per-request
  politeness delay, 3 attempts with exponential backoff on 5xx, timeouts, and
  transport errors, and an identifying User-Agent.
- Two output modes: `registrants` (one record per DIR account, with all
  registrations, the newest per type, and `has_active_registration`) and
  `registrations` (one flat record per registration). Client-side status
  filtering drops registrations and drops registrants left with none.
- Optional detail-page enrichment: main location, branch locations, DBA
  names, and bond history, parsed around the stray inline scripts DIR renders
  inside its table cells.
- Apify actor wrapper (`src/main.py`), local CLI runner (`src/cli.py`), input,
  dataset and output schemas, and an offline pytest suite against saved
  fixtures for all six types.
