code wiki / _hdl_build / nx_worklog_lib.nx
nx_worklog_lib.nx source
↩ module page · 34 lines · 1918 B
1// nx_worklog_lib.nx -- LIVE WORK-JOURNAL primitive (the "running logs of our work, as it goes").
2// ONE framed, flock-atomic, crash-durable line per action, built on the WMS-R0 fa_appendz floor
3// (one-buffer-one-locked-write -> a concurrent appender can NEVER tear a line). This is the
4// sovereign capture layer: invoked per-action by a silent PostToolUse hook, AND by the redundant
5// transcript ingestor -- both write through THIS, so all paths share one durable, append-only log.
6// Line schema (TAB-separated): <epoch>\t<event>\t<tool>\t<target>
7// event = pre|post|ingest|turn tool = Edit|Write|Bash|... target = file/command/summary
8// Sovereign: nx_framed_append + nx_syscalls only. license_tier: ORIGINAL
9import "nx_framed_append.nx"
10import "nx_syscalls.nx"
11
12const WL_DIR: *u8 = "/mnt/c/Users/elder/.claude/projects/C--Users-elder/memory/worklog"
13const WL_PATH: *u8 = "/mnt/c/Users/elder/.claude/projects/C--Users-elder/memory/worklog/worklog.tsv"
14const WL_CAP: i64 = 8192 // bounded record size (fa_appendz cap)
15
16// deterministic core (epoch injected) -> gateable without a wall-clock. returns fa_appendz rc.
17func wl_append3_t(path: *u8, epoch: i64, event: *u8, tool: *u8, target: *u8) -> i64 {
18 let buf: *u8 = sys_mmap(WL_CAP + 64)
19 var o: i64 = 0
20 o = fa_catn(buf, o, epoch)
21 buf[o] = 9 as u8; o = o + 1; o = fa_cat(buf, o, event)
22 buf[o] = 9 as u8; o = o + 1; o = fa_cat(buf, o, tool)
23 buf[o] = 9 as u8; o = o + 1; o = fa_cat(buf, o, target)
24 buf[o] = 0 as u8
25 return fa_appendz(path, buf, WL_CAP)
26}
27
28// live variant: stamps the hardware clock now (sys_now_realtime_sec).
29func wl_append3(path: *u8, event: *u8, tool: *u8, target: *u8) -> i64 {
30 return wl_append3_t(path, sys_now_realtime_sec(), event, tool, target)
31}
32
33// ensure the journal directory exists (idempotent; ignores EEXIST).
34func wl_ensure_dir(dir: *u8) -> i64 { sys_mkdir(dir, 511); return 0 }