Brummel
2769e50a35
fix(examples): destructure partition_eithers result once ( #57 , 0064 iter 4)
...
Final iteration of spec 0064 (the #55-cutover hardening, #57 ). Closes
class 4, the one genuine corpus bug among the four (not a false
positive): std_either_list.partition_eithers projected both
(app Pair.fst rest) and (app Pair.snd rest) from one owned `rest`.
Pair.fst/snd are own-param projections that move a field out, so each
consumes `rest` -> a genuine double-consume that universal linearity
activation (#55 ) would correctly reject. The fix is a body rewrite
(destructure `rest` once via (match rest (case (pat-ctor MkPair ls rs)
…)) then dispatch on the head), NOT a check change -- the check is
right.
Latent until activation: partition_eithers' param is a bare (Implicit)
slot today, so the check is skipped on it -- no RED->GREEN flip on the
real fixture. The rewrite is a pre-emptive corpus fix. Its correctness
rests on the unchanged 2 3 2 3 E2E output (std_either_list_demo, a
semantically-identical partition) and on the new c4_double_consume
must-stay-RED fixture, which -- with explicit modes, so the check is
active today -- demonstrates the double-projection shape IS rejected.
- examples/std_either_list.ail: partition_eithers Cons arm rewritten;
doc updated (destructure-once, no longer "projections").
- examples/c4_double_consume.ail: must-stay-RED pin (the rejected
shape), folded into a generalised
harden_ownership_heap_double_consume_still_errors loop over
{real_consume, c4_double_consume}.
- examples/c4_rewrite.ail: stays-clean pin (the accepted
destructure-once shape), added to
harden_ownership_false_positives_are_clean.
No hash-pin on std_either_list (verified); the e2e 2 3 2 3 output pin
is the content pin and is preserved. No check/schema/codegen change.
Verified: std_either_list checks clean; demo 2 3 2 3; both harden
assertions green; cargo test --workspace green; bench/check.py 34/34,
compile_check.py 24/24 stable.
This is the last of the four #57 hardening classes. Spec 0064 is now
code-complete: classes 1 (local fn-param modes), 2 (let-alias redirect),
3 (value-typed let-binder), and 4 (this) all shipped. The cycle is ready
for audit; the #55 cutover precondition is met.
refs #57
2026-06-01 18:22:59 +02:00
..
2026-05-30 18:29:00 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 01:16:21 +02:00
2026-05-28 19:00:12 +02:00
2026-05-28 19:00:12 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-06-01 16:41:21 +02:00
2026-05-14 02:12:34 +02:00
2026-05-07 11:07:36 +02:00
2026-05-13 12:43:10 +02:00
2026-06-01 17:57:40 +02:00
2026-06-01 18:12:25 +02:00
2026-06-01 17:44:40 +02:00
2026-06-01 18:22:59 +02:00
2026-06-01 18:22:59 +02:00
2026-05-31 19:27:56 +02:00
2026-05-14 02:12:34 +02:00
2026-05-14 02:12:34 +02:00
2026-05-14 02:12:34 +02:00
2026-05-21 12:22:45 +02:00
2026-05-14 02:12:34 +02:00
2026-05-28 14:43:03 +02:00
2026-05-12 14:20:27 +02:00
2026-05-28 14:43:03 +02:00
2026-05-21 01:16:21 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-18 21:16:41 +02:00
2026-05-18 21:16:41 +02:00
2026-05-18 23:28:52 +02:00
2026-05-18 23:28:52 +02:00
2026-05-18 14:32:39 +02:00
2026-05-18 21:16:41 +02:00
2026-05-18 14:50:27 +02:00
2026-05-18 14:50:27 +02:00
2026-05-18 14:50:27 +02:00
2026-05-18 21:16:41 +02:00
2026-05-18 21:16:41 +02:00
2026-05-18 21:16:41 +02:00
2026-05-18 21:16:41 +02:00
2026-05-18 14:50:27 +02:00
2026-05-18 14:32:39 +02:00
2026-05-18 21:16:41 +02:00
2026-05-28 13:31:31 +02:00
2026-05-21 01:16:21 +02:00
2026-05-14 02:12:34 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-30 12:21:27 +02:00
2026-05-30 12:21:27 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-06-01 15:38:32 +02:00
2026-06-01 15:38:32 +02:00
2026-06-01 15:38:32 +02:00
2026-05-14 02:12:34 +02:00
2026-05-14 02:12:34 +02:00
2026-05-21 12:22:45 +02:00
2026-05-12 14:20:27 +02:00
2026-05-14 02:12:34 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-29 17:21:32 +02:00
2026-05-14 02:12:34 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-14 02:12:34 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-17 23:57:46 +02:00
2026-05-18 01:04:19 +02:00
2026-05-17 23:33:43 +02:00
2026-05-30 17:14:07 +02:00
2026-05-30 17:48:51 +02:00
2026-05-31 04:09:44 +02:00
2026-06-01 00:54:44 +02:00
2026-06-01 00:54:44 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 01:16:21 +02:00
2026-05-14 02:12:34 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 12:22:45 +02:00
2026-05-31 19:27:56 +02:00
2026-05-14 02:12:34 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-14 02:12:34 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 01:16:21 +02:00
2026-05-18 11:06:17 +02:00
2026-05-14 02:12:34 +02:00
2026-05-21 12:22:45 +02:00
2026-05-28 14:43:03 +02:00
2026-05-31 14:04:03 +02:00
2026-05-31 14:04:03 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-14 02:12:34 +02:00
2026-05-14 02:12:34 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-29 17:56:10 +02:00
2026-05-14 01:38:41 +02:00
2026-05-21 12:22:45 +02:00
2026-05-14 01:51:50 +02:00
2026-05-21 11:59:38 +02:00
2026-05-21 11:59:38 +02:00
2026-05-30 17:48:34 +02:00
2026-05-30 17:48:34 +02:00
2026-05-30 00:49:51 +02:00
2026-05-30 17:13:56 +02:00
2026-05-30 10:41:52 +02:00
2026-05-30 00:49:51 +02:00
2026-05-30 00:49:51 +02:00
2026-05-30 17:14:28 +02:00
2026-05-31 02:05:02 +02:00
2026-05-31 02:05:02 +02:00
2026-05-30 00:49:51 +02:00
2026-05-14 02:12:34 +02:00
2026-05-14 02:12:34 +02:00
2026-05-14 02:12:34 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 01:16:21 +02:00
2026-05-14 02:12:34 +02:00
2026-05-21 01:16:21 +02:00
2026-05-14 02:12:34 +02:00
2026-05-14 02:12:34 +02:00
2026-05-14 02:12:34 +02:00
2026-05-14 02:12:34 +02:00
2026-05-14 02:12:34 +02:00
2026-05-14 02:12:34 +02:00
2026-05-14 02:12:34 +02:00
2026-05-21 01:16:21 +02:00
2026-05-21 01:16:21 +02:00
2026-06-01 15:38:32 +02:00
2026-05-20 20:51:53 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-13 11:12:48 +02:00
2026-05-21 12:22:45 +02:00
2026-05-28 14:43:03 +02:00
2026-05-28 14:43:03 +02:00
2026-06-01 18:22:59 +02:00
2026-05-12 14:20:27 +02:00
2026-05-28 14:43:03 +02:00
2026-05-28 14:43:03 +02:00
2026-05-28 14:43:03 +02:00
2026-05-28 14:43:03 +02:00
2026-05-28 14:43:03 +02:00
2026-05-12 14:20:27 +02:00
2026-05-28 14:43:03 +02:00
2026-05-12 14:20:27 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 12:22:45 +02:00
2026-05-21 01:16:21 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-10 22:35:37 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 03:31:40 +02:00
2026-05-09 17:50:29 +02:00
2026-05-09 17:45:27 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 01:11:56 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-21 12:22:45 +02:00
2026-05-14 02:12:34 +02:00
2026-05-14 02:12:34 +02:00
2026-05-13 11:12:48 +02:00
2026-05-14 02:12:34 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-14 02:12:34 +02:00
2026-05-14 02:12:34 +02:00
2026-05-11 01:46:58 +02:00
2026-05-28 14:43:03 +02:00
2026-05-11 01:46:58 +02:00
2026-05-21 12:57:06 +02:00
2026-05-13 11:12:48 +02:00
2026-05-14 02:12:34 +02:00
2026-05-13 11:12:48 +02:00
2026-05-14 02:12:34 +02:00
2026-05-21 01:16:21 +02:00
2026-05-17 23:33:43 +02:00
2026-05-17 23:33:43 +02:00
2026-05-17 23:33:43 +02:00
2026-05-17 23:33:43 +02:00
2026-05-21 12:22:45 +02:00
2026-05-13 11:12:48 +02:00
2026-05-13 11:12:48 +02:00
2026-05-14 02:12:34 +02:00
2026-05-13 11:12:48 +02:00