1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
|
(* Boot - Arvo Kernel Boot System
*
* This module handles:
* - Loading pill files (jammed Arvo kernels)
* - Parsing pill structure
* - Initial boot sequence
*
* Pill Structure:
* - A pill is a jammed noun containing the Arvo kernel
* - Format varies, but typically: [kernel-gate initial-state]
* - Or just the kernel-gate itself
*)
(* Boot error *)
type error =
| FileNotFound of string
| InvalidPill of string
| BootFailed of string
(* Pill type *)
type pill = {
kernel: Noun.noun; (* The Arvo kernel gate *)
boot_ova: Noun.noun list; (* Initial events to process *)
}
(* Load pill from file using Eio
*
* Steps:
* 1. Read jammed pill file
* 2. Cue to get kernel noun
* 3. Parse pill structure
*)
let load_pill ~fs pill_path =
try
Printf.printf "[Boot] Loading pill from %s...\n%!" pill_path;
(* Read pill file *)
let file_path = Eio.Path.(fs / pill_path) in
let pill_bytes = Eio.Path.load file_path |> Bytes.of_string in
Printf.printf "[Boot] Pill file: %d bytes (%.1f MB)\n%!"
(Bytes.length pill_bytes)
(float_of_int (Bytes.length pill_bytes) /. 1024.0 /. 1024.0);
Printf.printf "[Boot] Cuing pill (this may take a while)...\n%!";
let start = Unix.gettimeofday () in
(* Cue the pill to get kernel noun *)
let kernel_noun = Serial.cue pill_bytes in
let elapsed = Unix.gettimeofday () -. start in
Printf.printf "[Boot] Pill cued successfully in %.2f seconds\n%!" elapsed;
(* For now, treat the entire pill as the kernel
* In a real implementation, we'd parse the structure:
* - Check if it's a cell with [kernel boot-events]
* - Or just a single kernel gate
*)
Ok {
kernel = kernel_noun;
boot_ova = []; (* No boot events for now *)
}
with
| Sys_error msg ->
Error (FileNotFound msg)
| e ->
Error (InvalidPill (Printexc.to_string e))
(* Create a minimal fake pill for testing
*
* This creates a trivial kernel that's just an atom.
* In reality, the kernel is a huge compiled gate, but for
* testing we can use this simple version.
*)
let fake_pill () = {
kernel = Noun.atom 0; (* Minimal kernel - just 0 *)
boot_ova = [];
}
(* Boot Arvo from a pill
*
* Steps:
* 1. Set kernel state to pill's kernel
* 2. Process boot events if any
* 3. Initialize event counter to 0
*)
let boot_from_pill state pill =
Printf.printf "[Boot] Initializing Arvo kernel...\n%!";
(* Set kernel state *)
State.boot state pill.kernel;
(* Process boot events if any *)
List.iteri (fun i _ovum ->
Printf.printf "[Boot] Processing boot event %d\n%!" i;
(* In real implementation: State.poke state ovum *)
) pill.boot_ova;
Printf.printf "[Boot] ✓ Arvo kernel booted!\n%!";
Ok ()
(* Boot from pill file - convenience function *)
let boot_from_file ~fs state pill_path =
match load_pill ~fs pill_path with
| Error err ->
let msg = match err with
| FileNotFound s -> "File not found: " ^ s
| InvalidPill s -> "Invalid pill: " ^ s
| BootFailed s -> "Boot failed: " ^ s
in
Printf.printf "[Boot] Error: %s\n%!" msg;
Error msg
| Ok pill ->
boot_from_pill state pill
(* Create minimal boot for testing (no pill file needed) *)
let boot_fake state =
Printf.printf "[Boot] Creating fake minimal kernel...\n%!";
let pill = fake_pill () in
boot_from_pill state pill
(* u3v_life: Execute lifecycle formula to produce Arvo kernel
*
* From C Vere vortex.c:26:
* u3_noun lyf = u3nt(2, u3nc(0, 3), u3nc(0, 2)); // [2 [0 3] [0 2]]
* u3_noun gat = u3n_nock_on(eve, lyf);
* u3_noun cor = u3k(u3x_at(7, gat));
*
* The lifecycle formula [2 [0 3] [0 2]] means:
* - [0 2] gets slot 2 (head of list) = first event or formula
* - [0 3] gets slot 3 (tail of list) = rest of events
* - [2 formula subject] = nock(subject formula)
* - So this is: nock(tail head) = nock(rest-of-events first-event)
*
* CRITICAL: This formula expects a specific list structure!
* The first item should be a FORMULA, and the rest should be events to process.
*
* KEY INSIGHT from running C Vere:
* - When booting with `-B solid.pill`, Vere FIRST boots an embedded ivory pill
* - The ivory pill is booted with eve = null (empty list)!
* - THEN it processes the solid pill's events separately via poke
*
* So u3v_life() is used TWICE:
* 1. On ivory pill with null/empty event list → produces initial kernel
* 2. On solid pill's bot events → produces updated kernel
*)
let life eve =
try
(* Build lifecycle formula: [2 [0 3] [0 2]] *)
let lyf = Noun.cell (Noun.atom 2)
(Noun.cell
(Noun.cell (Noun.atom 0) (Noun.atom 3))
(Noun.cell (Noun.atom 0) (Noun.atom 2))) in
Printf.printf "[Boot] Running lifecycle formula [2 [0 3] [0 2]]...\n%!";
(* Check if eve is null (for ivory pill boot) *)
let is_null = match eve with
| Noun.Atom z when Z.equal z Z.zero -> true
| _ -> false
in
if is_null then
Printf.printf "[Boot] Lifecycle on NULL event list (ivory pill)\n%!"
else begin
(* Debug: check what's in slot 2 and slot 3 *)
(try
let slot2 = Noun.slot (Z.of_int 2) eve in
let slot3 = Noun.slot (Z.of_int 3) eve in
Printf.printf "[Boot] Slot 2: %s\n%!"
(if Noun.is_cell slot2 then "cell" else "atom");
Printf.printf "[Boot] Slot 3: %s\n%!"
(if Noun.is_cell slot3 then "cell" else "atom");
with _ -> ())
end;
(* Run lifecycle formula *)
let gat =
try
Nock.nock_on eve lyf
with e ->
Printf.printf "[Boot] ✗ Nock failed during lifecycle: %s\n%!"
(Printexc.to_string e);
raise e
in
Printf.printf "[Boot] ✓ Lifecycle formula completed\n%!";
(* Extract slot 7 (the kernel) from resulting gate *)
let cor =
try
Noun.slot (Z.of_int 7) gat
with e ->
Printf.printf "[Boot] ✗ Failed to extract slot 7: %s\n%!"
(Printexc.to_string e);
raise e
in
Printf.printf "[Boot] ✓ Extracted kernel from slot 7\n%!";
cor
with e ->
Printf.printf "[Boot] ✗ u3v_life failed: %s\n%!" (Printexc.to_string e);
raise e
(* u3v_boot: Full boot sequence with event counting
*
* From C Vere vortex.c:39:
* - Counts events in the list
* - Calls u3v_life() safely
* - Stores result in u3A->roc (global kernel state)
* - Updates event counter u3A->eve_d
*)
let boot state eve_list =
(* Count events *)
let rec count_events acc noun =
match noun with
| Noun.Atom _ -> acc
| Noun.Cell (_, rest) -> count_events (acc + 1) rest
in
let event_count = count_events 0 eve_list in
Printf.printf "[Boot] Booting with %d events\n%!" event_count;
try
(* Call u3v_life to produce kernel *)
let kernel = life eve_list in
(* Store in state *)
State.boot state kernel;
Printf.printf "[Boot] ✓ Boot complete!\n%!";
Ok ()
with e ->
Error ("Boot failed: " ^ Printexc.to_string e)
(* Boot from ivory pill - the lightweight boot sequence
*
* Ivory pills have structure: ["ivory" core]
* The core contains a lifecycle formula that must be executed
*)
let boot_ivory ~fs state pill_path =
Printf.printf "[Boot] Booting from ivory pill...\n%!";
match load_pill ~fs pill_path with
| Error err ->
let msg = match err with
| FileNotFound s -> "File not found: " ^ s
| InvalidPill s -> "Invalid pill: " ^ s
| BootFailed s -> "Boot failed: " ^ s
in
Printf.printf "[Boot] Error: %s\n%!" msg;
Error msg
| Ok pill ->
(* Check if pill has ivory tag *)
if not (Noun.is_cell pill.kernel) then
Error "Ivory pill must be a cell"
else begin
let hed = Noun.head pill.kernel in
let tal = Noun.tail pill.kernel in
(* Check for "ivory" tag *)
(* "ivory" as cord (little-endian): 0x79726f7669 = 521610950249 *)
let ivory_tag = Z.of_string "521610950249" in
match hed with
| Noun.Atom z when Z.equal z ivory_tag ->
Printf.printf "[Boot] ✓ Found ivory tag\n%!";
Printf.printf "[Boot] Running lifecycle formula...\n%!";
(try
let start = Unix.gettimeofday () in
let core = life tal in
let elapsed = Unix.gettimeofday () -. start in
Printf.printf "[Boot] ✓ Lifecycle completed in %.4fs\n%!" elapsed;
Printf.printf "[Boot] Setting Arvo core...\n%!";
State.boot state core;
Printf.printf "[Boot] ✓ Ivory pill booted!\n%!";
Ok ()
with e ->
Error ("Lifecycle failed: " ^ Printexc.to_string e))
| _ ->
Printf.printf "[Boot] Warning: No ivory tag found, trying regular boot...\n%!";
boot_from_pill state pill
end
|