From 70c3d1247aa0abc0c8d598c5da33614b9e2fc778 Mon Sep 17 00:00:00 2001 From: Lucian Behind The Scenes Date: Tue, 28 Jul 2026 17:13:36 +0300 Subject: [PATCH] fix: avoid unsupported array const schemas --- schemas/maintenance-plan.schema.json | 2 +- scripts/validate-structured-output-schemas | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/schemas/maintenance-plan.schema.json b/schemas/maintenance-plan.schema.json index c056c71..83dbf55 100644 --- a/schemas/maintenance-plan.schema.json +++ b/schemas/maintenance-plan.schema.json @@ -73,7 +73,7 @@ "mise-php": {"type": "array", "items": {"type": "string"}} } }, - "requiredChecks": {"type": "array", "items": {"type": "string"}, "const": ["Script checks"]}, + "requiredChecks": {"type": "array", "items": {"type": "string", "enum": ["Script checks"]}, "minItems": 1, "maxItems": 1}, "releaseIntent": { "type": ["object", "null"], "additionalProperties": false, diff --git a/scripts/validate-structured-output-schemas b/scripts/validate-structured-output-schemas index 44a2094..de57218 100755 --- a/scripts/validate-structured-output-schemas +++ b/scripts/validate-structured-output-schemas @@ -51,6 +51,8 @@ def validate_node(node: Any, location: str) -> None: if ("const" in node or "enum" in node) and "type" not in node: fail(f"{location} uses const or enum without an explicit type") + if "const" in node and isinstance(node["const"], (dict, list)): + fail(f"{location} uses a non-scalar const unsupported by OpenAI Structured Outputs") unsupported = sorted(UNSUPPORTED_KEYWORDS.intersection(node)) if unsupported: @@ -82,7 +84,12 @@ def main() -> int: if schema_pattern != ACTION_KEY_RE.pattern: fail("maintenance plan actionKey pattern must match deterministic admission") properties = document.get("properties", {}) - if properties.get("requiredChecks", {}).get("const") != REQUIRED_PLAN_CHECKS: + required_checks = properties.get("requiredChecks", {}) + if ( + required_checks.get("items", {}).get("enum") != REQUIRED_PLAN_CHECKS + or required_checks.get("minItems") != len(REQUIRED_PLAN_CHECKS) + or required_checks.get("maxItems") != len(REQUIRED_PLAN_CHECKS) + ): fail("maintenance plan requiredChecks must match deterministic admission") evidence_pattern = ( properties.get("completionAssessment", {})