[
  {"name":"a filter needs a passband", "base":"color-rig-equipment.json", "mutations":[{"op":"set", "path":["filters", 0, "bandpasses"], "value":[]}], "expected_validator":"minItems"},
  {"name":"external paths stay inside the shared folder", "base":"external-submission.json", "mutations":[{"op":"set", "path":["artifacts", 0, "external", "path"], "value":"../other/secret.fits"}], "expected_validator":"pattern"},
  {"name":"an objective accepts at least one passband", "base":"getProject.response.json", "mutations":[{"op":"set", "path":["requirements", "objectives", 0, "bandpasses"], "value":[]}], "expected_validator":"minItems"},
  {"name":"a master needs stack provenance", "base":"stacked-master-submission.json", "mutations":[{"op":"remove", "path":["artifacts", 0, "stack"]}], "expected_validator":"required"},
  {"name":"a master must be registered", "base":"stacked-master-submission.json", "mutations":[{"op":"set", "path":["artifacts", 0, "calibration", "registration"], "value":"unregistered"}], "expected_validator":"const"},
  {"name":"a sub needs capture identity", "base":"createSubmission.request.json", "mutations":[{"op":"remove", "path":["artifacts", 0, "capture_id"]}], "expected_validator":"required"},
  {"name":"master projects need master rules", "base":"stacked-masters-requirements.json", "mutations":[{"op":"remove", "path":["master_rules"]}], "expected_validator":"required"},
  {"name":"external delivery needs a location", "base":"external-submission.json", "mutations":[{"op":"remove", "path":["artifacts", 0, "external"]}], "expected_validator":"required"},
  {"name":"uploaded artifacts cannot carry an external location", "base":"external-submission.json", "mutations":[{"op":"set", "path":["artifacts", 0, "delivery"], "value":"upload"}], "expected_validator":"not"},
  {"name":"external links must use HTTPS", "base":"external-submission.json", "mutations":[{"op":"set", "path":["artifacts", 0, "external", "url"], "value":"http://drive.example/file"}], "expected_validator":"pattern"},
  {"name":"pairing rejects unknown fields", "base":"pairClient.request.json", "mutations":[{"op":"set", "path":["scopes"], "value":["project:manage"]}], "expected_validator":"additionalProperties"},
  {"name":"pairing needs an installation", "base":"pairClient.request.json", "mutations":[{"op":"remove", "path":["installation_id"]}], "expected_validator":"required"},
  {"name":"RA upper boundary is exclusive", "base":"getProject.response.json", "mutations":[{"op":"set", "path":["requirements", "targets", 0, "footprint", "center", "ra_degrees"], "value":360}], "expected_validator":"exclusiveMaximum"},
  {"name":"declination out of range", "base":"getProject.response.json", "mutations":[{"op":"set", "path":["requirements", "targets", 0, "footprint", "center", "dec_degrees"], "value":91}], "expected_validator":"maximum"},
  {"name":"goal must require frames or integration", "base":"getProject.response.json", "mutations":[{"op":"set", "path":["requirements", "objectives", 0, "goal"], "value":{}}], "expected_validator":"anyOf"},
  {"name":"zero exposure is not a capture", "base":"createSubmission.request.json", "mutations":[{"op":"set", "path":["artifacts", 0, "exposure_seconds"], "value":0}], "expected_validator":"exclusiveMinimum"},
  {"name":"malformed artifact digest", "base":"createSubmission.request.json", "mutations":[{"op":"set", "path":["artifacts", 0, "sha256"], "value":"not-a-digest"}], "expected_validator":"pattern"},
  {"name":"normalized pixels need ADU scale", "base":"createSubmission.request.json", "mutations":[{"op":"set", "path":["artifacts", 0, "calibration", "pixel_unit"], "value":"normalized"}], "expected_validator":"required"},
  {"name":"an image action carries the assignment", "base":"checkIn.response.json", "mutations":[{"op":"remove", "path":["assignment"]}], "expected_validator":"required"},
  {"name":"a wait carries no assignment", "base":"checkin-wait.json", "mutations":[{"op":"set", "path":["assignment"], "value":{}}], "expected_validator":"not"},
  {"name":"unknown request fields are rejected", "base":"checkIn.request.json", "mutations":[{"op":"set", "path":["exclusive_target_lock"], "value":true}], "expected_validator":"additionalProperties"}
]
