{
  "title": "Track published WARN notices — settings",
  "description": "For workforce researchers and company watchlists, collect official WARN notice observations and compare revisions to the same source record. Read bounded official Oregon and Texas WARN indexes, preserve notice/effective-date semantics, and optionally compare source-record revisions. No credentials.",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "states": {
      "title": "Supported state sources",
      "type": "array",
      "editor": "json",
      "description": "OR and/or TX only. Empty or omitted selects Oregon. This is source coverage, not a claim of all layoffs in either state. Oregon City values may be corporate locations.",
      "default": [
        "OR"
      ],
      "prefill": [
        "OR"
      ],
      "sectionCaption": "State and inspected window"
    },
    "maxResults": {
      "title": "Maximum saved notices",
      "type": "integer",
      "description": "Global saved-observation cap across selected states. Results are sorted by each source's notice date within the inspected page window. Later runs may emit previously unsaved records.",
      "default": 10,
      "minimum": 1,
      "maximum": 1000
    },
    "maxSourcePages": {
      "title": "Source pages inspected per state",
      "type": "integer",
      "description": "Bounded inspection window per selected source. OR currently returns 20 records/page and TX uses 100. Filters apply only to this inspected window; increase to search older records.",
      "default": 1,
      "minimum": 1,
      "maximum": 20
    },
    "companyNames": {
      "title": "Published employer name contains",
      "type": "array",
      "editor": "json",
      "description": "Up to 30 case-insensitive employer-name fragments, matched with OR logic within the inspected pages. Empty means no name filter. No parent-company/entity inference.",
      "default": []
    },
    "noticeDateFrom": {
      "title": "Source notice date — from",
      "type": "string",
      "editor": "textfield",
      "description": "Optional inclusive YYYY-MM-DD. OR uses published Notification Date; TX uses receipt of employer notice. This is not a publication-date or effective-layoff-date filter."
    },
    "noticeDateTo": {
      "title": "Source notice date — through",
      "type": "string",
      "editor": "textfield",
      "description": "Optional inclusive YYYY-MM-DD on source notice date. Must not precede noticeDateFrom. Dates are calendar dates without an inferred timezone."
    },
    "minAffectedWorkers": {
      "title": "Minimum reported affected workers",
      "type": "integer",
      "description": "Minimum published affected-worker count. Zero includes unknown counts. Counts are reported notices, not confirmed completed layoffs or unique people.",
      "default": 0,
      "minimum": 0,
      "maximum": 10000000
    },
    "comparePrevious": {
      "title": "Compare saved observations",
      "type": "boolean",
      "description": "Compare each source record with its last saved observation in this snapshot. First observations are emitted. Source failures or rejected output do not advance history. One writer per snapshotName.",
      "default": false,
      "sectionCaption": "Saved comparisons"
    },
    "onlyChanges": {
      "title": "Only first or changed observations",
      "type": "boolean",
      "description": "Enables comparison and skips unchanged notices. The first run emits matching inspected records; later runs may legitimately return zero. Missing records never imply deletion.",
      "default": false
    },
    "snapshotName": {
      "title": "Comparison history name",
      "type": "string",
      "editor": "textfield",
      "description": "1–80 letters, digits, underscore or hyphen. Reuse the same name to compare source IDs across runs; only one concurrent writer per name. Invalid history is preserved.",
      "default": "default"
    },
    "maxRunSeconds": {
      "title": "Run time budget (seconds)",
      "type": "integer",
      "description": "Own wall-clock budget; all source requests/retries are constrained to remaining time. A platform deadline reserve of 25 seconds also applies. Early stops are recorded in SUMMARY.",
      "default": 240,
      "minimum": 30,
      "maximum": 900,
      "sectionCaption": "Run budget"
    }
  }
}
