diff --git a/conformance/DIVERGENCES.md b/conformance/DIVERGENCES.md index 8b6b71c..e6c2115 100644 --- a/conformance/DIVERGENCES.md +++ b/conformance/DIVERGENCES.md @@ -19,7 +19,7 @@ where a different source is noted. - JS interpreter: accepts (prints `dropqme` — an unknown string escape drops the backslash silently) - ANTLR grammar: rejects (token recognition error at: '"drop\q') -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 12 at ad01bbd ## Divergence (fuzz seed 20260709, index 49) @@ -29,7 +29,7 @@ where a different source is noted. - JS interpreter: rejects (err_unexpected at 1:1) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 20 at ad01bbd ## Divergence (fuzz seed 20260709, index 11) @@ -39,7 +39,7 @@ where a different source is noted. - JS interpreter: accepts (runs) - ANTLR grammar: rejects (1:0: token recognition error at: '"a\z') -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 12 at ad01bbd ## Divergence (fuzz seed 20260709, index 86) @@ -49,7 +49,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:5) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 21 at ad01bbd ## Divergence (fuzz seed 20260709, index 247) @@ -59,7 +59,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:4) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 21 at ad01bbd ## Divergence (fuzz seed 20260709, index 119) @@ -69,7 +69,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:3) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 21 at ad01bbd ## Divergence (fuzz seed 20260709, index 9) @@ -79,7 +79,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:3) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 22 at cd59791 ## Divergence (fuzz seed 20260709, index 144) @@ -89,7 +89,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:5) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 23 at ad01bbd ## Divergence (fuzz seed 20260709, index 456) @@ -99,7 +99,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:8) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 23 at ad01bbd ## Divergence (fuzz seed 20260709, index 182) @@ -109,7 +109,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:8) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 23 at ad01bbd ## Divergence (fuzz seed 20260709, index 284) @@ -119,7 +119,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:6) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 23 at ad01bbd ## Divergence (fuzz seed 20260709, index 276) @@ -129,7 +129,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:4) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 23 at ad01bbd ## Divergence (fuzz seed 20260709, index 427) @@ -139,7 +139,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:4) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 24 at ad01bbd ## Divergence (fuzz seed 20260709, index 101) @@ -149,7 +149,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:4) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 23 at ad01bbd ## Divergence (fuzz seed 20260709, index 425) @@ -159,7 +159,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:4) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 24 at ad01bbd ## Divergence (fuzz seed 20260709, index 194) @@ -169,7 +169,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:4) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 23 at ad01bbd ## Divergence (fuzz seed 20260709, index 212) @@ -179,7 +179,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:4) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 24 at ad01bbd ## Divergence (fuzz seed 20260709, index 25) @@ -189,7 +189,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:4) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 24 at ad01bbd ## Divergence (fuzz seed 20260709, index 347) @@ -199,7 +199,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:5) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 21 at ad01bbd ## Divergence (fuzz seed 20260709, index 52) @@ -209,7 +209,7 @@ where a different source is noted. - JS interpreter: rejects (err_expect at 1:4) - ANTLR grammar: accepts (parses) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 26 at c447eb7 ## Divergence (fuzz seed 20260709, index 76) @@ -219,7 +219,7 @@ where a different source is noted. - JS interpreter: accepts (runs) - ANTLR grammar: rejects (1:4: mismatched input ':' expecting {, ';', PARALLEL, LEFTARROW, IMPLIES, OR, AND, '=', NEQ, '<', '>', LEQ, GEQ, APPROX, SIM, '+', '-', TIMES, DIV, AST, COMPOSE, DEFINITION, HANDLE, ALLOC, RELEASE, '(', '|', MIDDOT}) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 25 at ad01bbd ## Divergence (fuzz seed 20260709, index 13) @@ -229,7 +229,7 @@ where a different source is noted. - JS interpreter: accepts (runs) - ANTLR grammar: rejects (1:4: mismatched input ':' expecting {, ';', PARALLEL, LEFTARROW, IMPLIES, OR, AND, '=', NEQ, '<', '>', LEQ, GEQ, APPROX, SIM, '+', '-', TIMES, DIV, AST, COMPOSE, DEFINITION, HANDLE, ALLOC, RELEASE, '(', '|', MIDDOT}) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 25 at ad01bbd ## Divergence (fuzz seed 20260709, index 29) @@ -239,4 +239,18 @@ where a different source is noted. - JS interpreter: accepts (runs) - ANTLR grammar: rejects (1:4: mismatched input ':' expecting {, ';', PARALLEL, LEFTARROW, IMPLIES, OR, AND, '=', NEQ, '<', '>', LEQ, GEQ, APPROX, SIM, '+', '-', TIMES, DIV, AST, COMPOSE, DEFINITION, HANDLE, ALLOC, RELEASE, '(', '|', MIDDOT}) -- RULING: pending (see JUDGMENT_CALLS.md) +- RESOLVED by ruling 25 at ad01bbd + +## Divergence (fuzz seed 20260710, index 178 — found during Stage 3 A7) + +``` +({-42}) +``` + +- JS interpreter: rejected (err_comment — the lexer committed '{-' to a + comment even without a terminator) +- ANTLR grammar: accepts (MULTILINE_COMMENT requires its '-}'; '{' lexes + as a brace, so this is a block containing -42) +- RESOLVED by grammar alignment (decision: the grammar is the syntax + truth) at f5e8407 — no ruling needed; found by the fresh fuzz seed and + fixed before commit diff --git a/conformance/SURFACE.md b/conformance/SURFACE.md index 14301aa..7c9c717 100644 --- a/conformance/SURFACE.md +++ b/conformance/SURFACE.md @@ -1,9 +1,12 @@ # SURFACE — what `js/mpl.js` actually implements -Audited from the source of `js/mpl.js` (Stage 2, C3) and pinned by the -corpus. This file describes the implemented surface — exactly, no more. -Nothing here is ratified; where behavior looks accidental it is flagged in -`conformance/JUDGMENT_CALLS.md`, but it is recorded as observed. +Audited from the source of `js/mpl.js` at Stage 2 (C3, head `ea66a2a`) and +pinned by the corpus of that stage. **Historical record**: Stage 3 ratified +the 26 judgment calls (2026-07-09) and changed the surface where rulings +overrode it — rationals, boolean conditions, binding discipline, depth +limit, composition, and parser alignment. Where this file and +`JUDGMENT_CALLS.md` disagree, the rulings govern; the ratified corpus is +the executable truth. ## Lexer diff --git a/conformance/corpus/001_hello_world/meta.json b/conformance/corpus/001_hello_world/meta.json index 517816e..4267604 100644 --- a/conformance/corpus/001_hello_world/meta.json +++ b/conformance/corpus/001_hello_world/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "example", "decision": "", "notes": "seeded from examples/01_hello_world.mpl"} +{"status": "ratified", "source": "example", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "seeded from examples/01_hello_world.mpl"} diff --git a/conformance/corpus/002_factorial/meta.json b/conformance/corpus/002_factorial/meta.json index 291bfe2..cafb159 100644 --- a/conformance/corpus/002_factorial/meta.json +++ b/conformance/corpus/002_factorial/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "example", "decision": "", "notes": "seeded from examples/02_factorial.mpl"} +{"status": "ratified", "source": "example", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "seeded from examples/02_factorial.mpl"} diff --git a/conformance/corpus/002_factorial/program.mpl b/conformance/corpus/002_factorial/program.mpl index 1010b97..1ed756b 100644 --- a/conformance/corpus/002_factorial/program.mpl +++ b/conformance/corpus/002_factorial/program.mpl @@ -1,4 +1,4 @@ -- Factorial example with proper precedence factorial ≜ λn∈ℕ: (n≤1 ⟹ 1) | (n×factorial(n-1)); -result ← factorial(5); +result ≜ factorial(5); ✎result; \ No newline at end of file diff --git a/conformance/corpus/003_arith_precedence/meta.json b/conformance/corpus/003_arith_precedence/meta.json index 9842a4b..cfca10b 100644 --- a/conformance/corpus/003_arith_precedence/meta.json +++ b/conformance/corpus/003_arith_precedence/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "× ÷ bind tighter than + -; + - and × ÷ left-associative"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "× ÷ bind tighter than + -; + - and × ÷ left-associative"} diff --git a/conformance/corpus/004_unary_minus/meta.json b/conformance/corpus/004_unary_minus/meta.json index 735624e..0fd3793 100644 --- a/conformance/corpus/004_unary_minus/meta.json +++ b/conformance/corpus/004_unary_minus/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "unary minus, including doubled and against binary minus"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "unary minus, including doubled and against binary minus"} diff --git a/conformance/corpus/005_slash_div_alias/expected.out b/conformance/corpus/005_slash_div_alias/expected.out index 5979a16..627c08c 100644 --- a/conformance/corpus/005_slash_div_alias/expected.out +++ b/conformance/corpus/005_slash_div_alias/expected.out @@ -1,3 +1,3 @@ -2.5 -2.5 +5/2 +5/2 3 diff --git a/conformance/corpus/005_slash_div_alias/meta.json b/conformance/corpus/005_slash_div_alias/meta.json index a1a594c..915e1c0 100644 --- a/conformance/corpus/005_slash_div_alias/meta.json +++ b/conformance/corpus/005_slash_div_alias/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "/ is an ASCII alias of ÷"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 4", "notes": "/ is an ASCII alias of ÷"} diff --git a/conformance/corpus/006_number_display/expected.out b/conformance/corpus/006_number_display/expected.out index 8176562..20b4ea1 100644 --- a/conformance/corpus/006_number_display/expected.out +++ b/conformance/corpus/006_number_display/expected.out @@ -1,6 +1,6 @@ 42 -1.5 -0.5 +3/2 +1/2 2 7 -0.5 +1/2 diff --git a/conformance/corpus/006_number_display/meta.json b/conformance/corpus/006_number_display/meta.json index 576aaa9..2bd2e36 100644 --- a/conformance/corpus/006_number_display/meta.json +++ b/conformance/corpus/006_number_display/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "integral doubles display without decimal point; literals normalize"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 4", "notes": "integral doubles display without decimal point; literals normalize"} diff --git a/conformance/corpus/007_float_arithmetic/expected.out b/conformance/corpus/007_float_arithmetic/expected.out index b2d9daf..1b55dbb 100644 --- a/conformance/corpus/007_float_arithmetic/expected.out +++ b/conformance/corpus/007_float_arithmetic/expected.out @@ -1,3 +1,3 @@ -3.75 -0.30000000000000004 +15/4 +3/10 6 diff --git a/conformance/corpus/007_float_arithmetic/meta.json b/conformance/corpus/007_float_arithmetic/meta.json index 3af907b..63e6704 100644 --- a/conformance/corpus/007_float_arithmetic/meta.json +++ b/conformance/corpus/007_float_arithmetic/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "IEEE double arithmetic, including the 0.1+0.2 representation artifact"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 4", "notes": "IEEE double arithmetic, including the 0.1+0.2 representation artifact"} diff --git a/conformance/corpus/008_string_escapes/meta.json b/conformance/corpus/008_string_escapes/meta.json index 3473af1..77d8bad 100644 --- a/conformance/corpus/008_string_escapes/meta.json +++ b/conformance/corpus/008_string_escapes/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "string escapes \\n \\t \\\" \\\\ (unknown escapes like \\q diverge from the grammar — see DIVERGENCES.md, not corpus-pinnable)"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 12", "notes": "string escapes \\n \\t \\\" \\\\ (unknown escapes like \\q diverge from the grammar — see DIVERGENCES.md, not corpus-pinnable)"} diff --git a/conformance/corpus/009_string_concat/meta.json b/conformance/corpus/009_string_concat/meta.json index 4fb1f43..a08296c 100644 --- a/conformance/corpus/009_string_concat/meta.json +++ b/conformance/corpus/009_string_concat/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "+ concatenates when either operand is a string, rendering the other via show"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 5", "notes": "+ concatenates when either operand is a string, rendering the other via show"} diff --git a/conformance/corpus/010_multilingual_strings/meta.json b/conformance/corpus/010_multilingual_strings/meta.json index 92fdced..62e4942 100644 --- a/conformance/corpus/010_multilingual_strings/meta.json +++ b/conformance/corpus/010_multilingual_strings/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "non-ASCII string content passes through byte-intact"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "non-ASCII string content passes through byte-intact"} diff --git a/conformance/corpus/011_list_display/meta.json b/conformance/corpus/011_list_display/meta.json index dcea76b..c8059e3 100644 --- a/conformance/corpus/011_list_display/meta.json +++ b/conformance/corpus/011_list_display/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "lists display with strings quoted inside; closures display as λ"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 5", "notes": "lists display with strings quoted inside; closures display as λ"} diff --git a/conformance/corpus/012_lambda_basics/meta.json b/conformance/corpus/012_lambda_basics/meta.json index 6efb34d..ed165e9 100644 --- a/conformance/corpus/012_lambda_basics/meta.json +++ b/conformance/corpus/012_lambda_basics/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "λ definition, display, application, multiple parameters"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 5", "notes": "λ definition, display, application, multiple parameters"} diff --git a/conformance/corpus/013_closure_capture/meta.json b/conformance/corpus/013_closure_capture/meta.json index 2775bc7..ebe5695 100644 --- a/conformance/corpus/013_closure_capture/meta.json +++ b/conformance/corpus/013_closure_capture/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "closures capture the environment, not values at definition time"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 9", "notes": "closures capture the environment, not values at definition time"} diff --git a/conformance/corpus/013_closure_capture/program.mpl b/conformance/corpus/013_closure_capture/program.mpl index 1327bf6..cebd052 100644 --- a/conformance/corpus/013_closure_capture/program.mpl +++ b/conformance/corpus/013_closure_capture/program.mpl @@ -1,4 +1,4 @@ -x ← 10; +x ≜ 10; f ≜ λy: x + y; ✎ f(1); x ← 20; diff --git a/conformance/corpus/014_higher_order/meta.json b/conformance/corpus/014_higher_order/meta.json index 9b5516d..e03651a 100644 --- a/conformance/corpus/014_higher_order/meta.json +++ b/conformance/corpus/014_higher_order/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "curried application and λ literals as call arguments"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "curried application and λ literals as call arguments"} diff --git a/conformance/corpus/015_recursion_fib/meta.json b/conformance/corpus/015_recursion_fib/meta.json index 775ebbb..31ab905 100644 --- a/conformance/corpus/015_recursion_fib/meta.json +++ b/conformance/corpus/015_recursion_fib/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "binary recursion through a guarded alternative"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "binary recursion through a guarded alternative"} diff --git a/conformance/corpus/016_recursion_sum/meta.json b/conformance/corpus/016_recursion_sum/meta.json index 3b6127b..de8a79d 100644 --- a/conformance/corpus/016_recursion_sum/meta.json +++ b/conformance/corpus/016_recursion_sum/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "linear recursion 500 deep (within the host stack)"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 10", "notes": "linear recursion 500 deep (within the host stack)"} diff --git a/conformance/corpus/017_forall_accumulate/meta.json b/conformance/corpus/017_forall_accumulate/meta.json index c400ee7..4ab6e3e 100644 --- a/conformance/corpus/017_forall_accumulate/meta.json +++ b/conformance/corpus/017_forall_accumulate/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "∀ with an accumulating assignment"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "∀ with an accumulating assignment"} diff --git a/conformance/corpus/017_forall_accumulate/program.mpl b/conformance/corpus/017_forall_accumulate/program.mpl index 89156c7..6d674fe 100644 --- a/conformance/corpus/017_forall_accumulate/program.mpl +++ b/conformance/corpus/017_forall_accumulate/program.mpl @@ -1,3 +1,3 @@ -t ← 0; +t ≜ 0; ∀ n ∈ [1, 2, 3, 4, 5]: t ← t + n × n; ✎ t; diff --git a/conformance/corpus/018_forall_value/expected.out b/conformance/corpus/018_forall_value/expected.out index eb3a635..ab6c322 100644 --- a/conformance/corpus/018_forall_value/expected.out +++ b/conformance/corpus/018_forall_value/expected.out @@ -1,2 +1,2 @@ -6 +⊥ ⊥ diff --git a/conformance/corpus/018_forall_value/meta.json b/conformance/corpus/018_forall_value/meta.json index e89bcb6..18d8d59 100644 --- a/conformance/corpus/018_forall_value/meta.json +++ b/conformance/corpus/018_forall_value/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "a ∀ expression yields the last body value; empty collection yields ⊥"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 2", "notes": "a ∀ expression yields the last body value; empty collection yields ⊥"} diff --git a/conformance/corpus/019_forall_scope/meta.json b/conformance/corpus/019_forall_scope/meta.json index 5e7c0d0..358ce6c 100644 --- a/conformance/corpus/019_forall_scope/meta.json +++ b/conformance/corpus/019_forall_scope/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "the ∀ variable shadows per iteration and the outer binding survives"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 15", "notes": "the ∀ variable shadows per iteration and the outer binding survives"} diff --git a/conformance/corpus/019_forall_scope/program.mpl b/conformance/corpus/019_forall_scope/program.mpl index b43d2f3..5c8a667 100644 --- a/conformance/corpus/019_forall_scope/program.mpl +++ b/conformance/corpus/019_forall_scope/program.mpl @@ -1,3 +1,3 @@ -n ← 100; +n ≜ 100; ∀ n ∈ [1, 2]: ✎ n; ✎ n; diff --git a/conformance/corpus/020_guarded_alternatives/meta.json b/conformance/corpus/020_guarded_alternatives/meta.json index c49112f..3eece2c 100644 --- a/conformance/corpus/020_guarded_alternatives/meta.json +++ b/conformance/corpus/020_guarded_alternatives/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "the canonical conditional: guarded alternatives with fallback"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 3", "notes": "the canonical conditional: guarded alternatives with fallback"} diff --git a/conformance/corpus/021_no_guard_match/meta.json b/conformance/corpus/021_no_guard_match/meta.json index 62fb3c1..67d700e 100644 --- a/conformance/corpus/021_no_guard_match/meta.json +++ b/conformance/corpus/021_no_guard_match/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "a guard that never fires, with no | fallback, surfaces as ⊥"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 3", "notes": "a guard that never fires, with no | fallback, surfaces as ⊥"} diff --git a/conformance/corpus/021_no_guard_match/program.mpl b/conformance/corpus/021_no_guard_match/program.mpl index db30732..0f0f99b 100644 --- a/conformance/corpus/021_no_guard_match/program.mpl +++ b/conformance/corpus/021_no_guard_match/program.mpl @@ -1,3 +1,3 @@ ✎((false ⟹ 1)); -x ← (false ⟹ 1); +x ≜ (false ⟹ 1); ✎ x; diff --git a/conformance/corpus/022_guard_truthiness/expected.err b/conformance/corpus/022_guard_truthiness/expected.err new file mode 100644 index 0000000..844c88e --- /dev/null +++ b/conformance/corpus/022_guard_truthiness/expected.err @@ -0,0 +1 @@ +err_bool diff --git a/conformance/corpus/022_guard_truthiness/expected.out b/conformance/corpus/022_guard_truthiness/expected.out deleted file mode 100644 index daa2f97..0000000 --- a/conformance/corpus/022_guard_truthiness/expected.out +++ /dev/null @@ -1,5 +0,0 @@ -one -no -num -no -no diff --git a/conformance/corpus/022_guard_truthiness/meta.json b/conformance/corpus/022_guard_truthiness/meta.json index 1263dae..c1030b8 100644 --- a/conformance/corpus/022_guard_truthiness/meta.json +++ b/conformance/corpus/022_guard_truthiness/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "guard conditions: true or non-zero number fire; strings/lists never do"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 13", "notes": "guard conditions: true or non-zero number fire; strings/lists never do"} diff --git a/conformance/corpus/022_guard_truthiness/program.mpl b/conformance/corpus/022_guard_truthiness/program.mpl index 1b54b0b..1ca843b 100644 --- a/conformance/corpus/022_guard_truthiness/program.mpl +++ b/conformance/corpus/022_guard_truthiness/program.mpl @@ -1,5 +1 @@ ✎((1 ⟹ "one") | "no"); -✎((0 ⟹ "zero") | "no"); -✎((2.5 ⟹ "num") | "no"); -✎(("s" ⟹ "str") | "no"); -✎(([1] ⟹ "list") | "no"); diff --git a/conformance/corpus/023_alt_chain/meta.json b/conformance/corpus/023_alt_chain/meta.json index 1fe51fc..f86e4df 100644 --- a/conformance/corpus/023_alt_chain/meta.json +++ b/conformance/corpus/023_alt_chain/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "fall-through chains take the first firing arm"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 3", "notes": "fall-through chains take the first firing arm"} diff --git a/conformance/corpus/024_def_assign_rebind/expected.out b/conformance/corpus/024_def_assign_rebind/expected.out index e0d13b0..1191247 100644 --- a/conformance/corpus/024_def_assign_rebind/expected.out +++ b/conformance/corpus/024_def_assign_rebind/expected.out @@ -1,4 +1,2 @@ 1 2 -3 -5 diff --git a/conformance/corpus/024_def_assign_rebind/meta.json b/conformance/corpus/024_def_assign_rebind/meta.json index f129dcb..4859f90 100644 --- a/conformance/corpus/024_def_assign_rebind/meta.json +++ b/conformance/corpus/024_def_assign_rebind/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "≜ and ← both rebind freely; ← works without a prior ≜"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 16", "notes": "≜ and ← both rebind freely; ← works without a prior ≜"} diff --git a/conformance/corpus/024_def_assign_rebind/program.mpl b/conformance/corpus/024_def_assign_rebind/program.mpl index 22fa22b..60cbf86 100644 --- a/conformance/corpus/024_def_assign_rebind/program.mpl +++ b/conformance/corpus/024_def_assign_rebind/program.mpl @@ -2,7 +2,3 @@ x ≜ 1; ✎ x; x ← 2; ✎ x; -x ≜ 3; -✎ x; -y ← 5; -✎ y; diff --git a/conformance/corpus/025_def_assign_value/meta.json b/conformance/corpus/025_def_assign_value/meta.json index 8a05f2d..2cc9d1f 100644 --- a/conformance/corpus/025_def_assign_value/meta.json +++ b/conformance/corpus/025_def_assign_value/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "both binding forms are expressions returning the bound value; ≜ chains right"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 16", "notes": "both binding forms are expressions returning the bound value; ≜ chains right"} diff --git a/conformance/corpus/026_def_vs_assign_scope/meta.json b/conformance/corpus/026_def_vs_assign_scope/meta.json index d59d753..a151444 100644 --- a/conformance/corpus/026_def_vs_assign_scope/meta.json +++ b/conformance/corpus/026_def_vs_assign_scope/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "inside a λ, ← mutates the captured outer binding; ≜ creates a local one"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 9 and 16", "notes": "inside a λ, ← mutates the captured outer binding; ≜ creates a local one"} diff --git a/conformance/corpus/026_def_vs_assign_scope/program.mpl b/conformance/corpus/026_def_vs_assign_scope/program.mpl index 09640d9..0debb0f 100644 --- a/conformance/corpus/026_def_vs_assign_scope/program.mpl +++ b/conformance/corpus/026_def_vs_assign_scope/program.mpl @@ -1,4 +1,4 @@ -x ← 1; +x ≜ 1; f ≜ λy: {x ← 99; x}; f(0); ✎ x; diff --git a/conformance/corpus/027_block_sequencing/meta.json b/conformance/corpus/027_block_sequencing/meta.json index 04d1664..faf24bd 100644 --- a/conformance/corpus/027_block_sequencing/meta.json +++ b/conformance/corpus/027_block_sequencing/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "a block yields its last expression; {} yields ⊥; trailing ; permitted"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 15", "notes": "a block yields its last expression; {} yields ⊥; trailing ; permitted"} diff --git a/conformance/corpus/028_block_no_scope/meta.json b/conformance/corpus/028_block_no_scope/meta.json index 5c12bd7..b13a0cd 100644 --- a/conformance/corpus/028_block_no_scope/meta.json +++ b/conformance/corpus/028_block_no_scope/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "braces do NOT create a scope: bindings made inside leak out"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 15", "notes": "braces do NOT create a scope: bindings made inside leak out"} diff --git a/conformance/corpus/028_block_no_scope/program.mpl b/conformance/corpus/028_block_no_scope/program.mpl index 295a93c..e789759 100644 --- a/conformance/corpus/028_block_no_scope/program.mpl +++ b/conformance/corpus/028_block_no_scope/program.mpl @@ -1,2 +1,2 @@ -{y ← 9; 0}; +{y ≜ 9; 0}; ✎ y; diff --git a/conformance/corpus/029_comments/meta.json b/conformance/corpus/029_comments/meta.json index f0d84b8..9c0e7a5 100644 --- a/conformance/corpus/029_comments/meta.json +++ b/conformance/corpus/029_comments/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "line comments and nested block comments"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "line comments and nested block comments"} diff --git a/conformance/corpus/030_bot/meta.json b/conformance/corpus/030_bot/meta.json index 5a494ab..c481201 100644 --- a/conformance/corpus/030_bot/meta.json +++ b/conformance/corpus/030_bot/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "⊥ displays as ⊥ and concatenates/nests as a value"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 6", "notes": "⊥ displays as ⊥ and concatenates/nests as a value"} diff --git a/conformance/corpus/031_show_all_types/expected.out b/conformance/corpus/031_show_all_types/expected.out index 4aaf516..b11e567 100644 --- a/conformance/corpus/031_show_all_types/expected.out +++ b/conformance/corpus/031_show_all_types/expected.out @@ -1,5 +1,5 @@ 42 -1.5 +3/2 s true false diff --git a/conformance/corpus/031_show_all_types/meta.json b/conformance/corpus/031_show_all_types/meta.json index ffb7574..0e4b467 100644 --- a/conformance/corpus/031_show_all_types/meta.json +++ b/conformance/corpus/031_show_all_types/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "one ✎ per value type"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "one ✎ per value type"} diff --git a/conformance/corpus/032_comparisons/meta.json b/conformance/corpus/032_comparisons/meta.json index 2b0410b..0d26684 100644 --- a/conformance/corpus/032_comparisons/meta.json +++ b/conformance/corpus/032_comparisons/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "all six comparison operators on numbers"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 8", "notes": "all six comparison operators on numbers"} diff --git a/conformance/corpus/033_string_compare/meta.json b/conformance/corpus/033_string_compare/meta.json index fb961a8..3593c71 100644 --- a/conformance/corpus/033_string_compare/meta.json +++ b/conformance/corpus/033_string_compare/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "lexicographic order and structural equality on strings"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 7 and 8", "notes": "lexicographic order and structural equality on strings"} diff --git a/conformance/corpus/034_cross_type_equality/meta.json b/conformance/corpus/034_cross_type_equality/meta.json index cf3b8ef..fa99f96 100644 --- a/conformance/corpus/034_cross_type_equality/meta.json +++ b/conformance/corpus/034_cross_type_equality/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "equality is structural per type and false across types; ⊥ equals ⊥"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 7", "notes": "equality is structural per type and false across types; ⊥ equals ⊥"} diff --git a/conformance/corpus/035_mixed_compare/expected.err b/conformance/corpus/035_mixed_compare/expected.err new file mode 100644 index 0000000..6b9fd10 --- /dev/null +++ b/conformance/corpus/035_mixed_compare/expected.err @@ -0,0 +1 @@ +err_compare diff --git a/conformance/corpus/035_mixed_compare/meta.json b/conformance/corpus/035_mixed_compare/meta.json index f663cf5..ba96397 100644 --- a/conformance/corpus/035_mixed_compare/meta.json +++ b/conformance/corpus/035_mixed_compare/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "ordering across types follows host coercion — observed, flagged as a judgment call"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 8", "notes": "ordering across types follows host coercion — observed, flagged as a judgment call"} diff --git a/conformance/corpus/035_mixed_compare/program.mpl b/conformance/corpus/035_mixed_compare/program.mpl index 2bcea56..5386a62 100644 --- a/conformance/corpus/035_mixed_compare/program.mpl +++ b/conformance/corpus/035_mixed_compare/program.mpl @@ -1,3 +1 @@ ✎(1 < "2"); -✎("10" < 9); -✎(true < 2); diff --git a/conformance/corpus/036_logic_ops/expected.out b/conformance/corpus/036_logic_ops/expected.out index 62b4804..2cdda45 100644 --- a/conformance/corpus/036_logic_ops/expected.out +++ b/conformance/corpus/036_logic_ops/expected.out @@ -2,6 +2,3 @@ true false true false -false -true -false diff --git a/conformance/corpus/036_logic_ops/meta.json b/conformance/corpus/036_logic_ops/meta.json index 76be753..d56aeaf 100644 --- a/conformance/corpus/036_logic_ops/meta.json +++ b/conformance/corpus/036_logic_ops/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "∧ ∨ test operands with strict boolean truth — numbers are not truthy here"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 14", "notes": "∧ ∨ test operands with strict boolean truth — numbers are not truthy here"} diff --git a/conformance/corpus/036_logic_ops/program.mpl b/conformance/corpus/036_logic_ops/program.mpl index 7832bb2..972a3f5 100644 --- a/conformance/corpus/036_logic_ops/program.mpl +++ b/conformance/corpus/036_logic_ops/program.mpl @@ -2,6 +2,3 @@ ✎(true ∧ false); ✎(false ∨ true); ✎(false ∨ false); -✎(1 ∧ true); -✎(0 ∨ true); -✎(true ∧ 1); diff --git a/conformance/corpus/037_logic_short_circuit/meta.json b/conformance/corpus/037_logic_short_circuit/meta.json index bd53f1c..30f1dba 100644 --- a/conformance/corpus/037_logic_short_circuit/meta.json +++ b/conformance/corpus/037_logic_short_circuit/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "∧ skips its right side on false; ∨ skips it on true (observable via side effect)"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 14", "notes": "∧ skips its right side on false; ∨ skips it on true (observable via side effect)"} diff --git a/conformance/corpus/037_logic_short_circuit/program.mpl b/conformance/corpus/037_logic_short_circuit/program.mpl index 1971128..5ec3412 100644 --- a/conformance/corpus/037_logic_short_circuit/program.mpl +++ b/conformance/corpus/037_logic_short_circuit/program.mpl @@ -1,4 +1,4 @@ -x ← 0; +x ≜ 0; f ≜ λv: {x ← x + 1; v}; false ∧ f(true); ✎ x; diff --git a/conformance/corpus/038_ascii_escapes/meta.json b/conformance/corpus/038_ascii_escapes/meta.json index 19b8bdc..f144ed8 100644 --- a/conformance/corpus/038_ascii_escapes/meta.json +++ b/conformance/corpus/038_ascii_escapes/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "a program written entirely in ASCII escapes behaves like its glyph spelling"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "a program written entirely in ASCII escapes behaves like its glyph spelling"} diff --git a/conformance/corpus/039_type_constraint_unenforced/meta.json b/conformance/corpus/039_type_constraint_unenforced/meta.json index d18156a..657a604 100644 --- a/conformance/corpus/039_type_constraint_unenforced/meta.json +++ b/conformance/corpus/039_type_constraint_unenforced/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "∈-constraints parse (incl. supplementary-plane 𝔹) and are discarded unevaluated"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 17", "notes": "∈-constraints parse (incl. supplementary-plane 𝔹) and are discarded unevaluated"} diff --git a/conformance/corpus/040_trace_returns_value/meta.json b/conformance/corpus/040_trace_returns_value/meta.json index ed90ab8..9193a4d 100644 --- a/conformance/corpus/040_trace_returns_value/meta.json +++ b/conformance/corpus/040_trace_returns_value/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "✎ is an expression: prints and returns its operand"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "✎ is an expression: prints and returns its operand"} diff --git a/conformance/corpus/040_trace_returns_value/program.mpl b/conformance/corpus/040_trace_returns_value/program.mpl index 6d3d8e7..8c90803 100644 --- a/conformance/corpus/040_trace_returns_value/program.mpl +++ b/conformance/corpus/040_trace_returns_value/program.mpl @@ -1,3 +1,3 @@ ✎(✎ 5); -v ← ✎ "side"; +v ≜ ✎ "side"; ✎ v; diff --git a/conformance/corpus/041_asterisk_multiplication/meta.json b/conformance/corpus/041_asterisk_multiplication/meta.json index b8b337b..04b12e0 100644 --- a/conformance/corpus/041_asterisk_multiplication/meta.json +++ b/conformance/corpus/041_asterisk_multiplication/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "∗ (U+2217) is multiplication, same as ×"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 19", "notes": "∗ (U+2217) is multiplication, same as ×"} diff --git a/conformance/corpus/042_nested_calls_in_list/meta.json b/conformance/corpus/042_nested_calls_in_list/meta.json index 14c76ac..ecbb513 100644 --- a/conformance/corpus/042_nested_calls_in_list/meta.json +++ b/conformance/corpus/042_nested_calls_in_list/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "calls inside list literals; λ argument"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "calls inside list literals; λ argument"} diff --git a/conformance/corpus/043_div_zero/meta.json b/conformance/corpus/043_div_zero/meta.json index 03feaba..b9cea76 100644 --- a/conformance/corpus/043_div_zero/meta.json +++ b/conformance/corpus/043_div_zero/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "division by zero"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 1", "notes": "division by zero"} diff --git a/conformance/corpus/044_undef/meta.json b/conformance/corpus/044_undef/meta.json index 757b05a..3fe4b5b 100644 --- a/conformance/corpus/044_undef/meta.json +++ b/conformance/corpus/044_undef/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "unbound identifier"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "unbound identifier"} diff --git a/conformance/corpus/045_notfn/meta.json b/conformance/corpus/045_notfn/meta.json index 061dcc8..7d2c6bc 100644 --- a/conformance/corpus/045_notfn/meta.json +++ b/conformance/corpus/045_notfn/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "calling a non-closure"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "calling a non-closure"} diff --git a/conformance/corpus/046_arity_nullary/meta.json b/conformance/corpus/046_arity_nullary/meta.json index d559fd9..625fed4 100644 --- a/conformance/corpus/046_arity_nullary/meta.json +++ b/conformance/corpus/046_arity_nullary/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "nullary call syntax parses; arity is checked at runtime"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 18", "notes": "nullary call syntax parses; arity is checked at runtime"} diff --git a/conformance/corpus/047_arity_extra/meta.json b/conformance/corpus/047_arity_extra/meta.json index cc2f755..89f090b 100644 --- a/conformance/corpus/047_arity_extra/meta.json +++ b/conformance/corpus/047_arity_extra/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "too many arguments"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "too many arguments"} diff --git a/conformance/corpus/048_iter_nonlist/meta.json b/conformance/corpus/048_iter_nonlist/meta.json index 3acf0ba..040ed07 100644 --- a/conformance/corpus/048_iter_nonlist/meta.json +++ b/conformance/corpus/048_iter_nonlist/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "∀ over a non-list"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "∀ over a non-list"} diff --git a/conformance/corpus/049_num_bool_plus/meta.json b/conformance/corpus/049_num_bool_plus/meta.json index 4e48511..641d2e5 100644 --- a/conformance/corpus/049_num_bool_plus/meta.json +++ b/conformance/corpus/049_num_bool_plus/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "numeric + with a non-number, non-string operand"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "numeric + with a non-number, non-string operand"} diff --git a/conformance/corpus/050_num_string_minus/meta.json b/conformance/corpus/050_num_string_minus/meta.json index b905b87..cad2f48 100644 --- a/conformance/corpus/050_num_string_minus/meta.json +++ b/conformance/corpus/050_num_string_minus/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "- is numeric only, no string analog"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "- is numeric only, no string analog"} diff --git a/conformance/corpus/051_neg_string/meta.json b/conformance/corpus/051_neg_string/meta.json index 4fd2a87..7ae8b0f 100644 --- a/conformance/corpus/051_neg_string/meta.json +++ b/conformance/corpus/051_neg_string/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "unary minus is numeric only"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "unary minus is numeric only"} diff --git a/conformance/corpus/052_bot_arith/meta.json b/conformance/corpus/052_bot_arith/meta.json index 81003ad..397b1f0 100644 --- a/conformance/corpus/052_bot_arith/meta.json +++ b/conformance/corpus/052_bot_arith/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "arithmetic on ⊥"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 6", "notes": "arithmetic on ⊥"} diff --git a/conformance/corpus/053_step_budget/expected.err b/conformance/corpus/053_step_budget/expected.err deleted file mode 100644 index ca3794f..0000000 --- a/conformance/corpus/053_step_budget/expected.err +++ /dev/null @@ -1 +0,0 @@ -err_steps diff --git a/conformance/corpus/053_step_budget/meta.json b/conformance/corpus/053_step_budget/meta.json deleted file mode 100644 index b65737a..0000000 --- a/conformance/corpus/053_step_budget/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "the 500000-step evaluation budget"} diff --git a/conformance/corpus/053_step_budget/program.mpl b/conformance/corpus/053_step_budget/program.mpl deleted file mode 100644 index 963c5c5..0000000 --- a/conformance/corpus/053_step_budget/program.mpl +++ /dev/null @@ -1,2 +0,0 @@ -l ← [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; -∀ a ∈ l: ∀ b ∈ l: ∀ c ∈ l: ∀ d ∈ l: ∀ e ∈ l: ∀ f ∈ l: 0; diff --git a/conformance/corpus/054_reject_underscore_ident/meta.json b/conformance/corpus/054_reject_underscore_ident/meta.json index 5f1b8c4..b688d0d 100644 --- a/conformance/corpus/054_reject_underscore_ident/meta.json +++ b/conformance/corpus/054_reject_underscore_ident/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "identifiers may not start with _"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "identifiers may not start with _"} diff --git a/conformance/corpus/055_reject_juxtaposition/meta.json b/conformance/corpus/055_reject_juxtaposition/meta.json index aef7e53..fb323e0 100644 --- a/conformance/corpus/055_reject_juxtaposition/meta.json +++ b/conformance/corpus/055_reject_juxtaposition/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "juxtaposition call f x is not a call syntax"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "juxtaposition call f x is not a call syntax"} diff --git a/conformance/corpus/056_reject_ternary/meta.json b/conformance/corpus/056_reject_ternary/meta.json index 6b0dcc1..eefb421 100644 --- a/conformance/corpus/056_reject_ternary/meta.json +++ b/conformance/corpus/056_reject_ternary/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "no ternary; conditionals are guarded alternatives"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "no ternary; conditionals are guarded alternatives"} diff --git a/conformance/corpus/057_reject_output_emoji/meta.json b/conformance/corpus/057_reject_output_emoji/meta.json index 701bed6..9e784fb 100644 --- a/conformance/corpus/057_reject_output_emoji/meta.json +++ b/conformance/corpus/057_reject_output_emoji/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "output is ✎ only"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "output is ✎ only"} diff --git a/conformance/corpus/058_reject_unterminated_string/meta.json b/conformance/corpus/058_reject_unterminated_string/meta.json index 85c85b5..684e056 100644 --- a/conformance/corpus/058_reject_unterminated_string/meta.json +++ b/conformance/corpus/058_reject_unterminated_string/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "unterminated string literal"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "unterminated string literal"} diff --git a/conformance/corpus/059_reject_unknown_escape/meta.json b/conformance/corpus/059_reject_unknown_escape/meta.json index b867720..7e8f326 100644 --- a/conformance/corpus/059_reject_unknown_escape/meta.json +++ b/conformance/corpus/059_reject_unknown_escape/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "unknown ASCII escape word"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "unknown ASCII escape word"} diff --git a/conformance/corpus/060_reject_unmatched_brace/meta.json b/conformance/corpus/060_reject_unmatched_brace/meta.json index 430d7f8..b12a2e8 100644 --- a/conformance/corpus/060_reject_unmatched_brace/meta.json +++ b/conformance/corpus/060_reject_unmatched_brace/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "unclosed brace"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "unclosed brace"} diff --git a/conformance/corpus/061_reject_unterminated_comment/expected.err b/conformance/corpus/061_reject_unterminated_comment/expected.err index 01f0cb9..67ce62a 100644 --- a/conformance/corpus/061_reject_unterminated_comment/expected.err +++ b/conformance/corpus/061_reject_unterminated_comment/expected.err @@ -1 +1 @@ -err_comment +err_expect diff --git a/conformance/corpus/061_reject_unterminated_comment/meta.json b/conformance/corpus/061_reject_unterminated_comment/meta.json index a55da84..902898d 100644 --- a/conformance/corpus/061_reject_unterminated_comment/meta.json +++ b/conformance/corpus/061_reject_unterminated_comment/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "unterminated block comment"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "unterminated block comment: '{-' without a matching '-}' is not a comment token, so the brace lexes bare and the program fails to parse (matches the grammar's MULTILINE_COMMENT)"} diff --git a/conformance/corpus/062_reject_sum_token/meta.json b/conformance/corpus/062_reject_sum_token/meta.json index a28d51d..145e892 100644 --- a/conformance/corpus/062_reject_sum_token/meta.json +++ b/conformance/corpus/062_reject_sum_token/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "∑ is M1, not a token"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "∑ is M1, not a token"} diff --git a/conformance/corpus/063_reject_sqrt_token/meta.json b/conformance/corpus/063_reject_sqrt_token/meta.json index ec79458..216ddc8 100644 --- a/conformance/corpus/063_reject_sqrt_token/meta.json +++ b/conformance/corpus/063_reject_sqrt_token/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "√ is M1, not a token"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "√ is M1, not a token"} diff --git a/conformance/corpus/064_reject_modulo/meta.json b/conformance/corpus/064_reject_modulo/meta.json index 0752e04..0ee355f 100644 --- a/conformance/corpus/064_reject_modulo/meta.json +++ b/conformance/corpus/064_reject_modulo/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "% is M1, not a token"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "% is M1, not a token"} diff --git a/conformance/corpus/065_reject_range/meta.json b/conformance/corpus/065_reject_range/meta.json index 24394f2..aab0034 100644 --- a/conformance/corpus/065_reject_range/meta.json +++ b/conformance/corpus/065_reject_range/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "range syntax [a..b] is M1"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "range syntax [a..b] is M1"} diff --git a/conformance/corpus/066_reject_not_token/meta.json b/conformance/corpus/066_reject_not_token/meta.json index 0e12fa7..b5c2708 100644 --- a/conformance/corpus/066_reject_not_token/meta.json +++ b/conformance/corpus/066_reject_not_token/meta.json @@ -1 +1 @@ -{"status": "unratified", "source": "coverage", "decision": "", "notes": "¬ is M1, not a token"} +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09 (Stage 3 batch — behavior blessed as observed; no single ruling)", "notes": "¬ is M1, not a token"} diff --git a/conformance/corpus/067_empty_program/expected.out b/conformance/corpus/067_empty_program/expected.out new file mode 100644 index 0000000..e69de29 diff --git a/conformance/corpus/067_empty_program/meta.json b/conformance/corpus/067_empty_program/meta.json new file mode 100644 index 0000000..c8ce59d --- /dev/null +++ b/conformance/corpus/067_empty_program/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 20", "notes": "ruling 20: the empty program is valid and silent"} diff --git a/conformance/corpus/067_empty_program/program.mpl b/conformance/corpus/067_empty_program/program.mpl new file mode 100644 index 0000000..e69de29 diff --git a/conformance/corpus/068_paren_sequence/expected.out b/conformance/corpus/068_paren_sequence/expected.out new file mode 100644 index 0000000..2b24e31 --- /dev/null +++ b/conformance/corpus/068_paren_sequence/expected.out @@ -0,0 +1,2 @@ +2 +6 diff --git a/conformance/corpus/068_paren_sequence/meta.json b/conformance/corpus/068_paren_sequence/meta.json new file mode 100644 index 0000000..6c1d00f --- /dev/null +++ b/conformance/corpus/068_paren_sequence/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 21", "notes": "ruling 21: parentheses contain one seqExpr"} diff --git a/conformance/corpus/068_paren_sequence/program.mpl b/conformance/corpus/068_paren_sequence/program.mpl new file mode 100644 index 0000000..0c15abc --- /dev/null +++ b/conformance/corpus/068_paren_sequence/program.mpl @@ -0,0 +1,2 @@ +✎((1; 2)); +✎((x ≜ 5; x + 1)); diff --git a/conformance/corpus/069_compose_apply/expected.out b/conformance/corpus/069_compose_apply/expected.out new file mode 100644 index 0000000..ce2e38b --- /dev/null +++ b/conformance/corpus/069_compose_apply/expected.out @@ -0,0 +1,2 @@ +7 +9 diff --git a/conformance/corpus/069_compose_apply/meta.json b/conformance/corpus/069_compose_apply/meta.json new file mode 100644 index 0000000..776e8ad --- /dev/null +++ b/conformance/corpus/069_compose_apply/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 22", "notes": "ruling 22: (f ∘ g)(x) = f(g(x)); binds tighter than ×"} diff --git a/conformance/corpus/069_compose_apply/program.mpl b/conformance/corpus/069_compose_apply/program.mpl new file mode 100644 index 0000000..2d9279b --- /dev/null +++ b/conformance/corpus/069_compose_apply/program.mpl @@ -0,0 +1,4 @@ +f ≜ λx: x + 1; +g ≜ λx: x × 2; +✎((f ∘ g)(3)); +✎((f ∘ g)(1) × 3); diff --git a/conformance/corpus/070_compose_assoc/expected.out b/conformance/corpus/070_compose_assoc/expected.out new file mode 100644 index 0000000..d2de525 --- /dev/null +++ b/conformance/corpus/070_compose_assoc/expected.out @@ -0,0 +1,2 @@ +15 +15 diff --git a/conformance/corpus/070_compose_assoc/meta.json b/conformance/corpus/070_compose_assoc/meta.json new file mode 100644 index 0000000..9302d24 --- /dev/null +++ b/conformance/corpus/070_compose_assoc/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 22", "notes": "ruling 22: composition associates"} diff --git a/conformance/corpus/070_compose_assoc/program.mpl b/conformance/corpus/070_compose_assoc/program.mpl new file mode 100644 index 0000000..a85b16c --- /dev/null +++ b/conformance/corpus/070_compose_assoc/program.mpl @@ -0,0 +1,5 @@ +f ≜ λx: x + 1; +g ≜ λx: x × 2; +h ≜ λx: x - 3; +✎(((f ∘ g) ∘ h)(10)); +✎((f ∘ (g ∘ h))(10)); diff --git a/conformance/corpus/071_compose_nonfn/expected.err b/conformance/corpus/071_compose_nonfn/expected.err new file mode 100644 index 0000000..bf3ac71 --- /dev/null +++ b/conformance/corpus/071_compose_nonfn/expected.err @@ -0,0 +1 @@ +err_notfn diff --git a/conformance/corpus/071_compose_nonfn/meta.json b/conformance/corpus/071_compose_nonfn/meta.json new file mode 100644 index 0000000..d3ff903 --- /dev/null +++ b/conformance/corpus/071_compose_nonfn/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 22", "notes": "ruling 22: non-function ∘ operand"} diff --git a/conformance/corpus/071_compose_nonfn/program.mpl b/conformance/corpus/071_compose_nonfn/program.mpl new file mode 100644 index 0000000..ec6d22a --- /dev/null +++ b/conformance/corpus/071_compose_nonfn/program.mpl @@ -0,0 +1 @@ +✎((1 ∘ 2)(3)); diff --git a/conformance/corpus/072_set_literal_notyet/expected.err b/conformance/corpus/072_set_literal_notyet/expected.err new file mode 100644 index 0000000..725d793 --- /dev/null +++ b/conformance/corpus/072_set_literal_notyet/expected.err @@ -0,0 +1 @@ +err_notyet diff --git a/conformance/corpus/072_set_literal_notyet/meta.json b/conformance/corpus/072_set_literal_notyet/meta.json new file mode 100644 index 0000000..d7712ff --- /dev/null +++ b/conformance/corpus/072_set_literal_notyet/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 23", "notes": "ruling 23: sets parse, evaluation is M1"} diff --git a/conformance/corpus/072_set_literal_notyet/program.mpl b/conformance/corpus/072_set_literal_notyet/program.mpl new file mode 100644 index 0000000..1a6a9e4 --- /dev/null +++ b/conformance/corpus/072_set_literal_notyet/program.mpl @@ -0,0 +1 @@ +{1, 2}; diff --git a/conformance/corpus/073_record_literal_notyet/expected.err b/conformance/corpus/073_record_literal_notyet/expected.err new file mode 100644 index 0000000..725d793 --- /dev/null +++ b/conformance/corpus/073_record_literal_notyet/expected.err @@ -0,0 +1 @@ +err_notyet diff --git a/conformance/corpus/073_record_literal_notyet/meta.json b/conformance/corpus/073_record_literal_notyet/meta.json new file mode 100644 index 0000000..bb00186 --- /dev/null +++ b/conformance/corpus/073_record_literal_notyet/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 24", "notes": "ruling 24: records parse, evaluation is M1"} diff --git a/conformance/corpus/073_record_literal_notyet/program.mpl b/conformance/corpus/073_record_literal_notyet/program.mpl new file mode 100644 index 0000000..2443022 --- /dev/null +++ b/conformance/corpus/073_record_literal_notyet/program.mpl @@ -0,0 +1 @@ +{k: 1}; diff --git a/conformance/corpus/074_nullary_lambda/expected.out b/conformance/corpus/074_nullary_lambda/expected.out new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/conformance/corpus/074_nullary_lambda/expected.out @@ -0,0 +1 @@ +42 diff --git a/conformance/corpus/074_nullary_lambda/meta.json b/conformance/corpus/074_nullary_lambda/meta.json new file mode 100644 index 0000000..1eeb84b --- /dev/null +++ b/conformance/corpus/074_nullary_lambda/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 18", "notes": "ruling 18: nullary λ with bare colon"} diff --git a/conformance/corpus/074_nullary_lambda/program.mpl b/conformance/corpus/074_nullary_lambda/program.mpl new file mode 100644 index 0000000..0d8a180 --- /dev/null +++ b/conformance/corpus/074_nullary_lambda/program.mpl @@ -0,0 +1,2 @@ +f ≜ λ: 41 + 1; +✎ f(); diff --git a/conformance/corpus/075_redef/expected.err b/conformance/corpus/075_redef/expected.err new file mode 100644 index 0000000..31a328b --- /dev/null +++ b/conformance/corpus/075_redef/expected.err @@ -0,0 +1 @@ +err_redef diff --git a/conformance/corpus/075_redef/meta.json b/conformance/corpus/075_redef/meta.json new file mode 100644 index 0000000..1cf0c7d --- /dev/null +++ b/conformance/corpus/075_redef/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 16", "notes": "ruling 16: same-scope redefinition"} diff --git a/conformance/corpus/075_redef/program.mpl b/conformance/corpus/075_redef/program.mpl new file mode 100644 index 0000000..3ac295c --- /dev/null +++ b/conformance/corpus/075_redef/program.mpl @@ -0,0 +1,2 @@ +x ≜ 1; +x ≜ 2; diff --git a/conformance/corpus/076_shadowing/expected.out b/conformance/corpus/076_shadowing/expected.out new file mode 100644 index 0000000..af74fdc --- /dev/null +++ b/conformance/corpus/076_shadowing/expected.out @@ -0,0 +1,2 @@ +5 +1 diff --git a/conformance/corpus/076_shadowing/meta.json b/conformance/corpus/076_shadowing/meta.json new file mode 100644 index 0000000..495c6c8 --- /dev/null +++ b/conformance/corpus/076_shadowing/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 15 and 16", "notes": "ruling 16: inner-scope shadowing is legal"} diff --git a/conformance/corpus/076_shadowing/program.mpl b/conformance/corpus/076_shadowing/program.mpl new file mode 100644 index 0000000..1f7a830 --- /dev/null +++ b/conformance/corpus/076_shadowing/program.mpl @@ -0,0 +1,4 @@ +x ≜ 1; +f ≜ λy: (x ≜ 5; x + y); +✎ f(0); +✎ x; diff --git a/conformance/corpus/077_unbound_assign/expected.err b/conformance/corpus/077_unbound_assign/expected.err new file mode 100644 index 0000000..ac4770b --- /dev/null +++ b/conformance/corpus/077_unbound_assign/expected.err @@ -0,0 +1 @@ +err_unbound diff --git a/conformance/corpus/077_unbound_assign/meta.json b/conformance/corpus/077_unbound_assign/meta.json new file mode 100644 index 0000000..cf969e3 --- /dev/null +++ b/conformance/corpus/077_unbound_assign/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 16", "notes": "ruling 16: ← needs an existing binding"} diff --git a/conformance/corpus/077_unbound_assign/program.mpl b/conformance/corpus/077_unbound_assign/program.mpl new file mode 100644 index 0000000..29780f5 --- /dev/null +++ b/conformance/corpus/077_unbound_assign/program.mpl @@ -0,0 +1 @@ +y ← 1; diff --git a/conformance/corpus/078_bool_logic/expected.err b/conformance/corpus/078_bool_logic/expected.err new file mode 100644 index 0000000..844c88e --- /dev/null +++ b/conformance/corpus/078_bool_logic/expected.err @@ -0,0 +1 @@ +err_bool diff --git a/conformance/corpus/078_bool_logic/meta.json b/conformance/corpus/078_bool_logic/meta.json new file mode 100644 index 0000000..4a40444 --- /dev/null +++ b/conformance/corpus/078_bool_logic/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 14", "notes": "ruling 14: ∧ ∨ demand boolean operands"} diff --git a/conformance/corpus/078_bool_logic/program.mpl b/conformance/corpus/078_bool_logic/program.mpl new file mode 100644 index 0000000..6ced309 --- /dev/null +++ b/conformance/corpus/078_bool_logic/program.mpl @@ -0,0 +1 @@ +✎(1 ∧ true); diff --git a/conformance/corpus/035_mixed_compare/expected.out b/conformance/corpus/079_short_circuit_safe/expected.out similarity index 68% rename from conformance/corpus/035_mixed_compare/expected.out rename to conformance/corpus/079_short_circuit_safe/expected.out index 87f8d93..1d474d5 100644 --- a/conformance/corpus/035_mixed_compare/expected.out +++ b/conformance/corpus/079_short_circuit_safe/expected.out @@ -1,3 +1,2 @@ -true false true diff --git a/conformance/corpus/079_short_circuit_safe/meta.json b/conformance/corpus/079_short_circuit_safe/meta.json new file mode 100644 index 0000000..6315a01 --- /dev/null +++ b/conformance/corpus/079_short_circuit_safe/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 14", "notes": "ruling 14: short-circuit — unevaluated operand raises nothing"} diff --git a/conformance/corpus/079_short_circuit_safe/program.mpl b/conformance/corpus/079_short_circuit_safe/program.mpl new file mode 100644 index 0000000..0922070 --- /dev/null +++ b/conformance/corpus/079_short_circuit_safe/program.mpl @@ -0,0 +1,2 @@ +✎(false ∧ (1 ÷ 0)); +✎(true ∨ (1 ÷ 0)); diff --git a/conformance/corpus/080_depth_limit/expected.err b/conformance/corpus/080_depth_limit/expected.err new file mode 100644 index 0000000..ee74d8e --- /dev/null +++ b/conformance/corpus/080_depth_limit/expected.err @@ -0,0 +1 @@ +err_depth diff --git a/conformance/corpus/080_depth_limit/meta.json b/conformance/corpus/080_depth_limit/meta.json new file mode 100644 index 0000000..9eb157e --- /dev/null +++ b/conformance/corpus/080_depth_limit/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 10", "notes": "ruling 10: λ-application depth limit 10000"} diff --git a/conformance/corpus/080_depth_limit/program.mpl b/conformance/corpus/080_depth_limit/program.mpl new file mode 100644 index 0000000..9821b75 --- /dev/null +++ b/conformance/corpus/080_depth_limit/program.mpl @@ -0,0 +1,2 @@ +loop ≜ λn: loop(n + 1); +loop(0); diff --git a/conformance/corpus/081_depth_headroom/expected.out b/conformance/corpus/081_depth_headroom/expected.out new file mode 100644 index 0000000..d58c55a --- /dev/null +++ b/conformance/corpus/081_depth_headroom/expected.out @@ -0,0 +1 @@ +9000 diff --git a/conformance/corpus/081_depth_headroom/meta.json b/conformance/corpus/081_depth_headroom/meta.json new file mode 100644 index 0000000..9c8f97a --- /dev/null +++ b/conformance/corpus/081_depth_headroom/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 10", "notes": "ruling 10: depth 9000 works — the limit is real headroom"} diff --git a/conformance/corpus/081_depth_headroom/program.mpl b/conformance/corpus/081_depth_headroom/program.mpl new file mode 100644 index 0000000..6c8f6f4 --- /dev/null +++ b/conformance/corpus/081_depth_headroom/program.mpl @@ -0,0 +1,2 @@ +sum ≜ λn: (n = 0 ⟹ 0) | (1 + sum(n - 1)); +✎ sum(9000); diff --git a/conformance/corpus/082_fn_equality/expected.err b/conformance/corpus/082_fn_equality/expected.err new file mode 100644 index 0000000..9c7eb15 --- /dev/null +++ b/conformance/corpus/082_fn_equality/expected.err @@ -0,0 +1 @@ +err_fn_eq diff --git a/conformance/corpus/082_fn_equality/meta.json b/conformance/corpus/082_fn_equality/meta.json new file mode 100644 index 0000000..5948bd3 --- /dev/null +++ b/conformance/corpus/082_fn_equality/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 7", "notes": "ruling 7: function equality is err_fn_eq"} diff --git a/conformance/corpus/082_fn_equality/program.mpl b/conformance/corpus/082_fn_equality/program.mpl new file mode 100644 index 0000000..5e4b513 --- /dev/null +++ b/conformance/corpus/082_fn_equality/program.mpl @@ -0,0 +1 @@ +✎((λx: x) = (λx: x)); diff --git a/conformance/corpus/083_fn_equality_mixed/expected.err b/conformance/corpus/083_fn_equality_mixed/expected.err new file mode 100644 index 0000000..9c7eb15 --- /dev/null +++ b/conformance/corpus/083_fn_equality_mixed/expected.err @@ -0,0 +1 @@ +err_fn_eq diff --git a/conformance/corpus/083_fn_equality_mixed/meta.json b/conformance/corpus/083_fn_equality_mixed/meta.json new file mode 100644 index 0000000..5c5d3a2 --- /dev/null +++ b/conformance/corpus/083_fn_equality_mixed/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 7", "notes": "ruling 7: any equality involving a function"} diff --git a/conformance/corpus/083_fn_equality_mixed/program.mpl b/conformance/corpus/083_fn_equality_mixed/program.mpl new file mode 100644 index 0000000..ce28cf3 --- /dev/null +++ b/conformance/corpus/083_fn_equality_mixed/program.mpl @@ -0,0 +1,2 @@ +f ≜ λx: x; +✎(f = 1); diff --git a/conformance/corpus/084_rational_display/expected.out b/conformance/corpus/084_rational_display/expected.out new file mode 100644 index 0000000..00c1d2e --- /dev/null +++ b/conformance/corpus/084_rational_display/expected.out @@ -0,0 +1,5 @@ +3/10 +-1/2 +1/2 +1/2 +0 diff --git a/conformance/corpus/084_rational_display/meta.json b/conformance/corpus/084_rational_display/meta.json new file mode 100644 index 0000000..4122031 --- /dev/null +++ b/conformance/corpus/084_rational_display/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 4", "notes": "ruling 4: lowest-terms display, sign on numerator, zero as 0"} diff --git a/conformance/corpus/084_rational_display/program.mpl b/conformance/corpus/084_rational_display/program.mpl new file mode 100644 index 0000000..fa5785d --- /dev/null +++ b/conformance/corpus/084_rational_display/program.mpl @@ -0,0 +1,5 @@ +✎(0.1 + 0.2); +✎(-1 ÷ 2); +✎(1 ÷ 3 + 1 ÷ 6); +✎(2 ÷ 4); +✎(0 ÷ 5); diff --git a/conformance/corpus/085_rational_eq/expected.out b/conformance/corpus/085_rational_eq/expected.out new file mode 100644 index 0000000..bb101b6 --- /dev/null +++ b/conformance/corpus/085_rational_eq/expected.out @@ -0,0 +1,2 @@ +true +true diff --git a/conformance/corpus/085_rational_eq/meta.json b/conformance/corpus/085_rational_eq/meta.json new file mode 100644 index 0000000..7512475 --- /dev/null +++ b/conformance/corpus/085_rational_eq/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 4 and 7", "notes": "rulings 4 and 7: same rational, one value"} diff --git a/conformance/corpus/085_rational_eq/program.mpl b/conformance/corpus/085_rational_eq/program.mpl new file mode 100644 index 0000000..a59f344 --- /dev/null +++ b/conformance/corpus/085_rational_eq/program.mpl @@ -0,0 +1,2 @@ +✎(0.5 = 1 ÷ 2); +✎(1 ÷ 3 = 2 ÷ 6); diff --git a/conformance/corpus/086_rational_roundtrip/expected.out b/conformance/corpus/086_rational_roundtrip/expected.out new file mode 100644 index 0000000..0e1918e --- /dev/null +++ b/conformance/corpus/086_rational_roundtrip/expected.out @@ -0,0 +1,2 @@ +true +3/10 diff --git a/conformance/corpus/086_rational_roundtrip/meta.json b/conformance/corpus/086_rational_roundtrip/meta.json new file mode 100644 index 0000000..ebbd4af --- /dev/null +++ b/conformance/corpus/086_rational_roundtrip/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 4", "notes": "ruling 4: display re-evaluates to the same value"} diff --git a/conformance/corpus/086_rational_roundtrip/program.mpl b/conformance/corpus/086_rational_roundtrip/program.mpl new file mode 100644 index 0000000..3194210 --- /dev/null +++ b/conformance/corpus/086_rational_roundtrip/program.mpl @@ -0,0 +1,3 @@ +x ≜ 3 ÷ 10; +✎(x = 0.3); +✎ x; diff --git a/conformance/corpus/087_greek_identifiers/expected.out b/conformance/corpus/087_greek_identifiers/expected.out new file mode 100644 index 0000000..cfbeb15 --- /dev/null +++ b/conformance/corpus/087_greek_identifiers/expected.out @@ -0,0 +1,2 @@ +4 +6 diff --git a/conformance/corpus/087_greek_identifiers/meta.json b/conformance/corpus/087_greek_identifiers/meta.json new file mode 100644 index 0000000..c089948 --- /dev/null +++ b/conformance/corpus/087_greek_identifiers/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 26", "notes": "ruling 26: Greek letters are identifiers (λ is not)"} diff --git a/conformance/corpus/087_greek_identifiers/program.mpl b/conformance/corpus/087_greek_identifiers/program.mpl new file mode 100644 index 0000000..09ed01e --- /dev/null +++ b/conformance/corpus/087_greek_identifiers/program.mpl @@ -0,0 +1,4 @@ +π ≜ 3; +✎(π + 1); +ρ ≜ π × 2; +✎ ρ; diff --git a/conformance/corpus/088_reject_paren_lambda/expected.err b/conformance/corpus/088_reject_paren_lambda/expected.err new file mode 100644 index 0000000..67ce62a --- /dev/null +++ b/conformance/corpus/088_reject_paren_lambda/expected.err @@ -0,0 +1 @@ +err_expect diff --git a/conformance/corpus/088_reject_paren_lambda/meta.json b/conformance/corpus/088_reject_paren_lambda/meta.json new file mode 100644 index 0000000..1baa320 --- /dev/null +++ b/conformance/corpus/088_reject_paren_lambda/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 25", "notes": "ruling 25: parenthesized λ parameters rejected"} diff --git a/conformance/corpus/088_reject_paren_lambda/program.mpl b/conformance/corpus/088_reject_paren_lambda/program.mpl new file mode 100644 index 0000000..5b4108d --- /dev/null +++ b/conformance/corpus/088_reject_paren_lambda/program.mpl @@ -0,0 +1 @@ +f ≜ λ(a, b): a; diff --git a/conformance/corpus/089_reject_bare_lambda/expected.err b/conformance/corpus/089_reject_bare_lambda/expected.err new file mode 100644 index 0000000..67ce62a --- /dev/null +++ b/conformance/corpus/089_reject_bare_lambda/expected.err @@ -0,0 +1 @@ +err_expect diff --git a/conformance/corpus/089_reject_bare_lambda/meta.json b/conformance/corpus/089_reject_bare_lambda/meta.json new file mode 100644 index 0000000..875ec3f --- /dev/null +++ b/conformance/corpus/089_reject_bare_lambda/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 26", "notes": "ruling 26: λ is reserved, never an identifier"} diff --git a/conformance/corpus/089_reject_bare_lambda/program.mpl b/conformance/corpus/089_reject_bare_lambda/program.mpl new file mode 100644 index 0000000..c248b76 --- /dev/null +++ b/conformance/corpus/089_reject_bare_lambda/program.mpl @@ -0,0 +1 @@ +✎({λ}); diff --git a/conformance/corpus/090_reject_unknown_string_escape/expected.err b/conformance/corpus/090_reject_unknown_string_escape/expected.err new file mode 100644 index 0000000..1955119 --- /dev/null +++ b/conformance/corpus/090_reject_unknown_string_escape/expected.err @@ -0,0 +1 @@ +err_escape diff --git a/conformance/corpus/090_reject_unknown_string_escape/meta.json b/conformance/corpus/090_reject_unknown_string_escape/meta.json new file mode 100644 index 0000000..ffab80d --- /dev/null +++ b/conformance/corpus/090_reject_unknown_string_escape/meta.json @@ -0,0 +1 @@ +{"status": "ratified", "source": "coverage", "decision": "Ratified 2026-07-09, ruling 12", "notes": "ruling 12: unknown string escapes are err_escape"} diff --git a/conformance/corpus/090_reject_unknown_string_escape/program.mpl b/conformance/corpus/090_reject_unknown_string_escape/program.mpl new file mode 100644 index 0000000..eb787c9 --- /dev/null +++ b/conformance/corpus/090_reject_unknown_string_escape/program.mpl @@ -0,0 +1 @@ +✎ "a\qb"; diff --git a/js/test/implementation.test.mjs b/js/test/implementation.test.mjs new file mode 100644 index 0000000..432dd24 --- /dev/null +++ b/js/test/implementation.test.mjs @@ -0,0 +1,20 @@ +'use strict'; +/* Implementation-limit tests — run with: node --test "js/test/*.test.mjs" + * Ruling 11: the step budget is an environment resource limit of THIS + * implementation, not language semantics. The portable conformance corpus + * does not pin it (former entry 053 moved here). + */ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { runMPL } from './load.mjs'; + +test('the 500000-step budget raises err_steps (ruling 11)', () => { + const src = 'l ≜ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n' + + '∀ a ∈ l: ∀ b ∈ l: ∀ c ∈ l: ∀ d ∈ l: ∀ e ∈ l: ∀ f ∈ l: 0;\n'; + try { + runMPL(src, () => {}); + assert.fail('should have hit the step budget'); + } catch (e) { + assert.equal(e.key, 'err_steps'); + } +});