diff --git a/compatibility/conformance-manifest.json b/compatibility/conformance-manifest.json index 932bca8..d966e1b 100644 --- a/compatibility/conformance-manifest.json +++ b/compatibility/conformance-manifest.json @@ -34,7 +34,7 @@ "id": "compound-expression-tokens", "claim": "Compound expression punctuation and token adjacency are preserved for the parser.", "probeKinds": ["positive", "contextual"], - "probes": ["synthetic/issue-28-syntax"] + "probes": ["synthetic/expressions-values"] }, { "id": "malformed-lexical-input", @@ -45,7 +45,7 @@ ], "probeFixtures": [ "synthetic/issue-28-string-modifiers", - "synthetic/issue-28-syntax", + "synthetic/expressions-values", "synthetic/issue-28-invalid-syntax", "synthetic/issue-33-f-string", "real-world/overpy-zencopter" @@ -76,7 +76,7 @@ "id": "branches-loops-and-switches", "claim": "Branches, loops, switch ordering, and break shapes are parsed distinctly.", "probeKinds": ["positive", "contextual", "negative"], - "probes": ["synthetic/control-flow", "synthetic/issue-47-control-flow", "synthetic/issue-47-do-while-invalid-placement", "synthetic/issue-47-do-while-shapes", "synthetic/issue-47-switch-multiple-break", "synthetic/issue-47-switch-order", "synthetic/issue-47-switch-structured-target", "synthetic/issue-47-unsupported", "synthetic/issue-33-switch-break", "synthetic/for-range-agentlab"] + "probes": ["synthetic/control-flow", "synthetic/issue-47-control-flow", "synthetic/issue-47-do-while-invalid-placement", "synthetic/issue-47-do-while-shapes", "synthetic/issue-47-switch-order", "synthetic/issue-47-switch-structured-target", "synthetic/issue-33-switch-break", "synthetic/for-range-agentlab"] }, { "id": "lambda-and-postfix-context", @@ -86,30 +86,26 @@ }, { "id": "indexed-assignment-depth", - "claim": "Indexed assignment depth has explicit supported and unsupported parser shapes.", - "probeKinds": ["contextual", "negative"], - "probes": ["synthetic/issue-46-primitives", "synthetic/issue-60-4d-negative"] + "claim": "Indexed assignment and access forms retain their structural boundaries before lowering.", + "probeKinds": ["contextual"], + "probes": ["synthetic/issue-46-primitives"] } ], "probeFixtures": [ "synthetic/basic-rule", "synthetic/expressions-values", "synthetic/control-flow", - "synthetic/issue-28-syntax", "synthetic/issue-33-lambda-negative", "synthetic/issue-33-switch-break", "synthetic/issue-47-control-flow", "synthetic/issue-47-do-while-invalid-placement", "synthetic/issue-47-do-while-shapes", - "synthetic/issue-47-switch-multiple-break", "synthetic/issue-47-switch-order", "synthetic/issue-47-switch-structured-target", - "synthetic/issue-47-unsupported", "synthetic/issue-33-switch-break", "synthetic/issue-59-embedded-postfix-negative", "synthetic/issue-59-postfix-assignment", "synthetic/issue-59-postfix-negative", - "synthetic/issue-60-4d-negative", "synthetic/issue-60-nested-index", "synthetic/for-range-agentlab", "synthetic/issue-46-primitives", @@ -276,7 +272,7 @@ "id": "vertical-slice", "claim": "A successful source-to-WIR vertical slice is comparable through the canonical Workshop contract.", "probeKinds": ["positive"], - "probes": ["synthetic/issue-35-integration", "synthetic/issue-40-structural"] + "probes": ["synthetic/issue-35-integration", "synthetic/issue-40-structural", "synthetic/issue-28-syntax"] }, { "id": "assignments-and-indexing", @@ -318,6 +314,7 @@ "probeFixtures": [ "synthetic/issue-35-integration", "synthetic/issue-40-structural", + "synthetic/issue-28-syntax", "synthetic/issue-46-primitives", "synthetic/issue-46-unsupported", "synthetic/issue-47-control-flow", diff --git a/compatibility/conformance.py b/compatibility/conformance.py index 2b12750..9f2ff46 100644 --- a/compatibility/conformance.py +++ b/compatibility/conformance.py @@ -27,6 +27,9 @@ "w_already_imported": "preprocess", "do-while-placement": "semantic", } +FRONTIER_CONSTRUCTS = { + "lambda-context": "parse-error", +} PROBE_KINDS = {"positive", "negative", "contextual", "composition"} @@ -220,7 +223,7 @@ def native_frontier(result: dict[str, Any]) -> dict[str, str] | None: if stage is None: failure_class = compile_result.get("failureClass") stage = "lowering" if failure_class == "integration" else "semantic" - return {"stage": stage, "construct": code} + return {"stage": stage, "construct": FRONTIER_CONSTRUCTS.get(code, code)} def run_compile(binary: Path, directory: Path, metadata: dict[str, Any]) -> dict[str, Any]: diff --git a/compatibility/tests/test_conformance.py b/compatibility/tests/test_conformance.py index e5eb861..26a0a14 100644 --- a/compatibility/tests/test_conformance.py +++ b/compatibility/tests/test_conformance.py @@ -71,6 +71,19 @@ def test_native_frontier_skips_warnings_before_the_first_error(self): {"stage": "parse", "construct": "parse-error"}, ) + def test_native_frontier_normalizes_lambda_context_to_parse_frontier(self): + result = { + "compile": { + "status": "failure", + "failureClass": "frontend", + "diagnostics": [{"code": "lambda-context"}], + } + } + self.assertEqual( + conformance.native_frontier(result), + {"stage": "parse", "construct": "parse-error"}, + ) + def test_reference_success_native_failure_is_divergence(self): oracle = { "compile": {"status": "success", "diagnostics": []}, diff --git a/docs/opy/conformance-baseline.md b/docs/opy/conformance-baseline.md index 63c7e06..0597eb1 100644 --- a/docs/opy/conformance-baseline.md +++ b/docs/opy/conformance-baseline.md @@ -61,3 +61,11 @@ Its summary groups results by the manifest's root capability and owner, and its fixture entries retain both reference and native diagnostics. It is the current divergence inventory used to group follow-up work. No current native failure is entered into the manifest as an expected pass. + +The broad `synthetic/issue-28-syntax` probe is inventoried under the +canonical-WIR boundary rather than lexical conformance. Its source compiles +successfully, but the pinned Workshop output contains `0X20`, which the +released `workshop-rs` parser does not currently reparse; this is a +`workshop-rs` evidence limitation, not an OPY lexer divergence. Likewise, +switch multi-break and nested switch-break probes remain lowering-only gaps +and are not parser failures.