diff --git a/.trinity/seals/land_TriGoldenLand.json b/.trinity/seals/land_TriGoldenLand.json index 52bf2a340f..2adb6ae0a8 100644 --- a/.trinity/seals/land_TriGoldenLand.json +++ b/.trinity/seals/land_TriGoldenLand.json @@ -1,5 +1,5 @@ { - "built_by": "t27c-bootstrap@0.5.2+2d3203e90", + "built_by": "t27c-bootstrap@0.5.2+24a3abcad", "closure": [ { "spec": "specs/queen/actors.t27", @@ -7,7 +7,7 @@ }, { "spec": "specs/queen/golden_chain.t27", - "spec_hash": "sha256:c3417dda3e99e69adf80577de610c3a1a01ba036e9c7ca1ea7cea938ab6a5e0f" + "spec_hash": "sha256:cd0a5164c3fc14104160cb235162a4d0f856b31e0ff31a8fa415d3b0a8a618e6" }, { "spec": "specs/tri/lab/receipt.t27", @@ -31,23 +31,23 @@ } ], "config": "gen=c,rust,verilog,zig;tests=zig", - "gen_hash_c": "sha256:e712ac55c283e463202e14fab0316333ed380999f6d8a48f75a6c369ad2a2206", - "gen_hash_rust": "sha256:384e248350cfd3ecc52e3beb2cd4198d18d785b5d6a5a2e5b63cad79aed38cd6", - "gen_hash_verilog": "sha256:810a9a5c9c415344d60b7f2f44899bc8af6c033251fba04beb949578cd7bca4a", - "gen_hash_zig": "sha256:d24308158a0786e4ab635482b6b50ba77e69be2b8f3aface7ad304fa2d8df608", + "gen_hash_c": "sha256:5db152177716a1f5404d74518b0b63c9eecb33f3f91561b8243899ccf4817005", + "gen_hash_rust": "sha256:b565feb3facca1f94f8be038c11844b302ff5aeb6072aa1eecfa1a4615d835e7", + "gen_hash_verilog": "sha256:9119982035543fbfc3edeb91091640b7700a0f99841e5598f5f51a3d9adc57ca", + "gen_hash_zig": "sha256:aa88502568c418aa4842b7c378a53259ed044617c656508279dda608b130d7ef", "module": "TriGoldenLand", "ring": 12, "seal_schema": 2, - "sealed_at": "2026-10-20T09:49:46Z", + "sealed_at": "2026-10-20T12:49:11Z", "sealed_by": "t27c-bootstrap@0.5.2", - "spec_hash": "sha256:bc72a68615305f9ec5022a1f2f394197d74a62c9f90e9987fb9e30b544974b38", + "spec_hash": "sha256:320b56c776d1da37a9156d717080e8da4aad84a09081136cb0446b985636eeef", "spec_path": "specs/tri/land/golden_land.t27", "tests": { "failed": 0, "failing": [], "forced": false, - "passed": 22, - "total": 22, + "passed": 28, + "total": 28, "vacuous": 0 }, "toolchain": { diff --git a/.trinity/seals/queen_QueenGoldenChain.json b/.trinity/seals/queen_QueenGoldenChain.json index db92f3ae6f..47398795ee 100644 --- a/.trinity/seals/queen_QueenGoldenChain.json +++ b/.trinity/seals/queen_QueenGoldenChain.json @@ -1,5 +1,5 @@ { - "built_by": "t27c-bootstrap@0.5.2+2d3203e90", + "built_by": "t27c-bootstrap@0.5.2+24a3abcad", "closure": [ { "spec": "specs/queen/actors.t27", @@ -7,23 +7,23 @@ } ], "config": "gen=c,rust,verilog,zig;tests=zig", - "gen_hash_c": "sha256:5c8036239f53b58b02eefdd0dce322dc58445e9fd7a6dce0d0f963f7ea838869", - "gen_hash_rust": "sha256:25fe76c96e9c47ec2c57d5c318a0120acaaf4631df7355f2b122060ed6e6ee08", - "gen_hash_verilog": "sha256:1d18214587537563f634ce385837fefa6edc7e6f71ebd9aae329549efe8166a6", - "gen_hash_zig": "sha256:886291fbce0d68a97ab55ce8b2002c24b0bf995823e634efdb568fad8c410e5c", + "gen_hash_c": "sha256:8e6b8ee44674b6feb85ab81c8354109c5d504528e1b3113c40d5f79c1d157f18", + "gen_hash_rust": "sha256:969f62debaf795b03e00c31bb20fc66f0da090c24d44fcc7db18194bfd822004", + "gen_hash_verilog": "sha256:a015d55586bb0d19c7d6e0867a26eb33b0258508728992384924b5d73c616431", + "gen_hash_zig": "sha256:69acaecc2ba99833e46d9c2e400c554d3cf607a793b21a8e629e17ddb923fc48", "module": "QueenGoldenChain", "ring": 12, "seal_schema": 2, - "sealed_at": "2026-10-20T09:49:56Z", + "sealed_at": "2026-10-20T12:54:19Z", "sealed_by": "t27c-bootstrap@0.5.2", - "spec_hash": "sha256:c3417dda3e99e69adf80577de610c3a1a01ba036e9c7ca1ea7cea938ab6a5e0f", + "spec_hash": "sha256:6ef1997a7f2657467b42a4c976bebe8ce0a3eb4ffbaa62023c341c73381105ef", "spec_path": "specs/queen/golden_chain.t27", "tests": { "failed": 0, "failing": [], "forced": false, - "passed": 28, - "total": 28, + "passed": 31, + "total": 31, "vacuous": 0 }, "toolchain": { diff --git a/gen/rust/tri/land/golden_land.rs b/gen/rust/tri/land/golden_land.rs index f259f07ea1..722fdd1581 100644 --- a/gen/rust/tri/land/golden_land.rs +++ b/gen/rust/tri/land/golden_land.rs @@ -1,6 +1,6 @@ // Generated from .t27 spec // DO NOT EDIT — generated by t27c -// NOT LOWERED BY THIS BACKEND: 22 test(s), 1 invariant(s), 0 function(s) with no body. +// NOT LOWERED BY THIS BACKEND: 28 test(s), 1 invariant(s), 0 function(s) with no body. // This backend emits declarations only. The spec's checks live in // the Zig and Verilog outputs; do not read this file as verified. @@ -70,7 +70,31 @@ pub const P_MARK: u8 = 22; pub const G_PRUNE: u8 = 23; -pub const GL_STEPS: u8 = 24; +pub const R_ANC: u8 = 24; + +pub const R_MT: u8 = 25; + +pub const R_CT: u8 = 26; + +pub const R_UH: u8 = 27; + +pub const R_UP: u8 = 28; + +pub const S_SAVE: u8 = 29; + +pub const S_RECHECK: u8 = 30; + +pub const S_STAGE: u8 = 31; + +pub const S_DIFF: u8 = 32; + +pub const S_COMMIT: u8 = 33; + +pub const S_TIP: u8 = 34; + +pub const GL_STEPS: u8 = 35; + +pub const SEAL_DIR: &'static str = ".trinity/seals/"; pub const V_LAND: u8 = 0; @@ -187,13 +211,59 @@ pub fn id_of(ev: &'static str, k: u8, n: u64) -> u64 { return hex15(ev, body_from(ev, k, n)); } +pub fn same_sha(ev: &'static str, a: u8, b: u8) -> bool { + let mut i: usize = 0; + while (i < 40) { + if (ev.as_bytes()[((body_from(ev, a, 0) + i)) as usize] != ev.as_bytes()[((body_from(ev, b, 0) + i)) as usize]) { + return false; + } + i = (i + 1); + } + return true; +} + +pub fn rb_action(ev: &'static str) -> u8 { + if (((sha_ok(ev, G_HEAD, 0) == false) || (sha_ok(ev, P_PUSHED, 0) == false)) || (ran(ev, R_ANC, 0) == false)) { + return GC_RB_NONE; + } + return gc_rebase(true, true, same_sha(ev, G_HEAD, P_PUSHED), (exit_of(ev, R_ANC, 0) != 1)); +} + +pub fn head_off(ev: &'static str) -> usize { + let a: u8 = rb_action(ev); + if (a == GC_RB_RESET) { + return body_from(ev, G_BASE, 0); + } + if ((a == GC_RB_CARRY) && sha_ok(ev, R_CT, 0)) { + return body_from(ev, R_CT, 0); + } + if sha_ok(ev, G_HEAD, 0) { + return body_from(ev, G_HEAD, 0); + } + return ev.len(); +} + +pub fn pushed_off(ev: &'static str) -> usize { + if (rb_action(ev) != GC_RB_NONE) { + return body_from(ev, G_BASE, 0); + } + if sha_ok(ev, P_PUSHED, 0) { + return body_from(ev, P_PUSHED, 0); + } + return ev.len(); +} + pub fn has_head(ev: &'static str) -> bool { - return sha_ok(ev, G_HEAD, 0); + return (head_off(ev) < ev.len()); +} + +pub fn has_pushed(ev: &'static str) -> bool { + return (pushed_off(ev) < ev.len()); } pub fn cur0(ev: &'static str) -> usize { if has_head(ev) { - return body_from(ev, G_HEAD, 0); + return head_off(ev); } return body_from(ev, G_BASE, 0); } @@ -322,8 +392,9 @@ pub fn path_ok(ev: &'static str, ls: usize) -> bool { return false; } let mut k: usize = (ls + 2); + let seal: bool = starts(ev, (ls + 2), e, SEAL_DIR); while (k < e) { - if ((name_byte(ev.as_bytes()[(k) as usize]) == false) && (ev.as_bytes()[(k) as usize] != 43)) { + if (((name_byte(ev.as_bytes()[(k) as usize]) == false) && (ev.as_bytes()[(k) as usize] != 43)) && ((seal == false) || (ev.as_bytes()[(k) as usize] != 58))) { return false; } if ((((k + 1) < e) && (ev.as_bytes()[(k) as usize] == 46)) && (ev.as_bytes()[((k + 1)) as usize] == 46)) { @@ -395,10 +466,106 @@ pub fn gen_ok(ev: &'static str, n: u64) -> bool { return ((derived == false) || (targets(ev, n) > 0)); } -pub fn seal_clean(ev: &'static str, n: u64) -> bool { - let f: usize = body_from(ev, G_SEAL, n); - let t: usize = body_to(ev, G_SEAL, n); - return (((exit_of(ev, G_SEAL, n) == 0) && (find_in(ev, f, t, "all hashes MATCH") <= t)) && (find_in(ev, f, t, "VERIFICATION FAILED") > t)); +pub fn seal_clean(ev: &'static str, k: u8, n: u64) -> bool { + let f: usize = body_from(ev, k, n); + let t: usize = body_to(ev, k, n); + return (((exit_of(ev, k, n) == 0) && (find_in(ev, f, t, "all hashes MATCH") <= t)) && (find_in(ev, f, t, "VERIFICATION FAILED") > t)); +} + +pub fn seal_state(ev: &'static str, n: u64) -> u8 { + if (ran(ev, G_SEAL, n) == false) { + return 1; + } + if seal_clean(ev, G_SEAL, n) { + return 0; + } + if (ran(ev, S_RECHECK, n) == false) { + return 1; + } + if seal_clean(ev, S_RECHECK, n) { + return 0; + } + return 2; +} + +pub fn saved_any(ev: &'static str, link: u64) -> bool { + let m: usize = ch_count(ev, link); + let mut i: usize = 0; + while (i < m) { + if (is_target(ev, ch_line(ev, link, i)) && ran(ev, S_SAVE, ((link * TGT) + (i as u64)))) { + return true; + } + i = (i + 1); + } + return false; +} + +pub fn diff_changed(ev: &'static str, link: u64) -> usize { + return lines_in(ev, body_from(ev, S_DIFF, (link * TGT)), body_to(ev, S_DIFF, (link * TGT))); +} + +pub fn diff_seals(ev: &'static str, link: u64) -> usize { + let mut c: usize = 0; + let mut p: usize = body_from(ev, S_DIFF, (link * TGT)); + let t: usize = body_to(ev, S_DIFF, (link * TGT)); + while (p < t) { + let e: usize = line_end(ev, p); + if ((e > p) && starts(ev, p, e, SEAL_DIR)) { + c = (c + 1); + } + p = (e + 1); + } + return c; +} + +pub fn diff_ok(ev: &'static str, link: u64) -> bool { + return ((exit_of(ev, S_DIFF, (link * TGT)) == 0) && gc_regen_ok(diff_changed(ev, link), diff_seals(ev, link))); +} + +pub fn regen_verdict(ev: &'static str, link: u64) -> u8 { + if (saved_any(ev, link) == false) { + return GC_V_PASS; + } + let lk: u64 = (link * TGT); + if (ran(ev, S_STAGE, lk) == false) { + return GC_V_NONE; + } + if (exit_of(ev, S_STAGE, lk) != 0) { + return GC_V_FAIL; + } + if (ran(ev, S_DIFF, lk) == false) { + return GC_V_NONE; + } + if (diff_ok(ev, link) == false) { + return GC_V_FAIL; + } + if (diff_changed(ev, link) == 0) { + return GC_V_PASS; + } + if (ran(ev, S_COMMIT, lk) == false) { + return GC_V_NONE; + } + if (exit_of(ev, S_COMMIT, lk) != 0) { + return GC_V_FAIL; + } + if (ran(ev, S_TIP, lk) == false) { + return GC_V_NONE; + } + if sha_ok(ev, S_TIP, lk) { + return GC_V_PASS; + } + return GC_V_FAIL; +} + +pub fn regen_tip_ok(ev: &'static str, link: u64) -> bool { + return sha_ok(ev, S_TIP, (link * TGT)); +} + +pub fn tip_off(ev: &'static str, link: u64) -> usize { + if regen_tip_ok(ev, link) { + return body_from(ev, S_TIP, (link * TGT)); + } + return body_from(ev, G_TIP, link); } pub fn test_clean(ev: &'static str, n: u64) -> bool { @@ -417,12 +584,18 @@ pub fn all_targets(ev: &'static str, link: u64, k: u8) -> u8 { if (ran(ev, k, n) == false) { open = true; } else { - if ((k == G_SEAL) && (seal_clean(ev, n) == false)) { + if ((k == G_TEST) && (test_clean(ev, n) == false)) { return 2; } - if ((k == G_TEST) && (test_clean(ev, n) == false)) { + } + if (k == G_SEAL) { + let sst: u8 = seal_state(ev, n); + if (sst == 2) { return 2; } + if (sst == 1) { + open = true; + } } } i = (i + 1); @@ -443,6 +616,9 @@ pub fn verdict(ev: &'static str, n: u64, st: u8) -> u8 { } return GC_V_FAIL; } + if ((((st == 3) && (targets(ev, n) > 0)) && (all_targets(ev, n, G_TEST) == 2)) && (verdict(ev, n, 1) == GC_V_PASS)) { + return GC_V_FAIL; + } if ((verdict(ev, n, (st - 1)) != GC_V_PASS) && (verdict(ev, n, (st - 1)) != GC_V_REUSED)) { return GC_V_NONE; } @@ -461,6 +637,9 @@ pub fn verdict(ev: &'static str, n: u64, st: u8) -> u8 { k = G_TEST; } let a: u8 = all_targets(ev, n, k); + if ((a == 0) && (st == 2)) { + return regen_verdict(ev, n); + } if (a == 0) { return GC_V_PASS; } @@ -509,6 +688,9 @@ pub fn plan(ev: &'static str, n: usize, out: &mut [u8], pos: &mut [usize]) -> us v[(((i * 5) + (st as usize))) as usize] = verdict(ev, (i as u64), st); st = (st + 1); } + if (exit_of(ev, G_MT, (i as u64)) == 1) { + v[((i * 5)) as usize] = GC_V_FAIL; + } let mut c: usize = ch_count(ev, (i as u64)); if (c > GL_E_MAX) { c = GL_E_MAX; @@ -548,7 +730,7 @@ pub fn landing_at(ev: &'static str, n: usize, r: usize, wo: &mut [u8], wp: &mut pub fn new_of(ev: &'static str, j: u64, outcome: u8) -> usize { if (outcome == GC_OUT_FORWARD) { - return body_from(ev, G_TIP, j); + return tip_off(ev, j); } return body_from(ev, G_CT, j); } @@ -691,21 +873,54 @@ pub fn link_slot(ev: &'static str, j: u64) -> u64 { } if (exit_of(ev, G_WT, j) == 0) { let m: usize = ch_count(ev, j); + let lk: u64 = (j * TGT); let mut i: usize = 0; while (i < m) { - if (is_target(ev, ch_line(ev, j, i)) && (ran(ev, G_SEAL, ((j * TGT) + (i as u64))) == false)) { - return slot_of(G_SEAL, ((j * TGT) + (i as u64))); + if (is_target(ev, ch_line(ev, j, i)) && (ran(ev, G_SEAL, (lk + (i as u64))) == false)) { + return slot_of(G_SEAL, (lk + (i as u64))); } i = (i + 1); } - if (all_targets(ev, j, G_SEAL) == 0) { + i = 0; + while (i < m) { + if (is_target(ev, ch_line(ev, j, i)) && (ran(ev, G_TEST, (lk + (i as u64))) == false)) { + return slot_of(G_TEST, (lk + (i as u64))); + } + i = (i + 1); + } + if (all_targets(ev, j, G_TEST) == 0) { + i = 0; + while (i < m) { + let n: u64 = (lk + (i as u64)); + if ((is_target(ev, ch_line(ev, j, i)) && (seal_clean(ev, G_SEAL, n) == false)) && (ran(ev, S_SAVE, n) == false)) { + return slot_of(S_SAVE, n); + } + i = (i + 1); + } i = 0; while (i < m) { - if (is_target(ev, ch_line(ev, j, i)) && (ran(ev, G_TEST, ((j * TGT) + (i as u64))) == false)) { - return slot_of(G_TEST, ((j * TGT) + (i as u64))); + let n: u64 = (lk + (i as u64)); + if ((is_target(ev, ch_line(ev, j, i)) && ran(ev, S_SAVE, n)) && (ran(ev, S_RECHECK, n) == false)) { + return slot_of(S_RECHECK, n); } i = (i + 1); } + if (saved_any(ev, j) && (all_targets(ev, j, G_SEAL) == 0)) { + if (ran(ev, S_STAGE, lk) == false) { + return slot_of(S_STAGE, lk); + } + if ((exit_of(ev, S_STAGE, lk) == 0) && (ran(ev, S_DIFF, lk) == false)) { + return slot_of(S_DIFF, lk); + } + if (((exit_of(ev, S_STAGE, lk) == 0) && diff_ok(ev, j)) && (diff_changed(ev, j) > 0)) { + if (ran(ev, S_COMMIT, lk) == false) { + return slot_of(S_COMMIT, lk); + } + if ((exit_of(ev, S_COMMIT, lk) == 0) && (ran(ev, S_TIP, lk) == false)) { + return slot_of(S_TIP, lk); + } + } + } } if (ran(ev, G_RM, j) == false) { return slot_of(G_RM, j); @@ -725,6 +940,45 @@ pub fn next_slot(r: GolReq, ev: &'static str, wo: &mut [u8], wp: &mut [usize]) - if (sha_ok(ev, G_BASE, 0) == false) { return DONE; } + if sha_ok(ev, G_HEAD, 0) { + if (ran(ev, P_PUSHED, 0) == false) { + return slot_of(P_PUSHED, 0); + } + if sha_ok(ev, P_PUSHED, 0) { + if (ran(ev, R_ANC, 0) == false) { + return slot_of(R_ANC, 0); + } + let rb: u8 = rb_action(ev); + if (rb == GC_RB_CARRY) { + if (ran(ev, R_MT, 0) == false) { + return slot_of(R_MT, 0); + } + if (sha_ok(ev, R_MT, 0) == false) { + return DONE; + } + if (ran(ev, R_CT, 0) == false) { + return slot_of(R_CT, 0); + } + if (sha_ok(ev, R_CT, 0) == false) { + return DONE; + } + } + if (((rb != GC_RB_NONE) && (r.plan == false)) && (r.verb != V_STATUS)) { + if (ran(ev, R_UH, 0) == false) { + return slot_of(R_UH, 0); + } + if (exit_of(ev, R_UH, 0) != 0) { + return DONE; + } + if (ran(ev, R_UP, 0) == false) { + return slot_of(R_UP, 0); + } + if (exit_of(ev, R_UP, 0) != 0) { + return DONE; + } + } + } + } if (r.verb == V_LAND) { let n: usize = q_count(ev); let mut j: usize = 0; @@ -790,9 +1044,21 @@ pub fn judge(r: GolReq, ev: &'static str, k: u8, n: u64) -> u8 { if ((k == G_BASE) && (sha_ok(ev, G_BASE, 0) == false)) { return C_NO_BASE; } - if ((k == G_MT) && (x != 0)) { + if ((k == G_MT) && (x > 1)) { + return C_STEP; + } + if ((k == R_MT) && (x == 1)) { return C_MERGE; } + if ((k == R_MT) && (x > 1)) { + return C_STEP; + } + if ((k == R_CT) && (sha_ok(ev, R_CT, 0) == false)) { + return C_STEP; + } + if (((k == R_UH) || (k == R_UP)) && (x != 0)) { + return C_HEAD_MOVED; + } if ((k == G_CT) && (sha_ok(ev, G_CT, n) == false)) { return C_STEP; } @@ -809,7 +1075,7 @@ pub fn judge(r: GolReq, ev: &'static str, k: u8, n: u64) -> u8 { } pub fn in_scratch(k: u8) -> bool { - return ((k == G_SEAL) || (k == G_TEST)); + return (((k == G_SEAL) || (k == G_TEST)) || ((k >= S_SAVE) && (k <= S_TIP))); } pub fn arg(out: &mut [u8], w0: usize, s: &'static str) -> usize { @@ -897,7 +1163,22 @@ pub fn args_ready(ev: &'static str, k: u8, j: u64) -> bool { return (sha_ok(ev, G_TIP, j) && cur); } if (k == P_AHEAD) { - return (has_head(ev) && (sha_ok(ev, P_PUSHED, 0) || sha_ok(ev, G_BASE, 0))); + return (has_head(ev) && (has_pushed(ev) || sha_ok(ev, G_BASE, 0))); + } + if ((k == R_ANC) || (k == R_MT)) { + return ((sha_ok(ev, G_HEAD, 0) && sha_ok(ev, P_PUSHED, 0)) && sha_ok(ev, G_BASE, 0)); + } + if (k == R_CT) { + return (sha_ok(ev, R_MT, 0) && sha_ok(ev, G_BASE, 0)); + } + if (k == R_UH) { + return ((sha_ok(ev, G_HEAD, 0) && sha_ok(ev, G_BASE, 0)) && ((rb_action(ev) != GC_RB_CARRY) || sha_ok(ev, R_CT, 0))); + } + if (k == R_UP) { + return (sha_ok(ev, P_PUSHED, 0) && sha_ok(ev, G_BASE, 0)); + } + if ((k >= S_SAVE) && (k <= S_TIP)) { + return sha_ok(ev, G_TIP, (j / TGT)); } if (((k == P_BRANCH) || (k == P_LAND)) || (k == P_MARK)) { return ((ahead_count(ev) > 0) && has_head(ev)); @@ -971,23 +1252,106 @@ pub fn step_argv(r: GolReq, ev: &'static str, k: u8, n: u64, out: &mut [u8], wo: w = emit_byte(out, w, 10); w = sha_arg(out, w, ev, body_from(ev, G_TIP, j)); } - if ((k == G_SEAL) || (k == G_TEST)) { + if ((((k == G_SEAL) || (k == G_TEST)) || (k == S_SAVE)) || (k == S_RECHECK)) { let link: u64 = (j / TGT); let ls: usize = ch_line(ev, link, ((j % TGT) as usize)); if (is_target(ev, ls) == false) { return 0; } - if (k == G_SEAL) { + if (k != G_TEST) { w = arg(out, w, r.t27c); w = arg(out, w, "seal"); w = arg_span(out, w, ev, (ls + 2), line_end(ev, ls)); - w = arg(out, w, "--verify"); + if (k == S_SAVE) { + w = arg(out, w, "--save"); + } else { + w = arg(out, w, "--verify"); + } } else { w = arg(out, w, r.t27b); w = arg(out, w, "test"); w = arg_span(out, w, ev, (ls + 2), line_end(ev, ls)); } } + if (k == S_STAGE) { + w = git(out, w, "add"); + w = arg(out, w, "-A"); + } + if (k == S_DIFF) { + w = git(out, w, "diff"); + w = arg(out, w, "--cached"); + w = arg(out, w, "--name-only"); + } + if (k == S_COMMIT) { + w = git(out, w, "-c"); + w = arg(out, w, "user.name=tri-golden"); + w = arg(out, w, "-c"); + w = arg(out, w, "user.email=golden@t27.ai"); + w = arg(out, w, "-c"); + w = arg(out, w, "commit.gpgsign=false"); + w = arg(out, w, "commit"); + w = arg(out, w, "--no-verify"); + w = arg(out, w, "-q"); + w = arg(out, w, "-m"); + w = emit_str(out, w, "golden: save the seals again on the tip (t27c seal --save, tests clean)"); + if (r.issue > 0) { + w = emit_str(out, w, " (Closes #"); + w = emit_dec(out, w, r.issue); + w = emit_str(out, w, ")"); + } + w = emit_byte(out, w, 10); + } + if (k == S_TIP) { + w = git(out, w, "rev-parse"); + w = arg(out, w, "--verify"); + w = arg(out, w, "-q"); + w = arg(out, w, "HEAD"); + } + if (k == R_ANC) { + w = git(out, w, "merge-base"); + w = arg(out, w, "--is-ancestor"); + w = sha_arg(out, w, ev, body_from(ev, G_HEAD, 0)); + w = sha_arg(out, w, ev, body_from(ev, G_BASE, 0)); + } + if (k == R_MT) { + w = git(out, w, "merge-tree"); + w = arg(out, w, "--write-tree"); + w = emit_str(out, w, "--merge-base="); + w = sha_arg(out, w, ev, body_from(ev, P_PUSHED, 0)); + w = sha_arg(out, w, ev, body_from(ev, G_BASE, 0)); + w = sha_arg(out, w, ev, body_from(ev, G_HEAD, 0)); + } + if (k == R_CT) { + w = git(out, w, "commit-tree"); + w = sha_arg(out, w, ev, body_from(ev, R_MT, 0)); + w = arg(out, w, "-p"); + w = sha_arg(out, w, ev, body_from(ev, G_BASE, 0)); + w = arg(out, w, "-m"); + w = emit_str(out, w, "golden: carry the unpushed links onto origin/master"); + if (r.issue > 0) { + w = emit_str(out, w, " (Closes #"); + w = emit_dec(out, w, r.issue); + w = emit_str(out, w, ")"); + } + w = emit_byte(out, w, 10); + } + if (k == R_UH) { + w = git(out, w, "update-ref"); + w = arg(out, w, GC_REF); + if (rb_action(ev) == GC_RB_CARRY) { + w = sha_arg(out, w, ev, body_from(ev, R_CT, 0)); + } else { + w = sha_arg(out, w, ev, body_from(ev, G_BASE, 0)); + } + w = sha_arg(out, w, ev, body_from(ev, G_HEAD, 0)); + } + if (k == R_UP) { + w = git(out, w, "update-ref"); + w = arg(out, w, "--create-reflog"); + w = arg(out, w, GL_PUSHED); + w = sha_arg(out, w, ev, body_from(ev, G_BASE, 0)); + w = sha_arg(out, w, ev, body_from(ev, P_PUSHED, 0)); + } if (k == G_RM) { w = git(out, w, "worktree"); w = arg(out, w, "remove"); @@ -1003,7 +1367,7 @@ pub fn step_argv(r: GolReq, ev: &'static str, k: u8, n: u64, out: &mut [u8], wo: w = emit_str(out, w, "--merge-base="); w = sha_arg(out, w, ev, body_from(ev, G_MB, j)); w = sha_arg(out, w, ev, cur); - w = sha_arg(out, w, ev, body_from(ev, G_TIP, j)); + w = sha_arg(out, w, ev, tip_off(ev, j)); } if (k == G_CT) { w = git(out, w, "commit-tree"); @@ -1042,13 +1406,13 @@ pub fn step_argv(r: GolReq, ev: &'static str, k: u8, n: u64, out: &mut [u8], wo: w = git(out, w, "rev-list"); w = arg(out, w, "--first-parent"); w = arg(out, w, "--reverse"); - if sha_ok(ev, P_PUSHED, 0) { - w = put_span(out, w, ev, body_from(ev, P_PUSHED, 0), (body_from(ev, P_PUSHED, 0) + 40)); + if has_pushed(ev) { + w = put_span(out, w, ev, pushed_off(ev), (pushed_off(ev) + 40)); } else { w = put_span(out, w, ev, body_from(ev, G_BASE, 0), (body_from(ev, G_BASE, 0) + 40)); } w = emit_str(out, w, ".."); - w = sha_arg(out, w, ev, body_from(ev, G_HEAD, 0)); + w = sha_arg(out, w, ev, head_off(ev)); } if (k == P_STAMP) { w = git(out, w, "reflog"); @@ -1094,8 +1458,8 @@ pub fn step_argv(r: GolReq, ev: &'static str, k: u8, n: u64, out: &mut [u8], wo: w = arg(out, w, "--create-reflog"); w = arg(out, w, GL_PUSHED); w = sha_arg(out, w, ev, target_off(ev)); - if sha_ok(ev, P_PUSHED, 0) { - w = sha_arg(out, w, ev, body_from(ev, P_PUSHED, 0)); + if has_pushed(ev) { + w = sha_arg(out, w, ev, pushed_off(ev)); } else { w = zero_arg(out, w); } @@ -1159,7 +1523,7 @@ pub fn code_why(c: u8) -> &'static str { return "refs/remotes/origin/master is missing: git fetch origin master"; } if (c == C_MERGE) { - return "git merge-tree met a conflict: the link goes back to its bee"; + return "git merge-tree met a conflict carrying the unpushed links onto origin/master: a person decides"; } if (c == C_STEP) { return "a git step failed; its output is the evidence"; @@ -1195,6 +1559,13 @@ pub fn outcome_name(o: u8) -> &'static str { return "UNKNOWN_PARENT"; } +pub fn outcome_shown(ev: &'static str, i: usize, o: u8) -> u8 { + if (exit_of(ev, G_MT, (i as u64)) == 1) { + return GC_OUT_CONFLICT; + } + return gc_regen_view(o, regen_tip_ok(ev, (i as u64))); +} + pub fn verdict_letter(v: u8) -> u8 { if (v == GC_V_PASS) { return 112; @@ -1239,7 +1610,7 @@ pub fn put_cmd(out: &mut [u8], w: usize, r: GolReq, ev: &'static str, k: u8, n: pub fn report_land(r: GolReq, ev: &'static str, out: &mut [u8], wo: &mut [u8], wp: &mut [usize], tmp: &mut [u8]) -> usize { let mut w: usize = emit_str(out, 0, "golden head: "); - w = put_sha12(out, w, ev, off_if(ev, G_HEAD, 0)); + w = put_sha12(out, w, ev, head_off(ev)); if (has_head(ev) == false) { w = emit_str(out, w, " (base "); w = put_sha12(out, w, ev, off_if(ev, G_BASE, 0)); @@ -1261,7 +1632,7 @@ pub fn report_land(r: GolReq, ev: &'static str, out: &mut [u8], wo: &mut [u8], w st = (st + 1); } w = emit_byte(out, w, 32); - w = emit_str(out, w, outcome_name(wo[(i) as usize])); + w = emit_str(out, w, outcome_name(outcome_shown(ev, i, wo[(i) as usize]))); w = emit_byte(out, w, 10); i = (i + 1); } @@ -1283,9 +1654,9 @@ pub fn report_land(r: GolReq, ev: &'static str, out: &mut [u8], wo: &mut [u8], w pub fn report_push(r: GolReq, ev: &'static str, out: &mut [u8], wo: &mut [u8], wp: &mut [usize], tmp: &mut [u8]) -> usize { let mut w: usize = emit_str(out, 0, "golden head: "); - w = put_sha12(out, w, ev, off_if(ev, G_HEAD, 0)); + w = put_sha12(out, w, ev, head_off(ev)); w = emit_str(out, w, "\npushed: "); - w = put_sha12(out, w, ev, off_if(ev, P_PUSHED, 0)); + w = put_sha12(out, w, ev, pushed_off(ev)); w = emit_str(out, w, "\nunpushed links: "); w = emit_dec(out, w, (ahead_count(ev) as u64)); w = emit_str(out, w, " (batch "); @@ -1407,7 +1778,7 @@ pub const EV_PLAN_K1: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\ncl pub const EV_CONF: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nM\tspecs/x/a.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n"; -pub const EV_SEALBAD: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nA\tspecs/x/b.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n"; +pub const EV_SEALBAD: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n@@ preflight 30 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nA\tspecs/x/b.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n"; pub const EV_NOCLOSES: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 7\ngolden\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nA\tspecs/x/b.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n"; @@ -1415,9 +1786,9 @@ pub const EV_GENONLY: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\ncl pub const EV_VACUOUS: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 0 passed, 0 failed, 0 total\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nA\tspecs/x/b.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n"; -pub const EV_MOVED: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nA\tspecs/x/b.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n"; +pub const EV_MOVED: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nA\tspecs/x/b.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n@@ preflight 15 0 1 0\n\n"; -pub const EV_HEADED: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n"; +pub const EV_HEADED: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n@@ preflight 15 0 1 0\n\n"; pub const EV_NOBASE: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 1 0\n\n"; @@ -1425,15 +1796,15 @@ pub const EV_Q: &'static str = "@@ preflight 0 0 0 26\nclaude/evolve-a\nmaster\n pub const EV_P_FIRST: &'static str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 1 0\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 18 0 0 11\n1760000000\n\n"; -pub const EV_P_NONE: &'static str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 0\n\n@@ preflight 17 0 0 11\n1759994000\n\n@@ preflight 18 0 0 11\n1760000000\n\n"; +pub const EV_P_NONE: &'static str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 0\n\n@@ preflight 17 0 0 11\n1759994000\n\n@@ preflight 18 0 0 11\n1760000000\n\n@@ preflight 24 0 0 0\n\n"; -pub const EV_P_20: &'static str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 17 0 0 11\n1759998800\n\n@@ preflight 18 0 0 11\n1760000000\n\n"; +pub const EV_P_20: &'static str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 17 0 0 11\n1759998800\n\n@@ preflight 18 0 0 11\n1760000000\n\n@@ preflight 24 0 0 0\n\n"; -pub const EV_P_30: &'static str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 17 0 0 11\n1759998200\n\n@@ preflight 18 0 0 11\n1760000000\n\n"; +pub const EV_P_30: &'static str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 17 0 0 11\n1759998200\n\n@@ preflight 18 0 0 11\n1760000000\n\n@@ preflight 24 0 0 0\n\n"; -pub const EV_P_TEN: &'static str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 410\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n1313131313131313131313131313131313131313\n1414141414141414141414141414141414141414\n1515151515151515151515151515151515151515\n1616161616161616161616161616161616161616\n1717171717171717171717171717171717171717\n1818181818181818181818181818181818181818\n1919191919191919191919191919191919191919\n\n@@ preflight 17 0 0 11\n1759998200\n\n@@ preflight 18 0 0 11\n1760000000\n\n"; +pub const EV_P_TEN: &'static str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 410\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n1313131313131313131313131313131313131313\n1414141414141414141414141414141414141414\n1515151515151515151515151515151515151515\n1616161616161616161616161616161616161616\n1717171717171717171717171717171717171717\n1818181818181818181818181818181818181818\n1919191919191919191919191919191919191919\n\n@@ preflight 17 0 0 11\n1759998200\n\n@@ preflight 18 0 0 11\n1760000000\n\n@@ preflight 24 0 0 0\n\n"; -pub const EV_P_GH: &'static str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 17 0 0 11\n1759998800\n\n@@ preflight 18 0 0 11\n1760000000\n\n@@ preflight 19 0 0 53\n[{\"databaseId\":1},{\"databaseId\":2},{\"databaseId\":3}]\n\n"; +pub const EV_P_GH: &'static str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 17 0 0 11\n1759998800\n\n@@ preflight 18 0 0 11\n1760000000\n\n@@ preflight 19 0 0 53\n[{\"databaseId\":1},{\"databaseId\":2},{\"databaseId\":3}]\n\n@@ preflight 24 0 0 0\n\n"; pub const EV_P_BRANCHED: &'static str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 1 0\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 18 0 0 11\n1760000000\n\n@@ preflight 20 0 0 0\n\n"; @@ -1451,6 +1822,46 @@ pub const FS8: &'static str = "1818181818181818181818181818181818181818"; pub const FS9: &'static str = "1919191919191919191919191919191919191919"; +pub const EV_RG1: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n"; + +pub const EV_RG2: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n"; + +pub const EV_RG3: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n"; + +pub const EV_RG4: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n@@ preflight 30 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n"; + +pub const EV_RG5: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n@@ preflight 30 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 31 0 0 0\n\n"; + +pub const EV_RG6: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n@@ preflight 30 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 31 0 0 0\n\n@@ preflight 32 0 0 30\n.trinity/seals/specs_x_a.json\n\n"; + +pub const EV_RG7: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n@@ preflight 30 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 31 0 0 0\n\n@@ preflight 32 0 0 30\n.trinity/seals/specs_x_a.json\n\n@@ preflight 33 0 0 0\n\n"; + +pub const EV_RG8: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n@@ preflight 30 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 31 0 0 0\n\n@@ preflight 32 0 0 30\n.trinity/seals/specs_x_a.json\n\n@@ preflight 33 0 0 0\n\n@@ preflight 34 0 0 41\n9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a\n\n"; + +pub const EV_REGEN: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n@@ preflight 30 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 31 0 0 0\n\n@@ preflight 32 0 0 30\n.trinity/seals/specs_x_a.json\n\n@@ preflight 33 0 0 0\n\n@@ preflight 34 0 0 41\n9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a\n\n@@ preflight 11 0 0 0\n\n"; + +pub const EV_RGBAD: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n@@ preflight 30 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 31 0 0 0\n\n@@ preflight 32 0 0 48\n.trinity/seals/specs_x_a.json\nspecs/x/other.t27\n\n@@ preflight 11 0 0 0\n\n"; + +pub const EV_RGTEST: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 1 34\nTriX: 2 passed, 1 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n"; + +pub const EV_RGOK: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n"; + +pub const EV_RB_RESET: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 24 0 1 0\n\n"; + +pub const EV_RB_RESET_UH: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 24 0 1 0\n\n@@ preflight 27 0 0 0\n\n"; + +pub const EV_RB_HELD: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 24 0 0 0\n\n"; + +pub const EV_RB_CARRY: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\n9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b\n\n@@ preflight 24 0 1 0\n\n"; + +pub const EV_RB_CMT: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\n9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b\n\n@@ preflight 24 0 1 0\n\n@@ preflight 25 0 0 41\nf6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6\n\n"; + +pub const EV_RB_CCT: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\n9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b\n\n@@ preflight 24 0 1 0\n\n@@ preflight 25 0 0 41\nf6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6\n\n@@ preflight 26 0 0 41\ne5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5\n\n"; + +pub const EV_RB_CONFLICT: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\n9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b\n\n@@ preflight 24 0 1 0\n\n@@ preflight 25 0 1 60\nf6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6\nCONFLICT (content)\n\n"; + +pub const EV_C1X: &'static str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nA\tspecs/x/b.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n@@ preflight 14 0 0 0\n\n@@ preflight 12 1 1 57\ncccc\nCONFLICT (content): Merge conflict in specs/x/b.t27\n\n"; + pub const T_ZERO: &'static str = "0000000000000000000000000000000000000000"; pub fn rq(verb: u8, plan: bool, queued: u64) -> GolReq { @@ -1481,6 +1892,12 @@ pub fn buf_has_not(buf: &[u8], n: usize, want: &'static str) -> bool { return true; } +pub const RGS: &'static str = "9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a"; + +pub const PUS: &'static str = "9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b"; + +pub const CTS: &'static str = "e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5"; + pub const EDIT_APPEND: u8 = 2; pub const EDIT_LINES: u8 = 1; @@ -1548,6 +1965,12 @@ pub const GC_PUSH_NOW: u8 = 2; pub const GC_PUSH_WAIT: u8 = 1; +pub const GC_RB_CARRY: u8 = 2; + +pub const GC_RB_NONE: u8 = 0; + +pub const GC_RB_RESET: u8 = 1; + pub const GC_RECEIPT: u8 = 4; pub const GC_REF: &'static str = "refs/golden/head"; @@ -1666,6 +2089,9 @@ pub fn gc_land(n: usize, id: impl AsRef<[u64]>, parent: impl AsRef<[u64]>, v: &[ } } } + if ((since == n) && (parent[(i) as usize] != 0)) { + since = 0; + } if (since == n) { out[(i) as usize] = GC_OUT_UNKNOWN_PARENT; } else { @@ -1740,6 +2166,27 @@ pub fn gc_pair(a_path: u64, a_kind: u8, a_lo: u32, a_hi: u32, b_path: u64, b_kin return GC_PAIR_APART; } +pub fn gc_rebase(head_ok: bool, pushed_ok: bool, same: bool, master_has_head: bool) -> u8 { + if (((head_ok == false) || (pushed_ok == false)) || master_has_head) { + return GC_RB_NONE; + } + if same { + return GC_RB_RESET; + } + return GC_RB_CARRY; +} + +pub fn gc_regen_ok(changed: usize, seals: usize) -> bool { + return (changed == seals); +} + +pub fn gc_regen_view(out: u8, resealed: bool) -> u8 { + if (resealed && ((out == GC_OUT_FORWARD) || (out == GC_OUT_CARRIED))) { + return GC_OUT_REGEN; + } + return out; +} + pub fn when_to_push(minutes_since_last: u32, batch_len: usize, ci_queued: u32) -> u8 { if (batch_len == 0) { return GC_PUSH_NOTHING; diff --git a/specs/queen/golden_chain.t27 b/specs/queen/golden_chain.t27 index d2ed2bee56..bd8d6b8e57 100644 --- a/specs/queen/golden_chain.t27 +++ b/specs/queen/golden_chain.t27 @@ -149,8 +149,8 @@ pub fn gc_pair(a_path: u64, a_kind: u8, a_lo: u32, a_hi: u32, b_path: u64, b_kin /// FORWARD: its parent was the head. CARRIED: carried past what landed, nothing re-run. REGEN: a /// derived file both wrote is recomputed on the new head and sealed again; the other verdicts carry. /// REJUDGE: back to GEN, the frontier picks the nodes. CONFLICT: a source edit met one that landed; -/// back to a bee. NOT_GOLDEN: never landed. UNKNOWN_PARENT: its parent is neither the pass's head nor -/// a link that landed in the pass; it fails closed. +/// back to a bee. NOT_GOLDEN: never landed. UNKNOWN_PARENT: it has no parent id at all (no merge-base) +/// and fails closed. A parent that is neither the pass's head nor a link of the pass is carried (#11361). pub const GC_OUT_FORWARD : u8 = 0; pub const GC_OUT_CARRIED : u8 = 1; pub const GC_OUT_REGEN : u8 = 2; @@ -258,6 +258,12 @@ pub fn gc_land(n: usize, id: []const u64, parent: []const u64, v: []const u8, m: } } } + // A parent the chain never saw (a branch cut from an older master) is carried past every link that landed in + // this pass; the host's merge-tree then judges it against the real head (#11361). Only a link with no parent + // id at all (no merge-base) stays UNKNOWN_PARENT. + if (since == n and parent[i] != 0) { + since = 0; + } if (since == n) { out[i] = GC_OUT_UNKNOWN_PARENT; } else { @@ -380,6 +386,10 @@ pub fn gc_region_counts(answer: u8) -> bool { ; at most GC_BATCH_MAX ready links, the window is GC_WINDOW_MIN minutes, doubled while the Actions ; queue holds GC_CI_JAM runs or more (a push into a jam only goes to the back of it, push_gate.t27). ; - Required checks run once per batch. A derived-only rebase (CARRIED or REGEN) re-runs nothing. +; - The chain follows master (#11361). GitHub squash-merges a batch, so the head is then no ancestor of +; origin/master: gc_rebase resets head and pushed to master when nothing is unpushed, and carries the +; unpushed links onto master as one commit otherwise. A link cut from an older master is carried, not +; refused (gc_land); a seal saved by an older t27c is saved again after the tests (gc_regen_ok, REGEN). ; - A red batch is bisected here, by verdicts: gc_bisect finds the first link whose prefix is red from ; locally replayed prefix verdicts; it is not found by re-running GitHub. @@ -453,6 +463,40 @@ pub fn gc_rerun_local(out: u8) -> bool { return out >= GC_OUT_REJUDGE; } +/// After GitHub squash-merges a batch, refs/golden/head is no longer an ancestor of origin/master, so every link +/// cut from origin/master would read as a stranger (#11361). The chain follows master: +/// NONE: no head, no pushed mark, or origin/master already holds the head: nothing to do. +/// RESET: nothing is unpushed (pushed is the head) and master does not hold it: head and pushed both move to master. +/// CARRY: links are unpushed and master does not hold the head: they are carried onto master as one commit +/// (merge-tree with the pushed mark as the base), then head moves to it and pushed to master. +pub const GC_RB_NONE : u8 = 0; +pub const GC_RB_RESET : u8 = 1; +pub const GC_RB_CARRY : u8 = 2; + +pub fn gc_rebase(head_ok: bool, pushed_ok: bool, same: bool, master_has_head: bool) -> u8 { + if (head_ok == false or pushed_ok == false or master_has_head) { + return GC_RB_NONE; + } + if (same) { + return GC_RB_RESET; + } + return GC_RB_CARRY; +} + +/// A link whose seals were saved by an older t27c has them saved again on its own tree (t27c seal --save, then +/// --verify), after its tests passed. Only .trinity/seals/ may change: every changed path must be a seal. +pub fn gc_regen_ok(changed: usize, seals: usize) -> bool { + return changed == seals; +} + +/// The outcome to show: FORWARD or CARRIED become REGEN when the link's seals were re-saved; any other stands. +pub fn gc_regen_view(out: u8, resealed: bool) -> u8 { + if (resealed and (out == GC_OUT_FORWARD or out == GC_OUT_CARRIED)) { + return GC_OUT_REGEN; + } + return out; +} + /// The first red prefix of a batch, by binary search. red[j-1] is true when the golden head after the /// first j links of the batch is red (replayed locally; monotone: once red, red). Returns j, the link /// that turned it red, or 0 when no prefix is red. @@ -603,9 +647,9 @@ test negative_control_a_link_that_is_not_golden_never_lands_and_moves_nothing { assert out[2] == GC_OUT_CARRIED; } -test negative_control_a_parent_nobody_landed_fails_closed { +test negative_control_a_link_with_no_parent_id_fails_closed { var id : [2]u64 = [2]u64{ 11, 12 }; - var parent : [2]u64 = [2]u64{ 1, 99 }; + var parent : [2]u64 = [2]u64{ 1, 0 }; var v : [10]u8 = [10]u8{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; var eo : [2]usize = [2]usize{ 0, 1 }; var ep : [2]u64 = [2]u64{ 100, 200 }; @@ -749,6 +793,47 @@ invariant five_stages_and_done_after_them { ; --- Section 6 tests ----------------------------------------------------------------------------------- +test the_chain_follows_master_after_a_squash_merge { + // nothing unpushed and master lost the head: reset both refs to master + assert gc_rebase(true, true, true, false) == GC_RB_RESET; + // links unpushed and master lost the head: carry them onto master + assert gc_rebase(true, true, false, false) == GC_RB_CARRY; + // master holds the head, or a ref is missing: leave everything alone + assert gc_rebase(true, true, true, true) == GC_RB_NONE; + assert gc_rebase(true, true, false, true) == GC_RB_NONE; + assert gc_rebase(false, true, true, false) == GC_RB_NONE; + assert gc_rebase(true, false, false, false) == GC_RB_NONE; +} + +test re_saved_seals_may_change_only_seals_and_land_as_regen { + assert gc_regen_ok(3, 3) == true and gc_regen_ok(0, 0) == true; + // a changed path that is not a seal refuses the re-save + assert gc_regen_ok(3, 2) == false; + assert gc_regen_view(GC_OUT_FORWARD, true) == GC_OUT_REGEN and gc_regen_view(GC_OUT_CARRIED, true) == GC_OUT_REGEN; + assert gc_regen_view(GC_OUT_FORWARD, false) == GC_OUT_FORWARD; + // a refusal is never dressed as a landing + assert gc_regen_view(GC_OUT_CONFLICT, true) == GC_OUT_CONFLICT and gc_regen_view(GC_OUT_NOT_GOLDEN, true) == GC_OUT_NOT_GOLDEN; +} + +test a_parent_the_chain_never_saw_is_carried_and_a_meeting_edit_still_conflicts { + var id : [3]u64 = [3]u64{ 11, 12, 13 }; + var parent : [3]u64 = [3]u64{ 1, 99, 98 }; + var v : [15]u8 = [15]u8{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + var eo : [3]usize = [3]usize{ 0, 1, 2 }; + var ep : [3]u64 = [3]u64{ 100, 200, 100 }; + var ek : [3]u8 = [3]u8{ EDIT_WHOLE, EDIT_WHOLE, EDIT_WHOLE }; + var el : [3]u32 = [3]u32{ 0, 0, 0 }; + var eh : [3]u32 = [3]u32{ 0, 0, 0 }; + var io : [1]usize = [1]usize{ 0 }; + var ip : [1]u64 = [1]u64{ 900 }; + var out : [3]u8 = undefined; + var pos : [3]usize = undefined; + assert gc_land(3, &id, &parent, &v, 3, &eo, &ep, &ek, &el, &eh, 0, &io, &ip, 1, &out, &pos) == 2; + assert out[0] == GC_OUT_FORWARD and out[1] == GC_OUT_CARRIED; + // link 2 wrote the path link 0 wrote: carrying it past link 0 meets + assert out[2] == GC_OUT_CONFLICT; +} + test a_lane_is_ready_only_when_every_stage_is_golden_in_order { var v : [15]u8 = [15]u8{ 1, 2, 1, 1, 1, 1, 1, 1, 3, 0, 1, 0, 1, 1, 1 }; assert lane_ready(&v, 0) == true; diff --git a/specs/tri/land/golden_land.t27 b/specs/tri/land/golden_land.t27 index 8ff2c8b11a..c75a00f248 100644 --- a/specs/tri/land/golden_land.t27 +++ b/specs/tri/land/golden_land.t27 @@ -20,18 +20,29 @@ ; SPEC the diff against the merge-base reads: 1 to GL_E_MAX paths, all of safe bytes. ; GEN a change under gen/ comes with a change to a spec (L2: gen/ is generated, never alone). ; SEAL `t27c seal --verify` in a worktree of the tip, for every spec the link adds or modifies: all hashes MATCH. +; A seal that does not match is saved again (`--save`, then `--verify`) once the link's tests are clean (#11361): the seals of +; an older t27c are not a reason to refuse a link. Only .trinity/seals/ may change (git add -A, then git diff --cached lists +; nothing else); the re-saved seals are one commit on the link's tip and the link lands as REGEN. A failing test, a spec +; that does not compile, or any other changed path still refuses the link. ; TEST `t27b test ` in the same worktree: exit 0, no failure, not a vacuous 0 passed. ; RECEIPT a commit message of the link carries `Closes #N` (L1). ; A link with no spec has nothing to seal or test: those two stages are REUSED (the verdict of nothing to judge). ; THE LANDING. gc_land says FORWARD, CARRIED, REGEN or a refusal per link. A link whose parent is the head lands as its own tip; -; a carried one is a new commit on the head with the tree of `git merge-tree --write-tree` (no worktree touched). Every landing +; a carried one (also a link cut from an older master, #11361) is a new commit on the head with the tree of `git merge-tree +; --write-tree` (no worktree touched); a link that merge-tree cannot merge is CONFLICT and the pass goes on with the next one. Every landing ; is `git update-ref refs/golden/head `: git refuses when the head is not , which is the compare-and-swap, and the ; command stops with HEAD_MOVED. With --plan the read-only steps run (merge-tree and commit-tree only add unreferenced objects) ; and every update-ref is printed, none run: the head is written by no plan. +; THE CHAIN FOLLOWS MASTER (#11361). GitHub squash-merges a batch, so refs/golden/head is then no ancestor of origin/master and every new +; link would read as a stranger. At the start of land, push and status gc_rebase decides from refs/golden/head, refs/golden/pushed and +; `git merge-base --is-ancestor head origin/master`: RESET (nothing unpushed) moves head and pushed to origin/master, CARRY (links +; unpushed) makes ONE commit of them on origin/master by merge-tree with the pushed mark as the base, then moves head to it and pushed +; to origin/master. Both moves are update-ref with the old value (compare-and-swap); a plan and status write nothing. ; THE HONEST LIMITS. (1) Edits are whole files (no hunk regions): two links that edit one source file conflict. (2) Importers of a ; changed spec are not re-judged here: no import rows go to gc_land. (3) No verdict-reuse key is read: a stage is PASS or FAIL or -; the nothing-to-judge REUSED. (4) The queue is capped at GL_Q_MAX links per pass. (5) A conflict found by merge-tree stops the -; pass after the links that already landed; they stay landed (each landing was its own compare-and-swap). +; the nothing-to-judge REUSED. (4) The queue is capped at GL_Q_MAX links per pass. (5) A link merge-tree finds in conflict is +; CONFLICT and the pass goes on; a conflict while carrying the unpushed links onto master stops the pass (a person decides). (6) The +; stages of a link are judged on its tip (seals re-saved on the tip); merge-tree decides whether it carries onto the head. ; ASCII only (L3) ; phi^2 + 1/phi^2 = 3 | TRINITY @@ -59,6 +70,12 @@ use queen::golden_chain::GC_PUSH_NOTHING; use queen::golden_chain::GC_PUSH_WAIT; use queen::golden_chain::GC_PUSH_NOW; use queen::golden_chain::GC_REF; +use queen::golden_chain::gc_rebase; +use queen::golden_chain::gc_regen_ok; +use queen::golden_chain::gc_regen_view; +use queen::golden_chain::GC_RB_NONE; +use queen::golden_chain::GC_RB_RESET; +use queen::golden_chain::GC_RB_CARRY; use queen::actors::EDIT_WHOLE; use tri::lab::receipt::line_end; use tri::lab::receipt::span_is; @@ -112,7 +129,20 @@ pub const P_BRANCH : u8 = 20; pub const P_LAND : u8 = 21; pub const P_MARK : u8 = 22; pub const G_PRUNE : u8 = 23; -pub const GL_STEPS : u8 = 24; +// 24-28 make the chain follow master (once per run); 29-34 save the seals of a link again (#11361). +pub const R_ANC : u8 = 24; +pub const R_MT : u8 = 25; +pub const R_CT : u8 = 26; +pub const R_UH : u8 = 27; +pub const R_UP : u8 = 28; +pub const S_SAVE : u8 = 29; +pub const S_RECHECK : u8 = 30; +pub const S_STAGE : u8 = 31; +pub const S_DIFF : u8 = 32; +pub const S_COMMIT : u8 = 33; +pub const S_TIP : u8 = 34; +pub const GL_STEPS : u8 = 35; +pub const SEAL_DIR : str = ".trinity/seals/"; pub const V_LAND : u8 = 0; pub const V_PUSH : u8 = 1; @@ -147,7 +177,8 @@ invariant the_steps_are_numbered_in_the_order_they_run { assert G_CHG < G_LOG and G_LOG < G_WT and G_WT < G_SEAL and G_SEAL < G_TEST and G_TEST < G_RM and G_RM < G_MT; assert G_MT < G_CT and G_CT < G_CAS and G_CAS < P_PUSHED and P_PUSHED < P_AHEAD and P_AHEAD < P_STAMP; assert P_STAMP < P_NOW and P_NOW < P_QUEUED and P_QUEUED < P_BRANCH and P_BRANCH < P_LAND and P_LAND < P_MARK; - assert P_MARK + 1 == G_PRUNE and G_PRUNE + 1 == GL_STEPS; + assert P_MARK + 1 == G_PRUNE and G_PRUNE + 1 == R_ANC and R_ANC < R_MT and R_MT < R_CT and R_CT < R_UH and R_UH < R_UP; + assert R_UP + 1 == S_SAVE and S_SAVE < S_RECHECK and S_RECHECK < S_STAGE and S_STAGE < S_DIFF and S_DIFF < S_COMMIT and S_COMMIT < S_TIP and S_TIP + 1 == GL_STEPS; assert (GL_Q_MAX as u64) * TGT < SLOT; } @@ -210,13 +241,51 @@ pub fn id_of(ev: string, k: u8, n: u64) -> u64 { return hex15(ev, body_from(ev, k, n)); } +/// Do the 40 digits of step a and step b (entry 0 each) read the same? +pub fn same_sha(ev: string, a: u8, b: u8) -> bool { + var i : usize = 0; + while (i < 40) { + if (ev[body_from(ev, a, 0) + i] != ev[body_from(ev, b, 0) + i]) { return false; } + i = i + 1; + } + return true; +} + +/// What the chain does to follow master (golden_chain.t27 gc_rebase), read from the evidence. master_has_head is exit 0 of +/// `merge-base --is-ancestor`; any exit but 1 (an error) reads as "has it" and writes nothing. +pub fn rb_action(ev: string) -> u8 { + if (sha_ok(ev, G_HEAD, 0) == false or sha_ok(ev, P_PUSHED, 0) == false or ran(ev, R_ANC, 0) == false) { return GC_RB_NONE; } + return gc_rebase(true, true, same_sha(ev, G_HEAD, P_PUSHED), exit_of(ev, R_ANC, 0) != 1); +} + +/// Where the sha of the golden head begins; ev.len when there is none. After a decided rebase it is what the head becomes (the +/// refs are written by R_UH and R_UP, a plan or status writes none), so every later step reads one head. +pub fn head_off(ev: string) -> usize { + const a : u8 = rb_action(ev); + if (a == GC_RB_RESET) { return body_from(ev, G_BASE, 0); } + if (a == GC_RB_CARRY and sha_ok(ev, R_CT, 0)) { return body_from(ev, R_CT, 0); } + if (sha_ok(ev, G_HEAD, 0)) { return body_from(ev, G_HEAD, 0); } + return ev.len; +} + +/// The same for refs/golden/pushed: master once the chain follows master. +pub fn pushed_off(ev: string) -> usize { + if (rb_action(ev) != GC_RB_NONE) { return body_from(ev, G_BASE, 0); } + if (sha_ok(ev, P_PUSHED, 0)) { return body_from(ev, P_PUSHED, 0); } + return ev.len; +} + pub fn has_head(ev: string) -> bool { - return sha_ok(ev, G_HEAD, 0); + return head_off(ev) < ev.len; +} + +pub fn has_pushed(ev: string) -> bool { + return pushed_off(ev) < ev.len; } /// Where the sha of the commit new links are judged against begins: the golden head, else master of origin. pub fn cur0(ev: string) -> usize { - if (has_head(ev)) { return body_from(ev, G_HEAD, 0); } + if (has_head(ev)) { return head_off(ev); } return body_from(ev, G_BASE, 0); } @@ -320,8 +389,9 @@ pub fn path_ok(ev: string, ls: usize) -> bool { if (e < ls + 3 or ev[ls + 1] != 9) { return false; } if (ev[ls + 2] == 45) { return false; } var k : usize = ls + 2; + const seal : bool = starts(ev, ls + 2, e, SEAL_DIR); while (k < e) { - if (name_byte(ev[k]) == false and ev[k] != 43) { return false; } + if (name_byte(ev[k]) == false and ev[k] != 43 and (seal == false or ev[k] != 58)) { return false; } if (k + 1 < e and ev[k] == 46 and ev[k + 1] == 46) { return false; } k = k + 1; } @@ -378,10 +448,77 @@ pub fn gen_ok(ev: string, n: u64) -> bool { return derived == false or targets(ev, n) > 0; } -pub fn seal_clean(ev: string, n: u64) -> bool { - const f : usize = body_from(ev, G_SEAL, n); - const t : usize = body_to(ev, G_SEAL, n); - return exit_of(ev, G_SEAL, n) == 0 and find_in(ev, f, t, "all hashes MATCH") <= t and find_in(ev, f, t, "VERIFICATION FAILED") > t; +pub fn seal_clean(ev: string, k: u8, n: u64) -> bool { + const f : usize = body_from(ev, k, n); + const t : usize = body_to(ev, k, n); + return exit_of(ev, k, n) == 0 and find_in(ev, f, t, "all hashes MATCH") <= t and find_in(ev, f, t, "VERIFICATION FAILED") > t; +} + +/// One target's seal: 0 matches (as it was, or after a save), 1 not settled yet, 2 does not match even after a save. +pub fn seal_state(ev: string, n: u64) -> u8 { + if (ran(ev, G_SEAL, n) == false) { return 1; } + if (seal_clean(ev, G_SEAL, n)) { return 0; } + if (ran(ev, S_RECHECK, n) == false) { return 1; } + if (seal_clean(ev, S_RECHECK, n)) { return 0; } + return 2; +} + +pub fn saved_any(ev: string, link: u64) -> bool { + const m : usize = ch_count(ev, link); + var i : usize = 0; + while (i < m) { + if (is_target(ev, ch_line(ev, link, i)) and ran(ev, S_SAVE, link * TGT + (i as u64))) { return true; } + i = i + 1; + } + return false; +} + +/// The paths `git diff --cached --name-only` printed for a link's worktree after its seals were saved, and how many are seals. +pub fn diff_changed(ev: string, link: u64) -> usize { + return lines_in(ev, body_from(ev, S_DIFF, link * TGT), body_to(ev, S_DIFF, link * TGT)); +} + +pub fn diff_seals(ev: string, link: u64) -> usize { + var c : usize = 0; + var p : usize = body_from(ev, S_DIFF, link * TGT); + const t : usize = body_to(ev, S_DIFF, link * TGT); + while (p < t) { + const e : usize = line_end(ev, p); + if (e > p and starts(ev, p, e, SEAL_DIR)) { c = c + 1; } + p = e + 1; + } + return c; +} + +pub fn diff_ok(ev: string, link: u64) -> bool { + return exit_of(ev, S_DIFF, link * TGT) == 0 and gc_regen_ok(diff_changed(ev, link), diff_seals(ev, link)); +} + +/// The state of the re-saved seals of a link whose targets all match: PASS when nothing was saved or nothing changed, NONE while +/// the commit is not made, FAIL when the stage failed, the diff holds a path that is not a seal, or the commit failed. +pub fn regen_verdict(ev: string, link: u64) -> u8 { + if (saved_any(ev, link) == false) { return GC_V_PASS; } + const lk : u64 = link * TGT; + if (ran(ev, S_STAGE, lk) == false) { return GC_V_NONE; } + if (exit_of(ev, S_STAGE, lk) != 0) { return GC_V_FAIL; } + if (ran(ev, S_DIFF, lk) == false) { return GC_V_NONE; } + if (diff_ok(ev, link) == false) { return GC_V_FAIL; } + if (diff_changed(ev, link) == 0) { return GC_V_PASS; } + if (ran(ev, S_COMMIT, lk) == false) { return GC_V_NONE; } + if (exit_of(ev, S_COMMIT, lk) != 0) { return GC_V_FAIL; } + if (ran(ev, S_TIP, lk) == false) { return GC_V_NONE; } + if (sha_ok(ev, S_TIP, lk)) { return GC_V_PASS; } + return GC_V_FAIL; +} + +pub fn regen_tip_ok(ev: string, link: u64) -> bool { + return sha_ok(ev, S_TIP, link * TGT); +} + +/// Where the sha of what the link lands as begins: the commit with its seals saved again, else its own tip. +pub fn tip_off(ev: string, link: u64) -> usize { + if (regen_tip_ok(ev, link)) { return body_from(ev, S_TIP, link * TGT); } + return body_from(ev, G_TIP, link); } pub fn test_clean(ev: string, n: u64) -> bool { @@ -401,9 +538,13 @@ pub fn all_targets(ev: string, link: u64, k: u8) -> u8 { if (ran(ev, k, n) == false) { open = true; } else { - if (k == G_SEAL and seal_clean(ev, n) == false) { return 2; } if (k == G_TEST and test_clean(ev, n) == false) { return 2; } } + if (k == G_SEAL) { + const sst : u8 = seal_state(ev, n); + if (sst == 2) { return 2; } + if (sst == 1) { open = true; } + } } i = i + 1; } @@ -417,6 +558,8 @@ pub fn verdict(ev: string, n: u64, st: u8) -> u8 { if (spec_ok(ev, n)) { return GC_V_PASS; } return GC_V_FAIL; } + // a failing test is shown as such even while the seals wait for it (they are saved again only after the tests are clean) + if (st == 3 and targets(ev, n) > 0 and all_targets(ev, n, G_TEST) == 2 and verdict(ev, n, 1) == GC_V_PASS) { return GC_V_FAIL; } if (verdict(ev, n, st - 1) != GC_V_PASS and verdict(ev, n, st - 1) != GC_V_REUSED) { return GC_V_NONE; } if (st == 1) { if (gen_ok(ev, n)) { return GC_V_PASS; } @@ -427,6 +570,7 @@ pub fn verdict(ev: string, n: u64, st: u8) -> u8 { var k : u8 = G_SEAL; if (st == 3) { k = G_TEST; } const a : u8 = all_targets(ev, n, k); + if (a == 0 and st == 2) { return regen_verdict(ev, n); } if (a == 0) { return GC_V_PASS; } if (a == 2) { return GC_V_FAIL; } return GC_V_NONE; @@ -471,6 +615,8 @@ pub fn plan(ev: string, n: usize, out: []u8, pos: []usize) -> usize { v[i * 5 + (st as usize)] = verdict(ev, i as u64, st); st = st + 1; } + // merge-tree found the link in conflict with the head it was to land on: it does not land, the pass goes on + if (exit_of(ev, G_MT, i as u64) == 1) { v[i * 5] = GC_V_FAIL; } var c : usize = ch_count(ev, i as u64); if (c > GL_E_MAX) { c = GL_E_MAX; } var j : usize = 0; @@ -503,7 +649,7 @@ pub fn landing_at(ev: string, n: usize, r: usize, wo: []u8, wp: []usize) -> usiz /// Where the sha of what the head becomes when link j lands begins: its own tip when it was FORWARD, else the commit made for it. pub fn new_of(ev: string, j: u64, outcome: u8) -> usize { - if (outcome == GC_OUT_FORWARD) { return body_from(ev, G_TIP, j); } + if (outcome == GC_OUT_FORWARD) { return tip_off(ev, j); } return body_from(ev, G_CT, j); } @@ -608,17 +754,40 @@ pub fn link_slot(ev: string, j: u64) -> u64 { if (ran(ev, G_WT, j) == false) { return slot_of(G_WT, j); } if (exit_of(ev, G_WT, j) == 0) { const m : usize = ch_count(ev, j); + const lk : u64 = j * TGT; var i : usize = 0; while (i < m) { - if (is_target(ev, ch_line(ev, j, i)) and ran(ev, G_SEAL, j * TGT + (i as u64)) == false) { return slot_of(G_SEAL, j * TGT + (i as u64)); } + if (is_target(ev, ch_line(ev, j, i)) and ran(ev, G_SEAL, lk + (i as u64)) == false) { return slot_of(G_SEAL, lk + (i as u64)); } + i = i + 1; + } + i = 0; + while (i < m) { + if (is_target(ev, ch_line(ev, j, i)) and ran(ev, G_TEST, lk + (i as u64)) == false) { return slot_of(G_TEST, lk + (i as u64)); } i = i + 1; } - if (all_targets(ev, j, G_SEAL) == 0) { + // the tests are clean: a seal that does not match is saved again and verified again (#11361), then the changed seals + // are one commit on the tip. Nothing but .trinity/seals/ may be in it. + if (all_targets(ev, j, G_TEST) == 0) { i = 0; while (i < m) { - if (is_target(ev, ch_line(ev, j, i)) and ran(ev, G_TEST, j * TGT + (i as u64)) == false) { return slot_of(G_TEST, j * TGT + (i as u64)); } + const n : u64 = lk + (i as u64); + if (is_target(ev, ch_line(ev, j, i)) and seal_clean(ev, G_SEAL, n) == false and ran(ev, S_SAVE, n) == false) { return slot_of(S_SAVE, n); } i = i + 1; } + i = 0; + while (i < m) { + const n : u64 = lk + (i as u64); + if (is_target(ev, ch_line(ev, j, i)) and ran(ev, S_SAVE, n) and ran(ev, S_RECHECK, n) == false) { return slot_of(S_RECHECK, n); } + i = i + 1; + } + if (saved_any(ev, j) and all_targets(ev, j, G_SEAL) == 0) { + if (ran(ev, S_STAGE, lk) == false) { return slot_of(S_STAGE, lk); } + if (exit_of(ev, S_STAGE, lk) == 0 and ran(ev, S_DIFF, lk) == false) { return slot_of(S_DIFF, lk); } + if (exit_of(ev, S_STAGE, lk) == 0 and diff_ok(ev, j) and diff_changed(ev, j) > 0) { + if (ran(ev, S_COMMIT, lk) == false) { return slot_of(S_COMMIT, lk); } + if (exit_of(ev, S_COMMIT, lk) == 0 and ran(ev, S_TIP, lk) == false) { return slot_of(S_TIP, lk); } + } + } } if (ran(ev, G_RM, j) == false) { return slot_of(G_RM, j); } } @@ -634,6 +803,27 @@ pub fn next_slot(r: GolReq, ev: string, wo: []u8, wp: []usize) -> u64 { k = k + 1; } if (sha_ok(ev, G_BASE, 0) == false) { return DONE; } + // The chain follows master (#11361): decided from the head, the pushed mark and whether master holds the head. The writes are + // update-ref with the old value, and not for a plan or a status. + if (sha_ok(ev, G_HEAD, 0)) { + if (ran(ev, P_PUSHED, 0) == false) { return slot_of(P_PUSHED, 0); } + if (sha_ok(ev, P_PUSHED, 0)) { + if (ran(ev, R_ANC, 0) == false) { return slot_of(R_ANC, 0); } + const rb : u8 = rb_action(ev); + if (rb == GC_RB_CARRY) { + if (ran(ev, R_MT, 0) == false) { return slot_of(R_MT, 0); } + if (sha_ok(ev, R_MT, 0) == false) { return DONE; } + if (ran(ev, R_CT, 0) == false) { return slot_of(R_CT, 0); } + if (sha_ok(ev, R_CT, 0) == false) { return DONE; } + } + if (rb != GC_RB_NONE and r.plan == false and r.verb != V_STATUS) { + if (ran(ev, R_UH, 0) == false) { return slot_of(R_UH, 0); } + if (exit_of(ev, R_UH, 0) != 0) { return DONE; } + if (ran(ev, R_UP, 0) == false) { return slot_of(R_UP, 0); } + if (exit_of(ev, R_UP, 0) != 0) { return DONE; } + } + } + } if (r.verb == V_LAND) { const n : usize = q_count(ev); var j : usize = 0; @@ -678,7 +868,12 @@ pub fn next_slot(r: GolReq, ev: string, wo: []u8, wp: []usize) -> u64 { pub fn judge(r: GolReq, ev: string, k: u8, n: u64) -> u8 { const x : u64 = exit_of(ev, k, n); if (k == G_BASE and sha_ok(ev, G_BASE, 0) == false) { return C_NO_BASE; } - if (k == G_MT and x != 0) { return C_MERGE; } + // exit 1 of a link's merge-tree is a conflict: the link is CONFLICT and the pass goes on; any other failure stops it + if (k == G_MT and x > 1) { return C_STEP; } + if (k == R_MT and x == 1) { return C_MERGE; } + if (k == R_MT and x > 1) { return C_STEP; } + if (k == R_CT and sha_ok(ev, R_CT, 0) == false) { return C_STEP; } + if ((k == R_UH or k == R_UP) and x != 0) { return C_HEAD_MOVED; } if (k == G_CT and sha_ok(ev, G_CT, n) == false) { return C_STEP; } if (k == G_CAS and x != 0) { return C_HEAD_MOVED; } if (k == P_LAND and x != 0) { return C_LAND_REFUSED; } @@ -687,7 +882,7 @@ pub fn judge(r: GolReq, ev: string, k: u8, n: u64) -> u8 { } pub fn in_scratch(k: u8) -> bool { - return k == G_SEAL or k == G_TEST; + return k == G_SEAL or k == G_TEST or (k >= S_SAVE and k <= S_TIP); } // --- the commands ------------------------------------------------------------------------------------ @@ -766,7 +961,12 @@ pub fn args_ready(ev: string, k: u8, j: u64) -> bool { if (k == G_WT) { return sha_ok(ev, G_TIP, j); } if (k == G_CT) { return sha_ok(ev, G_MT, j) and q_start(ev, j as usize) < ev.len; } if (k == G_CAS) { return sha_ok(ev, G_TIP, j) and cur; } - if (k == P_AHEAD) { return has_head(ev) and (sha_ok(ev, P_PUSHED, 0) or sha_ok(ev, G_BASE, 0)); } + if (k == P_AHEAD) { return has_head(ev) and (has_pushed(ev) or sha_ok(ev, G_BASE, 0)); } + if (k == R_ANC or k == R_MT) { return sha_ok(ev, G_HEAD, 0) and sha_ok(ev, P_PUSHED, 0) and sha_ok(ev, G_BASE, 0); } + if (k == R_CT) { return sha_ok(ev, R_MT, 0) and sha_ok(ev, G_BASE, 0); } + if (k == R_UH) { return sha_ok(ev, G_HEAD, 0) and sha_ok(ev, G_BASE, 0) and (rb_action(ev) != GC_RB_CARRY or sha_ok(ev, R_CT, 0)); } + if (k == R_UP) { return sha_ok(ev, P_PUSHED, 0) and sha_ok(ev, G_BASE, 0); } + if (k >= S_SAVE and k <= S_TIP) { return sha_ok(ev, G_TIP, j / TGT); } if (k == P_BRANCH or k == P_LAND or k == P_MARK) { return ahead_count(ev) > 0 and has_head(ev); } return true; } @@ -834,21 +1034,96 @@ pub fn step_argv(r: GolReq, ev: string, k: u8, n: u64, out: []u8, wo: []u8, wp: w = emit_byte(out, w, 10); w = sha_arg(out, w, ev, body_from(ev, G_TIP, j)); } - if (k == G_SEAL or k == G_TEST) { + if (k == G_SEAL or k == G_TEST or k == S_SAVE or k == S_RECHECK) { const link : u64 = j / TGT; const ls : usize = ch_line(ev, link, (j % TGT) as usize); if (is_target(ev, ls) == false) { return 0; } - if (k == G_SEAL) { + if (k != G_TEST) { w = arg(out, w, r.t27c); w = arg(out, w, "seal"); w = arg_span(out, w, ev, ls + 2, line_end(ev, ls)); - w = arg(out, w, "--verify"); + if (k == S_SAVE) { w = arg(out, w, "--save"); } else { w = arg(out, w, "--verify"); } } else { w = arg(out, w, r.t27b); w = arg(out, w, "test"); w = arg_span(out, w, ev, ls + 2, line_end(ev, ls)); } } + if (k == S_STAGE) { + w = git(out, w, "add"); + w = arg(out, w, "-A"); + } + if (k == S_DIFF) { + w = git(out, w, "diff"); + w = arg(out, w, "--cached"); + w = arg(out, w, "--name-only"); + } + if (k == S_COMMIT) { + w = git(out, w, "-c"); + w = arg(out, w, "user.name=tri-golden"); + w = arg(out, w, "-c"); + w = arg(out, w, "user.email=golden@t27.ai"); + w = arg(out, w, "-c"); + w = arg(out, w, "commit.gpgsign=false"); + w = arg(out, w, "commit"); + w = arg(out, w, "--no-verify"); + w = arg(out, w, "-q"); + w = arg(out, w, "-m"); + w = emit_str(out, w, "golden: save the seals again on the tip (t27c seal --save, tests clean)"); + if (r.issue > 0) { + w = emit_str(out, w, " (Closes #"); + w = emit_dec(out, w, r.issue); + w = emit_str(out, w, ")"); + } + w = emit_byte(out, w, 10); + } + if (k == S_TIP) { + w = git(out, w, "rev-parse"); + w = arg(out, w, "--verify"); + w = arg(out, w, "-q"); + w = arg(out, w, "HEAD"); + } + if (k == R_ANC) { + w = git(out, w, "merge-base"); + w = arg(out, w, "--is-ancestor"); + w = sha_arg(out, w, ev, body_from(ev, G_HEAD, 0)); + w = sha_arg(out, w, ev, body_from(ev, G_BASE, 0)); + } + if (k == R_MT) { + w = git(out, w, "merge-tree"); + w = arg(out, w, "--write-tree"); + w = emit_str(out, w, "--merge-base="); + w = sha_arg(out, w, ev, body_from(ev, P_PUSHED, 0)); + w = sha_arg(out, w, ev, body_from(ev, G_BASE, 0)); + w = sha_arg(out, w, ev, body_from(ev, G_HEAD, 0)); + } + if (k == R_CT) { + w = git(out, w, "commit-tree"); + w = sha_arg(out, w, ev, body_from(ev, R_MT, 0)); + w = arg(out, w, "-p"); + w = sha_arg(out, w, ev, body_from(ev, G_BASE, 0)); + w = arg(out, w, "-m"); + w = emit_str(out, w, "golden: carry the unpushed links onto origin/master"); + if (r.issue > 0) { + w = emit_str(out, w, " (Closes #"); + w = emit_dec(out, w, r.issue); + w = emit_str(out, w, ")"); + } + w = emit_byte(out, w, 10); + } + if (k == R_UH) { + w = git(out, w, "update-ref"); + w = arg(out, w, GC_REF); + if (rb_action(ev) == GC_RB_CARRY) { w = sha_arg(out, w, ev, body_from(ev, R_CT, 0)); } else { w = sha_arg(out, w, ev, body_from(ev, G_BASE, 0)); } + w = sha_arg(out, w, ev, body_from(ev, G_HEAD, 0)); + } + if (k == R_UP) { + w = git(out, w, "update-ref"); + w = arg(out, w, "--create-reflog"); + w = arg(out, w, GL_PUSHED); + w = sha_arg(out, w, ev, body_from(ev, G_BASE, 0)); + w = sha_arg(out, w, ev, body_from(ev, P_PUSHED, 0)); + } if (k == G_RM) { w = git(out, w, "worktree"); w = arg(out, w, "remove"); @@ -864,7 +1139,7 @@ pub fn step_argv(r: GolReq, ev: string, k: u8, n: u64, out: []u8, wo: []u8, wp: w = emit_str(out, w, "--merge-base="); w = sha_arg(out, w, ev, body_from(ev, G_MB, j)); w = sha_arg(out, w, ev, cur); - w = sha_arg(out, w, ev, body_from(ev, G_TIP, j)); + w = sha_arg(out, w, ev, tip_off(ev, j)); } if (k == G_CT) { w = git(out, w, "commit-tree"); @@ -903,13 +1178,13 @@ pub fn step_argv(r: GolReq, ev: string, k: u8, n: u64, out: []u8, wo: []u8, wp: w = git(out, w, "rev-list"); w = arg(out, w, "--first-parent"); w = arg(out, w, "--reverse"); - if (sha_ok(ev, P_PUSHED, 0)) { - w = put_span(out, w, ev, body_from(ev, P_PUSHED, 0), body_from(ev, P_PUSHED, 0) + 40); + if (has_pushed(ev)) { + w = put_span(out, w, ev, pushed_off(ev), pushed_off(ev) + 40); } else { w = put_span(out, w, ev, body_from(ev, G_BASE, 0), body_from(ev, G_BASE, 0) + 40); } w = emit_str(out, w, ".."); - w = sha_arg(out, w, ev, body_from(ev, G_HEAD, 0)); + w = sha_arg(out, w, ev, head_off(ev)); } if (k == P_STAMP) { w = git(out, w, "reflog"); @@ -955,8 +1230,8 @@ pub fn step_argv(r: GolReq, ev: string, k: u8, n: u64, out: []u8, wo: []u8, wp: w = arg(out, w, "--create-reflog"); w = arg(out, w, GL_PUSHED); w = sha_arg(out, w, ev, target_off(ev)); - if (sha_ok(ev, P_PUSHED, 0)) { - w = sha_arg(out, w, ev, body_from(ev, P_PUSHED, 0)); + if (has_pushed(ev)) { + w = sha_arg(out, w, ev, pushed_off(ev)); } else { w = zero_arg(out, w); } @@ -993,7 +1268,7 @@ pub fn code_why(c: u8) -> string { if (c == C_BAD_ISSUE) { return "a push opens a pull request: pass --issue N (L1)"; } if (c == C_BAD_PATH) { return "a program or scratch path has bytes a command line should not carry"; } if (c == C_NO_BASE) { return "refs/remotes/origin/master is missing: git fetch origin master"; } - if (c == C_MERGE) { return "git merge-tree met a conflict: the link goes back to its bee"; } + if (c == C_MERGE) { return "git merge-tree met a conflict carrying the unpushed links onto origin/master: a person decides"; } if (c == C_STEP) { return "a git step failed; its output is the evidence"; } if (c == C_HEAD_MOVED) { return "refs/golden/head is not where this pass read it: nothing was forced, run it again"; } if (c == C_LAND_REFUSED) { return "tri land refused the batch branch; refs/golden/pushed did not move"; } @@ -1010,6 +1285,12 @@ pub fn outcome_name(o: u8) -> string { return "UNKNOWN_PARENT"; } +/// The outcome to print: CONFLICT when merge-tree found the link in conflict, REGEN when its seals were saved again and it landed. +pub fn outcome_shown(ev: string, i: usize, o: u8) -> u8 { + if (exit_of(ev, G_MT, i as u64) == 1) { return GC_OUT_CONFLICT; } + return gc_regen_view(o, regen_tip_ok(ev, i as u64)); +} + pub fn verdict_letter(v: u8) -> u8 { if (v == GC_V_PASS) { return 112; } if (v == GC_V_REUSED) { return 114; } @@ -1042,7 +1323,7 @@ pub fn put_cmd(out: []u8, w: usize, r: GolReq, ev: string, k: u8, n: u64, wo: [] pub fn report_land(r: GolReq, ev: string, out: []u8, wo: []u8, wp: []usize, tmp: []u8) -> usize { var w : usize = emit_str(out, 0, "golden head: "); - w = put_sha12(out, w, ev, off_if(ev, G_HEAD, 0)); + w = put_sha12(out, w, ev, head_off(ev)); if (has_head(ev) == false) { w = emit_str(out, w, " (base "); w = put_sha12(out, w, ev, off_if(ev, G_BASE, 0)); @@ -1061,7 +1342,7 @@ pub fn report_land(r: GolReq, ev: string, out: []u8, wo: []u8, wp: []usize, tmp: var st : u8 = 0; while (st < 5) { w = emit_byte(out, w, verdict_letter(verdict(ev, i as u64, st))); st = st + 1; } w = emit_byte(out, w, 32); - w = emit_str(out, w, outcome_name(wo[i])); + w = emit_str(out, w, outcome_name(outcome_shown(ev, i, wo[i]))); w = emit_byte(out, w, 10); i = i + 1; } @@ -1081,9 +1362,9 @@ pub fn report_land(r: GolReq, ev: string, out: []u8, wo: []u8, wp: []usize, tmp: pub fn report_push(r: GolReq, ev: string, out: []u8, wo: []u8, wp: []usize, tmp: []u8) -> usize { var w : usize = emit_str(out, 0, "golden head: "); - w = put_sha12(out, w, ev, off_if(ev, G_HEAD, 0)); + w = put_sha12(out, w, ev, head_off(ev)); w = emit_str(out, w, "\npushed: "); - w = put_sha12(out, w, ev, off_if(ev, P_PUSHED, 0)); + w = put_sha12(out, w, ev, pushed_off(ev)); w = emit_str(out, w, "\nunpushed links: "); w = emit_dec(out, w, ahead_count(ev) as u64); w = emit_str(out, w, " (batch "); @@ -1171,20 +1452,20 @@ const EV_K1 : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n const EV_ALL : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nA\tspecs/x/b.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n@@ preflight 14 0 0 0\n\n@@ preflight 12 1 0 41\nf6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6\n\n@@ preflight 13 1 0 41\ne5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5\n\n@@ preflight 14 1 0 0\n\n"; const EV_PLAN_K1 : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nA\tspecs/x/b.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n@@ preflight 12 1 0 41\nf6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6\n\n@@ preflight 13 1 0 41\ne5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5\n\n"; const EV_CONF : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nM\tspecs/x/a.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n"; -const EV_SEALBAD : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nA\tspecs/x/b.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n"; +const EV_SEALBAD : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n@@ preflight 30 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nA\tspecs/x/b.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n"; const EV_NOCLOSES : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 7\ngolden\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nA\tspecs/x/b.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n"; const EV_GENONLY : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nM\tgen/rust/x.rs\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n"; const EV_VACUOUS : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 0 passed, 0 failed, 0 total\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nA\tspecs/x/b.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n"; -const EV_MOVED : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nA\tspecs/x/b.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n"; -const EV_HEADED : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n"; +const EV_MOVED : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nA\tspecs/x/b.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n@@ preflight 15 0 1 0\n\n"; +const EV_HEADED : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n@@ preflight 15 0 1 0\n\n"; const EV_NOBASE : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 1 0\n\n"; const EV_Q : str = "@@ preflight 0 0 0 26\nclaude/evolve-a\nmaster\n-x\n\n@@ preflight 1 0 0 39\n# comment\nclaude/evolve-a\nlanes/extra\n\n\n"; const EV_P_FIRST : str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 1 0\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 18 0 0 11\n1760000000\n\n"; -const EV_P_NONE : str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 0\n\n@@ preflight 17 0 0 11\n1759994000\n\n@@ preflight 18 0 0 11\n1760000000\n\n"; -const EV_P_20 : str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 17 0 0 11\n1759998800\n\n@@ preflight 18 0 0 11\n1760000000\n\n"; -const EV_P_30 : str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 17 0 0 11\n1759998200\n\n@@ preflight 18 0 0 11\n1760000000\n\n"; -const EV_P_TEN : str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 410\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n1313131313131313131313131313131313131313\n1414141414141414141414141414141414141414\n1515151515151515151515151515151515151515\n1616161616161616161616161616161616161616\n1717171717171717171717171717171717171717\n1818181818181818181818181818181818181818\n1919191919191919191919191919191919191919\n\n@@ preflight 17 0 0 11\n1759998200\n\n@@ preflight 18 0 0 11\n1760000000\n\n"; -const EV_P_GH : str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 17 0 0 11\n1759998800\n\n@@ preflight 18 0 0 11\n1760000000\n\n@@ preflight 19 0 0 53\n[{\"databaseId\":1},{\"databaseId\":2},{\"databaseId\":3}]\n\n"; +const EV_P_NONE : str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 0\n\n@@ preflight 17 0 0 11\n1759994000\n\n@@ preflight 18 0 0 11\n1760000000\n\n@@ preflight 24 0 0 0\n\n"; +const EV_P_20 : str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 17 0 0 11\n1759998800\n\n@@ preflight 18 0 0 11\n1760000000\n\n@@ preflight 24 0 0 0\n\n"; +const EV_P_30 : str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 17 0 0 11\n1759998200\n\n@@ preflight 18 0 0 11\n1760000000\n\n@@ preflight 24 0 0 0\n\n"; +const EV_P_TEN : str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 410\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n1313131313131313131313131313131313131313\n1414141414141414141414141414141414141414\n1515151515151515151515151515151515151515\n1616161616161616161616161616161616161616\n1717171717171717171717171717171717171717\n1818181818181818181818181818181818181818\n1919191919191919191919191919191919191919\n\n@@ preflight 17 0 0 11\n1759998200\n\n@@ preflight 18 0 0 11\n1760000000\n\n@@ preflight 24 0 0 0\n\n"; +const EV_P_GH : str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 17 0 0 11\n1759998800\n\n@@ preflight 18 0 0 11\n1760000000\n\n@@ preflight 19 0 0 53\n[{\"databaseId\":1},{\"databaseId\":2},{\"databaseId\":3}]\n\n@@ preflight 24 0 0 0\n\n"; const EV_P_BRANCHED : str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 1 0\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 18 0 0 11\n1760000000\n\n@@ preflight 20 0 0 0\n\n"; const EV_P_LANDED : str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 1 0\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 18 0 0 11\n1760000000\n\n@@ preflight 20 0 0 0\n\n@@ preflight 21 0 0 7\nLANDED\n\n"; const EV_P_REFUSED : str = "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 1 0\n\n@@ preflight 16 0 0 123\n1010101010101010101010101010101010101010\n1111111111111111111111111111111111111111\n1212121212121212121212121212121212121212\n\n@@ preflight 18 0 0 11\n1760000000\n\n@@ preflight 20 0 0 0\n\n@@ preflight 21 0 10 16\nTESTS_NOT_CLEAN\n\n"; @@ -1193,6 +1474,26 @@ const FS1 : str = "1111111111111111111111111111111111111111"; const FS7 : str = "1717171717171717171717171717171717171717"; const FS8 : str = "1818181818181818181818181818181818181818"; const FS9 : str = "1919191919191919191919191919191919191919"; +const EV_RG1 : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n"; +const EV_RG2 : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n"; +const EV_RG3 : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n"; +const EV_RG4 : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n@@ preflight 30 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n"; +const EV_RG5 : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n@@ preflight 30 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 31 0 0 0\n\n"; +const EV_RG6 : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n@@ preflight 30 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 31 0 0 0\n\n@@ preflight 32 0 0 30\n.trinity/seals/specs_x_a.json\n\n"; +const EV_RG7 : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n@@ preflight 30 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 31 0 0 0\n\n@@ preflight 32 0 0 30\n.trinity/seals/specs_x_a.json\n\n@@ preflight 33 0 0 0\n\n"; +const EV_RG8 : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n@@ preflight 30 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 31 0 0 0\n\n@@ preflight 32 0 0 30\n.trinity/seals/specs_x_a.json\n\n@@ preflight 33 0 0 0\n\n@@ preflight 34 0 0 41\n9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a\n\n"; +const EV_REGEN : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n@@ preflight 30 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 31 0 0 0\n\n@@ preflight 32 0 0 30\n.trinity/seals/specs_x_a.json\n\n@@ preflight 33 0 0 0\n\n@@ preflight 34 0 0 41\n9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a\n\n@@ preflight 11 0 0 0\n\n"; +const EV_RGBAD : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 29 0 0 0\n\n@@ preflight 30 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 31 0 0 0\n\n@@ preflight 32 0 0 48\n.trinity/seals/specs_x_a.json\nspecs/x/other.t27\n\n@@ preflight 11 0 0 0\n\n"; +const EV_RGTEST : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 1 20\nVERIFICATION FAILED\n\n@@ preflight 10 0 1 34\nTriX: 2 passed, 1 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n"; +const EV_RGOK : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n"; +const EV_RB_RESET : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 24 0 1 0\n\n"; +const EV_RB_RESET_UH : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 24 0 1 0\n\n@@ preflight 27 0 0 0\n\n"; +const EV_RB_HELD : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 24 0 0 0\n\n"; +const EV_RB_CARRY : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\n9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b\n\n@@ preflight 24 0 1 0\n\n"; +const EV_RB_CMT : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\n9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b\n\n@@ preflight 24 0 1 0\n\n@@ preflight 25 0 0 41\nf6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6\n\n"; +const EV_RB_CCT : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\n9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b\n\n@@ preflight 24 0 1 0\n\n@@ preflight 25 0 0 41\nf6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6\n\n@@ preflight 26 0 0 41\ne5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5\n\n"; +const EV_RB_CONFLICT : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 15 0 0 41\n9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b\n\n@@ preflight 24 0 1 0\n\n@@ preflight 25 0 1 60\nf6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6\nCONFLICT (content)\n\n"; +const EV_C1X : str = "@@ preflight 0 0 0 32\nclaude/evolve-a\nclaude/evolve-b\n\n@@ preflight 1 0 1 54\ncat: .trinity/golden/queue: No such file or directory\n\n@@ preflight 2 0 1 0\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 4 0 0 41\nb2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2\n\n@@ preflight 5 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 0 0 16\nA\tspecs/x/a.t27\n\n@@ preflight 7 0 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 0 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 0 0 0\n\n@@ preflight 4 1 0 41\nc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3\n\n@@ preflight 5 1 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 6 1 0 16\nA\tspecs/x/b.t27\n\n@@ preflight 7 1 0 22\ngolden\n\nCloses #11275\n\n@@ preflight 8 1 0 0\n\n@@ preflight 9 1000 0 36\ngen_hash_c: MATCH\n\nall hashes MATCH\n\n@@ preflight 10 1000 0 34\nTriX: 3 passed, 0 failed, 3 total\n\n@@ preflight 11 1 0 0\n\n@@ preflight 14 0 0 0\n\n@@ preflight 12 1 1 57\ncccc\nCONFLICT (content): Merge conflict in specs/x/b.t27\n\n"; // --- tests ----------------------------------------------------------------------------------------------- @@ -1344,9 +1645,10 @@ test negative_control_a_head_that_moved_under_a_link_lands_nothing { var wt : [1024]u8 = [0] ** 1024; var o : [16]u8 = [0] ** 16; var p : [16]usize = [0] ** 16; - assert plan(EV_MOVED, 2, &o, &p) == 0; - assert o[0] == GC_OUT_UNKNOWN_PARENT and o[1] == GC_OUT_UNKNOWN_PARENT; - assert next_slot(rq(V_LAND, false, ABSENT), EV_MOVED, &wo, &wp) == DONE; + // links cut from an older master than the head are carried onto it (#11361); merge-tree decides + assert plan(EV_MOVED, 2, &o, &p) == 2; + assert o[0] == GC_OUT_CARRIED and o[1] == GC_OUT_CARRIED; + assert next_slot(rq(V_LAND, false, ABSENT), EV_MOVED, &wo, &wp) == slot_of(G_MT, 0); } test the_compare_and_swap_is_refused_when_git_says_the_head_moved { @@ -1356,7 +1658,9 @@ test the_compare_and_swap_is_refused_when_git_says_the_head_moved { const r : GolReq = rq(V_LAND, false, ABSENT); assert judge(r, "@@ preflight 14 0 128 0\n\n", G_CAS, 0) == C_HEAD_MOVED; assert judge(r, EV_C0, G_CAS, 0) == C_OK; - assert judge(r, "@@ preflight 12 1 1 0\n\n", G_MT, 1) == C_MERGE; + // exit 1 is a conflict of the link, not of the pass; any other failure of merge-tree stops the pass + assert judge(r, "@@ preflight 12 1 1 0\n\n", G_MT, 1) == C_OK; + assert judge(r, "@@ preflight 12 1 128 0\n\n", G_MT, 1) == C_STEP; assert judge(r, EV_M1, G_MT, 1) == C_OK; assert judge(r, "@@ preflight 13 1 0 4\nnope\n", G_CT, 1) == C_STEP; assert judge(r, EV_K1, G_CT, 1) == C_OK; @@ -1532,6 +1836,140 @@ test the_status_says_when_the_next_push_is_due { assert buf_is(&out, 0, "") and m > 0; } +const RGS : str = "9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a"; +const PUS : str = "9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b"; +const CTS : str = "e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5"; + +test a_seal_saved_by_an_older_t27c_is_saved_again_after_the_tests_and_the_link_lands_as_regen { + var wo : [16]u8 = [0] ** 16; + var wp : [16]usize = [0] ** 16; + var wt : [1024]u8 = [0] ** 1024; + var buf : [4096]u8 = [0] ** 4096; + var o : [16]u8 = [0] ** 16; + var p : [16]usize = [0] ** 16; + const r : GolReq = rq(V_LAND, false, ABSENT); + // the order: seal verify, the tests, then save, verify again, stage, diff, commit, the new tip, remove + assert next_slot(r, EV_WT0, &wo, &wp) == slot_of(G_SEAL, 0); + assert next_slot(r, EV_RG1, &wo, &wp) == slot_of(G_TEST, 0); + assert next_slot(r, EV_RG2, &wo, &wp) == slot_of(S_SAVE, 0); + assert next_slot(r, EV_RG3, &wo, &wp) == slot_of(S_RECHECK, 0); + assert next_slot(r, EV_RG4, &wo, &wp) == slot_of(S_STAGE, 0); + assert next_slot(r, EV_RG5, &wo, &wp) == slot_of(S_DIFF, 0); + assert next_slot(r, EV_RG6, &wo, &wp) == slot_of(S_COMMIT, 0); + assert next_slot(r, EV_RG7, &wo, &wp) == slot_of(S_TIP, 0); + assert next_slot(r, EV_RG8, &wo, &wp) == slot_of(G_RM, 0); + assert verdict(EV_RG4, 0, 2) == GC_V_NONE and verdict(EV_RG8, 0, 2) == GC_V_PASS and verdict(EV_REGEN, 0, 3) == GC_V_PASS and verdict(EV_REGEN, 0, 4) == GC_V_PASS; + // the link lands as its re-sealed commit, and is shown as REGEN + assert plan(EV_REGEN, 1, &o, &p) == 1 and o[0] == GC_OUT_FORWARD; + assert outcome_shown(EV_REGEN, 0, o[0]) == GC_OUT_REGEN and outcome_shown(EV_PLAN_K1, 0, GC_OUT_FORWARD) == GC_OUT_FORWARD; + assert span_is(EV_REGEN, tip_off(EV_REGEN, 0), tip_off(EV_REGEN, 0) + 40, RGS); + assert argv_is(r, EV_REGEN, G_CAS, 0, "git\nupdate-ref\nrefs/golden/head\n9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a\n0000000000000000000000000000000000000000\n", &buf, &wo, &wp); + // a seal that matched is never saved again + assert verdict(EV_RGOK, 0, 2) == GC_V_PASS and regen_tip_ok(EV_RGOK, 0) == false and next_slot(r, EV_RGOK, &wo, &wp) == slot_of(G_TIP, 1); +} + +test the_seal_steps_pin_their_bytes { + var wo : [16]u8 = [0] ** 16; + var wp : [16]usize = [0] ** 16; + var wt : [1024]u8 = [0] ** 1024; + var buf : [4096]u8 = [0] ** 4096; + const r : GolReq = rq(V_LAND, false, ABSENT); + assert argv_is(r, EV_RG2, S_SAVE, 0, "t27c\nseal\nspecs/x/a.t27\n--save\n", &buf, &wo, &wp); + assert argv_is(r, EV_RG3, S_RECHECK, 0, "t27c\nseal\nspecs/x/a.t27\n--verify\n", &buf, &wo, &wp); + assert argv_is(r, EV_RG4, S_STAGE, 0, "git\nadd\n-A\n", &buf, &wo, &wp); + assert argv_is(r, EV_RG5, S_DIFF, 0, "git\ndiff\n--cached\n--name-only\n", &buf, &wo, &wp); + assert argv_is(r, EV_RG6, S_COMMIT, 0, "git\n-c\nuser.name=tri-golden\n-c\nuser.email=golden@t27.ai\n-c\ncommit.gpgsign=false\ncommit\n--no-verify\n-q\n-m\ngolden: save the seals again on the tip (t27c seal --save, tests clean) (Closes #11275)\n", &buf, &wo, &wp); + assert argv_is(r, EV_RG7, S_TIP, 0, "git\nrev-parse\n--verify\n-q\nHEAD\n", &buf, &wo, &wp); + // they run in the link's worktree, like the seal and the test + assert step_cwd(r, S_SAVE, 1000, &buf) == 11 and step_cwd(r, S_COMMIT, 2000, &buf) == 11 and buf_is(&buf, 11, "/tmp/s/gl-2"); +} + +test negative_control_a_failing_test_or_a_path_that_is_not_a_seal_refuses_the_link { + var wo : [16]u8 = [0] ** 16; + var wp : [16]usize = [0] ** 16; + var wt : [1024]u8 = [0] ** 1024; + var o : [16]u8 = [0] ** 16; + var p : [16]usize = [0] ** 16; + const r : GolReq = rq(V_LAND, false, ABSENT); + // the test failed: the seal is not saved, the worktree is removed, the link does not land + assert next_slot(r, EV_RGTEST, &wo, &wp) == slot_of(G_TIP, 1); + assert verdict(EV_RGTEST, 0, 3) == GC_V_FAIL and verdict(EV_RGTEST, 0, 2) == GC_V_NONE; + assert plan(EV_RGTEST, 1, &o, &p) == 0 and o[0] == GC_OUT_NOT_GOLDEN; + // the diff holds a spec besides the seal: FAIL, no commit + assert diff_changed(EV_RGBAD, 0) == 2 and diff_seals(EV_RGBAD, 0) == 1 and diff_ok(EV_RGBAD, 0) == false; + assert verdict(EV_RGBAD, 0, 2) == GC_V_FAIL; + assert next_slot(r, EV_RGBAD, &wo, &wp) == slot_of(G_TIP, 1); + assert plan(EV_RGBAD, 1, &o, &p) == 0 and o[0] == GC_OUT_NOT_GOLDEN; + // a seal that still does not match after the save: SEAL fails (the old EV_SEALBAD) + assert verdict(EV_SEALBAD, 0, 2) == GC_V_FAIL; + // a seal file may carry :: in its name; a spec path may not + assert path_ok("M\t.trinity/seals/tools_port::trios::x.json\n", 0) == true and path_ok("M\tspecs/a::b.t27\n", 0) == false; +} + +test the_chain_follows_master_by_reset_when_nothing_is_unpushed { + var wo : [16]u8 = [0] ** 16; + var wp : [16]usize = [0] ** 16; + var wt : [1024]u8 = [0] ** 1024; + var buf : [4096]u8 = [0] ** 4096; + const r : GolReq = rq(V_LAND, false, ABSENT); + assert next_slot(r, EV_RB_RESET, &wo, &wp) == slot_of(R_UH, 0); + assert next_slot(r, EV_RB_RESET_UH, &wo, &wp) == slot_of(R_UP, 0); + assert argv_is(r, EV_RB_RESET, R_ANC, 0, "git\nmerge-base\n--is-ancestor\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n", &buf, &wo, &wp); + assert argv_is(r, EV_RB_RESET, R_UH, 0, "git\nupdate-ref\nrefs/golden/head\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n", &buf, &wo, &wp); + assert argv_is(r, EV_RB_RESET, R_UP, 0, "git\nupdate-ref\n--create-reflog\nrefs/golden/pushed\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n", &buf, &wo, &wp); + // both refs read as master from now on: links are judged against it + assert rb_action(EV_RB_RESET) == GC_RB_RESET and span_is(EV_RB_RESET, head_off(EV_RB_RESET), head_off(EV_RB_RESET) + 40, FB) and span_is(EV_RB_RESET, pushed_off(EV_RB_RESET), pushed_off(EV_RB_RESET) + 40, FB); + // a plan and a status write no ref: the links are judged next + assert next_slot(rq(V_LAND, true, ABSENT), EV_RB_RESET, &wo, &wp) == slot_of(G_TIP, 0); + assert next_slot(rq(V_STATUS, false, ABSENT), EV_RB_RESET, &wo, &wp) == slot_of(P_AHEAD, 0); + // master holds the head: nothing moves + assert rb_action(EV_RB_HELD) == GC_RB_NONE and next_slot(r, EV_RB_HELD, &wo, &wp) == slot_of(G_TIP, 0); + // the pushed mark is not read yet: it is the next thing to read + assert next_slot(r, "@@ preflight 2 0 0 41\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n\n@@ preflight 3 0 0 41\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n\n@@ preflight 0 0 0 0\n\n@@ preflight 1 0 1 0\n\n", &wo, &wp) == slot_of(P_PUSHED, 0); +} + +test the_chain_follows_master_by_carrying_unpushed_links_as_one_commit { + var wo : [16]u8 = [0] ** 16; + var wp : [16]usize = [0] ** 16; + var wt : [1024]u8 = [0] ** 1024; + var buf : [4096]u8 = [0] ** 4096; + const r : GolReq = rq(V_PUSH, false, 0); + assert rb_action(EV_RB_CARRY) == GC_RB_CARRY; + assert next_slot(rq(V_LAND, false, ABSENT), EV_RB_CARRY, &wo, &wp) == slot_of(R_MT, 0); + assert next_slot(rq(V_LAND, false, ABSENT), EV_RB_CMT, &wo, &wp) == slot_of(R_CT, 0); + assert next_slot(rq(V_LAND, false, ABSENT), EV_RB_CCT, &wo, &wp) == slot_of(R_UH, 0); + assert argv_is(r, EV_RB_CARRY, R_MT, 0, "git\nmerge-tree\n--write-tree\n--merge-base=9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n", &buf, &wo, &wp); + assert argv_is(r, EV_RB_CMT, R_CT, 0, "git\ncommit-tree\nf6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6\n-p\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n-m\ngolden: carry the unpushed links onto origin/master (Closes #11275)\n", &buf, &wo, &wp); + // the head becomes the carried commit, the pushed mark becomes master + assert argv_is(r, EV_RB_CCT, R_UH, 0, "git\nupdate-ref\nrefs/golden/head\ne5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5\nd4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4\n", &buf, &wo, &wp); + assert argv_is(r, EV_RB_CCT, R_UP, 0, "git\nupdate-ref\n--create-reflog\nrefs/golden/pushed\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1\n9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b\n", &buf, &wo, &wp); + assert span_is(EV_RB_CCT, head_off(EV_RB_CCT), head_off(EV_RB_CCT) + 40, CTS) and span_is(EV_RB_CCT, pushed_off(EV_RB_CCT), pushed_off(EV_RB_CCT) + 40, FB); + // the unpushed list is then master..carried commit: one link + assert argv_is(r, EV_RB_CCT, P_AHEAD, 0, "git\nrev-list\n--first-parent\n--reverse\na1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1..e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5\n", &buf, &wo, &wp); + // a conflict while carrying stops the run and nothing is written + assert judge(r, EV_RB_CONFLICT, R_MT, 0) == C_MERGE; + assert next_slot(rq(V_LAND, false, ABSENT), EV_RB_CONFLICT, &wo, &wp) == DONE; + assert judge(r, "@@ preflight 27 0 1 0\n\n", R_UH, 0) == C_HEAD_MOVED and judge(r, "@@ preflight 28 0 128 0\n\n", R_UP, 0) == C_HEAD_MOVED; +} + +test a_link_in_conflict_with_the_head_is_skipped_and_the_pass_goes_on { + var wo : [16]u8 = [0] ** 16; + var wp : [16]usize = [0] ** 16; + var wt : [1024]u8 = [0] ** 1024; + var o : [16]u8 = [0] ** 16; + var p : [16]usize = [0] ** 16; + var out : [2048]u8 = [0] ** 2048; + const r : GolReq = rq(V_LAND, false, ABSENT); + // link 1 was to land second; merge-tree says conflict: it is CONFLICT, link 0 stays landed, the pass ends without a stop + assert plan(EV_C1X, 2, &o, &p) == 1 and o[0] == GC_OUT_FORWARD and o[1] == GC_OUT_NOT_GOLDEN; + assert outcome_shown(EV_C1X, 1, o[1]) == GC_OUT_CONFLICT; + assert judge(r, EV_C1X, G_MT, 1) == C_OK; + assert next_slot(r, EV_C1X, &wo, &wp) == DONE; + const n : usize = report(rq(V_LAND, true, ABSENT), EV_C1X, C_OK, &out, &wo, &wp, &wt); + const want : string = "golden head: none (base a1a1a1a1a1a1)\nqueue: 2\nclaude/evolve-a ppppp FORWARD\nclaude/evolve-b ppppp CONFLICT\nlanded: 1 of 2\n would run: git update-ref refs/golden/head b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2 0000000000000000000000000000000000000000\n"; + assert n == want.len and buf_is(&out, n, want); +} + test the_worst_case_fits { var wo : [16]u8 = [0] ** 16; var wp : [16]usize = [0] ** 16;