summaryrefslogtreecommitdiff
path: root/ocaml/ROADMAP.md
blob: 046b20609d6870f922aec7ac6e1596deff527da7 (plain)
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
as of 20-october 2025 (Effects + Performance benchmarked!)

  ✅ What We Have Built

  Core Runtime:
  - ✅ noun.ml - Noun type system (atom/cell)
  - ✅ nock.ml - Full Nock interpreter (all 12 opcodes)
  - ✅ bitstream.ml - Bit-level I/O (optimized for large atoms)
  - ✅ serial.ml - Jam/cue serialization (iterative, handles 3M+ nouns)
  - ✅ state.ml - State management (event counter, kernel storage, snapshots, eventlog)
  - ✅ boot.ml - Pill loading (ivory + solid with lifecycle formula!)
  - ✅ eventlog_lmdb.ml - LMDB-based event persistence matching Vere

  Working Features:
  - ✅ Ivory pill boot via lifecycle formula (loads Arvo kernel)
  - ✅ Solid pill boot via lifecycle formula (CORRECT approach matching Vere!)
  - ✅ Lifecycle formula [2 [0 3] [0 2]] - batch processes all boot events
  - ✅ Mixed event list structure (bot bare, mod/use timestamped) matching Vere
  - ✅ Event application via poke (for runtime events after boot)
  - ✅ Snapshot/restore capability
  - ✅ Fast cue (~1.5s for 3.2M nouns)
  - ✅ LMDB event persistence - Write events to disk matching Vere exactly
  - ✅ Event replay - Load from disk on restart
  - ✅ Pier directory structure - Create .urb/log/ with LMDB files
  - ✅ Event timestamping - Events wrapped as [timestamp event_data]
  - ✅ Proper eventlog close/sync

  Boot Process (Matching Vere Exactly!):
  - ✅ Parse solid pill: [%pill %solid bot mod use]
  - ✅ Add 4 system events to mod (wack, whom, verb, wyrd)
  - ✅ Add boot event to use
  - ✅ Build mixed event list: bot (bare) + mod/use (timestamped)
  - ✅ Run lifecycle formula on full list: [2 [0 3] [0 2]]
  - ✅ Extract kernel from slot 7 of result
  - ✅ Boot complete with working Arvo kernel!

  LMDB Event Log Implementation (Matches Vere!):
  - ✅ Two databases: "EVENTS" (uint64 → bytes) and "META" (string → bytes)
  - ✅ 1TB map size (0x10000000000, matches Vere's default)
  - ✅ Event format: 4-byte murmur3 mug + jammed noun (matches Vere exactly)
  - ✅ Tested with 10 events (13MB total LMDB database)
  - ✅ Handles massive events: 8.6MB (3.2M+ nodes), 4.1MB events work perfectly
  - ✅ Uses MDB_INTEGERKEY for efficient uint64 event number indexing
  - ✅ Proper transaction handling for atomicity

  Event Timestamping:
  - Events wrapped as [timestamp event_data] like Vere
  - Urbit time: 128-bit atom (seconds + fractional seconds)
  - Each event increments by 2^48 (~15.26 microseconds, 1/2^16 seconds)
  - Matches Vere's time format exactly (verified with python script) <- huh? what's python to do with anything

  🚀 What's Needed to Boot a Real Ship

  Phase 1: Effects & I/O (CRITICAL - Need this first!)
  ════════════════════════════════════════════════════
  The runtime is solid. We can boot pills, run Nock, persist events.
  What's missing: Arvo returns EFFECTS that need to be executed!

  1. ❌ Effects Processing - Parse and dispatch effects from poke results
     - Effects are returned as the head of [effects new-kernel]
     - Need to route to appropriate I/O drivers (Dill, Ames, Eyre, etc.)
     - This is THE critical missing piece!

  2. ❌ Terminal I/O (Dill driver) - FIRST I/O DRIVER TO IMPLEMENT
     - Handle %blit effects (print to terminal)
     - Handle %belt events (keyboard input from terminal)
     - Parse and render ANSI/styled text
     - This will let us SEE the ship boot and INTERACT with it!

  3. ❌ Event Loop - Main loop to process events and effects
     - Read input (keyboard, network, HTTP)
     - Send to Arvo via poke
     - Process returned effects
     - Route effects to I/O drivers
     - Persist events to LMDB

  Phase 2: Full Connectivity
  ════════════════════════════════════════════════════
  4. ❌ HTTP I/O (Eyre driver) - Web interface
     - Handle HTTP requests
     - Serve web interface (Landscape)
     - WebSocket connections for live updates

  5. ❌ Networking (Ames driver) - Ship-to-ship communication
     - UDP networking for peer-to-peer
     - Packet routing and encryption
     - NAT traversal

  Phase 3: Production Features
  ════════════════════════════════════════════════════
  6. ❌ Metadata persistence - Save ship identity in LMDB META database
  7. ❌ Event replay on startup - Boot from existing pier
  8. ❌ Jets - Performance optimizations for hot paths
  9. ❌ Snapshot system - Periodic kernel snapshots to speed up replay
  10. ❌ Crash recovery - Handle corrupted state gracefully

  🎯 IMMEDIATE NEXT STEPS TO BOOT:
  ════════════════════════════════════════════════════
  1. Parse effects from poke results
  2. Implement basic Dill driver (%blit for output, %belt for input)
  3. Create event loop that:
     - Boots solid pill (DONE - we can do this!)
     - Processes terminal input as %belt events
     - Sends to Arvo via poke
     - Displays %blit effects to terminal
  4. Test: Can we type commands and see responses?

  Once Dill works, we have an INTERACTIVE URBIT SHIP! 🎉