summaryrefslogtreecommitdiff
path: root/ocaml/scripts
diff options
context:
space:
mode:
authorpolwex <polwex@sortug.com>2025-10-20 13:13:39 +0700
committerpolwex <polwex@sortug.com>2025-10-20 13:13:39 +0700
commitd21900836f89b2bf9cd55ff1708a4619c8b89656 (patch)
treebb3a5842ae408ffa465814c6bbf27a5002866252 /ocaml/scripts
neoinityes
Diffstat (limited to 'ocaml/scripts')
-rw-r--r--ocaml/scripts/boot_pill.ml55
-rw-r--r--ocaml/scripts/compare_ivory.ml270
-rw-r--r--ocaml/scripts/dune69
-rw-r--r--ocaml/scripts/inspect_bot_events.ml89
-rw-r--r--ocaml/scripts/inspect_event.ml77
-rw-r--r--ocaml/scripts/process_pill.ml27
-rw-r--r--ocaml/scripts/show_pill.ml18
-rw-r--r--ocaml/scripts/test_boot_effects.ml127
-rw-r--r--ocaml/scripts/test_effects_parsing.ml120
-rw-r--r--ocaml/scripts/test_lifecycle_boot.ml74
-rw-r--r--ocaml/scripts/test_lmdb_eventlog.ml114
-rw-r--r--ocaml/scripts/test_pier_boot.ml99
-rw-r--r--ocaml/scripts/test_poke_effects.ml117
-rw-r--r--ocaml/scripts/test_replay.ml78
-rw-r--r--ocaml/scripts/test_solid_boot.ml59
15 files changed, 1393 insertions, 0 deletions
diff --git a/ocaml/scripts/boot_pill.ml b/ocaml/scripts/boot_pill.ml
new file mode 100644
index 0000000..4662c47
--- /dev/null
+++ b/ocaml/scripts/boot_pill.ml
@@ -0,0 +1,55 @@
+open Nock_lib
+
+let digest noun =
+ (* Use jam to mirror Vere's hashing pathway and avoid quadratic marshaling. *)
+ Serial.jam noun
+ |> Bytes.unsafe_to_string
+ |> Digest.string
+ |> Digest.to_hex
+
+let ensure_debug_logging () =
+ match Sys.getenv_opt "NEOVERE_BOOT_DEBUG" with
+ | Some _ -> ()
+ | None -> Unix.putenv "NEOVERE_BOOT_DEBUG" "1"
+
+let file_size path =
+ let ic = open_in_bin path in
+ let len = in_channel_length ic in
+ close_in ic;
+ len
+
+let run_ivory path =
+ ensure_debug_logging ();
+ Printf.printf "[boot_pill] ivory path=%s\n%!" path;
+ (try
+ let size = file_size path in
+ Printf.printf "[boot_pill] pill size=%d bytes\n%!" size
+ with Sys_error msg ->
+ Printf.printf "[boot_pill] warning: %s\n%!" msg);
+ let state = State.create () in
+ let start = Sys.time () in
+ match Boot.boot_ivory state path with
+ | Error err ->
+ let msg = match err with
+ | Boot.Invalid_pill s
+ | Boot.Unsupported s -> s
+ in
+ Printf.printf "boot_ivory error: %s\n%!" msg
+ | Ok () ->
+ let elapsed = Sys.time () -. start in
+ Printf.printf "[boot_pill] boot complete in %.3fs\n%!" elapsed;
+ let core = State.arvo_core state in
+ Printf.printf "[boot_pill] computing digest...\n%!";
+ let dig = digest core in
+ Printf.printf "[boot_pill] digest ready\n%!";
+ Printf.printf "ivory core digest=%s\n%!" dig
+
+let () =
+ if Array.length Sys.argv < 2 then begin
+ prerr_endline "usage: boot_pill path";
+ exit 1
+ end;
+ let path = Sys.argv.(1) in
+ let start = Sys.time () in
+ run_ivory path;
+ Printf.printf "elapsed=%.2fs\n%!" (Sys.time () -. start)
diff --git a/ocaml/scripts/compare_ivory.ml b/ocaml/scripts/compare_ivory.ml
new file mode 100644
index 0000000..c6d0521
--- /dev/null
+++ b/ocaml/scripts/compare_ivory.ml
@@ -0,0 +1,270 @@
+open Nock_lib
+
+(* module Murmur3 = struct *)
+ (* let rotl32 x r = *)
+ (* Int32.logor (Int32.shift_left x r) (Int32.shift_right_logical x (32 - r)) *)
+
+ (* let fmix32 h = *)
+ (* let open Int32 in *)
+ (* let h = logxor h (shift_right_logical h 16) in *)
+ (* let h = mul h 0x85ebca6bl in *)
+ (* let h = logxor h (shift_right_logical h 13) in *)
+ (* let h = mul h 0xc2b2ae35l in *)
+ (* logxor h (shift_right_logical h 16) *)
+
+ (* let hash32 ?(seed = 0l) bytes ~length = *)
+ (* let c1 = 0xcc9e2d51l in *)
+ (* let c2 = 0x1b873593l in *)
+ (* let nblocks = length lsr 2 in *)
+ (* let h1 = ref seed in *)
+
+ (* for block = 0 to nblocks - 1 do *)
+ (* let i = block lsl 2 in *)
+ (* let k1 = *)
+ (* let open Int32 in *)
+ (* let b0 = of_int (Bytes.get_uint8 bytes i) in *)
+ (* let b1 = shift_left (of_int (Bytes.get_uint8 bytes (i + 1))) 8 in *)
+ (* let b2 = shift_left (of_int (Bytes.get_uint8 bytes (i + 2))) 16 in *)
+ (* let b3 = shift_left (of_int (Bytes.get_uint8 bytes (i + 3))) 24 in *)
+ (* logor b0 (logor b1 (logor b2 b3)) *)
+ (* in *)
+ (* let k1 = *)
+ (* let open Int32 in *)
+ (* let k1 = mul k1 c1 in *)
+ (* let k1 = rotl32 k1 15 in *)
+ (* mul k1 c2 *)
+ (* in *)
+ (* let open Int32 in *)
+ (* let h = !h1 in *)
+ (* let h = logxor h k1 in *)
+ (* let h = rotl32 h 13 in *)
+ (* let h = add (mul h 5l) 0xe6546b64l in *)
+ (* h1 := h *)
+ (* done; *)
+
+ (* let tail_index = nblocks lsl 2 in *)
+ (* let tail_len = length land 3 in *)
+ (* let k1 = *)
+ (* let open Int32 in *)
+ (* let k = ref 0l in *)
+ (* if tail_len >= 3 then *)
+ (* k := logor !k (shift_left (of_int (Bytes.get_uint8 bytes (tail_index + 2))) 16); *)
+ (* if tail_len >= 2 then *)
+ (* k := logor !k (shift_left (of_int (Bytes.get_uint8 bytes (tail_index + 1))) 8); *)
+ (* if tail_len >= 1 then begin *)
+ (* k := logor !k (of_int (Bytes.get_uint8 bytes tail_index)); *)
+ (* let kx = mul !k c1 in *)
+ (* let kx = rotl32 kx 15 in *)
+ (* Some (mul kx c2) *)
+ (* end else *)
+ (* None *)
+ (* in *)
+ (* let h1 = *)
+ (* match k1 with *)
+ (* | None -> !h1 *)
+ (* | Some k1 -> Int32.logxor !h1 k1 *)
+ (* in *)
+ (* let h1 = Int32.logxor h1 (Int32.of_int length) in *)
+ (* fmix32 h1 *)
+(* end *)
+
+external murmur3_hash32_seed : string -> int32 -> int32 = "caml_murmur3_hash32_seed"
+
+module Mug = struct
+ open Noun
+
+ module Tbl = Hashtbl.Make(struct
+ type t = noun
+ let equal = (==)
+ let hash = Hashtbl.hash
+ end)
+
+ let memo = Tbl.create 1024
+
+ let adjust hash =
+ let mask = Int32.of_int 0x7fffffff in
+ let ham =
+ Int32.logxor
+ (Int32.shift_right_logical hash 31)
+ (Int32.logand hash mask)
+ in
+ if Int32.equal ham Int32.zero then 0x7fff else Int32.to_int ham
+
+ let mug_bytes bytes ~length ~seed =
+ let rec loop seed attempts =
+ if attempts >= 8 then Int32.of_int 0x7fff
+ else
+ (* Convert bytes to string, taking only 'length' bytes *)
+ let data = Bytes.sub_string bytes 0 length in
+ let hash = murmur3_hash32_seed data seed in
+ let ham = adjust hash in
+ if ham = 0 then
+ loop (Int32.add seed (Int32.of_int 1)) (attempts + 1)
+ else
+ Int32.of_int ham
+ in
+ loop seed 0
+
+ let mug_both left right =
+ let len =
+ let bits =
+ let rec loop count value =
+ if Int32.equal value Int32.zero then count
+ else loop (count + 1) (Int32.shift_right_logical value 1)
+ in
+ loop 0 right
+ in
+ 4 + ((bits + 7) lsr 3)
+ in
+ let buf = Bytes.make 8 '\000' in
+ let store value offset =
+ let mask = Int32.of_int 0xff in
+ Bytes.set buf offset (Char.chr (Int32.to_int (Int32.logand value mask)));
+ Bytes.set buf (offset + 1)
+ (Char.chr (Int32.to_int (Int32.logand (Int32.shift_right_logical value 8) mask)));
+ Bytes.set buf (offset + 2)
+ (Char.chr (Int32.to_int (Int32.logand (Int32.shift_right_logical value 16) mask)));
+ Bytes.set buf (offset + 3)
+ (Char.chr (Int32.to_int (Int32.logand (Int32.shift_right_logical value 24) mask)));
+ in
+ store left 0;
+ store right 4;
+ mug_bytes buf ~length:len ~seed:(Int32.of_int 0xdeadbeef)
+
+ let trim_trailing_zeros str =
+ let len = String.length str in
+ let rec find idx =
+ if idx < 0 then -1
+ else if Char.equal str.[idx] '\000' then find (idx - 1)
+ else idx
+ in
+ match find (len - 1) with
+ | -1 -> Bytes.create 0
+ | last -> Bytes.sub (Bytes.of_string str) 0 (last + 1)
+
+ let rec mug noun =
+ match Tbl.find_opt memo noun with
+ | Some value -> value
+ | None ->
+ let value =
+ match noun with
+ | Atom z ->
+ let bytes = trim_trailing_zeros (Z.to_bits z) in
+ let len = Bytes.length bytes in
+ if len = 0 then Int32.of_int 0x79ff04e8
+ else mug_bytes bytes ~length:len ~seed:(Int32.of_int 0xcafebabe)
+ | Cell (h, t) ->
+ let left = mug h in
+ let right = mug t in
+ mug_both left right
+ in
+ Tbl.add memo noun value;
+ value
+end
+
+let timed f =
+ let start = Unix.gettimeofday () in
+ let res = f () in
+ let elapsed_ms = (Unix.gettimeofday () -. start) *. 1000.0 in
+ res, elapsed_ms
+
+let rec find_project_root dir =
+ let pills_dir = Filename.concat dir "pills" in
+ if Sys.file_exists pills_dir && Sys.is_directory pills_dir then dir
+ else
+ let parent = Filename.dirname dir in
+ if String.equal parent dir then invalid_arg "unable to locate project root containing pills/"
+ else find_project_root parent
+
+let project_root =
+ match Sys.getenv_opt "NEOVERE_ROOT" with
+ | Some root -> root
+ | None ->
+ let exe_dir = Filename.dirname Sys.executable_name in
+ find_project_root exe_dir
+
+let read_file path =
+ let ic = open_in_bin path in
+ let len = in_channel_length ic in
+ let data = really_input_string ic len in
+ close_in ic;
+ Bytes.of_string data
+
+let count_list noun =
+ let rec loop acc = function
+ | Noun.Atom z when Z.equal z Z.zero -> acc
+ | Noun.Cell (_, t) -> loop (acc + 1) t
+ | _ -> raise Noun.Exit
+ in
+ loop 0 noun
+
+let lifecycle_formula =
+ let open Noun in
+ let axis03 = cell (atom_of_int 0) (atom_of_int 3) in
+ let axis02 = cell (atom_of_int 0) (atom_of_int 2) in
+ cell (atom_of_int 2) (cell axis03 axis02)
+
+let run_lifecycle events =
+ let gate = Nock.nock_on events lifecycle_formula in
+ Noun.slot (Z.of_int 7) gate
+
+let hex32 x =
+ Printf.sprintf "0x%08x" (Int32.to_int x)
+
+let () =
+ let pill =
+ match Array.to_list Sys.argv with
+ | _ :: path :: _ -> path
+ | _ ->
+ Printf.eprintf "usage: compare_ivory PATH/ivory.pill\n%!";
+ exit 1
+ in
+ let pill_path =
+ let raw =
+ if Filename.is_relative pill then Filename.concat project_root pill else pill
+ in
+ Unix.realpath raw
+ in
+ Printf.printf "Loading ivory pill from %s...\n%!" pill_path;
+ let pill_bytes = read_file pill_path in
+ let pill, cue_ms = timed (fun () -> Serial.cue ~verbose:true pill_bytes) in
+ Printf.printf "perf: ivory cue %.3f ms\n%!" cue_ms;
+ let ivory_mug = Mug.mug pill in
+ Printf.printf "ivory_pil mug: %s\n%!" (hex32 ivory_mug);
+ let arvo_core =
+ match pill with
+ | Noun.Cell (_, tail) -> tail
+ | _ -> failwith "ivory pill must be a cell"
+ in
+ Printf.printf "arvo_core mug: %s\n%!" (hex32 (Mug.mug arvo_core));
+ Printf.printf "ivory event count=%d\n%!" (count_list arvo_core);
+ (* Check pill head *)
+ let pill_head = match pill with
+ | Noun.Cell (h, _) -> h
+ | _ -> failwith "not a cell"
+ in
+ Printf.printf "pill head (should be %%ivory) mug: %s\n%!" (hex32 (Mug.mug pill_head));
+ let kernel, boot_ms = timed (fun () -> run_lifecycle arvo_core) in
+ Printf.printf "perf: ivory boot %.3f ms\n%!" boot_ms;
+ let kernel_mug = Mug.mug kernel in
+ Printf.printf "lite: core %s\n%!" (hex32 kernel_mug);
+ Printf.printf "lite: final state %s\n%!" (hex32 kernel_mug);
+ let slot axis =
+ try
+ let noun = Noun.slot (Z.of_int axis) kernel in
+ Some (hex32 (Mug.mug noun))
+ with Noun.Exit -> None
+ in
+ let print_slot axis label =
+ match slot axis with
+ | Some value -> Printf.printf "%s mug: %s\n%!" label value
+ | None -> Printf.printf "%s unavailable\n%!" label
+ in
+ print_slot 2 "kernel slot 2";
+ print_slot 3 "kernel slot 3";
+ print_slot 23 "kernel slot 23";
+ let jammed, jam_ms = timed (fun () -> Serial.jam ~verbose:true kernel) in
+ Printf.printf "jam kernel %.3f ms\n%!" jam_ms;
+ Printf.printf "jam kernel bytes=%d\n%!" (Bytes.length jammed);
+ let digest = Digest.string (Bytes.unsafe_to_string jammed) |> Digest.to_hex in
+ Printf.printf "kernel jam digest=%s\n%!" digest
diff --git a/ocaml/scripts/dune b/ocaml/scripts/dune
new file mode 100644
index 0000000..25c7235
--- /dev/null
+++ b/ocaml/scripts/dune
@@ -0,0 +1,69 @@
+(executable
+ (name boot_pill)
+ (modules boot_pill)
+ (libraries overe.nock unix))
+
+(executable
+ (name compare_ivory)
+ (modules compare_ivory)
+ (libraries murmur3 overe.nock unix))
+
+(executable
+ (name show_pill)
+ (modules show_pill)
+ (libraries overe.nock))
+
+(executable
+ (name process_pill)
+ (modules process_pill)
+ (libraries overe.nock))
+
+(executable
+ (name test_solid_boot)
+ (modules test_solid_boot)
+ (libraries overe.nock))
+
+(executable
+ (name test_pier_boot)
+ (modules test_pier_boot)
+ (libraries overe.nock unix))
+
+(executable
+ (name test_replay)
+ (modules test_replay)
+ (libraries overe.nock unix))
+
+(executable
+ (name inspect_event)
+ (modules inspect_event)
+ (libraries overe.nock unix))
+
+(executable
+ (name test_lmdb_eventlog)
+ (modules test_lmdb_eventlog)
+ (libraries overe.nock unix))
+
+(executable
+ (name test_boot_effects)
+ (modules test_boot_effects)
+ (libraries overe.nock unix))
+
+(executable
+ (name inspect_bot_events)
+ (modules inspect_bot_events)
+ (libraries overe.nock))
+
+(executable
+ (name test_lifecycle_boot)
+ (modules test_lifecycle_boot)
+ (libraries overe.nock unix))
+
+(executable
+ (name test_effects_parsing)
+ (modules test_effects_parsing)
+ (libraries overe.nock unix))
+
+(executable
+ (name test_poke_effects)
+ (modules test_poke_effects)
+ (libraries overe.nock unix))
diff --git a/ocaml/scripts/inspect_bot_events.ml b/ocaml/scripts/inspect_bot_events.ml
new file mode 100644
index 0000000..f65e5c6
--- /dev/null
+++ b/ocaml/scripts/inspect_bot_events.ml
@@ -0,0 +1,89 @@
+open Nock_lib
+
+let rec find_project_root dir =
+ let pills_dir = Filename.concat dir "pills" in
+ if Sys.file_exists pills_dir && Sys.is_directory pills_dir then dir
+ else
+ let parent = Filename.dirname dir in
+ if String.equal parent dir then failwith "unable to locate project root containing pills/"
+ else find_project_root parent
+
+let project_root =
+ match Sys.getenv_opt "NEOVERE_ROOT" with
+ | Some root -> root
+ | None ->
+ let exe_dir = Filename.dirname Sys.executable_name in
+ find_project_root exe_dir
+
+(* Helper to show noun structure *)
+let rec noun_shape ?(depth=0) ?(max_depth=5) noun =
+ if depth >= max_depth then "..."
+ else match noun with
+ | Noun.Atom z ->
+ if Z.equal z Z.zero then "0"
+ else if Z.numbits z <= 32 then
+ Printf.sprintf "%Ld" (Z.to_int64 z)
+ else
+ Printf.sprintf "atom(%d bits)" (Z.numbits z)
+ | Noun.Cell (h, t) ->
+ Printf.sprintf "[%s %s]"
+ (noun_shape ~depth:(depth+1) ~max_depth h)
+ (noun_shape ~depth:(depth+1) ~max_depth t)
+
+(* Convert list to OCaml list *)
+let rec list_to_ocaml_list noun =
+ match noun with
+ | Noun.Atom z when Z.equal z Z.zero -> []
+ | Noun.Cell (h, t) -> h :: list_to_ocaml_list t
+ | _ -> failwith "malformed list"
+
+let () =
+ Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Bot Events Inspector ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n";
+
+ let solid_path = Filename.concat project_root "pills/solid.pill" in
+ Printf.printf "Loading solid.pill...\n%!";
+
+ let pill = Boot.cue_file solid_path in
+
+ Printf.printf "Parsing solid pill structure...\n%!";
+
+ match Boot.parse_solid pill with
+ | Error e ->
+ Printf.printf "Failed to parse: %s\n" (match e with
+ | Boot.Invalid_pill msg -> msg
+ | Boot.Unsupported msg -> msg)
+ | Ok (bot, _mod_, _use_) ->
+ Printf.printf "✓ Solid pill parsed\n\n";
+
+ let bot_list = list_to_ocaml_list bot in
+ Printf.printf "Bot events: %d\n\n" (List.length bot_list);
+
+ List.iteri (fun i event ->
+ Printf.printf "Bot Event %d:\n" (i + 1);
+ Printf.printf " Shape: %s\n" (noun_shape ~max_depth:3 event);
+ Printf.printf " Is atom: %b\n" (Noun.is_atom event);
+ Printf.printf " Is cell: %b\n" (Noun.is_cell event);
+
+ if Noun.is_cell event then begin
+ let head = Noun.head event in
+ let tail = Noun.tail event in
+ Printf.printf " Head shape: %s\n" (noun_shape ~max_depth:2 head);
+ Printf.printf " Tail shape: %s\n" (noun_shape ~max_depth:2 tail);
+
+ (* Check if it could be a formula (common formula patterns) *)
+ match head with
+ | Noun.Atom z ->
+ let n = Z.to_int z in
+ if n >= 0 && n <= 11 then
+ Printf.printf " Head is opcode %d!\n" n
+ | _ -> ()
+ end;
+
+ Printf.printf "\n";
+ ) bot_list;
+
+ Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Analysis Complete ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n"
diff --git a/ocaml/scripts/inspect_event.ml b/ocaml/scripts/inspect_event.ml
new file mode 100644
index 0000000..569f103
--- /dev/null
+++ b/ocaml/scripts/inspect_event.ml
@@ -0,0 +1,77 @@
+open Nock_lib
+
+let rec find_project_root dir =
+ let pills_dir = Filename.concat dir "pills" in
+ if Sys.file_exists pills_dir && Sys.is_directory pills_dir then dir
+ else
+ let parent = Filename.dirname dir in
+ if String.equal parent dir then failwith "unable to locate project root containing pills/"
+ else find_project_root parent
+
+let project_root =
+ match Sys.getenv_opt "NEOVERE_ROOT" with
+ | Some root -> root
+ | None ->
+ let exe_dir = Filename.dirname Sys.executable_name in
+ find_project_root exe_dir
+
+let rec print_noun_structure noun depth =
+ let indent = String.make (depth * 2) ' ' in
+ match noun with
+ | Noun.Atom z ->
+ let size = Z.numbits z in
+ if size <= 64 then
+ Printf.printf "%sAtom: %s (0x%s, %d bits)\n"
+ indent (Z.to_string z) (Z.format "%x" z) size
+ else
+ Printf.printf "%sAtom: <large %d bits>\n" indent size
+ | Noun.Cell (h, t) ->
+ Printf.printf "%sCell:\n" indent;
+ Printf.printf "%s Head:\n" indent;
+ print_noun_structure h (depth + 2);
+ Printf.printf "%s Tail:\n" indent;
+ print_noun_structure t (depth + 2)
+
+let () =
+ if Array.length Sys.argv < 2 then begin
+ Printf.printf "Usage: %s <event_number>\n" Sys.argv.(0);
+ exit 1
+ end;
+
+ let event_num = Int64.of_string Sys.argv.(1) in
+ let pier_path = Filename.concat project_root "test-pier" in
+
+ if not (Sys.file_exists pier_path) then begin
+ Printf.printf "Test pier not found at: %s\n" pier_path;
+ Printf.printf "Run test_pier_boot.exe first\n";
+ exit 1
+ end;
+
+ Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Event Inspector ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n";
+
+ let eventlog = Eventlog.create ~enabled:false pier_path in
+
+ Printf.printf "Reading event %Ld from test pier...\n\n" event_num;
+
+ let event = Eventlog.read_event eventlog event_num in
+
+ Printf.printf "Event structure:\n";
+ print_noun_structure event 0;
+
+ Printf.printf "\n";
+
+ (* Check if it's a timestamped event [timestamp data] *)
+ match event with
+ | Noun.Cell (Noun.Atom timestamp, event_data) ->
+ Printf.printf "✓ Event is properly timestamped!\n";
+ Printf.printf " Timestamp: %s\n" (Z.to_string timestamp);
+ Printf.printf " Timestamp (hex): 0x%s\n" (Z.format "%x" timestamp);
+ Printf.printf " Timestamp bits: %d\n" (Z.numbits timestamp);
+ Printf.printf "\n Event data structure:\n";
+ print_noun_structure event_data 2
+ | _ ->
+ Printf.printf "⚠ Event does NOT appear to be timestamped!\n";
+ Printf.printf " Expected: [timestamp event_data]\n";
+ Printf.printf " Got something else\n"
diff --git a/ocaml/scripts/process_pill.ml b/ocaml/scripts/process_pill.ml
new file mode 100644
index 0000000..c02f6ed
--- /dev/null
+++ b/ocaml/scripts/process_pill.ml
@@ -0,0 +1,27 @@
+open Nock_lib
+
+let read_bytes path =
+ let ic = open_in_bin path in
+ let len = in_channel_length ic in
+ let data = really_input_string ic len in
+ close_in ic;
+ Bytes.of_string data
+
+let describe_root noun =
+ match noun with
+ | Noun.Cell (tag, _) ->
+ begin match tag with
+ | Noun.Atom z -> Printf.printf "tag=%s\n" (Z.to_string z)
+ | _ -> Printf.printf "tag=cell\n"
+ end
+ | Noun.Atom _ -> Printf.printf "atom pill\n"
+
+let () =
+ if Array.length Sys.argv < 2 then begin
+ prerr_endline "usage: process_pill path";
+ exit 1
+ end;
+ let path = Sys.argv.(1) in
+ let bytes = read_bytes path in
+ let noun = Serial.cue bytes in
+ describe_root noun
diff --git a/ocaml/scripts/show_pill.ml b/ocaml/scripts/show_pill.ml
new file mode 100644
index 0000000..07874fb
--- /dev/null
+++ b/ocaml/scripts/show_pill.ml
@@ -0,0 +1,18 @@
+open Nock_lib
+
+let rec show noun depth limit =
+ if depth = 0 || limit = 0 then "..."
+ else match noun with
+ | Noun.Atom z -> Z.to_string z
+ | Noun.Cell (h, t) ->
+ Printf.sprintf "[%s %s]" (show h (depth-1) (limit-1)) (show t (depth-1) (limit-1))
+
+let () =
+ if Array.length Sys.argv < 2 then exit 1;
+ let path = Sys.argv.(1) in
+ let ic = open_in_bin path in
+ let len = in_channel_length ic in
+ let data = really_input_string ic len in
+ close_in ic;
+ let noun = Serial.cue (Bytes.of_string data) in
+ Printf.printf "structure=%s\n" (show noun 6 100)
diff --git a/ocaml/scripts/test_boot_effects.ml b/ocaml/scripts/test_boot_effects.ml
new file mode 100644
index 0000000..13c05b6
--- /dev/null
+++ b/ocaml/scripts/test_boot_effects.ml
@@ -0,0 +1,127 @@
+open Nock_lib
+
+let rec find_project_root dir =
+ let pills_dir = Filename.concat dir "pills" in
+ if Sys.file_exists pills_dir && Sys.is_directory pills_dir then dir
+ else
+ let parent = Filename.dirname dir in
+ if String.equal parent dir then failwith "unable to locate project root containing pills/"
+ else find_project_root parent
+
+let project_root =
+ match Sys.getenv_opt "NEOVERE_ROOT" with
+ | Some root -> root
+ | None ->
+ let exe_dir = Filename.dirname Sys.executable_name in
+ find_project_root exe_dir
+
+(* Helper to show noun structure briefly *)
+let rec noun_shape = function
+ | Noun.Atom z ->
+ if Z.equal z Z.zero then "0"
+ else Printf.sprintf "atom(%d bits)" (Z.numbits z)
+ | Noun.Cell (h, t) ->
+ Printf.sprintf "[%s %s]" (noun_shape h) (noun_shape t)
+
+(* Count the length of a noun list *)
+let rec list_length = function
+ | Noun.Atom z when Z.equal z Z.zero -> 0
+ | Noun.Cell (_, t) -> 1 + list_length t
+ | _ -> 0
+
+let () =
+ Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Boot Effects Analysis ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n";
+
+ let pier_path = Filename.concat project_root "test-pier-effects" in
+ Printf.printf "Creating test pier at: %s\n%!" pier_path;
+
+ if Sys.file_exists pier_path then begin
+ Printf.printf "Removing old test pier...\n%!";
+ let _ = Sys.command (Printf.sprintf "rm -rf '%s'" pier_path) in
+ ()
+ end;
+
+ Unix.mkdir pier_path 0o755;
+
+ Printf.printf "\n[1] Creating state...\n%!";
+ let state = State.create ~pier_path () in
+
+ Printf.printf "\n[2] Booting ivory.pill...\n%!";
+ let ivory_path = Filename.concat project_root "pills/ivory.pill" in
+ begin match Boot.boot_ivory state ivory_path with
+ | Error (Boot.Invalid_pill msg) ->
+ Printf.printf "✗ Ivory boot failed: %s\n%!" msg;
+ exit 1
+ | Error (Boot.Unsupported msg) ->
+ Printf.printf "✗ Unsupported: %s\n%!" msg;
+ exit 1
+ | Ok () ->
+ Printf.printf "✓ Ivory kernel loaded\n\n%!";
+ end;
+
+ Printf.printf "[3] Processing solid.pill events and capturing effects...\n%!";
+ let solid_path = Filename.concat project_root "pills/solid.pill" in
+
+ (* Track effects returned from each event *)
+ let event_count = ref 0 in
+ let effects_summary = ref [] in
+
+ (* Custom apply function that wraps State.poke and logs effects *)
+ let apply_with_logging state event =
+ incr event_count;
+ let effects = State.poke state event in
+ let effect_count = list_length effects in
+
+ (* Log every event, or just milestone events *)
+ if !event_count <= 20 || !event_count mod 50 = 0 then begin
+ Printf.printf " Event %d: %d effects returned\n%!" !event_count effect_count;
+ end;
+
+ (* Always log when we see effects! *)
+ if effect_count > 0 then begin
+ Printf.printf " *** EFFECTS FOUND! Event %d has %d effects ***\n%!" !event_count effect_count;
+ Printf.printf " Effects shape: %s\n%!" (noun_shape effects);
+ end;
+
+ effects_summary := (!event_count, effect_count) :: !effects_summary;
+ effects
+ in
+
+ (* Boot solid WITHOUT limit, capturing all effects *)
+ begin match Boot.boot_solid ~apply:apply_with_logging state solid_path with
+ | Error (Boot.Invalid_pill msg) ->
+ Printf.printf "✗ Solid boot failed: %s\n%!" msg;
+ exit 1
+ | Error (Boot.Unsupported msg) ->
+ Printf.printf "✗ Unsupported: %s\n%!" msg;
+ exit 1
+ | Ok () ->
+ let eve = State.event_number state in
+ Printf.printf "\n✓ Solid boot completed!\n%!";
+ Printf.printf " Total events processed: %Ld\n\n%!" eve;
+ end;
+
+ Printf.printf "[4] Effects Summary:\n%!";
+ let total_effects = List.fold_left (fun acc (_, count) -> acc + count) 0 !effects_summary in
+ Printf.printf " Total effects returned: %d\n%!" total_effects;
+ Printf.printf " Average effects per event: %.2f\n%!"
+ (float_of_int total_effects /. float_of_int !event_count);
+
+ (* Show which events had effects *)
+ let with_effects = List.filter (fun (_, count) -> count > 0) !effects_summary in
+ Printf.printf " Events with effects: %d/%d\n%!" (List.length with_effects) !event_count;
+
+ if List.length with_effects > 0 then begin
+ Printf.printf " First 10 events with effects:\n";
+ List.iter (fun (evt_num, count) ->
+ Printf.printf " Event %d: %d effects\n" evt_num count
+ ) (List.rev with_effects |> (fun l -> if List.length l > 10 then List.filteri (fun i _ -> i < 10) l else l));
+ end;
+
+ State.close_eventlog state;
+
+ Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Boot Effects Analysis Complete! 🎉 ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n"
diff --git a/ocaml/scripts/test_effects_parsing.ml b/ocaml/scripts/test_effects_parsing.ml
new file mode 100644
index 0000000..f634825
--- /dev/null
+++ b/ocaml/scripts/test_effects_parsing.ml
@@ -0,0 +1,120 @@
+open Nock_lib
+
+let rec find_project_root dir =
+ let pills_dir = Filename.concat dir "pills" in
+ if Sys.file_exists pills_dir && Sys.is_directory pills_dir then dir
+ else
+ let parent = Filename.dirname dir in
+ if String.equal parent dir then failwith "unable to locate project root containing pills/"
+ else find_project_root parent
+
+let project_root =
+ match Sys.getenv_opt "NEOVERE_ROOT" with
+ | Some root -> root
+ | None ->
+ let exe_dir = Filename.dirname Sys.executable_name in
+ find_project_root exe_dir
+
+(* Create a simple test event to poke Arvo *)
+let make_test_event () =
+ (* Create a simple belt event: [timestamp [wire [%belt %ret]]] *)
+ (* This simulates pressing Enter in the dojo *)
+ (* Timestamp: use a simple value for testing *)
+ let now = Noun.atom (Z.shift_left (Z.of_string "0x8000000cce9e0d80") 64) in
+ let wire = Noun.cell
+ (Noun.atom (Z.of_int (Char.code 'd')))
+ (Noun.cell
+ (Noun.atom_of_string "term")
+ (Noun.cell (Noun.atom (Z.of_int 1)) (Noun.atom Z.zero)))
+ in
+ let belt = Noun.atom_of_string "ret" in
+ let card = Noun.cell (Noun.atom_of_string "belt") belt in
+ let ovum = Noun.cell wire card in
+ Noun.cell now ovum
+
+let () =
+ Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Effects Parsing Test ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n";
+
+ let pier_path = Filename.concat project_root "test-pier-effects-parse" in
+ Printf.printf "Creating test pier at: %s\n%!" pier_path;
+
+ if Sys.file_exists pier_path then begin
+ Printf.printf "Removing old test pier...\n%!";
+ let _ = Sys.command (Printf.sprintf "rm -rf '%s'" pier_path) in
+ ()
+ end;
+
+ Unix.mkdir pier_path 0o755;
+
+ Printf.printf "\n[1] Creating state and booting...\n%!";
+ let state = State.create ~pier_path () in
+
+ (* Boot ivory *)
+ let ivory_path = Filename.concat project_root "pills/ivory.pill" in
+ begin match Boot.boot_ivory state ivory_path with
+ | Error e -> Printf.printf "Ivory boot failed\n"; exit 1
+ | Ok () -> Printf.printf "✓ Ivory kernel loaded\n%!"
+ end;
+
+ (* Boot solid *)
+ let solid_path = Filename.concat project_root "pills/solid.pill" in
+ begin match Boot.boot_solid_lifecycle state solid_path with
+ | Error e -> Printf.printf "Solid boot failed\n"; exit 1
+ | Ok () ->
+ Printf.printf "✓ Solid boot completed\n";
+ Printf.printf " Events: %Ld\n\n%!" (State.event_number state)
+ end;
+
+ Printf.printf "[2] Sending test event to Arvo...\n%!";
+ let test_event = make_test_event () in
+
+ let result = State.poke state test_event in
+
+ Printf.printf "[3] Parsing effects from poke result...\n\n%!";
+
+ begin match result with
+ | Noun.Cell (effects_noun, new_core) ->
+ Printf.printf "Poke returned:\n";
+ Printf.printf " Effects: %s\n" (if Noun.is_cell effects_noun then "list" else "atom");
+ Printf.printf " New core: %s\n\n" (if Noun.is_cell new_core then "valid" else "invalid");
+
+ let effects = Nock_lib.Effects.parse_effects effects_noun in
+ Printf.printf "Parsed %d effects:\n\n" (List.length effects);
+
+ List.iteri (fun i eff ->
+ Printf.printf "Effect %d:\n" (i + 1);
+ Printf.printf " Wire: %s\n" (Nock_lib.Effects.show_wire eff.wire);
+ Printf.printf " Card: %s\n" (Nock_lib.Effects.show_card eff.card);
+
+ (* If it's a blit, show details *)
+ begin match eff.card with
+ | Nock_lib.Effects.Blit (Nock_lib.Effects.Lin text) ->
+ Printf.printf " Text: %S\n" text
+ | Nock_lib.Effects.Blit (Nock_lib.Effects.Mor blits) ->
+ Printf.printf " Contains %d blits:\n" (List.length blits);
+ List.iteri (fun j blit ->
+ match blit with
+ | Nock_lib.Effects.Lin t -> Printf.printf " [%d] %S\n" (j+1) t
+ | _ -> Printf.printf " [%d] (other blit)\n" (j+1)
+ ) blits
+ | _ -> ()
+ end;
+
+ Printf.printf "\n";
+ ) effects;
+
+ if List.length effects = 0 then
+ Printf.printf "No effects returned (this is normal for some events)\n\n";
+
+ | _ ->
+ Printf.printf "Unexpected poke result structure!\n";
+ Printf.printf "Result is an atom: %b\n" (Noun.is_atom result);
+ end;
+
+ State.close_eventlog state;
+
+ Printf.printf "╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Effects Parsing Test Complete! 🎉 ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n"
diff --git a/ocaml/scripts/test_lifecycle_boot.ml b/ocaml/scripts/test_lifecycle_boot.ml
new file mode 100644
index 0000000..77ca16b
--- /dev/null
+++ b/ocaml/scripts/test_lifecycle_boot.ml
@@ -0,0 +1,74 @@
+open Nock_lib
+
+let rec find_project_root dir =
+ let pills_dir = Filename.concat dir "pills" in
+ if Sys.file_exists pills_dir && Sys.is_directory pills_dir then dir
+ else
+ let parent = Filename.dirname dir in
+ if String.equal parent dir then failwith "unable to locate project root containing pills/"
+ else find_project_root parent
+
+let project_root =
+ match Sys.getenv_opt "NEOVERE_ROOT" with
+ | Some root -> root
+ | None ->
+ let exe_dir = Filename.dirname Sys.executable_name in
+ find_project_root exe_dir
+
+let () =
+ Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Lifecycle Formula Boot Test ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n";
+
+ let pier_path = Filename.concat project_root "test-pier-lifecycle" in
+ Printf.printf "Creating test pier at: %s\n%!" pier_path;
+
+ if Sys.file_exists pier_path then begin
+ Printf.printf "Removing old test pier...\n%!";
+ let _ = Sys.command (Printf.sprintf "rm -rf '%s'" pier_path) in
+ ()
+ end;
+
+ Unix.mkdir pier_path 0o755;
+
+ Printf.printf "\n[1] Creating state...\n%!";
+ let state = State.create ~pier_path () in
+
+ Printf.printf "\n[2] Booting ivory.pill...\n%!";
+ let ivory_path = Filename.concat project_root "pills/ivory.pill" in
+ begin match Boot.boot_ivory state ivory_path with
+ | Error (Boot.Invalid_pill msg) ->
+ Printf.printf "✗ Ivory boot failed: %s\n%!" msg;
+ exit 1
+ | Error (Boot.Unsupported msg) ->
+ Printf.printf "✗ Unsupported: %s\n%!" msg;
+ exit 1
+ | Ok () ->
+ Printf.printf "✓ Ivory kernel loaded\n\n%!";
+ end;
+
+ Printf.printf "[3] Booting solid.pill with lifecycle formula...\n%!";
+ let solid_path = Filename.concat project_root "pills/solid.pill" in
+
+ begin match Boot.boot_solid_lifecycle state solid_path with
+ | Error (Boot.Invalid_pill msg) ->
+ Printf.printf "✗ Solid boot failed: %s\n%!" msg;
+ exit 1
+ | Error (Boot.Unsupported msg) ->
+ Printf.printf "✗ Unsupported: %s\n%!" msg;
+ exit 1
+ | Ok () ->
+ let eve = State.event_number state in
+ Printf.printf "✓ Solid boot completed via lifecycle formula!\n%!";
+ Printf.printf " Events in state: %Ld\n\n%!" eve;
+
+ (* Get kernel and compute mug for verification *)
+ let kernel = State.arvo_core state in
+ Printf.printf " Kernel is_cell: %b\n" (Noun.is_cell kernel);
+
+ Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Lifecycle Boot SUCCESS! 🎉 ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n";
+ end;
+
+ State.close_eventlog state
diff --git a/ocaml/scripts/test_lmdb_eventlog.ml b/ocaml/scripts/test_lmdb_eventlog.ml
new file mode 100644
index 0000000..e7a4971
--- /dev/null
+++ b/ocaml/scripts/test_lmdb_eventlog.ml
@@ -0,0 +1,114 @@
+open Nock_lib
+
+let rec find_project_root dir =
+ let pills_dir = Filename.concat dir "pills" in
+ if Sys.file_exists pills_dir && Sys.is_directory pills_dir then dir
+ else
+ let parent = Filename.dirname dir in
+ if String.equal parent dir then failwith "unable to locate project root containing pills/"
+ else find_project_root parent
+
+let project_root =
+ match Sys.getenv_opt "NEOVERE_ROOT" with
+ | Some root -> root
+ | None ->
+ let exe_dir = Filename.dirname Sys.executable_name in
+ find_project_root exe_dir
+
+let () =
+ Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ LMDB Event Log Test ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n";
+
+ let test_pier = Filename.concat project_root "test-pier-lmdb" in
+
+ (* Clean up old test pier if it exists *)
+ if Sys.file_exists test_pier then begin
+ Printf.printf "Removing old test pier...\n";
+ ignore (Sys.command (Printf.sprintf "rm -rf %s" test_pier))
+ end;
+
+ (* Create test pier directory *)
+ Unix.mkdir test_pier 0o755;
+
+ Printf.printf "Creating LMDB event log...\n";
+ let log = Eventlog_lmdb.create test_pier in
+
+ Printf.printf "Creating test events...\n\n";
+
+ (* Create some test events *)
+ let test_events = [
+ Noun.atom (Z.of_int 42);
+ Noun.cell (Noun.atom (Z.of_int 1)) (Noun.atom (Z.of_int 2));
+ Noun.cell (Noun.atom (Z.of_int 3)) (Noun.cell (Noun.atom (Z.of_int 4)) (Noun.atom Z.zero));
+ Noun.atom (Z.of_int 0xdeadbeef);
+ Noun.cell (Noun.atom (Z.of_bits "hello")) (Noun.atom Z.zero);
+ ] in
+
+ (* Write events *)
+ Printf.printf "Writing %d events to LMDB...\n" (List.length test_events);
+ List.iteri (fun i event ->
+ let event_num = Eventlog_lmdb.append log event in
+ Printf.printf " Event %d: wrote as event number %Ld\n" (i+1) event_num
+ ) test_events;
+
+ (* Sync to disk *)
+ Printf.printf "\nSyncing to disk...\n";
+ Eventlog_lmdb.sync log;
+
+ (* Check gulf *)
+ Printf.printf "\nChecking event range (gulf)...\n";
+ begin match Eventlog_lmdb.gulf log with
+ | None -> Printf.printf " No events in log\n"
+ | Some (first, last) ->
+ Printf.printf " First event: %Ld, Last event: %Ld\n" first last
+ end;
+
+ (* Read events back *)
+ Printf.printf "\nReading events back...\n";
+ for i = 1 to List.length test_events do
+ let event_num = Int64.of_int i in
+ let event = Eventlog_lmdb.read_event log event_num in
+ Printf.printf " Event %Ld: %s\n" event_num
+ (if Noun.is_cell event then "cell" else "atom")
+ done;
+
+ (* Test replay *)
+ Printf.printf "\nTesting replay...\n";
+ let replay_count = ref 0 in
+ Eventlog_lmdb.replay log (fun event_num _noun ->
+ incr replay_count;
+ Printf.printf " Replayed event %Ld\n" event_num
+ );
+ Printf.printf "Replayed %d events total\n" !replay_count;
+
+ (* Close the log *)
+ Printf.printf "\nClosing event log...\n";
+ Eventlog_lmdb.close log;
+
+ (* Reopen and verify *)
+ Printf.printf "Reopening event log...\n";
+ let log2 = Eventlog_lmdb.create test_pier in
+ let last = Eventlog_lmdb.last_event log2 in
+ Printf.printf " Last event after reopen: %Ld\n" last;
+
+ if last = Int64.of_int (List.length test_events) then begin
+ Printf.printf "\n✓ LMDB event log test PASSED!\n";
+ Printf.printf " - Wrote %d events\n" (List.length test_events);
+ Printf.printf " - Read all events back successfully\n";
+ Printf.printf " - Replay worked correctly\n";
+ Printf.printf " - Persistence verified after reopen\n"
+ end else begin
+ Printf.printf "\n✗ LMDB event log test FAILED!\n";
+ Printf.printf " Expected last event: %d, Got: %Ld\n"
+ (List.length test_events) last;
+ exit 1
+ end;
+
+ Eventlog_lmdb.close log2;
+
+ Printf.printf "\nTest pier created at: %s\n" test_pier;
+ Printf.printf "LMDB files:\n";
+ ignore (Sys.command (Printf.sprintf "ls -lh %s/.urb/log/" test_pier));
+
+ Printf.printf "\n"
diff --git a/ocaml/scripts/test_pier_boot.ml b/ocaml/scripts/test_pier_boot.ml
new file mode 100644
index 0000000..f9b6a05
--- /dev/null
+++ b/ocaml/scripts/test_pier_boot.ml
@@ -0,0 +1,99 @@
+open Nock_lib
+
+let rec find_project_root dir =
+ let pills_dir = Filename.concat dir "pills" in
+ if Sys.file_exists pills_dir && Sys.is_directory pills_dir then dir
+ else
+ let parent = Filename.dirname dir in
+ if String.equal parent dir then failwith "unable to locate project root containing pills/"
+ else find_project_root parent
+
+let project_root =
+ match Sys.getenv_opt "NEOVERE_ROOT" with
+ | Some root -> root
+ | None ->
+ let exe_dir = Filename.dirname Sys.executable_name in
+ find_project_root exe_dir
+
+let () =
+ Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Pier Boot Test with Event Persistence ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n";
+
+ (* Create pier directory for test *)
+ let pier_path = Filename.concat project_root "test-pier" in
+ Printf.printf "Creating test pier at: %s\n%!" pier_path;
+
+ (* Clean up old pier if it exists *)
+ if Sys.file_exists pier_path then begin
+ Printf.printf "Removing old test pier...\n%!";
+ let _ = Sys.command (Printf.sprintf "rm -rf '%s'" pier_path) in
+ ()
+ end;
+
+ (* Create pier directory *)
+ Unix.mkdir pier_path 0o755;
+
+ (* Create state WITH event logging enabled *)
+ Printf.printf "\n[1] Creating state with event logging enabled...\n%!";
+ let state = State.create ~pier_path () in
+
+ (* Step 1: Boot ivory pill *)
+ Printf.printf "\n[2] Booting ivory.pill...\n%!";
+ let ivory_path = Filename.concat project_root "pills/ivory.pill" in
+ begin match Boot.boot_ivory state ivory_path with
+ | Error (Boot.Invalid_pill msg) ->
+ Printf.printf "✗ Ivory boot failed: %s\n%!" msg;
+ exit 1
+ | Error (Boot.Unsupported msg) ->
+ Printf.printf "✗ Unsupported: %s\n%!" msg;
+ exit 1
+ | Ok () ->
+ Printf.printf "✓ Ivory kernel loaded\n\n%!";
+ end;
+
+ (* Step 2: Boot solid pill events WITH persistence *)
+ Printf.printf "[3] Loading solid.pill events with persistence...\n%!";
+ let solid_path = Filename.concat project_root "pills/solid.pill" in
+
+ (* For testing, let's limit to first 10 events to test persistence *)
+ begin match Boot.boot_solid ~limit:10 state solid_path with
+ | Error (Boot.Invalid_pill msg) ->
+ Printf.printf "✗ Solid boot failed: %s\n%!" msg;
+ exit 1
+ | Error (Boot.Unsupported msg) ->
+ Printf.printf "✗ Unsupported: %s\n%!" msg;
+ exit 1
+ | Ok () ->
+ let eve = State.event_number state in
+ Printf.printf "✓ Solid boot completed (limited)!\n%!";
+ Printf.printf " Events in state: %Ld\n\n%!" eve;
+ end;
+
+ (* Close the LMDB eventlog properly *)
+ Printf.printf "[4] Closing event log...\n%!";
+ State.close_eventlog state;
+ Printf.printf "✓ Event log closed\n\n%!";
+
+ (* Step 3: Check that LMDB files were created *)
+ Printf.printf "[5] Verifying LMDB files were created...\n%!";
+ let log_dir = Filename.concat (Filename.concat pier_path ".urb") "log" in
+ let event_files = Sys.readdir log_dir |> Array.to_list in
+ Printf.printf " Found %d files in %s\n%!" (List.length event_files) log_dir;
+
+ if List.length event_files > 0 then begin
+ Printf.printf " Sample files:\n";
+ List.iter (fun f -> Printf.printf " - %s\n%!" f) (List.filteri (fun i _ -> i < 5) event_files);
+ Printf.printf " ...\n%!";
+ end;
+
+ Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Event Persistence Test SUCCESS! 🎉 ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n";
+
+ Printf.printf "Test pier created at: %s\n" pier_path;
+ Printf.printf "Event log at: %s\n" log_dir;
+ Printf.printf "\nNext steps:\n";
+ Printf.printf " 1. Verify event log files exist\n";
+ Printf.printf " 2. Test event replay on restart\n";
+ Printf.printf " 3. Compare event mugs with Vere\n\n"
diff --git a/ocaml/scripts/test_poke_effects.ml b/ocaml/scripts/test_poke_effects.ml
new file mode 100644
index 0000000..1ec9f1b
--- /dev/null
+++ b/ocaml/scripts/test_poke_effects.ml
@@ -0,0 +1,117 @@
+open Nock_lib
+
+let rec find_project_root dir =
+ let pills_dir = Filename.concat dir "pills" in
+ if Sys.file_exists pills_dir && Sys.is_directory pills_dir then dir
+ else
+ let parent = Filename.dirname dir in
+ if String.equal parent dir then failwith "unable to locate project root containing pills/"
+ else find_project_root parent
+
+let project_root =
+ match Sys.getenv_opt "NEOVERE_ROOT" with
+ | Some root -> root
+ | None ->
+ let exe_dir = Filename.dirname Sys.executable_name in
+ find_project_root exe_dir
+
+(* Count noun list length *)
+let rec count_list = function
+ | Noun.Atom z when Z.equal z Z.zero -> 0
+ | Noun.Cell (_, t) -> 1 + count_list t
+ | _ -> 0
+
+let () =
+ Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Poke & Effects Test ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n";
+
+ let pier_path = Filename.concat project_root "test-pier-poke" in
+ if Sys.file_exists pier_path then begin
+ let _ = Sys.command (Printf.sprintf "rm -rf '%s'" pier_path) in ()
+ end;
+ Unix.mkdir pier_path 0o755;
+
+ Printf.printf "[1] Booting ship...\n%!";
+ let state = State.create ~pier_path () in
+
+ (* Boot ivory + solid *)
+ let ivory_path = Filename.concat project_root "pills/ivory.pill" in
+ let solid_path = Filename.concat project_root "pills/solid.pill" in
+
+ begin match Boot.boot_ivory state ivory_path with
+ | Error _ -> Printf.printf "Ivory boot failed\n"; exit 1
+ | Ok () -> Printf.printf "✓ Ivory loaded\n%!"
+ end;
+
+ begin match Boot.boot_solid_lifecycle state solid_path with
+ | Error _ -> Printf.printf "Solid boot failed\n"; exit 1
+ | Ok () -> Printf.printf "✓ Solid loaded (events: %Ld)\n\n%!" (State.event_number state)
+ end;
+
+ Printf.printf "[2] Testing poke performance...\n\n%!";
+
+ (* Create a simple test event *)
+ let now = Noun.atom (Z.shift_left (Z.of_string "0x8000000cce9e0d80") 64) in
+ let wire = Noun.cell
+ (Noun.atom (Z.of_int (Char.code 'd')))
+ (Noun.cell (Noun.atom_of_string "term")
+ (Noun.cell (Noun.atom (Z.of_int 1)) (Noun.atom Z.zero)))
+ in
+ let belt = Noun.atom_of_string "ret" in
+ let card = Noun.cell (Noun.atom_of_string "belt") belt in
+ let ovum = Noun.cell wire card in
+ let event = Noun.cell now ovum in
+
+ (* Benchmark poke *)
+ let iterations = 100 in
+ Printf.printf "Running %d pokes...\n%!" iterations;
+
+ let start_time = Sys.time () in
+ for i = 1 to iterations do
+ let effects = State.poke state event in
+ (* Just count effects *)
+ let count = count_list effects in
+ if i = 1 then
+ Printf.printf " First poke returned %d effects\n%!" count
+ done;
+ let elapsed = Sys.time () -. start_time in
+
+ Printf.printf "\nPerformance:\n";
+ Printf.printf " Total time: %.3fs\n" elapsed;
+ Printf.printf " Per poke: %.3fms\n" (elapsed *. 1000.0 /. float_of_int iterations);
+ Printf.printf " Pokes/sec: %.0f\n\n" (float_of_int iterations /. elapsed);
+
+ Printf.printf "[3] Examining effects structure...\n\n%!";
+
+ let effects = State.poke state event in
+ Printf.printf "Effects list structure:\n";
+ let rec show_effects depth = function
+ | Noun.Atom z when Z.equal z Z.zero ->
+ Printf.printf "%s~\n" (String.make (depth*2) ' ')
+ | Noun.Cell (h, t) ->
+ Printf.printf "%s[\n" (String.make (depth*2) ' ');
+ (* Show head *)
+ begin match h with
+ | Noun.Cell (wire_h, card_h) ->
+ Printf.printf "%s wire: %s\n" (String.make (depth*2) ' ')
+ (if Noun.is_cell wire_h then "cell" else "atom");
+ Printf.printf "%s card: %s\n" (String.make (depth*2) ' ')
+ (if Noun.is_cell card_h then "cell" else "atom")
+ | _ ->
+ Printf.printf "%s (malformed effect)\n" (String.make (depth*2) ' ')
+ end;
+ Printf.printf "%s]\n" (String.make (depth*2) ' ');
+ show_effects depth t
+ | _ -> Printf.printf "%s(unexpected structure)\n" (String.make (depth*2) ' ')
+ in
+ show_effects 0 effects;
+
+ let effect_count = count_list effects in
+ Printf.printf "\nTotal effects: %d\n\n" effect_count;
+
+ State.close_eventlog state;
+
+ Printf.printf "╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Test Complete! 🎉 ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n"
diff --git a/ocaml/scripts/test_replay.ml b/ocaml/scripts/test_replay.ml
new file mode 100644
index 0000000..3687255
--- /dev/null
+++ b/ocaml/scripts/test_replay.ml
@@ -0,0 +1,78 @@
+open Nock_lib
+
+let rec find_project_root dir =
+ let pills_dir = Filename.concat dir "pills" in
+ if Sys.file_exists pills_dir && Sys.is_directory pills_dir then dir
+ else
+ let parent = Filename.dirname dir in
+ if String.equal parent dir then failwith "unable to locate project root containing pills/"
+ else find_project_root parent
+
+let project_root =
+ match Sys.getenv_opt "NEOVERE_ROOT" with
+ | Some root -> root
+ | None ->
+ let exe_dir = Filename.dirname Sys.executable_name in
+ find_project_root exe_dir
+
+let () =
+ Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Event Replay Test ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n";
+
+ let pier_path = Filename.concat project_root "test-pier" in
+
+ (* Check if pier exists *)
+ if not (Sys.file_exists pier_path) then begin
+ Printf.printf "✗ Test pier not found at: %s\n" pier_path;
+ Printf.printf " Run test_pier_boot.exe first to create it\n";
+ exit 1
+ end;
+
+ Printf.printf "Using test pier at: %s\n\n%!" pier_path;
+
+ (* Step 1: Boot ivory kernel (fresh state, no persistence) *)
+ Printf.printf "[1] Booting fresh ivory kernel...\n%!";
+ let state = State.create () in
+ let ivory_path = Filename.concat project_root "pills/ivory.pill" in
+ begin match Boot.boot_ivory state ivory_path with
+ | Error (Boot.Invalid_pill msg) ->
+ Printf.printf "✗ Ivory boot failed: %s\n%!" msg;
+ exit 1
+ | Error (Boot.Unsupported msg) ->
+ Printf.printf "✗ Unsupported: %s\n%!" msg;
+ exit 1
+ | Ok () ->
+ Printf.printf "✓ Ivory kernel loaded\n\n%!";
+ end;
+
+ (* Step 2: Load eventlog and replay events *)
+ Printf.printf "[2] Creating eventlog handle and replaying events...\n%!";
+ let eventlog = Eventlog.create ~enabled:false pier_path in
+
+ let event_count = ref 0 in
+ let replay_callback num event =
+ incr event_count;
+ if !event_count mod 10 = 0 || !event_count <= 5 then
+ Printf.printf " Replaying event %Ld...\n%!" num;
+ (* Poke the event into the state *)
+ ignore (State.poke state event)
+ in
+
+ Eventlog.replay ~verbose:true eventlog replay_callback;
+
+ let final_eve = State.event_number state in
+ Printf.printf "✓ Replay complete!\n%!";
+ Printf.printf " Events replayed: %d\n%!" !event_count;
+ Printf.printf " Final event number: %Ld\n\n%!" final_eve;
+
+ (* Step 3: Verify we can still poke events *)
+ Printf.printf "[3] Testing state is functional after replay...\n%!";
+ Printf.printf " (State should be able to process new events)\n%!";
+
+ Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Event Replay Test SUCCESS! 🎉 ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n";
+
+ Printf.printf "Replayed %d events from disk\n" !event_count;
+ Printf.printf "State is at event number: %Ld\n\n" final_eve
diff --git a/ocaml/scripts/test_solid_boot.ml b/ocaml/scripts/test_solid_boot.ml
new file mode 100644
index 0000000..06f2380
--- /dev/null
+++ b/ocaml/scripts/test_solid_boot.ml
@@ -0,0 +1,59 @@
+open Nock_lib
+
+let rec find_project_root dir =
+ let pills_dir = Filename.concat dir "pills" in
+ if Sys.file_exists pills_dir && Sys.is_directory pills_dir then dir
+ else
+ let parent = Filename.dirname dir in
+ if String.equal parent dir then failwith "unable to locate project root containing pills/"
+ else find_project_root parent
+
+let project_root =
+ match Sys.getenv_opt "NEOVERE_ROOT" with
+ | Some root -> root
+ | None ->
+ let exe_dir = Filename.dirname Sys.executable_name in
+ find_project_root exe_dir
+
+let () =
+ Printf.printf "\n╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Solid Pill Boot Test ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n";
+
+ (* Create state *)
+ let state = State.create () in
+
+ (* Step 1: Boot ivory pill *)
+ Printf.printf "[1] Booting ivory.pill...\n%!";
+ let ivory_path = Filename.concat project_root "pills/ivory.pill" in
+ begin match Boot.boot_ivory state ivory_path with
+ | Error (Boot.Invalid_pill msg) ->
+ Printf.printf "✗ Ivory boot failed: %s\n%!" msg;
+ exit 1
+ | Error (Boot.Unsupported msg) ->
+ Printf.printf "✗ Unsupported: %s\n%!" msg;
+ exit 1
+ | Ok () ->
+ Printf.printf "✓ Ivory kernel loaded\n\n%!";
+ end;
+
+ (* Step 2: Boot solid pill events *)
+ Printf.printf "[2] Loading solid.pill events...\n%!";
+ let solid_path = Filename.concat project_root "pills/solid.pill" in
+ (* Process all events *)
+ begin match Boot.boot_solid state solid_path with
+ | Error (Boot.Invalid_pill msg) ->
+ Printf.printf "✗ Solid boot failed: %s\n%!" msg;
+ exit 1
+ | Error (Boot.Unsupported msg) ->
+ Printf.printf "✗ Unsupported: %s\n%!" msg;
+ exit 1
+ | Ok () ->
+ let eve = State.event_number state in
+ Printf.printf "✓ Solid boot completed!\n%!";
+ Printf.printf " Events played: %Ld\n\n%!" eve;
+ end;
+
+ Printf.printf "╔═══════════════════════════════════════════════════════╗\n";
+ Printf.printf "║ Solid boot SUCCESS! 🎉 ║\n";
+ Printf.printf "╚═══════════════════════════════════════════════════════╝\n\n"