code wiki / _hdl_build / nx_wiki_versioned_publish_gate.nx
nx_wiki_versioned_publish_gate.nx
buildroot/runtime/_hdl_build/nx_wiki_versioned_publish_gate.nx
about
nx_wiki_versioned_publish_gate.nx -- TEETH for A4a (versioned-publish + multi-point rollback).
HERMETIC: a fresh per-run archive/index store prefix in /tmp; EVERY publish/restore uses do_push_flag=0
so the gate NEVER touches the network/vault/SSH -- but it DOES exercise the archive + version-index +
restore BYTE-PATH fully (read blob back by CID, write to a local file, re-read). No fake-green: exit 0
iff every assertion passes; a PASS line is appended to knowledge/status/ only on all-pass.
WHAT IS PROVEN (each asserts EXACT bytes/identities, not merely "ok"):
C1 publish v1,v2,v3 (3 DISTINCT contents) -> each vpub returns VP_OK and assigns v#=1,2,3.
C2 MULTI-POINT: vp_list(slug) returns exactly 3 retained rollback points with 3 DISTINCT CIDs
(not just the latest) -- the core "MULTIPLE rollback points" guarantee.
C3 restore -> v1 yields the EXACT v1 bytes (byte-for-byte) live-staged.
C4 restore -> the MIDDLE v2 yields the EXACT v2 bytes (proves rollback to ANY point, not just last).
C5 restore -> an unknown v# (99) is REFUSED (VR_NOT_FOUND) and push is NOT invoked (fail-closed).
C6 APPEND-ONLY: after v2 AND v3 were published, v1's retained record (its CID and the bytes that CID
resolves to) is BYTE-IDENTICAL to what it was right after v1 -- a new publish never mutates/deletes
an older version.
C7 the 3 distinct contents are pairwise distinct (sanity: distinct CIDs require distinct bytes).
license_tier: ORIGINAL
dependencies 3 imports · 0 importers
imports: nx_wiki_versioned_publish.nxnx_wiki_restore.nxnx_syscalls.nx
imported by: nobody (leaf or entry point)
call flow from main pre-order; caps 40 nodes / depth 6 declared; ↻ = already shown
structs
| none |
consts
| none |
functions
| 24 | func g_w(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } |
| 25 | func g_num(v: i64) -> i64 |
| 33 | func g_cat(dst: *u8, off: i64, s: *u8) -> i64 { var o: i64 = off; var k: i64 = 0; while s[k] != (0 as u8) { dst[o] = s[k]; o = o + 1; k = k + 1 } return o } |
| 34 | func g_catnum(dst: *u8, off: i64, v: i64) -> i64 |
| 40 | func g_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } called by 1: main |
| 43 | func g_byteq(a: *u8, an: i64, b: *u8, bn: i64) -> i64 called by 1: main |
| 50 | func g_streq(a: *u8, b: *u8) -> i64 called by 1: main |
| 61 | func g_stage(path: *u8, buf: *u8, n: i64) -> i64 |
| 70 | func g_row(id: i64, ok: i64, what: *u8) -> i64 |
| 79 | func g_build_page(buf: *u8, marker: *u8, goodcid: *u8) -> i64 |
| 91 | func main() -> i64 |