{
  "title": "Federal Infrastructure Milestone Monitor",
  "type": "object",
  "schemaVersion": 1,
  "description": "Choose a focused watchlist, then run a small sample. Saved comparisons are optional; the output keeps official source dates and links.",
  "properties": {
    "sectors": {
      "title": "Project sectors",
      "type": "array",
      "description": "Exact official sector names. Default Mining; examples include Electricity Transmission, Manufacturing, Energy Storage and Renewable Energy Production. Empty includes every sector.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "default": [
        "Mining"
      ],
      "prefill": [
        "Mining"
      ],
      "sectionCaption": "Choose your project watchlist"
    },
    "categories": {
      "title": "Dashboard categories",
      "type": "array",
      "description": "Exact source categories: FAST-41 Covered Projects, FAST-41 Transparency Projects, DOT Projects or Other Projects. Empty includes all four.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "default": [
        "FAST-41 Covered Projects",
        "FAST-41 Transparency Projects"
      ],
      "prefill": [
        "FAST-41 Covered Projects",
        "FAST-41 Transparency Projects"
      ]
    },
    "projectStatuses": {
      "title": "Project status",
      "type": "array",
      "description": "Exact published status values: In Progress, Planned, Paused, Complete, Cancelled or Class of Action Changed. Empty includes all statuses.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "default": [
        "In Progress"
      ],
      "prefill": [
        "In Progress"
      ]
    },
    "projectIds": {
      "title": "Official project IDs",
      "type": "array",
      "description": "Optional numeric dashboard project IDs. Existing sector, category and status filters still apply.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "prefill": []
    },
    "states": {
      "title": "States",
      "type": "array",
      "description": "Optional exact two-letter state values in the source. Multi-state or missing state entries do not match a single-state filter.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "prefill": []
    },
    "keywords": {
      "title": "Keyword evidence",
      "type": "array",
      "description": "Optional literal terms matched without case sensitivity in project names and selected published text. Any term may match. For the milestone Actor, filtering applies only inside the selected source window.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "prefill": []
    },
    "maxResults": {
      "title": "Maximum saved observations",
      "type": "integer",
      "description": "Maximum confirmed dataset rows. Unchanged rows skipped by changes-only mode do not consume this limit.",
      "default": 5,
      "prefill": 5,
      "minimum": 1,
      "maximum": 5000
    },
    "comparePrevious": {
      "title": "Compare with saved observations",
      "type": "boolean",
      "description": "Use a named history store. The first observation is new and is saved as a baseline only after a confirmed dataset write. Use one writer per snapshot name.",
      "default": false,
      "prefill": false,
      "sectionCaption": "Saved comparisons"
    },
    "onlyChanges": {
      "title": "Save only new or changed observations",
      "type": "boolean",
      "description": "Requires comparison. A repeated unchanged window can validly save zero rows. Do not enable for a nonempty health sample.",
      "default": false,
      "prefill": false
    },
    "snapshotName": {
      "title": "Snapshot name",
      "type": "string",
      "editor": "textfield",
      "description": "History namespace (1–40 letters, numbers, underscores or hyphens). Reuse it to compare; choose a fresh name to start separately. Never schedule overlapping writers.",
      "default": "default",
      "prefill": "default",
      "pattern": "^[-a-zA-Z0-9_]{1,40}$"
    },
    "maxSourceEntries": {
      "title": "Source window size",
      "type": "integer",
      "description": "Maximum source milestones fetched before optional keyword filtering, ordered by project/action/milestone ID. A bounded window is not complete project history.",
      "default": 100,
      "prefill": 100,
      "minimum": 1,
      "maximum": 10000,
      "sectionCaption": "Advanced limits"
    },
    "maxRunSeconds": {
      "title": "Run time budget (seconds)",
      "type": "integer",
      "description": "Own wall-clock budget; also stops 25 seconds before the platform deadline. Partial work and unsaved history are reported honestly.",
      "default": 240,
      "prefill": 240,
      "minimum": 30,
      "maximum": 3600
    }
  },
  "required": []
}
