{
  "title": "Fed and ECB public announcement monitoring",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "sources": {
      "title": "Official feeds",
      "type": "array",
      "description": "Choose fed-monetary, fed-all, or ecb-press. An omitted or empty list uses fed-monetary and ecb-press. Each feed contains a publisher-limited recent window.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "prefill": [
        "fed-monetary",
        "ecb-press"
      ],
      "sectionCaption": "1 · Choose official feeds",
      "sectionDescription": "Select the supported Fed and ECB feeds to inspect."
    },
    "keywords": {
      "title": "Headline or excerpt keywords",
      "type": "array",
      "description": "Optional case-insensitive literal substrings. At least one must occur in the headline or publisher feed excerpt. This does not search full articles.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "prefill": [],
      "sectionCaption": "2 · Narrow the feed window",
      "sectionDescription": "Filters apply to currently available feed items, not a full historical archive."
    },
    "startDate": {
      "title": "Published on or after (UTC)",
      "type": "string",
      "description": "Optional inclusive YYYY-MM-DD publication date. Filtering a recent feed cannot retrieve older items that have rolled out of that feed.",
      "editor": "textfield"
    },
    "endDate": {
      "title": "Published on or before (UTC)",
      "type": "string",
      "description": "Optional inclusive YYYY-MM-DD date in UTC, not the policy effective date.",
      "editor": "textfield"
    },
    "maxResults": {
      "title": "Maximum saved announcements",
      "type": "integer",
      "description": "Maximum confirmed saved announcement observations across all selected feeds.",
      "minimum": 1,
      "maximum": 1000,
      "default": 20
    },
    "maxItemsPerSource": {
      "title": "Source candidates per feed",
      "type": "integer",
      "description": "Inspect at most this many newest feed items before applying filters. Unchanged skips do not extend this window.",
      "minimum": 1,
      "maximum": 200,
      "default": 10
    },
    "comparePrevious": {
      "title": "Compare previous observations",
      "type": "boolean",
      "description": "Compare against this Actor’s named history. First run establishes a baseline from confirmed saved rows.",
      "default": false,
      "sectionCaption": "3 · Optional saved comparisons",
      "sectionDescription": "Only saved observations advance history; a no-change repeat can return zero rows."
    },
    "onlyChanges": {
      "title": "Save only new or changed announcements",
      "type": "boolean",
      "description": "Enables comparison. First run saves the selected observations; an unchanged repeat may legitimately return no rows. No deletion or policy-effect inference.",
      "default": false
    },
    "snapshotName": {
      "title": "History namespace",
      "type": "string",
      "description": "Use a distinct name for independent workflows. Sources and filters also isolate history. Run only one writer per namespace and filter combination.",
      "editor": "textfield",
      "default": "default"
    },
    "maxRunSeconds": {
      "title": "Run time budget (seconds)",
      "type": "integer",
      "description": "Own wall-clock budget, capped by the platform timeout. Every source request and retry shares the remaining budget.",
      "minimum": 30,
      "maximum": 3600,
      "default": 240,
      "sectionCaption": "4 · Run budget",
      "sectionDescription": "Time and source limits are reported in SUMMARY."
    }
  },
  "description": "Choose official Federal Reserve or ECB feeds, apply literal keyword filters and optionally compare saved announcements. Publisher dates and wording are retained without forecasting policy or market moves."
}
