code wiki / _hdl_build / nx_receipt.nx
nx_receipt.nx source
↩ module page · 75 lines · 3673 B
1// nx_receipt.nx -- the SOVEREIGN op ACCEPTANCE/RECEIPT ledger. The operator's "military acceptance + receipt":
2// every sovereign op (deploy, transport, recover, publish, supervise...) appends a durable, tamper-evident
3// RECEIPT of what was done + the verdict, so ANY teammate/workstream can validate orchestration is healthy --
4// the deploy/op "returns and reports a receipt back to the workstream," confirmable by all, not assumed.
5//
6// Schema (TAB, 6 fields): ts <TAB> actor <TAB> op <TAB> target <TAB> verdict <TAB> detail
7// verdict in {ISSUED, ACCEPTED, COMPLETED, REJECTED, FAILED}. NO secrets ever (no passphrase/mnemonic/token).
8// Atomic + concurrent-safe via the proven fa_appendz floor (many op-organs append at once, zero torn rows).
9// Sovereign: composes fa_appendz (store) + slk_* (read/scan). license_tier: ORIGINAL
10import "nx_framed_append.nx"
11import "nx_site_lock_lib.nx"
12const RCPT_MAGIC_1024: i64 = 1024
13
14const RCPT_LEDGER: *u8 = "knowledge/receipts/orchestration.tsv" // workstation-side ledger ALL teammates read
15
16// append ONE receipt to `ledger` (atomic). caller-supplied ts (for determinism in gates). Returns fa_appendz rc.
17func rcpt_emit_to(ledger: *u8, ts: i64, actor: *u8, op: *u8, target: *u8, verdict: *u8, detail: *u8) -> i64 {
18 let cap: i64 = RCPT_MAGIC_1024
19 let rec: *u8 = sys_mmap(cap + 32)
20 var o: i64 = 0
21 o = fa_catn(rec, o, ts); rec[o] = 9 as u8; o = o + 1
22 o = fa_cat(rec, o, actor); rec[o] = 9 as u8; o = o + 1
23 o = fa_cat(rec, o, op); rec[o] = 9 as u8; o = o + 1
24 o = fa_cat(rec, o, target); rec[o] = 9 as u8; o = o + 1
25 o = fa_cat(rec, o, verdict); rec[o] = 9 as u8; o = o + 1
26 o = fa_cat(rec, o, detail)
27 rec[o] = 0 as u8
28 return fa_appendz(ledger, rec, cap)
29}
30// the live emit: real clock -> the canonical workstream ledger. Op-organs call THIS on completion.
31func rcpt_emit(actor: *u8, op: *u8, target: *u8, verdict: *u8, detail: *u8) -> i64 {
32 return rcpt_emit_to(RCPT_LEDGER, sys_now_realtime_sec(), actor, op, target, verdict, detail)
33}
34// leak-free bounded read of a ledger into a REUSED buffer; returns bytes (>=0) or -1.
35func rcpt_read(path: *u8, out: *u8, cap: i64) -> i64 {
36 let fd: i64 = sys_openat_rd(path)
37 if fd < 0 { return 0 - 1 }
38 var total: i64 = 0; var go: i64 = 1
39 while go == 1 {
40 let base: i64 = out as i64
41 let tail: *u8 = (base + total) as *u8
42 let nr: i64 = sys_read(fd, tail, cap - total)
43 if nr <= 0 { go = 0 }
44 if nr > 0 { total = total + nr }
45 if total >= cap { go = 0 }
46 }
47 sys_close(fd)
48 return total
49}
50// count well-formed receipts (a 6th field present => valid row); '#' comment lines + blanks skipped.
51func rcpt_count(buf: *u8, n: i64) -> i64 {
52 let fs: *i64 = sys_mmap(8); let fe: *i64 = sys_mmap(8)
53 var ls: i64 = 0; var c: i64 = 0
54 while ls < n {
55 let le: i64 = slk_line_end(buf, n, ls)
56 if le > ls { if buf[ls] != (35 as u8) { if slk_field(buf, ls, le, 5, fs, fe) == 1 { c = c + 1 } } }
57 ls = le + 1
58 }
59 return c
60}
61// count receipts whose verdict field (index 4) equals `verdict` -- e.g. how many REJECTED/FAILED (health check).
62func rcpt_count_verdict(buf: *u8, n: i64, verdict: *u8, vlen: i64) -> i64 {
63 let fs: *i64 = sys_mmap(8); let fe: *i64 = sys_mmap(8)
64 var ls: i64 = 0; var c: i64 = 0
65 while ls < n {
66 let le: i64 = slk_line_end(buf, n, ls)
67 if le > ls { if buf[ls] != (35 as u8) {
68 if slk_field(buf, ls, le, 4, fs, fe) == 1 {
69 if slk_eq(slk_at(buf, fs[0]), fe[0] - fs[0], verdict, vlen) == 1 { c = c + 1 }
70 }
71 } }
72 ls = le + 1
73 }
74 return c
75}