Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 50s
serialize.sx emits a topo-ordered (id op inputs params commutative) record list that survives write/read (string-keyed node dicts do not; empty inputs read back as nil and are normalized). wire->dag reconstructs a runnable dag by content-id; wire-verify recomputes ids to reject tampering. dag->string/string->dag for text transport. serialize 13/13, total 128/128. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
116 lines
2.8 KiB
Plaintext
116 lines
2.8 KiB
Plaintext
; portable wire form: dag <-> records <-> string, with content-id integrity.
|
|
|
|
(define ser-RT (artdag/op-table-runner {:in (fn (p i) (get p :v)) :add (fn (p i) (+ (nth i 0) (nth i 1))) :inc (fn (p i) (+ 1 (first i)))}))
|
|
|
|
(define
|
|
ser-D
|
|
(artdag/build
|
|
(list
|
|
(list "a" "in" (list) {:v 10})
|
|
(list "b" "inc" (list "a") {})
|
|
(list "c" "add" (list "a" "b") {} true))))
|
|
|
|
(define ser-cid (artdag/dag-id ser-D "c"))
|
|
|
|
; ---- wire form ----
|
|
|
|
(artdag-test
|
|
"wire has one record per node"
|
|
(len (artdag/dag->wire ser-D))
|
|
3)
|
|
|
|
(artdag-test
|
|
"wire records follow topological order"
|
|
(map (fn (rec) (nth rec 0)) (artdag/dag->wire ser-D))
|
|
(artdag/dag-order ser-D))
|
|
|
|
(artdag-test
|
|
"wire record carries the content-id"
|
|
(nth (nth (artdag/dag->wire ser-D) 0) 0)
|
|
(artdag/dag-id ser-D "a"))
|
|
|
|
; ---- reconstruction ----
|
|
|
|
(artdag-test
|
|
"wire->dag restores node count"
|
|
(artdag/node-count (artdag/wire->dag (artdag/dag->wire ser-D)))
|
|
3)
|
|
|
|
(artdag-test
|
|
"wire->dag restores order"
|
|
(artdag/dag-order (artdag/wire->dag (artdag/dag->wire ser-D)))
|
|
(artdag/dag-order ser-D))
|
|
|
|
(artdag-test
|
|
"reconstructed leaf inputs normalize to empty list"
|
|
(artdag/node-inputs
|
|
(artdag/dag-get
|
|
(artdag/wire->dag (artdag/dag->wire ser-D))
|
|
(artdag/dag-id ser-D "a")))
|
|
(list))
|
|
|
|
(artdag-test
|
|
"reconstructed node preserves inputs"
|
|
(artdag/node-inputs
|
|
(artdag/dag-get (artdag/wire->dag (artdag/dag->wire ser-D)) ser-cid))
|
|
(artdag/node-inputs (artdag/dag-get ser-D ser-cid)))
|
|
|
|
(artdag-test
|
|
"reconstructed node id matches recomputed content-id"
|
|
(artdag/content-id
|
|
(artdag/dag-get (artdag/wire->dag (artdag/dag->wire ser-D)) ser-cid))
|
|
ser-cid)
|
|
|
|
; ---- execution equivalence ----
|
|
|
|
(artdag-test
|
|
"reconstructed dag executes to same result"
|
|
(let
|
|
((c1 (persist/open)) (c2 (persist/open)))
|
|
(=
|
|
(artdag/result-of (artdag/run ser-D ser-RT c1) ser-cid)
|
|
(artdag/result-of
|
|
(artdag/run (artdag/wire->dag (artdag/dag->wire ser-D)) ser-RT c2)
|
|
ser-cid)))
|
|
true)
|
|
|
|
(artdag-test
|
|
"string round-trip executes to same result"
|
|
(let
|
|
((cache (persist/open)))
|
|
(artdag/result-of
|
|
(artdag/run
|
|
(artdag/string->dag (artdag/dag->string ser-D))
|
|
ser-RT
|
|
cache)
|
|
ser-cid))
|
|
21)
|
|
|
|
; ---- integrity ----
|
|
|
|
(artdag-test
|
|
"wire-verify accepts a genuine wire form"
|
|
(artdag/wire-verify (artdag/dag->wire ser-D))
|
|
true)
|
|
|
|
(artdag-test
|
|
"wire-verify rejects a tampered id"
|
|
(artdag/wire-verify
|
|
(list (list "node:bogus" "in" (list) {:v 1} false)))
|
|
false)
|
|
|
|
(artdag-test
|
|
"wire-verify rejects mutated params under a stale id"
|
|
(artdag/wire-verify
|
|
(map
|
|
(fn
|
|
(rec)
|
|
(list
|
|
(nth rec 0)
|
|
(nth rec 1)
|
|
(nth rec 2)
|
|
{:v 999}
|
|
(nth rec 4)))
|
|
(artdag/dag->wire ser-D)))
|
|
false)
|