From fd76410749e6a33b8370c0cff7af38e616064c0d Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 20 Oct 2026 15:52:18 +0700 Subject: [PATCH 1/2] tri land: run t27b test --check on every changed spec and verify the seals of the specs that import one (Closes #11225) specs/tri/land/land.t27 gains two gates the hand pipeline ran and tri land lacked: - step 13 t27b: `t27b test --check --quiet` for every changed spec, after its tests and before any seal. A MISMATCH line, a non-zero exit or a t27b that cannot start refuses with the new code T27B_NOT_CLEAN (exit 16). t27b is the file beside T27C. - steps 17 to 20: one `git grep -l -F -e "use ::" ... -- specs` finds the specs that import a changed spec; each one that is not itself changed (nor scratch) has its seal verified, saved when it drifted and verified again (SEAL_NOT_CLEAN, naming the importer); an importer with no seal is left alone. importer_names lists the extra specs. The step constants are renumbered (types 21, dupes 22, stage 23 ... clean 33, LAND_STEPS 34), the header table and the fixtures follow, CMD_MAX grows to 65536 for the grep, and SLOT to 1000000000 because a per-importer slot's entry is the offset of its line in the evidence. 8 new tests (34 in all), each gate with a passing and a refusing event log. gen/rust/tri/land/land.rs is regenerated with t27c gen-rust, not edited. Co-Authored-By: Claude Sonnet 5.5 --- gen/rust/tri/land/land.rs | 505 ++++++++++++++++++++++----- specs/tri/land/land.t27 | 717 ++++++++++++++++++++++++++++++++------ 2 files changed, 1038 insertions(+), 184 deletions(-) diff --git a/gen/rust/tri/land/land.rs b/gen/rust/tri/land/land.rs index 6bb29cca78..a73bc16454 100644 --- a/gen/rust/tri/land/land.rs +++ b/gen/rust/tri/land/land.rs @@ -1,6 +1,6 @@ // Generated from .t27 spec // DO NOT EDIT — generated by t27c -// NOT LOWERED BY THIS BACKEND: 26 test(s), 1 invariant(s), 0 function(s) with no body. +// NOT LOWERED BY THIS BACKEND: 34 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. @@ -10,9 +10,9 @@ pub const BRANCH_MAX: usize = 100; pub const ISSUE_MAX: u64 = 999999999; -pub const CMD_MAX: usize = 4096; +pub const CMD_MAX: usize = 65536; -pub const SLOT: u64 = 100000; +pub const SLOT: u64 = 1000000000; pub const DONE: u64 = 99999999999; @@ -46,39 +46,49 @@ pub const L_CHANGES: u8 = 11; pub const L_TESTS: u8 = 12; -pub const L_SEAL: u8 = 13; +pub const L_T27B: u8 = 13; -pub const L_SAVE: u8 = 14; +pub const L_SEAL: u8 = 14; -pub const L_RECHECK: u8 = 15; +pub const L_SAVE: u8 = 15; -pub const L_TYPES: u8 = 16; +pub const L_RECHECK: u8 = 16; -pub const L_DUPES: u8 = 17; +pub const L_IMPORTERS: u8 = 17; -pub const L_STAGE: u8 = 18; +pub const L_ISEAL: u8 = 18; -pub const L_PENDING: u8 = 19; +pub const L_ISAVE: u8 = 19; -pub const L_TITLE: u8 = 20; +pub const L_IRECHECK: u8 = 20; -pub const L_COMMIT: u8 = 21; +pub const L_TYPES: u8 = 21; -pub const L_HEAD: u8 = 22; +pub const L_DUPES: u8 = 22; -pub const L_PUSH: u8 = 23; +pub const L_STAGE: u8 = 23; -pub const L_REMOTE_HEAD: u8 = 24; +pub const L_PENDING: u8 = 24; -pub const L_PR: u8 = 25; +pub const L_TITLE: u8 = 25; -pub const L_AUTO: u8 = 26; +pub const L_COMMIT: u8 = 26; -pub const L_AUTO_CHECK: u8 = 27; +pub const L_HEAD: u8 = 27; -pub const L_CLEAN: u8 = 28; +pub const L_PUSH: u8 = 28; -pub const LAND_STEPS: u8 = 29; +pub const L_REMOTE_HEAD: u8 = 29; + +pub const L_PR: u8 = 30; + +pub const L_AUTO: u8 = 31; + +pub const L_AUTO_CHECK: u8 = 32; + +pub const L_CLEAN: u8 = 33; + +pub const LAND_STEPS: u8 = 34; pub const L_OK: u8 = 0; @@ -112,7 +122,9 @@ pub const L_PUSH_NOT_CONFIRMED: u8 = 14; pub const L_AUTO_NOT_CONFIRMED: u8 = 15; -pub const OUTCOMES: u8 = 16; +pub const L_T27B_NOT_CLEAN: u8 = 16; + +pub const OUTCOMES: u8 = 17; #[derive(Debug, Clone, Copy)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] @@ -208,6 +220,17 @@ pub fn seal_clean(ev: &'static str, k: u8, n: u64) -> bool { return (has_line(ev, f, t, "all hashes MATCH") && (has_line(ev, f, t, "VERIFICATION FAILED") == false)); } +pub fn unsealed(ev: &'static str, k: u8, n: u64) -> bool { + return has_line(ev, body_from(ev, k, n), body_to(ev, k, n), "Error: No saved seal found"); +} + +pub fn t27b_clean(ev: &'static str, n: u64) -> bool { + if (exit_of(ev, L_T27B, n) != 0) { + return false; + } + return (find_in(ev, body_from(ev, L_T27B, n), body_to(ev, L_T27B, n), "MISMATCH") > ev.len()); +} + pub fn types_clean(ev: &'static str) -> bool { return ((exit_of(ev, L_TYPES, 0) == 0) && has_line(ev, body_from(ev, L_TYPES, 0), body_to(ev, L_TYPES, 0), "RATCHET: CLEAN")); } @@ -278,6 +301,118 @@ pub fn pushed(ev: &'static str) -> bool { return same(ev, hf, ev, rf, (rf + 40)); } +pub fn importer_line(ev: &'static str, from: usize, to: usize) -> bool { + if (((to < (from + 11)) || (span_is(ev, from, (from + 6), "specs/") == false)) || (span_is(ev, (to - 4), to, ".t27") == false)) { + return false; + } + let mut i: usize = from; + while (i < to) { + if ((((ev.as_bytes()[(i) as usize] <= 32) || (ev.as_bytes()[(i) as usize] >= 127)) || (ev.as_bytes()[(i) as usize] == 34)) || (ev.as_bytes()[(i) as usize] == 92)) { + return false; + } + i = (i + 1); + } + return true; +} + +pub fn importers_read(ev: &'static str) -> bool { + let t: usize = body_to(ev, L_IMPORTERS, 0); + let mut at: usize = body_from(ev, L_IMPORTERS, 0); + while (at < t) { + let mut end: usize = line_end(ev, at); + if (end > t) { + end = t; + } + if ((end > at) && (importer_line(ev, at, end) == false)) { + return false; + } + at = (end + 1); + } + return true; +} + +pub fn has_target(c: &'static str) -> bool { + let m: u64 = entries(c); + let mut n: u64 = 0; + while (n < m) { + if is_target(c, n) { + return true; + } + n = (n + 1); + } + return false; +} + +pub fn is_changed(r: TriLandReq, ev: &'static str, from: usize, to: usize) -> bool { + let m: u64 = entries(r.changes); + let mut n: u64 = 0; + while (n < m) { + if (is_target(r.changes, n) && ((path_end(r.changes, n) - path_start(r.changes, n)) == (to - from))) { + if same(ev, from, r.changes, path_start(r.changes, n), path_end(r.changes, n)) { + return true; + } + } + n = (n + 1); + } + return false; +} + +pub fn importer_wanted(r: TriLandReq, ev: &'static str, n: u64) -> bool { + let f: usize = body_from(ev, L_IMPORTERS, 0); + let t: usize = body_to(ev, L_IMPORTERS, 0); + if ((n < (f as u64)) || (n >= (t as u64))) { + return false; + } + let at: usize = (n as usize); + if ((at > f) && (ev.as_bytes()[((at - 1)) as usize] != 10)) { + return false; + } + let mut end: usize = line_end(ev, at); + if (end > t) { + end = t; + } + if ((importer_line(ev, at, end) == false) || (((end - at) >= 14) && span_is(ev, at, (at + 14), "specs/scratch/"))) { + return false; + } + return (is_changed(r, ev, at, end) == false); +} + +pub fn next_importer(r: TriLandReq, ev: &'static str, k: u8) -> u64 { + let t: usize = body_to(ev, L_IMPORTERS, 0); + let mut at: usize = body_from(ev, L_IMPORTERS, 0); + while (at < t) { + let mut end: usize = line_end(ev, at); + if (end > t) { + end = t; + } + if ((exit_of(ev, k, (at as u64)) == NO_EXIT) && applies(r, ev, k, (at as u64))) { + return (at as u64); + } + at = (end + 1); + } + return ABSENT; +} + +pub fn importer_names(r: TriLandReq, ev: &'static str, out: &mut [u8]) -> usize { + let t: usize = body_to(ev, L_IMPORTERS, 0); + let mut at: usize = body_from(ev, L_IMPORTERS, 0); + let mut w: usize = 0; + while (at < t) { + let mut end: usize = line_end(ev, at); + if (end > t) { + end = t; + } + if importer_wanted(r, ev, (at as u64)) { + if (w > 0) { + w = emit_byte(out, w, 32); + } + w = emit_span(out, w, ev, at, end); + } + at = (end + 1); + } + return fits(out, w); +} + pub fn is_finding(text: &'static str, at: usize, end: usize) -> bool { return ((end >= (at + 10)) && span_is(text, at, (at + 9), "::error::")); } @@ -371,15 +506,22 @@ pub fn per_target(k: u8) -> bool { return ((k >= L_TESTS) && (k <= L_RECHECK)); } +pub fn per_importer(k: u8) -> bool { + return ((k >= L_ISEAL) && (k <= L_IRECHECK)); +} + pub fn slot_rows(r: TriLandReq, k: u8) -> u64 { if per_target(k) { return entries(r.changes); } + if per_importer(k) { + return 0; + } return 1; } pub fn applies(r: TriLandReq, ev: &'static str, k: u8, n: u64) -> bool { - if ((k == L_TESTS) || (k == L_SEAL)) { + if (((k == L_TESTS) || (k == L_T27B)) || (k == L_SEAL)) { return is_target(r.changes, n); } if (k == L_SAVE) { @@ -388,6 +530,18 @@ pub fn applies(r: TriLandReq, ev: &'static str, k: u8, n: u64) -> bool { if (k == L_RECHECK) { return (exit_of(ev, L_SAVE, n) != NO_EXIT); } + if (k == L_IMPORTERS) { + return has_target(r.changes); + } + if (k == L_ISEAL) { + return importer_wanted(r, ev, n); + } + if (k == L_ISAVE) { + return (((importer_wanted(r, ev, n) && (exit_of(ev, L_ISEAL, n) != NO_EXIT)) && (seal_clean(ev, L_ISEAL, n) == false)) && (unsealed(ev, L_ISEAL, n) == false)); + } + if (k == L_IRECHECK) { + return (exit_of(ev, L_ISAVE, n) != NO_EXIT); + } if ((k >= L_STAGE) && r.check) { return false; } @@ -414,6 +568,12 @@ pub fn next_slot(r: TriLandReq, ev: &'static str) -> u64 { } n = (n + 1); } + if per_importer(k) { + let e: u64 = next_importer(r, ev, k); + if (e != ABSENT) { + return (((k as u64) * SLOT) + e); + } + } k = (k + 1); } return DONE; @@ -474,6 +634,9 @@ pub fn step_name(k: u8) -> &'static str { if (k == L_TESTS) { return "tests"; } + if (k == L_T27B) { + return "t27b"; + } if (k == L_SEAL) { return "seal"; } @@ -483,6 +646,18 @@ pub fn step_name(k: u8) -> &'static str { if (k == L_RECHECK) { return "seal-recheck"; } + if (k == L_IMPORTERS) { + return "importers"; + } + if (k == L_ISEAL) { + return "importer-seal"; + } + if (k == L_ISAVE) { + return "importer-save"; + } + if (k == L_IRECHECK) { + return "importer-recheck"; + } if (k == L_TYPES) { return "types"; } @@ -594,12 +769,24 @@ pub fn judge(r: TriLandReq, ev: &'static str, k: u8, n: u64) -> u8 { } return L_TESTS_NOT_CLEAN; } - if (k == L_RECHECK) { - if seal_clean(ev, L_RECHECK, n) { + if (k == L_T27B) { + if t27b_clean(ev, n) { + return L_OK; + } + return L_T27B_NOT_CLEAN; + } + if ((k == L_RECHECK) || (k == L_IRECHECK)) { + if seal_clean(ev, k, n) { return L_OK; } return L_SEAL_NOT_CLEAN; } + if (k == L_IMPORTERS) { + if ((x > 1) || (importers_read(ev) == false)) { + return L_STEP; + } + return L_OK; + } if (k == L_TYPES) { if types_clean(ev) { return L_OK; @@ -719,6 +906,9 @@ pub fn code_name(c: u8) -> &'static str { if (c == L_AUTO_NOT_CONFIRMED) { return "AUTO_NOT_CONFIRMED"; } + if (c == L_T27B_NOT_CLEAN) { + return "T27B_NOT_CLEAN"; + } return "UNKNOWN"; } @@ -757,7 +947,7 @@ pub fn code_why(c: u8) -> &'static str { return "a spec has a failing test, a vacuous pass, or no readable totals: it was not sealed"; } if (c == L_SEAL_NOT_CLEAN) { - return "a spec's seal does not match even after t27c seal --save"; + return "the seal of a changed spec, or of a spec that imports one, does not match even after t27c seal --save"; } if (c == L_TYPES_NOT_CLEAN) { return "tri types ratchet is not CLEAN"; @@ -771,6 +961,9 @@ pub fn code_why(c: u8) -> &'static str { if (c == L_AUTO_NOT_CONFIRMED) { return "the pull request is open but auto-merge is not confirmed on"; } + if (c == L_T27B_NOT_CLEAN) { + return "t27b test --check printed MISMATCH (the JIT and the reference interpreter disagree) or exited non-zero for a spec, or t27b could not be started (it is looked for beside t27c): it was not sealed"; + } return "unknown outcome"; } @@ -868,6 +1061,55 @@ pub fn emit_t27c(out: &mut [u8], w: usize, r: TriLandReq, n: u64, tail: &'static return emit_spec(out, p, r, n); } +pub fn emit_t27b(out: &mut [u8], w: usize, r: TriLandReq) -> usize { + let n: usize = r.t27c.len(); + let mut p: usize = w; + if ((n >= 4) && span_is(r.t27c, (n - 4), n, "t27c")) { + p = emit_span(out, p, r.t27c, 0, (n - 4)); + } + return emit_str(out, p, "t27b"); +} + +pub fn emit_module(out: &mut [u8], w: usize, c: &'static str, n: u64) -> usize { + let mut p: usize = w; + let mut i: usize = (path_start(c, n) + 6); + let e: usize = (path_end(c, n) - 4); + while (i < e) { + if (c.as_bytes()[(i) as usize] == 47) { + p = emit_str(out, p, "::"); + } else { + p = emit_byte(out, p, c.as_bytes()[(i) as usize]); + } + i = (i + 1); + } + return p; +} + +pub fn emit_uses(out: &mut [u8], w: usize, r: TriLandReq) -> usize { + let m: u64 = entries(r.changes); + let mut p: usize = w; + let mut n: u64 = 0; + while (n < m) { + if is_target(r.changes, n) { + p = emit_str(out, p, "-e\nuse "); + p = emit_module(out, p, r.changes, n); + p = emit_str(out, p, "::\n"); + } + n = (n + 1); + } + if (has_target(r.changes) == false) { + p = emit_str(out, p, "-e\nuse ::\n"); + } + return p; +} + +pub fn emit_importer(out: &mut [u8], w: usize, r: TriLandReq, ev: &'static str, n: u64) -> usize { + if (importer_wanted(r, ev, n) == false) { + return emit_str(out, w, ""); + } + return emit_span(out, w, ev, (n as usize), line_end(ev, (n as usize))); +} + pub fn step_argv(r: TriLandReq, ev: &'static str, k: u8, n: u64, out: &mut [u8]) -> usize { if (request_refusal(r) != L_OK) { return 0; @@ -925,6 +1167,12 @@ pub fn step_argv(r: TriLandReq, ev: &'static str, k: u8, n: u64, out: &mut [u8]) w = emit_t27c(out, w, r, n, "test-report\n"); w = emit_str(out, w, "\n--specs-dir\nspecs\n"); } + if (k == L_T27B) { + w = emit_t27b(out, w, r); + w = emit_str(out, w, "\ntest\n"); + w = emit_spec(out, w, r, n); + w = emit_str(out, w, "\n--check\n--quiet\n"); + } if ((k == L_SEAL) || (k == L_RECHECK)) { w = emit_t27c(out, w, r, n, "seal\n"); w = emit_str(out, w, "\n--verify\n"); @@ -933,6 +1181,21 @@ pub fn step_argv(r: TriLandReq, ev: &'static str, k: u8, n: u64, out: &mut [u8]) w = emit_t27c(out, w, r, n, "seal\n"); w = emit_str(out, w, "\n--save\n"); } + if (k == L_IMPORTERS) { + w = emit_str(out, w, "git\ngrep\n-l\n-F\n"); + w = emit_uses(out, w, r); + w = emit_str(out, w, "--\nspecs\n"); + } + if (((k == L_ISEAL) || (k == L_ISAVE)) || (k == L_IRECHECK)) { + w = emit_str(out, w, r.t27c); + w = emit_str(out, w, "\nseal\n"); + w = emit_importer(out, w, r, ev, n); + if (k == L_ISAVE) { + w = emit_str(out, w, "\n--save\n"); + } else { + w = emit_str(out, w, "\n--verify\n"); + } + } if (k == L_TYPES) { w = emit_str(out, w, r.tri); w = emit_str(out, w, "\ntypes\nratchet\n"); @@ -1034,10 +1297,14 @@ pub fn refusal_detail(r: TriLandReq, ev: &'static str, k: u8, n: u64, out: &mut } return fits(out, w); } - if ((k == L_TESTS) || (k == L_RECHECK)) { + if (((k == L_TESTS) || (k == L_T27B)) || (k == L_RECHECK)) { w = emit_span(out, w, r.changes, path_start(r.changes, n), path_end(r.changes, n)); return fits(out, w); } + if (k == L_IRECHECK) { + w = emit_importer(out, w, r, ev, n); + return fits(out, w); + } let nf: usize = extra_name(ev); if ((k == L_DUPES) && (nf < ev.len())) { w = emit_span(out, w, ev, nf, finding_to(ev, nf, line_end(ev, nf))); @@ -1093,93 +1360,93 @@ pub const EV_TESTS_NONE: &'static str = "@@ preflight 11 0 0 26\nA\tspecs/tri/la pub const EV_TESTS_NOTOTAL: &'static str = "@@ preflight 12 0 0 83\n FAIL 0\n vacuous passes 0 of 0 (passed with 0 runtime asserts executed)\n\n"; -pub const EV_SEAL_MATCH: &'static str = "@@ preflight 13 0 0 118\nspec_hash: MATCH\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nall hashes MATCH\n\n"; +pub const EV_SEAL_MATCH: &'static str = "@@ preflight 14 0 0 118\nspec_hash: MATCH\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nall hashes MATCH\n\n"; -pub const EV_SEAL_BAD: &'static str = "@@ preflight 13 0 1 162\nspec_hash: MISMATCH (sealed sha256:aaaa, now sha256:bbbb)\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nVERIFICATION FAILED\n\n"; +pub const EV_SEAL_BAD: &'static str = "@@ preflight 14 0 1 162\nspec_hash: MISMATCH (sealed sha256:aaaa, now sha256:bbbb)\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nVERIFICATION FAILED\n\n"; -pub const EV_RECHECK_MATCH: &'static str = "@@ preflight 15 0 0 118\nspec_hash: MATCH\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nall hashes MATCH\n\n"; +pub const EV_RECHECK_MATCH: &'static str = "@@ preflight 16 0 0 118\nspec_hash: MATCH\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nall hashes MATCH\n\n"; -pub const EV_RECHECK_BAD: &'static str = "@@ preflight 15 0 1 162\nspec_hash: MISMATCH (sealed sha256:aaaa, now sha256:bbbb)\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nVERIFICATION FAILED\n\n"; +pub const EV_RECHECK_BAD: &'static str = "@@ preflight 16 0 1 162\nspec_hash: MISMATCH (sealed sha256:aaaa, now sha256:bbbb)\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nVERIFICATION FAILED\n\n"; -pub const EV_RECHECK_BOTH: &'static str = "@@ preflight 15 0 0 280\nspec_hash: MATCH\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nall hashes MATCH\nspec_hash: MISMATCH (sealed sha256:aaaa, now sha256:bbbb)\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nVERIFICATION FAILED\n\n"; +pub const EV_RECHECK_BOTH: &'static str = "@@ preflight 16 0 0 280\nspec_hash: MATCH\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nall hashes MATCH\nspec_hash: MISMATCH (sealed sha256:aaaa, now sha256:bbbb)\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nVERIFICATION FAILED\n\n"; -pub const EV_RECHECK_EMPTY: &'static str = "@@ preflight 15 0 0 0\n\n"; +pub const EV_RECHECK_EMPTY: &'static str = "@@ preflight 16 0 0 0\n\n"; -pub const EV_TYPES_OK: &'static str = "@@ preflight 16 0 0 52\n ledger 107 name(s), observed 107\n RATCHET: CLEAN\n\n"; +pub const EV_TYPES_OK: &'static str = "@@ preflight 21 0 0 52\n ledger 107 name(s), observed 107\n RATCHET: CLEAN\n\n"; -pub const EV_TYPES_RED: &'static str = "@@ preflight 16 0 1 264\n ledger 107 name(s), observed 108\n + Cell NEW conflict\n\n A RESOLVED name fails too, on purpose. An entry that stops being\n true and stays in the ledger is slack the next conflict hides in --\n the same rule the corpus ratchet applies to an unexpected PASS.\n\n"; +pub const EV_TYPES_RED: &'static str = "@@ preflight 21 0 1 264\n ledger 107 name(s), observed 108\n + Cell NEW conflict\n\n A RESOLVED name fails too, on purpose. An entry that stops being\n true and stays in the ledger is slack the next conflict hides in --\n the same rule the corpus ratchet applies to an unexpected PASS.\n\n"; -pub const EV_TYPES_EXIT: &'static str = "@@ preflight 16 0 1 52\n ledger 107 name(s), observed 107\n RATCHET: CLEAN\n\n"; +pub const EV_TYPES_EXIT: &'static str = "@@ preflight 21 0 1 52\n ledger 107 name(s), observed 107\n RATCHET: CLEAN\n\n"; -pub const EV_TYPES_NOWORD: &'static str = "@@ preflight 16 0 0 35\n ledger 107 name(s), observed 107\n\n"; +pub const EV_TYPES_NOWORD: &'static str = "@@ preflight 21 0 0 35\n ledger 107 name(s), observed 107\n\n"; -pub const EV_PENDING_YES: &'static str = "@@ preflight 19 0 1 0\n\n"; +pub const EV_PENDING_YES: &'static str = "@@ preflight 24 0 1 0\n\n"; -pub const EV_PENDING_NO: &'static str = "@@ preflight 19 0 0 0\n\n"; +pub const EV_PENDING_NO: &'static str = "@@ preflight 24 0 0 0\n\n"; -pub const EV_PENDING_FAIL: &'static str = "@@ preflight 19 0 128 28\nfatal: not a git repository\n\n"; +pub const EV_PENDING_FAIL: &'static str = "@@ preflight 24 0 128 28\nfatal: not a git repository\n\n"; -pub const EV_TITLE: &'static str = "@@ preflight 20 0 0 45\ntri land: land a lane branch (Closes #11068)\n\n"; +pub const EV_TITLE: &'static str = "@@ preflight 25 0 0 45\ntri land: land a lane branch (Closes #11068)\n\n"; -pub const EV_TITLE_BARE: &'static str = "@@ preflight 20 0 0 29\ntri land: land a lane branch\n\n"; +pub const EV_TITLE_BARE: &'static str = "@@ preflight 25 0 0 29\ntri land: land a lane branch\n\n"; -pub const EV_TITLE_OTHER: &'static str = "@@ preflight 20 0 0 45\ntri land: land a lane branch (Closes #11000)\n\n"; +pub const EV_TITLE_OTHER: &'static str = "@@ preflight 25 0 0 45\ntri land: land a lane branch (Closes #11000)\n\n"; -pub const EV_TITLE_EMPTY: &'static str = "@@ preflight 20 0 0 0\n\n"; +pub const EV_TITLE_EMPTY: &'static str = "@@ preflight 25 0 0 0\n\n"; -pub const EV_PUSH_OK: &'static str = "@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 0 72\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/tri-land-11068\n\n"; +pub const EV_PUSH_OK: &'static str = "@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 0 0\n\n@@ preflight 29 0 0 72\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/tri-land-11068\n\n"; -pub const EV_PUSH_OTHER: &'static str = "@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 0 72\n89abcdef0123456789abcdef0123456789abcdef\trefs/heads/lane/tri-land-11068\n\n"; +pub const EV_PUSH_OTHER: &'static str = "@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 0 0\n\n@@ preflight 29 0 0 72\n89abcdef0123456789abcdef0123456789abcdef\trefs/heads/lane/tri-land-11068\n\n"; -pub const EV_PUSH_EMPTY: &'static str = "@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 0 0\n\n"; +pub const EV_PUSH_EMPTY: &'static str = "@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 0 0\n\n@@ preflight 29 0 0 0\n\n"; -pub const EV_PUSH_REJECT: &'static str = "@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 1 151\nTo github.com:gHashTag/t27.git\n ! [rejected] HEAD -> lane/x (non-fast-forward)\nerror: failed to push some refs to 'github.com:gHashTag/t27.git'\n\n"; +pub const EV_PUSH_REJECT: &'static str = "@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 1 151\nTo github.com:gHashTag/t27.git\n ! [rejected] HEAD -> lane/x (non-fast-forward)\nerror: failed to push some refs to 'github.com:gHashTag/t27.git'\n\n"; -pub const EV_PUSH_LSFAIL: &'static str = "@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 128 72\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/tri-land-11068\n\n"; +pub const EV_PUSH_LSFAIL: &'static str = "@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 0 0\n\n@@ preflight 29 0 128 72\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/tri-land-11068\n\n"; -pub const EV_HEAD_BAD: &'static str = "@@ preflight 22 0 0 10\nnot a sha\n\n"; +pub const EV_HEAD_BAD: &'static str = "@@ preflight 27 0 0 10\nnot a sha\n\n"; -pub const EV_PR_CREATED: &'static str = "@@ preflight 5 0 0 0\n\n@@ preflight 25 0 0 105\nCreating pull request for lane/x into master in gHashTag/t27\n\nhttps://github.com/gHashTag/t27/pull/11111\n\n"; +pub const EV_PR_CREATED: &'static str = "@@ preflight 5 0 0 0\n\n@@ preflight 30 0 0 105\nCreating pull request for lane/x into master in gHashTag/t27\n\nhttps://github.com/gHashTag/t27/pull/11111\n\n"; pub const EV_PR_OPEN: &'static str = "@@ preflight 5 0 0 10\n123 false\n\n"; -pub const EV_PR_FAIL: &'static str = "@@ preflight 25 0 1 33\nGraphQL: Head sha can't be blank\n\n"; +pub const EV_PR_FAIL: &'static str = "@@ preflight 30 0 1 33\nGraphQL: Head sha can't be blank\n\n"; -pub const EV_PR_NOURL: &'static str = "@@ preflight 25 0 0 8\ncreated\n\n"; +pub const EV_PR_NOURL: &'static str = "@@ preflight 30 0 0 8\ncreated\n\n"; -pub const EV_AUTO_FAIL: &'static str = "@@ preflight 26 0 1 41\nGraphQL: Pull request is in clean status\n\n"; +pub const EV_AUTO_FAIL: &'static str = "@@ preflight 31 0 1 41\nGraphQL: Pull request is in clean status\n\n"; -pub const EV_CHECK_TRUE: &'static str = "@@ preflight 27 0 0 5\ntrue\n\n"; +pub const EV_CHECK_TRUE: &'static str = "@@ preflight 32 0 0 5\ntrue\n\n"; -pub const EV_CHECK_FALSE: &'static str = "@@ preflight 27 0 0 6\nfalse\n\n"; +pub const EV_CHECK_FALSE: &'static str = "@@ preflight 32 0 0 6\nfalse\n\n"; -pub const EV_CHECK_FAIL: &'static str = "@@ preflight 27 0 1 5\ntrue\n\n"; +pub const EV_CHECK_FAIL: &'static str = "@@ preflight 32 0 1 5\ntrue\n\n"; pub const EV_WORKTREE_FAIL: &'static str = "@@ preflight 6 0 128 27\nfatal: '/x' already exists\n\n"; pub const EV_WORKTREE_OK: &'static str = "@@ preflight 6 0 0 0\n\n"; -pub const EV_DUP_SAME: &'static str = "@@ preflight 7 0 1 1514\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 1 1514\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_SAME: &'static str = "@@ preflight 7 0 1 1514\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 1 1514\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; -pub const EV_DUP_FIXED: &'static str = "@@ preflight 7 0 1 1514\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 1 1458\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_FIXED: &'static str = "@@ preflight 7 0 1 1514\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 1 1458\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; -pub const EV_DUP_SOME: &'static str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 1 417\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_SOME: &'static str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 1 417\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; -pub const EV_DUP_NEW: &'static str = "@@ preflight 7 0 1 1514\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 1 1601\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n::error::a body written under emit_span is now copied [2] time(s) and was in no ledger\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_NEW: &'static str = "@@ preflight 7 0 1 1514\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 1 1601\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n::error::a body written under emit_span is now copied [2] time(s) and was in no ledger\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; -pub const EV_DUP_NEWGROWN: &'static str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 1 557\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::emit_dec was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_NEWGROWN: &'static str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 1 557\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::emit_dec was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; -pub const EV_DUP_GROWN: &'static str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 1 418\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [10, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_GROWN: &'static str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 1 418\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [10, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; -pub const EV_DUP_CLEAN: &'static str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 0 93\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\nok: no new duplicate body\n\n"; +pub const EV_DUP_CLEAN: &'static str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 0 93\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\nok: no new duplicate body\n\n"; -pub const EV_DUP_UNREAD: &'static str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 2 417\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_UNREAD: &'static str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 2 417\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; -pub const EV_DUP_NOFIND: &'static str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 1 89\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\nsomething else failed\n\n"; +pub const EV_DUP_NOFIND: &'static str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 1 89\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\nsomething else failed\n\n"; -pub const EV_DUP_MASTER_BAD: &'static str = "@@ preflight 7 0 2 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 1 417\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_MASTER_BAD: &'static str = "@@ preflight 7 0 2 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 1 417\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; -pub const EV_DUP_MASTER_CLEAN: &'static str = "@@ preflight 7 0 0 93\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\nok: no new duplicate body\n\n@@ preflight 17 0 1 417\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_MASTER_CLEAN: &'static str = "@@ preflight 7 0 0 93\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\nok: no new duplicate body\n\n@@ preflight 22 0 1 417\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; pub const EV_DUP_MASTER_FAIL: &'static str = "@@ preflight 7 0 2 27\npython3: command not found\n\n"; @@ -1189,25 +1456,73 @@ pub const EV_RUN_B: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0 pub const EV_RUN_C: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n"; -pub const EV_RUN_D: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n"; +pub const EV_RUN_D: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n"; + +pub const EV_RUN_E: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 1 0\n\n@@ preflight 21 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 22 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n"; + +pub const EV_RUN_F: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 1 0\n\n@@ preflight 21 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 22 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 1 0\n\n@@ preflight 25 0 0 28\ntri land: x (Closes #11068)\n\n"; + +pub const EV_RUN_G: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 1 0\n\n@@ preflight 21 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 22 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 1 0\n\n@@ preflight 25 0 0 28\ntri land: x (Closes #11068)\n\n@@ preflight 26 0 0 0\n\n@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 0 0\n\n@@ preflight 29 0 0 59\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/x\n\n"; + +pub const EV_RUN_G_OPEN: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 10\n123 false\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 1 0\n\n@@ preflight 21 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 22 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 1 0\n\n@@ preflight 25 0 0 28\ntri land: x (Closes #11068)\n\n@@ preflight 26 0 0 0\n\n@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 0 0\n\n@@ preflight 29 0 0 59\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/x\n\n"; + +pub const EV_RUN_F_CLEAN: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 1 0\n\n@@ preflight 21 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 22 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 0 0\n\n@@ preflight 25 0 0 28\ntri land: x (Closes #11068)\n\n"; + +pub const EV_RUN_E_NO_DUPES: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 1 0\n\n@@ preflight 21 0 0 17\n RATCHET: CLEAN\n\n"; + +pub const EV_RUN_D_NO_SEAL: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n"; + +pub const EV_RUN_G_NO_REMOTE: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 1 0\n\n@@ preflight 21 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 22 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 1 0\n\n@@ preflight 25 0 0 28\ntri land: x (Closes #11068)\n\n@@ preflight 26 0 0 0\n\n@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 0 0\n\n"; + +pub const EV_RUN_G_AUTO_ON: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 9\n123 true\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 1 0\n\n@@ preflight 21 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 22 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 1 0\n\n@@ preflight 25 0 0 28\ntri land: x (Closes #11068)\n\n@@ preflight 26 0 0 0\n\n@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 0 0\n\n@@ preflight 29 0 0 59\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/x\n\n"; + +pub const EV_RUN_T0: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n"; + +pub const EV_RUN_T1: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n"; + +pub const EV_RUN_I0: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n"; + +pub const EV_RUN_I1: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n@@ preflight 18 1198 0 17\nall hashes MATCH\n\n@@ preflight 18 1245 1 20\nVERIFICATION FAILED\n\n@@ preflight 19 1245 0 6\nsaved\n\n@@ preflight 20 1245 0 17\nall hashes MATCH\n\n"; + +pub const EV_RUN_R: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n"; + +pub const EV_T27B_OK: &'static str = "@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n"; + +pub const EV_T27B_MISMATCH: &'static str = "@@ preflight 13 0 4 137\nMISMATCH scratch_is_read: jit Ok(0), interpreter Err(Fault(undefined))\nM: 4 passed, 0 failed, 4 total\nt27b: 1 JIT/interpreter mismatches\n\n"; + +pub const EV_T27B_FAIL: &'static str = "@@ preflight 13 0 1 43\nFAIL a_test\nM: 3 passed, 1 failed, 4 total\n\n"; + +pub const EV_T27B_ABSENT: &'static str = "@@ preflight 13 0 127 38\nNo such file or directory (os error 2)\n\n"; + +pub const EV_T27B_WORD: &'static str = "@@ preflight 13 0 0 72\nMISMATCH x: jit Ok(1), interpreter Ok(2)\nM: 4 passed, 0 failed, 4 total\n\n"; -pub const EV_RUN_E: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 14 2 0 6\nsaved\n\n@@ preflight 15 2 0 17\nall hashes MATCH\n\n@@ preflight 16 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 17 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n"; +pub const EV_T27B_SECOND: &'static str = "@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 4 137\nMISMATCH scratch_is_read: jit Ok(0), interpreter Err(Fault(undefined))\nM: 4 passed, 0 failed, 4 total\nt27b: 1 JIT/interpreter mismatches\n\n"; -pub const EV_RUN_F: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 14 2 0 6\nsaved\n\n@@ preflight 15 2 0 17\nall hashes MATCH\n\n@@ preflight 16 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 17 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 18 0 0 0\n\n@@ preflight 19 0 1 0\n\n@@ preflight 20 0 0 28\ntri land: x (Closes #11068)\n\n"; +pub const EV_IMP_NONE: &'static str = "@@ preflight 17 0 1 0\n\n"; -pub const EV_RUN_G: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 14 2 0 6\nsaved\n\n@@ preflight 15 2 0 17\nall hashes MATCH\n\n@@ preflight 16 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 17 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 18 0 0 0\n\n@@ preflight 19 0 1 0\n\n@@ preflight 20 0 0 28\ntri land: x (Closes #11068)\n\n@@ preflight 21 0 0 0\n\n@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 0 59\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/x\n\n"; +pub const EV_IMP_THREE: &'static str = "@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n"; -pub const EV_RUN_G_OPEN: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 10\n123 false\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 14 2 0 6\nsaved\n\n@@ preflight 15 2 0 17\nall hashes MATCH\n\n@@ preflight 16 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 17 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 18 0 0 0\n\n@@ preflight 19 0 1 0\n\n@@ preflight 20 0 0 28\ntri land: x (Closes #11068)\n\n@@ preflight 21 0 0 0\n\n@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 0 59\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/x\n\n"; +pub const EV_IMP_FAIL: &'static str = "@@ preflight 17 0 128 28\nfatal: not a git repository\n\n"; -pub const EV_RUN_F_CLEAN: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 14 2 0 6\nsaved\n\n@@ preflight 15 2 0 17\nall hashes MATCH\n\n@@ preflight 16 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 17 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 18 0 0 0\n\n@@ preflight 19 0 0 0\n\n@@ preflight 20 0 0 28\ntri land: x (Closes #11068)\n\n"; +pub const EV_IMP_STRAY: &'static str = "@@ preflight 17 0 0 41\nwarning: something\nspecs/tri/users/a.t27\n\n"; -pub const EV_RUN_E_NO_DUPES: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 14 2 0 6\nsaved\n\n@@ preflight 15 2 0 17\nall hashes MATCH\n\n@@ preflight 16 0 0 17\n RATCHET: CLEAN\n\n"; +pub const EV_IMP_SPACE: &'static str = "@@ preflight 17 0 0 18\nspecs/tri/a b.t27\n\n"; -pub const EV_RUN_D_NO_SEAL: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n"; +pub const EV_IMP_A_OK: &'static str = "@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n@@ preflight 18 23 0 17\nall hashes MATCH\n\n"; -pub const EV_RUN_G_NO_REMOTE: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 14 2 0 6\nsaved\n\n@@ preflight 15 2 0 17\nall hashes MATCH\n\n@@ preflight 16 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 17 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 18 0 0 0\n\n@@ preflight 19 0 1 0\n\n@@ preflight 20 0 0 28\ntri land: x (Closes #11068)\n\n@@ preflight 21 0 0 0\n\n@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 0 0\n\n"; +pub const EV_IMP_B_BAD: &'static str = "@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n@@ preflight 18 23 0 17\nall hashes MATCH\n\n@@ preflight 18 70 1 20\nVERIFICATION FAILED\n\n"; -pub const EV_RUN_G_AUTO_ON: &'static str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 9\n123 true\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 14 2 0 6\nsaved\n\n@@ preflight 15 2 0 17\nall hashes MATCH\n\n@@ preflight 16 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 17 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 18 0 0 0\n\n@@ preflight 19 0 1 0\n\n@@ preflight 20 0 0 28\ntri land: x (Closes #11068)\n\n@@ preflight 21 0 0 0\n\n@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 0 59\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/x\n\n"; +pub const EV_IMP_B_NONE: &'static str = "@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n@@ preflight 18 23 0 17\nall hashes MATCH\n\n@@ preflight 18 70 1 84\nError: No saved seal found at .trinity/seals/tri_Users.json. Run with --save first.\n\n"; + +pub const EV_IMP_B_SAVED: &'static str = "@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n@@ preflight 18 23 0 17\nall hashes MATCH\n\n@@ preflight 18 70 1 20\nVERIFICATION FAILED\n\n@@ preflight 19 70 0 6\nsaved\n\n"; + +pub const EV_IMP_B_MATCH: &'static str = "@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n@@ preflight 18 23 0 17\nall hashes MATCH\n\n@@ preflight 18 70 1 20\nVERIFICATION FAILED\n\n@@ preflight 19 70 0 6\nsaved\n\n@@ preflight 20 70 0 17\nall hashes MATCH\n\n"; + +pub const EV_IMP_B_STILL: &'static str = "@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n@@ preflight 18 23 0 17\nall hashes MATCH\n\n@@ preflight 18 70 1 20\nVERIFICATION FAILED\n\n@@ preflight 19 70 0 6\nsaved\n\n@@ preflight 20 70 1 20\nVERIFICATION FAILED\n\n"; + +pub const TXT_CH_TOP: &'static str = "M\tspecs/top.t27\n"; + +pub const TXT_CH_KEYS: &'static str = "M\tspecs/t27os/keys.t27\nA\tspecs/t27os/keys_probe.t27\n"; pub const TXT_CH_ONE: &'static str = "A\tspecs/tri/land/land.t27\n"; @@ -1223,6 +1538,8 @@ pub const P256: &'static str = "abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcd pub const P257: &'static str = "abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcd"; +pub const P256C: &'static str = "abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghi/t27c"; + pub const T_BRANCH: &'static str = "lane/tri-land-11068"; pub const T_SCRATCH: &'static str = "/tmp/tri-land-1"; @@ -1321,7 +1638,26 @@ pub fn program_ok(argv: &[u8], n: usize, r: TriLandReq) -> bool { } k = (k + 1); } - return false; + return is_t27b_program(argv, e, r); +} + +pub fn is_t27b_program(argv: &[u8], e: usize, r: TriLandReq) -> bool { + let n: usize = r.t27c.len(); + let mut head: usize = 0; + if ((n >= 4) && span_is(r.t27c, (n - 4), n, "t27c")) { + head = (n - 4); + } + if (e != (head + 4)) { + return false; + } + let mut i: usize = 0; + while ((i < head) && (argv[(i) as usize] == r.t27c.as_bytes()[(i) as usize])) { + i = (i + 1); + } + if (i < head) { + return false; + } + return ((((argv[(head) as usize] == 116) && (argv[((head + 1)) as usize] == 50)) && (argv[((head + 2)) as usize] == 55)) && (argv[((head + 3)) as usize] == 98)); } pub fn steps_sent(r: TriLandReq, ev: &'static str, buf: &mut [u8]) -> u32 { @@ -1386,6 +1722,8 @@ pub const V_NOT_RUN: u8 = 4; #[allow(non_upper_case_globals)] pub const tri_lab_receipt__V_RED: u8 = 5; +pub const V_UNREAD: u8 = 6; + pub const V_VACUOUS: u8 = 1; pub const V_VERIFIED: u8 = 0; @@ -1398,6 +1736,13 @@ pub fn line_end(text: &'static str, at: usize) -> usize { return k; } +pub fn listed(v: u8, pattern_given: bool) -> bool { + if pattern_given { + return true; + } + return ((v == tri_lab_receipt__V_RED) || (v == V_UNREAD)); +} + pub fn tri_lab_receipt__name(v: u8) -> &'static str { if (v == V_VERIFIED) { return "verified"; @@ -1521,9 +1866,9 @@ pub const MAX_DIGITS: usize = 18; pub const NO_EXIT: u64 = 256; -pub const RULES: u8 = 11; +pub const RULES: u8 = 13; -pub const STEPS: u8 = 17; +pub const STEPS: u8 = 19; pub fn body_from(ev: &'static str, k: u8, n: u64) -> usize { let s: usize = section(ev, k, n); diff --git a/specs/tri/land/land.t27 b/specs/tri/land/land.t27 index 3ef3f47cc8..7ad21202d2 100644 --- a/specs/tri/land/land.t27 +++ b/specs/tri/land/land.t27 @@ -23,7 +23,8 @@ ; the output of the CHANGES step once it has run (the glue stores it here), and two flags: check (stop before the commit) and ; plan (print the steps, run none). request_refusal() says why a request may not run (L_OK is 0). ; - -; THE STEPS, in this order, each one a slot (step, entry) ; entry n is the n-th line of CHANGES for a per-target step. +; THE STEPS, in this order, each one a slot (step, entry) ; entry n is the n-th line of CHANGES for a per-target step, and for a +; per-importer step (18 to 20) the offset in the evidence of the importer's line, which never moves, as the evidence only grows. ; 0 fetch git fetch -q origin master ; 1 merged gh pr list --repo R --head B --state merged -> a number: ALREADY_LANDED ; 2 tip git rev-parse --verify -q refs/heads/B -> the branch's local tip (NO_BRANCH without it) @@ -38,29 +39,45 @@ ; 10 conflicts git diff --name-only --diff-filter=U -> any name: CONFLICT, with the names ; 11 changes git diff --cached --name-status --no-renames origin/master -> the specs to gate ; 12 tests n t27c test-report --specs-dir specs -> TESTS_NOT_CLEAN -; 13 seal n t27c seal --verify -; 14 save n t27c seal --save only for a spec whose seal did not MATCH -; 15 recheck n t27c seal --verify only after a save -> SEAL_NOT_CLEAN -; 16 types tri types ratchet -> TYPES_NOT_CLEAN -; 17 dupes python3 tools/dupe_scan.py -> DUPE_NOT_SUBSET +; 13 t27b n t27b test --check --quiet the JIT against the interpreter (#11225) +; -> T27B_NOT_CLEAN on a line MISMATCH or a non-zero exit; t27b is the program next to t27c +; 14 seal n t27c seal --verify +; 15 save n t27c seal --save only for a spec whose seal did not MATCH +; 16 recheck n t27c seal --verify only after a save -> SEAL_NOT_CLEAN +; 17 importers git grep -l -F -e "use ::" (one -e per changed spec) -- specs (#11225) +; the specs that import a changed spec; is the path without specs/ and .t27, `/` as `::` +; 18 imp_seal i t27c seal --verify for each importer that is not itself changed (entry i: its line's offset) +; 19 imp_save i t27c seal --save only for an importer whose seal did not MATCH and exists +; 20 imp_recheck i t27c seal --verify only after a save -> SEAL_NOT_CLEAN +; 21 types tri types ratchet -> TYPES_NOT_CLEAN +; 22 dupes python3 tools/dupe_scan.py -> DUPE_NOT_SUBSET ; --- check stops here --- -; 18 stage git add .trinity/seals -; 19 pending git diff --cached --quiet (exit 1: the merge or a seal changed something) -; 20 title git log -1 --no-merges --format=%s the lane's own last subject -; 21 commit git -c core.hooksPath=.githooks commit -q -m -m <what this is> only when pending -; 22 head git rev-parse HEAD -; 23 push git push origin HEAD:refs/heads/B never forced -; 24 remote_head git ls-remote origin refs/heads/B -> the same object as HEAD, else PUSH_NOT_CONFIRMED -; 25 pr gh pr create ... only when no PR is open -; 26 auto gh pr merge <n> --repo R --auto --squash only when auto-merge is not on -; 27 auto_check gh pr view <n> ... autoMergeRequest -> true, else AUTO_NOT_CONFIRMED -; 28 clean git worktree remove --force <scratch> run by the glue at the end, on every path -; Steps 18 to 27 are not slots of a check run, and step 26 is reached only through the pass of steps 12 to 17 and 22 to 24: a +; 23 stage git add .trinity/seals +; 24 pending git diff --cached --quiet (exit 1: the merge or a seal changed something) +; 25 title git log -1 --no-merges --format=%s the lane's own last subject +; 26 commit git -c core.hooksPath=.githooks commit -q -m <title> -m <what this is> only when pending +; 27 head git rev-parse HEAD +; 28 push git push origin HEAD:refs/heads/B never forced +; 29 remote_head git ls-remote origin refs/heads/B -> the same object as HEAD, else PUSH_NOT_CONFIRMED +; 30 pr gh pr create ... only when no PR is open +; 31 auto gh pr merge <n> --repo R --auto --squash only when auto-merge is not on +; 32 auto_check gh pr view <n> ... autoMergeRequest -> true, else AUTO_NOT_CONFIRMED +; 33 clean git worktree remove --force <scratch> run by the glue at the end, on every path +; Steps 23 to 32 are not slots of a check run, and step 31 is reached only through the pass of steps 12 to 22 and 27 to 29: a ; slot is chosen only when every earlier slot has a section of evidence, and the glue stops at the first refusal, so auto-merge ; is never enabled unless every gate before it passed. The word `--force`, `-f` and a `+` refspec appear in no step, and the ; only write to a remote ref is `HEAD:refs/heads/B` with B a branch that is not master, main or HEAD (branch_ok): master is ; never written. ; - +; THE TWO GATES OF #11225. Step 13: `t27b test <spec> --check` runs the spec in the JIT and again in the reference interpreter +; and says MISMATCH when they disagree; a scratch array that is never written (`[3]usize = undefined`) passes the JIT and +; faults the interpreter (#11131), and only this step sees it. Steps 17 to 20: a spec that `use`s a changed spec can move its own +; seal (its generated code reads the changed one) without being touched (#11102), so verifying the seals of the changed specs +; alone is not enough; every importer, one level, is verified, and an importer whose seal drifted is saved and verified again as +; a changed spec is. An importer that has no seal (`Error: No saved seal found`) has nothing to verify and is left alone; an +; importer that is itself changed was gated by steps 14 to 16 and is not run twice. The importers' step is one grep for all +; changed specs, so a spec that imports two of them is listed once. `importer_names` writes the extra specs of a run, one line. +; - ; THE EVIDENCE is the one preflight reads: for each run `@@ preflight <step> <entry> <exit> <length>\n` and then the output ; (stdout and stderr) of exactly that length and a newline. emit_section() writes it, and the glue appends what it writes. ; - @@ -68,7 +85,11 @@ ; tests_clean `t27c test-report`: the totals lines ` tests N`, ` FAIL F` and ` vacuous passes V of M (...)` are ; all present, F == 0 and V == 0. A report with no totals (a BLOCKED spec), `vacuous passes unknown` or no such ; line at all (a t27c older than #6509) is not clean: nothing could be counted. +; t27b_clean `t27b test <spec> --check --quiet`: exit 0 and no `MISMATCH` anywhere in its output. A t27b that cannot be started +; (not next to t27c) exits 127 and is not clean. ; seal_clean `t27c seal --verify`: a line `all hashes MATCH` and no line `VERIFICATION FAILED`. +; importers `git grep -l`: exit 0 or 1 (1 is no match), and every line is a path under specs/ ending .t27; exit 2 or a stray +; line is STEP_FAILED. An importer is run when it is not under specs/scratch/ and is not itself a changed spec. ; types_clean `tri types ratchet`: exit 0 and a line `RATCHET: CLEAN`. ; dupe subset `python3 tools/dupe_scan.py` prints `::error::a body written under <name> is now copied [n] time(s) and was in ; no ledger` and `::error::<name> was copied [a] and is now copied [b]`. The failing set of the branch is the @@ -87,6 +108,11 @@ ; uncommitted change in the caller's checkout is not in it. (4) The push goes to origin's copy of the branch, so the caller's local ; branch is behind it by the merge and seal commit until `git pull --ff-only`; a new local commit on top of the old tip then meets a ; remote that has moved, and the push is refused (never forced). (5) The pull request body and the commit message are one line each. +; (6) The importers are the specs whose text holds `use <module>::`: one level, so a spec that reaches a changed one through two +; hops is not verified here; a comment that holds the text makes a spec an importer too, which costs one verify and nothing else. +; (7) t27b is the file named t27b in the directory of T27C (the bare name t27b when T27C is the bare name t27c): a build that has +; t27c and no t27b beside it is refused with T27B_NOT_CLEAN, not skipped. (8) The importers' grep names every changed spec in one +; argument vector of CMD_MAX bytes: a branch of more than about 1500 changed specs does not fit and the glue stops with `does not fit`. ; ASCII only (L3) ; phi^2 + 1/phi^2 = 3 | TRINITY @@ -120,10 +146,12 @@ use tri::remote::remote_job::buf_has; pub const REPO : str = "gHashTag/t27"; pub const BRANCH_MAX : usize = 100; pub const ISSUE_MAX : u64 = 999999999; -// The room one step's argument vector is written into; the tests prove the worst case fits. -pub const CMD_MAX : usize = 4096; -// A slot is step * SLOT + entry; DONE says there is none left. A number is read to 18 digits, ABSENT is one more digit. -pub const SLOT : u64 = 100000; +// The room one step's argument vector is written into; the tests prove the worst case fits. Every step but the importers' grep needs +// less than 4096; that one names every changed spec (about 40 bytes each), so the room holds a branch of some 1500 specs. +pub const CMD_MAX : usize = 65536; +// A slot is step * SLOT + entry; DONE says there is none left. A number is read to 18 digits, ABSENT is one more digit. The entry of +// a per-importer step is an offset in the evidence, so SLOT is wider than any evidence the glue can hold (LAND_STEPS * SLOT < DONE). +pub const SLOT : u64 = 1000000000; pub const DONE : u64 = 99999999999; pub const ABSENT : u64 = 1000000000000000000; // How many more times a network step is run after a flaky TLS or DNS answer (transient). @@ -143,23 +171,28 @@ pub const L_MERGE : u8 = 9; pub const L_CONFLICTS : u8 = 10; pub const L_CHANGES : u8 = 11; pub const L_TESTS : u8 = 12; -pub const L_SEAL : u8 = 13; -pub const L_SAVE : u8 = 14; -pub const L_RECHECK : u8 = 15; -pub const L_TYPES : u8 = 16; -pub const L_DUPES : u8 = 17; -pub const L_STAGE : u8 = 18; -pub const L_PENDING : u8 = 19; -pub const L_TITLE : u8 = 20; -pub const L_COMMIT : u8 = 21; -pub const L_HEAD : u8 = 22; -pub const L_PUSH : u8 = 23; -pub const L_REMOTE_HEAD : u8 = 24; -pub const L_PR : u8 = 25; -pub const L_AUTO : u8 = 26; -pub const L_AUTO_CHECK : u8 = 27; -pub const L_CLEAN : u8 = 28; -pub const LAND_STEPS : u8 = 29; +pub const L_T27B : u8 = 13; +pub const L_SEAL : u8 = 14; +pub const L_SAVE : u8 = 15; +pub const L_RECHECK : u8 = 16; +pub const L_IMPORTERS : u8 = 17; +pub const L_ISEAL : u8 = 18; +pub const L_ISAVE : u8 = 19; +pub const L_IRECHECK : u8 = 20; +pub const L_TYPES : u8 = 21; +pub const L_DUPES : u8 = 22; +pub const L_STAGE : u8 = 23; +pub const L_PENDING : u8 = 24; +pub const L_TITLE : u8 = 25; +pub const L_COMMIT : u8 = 26; +pub const L_HEAD : u8 = 27; +pub const L_PUSH : u8 = 28; +pub const L_REMOTE_HEAD : u8 = 29; +pub const L_PR : u8 = 30; +pub const L_AUTO : u8 = 31; +pub const L_AUTO_CHECK : u8 = 32; +pub const L_CLEAN : u8 = 33; +pub const LAND_STEPS : u8 = 34; // The outcomes. 0 says go on; 1 to 3 end the run well; every other code is a refusal and is the exit code of the command. pub const L_OK : u8 = 0; @@ -178,7 +211,8 @@ pub const L_TYPES_NOT_CLEAN : u8 = 12; pub const L_DUPE_NOT_SUBSET : u8 = 13; pub const L_PUSH_NOT_CONFIRMED : u8 = 14; pub const L_AUTO_NOT_CONFIRMED : u8 = 15; -pub const OUTCOMES : u8 = 16; +pub const L_T27B_NOT_CLEAN : u8 = 16; +pub const OUTCOMES : u8 = 17; pub struct TriLandReq { branch: string, @@ -191,7 +225,7 @@ pub struct TriLandReq { plan: bool, } -invariant the_steps_and_outcomes_are_numbered { assert L_MERGED < L_OPEN and L_OPEN < L_WORKTREE and L_MERGE < L_CONFLICTS and L_CONFLICTS < L_CHANGES and L_CHANGES < L_TESTS and L_TESTS < L_SEAL and L_SEAL < L_SAVE and L_SAVE < L_RECHECK and L_RECHECK < L_TYPES and L_TYPES < L_DUPES and L_DUPES < L_STAGE and L_STAGE < L_COMMIT and L_COMMIT < L_PUSH and L_PUSH < L_REMOTE_HEAD and L_REMOTE_HEAD < L_PR and L_PR < L_AUTO and L_AUTO < L_AUTO_CHECK and L_AUTO_CHECK < L_CLEAN and L_CLEAN + 1 == LAND_STEPS and L_CHECKED < L_BAD_BRANCH and L_AUTO_NOT_CONFIRMED + 1 == OUTCOMES; } +invariant the_steps_and_outcomes_are_numbered { assert L_MERGED < L_OPEN and L_OPEN < L_WORKTREE and L_MERGE < L_CONFLICTS and L_CONFLICTS < L_CHANGES and L_CHANGES < L_TESTS and L_TESTS < L_T27B and L_T27B < L_SEAL and L_SEAL < L_SAVE and L_SAVE < L_RECHECK and L_RECHECK < L_IMPORTERS and L_IMPORTERS < L_ISEAL and L_ISEAL < L_ISAVE and L_ISAVE < L_IRECHECK and L_IRECHECK < L_TYPES and L_TYPES < L_DUPES and L_DUPES < L_STAGE and L_STAGE < L_COMMIT and L_COMMIT < L_PUSH and L_PUSH < L_REMOTE_HEAD and L_REMOTE_HEAD < L_PR and L_PR < L_AUTO and L_AUTO < L_AUTO_CHECK and L_AUTO_CHECK < L_CLEAN and L_CLEAN + 1 == LAND_STEPS and L_CHECKED < L_BAD_BRANCH and L_AUTO_NOT_CONFIRMED + 1 == L_T27B_NOT_CLEAN and L_T27B_NOT_CLEAN + 1 == OUTCOMES and (LAND_STEPS as u64) * SLOT < DONE; } // --- the request --------------------------------------------------------------------------------- @@ -263,6 +297,18 @@ pub fn seal_clean(ev: string, k: u8, n: u64) -> bool { return has_line(ev, f, t, "all hashes MATCH") and has_line(ev, f, t, "VERIFICATION FAILED") == false; } +/// Did step k, entry n, find no seal for its spec at all: a line `Error: No saved seal found`? Such a spec has nothing to verify. +pub fn unsealed(ev: string, k: u8, n: u64) -> bool { + return has_line(ev, body_from(ev, k, n), body_to(ev, k, n), "Error: No saved seal found"); +} + +/// Is the t27b run of entry n clean: exit 0 and the word MISMATCH nowhere in its output? A JIT that agrees with the interpreter +/// prints no such word; one that does not exits 4 as well, and an interpreter fault (#11131) is a mismatch. +pub fn t27b_clean(ev: string, n: u64) -> bool { + if (exit_of(ev, L_T27B, n) != 0) { return false; } + return find_in(ev, body_from(ev, L_T27B, n), body_to(ev, L_T27B, n), "MISMATCH") > ev.len; +} + /// Is the types ratchet clean: exit 0 and a line `RATCHET: CLEAN`? pub fn types_clean(ev: string) -> bool { return exit_of(ev, L_TYPES, 0) == 0 and has_line(ev, body_from(ev, L_TYPES, 0), body_to(ev, L_TYPES, 0), "RATCHET: CLEAN"); @@ -326,6 +372,101 @@ pub fn pushed(ev: string) -> bool { return same(ev, hf, ev, rf, rf + 40); } +// --- the importers: the specs that use a changed spec --------------------------------------------------- + +/// Is ev[from..to] a path `git grep -l` prints for a spec: `specs/`, bytes that need no quoting, then `.t27`? +pub fn importer_line(ev: string, from: usize, to: usize) -> bool { + if (to < from + 11 or span_is(ev, from, from + 6, "specs/") == false or span_is(ev, to - 4, to, ".t27") == false) { return false; } + var i : usize = from; + while (i < to) { + if (ev[i] <= 32 or ev[i] >= 127 or ev[i] == 34 or ev[i] == 92) { return false; } + i = i + 1; + } + return true; +} + +/// Does the importers' output hold nothing but spec paths, one to a line? A stray line (a warning, an error) is not readable. +pub fn importers_read(ev: string) -> bool { + const t : usize = body_to(ev, L_IMPORTERS, 0); + var at : usize = body_from(ev, L_IMPORTERS, 0); + while (at < t) { + var end : usize = line_end(ev, at); + if (end > t) { end = t; } + if (end > at and importer_line(ev, at, end) == false) { return false; } + at = end + 1; + } + return true; +} + +/// Does the branch change a spec the per-target steps run on? +pub fn has_target(c: string) -> bool { + const m : u64 = entries(c); + var n : u64 = 0; + while (n < m) { + if (is_target(c, n)) { return true; } + n = n + 1; + } + return false; +} + +/// Is the spec path ev[from..to] one of the changed specs of r? +pub fn is_changed(r: TriLandReq, ev: string, from: usize, to: usize) -> bool { + const m : u64 = entries(r.changes); + var n : u64 = 0; + while (n < m) { + if (is_target(r.changes, n) and path_end(r.changes, n) - path_start(r.changes, n) == to - from) { + if (same(ev, from, r.changes, path_start(r.changes, n), path_end(r.changes, n))) { return true; } + } + n = n + 1; + } + return false; +} + +/// Is ev[n] the first byte of a line of the importers' output that this run verifies: a spec that is not under specs/scratch/ and +/// is not itself a changed spec (steps 14 to 16 gated that one)? The offset is the entry of the slots of steps 18 to 20. +pub fn importer_wanted(r: TriLandReq, ev: string, n: u64) -> bool { + const f : usize = body_from(ev, L_IMPORTERS, 0); + const t : usize = body_to(ev, L_IMPORTERS, 0); + if (n < (f as u64) or n >= (t as u64)) { return false; } + const at : usize = n as usize; + if (at > f and ev[at - 1] != 10) { return false; } + var end : usize = line_end(ev, at); + if (end > t) { end = t; } + if (importer_line(ev, at, end) == false or (end - at >= 14 and span_is(ev, at, at + 14, "specs/scratch/"))) { return false; } + return is_changed(r, ev, at, end) == false; +} + +/// The entry of the first importer that step k (L_ISEAL, L_ISAVE or L_IRECHECK) has still to run: the offset of its line, ABSENT +/// when there is none. +pub fn next_importer(r: TriLandReq, ev: string, k: u8) -> u64 { + const t : usize = body_to(ev, L_IMPORTERS, 0); + var at : usize = body_from(ev, L_IMPORTERS, 0); + while (at < t) { + var end : usize = line_end(ev, at); + if (end > t) { end = t; } + if (exit_of(ev, k, at as u64) == NO_EXIT and applies(r, ev, k, at as u64)) { return at as u64; } + at = end + 1; + } + return ABSENT; +} + +/// The extra specs of a run: the importers it verifies, on one line, a blank apart. The byte count, 0 when there are none. +pub fn importer_names(r: TriLandReq, ev: string, out: []u8) -> usize { + const t : usize = body_to(ev, L_IMPORTERS, 0); + var at : usize = body_from(ev, L_IMPORTERS, 0); + var w : usize = 0; + while (at < t) { + var end : usize = line_end(ev, at); + if (end > t) { end = t; } + if (importer_wanted(r, ev, at as u64)) { + if (w > 0) { w = emit_byte(out, w, 32); } + w = emit_span(out, w, ev, at, end); + } + at = end + 1; + } + return fits(out, w); +} + // --- the dupe rule: the branch's failing names must be master's -------------------------------------- /// Is text[at..end] a finding of dupe_scan: a line that starts with `::error::` and has a name? @@ -410,17 +551,28 @@ pub fn per_target(k: u8) -> bool { return k >= L_TESTS and k <= L_RECHECK; } -/// How many slots step k has: one per CHANGES line for a per-target step, else one. +/// Does step k run once per importer of a changed spec (its entry is the offset of the importer's line in the evidence)? +pub fn per_importer(k: u8) -> bool { + return k >= L_ISEAL and k <= L_IRECHECK; +} + +/// How many slots step k has by number: one per CHANGES line for a per-target step, none for a per-importer step (next_importer +/// finds those in the evidence), else one. pub fn slot_rows(r: TriLandReq, k: u8) -> u64 { if (per_target(k)) { return entries(r.changes); } + if (per_importer(k)) { return 0; } return 1; } /// Is slot (k, n) wanted, given the evidence so far? A slot not wanted is skipped, never run. pub fn applies(r: TriLandReq, ev: string, k: u8, n: u64) -> bool { - if (k == L_TESTS or k == L_SEAL) { return is_target(r.changes, n); } + if (k == L_TESTS or k == L_T27B or k == L_SEAL) { return is_target(r.changes, n); } if (k == L_SAVE) { return is_target(r.changes, n) and exit_of(ev, L_SEAL, n) != NO_EXIT and seal_clean(ev, L_SEAL, n) == false; } if (k == L_RECHECK) { return exit_of(ev, L_SAVE, n) != NO_EXIT; } + if (k == L_IMPORTERS) { return has_target(r.changes); } + if (k == L_ISEAL) { return importer_wanted(r, ev, n); } + if (k == L_ISAVE) { return importer_wanted(r, ev, n) and exit_of(ev, L_ISEAL, n) != NO_EXIT and seal_clean(ev, L_ISEAL, n) == false and unsealed(ev, L_ISEAL, n) == false; } + if (k == L_IRECHECK) { return exit_of(ev, L_ISAVE, n) != NO_EXIT; } if (k >= L_STAGE and r.check) { return false; } if (k == L_COMMIT) { return exit_of(ev, L_PENDING, 0) == 1; } if (k == L_PR) { return lead_number(ev, L_OPEN) == 0; } @@ -439,6 +591,10 @@ pub fn next_slot(r: TriLandReq, ev: string) -> u64 { if (applies(r, ev, k, n) and exit_of(ev, k, n) == NO_EXIT) { return (k as u64) * SLOT + n; } n = n + 1; } + if (per_importer(k)) { + const e : u64 = next_importer(r, ev, k); + if (e != ABSENT) { return (k as u64) * SLOT + e; } + } k = k + 1; } return DONE; @@ -477,9 +633,14 @@ pub fn step_name(k: u8) -> string { if (k == L_CONFLICTS) { return "conflicts"; } if (k == L_CHANGES) { return "changes"; } if (k == L_TESTS) { return "tests"; } + if (k == L_T27B) { return "t27b"; } if (k == L_SEAL) { return "seal"; } if (k == L_SAVE) { return "seal-save"; } if (k == L_RECHECK) { return "seal-recheck"; } + if (k == L_IMPORTERS) { return "importers"; } + if (k == L_ISEAL) { return "importer-seal"; } + if (k == L_ISAVE) { return "importer-save"; } + if (k == L_IRECHECK) { return "importer-recheck"; } if (k == L_TYPES) { return "types"; } if (k == L_DUPES) { return "dupes"; } if (k == L_STAGE) { return "stage"; } @@ -543,10 +704,18 @@ pub fn judge(r: TriLandReq, ev: string, k: u8, n: u64) -> u8 { if (tests_clean(ev, n)) { return L_OK; } return L_TESTS_NOT_CLEAN; } - if (k == L_RECHECK) { - if (seal_clean(ev, L_RECHECK, n)) { return L_OK; } + if (k == L_T27B) { + if (t27b_clean(ev, n)) { return L_OK; } + return L_T27B_NOT_CLEAN; + } + if (k == L_RECHECK or k == L_IRECHECK) { + if (seal_clean(ev, k, n)) { return L_OK; } return L_SEAL_NOT_CLEAN; } + if (k == L_IMPORTERS) { + if (x > 1 or importers_read(ev) == false) { return L_STEP; } + return L_OK; + } if (k == L_TYPES) { if (types_clean(ev)) { return L_OK; } return L_TYPES_NOT_CLEAN; @@ -614,6 +783,7 @@ pub fn code_name(c: u8) -> string { if (c == L_DUPE_NOT_SUBSET) { return "DUPE_NOT_SUBSET"; } if (c == L_PUSH_NOT_CONFIRMED) { return "PUSH_NOT_CONFIRMED"; } if (c == L_AUTO_NOT_CONFIRMED) { return "AUTO_NOT_CONFIRMED"; } + if (c == L_T27B_NOT_CLEAN) { return "T27B_NOT_CLEAN"; } return "UNKNOWN"; } @@ -630,11 +800,12 @@ pub fn code_why(c: u8) -> string { if (c == L_NO_BRANCH) { return "this repository has no local branch of that name: git branch <name> origin/<name> first"; } if (c == L_CONFLICT) { return "the branch conflicts with master in the files named: resolve them on the branch, nothing was pushed"; } if (c == L_TESTS_NOT_CLEAN) { return "a spec has a failing test, a vacuous pass, or no readable totals: it was not sealed"; } - if (c == L_SEAL_NOT_CLEAN) { return "a spec's seal does not match even after t27c seal --save"; } + if (c == L_SEAL_NOT_CLEAN) { return "the seal of a changed spec, or of a spec that imports one, does not match even after t27c seal --save"; } if (c == L_TYPES_NOT_CLEAN) { return "tri types ratchet is not CLEAN"; } if (c == L_DUPE_NOT_SUBSET) { return "dupe_scan fails on a name master does not fail on (or it could not be read): reuse the body that exists"; } if (c == L_PUSH_NOT_CONFIRMED) { return "origin does not hold the head that was pushed (never forced: pull the branch first if it has moved)"; } if (c == L_AUTO_NOT_CONFIRMED) { return "the pull request is open but auto-merge is not confirmed on"; } + if (c == L_T27B_NOT_CLEAN) { return "t27b test --check printed MISMATCH (the JIT and the reference interpreter disagree) or exited non-zero for a spec, or t27b could not be started (it is looked for beside t27c): it was not sealed"; } return "unknown outcome"; } @@ -727,6 +898,51 @@ pub fn emit_t27c(out: []u8, w: usize, r: TriLandReq, n: u64, tail: string) -> us return emit_spec(out, p, r, n); } +/// The t27b program: the file named t27b in the directory of T27C (`/x/t27c` gives `/x/t27b`), the bare name t27b when T27C does +/// not end in t27c. +pub fn emit_t27b(out: []u8, w: usize, r: TriLandReq) -> usize { + const n : usize = r.t27c.len; + var p : usize = w; + if (n >= 4 and span_is(r.t27c, n - 4, n, "t27c")) { p = emit_span(out, p, r.t27c, 0, n - 4); } + return emit_str(out, p, "t27b"); +} + +/// Write the module of the changed spec on CHANGES line n: its path without `specs/` and `.t27`, each `/` written `::`. +pub fn emit_module(out: []u8, w: usize, c: string, n: u64) -> usize { + var p : usize = w; + var i : usize = path_start(c, n) + 6; + const e : usize = path_end(c, n) - 4; + while (i < e) { + if (c[i] == 47) { p = emit_str(out, p, "::"); } else { p = emit_byte(out, p, c[i]); } + i = i + 1; + } + return p; +} + +/// One `-e` and `use <module>::` for each changed spec the run gates, `use <module>::` itself while there is none (a plan). +pub fn emit_uses(out: []u8, w: usize, r: TriLandReq) -> usize { + const m : u64 = entries(r.changes); + var p : usize = w; + var n : u64 = 0; + while (n < m) { + if (is_target(r.changes, n)) { + p = emit_str(out, p, "-e\nuse "); + p = emit_module(out, p, r.changes, n); + p = emit_str(out, p, "::\n"); + } + n = n + 1; + } + if (has_target(r.changes) == false) { p = emit_str(out, p, "-e\nuse <module>::\n"); } + return p; +} + +/// Write the spec path of the importer whose line starts at offset n of the evidence, `<importer>` when no importer the run +/// verifies starts there. +pub fn emit_importer(out: []u8, w: usize, r: TriLandReq, ev: string, n: u64) -> usize { + if (importer_wanted(r, ev, n) == false) { return emit_str(out, w, "<importer>"); } + return emit_span(out, w, ev, n as usize, line_end(ev, n as usize)); +} + /// The argument vector of slot (k, n), one argument to a line, each ended by a newline; the byte count. 0 means there is nothing /// to run: the request is refused, the step is not one, or the room is short. Evidence the step reads and does not have yet is /// written as `<spec>`, `<title>`, `<pr>` or `<issue>`, so the same function prints the plan. @@ -771,6 +987,12 @@ pub fn step_argv(r: TriLandReq, ev: string, k: u8, n: u64, out: []u8) -> usize { w = emit_t27c(out, w, r, n, "test-report\n"); w = emit_str(out, w, "\n--specs-dir\nspecs\n"); } + if (k == L_T27B) { + w = emit_t27b(out, w, r); + w = emit_str(out, w, "\ntest\n"); + w = emit_spec(out, w, r, n); + w = emit_str(out, w, "\n--check\n--quiet\n"); + } if (k == L_SEAL or k == L_RECHECK) { w = emit_t27c(out, w, r, n, "seal\n"); w = emit_str(out, w, "\n--verify\n"); @@ -779,6 +1001,17 @@ pub fn step_argv(r: TriLandReq, ev: string, k: u8, n: u64, out: []u8) -> usize { w = emit_t27c(out, w, r, n, "seal\n"); w = emit_str(out, w, "\n--save\n"); } + if (k == L_IMPORTERS) { + w = emit_str(out, w, "git\ngrep\n-l\n-F\n"); + w = emit_uses(out, w, r); + w = emit_str(out, w, "--\nspecs\n"); + } + if (k == L_ISEAL or k == L_ISAVE or k == L_IRECHECK) { + w = emit_str(out, w, r.t27c); + w = emit_str(out, w, "\nseal\n"); + w = emit_importer(out, w, r, ev, n); + if (k == L_ISAVE) { w = emit_str(out, w, "\n--save\n"); } else { w = emit_str(out, w, "\n--verify\n"); } + } if (k == L_TYPES) { w = emit_str(out, w, r.tri); w = emit_str(out, w, "\ntypes\nratchet\n"); @@ -871,10 +1104,14 @@ pub fn refusal_detail(r: TriLandReq, ev: string, k: u8, n: u64, out: []u8) -> us } return fits(out, w); } - if (k == L_TESTS or k == L_RECHECK) { + if (k == L_TESTS or k == L_T27B or k == L_RECHECK) { w = emit_span(out, w, r.changes, path_start(r.changes, n), path_end(r.changes, n)); return fits(out, w); } + if (k == L_IRECHECK) { + w = emit_importer(out, w, r, ev, n); + return fits(out, w); + } const nf : usize = extra_name(ev); if (k == L_DUPES and nf < ev.len) { w = emit_span(out, w, ev, nf, finding_to(ev, nf, line_end(ev, nf))); @@ -909,64 +1146,88 @@ pub const EV_TESTS_UNKNOWN : str = "@@ preflight 12 0 0 151\n--- test report: sp pub const EV_TESTS_OLD : str = "@@ preflight 12 0 0 101\n--- test report: specs/x/y.t27 ---\n\n tests 4\n pass 4\n FAIL 0\n rate 100.0%\n\n"; pub const EV_TESTS_NONE : str = "@@ preflight 11 0 0 26\nA\tspecs/tri/land/land.t27\n\n"; pub const EV_TESTS_NOTOTAL : str = "@@ preflight 12 0 0 83\n FAIL 0\n vacuous passes 0 of 0 (passed with 0 runtime asserts executed)\n\n"; -pub const EV_SEAL_MATCH : str = "@@ preflight 13 0 0 118\nspec_hash: MATCH\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nall hashes MATCH\n\n"; -pub const EV_SEAL_BAD : str = "@@ preflight 13 0 1 162\nspec_hash: MISMATCH (sealed sha256:aaaa, now sha256:bbbb)\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nVERIFICATION FAILED\n\n"; -pub const EV_RECHECK_MATCH : str = "@@ preflight 15 0 0 118\nspec_hash: MATCH\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nall hashes MATCH\n\n"; -pub const EV_RECHECK_BAD : str = "@@ preflight 15 0 1 162\nspec_hash: MISMATCH (sealed sha256:aaaa, now sha256:bbbb)\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nVERIFICATION FAILED\n\n"; -pub const EV_RECHECK_BOTH : str = "@@ preflight 15 0 0 280\nspec_hash: MATCH\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nall hashes MATCH\nspec_hash: MISMATCH (sealed sha256:aaaa, now sha256:bbbb)\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nVERIFICATION FAILED\n\n"; -pub const EV_RECHECK_EMPTY : str = "@@ preflight 15 0 0 0\n\n"; -pub const EV_TYPES_OK : str = "@@ preflight 16 0 0 52\n ledger 107 name(s), observed 107\n RATCHET: CLEAN\n\n"; -pub const EV_TYPES_RED : str = "@@ preflight 16 0 1 264\n ledger 107 name(s), observed 108\n + Cell NEW conflict\n\n A RESOLVED name fails too, on purpose. An entry that stops being\n true and stays in the ledger is slack the next conflict hides in --\n the same rule the corpus ratchet applies to an unexpected PASS.\n\n"; -pub const EV_TYPES_EXIT : str = "@@ preflight 16 0 1 52\n ledger 107 name(s), observed 107\n RATCHET: CLEAN\n\n"; -pub const EV_TYPES_NOWORD : str = "@@ preflight 16 0 0 35\n ledger 107 name(s), observed 107\n\n"; -pub const EV_PENDING_YES : str = "@@ preflight 19 0 1 0\n\n"; -pub const EV_PENDING_NO : str = "@@ preflight 19 0 0 0\n\n"; -pub const EV_PENDING_FAIL : str = "@@ preflight 19 0 128 28\nfatal: not a git repository\n\n"; -pub const EV_TITLE : str = "@@ preflight 20 0 0 45\ntri land: land a lane branch (Closes #11068)\n\n"; -pub const EV_TITLE_BARE : str = "@@ preflight 20 0 0 29\ntri land: land a lane branch\n\n"; -pub const EV_TITLE_OTHER : str = "@@ preflight 20 0 0 45\ntri land: land a lane branch (Closes #11000)\n\n"; -pub const EV_TITLE_EMPTY : str = "@@ preflight 20 0 0 0\n\n"; -pub const EV_PUSH_OK : str = "@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 0 72\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/tri-land-11068\n\n"; -pub const EV_PUSH_OTHER : str = "@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 0 72\n89abcdef0123456789abcdef0123456789abcdef\trefs/heads/lane/tri-land-11068\n\n"; -pub const EV_PUSH_EMPTY : str = "@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 0 0\n\n"; -pub const EV_PUSH_REJECT : str = "@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 1 151\nTo github.com:gHashTag/t27.git\n ! [rejected] HEAD -> lane/x (non-fast-forward)\nerror: failed to push some refs to 'github.com:gHashTag/t27.git'\n\n"; -pub const EV_PUSH_LSFAIL : str = "@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 128 72\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/tri-land-11068\n\n"; -pub const EV_HEAD_BAD : str = "@@ preflight 22 0 0 10\nnot a sha\n\n"; -pub const EV_PR_CREATED : str = "@@ preflight 5 0 0 0\n\n@@ preflight 25 0 0 105\nCreating pull request for lane/x into master in gHashTag/t27\n\nhttps://github.com/gHashTag/t27/pull/11111\n\n"; +pub const EV_SEAL_MATCH : str = "@@ preflight 14 0 0 118\nspec_hash: MATCH\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nall hashes MATCH\n\n"; +pub const EV_SEAL_BAD : str = "@@ preflight 14 0 1 162\nspec_hash: MISMATCH (sealed sha256:aaaa, now sha256:bbbb)\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nVERIFICATION FAILED\n\n"; +pub const EV_RECHECK_MATCH : str = "@@ preflight 16 0 0 118\nspec_hash: MATCH\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nall hashes MATCH\n\n"; +pub const EV_RECHECK_BAD : str = "@@ preflight 16 0 1 162\nspec_hash: MISMATCH (sealed sha256:aaaa, now sha256:bbbb)\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nVERIFICATION FAILED\n\n"; +pub const EV_RECHECK_BOTH : str = "@@ preflight 16 0 0 280\nspec_hash: MATCH\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nall hashes MATCH\nspec_hash: MISMATCH (sealed sha256:aaaa, now sha256:bbbb)\ngen_hash_zig: MATCH\ngen_hash_verilog: MATCH\ngen_hash_c: MATCH\ngen_hash_rust: MATCH\n\nVERIFICATION FAILED\n\n"; +pub const EV_RECHECK_EMPTY : str = "@@ preflight 16 0 0 0\n\n"; +pub const EV_TYPES_OK : str = "@@ preflight 21 0 0 52\n ledger 107 name(s), observed 107\n RATCHET: CLEAN\n\n"; +pub const EV_TYPES_RED : str = "@@ preflight 21 0 1 264\n ledger 107 name(s), observed 108\n + Cell NEW conflict\n\n A RESOLVED name fails too, on purpose. An entry that stops being\n true and stays in the ledger is slack the next conflict hides in --\n the same rule the corpus ratchet applies to an unexpected PASS.\n\n"; +pub const EV_TYPES_EXIT : str = "@@ preflight 21 0 1 52\n ledger 107 name(s), observed 107\n RATCHET: CLEAN\n\n"; +pub const EV_TYPES_NOWORD : str = "@@ preflight 21 0 0 35\n ledger 107 name(s), observed 107\n\n"; +pub const EV_PENDING_YES : str = "@@ preflight 24 0 1 0\n\n"; +pub const EV_PENDING_NO : str = "@@ preflight 24 0 0 0\n\n"; +pub const EV_PENDING_FAIL : str = "@@ preflight 24 0 128 28\nfatal: not a git repository\n\n"; +pub const EV_TITLE : str = "@@ preflight 25 0 0 45\ntri land: land a lane branch (Closes #11068)\n\n"; +pub const EV_TITLE_BARE : str = "@@ preflight 25 0 0 29\ntri land: land a lane branch\n\n"; +pub const EV_TITLE_OTHER : str = "@@ preflight 25 0 0 45\ntri land: land a lane branch (Closes #11000)\n\n"; +pub const EV_TITLE_EMPTY : str = "@@ preflight 25 0 0 0\n\n"; +pub const EV_PUSH_OK : str = "@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 0 0\n\n@@ preflight 29 0 0 72\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/tri-land-11068\n\n"; +pub const EV_PUSH_OTHER : str = "@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 0 0\n\n@@ preflight 29 0 0 72\n89abcdef0123456789abcdef0123456789abcdef\trefs/heads/lane/tri-land-11068\n\n"; +pub const EV_PUSH_EMPTY : str = "@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 0 0\n\n@@ preflight 29 0 0 0\n\n"; +pub const EV_PUSH_REJECT : str = "@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 1 151\nTo github.com:gHashTag/t27.git\n ! [rejected] HEAD -> lane/x (non-fast-forward)\nerror: failed to push some refs to 'github.com:gHashTag/t27.git'\n\n"; +pub const EV_PUSH_LSFAIL : str = "@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 0 0\n\n@@ preflight 29 0 128 72\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/tri-land-11068\n\n"; +pub const EV_HEAD_BAD : str = "@@ preflight 27 0 0 10\nnot a sha\n\n"; +pub const EV_PR_CREATED : str = "@@ preflight 5 0 0 0\n\n@@ preflight 30 0 0 105\nCreating pull request for lane/x into master in gHashTag/t27\n\nhttps://github.com/gHashTag/t27/pull/11111\n\n"; pub const EV_PR_OPEN : str = "@@ preflight 5 0 0 10\n123 false\n\n"; -pub const EV_PR_FAIL : str = "@@ preflight 25 0 1 33\nGraphQL: Head sha can't be blank\n\n"; -pub const EV_PR_NOURL : str = "@@ preflight 25 0 0 8\ncreated\n\n"; -pub const EV_AUTO_FAIL : str = "@@ preflight 26 0 1 41\nGraphQL: Pull request is in clean status\n\n"; -pub const EV_CHECK_TRUE : str = "@@ preflight 27 0 0 5\ntrue\n\n"; -pub const EV_CHECK_FALSE : str = "@@ preflight 27 0 0 6\nfalse\n\n"; -pub const EV_CHECK_FAIL : str = "@@ preflight 27 0 1 5\ntrue\n\n"; +pub const EV_PR_FAIL : str = "@@ preflight 30 0 1 33\nGraphQL: Head sha can't be blank\n\n"; +pub const EV_PR_NOURL : str = "@@ preflight 30 0 0 8\ncreated\n\n"; +pub const EV_AUTO_FAIL : str = "@@ preflight 31 0 1 41\nGraphQL: Pull request is in clean status\n\n"; +pub const EV_CHECK_TRUE : str = "@@ preflight 32 0 0 5\ntrue\n\n"; +pub const EV_CHECK_FALSE : str = "@@ preflight 32 0 0 6\nfalse\n\n"; +pub const EV_CHECK_FAIL : str = "@@ preflight 32 0 1 5\ntrue\n\n"; pub const EV_WORKTREE_FAIL : str = "@@ preflight 6 0 128 27\nfatal: '/x' already exists\n\n"; pub const EV_WORKTREE_OK : str = "@@ preflight 6 0 0 0\n\n"; -pub const EV_DUP_SAME : str = "@@ preflight 7 0 1 1514\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 1 1514\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; -pub const EV_DUP_FIXED : str = "@@ preflight 7 0 1 1514\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 1 1458\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; -pub const EV_DUP_SOME : str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 1 417\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; -pub const EV_DUP_NEW : str = "@@ preflight 7 0 1 1514\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 1 1601\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n::error::a body written under emit_span is now copied [2] time(s) and was in no ledger\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; -pub const EV_DUP_NEWGROWN : str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 1 557\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::emit_dec was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; -pub const EV_DUP_GROWN : str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 1 418\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [10, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; -pub const EV_DUP_CLEAN : str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 0 93\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\nok: no new duplicate body\n\n"; -pub const EV_DUP_UNREAD : str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 2 417\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; -pub const EV_DUP_NOFIND : str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 1 89\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\nsomething else failed\n\n"; -pub const EV_DUP_MASTER_BAD : str = "@@ preflight 7 0 2 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 17 0 1 417\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; -pub const EV_DUP_MASTER_CLEAN : str = "@@ preflight 7 0 0 93\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\nok: no new duplicate body\n\n@@ preflight 17 0 1 417\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_SAME : str = "@@ preflight 7 0 1 1514\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 1 1514\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_FIXED : str = "@@ preflight 7 0 1 1514\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 1 1458\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_SOME : str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 1 417\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_NEW : str = "@@ preflight 7 0 1 1514\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 1 1601\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under hex_val is now copied [2] time(s) and was in no ledger\n::error::a body written under imports_anchor is now copied [2, 2] time(s) and was in no ledger\n::error::a body written under is_indented is now copied [2] time(s) and was in no ledger\n::error::a body written under is_word is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::a body written under match_in is now copied [3] time(s) and was in no ledger\n::error::a body written under nn_text is now copied [4] time(s) and was in no ledger\n::error::a body written under nullish is now copied [4] time(s) and was in no ledger\n::error::a body written under put_all is now copied [3] time(s) and was in no ledger\n::error::a body written under skip_digits is now copied [2] time(s) and was in no ledger\n::error::a body written under skip_ws is now copied [2] time(s) and was in no ledger\n::error::a body written under trim_span is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::ws_len_at was copied [2] and is now copied [3]\n::error::a body written under emit_span is now copied [2] time(s) and was in no ledger\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_NEWGROWN : str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 1 557\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n::error::emit_dec was copied [2] and is now copied [3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_GROWN : str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 1 418\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [10, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_CLEAN : str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 0 93\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\nok: no new duplicate body\n\n"; +pub const EV_DUP_UNREAD : str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 2 417\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_NOFIND : str = "@@ preflight 7 0 1 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 1 89\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\nsomething else failed\n\n"; +pub const EV_DUP_MASTER_BAD : str = "@@ preflight 7 0 2 502\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::a body written under jn_same is now copied [3] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n@@ preflight 22 0 1 417\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; +pub const EV_DUP_MASTER_CLEAN : str = "@@ preflight 7 0 0 93\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\nok: no new duplicate body\n\n@@ preflight 22 0 1 417\nduplicate bodies: 738 of 15523 in 218 group(s) across 2440 spec(s)\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n::error::bytes_eq was copied [8, 3] and is now copied [9, 3]\n\nA body written twice is a bug that has to be fixed twice. Reuse the\none that exists, or if this copy is deliberate, say so by moving the\nledger in the SAME commit:\n python3 tools/dupe_scan.py --bless\n\n"; pub const EV_DUP_MASTER_FAIL : str = "@@ preflight 7 0 2 27\npython3: command not found\n\n"; pub const EV_RUN_A : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n"; pub const EV_RUN_B : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n"; pub const EV_RUN_C : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n"; -pub const EV_RUN_D : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n"; -pub const EV_RUN_E : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 14 2 0 6\nsaved\n\n@@ preflight 15 2 0 17\nall hashes MATCH\n\n@@ preflight 16 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 17 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n"; -pub const EV_RUN_F : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 14 2 0 6\nsaved\n\n@@ preflight 15 2 0 17\nall hashes MATCH\n\n@@ preflight 16 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 17 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 18 0 0 0\n\n@@ preflight 19 0 1 0\n\n@@ preflight 20 0 0 28\ntri land: x (Closes #11068)\n\n"; -pub const EV_RUN_G : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 14 2 0 6\nsaved\n\n@@ preflight 15 2 0 17\nall hashes MATCH\n\n@@ preflight 16 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 17 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 18 0 0 0\n\n@@ preflight 19 0 1 0\n\n@@ preflight 20 0 0 28\ntri land: x (Closes #11068)\n\n@@ preflight 21 0 0 0\n\n@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 0 59\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/x\n\n"; -pub const EV_RUN_G_OPEN : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 10\n123 false\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 14 2 0 6\nsaved\n\n@@ preflight 15 2 0 17\nall hashes MATCH\n\n@@ preflight 16 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 17 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 18 0 0 0\n\n@@ preflight 19 0 1 0\n\n@@ preflight 20 0 0 28\ntri land: x (Closes #11068)\n\n@@ preflight 21 0 0 0\n\n@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 0 59\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/x\n\n"; -pub const EV_RUN_F_CLEAN : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 14 2 0 6\nsaved\n\n@@ preflight 15 2 0 17\nall hashes MATCH\n\n@@ preflight 16 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 17 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 18 0 0 0\n\n@@ preflight 19 0 0 0\n\n@@ preflight 20 0 0 28\ntri land: x (Closes #11068)\n\n"; -pub const EV_RUN_E_NO_DUPES : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 14 2 0 6\nsaved\n\n@@ preflight 15 2 0 17\nall hashes MATCH\n\n@@ preflight 16 0 0 17\n RATCHET: CLEAN\n\n"; -pub const EV_RUN_D_NO_SEAL : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n"; -pub const EV_RUN_G_NO_REMOTE : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 14 2 0 6\nsaved\n\n@@ preflight 15 2 0 17\nall hashes MATCH\n\n@@ preflight 16 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 17 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 18 0 0 0\n\n@@ preflight 19 0 1 0\n\n@@ preflight 20 0 0 28\ntri land: x (Closes #11068)\n\n@@ preflight 21 0 0 0\n\n@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 0 0\n\n"; -pub const EV_RUN_G_AUTO_ON : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 9\n123 true\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 17\nall hashes MATCH\n\n@@ preflight 13 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 14 2 0 6\nsaved\n\n@@ preflight 15 2 0 17\nall hashes MATCH\n\n@@ preflight 16 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 17 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 18 0 0 0\n\n@@ preflight 19 0 1 0\n\n@@ preflight 20 0 0 28\ntri land: x (Closes #11068)\n\n@@ preflight 21 0 0 0\n\n@@ preflight 22 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 0 59\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/x\n\n"; +pub const EV_RUN_D : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n"; +pub const EV_RUN_E : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 1 0\n\n@@ preflight 21 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 22 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n"; +pub const EV_RUN_F : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 1 0\n\n@@ preflight 21 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 22 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 1 0\n\n@@ preflight 25 0 0 28\ntri land: x (Closes #11068)\n\n"; +pub const EV_RUN_G : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 1 0\n\n@@ preflight 21 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 22 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 1 0\n\n@@ preflight 25 0 0 28\ntri land: x (Closes #11068)\n\n@@ preflight 26 0 0 0\n\n@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 0 0\n\n@@ preflight 29 0 0 59\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/x\n\n"; +pub const EV_RUN_G_OPEN : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 10\n123 false\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 1 0\n\n@@ preflight 21 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 22 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 1 0\n\n@@ preflight 25 0 0 28\ntri land: x (Closes #11068)\n\n@@ preflight 26 0 0 0\n\n@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 0 0\n\n@@ preflight 29 0 0 59\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/x\n\n"; +pub const EV_RUN_F_CLEAN : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 1 0\n\n@@ preflight 21 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 22 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 0 0\n\n@@ preflight 25 0 0 28\ntri land: x (Closes #11068)\n\n"; +pub const EV_RUN_E_NO_DUPES : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 1 0\n\n@@ preflight 21 0 0 17\n RATCHET: CLEAN\n\n"; +pub const EV_RUN_D_NO_SEAL : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n"; +pub const EV_RUN_G_NO_REMOTE : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 1 0\n\n@@ preflight 21 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 22 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 1 0\n\n@@ preflight 25 0 0 28\ntri land: x (Closes #11068)\n\n@@ preflight 26 0 0 0\n\n@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 0 0\n\n"; +pub const EV_RUN_G_AUTO_ON : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 9\n123 true\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 1 0\n\n@@ preflight 21 0 0 17\n RATCHET: CLEAN\n\n@@ preflight 22 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 23 0 0 0\n\n@@ preflight 24 0 1 0\n\n@@ preflight 25 0 0 28\ntri land: x (Closes #11068)\n\n@@ preflight 26 0 0 0\n\n@@ preflight 27 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 28 0 0 0\n\n@@ preflight 29 0 0 59\n0123456789abcdef0123456789abcdef01234567\trefs/heads/lane/x\n\n"; +pub const EV_RUN_T0 : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n"; +pub const EV_RUN_T1 : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n"; +pub const EV_RUN_I0 : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n"; +pub const EV_RUN_I1 : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n@@ preflight 18 1198 0 17\nall hashes MATCH\n\n@@ preflight 18 1245 1 20\nVERIFICATION FAILED\n\n@@ preflight 19 1245 0 6\nsaved\n\n@@ preflight 20 1245 0 17\nall hashes MATCH\n\n"; +pub const EV_RUN_R : str = "@@ preflight 0 0 0 0\n\n@@ preflight 1 0 0 0\n\n@@ preflight 2 0 0 41\n0123456789abcdef0123456789abcdef01234567\n\n@@ preflight 3 0 128 39\nfatal: couldn't find remote ref lane/x\n\n@@ preflight 4 0 128 58\nfatal: Not a valid object name refs/remotes/origin/lane/x\n\n@@ preflight 5 0 0 0\n\n@@ preflight 6 0 0 0\n\n@@ preflight 7 0 1 85\n::error::a body written under dec_len is now copied [2] time(s) and was in no ledger\n\n@@ preflight 8 0 0 0\n\n@@ preflight 9 0 0 66\nAutomatic merge went well; stopped before committing as requested\n\n@@ preflight 10 0 0 0\n\n@@ preflight 11 0 0 65\nM\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n\n@@ preflight 12 0 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 12 2 0 115\n tests 4\n pass 4\n FAIL 0\n vacuous passes 0 of 4 (passed with 0 runtime asserts executed)\n\n@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 14 0 0 17\nall hashes MATCH\n\n@@ preflight 14 2 1 20\nVERIFICATION FAILED\n\n@@ preflight 15 2 0 6\nsaved\n\n@@ preflight 16 2 0 17\nall hashes MATCH\n\n"; +pub const EV_T27B_OK : str = "@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n"; +pub const EV_T27B_MISMATCH : str = "@@ preflight 13 0 4 137\nMISMATCH scratch_is_read: jit Ok(0), interpreter Err(Fault(undefined))\nM: 4 passed, 0 failed, 4 total\nt27b: 1 JIT/interpreter mismatches\n\n"; +pub const EV_T27B_FAIL : str = "@@ preflight 13 0 1 43\nFAIL a_test\nM: 3 passed, 1 failed, 4 total\n\n"; +pub const EV_T27B_ABSENT : str = "@@ preflight 13 0 127 38\nNo such file or directory (os error 2)\n\n"; +pub const EV_T27B_WORD : str = "@@ preflight 13 0 0 72\nMISMATCH x: jit Ok(1), interpreter Ok(2)\nM: 4 passed, 0 failed, 4 total\n\n"; +pub const EV_T27B_SECOND : str = "@@ preflight 13 0 0 31\nM: 4 passed, 0 failed, 4 total\n\n@@ preflight 13 2 4 137\nMISMATCH scratch_is_read: jit Ok(0), interpreter Err(Fault(undefined))\nM: 4 passed, 0 failed, 4 total\nt27b: 1 JIT/interpreter mismatches\n\n"; +pub const EV_IMP_NONE : str = "@@ preflight 17 0 1 0\n\n"; +pub const EV_IMP_THREE : str = "@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n"; +pub const EV_IMP_FAIL : str = "@@ preflight 17 0 128 28\nfatal: not a git repository\n\n"; +pub const EV_IMP_STRAY : str = "@@ preflight 17 0 0 41\nwarning: something\nspecs/tri/users/a.t27\n\n"; +pub const EV_IMP_SPACE : str = "@@ preflight 17 0 0 18\nspecs/tri/a b.t27\n\n"; +pub const EV_IMP_A_OK : str = "@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n@@ preflight 18 23 0 17\nall hashes MATCH\n\n"; +pub const EV_IMP_B_BAD : str = "@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n@@ preflight 18 23 0 17\nall hashes MATCH\n\n@@ preflight 18 70 1 20\nVERIFICATION FAILED\n\n"; +pub const EV_IMP_B_NONE : str = "@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n@@ preflight 18 23 0 17\nall hashes MATCH\n\n@@ preflight 18 70 1 84\nError: No saved seal found at .trinity/seals/tri_Users.json. Run with --save first.\n\n"; +pub const EV_IMP_B_SAVED : str = "@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n@@ preflight 18 23 0 17\nall hashes MATCH\n\n@@ preflight 18 70 1 20\nVERIFICATION FAILED\n\n@@ preflight 19 70 0 6\nsaved\n\n"; +pub const EV_IMP_B_MATCH : str = "@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n@@ preflight 18 23 0 17\nall hashes MATCH\n\n@@ preflight 18 70 1 20\nVERIFICATION FAILED\n\n@@ preflight 19 70 0 6\nsaved\n\n@@ preflight 20 70 0 17\nall hashes MATCH\n\n"; +pub const EV_IMP_B_STILL : str = "@@ preflight 17 0 0 89\nspecs/tri/users/a.t27\nspecs/tri/land/other.t27\nspecs/tri/users/b.t27\nspecs/scratch/x.t27\n\n@@ preflight 18 23 0 17\nall hashes MATCH\n\n@@ preflight 18 70 1 20\nVERIFICATION FAILED\n\n@@ preflight 19 70 0 6\nsaved\n\n@@ preflight 20 70 1 20\nVERIFICATION FAILED\n\n"; +pub const TXT_CH_TOP : str = "M\tspecs/top.t27\n"; +pub const TXT_CH_KEYS : str = "M\tspecs/t27os/keys.t27\nA\tspecs/t27os/keys_probe.t27\n"; pub const TXT_CH_ONE : str = "A\tspecs/tri/land/land.t27\n"; pub const TXT_CH_TWO : str = "M\tspecs/tri/land/land.t27\nA\tdocs/x.md\nA\tspecs/tri/land/other.t27\n"; pub const TXT_CH_BAD : str = "M\tspecs/tri/land/a b.t27\nA\tdocs/x.md\n"; @@ -974,6 +1235,7 @@ pub const TXT_CH_DOCS : str = "A\tdocs/x.md\nM\tcli/tri/src/main.rs\n"; pub const TXT_TR_CLEAN : str = "--- test report: specs/tri/land/land.t27 ---\n\n tests 21\n pass 21\n FAIL 0\n invariants 3 proved -- comptime, so compiling IS the check\n rate 100.0%\n\n runtime asserts executed, per test (#6509; a pass with 0 is vacuous, T730):\n 12 the_branch_and_the_numbers_pass_a_rule\n 3 a_request_is_refused\n vacuous passes 0 of 21 (passed with 0 runtime asserts executed)\n"; pub const P256 : str = "abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abc"; pub const P257 : str = "abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcd"; +pub const P256C : str = "abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghij/abcdefghi/t27c"; // --- the tests ----------------------------------------------------------------------------------- // Fixtures are the programs' real text, shortened: `t27c test-report` and `t27c seal --verify` as they print for a spec on master @@ -1039,7 +1301,7 @@ pub fn has_plus(argv: []const u8, n: usize) -> bool { return false; } -/// Is the first argument of argv[0..n) a program the command may start: git, gh, python3, t27c or tri? +/// Is the first argument of argv[0..n) a program the command may start: git, gh, python3, t27c, t27b (beside t27c) or tri? pub fn program_ok(argv: []const u8, n: usize, r: TriLandReq) -> bool { var e : usize = 0; while (e < n and argv[e] != 10) { e = e + 1; } @@ -1057,7 +1319,19 @@ pub fn program_ok(argv: []const u8, n: usize, r: TriLandReq) -> bool { } k = k + 1; } - return false; + return is_t27b_program(argv, e, r); +} + +/// Is argv[0..e) the t27b program of r: the directory of T27C, then `t27b` (see emit_t27b)? +pub fn is_t27b_program(argv: []const u8, e: usize, r: TriLandReq) -> bool { + const n : usize = r.t27c.len; + var head : usize = 0; + if (n >= 4 and span_is(r.t27c, n - 4, n, "t27c")) { head = n - 4; } + if (e != head + 4) { return false; } + var i : usize = 0; + while (i < head and argv[i] == r.t27c[i]) { i = i + 1; } + if (i < head) { return false; } + return argv[head] == 116 and argv[head + 1] == 50 and argv[head + 2] == 55 and argv[head + 3] == 98; } /// How many steps of r, for entry 0 and this evidence, write any argument vector at all? @@ -1490,7 +1764,7 @@ test the_slots_run_in_a_fixed_order { assert next_slot(r, "") == slot_of(L_FETCH, 0); assert next_slot(r, EV_RUN_A) == slot_of(L_WORKTREE, 0); assert next_slot(r, EV_RUN_B) == slot_of(L_TESTS, 0); - assert next_slot(r, EV_RUN_C) == slot_of(L_SEAL, 0); + assert next_slot(r, EV_RUN_C) == slot_of(L_T27B, 0); // the second changed line is not a spec: its slots are skipped assert next_slot(r, EV_RUN_D) == slot_of(L_SAVE, 2); assert next_slot(r, EV_RUN_E) == slot_of(L_STAGE, 0); @@ -1514,7 +1788,7 @@ test a_check_run_stops_after_the_gates { assert next_slot(c, EV_RUN_E) == DONE; assert next_slot(c, EV_RUN_E_NO_DUPES) == slot_of(L_DUPES, 0); assert next_slot(c, EV_RUN_D) == slot_of(L_SAVE, 2); - assert next_slot(c, EV_RUN_C) == slot_of(L_SEAL, 0); + assert next_slot(c, EV_RUN_C) == slot_of(L_T27B, 0); assert next_slot(c, "") == slot_of(L_FETCH, 0); assert next_slot(req_of(TXT_CH_TWO, false), EV_RUN_E) != DONE; assert applies(c, EV_RUN_E, L_STAGE, 0) == false and applies(c, EV_RUN_E, L_PUSH, 0) == false and applies(c, EV_RUN_E, L_AUTO, 0) == false; @@ -1676,7 +1950,7 @@ test the_worst_case_fits { assert step_argv(r, "", L_HEAD, 0, &mid) == 19; assert step_argv(r, "", L_PUSH, 0, &mid) == 0; assert P256.len == 256 and P257.len == 257 and request_refusal(req_on(T_BRANCH, 11068, P257, "t27c", false)) == L_BAD_PATH; - assert CMD_MAX == 4096; + assert CMD_MAX == 65536; } // Scenario: a section is written the way preflight's readers read it, so the glue's evidence and these fixtures are one shape. @@ -1687,7 +1961,7 @@ test the_evidence_section_is_written_as_the_readers_read_it { assert buf_is(&buf, emit_section(&buf, 0, L_MERGED, 0, 0, ""), EV_MERGED_NONE); assert buf_is(&buf, emit_section(&buf, 0, L_MERGED, 0, 1, "error connecting to api.github.com\n"), EV_MERGED_FAIL); assert buf_is(&buf, emit_section(&buf, 0, L_MERGE, 0, 128, "x"), "@@ preflight 9 0 128 1\nx\n"); - assert buf_is(&buf, emit_section(&buf, 0, L_CLEAN, 12, 255, "ab\n"), "@@ preflight 28 12 255 3\nab\n\n"); + assert buf_is(&buf, emit_section(&buf, 0, L_CLEAN, 12, 255, "ab\n"), "@@ preflight 33 12 255 3\nab\n\n"); // the readers find it, and a later section after an earlier one assert exit_of(EV_CHANGES_OK, L_CHANGES, 0) == 0 and body_from(EV_CHANGES_OK, L_CHANGES, 0) == 23; assert exit_of(EV_MERGED_FAIL, L_MERGED, 0) == 1 and exit_of(EV_MERGED_FAIL, L_MERGED, 1) == NO_EXIT and exit_of(EV_MERGED_FAIL, L_FETCH, 0) == NO_EXIT; @@ -1731,3 +2005,238 @@ test only_a_flaky_network_answer_is_run_again { assert over_network(L_FETCH) and over_network(L_PUSH) and over_network(L_AUTO_CHECK) and over_network(L_TIP) == false and over_network(L_CLEAN) == false; assert RETRIES == 5; } + +// Scenario (#11225, FR-001, FR-004): `t27b test <spec> --check` is clean with exit 0 and no MISMATCH; a MISMATCH line, a non-zero exit +// or a t27b that cannot start is refused with T27B_NOT_CLEAN, and the refusal names the spec. +test the_t27b_run_is_clean_only_with_exit_0_and_no_mismatch { + var buf : [4096]u8 = [0] ** 4096; + const r : TriLandReq = req_of(TXT_CH_TWO, false); + // the passing log + assert t27b_clean(EV_T27B_OK, 0) == true; + assert judge(r, EV_T27B_OK, L_T27B, 0) == L_OK; + // the refusing logs: the JIT and the interpreter disagree (exit 4), a failing test (exit 1), no t27b to start (exit 127), the word with exit 0 + assert t27b_clean(EV_T27B_MISMATCH, 0) == false; + assert t27b_clean(EV_T27B_FAIL, 0) == false; + assert t27b_clean(EV_T27B_ABSENT, 0) == false; + assert t27b_clean(EV_T27B_WORD, 0) == false; + assert judge(r, EV_T27B_MISMATCH, L_T27B, 0) == L_T27B_NOT_CLEAN; + assert judge(r, EV_T27B_FAIL, L_T27B, 0) == L_T27B_NOT_CLEAN; + assert judge(r, EV_T27B_ABSENT, L_T27B, 0) == L_T27B_NOT_CLEAN; + assert judge(r, EV_T27B_WORD, L_T27B, 0) == L_T27B_NOT_CLEAN; + // a run that left no section did not pass + assert t27b_clean(EV_T27B_OK, 2) == false and t27b_clean("", 0) == false; + // the second changed spec is the one that mismatches, and the refusal names it + assert judge(r, EV_T27B_SECOND, L_T27B, 0) == L_OK; + assert judge(r, EV_T27B_SECOND, L_T27B, 2) == L_T27B_NOT_CLEAN; + assert buf_is(&buf, refusal_detail(r, EV_T27B_SECOND, L_T27B, 2, &buf), "specs/tri/land/other.t27"); + assert buf_is(&buf, refusal_detail(r, EV_T27B_MISMATCH, L_T27B, 0, &buf), "specs/tri/land/land.t27"); + // the named code, its exit and its words + assert exit_code(L_T27B_NOT_CLEAN) == 16 and exit_code(L_T27B_NOT_CLEAN) != 0 and L_T27B_NOT_CLEAN < OUTCOMES; + const nm : string = code_name(L_T27B_NOT_CLEAN); + assert nm.len == 14 and span_is(nm, 0, 14, "T27B_NOT_CLEAN"); + const why : string = code_why(L_T27B_NOT_CLEAN); + assert why.len > 0 and find_in(why, 0, why.len, "MISMATCH") < why.len; +} + +// Scenario (FR-001): the step is `t27b test <spec> --check --quiet`, run with the t27b that sits beside t27c. +test the_t27b_step_pins_its_bytes { + var buf : [4096]u8 = [0] ** 4096; + var tb : [64]u8 = [0] ** 64; + var small : [16]u8 = [0] ** 16; + const r : TriLandReq = req_of(TXT_CH_TWO, false); + assert argv_is(r, "", L_T27B, 0, "t27b\ntest\nspecs/tri/land/land.t27\n--check\n--quiet\n", &buf); + assert argv_is(r, "", L_T27B, 2, "t27b\ntest\nspecs/tri/land/other.t27\n--check\n--quiet\n", &buf); + assert argv_is(r, "", L_T27B, 1, "t27b\ntest\n<spec>\n--check\n--quiet\n", &buf); + // t27b is the file beside t27c, else the bare name + assert argv_is(req_on(T_BRANCH, 11068, T_SCRATCH, "/opt/t27c/t27c", false), "", L_T27B, 0, "/opt/t27c/t27b\ntest\n<spec>\n--check\n--quiet\n", &buf); + assert argv_is(req_on(T_BRANCH, 11068, T_SCRATCH, "./target/release/t27c", false), "", L_T27B, 0, "./target/release/t27b\ntest\n<spec>\n--check\n--quiet\n", &buf); + assert argv_is(req_on(T_BRANCH, 11068, T_SCRATCH, "mycc", false), "", L_T27B, 0, "t27b\ntest\n<spec>\n--check\n--quiet\n", &buf); + var m : usize = emit_t27b(&tb, 0, req_on(T_BRANCH, 11068, T_SCRATCH, "/x/t27c", false)); + assert buf_is(&tb, m, "/x/t27b"); + m = emit_t27b(&tb, 0, req_on(T_BRANCH, 11068, T_SCRATCH, "t27c", false)); + assert buf_is(&tb, m, "t27b"); + // it is a program the command may start, and only that one + assert strange_programs(r, "", &buf) == 0; + assert strange_programs(req_on(T_BRANCH, 11068, T_SCRATCH, "/opt/t27c/t27c", false), "", &buf) == 0; + assert steps_with(r, "", "--check", &buf) == 1 and steps_with(r, "", "test", &buf) == 1; + m = emit_str(&tb, 0, "t27b\ntest\n"); + assert program_ok(&tb, m, r) == true; + m = emit_str(&tb, 0, "t27d\ntest\n"); + assert program_ok(&tb, m, r) == false; + m = emit_str(&tb, 0, "/opt/t27c/t27b\ntest\n"); + assert program_ok(&tb, m, req_on(T_BRANCH, 11068, T_SCRATCH, "/opt/t27c/t27c", false)) == true; + assert program_ok(&tb, m, r) == false; + // it runs on this machine in the scratch tree, and the worst case (a 256 byte T27C) fits + assert in_scratch(L_T27B) == true and over_network(L_T27B) == false and transient(L_T27B, 1, "x509") == false; + const w : TriLandReq = TriLandReq { branch: B100, issue: 999999999, scratch: P256, t27c: P256C, tri: P256, changes: TXT_CH_TWO, check: false, plan: false }; + assert request_refusal(w) == L_OK and P256C.len == 256; + assert step_argv(w, "", L_T27B, 0, &buf) > 256 and step_argv(w, "", L_T27B, 0, &buf) < CMD_MAX; + assert step_argv(w, "", L_T27B, 0, &small) == 0; +} + +// Scenario (FR-001): the t27b step is a slot of its own, after the tests of every changed spec and before any seal; a check run keeps it. +test the_t27b_step_runs_after_the_tests_and_before_the_seals { + const r : TriLandReq = req_of(TXT_CH_TWO, false); + assert next_slot(r, EV_RUN_C) == slot_of(L_T27B, 0); + assert next_slot(r, EV_RUN_T0) == slot_of(L_T27B, 2); + assert next_slot(r, EV_RUN_T1) == slot_of(L_SEAL, 0); + assert next_slot(req_of(TXT_CH_TWO, true), EV_RUN_C) == slot_of(L_T27B, 0); + assert next_slot(req_of(TXT_CH_TWO, true), EV_RUN_T1) == slot_of(L_SEAL, 0); + // the changed lines that are not specs have no slot of this step + assert applies(r, "", L_T27B, 0) == true and applies(r, "", L_T27B, 1) == false and applies(r, "", L_T27B, 2) == true; + assert applies(req_of(TXT_CH_DOCS, false), "", L_T27B, 0) == false; + assert slot_rows(r, L_T27B) == 3 and per_target(L_T27B) == true; + assert exit_of(EV_RUN_T1, L_T27B, 0) == 0 and exit_of(EV_RUN_T1, L_T27B, 2) == 0 and exit_of(EV_RUN_T1, L_T27B, 1) == NO_EXIT; + // a mismatch is a refusal of its own, not the tests' code, and it comes before the seal that would follow + assert judge(r, EV_T27B_MISMATCH, L_T27B, 0) == L_T27B_NOT_CLEAN and judge(r, EV_TESTS_FAIL, L_TESTS, 0) == L_TESTS_NOT_CLEAN; + assert L_T27B_NOT_CLEAN != L_TESTS_NOT_CLEAN and L_TESTS < L_T27B and L_T27B < L_SEAL; +} + +// Scenario (FR-003): every new step has its number, its name and an argument vector in the plan, with a placeholder where the +// evidence is not there yet; the numbers are the ones of the table in the header. +test the_new_steps_have_their_numbers_and_their_place_in_the_plan { + var buf : [4096]u8 = [0] ** 4096; + const r : TriLandReq = req_of("", false); + assert L_TESTS == 12 and L_T27B == 13 and L_SEAL == 14 and L_SAVE == 15 and L_RECHECK == 16; + assert L_IMPORTERS == 17 and L_ISEAL == 18 and L_ISAVE == 19 and L_IRECHECK == 20 and L_TYPES == 21 and L_DUPES == 22; + assert L_STAGE == 23 and L_CLEAN == 33 and LAND_STEPS == 34; + assert span_is(step_name(L_T27B), 0, 4, "t27b") and span_is(step_name(L_IMPORTERS), 0, 9, "importers"); + assert span_is(step_name(L_ISEAL), 0, 13, "importer-seal") and span_is(step_name(L_ISAVE), 0, 13, "importer-save"); + assert span_is(step_name(L_IRECHECK), 0, 16, "importer-recheck"); + // a plan has no changes and no evidence: every step writes a vector, the new ones with `<spec>`, `<module>` or `<importer>` + assert steps_sent(r, "", &buf) == (LAND_STEPS as u32); + assert argv_is(r, "", L_T27B, 0, "t27b\ntest\n<spec>\n--check\n--quiet\n", &buf); + assert argv_is(r, "", L_IMPORTERS, 0, "git\ngrep\n-l\n-F\n-e\nuse <module>::\n--\nspecs\n", &buf); + assert argv_is(r, "", L_ISEAL, 0, "t27c\nseal\n<importer>\n--verify\n", &buf); + assert argv_is(r, "", L_ISAVE, 0, "t27c\nseal\n<importer>\n--save\n", &buf); + assert argv_is(r, "", L_IRECHECK, 0, "t27c\nseal\n<importer>\n--verify\n", &buf); + // the steps that follow keep their words under their new numbers + assert argv_is(r, "", L_TYPES, 0, "/opt/tri/tri\ntypes\nratchet\n", &buf); + assert argv_is(r, "", L_STAGE, 0, "git\nadd\n.trinity/seals\n", &buf); + assert argv_is(r, "", L_CLEAN, 0, "git\nworktree\nremove\n--force\n/tmp/tri-land-1\n", &buf); + assert in_scratch(L_IMPORTERS) == true and in_scratch(L_IRECHECK) == true and over_network(L_IMPORTERS) == false and over_network(L_ISEAL) == false; +} + +// Scenario (FR-002, FR-004): one grep names every changed spec by its module and lists the specs that import any of them, once each; +// its output is read as paths and nothing else. +test the_importers_of_the_changed_specs_are_searched_for { + var buf : [4096]u8 = [0] ** 4096; + var tb : [64]u8 = [0] ** 64; + const r : TriLandReq = req_of(TXT_CH_TWO, false); + assert argv_is(r, "", L_IMPORTERS, 0, "git\ngrep\n-l\n-F\n-e\nuse tri::land::land::\n-e\nuse tri::land::other::\n--\nspecs\n", &buf); + assert argv_is(req_of(TXT_CH_ONE, false), "", L_IMPORTERS, 0, "git\ngrep\n-l\n-F\n-e\nuse tri::land::land::\n--\nspecs\n", &buf); + assert argv_is(req_of(TXT_CH_KEYS, false), "", L_IMPORTERS, 0, "git\ngrep\n-l\n-F\n-e\nuse t27os::keys::\n-e\nuse t27os::keys_probe::\n--\nspecs\n", &buf); + assert argv_is(req_of(TXT_CH_TOP, false), "", L_IMPORTERS, 0, "git\ngrep\n-l\n-F\n-e\nuse top::\n--\nspecs\n", &buf); + var m : usize = emit_module(&tb, 0, TXT_CH_KEYS, 1); + assert buf_is(&tb, m, "t27os::keys_probe"); + // a branch that changes no spec has nothing to search for, and a spec that is no target is not searched for + assert has_target(TXT_CH_DOCS) == false and has_target(TXT_CH_TWO) == true and has_target("") == false; + assert applies(req_of(TXT_CH_DOCS, false), "", L_IMPORTERS, 0) == false and applies(r, "", L_IMPORTERS, 0) == true; + assert argv_is(req_of(TXT_CH_BAD, false), "", L_IMPORTERS, 0, "git\ngrep\n-l\n-F\n-e\nuse <module>::\n--\nspecs\n", &buf); + // one step for all of them, run once, with a program the command may start + assert slot_rows(r, L_IMPORTERS) == 1 and per_target(L_IMPORTERS) == false and per_importer(L_IMPORTERS) == false; + assert steps_with(r, "", "grep", &buf) == 1 and strange_programs(r, "", &buf) == 0 and forced_pushes(r, "", &buf) == 0; + // the output: exit 1 is no match, exit 128 or a stray line is not readable + assert judge(r, EV_IMP_NONE, L_IMPORTERS, 0) == L_OK; + assert judge(r, EV_IMP_THREE, L_IMPORTERS, 0) == L_OK; + assert judge(r, EV_IMP_FAIL, L_IMPORTERS, 0) == L_STEP; + assert judge(r, EV_IMP_STRAY, L_IMPORTERS, 0) == L_STEP; + assert judge(r, EV_IMP_SPACE, L_IMPORTERS, 0) == L_STEP; + assert importers_read(EV_IMP_NONE) == true and importers_read(EV_IMP_THREE) == true and importers_read(EV_IMP_STRAY) == false; + // a path is specs/, bytes that need no quoting, .t27 + const a : string = "specs/a.t27"; + const b : string = "specs/.t27"; + const c : string = "docs/a.t27"; + const d : string = "specs/a.md"; + const e : string = "specs/a\"b.t27"; + const f : string = "specs/a\tb.t27"; + assert importer_line(a, 0, a.len) == true; + assert importer_line(b, 0, b.len) == false and importer_line(c, 0, c.len) == false and importer_line(d, 0, d.len) == false; + assert importer_line(e, 0, e.len) == false and importer_line(f, 0, f.len) == false; + assert importer_line("", 0, 0) == false; +} + +// Scenario (FR-002): the extra specs are the importers that are neither changed nor scratch, and the run can list them on one line. +test the_extra_specs_are_the_importers_that_are_not_changed { + var buf : [4096]u8 = [0] ** 4096; + var small : [16]u8 = [0] ** 16; + const r : TriLandReq = req_of(TXT_CH_TWO, false); + assert body_from(EV_IMP_THREE, L_IMPORTERS, 0) == 23; + // a.t27 starts at 23, other.t27 (a changed spec) at 45, b.t27 at 70, a scratch spec at 92 + assert importer_wanted(r, EV_IMP_THREE, 23) == true; + assert importer_wanted(r, EV_IMP_THREE, 45) == false; + assert importer_wanted(r, EV_IMP_THREE, 70) == true; + assert importer_wanted(r, EV_IMP_THREE, 92) == false; + // an offset that is not the start of a line, lies outside the output, or belongs to no importers' output + assert importer_wanted(r, EV_IMP_THREE, 24) == false and importer_wanted(r, EV_IMP_THREE, 0) == false and importer_wanted(r, EV_IMP_THREE, 500) == false; + assert importer_wanted(r, EV_IMP_NONE, 23) == false and importer_wanted(r, "", 0) == false; + // the same line is an extra spec as soon as it is not a changed one + assert importer_wanted(req_of(TXT_CH_ONE, false), EV_IMP_THREE, 45) == true; + assert is_changed(r, EV_IMP_THREE, 45, 69) == true and is_changed(r, EV_IMP_THREE, 23, 44) == false and is_changed(r, EV_IMP_THREE, 45, 68) == false; + // the run lists them + assert buf_is(&buf, importer_names(r, EV_IMP_THREE, &buf), "specs/tri/users/a.t27 specs/tri/users/b.t27"); + assert buf_is(&buf, importer_names(req_of(TXT_CH_ONE, false), EV_IMP_THREE, &buf), "specs/tri/users/a.t27 specs/tri/land/other.t27 specs/tri/users/b.t27"); + assert importer_names(r, EV_IMP_NONE, &buf) == 0 and importer_names(r, "", &buf) == 0; + assert importer_names(r, EV_IMP_THREE, &small) == 0; +} + +// Scenario (FR-002, FR-004): an importer's seal is verified; one that did not match is saved and verified again, and a refusal there +// names it; one with no seal at all is left alone. +test an_importer_whose_seal_drifted_is_saved_and_checked_again { + var buf : [4096]u8 = [0] ** 4096; + const r : TriLandReq = req_of(TXT_CH_TWO, false); + // the slots over the importers, in the order of the evidence + assert next_importer(r, EV_IMP_THREE, L_ISEAL) == 23; + assert next_importer(r, EV_IMP_A_OK, L_ISEAL) == 70; + assert next_importer(r, EV_IMP_B_BAD, L_ISEAL) == ABSENT; + assert next_importer(r, EV_IMP_A_OK, L_ISAVE) == ABSENT and next_importer(r, EV_IMP_A_OK, L_IRECHECK) == ABSENT; + assert next_importer(r, EV_IMP_B_BAD, L_ISAVE) == 70 and next_importer(r, EV_IMP_B_BAD, L_IRECHECK) == ABSENT; + assert next_importer(r, EV_IMP_B_SAVED, L_ISAVE) == ABSENT and next_importer(r, EV_IMP_B_SAVED, L_IRECHECK) == 70; + assert next_importer(r, EV_IMP_B_MATCH, L_ISEAL) == ABSENT and next_importer(r, EV_IMP_B_MATCH, L_ISAVE) == ABSENT and next_importer(r, EV_IMP_B_MATCH, L_IRECHECK) == ABSENT; + // an importer with no seal has nothing to verify and nothing to save + assert unsealed(EV_IMP_B_NONE, L_ISEAL, 70) == true and unsealed(EV_IMP_B_BAD, L_ISEAL, 70) == false and unsealed(EV_IMP_A_OK, L_ISEAL, 23) == false; + assert next_importer(r, EV_IMP_B_NONE, L_ISAVE) == ABSENT and next_importer(r, EV_IMP_B_NONE, L_ISEAL) == ABSENT; + // the first verify never decides; the second does: a seal still drifting after the save is SEAL_NOT_CLEAN + assert judge(r, EV_IMP_A_OK, L_ISEAL, 23) == L_OK; + assert judge(r, EV_IMP_B_BAD, L_ISEAL, 70) == L_OK; + assert judge(r, EV_IMP_B_NONE, L_ISEAL, 70) == L_OK; + assert judge(r, EV_IMP_B_MATCH, L_IRECHECK, 70) == L_OK; + assert judge(r, EV_IMP_B_STILL, L_IRECHECK, 70) == L_SEAL_NOT_CLEAN; + assert exit_code(judge(r, EV_IMP_B_STILL, L_IRECHECK, 70)) == 11; + assert buf_is(&buf, refusal_detail(r, EV_IMP_B_STILL, L_IRECHECK, 70, &buf), "specs/tri/users/b.t27"); + // the vectors name the importer; the save is the only write + assert argv_is(r, EV_IMP_B_BAD, L_ISEAL, 23, "t27c\nseal\nspecs/tri/users/a.t27\n--verify\n", &buf); + assert argv_is(r, EV_IMP_B_BAD, L_ISAVE, 70, "t27c\nseal\nspecs/tri/users/b.t27\n--save\n", &buf); + assert argv_is(r, EV_IMP_B_SAVED, L_IRECHECK, 70, "t27c\nseal\nspecs/tri/users/b.t27\n--verify\n", &buf); + assert argv_is(r, EV_IMP_B_BAD, L_ISEAL, 45, "t27c\nseal\n<importer>\n--verify\n", &buf); + assert argv_is(r, EV_IMP_B_BAD, L_ISEAL, 92, "t27c\nseal\n<importer>\n--verify\n", &buf); + // a changed importer is not run twice, as its own seal steps gated it + assert applies(r, EV_IMP_THREE, L_ISEAL, 45) == false and applies(r, EV_IMP_THREE, L_ISEAL, 23) == true; + assert applies(r, EV_IMP_B_BAD, L_ISAVE, 70) == true and applies(r, EV_IMP_A_OK, L_ISAVE, 23) == false; + assert applies(r, EV_IMP_B_SAVED, L_IRECHECK, 70) == true and applies(r, EV_IMP_B_BAD, L_IRECHECK, 70) == false; + assert per_importer(L_ISEAL) and per_importer(L_ISAVE) and per_importer(L_IRECHECK) and per_importer(L_TYPES) == false and slot_rows(r, L_ISEAL) == 0; +} + +// Scenario (FR-002, FR-003): the importers are looked up after the seals of the changed specs and verified before the types ratchet; a +// check run keeps them; a slot's entry is the offset of its importer's line, and the glue's division gets it back. +test the_importers_are_verified_between_the_seals_and_the_types { + const r : TriLandReq = req_of(TXT_CH_TWO, false); + const c : TriLandReq = req_of(TXT_CH_TWO, true); + const oi : u64 = (body_from(EV_RUN_I0, L_IMPORTERS, 0) as u64); + const ob : u64 = oi + 47; + assert next_slot(r, EV_RUN_R) == slot_of(L_IMPORTERS, 0); + assert next_slot(r, EV_RUN_I0) == slot_of(L_ISEAL, oi); + assert next_slot(r, EV_RUN_I1) == slot_of(L_TYPES, 0); + assert next_slot(c, EV_RUN_R) == slot_of(L_IMPORTERS, 0); + assert next_slot(c, EV_RUN_I0) == slot_of(L_ISEAL, oi); + assert next_slot(c, EV_RUN_I1) == slot_of(L_TYPES, 0); + // a branch whose grep found nothing goes straight on to the types + assert exit_of(EV_RUN_E, L_IMPORTERS, 0) == 1 and next_slot(r, EV_RUN_E) == slot_of(L_STAGE, 0); + assert slot_of(L_ISEAL, oi) / SLOT == (L_ISEAL as u64) and slot_of(L_ISEAL, oi) % SLOT == oi; + // what the run left: the grep, the verify of both importers, the save and the second verify of the one that drifted + assert exit_of(EV_RUN_I1, L_IMPORTERS, 0) == 0 and exit_of(EV_RUN_I1, L_ISEAL, oi) == 0 and exit_of(EV_RUN_I1, L_ISEAL, ob) == 1; + assert exit_of(EV_RUN_I1, L_ISAVE, ob) == 0 and exit_of(EV_RUN_I1, L_IRECHECK, ob) == 0 and exit_of(EV_RUN_I1, L_ISAVE, oi) == NO_EXIT; + assert importer_wanted(r, EV_RUN_I1, oi) == true and importer_wanted(r, EV_RUN_I1, ob) == true and importer_wanted(r, EV_RUN_I1, oi + 22) == false; + // the slots stay below DONE with the widest entry the evidence can hold + assert (LAND_STEPS as u64) * SLOT < DONE and SLOT > 100000000; +} From 23fae993fcdee3d1936cbe7f25c21b1d1856c6ad Mon Sep 17 00:00:00 2001 From: Claude <claude@anthropic.com> Date: Tue, 20 Oct 2026 15:54:59 +0700 Subject: [PATCH 2/2] tri land: run t27b test --check on every changed spec and verify the seals of the specs that import one (Closes #11225) Merge of master plus sealing, gates run on the merged tree with t27c from master: tests clean with vacuous passes 0, seal --verify MATCH, tri types ratchet CLEAN, dupe_scan failure set a subset of master's. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --- .trinity/seals/land_TriLand.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.trinity/seals/land_TriLand.json b/.trinity/seals/land_TriLand.json index 96ebda4355..b16eb0b18e 100644 --- a/.trinity/seals/land_TriLand.json +++ b/.trinity/seals/land_TriLand.json @@ -1,5 +1,5 @@ { - "built_by": "t27c-bootstrap@0.5.2+0fba674ef", + "built_by": "t27c-bootstrap@0.5.2+2d3203e90", "closure": [ { "spec": "specs/tri/lab/receipt.t27", @@ -11,7 +11,7 @@ }, { "spec": "specs/tri/pr/preflight.t27", - "spec_hash": "sha256:24634647a1245ac9d776735bd4323f524d71f7c52f0928ce31066a114b68f409" + "spec_hash": "sha256:f9b7b84c125b47c1b5285bb98ab5532987bdef785319c0a3c60bbf7e87f5b6f6" }, { "spec": "specs/tri/remote/remote_job.t27", @@ -19,23 +19,23 @@ } ], "config": "gen=c,rust,verilog,zig;tests=zig", - "gen_hash_c": "sha256:172717ca18cb1424e028ecf30fe6ffbfcd123f1ebfbcc9e99838dcbd7af5803d", - "gen_hash_rust": "sha256:0d546b60ba98a9afc5ea790b9d9c0850c2e3dad7989f7a07585020b3466789b8", - "gen_hash_verilog": "sha256:e22c6c25e3ff9d127c5ec196d36bd66736b49e530bca6abcc8092ffc672192ee", - "gen_hash_zig": "sha256:387fefa469409377ac40e91ddd09896d1a9f6226832737562c3a23f8e6955f94", + "gen_hash_c": "sha256:1115ee33ebe98a2bf9c88d25e5771ca4d13b67fcbc3fd00268555e518d3b657b", + "gen_hash_rust": "sha256:428d88d564ba2775432177c9c5a6d53812329037e7f6b78b3aa980cbf9fb72dd", + "gen_hash_verilog": "sha256:9fd24730e6809410987fa4e9afad9ad042fce7b28c8d67e9c221c04979f9616d", + "gen_hash_zig": "sha256:00e468005508079cf6991e4c93df1ace815742c5e3a84a2b1251c19f6d96798c", "module": "TriLand", "ring": 12, "seal_schema": 2, - "sealed_at": "2026-10-19T15:08:05Z", + "sealed_at": "2026-10-20T08:54:39Z", "sealed_by": "t27c-bootstrap@0.5.2", - "spec_hash": "sha256:77e6c34d0250cd6d9d93ebe7f0c9ba5d9182663e644b6b80c945d766795f53f5", + "spec_hash": "sha256:d58d3cc5684ab086cab355b8ae81eb677c6b2e787adba26c663edb370dab94bb", "spec_path": "specs/tri/land/land.t27", "tests": { "failed": 0, "failing": [], "forced": false, - "passed": 26, - "total": 26, + "passed": 34, + "total": 34, "vacuous": 0 }, "toolchain": {