{
  "title": "FedRAMP Marketplace Monitor",
  "type": "object",
  "schemaVersion": 1,
  "description": "Monitor official FedRAMP offering metadata and dated status paths. Compare saved observations with clear source timestamps, legacy labels and deterministic package variants. No credentials required. Start with the small sample, then set an exact watchlist and optional comparison.",
  "properties": {
    "fedrampIds": {
      "title": "Offering watchlist (FedRAMP IDs)",
      "type": "array",
      "description": "Optional exact official offering IDs, at most 50. With no IDs or keywords, checks three named sample offerings. Missing IDs are reported as source failures, never inferred delistings.",
      "editor": "stringList",
      "prefill": [
        "F1607067912",
        "FR2335047392",
        "FR2617641654"
      ]
    },
    "keywords": {
      "title": "Provider or offering keywords",
      "type": "array",
      "description": "Optional literal case-insensitive OR terms in published provider/service names. With no IDs, searches the three fetched official feeds and saves a bounded sorted sample.",
      "editor": "stringList"
    },
    "maxResults": {
      "title": "Maximum saved observations",
      "type": "integer",
      "description": "Stops after this many confirmed dataset rows. Unchanged rows skipped by onlyChanges do not count.",
      "minimum": 1,
      "maximum": 100,
      "default": 3,
      "prefill": 3
    },
    "comparePrevious": {
      "title": "Compare with saved history",
      "type": "boolean",
      "description": "Enable a private named history. First observations are new; history advances only after output is saved. Use one writer per snapshot namespace.",
      "default": false
    },
    "onlyChanges": {
      "title": "Save only new or changed observations",
      "type": "boolean",
      "description": "Implies comparison. Unchanged observations are counted in SUMMARY and produce no paid dataset row.",
      "default": false
    },
    "snapshotName": {
      "title": "History namespace",
      "type": "string",
      "description": "1-80 letters, numbers, hyphens or underscores. Changing filters creates a separate scope. Use a new namespace to reset history.",
      "editor": "textfield",
      "default": "default"
    },
    "maxRunSeconds": {
      "title": "Run time budget in seconds",
      "type": "integer",
      "description": "Own time budget, also bounded by the platform timeout with a 25-second reserve.",
      "minimum": 30,
      "maximum": 900,
      "default": 240
    }
  }
}
