Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 47s
lib/artdag/post.sx — the artdag-side projection for 'a job is a type of post' (per the
host loop). job->post-object: {:type artdag/job :id <output content-id> :wire <dag->wire>},
post-id = content-id = natural AP object id. post-object-verify binds the id to the payload
(record ids recompute + post id present), rejecting tampered params/bogus ids. String
transport for the feed/SXTP body; post-run lets a peer decode->run->result, content-address
cache-hitting. Activity wrapping stays host-side. post 12/12, total 225/225.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
112 lines
3.1 KiB
Plaintext
112 lines
3.1 KiB
Plaintext
; Forward direction — artdag job as a feed "post object" (per the host loop).
|
|
; A job projects to a content-addressed, self-verifying object suitable as a feed
|
|
; activity :object; a peer decodes, verifies and runs it to the same result.
|
|
|
|
(define po-runner (artdag/op-table-runner {:blur (fn (params inputs) (+ (first inputs) (get params :radius))) :src (fn (params inputs) 0) :over (fn (params inputs) (+ (nth inputs 0) (nth inputs 1)))}))
|
|
|
|
(define
|
|
po-job
|
|
(artdag/build
|
|
(list
|
|
(list "s" "src" (list) {})
|
|
(list "b" "blur" (list "s") {:radius 2})
|
|
(list "c" "blur" (list "s") {:radius 3})
|
|
(list "out" "over" (list "b" "c") {} true))))
|
|
(define po-out-id (artdag/dag-id po-job "out"))
|
|
(define po-post (artdag/job->post-object po-job "out"))
|
|
|
|
(artdag-test
|
|
"post: is a well-formed post object"
|
|
(artdag/post-object? po-post)
|
|
true)
|
|
|
|
(artdag-test "post: type tag is artdag/job" (get po-post :type) "artdag/job")
|
|
|
|
(artdag-test
|
|
"post: post id is the output node's content-id"
|
|
(artdag/post-object-id po-post)
|
|
po-out-id)
|
|
|
|
(artdag-test
|
|
"post: payload is the whole dag (one record per node)"
|
|
(len (artdag/post-object-wire po-post))
|
|
(artdag/node-count po-job))
|
|
|
|
(artdag-test
|
|
"post: verifies (ids intact, output present)"
|
|
(artdag/post-object-verify po-post)
|
|
true)
|
|
|
|
; ---- round-trip: decode reconstructs the job by content-id ----
|
|
|
|
(define po-job2 (artdag/post-object->job po-post))
|
|
|
|
(artdag-test
|
|
"post: decoded job contains the output node by content-id"
|
|
(artdag/member? po-out-id (keys (artdag/dag-nodes po-job2)))
|
|
true)
|
|
|
|
(artdag-test
|
|
"post: decoded job has the same node count"
|
|
(artdag/node-count po-job2)
|
|
(artdag/node-count po-job))
|
|
|
|
; ---- string transport (feed activity / SXTP body) ----
|
|
|
|
(define po-str (artdag/job->post-string po-job "out"))
|
|
(define po-post2 (artdag/post-string->object po-str))
|
|
|
|
(artdag-test
|
|
"post: survives string transport (id preserved)"
|
|
(artdag/post-object-id po-post2)
|
|
po-out-id)
|
|
|
|
(artdag-test
|
|
"post: transported post still verifies"
|
|
(artdag/post-object-verify po-post2)
|
|
true)
|
|
|
|
; ---- a peer runs the received post to the same result ----
|
|
|
|
(define
|
|
po-local-result
|
|
(artdag/result-of (artdag/run po-job po-runner (persist/open)) po-out-id))
|
|
(define po-peer-result (artdag/post-run po-post2 po-runner (persist/open)))
|
|
|
|
(artdag-test
|
|
"post: peer runs the received job to the same result"
|
|
(= po-peer-result po-local-result)
|
|
true)
|
|
|
|
; ---- tamper detection: mutate a param under a stale id ----
|
|
|
|
(define
|
|
po-tampered
|
|
(assoc
|
|
po-post
|
|
:wire (map
|
|
(fn
|
|
(rec)
|
|
(if
|
|
(= (nth rec 1) "blur")
|
|
(list
|
|
(nth rec 0)
|
|
(nth rec 1)
|
|
(nth rec 2)
|
|
{:radius 99}
|
|
(nth rec 4))
|
|
rec))
|
|
(artdag/post-object-wire po-post))))
|
|
|
|
(artdag-test
|
|
"post: tampered payload fails verification"
|
|
(artdag/post-object-verify po-tampered)
|
|
false)
|
|
|
|
; ---- an id not produced by the job fails verification ----
|
|
|
|
(artdag-test
|
|
"post: post id absent from payload fails verification"
|
|
(artdag/post-object-verify (assoc po-post :id "node:bogus"))
|
|
false)
|