From 65a744c07f28a1fee1139f09be160579e3a24201 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 3 Jun 2026 21:39:53 +0000 Subject: [PATCH 01/15] chore: stop tracking generated build artifacts; ignore Zig 0.11 cache The tests/*/build directories (Idris2 .ttc/.ttm + compiled executables and Chez .ss output) were committed despite .gitignore already ignoring build/. Untrack them and add **/zig-cache/ (Zig 0.11's cache dir uses no leading dot, so the existing **/.zig-cache/ rule missed it). --- .gitignore | 1 + tests/A2ML/build/exec/a2ml-tests | 15 - .../build/exec/a2ml-tests_app/a2ml-tests.ss | 892 ----------------- .../build/exec/a2ml-tests_app/compileChez | 1 - .../A2ML/build/ttc/2025081600/ParserTests.ttc | Bin 185634 -> 0 bytes .../A2ML/build/ttc/2025081600/ParserTests.ttm | Bin 61828 -> 0 bytes .../integration/build/exec/integration-tests | 15 - .../exec/integration-tests_app/compileChez | 1 - .../integration-tests.ss | 940 ------------------ .../build/ttc/2025081600/IntegrationTests.ttc | Bin 340255 -> 0 bytes .../build/ttc/2025081600/IntegrationTests.ttm | Bin 120846 -> 0 bytes tests/property/build/exec/property-tests | 15 - .../build/exec/property-tests_app/compileChez | 1 - .../exec/property-tests_app/property-tests.ss | 870 ---------------- .../build/ttc/2025081600/PropertyTests.ttc | Bin 490896 -> 0 bytes .../build/ttc/2025081600/PropertyTests.ttm | Bin 216746 -> 0 bytes 16 files changed, 1 insertion(+), 2750 deletions(-) delete mode 100755 tests/A2ML/build/exec/a2ml-tests delete mode 100755 tests/A2ML/build/exec/a2ml-tests_app/a2ml-tests.ss delete mode 100755 tests/A2ML/build/exec/a2ml-tests_app/compileChez delete mode 100644 tests/A2ML/build/ttc/2025081600/ParserTests.ttc delete mode 100644 tests/A2ML/build/ttc/2025081600/ParserTests.ttm delete mode 100755 tests/integration/build/exec/integration-tests delete mode 100755 tests/integration/build/exec/integration-tests_app/compileChez delete mode 100755 tests/integration/build/exec/integration-tests_app/integration-tests.ss delete mode 100644 tests/integration/build/ttc/2025081600/IntegrationTests.ttc delete mode 100644 tests/integration/build/ttc/2025081600/IntegrationTests.ttm delete mode 100755 tests/property/build/exec/property-tests delete mode 100755 tests/property/build/exec/property-tests_app/compileChez delete mode 100755 tests/property/build/exec/property-tests_app/property-tests.ss delete mode 100644 tests/property/build/ttc/2025081600/PropertyTests.ttc delete mode 100644 tests/property/build/ttc/2025081600/PropertyTests.ttm diff --git a/.gitignore b/.gitignore index 00bbfd0..4874f93 100644 --- a/.gitignore +++ b/.gitignore @@ -80,6 +80,7 @@ htmlcov/ # Zig **/zig-out/ +**/zig-cache/ **/.zig-cache/ # Shared libraries diff --git a/tests/A2ML/build/exec/a2ml-tests b/tests/A2ML/build/exec/a2ml-tests deleted file mode 100755 index 91f7e68..0000000 --- a/tests/A2ML/build/exec/a2ml-tests +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -# @generated by Idris 0.8.0-712523a89, Chez backend - -set -e # exit on any error - -if [ "$(uname)" = Darwin ]; then - DIR=$(zsh -c 'printf %s "$0:A:h"' "$0") -else - DIR=$(dirname "$(readlink -f -- "$0")") -fi -export LD_LIBRARY_PATH="$DIR/a2ml-tests_app:$LD_LIBRARY_PATH" -export DYLD_LIBRARY_PATH="$DIR/a2ml-tests_app:$DYLD_LIBRARY_PATH" -export IDRIS2_INC_SRC="$DIR/a2ml-tests_app" - -"$DIR/a2ml-tests_app/a2ml-tests.so" "$@" \ No newline at end of file diff --git a/tests/A2ML/build/exec/a2ml-tests_app/a2ml-tests.ss b/tests/A2ML/build/exec/a2ml-tests_app/a2ml-tests.ss deleted file mode 100755 index c5ead33..0000000 --- a/tests/A2ML/build/exec/a2ml-tests_app/a2ml-tests.ss +++ /dev/null @@ -1,892 +0,0 @@ -#!/home/hyper/.local/share/../bin/scheme --program - -;; @generated by Idris 0.8.0-712523a89, Chez backend -(import (chezscheme)) -(case (machine-type) - [(i3fb ti3fb a6fb ta6fb) #f] - [(i3le ti3le a6le ta6le tarm64le) - (with-exception-handler (lambda(x) (load-shared-object "libc.so")) - (lambda () (load-shared-object "libc.so.6")))] - [(i3osx ti3osx a6osx ta6osx tarm64osx tppc32osx tppc64osx) (load-shared-object "libc.dylib")] - [(i3nt ti3nt a6nt ta6nt) (load-shared-object "msvcrt.dll")] - [else (load-shared-object "libc.so")]) - -(load-shared-object "libidris2_support.so") - -(let () -#!chezscheme - -(define (blodwen-os) - (case (machine-type) - [(i3le ti3le a6le ta6le tarm64le) "unix"] ; GNU/Linux - [(i3ob ti3ob a6ob ta6ob tarm64ob) "unix"] ; OpenBSD - [(i3fb ti3fb a6fb ta6fb tarm64fb) "unix"] ; FreeBSD - [(i3nb ti3nb a6nb ta6nb tarm64nb) "unix"] ; NetBSD - [(i3osx ti3osx a6osx ta6osx tarm64osx tppc32osx tppc64osx) "darwin"] - [(i3nt ti3nt a6nt ta6nt tarm64nt) "windows"] - [else "unknown"])) - -(define blodwen-lazy - (lambda (f) - (let ([evaluated #f] [res void]) - (lambda () - (if (not evaluated) - (begin (set! evaluated #t) - (set! res (f)) - (set! f void)) - (void)) - res)))) - -(define (blodwen-delay-lazy f) - (weak-cons #!bwp f)) - -(define (blodwen-force-lazy e) - (let ((exval (car e))) - (if (bwp-object? exval) - (let ((val ((cdr e)))) - (begin (set-car! e val) val)) - exval))) - -(define (blodwen-toSignedInt x bits) - (if (logbit? bits x) - (logor x (ash -1 bits)) - (logand x (sub1 (ash 1 bits))))) - -(define (blodwen-toUnsignedInt x bits) - (logand x (sub1 (ash 1 bits)))) - -(define (blodwen-euclidDiv a b) - (let ((q (quotient a b)) - (r (remainder a b))) - (if (< r 0) - (if (> b 0) (- q 1) (+ q 1)) - q))) - -(define (blodwen-euclidMod a b) - (let ((r (remainder a b))) - (if (< r 0) - (if (> b 0) (+ r b) (- r b)) - r))) - -; flonum constants - -(define (blodwen-calcFlonumUnitRoundoff) - (let loop [(uro 1.0)] - (if (fl= 1.0 (fl+ 1.0 uro)) - uro - (loop (fl/ uro 2.0))))) - -(define (blodwen-calcFlonumEpsilon) - (fl* (blodwen-calcFlonumUnitRoundoff) 2.0)) - -(define (blodwen-flonumNaN) - +nan.0) - -(define (blodwen-flonumInf) - +inf.0) - -; Bits - -(define bu+ (lambda (x y bits) (blodwen-toUnsignedInt (+ x y) bits))) -(define bu- (lambda (x y bits) (blodwen-toUnsignedInt (- x y) bits))) -(define bu* (lambda (x y bits) (blodwen-toUnsignedInt (* x y) bits))) -(define bu/ (lambda (x y bits) (blodwen-toUnsignedInt (quotient x y) bits))) - -(define bs+ (lambda (x y bits) (blodwen-toSignedInt (+ x y) bits))) -(define bs- (lambda (x y bits) (blodwen-toSignedInt (- x y) bits))) -(define bs* (lambda (x y bits) (blodwen-toSignedInt (* x y) bits))) -(define bs/ (lambda (x y bits) (blodwen-toSignedInt (blodwen-euclidDiv x y) bits))) - -(define (integer->bits8 x) (logand x (sub1 (ash 1 8)))) -(define (integer->bits16 x) (logand x (sub1 (ash 1 16)))) -(define (integer->bits32 x) (logand x (sub1 (ash 1 32)))) -(define (integer->bits64 x) (logand x (sub1 (ash 1 64)))) - -(define (bits16->bits8 x) (logand x (sub1 (ash 1 8)))) -(define (bits32->bits8 x) (logand x (sub1 (ash 1 8)))) -(define (bits64->bits8 x) (logand x (sub1 (ash 1 8)))) -(define (bits32->bits16 x) (logand x (sub1 (ash 1 16)))) -(define (bits64->bits16 x) (logand x (sub1 (ash 1 16)))) -(define (bits64->bits32 x) (logand x (sub1 (ash 1 32)))) - -(define (blodwen-bits-shl-signed x y bits) (blodwen-toSignedInt (ash x y) bits)) - -(define (blodwen-bits-shl x y bits) (logand (ash x y) (sub1 (ash 1 bits)))) - -(define blodwen-shl (lambda (x y) (ash x y))) -(define blodwen-shr (lambda (x y) (ash x (- y)))) -(define blodwen-and (lambda (x y) (logand x y))) -(define blodwen-or (lambda (x y) (logor x y))) -(define blodwen-xor (lambda (x y) (logxor x y))) - -(define cast-num - (lambda (x) - (if (number? x) x 0))) -(define destroy-prefix - (lambda (x) - (cond - ((equal? x "") "") - ((equal? (string-ref x 0) #\#) "") - (else x)))) - -(define exact-floor - (lambda (x) - (inexact->exact (floor x)))) - -(define exact-truncate - (lambda (x) - (inexact->exact (truncate x)))) - -(define exact-truncate-boundedInt - (lambda (x y) - (blodwen-toSignedInt (exact-truncate x) y))) - -(define exact-truncate-boundedUInt - (lambda (x y) - (blodwen-toUnsignedInt (exact-truncate x) y))) - -(define cast-char-boundedInt - (lambda (x y) - (blodwen-toSignedInt (char->integer x) y))) - -(define cast-char-boundedUInt - (lambda (x y) - (blodwen-toUnsignedInt (char->integer x) y))) - -(define cast-string-int - (lambda (x) - (exact-truncate (cast-num (string->number (destroy-prefix x)))))) - -(define cast-string-boundedInt - (lambda (x y) - (blodwen-toSignedInt (cast-string-int x) y))) - -(define cast-string-boundedUInt - (lambda (x y) - (blodwen-toUnsignedInt (cast-string-int x) y))) - -(define cast-int-char - (lambda (x) - (if (or - (and (>= x 0) (<= x #xd7ff)) - (and (>= x #xe000) (<= x #x10ffff))) - (integer->char x) - (integer->char 0)))) - -(define cast-string-double - (lambda (x) - (exact->inexact (cast-num (string->number (destroy-prefix x)))))) - - -(define (string-concat xs) (apply string-append xs)) -(define (string-unpack s) (string->list s)) -(define (string-pack xs) (list->string xs)) - -(define string-cons (lambda (x y) (string-append (string x) y))) -(define string-reverse (lambda (x) - (list->string (reverse (string->list x))))) -(define (string-substr off len s) - (let* ((l (string-length s)) - (b (max 0 off)) - (x (max 0 len)) - (end (min l (+ b x)))) - (if (> b l) - "" - (substring s b end)))) - -(define (blodwen-string-iterator-new s) - 0) - -(define (blodwen-string-iterator-to-string _ s ofs f) - (f (substring s ofs (string-length s)))) - -(define (blodwen-string-iterator-next s ofs) - (if (>= ofs (string-length s)) - '() ; EOF - (cons (string-ref s ofs) (+ ofs 1)))) - -(define either-left - (lambda (x) - (vector 0 x))) - -(define either-right - (lambda (x) - (vector 1 x))) - -(define blodwen-error-quit - (lambda (msg) - (display msg) - (newline) - (exit 1))) - -(define (blodwen-get-line p) - (if (port? p) - (let ((str (get-line p))) - (if (eof-object? str) - "" - str)) - void)) - -(define (blodwen-get-char p) - (if (port? p) - (let ((chr (get-char p))) - (if (eof-object? chr) - #\nul - chr)) - void)) - -;; Buffers - -(define (blodwen-new-buffer size) - (make-bytevector size 0)) - -(define (blodwen-buffer-size buf) - (bytevector-length buf)) - -(define (blodwen-buffer-setbyte buf loc val) - (bytevector-u8-set! buf loc val)) - -(define (blodwen-buffer-getbyte buf loc) - (bytevector-u8-ref buf loc)) - -(define (blodwen-buffer-setbits16 buf loc val) - (bytevector-u16-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getbits16 buf loc) - (bytevector-u16-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setbits32 buf loc val) - (bytevector-u32-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getbits32 buf loc) - (bytevector-u32-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setbits64 buf loc val) - (bytevector-u64-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getbits64 buf loc) - (bytevector-u64-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setint8 buf loc val) - (bytevector-s8-set! buf loc val)) - -(define (blodwen-buffer-getint8 buf loc) - (bytevector-s8-ref buf loc)) - -(define (blodwen-buffer-setint16 buf loc val) - (bytevector-s16-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getint16 buf loc) - (bytevector-s16-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setint32 buf loc val) - (bytevector-s32-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getint32 buf loc) - (bytevector-s32-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setint buf loc val) - (bytevector-s64-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getint buf loc) - (bytevector-s64-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setint64 buf loc val) - (bytevector-s64-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getint64 buf loc) - (bytevector-s64-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setdouble buf loc val) - (bytevector-ieee-double-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getdouble buf loc) - (bytevector-ieee-double-ref buf loc (native-endianness))) - -(define (blodwen-stringbytelen str) - (bytevector-length (string->utf8 str))) - -(define (blodwen-buffer-setstring buf loc val) - (let* [(strvec (string->utf8 val)) - (len (bytevector-length strvec))] - (bytevector-copy! strvec 0 buf loc len))) - -(define (blodwen-buffer-getstring buf loc len) - (let [(newvec (make-bytevector len))] - (bytevector-copy! buf loc newvec 0 len) - (utf8->string newvec))) - -(define (blodwen-buffer-copydata buf start len dest loc) - (bytevector-copy! buf start dest loc len)) - -;; Threads - -(define-record thread-handle (semaphore)) - -(define (blodwen-thread proc) - (let [(sema (blodwen-make-semaphore 0))] - (fork-thread (lambda () (proc (vector 0)) (blodwen-semaphore-post sema))) - (make-thread-handle sema) - )) - -(define (blodwen-thread-wait handle) - (blodwen-semaphore-wait (thread-handle-semaphore handle))) - -;; Thread mailboxes - -(define blodwen-thread-data - (make-thread-parameter #f)) - -(define (blodwen-get-thread-data ty) - (blodwen-thread-data)) - -(define (blodwen-set-thread-data ty a) - (blodwen-thread-data a)) - -;; Semaphore - -(define-record semaphore (box mutex condition)) - -(define (blodwen-make-semaphore init) - (make-semaphore (box init) (make-mutex) (make-condition))) - -(define (blodwen-semaphore-post sema) - (with-mutex (semaphore-mutex sema) - (let [(sema-box (semaphore-box sema))] - (set-box! sema-box (+ (unbox sema-box) 1)) - (condition-signal (semaphore-condition sema)) - ))) - -(define (blodwen-semaphore-wait sema) - (with-mutex (semaphore-mutex sema) - (let [(sema-box (semaphore-box sema))] - (when (= (unbox sema-box) 0) - (condition-wait (semaphore-condition sema) (semaphore-mutex sema))) - (set-box! sema-box (- (unbox sema-box) 1)) - ))) - -;; Barrier - -(define-record barrier (count-box num-threads mutex cond)) - -(define (blodwen-make-barrier num-threads) - (make-barrier (box 0) num-threads (make-mutex) (make-condition))) - -(define (blodwen-barrier-wait barrier) - (let [(count-box (barrier-count-box barrier)) - (num-threads (barrier-num-threads barrier)) - (mutex (barrier-mutex barrier)) - (condition (barrier-cond barrier))] - (with-mutex mutex - (let* [(count-old (unbox count-box)) - (count-new (+ count-old 1))] - (set-box! count-box count-new) - (if (= count-new num-threads) - (condition-broadcast condition) - (condition-wait condition mutex)) - )))) - -;; Channel -; With thanks to Alain Zscheile (@zseri) for help with understanding condition -; variables, and figuring out where the problems were and how to solve them. - -(define-record channel (read-mut read-cv read-box val-cv val-box)) - -(define (blodwen-make-channel ty) - (make-channel - (make-mutex) - (make-condition) - (box #t) - (make-condition) - (box '()) - )) - -; block on the read status using read-cv until the value has been read -(define (channel-put-while-helper chan) - (let ([read-mut (channel-read-mut chan)] - [read-box (channel-read-box chan)] - [read-cv (channel-read-cv chan)] - ) - (if (unbox read-box) - (void) ; val has been read, so everything is fine - (begin ; otherwise, block/spin with cv - (condition-wait read-cv read-mut) - (channel-put-while-helper chan) - ) - ))) - -(define (blodwen-channel-put ty chan val) - (with-mutex (channel-read-mut chan) - (channel-put-while-helper chan) - (let ([read-box (channel-read-box chan)] - [val-box (channel-val-box chan)] - ) - (set-box! val-box val) - (set-box! read-box #f) - )) - (condition-signal (channel-val-cv chan)) - ) - -; block on the value until it has been set -(define (channel-get-while-helper chan) - (let ([read-mut (channel-read-mut chan)] - [read-box (channel-read-box chan)] - [val-cv (channel-val-cv chan)] - ) - (if (unbox read-box) - (begin - (condition-wait val-cv read-mut) - (channel-get-while-helper chan) - ) - (void) - ))) - -(define (blodwen-channel-get ty chan) - (mutex-acquire (channel-read-mut chan)) - (channel-get-while-helper chan) - (let* ([val-box (channel-val-box chan)] - [read-box (channel-read-box chan)] - [read-cv (channel-read-cv chan)] - [the-val (unbox val-box)] - ) - (set-box! val-box '()) - (set-box! read-box #t) - (mutex-release (channel-read-mut chan)) - (condition-signal read-cv) - the-val)) - -(define (blodwen-channel-get-non-blocking ty chan) - (if (mutex-acquire (channel-read-mut chan) #f) - (let* ([val-box (channel-val-box chan)] - [read-box (channel-read-box chan)] - [read-cv (channel-read-cv chan)] - [the-val (unbox val-box)] - ) - (if (null? the-val) - (begin - (mutex-release (channel-read-mut chan)) - '()) - (begin - (set-box! val-box '()) - (set-box! read-box #t) - (mutex-release (channel-read-mut chan)) - (condition-signal read-cv) - (box the-val)) - )) - '())) - -(define (blodwen-channel-get-with-timeout ty chan timeout) - ;; timeout is in milliseconds, convert to nanoseconds - (let* ([timeout-ns (* timeout 1000000)] - [sleep-ns 10000] ; 10 us step - [sleep-time (make-time 'time-duration (mod sleep-ns 1000000000) - (div sleep-ns 1000000000))]) - (let loop ([elapsed 0]) - (if (mutex-acquire (channel-read-mut chan) #f) - (let* ([val-box (channel-val-box chan)] - [the-val (unbox val-box)]) - (if (null? the-val) - (if (>= elapsed timeout-ns) - (begin - (mutex-release (channel-read-mut chan)) - '()) - (begin - (mutex-release (channel-read-mut chan)) - (sleep sleep-time) - (loop (+ elapsed sleep-ns)))) - (let* ([read-box (channel-read-box chan)] - [read-cv (channel-read-cv chan)]) - (set-box! val-box '()) - (set-box! read-box #t) - (mutex-release (channel-read-mut chan)) - (condition-signal read-cv) - (box the-val)))) - (begin - (sleep sleep-time) - (loop (+ elapsed sleep-ns))))))) - -;; Mutex - -(define (blodwen-make-mutex) - (make-mutex)) -(define (blodwen-mutex-acquire mutex) - (mutex-acquire mutex)) -(define (blodwen-mutex-release mutex) - (mutex-release mutex)) - -;; Condition variable - -(define (blodwen-make-condition) - (make-condition)) -(define (blodwen-condition-wait condition mutex) - (condition-wait condition mutex)) -(define (blodwen-condition-wait-timeout condition mutex timeout) - (let* [(sec (div timeout 1000000)) - (micro (mod timeout 1000000))] - (condition-wait condition mutex (make-time 'time-duration (* 1000 micro) sec)))) -(define (blodwen-condition-signal condition) - (condition-signal condition)) -(define (blodwen-condition-broadcast condition) - (condition-broadcast condition)) - -;; Future - -(define-record future-internal (result ready mutex signal)) -(define (blodwen-make-future ty work) - (let ([future (make-future-internal #f #f (make-mutex) (make-condition))]) - (fork-thread (lambda () - (let ([result (work '())]) - (with-mutex (future-internal-mutex future) - (set-future-internal-result! future result) - (set-future-internal-ready! future #t) - (condition-broadcast (future-internal-signal future)))))) - future)) -(define (blodwen-await-future ty future) - (let ([mutex (future-internal-mutex future)]) - (with-mutex mutex - (if (not (future-internal-ready future)) - (condition-wait (future-internal-signal future) mutex)) - (future-internal-result future)))) - -(define (blodwen-sleep s) (sleep (make-time 'time-duration 0 s))) -(define (blodwen-usleep s) - (let ((sec (div s 1000000)) - (micro (mod s 1000000))) - (sleep (make-time 'time-duration (* 1000 micro) sec)))) - -(define (blodwen-clock-time-utc) (current-time 'time-utc)) -(define (blodwen-clock-time-monotonic) (current-time 'time-monotonic)) -(define (blodwen-clock-time-duration) (current-time 'time-duration)) -(define (blodwen-clock-time-process) (current-time 'time-process)) -(define (blodwen-clock-time-thread) (current-time 'time-thread)) -(define (blodwen-clock-time-gccpu) (current-time 'time-collector-cpu)) -(define (blodwen-clock-time-gcreal) (current-time 'time-collector-real)) -(define (blodwen-is-time? clk) (if (time? clk) 1 0)) -(define (blodwen-clock-second time) (time-second time)) -(define (blodwen-clock-nanosecond time) (time-nanosecond time)) - -(define (blodwen-arg-count) - (length (command-line))) - -(define (blodwen-arg n) - (if (< n (length (command-line))) (list-ref (command-line) n) "")) - -(define (blodwen-hasenv var) - (if (eq? (getenv var) #f) 0 1)) - -;; Randoms -(define random-seed-register 0) -(define (initialize-random-seed-once) - (if (= (virtual-register random-seed-register) 0) - (let ([seed (time-nanosecond (current-time))]) - (set-virtual-register! random-seed-register seed) - (random-seed seed)))) - -(define (blodwen-random-seed seed) - (set-virtual-register! random-seed-register seed) - (random-seed seed)) -(define blodwen-random - (case-lambda - ;; no argument, pick a real value from [0, 1.0) - [() (begin - (initialize-random-seed-once) - (random 1.0))] - ;; single argument k, pick an integral value from [0, k) - [(k) - (begin - (initialize-random-seed-once) - (if (> k 0) - (random k) - (assertion-violationf 'blodwen-random "invalid range argument ~a" k)))])) - -;; For finalisers - -(define blodwen-finaliser (make-guardian)) -(define (blodwen-register-object obj proc) - (let [(x (cons obj proc))] - (blodwen-finaliser x) - x)) -(define blodwen-run-finalisers - (lambda () - (let run () - (let ([x (blodwen-finaliser)]) - (when x - (((cdr x) (car x)) 'erased) - (run)))))) - -;; For creating and reading back scheme objects - -; read a scheme string and evaluate it, returning 'Just result' on success -; TODO: catch exception! -(define (blodwen-eval-scheme str) - (guard - (x [#t '()]) ; Nothing on failure - (box (eval (read (open-input-string str))))) - ); box == Just - -(define (blodwen-eval-okay obj) - (if (null? obj) - 0 - 1)) - -(define (blodwen-get-eval-result obj) - (unbox obj)) - -(define (blodwen-debug-scheme obj) - (display obj) (newline)) - -(define (blodwen-is-number obj) - (if (number? obj) 1 0)) - -(define (blodwen-is-integer obj) - (if (and (number? obj) (exact? obj)) 1 0)) - -(define (blodwen-is-float obj) - (if (flonum? obj) 1 0)) - -(define (blodwen-is-char obj) - (if (char? obj) 1 0)) - -(define (blodwen-is-string obj) - (if (string? obj) 1 0)) - -(define (blodwen-is-procedure obj) - (if (procedure? obj) 1 0)) - -(define (blodwen-is-symbol obj) - (if (symbol? obj) 1 0)) - -(define (blodwen-is-vector obj) - (if (vector? obj) 1 0)) - -(define (blodwen-is-nil obj) - (if (null? obj) 1 0)) - -(define (blodwen-is-pair obj) - (if (pair? obj) 1 0)) - -(define (blodwen-is-box obj) - (if (box? obj) 1 0)) - -(define (blodwen-make-symbol str) - (string->symbol str)) - -; The below rely on checking that the objects are the right type first. - -(define (blodwen-vector-ref obj i) - (vector-ref obj i)) - -(define (blodwen-vector-length obj) - (vector-length obj)) - -(define (blodwen-vector-list obj) - (vector->list obj)) - -(define (blodwen-unbox obj) - (unbox obj)) - -(define (blodwen-apply obj arg) - (obj arg)) - -(define (blodwen-force obj) - (obj)) - -(define (blodwen-read-symbol sym) - (symbol->string sym)) - -(define (blodwen-id x) x) -(define PreludeC-45Types-fastUnpack (lambda (farg-0) (string-unpack farg-0))) -(define PreludeC-45Types-fastPack (lambda (farg-0) (string-pack farg-0))) -(define PreludeC-45Types-fastConcat (lambda (farg-0) (string-concat farg-0))) -(define PreludeC-45IO-prim__putStr (lambda (farg-0 farg-1) ((foreign-procedure "idris2_putStr" (string) void) farg-0))) -(define PreludeC-45EqOrd-u--C-61C-61_Eq_String (lambda (arg-0 arg-1) (let ((sc0 (or (and (string=? arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45EqOrd-u--C-47C-61_Eq_String (lambda (arg-0 arg-1) (let ((sc0 (PreludeC-45EqOrd-u--C-61C-61_Eq_String arg-0 arg-1))) (cond ((equal? sc0 1) 0) (else 1))))) -(define PreludeC-45Types-getAt (lambda (arg-1 arg-2) (cond ((equal? arg-1 0) (if (null? arg-2) '() (let ((e-3 (car arg-2))) (box e-3))))(else (let ((e-1 (- arg-1 1))) (if (null? arg-2) '() (let ((e-7 (cdr arg-2))) (PreludeC-45Types-getAt e-1 e-7)))))))) -(define PreludeC-45EqOrd-u--C-60C-61_Ord_Char (lambda (arg-0 arg-1) (let ((sc0 (or (and (char<=? arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45EqOrd-u--C-62C-61_Ord_Char (lambda (arg-0 arg-1) (let ((sc0 (or (and (char>=? arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45Types-isDigit (lambda (arg-0) (let ((sc0 (PreludeC-45EqOrd-u--C-62C-61_Ord_Char arg-0 #\0))) (cond ((equal? sc0 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char arg-0 #\9)) (else 0))))) -(define PreludeC-45Types-prim__integerToNat (lambda (arg-0) (let ((sc0 (or (and (<= 0 arg-0) 1) 0))) (cond ((equal? sc0 0) 0)(else arg-0))))) -(define PreludeC-45Show-firstCharIs (lambda (arg-0 arg-1) (cond ((equal? arg-1 "") 0)(else (arg-0 (string-ref arg-1 0)))))) -(define PreludeC-45Show-protectEsc (lambda (arg-0 arg-1 arg-2) (string-append arg-1 (string-append (let ((sc0 (PreludeC-45Show-firstCharIs arg-0 arg-2))) (cond ((equal? sc0 1) "\\&") (else ""))) arg-2)))) -(define PreludeC-45EqOrd-u--C-61C-61_Eq_Char (lambda (arg-0 arg-1) (let ((sc0 (or (and (char=? arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45EqOrd-u--C-62_Ord_Char (lambda (arg-0 arg-1) (let ((sc0 (or (and (char>? arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45Show-showParens (lambda (arg-0 arg-1) (cond ((equal? arg-0 0) arg-1) (else (string-append "(" (string-append arg-1 ")")))))) -(define PreludeC-45EqOrd-u--C-61C-61_Eq_Ordering (lambda (arg-0 arg-1) (cond ((equal? arg-0 0) (cond ((equal? arg-1 0) 1)(else 0))) ((equal? arg-0 1) (cond ((equal? arg-1 1) 1)(else 0))) ((equal? arg-0 2) (cond ((equal? arg-1 2) 1)(else 0)))(else 0)))) -(define PreludeC-45EqOrd-u--C-47C-61_Eq_Ordering (lambda (arg-0 arg-1) (let ((sc0 (PreludeC-45EqOrd-u--C-61C-61_Eq_Ordering arg-0 arg-1))) (cond ((equal? sc0 1) 0) (else 1))))) -(define PreludeC-45Show-precCon (lambda (arg-0) (case (vector-ref arg-0 0) ((0) 0) ((1) 1) ((2) 2) ((3) 3) ((4) 4) ((5) 5) (else 6)))) -(define PreludeC-45EqOrd-u--C-60_Ord_Integer (lambda (arg-0 arg-1) (let ((sc0 (or (and (< arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45EqOrd-u--C-61C-61_Eq_Integer (lambda (arg-0 arg-1) (let ((sc0 (or (and (= arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45EqOrd-u--compare_Ord_Integer (lambda (arg-0 arg-1) (let ((sc0 (PreludeC-45EqOrd-u--C-60_Ord_Integer arg-0 arg-1))) (cond ((equal? sc0 1) 0) (else (let ((sc1 (PreludeC-45EqOrd-u--C-61C-61_Eq_Integer arg-0 arg-1))) (cond ((equal? sc1 1) 1) (else 2)))))))) -(define PreludeC-45Show-u--compare_Ord_Prec (lambda (arg-0 arg-1) (case (vector-ref arg-0 0) ((4) (let ((e-0 (vector-ref arg-0 1))) (case (vector-ref arg-1 0) ((4) (let ((e-1 (vector-ref arg-1 1))) (PreludeC-45EqOrd-u--compare_Ord_Integer e-0 e-1)))(else (PreludeC-45EqOrd-u--compare_Ord_Integer (PreludeC-45Show-precCon arg-0) (PreludeC-45Show-precCon arg-1))))))(else (PreludeC-45EqOrd-u--compare_Ord_Integer (PreludeC-45Show-precCon arg-0) (PreludeC-45Show-precCon arg-1)))))) -(define PreludeC-45Show-u--C-62C-61_Ord_Prec (lambda (arg-0 arg-1) (PreludeC-45EqOrd-u--C-47C-61_Eq_Ordering (PreludeC-45Show-u--compare_Ord_Prec arg-0 arg-1) 0))) -(define PreludeC-45Show-primNumShow (lambda (arg-1 arg-2 arg-3) (let ((u--str (arg-1 arg-3))) (PreludeC-45Show-showParens (let ((sc0 (PreludeC-45Show-u--C-62C-61_Ord_Prec arg-2 (vector 5 )))) (cond ((equal? sc0 1) (PreludeC-45Show-firstCharIs (lambda (arg-0) (PreludeC-45EqOrd-u--C-61C-61_Eq_Char arg-0 #\-)) u--str)) (else 0))) u--str)))) -(define PreludeC-45Show-u--showPrec_Show_Int (lambda (ext-0 ext-1) (PreludeC-45Show-primNumShow (lambda (eta-0) (number->string eta-0)) ext-0 ext-1))) -(define PreludeC-45Show-u--show_Show_Int (lambda (arg-0) (PreludeC-45Show-u--showPrec_Show_Int (vector 0 ) arg-0))) -(define PreludeC-45Show-n--2434-11880-u--asciiTab (lambda (arg-0) (cons "NUL" (cons "SOH" (cons "STX" (cons "ETX" (cons "EOT" (cons "ENQ" (cons "ACK" (cons "BEL" (cons "BS" (cons "HT" (cons "LF" (cons "VT" (cons "FF" (cons "CR" (cons "SO" (cons "SI" (cons "DLE" (cons "DC1" (cons "DC2" (cons "DC3" (cons "DC4" (cons "NAK" (cons "SYN" (cons "ETB" (cons "CAN" (cons "EM" (cons "SUB" (cons "ESC" (cons "FS" (cons "GS" (cons "RS" (cons "US" '())))))))))))))))))))))))))))))))))) -(define PreludeC-45Show-showLitChar (lambda (arg-0) (cond ((equal? arg-0 (integer->char 7)) (lambda (arg-1) (string-append "\\a" arg-1))) ((equal? arg-0 (integer->char 8)) (lambda (arg-1) (string-append "\\b" arg-1))) ((equal? arg-0 (integer->char 12)) (lambda (arg-1) (string-append "\\f" arg-1))) ((equal? arg-0 (integer->char 10)) (lambda (arg-1) (string-append "\\n" arg-1))) ((equal? arg-0 (integer->char 13)) (lambda (arg-1) (string-append "\\r" arg-1))) ((equal? arg-0 (integer->char 9)) (lambda (arg-1) (string-append "\\t" arg-1))) ((equal? arg-0 (integer->char 11)) (lambda (arg-1) (string-append "\\v" arg-1))) ((equal? arg-0 (integer->char 14)) (lambda (eta-0) (PreludeC-45Show-protectEsc (lambda (arg-1) (PreludeC-45EqOrd-u--C-61C-61_Eq_Char arg-1 #\H)) "\\SO" eta-0))) ((equal? arg-0 (integer->char 127)) (lambda (arg-1) (string-append "\\DEL" arg-1))) ((equal? arg-0 #\\) (lambda (arg-1) (string-append "\\\\" arg-1)))(else (lambda (clam-0) (let ((sc0 (PreludeC-45Types-getAt (PreludeC-45Types-prim__integerToNat (char->integer arg-0)) (PreludeC-45Show-n--2434-11880-u--asciiTab arg-0)))) (if (null? sc0) (let ((sc1 (PreludeC-45EqOrd-u--C-62_Ord_Char arg-0 (integer->char 127)))) (cond ((equal? sc1 1) (string-cons #\\ (PreludeC-45Show-protectEsc (lambda (eta-0) (PreludeC-45Types-isDigit eta-0)) (PreludeC-45Show-u--show_Show_Int (cast-char-boundedInt arg-0 63)) clam-0))) (else (string-cons arg-0 clam-0)))) (let ((e-1 (unbox sc0))) (string-cons #\\ (string-append e-1 clam-0)))))))))) -(define PreludeC-45Show-showLitString (lambda (arg-0) (lambda (clam-0) (if (null? arg-0) clam-0 (let ((e-2 (car arg-0))) (let ((e-3 (cdr arg-0))) (cond ((equal? e-2 #\") (string-append "\\\"" ((PreludeC-45Show-showLitString e-3) clam-0)))(else ((PreludeC-45Show-showLitChar e-2) ((PreludeC-45Show-showLitString e-3) clam-0)))))))))) -(define PreludeC-45Show-u--show_Show_String (lambda (arg-0) (string-cons #\" ((PreludeC-45Show-showLitString (PreludeC-45Types-fastUnpack arg-0)) "\"")))) -(define PreludeC-45Show-u--showPrec_Show_String (lambda (arg-0 arg-1) (PreludeC-45Show-u--show_Show_String arg-1))) -(define csegen-5 (cons (cons (lambda (arg-712) (lambda (arg-715) (PreludeC-45EqOrd-u--C-61C-61_Eq_String arg-712 arg-715))) (lambda (arg-722) (lambda (arg-725) (PreludeC-45EqOrd-u--C-47C-61_Eq_String arg-722 arg-725)))) (cons (lambda (u--x) (PreludeC-45Show-u--show_Show_String u--x)) (lambda (u--d) (lambda (u--x) (PreludeC-45Show-u--showPrec_Show_String u--d u--x)))))) -(define csegen-21 (cons (lambda (arg-8497) (lambda (arg-8500) (string-append arg-8497 arg-8500))) "")) -(define OchranceC-45A2MLC-45Lexer-u--C-61C-61_Eq_Token (lambda (arg-0 arg-1) (case (vector-ref arg-0 0) ((0) (case (vector-ref arg-1 0) ((0) 1)(else 0))) ((1) (case (vector-ref arg-1 0) ((1) 1)(else 0))) ((2) (case (vector-ref arg-1 0) ((2) 1)(else 0))) ((3) (case (vector-ref arg-1 0) ((3) 1)(else 0))) ((4) (case (vector-ref arg-1 0) ((4) 1)(else 0))) ((5) (case (vector-ref arg-1 0) ((5) 1)(else 0))) ((6) (case (vector-ref arg-1 0) ((6) 1)(else 0))) ((7) (case (vector-ref arg-1 0) ((7) 1)(else 0))) ((8) (let ((e-0 (vector-ref arg-0 1))) (case (vector-ref arg-1 0) ((8) (let ((e-5 (vector-ref arg-1 1))) (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-0 e-5)))(else 0)))) ((9) (let ((e-1 (vector-ref arg-0 1))) (case (vector-ref arg-1 0) ((9) (let ((e-6 (vector-ref arg-1 1))) (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-1 e-6)))(else 0)))) ((10) (let ((e-2 (vector-ref arg-0 1))) (case (vector-ref arg-1 0) ((10) (let ((e-7 (vector-ref arg-1 1))) (PreludeC-45EqOrd-u--C-61C-61_Eq_Integer e-2 e-7)))(else 0)))) ((11) (let ((e-3 (vector-ref arg-0 1))) (let ((e-4 (vector-ref arg-0 2))) (case (vector-ref arg-1 0) ((11) (let ((e-8 (vector-ref arg-1 1))) (let ((e-9 (vector-ref arg-1 2))) (let ((sc2 (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-3 e-8))) (cond ((equal? sc2 1) (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-4 e-9)) (else 0))))))(else 0))))) ((12) (case (vector-ref arg-1 0) ((12) 1)(else 0)))(else 0)))) -(define OchranceC-45A2MLC-45Lexer-u--C-47C-61_Eq_Token (lambda (arg-0 arg-1) (let ((sc0 (OchranceC-45A2MLC-45Lexer-u--C-61C-61_Eq_Token arg-0 arg-1))) (cond ((equal? sc0 1) 0) (else 1))))) -(define csegen-30 (cons (lambda (arg-712) (lambda (arg-715) (OchranceC-45A2MLC-45Lexer-u--C-61C-61_Eq_Token arg-712 arg-715))) (lambda (arg-722) (lambda (arg-725) (OchranceC-45A2MLC-45Lexer-u--C-47C-61_Eq_Token arg-722 arg-725))))) -(define PreludeC-45Show-u--showPrec_Show_Integer (lambda (ext-0 ext-1) (PreludeC-45Show-primNumShow (lambda (eta-0) (number->string eta-0)) ext-0 ext-1))) -(define PreludeC-45Show-u--show_Show_Integer (lambda (arg-0) (PreludeC-45Show-u--showPrec_Show_Integer (vector 0 ) arg-0))) -(define OchranceC-45A2MLC-45Lexer-u--show_Show_Token (lambda (arg-0) (case (vector-ref arg-0 0) ((0) "MANIFEST") ((1) "REFS") ((2) "ATTESTATION") ((3) "POLICY") ((4) "LBRACE") ((5) "RBRACE") ((6) "COLON") ((7) "EQUALS") ((8) (let ((e-0 (vector-ref arg-0 1))) (string-append "IDENT(" (string-append e-0 ")")))) ((9) (let ((e-1 (vector-ref arg-0 1))) (string-append "STRING(\"" (string-append e-1 "\")")))) ((10) (let ((e-2 (vector-ref arg-0 1))) (string-append "NUMBER(" (string-append (PreludeC-45Show-u--show_Show_Integer e-2) ")")))) ((11) (let ((e-3 (vector-ref arg-0 1))) (let ((e-4 (vector-ref arg-0 2))) (string-append "HASH(" (string-append e-3 (string-append ":" (string-append e-4 ")"))))))) (else "EOF")))) -(define csegen-35 (cons (lambda (u--x) (OchranceC-45A2MLC-45Lexer-u--show_Show_Token u--x)) (lambda (u--d) (lambda (u--x) (OchranceC-45A2MLC-45Lexer-u--show_Show_Token u--x))))) -(define csegen-90 (vector (lambda (arg-5919) (lambda (arg-5922) (+ arg-5919 arg-5922))) (lambda (arg-5929) (lambda (arg-5932) (* arg-5929 arg-5932))) (lambda (arg-5939) arg-5939))) -(define u--prim__sub_Integer (lambda (arg-0 arg-1) (- arg-0 arg-1))) -(define OchranceC-45A2MLC-45Parser-expectToken (lambda (arg-0 arg-1) (let ((e-0 (car arg-1))) (let ((e-1 (cdr arg-1))) (if (null? e-0) (vector 0 (vector 4 (string-append "expected " (OchranceC-45A2MLC-45Lexer-u--show_Show_Token arg-0)))) (let ((e-4 (car e-0))) (let ((e-5 (cdr e-0))) (let ((sc2 (OchranceC-45A2MLC-45Lexer-u--C-61C-61_Eq_Token e-4 arg-0))) (cond ((equal? sc2 1) (vector 1 (cons e-5 (+ e-1 1)))) (else (vector 0 (vector 0 (OchranceC-45A2MLC-45Lexer-u--show_Show_Token arg-0) e-4 e-1)))))))))))) -(define OchranceC-45A2MLC-45Parser-parseField (lambda (arg-0) (let ((e-0 (car arg-0))) (let ((e-1 (cdr arg-0))) (if (null? e-0) (vector 0 (vector 4 "field assignment")) (let ((e-4 (car e-0))) (let ((e-5 (cdr e-0))) (case (vector-ref e-4 0) ((8) (let ((e-6 (vector-ref e-4 1))) (if (null? e-5) (vector 0 (vector 0 "IDENT = STRING" e-4 e-1)) (let ((e-8 (car e-5))) (let ((e-9 (cdr e-5))) (case (vector-ref e-8 0) ((7) (if (null? e-9) (vector 0 (vector 0 "IDENT = STRING" e-4 e-1)) (let ((e-11 (car e-9))) (let ((e-12 (cdr e-9))) (case (vector-ref e-11 0) ((9) (let ((e-13 (vector-ref e-11 1))) (vector 1 (cons e-6 (cons e-13 (cons e-12 (+ e-1 3)))))))(else (vector 0 (vector 0 "IDENT = STRING" e-4 e-1))))))))(else (vector 0 (vector 0 "IDENT = STRING" e-4 e-1)))))))))(else (vector 0 (vector 0 "IDENT = STRING" e-4 e-1))))))))))) -(define OchranceC-45A2MLC-45Parser-peek (lambda (arg-0) (let ((e-0 (car arg-0))) (if (null? e-0) '() (let ((e-4 (car e-0))) (box e-4)))))) -(define PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (lambda (arg-3 arg-4) (case (vector-ref arg-3 0) ((0) (let ((e-2 (vector-ref arg-3 1))) (vector 0 e-2))) (else (let ((e-5 (vector-ref arg-3 1))) (arg-4 e-5)))))) -(define OchranceC-45A2MLC-45Parser-n--3263-10733-u--unless (lambda (arg-0 arg-1 arg-2) (cond ((equal? arg-1 1) arg-2) (else (vector 1 'erased))))) -(define OchranceC-45A2MLC-45Parser-advance (lambda (arg-0) (let ((e-0 (car arg-0))) (let ((e-1 (cdr arg-0))) (if (null? e-0) (cons '() e-1) (let ((e-5 (cdr e-0))) (cons e-5 (+ e-1 1)))))))) -(define OchranceC-45A2MLC-45Parser-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32caseC-32blockC-32inC-32parseManifestBody-10911 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5 arg-6 arg-7 arg-8 arg-9) (case (vector-ref arg-9 0) ((1) (let ((e-2 (vector-ref arg-9 1))) (let ((e-9 (cdr e-2))) (let ((e-12 (car e-9))) (let ((e-13 (cdr e-9))) (let ((sc3 (OchranceC-45A2MLC-45Parser-expectToken (vector 5 ) e-13))) (case (vector-ref sc3 0) ((1) (let ((e-3 (vector-ref sc3 1))) (let ((u--manifest (vector arg-2 arg-6 (box e-12)))) (lambda () (vector 1 (cons u--manifest e-3)))))) (else (let ((e-5 (vector-ref sc3 1))) (lambda () (vector 0 e-5))))))))))) (else (let ((e-5 (vector-ref arg-9 1))) (lambda () (vector 0 e-5))))))) -(define OchranceC-45A2MLC-45Parser-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32parseManifestBody-10849 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5 arg-6 arg-7 arg-8 arg-9) (if (null? arg-9) (lambda () (vector 0 (vector 4 "manifest body"))) (let ((e-1 (unbox arg-9))) (case (vector-ref e-1 0) ((5) (let ((u--manifest (vector arg-2 arg-6 '()))) (lambda () (vector 1 (cons u--manifest (OchranceC-45A2MLC-45Parser-advance arg-7)))))) ((8) (let ((e-3 (vector-ref e-1 1))) (cond ((equal? e-3 "timestamp") (OchranceC-45A2MLC-45Parser-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32caseC-32blockC-32inC-32parseManifestBody-10911 arg-0 arg-1 arg-2 arg-3 arg-4 arg-5 arg-6 arg-7 arg-8 (OchranceC-45A2MLC-45Parser-parseField arg-7)))(else (lambda () (vector 0 (vector 0 "RBRACE or timestamp" e-1 (let ((e-2 (cdr arg-7))) e-2))))))))(else (lambda () (vector 0 (vector 0 "RBRACE or timestamp" e-1 (let ((e-2 (cdr arg-7))) e-2)))))))))) -(define OchranceC-45A2MLC-45Parser-parseManifestBody (lambda (arg-0) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseField arg-0) (lambda (_-0) (let ((e-2 (car _-0))) (let ((e-3 (cdr _-0))) (let ((e-6 (car e-3))) (let ((e-7 (cdr e-3))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-n--3263-10733-u--unless arg-0 (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-2 "version") (vector 0 (vector 3 "manifest" e-2 "expected 'version' field" (let ((e-1 (cdr arg-0))) e-1)))) (lambda (_-10677) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseField e-7) (lambda (_-1) (let ((_-2 (cons e-2 (cons e-6 e-7)))) (let ((e-5 (car _-1))) (let ((e-4 (cdr _-1))) (let ((e-9 (car e-4))) (let ((e-8 (cdr e-4))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-n--3263-10733-u--unless arg-0 (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-5 "subsystem") (vector 0 (vector 3 "manifest" e-5 "expected 'subsystem' field" (let ((e-1 (cdr e-8))) e-1)))) (lambda (_-10678) ((let ((_-3 (cons e-5 (cons e-9 e-8)))) (OchranceC-45A2MLC-45Parser-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32parseManifestBody-10849 arg-0 e-2 e-6 e-7 _-2 e-5 e-9 e-8 _-3 (OchranceC-45A2MLC-45Parser-peek e-8))))))))))))))))))))))) -(define OchranceC-45A2MLC-45Parser-n--3849-11254-u--unless (lambda (arg-0 arg-1 arg-2) (cond ((equal? arg-1 1) arg-2) (else (vector 1 'erased))))) -(define OchranceC-45A2MLC-45Parser-parseOptionalAttestation (lambda (arg-0) (let ((sc0 (OchranceC-45A2MLC-45Parser-peek arg-0))) (if (null? sc0) (vector 1 (cons '() arg-0)) (let ((e-1 (unbox sc0))) (case (vector-ref e-1 0) ((2) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 2 ) arg-0) (lambda (u--st1) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 4 ) u--st1) (lambda (u--st2) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseField u--st2) (lambda (_-0) (let ((e-2 (car _-0))) (let ((e-3 (cdr _-0))) (let ((e-6 (car e-3))) (let ((e-7 (cdr e-3))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-n--3849-11254-u--unless arg-0 (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-2 "witness") (vector 0 (vector 3 "attestation" e-2 "expected 'witness' field" (let ((e-4 (cdr arg-0))) e-4)))) (lambda (_-10677) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseField e-7) (lambda (_-1) (let ((e-5 (car _-1))) (let ((e-4 (cdr _-1))) (let ((e-9 (car e-4))) (let ((e-8 (cdr e-4))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-n--3849-11254-u--unless arg-0 (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-5 "signature") (vector 0 (vector 3 "attestation" e-5 "expected 'signature' field" (let ((e-10 (cdr arg-0))) e-10)))) (lambda (_-10678) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseField e-8) (lambda (_-2) (let ((e-11 (car _-2))) (let ((e-10 (cdr _-2))) (let ((e-13 (car e-10))) (let ((e-12 (cdr e-10))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-n--3849-11254-u--unless arg-0 (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-11 "pubkey") (vector 0 (vector 3 "attestation" e-11 "expected 'pubkey' field" (let ((e-14 (cdr arg-0))) e-14)))) (lambda (_-10679) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 5 ) e-12) (lambda (u--st6) (let ((u--attestation (vector e-6 e-9 e-13))) (vector 1 (cons (box u--attestation) u--st6))))))))))))))))))))))))))))))))))(else (vector 1 (cons '() arg-0))))))))) -(define OchranceC-45A2MLC-45Parser-parseVerificationMode (lambda (arg-0) (cond ((equal? arg-0 "lax") (box 0)) ((equal? arg-0 "checked") (box 1)) ((equal? arg-0 "attested") (box 2))(else '())))) -(define OchranceC-45A2MLC-45Parser-parseBoolField (lambda (arg-0) (let ((e-0 (car arg-0))) (let ((e-1 (cdr arg-0))) (if (null? e-0) (vector 0 (vector 4 "boolean field")) (let ((e-4 (car e-0))) (let ((e-5 (cdr e-0))) (case (vector-ref e-4 0) ((8) (let ((e-6 (vector-ref e-4 1))) (if (null? e-5) (vector 0 (vector 0 "IDENT = IDENT(true|false)" e-4 e-1)) (let ((e-8 (car e-5))) (let ((e-9 (cdr e-5))) (case (vector-ref e-8 0) ((7) (if (null? e-9) (vector 0 (vector 0 "IDENT = IDENT(true|false)" e-4 e-1)) (let ((e-11 (car e-9))) (let ((e-12 (cdr e-9))) (case (vector-ref e-11 0) ((8) (let ((e-13 (vector-ref e-11 1))) (cond ((equal? e-13 "true") (vector 1 (cons e-6 (cons 1 (cons e-12 (+ e-1 3)))))) ((equal? e-13 "false") (vector 1 (cons e-6 (cons 0 (cons e-12 (+ e-1 3))))))(else (vector 0 (vector 0 "IDENT = IDENT(true|false)" e-4 e-1))))))(else (vector 0 (vector 0 "IDENT = IDENT(true|false)" e-4 e-1))))))))(else (vector 0 (vector 0 "IDENT = IDENT(true|false)" e-4 e-1)))))))))(else (vector 0 (vector 0 "IDENT = IDENT(true|false)" e-4 e-1))))))))))) -(define OchranceC-45A2MLC-45Parser-parseNumberField (lambda (arg-0) (let ((e-0 (car arg-0))) (let ((e-1 (cdr arg-0))) (if (null? e-0) (vector 0 (vector 4 "number field")) (let ((e-4 (car e-0))) (let ((e-5 (cdr e-0))) (case (vector-ref e-4 0) ((8) (let ((e-6 (vector-ref e-4 1))) (if (null? e-5) (vector 0 (vector 0 "IDENT = NUMBER" e-4 e-1)) (let ((e-8 (car e-5))) (let ((e-9 (cdr e-5))) (case (vector-ref e-8 0) ((7) (if (null? e-9) (vector 0 (vector 0 "IDENT = NUMBER" e-4 e-1)) (let ((e-11 (car e-9))) (let ((e-12 (cdr e-9))) (case (vector-ref e-11 0) ((10) (let ((e-13 (vector-ref e-11 1))) (vector 1 (cons e-6 (cons e-13 (cons e-12 (+ e-1 3)))))))(else (vector 0 (vector 0 "IDENT = NUMBER" e-4 e-1))))))))(else (vector 0 (vector 0 "IDENT = NUMBER" e-4 e-1)))))))))(else (vector 0 (vector 0 "IDENT = NUMBER" e-4 e-1))))))))))) -(define PreludeC-45EqOrd-u--C-62C-61_Ord_Integer (lambda (arg-0 arg-1) (let ((sc0 (or (and (>= arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define OchranceC-45A2MLC-45Parser-n--4148-11524-u--unless (lambda (arg-0 arg-1 arg-2) (cond ((equal? arg-1 1) arg-2) (else (vector 1 'erased))))) -(define OchranceC-45A2MLC-45Parser-case--parseOptionalPolicyC-44parsePolicyFields-11565 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5) (if (null? arg-5) (vector 0 (vector 4 "policy body")) (let ((e-1 (unbox arg-5))) (case (vector-ref e-1 0) ((5) (let ((u--policy (vector arg-3 arg-2 arg-1))) (vector 1 (cons (box u--policy) (OchranceC-45A2MLC-45Parser-advance arg-4))))) ((8) (let ((e-3 (vector-ref e-1 1))) (cond ((equal? e-3 "max_age") (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseNumberField arg-4) (lambda (_-0) (let ((e-4 (cdr _-0))) (let ((e-6 (car e-4))) (let ((e-7 (cdr e-4))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-n--4148-11524-u--unless arg-0 (PreludeC-45EqOrd-u--C-62C-61_Ord_Integer e-6 0) (vector 0 (vector 3 "policy" "max_age" "must be non-negative" (let ((e-5 (cdr arg-4))) e-5)))) (lambda (_-10677) (OchranceC-45A2MLC-45Parser-n--4148-11523-u--parsePolicyFields arg-0 e-7 arg-3 (box (PreludeC-45Types-prim__integerToNat e-6)) arg-1))))))))) ((equal? e-3 "require_sig") (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseBoolField arg-4) (lambda (_-0) (let ((e-4 (cdr _-0))) (let ((e-6 (car e-4))) (let ((e-7 (cdr e-4))) (OchranceC-45A2MLC-45Parser-n--4148-11523-u--parsePolicyFields arg-0 e-7 arg-3 arg-2 e-6)))))))(else (vector 0 (vector 0 "RBRACE, max_age, or require_sig" e-1 (let ((e-2 (cdr arg-4))) e-2)))))))(else (vector 0 (vector 0 "RBRACE, max_age, or require_sig" e-1 (let ((e-2 (cdr arg-4))) e-2))))))))) -(define OchranceC-45A2MLC-45Parser-n--4148-11523-u--parsePolicyFields (lambda (arg-0 arg-1 arg-2 arg-3 arg-4) (OchranceC-45A2MLC-45Parser-case--parseOptionalPolicyC-44parsePolicyFields-11565 arg-0 arg-4 arg-3 arg-2 arg-1 (OchranceC-45A2MLC-45Parser-peek arg-1)))) -(define OchranceC-45A2MLC-45Parser-parseOptionalPolicy (lambda (arg-0) (let ((sc0 (OchranceC-45A2MLC-45Parser-peek arg-0))) (if (null? sc0) (vector 1 (cons '() arg-0)) (let ((e-1 (unbox sc0))) (case (vector-ref e-1 0) ((3) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 3 ) arg-0) (lambda (u--st1) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 4 ) u--st1) (lambda (u--st2) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseField u--st2) (lambda (_-0) (let ((e-2 (car _-0))) (let ((e-3 (cdr _-0))) (let ((e-6 (car e-3))) (let ((e-7 (cdr e-3))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-n--4148-11524-u--unless arg-0 (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-2 "mode") (vector 0 (vector 3 "policy" e-2 "expected 'mode' field" (let ((e-4 (cdr arg-0))) e-4)))) (lambda (_-10677) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (let ((sc4 (OchranceC-45A2MLC-45Parser-parseVerificationMode e-6))) (if (null? sc4) (vector 0 (vector 3 "policy" "mode" (string-append "invalid mode: " e-6) (let ((e-4 (cdr arg-0))) e-4))) (let ((e-4 (unbox sc4))) (vector 1 e-4)))) (lambda (u--mode) (OchranceC-45A2MLC-45Parser-n--4148-11523-u--parsePolicyFields arg-0 e-7 u--mode '() 0))))))))))))))))(else (vector 1 (cons '() arg-0))))))))) -(define OchranceC-45A2MLC-45Types-parseHashAlgorithm (lambda (arg-0) (cond ((equal? arg-0 "sha256") (box 0)) ((equal? arg-0 "sha3-256") (box 1)) ((equal? arg-0 "blake3") (box 2))(else '())))) -(define OchranceC-45A2MLC-45Parser-parseRef (lambda (arg-0) (let ((e-0 (car arg-0))) (let ((e-1 (cdr arg-0))) (if (null? e-0) (vector 0 (vector 4 "ref entry")) (let ((e-4 (car e-0))) (let ((e-5 (cdr e-0))) (case (vector-ref e-4 0) ((8) (let ((e-6 (vector-ref e-4 1))) (if (null? e-5) (vector 0 (vector 0 "IDENT : HASH" e-4 e-1)) (let ((e-8 (car e-5))) (let ((e-9 (cdr e-5))) (case (vector-ref e-8 0) ((6) (if (null? e-9) (vector 0 (vector 0 "IDENT : HASH" e-4 e-1)) (let ((e-11 (car e-9))) (let ((e-12 (cdr e-9))) (case (vector-ref e-11 0) ((11) (let ((e-13 (vector-ref e-11 1))) (let ((e-14 (vector-ref e-11 2))) (let ((sc7 (OchranceC-45A2MLC-45Types-parseHashAlgorithm e-13))) (if (null? sc7) (vector 0 (vector 3 "ref" e-6 (string-append "unsupported hash algorithm: " e-13) e-1)) (let ((e-2 (unbox sc7))) (let ((u--hash (cons e-2 e-14))) (let ((u--ref (cons e-6 u--hash))) (vector 1 (cons u--ref (cons e-12 (+ e-1 3))))))))))))(else (vector 0 (vector 0 "IDENT : HASH" e-4 e-1))))))))(else (vector 0 (vector 0 "IDENT : HASH" e-4 e-1)))))))))(else (vector 0 (vector 0 "IDENT : HASH" e-4 e-1))))))))))) -(define PreludeC-45TypesC-45List-reverseOnto (lambda (arg-1 arg-2) (if (null? arg-2) arg-1 (let ((e-2 (car arg-2))) (let ((e-3 (cdr arg-2))) (PreludeC-45TypesC-45List-reverseOnto (cons e-2 arg-1) e-3)))))) -(define PreludeC-45TypesC-45List-reverse (lambda (ext-0) (PreludeC-45TypesC-45List-reverseOnto '() ext-0))) -(define OchranceC-45A2MLC-45Parser-parseRefsLoop (lambda (arg-0 arg-1) (if (null? arg-0) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseRef arg-0) (lambda (_-0) (let ((e-2 (car _-0))) (let ((e-3 (cdr _-0))) (OchranceC-45A2MLC-45Parser-parseRefsLoop e-3 (cons e-2 arg-1)))))) (let ((e-0 (car arg-0))) (let ((e-1 (cdr arg-0))) (if (null? e-0) (vector 0 (vector 4 "refs body")) (let ((e-4 (car e-0))) (let ((e-5 (cdr e-0))) (case (vector-ref e-4 0) ((5) (vector 1 (cons (PreludeC-45TypesC-45List-reverse arg-1) (cons e-5 (+ e-1 1)))))(else (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseRef arg-0) (lambda (_-0) (let ((e-2 (car _-0))) (let ((e-3 (cdr _-0))) (OchranceC-45A2MLC-45Parser-parseRefsLoop e-3 (cons e-2 arg-1)))))))))))))))) -(define OchranceC-45A2MLC-45Parser-parseRefsBody (lambda (arg-0) (OchranceC-45A2MLC-45Parser-parseRefsLoop arg-0 '()))) -(define OchranceC-45A2MLC-45Parser-parse (lambda (arg-0) (let ((u--st (cons arg-0 0))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 0 ) u--st) (lambda (u--st1) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 4 ) u--st1) (lambda (u--st2) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseManifestBody u--st2) (lambda (_-0) (let ((e-2 (car _-0))) (let ((e-3 (cdr _-0))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 1 ) e-3) (lambda (u--st4) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 4 ) u--st4) (lambda (u--st5) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseRefsBody u--st5) (lambda (_-1) (let ((e-5 (car _-1))) (let ((e-4 (cdr _-1))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseOptionalAttestation e-4) (lambda (_-2) (let ((e-7 (car _-2))) (let ((e-6 (cdr _-2))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseOptionalPolicy e-6) (lambda (_-3) (let ((e-9 (car _-3))) (vector 1 (vector e-2 e-5 e-7 e-9)))))))))))))))))))))))))))) -(define ParserTests-case--errorHandlingTests-11360 (lambda (arg-0 arg-1 ext-0) (case (vector-ref arg-1 0) ((1) (let ((e-2 (vector-ref arg-1 1))) (let ((sc1 (OchranceC-45A2MLC-45Parser-parse e-2))) (case (vector-ref sc1 0) ((0) 'erased) (else (PreludeC-45IO-prim__putStr "FAIL: Should require version field\xa;" ext-0)))))) (else 'erased)))) -(define ParserTests-case--errorHandlingTests-11297 (lambda (arg-0 arg-1 ext-0) (case (vector-ref arg-1 0) ((1) (let ((e-2 (vector-ref arg-1 1))) (let ((sc1 (OchranceC-45A2MLC-45Parser-parse e-2))) (case (vector-ref sc1 0) ((0) 'erased) (else (PreludeC-45IO-prim__putStr "FAIL: Should reject invalid hash format\xa;" ext-0)))))) (else 'erased)))) -(define Builtin-fst (lambda (arg-2) (let ((e-2 (car arg-2))) e-2))) -(define Builtin-snd (lambda (arg-2) (let ((e-3 (cdr arg-2))) e-3))) -(define ParserTests-assertEqual (lambda (arg-1 arg-2 arg-3 ext-0) (let ((sc0 (let ((sc1 (Builtin-fst arg-1))) (let ((e-1 (car sc1))) ((e-1 arg-2) arg-3))))) (cond ((equal? sc0 1) 'erased) (else (PreludeC-45IO-prim__putStr (string-append (string-append "FAIL: Expected " (string-append (let ((sc1 (Builtin-snd arg-1))) (let ((e-1 (car sc1))) (e-1 arg-2))) (string-append ", got " (let ((sc1 (Builtin-snd arg-1))) (let ((e-1 (car sc1))) (e-1 arg-3)))))) "\xa;") ext-0)))))) -(define PreludeC-45Show-u--show_Show_Nat (lambda (arg-0) (PreludeC-45Show-u--show_Show_Integer arg-0))) -(define OchranceC-45A2MLC-45Parser-u--show_Show_ParseError (lambda (arg-0) (case (vector-ref arg-0 0) ((0) (let ((e-0 (vector-ref arg-0 1))) (let ((e-1 (vector-ref arg-0 2))) (let ((e-2 (vector-ref arg-0 3))) (string-append "Parse error at position " (string-append (PreludeC-45Show-u--show_Show_Nat e-2) (string-append ": expected " (string-append e-0 (string-append ", got " (OchranceC-45A2MLC-45Lexer-u--show_Show_Token e-1)))))))))) ((1) (let ((e-3 (vector-ref arg-0 1))) (let ((e-4 (vector-ref arg-0 2))) (string-append "Missing required section @" (string-append e-3 (string-append " at position " (PreludeC-45Show-u--show_Show_Nat e-4))))))) ((2) (let ((e-5 (vector-ref arg-0 1))) (let ((e-6 (vector-ref arg-0 2))) (string-append "Duplicate section @" (string-append e-5 (string-append " at position " (PreludeC-45Show-u--show_Show_Nat e-6))))))) ((3) (let ((e-7 (vector-ref arg-0 1))) (let ((e-8 (vector-ref arg-0 2))) (let ((e-9 (vector-ref arg-0 3))) (let ((e-10 (vector-ref arg-0 4))) (string-append "Invalid value for " (string-append e-7 (string-append "=" (string-append e-8 (string-append " (" (string-append e-9 (string-append ") at position " (PreludeC-45Show-u--show_Show_Nat e-10))))))))))))) (else (let ((e-11 (vector-ref arg-0 1))) (string-append "Unexpected end of input in " e-11)))))) -(define ParserTests-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32caseC-32blockC-32inC-32roundtripTests-11120 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 ext-0) (case (vector-ref arg-4 0) ((1) (let ((e-2 (vector-ref arg-4 1))) (let ((act-1 (ParserTests-assertEqual csegen-5 (let ((e-0 (vector-ref arg-1 0))) (let ((e-7 (vector-ref e-0 0))) e-7)) (let ((e-0 (vector-ref e-2 0))) (let ((e-7 (vector-ref e-0 0))) e-7)) ext-0))) (ParserTests-assertEqual csegen-5 (let ((e-0 (vector-ref arg-1 0))) (let ((e-6 (vector-ref e-0 1))) e-6)) (let ((e-0 (vector-ref e-2 0))) (let ((e-6 (vector-ref e-0 1))) e-6)) ext-0)))) (else (let ((e-5 (vector-ref arg-4 1))) (PreludeC-45IO-prim__putStr (string-append (string-append "FAIL parse2: " (OchranceC-45A2MLC-45Parser-u--show_Show_ParseError e-5)) "\xa;") ext-0)))))) -(define DataC-45String-singleton (lambda (arg-0) (string-cons arg-0 ""))) -(define OchranceC-45A2MLC-45Lexer-u--show_Show_LexError (lambda (arg-0) (case (vector-ref arg-0 0) ((0) (let ((e-0 (vector-ref arg-0 1))) (let ((e-1 (vector-ref arg-0 2))) (let ((e-2 (vector-ref arg-0 3))) (string-append "Unexpected character '" (string-append (DataC-45String-singleton e-0) (string-append "' at line " (string-append (PreludeC-45Show-u--show_Show_Nat e-1) (string-append ", col " (PreludeC-45Show-u--show_Show_Nat e-2)))))))))) ((1) (let ((e-3 (vector-ref arg-0 1))) (let ((e-4 (vector-ref arg-0 2))) (string-append "Unterminated string at line " (string-append (PreludeC-45Show-u--show_Show_Nat e-3) (string-append ", col " (PreludeC-45Show-u--show_Show_Nat e-4))))))) (else (let ((e-5 (vector-ref arg-0 1))) (let ((e-6 (vector-ref arg-0 2))) (let ((e-7 (vector-ref arg-0 3))) (string-append "Invalid hash '" (string-append e-5 (string-append "' at line " (string-append (PreludeC-45Show-u--show_Show_Nat e-6) (string-append ", col " (PreludeC-45Show-u--show_Show_Nat e-7))))))))))))) -(define ParserTests-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32roundtripTests-11103 (lambda (arg-0 arg-1 arg-2 arg-3) (lambda (clam-0) (case (vector-ref arg-3 0) ((1) (let ((e-2 (vector-ref arg-3 1))) (ParserTests-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32caseC-32blockC-32inC-32roundtripTests-11120 arg-0 arg-1 arg-2 e-2 (OchranceC-45A2MLC-45Parser-parse e-2) clam-0))) (else (let ((e-5 (vector-ref arg-3 1))) (PreludeC-45IO-prim__putStr (string-append (string-append "FAIL lex2: " (OchranceC-45A2MLC-45Lexer-u--show_Show_LexError e-5)) "\xa;") clam-0))))))) -(define PreludeC-45TypesC-45List-lengthPlus (lambda (arg-1 arg-2) (if (null? arg-2) arg-1 (let ((e-3 (cdr arg-2))) (PreludeC-45TypesC-45List-lengthPlus (+ arg-1 1) e-3))))) -(define PreludeC-45TypesC-45List-lengthTR (lambda (ext-0) (PreludeC-45TypesC-45List-lengthPlus 0 ext-0))) -(define PreludeC-45TypesC-45List-tailRecAppend (lambda (arg-1 arg-2) (PreludeC-45TypesC-45List-reverseOnto arg-2 (PreludeC-45TypesC-45List-reverse arg-1)))) -(define OchranceC-45A2MLC-45Lexer-collectDigits (lambda (arg-0 arg-1) (if (null? arg-1) (cons arg-0 '()) (let ((e-2 (car arg-1))) (let ((e-3 (cdr arg-1))) (let ((sc1 (PreludeC-45Types-isDigit e-2))) (cond ((equal? sc1 1) (OchranceC-45A2MLC-45Lexer-collectDigits (PreludeC-45TypesC-45List-tailRecAppend arg-0 (cons e-2 '())) e-3)) (else (cons arg-0 (cons e-2 e-3)))))))))) -(define PreludeC-45Types-isLower (lambda (arg-0) (let ((sc0 (PreludeC-45EqOrd-u--C-62C-61_Ord_Char arg-0 #\a))) (cond ((equal? sc0 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char arg-0 #\z)) (else 0))))) -(define PreludeC-45Types-isUpper (lambda (arg-0) (let ((sc0 (PreludeC-45EqOrd-u--C-62C-61_Ord_Char arg-0 #\A))) (cond ((equal? sc0 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char arg-0 #\Z)) (else 0))))) -(define PreludeC-45Types-isAlpha (lambda (arg-0) (let ((sc0 (PreludeC-45Types-isUpper arg-0))) (cond ((equal? sc0 1) 1) (else (PreludeC-45Types-isLower arg-0)))))) -(define OchranceC-45A2MLC-45Lexer-isIdentChar (lambda (arg-0) (let ((sc0 (PreludeC-45Types-isAlpha arg-0))) (cond ((equal? sc0 1) 1) (else (let ((sc1 (PreludeC-45Types-isDigit arg-0))) (cond ((equal? sc1 1) 1) (else (let ((sc2 (PreludeC-45EqOrd-u--C-61C-61_Eq_Char arg-0 #\_))) (cond ((equal? sc2 1) 1) (else (PreludeC-45EqOrd-u--C-61C-61_Eq_Char arg-0 #\-)))))))))))) -(define OchranceC-45A2MLC-45Lexer-collectIdent (lambda (arg-0 arg-1) (if (null? arg-1) (cons arg-0 '()) (let ((e-2 (car arg-1))) (let ((e-3 (cdr arg-1))) (let ((sc1 (OchranceC-45A2MLC-45Lexer-isIdentChar e-2))) (cond ((equal? sc1 1) (OchranceC-45A2MLC-45Lexer-collectIdent (PreludeC-45TypesC-45List-tailRecAppend arg-0 (cons e-2 '())) e-3)) (else (cons arg-0 (cons e-2 e-3)))))))))) -(define OchranceC-45A2MLC-45Lexer-collectString (lambda (arg-0 arg-1) (if (null? arg-1) '() (let ((e-2 (car arg-1))) (let ((e-3 (cdr arg-1))) (cond ((equal? e-2 #\") (box (cons arg-0 e-3))) ((equal? e-2 #\\) (if (null? e-3) (OchranceC-45A2MLC-45Lexer-collectString (PreludeC-45TypesC-45List-tailRecAppend arg-0 (cons e-2 '())) e-3) (let ((e-5 (car e-3))) (let ((e-6 (cdr e-3))) (OchranceC-45A2MLC-45Lexer-collectString (PreludeC-45TypesC-45List-tailRecAppend arg-0 (cons e-5 '())) e-6)))))(else (OchranceC-45A2MLC-45Lexer-collectString (PreludeC-45TypesC-45List-tailRecAppend arg-0 (cons e-2 '())) e-3)))))))) -(define OchranceC-45A2MLC-45Lexer-keywordToken (lambda (arg-0) (cond ((equal? arg-0 "manifest") (vector 0 )) ((equal? arg-0 "refs") (vector 1 )) ((equal? arg-0 "attestation") (vector 2 )) ((equal? arg-0 "policy") (vector 3 ))(else (vector 8 (string-append "@" arg-0)))))) -(define OchranceC-45A2MLC-45Lexer-case--lexFuel-10229 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5) (let ((e-2 (car arg-5))) (let ((e-3 (cdr arg-5))) (let ((u--kw (PreludeC-45Types-fastPack e-2))) (let ((u--consumed (PreludeC-45TypesC-45List-lengthTR e-2))) (OchranceC-45A2MLC-45Lexer-lexFuel arg-0 e-3 arg-4 (+ (+ arg-3 1) u--consumed) (cons (OchranceC-45A2MLC-45Lexer-keywordToken u--kw) arg-2)))))))) -(define OchranceC-45A2MLC-45Lexer-case--lexFuel-10272 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5) (if (null? arg-5) (vector 0 (vector 1 arg-4 arg-3)) (let ((e-2 (unbox arg-5))) (let ((e-5 (car e-2))) (let ((e-6 (cdr e-2))) (let ((u--consumed (+ (PreludeC-45TypesC-45List-lengthTR e-5) 2))) (OchranceC-45A2MLC-45Lexer-lexFuel arg-0 e-6 arg-4 (+ arg-3 u--consumed) (cons (vector 9 (PreludeC-45Types-fastPack e-5)) arg-2))))))))) -(define DataC-45String-strM (lambda (arg-0) (cond ((equal? arg-0 "") '())(else (cons (string-ref arg-0 0) (substring arg-0 1 (string-length arg-0))))))) -(define DataC-45String-with--asList-9840 (lambda (arg-0 arg-1) (cond ((equal? arg-0 "") (if (null? arg-1) (vector 0 ) (let ((e-0 (car arg-1))) (let ((e-1 (cdr arg-1))) (vector 1 e-0 e-1 (lambda () (DataC-45String-asList e-1)))))))(else (let ((e-0 (car arg-1))) (let ((e-1 (cdr arg-1))) (vector 1 e-0 e-1 (lambda () (DataC-45String-asList e-1))))))))) -(define DataC-45String-asList (lambda (arg-0) (DataC-45String-with--asList-9840 arg-0 (DataC-45String-strM arg-0)))) -(define PreludeC-45Types-isSpace (lambda (arg-0) (cond ((equal? arg-0 #\ ) 1) ((equal? arg-0 (integer->char 9)) 1) ((equal? arg-0 (integer->char 13)) 1) ((equal? arg-0 (integer->char 10)) 1) ((equal? arg-0 (integer->char 12)) 1) ((equal? arg-0 (integer->char 11)) 1) ((equal? arg-0 (integer->char 160)) 1)(else 0)))) -(define DataC-45String-with--ltrim-9864 (lambda (arg-0 arg-1) (cond ((equal? arg-0 "") (case (vector-ref arg-1 0) ((0) "")(else (let ((e-0 (vector-ref arg-1 1))) (let ((e-1 (vector-ref arg-1 2))) (let ((e-2 (vector-ref arg-1 3))) (let ((u--str (string-cons e-0 e-1))) (let ((sc2 (PreludeC-45Types-isSpace e-0))) (cond ((equal? sc2 1) (DataC-45String-with--ltrim-9864 e-1 (e-2))) (else u--str))))))))))(else (let ((e-0 (vector-ref arg-1 1))) (let ((e-1 (vector-ref arg-1 2))) (let ((e-2 (vector-ref arg-1 3))) (let ((u--str (string-cons e-0 e-1))) (let ((sc1 (PreludeC-45Types-isSpace e-0))) (cond ((equal? sc1 1) (DataC-45String-with--ltrim-9864 e-1 (e-2))) (else u--str))))))))))) -(define DataC-45String-ltrim (lambda (arg-0) (DataC-45String-with--ltrim-9864 arg-0 (DataC-45String-asList arg-0)))) -(define DataC-45String-rtrim (lambda (ext-0) (string-reverse (DataC-45String-ltrim (string-reverse ext-0))))) -(define DataC-45String-trim (lambda (ext-0) (DataC-45String-ltrim (DataC-45String-rtrim ext-0)))) -(define DataC-45String-parseNumWithoutSign (lambda (arg-0 arg-1) (if (null? arg-0) (box arg-1) (let ((e-2 (car arg-0))) (let ((e-3 (cdr arg-0))) (let ((sc1 (let ((sc2 (PreludeC-45EqOrd-u--C-62C-61_Ord_Char e-2 #\0))) (cond ((equal? sc2 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char e-2 #\9)) (else 0))))) (cond ((equal? sc1 1) (DataC-45String-parseNumWithoutSign e-3 (+ (* arg-1 10) (bs- (cast-char-boundedInt e-2 63) (cast-char-boundedInt #\0 63) 63)))) (else '())))))))) -(define PreludeC-45Types-u--map_Functor_Maybe (lambda (arg-2 arg-3) (if (null? arg-3) '() (let ((e-1 (unbox arg-3))) (box (arg-2 e-1)))))) -(define DataC-45String-with--parseIntegerC-44parseIntTrimmed-10310 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5) (cond ((equal? arg-4 "") (if (null? arg-5) '() (let ((e-0 (car arg-5))) (let ((e-1 (cdr arg-5))) (let ((sc3 (PreludeC-45EqOrd-u--C-61C-61_Eq_Char e-0 #\-))) (cond ((equal? sc3 1) (PreludeC-45Types-u--map_Functor_Maybe (lambda (u--y) (let ((e-2 (vector-ref arg-2 1))) (e-2 (let ((e-5 (vector-ref arg-1 2))) (e-5 u--y))))) (DataC-45String-parseNumWithoutSign (PreludeC-45Types-fastUnpack e-1) 0))) (else (let ((sc4 (PreludeC-45EqOrd-u--C-61C-61_Eq_Char e-0 #\+))) (cond ((equal? sc4 1) (PreludeC-45Types-u--map_Functor_Maybe (let ((e-3 (vector-ref arg-1 2))) e-3) (DataC-45String-parseNumWithoutSign (PreludeC-45Types-fastUnpack e-1) 0))) (else (let ((sc5 (let ((sc6 (PreludeC-45EqOrd-u--C-62C-61_Ord_Char e-0 #\0))) (cond ((equal? sc6 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char e-0 #\9)) (else 0))))) (cond ((equal? sc5 1) (PreludeC-45Types-u--map_Functor_Maybe (let ((e-3 (vector-ref arg-1 2))) e-3) (DataC-45String-parseNumWithoutSign (PreludeC-45Types-fastUnpack e-1) (bs- (cast-char-boundedInt e-0 63) (cast-char-boundedInt #\0 63) 63)))) (else '())))))))))))))(else (let ((e-0 (car arg-5))) (let ((e-1 (cdr arg-5))) (let ((sc1 (PreludeC-45EqOrd-u--C-61C-61_Eq_Char e-0 #\-))) (cond ((equal? sc1 1) (PreludeC-45Types-u--map_Functor_Maybe (lambda (u--y) (let ((e-2 (vector-ref arg-2 1))) (e-2 (let ((e-5 (vector-ref arg-1 2))) (e-5 u--y))))) (DataC-45String-parseNumWithoutSign (PreludeC-45Types-fastUnpack e-1) 0))) (else (let ((sc2 (PreludeC-45EqOrd-u--C-61C-61_Eq_Char e-0 #\+))) (cond ((equal? sc2 1) (PreludeC-45Types-u--map_Functor_Maybe (let ((e-3 (vector-ref arg-1 2))) e-3) (DataC-45String-parseNumWithoutSign (PreludeC-45Types-fastUnpack e-1) 0))) (else (let ((sc3 (let ((sc4 (PreludeC-45EqOrd-u--C-62C-61_Ord_Char e-0 #\0))) (cond ((equal? sc4 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char e-0 #\9)) (else 0))))) (cond ((equal? sc3 1) (PreludeC-45Types-u--map_Functor_Maybe (let ((e-3 (vector-ref arg-1 2))) e-3) (DataC-45String-parseNumWithoutSign (PreludeC-45Types-fastUnpack e-1) (bs- (cast-char-boundedInt e-0 63) (cast-char-boundedInt #\0 63) 63)))) (else '()))))))))))))))) -(define DataC-45String-n--4569-10304-u--parseIntTrimmed (lambda (arg-1 arg-2 arg-3 arg-4) (DataC-45String-with--parseIntegerC-44parseIntTrimmed-10310 'erased arg-1 arg-2 arg-4 arg-4 (DataC-45String-strM arg-4)))) -(define DataC-45String-parseInteger (lambda (arg-1 arg-2 arg-3) (DataC-45String-n--4569-10304-u--parseIntTrimmed arg-1 arg-2 arg-3 (DataC-45String-trim arg-3)))) -(define OchranceC-45A2MLC-45Lexer-case--caseC-32blockC-32inC-32lexFuel-10349 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5 arg-6) (let ((e-2 (car arg-6))) (let ((e-3 (cdr arg-6))) (let ((u--numStr (PreludeC-45Types-fastPack e-2))) (let ((u--consumed (PreludeC-45TypesC-45List-lengthTR e-2))) (let ((sc1 (DataC-45String-parseInteger csegen-90 (vector csegen-90 (lambda (arg-6034) (- 0 arg-6034)) (lambda (arg-6040) (lambda (arg-6043) (- arg-6040 arg-6043)))) u--numStr))) (if (null? sc1) (vector 0 (vector 0 arg-1 arg-5 arg-4)) (let ((e-1 (unbox sc1))) (OchranceC-45A2MLC-45Lexer-lexFuel arg-0 e-3 arg-5 (+ arg-4 u--consumed) (cons (vector 10 e-1) arg-3))))))))))) -(define PreludeC-45Types-isHexDigit (lambda (arg-0) (let ((sc0 (PreludeC-45Types-isDigit arg-0))) (cond ((equal? sc0 1) 1) (else (let ((sc1 (let ((sc2 (PreludeC-45EqOrd-u--C-60C-61_Ord_Char #\a arg-0))) (cond ((equal? sc2 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char arg-0 #\f)) (else 0))))) (cond ((equal? sc1 1) 1) (else (let ((sc2 (PreludeC-45EqOrd-u--C-60C-61_Ord_Char #\A arg-0))) (cond ((equal? sc2 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char arg-0 #\F)) (else 0))))))))))) -(define OchranceC-45A2MLC-45Lexer-isHashChar (lambda (arg-0) (let ((sc0 (PreludeC-45Types-isHexDigit arg-0))) (cond ((equal? sc0 1) 1) (else (PreludeC-45EqOrd-u--C-61C-61_Eq_Char arg-0 #\.)))))) -(define OchranceC-45A2MLC-45Lexer-collectHashValue (lambda (arg-0 arg-1) (if (null? arg-1) (cons arg-0 '()) (let ((e-2 (car arg-1))) (let ((e-3 (cdr arg-1))) (let ((sc1 (OchranceC-45A2MLC-45Lexer-isHashChar e-2))) (cond ((equal? sc1 1) (OchranceC-45A2MLC-45Lexer-collectHashValue (PreludeC-45TypesC-45List-tailRecAppend arg-0 (cons e-2 '())) e-3)) (else (cons arg-0 (cons e-2 e-3)))))))))) -(define PreludeC-45Types-u--C-62_Ord_Nat (lambda (arg-0 arg-1) (PreludeC-45EqOrd-u--C-61C-61_Eq_Ordering (PreludeC-45EqOrd-u--compare_Ord_Integer arg-0 arg-1) 2))) -(define OchranceC-45A2MLC-45Lexer-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32caseC-32blockC-32inC-32caseC-32blockC-32inC-32lexFuel-10534 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5 arg-6 arg-7 arg-8 arg-9 arg-10 arg-11) (let ((e-2 (car arg-11))) (let ((e-3 (cdr arg-11))) (let ((u--hval (PreludeC-45Types-fastPack e-2))) (let ((u--hconsumed (+ (+ arg-8 1) (PreludeC-45TypesC-45List-lengthTR e-2)))) (let ((sc1 (PreludeC-45Types-u--C-62_Ord_Nat (PreludeC-45TypesC-45List-lengthTR e-2) 0))) (cond ((equal? sc1 1) (OchranceC-45A2MLC-45Lexer-lexFuel arg-0 e-3 arg-5 (+ arg-4 u--hconsumed) (cons (vector 11 arg-7 u--hval) arg-3))) (else (OchranceC-45A2MLC-45Lexer-lexFuel arg-0 arg-10 arg-5 (+ arg-4 arg-8) (cons (vector 8 arg-7) arg-3))))))))))) -(define OchranceC-45A2MLC-45Lexer-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32lexFuel-10475 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5 arg-6) (let ((e-2 (car arg-6))) (let ((e-3 (cdr arg-6))) (let ((u--ident (PreludeC-45Types-fastPack e-2))) (let ((u--consumed (PreludeC-45TypesC-45List-lengthTR e-2))) (if (null? e-3) (OchranceC-45A2MLC-45Lexer-lexFuel arg-0 e-3 arg-5 (+ arg-4 u--consumed) (cons (vector 8 u--ident) arg-3)) (let ((e-1 (car e-3))) (let ((e-4 (cdr e-3))) (cond ((equal? e-1 #\:) (let ((u--restC-39 (cons #\: e-4))) (OchranceC-45A2MLC-45Lexer-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32caseC-32blockC-32inC-32caseC-32blockC-32inC-32lexFuel-10534 arg-0 arg-1 arg-2 arg-3 arg-4 arg-5 e-2 u--ident u--consumed e-4 u--restC-39 (OchranceC-45A2MLC-45Lexer-collectHashValue '() e-4))))(else (OchranceC-45A2MLC-45Lexer-lexFuel arg-0 e-3 arg-5 (+ arg-4 u--consumed) (cons (vector 8 u--ident) arg-3))))))))))))) -(define OchranceC-45A2MLC-45Lexer-lexFuel (lambda (arg-0 arg-1 arg-2 arg-3 arg-4) (cond ((equal? arg-0 0) (vector 1 (PreludeC-45TypesC-45List-reverse (cons (vector 12 ) arg-4))))(else (let ((e-0 (- arg-0 1))) (if (null? arg-1) (vector 1 (PreludeC-45TypesC-45List-reverse (cons (vector 12 ) arg-4))) (let ((e-3 (car arg-1))) (let ((e-4 (cdr arg-1))) (cond ((equal? e-3 #\ ) (OchranceC-45A2MLC-45Lexer-lexFuel e-0 e-4 arg-2 (+ arg-3 1) arg-4)) ((equal? e-3 (integer->char 9)) (OchranceC-45A2MLC-45Lexer-lexFuel e-0 e-4 arg-2 (+ arg-3 4) arg-4)) ((equal? e-3 (integer->char 10)) (OchranceC-45A2MLC-45Lexer-lexFuel e-0 e-4 (+ arg-2 1) 1 arg-4)) ((equal? e-3 (integer->char 13)) (OchranceC-45A2MLC-45Lexer-lexFuel e-0 e-4 arg-2 arg-3 arg-4)) ((equal? e-3 #\{) (OchranceC-45A2MLC-45Lexer-lexFuel e-0 e-4 arg-2 (+ arg-3 1) (cons (vector 4 ) arg-4))) ((equal? e-3 #\}) (OchranceC-45A2MLC-45Lexer-lexFuel e-0 e-4 arg-2 (+ arg-3 1) (cons (vector 5 ) arg-4))) ((equal? e-3 #\:) (OchranceC-45A2MLC-45Lexer-lexFuel e-0 e-4 arg-2 (+ arg-3 1) (cons (vector 6 ) arg-4))) ((equal? e-3 #\=) (OchranceC-45A2MLC-45Lexer-lexFuel e-0 e-4 arg-2 (+ arg-3 1) (cons (vector 7 ) arg-4))) ((equal? e-3 #\@) (OchranceC-45A2MLC-45Lexer-case--lexFuel-10229 e-0 e-4 arg-4 arg-3 arg-2 (OchranceC-45A2MLC-45Lexer-collectIdent '() e-4))) ((equal? e-3 #\") (OchranceC-45A2MLC-45Lexer-case--lexFuel-10272 e-0 e-4 arg-4 arg-3 arg-2 (OchranceC-45A2MLC-45Lexer-collectString '() e-4)))(else (let ((sc1 (PreludeC-45Types-isDigit e-3))) (cond ((equal? sc1 1) (OchranceC-45A2MLC-45Lexer-case--caseC-32blockC-32inC-32lexFuel-10349 e-0 e-3 e-4 arg-4 arg-3 arg-2 (OchranceC-45A2MLC-45Lexer-collectDigits (cons e-3 '()) e-4))) (else (let ((sc2 (PreludeC-45Types-isAlpha e-3))) (cond ((equal? sc2 1) (OchranceC-45A2MLC-45Lexer-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32lexFuel-10475 e-0 e-3 e-4 arg-4 arg-3 arg-2 (OchranceC-45A2MLC-45Lexer-collectIdent (cons e-3 '()) e-4))) (else (vector 0 (vector 0 e-3 arg-2 arg-3)))))))))))))))))) -(define OchranceC-45A2MLC-45Lexer-lex (lambda (arg-0) (let ((u--chars (PreludeC-45Types-fastUnpack arg-0))) (let ((u--fuel (+ (PreludeC-45TypesC-45List-lengthTR u--chars) 1))) (OchranceC-45A2MLC-45Lexer-lexFuel u--fuel u--chars 1 1 '()))))) -(define DataC-45String-n--3856-9572-u--unlinesC-39 (lambda (arg-0) (if (null? arg-0) '() (let ((e-2 (car arg-0))) (let ((e-3 (cdr arg-0))) (cons e-2 (cons "\xa;" (DataC-45String-n--3856-9572-u--unlinesC-39 e-3)))))))) -(define DataC-45String-fastUnlines (lambda (ext-0) (PreludeC-45Types-fastConcat (DataC-45String-n--3856-9572-u--unlinesC-39 ext-0)))) -(define PreludeC-45TypesC-45SnocList-C-60C-62C-62 (lambda (arg-1 arg-2) (if (null? arg-1) arg-2 (let ((e-2 (car arg-1))) (let ((e-3 (cdr arg-1))) (PreludeC-45TypesC-45SnocList-C-60C-62C-62 e-2 (cons e-3 arg-2))))))) -(define PreludeC-45TypesC-45List-mapAppend (lambda (arg-2 arg-3 arg-4) (if (null? arg-4) (PreludeC-45TypesC-45SnocList-C-60C-62C-62 arg-2 '()) (let ((e-1 (car arg-4))) (let ((e-2 (cdr arg-4))) (PreludeC-45TypesC-45List-mapAppend (cons arg-2 (arg-3 e-1)) arg-3 e-2)))))) -(define PreludeC-45Types-maybe (lambda (arg-2 arg-3 arg-4) (if (null? arg-4) (arg-2) (let ((e-2 (unbox arg-4))) ((arg-3) e-2))))) -(define OchranceC-45A2MLC-45Types-u--show_Show_HashAlgorithm (lambda (arg-0) (cond ((equal? arg-0 0) "sha256") ((equal? arg-0 1) "sha3-256") (else "blake3")))) -(define OchranceC-45A2MLC-45Types-u--show_Show_Hash (lambda (arg-0) (string-append (OchranceC-45A2MLC-45Types-u--show_Show_HashAlgorithm (let ((e-0 (car arg-0))) e-0)) (string-append ":" (let ((e-1 (cdr arg-0))) e-1))))) -(define OchranceC-45A2MLC-45Serializer-serializeRef (lambda (arg-0) (string-append " " (string-append (let ((e-0 (car arg-0))) e-0) (string-append " : " (OchranceC-45A2MLC-45Types-u--show_Show_Hash (let ((e-1 (cdr arg-0))) e-1))))))) -(define OchranceC-45A2MLC-45Serializer-n--3824-10287-u--serializeAttestation (lambda (arg-0 arg-1) (string-append "\xa;@attestation {\xa;" (string-append " witness = \"" (string-append (let ((e-0 (vector-ref arg-1 0))) e-0) (string-append "\"\xa;" (string-append " signature = \"" (string-append (let ((e-1 (vector-ref arg-1 1))) e-1) (string-append "\"\xa;" (string-append " pubkey = \"" (string-append (let ((e-2 (vector-ref arg-1 2))) e-2) "\"\xa;}\xa;"))))))))))) -(define OchranceC-45A2MLC-45Types-u--show_Show_VerificationMode (lambda (arg-0) (cond ((equal? arg-0 0) "lax") ((equal? arg-0 1) "checked") (else "attested")))) -(define OchranceC-45A2MLC-45Serializer-n--3824-10288-u--serializePolicy (lambda (arg-0 arg-1) (string-append "\xa;@policy {\xa;" (string-append " mode = \"" (string-append (OchranceC-45A2MLC-45Types-u--show_Show_VerificationMode (let ((e-0 (vector-ref arg-1 0))) e-0)) (string-append "\"\xa;" (string-append (PreludeC-45Types-maybe (lambda () "") (lambda () (lambda (u--a) (string-append " max_age = " (string-append (PreludeC-45Show-u--show_Show_Nat u--a) "\xa;")))) (let ((e-1 (vector-ref arg-1 1))) e-1)) (string-append " require_sig = " (string-append (let ((sc0 (let ((e-2 (vector-ref arg-1 2))) e-2))) (cond ((equal? sc0 1) "true") (else "false"))) "\xa;}\xa;"))))))))) -(define OchranceC-45A2MLC-45Serializer-serialize (lambda (arg-0) (let ((u--header (string-append "@manifest {\xa;" (string-append " version = \"" (string-append (let ((e-0 (vector-ref arg-0 0))) (let ((e-6 (vector-ref e-0 0))) e-6)) (string-append "\"\xa;" (string-append " subsystem = \"" (string-append (let ((e-0 (vector-ref arg-0 0))) (let ((e-5 (vector-ref e-0 1))) e-5)) (string-append "\"\xa;" (string-append (PreludeC-45Types-maybe (lambda () "") (lambda () (lambda (u--t) (string-append " timestamp = \"" (string-append u--t "\"\xa;")))) (let ((e-0 (vector-ref arg-0 0))) (let ((e-4 (vector-ref e-0 2))) e-4))) "}\xa;\xa;")))))))))) (let ((u--refs (string-append "@refs {\xa;" (string-append (DataC-45String-fastUnlines (PreludeC-45TypesC-45List-mapAppend '() (lambda (eta-0) (OchranceC-45A2MLC-45Serializer-serializeRef eta-0)) (let ((e-1 (vector-ref arg-0 1))) e-1))) "}\xa;")))) (let ((u--att (PreludeC-45Types-maybe (lambda () "") (lambda () (lambda (eta-0) (OchranceC-45A2MLC-45Serializer-n--3824-10287-u--serializeAttestation arg-0 eta-0))) (let ((e-2 (vector-ref arg-0 2))) e-2)))) (let ((u--pol (PreludeC-45Types-maybe (lambda () "") (lambda () (lambda (eta-0) (OchranceC-45A2MLC-45Serializer-n--3824-10288-u--serializePolicy arg-0 eta-0))) (let ((e-3 (vector-ref arg-0 3))) e-3)))) (string-append u--header (string-append u--refs (string-append u--att u--pol))))))))) -(define ParserTests-case--caseC-32blockC-32inC-32roundtripTests-11088 (lambda (arg-0 arg-1) (case (vector-ref arg-1 0) ((1) (let ((e-2 (vector-ref arg-1 1))) (let ((u--serialized (OchranceC-45A2MLC-45Serializer-serialize e-2))) (ParserTests-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32roundtripTests-11103 arg-0 e-2 u--serialized (OchranceC-45A2MLC-45Lexer-lex u--serialized))))) (else (let ((e-5 (vector-ref arg-1 1))) (lambda (eta-0) (PreludeC-45IO-prim__putStr (string-append (string-append "FAIL parse1: " (OchranceC-45A2MLC-45Parser-u--show_Show_ParseError e-5)) "\xa;") eta-0))))))) -(define ParserTests-case--roundtripTests-11077 (lambda (arg-0) (case (vector-ref arg-0 0) ((1) (let ((e-2 (vector-ref arg-0 1))) (ParserTests-case--caseC-32blockC-32inC-32roundtripTests-11088 e-2 (OchranceC-45A2MLC-45Parser-parse e-2)))) (else (let ((e-5 (vector-ref arg-0 1))) (lambda (eta-0) (PreludeC-45IO-prim__putStr (string-append (string-append "FAIL lex1: " (OchranceC-45A2MLC-45Lexer-u--show_Show_LexError e-5)) "\xa;") eta-0))))))) -(define ParserTests-case--caseC-32blockC-32inC-32parserTests-10998 (lambda (arg-0 arg-1 ext-0) (case (vector-ref arg-1 0) ((1) (let ((e-2 (vector-ref arg-1 1))) (let ((act-1 (ParserTests-assertEqual csegen-5 "0.1.0" (let ((e-0 (vector-ref e-2 0))) (let ((e-7 (vector-ref e-0 0))) e-7)) ext-0))) (ParserTests-assertEqual csegen-5 "test" (let ((e-0 (vector-ref e-2 0))) (let ((e-6 (vector-ref e-0 1))) e-6)) ext-0)))) (else (let ((e-5 (vector-ref arg-1 1))) (PreludeC-45IO-prim__putStr (string-append (string-append "FAIL: " (OchranceC-45A2MLC-45Parser-u--show_Show_ParseError e-5)) "\xa;") ext-0)))))) -(define ParserTests-case--parserTests-10987 (lambda (arg-0) (lambda (clam-0) (case (vector-ref arg-0 0) ((1) (let ((e-2 (vector-ref arg-0 1))) (ParserTests-case--caseC-32blockC-32inC-32parserTests-10998 e-2 (OchranceC-45A2MLC-45Parser-parse e-2) clam-0))) (else (let ((e-5 (vector-ref arg-0 1))) (PreludeC-45IO-prim__putStr (string-append (string-append "FAIL lex: " (OchranceC-45A2MLC-45Lexer-u--show_Show_LexError e-5)) "\xa;") clam-0))))))) -(define ParserTests-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32parserTests-10910 (lambda (arg-0 arg-1 arg-2 ext-0) (if (null? arg-2) (PreludeC-45IO-prim__putStr "FAIL: Expected attestation\xa;" ext-0) (let ((e-2 (unbox arg-2))) (let ((act-1 (ParserTests-assertEqual csegen-5 "test-witness" (let ((e-0 (vector-ref e-2 0))) e-0) ext-0))) (ParserTests-assertEqual csegen-5 "sig123" (let ((e-1 (vector-ref e-2 1))) e-1) ext-0)))))) -(define ParserTests-case--caseC-32blockC-32inC-32parserTests-10898 (lambda (arg-0 arg-1) (lambda (clam-0) (case (vector-ref arg-1 0) ((1) (let ((e-2 (vector-ref arg-1 1))) (ParserTests-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32parserTests-10910 arg-0 e-2 (let ((e-4 (vector-ref e-2 2))) e-4) clam-0))) (else (let ((e-5 (vector-ref arg-1 1))) (PreludeC-45IO-prim__putStr (string-append (string-append "FAIL: " (OchranceC-45A2MLC-45Parser-u--show_Show_ParseError e-5)) "\xa;") clam-0))))))) -(define ParserTests-case--parserTests-10887 (lambda (arg-0) (case (vector-ref arg-0 0) ((1) (let ((e-2 (vector-ref arg-0 1))) (ParserTests-case--caseC-32blockC-32inC-32parserTests-10898 e-2 (OchranceC-45A2MLC-45Parser-parse e-2)))) (else (let ((e-5 (vector-ref arg-0 1))) (lambda (eta-0) (PreludeC-45IO-prim__putStr (string-append (string-append "FAIL lex: " (OchranceC-45A2MLC-45Lexer-u--show_Show_LexError e-5)) "\xa;") eta-0))))))) -(define PreludeC-45Types-u--C-47C-61_Eq_Nat (lambda (arg-0 arg-1) (let ((sc0 (or (and (= arg-0 arg-1) 1) 0))) (cond ((equal? sc0 1) 0) (else 1))))) -(define OchranceC-45A2MLC-45Types-u--C-61C-61_Eq_VerificationMode (lambda (arg-0 arg-1) (cond ((equal? arg-0 0) (cond ((equal? arg-1 0) 1)(else 0))) ((equal? arg-0 1) (cond ((equal? arg-1 1) 1)(else 0))) ((equal? arg-0 2) (cond ((equal? arg-1 2) 1)(else 0)))(else 0)))) -(define OchranceC-45A2MLC-45Types-u--C-47C-61_Eq_VerificationMode (lambda (arg-0 arg-1) (let ((sc0 (OchranceC-45A2MLC-45Types-u--C-61C-61_Eq_VerificationMode arg-0 arg-1))) (cond ((equal? sc0 1) 0) (else 1))))) -(define PreludeC-45Show-u--showPrec_Show_Nat (lambda (arg-0 arg-1) (PreludeC-45Show-u--show_Show_Nat arg-1))) -(define ParserTests-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32parserTests-10782 (lambda (arg-0 arg-1 arg-2 ext-0) (if (null? arg-2) (PreludeC-45IO-prim__putStr "FAIL: Expected policy\xa;" ext-0) (let ((e-2 (unbox arg-2))) (let ((act-1 (ParserTests-assertEqual (cons (cons (lambda (arg-712) (lambda (arg-715) (OchranceC-45A2MLC-45Types-u--C-61C-61_Eq_VerificationMode arg-712 arg-715))) (lambda (arg-722) (lambda (arg-725) (OchranceC-45A2MLC-45Types-u--C-47C-61_Eq_VerificationMode arg-722 arg-725)))) (cons (lambda (u--x) (OchranceC-45A2MLC-45Types-u--show_Show_VerificationMode u--x)) (lambda (u--d) (lambda (u--x) (OchranceC-45A2MLC-45Types-u--show_Show_VerificationMode u--x))))) 1 (let ((e-0 (vector-ref e-2 0))) e-0) ext-0))) (((let ((e-1 (vector-ref e-2 1))) (if (null? e-1) (lambda () (lambda (eta-0) (PreludeC-45IO-prim__putStr "FAIL: Expected max_age\xa;" eta-0))) (let ((e-4 (unbox e-1))) (lambda () (lambda (eta-0) (ParserTests-assertEqual (cons (cons (lambda (arg-712) (lambda (arg-715) (or (and (= arg-712 arg-715) 1) 0))) (lambda (arg-722) (lambda (arg-725) (PreludeC-45Types-u--C-47C-61_Eq_Nat arg-722 arg-725)))) (cons (lambda (u--x) (PreludeC-45Show-u--show_Show_Nat u--x)) (lambda (u--d) (lambda (u--x) (PreludeC-45Show-u--showPrec_Show_Nat u--d u--x))))) 3600 e-4 eta-0))))))) ext-0)))))) -(define ParserTests-case--caseC-32blockC-32inC-32parserTests-10770 (lambda (arg-0 arg-1) (lambda (clam-0) (case (vector-ref arg-1 0) ((1) (let ((e-2 (vector-ref arg-1 1))) (ParserTests-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32parserTests-10782 arg-0 e-2 (let ((e-3 (vector-ref e-2 3))) e-3) clam-0))) (else (let ((e-5 (vector-ref arg-1 1))) (PreludeC-45IO-prim__putStr (string-append (string-append "FAIL: " (OchranceC-45A2MLC-45Parser-u--show_Show_ParseError e-5)) "\xa;") clam-0))))))) -(define ParserTests-case--parserTests-10759 (lambda (arg-0) (case (vector-ref arg-0 0) ((1) (let ((e-2 (vector-ref arg-0 1))) (ParserTests-case--caseC-32blockC-32inC-32parserTests-10770 e-2 (OchranceC-45A2MLC-45Parser-parse e-2)))) (else (let ((e-5 (vector-ref arg-0 1))) (lambda (eta-0) (PreludeC-45IO-prim__putStr (string-append (string-append "FAIL lex: " (OchranceC-45A2MLC-45Lexer-u--show_Show_LexError e-5)) "\xa;") eta-0))))))) -(define ParserTests-case--parserTests-10696 (lambda (arg-0 arg-1 ext-0) (case (vector-ref arg-1 0) ((1) (let ((e-2 (vector-ref arg-1 1))) (let ((sc1 (OchranceC-45A2MLC-45Parser-parse e-2))) (case (vector-ref sc1 0) ((0) 'erased) (else (PreludeC-45IO-prim__putStr "FAIL: Should reject duplicate sections\xa;" ext-0)))))) (else 'erased)))) -(define ParserTests-testCase (lambda (arg-0 arg-1 ext-0) (let ((act-1 (PreludeC-45IO-prim__putStr (string-append arg-0 " ... ") ext-0))) (let ((act-2 (arg-1 ext-0))) (PreludeC-45IO-prim__putStr "OK\xa;" ext-0))))) -(define PreludeC-45Types-u--foldl_Foldable_List (lambda (arg-2 arg-3 arg-4) (if (null? arg-4) arg-3 (let ((e-2 (car arg-4))) (let ((e-3 (cdr arg-4))) (PreludeC-45Types-u--foldl_Foldable_List arg-2 ((arg-2 arg-3) e-2) e-3)))))) -(define PreludeC-45Types-u--foldMap_Foldable_List (lambda (arg-2 arg-3 ext-0) (PreludeC-45Types-u--foldl_Foldable_List (lambda (u--acc) (lambda (u--elem) (let ((e-1 (car arg-2))) ((e-1 u--acc) (arg-3 u--elem))))) (let ((e-2 (cdr arg-2))) e-2) ext-0))) -(define ParserTests-minimalManifest (PreludeC-45Types-u--foldMap_Foldable_List csegen-21 (lambda (eta-0) eta-0) (cons "@manifest {\xa; version = \"0.1.0\"\xa; subsystem = \"test\"\xa;}\xa;\xa;@refs {\xa; root : blake3:0123456789abcdef\xa;}" '()))) -(define ParserTests-roundtripTests (lambda (ext-0) (let ((act-1 (PreludeC-45IO-prim__putStr "\xa;=== Roundtrip Tests ===\xa;" ext-0))) (ParserTests-testCase "Serialize then parse minimal manifest" (ParserTests-case--roundtripTests-11077 (OchranceC-45A2MLC-45Lexer-lex ParserTests-minimalManifest)) ext-0)))) -(define ParserTests-policyManifest (PreludeC-45Types-u--foldMap_Foldable_List csegen-21 (lambda (eta-0) eta-0) (cons "@manifest {\xa; version = \"0.1.0\"\xa; subsystem = \"test\"\xa;}\xa;\xa;@refs {\xa; root : blake3:abc123\xa;}\xa;\xa;@policy {\xa; mode = \"checked\"\xa; max_age = 3600\xa; require_sig = true\xa;}" '()))) -(define ParserTests-attestedManifest (PreludeC-45Types-u--foldMap_Foldable_List csegen-21 (lambda (eta-0) eta-0) (cons "@manifest {\xa; version = \"0.1.0\"\xa; subsystem = \"test\"\xa; timestamp = \"2026-02-07T12:00:00Z\"\xa;}\xa;\xa;@refs {\xa; root : blake3:0123456789abcdef\xa; data : sha256:fedcba9876543210\xa;}\xa;\xa;@attestation {\xa; witness = \"test-witness\"\xa; signature = \"sig123\"\xa; pubkey = \"key456\"\xa;}" '()))) -(define ParserTests-parserTests (lambda (ext-0) (let ((act-1 (PreludeC-45IO-prim__putStr "\xa;=== Parser Tests ===\xa;" ext-0))) (let ((act-2 (ParserTests-testCase "Parse minimal manifest" (ParserTests-case--parserTests-10987 (OchranceC-45A2MLC-45Lexer-lex ParserTests-minimalManifest)) ext-0))) (let ((act-3 (ParserTests-testCase "Parse attested manifest" (ParserTests-case--parserTests-10887 (OchranceC-45A2MLC-45Lexer-lex ParserTests-attestedManifest)) ext-0))) (let ((act-4 (ParserTests-testCase "Parse policy manifest" (ParserTests-case--parserTests-10759 (OchranceC-45A2MLC-45Lexer-lex ParserTests-policyManifest)) ext-0))) (ParserTests-testCase "Parse rejects duplicate sections" (let ((u--duplicateManifest (string-append ParserTests-minimalManifest "\xa;@manifest { version = \"0.2.0\" }\xa;"))) (lambda (eta-0) (ParserTests-case--parserTests-10696 u--duplicateManifest (OchranceC-45A2MLC-45Lexer-lex u--duplicateManifest) eta-0))) ext-0))))))) -(define ParserTests-errorHandlingTests (lambda (ext-0) (let ((act-1 (PreludeC-45IO-prim__putStr "\xa;=== Error Handling Tests ===\xa;" ext-0))) (let ((act-2 (ParserTests-testCase "Missing version field" (lambda (eta-0) (ParserTests-case--errorHandlingTests-11360 "@manifest { subsystem = \"test\" }\xa;@refs { root : blake3:abc }" (OchranceC-45A2MLC-45Lexer-lex "@manifest { subsystem = \"test\" }\xa;@refs { root : blake3:abc }") eta-0)) ext-0))) (let ((act-3 (ParserTests-testCase "Invalid hash format" (lambda (eta-0) (ParserTests-case--errorHandlingTests-11297 "@manifest { version = \"0.1.0\" subsystem = \"test\" }\xa;@refs { root : invalid_no_colon }" (OchranceC-45A2MLC-45Lexer-lex "@manifest { version = \"0.1.0\" subsystem = \"test\" }\xa;@refs { root : invalid_no_colon }") eta-0)) ext-0))) (ParserTests-testCase "Unterminated string" (lambda (clam-0) (let ((sc0 (OchranceC-45A2MLC-45Lexer-lex "@manifest { version = \"unterminated }"))) (case (vector-ref sc0 0) ((0) 'erased) (else (PreludeC-45IO-prim__putStr "FAIL: Should reject unterminated string\xa;" clam-0))))) ext-0)))))) -(define PreludeC-45Types-u--C-61C-61_Eq_C-40ListC-32C-36aC-41 (lambda (arg-1 arg-2 arg-3) (if (null? arg-2) (if (null? arg-3) 1 0) (let ((e-2 (car arg-2))) (let ((e-3 (cdr arg-2))) (if (null? arg-3) 0 (let ((e-6 (car arg-3))) (let ((e-7 (cdr arg-3))) (let ((sc2 (let ((e-1 (car arg-1))) ((e-1 e-2) e-6)))) (cond ((equal? sc2 1) (PreludeC-45Types-u--C-61C-61_Eq_C-40ListC-32C-36aC-41 arg-1 e-3 e-7)) (else 0))))))))))) -(define PreludeC-45Types-u--C-47C-61_Eq_C-40ListC-32C-36aC-41 (lambda (arg-1 arg-2 arg-3) (let ((sc0 (PreludeC-45Types-u--C-61C-61_Eq_C-40ListC-32C-36aC-41 arg-1 arg-2 arg-3))) (cond ((equal? sc0 1) 0) (else 1))))) -(define PreludeC-45Show-n--3215-12601-u--showC-39 (lambda (arg-1 arg-2 arg-3 arg-4) (if (null? arg-4) arg-3 (let ((e-2 (car arg-4))) (let ((e-3 (cdr arg-4))) (if (null? e-3) (string-append arg-3 (let ((e-1 (car arg-1))) (e-1 e-2))) (PreludeC-45Show-n--3215-12601-u--showC-39 arg-1 arg-2 (string-append arg-3 (string-append (let ((e-1 (car arg-1))) (e-1 e-2)) ", ")) e-3))))))) -(define PreludeC-45Show-u--show_Show_C-40ListC-32C-36aC-41 (lambda (arg-1 arg-2) (string-append "[" (string-append (PreludeC-45Show-n--3215-12601-u--showC-39 arg-1 arg-2 "" arg-2) "]")))) -(define PreludeC-45Show-u--showPrec_Show_C-40ListC-32C-36aC-41 (lambda (arg-1 arg-2 arg-3) (PreludeC-45Show-u--show_Show_C-40ListC-32C-36aC-41 arg-1 arg-3))) -(define ParserTests-lexerTests (lambda (ext-0) (let ((act-1 (PreludeC-45IO-prim__putStr "\xa;=== Lexer Tests ===\xa;" ext-0))) (let ((act-2 (ParserTests-testCase "Lex empty string" (lambda (clam-0) (let ((sc0 (OchranceC-45A2MLC-45Lexer-lex ""))) (case (vector-ref sc0 0) ((1) (let ((e-2 (vector-ref sc0 1))) (ParserTests-assertEqual (cons (cons (lambda (arg-712) (lambda (arg-715) (PreludeC-45Types-u--C-61C-61_Eq_C-40ListC-32C-36aC-41 csegen-30 arg-712 arg-715))) (lambda (arg-722) (lambda (arg-725) (PreludeC-45Types-u--C-47C-61_Eq_C-40ListC-32C-36aC-41 csegen-30 arg-722 arg-725)))) (cons (lambda (u--x) (PreludeC-45Show-u--show_Show_C-40ListC-32C-36aC-41 csegen-35 u--x)) (lambda (u--d) (lambda (u--x) (PreludeC-45Show-u--showPrec_Show_C-40ListC-32C-36aC-41 csegen-35 u--d u--x))))) (cons (vector 12 ) '()) e-2 clam-0))) (else (let ((e-5 (vector-ref sc0 1))) (PreludeC-45IO-prim__putStr (string-append (string-append "FAIL: " (OchranceC-45A2MLC-45Lexer-u--show_Show_LexError e-5)) "\xa;") clam-0)))))) ext-0))) (let ((act-3 (ParserTests-testCase "Lex minimal manifest" (lambda (clam-0) (let ((sc0 (OchranceC-45A2MLC-45Lexer-lex ParserTests-minimalManifest))) (case (vector-ref sc0 0) ((1) 'erased) (else (let ((e-5 (vector-ref sc0 1))) (PreludeC-45IO-prim__putStr (string-append (string-append "FAIL: " (OchranceC-45A2MLC-45Lexer-u--show_Show_LexError e-5)) "\xa;") clam-0)))))) ext-0))) (let ((act-4 (ParserTests-testCase "Lex with attestation" (lambda (clam-1) (let ((sc0 (OchranceC-45A2MLC-45Lexer-lex ParserTests-attestedManifest))) (case (vector-ref sc0 0) ((1) 'erased) (else (let ((e-5 (vector-ref sc0 1))) (PreludeC-45IO-prim__putStr (string-append (string-append "FAIL: " (OchranceC-45A2MLC-45Lexer-u--show_Show_LexError e-5)) "\xa;") clam-1)))))) ext-0))) (let ((act-5 (ParserTests-testCase "Lex with policy" (lambda (clam-2) (let ((sc0 (OchranceC-45A2MLC-45Lexer-lex ParserTests-policyManifest))) (case (vector-ref sc0 0) ((1) 'erased) (else (let ((e-5 (vector-ref sc0 1))) (PreludeC-45IO-prim__putStr (string-append (string-append "FAIL: " (OchranceC-45A2MLC-45Lexer-u--show_Show_LexError e-5)) "\xa;") clam-2)))))) ext-0))) (ParserTests-testCase "Lex rejects invalid characters" (lambda (clam-3) (let ((sc0 (OchranceC-45A2MLC-45Lexer-lex "@manifest { version = \x0; }"))) (case (vector-ref sc0 0) ((0) 'erased) (else (PreludeC-45IO-prim__putStr "FAIL: Should reject null bytes\xa;" clam-3))))) ext-0)))))))) -(define ParserTests-main (lambda (ext-0) (let ((act-1 (PreludeC-45IO-prim__putStr "===================================\xa;" ext-0))) (let ((act-2 (PreludeC-45IO-prim__putStr "A2ML Parser Property-Based Tests\xa;" ext-0))) (let ((act-3 (PreludeC-45IO-prim__putStr "===================================\xa;" ext-0))) (let ((act-4 (ParserTests-lexerTests ext-0))) (let ((act-5 (ParserTests-parserTests ext-0))) (let ((act-6 (ParserTests-roundtripTests ext-0))) (let ((act-7 (ParserTests-errorHandlingTests ext-0))) (let ((act-8 (PreludeC-45IO-prim__putStr "\xa;===================================\xa;" ext-0))) (let ((act-9 (PreludeC-45IO-prim__putStr "All tests completed!\xa;" ext-0))) (PreludeC-45IO-prim__putStr "===================================\xa;" ext-0)))))))))))) -(define PreludeC-45EqOrd-compareInteger (lambda (ext-0 ext-1) (PreludeC-45EqOrd-u--compare_Ord_Integer ext-0 ext-1))) -(define PrimIO-unsafeCreateWorld (lambda (arg-1) (arg-1 #f))) -(define PrimIO-unsafePerformIO (lambda (arg-1) (PrimIO-unsafeCreateWorld (lambda (u--w) (arg-1 u--w))))) -(collect-request-handler - (let* ([gc-counter 1] - [log-radix 2] - [radix-mask (sub1 (bitwise-arithmetic-shift 1 log-radix))] - [major-gc-factor 2] - [trigger-major-gc-allocated (* major-gc-factor (bytes-allocated))]) - (lambda () - (cond - [(>= (bytes-allocated) trigger-major-gc-allocated) - ;; Force a major collection if memory use has doubled - (collect (collect-maximum-generation)) - (blodwen-run-finalisers) - (set! trigger-major-gc-allocated (* major-gc-factor (bytes-allocated)))] - [else - ;; Imitate the built-in rule, but without ever going to a major collection - (let ([this-counter gc-counter]) - (if (> (add1 this-counter) - (bitwise-arithmetic-shift-left 1 (* log-radix (sub1 (collect-maximum-generation))))) - (set! gc-counter 1) - (set! gc-counter (add1 this-counter))) - (collect - ;; Find the minor generation implied by the counter - (let loop ([c this-counter] [gen 0]) - (cond - [(zero? (bitwise-and c radix-mask)) - (loop (bitwise-arithmetic-shift-right c log-radix) - (add1 gen))] - [else - gen]))))])))) -(PrimIO-unsafePerformIO (lambda (eta-0) (ParserTests-main eta-0))) - (collect-request-handler (lambda () (collect (collect-maximum-generation)) (blodwen-run-finalisers))) - (collect-rendezvous) - - ) \ No newline at end of file diff --git a/tests/A2ML/build/exec/a2ml-tests_app/compileChez b/tests/A2ML/build/exec/a2ml-tests_app/compileChez deleted file mode 100755 index 67699ea..0000000 --- a/tests/A2ML/build/exec/a2ml-tests_app/compileChez +++ /dev/null @@ -1 +0,0 @@ -(parameterize ([optimize-level 3] [compile-file-message #f]) (compile-program "/var/mnt/eclipse/repos/ochrance/tests/A2ML/build/exec/a2ml-tests_app/a2ml-tests.ss")) \ No newline at end of file diff --git a/tests/A2ML/build/ttc/2025081600/ParserTests.ttc b/tests/A2ML/build/ttc/2025081600/ParserTests.ttc deleted file mode 100644 index 12bd242038462a2dc210a8a19062e1977252cb82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185634 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 J^?L$P|9=9`ct!vK diff --git a/tests/A2ML/build/ttc/2025081600/ParserTests.ttm b/tests/A2ML/build/ttc/2025081600/ParserTests.ttm deleted file mode 100644 index 93ba8bcb7b8582d00549fbf51db8ac06b4302145..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61828 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 diff --git a/tests/integration/build/exec/integration-tests b/tests/integration/build/exec/integration-tests deleted file mode 100755 index a81ad45..0000000 --- a/tests/integration/build/exec/integration-tests +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -# @generated by Idris 0.8.0-712523a89, Chez backend - -set -e # exit on any error - -if [ "$(uname)" = Darwin ]; then - DIR=$(zsh -c 'printf %s "$0:A:h"' "$0") -else - DIR=$(dirname "$(readlink -f -- "$0")") -fi -export LD_LIBRARY_PATH="$DIR/integration-tests_app:$LD_LIBRARY_PATH" -export DYLD_LIBRARY_PATH="$DIR/integration-tests_app:$DYLD_LIBRARY_PATH" -export IDRIS2_INC_SRC="$DIR/integration-tests_app" - -"$DIR/integration-tests_app/integration-tests.so" "$@" \ No newline at end of file diff --git a/tests/integration/build/exec/integration-tests_app/compileChez b/tests/integration/build/exec/integration-tests_app/compileChez deleted file mode 100755 index 2982f45..0000000 --- a/tests/integration/build/exec/integration-tests_app/compileChez +++ /dev/null @@ -1 +0,0 @@ -(parameterize ([optimize-level 3] [compile-file-message #f]) (compile-program "/var/mnt/eclipse/repos/ochrance/tests/integration/build/exec/integration-tests_app/integration-tests.ss")) \ No newline at end of file diff --git a/tests/integration/build/exec/integration-tests_app/integration-tests.ss b/tests/integration/build/exec/integration-tests_app/integration-tests.ss deleted file mode 100755 index 5cc6e26..0000000 --- a/tests/integration/build/exec/integration-tests_app/integration-tests.ss +++ /dev/null @@ -1,940 +0,0 @@ -#!/home/hyper/.local/share/../bin/scheme --program - -;; @generated by Idris 0.8.0-712523a89, Chez backend -(import (chezscheme)) -(case (machine-type) - [(i3fb ti3fb a6fb ta6fb) #f] - [(i3le ti3le a6le ta6le tarm64le) - (with-exception-handler (lambda(x) (load-shared-object "libc.so")) - (lambda () (load-shared-object "libc.so.6")))] - [(i3osx ti3osx a6osx ta6osx tarm64osx tppc32osx tppc64osx) (load-shared-object "libc.dylib")] - [(i3nt ti3nt a6nt ta6nt) (load-shared-object "msvcrt.dll")] - [else (load-shared-object "libc.so")]) - -(load-shared-object "libidris2_support.so") - -(let () -#!chezscheme - -(define (blodwen-os) - (case (machine-type) - [(i3le ti3le a6le ta6le tarm64le) "unix"] ; GNU/Linux - [(i3ob ti3ob a6ob ta6ob tarm64ob) "unix"] ; OpenBSD - [(i3fb ti3fb a6fb ta6fb tarm64fb) "unix"] ; FreeBSD - [(i3nb ti3nb a6nb ta6nb tarm64nb) "unix"] ; NetBSD - [(i3osx ti3osx a6osx ta6osx tarm64osx tppc32osx tppc64osx) "darwin"] - [(i3nt ti3nt a6nt ta6nt tarm64nt) "windows"] - [else "unknown"])) - -(define blodwen-lazy - (lambda (f) - (let ([evaluated #f] [res void]) - (lambda () - (if (not evaluated) - (begin (set! evaluated #t) - (set! res (f)) - (set! f void)) - (void)) - res)))) - -(define (blodwen-delay-lazy f) - (weak-cons #!bwp f)) - -(define (blodwen-force-lazy e) - (let ((exval (car e))) - (if (bwp-object? exval) - (let ((val ((cdr e)))) - (begin (set-car! e val) val)) - exval))) - -(define (blodwen-toSignedInt x bits) - (if (logbit? bits x) - (logor x (ash -1 bits)) - (logand x (sub1 (ash 1 bits))))) - -(define (blodwen-toUnsignedInt x bits) - (logand x (sub1 (ash 1 bits)))) - -(define (blodwen-euclidDiv a b) - (let ((q (quotient a b)) - (r (remainder a b))) - (if (< r 0) - (if (> b 0) (- q 1) (+ q 1)) - q))) - -(define (blodwen-euclidMod a b) - (let ((r (remainder a b))) - (if (< r 0) - (if (> b 0) (+ r b) (- r b)) - r))) - -; flonum constants - -(define (blodwen-calcFlonumUnitRoundoff) - (let loop [(uro 1.0)] - (if (fl= 1.0 (fl+ 1.0 uro)) - uro - (loop (fl/ uro 2.0))))) - -(define (blodwen-calcFlonumEpsilon) - (fl* (blodwen-calcFlonumUnitRoundoff) 2.0)) - -(define (blodwen-flonumNaN) - +nan.0) - -(define (blodwen-flonumInf) - +inf.0) - -; Bits - -(define bu+ (lambda (x y bits) (blodwen-toUnsignedInt (+ x y) bits))) -(define bu- (lambda (x y bits) (blodwen-toUnsignedInt (- x y) bits))) -(define bu* (lambda (x y bits) (blodwen-toUnsignedInt (* x y) bits))) -(define bu/ (lambda (x y bits) (blodwen-toUnsignedInt (quotient x y) bits))) - -(define bs+ (lambda (x y bits) (blodwen-toSignedInt (+ x y) bits))) -(define bs- (lambda (x y bits) (blodwen-toSignedInt (- x y) bits))) -(define bs* (lambda (x y bits) (blodwen-toSignedInt (* x y) bits))) -(define bs/ (lambda (x y bits) (blodwen-toSignedInt (blodwen-euclidDiv x y) bits))) - -(define (integer->bits8 x) (logand x (sub1 (ash 1 8)))) -(define (integer->bits16 x) (logand x (sub1 (ash 1 16)))) -(define (integer->bits32 x) (logand x (sub1 (ash 1 32)))) -(define (integer->bits64 x) (logand x (sub1 (ash 1 64)))) - -(define (bits16->bits8 x) (logand x (sub1 (ash 1 8)))) -(define (bits32->bits8 x) (logand x (sub1 (ash 1 8)))) -(define (bits64->bits8 x) (logand x (sub1 (ash 1 8)))) -(define (bits32->bits16 x) (logand x (sub1 (ash 1 16)))) -(define (bits64->bits16 x) (logand x (sub1 (ash 1 16)))) -(define (bits64->bits32 x) (logand x (sub1 (ash 1 32)))) - -(define (blodwen-bits-shl-signed x y bits) (blodwen-toSignedInt (ash x y) bits)) - -(define (blodwen-bits-shl x y bits) (logand (ash x y) (sub1 (ash 1 bits)))) - -(define blodwen-shl (lambda (x y) (ash x y))) -(define blodwen-shr (lambda (x y) (ash x (- y)))) -(define blodwen-and (lambda (x y) (logand x y))) -(define blodwen-or (lambda (x y) (logor x y))) -(define blodwen-xor (lambda (x y) (logxor x y))) - -(define cast-num - (lambda (x) - (if (number? x) x 0))) -(define destroy-prefix - (lambda (x) - (cond - ((equal? x "") "") - ((equal? (string-ref x 0) #\#) "") - (else x)))) - -(define exact-floor - (lambda (x) - (inexact->exact (floor x)))) - -(define exact-truncate - (lambda (x) - (inexact->exact (truncate x)))) - -(define exact-truncate-boundedInt - (lambda (x y) - (blodwen-toSignedInt (exact-truncate x) y))) - -(define exact-truncate-boundedUInt - (lambda (x y) - (blodwen-toUnsignedInt (exact-truncate x) y))) - -(define cast-char-boundedInt - (lambda (x y) - (blodwen-toSignedInt (char->integer x) y))) - -(define cast-char-boundedUInt - (lambda (x y) - (blodwen-toUnsignedInt (char->integer x) y))) - -(define cast-string-int - (lambda (x) - (exact-truncate (cast-num (string->number (destroy-prefix x)))))) - -(define cast-string-boundedInt - (lambda (x y) - (blodwen-toSignedInt (cast-string-int x) y))) - -(define cast-string-boundedUInt - (lambda (x y) - (blodwen-toUnsignedInt (cast-string-int x) y))) - -(define cast-int-char - (lambda (x) - (if (or - (and (>= x 0) (<= x #xd7ff)) - (and (>= x #xe000) (<= x #x10ffff))) - (integer->char x) - (integer->char 0)))) - -(define cast-string-double - (lambda (x) - (exact->inexact (cast-num (string->number (destroy-prefix x)))))) - - -(define (string-concat xs) (apply string-append xs)) -(define (string-unpack s) (string->list s)) -(define (string-pack xs) (list->string xs)) - -(define string-cons (lambda (x y) (string-append (string x) y))) -(define string-reverse (lambda (x) - (list->string (reverse (string->list x))))) -(define (string-substr off len s) - (let* ((l (string-length s)) - (b (max 0 off)) - (x (max 0 len)) - (end (min l (+ b x)))) - (if (> b l) - "" - (substring s b end)))) - -(define (blodwen-string-iterator-new s) - 0) - -(define (blodwen-string-iterator-to-string _ s ofs f) - (f (substring s ofs (string-length s)))) - -(define (blodwen-string-iterator-next s ofs) - (if (>= ofs (string-length s)) - '() ; EOF - (cons (string-ref s ofs) (+ ofs 1)))) - -(define either-left - (lambda (x) - (vector 0 x))) - -(define either-right - (lambda (x) - (vector 1 x))) - -(define blodwen-error-quit - (lambda (msg) - (display msg) - (newline) - (exit 1))) - -(define (blodwen-get-line p) - (if (port? p) - (let ((str (get-line p))) - (if (eof-object? str) - "" - str)) - void)) - -(define (blodwen-get-char p) - (if (port? p) - (let ((chr (get-char p))) - (if (eof-object? chr) - #\nul - chr)) - void)) - -;; Buffers - -(define (blodwen-new-buffer size) - (make-bytevector size 0)) - -(define (blodwen-buffer-size buf) - (bytevector-length buf)) - -(define (blodwen-buffer-setbyte buf loc val) - (bytevector-u8-set! buf loc val)) - -(define (blodwen-buffer-getbyte buf loc) - (bytevector-u8-ref buf loc)) - -(define (blodwen-buffer-setbits16 buf loc val) - (bytevector-u16-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getbits16 buf loc) - (bytevector-u16-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setbits32 buf loc val) - (bytevector-u32-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getbits32 buf loc) - (bytevector-u32-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setbits64 buf loc val) - (bytevector-u64-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getbits64 buf loc) - (bytevector-u64-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setint8 buf loc val) - (bytevector-s8-set! buf loc val)) - -(define (blodwen-buffer-getint8 buf loc) - (bytevector-s8-ref buf loc)) - -(define (blodwen-buffer-setint16 buf loc val) - (bytevector-s16-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getint16 buf loc) - (bytevector-s16-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setint32 buf loc val) - (bytevector-s32-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getint32 buf loc) - (bytevector-s32-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setint buf loc val) - (bytevector-s64-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getint buf loc) - (bytevector-s64-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setint64 buf loc val) - (bytevector-s64-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getint64 buf loc) - (bytevector-s64-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setdouble buf loc val) - (bytevector-ieee-double-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getdouble buf loc) - (bytevector-ieee-double-ref buf loc (native-endianness))) - -(define (blodwen-stringbytelen str) - (bytevector-length (string->utf8 str))) - -(define (blodwen-buffer-setstring buf loc val) - (let* [(strvec (string->utf8 val)) - (len (bytevector-length strvec))] - (bytevector-copy! strvec 0 buf loc len))) - -(define (blodwen-buffer-getstring buf loc len) - (let [(newvec (make-bytevector len))] - (bytevector-copy! buf loc newvec 0 len) - (utf8->string newvec))) - -(define (blodwen-buffer-copydata buf start len dest loc) - (bytevector-copy! buf start dest loc len)) - -;; Threads - -(define-record thread-handle (semaphore)) - -(define (blodwen-thread proc) - (let [(sema (blodwen-make-semaphore 0))] - (fork-thread (lambda () (proc (vector 0)) (blodwen-semaphore-post sema))) - (make-thread-handle sema) - )) - -(define (blodwen-thread-wait handle) - (blodwen-semaphore-wait (thread-handle-semaphore handle))) - -;; Thread mailboxes - -(define blodwen-thread-data - (make-thread-parameter #f)) - -(define (blodwen-get-thread-data ty) - (blodwen-thread-data)) - -(define (blodwen-set-thread-data ty a) - (blodwen-thread-data a)) - -;; Semaphore - -(define-record semaphore (box mutex condition)) - -(define (blodwen-make-semaphore init) - (make-semaphore (box init) (make-mutex) (make-condition))) - -(define (blodwen-semaphore-post sema) - (with-mutex (semaphore-mutex sema) - (let [(sema-box (semaphore-box sema))] - (set-box! sema-box (+ (unbox sema-box) 1)) - (condition-signal (semaphore-condition sema)) - ))) - -(define (blodwen-semaphore-wait sema) - (with-mutex (semaphore-mutex sema) - (let [(sema-box (semaphore-box sema))] - (when (= (unbox sema-box) 0) - (condition-wait (semaphore-condition sema) (semaphore-mutex sema))) - (set-box! sema-box (- (unbox sema-box) 1)) - ))) - -;; Barrier - -(define-record barrier (count-box num-threads mutex cond)) - -(define (blodwen-make-barrier num-threads) - (make-barrier (box 0) num-threads (make-mutex) (make-condition))) - -(define (blodwen-barrier-wait barrier) - (let [(count-box (barrier-count-box barrier)) - (num-threads (barrier-num-threads barrier)) - (mutex (barrier-mutex barrier)) - (condition (barrier-cond barrier))] - (with-mutex mutex - (let* [(count-old (unbox count-box)) - (count-new (+ count-old 1))] - (set-box! count-box count-new) - (if (= count-new num-threads) - (condition-broadcast condition) - (condition-wait condition mutex)) - )))) - -;; Channel -; With thanks to Alain Zscheile (@zseri) for help with understanding condition -; variables, and figuring out where the problems were and how to solve them. - -(define-record channel (read-mut read-cv read-box val-cv val-box)) - -(define (blodwen-make-channel ty) - (make-channel - (make-mutex) - (make-condition) - (box #t) - (make-condition) - (box '()) - )) - -; block on the read status using read-cv until the value has been read -(define (channel-put-while-helper chan) - (let ([read-mut (channel-read-mut chan)] - [read-box (channel-read-box chan)] - [read-cv (channel-read-cv chan)] - ) - (if (unbox read-box) - (void) ; val has been read, so everything is fine - (begin ; otherwise, block/spin with cv - (condition-wait read-cv read-mut) - (channel-put-while-helper chan) - ) - ))) - -(define (blodwen-channel-put ty chan val) - (with-mutex (channel-read-mut chan) - (channel-put-while-helper chan) - (let ([read-box (channel-read-box chan)] - [val-box (channel-val-box chan)] - ) - (set-box! val-box val) - (set-box! read-box #f) - )) - (condition-signal (channel-val-cv chan)) - ) - -; block on the value until it has been set -(define (channel-get-while-helper chan) - (let ([read-mut (channel-read-mut chan)] - [read-box (channel-read-box chan)] - [val-cv (channel-val-cv chan)] - ) - (if (unbox read-box) - (begin - (condition-wait val-cv read-mut) - (channel-get-while-helper chan) - ) - (void) - ))) - -(define (blodwen-channel-get ty chan) - (mutex-acquire (channel-read-mut chan)) - (channel-get-while-helper chan) - (let* ([val-box (channel-val-box chan)] - [read-box (channel-read-box chan)] - [read-cv (channel-read-cv chan)] - [the-val (unbox val-box)] - ) - (set-box! val-box '()) - (set-box! read-box #t) - (mutex-release (channel-read-mut chan)) - (condition-signal read-cv) - the-val)) - -(define (blodwen-channel-get-non-blocking ty chan) - (if (mutex-acquire (channel-read-mut chan) #f) - (let* ([val-box (channel-val-box chan)] - [read-box (channel-read-box chan)] - [read-cv (channel-read-cv chan)] - [the-val (unbox val-box)] - ) - (if (null? the-val) - (begin - (mutex-release (channel-read-mut chan)) - '()) - (begin - (set-box! val-box '()) - (set-box! read-box #t) - (mutex-release (channel-read-mut chan)) - (condition-signal read-cv) - (box the-val)) - )) - '())) - -(define (blodwen-channel-get-with-timeout ty chan timeout) - ;; timeout is in milliseconds, convert to nanoseconds - (let* ([timeout-ns (* timeout 1000000)] - [sleep-ns 10000] ; 10 us step - [sleep-time (make-time 'time-duration (mod sleep-ns 1000000000) - (div sleep-ns 1000000000))]) - (let loop ([elapsed 0]) - (if (mutex-acquire (channel-read-mut chan) #f) - (let* ([val-box (channel-val-box chan)] - [the-val (unbox val-box)]) - (if (null? the-val) - (if (>= elapsed timeout-ns) - (begin - (mutex-release (channel-read-mut chan)) - '()) - (begin - (mutex-release (channel-read-mut chan)) - (sleep sleep-time) - (loop (+ elapsed sleep-ns)))) - (let* ([read-box (channel-read-box chan)] - [read-cv (channel-read-cv chan)]) - (set-box! val-box '()) - (set-box! read-box #t) - (mutex-release (channel-read-mut chan)) - (condition-signal read-cv) - (box the-val)))) - (begin - (sleep sleep-time) - (loop (+ elapsed sleep-ns))))))) - -;; Mutex - -(define (blodwen-make-mutex) - (make-mutex)) -(define (blodwen-mutex-acquire mutex) - (mutex-acquire mutex)) -(define (blodwen-mutex-release mutex) - (mutex-release mutex)) - -;; Condition variable - -(define (blodwen-make-condition) - (make-condition)) -(define (blodwen-condition-wait condition mutex) - (condition-wait condition mutex)) -(define (blodwen-condition-wait-timeout condition mutex timeout) - (let* [(sec (div timeout 1000000)) - (micro (mod timeout 1000000))] - (condition-wait condition mutex (make-time 'time-duration (* 1000 micro) sec)))) -(define (blodwen-condition-signal condition) - (condition-signal condition)) -(define (blodwen-condition-broadcast condition) - (condition-broadcast condition)) - -;; Future - -(define-record future-internal (result ready mutex signal)) -(define (blodwen-make-future ty work) - (let ([future (make-future-internal #f #f (make-mutex) (make-condition))]) - (fork-thread (lambda () - (let ([result (work '())]) - (with-mutex (future-internal-mutex future) - (set-future-internal-result! future result) - (set-future-internal-ready! future #t) - (condition-broadcast (future-internal-signal future)))))) - future)) -(define (blodwen-await-future ty future) - (let ([mutex (future-internal-mutex future)]) - (with-mutex mutex - (if (not (future-internal-ready future)) - (condition-wait (future-internal-signal future) mutex)) - (future-internal-result future)))) - -(define (blodwen-sleep s) (sleep (make-time 'time-duration 0 s))) -(define (blodwen-usleep s) - (let ((sec (div s 1000000)) - (micro (mod s 1000000))) - (sleep (make-time 'time-duration (* 1000 micro) sec)))) - -(define (blodwen-clock-time-utc) (current-time 'time-utc)) -(define (blodwen-clock-time-monotonic) (current-time 'time-monotonic)) -(define (blodwen-clock-time-duration) (current-time 'time-duration)) -(define (blodwen-clock-time-process) (current-time 'time-process)) -(define (blodwen-clock-time-thread) (current-time 'time-thread)) -(define (blodwen-clock-time-gccpu) (current-time 'time-collector-cpu)) -(define (blodwen-clock-time-gcreal) (current-time 'time-collector-real)) -(define (blodwen-is-time? clk) (if (time? clk) 1 0)) -(define (blodwen-clock-second time) (time-second time)) -(define (blodwen-clock-nanosecond time) (time-nanosecond time)) - -(define (blodwen-arg-count) - (length (command-line))) - -(define (blodwen-arg n) - (if (< n (length (command-line))) (list-ref (command-line) n) "")) - -(define (blodwen-hasenv var) - (if (eq? (getenv var) #f) 0 1)) - -;; Randoms -(define random-seed-register 0) -(define (initialize-random-seed-once) - (if (= (virtual-register random-seed-register) 0) - (let ([seed (time-nanosecond (current-time))]) - (set-virtual-register! random-seed-register seed) - (random-seed seed)))) - -(define (blodwen-random-seed seed) - (set-virtual-register! random-seed-register seed) - (random-seed seed)) -(define blodwen-random - (case-lambda - ;; no argument, pick a real value from [0, 1.0) - [() (begin - (initialize-random-seed-once) - (random 1.0))] - ;; single argument k, pick an integral value from [0, k) - [(k) - (begin - (initialize-random-seed-once) - (if (> k 0) - (random k) - (assertion-violationf 'blodwen-random "invalid range argument ~a" k)))])) - -;; For finalisers - -(define blodwen-finaliser (make-guardian)) -(define (blodwen-register-object obj proc) - (let [(x (cons obj proc))] - (blodwen-finaliser x) - x)) -(define blodwen-run-finalisers - (lambda () - (let run () - (let ([x (blodwen-finaliser)]) - (when x - (((cdr x) (car x)) 'erased) - (run)))))) - -;; For creating and reading back scheme objects - -; read a scheme string and evaluate it, returning 'Just result' on success -; TODO: catch exception! -(define (blodwen-eval-scheme str) - (guard - (x [#t '()]) ; Nothing on failure - (box (eval (read (open-input-string str))))) - ); box == Just - -(define (blodwen-eval-okay obj) - (if (null? obj) - 0 - 1)) - -(define (blodwen-get-eval-result obj) - (unbox obj)) - -(define (blodwen-debug-scheme obj) - (display obj) (newline)) - -(define (blodwen-is-number obj) - (if (number? obj) 1 0)) - -(define (blodwen-is-integer obj) - (if (and (number? obj) (exact? obj)) 1 0)) - -(define (blodwen-is-float obj) - (if (flonum? obj) 1 0)) - -(define (blodwen-is-char obj) - (if (char? obj) 1 0)) - -(define (blodwen-is-string obj) - (if (string? obj) 1 0)) - -(define (blodwen-is-procedure obj) - (if (procedure? obj) 1 0)) - -(define (blodwen-is-symbol obj) - (if (symbol? obj) 1 0)) - -(define (blodwen-is-vector obj) - (if (vector? obj) 1 0)) - -(define (blodwen-is-nil obj) - (if (null? obj) 1 0)) - -(define (blodwen-is-pair obj) - (if (pair? obj) 1 0)) - -(define (blodwen-is-box obj) - (if (box? obj) 1 0)) - -(define (blodwen-make-symbol str) - (string->symbol str)) - -; The below rely on checking that the objects are the right type first. - -(define (blodwen-vector-ref obj i) - (vector-ref obj i)) - -(define (blodwen-vector-length obj) - (vector-length obj)) - -(define (blodwen-vector-list obj) - (vector->list obj)) - -(define (blodwen-unbox obj) - (unbox obj)) - -(define (blodwen-apply obj arg) - (obj arg)) - -(define (blodwen-force obj) - (obj)) - -(define (blodwen-read-symbol sym) - (symbol->string sym)) - -(define (blodwen-id x) x) -(define PreludeC-45Types-fastUnpack (lambda (farg-0) (string-unpack farg-0))) -(define PreludeC-45Types-fastPack (lambda (farg-0) (string-pack farg-0))) -(define PreludeC-45Types-fastConcat (lambda (farg-0) (string-concat farg-0))) -(define PreludeC-45IO-prim__putStr (lambda (farg-0 farg-1) ((foreign-procedure "idris2_putStr" (string) void) farg-0))) -(define PreludeC-45IO-u--map_Functor_IO (lambda (arg-2 arg-3 ext-0) (let ((act-2 (arg-3 ext-0))) (arg-2 act-2)))) -(define csegen-13 (cons (vector (vector (lambda (u--b) (lambda (u--a) (lambda (u--func) (lambda (arg-8912) (lambda (eta-0) (PreludeC-45IO-u--map_Functor_IO u--func arg-8912 eta-0)))))) (lambda (u--a) (lambda (arg-9951) (lambda (eta-0) arg-9951))) (lambda (u--b) (lambda (u--a) (lambda (arg-9957) (lambda (arg-9964) (lambda (world-4) (let ((act-5 (arg-9957 world-4))) (let ((act-3 (arg-9964 world-4))) (act-5 act-3))))))))) (lambda (u--b) (lambda (u--a) (lambda (arg-10436) (lambda (arg-10439) (lambda (world-0) (let ((act-1 (arg-10436 world-0))) ((arg-10439 act-1) world-0))))))) (lambda (u--a) (lambda (arg-10450) (lambda (world-0) (let ((act-1 (arg-10450 world-0))) (act-1 world-0)))))) (lambda (u--a) (lambda (arg-13044) arg-13044)))) -(define PreludeC-45EqOrd-u--C-61C-61_Eq_String (lambda (arg-0 arg-1) (let ((sc0 (or (and (string=? arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45EqOrd-u--C-47C-61_Eq_String (lambda (arg-0 arg-1) (let ((sc0 (PreludeC-45EqOrd-u--C-61C-61_Eq_String arg-0 arg-1))) (cond ((equal? sc0 1) 0) (else 1))))) -(define csegen-45 (lambda (u--str) (PreludeC-45EqOrd-u--C-47C-61_Eq_String u--str ""))) -(define PreludeC-45EqOrd-u--C-61C-61_Eq_Char (lambda (arg-0 arg-1) (let ((sc0 (or (and (char=? arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define csegen-46 (lambda (arg-0) (PreludeC-45EqOrd-u--C-61C-61_Eq_Char arg-0 #\_))) -(define PreludeC-45InterfacesC-45BoolC-45Semigroup-u--C-60C-43C-62_Semigroup_AllBool (lambda (arg-0 arg-1) (cond ((equal? arg-0 1) arg-1) (else 0)))) -(define csegen-48 (cons (lambda (arg-8497) (lambda (arg-8500) (PreludeC-45InterfacesC-45BoolC-45Semigroup-u--C-60C-43C-62_Semigroup_AllBool arg-8497 arg-8500))) 1)) -(define csegen-85 (vector (lambda (arg-5919) (lambda (arg-5922) (+ arg-5919 arg-5922))) (lambda (arg-5929) (lambda (arg-5932) (* arg-5929 arg-5932))) (lambda (arg-5939) arg-5939))) -(define u--prim__sub_Integer (lambda (arg-0 arg-1) (- arg-0 arg-1))) -(define PreludeC-45TypesC-45List-lengthPlus (lambda (arg-1 arg-2) (if (null? arg-2) arg-1 (let ((e-3 (cdr arg-2))) (PreludeC-45TypesC-45List-lengthPlus (+ arg-1 1) e-3))))) -(define PreludeC-45TypesC-45List-lengthTR (lambda (ext-0) (PreludeC-45TypesC-45List-lengthPlus 0 ext-0))) -(define PreludeC-45Show-firstCharIs (lambda (arg-0 arg-1) (cond ((equal? arg-1 "") 0)(else (arg-0 (string-ref arg-1 0)))))) -(define PreludeC-45Show-showParens (lambda (arg-0 arg-1) (cond ((equal? arg-0 0) arg-1) (else (string-append "(" (string-append arg-1 ")")))))) -(define PreludeC-45EqOrd-u--C-61C-61_Eq_Ordering (lambda (arg-0 arg-1) (cond ((equal? arg-0 0) (cond ((equal? arg-1 0) 1)(else 0))) ((equal? arg-0 1) (cond ((equal? arg-1 1) 1)(else 0))) ((equal? arg-0 2) (cond ((equal? arg-1 2) 1)(else 0)))(else 0)))) -(define PreludeC-45EqOrd-u--C-47C-61_Eq_Ordering (lambda (arg-0 arg-1) (let ((sc0 (PreludeC-45EqOrd-u--C-61C-61_Eq_Ordering arg-0 arg-1))) (cond ((equal? sc0 1) 0) (else 1))))) -(define PreludeC-45Show-precCon (lambda (arg-0) (case (vector-ref arg-0 0) ((0) 0) ((1) 1) ((2) 2) ((3) 3) ((4) 4) ((5) 5) (else 6)))) -(define PreludeC-45EqOrd-u--C-60_Ord_Integer (lambda (arg-0 arg-1) (let ((sc0 (or (and (< arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45EqOrd-u--C-61C-61_Eq_Integer (lambda (arg-0 arg-1) (let ((sc0 (or (and (= arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45EqOrd-u--compare_Ord_Integer (lambda (arg-0 arg-1) (let ((sc0 (PreludeC-45EqOrd-u--C-60_Ord_Integer arg-0 arg-1))) (cond ((equal? sc0 1) 0) (else (let ((sc1 (PreludeC-45EqOrd-u--C-61C-61_Eq_Integer arg-0 arg-1))) (cond ((equal? sc1 1) 1) (else 2)))))))) -(define PreludeC-45Show-u--compare_Ord_Prec (lambda (arg-0 arg-1) (case (vector-ref arg-0 0) ((4) (let ((e-0 (vector-ref arg-0 1))) (case (vector-ref arg-1 0) ((4) (let ((e-1 (vector-ref arg-1 1))) (PreludeC-45EqOrd-u--compare_Ord_Integer e-0 e-1)))(else (PreludeC-45EqOrd-u--compare_Ord_Integer (PreludeC-45Show-precCon arg-0) (PreludeC-45Show-precCon arg-1))))))(else (PreludeC-45EqOrd-u--compare_Ord_Integer (PreludeC-45Show-precCon arg-0) (PreludeC-45Show-precCon arg-1)))))) -(define PreludeC-45Show-u--C-62C-61_Ord_Prec (lambda (arg-0 arg-1) (PreludeC-45EqOrd-u--C-47C-61_Eq_Ordering (PreludeC-45Show-u--compare_Ord_Prec arg-0 arg-1) 0))) -(define PreludeC-45Show-primNumShow (lambda (arg-1 arg-2 arg-3) (let ((u--str (arg-1 arg-3))) (PreludeC-45Show-showParens (let ((sc0 (PreludeC-45Show-u--C-62C-61_Ord_Prec arg-2 (vector 5 )))) (cond ((equal? sc0 1) (PreludeC-45Show-firstCharIs (lambda (arg-0) (PreludeC-45EqOrd-u--C-61C-61_Eq_Char arg-0 #\-)) u--str)) (else 0))) u--str)))) -(define PreludeC-45Show-u--showPrec_Show_Integer (lambda (ext-0 ext-1) (PreludeC-45Show-primNumShow (lambda (eta-0) (number->string eta-0)) ext-0 ext-1))) -(define PreludeC-45Show-u--show_Show_Integer (lambda (arg-0) (PreludeC-45Show-u--showPrec_Show_Integer (vector 0 ) arg-0))) -(define PreludeC-45Show-u--show_Show_Nat (lambda (arg-0) (PreludeC-45Show-u--show_Show_Integer arg-0))) -(define OchranceC-45A2MLC-45Lexer-u--show_Show_Token (lambda (arg-0) (case (vector-ref arg-0 0) ((0) "MANIFEST") ((1) "REFS") ((2) "ATTESTATION") ((3) "POLICY") ((4) "LBRACE") ((5) "RBRACE") ((6) "COLON") ((7) "EQUALS") ((8) (let ((e-0 (vector-ref arg-0 1))) (string-append "IDENT(" (string-append e-0 ")")))) ((9) (let ((e-1 (vector-ref arg-0 1))) (string-append "STRING(\"" (string-append e-1 "\")")))) ((10) (let ((e-2 (vector-ref arg-0 1))) (string-append "NUMBER(" (string-append (PreludeC-45Show-u--show_Show_Integer e-2) ")")))) ((11) (let ((e-3 (vector-ref arg-0 1))) (let ((e-4 (vector-ref arg-0 2))) (string-append "HASH(" (string-append e-3 (string-append ":" (string-append e-4 ")"))))))) (else "EOF")))) -(define OchranceC-45A2MLC-45Parser-u--show_Show_ParseError (lambda (arg-0) (case (vector-ref arg-0 0) ((0) (let ((e-0 (vector-ref arg-0 1))) (let ((e-1 (vector-ref arg-0 2))) (let ((e-2 (vector-ref arg-0 3))) (string-append "Parse error at position " (string-append (PreludeC-45Show-u--show_Show_Nat e-2) (string-append ": expected " (string-append e-0 (string-append ", got " (OchranceC-45A2MLC-45Lexer-u--show_Show_Token e-1)))))))))) ((1) (let ((e-3 (vector-ref arg-0 1))) (let ((e-4 (vector-ref arg-0 2))) (string-append "Missing required section @" (string-append e-3 (string-append " at position " (PreludeC-45Show-u--show_Show_Nat e-4))))))) ((2) (let ((e-5 (vector-ref arg-0 1))) (let ((e-6 (vector-ref arg-0 2))) (string-append "Duplicate section @" (string-append e-5 (string-append " at position " (PreludeC-45Show-u--show_Show_Nat e-6))))))) ((3) (let ((e-7 (vector-ref arg-0 1))) (let ((e-8 (vector-ref arg-0 2))) (let ((e-9 (vector-ref arg-0 3))) (let ((e-10 (vector-ref arg-0 4))) (string-append "Invalid value for " (string-append e-7 (string-append "=" (string-append e-8 (string-append " (" (string-append e-9 (string-append ") at position " (PreludeC-45Show-u--show_Show_Nat e-10))))))))))))) (else (let ((e-11 (vector-ref arg-0 1))) (string-append "Unexpected end of input in " e-11)))))) -(define IntegrationTests-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32test_RoundtripSerialization-6239 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5 ext-0) (case (vector-ref arg-5 0) ((0) (let ((e-2 (vector-ref arg-5 1))) (box (string-append "Parse failed: " (OchranceC-45A2MLC-45Parser-u--show_Show_ParseError e-2))))) (else (let ((e-5 (vector-ref arg-5 1))) (let ((sc1 (let ((sc2 (PreludeC-45EqOrd-u--C-61C-61_Eq_String (let ((e-0 (vector-ref arg-1 0))) (let ((e-7 (vector-ref e-0 0))) e-7)) (let ((e-0 (vector-ref e-5 0))) (let ((e-7 (vector-ref e-0 0))) e-7))))) (cond ((equal? sc2 1) (let ((sc3 (PreludeC-45EqOrd-u--C-61C-61_Eq_String (let ((e-0 (vector-ref arg-1 0))) (let ((e-6 (vector-ref e-0 1))) e-6)) (let ((e-0 (vector-ref e-5 0))) (let ((e-6 (vector-ref e-0 1))) e-6))))) (cond ((equal? sc3 1) (or (and (= (PreludeC-45TypesC-45List-lengthTR (let ((e-1 (vector-ref arg-1 1))) e-1)) (PreludeC-45TypesC-45List-lengthTR (let ((e-1 (vector-ref e-5 1))) e-1))) 1) 0)) (else 0)))) (else 0))))) (cond ((equal? sc1 1) '()) (else (box "Roundtrip data mismatch"))))))))) -(define OchranceC-45A2MLC-45Lexer-u--C-61C-61_Eq_Token (lambda (arg-0 arg-1) (case (vector-ref arg-0 0) ((0) (case (vector-ref arg-1 0) ((0) 1)(else 0))) ((1) (case (vector-ref arg-1 0) ((1) 1)(else 0))) ((2) (case (vector-ref arg-1 0) ((2) 1)(else 0))) ((3) (case (vector-ref arg-1 0) ((3) 1)(else 0))) ((4) (case (vector-ref arg-1 0) ((4) 1)(else 0))) ((5) (case (vector-ref arg-1 0) ((5) 1)(else 0))) ((6) (case (vector-ref arg-1 0) ((6) 1)(else 0))) ((7) (case (vector-ref arg-1 0) ((7) 1)(else 0))) ((8) (let ((e-0 (vector-ref arg-0 1))) (case (vector-ref arg-1 0) ((8) (let ((e-5 (vector-ref arg-1 1))) (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-0 e-5)))(else 0)))) ((9) (let ((e-1 (vector-ref arg-0 1))) (case (vector-ref arg-1 0) ((9) (let ((e-6 (vector-ref arg-1 1))) (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-1 e-6)))(else 0)))) ((10) (let ((e-2 (vector-ref arg-0 1))) (case (vector-ref arg-1 0) ((10) (let ((e-7 (vector-ref arg-1 1))) (PreludeC-45EqOrd-u--C-61C-61_Eq_Integer e-2 e-7)))(else 0)))) ((11) (let ((e-3 (vector-ref arg-0 1))) (let ((e-4 (vector-ref arg-0 2))) (case (vector-ref arg-1 0) ((11) (let ((e-8 (vector-ref arg-1 1))) (let ((e-9 (vector-ref arg-1 2))) (let ((sc2 (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-3 e-8))) (cond ((equal? sc2 1) (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-4 e-9)) (else 0))))))(else 0))))) ((12) (case (vector-ref arg-1 0) ((12) 1)(else 0)))(else 0)))) -(define OchranceC-45A2MLC-45Parser-expectToken (lambda (arg-0 arg-1) (let ((e-0 (car arg-1))) (let ((e-1 (cdr arg-1))) (if (null? e-0) (vector 0 (vector 4 (string-append "expected " (OchranceC-45A2MLC-45Lexer-u--show_Show_Token arg-0)))) (let ((e-4 (car e-0))) (let ((e-5 (cdr e-0))) (let ((sc2 (OchranceC-45A2MLC-45Lexer-u--C-61C-61_Eq_Token e-4 arg-0))) (cond ((equal? sc2 1) (vector 1 (cons e-5 (+ e-1 1)))) (else (vector 0 (vector 0 (OchranceC-45A2MLC-45Lexer-u--show_Show_Token arg-0) e-4 e-1)))))))))))) -(define OchranceC-45A2MLC-45Parser-parseField (lambda (arg-0) (let ((e-0 (car arg-0))) (let ((e-1 (cdr arg-0))) (if (null? e-0) (vector 0 (vector 4 "field assignment")) (let ((e-4 (car e-0))) (let ((e-5 (cdr e-0))) (case (vector-ref e-4 0) ((8) (let ((e-6 (vector-ref e-4 1))) (if (null? e-5) (vector 0 (vector 0 "IDENT = STRING" e-4 e-1)) (let ((e-8 (car e-5))) (let ((e-9 (cdr e-5))) (case (vector-ref e-8 0) ((7) (if (null? e-9) (vector 0 (vector 0 "IDENT = STRING" e-4 e-1)) (let ((e-11 (car e-9))) (let ((e-12 (cdr e-9))) (case (vector-ref e-11 0) ((9) (let ((e-13 (vector-ref e-11 1))) (vector 1 (cons e-6 (cons e-13 (cons e-12 (+ e-1 3)))))))(else (vector 0 (vector 0 "IDENT = STRING" e-4 e-1))))))))(else (vector 0 (vector 0 "IDENT = STRING" e-4 e-1)))))))))(else (vector 0 (vector 0 "IDENT = STRING" e-4 e-1))))))))))) -(define OchranceC-45A2MLC-45Parser-peek (lambda (arg-0) (let ((e-0 (car arg-0))) (if (null? e-0) '() (let ((e-4 (car e-0))) (box e-4)))))) -(define PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (lambda (arg-3 arg-4) (case (vector-ref arg-3 0) ((0) (let ((e-2 (vector-ref arg-3 1))) (vector 0 e-2))) (else (let ((e-5 (vector-ref arg-3 1))) (arg-4 e-5)))))) -(define OchranceC-45A2MLC-45Parser-n--3263-10733-u--unless (lambda (arg-0 arg-1 arg-2) (cond ((equal? arg-1 1) arg-2) (else (vector 1 'erased))))) -(define OchranceC-45A2MLC-45Parser-advance (lambda (arg-0) (let ((e-0 (car arg-0))) (let ((e-1 (cdr arg-0))) (if (null? e-0) (cons '() e-1) (let ((e-5 (cdr e-0))) (cons e-5 (+ e-1 1)))))))) -(define OchranceC-45A2MLC-45Parser-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32caseC-32blockC-32inC-32parseManifestBody-10911 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5 arg-6 arg-7 arg-8 arg-9) (case (vector-ref arg-9 0) ((1) (let ((e-2 (vector-ref arg-9 1))) (let ((e-9 (cdr e-2))) (let ((e-12 (car e-9))) (let ((e-13 (cdr e-9))) (let ((sc3 (OchranceC-45A2MLC-45Parser-expectToken (vector 5 ) e-13))) (case (vector-ref sc3 0) ((1) (let ((e-3 (vector-ref sc3 1))) (let ((u--manifest (vector arg-2 arg-6 (box e-12)))) (lambda () (vector 1 (cons u--manifest e-3)))))) (else (let ((e-5 (vector-ref sc3 1))) (lambda () (vector 0 e-5))))))))))) (else (let ((e-5 (vector-ref arg-9 1))) (lambda () (vector 0 e-5))))))) -(define OchranceC-45A2MLC-45Parser-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32parseManifestBody-10849 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5 arg-6 arg-7 arg-8 arg-9) (if (null? arg-9) (lambda () (vector 0 (vector 4 "manifest body"))) (let ((e-1 (unbox arg-9))) (case (vector-ref e-1 0) ((5) (let ((u--manifest (vector arg-2 arg-6 '()))) (lambda () (vector 1 (cons u--manifest (OchranceC-45A2MLC-45Parser-advance arg-7)))))) ((8) (let ((e-3 (vector-ref e-1 1))) (cond ((equal? e-3 "timestamp") (OchranceC-45A2MLC-45Parser-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32caseC-32blockC-32inC-32parseManifestBody-10911 arg-0 arg-1 arg-2 arg-3 arg-4 arg-5 arg-6 arg-7 arg-8 (OchranceC-45A2MLC-45Parser-parseField arg-7)))(else (lambda () (vector 0 (vector 0 "RBRACE or timestamp" e-1 (let ((e-2 (cdr arg-7))) e-2))))))))(else (lambda () (vector 0 (vector 0 "RBRACE or timestamp" e-1 (let ((e-2 (cdr arg-7))) e-2)))))))))) -(define OchranceC-45A2MLC-45Parser-parseManifestBody (lambda (arg-0) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseField arg-0) (lambda (_-0) (let ((e-2 (car _-0))) (let ((e-3 (cdr _-0))) (let ((e-6 (car e-3))) (let ((e-7 (cdr e-3))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-n--3263-10733-u--unless arg-0 (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-2 "version") (vector 0 (vector 3 "manifest" e-2 "expected 'version' field" (let ((e-1 (cdr arg-0))) e-1)))) (lambda (_-10677) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseField e-7) (lambda (_-1) (let ((_-2 (cons e-2 (cons e-6 e-7)))) (let ((e-5 (car _-1))) (let ((e-4 (cdr _-1))) (let ((e-9 (car e-4))) (let ((e-8 (cdr e-4))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-n--3263-10733-u--unless arg-0 (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-5 "subsystem") (vector 0 (vector 3 "manifest" e-5 "expected 'subsystem' field" (let ((e-1 (cdr e-8))) e-1)))) (lambda (_-10678) ((let ((_-3 (cons e-5 (cons e-9 e-8)))) (OchranceC-45A2MLC-45Parser-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32parseManifestBody-10849 arg-0 e-2 e-6 e-7 _-2 e-5 e-9 e-8 _-3 (OchranceC-45A2MLC-45Parser-peek e-8))))))))))))))))))))))) -(define OchranceC-45A2MLC-45Parser-n--3849-11254-u--unless (lambda (arg-0 arg-1 arg-2) (cond ((equal? arg-1 1) arg-2) (else (vector 1 'erased))))) -(define OchranceC-45A2MLC-45Parser-parseOptionalAttestation (lambda (arg-0) (let ((sc0 (OchranceC-45A2MLC-45Parser-peek arg-0))) (if (null? sc0) (vector 1 (cons '() arg-0)) (let ((e-1 (unbox sc0))) (case (vector-ref e-1 0) ((2) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 2 ) arg-0) (lambda (u--st1) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 4 ) u--st1) (lambda (u--st2) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseField u--st2) (lambda (_-0) (let ((e-2 (car _-0))) (let ((e-3 (cdr _-0))) (let ((e-6 (car e-3))) (let ((e-7 (cdr e-3))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-n--3849-11254-u--unless arg-0 (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-2 "witness") (vector 0 (vector 3 "attestation" e-2 "expected 'witness' field" (let ((e-4 (cdr arg-0))) e-4)))) (lambda (_-10677) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseField e-7) (lambda (_-1) (let ((e-5 (car _-1))) (let ((e-4 (cdr _-1))) (let ((e-9 (car e-4))) (let ((e-8 (cdr e-4))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-n--3849-11254-u--unless arg-0 (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-5 "signature") (vector 0 (vector 3 "attestation" e-5 "expected 'signature' field" (let ((e-10 (cdr arg-0))) e-10)))) (lambda (_-10678) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseField e-8) (lambda (_-2) (let ((e-11 (car _-2))) (let ((e-10 (cdr _-2))) (let ((e-13 (car e-10))) (let ((e-12 (cdr e-10))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-n--3849-11254-u--unless arg-0 (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-11 "pubkey") (vector 0 (vector 3 "attestation" e-11 "expected 'pubkey' field" (let ((e-14 (cdr arg-0))) e-14)))) (lambda (_-10679) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 5 ) e-12) (lambda (u--st6) (let ((u--attestation (vector e-6 e-9 e-13))) (vector 1 (cons (box u--attestation) u--st6))))))))))))))))))))))))))))))))))(else (vector 1 (cons '() arg-0))))))))) -(define OchranceC-45A2MLC-45Parser-parseVerificationMode (lambda (arg-0) (cond ((equal? arg-0 "lax") (box 0)) ((equal? arg-0 "checked") (box 1)) ((equal? arg-0 "attested") (box 2))(else '())))) -(define OchranceC-45A2MLC-45Parser-parseBoolField (lambda (arg-0) (let ((e-0 (car arg-0))) (let ((e-1 (cdr arg-0))) (if (null? e-0) (vector 0 (vector 4 "boolean field")) (let ((e-4 (car e-0))) (let ((e-5 (cdr e-0))) (case (vector-ref e-4 0) ((8) (let ((e-6 (vector-ref e-4 1))) (if (null? e-5) (vector 0 (vector 0 "IDENT = IDENT(true|false)" e-4 e-1)) (let ((e-8 (car e-5))) (let ((e-9 (cdr e-5))) (case (vector-ref e-8 0) ((7) (if (null? e-9) (vector 0 (vector 0 "IDENT = IDENT(true|false)" e-4 e-1)) (let ((e-11 (car e-9))) (let ((e-12 (cdr e-9))) (case (vector-ref e-11 0) ((8) (let ((e-13 (vector-ref e-11 1))) (cond ((equal? e-13 "true") (vector 1 (cons e-6 (cons 1 (cons e-12 (+ e-1 3)))))) ((equal? e-13 "false") (vector 1 (cons e-6 (cons 0 (cons e-12 (+ e-1 3))))))(else (vector 0 (vector 0 "IDENT = IDENT(true|false)" e-4 e-1))))))(else (vector 0 (vector 0 "IDENT = IDENT(true|false)" e-4 e-1))))))))(else (vector 0 (vector 0 "IDENT = IDENT(true|false)" e-4 e-1)))))))))(else (vector 0 (vector 0 "IDENT = IDENT(true|false)" e-4 e-1))))))))))) -(define OchranceC-45A2MLC-45Parser-parseNumberField (lambda (arg-0) (let ((e-0 (car arg-0))) (let ((e-1 (cdr arg-0))) (if (null? e-0) (vector 0 (vector 4 "number field")) (let ((e-4 (car e-0))) (let ((e-5 (cdr e-0))) (case (vector-ref e-4 0) ((8) (let ((e-6 (vector-ref e-4 1))) (if (null? e-5) (vector 0 (vector 0 "IDENT = NUMBER" e-4 e-1)) (let ((e-8 (car e-5))) (let ((e-9 (cdr e-5))) (case (vector-ref e-8 0) ((7) (if (null? e-9) (vector 0 (vector 0 "IDENT = NUMBER" e-4 e-1)) (let ((e-11 (car e-9))) (let ((e-12 (cdr e-9))) (case (vector-ref e-11 0) ((10) (let ((e-13 (vector-ref e-11 1))) (vector 1 (cons e-6 (cons e-13 (cons e-12 (+ e-1 3)))))))(else (vector 0 (vector 0 "IDENT = NUMBER" e-4 e-1))))))))(else (vector 0 (vector 0 "IDENT = NUMBER" e-4 e-1)))))))))(else (vector 0 (vector 0 "IDENT = NUMBER" e-4 e-1))))))))))) -(define PreludeC-45Types-prim__integerToNat (lambda (arg-0) (let ((sc0 (or (and (<= 0 arg-0) 1) 0))) (cond ((equal? sc0 0) 0)(else arg-0))))) -(define PreludeC-45EqOrd-u--C-62C-61_Ord_Integer (lambda (arg-0 arg-1) (let ((sc0 (or (and (>= arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define OchranceC-45A2MLC-45Parser-n--4148-11524-u--unless (lambda (arg-0 arg-1 arg-2) (cond ((equal? arg-1 1) arg-2) (else (vector 1 'erased))))) -(define OchranceC-45A2MLC-45Parser-case--parseOptionalPolicyC-44parsePolicyFields-11565 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5) (if (null? arg-5) (vector 0 (vector 4 "policy body")) (let ((e-1 (unbox arg-5))) (case (vector-ref e-1 0) ((5) (let ((u--policy (vector arg-3 arg-2 arg-1))) (vector 1 (cons (box u--policy) (OchranceC-45A2MLC-45Parser-advance arg-4))))) ((8) (let ((e-3 (vector-ref e-1 1))) (cond ((equal? e-3 "max_age") (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseNumberField arg-4) (lambda (_-0) (let ((e-4 (cdr _-0))) (let ((e-6 (car e-4))) (let ((e-7 (cdr e-4))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-n--4148-11524-u--unless arg-0 (PreludeC-45EqOrd-u--C-62C-61_Ord_Integer e-6 0) (vector 0 (vector 3 "policy" "max_age" "must be non-negative" (let ((e-5 (cdr arg-4))) e-5)))) (lambda (_-10677) (OchranceC-45A2MLC-45Parser-n--4148-11523-u--parsePolicyFields arg-0 e-7 arg-3 (box (PreludeC-45Types-prim__integerToNat e-6)) arg-1))))))))) ((equal? e-3 "require_sig") (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseBoolField arg-4) (lambda (_-0) (let ((e-4 (cdr _-0))) (let ((e-6 (car e-4))) (let ((e-7 (cdr e-4))) (OchranceC-45A2MLC-45Parser-n--4148-11523-u--parsePolicyFields arg-0 e-7 arg-3 arg-2 e-6)))))))(else (vector 0 (vector 0 "RBRACE, max_age, or require_sig" e-1 (let ((e-2 (cdr arg-4))) e-2)))))))(else (vector 0 (vector 0 "RBRACE, max_age, or require_sig" e-1 (let ((e-2 (cdr arg-4))) e-2))))))))) -(define OchranceC-45A2MLC-45Parser-n--4148-11523-u--parsePolicyFields (lambda (arg-0 arg-1 arg-2 arg-3 arg-4) (OchranceC-45A2MLC-45Parser-case--parseOptionalPolicyC-44parsePolicyFields-11565 arg-0 arg-4 arg-3 arg-2 arg-1 (OchranceC-45A2MLC-45Parser-peek arg-1)))) -(define OchranceC-45A2MLC-45Parser-parseOptionalPolicy (lambda (arg-0) (let ((sc0 (OchranceC-45A2MLC-45Parser-peek arg-0))) (if (null? sc0) (vector 1 (cons '() arg-0)) (let ((e-1 (unbox sc0))) (case (vector-ref e-1 0) ((3) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 3 ) arg-0) (lambda (u--st1) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 4 ) u--st1) (lambda (u--st2) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseField u--st2) (lambda (_-0) (let ((e-2 (car _-0))) (let ((e-3 (cdr _-0))) (let ((e-6 (car e-3))) (let ((e-7 (cdr e-3))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-n--4148-11524-u--unless arg-0 (PreludeC-45EqOrd-u--C-61C-61_Eq_String e-2 "mode") (vector 0 (vector 3 "policy" e-2 "expected 'mode' field" (let ((e-4 (cdr arg-0))) e-4)))) (lambda (_-10677) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (let ((sc4 (OchranceC-45A2MLC-45Parser-parseVerificationMode e-6))) (if (null? sc4) (vector 0 (vector 3 "policy" "mode" (string-append "invalid mode: " e-6) (let ((e-4 (cdr arg-0))) e-4))) (let ((e-4 (unbox sc4))) (vector 1 e-4)))) (lambda (u--mode) (OchranceC-45A2MLC-45Parser-n--4148-11523-u--parsePolicyFields arg-0 e-7 u--mode '() 0))))))))))))))))(else (vector 1 (cons '() arg-0))))))))) -(define OchranceC-45A2MLC-45Types-parseHashAlgorithm (lambda (arg-0) (cond ((equal? arg-0 "sha256") (box 0)) ((equal? arg-0 "sha3-256") (box 1)) ((equal? arg-0 "blake3") (box 2))(else '())))) -(define OchranceC-45A2MLC-45Parser-parseRef (lambda (arg-0) (let ((e-0 (car arg-0))) (let ((e-1 (cdr arg-0))) (if (null? e-0) (vector 0 (vector 4 "ref entry")) (let ((e-4 (car e-0))) (let ((e-5 (cdr e-0))) (case (vector-ref e-4 0) ((8) (let ((e-6 (vector-ref e-4 1))) (if (null? e-5) (vector 0 (vector 0 "IDENT : HASH" e-4 e-1)) (let ((e-8 (car e-5))) (let ((e-9 (cdr e-5))) (case (vector-ref e-8 0) ((6) (if (null? e-9) (vector 0 (vector 0 "IDENT : HASH" e-4 e-1)) (let ((e-11 (car e-9))) (let ((e-12 (cdr e-9))) (case (vector-ref e-11 0) ((11) (let ((e-13 (vector-ref e-11 1))) (let ((e-14 (vector-ref e-11 2))) (let ((sc7 (OchranceC-45A2MLC-45Types-parseHashAlgorithm e-13))) (if (null? sc7) (vector 0 (vector 3 "ref" e-6 (string-append "unsupported hash algorithm: " e-13) e-1)) (let ((e-2 (unbox sc7))) (let ((u--hash (cons e-2 e-14))) (let ((u--ref (cons e-6 u--hash))) (vector 1 (cons u--ref (cons e-12 (+ e-1 3))))))))))))(else (vector 0 (vector 0 "IDENT : HASH" e-4 e-1))))))))(else (vector 0 (vector 0 "IDENT : HASH" e-4 e-1)))))))))(else (vector 0 (vector 0 "IDENT : HASH" e-4 e-1))))))))))) -(define PreludeC-45TypesC-45List-reverseOnto (lambda (arg-1 arg-2) (if (null? arg-2) arg-1 (let ((e-2 (car arg-2))) (let ((e-3 (cdr arg-2))) (PreludeC-45TypesC-45List-reverseOnto (cons e-2 arg-1) e-3)))))) -(define PreludeC-45TypesC-45List-reverse (lambda (ext-0) (PreludeC-45TypesC-45List-reverseOnto '() ext-0))) -(define OchranceC-45A2MLC-45Parser-parseRefsLoop (lambda (arg-0 arg-1) (if (null? arg-0) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseRef arg-0) (lambda (_-0) (let ((e-2 (car _-0))) (let ((e-3 (cdr _-0))) (OchranceC-45A2MLC-45Parser-parseRefsLoop e-3 (cons e-2 arg-1)))))) (let ((e-0 (car arg-0))) (let ((e-1 (cdr arg-0))) (if (null? e-0) (vector 0 (vector 4 "refs body")) (let ((e-4 (car e-0))) (let ((e-5 (cdr e-0))) (case (vector-ref e-4 0) ((5) (vector 1 (cons (PreludeC-45TypesC-45List-reverse arg-1) (cons e-5 (+ e-1 1)))))(else (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseRef arg-0) (lambda (_-0) (let ((e-2 (car _-0))) (let ((e-3 (cdr _-0))) (OchranceC-45A2MLC-45Parser-parseRefsLoop e-3 (cons e-2 arg-1)))))))))))))))) -(define OchranceC-45A2MLC-45Parser-parseRefsBody (lambda (arg-0) (OchranceC-45A2MLC-45Parser-parseRefsLoop arg-0 '()))) -(define OchranceC-45A2MLC-45Parser-parse (lambda (arg-0) (let ((u--st (cons arg-0 0))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 0 ) u--st) (lambda (u--st1) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 4 ) u--st1) (lambda (u--st2) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseManifestBody u--st2) (lambda (_-0) (let ((e-2 (car _-0))) (let ((e-3 (cdr _-0))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 1 ) e-3) (lambda (u--st4) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-expectToken (vector 4 ) u--st4) (lambda (u--st5) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseRefsBody u--st5) (lambda (_-1) (let ((e-5 (car _-1))) (let ((e-4 (cdr _-1))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseOptionalAttestation e-4) (lambda (_-2) (let ((e-7 (car _-2))) (let ((e-6 (cdr _-2))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (OchranceC-45A2MLC-45Parser-parseOptionalPolicy e-6) (lambda (_-3) (let ((e-9 (car _-3))) (vector 1 (vector e-2 e-5 e-7 e-9)))))))))))))))))))))))))))) -(define DataC-45String-singleton (lambda (arg-0) (string-cons arg-0 ""))) -(define OchranceC-45A2MLC-45Lexer-u--show_Show_LexError (lambda (arg-0) (case (vector-ref arg-0 0) ((0) (let ((e-0 (vector-ref arg-0 1))) (let ((e-1 (vector-ref arg-0 2))) (let ((e-2 (vector-ref arg-0 3))) (string-append "Unexpected character '" (string-append (DataC-45String-singleton e-0) (string-append "' at line " (string-append (PreludeC-45Show-u--show_Show_Nat e-1) (string-append ", col " (PreludeC-45Show-u--show_Show_Nat e-2)))))))))) ((1) (let ((e-3 (vector-ref arg-0 1))) (let ((e-4 (vector-ref arg-0 2))) (string-append "Unterminated string at line " (string-append (PreludeC-45Show-u--show_Show_Nat e-3) (string-append ", col " (PreludeC-45Show-u--show_Show_Nat e-4))))))) (else (let ((e-5 (vector-ref arg-0 1))) (let ((e-6 (vector-ref arg-0 2))) (let ((e-7 (vector-ref arg-0 3))) (string-append "Invalid hash '" (string-append e-5 (string-append "' at line " (string-append (PreludeC-45Show-u--show_Show_Nat e-6) (string-append ", col " (PreludeC-45Show-u--show_Show_Nat e-7))))))))))))) -(define IntegrationTests-case--caseC-32blockC-32inC-32test_RoundtripSerialization-6199 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4) (case (vector-ref arg-4 0) ((0) (let ((e-2 (vector-ref arg-4 1))) (lambda (eta-0) (box (string-append "Lex failed: " (OchranceC-45A2MLC-45Lexer-u--show_Show_LexError e-2)))))) (else (let ((e-5 (vector-ref arg-4 1))) (lambda (eta-0) (IntegrationTests-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32test_RoundtripSerialization-6239 arg-0 arg-1 arg-2 arg-3 e-5 (OchranceC-45A2MLC-45Parser-parse e-5) eta-0))))))) -(define OchranceC-45A2MLC-45Validator-u--show_Show_ValidationError (lambda (arg-0) (case (vector-ref arg-0 0) ((0) (let ((e-0 (vector-ref arg-0 1))) (string-append "Missing required field: " e-0))) ((1) (let ((e-1 (vector-ref arg-0 1))) (string-append "Unsupported version: " e-1))) ((2) (let ((e-2 (vector-ref arg-0 1))) (string-append "Invalid hash algorithm: " e-2))) ((3) (let ((e-3 (vector-ref arg-0 1))) (string-append "Invalid hash value: " e-3))) ((4) "Signature verification failed") (else (let ((e-4 (vector-ref arg-0 1))) (string-append "Policy violation: " e-4)))))) -(define IntegrationTests-case--test_PolicyRequireSig-6106 (lambda (arg-0 arg-1 ext-0) (case (vector-ref arg-1 0) ((0) (let ((e-2 (vector-ref arg-1 1))) (case (vector-ref e-2 0) ((5) '())(else (box (string-append "Wrong error: " (OchranceC-45A2MLC-45Validator-u--show_Show_ValidationError e-2))))))) (else (box "Should have failed policy check"))))) -(define PreludeC-45EqOrd-u--C-60C-61_Ord_Char (lambda (arg-0 arg-1) (let ((sc0 (or (and (char<=? arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45EqOrd-u--C-62C-61_Ord_Char (lambda (arg-0 arg-1) (let ((sc0 (or (and (char>=? arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45Types-isDigit (lambda (arg-0) (let ((sc0 (PreludeC-45EqOrd-u--C-62C-61_Ord_Char arg-0 #\0))) (cond ((equal? sc0 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char arg-0 #\9)) (else 0))))) -(define PreludeC-45Types-u--foldl_Foldable_List (lambda (arg-2 arg-3 arg-4) (if (null? arg-4) arg-3 (let ((e-2 (car arg-4))) (let ((e-3 (cdr arg-4))) (PreludeC-45Types-u--foldl_Foldable_List arg-2 ((arg-2 arg-3) e-2) e-3)))))) -(define PreludeC-45Types-u--foldMap_Foldable_List (lambda (arg-2 arg-3 ext-0) (PreludeC-45Types-u--foldl_Foldable_List (lambda (u--acc) (lambda (u--elem) (let ((e-1 (car arg-2))) ((e-1 u--acc) (arg-3 u--elem))))) (let ((e-2 (cdr arg-2))) e-2) ext-0))) -(define OchranceC-45FilesystemC-45Repair-n--4795-2591-u--parseNat (lambda (arg-1 arg-2 arg-4) (let ((sc0 (PreludeC-45Types-u--foldMap_Foldable_List csegen-48 (lambda (eta-0) (PreludeC-45Types-isDigit eta-0)) (PreludeC-45Types-fastUnpack arg-4)))) (cond ((equal? sc0 0) '()) (else (box (PreludeC-45Types-prim__integerToNat (cast-string-int arg-4)))))))) -(define PreludeC-45TypesC-45SnocList-C-60C-62C-62 (lambda (arg-1 arg-2) (if (null? arg-1) arg-2 (let ((e-2 (car arg-1))) (let ((e-3 (cdr arg-1))) (PreludeC-45TypesC-45SnocList-C-60C-62C-62 e-2 (cons e-3 arg-2))))))) -(define PreludeC-45TypesC-45List-filterAppend (lambda (arg-1 arg-2 arg-3) (if (null? arg-3) (PreludeC-45TypesC-45SnocList-C-60C-62C-62 arg-1 '()) (let ((e-1 (car arg-3))) (let ((e-2 (cdr arg-3))) (let ((sc1 (arg-2 e-1))) (cond ((equal? sc1 1) (PreludeC-45TypesC-45List-filterAppend (cons arg-1 e-1) arg-2 e-2)) (else (PreludeC-45TypesC-45List-filterAppend arg-1 arg-2 e-2))))))))) -(define OchranceC-45FilesystemC-45Repair-n--4818-2612-u--splitHelper (lambda (arg-1 arg-2 arg-4 arg-5 arg-6 arg-7 arg-8 arg-9) (if (null? arg-7) (PreludeC-45TypesC-45List-reverse (cons (PreludeC-45Types-fastPack (PreludeC-45TypesC-45List-reverse arg-8)) arg-9)) (let ((e-2 (car arg-7))) (let ((e-3 (cdr arg-7))) (let ((sc1 (arg-6 e-2))) (cond ((equal? sc1 1) (OchranceC-45FilesystemC-45Repair-n--4818-2612-u--splitHelper arg-1 arg-2 arg-4 arg-5 arg-6 e-3 '() (cons (PreludeC-45Types-fastPack (PreludeC-45TypesC-45List-reverse arg-8)) arg-9))) (else (OchranceC-45FilesystemC-45Repair-n--4818-2612-u--splitHelper arg-1 arg-2 arg-4 arg-5 arg-6 e-3 (cons e-2 arg-8) arg-9))))))))) -(define OchranceC-45FilesystemC-45Repair-n--4795-2594-u--split (lambda (arg-1 arg-2 arg-4 arg-5) (OchranceC-45FilesystemC-45Repair-n--4818-2612-u--splitHelper arg-1 arg-2 arg-5 arg-4 arg-4 (PreludeC-45Types-fastUnpack arg-5) '() '()))) -(define OchranceC-45FilesystemC-45Repair-n--4795-2597-u--words (lambda (arg-1 arg-2 arg-4) (PreludeC-45TypesC-45List-filterAppend '() csegen-45 (OchranceC-45FilesystemC-45Repair-n--4795-2594-u--split arg-1 arg-2 csegen-46 arg-4)))) -(define OchranceC-45FilesystemC-45Repair-n--4795-2590-u--parseBlockIndex (lambda (arg-1 arg-2 arg-4) (let ((sc0 (OchranceC-45FilesystemC-45Repair-n--4795-2597-u--words arg-1 arg-2 arg-4))) (if (null? sc0) '() (let ((e-1 (car sc0))) (let ((e-2 (cdr sc0))) (cond ((equal? e-1 "block") (if (null? e-2) '() (let ((e-4 (car e-2))) (let ((e-5 (cdr e-2))) (if (null? e-5) (OchranceC-45FilesystemC-45Repair-n--4795-2591-u--parseNat arg-1 arg-2 e-4) '())))))(else '())))))))) -(define PreludeC-45Types-u--C-62C-61_Ord_Nat (lambda (arg-0 arg-1) (PreludeC-45EqOrd-u--C-47C-61_Eq_Ordering (PreludeC-45EqOrd-u--compare_Ord_Integer arg-0 arg-1) 0))) -(define OchranceC-45FilesystemC-45Repair-repairBlock (lambda (arg-1 arg-2 arg-3 arg-4) (let ((e-0 (vector-ref arg-2 0))) (let ((e-1 (vector-ref arg-2 1))) (let ((e-2 (vector-ref arg-2 2))) (let ((sc0 (PreludeC-45Types-u--C-62C-61_Ord_Nat arg-3 e-0))) (cond ((equal? sc0 1) (let ((e-4 (car arg-1))) (let ((e-7 (vector-ref e-4 0))) (let ((e-9 (vector-ref e-7 1))) ((e-9 'erased) (vector 0 (vector 0 (vector 0 (string-append "Block index out of range: " (PreludeC-45Show-u--show_Show_Nat arg-3)))))))))) (else (let ((u--newState (vector e-0 (lambda (u--idx) (let ((sc1 (or (and (= u--idx arg-3) 1) 0))) (cond ((equal? sc1 1) (box arg-4)) (else (e-1 u--idx))))) e-2))) (let ((e-4 (car arg-1))) (let ((e-7 (vector-ref e-4 0))) (let ((e-9 (vector-ref e-7 1))) ((e-9 'erased) (vector 1 u--newState)))))))))))))) -(define OchranceC-45A2MLC-45Types-u--C-61C-61_Eq_HashAlgorithm (lambda (arg-0 arg-1) (cond ((equal? arg-0 0) (cond ((equal? arg-1 0) 1)(else 0))) ((equal? arg-0 1) (cond ((equal? arg-1 1) 1)(else 0))) ((equal? arg-0 2) (cond ((equal? arg-1 2) 1)(else 0)))(else 0)))) -(define OchranceC-45A2MLC-45Types-u--C-61C-61_Eq_Hash (lambda (arg-0 arg-1) (let ((sc0 (OchranceC-45A2MLC-45Types-u--C-61C-61_Eq_HashAlgorithm (let ((e-0 (car arg-0))) e-0) (let ((e-0 (car arg-1))) e-0)))) (cond ((equal? sc0 1) (PreludeC-45EqOrd-u--C-61C-61_Eq_String (let ((e-1 (cdr arg-0))) e-1) (let ((e-1 (cdr arg-1))) e-1))) (else 0))))) -(define OchranceC-45FilesystemC-45Repair-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32linearVerifyAndRepairC-44repairLoop-3233 (lambda (arg-1 arg-2 arg-4 arg-5 arg-6 arg-7 arg-8 arg-9 arg-10 arg-12) (if (null? arg-12) (let ((u--fsC-39 (vector arg-10 arg-9 arg-8))) (let ((e-1 (car arg-1))) (let ((e-4 (vector-ref e-1 1))) ((((e-4 'erased) 'erased) (OchranceC-45FilesystemC-45Repair-repairBlock arg-1 u--fsC-39 arg-7 (let ((e-6 (cdr arg-4))) e-6))) (lambda (u--result) (case (vector-ref u--result 0) ((0) (let ((e-6 (vector-ref u--result 1))) (let ((e-8 (car arg-1))) (let ((e-11 (vector-ref e-8 0))) (let ((e-13 (vector-ref e-11 1))) ((e-13 'erased) (vector 0 e-6))))))) (else (let ((e-6 (vector-ref u--result 1))) (OchranceC-45FilesystemC-45Repair-n--4795-2593-u--repairLoop arg-1 arg-2 e-6 arg-5 (+ arg-6 1)))))))))) (let ((e-1 (unbox arg-12))) (let ((sc1 (OchranceC-45A2MLC-45Types-u--C-61C-61_Eq_Hash e-1 (let ((e-2 (cdr arg-4))) e-2)))) (cond ((equal? sc1 1) (let ((u--fsC-39 (vector arg-10 arg-9 arg-8))) (OchranceC-45FilesystemC-45Repair-n--4795-2593-u--repairLoop arg-1 arg-2 u--fsC-39 arg-5 arg-6))) (else (let ((u--fsC-39 (vector arg-10 arg-9 arg-8))) (let ((e-3 (car arg-1))) (let ((e-5 (vector-ref e-3 1))) ((((e-5 'erased) 'erased) (OchranceC-45FilesystemC-45Repair-repairBlock arg-1 u--fsC-39 arg-7 (let ((e-7 (cdr arg-4))) e-7))) (lambda (u--result) (case (vector-ref u--result 0) ((0) (let ((e-7 (vector-ref u--result 1))) (let ((e-9 (car arg-1))) (let ((e-12 (vector-ref e-9 0))) (let ((e-14 (vector-ref e-12 1))) ((e-14 'erased) (vector 0 e-7))))))) (else (let ((e-7 (vector-ref u--result 1))) (OchranceC-45FilesystemC-45Repair-n--4795-2593-u--repairLoop arg-1 arg-2 e-7 arg-5 (+ arg-6 1))))))))))))))))) -(define OchranceC-45FilesystemC-45Repair-n--4795-2593-u--repairLoop (lambda (arg-1 arg-2 arg-4 arg-5 arg-6) (if (null? arg-5) (let ((e-0 (vector-ref arg-4 0))) (let ((e-1 (vector-ref arg-4 1))) (let ((e-2 (vector-ref arg-4 2))) (let ((u--resultState (vector e-0 e-1 e-2))) (let ((e-4 (car arg-1))) (let ((e-7 (vector-ref e-4 0))) (let ((e-9 (vector-ref e-7 1))) ((e-9 'erased) (vector 1 (cons u--resultState arg-6)))))))))) (let ((e-2 (car arg-5))) (let ((e-3 (cdr arg-5))) (let ((sc1 (OchranceC-45FilesystemC-45Repair-n--4795-2590-u--parseBlockIndex arg-1 arg-2 (let ((e-0 (car e-2))) e-0)))) (if (null? sc1) (OchranceC-45FilesystemC-45Repair-n--4795-2593-u--repairLoop arg-1 arg-2 arg-4 e-3 arg-6) (let ((e-4 (unbox sc1))) (let ((e-0 (vector-ref arg-4 0))) (let ((e-1 (vector-ref arg-4 1))) (let ((e-5 (vector-ref arg-4 2))) (OchranceC-45FilesystemC-45Repair-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32linearVerifyAndRepairC-44repairLoop-3233 arg-1 arg-2 e-2 e-3 arg-6 e-4 e-5 e-1 e-0 (e-1 e-4))))))))))))) -(define OchranceC-45FilesystemC-45Repair-n--4795-2592-u--repairFromRefs (lambda (arg-1 arg-2 arg-4 arg-5) (OchranceC-45FilesystemC-45Repair-n--4795-2593-u--repairLoop arg-1 arg-2 arg-4 arg-5 0))) -(define OchranceC-45A2MLC-45Types-u--show_Show_HashAlgorithm (lambda (arg-0) (cond ((equal? arg-0 0) "sha256") ((equal? arg-0 1) "sha3-256") (else "blake3")))) -(define OchranceC-45A2MLC-45Types-u--show_Show_Hash (lambda (arg-0) (string-append (OchranceC-45A2MLC-45Types-u--show_Show_HashAlgorithm (let ((e-0 (car arg-0))) e-0)) (string-append ":" (let ((e-1 (cdr arg-0))) e-1))))) -(define OchranceC-45FilesystemC-45Repair-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32linearVerifyAndRepairC-44verifyRefs-2975 (lambda (arg-1 arg-2 arg-4 arg-5 arg-6 arg-7 arg-8) (if (null? arg-8) (let ((e-1 (car arg-1))) (let ((e-5 (vector-ref e-1 0))) (let ((e-7 (vector-ref e-5 1))) ((e-7 'erased) (vector 0 (vector 2 (vector 0 (string-append "Block " (PreludeC-45Show-u--show_Show_Nat arg-7))))))))) (let ((e-2 (unbox arg-8))) (let ((sc1 (OchranceC-45A2MLC-45Types-u--C-61C-61_Eq_Hash e-2 (let ((e-1 (cdr arg-4))) e-1)))) (cond ((equal? sc1 1) (OchranceC-45FilesystemC-45Repair-n--4795-2595-u--verifyRefs arg-1 arg-2 arg-6 arg-5)) (else (let ((e-1 (car arg-1))) (let ((e-6 (vector-ref e-1 0))) (let ((e-8 (vector-ref e-6 1))) ((e-8 'erased) (vector 0 (vector 1 (vector 0 (let ((e-0 (car arg-4))) e-0) (OchranceC-45A2MLC-45Types-u--show_Show_Hash (let ((e-10 (cdr arg-4))) e-10)) (OchranceC-45A2MLC-45Types-u--show_Show_Hash e-2))))))))))))))) -(define OchranceC-45FilesystemC-45Repair-case--linearVerifyAndRepairC-44verifyRefs-2867 (lambda (arg-1 arg-2 arg-4 arg-5 arg-6 arg-7) (if (null? arg-7) (let ((e-1 (car arg-1))) (let ((e-5 (vector-ref e-1 0))) (let ((e-7 (vector-ref e-5 1))) ((e-7 'erased) (vector 0 (vector 0 (vector 0 (let ((e-0 (car arg-4))) e-0)))))))) (let ((e-2 (unbox arg-7))) (let ((sc1 (PreludeC-45Types-u--C-62C-61_Ord_Nat e-2 (let ((e-0 (vector-ref arg-6 0))) e-0)))) (cond ((equal? sc1 1) (let ((e-1 (car arg-1))) (let ((e-6 (vector-ref e-1 0))) (let ((e-8 (vector-ref e-6 1))) ((e-8 'erased) (vector 0 (vector 0 (vector 0 "Block index out of range")))))))) (else (OchranceC-45FilesystemC-45Repair-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32linearVerifyAndRepairC-44verifyRefs-2975 arg-1 arg-2 arg-4 arg-5 arg-6 e-2 (let ((e-1 (vector-ref arg-6 1))) (e-1 e-2)))))))))) -(define OchranceC-45FilesystemC-45Repair-n--4795-2595-u--verifyRefs (lambda (arg-1 arg-2 arg-4 arg-5) (if (null? arg-5) (let ((e-1 (car arg-1))) (let ((e-5 (vector-ref e-1 0))) (let ((e-7 (vector-ref e-5 1))) ((e-7 'erased) (vector 1 'erased))))) (let ((e-2 (car arg-5))) (let ((e-3 (cdr arg-5))) (OchranceC-45FilesystemC-45Repair-case--linearVerifyAndRepairC-44verifyRefs-2867 arg-1 arg-2 e-2 e-3 arg-4 (OchranceC-45FilesystemC-45Repair-n--4795-2590-u--parseBlockIndex arg-1 arg-2 (let ((e-0 (car e-2))) e-0)))))))) -(define OchranceC-45FilesystemC-45Repair-n--4795-2596-u--verifyState (lambda (arg-1 arg-2 arg-4 arg-5) (OchranceC-45FilesystemC-45Repair-n--4795-2595-u--verifyRefs arg-1 arg-2 arg-4 (let ((e-1 (vector-ref arg-5 1))) e-1)))) -(define OchranceC-45FilesystemC-45Repair-linearVerifyAndRepair (lambda (arg-1 arg-2 arg-3) (let ((e-0 (vector-ref arg-2 0))) (let ((e-1 (vector-ref arg-2 1))) (let ((e-2 (vector-ref arg-2 2))) (let ((u--oldStateCopy (vector e-0 e-1 e-2))) (let ((e-4 (car arg-1))) (let ((e-6 (vector-ref e-4 1))) ((((e-6 'erased) 'erased) (OchranceC-45FilesystemC-45Repair-n--4795-2596-u--verifyState arg-1 arg-3 u--oldStateCopy arg-3)) (lambda (u--verifyResult) (case (vector-ref u--verifyResult 0) ((1) (let ((u--resultState (vector e-0 e-1 e-2))) (let ((e-10 (car arg-1))) (let ((e-13 (vector-ref e-10 0))) (let ((e-15 (vector-ref e-13 1))) ((e-15 'erased) (vector 1 (cons u--resultState (vector 1 arg-3))))))))) (else (let ((u--oldStateC-39 (vector e-0 e-1 e-2))) (let ((e-10 (car arg-1))) (let ((e-12 (vector-ref e-10 1))) ((((e-12 'erased) 'erased) (OchranceC-45FilesystemC-45Repair-n--4795-2592-u--repairFromRefs arg-1 arg-3 u--oldStateC-39 (let ((e-16 (vector-ref arg-3 1))) e-16))) (lambda (u--repairResult) (case (vector-ref u--repairResult 0) ((0) (let ((e-14 (vector-ref u--repairResult 1))) (let ((e-16 (car arg-1))) (let ((e-19 (vector-ref e-16 0))) (let ((e-21 (vector-ref e-19 1))) ((e-21 'erased) (vector 0 e-14))))))) (else (let ((e-14 (vector-ref u--repairResult 1))) (let ((e-16 (car e-14))) (let ((e-15 (cdr e-14))) (let ((e-18 (car arg-1))) (let ((e-20 (vector-ref e-18 1))) ((((e-20 'erased) 'erased) (OchranceC-45FilesystemC-45Repair-n--4795-2596-u--verifyState arg-1 arg-3 e-16 arg-3)) (lambda (u--verifyResultC-39) (case (vector-ref u--verifyResultC-39 0) ((1) (let ((e-24 (car arg-1))) (let ((e-27 (vector-ref e-24 0))) (let ((e-29 (vector-ref e-27 1))) ((e-29 'erased) (vector 1 (cons e-16 (vector 0 e-15 arg-3)))))))) (else (let ((e-24 (car arg-1))) (let ((e-27 (vector-ref e-24 0))) (let ((e-29 (vector-ref e-27 1))) ((e-29 'erased) (vector 0 (vector 1 (vector 0 "repair" "failed" "verification"))))))))))))))))))))))))))))))))))) -(define OchranceC-45FrameworkC-45Error-u--show_Show_ProofError (lambda (arg-0) (case (vector-ref arg-0 0) ((0) (let ((e-0 (vector-ref arg-0 1))) (let ((e-1 (vector-ref arg-0 2))) (let ((e-2 (vector-ref arg-0 3))) (string-append "p/hash-mismatch: " (string-append e-0 (string-append " expected=" (string-append e-1 (string-append " actual=" e-2))))))))) ((1) (let ((e-3 (vector-ref arg-0 1))) (let ((e-4 (vector-ref arg-0 2))) (string-append "p/merkle-root-mismatch: expected=" (string-append e-3 (string-append " actual=" e-4)))))) ((2) (let ((e-5 (vector-ref arg-0 1))) (string-append "p/signature-invalid: " e-5))) ((3) (let ((e-6 (vector-ref arg-0 1))) (string-append "p/totality-failed: " e-6))) (else (let ((e-7 (vector-ref arg-0 1))) (string-append "p/timeout: " (string-append (PreludeC-45Show-u--show_Show_Nat e-7) "ms"))))))) -(define OchranceC-45FrameworkC-45Error-u--show_Show_QueryError (lambda (arg-0) (case (vector-ref arg-0 0) ((0) (let ((e-0 (vector-ref arg-0 1))) (string-append "q/invalid-path: " e-0))) ((1) (let ((e-1 (vector-ref arg-0 1))) (string-append "q/malformed-a2ml: " e-1))) ((2) (let ((e-2 (vector-ref arg-0 1))) (string-append "q/unsupported-version: " e-2))) ((3) (let ((e-3 (vector-ref arg-0 1))) (string-append "q/invalid-hash-algo: " e-3))) (else (let ((e-4 (vector-ref arg-0 1))) (string-append "q/missing-field: " e-4)))))) -(define OchranceC-45FrameworkC-45Error-u--show_Show_ZoneError (lambda (arg-0) (case (vector-ref arg-0 0) ((0) (let ((e-0 (vector-ref arg-0 1))) (string-append "z/file-not-found: " e-0))) ((1) (let ((e-1 (vector-ref arg-0 1))) (string-append "z/permission-denied: " e-1))) ((2) (let ((e-2 (vector-ref arg-0 1))) (string-append "z/io-failure: " e-2))) ((3) (let ((e-3 (vector-ref arg-0 1))) (string-append "z/ffi-error: " e-3))) (else "z/out-of-memory")))) -(define OchranceC-45FrameworkC-45Error-u--show_Show_OchranceError (lambda (arg-0) (case (vector-ref arg-0 0) ((0) (let ((e-0 (vector-ref arg-0 1))) (OchranceC-45FrameworkC-45Error-u--show_Show_QueryError e-0))) ((1) (let ((e-1 (vector-ref arg-0 1))) (OchranceC-45FrameworkC-45Error-u--show_Show_ProofError e-1))) (else (let ((e-2 (vector-ref arg-0 1))) (OchranceC-45FrameworkC-45Error-u--show_Show_ZoneError e-2)))))) -(define IntegrationTests-case--test_LinearVerifyAndRepair-5882 (lambda (arg-0 arg-1 arg-2 ext-0) (case (vector-ref arg-2 0) ((0) (let ((e-2 (vector-ref arg-2 1))) (box (string-append "Validate failed: " (OchranceC-45A2MLC-45Validator-u--show_Show_ValidationError e-2))))) (else (let ((e-5 (vector-ref arg-2 1))) (let ((act-1 ((OchranceC-45FilesystemC-45Repair-linearVerifyAndRepair csegen-13 arg-0 e-5) ext-0))) (case (vector-ref act-1 0) ((0) (let ((e-2 (vector-ref act-1 1))) (box (string-append "Repair failed: " (OchranceC-45FrameworkC-45Error-u--show_Show_OchranceError e-2))))) (else (let ((e-6 (vector-ref act-1 1))) (let ((e-3 (cdr e-6))) (case (vector-ref e-3 0) ((0) (let ((e-1 (vector-ref e-3 1))) (let ((sc4 (or (and (= e-1 2) 1) 0))) (cond ((equal? sc4 1) '()) (else (box (string-append "Expected 2 repairs, got " (PreludeC-45Show-u--show_Show_Nat e-1)))))))) (else (box "Should have needed repair"))))))))))))) -(define IntegrationTests-case--caseC-32blockC-32inC-32test_RepairFromSnapshot-5761 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 ext-0) (if (null? arg-4) (box "Block 0 hash is Nothing") (let ((e-2 (unbox arg-4))) (let ((sc1 (OchranceC-45A2MLC-45Types-u--C-61C-61_Eq_Hash e-2 (cons 2 "snap_hash_0")))) (cond ((equal? sc1 1) '()) (else (box "Hash not restored from snapshot")))))))) -(define IntegrationTests-case--caseC-32blockC-32inC-32test_RepairSingleBlock-5608 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 ext-0) (if (null? arg-4) (box "Block hash is Nothing after repair") (let ((e-2 (unbox arg-4))) (let ((sc1 (OchranceC-45A2MLC-45Types-u--C-61C-61_Eq_Hash e-2 arg-1))) (cond ((equal? sc1 1) '()) (else (box "Hash not updated after repair")))))))) -(define OchranceC-45FilesystemC-45Verify-n--5323-2681-u--parseNat (lambda (arg-1 arg-2 arg-3 arg-4 arg-5) (let ((sc0 (PreludeC-45Types-u--foldMap_Foldable_List csegen-48 (lambda (eta-0) (PreludeC-45Types-isDigit eta-0)) (PreludeC-45Types-fastUnpack arg-5)))) (cond ((equal? sc0 0) '()) (else (box (PreludeC-45Types-prim__integerToNat (cast-string-int arg-5)))))))) -(define OchranceC-45FilesystemC-45Verify-n--5365-2698-u--splitHelper (lambda (arg-1 arg-2 arg-3 arg-4 arg-5 arg-6 arg-7 arg-8 arg-9 arg-10) (if (null? arg-8) (PreludeC-45TypesC-45List-reverse (cons (PreludeC-45Types-fastPack (PreludeC-45TypesC-45List-reverse arg-9)) arg-10)) (let ((e-2 (car arg-8))) (let ((e-3 (cdr arg-8))) (let ((sc1 (arg-7 e-2))) (cond ((equal? sc1 1) (OchranceC-45FilesystemC-45Verify-n--5365-2698-u--splitHelper arg-1 arg-2 arg-3 arg-4 arg-5 arg-6 arg-7 e-3 '() (cons (PreludeC-45Types-fastPack (PreludeC-45TypesC-45List-reverse arg-9)) arg-10))) (else (OchranceC-45FilesystemC-45Verify-n--5365-2698-u--splitHelper arg-1 arg-2 arg-3 arg-4 arg-5 arg-6 arg-7 e-3 (cons e-2 arg-9) arg-10))))))))) -(define OchranceC-45FilesystemC-45Verify-n--5323-2682-u--split (lambda (arg-1 arg-2 arg-3 arg-4 arg-5 arg-6) (OchranceC-45FilesystemC-45Verify-n--5365-2698-u--splitHelper arg-1 arg-2 arg-3 arg-4 arg-6 arg-5 arg-5 (PreludeC-45Types-fastUnpack arg-6) '() '()))) -(define OchranceC-45FilesystemC-45Verify-n--5323-2683-u--words (lambda (arg-1 arg-2 arg-3 arg-4 arg-5) (PreludeC-45TypesC-45List-filterAppend '() csegen-45 (OchranceC-45FilesystemC-45Verify-n--5323-2682-u--split arg-1 arg-2 arg-3 arg-4 csegen-46 arg-5)))) -(define OchranceC-45FilesystemC-45Verify-n--5323-2680-u--parseBlockIndex (lambda (arg-1 arg-2 arg-3 arg-4 arg-5) (let ((sc0 (OchranceC-45FilesystemC-45Verify-n--5323-2683-u--words arg-1 arg-2 arg-3 arg-4 arg-5))) (if (null? sc0) '() (let ((e-1 (car sc0))) (let ((e-2 (cdr sc0))) (cond ((equal? e-1 "block") (if (null? e-2) '() (let ((e-4 (car e-2))) (let ((e-5 (cdr e-2))) (if (null? e-5) (OchranceC-45FilesystemC-45Verify-n--5323-2681-u--parseNat arg-1 arg-2 arg-3 arg-4 e-4) '())))))(else '())))))))) -(define OchranceC-45FilesystemC-45Verify-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32verifyAllRefs-3038 (lambda (arg-1 arg-2 arg-3 arg-4 arg-5 arg-6) (if (null? arg-6) (let ((e-1 (car arg-1))) (let ((e-5 (vector-ref e-1 0))) (let ((e-7 (vector-ref e-5 1))) ((e-7 'erased) (vector 0 (vector 2 (vector 0 (string-append "Block " (PreludeC-45Show-u--show_Show_Nat arg-5))))))))) (let ((e-2 (unbox arg-6))) (let ((sc1 (OchranceC-45A2MLC-45Types-u--C-61C-61_Eq_Hash e-2 (let ((e-1 (cdr arg-2))) e-1)))) (cond ((equal? sc1 1) (OchranceC-45FilesystemC-45Verify-verifyAllRefs arg-1 arg-4 arg-3)) (else (let ((e-1 (car arg-1))) (let ((e-6 (vector-ref e-1 0))) (let ((e-8 (vector-ref e-6 1))) ((e-8 'erased) (vector 0 (vector 1 (vector 0 (let ((e-0 (car arg-2))) e-0) (OchranceC-45A2MLC-45Types-u--show_Show_Hash (let ((e-10 (cdr arg-2))) e-10)) (OchranceC-45A2MLC-45Types-u--show_Show_Hash e-2))))))))))))))) -(define OchranceC-45FilesystemC-45Verify-case--verifyAllRefs-2939 (lambda (arg-1 arg-2 arg-3 arg-4 arg-5) (if (null? arg-5) (let ((e-1 (car arg-1))) (let ((e-5 (vector-ref e-1 0))) (let ((e-7 (vector-ref e-5 1))) ((e-7 'erased) (vector 0 (vector 0 (vector 0 (string-append "Invalid ref name: " (let ((e-0 (car arg-2))) e-0))))))))) (let ((e-2 (unbox arg-5))) (let ((sc1 (PreludeC-45Types-u--C-62C-61_Ord_Nat e-2 (let ((e-0 (vector-ref arg-4 0))) e-0)))) (cond ((equal? sc1 1) (let ((e-1 (car arg-1))) (let ((e-6 (vector-ref e-1 0))) (let ((e-8 (vector-ref e-6 1))) ((e-8 'erased) (vector 0 (vector 0 (vector 0 (string-append "Block index out of range: " (PreludeC-45Show-u--show_Show_Nat e-2)))))))))) (else (OchranceC-45FilesystemC-45Verify-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32verifyAllRefs-3038 arg-1 arg-2 arg-3 arg-4 e-2 (let ((e-1 (vector-ref arg-4 1))) (e-1 e-2)))))))))) -(define OchranceC-45FilesystemC-45Verify-verifyAllRefs (lambda (arg-1 arg-2 arg-3) (if (null? arg-3) (let ((e-1 (car arg-1))) (let ((e-5 (vector-ref e-1 0))) (let ((e-7 (vector-ref e-5 1))) ((e-7 'erased) (vector 1 'erased))))) (let ((e-2 (car arg-3))) (let ((e-3 (cdr arg-3))) (OchranceC-45FilesystemC-45Verify-case--verifyAllRefs-2939 arg-1 e-2 e-3 arg-2 (OchranceC-45FilesystemC-45Verify-n--5323-2680-u--parseBlockIndex arg-1 e-2 e-3 arg-2 (let ((e-0 (car e-2))) e-0)))))))) -(define OchranceC-45FilesystemC-45Verify-n--5848-3166-u--headC-39 (lambda (arg-1 arg-2 arg-3 arg-5) (if (null? arg-5) '() (let ((e-2 (car arg-5))) (box e-2))))) -(define OchranceC-45FilesystemC-45Verify-verify (lambda (arg-1 arg-2 arg-3) (let ((sc0 (PreludeC-45EqOrd-u--C-47C-61_Eq_String (let ((e-0 (vector-ref arg-3 0))) (let ((e-5 (vector-ref e-0 1))) e-5)) (let ((e-2 (vector-ref arg-2 2))) (let ((e-4 (vector-ref e-2 1))) e-4))))) (cond ((equal? sc0 1) (let ((e-1 (car arg-1))) (let ((e-5 (vector-ref e-1 0))) (let ((e-7 (vector-ref e-5 1))) ((e-7 'erased) (vector 0 (vector 0 (vector 0 "Subsystem mismatch")))))))) (else (let ((e-1 (car arg-1))) (let ((e-4 (vector-ref e-1 1))) ((((e-4 'erased) 'erased) (OchranceC-45FilesystemC-45Verify-verifyAllRefs arg-1 arg-2 (let ((e-8 (vector-ref arg-3 1))) e-8))) (lambda (u--result) (case (vector-ref u--result 0) ((0) (let ((e-6 (vector-ref u--result 1))) (let ((e-8 (car arg-1))) (let ((e-11 (vector-ref e-8 0))) (let ((e-13 (vector-ref e-11 1))) ((e-13 'erased) (vector 0 e-6))))))) (else (let ((u--mode (let ((e-8 (vector-ref arg-3 2))) (if (null? e-8) 0 2)))) (cond ((equal? u--mode 0) (let ((e-8 (car arg-1))) (let ((e-11 (vector-ref e-8 0))) (let ((e-13 (vector-ref e-11 1))) ((e-13 'erased) (vector 1 (vector 0 arg-3))))))) ((equal? u--mode 2) (let ((e-8 (vector-ref arg-3 2))) (if (null? e-8) (let ((e-11 (car arg-1))) (let ((e-14 (vector-ref e-11 0))) (let ((e-16 (vector-ref e-14 1))) ((e-16 'erased) (vector 1 (vector 0 arg-3)))))) (let ((e-10 (unbox e-8))) (let ((sc5 (OchranceC-45FilesystemC-45Verify-n--5848-3166-u--headC-39 arg-1 arg-3 arg-2 (let ((e-13 (vector-ref arg-3 1))) e-13)))) (if (null? sc5) (let ((e-12 (car arg-1))) (let ((e-15 (vector-ref e-12 0))) (let ((e-17 (vector-ref e-15 1))) ((e-17 'erased) (vector 0 (vector 0 (vector 4 "refs"))))))) (let ((e-11 (unbox sc5))) (let ((e-13 (car arg-1))) (let ((e-16 (vector-ref e-13 0))) (let ((e-18 (vector-ref e-16 1))) ((e-18 'erased) (vector 1 (vector 2 arg-3 (let ((e-20 (cdr e-11))) e-20) (let ((e-21 (vector-ref e-10 1))) e-21)))))))))))))) (else (let ((sc4 (OchranceC-45FilesystemC-45Verify-n--5848-3166-u--headC-39 arg-1 arg-3 arg-2 (let ((e-9 (vector-ref arg-3 1))) e-9)))) (if (null? sc4) (let ((e-8 (car arg-1))) (let ((e-11 (vector-ref e-8 0))) (let ((e-13 (vector-ref e-11 1))) ((e-13 'erased) (vector 0 (vector 0 (vector 4 "refs"))))))) (let ((e-7 (unbox sc4))) (let ((e-9 (car arg-1))) (let ((e-12 (vector-ref e-9 0))) (let ((e-14 (vector-ref e-12 1))) ((e-14 'erased) (vector 1 (vector 1 arg-3 (let ((e-16 (cdr e-7))) e-16)))))))))))))))))))))))) -(define IntegrationTests-case--test_DetectHashMismatch-5426 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 ext-0) (case (vector-ref arg-4 0) ((0) (let ((e-2 (vector-ref arg-4 1))) (box (string-append "Validate failed: " (OchranceC-45A2MLC-45Validator-u--show_Show_ValidationError e-2))))) (else (let ((e-5 (vector-ref arg-4 1))) (let ((act-1 ((OchranceC-45FilesystemC-45Verify-verify csegen-13 arg-0 e-5) ext-0))) (case (vector-ref act-1 0) ((0) (let ((e-2 (vector-ref act-1 1))) (case (vector-ref e-2 0) ((1) (let ((e-6 (vector-ref e-2 1))) (case (vector-ref e-6 0) ((0) '())(else (box (string-append "Wrong error type: " (OchranceC-45FrameworkC-45Error-u--show_Show_OchranceError e-2)))))))(else (box (string-append "Wrong error type: " (OchranceC-45FrameworkC-45Error-u--show_Show_OchranceError e-2))))))) (else (box "Should have detected hash mismatch"))))))))) -(define IntegrationTests-case--caseC-32blockC-32inC-32test_VerifyValidManifest-5306 (lambda (arg-0 arg-1 arg-2 arg-3 ext-0) (case (vector-ref arg-3 0) ((0) (let ((e-2 (vector-ref arg-3 1))) (box (string-append "Validate failed: " (OchranceC-45A2MLC-45Validator-u--show_Show_ValidationError e-2))))) (else (let ((e-5 (vector-ref arg-3 1))) (let ((act-1 ((OchranceC-45FilesystemC-45Verify-verify csegen-13 arg-0 e-5) ext-0))) (case (vector-ref act-1 0) ((0) (let ((e-2 (vector-ref act-1 1))) (box (string-append "Verify failed: " (OchranceC-45FrameworkC-45Error-u--show_Show_OchranceError e-2))))) (else '())))))))) -(define IntegrationTests-u--show_Show_TestResult (lambda (arg-0) (if (null? arg-0) "PASS" (let ((e-0 (unbox arg-0))) (string-append "FAIL: " e-0))))) -(define PreludeC-45Types-u--C-60_Ord_Nat (lambda (arg-0 arg-1) (PreludeC-45EqOrd-u--C-61C-61_Eq_Ordering (PreludeC-45EqOrd-u--compare_Ord_Integer arg-0 arg-1) 0))) -(define IntegrationTests-createTestFS (lambda (arg-0) (vector arg-0 (lambda (u--idx) (let ((sc0 (PreludeC-45Types-u--C-60_Ord_Nat u--idx arg-0))) (cond ((equal? sc0 1) (box (cons 2 (string-append "hash_" (PreludeC-45Show-u--show_Show_Nat u--idx))))) (else '())))) (vector "0.1.0" "test-filesystem" '())))) -(define PreludeC-45TypesC-45List-mapAppend (lambda (arg-2 arg-3 arg-4) (if (null? arg-4) (PreludeC-45TypesC-45SnocList-C-60C-62C-62 arg-2 '()) (let ((e-1 (car arg-4))) (let ((e-2 (cdr arg-4))) (PreludeC-45TypesC-45List-mapAppend (cons arg-2 (arg-3 e-1)) arg-3 e-2)))))) -(define PreludeC-45Types-countFrom (lambda (arg-1 arg-2) (cons arg-1 (lambda () (PreludeC-45Types-countFrom (arg-2 arg-1) arg-2))))) -(define PreludeC-45Types-takeUntil (lambda (arg-1 arg-2) (let ((e-1 (car arg-2))) (let ((e-2 (cdr arg-2))) (let ((sc1 (arg-1 e-1))) (cond ((equal? sc1 1) (cons e-1 '())) (else (cons e-1 (PreludeC-45Types-takeUntil arg-1 (e-2)))))))))) -(define PreludeC-45Types-u--C-60C-61_Ord_Nat (lambda (arg-0 arg-1) (PreludeC-45EqOrd-u--C-47C-61_Eq_Ordering (PreludeC-45EqOrd-u--compare_Ord_Integer arg-0 arg-1) 2))) -(define PreludeC-45Types-u--pure_Applicative_List (lambda (arg-1) (cons arg-1 '()))) -(define PreludeC-45Types-u--rangeFromTo_Range_Nat (lambda (arg-0 arg-1) (let ((sc0 (PreludeC-45EqOrd-u--compare_Ord_Integer arg-0 arg-1))) (cond ((equal? sc0 0) (PreludeC-45Types-takeUntil (lambda (arg-2) (PreludeC-45Types-u--C-62C-61_Ord_Nat arg-2 arg-1)) (PreludeC-45Types-countFrom arg-0 (lambda (eta-0) (+ eta-0 1))))) ((equal? sc0 1) (PreludeC-45Types-u--pure_Applicative_List arg-0)) (else (PreludeC-45Types-takeUntil (lambda (arg-2) (PreludeC-45Types-u--C-60C-61_Ord_Nat arg-2 arg-1)) (PreludeC-45Types-countFrom arg-0 (lambda (u--n) (PreludeC-45Types-prim__integerToNat (- u--n 1)))))))))) -(define OchranceC-45FilesystemC-45Verify-collectBlockHashes (lambda (arg-0) (PreludeC-45TypesC-45List-mapAppend '() (let ((e-1 (vector-ref arg-0 1))) e-1) (PreludeC-45Types-u--rangeFromTo_Range_Nat 0 (PreludeC-45Types-prim__integerToNat (- (let ((e-0 (vector-ref arg-0 0))) e-0) 1)))))) -(define DataC-45List-u--zipWith_Zippable_List (lambda (arg-3 arg-4 arg-5) (if (null? arg-4) '() (if (null? arg-5) '() (let ((e-1 (car arg-4))) (let ((e-2 (cdr arg-4))) (let ((e-4 (car arg-5))) (let ((e-5 (cdr arg-5))) (cons ((arg-3 e-1) e-4) (DataC-45List-u--zipWith_Zippable_List arg-3 e-2 e-5)))))))))) -(define DataC-45List-u--zip_Zippable_List (lambda (ext-0 ext-1) (DataC-45List-u--zipWith_Zippable_List (lambda (__leftTupleSection-0) (lambda (__infixTupleSection-0) (cons __leftTupleSection-0 __infixTupleSection-0))) ext-0 ext-1))) -(define OchranceC-45FilesystemC-45Verify-n--5156-2488-u--mapMaybe (lambda (arg-1 arg-2 arg-5 arg-6) (if (null? arg-6) '() (let ((e-2 (car arg-6))) (let ((e-3 (cdr arg-6))) (let ((sc1 (arg-5 e-2))) (if (null? sc1) (OchranceC-45FilesystemC-45Verify-n--5156-2488-u--mapMaybe arg-1 arg-2 arg-5 e-3) (let ((e-4 (unbox sc1))) (cons e-4 (OchranceC-45FilesystemC-45Verify-n--5156-2488-u--mapMaybe arg-1 arg-2 arg-5 e-3)))))))))) -(define OchranceC-45FilesystemC-45Verify-n--5156-2489-u--toRef (lambda (arg-1 arg-2 arg-3) (let ((e-2 (car arg-3))) (let ((e-3 (cdr arg-3))) (if (null? e-3) '() (let ((e-6 (unbox e-3))) (box (cons (string-append "block_" (PreludeC-45Show-u--show_Show_Nat e-2)) e-6)))))))) -(define OchranceC-45FilesystemC-45Verify-generateManifest (lambda (arg-1 arg-2) (let ((u--blockHashes (OchranceC-45FilesystemC-45Verify-collectBlockHashes arg-2))) (let ((u--validRefs (OchranceC-45FilesystemC-45Verify-n--5156-2488-u--mapMaybe arg-1 arg-2 (lambda (eta-0) (OchranceC-45FilesystemC-45Verify-n--5156-2489-u--toRef arg-1 arg-2 eta-0)) (DataC-45List-u--zip_Zippable_List (PreludeC-45Types-u--rangeFromTo_Range_Nat 0 (PreludeC-45Types-prim__integerToNat (- (let ((e-0 (vector-ref arg-2 0))) e-0) 1))) u--blockHashes)))) (let ((u--manifest (vector (let ((e-2 (vector-ref arg-2 2))) e-2) u--validRefs '() '()))) (let ((e-1 (car arg-1))) (let ((e-5 (vector-ref e-1 0))) (let ((e-7 (vector-ref e-5 1))) ((e-7 'erased) (vector 1 u--manifest)))))))))) -(define OchranceC-45A2MLC-45Validator-isVersionSupported (lambda (arg-0) (cond ((equal? arg-0 "0.1.0") 1)(else 0)))) -(define PreludeC-45Interfaces-C-42C-62 (lambda (arg-3 arg-4 arg-5) (let ((e-3 (vector-ref arg-3 2))) ((((e-3 'erased) 'erased) (((let ((eff-0 (let ((e-6 (vector-ref arg-3 0))) e-6))) ((eff-0 'erased) 'erased)) (lambda (eta-0) (lambda (eta-1) eta-1))) arg-4)) arg-5)))) -(define PreludeC-45Interfaces-traverse_ (lambda (arg-4 arg-5 arg-6) (let ((e-1 (vector-ref arg-5 0))) ((((e-1 'erased) 'erased) (lambda (eta-0) (lambda (eta-1) (PreludeC-45Interfaces-C-42C-62 arg-4 (arg-6 eta-0) eta-1)))) (let ((e-8 (vector-ref arg-4 1))) ((e-8 'erased) 'erased)))))) -(define PreludeC-45Types-isHexDigit (lambda (arg-0) (let ((sc0 (PreludeC-45Types-isDigit arg-0))) (cond ((equal? sc0 1) 1) (else (let ((sc1 (let ((sc2 (PreludeC-45EqOrd-u--C-60C-61_Ord_Char #\a arg-0))) (cond ((equal? sc2 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char arg-0 #\f)) (else 0))))) (cond ((equal? sc1 1) 1) (else (let ((sc2 (PreludeC-45EqOrd-u--C-60C-61_Ord_Char #\A arg-0))) (cond ((equal? sc2 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char arg-0 #\F)) (else 0))))))))))) -(define OchranceC-45A2MLC-45Validator-n--4376-2315-u--isHexChar (lambda (arg-0 arg-1) (let ((sc0 (PreludeC-45Types-isHexDigit arg-1))) (cond ((equal? sc0 1) 1) (else (PreludeC-45EqOrd-u--C-61C-61_Eq_Char arg-1 #\.)))))) -(define OchranceC-45A2MLC-45Validator-isValidHexString (lambda (arg-0) (PreludeC-45Types-u--foldMap_Foldable_List csegen-48 (lambda (eta-0) (OchranceC-45A2MLC-45Validator-n--4376-2315-u--isHexChar arg-0 eta-0)) (PreludeC-45Types-fastUnpack arg-0)))) -(define OchranceC-45A2MLC-45Validator-validateRef (lambda (arg-0) (let ((sc0 (OchranceC-45A2MLC-45Validator-isValidHexString (let ((e-1 (cdr arg-0))) (let ((e-2 (cdr e-1))) e-2))))) (cond ((equal? sc0 1) (vector 1 'erased)) (else (vector 0 (vector 3 (let ((e-1 (cdr arg-0))) (let ((e-2 (cdr e-1))) e-2))))))))) -(define PreludeC-45Basics-flip (lambda (arg-3 ext-0 ext-1) ((arg-3 ext-1) ext-0))) -(define PreludeC-45Types-u--foldlM_Foldable_List (lambda (arg-3 arg-4 arg-5 ext-0) (PreludeC-45Types-u--foldl_Foldable_List (lambda (u--ma) (lambda (u--b) (let ((e-2 (vector-ref arg-3 1))) ((((e-2 'erased) 'erased) u--ma) (lambda (eta-0) (PreludeC-45Basics-flip arg-4 u--b eta-0)))))) (let ((e-1 (vector-ref arg-3 0))) (let ((e-5 (vector-ref e-1 1))) ((e-5 'erased) arg-5))) ext-0))) -(define PreludeC-45Types-u--foldr_Foldable_List (lambda (arg-2 arg-3 arg-4) (if (null? arg-4) arg-3 (let ((e-2 (car arg-4))) (let ((e-3 (cdr arg-4))) ((arg-2 e-2) (PreludeC-45Types-u--foldr_Foldable_List arg-2 arg-3 e-3))))))) -(define PreludeC-45Types-u--null_Foldable_List (lambda (arg-1) (if (null? arg-1) 1 0))) -(define OchranceC-45A2MLC-45Validator-validateManifest (lambda (arg-0) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (let ((sc0 (OchranceC-45A2MLC-45Validator-isVersionSupported (let ((e-0 (vector-ref arg-0 0))) (let ((e-6 (vector-ref e-0 0))) e-6))))) (cond ((equal? sc0 1) (vector 1 'erased)) (else (vector 0 (vector 1 (let ((e-0 (vector-ref arg-0 0))) (let ((e-6 (vector-ref e-0 0))) e-6))))))) (lambda (_-10677) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (let ((sc0 (PreludeC-45EqOrd-u--C-61C-61_Eq_String (let ((e-0 (vector-ref arg-0 0))) (let ((e-5 (vector-ref e-0 1))) e-5)) ""))) (cond ((equal? sc0 1) (vector 0 (vector 0 "subsystem"))) (else (vector 1 'erased)))) (lambda (_-10678) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 ((PreludeC-45Interfaces-traverse_ (vector (lambda (u--b) (lambda (u--a) (lambda (u--func) (lambda (arg-8912) (case (vector-ref arg-8912 0) ((0) (let ((e-2 (vector-ref arg-8912 1))) (vector 0 e-2))) (else (let ((e-5 (vector-ref arg-8912 1))) (vector 1 (u--func e-5))))))))) (lambda (u--a) (lambda (arg-9951) (vector 1 arg-9951))) (lambda (u--b) (lambda (u--a) (lambda (arg-9957) (lambda (arg-9964) (case (vector-ref arg-9957 0) ((0) (let ((e-2 (vector-ref arg-9957 1))) (vector 0 e-2))) (else (let ((e-5 (vector-ref arg-9957 1))) (case (vector-ref arg-9964 0) ((1) (let ((e-8 (vector-ref arg-9964 1))) (vector 1 (e-5 e-8)))) (else (let ((e-11 (vector-ref arg-9964 1))) (vector 0 e-11)))))))))))) (vector (lambda (u--acc) (lambda (u--elem) (lambda (u--func) (lambda (u--init) (lambda (u--input) (PreludeC-45Types-u--foldr_Foldable_List u--func u--init u--input)))))) (lambda (u--elem) (lambda (u--acc) (lambda (u--func) (lambda (u--init) (lambda (u--input) (PreludeC-45Types-u--foldl_Foldable_List u--func u--init u--input)))))) (lambda (u--elem) (lambda (arg-10939) (PreludeC-45Types-u--null_Foldable_List arg-10939))) (lambda (u--elem) (lambda (u--acc) (lambda (u--m) (lambda (i_con-0) (lambda (u--funcM) (lambda (u--init) (lambda (u--input) (PreludeC-45Types-u--foldlM_Foldable_List i_con-0 u--funcM u--init u--input)))))))) (lambda (u--elem) (lambda (arg-10968) arg-10968)) (lambda (u--a) (lambda (u--m) (lambda (i_con-0) (lambda (u--f) (lambda (arg-10982) (PreludeC-45Types-u--foldMap_Foldable_List i_con-0 u--f arg-10982))))))) (lambda (eta-0) (OchranceC-45A2MLC-45Validator-validateRef eta-0))) (let ((e-1 (vector-ref arg-0 1))) e-1)) (lambda (_-10679) (vector 1 arg-0))))))))) -(define IntegrationTests-test_VerifyValidManifest (let ((u--fs (IntegrationTests-createTestFS 2))) (lambda (world-0) (let ((act-1 ((OchranceC-45FilesystemC-45Verify-generateManifest csegen-13 u--fs) world-0))) (case (vector-ref act-1 0) ((0) (let ((e-2 (vector-ref act-1 1))) (box (string-append "Generate failed: " (OchranceC-45FrameworkC-45Error-u--show_Show_OchranceError e-2))))) (else (let ((e-5 (vector-ref act-1 1))) (let ((u--manifestResult (vector 1 e-5))) (IntegrationTests-case--caseC-32blockC-32inC-32test_VerifyValidManifest-5306 u--fs e-5 u--manifestResult (OchranceC-45A2MLC-45Validator-validateManifest e-5) world-0))))))))) -(define PreludeC-45TypesC-45List-tailRecAppend (lambda (arg-1 arg-2) (PreludeC-45TypesC-45List-reverseOnto arg-2 (PreludeC-45TypesC-45List-reverse arg-1)))) -(define OchranceC-45A2MLC-45Lexer-collectDigits (lambda (arg-0 arg-1) (if (null? arg-1) (cons arg-0 '()) (let ((e-2 (car arg-1))) (let ((e-3 (cdr arg-1))) (let ((sc1 (PreludeC-45Types-isDigit e-2))) (cond ((equal? sc1 1) (OchranceC-45A2MLC-45Lexer-collectDigits (PreludeC-45TypesC-45List-tailRecAppend arg-0 (cons e-2 '())) e-3)) (else (cons arg-0 (cons e-2 e-3)))))))))) -(define PreludeC-45Types-isLower (lambda (arg-0) (let ((sc0 (PreludeC-45EqOrd-u--C-62C-61_Ord_Char arg-0 #\a))) (cond ((equal? sc0 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char arg-0 #\z)) (else 0))))) -(define PreludeC-45Types-isUpper (lambda (arg-0) (let ((sc0 (PreludeC-45EqOrd-u--C-62C-61_Ord_Char arg-0 #\A))) (cond ((equal? sc0 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char arg-0 #\Z)) (else 0))))) -(define PreludeC-45Types-isAlpha (lambda (arg-0) (let ((sc0 (PreludeC-45Types-isUpper arg-0))) (cond ((equal? sc0 1) 1) (else (PreludeC-45Types-isLower arg-0)))))) -(define OchranceC-45A2MLC-45Lexer-isIdentChar (lambda (arg-0) (let ((sc0 (PreludeC-45Types-isAlpha arg-0))) (cond ((equal? sc0 1) 1) (else (let ((sc1 (PreludeC-45Types-isDigit arg-0))) (cond ((equal? sc1 1) 1) (else (let ((sc2 (PreludeC-45EqOrd-u--C-61C-61_Eq_Char arg-0 #\_))) (cond ((equal? sc2 1) 1) (else (PreludeC-45EqOrd-u--C-61C-61_Eq_Char arg-0 #\-)))))))))))) -(define OchranceC-45A2MLC-45Lexer-collectIdent (lambda (arg-0 arg-1) (if (null? arg-1) (cons arg-0 '()) (let ((e-2 (car arg-1))) (let ((e-3 (cdr arg-1))) (let ((sc1 (OchranceC-45A2MLC-45Lexer-isIdentChar e-2))) (cond ((equal? sc1 1) (OchranceC-45A2MLC-45Lexer-collectIdent (PreludeC-45TypesC-45List-tailRecAppend arg-0 (cons e-2 '())) e-3)) (else (cons arg-0 (cons e-2 e-3)))))))))) -(define OchranceC-45A2MLC-45Lexer-collectString (lambda (arg-0 arg-1) (if (null? arg-1) '() (let ((e-2 (car arg-1))) (let ((e-3 (cdr arg-1))) (cond ((equal? e-2 #\") (box (cons arg-0 e-3))) ((equal? e-2 #\\) (if (null? e-3) (OchranceC-45A2MLC-45Lexer-collectString (PreludeC-45TypesC-45List-tailRecAppend arg-0 (cons e-2 '())) e-3) (let ((e-5 (car e-3))) (let ((e-6 (cdr e-3))) (OchranceC-45A2MLC-45Lexer-collectString (PreludeC-45TypesC-45List-tailRecAppend arg-0 (cons e-5 '())) e-6)))))(else (OchranceC-45A2MLC-45Lexer-collectString (PreludeC-45TypesC-45List-tailRecAppend arg-0 (cons e-2 '())) e-3)))))))) -(define OchranceC-45A2MLC-45Lexer-keywordToken (lambda (arg-0) (cond ((equal? arg-0 "manifest") (vector 0 )) ((equal? arg-0 "refs") (vector 1 )) ((equal? arg-0 "attestation") (vector 2 )) ((equal? arg-0 "policy") (vector 3 ))(else (vector 8 (string-append "@" arg-0)))))) -(define OchranceC-45A2MLC-45Lexer-case--lexFuel-10229 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5) (let ((e-2 (car arg-5))) (let ((e-3 (cdr arg-5))) (let ((u--kw (PreludeC-45Types-fastPack e-2))) (let ((u--consumed (PreludeC-45TypesC-45List-lengthTR e-2))) (OchranceC-45A2MLC-45Lexer-lexFuel arg-0 e-3 arg-4 (+ (+ arg-3 1) u--consumed) (cons (OchranceC-45A2MLC-45Lexer-keywordToken u--kw) arg-2)))))))) -(define OchranceC-45A2MLC-45Lexer-case--lexFuel-10272 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5) (if (null? arg-5) (vector 0 (vector 1 arg-4 arg-3)) (let ((e-2 (unbox arg-5))) (let ((e-5 (car e-2))) (let ((e-6 (cdr e-2))) (let ((u--consumed (+ (PreludeC-45TypesC-45List-lengthTR e-5) 2))) (OchranceC-45A2MLC-45Lexer-lexFuel arg-0 e-6 arg-4 (+ arg-3 u--consumed) (cons (vector 9 (PreludeC-45Types-fastPack e-5)) arg-2))))))))) -(define DataC-45String-strM (lambda (arg-0) (cond ((equal? arg-0 "") '())(else (cons (string-ref arg-0 0) (substring arg-0 1 (string-length arg-0))))))) -(define DataC-45String-with--asList-9840 (lambda (arg-0 arg-1) (cond ((equal? arg-0 "") (if (null? arg-1) (vector 0 ) (let ((e-0 (car arg-1))) (let ((e-1 (cdr arg-1))) (vector 1 e-0 e-1 (lambda () (DataC-45String-asList e-1)))))))(else (let ((e-0 (car arg-1))) (let ((e-1 (cdr arg-1))) (vector 1 e-0 e-1 (lambda () (DataC-45String-asList e-1))))))))) -(define DataC-45String-asList (lambda (arg-0) (DataC-45String-with--asList-9840 arg-0 (DataC-45String-strM arg-0)))) -(define PreludeC-45Types-isSpace (lambda (arg-0) (cond ((equal? arg-0 #\ ) 1) ((equal? arg-0 (integer->char 9)) 1) ((equal? arg-0 (integer->char 13)) 1) ((equal? arg-0 (integer->char 10)) 1) ((equal? arg-0 (integer->char 12)) 1) ((equal? arg-0 (integer->char 11)) 1) ((equal? arg-0 (integer->char 160)) 1)(else 0)))) -(define DataC-45String-with--ltrim-9864 (lambda (arg-0 arg-1) (cond ((equal? arg-0 "") (case (vector-ref arg-1 0) ((0) "")(else (let ((e-0 (vector-ref arg-1 1))) (let ((e-1 (vector-ref arg-1 2))) (let ((e-2 (vector-ref arg-1 3))) (let ((u--str (string-cons e-0 e-1))) (let ((sc2 (PreludeC-45Types-isSpace e-0))) (cond ((equal? sc2 1) (DataC-45String-with--ltrim-9864 e-1 (e-2))) (else u--str))))))))))(else (let ((e-0 (vector-ref arg-1 1))) (let ((e-1 (vector-ref arg-1 2))) (let ((e-2 (vector-ref arg-1 3))) (let ((u--str (string-cons e-0 e-1))) (let ((sc1 (PreludeC-45Types-isSpace e-0))) (cond ((equal? sc1 1) (DataC-45String-with--ltrim-9864 e-1 (e-2))) (else u--str))))))))))) -(define DataC-45String-ltrim (lambda (arg-0) (DataC-45String-with--ltrim-9864 arg-0 (DataC-45String-asList arg-0)))) -(define DataC-45String-rtrim (lambda (ext-0) (string-reverse (DataC-45String-ltrim (string-reverse ext-0))))) -(define DataC-45String-trim (lambda (ext-0) (DataC-45String-ltrim (DataC-45String-rtrim ext-0)))) -(define DataC-45String-parseNumWithoutSign (lambda (arg-0 arg-1) (if (null? arg-0) (box arg-1) (let ((e-2 (car arg-0))) (let ((e-3 (cdr arg-0))) (let ((sc1 (let ((sc2 (PreludeC-45EqOrd-u--C-62C-61_Ord_Char e-2 #\0))) (cond ((equal? sc2 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char e-2 #\9)) (else 0))))) (cond ((equal? sc1 1) (DataC-45String-parseNumWithoutSign e-3 (+ (* arg-1 10) (bs- (cast-char-boundedInt e-2 63) (cast-char-boundedInt #\0 63) 63)))) (else '())))))))) -(define PreludeC-45Types-u--map_Functor_Maybe (lambda (arg-2 arg-3) (if (null? arg-3) '() (let ((e-1 (unbox arg-3))) (box (arg-2 e-1)))))) -(define DataC-45String-with--parseIntegerC-44parseIntTrimmed-10310 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5) (cond ((equal? arg-4 "") (if (null? arg-5) '() (let ((e-0 (car arg-5))) (let ((e-1 (cdr arg-5))) (let ((sc3 (PreludeC-45EqOrd-u--C-61C-61_Eq_Char e-0 #\-))) (cond ((equal? sc3 1) (PreludeC-45Types-u--map_Functor_Maybe (lambda (u--y) (let ((e-2 (vector-ref arg-2 1))) (e-2 (let ((e-5 (vector-ref arg-1 2))) (e-5 u--y))))) (DataC-45String-parseNumWithoutSign (PreludeC-45Types-fastUnpack e-1) 0))) (else (let ((sc4 (PreludeC-45EqOrd-u--C-61C-61_Eq_Char e-0 #\+))) (cond ((equal? sc4 1) (PreludeC-45Types-u--map_Functor_Maybe (let ((e-3 (vector-ref arg-1 2))) e-3) (DataC-45String-parseNumWithoutSign (PreludeC-45Types-fastUnpack e-1) 0))) (else (let ((sc5 (let ((sc6 (PreludeC-45EqOrd-u--C-62C-61_Ord_Char e-0 #\0))) (cond ((equal? sc6 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char e-0 #\9)) (else 0))))) (cond ((equal? sc5 1) (PreludeC-45Types-u--map_Functor_Maybe (let ((e-3 (vector-ref arg-1 2))) e-3) (DataC-45String-parseNumWithoutSign (PreludeC-45Types-fastUnpack e-1) (bs- (cast-char-boundedInt e-0 63) (cast-char-boundedInt #\0 63) 63)))) (else '())))))))))))))(else (let ((e-0 (car arg-5))) (let ((e-1 (cdr arg-5))) (let ((sc1 (PreludeC-45EqOrd-u--C-61C-61_Eq_Char e-0 #\-))) (cond ((equal? sc1 1) (PreludeC-45Types-u--map_Functor_Maybe (lambda (u--y) (let ((e-2 (vector-ref arg-2 1))) (e-2 (let ((e-5 (vector-ref arg-1 2))) (e-5 u--y))))) (DataC-45String-parseNumWithoutSign (PreludeC-45Types-fastUnpack e-1) 0))) (else (let ((sc2 (PreludeC-45EqOrd-u--C-61C-61_Eq_Char e-0 #\+))) (cond ((equal? sc2 1) (PreludeC-45Types-u--map_Functor_Maybe (let ((e-3 (vector-ref arg-1 2))) e-3) (DataC-45String-parseNumWithoutSign (PreludeC-45Types-fastUnpack e-1) 0))) (else (let ((sc3 (let ((sc4 (PreludeC-45EqOrd-u--C-62C-61_Ord_Char e-0 #\0))) (cond ((equal? sc4 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char e-0 #\9)) (else 0))))) (cond ((equal? sc3 1) (PreludeC-45Types-u--map_Functor_Maybe (let ((e-3 (vector-ref arg-1 2))) e-3) (DataC-45String-parseNumWithoutSign (PreludeC-45Types-fastUnpack e-1) (bs- (cast-char-boundedInt e-0 63) (cast-char-boundedInt #\0 63) 63)))) (else '()))))))))))))))) -(define DataC-45String-n--4569-10304-u--parseIntTrimmed (lambda (arg-1 arg-2 arg-3 arg-4) (DataC-45String-with--parseIntegerC-44parseIntTrimmed-10310 'erased arg-1 arg-2 arg-4 arg-4 (DataC-45String-strM arg-4)))) -(define DataC-45String-parseInteger (lambda (arg-1 arg-2 arg-3) (DataC-45String-n--4569-10304-u--parseIntTrimmed arg-1 arg-2 arg-3 (DataC-45String-trim arg-3)))) -(define OchranceC-45A2MLC-45Lexer-case--caseC-32blockC-32inC-32lexFuel-10349 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5 arg-6) (let ((e-2 (car arg-6))) (let ((e-3 (cdr arg-6))) (let ((u--numStr (PreludeC-45Types-fastPack e-2))) (let ((u--consumed (PreludeC-45TypesC-45List-lengthTR e-2))) (let ((sc1 (DataC-45String-parseInteger csegen-85 (vector csegen-85 (lambda (arg-6034) (- 0 arg-6034)) (lambda (arg-6040) (lambda (arg-6043) (- arg-6040 arg-6043)))) u--numStr))) (if (null? sc1) (vector 0 (vector 0 arg-1 arg-5 arg-4)) (let ((e-1 (unbox sc1))) (OchranceC-45A2MLC-45Lexer-lexFuel arg-0 e-3 arg-5 (+ arg-4 u--consumed) (cons (vector 10 e-1) arg-3))))))))))) -(define OchranceC-45A2MLC-45Lexer-isHashChar (lambda (arg-0) (let ((sc0 (PreludeC-45Types-isHexDigit arg-0))) (cond ((equal? sc0 1) 1) (else (PreludeC-45EqOrd-u--C-61C-61_Eq_Char arg-0 #\.)))))) -(define OchranceC-45A2MLC-45Lexer-collectHashValue (lambda (arg-0 arg-1) (if (null? arg-1) (cons arg-0 '()) (let ((e-2 (car arg-1))) (let ((e-3 (cdr arg-1))) (let ((sc1 (OchranceC-45A2MLC-45Lexer-isHashChar e-2))) (cond ((equal? sc1 1) (OchranceC-45A2MLC-45Lexer-collectHashValue (PreludeC-45TypesC-45List-tailRecAppend arg-0 (cons e-2 '())) e-3)) (else (cons arg-0 (cons e-2 e-3)))))))))) -(define PreludeC-45Types-u--C-62_Ord_Nat (lambda (arg-0 arg-1) (PreludeC-45EqOrd-u--C-61C-61_Eq_Ordering (PreludeC-45EqOrd-u--compare_Ord_Integer arg-0 arg-1) 2))) -(define OchranceC-45A2MLC-45Lexer-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32caseC-32blockC-32inC-32caseC-32blockC-32inC-32lexFuel-10534 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5 arg-6 arg-7 arg-8 arg-9 arg-10 arg-11) (let ((e-2 (car arg-11))) (let ((e-3 (cdr arg-11))) (let ((u--hval (PreludeC-45Types-fastPack e-2))) (let ((u--hconsumed (+ (+ arg-8 1) (PreludeC-45TypesC-45List-lengthTR e-2)))) (let ((sc1 (PreludeC-45Types-u--C-62_Ord_Nat (PreludeC-45TypesC-45List-lengthTR e-2) 0))) (cond ((equal? sc1 1) (OchranceC-45A2MLC-45Lexer-lexFuel arg-0 e-3 arg-5 (+ arg-4 u--hconsumed) (cons (vector 11 arg-7 u--hval) arg-3))) (else (OchranceC-45A2MLC-45Lexer-lexFuel arg-0 arg-10 arg-5 (+ arg-4 arg-8) (cons (vector 8 arg-7) arg-3))))))))))) -(define OchranceC-45A2MLC-45Lexer-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32lexFuel-10475 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5 arg-6) (let ((e-2 (car arg-6))) (let ((e-3 (cdr arg-6))) (let ((u--ident (PreludeC-45Types-fastPack e-2))) (let ((u--consumed (PreludeC-45TypesC-45List-lengthTR e-2))) (if (null? e-3) (OchranceC-45A2MLC-45Lexer-lexFuel arg-0 e-3 arg-5 (+ arg-4 u--consumed) (cons (vector 8 u--ident) arg-3)) (let ((e-1 (car e-3))) (let ((e-4 (cdr e-3))) (cond ((equal? e-1 #\:) (let ((u--restC-39 (cons #\: e-4))) (OchranceC-45A2MLC-45Lexer-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32caseC-32blockC-32inC-32caseC-32blockC-32inC-32lexFuel-10534 arg-0 arg-1 arg-2 arg-3 arg-4 arg-5 e-2 u--ident u--consumed e-4 u--restC-39 (OchranceC-45A2MLC-45Lexer-collectHashValue '() e-4))))(else (OchranceC-45A2MLC-45Lexer-lexFuel arg-0 e-3 arg-5 (+ arg-4 u--consumed) (cons (vector 8 u--ident) arg-3))))))))))))) -(define OchranceC-45A2MLC-45Lexer-lexFuel (lambda (arg-0 arg-1 arg-2 arg-3 arg-4) (cond ((equal? arg-0 0) (vector 1 (PreludeC-45TypesC-45List-reverse (cons (vector 12 ) arg-4))))(else (let ((e-0 (- arg-0 1))) (if (null? arg-1) (vector 1 (PreludeC-45TypesC-45List-reverse (cons (vector 12 ) arg-4))) (let ((e-3 (car arg-1))) (let ((e-4 (cdr arg-1))) (cond ((equal? e-3 #\ ) (OchranceC-45A2MLC-45Lexer-lexFuel e-0 e-4 arg-2 (+ arg-3 1) arg-4)) ((equal? e-3 (integer->char 9)) (OchranceC-45A2MLC-45Lexer-lexFuel e-0 e-4 arg-2 (+ arg-3 4) arg-4)) ((equal? e-3 (integer->char 10)) (OchranceC-45A2MLC-45Lexer-lexFuel e-0 e-4 (+ arg-2 1) 1 arg-4)) ((equal? e-3 (integer->char 13)) (OchranceC-45A2MLC-45Lexer-lexFuel e-0 e-4 arg-2 arg-3 arg-4)) ((equal? e-3 #\{) (OchranceC-45A2MLC-45Lexer-lexFuel e-0 e-4 arg-2 (+ arg-3 1) (cons (vector 4 ) arg-4))) ((equal? e-3 #\}) (OchranceC-45A2MLC-45Lexer-lexFuel e-0 e-4 arg-2 (+ arg-3 1) (cons (vector 5 ) arg-4))) ((equal? e-3 #\:) (OchranceC-45A2MLC-45Lexer-lexFuel e-0 e-4 arg-2 (+ arg-3 1) (cons (vector 6 ) arg-4))) ((equal? e-3 #\=) (OchranceC-45A2MLC-45Lexer-lexFuel e-0 e-4 arg-2 (+ arg-3 1) (cons (vector 7 ) arg-4))) ((equal? e-3 #\@) (OchranceC-45A2MLC-45Lexer-case--lexFuel-10229 e-0 e-4 arg-4 arg-3 arg-2 (OchranceC-45A2MLC-45Lexer-collectIdent '() e-4))) ((equal? e-3 #\") (OchranceC-45A2MLC-45Lexer-case--lexFuel-10272 e-0 e-4 arg-4 arg-3 arg-2 (OchranceC-45A2MLC-45Lexer-collectString '() e-4)))(else (let ((sc1 (PreludeC-45Types-isDigit e-3))) (cond ((equal? sc1 1) (OchranceC-45A2MLC-45Lexer-case--caseC-32blockC-32inC-32lexFuel-10349 e-0 e-3 e-4 arg-4 arg-3 arg-2 (OchranceC-45A2MLC-45Lexer-collectDigits (cons e-3 '()) e-4))) (else (let ((sc2 (PreludeC-45Types-isAlpha e-3))) (cond ((equal? sc2 1) (OchranceC-45A2MLC-45Lexer-case--caseC-32blockC-32inC-32caseC-32blockC-32inC-32lexFuel-10475 e-0 e-3 e-4 arg-4 arg-3 arg-2 (OchranceC-45A2MLC-45Lexer-collectIdent (cons e-3 '()) e-4))) (else (vector 0 (vector 0 e-3 arg-2 arg-3)))))))))))))))))) -(define OchranceC-45A2MLC-45Lexer-lex (lambda (arg-0) (let ((u--chars (PreludeC-45Types-fastUnpack arg-0))) (let ((u--fuel (+ (PreludeC-45TypesC-45List-lengthTR u--chars) 1))) (OchranceC-45A2MLC-45Lexer-lexFuel u--fuel u--chars 1 1 '()))))) -(define DataC-45String-n--3856-9572-u--unlinesC-39 (lambda (arg-0) (if (null? arg-0) '() (let ((e-2 (car arg-0))) (let ((e-3 (cdr arg-0))) (cons e-2 (cons "\xa;" (DataC-45String-n--3856-9572-u--unlinesC-39 e-3)))))))) -(define DataC-45String-fastUnlines (lambda (ext-0) (PreludeC-45Types-fastConcat (DataC-45String-n--3856-9572-u--unlinesC-39 ext-0)))) -(define PreludeC-45Types-maybe (lambda (arg-2 arg-3 arg-4) (if (null? arg-4) (arg-2) (let ((e-2 (unbox arg-4))) ((arg-3) e-2))))) -(define OchranceC-45A2MLC-45Serializer-serializeRef (lambda (arg-0) (string-append " " (string-append (let ((e-0 (car arg-0))) e-0) (string-append " : " (OchranceC-45A2MLC-45Types-u--show_Show_Hash (let ((e-1 (cdr arg-0))) e-1))))))) -(define OchranceC-45A2MLC-45Serializer-n--3824-10287-u--serializeAttestation (lambda (arg-0 arg-1) (string-append "\xa;@attestation {\xa;" (string-append " witness = \"" (string-append (let ((e-0 (vector-ref arg-1 0))) e-0) (string-append "\"\xa;" (string-append " signature = \"" (string-append (let ((e-1 (vector-ref arg-1 1))) e-1) (string-append "\"\xa;" (string-append " pubkey = \"" (string-append (let ((e-2 (vector-ref arg-1 2))) e-2) "\"\xa;}\xa;"))))))))))) -(define OchranceC-45A2MLC-45Types-u--show_Show_VerificationMode (lambda (arg-0) (cond ((equal? arg-0 0) "lax") ((equal? arg-0 1) "checked") (else "attested")))) -(define OchranceC-45A2MLC-45Serializer-n--3824-10288-u--serializePolicy (lambda (arg-0 arg-1) (string-append "\xa;@policy {\xa;" (string-append " mode = \"" (string-append (OchranceC-45A2MLC-45Types-u--show_Show_VerificationMode (let ((e-0 (vector-ref arg-1 0))) e-0)) (string-append "\"\xa;" (string-append (PreludeC-45Types-maybe (lambda () "") (lambda () (lambda (u--a) (string-append " max_age = " (string-append (PreludeC-45Show-u--show_Show_Nat u--a) "\xa;")))) (let ((e-1 (vector-ref arg-1 1))) e-1)) (string-append " require_sig = " (string-append (let ((sc0 (let ((e-2 (vector-ref arg-1 2))) e-2))) (cond ((equal? sc0 1) "true") (else "false"))) "\xa;}\xa;"))))))))) -(define OchranceC-45A2MLC-45Serializer-serialize (lambda (arg-0) (let ((u--header (string-append "@manifest {\xa;" (string-append " version = \"" (string-append (let ((e-0 (vector-ref arg-0 0))) (let ((e-6 (vector-ref e-0 0))) e-6)) (string-append "\"\xa;" (string-append " subsystem = \"" (string-append (let ((e-0 (vector-ref arg-0 0))) (let ((e-5 (vector-ref e-0 1))) e-5)) (string-append "\"\xa;" (string-append (PreludeC-45Types-maybe (lambda () "") (lambda () (lambda (u--t) (string-append " timestamp = \"" (string-append u--t "\"\xa;")))) (let ((e-0 (vector-ref arg-0 0))) (let ((e-4 (vector-ref e-0 2))) e-4))) "}\xa;\xa;")))))))))) (let ((u--refs (string-append "@refs {\xa;" (string-append (DataC-45String-fastUnlines (PreludeC-45TypesC-45List-mapAppend '() (lambda (eta-0) (OchranceC-45A2MLC-45Serializer-serializeRef eta-0)) (let ((e-1 (vector-ref arg-0 1))) e-1))) "}\xa;")))) (let ((u--att (PreludeC-45Types-maybe (lambda () "") (lambda () (lambda (eta-0) (OchranceC-45A2MLC-45Serializer-n--3824-10287-u--serializeAttestation arg-0 eta-0))) (let ((e-2 (vector-ref arg-0 2))) e-2)))) (let ((u--pol (PreludeC-45Types-maybe (lambda () "") (lambda () (lambda (eta-0) (OchranceC-45A2MLC-45Serializer-n--3824-10288-u--serializePolicy arg-0 eta-0))) (let ((e-3 (vector-ref arg-0 3))) e-3)))) (string-append u--header (string-append u--refs (string-append u--att u--pol))))))))) -(define IntegrationTests-test_RoundtripSerialization (let ((u--fs (IntegrationTests-createTestFS 2))) (lambda (world-0) (let ((act-1 ((OchranceC-45FilesystemC-45Verify-generateManifest csegen-13 u--fs) world-0))) (case (vector-ref act-1 0) ((0) (let ((e-2 (vector-ref act-1 1))) (box (string-append "Generate failed: " (OchranceC-45FrameworkC-45Error-u--show_Show_OchranceError e-2))))) (else (let ((e-5 (vector-ref act-1 1))) (let ((u--serialized (OchranceC-45A2MLC-45Serializer-serialize e-5))) (let ((u--manifestResult (vector 1 e-5))) ((IntegrationTests-case--caseC-32blockC-32inC-32test_RoundtripSerialization-6199 u--fs e-5 u--manifestResult u--serialized (OchranceC-45A2MLC-45Lexer-lex u--serialized)) world-0)))))))))) -(define IntegrationTests-test_RepairSingleBlock (let ((u--fs (IntegrationTests-createTestFS 2))) (let ((u--expectedHash (cons 2 "repaired_hash"))) (lambda (world-0) (let ((act-1 ((OchranceC-45FilesystemC-45Repair-repairBlock csegen-13 u--fs 0 u--expectedHash) world-0))) (case (vector-ref act-1 0) ((0) (let ((e-2 (vector-ref act-1 1))) (box (string-append "Repair failed: " (OchranceC-45FrameworkC-45Error-u--show_Show_OchranceError e-2))))) (else (let ((e-5 (vector-ref act-1 1))) (let ((u--result (vector 1 e-5))) (IntegrationTests-case--caseC-32blockC-32inC-32test_RepairSingleBlock-5608 u--fs u--expectedHash e-5 u--result (let ((e-1 (vector-ref e-5 1))) (e-1 0)) world-0)))))))))) -(define PreludeC-45Types-u--C-47C-61_Eq_Nat (lambda (arg-0 arg-1) (let ((sc0 (or (and (= arg-0 arg-1) 1) 0))) (cond ((equal? sc0 1) 0) (else 1))))) -(define OchranceC-45FilesystemC-45Repair-n--4605-2411-u--findHashForBlock (lambda (arg-1 arg-2 arg-4 arg-5) (if (null? arg-5) '() (let ((e-2 (car arg-5))) (let ((e-3 (cdr arg-5))) (let ((sc1 (PreludeC-45EqOrd-u--C-61C-61_Eq_String (let ((e-0 (car e-2))) e-0) arg-4))) (cond ((equal? sc1 1) (box (let ((e-1 (cdr e-2))) e-1))) (else (OchranceC-45FilesystemC-45Repair-n--4605-2411-u--findHashForBlock arg-1 arg-2 arg-4 e-3))))))))) -(define OchranceC-45FilesystemC-45Repair-n--4605-2410-u--buildHashFunction (lambda (arg-1 arg-2 arg-4 arg-5) (OchranceC-45FilesystemC-45Repair-n--4605-2411-u--findHashForBlock arg-1 arg-2 (string-append "block_" (PreludeC-45Show-u--show_Show_Nat arg-5)) arg-4))) -(define OchranceC-45FilesystemC-45Repair-repairFromSnapshot (lambda (arg-1 arg-2 arg-3) (let ((e-0 (vector-ref arg-2 0))) (let ((e-2 (vector-ref arg-2 2))) (let ((sc0 (PreludeC-45Types-u--C-47C-61_Eq_Nat e-0 (let ((e-4 (vector-ref arg-3 1))) e-4)))) (cond ((equal? sc0 1) (let ((e-4 (car arg-1))) (let ((e-7 (vector-ref e-4 0))) (let ((e-9 (vector-ref e-7 1))) ((e-9 'erased) (vector 0 (vector 0 (vector 0 "Block count mismatch")))))))) (else (let ((u--newBlockHashFunc (lambda (eta-0) (OchranceC-45FilesystemC-45Repair-n--4605-2410-u--buildHashFunction arg-1 arg-3 (let ((e-3 (vector-ref arg-3 2))) e-3) eta-0)))) (let ((u--newState (vector e-0 u--newBlockHashFunc e-2))) (let ((e-4 (car arg-1))) (let ((e-7 (vector-ref e-4 0))) (let ((e-9 (vector-ref e-7 1))) ((e-9 'erased) (vector 1 u--newState)))))))))))))) -(define IntegrationTests-test_RepairFromSnapshot (let ((u--fs (IntegrationTests-createTestFS 3))) (let ((u--snapshot (vector (cons 2 "root") 3 (cons (cons "block_0" (cons 2 "snap_hash_0")) (cons (cons "block_1" (cons 2 "snap_hash_1")) (cons (cons "block_2" (cons 2 "snap_hash_2")) '())))))) (lambda (world-0) (let ((act-1 ((OchranceC-45FilesystemC-45Repair-repairFromSnapshot csegen-13 u--fs u--snapshot) world-0))) (case (vector-ref act-1 0) ((0) (let ((e-2 (vector-ref act-1 1))) (box (string-append "Repair failed: " (OchranceC-45FrameworkC-45Error-u--show_Show_OchranceError e-2))))) (else (let ((e-5 (vector-ref act-1 1))) (let ((u--result (vector 1 e-5))) (IntegrationTests-case--caseC-32blockC-32inC-32test_RepairFromSnapshot-5761 u--fs u--snapshot e-5 u--result (let ((e-1 (vector-ref e-5 1))) (e-1 0)) world-0)))))))))) -(define OchranceC-45A2MLC-45Validator-n--4918-2843-u--isNothing (lambda (arg-0 arg-2) (if (null? arg-2) 1 0))) -(define OchranceC-45A2MLC-45Validator-case--validatePolicy-2864 (lambda (arg-0 arg-1) (if (null? arg-1) (vector 1 'erased) (let ((e-2 (unbox arg-1))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (let ((sc1 (let ((sc2 (let ((e-3 (vector-ref e-2 2))) e-3))) (cond ((equal? sc2 1) (OchranceC-45A2MLC-45Validator-n--4918-2843-u--isNothing arg-0 (let ((e-4 (vector-ref arg-0 2))) e-4))) (else 0))))) (cond ((equal? sc1 1) (vector 0 (vector 5 "Policy requires signature but none present"))) (else (vector 1 'erased)))) (lambda (_-10677) ((let ((e-1 (vector-ref e-2 1))) (if (null? e-1) (lambda () (vector 1 'erased)) (let ((e-8 (vector-ref arg-0 0))) (let ((e-9 (vector-ref e-8 2))) (if (null? e-9) (lambda () (vector 0 (vector 5 "Policy specifies max_age but manifest has no timestamp"))) (lambda () (vector 1 'erased)))))))))))))) -(define OchranceC-45A2MLC-45Validator-validatePolicy (lambda (arg-0) (OchranceC-45A2MLC-45Validator-case--validatePolicy-2864 arg-0 (let ((e-3 (vector-ref arg-0 3))) e-3)))) -(define IntegrationTests-test_PolicyRequireSig (let ((u--manifest (vector (vector "0.1.0" "test-filesystem" '()) (cons (cons "block_0" (cons 2 "hash")) '()) '() (box (vector 0 '() 1))))) (lambda (eta-0) (IntegrationTests-case--test_PolicyRequireSig-6106 u--manifest (OchranceC-45A2MLC-45Validator-validatePolicy u--manifest) eta-0)))) -(define DataC-45Vect-replicate (lambda (arg-1 arg-2) (cond ((equal? arg-1 0) '())(else (let ((e-0 (- arg-1 1))) (cons arg-2 (DataC-45Vect-replicate e-0 arg-2))))))) -(define OchranceC-45FilesystemC-45Merkle-emptyHash (DataC-45Vect-replicate 32 0)) -(define DataC-45Vect-u--zipWith_Zippable_C-40VectC-32C-36kC-41 (lambda (arg-4 arg-5 arg-6) (if (null? arg-5) '() (let ((e-3 (car arg-5))) (let ((e-4 (cdr arg-5))) (let ((e-8 (car arg-6))) (let ((e-9 (cdr arg-6))) (cons ((arg-4 e-3) e-8) (DataC-45Vect-u--zipWith_Zippable_C-40VectC-32C-36kC-41 arg-4 e-4 e-9))))))))) -(define OchranceC-45FFIC-45Crypto-hashPairStub (lambda (arg-0 arg-1) (DataC-45Vect-u--zipWith_Zippable_C-40VectC-32C-36kC-41 (lambda (eta-0) (lambda (eta-1) (blodwen-xor eta-0 eta-1))) arg-0 arg-1))) -(define OchranceC-45FilesystemC-45Merkle-rootHashBytes (lambda (arg-1) (case (vector-ref arg-1 0) ((0) (let ((e-0 (vector-ref arg-1 1))) e-0)) (else (let ((e-2 (vector-ref arg-1 1))) (let ((e-3 (vector-ref arg-1 2))) (OchranceC-45FFIC-45Crypto-hashPairStub (OchranceC-45FilesystemC-45Merkle-rootHashBytes e-2) (OchranceC-45FilesystemC-45Merkle-rootHashBytes e-3)))))))) -(define PreludeC-45EqOrd-u--C-61C-61_Eq_Bits8 (lambda (arg-0 arg-1) (let ((sc0 (or (and (= arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45EqOrd-u--C-47C-61_Eq_Bits8 (lambda (arg-0 arg-1) (let ((sc0 (PreludeC-45EqOrd-u--C-61C-61_Eq_Bits8 arg-0 arg-1))) (cond ((equal? sc0 1) 0) (else 1))))) -(define DataC-45Vect-u--C-61C-61_Eq_C-40C-40VectC-32C-36nC-41C-32C-36aC-41 (lambda (arg-2 arg-3 arg-4) (if (null? arg-3) 1 (let ((e-3 (car arg-3))) (let ((e-4 (cdr arg-3))) (let ((e-8 (car arg-4))) (let ((e-9 (cdr arg-4))) (let ((sc2 (let ((e-1 (car arg-2))) ((e-1 e-3) e-8)))) (cond ((equal? sc2 1) (DataC-45Vect-u--C-61C-61_Eq_C-40C-40VectC-32C-36nC-41C-32C-36aC-41 arg-2 e-4 e-9)) (else 0)))))))))) -(define IntegrationTests-test_MerkleTreeVerification (let ((u--leaf1 (vector 0 OchranceC-45FilesystemC-45Merkle-emptyHash))) (let ((u--leaf2 (vector 0 OchranceC-45FilesystemC-45Merkle-emptyHash))) (let ((u--tree (vector 1 u--leaf1 u--leaf2))) (let ((u--rootHash (OchranceC-45FilesystemC-45Merkle-rootHashBytes u--tree))) (lambda (clam-0) (let ((sc0 (DataC-45Vect-u--C-61C-61_Eq_C-40C-40VectC-32C-36nC-41C-32C-36aC-41 (cons (lambda (arg-712) (lambda (arg-715) (PreludeC-45EqOrd-u--C-61C-61_Eq_Bits8 arg-712 arg-715))) (lambda (arg-722) (lambda (arg-725) (PreludeC-45EqOrd-u--C-47C-61_Eq_Bits8 arg-722 arg-725)))) u--rootHash OchranceC-45FilesystemC-45Merkle-emptyHash))) (cond ((equal? sc0 1) (box "Root hash should not be empty")) (else '()))))))))) -(define IntegrationTests-test_LinearVerifyAndRepair (let ((u--fs (vector 2 (lambda (u--idx) (box (cons 2 (string-append "wrong_" (PreludeC-45Show-u--show_Show_Nat u--idx))))) (vector "0.1.0" "test-filesystem" '())))) (let ((u--manifest (vector (vector "0.1.0" "test-filesystem" '()) (cons (cons "block_0" (cons 2 "correct_0")) (cons (cons "block_1" (cons 2 "correct_1")) '())) '() '()))) (lambda (eta-0) (IntegrationTests-case--test_LinearVerifyAndRepair-5882 u--fs u--manifest (OchranceC-45A2MLC-45Validator-validateManifest u--manifest) eta-0))))) -(define IntegrationTests-test_InvalidBlockIndex (let ((u--fs (IntegrationTests-createTestFS 2))) (let ((u--invalidHash (cons 2 "hash"))) (lambda (world-0) (let ((act-1 ((OchranceC-45FilesystemC-45Repair-repairBlock csegen-13 u--fs 999 u--invalidHash) world-0))) (case (vector-ref act-1 0) ((0) (let ((e-2 (vector-ref act-1 1))) (case (vector-ref e-2 0) ((0) (let ((e-6 (vector-ref e-2 1))) (case (vector-ref e-6 0) ((0) '())(else (box (string-append "Wrong error type: " (OchranceC-45FrameworkC-45Error-u--show_Show_OchranceError e-2)))))))(else (box (string-append "Wrong error type: " (OchranceC-45FrameworkC-45Error-u--show_Show_OchranceError e-2))))))) (else (box "Should reject out-of-range index")))))))) -(define IntegrationTests-test_GenerateManifest (let ((u--fs (IntegrationTests-createTestFS 3))) (lambda (world-0) (let ((act-1 ((OchranceC-45FilesystemC-45Verify-generateManifest csegen-13 u--fs) world-0))) (case (vector-ref act-1 0) ((0) (let ((e-2 (vector-ref act-1 1))) (box (OchranceC-45FrameworkC-45Error-u--show_Show_OchranceError e-2)))) (else (let ((e-5 (vector-ref act-1 1))) (let ((sc1 (or (and (= (PreludeC-45TypesC-45List-lengthTR (let ((e-1 (vector-ref e-5 1))) e-1)) 3) 1) 0))) (cond ((equal? sc1 1) '()) (else (box "Expected 3 refs"))))))))))) -(define IntegrationTests-test_DetectHashMismatch (let ((u--fs (IntegrationTests-createTestFS 2))) (let ((u--wrongHash (cons 2 "wrong_hash"))) (let ((u--wrongRef (cons "block_0" u--wrongHash))) (let ((u--manifest (vector (vector "0.1.0" "test-filesystem" '()) (cons u--wrongRef '()) '() '()))) (lambda (eta-0) (IntegrationTests-case--test_DetectHashMismatch-5426 u--fs u--wrongHash u--wrongRef u--manifest (OchranceC-45A2MLC-45Validator-validateManifest u--manifest) eta-0))))))) -(define IntegrationTests-testCase (lambda (arg-0 arg-1 ext-0) (let ((act-1 (PreludeC-45IO-prim__putStr (string-append arg-0 " ... ") ext-0))) (let ((act-2 (arg-1 ext-0))) (PreludeC-45IO-prim__putStr (string-append (IntegrationTests-u--show_Show_TestResult act-2) "\xa;") ext-0))))) -(define IntegrationTests-main (lambda (ext-0) (let ((act-1 (PreludeC-45IO-prim__putStr "=========================================\xa;" ext-0))) (let ((act-2 (PreludeC-45IO-prim__putStr "Ochr\xe1;nce Integration Test Suite\xa;" ext-0))) (let ((act-3 (PreludeC-45IO-prim__putStr "=========================================\xa;" ext-0))) (let ((act-4 (PreludeC-45IO-prim__putStr "\xa;--- Manifest Generation (10 tests) ---\xa;" ext-0))) (let ((act-5 (IntegrationTests-testCase "01. Generate manifest from filesystem" IntegrationTests-test_GenerateManifest ext-0))) (let ((act-6 (IntegrationTests-testCase "02. Verify valid manifest" IntegrationTests-test_VerifyValidManifest ext-0))) (let ((act-7 (IntegrationTests-testCase "03. Detect hash mismatch" IntegrationTests-test_DetectHashMismatch ext-0))) (let ((act-8 (IntegrationTests-testCase "04. Generate empty manifest" (lambda (eta-0) '()) ext-0))) (let ((act-9 (IntegrationTests-testCase "05. Generate large manifest (1000 blocks)" (lambda (eta-0) '()) ext-0))) (let ((act-10 (IntegrationTests-testCase "06. Generate with metadata" (lambda (eta-0) '()) ext-0))) (let ((act-11 (IntegrationTests-testCase "07. Generate with timestamp" (lambda (eta-0) '()) ext-0))) (let ((act-12 (IntegrationTests-testCase "08. Generate multiple subsystems" (lambda (eta-0) '()) ext-0))) (let ((act-13 (IntegrationTests-testCase "09. Concurrent generation" (lambda (eta-0) '()) ext-0))) (let ((act-14 (IntegrationTests-testCase "10. Generation error handling" (lambda (eta-0) '()) ext-0))) (let ((act-15 (PreludeC-45IO-prim__putStr "\xa;--- Verification (10 tests) ---\xa;" ext-0))) (let ((act-16 (IntegrationTests-testCase "11. Verify lax mode" (lambda (eta-0) '()) ext-0))) (let ((act-17 (IntegrationTests-testCase "12. Verify checked mode" (lambda (eta-0) '()) ext-0))) (let ((act-18 (IntegrationTests-testCase "13. Verify attested mode" (lambda (eta-0) '()) ext-0))) (let ((act-19 (IntegrationTests-testCase "14. Reject missing refs" (lambda (eta-0) '()) ext-0))) (let ((act-20 (IntegrationTests-testCase "15. Reject malformed hashes" (lambda (eta-0) '()) ext-0))) (let ((act-21 (IntegrationTests-testCase "16. Verify subsystem match" (lambda (eta-0) '()) ext-0))) (let ((act-22 (IntegrationTests-testCase "17. Verify with optional timestamp" (lambda (eta-0) '()) ext-0))) (let ((act-23 (IntegrationTests-testCase "18. Verify version compatibility" (lambda (eta-0) '()) ext-0))) (let ((act-24 (IntegrationTests-testCase "19. Verify incremental updates" (lambda (eta-0) '()) ext-0))) (let ((act-25 (IntegrationTests-testCase "20. Verify concurrent access" (lambda (eta-0) '()) ext-0))) (let ((act-26 (PreludeC-45IO-prim__putStr "\xa;--- Repair Operations (10 tests) ---\xa;" ext-0))) (let ((act-27 (IntegrationTests-testCase "21. Repair single block" IntegrationTests-test_RepairSingleBlock ext-0))) (let ((act-28 (IntegrationTests-testCase "22. Repair from snapshot" IntegrationTests-test_RepairFromSnapshot ext-0))) (let ((act-29 (IntegrationTests-testCase "23. Linear verify and repair" IntegrationTests-test_LinearVerifyAndRepair ext-0))) (let ((act-30 (IntegrationTests-testCase "24. Repair multiple blocks" (lambda (eta-0) '()) ext-0))) (let ((act-31 (IntegrationTests-testCase "25. Repair with rollback" (lambda (eta-0) '()) ext-0))) (let ((act-32 (IntegrationTests-testCase "26. Repair validation failure" (lambda (eta-0) '()) ext-0))) (let ((act-33 (IntegrationTests-testCase "27. Repair with linear types" (lambda (eta-0) '()) ext-0))) (let ((act-34 (IntegrationTests-testCase "28. Batch repair operations" (lambda (eta-0) '()) ext-0))) (let ((act-35 (IntegrationTests-testCase "29. Repair idempotency" (lambda (eta-0) '()) ext-0))) (let ((act-36 (IntegrationTests-testCase "30. Repair error recovery" (lambda (eta-0) '()) ext-0))) (let ((act-37 (PreludeC-45IO-prim__putStr "\xa;--- Policy Validation (10 tests) ---\xa;" ext-0))) (let ((act-38 (IntegrationTests-testCase "31. Policy require signature" IntegrationTests-test_PolicyRequireSig ext-0))) (let ((act-39 (IntegrationTests-testCase "32. Policy max age check" (lambda (eta-0) '()) ext-0))) (let ((act-40 (IntegrationTests-testCase "33. Policy mode enforcement" (lambda (eta-0) '()) ext-0))) (let ((act-41 (IntegrationTests-testCase "34. Policy version constraints" (lambda (eta-0) '()) ext-0))) (let ((act-42 (IntegrationTests-testCase "35. Policy subsystem restrictions" (lambda (eta-0) '()) ext-0))) (let ((act-43 (IntegrationTests-testCase "36. Policy inheritance" (lambda (eta-0) '()) ext-0))) (let ((act-44 (IntegrationTests-testCase "37. Policy conflict resolution" (lambda (eta-0) '()) ext-0))) (let ((act-45 (IntegrationTests-testCase "38. Policy override" (lambda (eta-0) '()) ext-0))) (let ((act-46 (IntegrationTests-testCase "39. Policy audit trail" (lambda (eta-0) '()) ext-0))) (let ((act-47 (IntegrationTests-testCase "40. Policy compliance reporting" (lambda (eta-0) '()) ext-0))) (let ((act-48 (PreludeC-45IO-prim__putStr "\xa;--- Serialization (5 tests) ---\xa;" ext-0))) (let ((act-49 (IntegrationTests-testCase "41. Roundtrip serialization" IntegrationTests-test_RoundtripSerialization ext-0))) (let ((act-50 (IntegrationTests-testCase "42. Serialize with attestation" (lambda (eta-0) '()) ext-0))) (let ((act-51 (IntegrationTests-testCase "43. Serialize with policy" (lambda (eta-0) '()) ext-0))) (let ((act-52 (IntegrationTests-testCase "44. Serialize whitespace handling" (lambda (eta-0) '()) ext-0))) (let ((act-53 (IntegrationTests-testCase "45. Serialize deterministic output" (lambda (eta-0) '()) ext-0))) (let ((act-54 (PreludeC-45IO-prim__putStr "\xa;--- Merkle Trees (5 tests) ---\xa;" ext-0))) (let ((act-55 (IntegrationTests-testCase "46. Merkle tree verification" IntegrationTests-test_MerkleTreeVerification ext-0))) (let ((act-56 (IntegrationTests-testCase "47. Merkle proof generation" (lambda (eta-0) '()) ext-0))) (let ((act-57 (IntegrationTests-testCase "48. Merkle proof verification" (lambda (eta-0) '()) ext-0))) (let ((act-58 (IntegrationTests-testCase "49. Merkle tree balancing" (lambda (eta-0) '()) ext-0))) (let ((act-59 (IntegrationTests-testCase "50. Merkle tree depth limits" (lambda (eta-0) '()) ext-0))) (let ((act-60 (PreludeC-45IO-prim__putStr "\xa;--- Error Handling (5 tests) ---\xa;" ext-0))) (let ((act-61 (IntegrationTests-testCase "51. Invalid block index" IntegrationTests-test_InvalidBlockIndex ext-0))) (let ((act-62 (IntegrationTests-testCase "52. Missing subsystem" (lambda (eta-0) '()) ext-0))) (let ((act-63 (IntegrationTests-testCase "53. Corrupt manifest" (lambda (eta-0) '()) ext-0))) (let ((act-64 (IntegrationTests-testCase "54. IO failure handling" (lambda (eta-0) '()) ext-0))) (let ((act-65 (IntegrationTests-testCase "55. FFI error propagation" (lambda (eta-0) '()) ext-0))) (let ((act-66 (PreludeC-45IO-prim__putStr "\xa;=========================================\xa;" ext-0))) (let ((act-67 (PreludeC-45IO-prim__putStr "Integration Tests Complete!\xa;" ext-0))) (PreludeC-45IO-prim__putStr "=========================================\xa;" ext-0)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) -(define PreludeC-45EqOrd-compareInteger (lambda (ext-0 ext-1) (PreludeC-45EqOrd-u--compare_Ord_Integer ext-0 ext-1))) -(define PrimIO-unsafeCreateWorld (lambda (arg-1) (arg-1 #f))) -(define PrimIO-unsafePerformIO (lambda (arg-1) (PrimIO-unsafeCreateWorld (lambda (u--w) (arg-1 u--w))))) -(collect-request-handler - (let* ([gc-counter 1] - [log-radix 2] - [radix-mask (sub1 (bitwise-arithmetic-shift 1 log-radix))] - [major-gc-factor 2] - [trigger-major-gc-allocated (* major-gc-factor (bytes-allocated))]) - (lambda () - (cond - [(>= (bytes-allocated) trigger-major-gc-allocated) - ;; Force a major collection if memory use has doubled - (collect (collect-maximum-generation)) - (blodwen-run-finalisers) - (set! trigger-major-gc-allocated (* major-gc-factor (bytes-allocated)))] - [else - ;; Imitate the built-in rule, but without ever going to a major collection - (let ([this-counter gc-counter]) - (if (> (add1 this-counter) - (bitwise-arithmetic-shift-left 1 (* log-radix (sub1 (collect-maximum-generation))))) - (set! gc-counter 1) - (set! gc-counter (add1 this-counter))) - (collect - ;; Find the minor generation implied by the counter - (let loop ([c this-counter] [gen 0]) - (cond - [(zero? (bitwise-and c radix-mask)) - (loop (bitwise-arithmetic-shift-right c log-radix) - (add1 gen))] - [else - gen]))))])))) -(PrimIO-unsafePerformIO (lambda (eta-0) (IntegrationTests-main eta-0))) - (collect-request-handler (lambda () (collect (collect-maximum-generation)) (blodwen-run-finalisers))) - (collect-rendezvous) - - ) \ No newline at end of file diff --git a/tests/integration/build/ttc/2025081600/IntegrationTests.ttc b/tests/integration/build/ttc/2025081600/IntegrationTests.ttc deleted file mode 100644 index ba4e3cec7c65bbb8920bd49372e87e3b814d9b5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340255 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 diff --git a/tests/integration/build/ttc/2025081600/IntegrationTests.ttm b/tests/integration/build/ttc/2025081600/IntegrationTests.ttm deleted file mode 100644 index 96065d96d9dc25c7656863938f504748d8d341d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120846 zcmeHwX>^>|c^*fSt87i0G>eli$6eyKS=w4o)7DMWShbZXA!SCC-E1c+3=SzAkpMFQ zV<~?|!@*z{EQ5Wp10;5U*tmgMxX4l{Qjj1D^m3%ACPmp1L;=iF*zwN1t z`wtfFE3-s`pD!*d6ByKwIv+YsH0L?w_4z#hB*UTd&-#2NzQ_ZA`(v9{&&7=@Hl#D1YS11K!e#oj&ir zgS)++&}WOv9`pJFW|le9Nvh}rMf<#^PnMQ>_oox0;(=Ye$_mQ7QWE^26U~qU3VQ;3 zN}0O3vHlQQfoeUmqT)X(*jKdsHw#K1TTdVS^nE+Fr=uIRC8W6iu)`WqK;aK#k|J_l zjOK72jZcuZH4ho}{Z5kl6;P9q@}8zLtI|LEU@8Oe-&a!j_=Cl}y-&DQ?2Hz}6SW(T zhm#dR_=NH}F)1gi@`QaQC1t7da+jcU*He$G3m;9jLx()uJmvem1$#aLaGwQ&Wj?Q1 z?Ef~UwJoH8Vo*n8bttsM>wA2kSFBReRM;aHz2`2!)sk(j%1`~i5MlLQeiq32?0rni z_v5p-`B|W7Drtr|gzI!`xja$?zWI162J!<~6?2rGSq7om!7PNGPC=RN4Dr z3PBw|+x$Tk`R_P+?N>l;Le22BC0m$ut@?u3SG1?7FgfC2Da{-|7&kLFo#-SKP>(0F zzo58ikJUPT!nI!t?{LI~_>*mtXeP~TW$c}u^oIV<7qP4jLczF<2+-ZN?5 zEyQ<)@de6He8F~10nOzlzHdA6ty4g4dEvd`@XjlsbL)ndp`8W3Qm=1AQHUmg)s9y| zRZG%_t&_gx#I#WXwRu8iC69ZHtx=#ea1Vs;FDNZ4OpjE9+lxxeoHD)L`$UEz<&W3| zQbk#IK3A=P8s5*(z3F`JlmePrmt^Hq?8DZN+DrgX6&d4OWc&*!jx`FX#S^s(N0BvL z{!{O6kN^As;SWej`7K8;s(>1d^m?c_oG$ZQXj8t)_yE=Ch4&4IcUl3>u21nTOaZ|d zA$R_!fY+UPS16!HPc{0Q)JXV!oC;n?q2KrTa{hf59??=JHd9oXem{Jal+zUD;dxB@!0t{O$YU{B8r%1So&N;OV^ z<^0jMilB^;e0@FI68Tr0m^Ue)PEQyWDfh9}qC*=}K-M&5>$D5ZcA!R~_4YI-N4z^r z_7xRA`LOqo4;J~nyNdR*%gw`B_gN<*&nloxp7KJgoLL^IWZ%7U7I)~O0?`NeWrwI% z0X5}D^t40Nu7G-SBRcO8)hM7=Pt4~%P*CLCX*mt{Fc}Y(C;u(^2V)Q4A#Zyl52f63 z;)LJLhjxyU0c!A+7kj_-z^?UWGiTx^1>&B+dn@}GnITWmPH^^NcX)GmTED}Mxw#9` z8D)MDd3Dywt7-*Q_y3?3XB;bL6wv&-rhF?-aWGbqd&Bs43!|-hC*CmyRQo=8a2*f( z{|iNO&PkMz0;>G~iGrjUVxpY%R3+CB;DuS=wr&{hRwail5EZ&#()JS#=3&S;>*Qrr z0X640+B41vrWMfoxzLuzS)h!NJdcC8(@xA23aC3DqpcCv9-w?oT_(v2l$W95QHM6F zfT}!)igsHIDc16b+wdcrUUZQPGuTd%*Ya|tcqPUmgV0LBQp*S8#78IZI(@vcxnAIg>VYA2c@1(c75sFtiiRzp-;TyUWD zu@X$6E1yki(1}Ww0@_mB2a-n8^>`}1PaNN3ACkHKIPEG6i|Lz z==Y-U<)=knJGqv(7I-bPmbVu7dlldNFt)JohThFXi+U?`t1b_P^>*O)hq0x+-En&; zAJ!#q=V5ozJN|cEb`zyqyj?}bd-r*hquV?-c&qcP>z7-%F#cGrTFsjS@tfvqLSEB;qp#=)QQmRX}nJFRyV zmF_PnE420sYj=;E?*3XjvvfXRQ{JW8rS+R{w$R1AT=R0<->X*ia`bZ3-!FsCUS7y+ zw{Usx@|mr73oli_)Rxz1EzT{TT~|Z4(vmM$Ev_FqZH4T`_7{8e;4gk5`a)eEXcndy z)_0#Y7W$LM0{VjlYAOMy!t(mh0%`Yz>R&(H<`g@iBw@FbE> zqLj0J-O^Sbd&jf!vxz)ZjWf|R`KV#@J@dWmTB0q~iuuTV-fGxf#oPzs9NDm*>9%`s zCNz_Wnl&4k{U96~26oMM%yw!hObBHVa< zygnDTrtvOMr1;?eq$>sI_p)608xM^~@Xf8PLyiTc@UO0E{}E}+?}&D(~VmLfq^^fQj#h22<;{Z;s$F6 zo73Asa^o1N9Ee*-oh;+?Sg!k{{negev31;5w=uo1y3g8FmFLg)Mf$4TKili?4NGMp zY{%q(6qH)=b@KnO|1tC5+FI}Y_)hxA+$Nk_txXR(_jLCh@f_M;YVH1%xBB-~^;jcm zH-SJ;NU;5$ptVf+B~OF>-$!@Z|FLTVJdf5HpNtL{Me`~A^C(2g|@NT07d zUv0(NaiO?JIW8oJ`lu(B@#$0RVym(BQ|mZQn?6_DFU04AI9H2Pcj@zYBT`I0sPlLK zJCy;}?E>F$kV|yl|2^^8q3u^deNyVY|9iEu;U>NHW>|{I2ekDD3)bnS>j5b?AHdSJ zwT9$UbKcK2B+F0fV)Xm!r?h5)gHn2b5VJsQyzEj1-pBFsuz#dOGWzdk2zSKaD>h6Y z{=r0-zvqaMj`xJ^L4bABNTDYIBn}C7V@R;R@AU+2-K`E8bdh^s$0@px9<#?5A1m5_ zV4rutx7fNN#X8{hv4XOXZM^K}Q=h!=Q=j<7U;N}Red?3H>}h)R(FZM!%%pRMe;ZTH z{zev~ck8yDyPOU&b6nF=-cciD=_WIX+_bvNyK?x}2dS0Auv199?uzc1@UvCS3rb6c zfFAP^w!{+dkw=^l6cp`~v z_F7AMcUKn{88~}*)ASr)pc@PfM%TwHoQl_W>1_UBHh7X{_W3xQc{|nIA&HsCXP=`XIrZ2vlYHP*)Z9b zksuWhm6SbZHNS%VRQXiB#=PnskHg{onS!zcNqKDQgvrOuyxhVErxVlGSr7LHce+iU z8o1x=b=rU0zyU8rZ6-D&ZW!6DuFh7@wp&FdwP+@~aN~P7xc`N(V--ROx^pQ=2%Znl zTb;s&jybs9yGN=)masI>y*K4~*f{M{I~@cQZF zgFdgM(KIif0SamcEc5O2-PzVQF7XN9Jrg_=$w<8Nhl}<;CZ*n);CX4bmP6{TU%eC} zb~bXhX4|3U{Wlx3Hnh)Mythnh>DI5TN~DRi9ovFjC)Ux_XnH-b z=zPO@alKquJdM}ag;-u_yI?sg+?&b^ow5hVy{UZ8|D0%z*6$<4?qcksm=l||mX{hX z^=`ej#4ZRSV$#+WL2MzokbSFZ3C{~0_i7VNb?F;U?!yrn7vc+s4d+7Bf>Fb{FtIRY zHn3SZws0z=erks6+^;0q_CoLlgQoU{;FWHHB)24AzZ*-SeKGc8+qOg6ePi+DiSRqt z?{1mh1LS&$G&J^jry^o;*Z%&j*kl4b=0iB{BgUS zz`xkAXpP48Eq7+ixY)YbDG+&dE#u;UY>PtC_}095R$I5>r)EK++iw6W$qLfgqA9otaiX%7YUJX6c_aLWHLBTo zZ)xCDpAsUr{$PwGQ2T~8G1*9V=poT(|IP3>YfNJLt?;*u*r>#EU2Y4yaaT@wtJU00`9=dvA1^5nW;+s*Jz zgNc$QEw&L`FXA`rZ#J71w3{tAEtgs5aZTN5-SFlBf%=`6cdW~H-JNvrw99+T+((Yz z_J7;tRs$h!@5bKEY2bLP@s@7jr5`xnYQJT-D#=SY*L##*29CEYZ(Bo*P-=UfxOC!N zwwgR`AeeaDxj;e+%DAFJ5W4dU5+QgkxR(9!#1ftrIPOh7YLl^rP+ibB?!0A1;9HBY z8IDfYn%0a)Cu?JC6J{;X+T@zGjJR$OwI{jNN{T;jqY=X13%+MCI(aXsLe2nB92e%0 z@ORv~BSeoE{A6DB<0c)aUhB3XHVdR`id5!55=pxEG^^Pv;FugHG8)xWE3Gd!-@U>J zC9@1K>&q}dR8M5snp3ZZ$f$K!xZWvDBn&GwTMeiZb}wXGPbb8(il20@qms%LuEff? zVarXpj`wF-Ek{->cvR3{y(N9G+$oxM3dma6GjaV;ubD`^%3im5j#*VlWEumsCR9vmB@;c`;dc@9Yo?LbN3;Ls&X>aPqbxYaA{$T*B6SE zn>n`>t|_b~a^Iv?ncNQLaz$aCV{1eKS?llect*R`h^lcSonuVzO;ZhQ;eoRDFi|&3 zq_aZnnWJVKQIB~_AnJ!nGN>cb`W00pQvxXalz>K*EaoWzjy7`SkP;v{Op+W@qKPR1 zlzmD-BdUPRQv#Z8U_z^8}7U?Q);4d zap;DdJ>5jbJ4Pi1+(s+hODl=virgTt$jyEVLzT3$IHl3`Uh2`GbaE%N%Ov;4yL;V? zh*QgO&O^N>BBMDFwZ@1H=S0+-B+7b@M2(GiC`)OD>zjkT$l0n8sg8@AbG7S$)Cuw# z=Ci^_?#(I35wpxIriD-Ne(TJeuHB^L)XT@@s*{ZiklEx4T44n=Eks`QO{OMScQ!OC z;8L5wU(YX@&aS}FLI$(h6|OfAD6!j~heAt6`FJcPFUVzfSy5xEQg%3#7 z64^&el5Fg?bjLub(oDq3-$viFey)bcEILVIZA_IXeEJy*NXAJrY34em-W1WvY+b3; z*!UiYR2;{gLJ?6wmg`+Kck@jWq?jTy+BBi?+DR>uuKjc0>Y=7+70?!}0>u<*&8#}+ zL?*0&gsF+VHG~>bBJ)WazS>5P942WXIZToqCTYi+5-w$UG&W*+z~WQUWB0 zNs>cKoM1`-2`QnQuAZbaklAqb6!n43^znjH1>aJ#YS)%_1d&L5o=IxA@K{ukk3|{G zXET+>l_Hm(U47SO5Dxl{4_Ud{5vLudQ(Anji40=5u3PM;)&!B^CM4<|Bg%SH5;Zoy zC?=)VtW$1-eBR7tN}JaHGl%Db@R56S&2-S~-(C~G#@FBCM1Ag_r^bEK!&h$98=jbR z6V*R=Cu!jkMd3L`N&F039Ux(1s5zg=#~{N*qCa9#Se_JL3R6G(Q%-aQmlWc+@eN8h zs~Q+F!wo>xYb7$;5JashqT_~RP1t*a4AuZAyJdT7Y;d4~)p|z#q7@ z1F$Xgy=Wmme4IM-nQAxbX6m(My9ob`ljKbbsMT;i9eQnKuzV20YPRMw8ijmmA~KBu z7~07oojcJU7o*lZ(OJVr4>34LhG(*F^q`yhw7HOsY_2MaTHUHh^+P48O7f7lhM)mV zGm1l*_rHc9BHc8t*RUvpp`Q$*YfC$N#l?x~D->O>d)WBgy_8!ZOz=*|)=m9$&}pNN zc!}L6{<#;NdhJ(0TQp_SA*@wEIl5C`a)=@dXbbKXP)w1`%$;)CiA-1l2~%f{JB1q5 zt=4$E^!p&d(Mk^U%V((CLu7s#4OPd9CbB*zq+Vt+0+~4hmRKf$G6!>7Pc2kx6p*e! zg{|>W$-bh(C#AXyN4^IbCl6) zaY>k(6!#a3O7rD z9;*=ODG?_!bynePO=PfoS7GF-x!;FcqeNqd<37Y-oD9dZ9``}_ICW1Y9|;jmP+wegDm~PZE^^xBwn%lA1_9;8plc3oOabM#C-!xRr$GVb;i?^S^${f>Ad+(C zx)Xs41(fkhl%)2CqZU*^1`Q@u(#oQX->s0TpZ=&5gUl9+QHl`hn@z+ePFd4t6AVpc zFl#oUKS6y{A3qq5ks*5@KXj+5n|i%W%JgqC(}7HyP3Q#GUpYMDM#Y?S9sE%RRPTxG zFDNeBW8Jv(3CW&sIq_&#K-O#_y36Y;D%e-_r(WNNjR}!bgt(FQkj#1y)AjRz;e0-( zfb0p+cJC7zUp}UXAlq2Jp3N1=QdPm6bg1EtW1kRBt(^)eu=5olW`O`QxaCPfr_#NCy)PvK->zdU z+R}a4eUhy!j;*x{s5Px2cDj_K#=vIxn^vM5)m(|3W+EEj7OcGUB4ugU+(#;`+t^C2 zmmS;;n;@ligGP1-F=62`s?Md;#5EP?sBtlGX>yUAm-Ce-FO%|0rb8|8@sCUCxyph9 zv{^x+oC4Z}yg$rc2P!Ya@f%A~g<4lRXgd|q=8iN-_E0AmN7}nI2q-TG z{jEb=t$^yRVO=Ugq^mYO)@`K)d!%L<`t@Y8@A!9Nig@=QD0@@YOwFG1eOB^{%_F1}lV2D)8LnXja} z+^qFradP!FdE?ZB#k*x+85mm>kkx)|vIGIicIxy?R&26&zWkI!#B-(=;`a@Yi?8Kx}0a+uyE!;9jngmg+{bIb3eH7>- z8urABQe{flJN$?f-wFj(g(tbCPy8cCJg9&SmP??LRz4|w!@0C9qb{iL|7oWw7FJ3? z9c8@YRsqo8Q29H$8!D+^M`Uf5*E7{S@x&Z`XMy-U3dxQVO&Yd^FmZ|uQtIiq2K*?q z4#*(upb}I-XY!SGAdHY&zsLpIIAu*2xxmmw2D3#j=ucAL@U1TD9VeR3dT#)}eww;- zTJQLeF~5OK7P+7kR6yd=X6l|hv$_hx8d95X4gfSF}bTrAMeH2KF*S})CfXw3s z&3*+WH4`4)rQK4r{xzcoWF9SOjwqmU!`>Ep6J$6pL{{J1{w%EkGPeSnrxlR(T8Gh{ zhR{1h25D7JZ^g%H1(3NF&>U7kV}@2hZ=4LrjPl~&&r>T zTLH}x1!UUWKyQK!X1&dQv;xT73TO^1Ak&^7dgEj;>-j%PD}c^_kE+ zMFwfZsD2doOSA&W+zMz;C?M0GA9^RqVAk{hCt3kyZUr>Q6p-O_Fw{FnbjqlW`ej-H zWNrmCM-`BDq|T^BL2r@_CycE4FSG*4r04&y)CMw718DXsAhAwp-cb;YRi9$4fXrhB z&3>}EOlLDMgOsB6-xw_*^JqbHSOGmFe9Gf;tBfG7euXguGLIQFhskEz#Dig+3}#LI zuhI%2b1R@ZsDMm|KF~W#2D72huh9x1b1R^EQ~{YzD4;h*2D1spf2S2d=2k#+Q~{Yb zj?kMVgIVMF>$C#M+zM!pC?L}T9P}p0U^amJG_3$Kw*s2|3TW7{qk`TD8ODXCNI&$s zpH={wTLH}>1!U?jfZiAx%-jW^p%p+T-R)4M&>U7kqW?JM)ZTcCTF5c=03!ut z9w}%JlFhW)1;bG?m^HhEGSylf{S^;Ek1vJMLkm<-8ddJ9M zHnM(@Rsfk>0nJGTWZipjG_r=?Nixg`#b4iG{T8hNGPeSn{R+sm*@fN+8O)m9-=-Bn z=2k#+OaYmeDCiv{gIS5%PAh=St$^kc1!U@>gx(+-%siAkXa$hD70~QgK&B-MdLv{o zD^U;83LtYUpgFF9tXma~YB%(blR4M&>T`g;#AP>@UhUI zsfQUgAoHj}bBt`J6&?)7$Y56CchL$Ub1R@Zq<~CEi_jY*gV|{D5n2IcZUrRR`2)R4GMG7k{)kopnN;{ksSRYF2GHzN zKw^`n*?B3n4eEa}RzT*lf@UAttaE@yV=pialVMDVtbXiOKr4XEt$=2)0va^50(wJa zIBI0Y7ik5MxfReHP(Y?@+|U~(gV`E)A*}#1w*s0&3dpp@g5DSz%vvljtpGBq>wBmT zWTL&7+CV1S|K}d;R*r35N7G#%Z8zG{+>wy=S~@yxJ72Ia&?Ru=_OHy!o zS5Ar7^+D^!yBfuG=?-*FMq{a*rn& zOCj`#|45_QX7u`d!yb>v?L0|uq&F(Yzc6^obmn9{%WhN zB`uNkYWizUi*J8je~VZb`dj*2MOy{}17Rx?A)l_j8i)+UWX;L}t43QF7Fg*kM1L?a z7~Pmi;Z!1Rmk!en#s(|J?+jKB#%-eP-Uu439c*^BXRvut?)ZlN!-vJnJ>nm!v?_OH zq0d`T=CvF52X+Ytk5rAwgO-t+kvgkJY*mOKJ9ooO2`oU~q# z(%dF6(K9iiSJPgaFflkWB&O=b(8Pq;tW8W#9J3PCsEeOCJ~5qrdopo)Vosl-6LS;u za*XFE&WHh%HIs6dO*Txn30day9>iqZWV`r{so<1c4W`Pc>b3c@`IEa-4O4AmHcYio z9hC#drcRg{HFaX@q-fM}|8aRDcfx;SP;9qP`cKLl)Bb6z8fJfTce-g>9tcb)rdu~3 z5ly#E_t{dJFAuoivvS&h+HNfby{yk1pKdxW$NY5Sv|Qt70yA>inF-C<0|oiYk(tPh zJjR)c%{0q4Y}TF5BxdBH%xqxReZ(>wnUzN@vz4>$$<`uyDcO_aZCvra-eRxM>O*mn zhmiiW9kX`REGNZWU{3C8<|^jw4opANnya3Ri$#AvI3E^jk#%v{9%%$IADORAPPM!~ zpL$T=RnJ$=%bnPKe7?bMAx+%+^NsUOa^#!lTdl|orC8@;m~Wex+qL=j`EEO2*^LC} zd**xXmfK1N;p_9g^YScbzHh!?G~`V1Ohm{9?Zwh(qGys5kT5QLb<2x0^=IT!-ZK zZ#Zv{-VCbD`Ihs;VtSn)K0hLs<}drdEO(C2_@5aTyVGa=&&nDX{1*~dcWQFy#D$g% za`$tg?SehY*~GPRq4Pr06Jgq;KIebVim8;aCXs)x&$T_*Atv_4z(u)Jy%@Tv z?^G{FF3O$i#n{ChJJpMci*l!WDR9Z2%vYnW(z-7%)n1avua_Dw_1eu&Xp5cerM^o8 zR!rp1_4&Z_a_9Pd#q*6>#sB%H=jHZvA-G`D$u2||(w%IlzLQ<3T97;0h4_MTC%e$N zAa}A0O$&yd>_Xdu+{rGqFN}*#$->0KR5F7N+^Gx47Eal%a&|rT!t}zdm5G`jdtr8A zPOM!Ea|`k$?1kV9Mm_cm(HA!K*e)6SLj4PJkNrZ^3vvm2G4!HbpI?l<*k-3}DT6 zvoHILbBky7Wqt#DdUAvf2id?85m**~@vA!;MESJw- zUa$h!TQ88j9DP}K^1fX2vXy?D+V*n$%W|SERW8Ma{L;CDo3 zD+@K<&(is&r{x$wz4T=<;7a9{S|LldRq#sP6}h>*(r`uY_OCQwu{#cqm$pDDc3@yb9h zzPDHXuWE+a23OdU<5%7d>z5Bzz%n4+%*UXy1KuZ3RI&mdllye5x0UW>h^ zF>f=s+-r%~_0^c|;M*V8wsvPyJp{q4keT#g_S5mxJvyyN%epTKMaJBBLJx4aZ z-1%zD)h@l7c4gvf_tjCcRk{|qCL4Dxbj@De4JVCz*ehM|f34=4?C-l)d(GOqqp?l< zR`|8%Yu$1jd#(*{md>vSUYG57J@k6g4onP%hU4{`*JV3iuYKKK(vb5gy5n(-G6c@+ z;p-8xQN13yZu@Lx&drxFt|zW{iHUT*`}(9DFm?U3^}&r}W0!TA>!+{Jh;e@-{6=y< z61u;jw5YI@dk5tA?!rwB~cr);( zJVSr8;!V5B+1e!M&BUACcAB`9#y5N3JR+w4a&XyXg1;PDPEYWE?Z>qX-pf_X@&tc5 zzHB_fUv6BMd-~<3Wy1;na@(@p$1Jxm%M<+NiDlyn{_?TqQ`wKOmZz6pCiu&<%kl(& zd2U&r;J+1o%V>iCR`e}vb4bP{$0c{)O1ve{I^Sx0OZN5M2;H!p2%Am>Zq(n9-3K?C zZrCZB<0R+C^o<$o>+&S$#_WyftiVktId6yFmWK^*$KJL#*K9U{dpq&AoMWEX*5Gz9~!?MQ6%27FB zY{jnDMw5h77U#(hA` z)$^2iCN7BxPZymWcC035_2EJP_X3g!uZ950_J6~=`Zp%A%Zdcy6 zb73nFC*4lmZnZuxkBDx!-ImV|-0rwNWRG+<$&&8{z9-LizE|-*_su@vtNxxmX_kc3R(GuAN?!r}t|!YqMgT^0lzm zaS!!6iR5umI+#cv7pX%`Yanqp@LLDPLnKtMBC>p9*6E+eteKd)=O-NU%wC$}bwqOC zse%qilt|w4&)_N|+dY?ziBuiHTSxI^Gn>`+H>xxe^<>c-sdC4bDk9l=&fq#Cdnji# z+@@wTkv#~>%nI$fMipXofi%%Ya2-|5qYI8^a>ygkbTCo7#xBk5fqET8bK-z09ZV$q zxm4ImDL;`scTf=u0?DIg6{R4MhOv@@KvoOptl(vL^ELDm3P{s_A-I)-S*-9;wu30A z6+cx)LxD6CfYb_LcD92mL3)kt5NxGjyWDwIJJAd%AbC>3;1H318bpx@k!DnYkH#pd zNu|xENz_je$QGaD0qqYA6M4F_5V2FarHLlX)f&oNYdoJIuOPRGTtbpXTv2-wzJ+P72%JlO>D#wZR%aI}NJdw)HL>+Q7 z2&+0MC~q@S^-Kt$h|JhPK_G*LHwB$2kv$Bo*5@8cuH>C8kuWACb%hNU>@n z&ETWWi9%2TnfMZ^6d_9c7R!Ia;m(}lQM!sq_BAp%PGszRq-Gg%VH^&+lg{nJf-pxBKc+$)#IdP6_Lg{3c)%Gnmb3q(M%3gU+!T>7f2Ib1lK7b z^XNjenH(BlE(8-4H1*|zp@R%(g zq#%&ht(ZO+2-P+Pq!|<;xPyXSo9{-UY&X$xF1u6I5N!pryU@(RtEu^5YvUI*=0mW9 zf|@RL*okRC0m%pO)d&TFH2zHlhp6J>`h{?W!kR%01Y;CTZNf}$9}y>Jt`~Z#QOBGx zk;a>Ml!8DS|0jbLkj4}SQ_!A)X>I|dOf`{a`UTor3N{LZA>A!pRB9rU&+esziSF<* zXMIZ-l{<-gb8!U1>ORuQn_bhvL}PMW3dV5?P9}W-20K2eIYo5RUgFH|Bsz6Y5!u_S zH!C1Bl-5jsVAw1L=j2WTf^!tqtPGB^ZUAZO27?vQR?g9oBtayft6^|Ak$ldE!Ba$r z=Wfz^M4HL!1RGKy`35mHNkJe@i;Lh8RW>^{MZp>(O{)U#S_0qK0atnH#xdvpCYtV@*pj>hdx^c2- zat(s56x8Gz1luT>Q?7yLFllniHP8%^Mw4q0JWfGPuAN}60g1V$Tb4LUbs$r3)G0Cm znKGPq7y=4NvkZXX3JTi(tgRi8BvpcFvjdY9>>-j5P^uZnvLKPs>H^dwR8Oxi{K8K< z+?f+JN>>qSRu}MrI0emD7r@a-4$bNU1e+*my1D>{HZo{tk`QdCpnQOn!4pKr2Rf;F zjOdiXxEWEMrnbw0&$JAYW;hJmISOiq!?P@+KxV58(26P`>Ab46Skp1;I87 z$_Gl-oMTgn$f`Fkrzt2_MWm@PV2)F;FFDV0S!-?FS5)jR@TD$!`*iW{l&IiWA!R?& zpcQS+aw}poMB$T`@TMnK)jZP%NHgO{aEvOp$60?Qg<^F?8mIReCkkN&BzomFcWF_n ziYR^l@%LR?MSQH5dh&Tl1~(8HpO2(w3z4Q!BUY^xG(0~^y)Gj8JY_nVNHbMHoTeyv zJXy+3yb0hqL5|Y~ts=B%s6B5LKFxW|v<%T1xdj33847A#&SzOffsD>?Dri*`CGW`# z+Pf~4TOoyFJry-8spp&+Mir2J&nknfi8O5+cxot^yfDi-Q*+3rW1|%QVR|u{lvXA54nIcj=pw&h#P3QQu6OT#-lyZ(F(^|S2peEI0?K)Uk z==JXQ?v}m|s&Q%+)SO*`;5-G-8uzN; zI7g0W40=^)KTGXPt_2?Qmni?d+_pjRc?vGbf`7)w2gsfS9xB&1KGhGEq?(_Hv~3TV z+7ytcP$0O2f|~V32zFD@zNp!(W`U!R9Gd0|g8dX6)>J`VQ3b;Y8UE}p>5;p1Fwq4$ zo1SyB$*+Jk>*E(G2-N+3;-@cB5JK$jq$X4MCR-4xVJ zW=pxy22SCFdlj(|S%K-omfPHRx@cHt%kyNKlL-_=(gyMjbU>qk(JP+jBeg^ zAq1N!Xu3)WhBh*2$`b_JDL5hz79coE!7<~RJ2=M4VZXzf?e02gAE)*ytC7+9!y$c& z(wg%T5S*sqX}Kl-I*TZf*(xElq6$cJm=VF16x4W0Ay`AfdgD1dI2y>I@m)c%k%D&n zm|3ShLERi346S6CmCG6gXDK)*XUQv0miQHrW=8!g1%XE7cIeM32&7^B-xLIrAJ$Xf zpdgU-`hus;egON?hb`CeZtI=-1G}upO{`~p{#4tOK)0QI8rL=iJ1N+m#r}C{^-wGM z9J}dLY3eGC1+t%-5DJN@{h({-Cp7j$u#%**R;Wa}f+zxJlC(@Y@E zKp4RlRLSl&IEptBX-*Qo;Y1~N7JJ*s*9ryTCg%0=laBF(4X6>_X*Ool-Bf& z5S*jn{N18c`kO4GKxU&FXhju}^_2bHo(LXW_=IvRsnBVlwx;kvu$h7_vOV8&>-;rar&vm=ab%M!Th; zR7LglZmBAlb`*NG)YJ5P5Nx2J`EDt2w2(vNjfG$<1x1*(>=S@3ah&=Ij+{XDO&@aFZMQQsq`mq0mTG&7#*^P8_2ONHeiSa190RalxU`&H|s+Ol@en$`9DTN-Yp*8cAcn zcIcSorqE6W&7E#H97`${kjXoURH`LPzl%8I(jeetjnvbmGz1eAG=4XcnjJ)&Bt|C% z4c}Fy-Vq|r#xU5`OF_-q4G5l~pgkxudWVsk(?kZ(S5Rl3$mKbUv<#8_yhS>gNPg}@ zz0D#DWc02h_3MbN%5%rS>OSRGQt{1pYHJG5iWALh1*BP8MsO_!?Jarfah_D4q0>s8 z0jm@Q!+66jwKB85J^4r_Mm3))C@XMd9U$wt%~}aoTTf)Ju%3A>)wt>r)d`X&-@nOj zV;hu@QF-ppw7JjCiaF|B%wyVIB=parfsBFJC%xWbT9q62)&hxe% zTdY=KeV(je$!F?(m9$^CQ)lDrgPOu~lZ6MU+0s4~++I{#wqad2w9i|-w@i9sOF=h5 zWMAUPME-=7tI+A8PXFeK9Q1kjl)AAEkZs6Lh3v`*qB2b7=7~(K`d$b z@(gwC{hFJUG;JdMB{LI9v(|v%CIw`^PZpYOFkIW%)& z2)0wubXzYNddM&%ufsrahJu<|(%(2K+(wW_Jgin0cq?< za3=*du7g`nR09gA^ZP^xprvCFM1zgCJNIjeV54tq)8qGhp58j5u0|%S5jV+ zJP@p=VD8BSu6lB9F?nt?d4M#@gW!+?idv;7SY|a2Qa(Z`Msdxhgb=KvpgqlV&G6tu zCA(ceT1PJX;Z%JI$F~!d?|{6RG4zb1GE#!zQ$B2rK!hIvoak_&1Bb@4#5@*YBr<(pcBi0 z0@Aep2o6!uWoHb8BNWywM?x@0L3_$CB+{mj1%W9+rWSdk^Fy>4NMkXALkh^g5F%ET zDx!F-4A(hQkjqOq1cua$WdQ7DOPUf(WIE0!nYH zEB$C{Y%7%|NLNu$v#Ab(aSEDmssl$OIW+r>AlO7f(@k|?Xd{Eh@d&|o3TiH)hu|ay z?QQ;MYro()PL652OlElzFSJin+g^{;9TkA|9HljToWVWdeT2Te0 z=^qhXNkPqy4hYsz(EO+XI2y>I@rOgOk%Fd21;Efs2F-;M5S*i+ChvaS$r8T;(#%DE zf`UMrvzR|gK_Cs|M=1!TIV$ke6a>=r@;^gCprAEh3hpl`5|5!ls9XVU!dpSXNEU|& zKpLf1rL9$Q|G}btWktoF;OC2r#OE>p3C#eq%n;gMy=BlVS3nxe5L`h)&0PGSI&lgp zps3yO1Rnfc#ZI4h-@)BpPx!#WGV2_#q(sL&6L(Y@f3E9|iL6H0Z_@(3JbI-` z8&g1q5>VV@6Ii5C5osZLKpj?cGZcG6U$i*7L!xXd+)|wd&j&X7vGc@|&&}g7sjD~JZ z0cq+1f=4K5UJt-AK@QV;@Na1}P%cJ8H>Q9z&p0A@f`Z9?V$lbS%e=ll1%=*H4l#lU z4*J9;LU5cQhkcig(2{E_|G%TrK)DzV-IxN>bUg?jqTo^E;th^5a!eT-{c|)LC>Nul z8&g2Ta-Bx-Q3{%SRKPJs4pWcHFVJWp+vx0vve1etAkFEIU*v~?a!Fn2#uQMuoVo}; zLP2|Ts9B2%jzMya8WyR4PosfyF&ert1=K4Wjo<+aju;yaj!|;h_Z*ot9{+(x1La~g zbYlugGvq_?AO%N_jRwb2a!eW;{U2#GP%cJ8H>Q9zIgQ`}3YzCMI7Z1~n$w@4(LlKv z4c(Xm(hLX?JVHV90RcEB$YDAlxQ|8yCo?!G#V%u zqoEs9K$;`h2%e%~@|d5|CI~afo!9*ANoNnrhtyg=KfcH2q>4-g>Fm%Y5GP4_fc@xvP&4jq&Cnv zx3(7*@7?FsZV31kO#sTp1n9;TkY-GS;C>3ay0KCwJm4$YzpJ?5KK?<6WsljoS9HwLHU!&1Lxfl)Im;%yF$Ps*$g60!)a7>ZIbVB~$ zX*5tSMngBIfHbuf!J`y3?~1@NNeQ9z6A1*5P|$oL0gefBm`)@< zO{0NwF&ert1$0F2g%R9O!C{Z-paUEuEh=S&xMR1If z!_>3*85#{_8=d_~3tBM+q#0>_mLCGjC3T@2Q$U)=1Hr=-)GQgM7Cp1Moc{q@0F;Xb z(2Xe|O-F~|K?<68bl^Bj4%3eAH)u3aE=EH)rhqifAA(0HXx{vRV}cx}&EId*XrNq- zhHgv&X(pNo9;2Z7L=zmx$YDCse2_*16CUg z>9=S!P%cJ8H>Q9z9UX%EDL8CwG&n}cVcOCCHjM_##c1fp6p*HPBY2F0=EWNv$H-w? zytmV6pj?cGZcG7b7I_eSgo5UaJm454hv_2E4jK)Vi_y@HDIiVpMsPm`&5JiUM#y1W zydR>`K)DzV-IxN>>`z1RI0cipf*ZLB!Eu}%(}oS%P8tnl8=d_)4q7nQ9zt6~VAqM-Sz7&uOm!*o^bf6{0m+vw~YL1@JkkY+vXcljZpTv8XhF$JWV%p!Q0 zg3nrZ3CjklMlkz(Q+|(j0Oeu_bYlug)0iW8go5U?J8(>p!*q7{`!pIT7o(vYQ$QNu zErO3y(A;+mjwy1O`fmS#Mg!$yG<0JMNYnBoc!+}LEk8KM$YI*@{~?VA%Ef5t#uSjI znj(0Vg60lua7>cJ)M5QcG#bb@I{QWtS}_HrY4acDhk$ZPUFgOXkY?=^!F?2TT|3R{ z@`3+F6M%9t0lF~-bXfLtBe;)($y@Y{rV8K~CdZiJRH1-I1La~gbYlvrM>ZP4y%Zeu zSmn{kXmAXX7Mxfl)Im;%xiRs;`F(0mgdI7Z1~x(Tk3Mg!$yG<0JMNYm&e zc!+}LjXpTW$YI*(ducR~ZFKhSAGBf$Xj(4Vd-x$BvkyTlrhqiVroH?SklBZz6;nXg J0T#di{{nq%jg$ZY diff --git a/tests/property/build/exec/property-tests b/tests/property/build/exec/property-tests deleted file mode 100755 index 18c3d91..0000000 --- a/tests/property/build/exec/property-tests +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -# @generated by Idris 0.8.0-712523a89, Chez backend - -set -e # exit on any error - -if [ "$(uname)" = Darwin ]; then - DIR=$(zsh -c 'printf %s "$0:A:h"' "$0") -else - DIR=$(dirname "$(readlink -f -- "$0")") -fi -export LD_LIBRARY_PATH="$DIR/property-tests_app:$LD_LIBRARY_PATH" -export DYLD_LIBRARY_PATH="$DIR/property-tests_app:$DYLD_LIBRARY_PATH" -export IDRIS2_INC_SRC="$DIR/property-tests_app" - -"$DIR/property-tests_app/property-tests.so" "$@" \ No newline at end of file diff --git a/tests/property/build/exec/property-tests_app/compileChez b/tests/property/build/exec/property-tests_app/compileChez deleted file mode 100755 index c363dd8..0000000 --- a/tests/property/build/exec/property-tests_app/compileChez +++ /dev/null @@ -1 +0,0 @@ -(parameterize ([optimize-level 3] [compile-file-message #f]) (compile-program "/var/mnt/eclipse/repos/ochrance/tests/property/build/exec/property-tests_app/property-tests.ss")) \ No newline at end of file diff --git a/tests/property/build/exec/property-tests_app/property-tests.ss b/tests/property/build/exec/property-tests_app/property-tests.ss deleted file mode 100755 index ab55490..0000000 --- a/tests/property/build/exec/property-tests_app/property-tests.ss +++ /dev/null @@ -1,870 +0,0 @@ -#!/home/hyper/.local/share/../bin/scheme --program - -;; @generated by Idris 0.8.0-712523a89, Chez backend -(import (chezscheme)) -(case (machine-type) - [(i3fb ti3fb a6fb ta6fb) #f] - [(i3le ti3le a6le ta6le tarm64le) - (with-exception-handler (lambda(x) (load-shared-object "libc.so")) - (lambda () (load-shared-object "libc.so.6")))] - [(i3osx ti3osx a6osx ta6osx tarm64osx tppc32osx tppc64osx) (load-shared-object "libc.dylib")] - [(i3nt ti3nt a6nt ta6nt) (load-shared-object "msvcrt.dll")] - [else (load-shared-object "libc.so")]) - -(load-shared-object "libidris2_support.so") - -(let () -#!chezscheme - -(define (blodwen-os) - (case (machine-type) - [(i3le ti3le a6le ta6le tarm64le) "unix"] ; GNU/Linux - [(i3ob ti3ob a6ob ta6ob tarm64ob) "unix"] ; OpenBSD - [(i3fb ti3fb a6fb ta6fb tarm64fb) "unix"] ; FreeBSD - [(i3nb ti3nb a6nb ta6nb tarm64nb) "unix"] ; NetBSD - [(i3osx ti3osx a6osx ta6osx tarm64osx tppc32osx tppc64osx) "darwin"] - [(i3nt ti3nt a6nt ta6nt tarm64nt) "windows"] - [else "unknown"])) - -(define blodwen-lazy - (lambda (f) - (let ([evaluated #f] [res void]) - (lambda () - (if (not evaluated) - (begin (set! evaluated #t) - (set! res (f)) - (set! f void)) - (void)) - res)))) - -(define (blodwen-delay-lazy f) - (weak-cons #!bwp f)) - -(define (blodwen-force-lazy e) - (let ((exval (car e))) - (if (bwp-object? exval) - (let ((val ((cdr e)))) - (begin (set-car! e val) val)) - exval))) - -(define (blodwen-toSignedInt x bits) - (if (logbit? bits x) - (logor x (ash -1 bits)) - (logand x (sub1 (ash 1 bits))))) - -(define (blodwen-toUnsignedInt x bits) - (logand x (sub1 (ash 1 bits)))) - -(define (blodwen-euclidDiv a b) - (let ((q (quotient a b)) - (r (remainder a b))) - (if (< r 0) - (if (> b 0) (- q 1) (+ q 1)) - q))) - -(define (blodwen-euclidMod a b) - (let ((r (remainder a b))) - (if (< r 0) - (if (> b 0) (+ r b) (- r b)) - r))) - -; flonum constants - -(define (blodwen-calcFlonumUnitRoundoff) - (let loop [(uro 1.0)] - (if (fl= 1.0 (fl+ 1.0 uro)) - uro - (loop (fl/ uro 2.0))))) - -(define (blodwen-calcFlonumEpsilon) - (fl* (blodwen-calcFlonumUnitRoundoff) 2.0)) - -(define (blodwen-flonumNaN) - +nan.0) - -(define (blodwen-flonumInf) - +inf.0) - -; Bits - -(define bu+ (lambda (x y bits) (blodwen-toUnsignedInt (+ x y) bits))) -(define bu- (lambda (x y bits) (blodwen-toUnsignedInt (- x y) bits))) -(define bu* (lambda (x y bits) (blodwen-toUnsignedInt (* x y) bits))) -(define bu/ (lambda (x y bits) (blodwen-toUnsignedInt (quotient x y) bits))) - -(define bs+ (lambda (x y bits) (blodwen-toSignedInt (+ x y) bits))) -(define bs- (lambda (x y bits) (blodwen-toSignedInt (- x y) bits))) -(define bs* (lambda (x y bits) (blodwen-toSignedInt (* x y) bits))) -(define bs/ (lambda (x y bits) (blodwen-toSignedInt (blodwen-euclidDiv x y) bits))) - -(define (integer->bits8 x) (logand x (sub1 (ash 1 8)))) -(define (integer->bits16 x) (logand x (sub1 (ash 1 16)))) -(define (integer->bits32 x) (logand x (sub1 (ash 1 32)))) -(define (integer->bits64 x) (logand x (sub1 (ash 1 64)))) - -(define (bits16->bits8 x) (logand x (sub1 (ash 1 8)))) -(define (bits32->bits8 x) (logand x (sub1 (ash 1 8)))) -(define (bits64->bits8 x) (logand x (sub1 (ash 1 8)))) -(define (bits32->bits16 x) (logand x (sub1 (ash 1 16)))) -(define (bits64->bits16 x) (logand x (sub1 (ash 1 16)))) -(define (bits64->bits32 x) (logand x (sub1 (ash 1 32)))) - -(define (blodwen-bits-shl-signed x y bits) (blodwen-toSignedInt (ash x y) bits)) - -(define (blodwen-bits-shl x y bits) (logand (ash x y) (sub1 (ash 1 bits)))) - -(define blodwen-shl (lambda (x y) (ash x y))) -(define blodwen-shr (lambda (x y) (ash x (- y)))) -(define blodwen-and (lambda (x y) (logand x y))) -(define blodwen-or (lambda (x y) (logor x y))) -(define blodwen-xor (lambda (x y) (logxor x y))) - -(define cast-num - (lambda (x) - (if (number? x) x 0))) -(define destroy-prefix - (lambda (x) - (cond - ((equal? x "") "") - ((equal? (string-ref x 0) #\#) "") - (else x)))) - -(define exact-floor - (lambda (x) - (inexact->exact (floor x)))) - -(define exact-truncate - (lambda (x) - (inexact->exact (truncate x)))) - -(define exact-truncate-boundedInt - (lambda (x y) - (blodwen-toSignedInt (exact-truncate x) y))) - -(define exact-truncate-boundedUInt - (lambda (x y) - (blodwen-toUnsignedInt (exact-truncate x) y))) - -(define cast-char-boundedInt - (lambda (x y) - (blodwen-toSignedInt (char->integer x) y))) - -(define cast-char-boundedUInt - (lambda (x y) - (blodwen-toUnsignedInt (char->integer x) y))) - -(define cast-string-int - (lambda (x) - (exact-truncate (cast-num (string->number (destroy-prefix x)))))) - -(define cast-string-boundedInt - (lambda (x y) - (blodwen-toSignedInt (cast-string-int x) y))) - -(define cast-string-boundedUInt - (lambda (x y) - (blodwen-toUnsignedInt (cast-string-int x) y))) - -(define cast-int-char - (lambda (x) - (if (or - (and (>= x 0) (<= x #xd7ff)) - (and (>= x #xe000) (<= x #x10ffff))) - (integer->char x) - (integer->char 0)))) - -(define cast-string-double - (lambda (x) - (exact->inexact (cast-num (string->number (destroy-prefix x)))))) - - -(define (string-concat xs) (apply string-append xs)) -(define (string-unpack s) (string->list s)) -(define (string-pack xs) (list->string xs)) - -(define string-cons (lambda (x y) (string-append (string x) y))) -(define string-reverse (lambda (x) - (list->string (reverse (string->list x))))) -(define (string-substr off len s) - (let* ((l (string-length s)) - (b (max 0 off)) - (x (max 0 len)) - (end (min l (+ b x)))) - (if (> b l) - "" - (substring s b end)))) - -(define (blodwen-string-iterator-new s) - 0) - -(define (blodwen-string-iterator-to-string _ s ofs f) - (f (substring s ofs (string-length s)))) - -(define (blodwen-string-iterator-next s ofs) - (if (>= ofs (string-length s)) - '() ; EOF - (cons (string-ref s ofs) (+ ofs 1)))) - -(define either-left - (lambda (x) - (vector 0 x))) - -(define either-right - (lambda (x) - (vector 1 x))) - -(define blodwen-error-quit - (lambda (msg) - (display msg) - (newline) - (exit 1))) - -(define (blodwen-get-line p) - (if (port? p) - (let ((str (get-line p))) - (if (eof-object? str) - "" - str)) - void)) - -(define (blodwen-get-char p) - (if (port? p) - (let ((chr (get-char p))) - (if (eof-object? chr) - #\nul - chr)) - void)) - -;; Buffers - -(define (blodwen-new-buffer size) - (make-bytevector size 0)) - -(define (blodwen-buffer-size buf) - (bytevector-length buf)) - -(define (blodwen-buffer-setbyte buf loc val) - (bytevector-u8-set! buf loc val)) - -(define (blodwen-buffer-getbyte buf loc) - (bytevector-u8-ref buf loc)) - -(define (blodwen-buffer-setbits16 buf loc val) - (bytevector-u16-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getbits16 buf loc) - (bytevector-u16-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setbits32 buf loc val) - (bytevector-u32-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getbits32 buf loc) - (bytevector-u32-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setbits64 buf loc val) - (bytevector-u64-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getbits64 buf loc) - (bytevector-u64-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setint8 buf loc val) - (bytevector-s8-set! buf loc val)) - -(define (blodwen-buffer-getint8 buf loc) - (bytevector-s8-ref buf loc)) - -(define (blodwen-buffer-setint16 buf loc val) - (bytevector-s16-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getint16 buf loc) - (bytevector-s16-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setint32 buf loc val) - (bytevector-s32-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getint32 buf loc) - (bytevector-s32-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setint buf loc val) - (bytevector-s64-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getint buf loc) - (bytevector-s64-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setint64 buf loc val) - (bytevector-s64-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getint64 buf loc) - (bytevector-s64-ref buf loc (native-endianness))) - -(define (blodwen-buffer-setdouble buf loc val) - (bytevector-ieee-double-set! buf loc val (native-endianness))) - -(define (blodwen-buffer-getdouble buf loc) - (bytevector-ieee-double-ref buf loc (native-endianness))) - -(define (blodwen-stringbytelen str) - (bytevector-length (string->utf8 str))) - -(define (blodwen-buffer-setstring buf loc val) - (let* [(strvec (string->utf8 val)) - (len (bytevector-length strvec))] - (bytevector-copy! strvec 0 buf loc len))) - -(define (blodwen-buffer-getstring buf loc len) - (let [(newvec (make-bytevector len))] - (bytevector-copy! buf loc newvec 0 len) - (utf8->string newvec))) - -(define (blodwen-buffer-copydata buf start len dest loc) - (bytevector-copy! buf start dest loc len)) - -;; Threads - -(define-record thread-handle (semaphore)) - -(define (blodwen-thread proc) - (let [(sema (blodwen-make-semaphore 0))] - (fork-thread (lambda () (proc (vector 0)) (blodwen-semaphore-post sema))) - (make-thread-handle sema) - )) - -(define (blodwen-thread-wait handle) - (blodwen-semaphore-wait (thread-handle-semaphore handle))) - -;; Thread mailboxes - -(define blodwen-thread-data - (make-thread-parameter #f)) - -(define (blodwen-get-thread-data ty) - (blodwen-thread-data)) - -(define (blodwen-set-thread-data ty a) - (blodwen-thread-data a)) - -;; Semaphore - -(define-record semaphore (box mutex condition)) - -(define (blodwen-make-semaphore init) - (make-semaphore (box init) (make-mutex) (make-condition))) - -(define (blodwen-semaphore-post sema) - (with-mutex (semaphore-mutex sema) - (let [(sema-box (semaphore-box sema))] - (set-box! sema-box (+ (unbox sema-box) 1)) - (condition-signal (semaphore-condition sema)) - ))) - -(define (blodwen-semaphore-wait sema) - (with-mutex (semaphore-mutex sema) - (let [(sema-box (semaphore-box sema))] - (when (= (unbox sema-box) 0) - (condition-wait (semaphore-condition sema) (semaphore-mutex sema))) - (set-box! sema-box (- (unbox sema-box) 1)) - ))) - -;; Barrier - -(define-record barrier (count-box num-threads mutex cond)) - -(define (blodwen-make-barrier num-threads) - (make-barrier (box 0) num-threads (make-mutex) (make-condition))) - -(define (blodwen-barrier-wait barrier) - (let [(count-box (barrier-count-box barrier)) - (num-threads (barrier-num-threads barrier)) - (mutex (barrier-mutex barrier)) - (condition (barrier-cond barrier))] - (with-mutex mutex - (let* [(count-old (unbox count-box)) - (count-new (+ count-old 1))] - (set-box! count-box count-new) - (if (= count-new num-threads) - (condition-broadcast condition) - (condition-wait condition mutex)) - )))) - -;; Channel -; With thanks to Alain Zscheile (@zseri) for help with understanding condition -; variables, and figuring out where the problems were and how to solve them. - -(define-record channel (read-mut read-cv read-box val-cv val-box)) - -(define (blodwen-make-channel ty) - (make-channel - (make-mutex) - (make-condition) - (box #t) - (make-condition) - (box '()) - )) - -; block on the read status using read-cv until the value has been read -(define (channel-put-while-helper chan) - (let ([read-mut (channel-read-mut chan)] - [read-box (channel-read-box chan)] - [read-cv (channel-read-cv chan)] - ) - (if (unbox read-box) - (void) ; val has been read, so everything is fine - (begin ; otherwise, block/spin with cv - (condition-wait read-cv read-mut) - (channel-put-while-helper chan) - ) - ))) - -(define (blodwen-channel-put ty chan val) - (with-mutex (channel-read-mut chan) - (channel-put-while-helper chan) - (let ([read-box (channel-read-box chan)] - [val-box (channel-val-box chan)] - ) - (set-box! val-box val) - (set-box! read-box #f) - )) - (condition-signal (channel-val-cv chan)) - ) - -; block on the value until it has been set -(define (channel-get-while-helper chan) - (let ([read-mut (channel-read-mut chan)] - [read-box (channel-read-box chan)] - [val-cv (channel-val-cv chan)] - ) - (if (unbox read-box) - (begin - (condition-wait val-cv read-mut) - (channel-get-while-helper chan) - ) - (void) - ))) - -(define (blodwen-channel-get ty chan) - (mutex-acquire (channel-read-mut chan)) - (channel-get-while-helper chan) - (let* ([val-box (channel-val-box chan)] - [read-box (channel-read-box chan)] - [read-cv (channel-read-cv chan)] - [the-val (unbox val-box)] - ) - (set-box! val-box '()) - (set-box! read-box #t) - (mutex-release (channel-read-mut chan)) - (condition-signal read-cv) - the-val)) - -(define (blodwen-channel-get-non-blocking ty chan) - (if (mutex-acquire (channel-read-mut chan) #f) - (let* ([val-box (channel-val-box chan)] - [read-box (channel-read-box chan)] - [read-cv (channel-read-cv chan)] - [the-val (unbox val-box)] - ) - (if (null? the-val) - (begin - (mutex-release (channel-read-mut chan)) - '()) - (begin - (set-box! val-box '()) - (set-box! read-box #t) - (mutex-release (channel-read-mut chan)) - (condition-signal read-cv) - (box the-val)) - )) - '())) - -(define (blodwen-channel-get-with-timeout ty chan timeout) - ;; timeout is in milliseconds, convert to nanoseconds - (let* ([timeout-ns (* timeout 1000000)] - [sleep-ns 10000] ; 10 us step - [sleep-time (make-time 'time-duration (mod sleep-ns 1000000000) - (div sleep-ns 1000000000))]) - (let loop ([elapsed 0]) - (if (mutex-acquire (channel-read-mut chan) #f) - (let* ([val-box (channel-val-box chan)] - [the-val (unbox val-box)]) - (if (null? the-val) - (if (>= elapsed timeout-ns) - (begin - (mutex-release (channel-read-mut chan)) - '()) - (begin - (mutex-release (channel-read-mut chan)) - (sleep sleep-time) - (loop (+ elapsed sleep-ns)))) - (let* ([read-box (channel-read-box chan)] - [read-cv (channel-read-cv chan)]) - (set-box! val-box '()) - (set-box! read-box #t) - (mutex-release (channel-read-mut chan)) - (condition-signal read-cv) - (box the-val)))) - (begin - (sleep sleep-time) - (loop (+ elapsed sleep-ns))))))) - -;; Mutex - -(define (blodwen-make-mutex) - (make-mutex)) -(define (blodwen-mutex-acquire mutex) - (mutex-acquire mutex)) -(define (blodwen-mutex-release mutex) - (mutex-release mutex)) - -;; Condition variable - -(define (blodwen-make-condition) - (make-condition)) -(define (blodwen-condition-wait condition mutex) - (condition-wait condition mutex)) -(define (blodwen-condition-wait-timeout condition mutex timeout) - (let* [(sec (div timeout 1000000)) - (micro (mod timeout 1000000))] - (condition-wait condition mutex (make-time 'time-duration (* 1000 micro) sec)))) -(define (blodwen-condition-signal condition) - (condition-signal condition)) -(define (blodwen-condition-broadcast condition) - (condition-broadcast condition)) - -;; Future - -(define-record future-internal (result ready mutex signal)) -(define (blodwen-make-future ty work) - (let ([future (make-future-internal #f #f (make-mutex) (make-condition))]) - (fork-thread (lambda () - (let ([result (work '())]) - (with-mutex (future-internal-mutex future) - (set-future-internal-result! future result) - (set-future-internal-ready! future #t) - (condition-broadcast (future-internal-signal future)))))) - future)) -(define (blodwen-await-future ty future) - (let ([mutex (future-internal-mutex future)]) - (with-mutex mutex - (if (not (future-internal-ready future)) - (condition-wait (future-internal-signal future) mutex)) - (future-internal-result future)))) - -(define (blodwen-sleep s) (sleep (make-time 'time-duration 0 s))) -(define (blodwen-usleep s) - (let ((sec (div s 1000000)) - (micro (mod s 1000000))) - (sleep (make-time 'time-duration (* 1000 micro) sec)))) - -(define (blodwen-clock-time-utc) (current-time 'time-utc)) -(define (blodwen-clock-time-monotonic) (current-time 'time-monotonic)) -(define (blodwen-clock-time-duration) (current-time 'time-duration)) -(define (blodwen-clock-time-process) (current-time 'time-process)) -(define (blodwen-clock-time-thread) (current-time 'time-thread)) -(define (blodwen-clock-time-gccpu) (current-time 'time-collector-cpu)) -(define (blodwen-clock-time-gcreal) (current-time 'time-collector-real)) -(define (blodwen-is-time? clk) (if (time? clk) 1 0)) -(define (blodwen-clock-second time) (time-second time)) -(define (blodwen-clock-nanosecond time) (time-nanosecond time)) - -(define (blodwen-arg-count) - (length (command-line))) - -(define (blodwen-arg n) - (if (< n (length (command-line))) (list-ref (command-line) n) "")) - -(define (blodwen-hasenv var) - (if (eq? (getenv var) #f) 0 1)) - -;; Randoms -(define random-seed-register 0) -(define (initialize-random-seed-once) - (if (= (virtual-register random-seed-register) 0) - (let ([seed (time-nanosecond (current-time))]) - (set-virtual-register! random-seed-register seed) - (random-seed seed)))) - -(define (blodwen-random-seed seed) - (set-virtual-register! random-seed-register seed) - (random-seed seed)) -(define blodwen-random - (case-lambda - ;; no argument, pick a real value from [0, 1.0) - [() (begin - (initialize-random-seed-once) - (random 1.0))] - ;; single argument k, pick an integral value from [0, k) - [(k) - (begin - (initialize-random-seed-once) - (if (> k 0) - (random k) - (assertion-violationf 'blodwen-random "invalid range argument ~a" k)))])) - -;; For finalisers - -(define blodwen-finaliser (make-guardian)) -(define (blodwen-register-object obj proc) - (let [(x (cons obj proc))] - (blodwen-finaliser x) - x)) -(define blodwen-run-finalisers - (lambda () - (let run () - (let ([x (blodwen-finaliser)]) - (when x - (((cdr x) (car x)) 'erased) - (run)))))) - -;; For creating and reading back scheme objects - -; read a scheme string and evaluate it, returning 'Just result' on success -; TODO: catch exception! -(define (blodwen-eval-scheme str) - (guard - (x [#t '()]) ; Nothing on failure - (box (eval (read (open-input-string str))))) - ); box == Just - -(define (blodwen-eval-okay obj) - (if (null? obj) - 0 - 1)) - -(define (blodwen-get-eval-result obj) - (unbox obj)) - -(define (blodwen-debug-scheme obj) - (display obj) (newline)) - -(define (blodwen-is-number obj) - (if (number? obj) 1 0)) - -(define (blodwen-is-integer obj) - (if (and (number? obj) (exact? obj)) 1 0)) - -(define (blodwen-is-float obj) - (if (flonum? obj) 1 0)) - -(define (blodwen-is-char obj) - (if (char? obj) 1 0)) - -(define (blodwen-is-string obj) - (if (string? obj) 1 0)) - -(define (blodwen-is-procedure obj) - (if (procedure? obj) 1 0)) - -(define (blodwen-is-symbol obj) - (if (symbol? obj) 1 0)) - -(define (blodwen-is-vector obj) - (if (vector? obj) 1 0)) - -(define (blodwen-is-nil obj) - (if (null? obj) 1 0)) - -(define (blodwen-is-pair obj) - (if (pair? obj) 1 0)) - -(define (blodwen-is-box obj) - (if (box? obj) 1 0)) - -(define (blodwen-make-symbol str) - (string->symbol str)) - -; The below rely on checking that the objects are the right type first. - -(define (blodwen-vector-ref obj i) - (vector-ref obj i)) - -(define (blodwen-vector-length obj) - (vector-length obj)) - -(define (blodwen-vector-list obj) - (vector->list obj)) - -(define (blodwen-unbox obj) - (unbox obj)) - -(define (blodwen-apply obj arg) - (obj arg)) - -(define (blodwen-force obj) - (obj)) - -(define (blodwen-read-symbol sym) - (symbol->string sym)) - -(define (blodwen-id x) x) -(define PreludeC-45Types-fastUnpack (lambda (farg-0) (string-unpack farg-0))) -(define PreludeC-45Types-fastPack (lambda (farg-0) (string-pack farg-0))) -(define PreludeC-45IO-prim__putStr (lambda (farg-0 farg-1) ((foreign-procedure "idris2_putStr" (string) void) farg-0))) -(define PreludeC-45EqOrd-u--C-61C-61_Eq_Bits8 (lambda (arg-0 arg-1) (let ((sc0 (or (and (= arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45EqOrd-u--C-47C-61_Eq_Bits8 (lambda (arg-0 arg-1) (let ((sc0 (PreludeC-45EqOrd-u--C-61C-61_Eq_Bits8 arg-0 arg-1))) (cond ((equal? sc0 1) 0) (else 1))))) -(define csegen-2 (cons (lambda (arg-712) (lambda (arg-715) (PreludeC-45EqOrd-u--C-61C-61_Eq_Bits8 arg-712 arg-715))) (lambda (arg-722) (lambda (arg-725) (PreludeC-45EqOrd-u--C-47C-61_Eq_Bits8 arg-722 arg-725))))) -(define PreludeC-45IO-u--map_Functor_IO (lambda (arg-2 arg-3 ext-0) (let ((act-2 (arg-3 ext-0))) (arg-2 act-2)))) -(define csegen-39 (cons (vector (vector (lambda (u--b) (lambda (u--a) (lambda (u--func) (lambda (arg-8912) (lambda (eta-0) (PreludeC-45IO-u--map_Functor_IO u--func arg-8912 eta-0)))))) (lambda (u--a) (lambda (arg-9951) (lambda (eta-0) arg-9951))) (lambda (u--b) (lambda (u--a) (lambda (arg-9957) (lambda (arg-9964) (lambda (world-4) (let ((act-5 (arg-9957 world-4))) (let ((act-3 (arg-9964 world-4))) (act-5 act-3))))))))) (lambda (u--b) (lambda (u--a) (lambda (arg-10436) (lambda (arg-10439) (lambda (world-0) (let ((act-1 (arg-10436 world-0))) ((arg-10439 act-1) world-0))))))) (lambda (u--a) (lambda (arg-10450) (lambda (world-0) (let ((act-1 (arg-10450 world-0))) (act-1 world-0)))))) (lambda (u--a) (lambda (arg-13044) arg-13044)))) -(define OchranceC-45A2MLC-45Types-u--C-61C-61_Eq_HashAlgorithm (lambda (arg-0 arg-1) (cond ((equal? arg-0 0) (cond ((equal? arg-1 0) 1)(else 0))) ((equal? arg-0 1) (cond ((equal? arg-1 1) 1)(else 0))) ((equal? arg-0 2) (cond ((equal? arg-1 2) 1)(else 0)))(else 0)))) -(define PreludeC-45EqOrd-u--C-61C-61_Eq_String (lambda (arg-0 arg-1) (let ((sc0 (or (and (string=? arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define OchranceC-45A2MLC-45Types-u--C-61C-61_Eq_Hash (lambda (arg-0 arg-1) (let ((sc0 (OchranceC-45A2MLC-45Types-u--C-61C-61_Eq_HashAlgorithm (let ((e-0 (car arg-0))) e-0) (let ((e-0 (car arg-1))) e-0)))) (cond ((equal? sc0 1) (PreludeC-45EqOrd-u--C-61C-61_Eq_String (let ((e-1 (cdr arg-0))) e-1) (let ((e-1 (cdr arg-1))) e-1))) (else 0))))) -(define OchranceC-45A2MLC-45Types-u--C-47C-61_Eq_Hash (lambda (arg-0 arg-1) (let ((sc0 (OchranceC-45A2MLC-45Types-u--C-61C-61_Eq_Hash arg-0 arg-1))) (cond ((equal? sc0 1) 0) (else 1))))) -(define csegen-42 (cons (lambda (arg-712) (lambda (arg-715) (OchranceC-45A2MLC-45Types-u--C-61C-61_Eq_Hash arg-712 arg-715))) (lambda (arg-722) (lambda (arg-725) (OchranceC-45A2MLC-45Types-u--C-47C-61_Eq_Hash arg-722 arg-725))))) -(define PreludeC-45InterfacesC-45BoolC-45Semigroup-u--C-60C-43C-62_Semigroup_AllBool (lambda (arg-0 arg-1) (cond ((equal? arg-0 1) arg-1) (else 0)))) -(define csegen-123 (cons (lambda (arg-8497) (lambda (arg-8500) (PreludeC-45InterfacesC-45BoolC-45Semigroup-u--C-60C-43C-62_Semigroup_AllBool arg-8497 arg-8500))) 1)) -(define u--prim__sub_Integer (lambda (arg-0 arg-1) (- arg-0 arg-1))) -(define DataC-45Nat-power (lambda (arg-0 arg-1) (cond ((equal? arg-1 0) 1)(else (let ((e-0 (- arg-1 1))) (* arg-0 (DataC-45Nat-power arg-0 e-0))))))) -(define DataC-45Vect-with--splitAt-5378 (lambda (arg-0 arg-1 arg-2 arg-3 arg-4 arg-5) (let ((e-2 (car arg-4))) (let ((e-3 (cdr arg-4))) (cons (cons arg-5 e-2) e-3))))) -(define DataC-45Vect-splitAt (lambda (arg-2 arg-3) (cond ((equal? arg-2 0) (cons '() arg-3))(else (let ((e-0 (- arg-2 1))) (let ((e-3 (car arg-3))) (let ((e-4 (cdr arg-3))) (DataC-45Vect-with--splitAt-5378 'erased 'erased e-0 e-4 (DataC-45Vect-splitAt e-0 e-4) e-3)))))))) -(define OchranceC-45FilesystemC-45Merkle-buildMerkleTree (lambda (arg-0 arg-1) (cond ((equal? arg-0 0) (let ((e-3 (car arg-1))) (let ((e-4 (cdr arg-1))) (vector 0 e-3))))(else (let ((e-0 (- arg-0 1))) (let ((sc0 (DataC-45Vect-splitAt (DataC-45Nat-power 2 e-0) arg-1))) (let ((e-2 (car sc0))) (let ((e-3 (cdr sc0))) (vector 1 (OchranceC-45FilesystemC-45Merkle-buildMerkleTree e-0 e-2) (OchranceC-45FilesystemC-45Merkle-buildMerkleTree e-0 e-3)))))))))) -(define DataC-45Vect-u--zipWith_Zippable_C-40VectC-32C-36kC-41 (lambda (arg-4 arg-5 arg-6) (if (null? arg-5) '() (let ((e-3 (car arg-5))) (let ((e-4 (cdr arg-5))) (let ((e-8 (car arg-6))) (let ((e-9 (cdr arg-6))) (cons ((arg-4 e-3) e-8) (DataC-45Vect-u--zipWith_Zippable_C-40VectC-32C-36kC-41 arg-4 e-4 e-9))))))))) -(define OchranceC-45FFIC-45Crypto-hashPairStub (lambda (arg-0 arg-1) (DataC-45Vect-u--zipWith_Zippable_C-40VectC-32C-36kC-41 (lambda (eta-0) (lambda (eta-1) (blodwen-xor eta-0 eta-1))) arg-0 arg-1))) -(define DataC-45Vect-replicate (lambda (arg-1 arg-2) (cond ((equal? arg-1 0) '())(else (let ((e-0 (- arg-1 1))) (cons arg-2 (DataC-45Vect-replicate e-0 arg-2))))))) -(define OchranceC-45FilesystemC-45Merkle-rootHashBytes (lambda (arg-1) (case (vector-ref arg-1 0) ((0) (let ((e-0 (vector-ref arg-1 1))) e-0)) (else (let ((e-2 (vector-ref arg-1 1))) (let ((e-3 (vector-ref arg-1 2))) (OchranceC-45FFIC-45Crypto-hashPairStub (OchranceC-45FilesystemC-45Merkle-rootHashBytes e-2) (OchranceC-45FilesystemC-45Merkle-rootHashBytes e-3)))))))) -(define DataC-45Vect-u--C-61C-61_Eq_C-40C-40VectC-32C-36nC-41C-32C-36aC-41 (lambda (arg-2 arg-3 arg-4) (if (null? arg-3) 1 (let ((e-3 (car arg-3))) (let ((e-4 (cdr arg-3))) (let ((e-8 (car arg-4))) (let ((e-9 (cdr arg-4))) (let ((sc2 (let ((e-1 (car arg-2))) ((e-1 e-3) e-8)))) (cond ((equal? sc2 1) (DataC-45Vect-u--C-61C-61_Eq_C-40C-40VectC-32C-36nC-41C-32C-36aC-41 arg-2 e-4 e-9)) (else 0)))))))))) -(define PropertyTests-n--7143-6769-u--merkle4Leaf (let ((u--h1 (DataC-45Vect-replicate 32 1))) (let ((u--h2 (DataC-45Vect-replicate 32 2))) (let ((u--h3 (DataC-45Vect-replicate 32 3))) (let ((u--h4 (DataC-45Vect-replicate 32 4))) (let ((u--tree (OchranceC-45FilesystemC-45Merkle-buildMerkleTree 2 (cons u--h1 (cons u--h2 (cons u--h3 (cons u--h4 '()))))))) (let ((u--expectedLeft (OchranceC-45FFIC-45Crypto-hashPairStub u--h1 u--h2))) (let ((u--expectedRight (OchranceC-45FFIC-45Crypto-hashPairStub u--h3 u--h4))) (let ((u--expectedRoot (OchranceC-45FFIC-45Crypto-hashPairStub u--expectedLeft u--expectedRight))) (DataC-45Vect-u--C-61C-61_Eq_C-40C-40VectC-32C-36nC-41C-32C-36aC-41 csegen-2 (OchranceC-45FilesystemC-45Merkle-rootHashBytes u--tree) u--expectedRoot)))))))))) -(define PreludeC-45EqOrd-u--C-60C-61_Ord_Char (lambda (arg-0 arg-1) (let ((sc0 (or (and (char<=? arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45EqOrd-u--C-62C-61_Ord_Char (lambda (arg-0 arg-1) (let ((sc0 (or (and (char>=? arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PropertyTests-n--5854-5594-u--isHexChar (lambda (arg-0 arg-1) (let ((sc0 (let ((sc1 (PreludeC-45EqOrd-u--C-62C-61_Ord_Char arg-1 #\0))) (cond ((equal? sc1 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char arg-1 #\9)) (else 0))))) (cond ((equal? sc0 1) 1) (else (let ((sc1 (PreludeC-45EqOrd-u--C-62C-61_Ord_Char arg-1 #\a))) (cond ((equal? sc1 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char arg-1 #\f)) (else 0)))))))) -(define PropertyTests-initStats (vector 0 0 0)) -(define PropertyTests-mkBadHash (vector (vector "0.1.0" "test" '()) (cons (cons "block_0" (cons 2 "not_valid_hex!")) '()) '() '())) -(define PropertyTests-mkBadVersion (vector (vector "99.99.99" "test" '()) '() '() '())) -(define PropertyTests-mkEmptySubsystem (vector (vector "0.1.0" "" '()) '() '() '())) -(define PropertyTests-mkPolicyViolation (vector (vector "0.1.0" "test" '()) (cons (cons "block_0" (cons 2 "abcdef")) '()) '() (box (vector 2 '() 1)))) -(define PropertyTests-mkValidManifestSample (vector (vector "0.1.0" "test-filesystem" '()) (cons (cons "block_0" (cons 2 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef")) '()) '() '())) -(define PropertyTests-addFail (lambda (arg-0) (let ((e-0 (vector-ref arg-0 0))) (vector e-0 (+ (let ((e-4 (vector-ref arg-0 1))) e-4) 1) (+ (let ((e-3 (vector-ref arg-0 2))) e-3) 1))))) -(define PropertyTests-addPass (lambda (arg-0) (let ((e-1 (vector-ref arg-0 1))) (vector (+ (let ((e-5 (vector-ref arg-0 0))) e-5) 1) e-1 (+ (let ((e-3 (vector-ref arg-0 2))) e-3) 1))))) -(define PropertyTests-testCase (lambda (arg-0 arg-1 arg-2 ext-0) (let ((act-1 (arg-1 ext-0))) (cond ((equal? act-1 1) (let ((act-2 (PreludeC-45IO-prim__putStr (string-append (string-append " PASS: " arg-0) "\xa;") ext-0))) (PropertyTests-addPass arg-2))) (else (let ((act-2 (PreludeC-45IO-prim__putStr (string-append (string-append " FAIL: " arg-0) "\xa;") ext-0))) (PropertyTests-addFail arg-2))))))) -(define OchranceC-45A2MLC-45Validator-isVersionSupported (lambda (arg-0) (cond ((equal? arg-0 "0.1.0") 1)(else 0)))) -(define PreludeC-45Interfaces-C-42C-62 (lambda (arg-3 arg-4 arg-5) (let ((e-3 (vector-ref arg-3 2))) ((((e-3 'erased) 'erased) (((let ((eff-0 (let ((e-6 (vector-ref arg-3 0))) e-6))) ((eff-0 'erased) 'erased)) (lambda (eta-0) (lambda (eta-1) eta-1))) arg-4)) arg-5)))) -(define PreludeC-45Interfaces-traverse_ (lambda (arg-4 arg-5 arg-6) (let ((e-1 (vector-ref arg-5 0))) ((((e-1 'erased) 'erased) (lambda (eta-0) (lambda (eta-1) (PreludeC-45Interfaces-C-42C-62 arg-4 (arg-6 eta-0) eta-1)))) (let ((e-8 (vector-ref arg-4 1))) ((e-8 'erased) 'erased)))))) -(define PreludeC-45Types-u--foldl_Foldable_List (lambda (arg-2 arg-3 arg-4) (if (null? arg-4) arg-3 (let ((e-2 (car arg-4))) (let ((e-3 (cdr arg-4))) (PreludeC-45Types-u--foldl_Foldable_List arg-2 ((arg-2 arg-3) e-2) e-3)))))) -(define PreludeC-45Types-u--foldMap_Foldable_List (lambda (arg-2 arg-3 ext-0) (PreludeC-45Types-u--foldl_Foldable_List (lambda (u--acc) (lambda (u--elem) (let ((e-1 (car arg-2))) ((e-1 u--acc) (arg-3 u--elem))))) (let ((e-2 (cdr arg-2))) e-2) ext-0))) -(define PreludeC-45Types-isDigit (lambda (arg-0) (let ((sc0 (PreludeC-45EqOrd-u--C-62C-61_Ord_Char arg-0 #\0))) (cond ((equal? sc0 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char arg-0 #\9)) (else 0))))) -(define PreludeC-45Types-isHexDigit (lambda (arg-0) (let ((sc0 (PreludeC-45Types-isDigit arg-0))) (cond ((equal? sc0 1) 1) (else (let ((sc1 (let ((sc2 (PreludeC-45EqOrd-u--C-60C-61_Ord_Char #\a arg-0))) (cond ((equal? sc2 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char arg-0 #\f)) (else 0))))) (cond ((equal? sc1 1) 1) (else (let ((sc2 (PreludeC-45EqOrd-u--C-60C-61_Ord_Char #\A arg-0))) (cond ((equal? sc2 1) (PreludeC-45EqOrd-u--C-60C-61_Ord_Char arg-0 #\F)) (else 0))))))))))) -(define PreludeC-45EqOrd-u--C-61C-61_Eq_Char (lambda (arg-0 arg-1) (let ((sc0 (or (and (char=? arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define OchranceC-45A2MLC-45Validator-n--4376-2315-u--isHexChar (lambda (arg-0 arg-1) (let ((sc0 (PreludeC-45Types-isHexDigit arg-1))) (cond ((equal? sc0 1) 1) (else (PreludeC-45EqOrd-u--C-61C-61_Eq_Char arg-1 #\.)))))) -(define OchranceC-45A2MLC-45Validator-isValidHexString (lambda (arg-0) (PreludeC-45Types-u--foldMap_Foldable_List csegen-123 (lambda (eta-0) (OchranceC-45A2MLC-45Validator-n--4376-2315-u--isHexChar arg-0 eta-0)) (PreludeC-45Types-fastUnpack arg-0)))) -(define OchranceC-45A2MLC-45Validator-validateRef (lambda (arg-0) (let ((sc0 (OchranceC-45A2MLC-45Validator-isValidHexString (let ((e-1 (cdr arg-0))) (let ((e-2 (cdr e-1))) e-2))))) (cond ((equal? sc0 1) (vector 1 'erased)) (else (vector 0 (vector 3 (let ((e-1 (cdr arg-0))) (let ((e-2 (cdr e-1))) e-2))))))))) -(define PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (lambda (arg-3 arg-4) (case (vector-ref arg-3 0) ((0) (let ((e-2 (vector-ref arg-3 1))) (vector 0 e-2))) (else (let ((e-5 (vector-ref arg-3 1))) (arg-4 e-5)))))) -(define PreludeC-45Basics-flip (lambda (arg-3 ext-0 ext-1) ((arg-3 ext-1) ext-0))) -(define PreludeC-45Types-u--foldlM_Foldable_List (lambda (arg-3 arg-4 arg-5 ext-0) (PreludeC-45Types-u--foldl_Foldable_List (lambda (u--ma) (lambda (u--b) (let ((e-2 (vector-ref arg-3 1))) ((((e-2 'erased) 'erased) u--ma) (lambda (eta-0) (PreludeC-45Basics-flip arg-4 u--b eta-0)))))) (let ((e-1 (vector-ref arg-3 0))) (let ((e-5 (vector-ref e-1 1))) ((e-5 'erased) arg-5))) ext-0))) -(define PreludeC-45Types-u--foldr_Foldable_List (lambda (arg-2 arg-3 arg-4) (if (null? arg-4) arg-3 (let ((e-2 (car arg-4))) (let ((e-3 (cdr arg-4))) ((arg-2 e-2) (PreludeC-45Types-u--foldr_Foldable_List arg-2 arg-3 e-3))))))) -(define PreludeC-45Types-u--null_Foldable_List (lambda (arg-1) (if (null? arg-1) 1 0))) -(define OchranceC-45A2MLC-45Validator-validateManifest (lambda (arg-0) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (let ((sc0 (OchranceC-45A2MLC-45Validator-isVersionSupported (let ((e-0 (vector-ref arg-0 0))) (let ((e-6 (vector-ref e-0 0))) e-6))))) (cond ((equal? sc0 1) (vector 1 'erased)) (else (vector 0 (vector 1 (let ((e-0 (vector-ref arg-0 0))) (let ((e-6 (vector-ref e-0 0))) e-6))))))) (lambda (_-10677) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (let ((sc0 (PreludeC-45EqOrd-u--C-61C-61_Eq_String (let ((e-0 (vector-ref arg-0 0))) (let ((e-5 (vector-ref e-0 1))) e-5)) ""))) (cond ((equal? sc0 1) (vector 0 (vector 0 "subsystem"))) (else (vector 1 'erased)))) (lambda (_-10678) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 ((PreludeC-45Interfaces-traverse_ (vector (lambda (u--b) (lambda (u--a) (lambda (u--func) (lambda (arg-8912) (case (vector-ref arg-8912 0) ((0) (let ((e-2 (vector-ref arg-8912 1))) (vector 0 e-2))) (else (let ((e-5 (vector-ref arg-8912 1))) (vector 1 (u--func e-5))))))))) (lambda (u--a) (lambda (arg-9951) (vector 1 arg-9951))) (lambda (u--b) (lambda (u--a) (lambda (arg-9957) (lambda (arg-9964) (case (vector-ref arg-9957 0) ((0) (let ((e-2 (vector-ref arg-9957 1))) (vector 0 e-2))) (else (let ((e-5 (vector-ref arg-9957 1))) (case (vector-ref arg-9964 0) ((1) (let ((e-8 (vector-ref arg-9964 1))) (vector 1 (e-5 e-8)))) (else (let ((e-11 (vector-ref arg-9964 1))) (vector 0 e-11)))))))))))) (vector (lambda (u--acc) (lambda (u--elem) (lambda (u--func) (lambda (u--init) (lambda (u--input) (PreludeC-45Types-u--foldr_Foldable_List u--func u--init u--input)))))) (lambda (u--elem) (lambda (u--acc) (lambda (u--func) (lambda (u--init) (lambda (u--input) (PreludeC-45Types-u--foldl_Foldable_List u--func u--init u--input)))))) (lambda (u--elem) (lambda (arg-10939) (PreludeC-45Types-u--null_Foldable_List arg-10939))) (lambda (u--elem) (lambda (u--acc) (lambda (u--m) (lambda (i_con-0) (lambda (u--funcM) (lambda (u--init) (lambda (u--input) (PreludeC-45Types-u--foldlM_Foldable_List i_con-0 u--funcM u--init u--input)))))))) (lambda (u--elem) (lambda (arg-10968) arg-10968)) (lambda (u--a) (lambda (u--m) (lambda (i_con-0) (lambda (u--f) (lambda (arg-10982) (PreludeC-45Types-u--foldMap_Foldable_List i_con-0 u--f arg-10982))))))) (lambda (eta-0) (OchranceC-45A2MLC-45Validator-validateRef eta-0))) (let ((e-1 (vector-ref arg-0 1))) e-1)) (lambda (_-10679) (vector 1 arg-0))))))))) -(define OchranceC-45A2MLC-45Validator-n--4918-2843-u--isNothing (lambda (arg-0 arg-2) (if (null? arg-2) 1 0))) -(define OchranceC-45A2MLC-45Validator-case--validatePolicy-2864 (lambda (arg-0 arg-1) (if (null? arg-1) (vector 1 'erased) (let ((e-2 (unbox arg-1))) (PreludeC-45Types-u--C-62C-62C-61_Monad_C-40EitherC-32C-36eC-41 (let ((sc1 (let ((sc2 (let ((e-3 (vector-ref e-2 2))) e-3))) (cond ((equal? sc2 1) (OchranceC-45A2MLC-45Validator-n--4918-2843-u--isNothing arg-0 (let ((e-4 (vector-ref arg-0 2))) e-4))) (else 0))))) (cond ((equal? sc1 1) (vector 0 (vector 5 "Policy requires signature but none present"))) (else (vector 1 'erased)))) (lambda (_-10677) ((let ((e-1 (vector-ref e-2 1))) (if (null? e-1) (lambda () (vector 1 'erased)) (let ((e-8 (vector-ref arg-0 0))) (let ((e-9 (vector-ref e-8 2))) (if (null? e-9) (lambda () (vector 0 (vector 5 "Policy specifies max_age but manifest has no timestamp"))) (lambda () (vector 1 'erased)))))))))))))) -(define OchranceC-45A2MLC-45Validator-validatePolicy (lambda (arg-0) (OchranceC-45A2MLC-45Validator-case--validatePolicy-2864 arg-0 (let ((e-3 (vector-ref arg-0 3))) e-3)))) -(define PropertyTests-validationTests (lambda (ext-0) (let ((act-1 (PreludeC-45IO-prim__putStr "\xa;=== Property 4: A2ML Manifest Validation ===\xa;" ext-0))) (let ((act-2 PropertyTests-initStats)) (let ((u--c1 (let ((sc0 (OchranceC-45A2MLC-45Validator-validateManifest PropertyTests-mkValidManifestSample))) (case (vector-ref sc0 0) ((1) 1) (else 0))))) (let ((act-3 (PropertyTests-testCase "Well-formed manifest validates" (lambda (eta-0) u--c1) act-2 ext-0))) (let ((u--c2 (let ((sc0 (OchranceC-45A2MLC-45Validator-validateManifest PropertyTests-mkEmptySubsystem))) (case (vector-ref sc0 0) ((0) 1) (else 0))))) (let ((act-4 (PropertyTests-testCase "Empty subsystem rejects" (lambda (eta-0) u--c2) act-3 ext-0))) (let ((u--c3 (let ((sc0 (OchranceC-45A2MLC-45Validator-validateManifest PropertyTests-mkBadVersion))) (case (vector-ref sc0 0) ((0) (let ((e-2 (vector-ref sc0 1))) (case (vector-ref e-2 0) ((1) 1)(else 0))))(else 0))))) (let ((act-5 (PropertyTests-testCase "Unsupported version rejects" (lambda (eta-0) u--c3) act-4 ext-0))) (let ((u--c4 (let ((sc0 (OchranceC-45A2MLC-45Validator-validateManifest PropertyTests-mkBadHash))) (case (vector-ref sc0 0) ((0) (let ((e-2 (vector-ref sc0 1))) (case (vector-ref e-2 0) ((3) 1)(else 0))))(else 0))))) (let ((act-6 (PropertyTests-testCase "Invalid hex hash rejects" (lambda (eta-0) u--c4) act-5 ext-0))) (let ((u--c5 (let ((sc0 (OchranceC-45A2MLC-45Validator-validatePolicy PropertyTests-mkPolicyViolation))) (case (vector-ref sc0 0) ((0) (let ((e-2 (vector-ref sc0 1))) (case (vector-ref e-2 0) ((5) 1)(else 0))))(else 0))))) (let ((act-7 (PropertyTests-testCase "Policy require_sig without attestation fails" (lambda (eta-0) u--c5) act-6 ext-0))) (let ((u--mNoTs (vector (vector "0.1.0" "test" '()) '() '() (box (vector 0 (box 3600) 0))))) (let ((u--c6 (let ((sc0 (OchranceC-45A2MLC-45Validator-validatePolicy u--mNoTs))) (case (vector-ref sc0 0) ((0) (let ((e-2 (vector-ref sc0 1))) (case (vector-ref e-2 0) ((5) 1)(else 0))))(else 0))))) (let ((act-8 (PropertyTests-testCase "Policy max_age without timestamp fails" (lambda (eta-0) u--c6) act-7 ext-0))) (let ((u--c7 (let ((sc0 (OchranceC-45A2MLC-45Validator-validateManifest (vector (vector "0.1.0" "test" '()) '() '() '())))) (case (vector-ref sc0 0) ((1) 1) (else 0))))) (let ((act-9 (PropertyTests-testCase "Manifest with zero refs validates" (lambda (eta-0) u--c7) act-8 ext-0))) (let ((u--mTs (vector (vector "0.1.0" "test" (box "2026-03-10T00:00:00Z")) (cons (cons "block_0" (cons 2 "abcdef0123456789")) '()) '() '()))) (let ((u--c8 (let ((sc0 (OchranceC-45A2MLC-45Validator-validateManifest u--mTs))) (case (vector-ref sc0 0) ((1) 1) (else 0))))) (let ((act-10 (PropertyTests-testCase "Manifest with timestamp validates" (lambda (eta-0) u--c8) act-9 ext-0))) (let ((u--mMulti (vector (vector "0.1.0" "test" '()) (cons (cons "a" (cons 0 "abcdef")) (cons (cons "b" (cons 1 "012345")) (cons (cons "c" (cons 2 "fedcba")) '()))) '() '()))) (let ((u--c9 (let ((sc0 (OchranceC-45A2MLC-45Validator-validateManifest u--mMulti))) (case (vector-ref sc0 0) ((1) 1) (else 0))))) (PropertyTests-testCase "Multiple valid refs all pass" (lambda (eta-0) u--c9) act-10 ext-0))))))))))))))))))))))))) -(define PreludeC-45Types-prim__integerToNat (lambda (arg-0) (let ((sc0 (or (and (<= 0 arg-0) 1) 0))) (cond ((equal? sc0 0) 0)(else arg-0))))) -(define PreludeC-45Types-u--C-61C-61_Eq_C-40MaybeC-32C-36aC-41 (lambda (arg-1 arg-2 arg-3) (if (null? arg-2) (if (null? arg-3) 1 0) (let ((e-2 (unbox arg-2))) (if (null? arg-3) 0 (let ((e-8 (unbox arg-3))) (let ((e-1 (car arg-1))) ((e-1 e-2) e-8)))))))) -(define PreludeC-45Types-countFrom (lambda (arg-1 arg-2) (cons arg-1 (lambda () (PreludeC-45Types-countFrom (arg-2 arg-1) arg-2))))) -(define PreludeC-45Types-takeUntil (lambda (arg-1 arg-2) (let ((e-1 (car arg-2))) (let ((e-2 (cdr arg-2))) (let ((sc1 (arg-1 e-1))) (cond ((equal? sc1 1) (cons e-1 '())) (else (cons e-1 (PreludeC-45Types-takeUntil arg-1 (e-2)))))))))) -(define PreludeC-45EqOrd-u--C-61C-61_Eq_Ordering (lambda (arg-0 arg-1) (cond ((equal? arg-0 0) (cond ((equal? arg-1 0) 1)(else 0))) ((equal? arg-0 1) (cond ((equal? arg-1 1) 1)(else 0))) ((equal? arg-0 2) (cond ((equal? arg-1 2) 1)(else 0)))(else 0)))) -(define PreludeC-45EqOrd-u--C-47C-61_Eq_Ordering (lambda (arg-0 arg-1) (let ((sc0 (PreludeC-45EqOrd-u--C-61C-61_Eq_Ordering arg-0 arg-1))) (cond ((equal? sc0 1) 0) (else 1))))) -(define PreludeC-45EqOrd-u--C-60_Ord_Integer (lambda (arg-0 arg-1) (let ((sc0 (or (and (< arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45EqOrd-u--C-61C-61_Eq_Integer (lambda (arg-0 arg-1) (let ((sc0 (or (and (= arg-0 arg-1) 1) 0))) (cond ((equal? sc0 0) 0)(else 1))))) -(define PreludeC-45EqOrd-u--compare_Ord_Integer (lambda (arg-0 arg-1) (let ((sc0 (PreludeC-45EqOrd-u--C-60_Ord_Integer arg-0 arg-1))) (cond ((equal? sc0 1) 0) (else (let ((sc1 (PreludeC-45EqOrd-u--C-61C-61_Eq_Integer arg-0 arg-1))) (cond ((equal? sc1 1) 1) (else 2)))))))) -(define PreludeC-45Types-u--C-60C-61_Ord_Nat (lambda (arg-0 arg-1) (PreludeC-45EqOrd-u--C-47C-61_Eq_Ordering (PreludeC-45EqOrd-u--compare_Ord_Integer arg-0 arg-1) 2))) -(define PreludeC-45Types-u--C-62C-61_Ord_Nat (lambda (arg-0 arg-1) (PreludeC-45EqOrd-u--C-47C-61_Eq_Ordering (PreludeC-45EqOrd-u--compare_Ord_Integer arg-0 arg-1) 0))) -(define PreludeC-45Types-u--pure_Applicative_List (lambda (arg-1) (cons arg-1 '()))) -(define PreludeC-45Types-u--rangeFromTo_Range_Nat (lambda (arg-0 arg-1) (let ((sc0 (PreludeC-45EqOrd-u--compare_Ord_Integer arg-0 arg-1))) (cond ((equal? sc0 0) (PreludeC-45Types-takeUntil (lambda (arg-2) (PreludeC-45Types-u--C-62C-61_Ord_Nat arg-2 arg-1)) (PreludeC-45Types-countFrom arg-0 (lambda (eta-0) (+ eta-0 1))))) ((equal? sc0 1) (PreludeC-45Types-u--pure_Applicative_List arg-0)) (else (PreludeC-45Types-takeUntil (lambda (arg-2) (PreludeC-45Types-u--C-60C-61_Ord_Nat arg-2 arg-1)) (PreludeC-45Types-countFrom arg-0 (lambda (u--n) (PreludeC-45Types-prim__integerToNat (- u--n 1)))))))))) -(define PropertyTests-fsStatesEqual (lambda (arg-0 arg-1) (let ((sc0 (or (and (= (let ((e-0 (vector-ref arg-0 0))) e-0) (let ((e-0 (vector-ref arg-1 0))) e-0)) 1) 0))) (cond ((equal? sc0 1) (PreludeC-45Types-u--foldMap_Foldable_List csegen-123 (lambda (u--idx) (PreludeC-45Types-u--C-61C-61_Eq_C-40MaybeC-32C-36aC-41 csegen-42 (let ((e-1 (vector-ref arg-0 1))) (e-1 u--idx)) (let ((e-1 (vector-ref arg-1 1))) (e-1 u--idx)))) (PreludeC-45Types-u--rangeFromTo_Range_Nat 0 (PreludeC-45Types-prim__integerToNat (- (let ((e-0 (vector-ref arg-0 0))) e-0) 1))))) (else 0))))) -(define PropertyTests-mkTestFS (lambda (arg-0 arg-1) (vector arg-0 arg-1 (vector "0.1.0" "test" '())))) -(define PreludeC-45Show-firstCharIs (lambda (arg-0 arg-1) (cond ((equal? arg-1 "") 0)(else (arg-0 (string-ref arg-1 0)))))) -(define PreludeC-45Show-showParens (lambda (arg-0 arg-1) (cond ((equal? arg-0 0) arg-1) (else (string-append "(" (string-append arg-1 ")")))))) -(define PreludeC-45Show-precCon (lambda (arg-0) (case (vector-ref arg-0 0) ((0) 0) ((1) 1) ((2) 2) ((3) 3) ((4) 4) ((5) 5) (else 6)))) -(define PreludeC-45Show-u--compare_Ord_Prec (lambda (arg-0 arg-1) (case (vector-ref arg-0 0) ((4) (let ((e-0 (vector-ref arg-0 1))) (case (vector-ref arg-1 0) ((4) (let ((e-1 (vector-ref arg-1 1))) (PreludeC-45EqOrd-u--compare_Ord_Integer e-0 e-1)))(else (PreludeC-45EqOrd-u--compare_Ord_Integer (PreludeC-45Show-precCon arg-0) (PreludeC-45Show-precCon arg-1))))))(else (PreludeC-45EqOrd-u--compare_Ord_Integer (PreludeC-45Show-precCon arg-0) (PreludeC-45Show-precCon arg-1)))))) -(define PreludeC-45Show-u--C-62C-61_Ord_Prec (lambda (arg-0 arg-1) (PreludeC-45EqOrd-u--C-47C-61_Eq_Ordering (PreludeC-45Show-u--compare_Ord_Prec arg-0 arg-1) 0))) -(define PreludeC-45Show-primNumShow (lambda (arg-1 arg-2 arg-3) (let ((u--str (arg-1 arg-3))) (PreludeC-45Show-showParens (let ((sc0 (PreludeC-45Show-u--C-62C-61_Ord_Prec arg-2 (vector 5 )))) (cond ((equal? sc0 1) (PreludeC-45Show-firstCharIs (lambda (arg-0) (PreludeC-45EqOrd-u--C-61C-61_Eq_Char arg-0 #\-)) u--str)) (else 0))) u--str)))) -(define PreludeC-45Show-u--showPrec_Show_Integer (lambda (ext-0 ext-1) (PreludeC-45Show-primNumShow (lambda (eta-0) (number->string eta-0)) ext-0 ext-1))) -(define PreludeC-45Show-u--show_Show_Integer (lambda (arg-0) (PreludeC-45Show-u--showPrec_Show_Integer (vector 0 ) arg-0))) -(define PreludeC-45Show-u--show_Show_Nat (lambda (arg-0) (PreludeC-45Show-u--show_Show_Integer arg-0))) -(define OchranceC-45FilesystemC-45Repair-repairBlock (lambda (arg-1 arg-2 arg-3 arg-4) (let ((e-0 (vector-ref arg-2 0))) (let ((e-1 (vector-ref arg-2 1))) (let ((e-2 (vector-ref arg-2 2))) (let ((sc0 (PreludeC-45Types-u--C-62C-61_Ord_Nat arg-3 e-0))) (cond ((equal? sc0 1) (let ((e-4 (car arg-1))) (let ((e-7 (vector-ref e-4 0))) (let ((e-9 (vector-ref e-7 1))) ((e-9 'erased) (vector 0 (vector 0 (vector 0 (string-append "Block index out of range: " (PreludeC-45Show-u--show_Show_Nat arg-3)))))))))) (else (let ((u--newState (vector e-0 (lambda (u--idx) (let ((sc1 (or (and (= u--idx arg-3) 1) 0))) (cond ((equal? sc1 1) (box arg-4)) (else (e-1 u--idx))))) e-2))) (let ((e-4 (car arg-1))) (let ((e-7 (vector-ref e-4 0))) (let ((e-9 (vector-ref e-7 1))) ((e-9 'erased) (vector 1 u--newState)))))))))))))) -(define OchranceC-45FilesystemC-45Repair-repairBlocks (lambda (arg-1 arg-2 arg-3) (if (null? arg-3) (let ((e-0 (vector-ref arg-2 0))) (let ((e-1 (vector-ref arg-2 1))) (let ((e-2 (vector-ref arg-2 2))) (let ((u--resultState (vector e-0 e-1 e-2))) (let ((e-4 (car arg-1))) (let ((e-7 (vector-ref e-4 0))) (let ((e-9 (vector-ref e-7 1))) ((e-9 'erased) (vector 1 u--resultState))))))))) (let ((e-2 (car arg-3))) (let ((e-3 (cdr arg-3))) (let ((e-6 (car e-2))) (let ((e-7 (cdr e-2))) (let ((e-0 (vector-ref arg-2 0))) (let ((e-1 (vector-ref arg-2 1))) (let ((e-4 (vector-ref arg-2 2))) (let ((u--oldStateC-39 (vector e-0 e-1 e-4))) (let ((e-8 (car arg-1))) (let ((e-10 (vector-ref e-8 1))) ((((e-10 'erased) 'erased) (OchranceC-45FilesystemC-45Repair-repairBlock arg-1 u--oldStateC-39 e-6 e-7)) (lambda (u--result) (case (vector-ref u--result 0) ((0) (let ((e-12 (vector-ref u--result 1))) (let ((e-14 (car arg-1))) (let ((e-17 (vector-ref e-14 0))) (let ((e-19 (vector-ref e-17 1))) ((e-19 'erased) (vector 0 e-12))))))) (else (let ((e-12 (vector-ref u--result 1))) (OchranceC-45FilesystemC-45Repair-repairBlocks arg-1 e-12 e-3))))))))))))))))))) -(define PreludeC-45Types-u--C-47C-61_Eq_Nat (lambda (arg-0 arg-1) (let ((sc0 (or (and (= arg-0 arg-1) 1) 0))) (cond ((equal? sc0 1) 0) (else 1))))) -(define OchranceC-45FilesystemC-45Repair-n--4605-2411-u--findHashForBlock (lambda (arg-1 arg-2 arg-4 arg-5) (if (null? arg-5) '() (let ((e-2 (car arg-5))) (let ((e-3 (cdr arg-5))) (let ((sc1 (PreludeC-45EqOrd-u--C-61C-61_Eq_String (let ((e-0 (car e-2))) e-0) arg-4))) (cond ((equal? sc1 1) (box (let ((e-1 (cdr e-2))) e-1))) (else (OchranceC-45FilesystemC-45Repair-n--4605-2411-u--findHashForBlock arg-1 arg-2 arg-4 e-3))))))))) -(define OchranceC-45FilesystemC-45Repair-n--4605-2410-u--buildHashFunction (lambda (arg-1 arg-2 arg-4 arg-5) (OchranceC-45FilesystemC-45Repair-n--4605-2411-u--findHashForBlock arg-1 arg-2 (string-append "block_" (PreludeC-45Show-u--show_Show_Nat arg-5)) arg-4))) -(define OchranceC-45FilesystemC-45Repair-repairFromSnapshot (lambda (arg-1 arg-2 arg-3) (let ((e-0 (vector-ref arg-2 0))) (let ((e-2 (vector-ref arg-2 2))) (let ((sc0 (PreludeC-45Types-u--C-47C-61_Eq_Nat e-0 (let ((e-4 (vector-ref arg-3 1))) e-4)))) (cond ((equal? sc0 1) (let ((e-4 (car arg-1))) (let ((e-7 (vector-ref e-4 0))) (let ((e-9 (vector-ref e-7 1))) ((e-9 'erased) (vector 0 (vector 0 (vector 0 "Block count mismatch")))))))) (else (let ((u--newBlockHashFunc (lambda (eta-0) (OchranceC-45FilesystemC-45Repair-n--4605-2410-u--buildHashFunction arg-1 arg-3 (let ((e-3 (vector-ref arg-3 2))) e-3) eta-0)))) (let ((u--newState (vector e-0 u--newBlockHashFunc e-2))) (let ((e-4 (car arg-1))) (let ((e-7 (vector-ref e-4 0))) (let ((e-9 (vector-ref e-7 1))) ((e-9 'erased) (vector 1 u--newState)))))))))))))) -(define PropertyTests-repairTests (lambda (ext-0) (let ((act-1 (PreludeC-45IO-prim__putStr "\xa;=== Property 3: Repair Idempotence ===\xa;" ext-0))) (let ((act-2 PropertyTests-initStats)) (let ((u--expectedHash (cons 2 "abcd1234"))) (let ((u--correctFS (PropertyTests-mkTestFS 2 (lambda (u--idx) (let ((sc0 (or (and (= u--idx 0) 1) 0))) (cond ((equal? sc0 1) (box u--expectedHash)) (else '()))))))) (let ((act-3 ((OchranceC-45FilesystemC-45Repair-repairBlock csegen-39 u--correctFS 0 u--expectedHash) ext-0))) (let ((u--check1 (case (vector-ref act-3 0) ((0) 0) (else (let ((e-5 (vector-ref act-3 1))) (PreludeC-45Types-u--C-61C-61_Eq_C-40MaybeC-32C-36aC-41 csegen-42 (let ((e-1 (vector-ref e-5 1))) (e-1 0)) (box u--expectedHash))))))) (let ((act-4 (PropertyTests-testCase "Repair already-correct block is idempotent" (lambda (eta-0) u--check1) act-2 ext-0))) (let ((u--wrongFS (PropertyTests-mkTestFS 3 (lambda (_-7156) (box (cons 2 "wrong")))))) (let ((u--target0 (cons 2 "correct0"))) (let ((u--target1 (cons 2 "correct1"))) (let ((act-5 ((OchranceC-45FilesystemC-45Repair-repairBlock csegen-39 u--wrongFS 0 u--target0) ext-0))) (let ((act-6 (case (vector-ref act-5 0) ((0) 0) (else (let ((e-5 (vector-ref act-5 1))) (let ((act-6 ((OchranceC-45FilesystemC-45Repair-repairBlock csegen-39 e-5 0 u--target0) ext-0))) (case (vector-ref act-6 0) ((0) 0) (else (let ((e-6 (vector-ref act-6 1))) (PreludeC-45Types-u--C-61C-61_Eq_C-40MaybeC-32C-36aC-41 csegen-42 (let ((e-1 (vector-ref e-6 1))) (e-1 0)) (box u--target0))))))))))) (let ((act-7 (PropertyTests-testCase "Double repair block 0" (lambda (eta-0) act-6) act-4 ext-0))) (let ((u--repairs (cons (cons 0 u--target0) (cons (cons 1 u--target1) '())))) (let ((act-8 ((OchranceC-45FilesystemC-45Repair-repairBlocks csegen-39 (PropertyTests-mkTestFS 3 (lambda (_-7213) (box (cons 2 "wrong")))) u--repairs) ext-0))) (let ((act-9 (case (vector-ref act-8 0) ((0) 0) (else (let ((e-5 (vector-ref act-8 1))) (let ((act-9 ((OchranceC-45FilesystemC-45Repair-repairBlocks csegen-39 e-5 u--repairs) ext-0))) (case (vector-ref act-9 0) ((0) 0) (else (let ((e-6 (vector-ref act-9 1))) (PropertyTests-fsStatesEqual e-5 e-6)))))))))) (let ((act-10 (PropertyTests-testCase "Batch repair then re-repair is idempotent" (lambda (eta-0) act-9) act-7 ext-0))) (let ((u--smallFS (PropertyTests-mkTestFS 2 (lambda (_-7247) '())))) (let ((act-11 ((OchranceC-45FilesystemC-45Repair-repairBlock csegen-39 u--smallFS 999 (cons 2 "x")) ext-0))) (let ((u--check6 (case (vector-ref act-11 0) ((0) (let ((e-2 (vector-ref act-11 1))) (case (vector-ref e-2 0) ((0) 1)(else 0))))(else 0)))) (let ((act-12 (PropertyTests-testCase "Repair out-of-range index returns QError" (lambda (eta-0) u--check6) act-10 ext-0))) (let ((u--snap (vector (cons 2 "root") 2 (cons (cons "block_0" (cons 2 "snap0")) (cons (cons "block_1" (cons 2 "snap1")) '()))))) (let ((act-13 ((OchranceC-45FilesystemC-45Repair-repairFromSnapshot csegen-39 (PropertyTests-mkTestFS 2 (lambda (_-7396) '())) u--snap) ext-0))) (let ((act-14 (case (vector-ref act-13 0) ((0) 0) (else (let ((e-5 (vector-ref act-13 1))) (let ((act-14 ((OchranceC-45FilesystemC-45Repair-repairFromSnapshot csegen-39 e-5 u--snap) ext-0))) (case (vector-ref act-14 0) ((0) 0) (else (let ((e-6 (vector-ref act-14 1))) (PropertyTests-fsStatesEqual e-5 e-6)))))))))) (let ((act-15 (PropertyTests-testCase "Snapshot repair then re-snapshot-repair is idempotent" (lambda (eta-0) act-14) act-12 ext-0))) (let ((u--wrongSnap (vector (cons 2 "root") 5 '()))) (let ((act-16 ((OchranceC-45FilesystemC-45Repair-repairFromSnapshot csegen-39 (PropertyTests-mkTestFS 2 (lambda (_-7440) '())) u--wrongSnap) ext-0))) (let ((u--check9 (case (vector-ref act-16 0) ((0) (let ((e-2 (vector-ref act-16 1))) (case (vector-ref e-2 0) ((0) 1)(else 0))))(else 0)))) (PropertyTests-testCase "Snapshot block count mismatch returns QError" (lambda (eta-0) u--check9) act-15 ext-0))))))))))))))))))))))))))))))) -(define PropertyTests-nibbleBoundary (cons 15 (cons 240 (cons 9 (cons 144 (cons 171 (cons 186 (cons 205 (cons 220 '()))))))))) -(define DataC-45Vect-u--C-47C-61_Eq_C-40C-40VectC-32C-36nC-41C-32C-36aC-41 (lambda (arg-2 arg-3 arg-4) (let ((sc0 (DataC-45Vect-u--C-61C-61_Eq_C-40C-40VectC-32C-36nC-41C-32C-36aC-41 arg-2 arg-3 arg-4))) (cond ((equal? sc0 1) 0) (else 1))))) -(define PropertyTests-merkle2LeafNonTrivial (let ((u--h1 (DataC-45Vect-replicate 32 1))) (let ((u--h2 (DataC-45Vect-replicate 32 2))) (let ((u--tree (vector 1 (vector 0 u--h1) (vector 0 u--h2)))) (let ((u--root (OchranceC-45FilesystemC-45Merkle-rootHashBytes u--tree))) (let ((sc0 (DataC-45Vect-u--C-47C-61_Eq_C-40C-40VectC-32C-36nC-41C-32C-36aC-41 csegen-2 u--root u--h1))) (cond ((equal? sc0 1) (DataC-45Vect-u--C-47C-61_Eq_C-40C-40VectC-32C-36nC-41C-32C-36aC-41 csegen-2 u--root u--h2)) (else 0)))))))) -(define PropertyTests-merkleBuild1 (let ((u--h (cons (DataC-45Vect-replicate 32 7) '()))) (let ((u--tree (OchranceC-45FilesystemC-45Merkle-buildMerkleTree 0 u--h))) (DataC-45Vect-u--C-61C-61_Eq_C-40C-40VectC-32C-36nC-41C-32C-36aC-41 csegen-2 (OchranceC-45FilesystemC-45Merkle-rootHashBytes u--tree) (DataC-45Vect-replicate 32 7))))) -(define PropertyTests-merkleBuild2 (let ((u--h1 (DataC-45Vect-replicate 32 1))) (let ((u--h2 (DataC-45Vect-replicate 32 2))) (let ((u--tree (OchranceC-45FilesystemC-45Merkle-buildMerkleTree 1 (cons u--h1 (cons u--h2 '()))))) (let ((u--expectedRoot (OchranceC-45FFIC-45Crypto-hashPairStub u--h1 u--h2))) (DataC-45Vect-u--C-61C-61_Eq_C-40C-40VectC-32C-36nC-41C-32C-36aC-41 csegen-2 (OchranceC-45FilesystemC-45Merkle-rootHashBytes u--tree) u--expectedRoot)))))) -(define OchranceC-45FilesystemC-45Merkle-verifyProof (lambda (arg-0 arg-1 arg-2) (if (null? arg-2) (DataC-45Vect-u--C-61C-61_Eq_C-40C-40VectC-32C-36nC-41C-32C-36aC-41 csegen-2 arg-0 arg-1) (let ((e-2 (car arg-2))) (let ((e-3 (cdr arg-2))) (let ((e-6 (car e-2))) (let ((e-7 (cdr e-2))) (cond ((equal? e-6 0) (let ((u--parent (OchranceC-45FFIC-45Crypto-hashPairStub arg-1 e-7))) (OchranceC-45FilesystemC-45Merkle-verifyProof arg-0 u--parent e-3))) (else (let ((u--parent (OchranceC-45FFIC-45Crypto-hashPairStub e-7 arg-1))) (OchranceC-45FilesystemC-45Merkle-verifyProof arg-0 u--parent e-3))))))))))) -(define PropertyTests-merkleProofLeftLeaf (let ((u--h1 (DataC-45Vect-replicate 32 1))) (let ((u--h2 (DataC-45Vect-replicate 32 2))) (let ((u--root (OchranceC-45FFIC-45Crypto-hashPairStub u--h1 u--h2))) (let ((u--prf (cons (cons 0 u--h2) '()))) (OchranceC-45FilesystemC-45Merkle-verifyProof u--root u--h1 u--prf)))))) -(define PropertyTests-merkleProofRightLeaf (let ((u--h1 (DataC-45Vect-replicate 32 1))) (let ((u--h2 (DataC-45Vect-replicate 32 2))) (let ((u--root (OchranceC-45FFIC-45Crypto-hashPairStub u--h1 u--h2))) (let ((u--prf (cons (cons 1 u--h1) '()))) (OchranceC-45FilesystemC-45Merkle-verifyProof u--root u--h2 u--prf)))))) -(define PropertyTests-merkleProofSingleLeaf (let ((u--h (DataC-45Vect-replicate 32 5))) (OchranceC-45FilesystemC-45Merkle-verifyProof u--h u--h '()))) -(define PropertyTests-merkleProofWrongSibling (let ((u--h1 (DataC-45Vect-replicate 32 1))) (let ((u--h2 (DataC-45Vect-replicate 32 2))) (let ((u--h3 (DataC-45Vect-replicate 32 3))) (let ((u--root (OchranceC-45FFIC-45Crypto-hashPairStub u--h1 u--h2))) (let ((u--prf (cons (cons 0 u--h3) '()))) (let ((sc0 (OchranceC-45FilesystemC-45Merkle-verifyProof u--root u--h1 u--prf))) (cond ((equal? sc0 1) 0) (else 1))))))))) -(define PropertyTests-merkleSingleLeaf (let ((u--h (DataC-45Vect-replicate 32 42))) (let ((u--tree (vector 0 u--h))) (DataC-45Vect-u--C-61C-61_Eq_C-40C-40VectC-32C-36nC-41C-32C-36aC-41 csegen-2 (OchranceC-45FilesystemC-45Merkle-rootHashBytes u--tree) u--h)))) -(define PropertyTests-merkleTests (lambda (ext-0) (let ((act-1 (PreludeC-45IO-prim__putStr "\xa;=== Property 2: Merkle Tree Properties ===\xa;" ext-0))) (let ((act-2 PropertyTests-initStats)) (let ((act-3 (PropertyTests-testCase "Single leaf returns its hash" (lambda (eta-0) PropertyTests-merkleSingleLeaf) act-2 ext-0))) (let ((act-4 (PropertyTests-testCase "2-leaf tree root != either leaf" (lambda (eta-0) PropertyTests-merkle2LeafNonTrivial) act-3 ext-0))) (let ((act-5 (PropertyTests-testCase "buildMerkleTree 1 hash" (lambda (eta-0) PropertyTests-merkleBuild1) act-4 ext-0))) (let ((act-6 (PropertyTests-testCase "buildMerkleTree 2 hashes" (lambda (eta-0) PropertyTests-merkleBuild2) act-5 ext-0))) (let ((act-7 (PropertyTests-testCase "Proof: single leaf (empty proof)" (lambda (eta-0) PropertyTests-merkleProofSingleLeaf) act-6 ext-0))) (let ((act-8 (PropertyTests-testCase "Proof: left leaf inclusion" (lambda (eta-0) PropertyTests-merkleProofLeftLeaf) act-7 ext-0))) (let ((act-9 (PropertyTests-testCase "Proof: right leaf inclusion" (lambda (eta-0) PropertyTests-merkleProofRightLeaf) act-8 ext-0))) (let ((act-10 (PropertyTests-testCase "Proof: wrong sibling fails" (lambda (eta-0) PropertyTests-merkleProofWrongSibling) act-9 ext-0))) (PropertyTests-testCase "4-leaf tree buildMerkleTree consistency" (lambda (eta-0) PropertyTests-n--7143-6769-u--merkle4Leaf) act-10 ext-0))))))))))))) -(define PropertyTests-allOnes4 (cons 255 (cons 255 (cons 255 (cons 255 '()))))) -(define PropertyTests-allZeros4 (cons 0 (cons 0 (cons 0 (cons 0 '()))))) -(define PropertyTests-ascending8 (cons 0 (cons 17 (cons 34 (cons 51 (cons 68 (cons 85 (cons 102 (cons 119 '()))))))))) -(define PropertyTests-emptyBytes '()) -(define PropertyTests-hexDigitBytes (cons 0 (cons 1 (cons 2 (cons 3 (cons 4 (cons 5 (cons 6 (cons 7 (cons 8 (cons 9 (cons 10 (cons 11 (cons 12 (cons 13 (cons 14 (cons 15 '()))))))))))))))))) -(define PreludeC-45TypesC-45List-reverseOnto (lambda (arg-1 arg-2) (if (null? arg-2) arg-1 (let ((e-2 (car arg-2))) (let ((e-3 (cdr arg-2))) (PreludeC-45TypesC-45List-reverseOnto (cons e-2 arg-1) e-3)))))) -(define PreludeC-45TypesC-45List-reverse (lambda (ext-0) (PreludeC-45TypesC-45List-reverseOnto '() ext-0))) -(define PreludeC-45TypesC-45List-tailRecAppend (lambda (arg-1 arg-2) (PreludeC-45TypesC-45List-reverseOnto arg-2 (PreludeC-45TypesC-45List-reverse arg-1)))) -(define PreludeC-45Num-u--mod_Integral_Bits8 (lambda (arg-0 arg-1) (let ((sc0 (PreludeC-45EqOrd-u--C-61C-61_Eq_Bits8 arg-1 0))) (cond ((equal? sc0 0) (blodwen-euclidMod arg-0 arg-1))(else (blodwen-error-quit (string-append "ERROR: " "Unhandled input for Prelude.Num.case block in mod at Prelude.Num:271:3--273:42"))))))) -(define OchranceC-45UtilC-45Hex-nibbleToHexChar (lambda (arg-0) (let ((sc0 (PreludeC-45Num-u--mod_Integral_Bits8 arg-0 16))) (cond ((equal? sc0 0) #\0) ((equal? sc0 1) #\1) ((equal? sc0 2) #\2) ((equal? sc0 3) #\3) ((equal? sc0 4) #\4) ((equal? sc0 5) #\5) ((equal? sc0 6) #\6) ((equal? sc0 7) #\7) ((equal? sc0 8) #\8) ((equal? sc0 9) #\9) ((equal? sc0 10) #\a) ((equal? sc0 11) #\b) ((equal? sc0 12) #\c) ((equal? sc0 13) #\d) ((equal? sc0 14) #\e)(else #\f))))) -(define PreludeC-45Num-u--div_Integral_Bits8 (lambda (arg-0 arg-1) (let ((sc0 (PreludeC-45EqOrd-u--C-61C-61_Eq_Bits8 arg-1 0))) (cond ((equal? sc0 0) (bu/ arg-0 arg-1 8))(else (blodwen-error-quit (string-append "ERROR: " "Unhandled input for Prelude.Num.case block in div at Prelude.Num:268:3--270:42"))))))) -(define OchranceC-45UtilC-45Hex-byteToHexPair (lambda (arg-0) (let ((u--hi (PreludeC-45Num-u--div_Integral_Bits8 arg-0 16))) (let ((u--lo (PreludeC-45Num-u--mod_Integral_Bits8 arg-0 16))) (cons (OchranceC-45UtilC-45Hex-nibbleToHexChar u--hi) (OchranceC-45UtilC-45Hex-nibbleToHexChar u--lo)))))) -(define OchranceC-45UtilC-45Hex-n--5725-9257-u--toPair (lambda (arg-0 arg-1) (let ((sc0 (OchranceC-45UtilC-45Hex-byteToHexPair arg-1))) (let ((e-2 (car sc0))) (let ((e-3 (cdr sc0))) (cons e-2 (cons e-3 '()))))))) -(define OchranceC-45UtilC-45Hex-bytesToHex (lambda (arg-0) (PreludeC-45Types-fastPack (PreludeC-45Types-u--foldMap_Foldable_List (cons (lambda (arg-8497) (lambda (arg-8500) (PreludeC-45TypesC-45List-tailRecAppend arg-8497 arg-8500))) '()) (lambda (eta-0) (OchranceC-45UtilC-45Hex-n--5725-9257-u--toPair arg-0 eta-0)) arg-0)))) -(define PreludeC-45TypesC-45List-lengthPlus (lambda (arg-1 arg-2) (if (null? arg-2) arg-1 (let ((e-3 (cdr arg-2))) (PreludeC-45TypesC-45List-lengthPlus (+ arg-1 1) e-3))))) -(define PreludeC-45TypesC-45List-lengthTR (lambda (ext-0) (PreludeC-45TypesC-45List-lengthPlus 0 ext-0))) -(define PropertyTests-hexEncodingLength (lambda (arg-0) (let ((u--encoded (OchranceC-45UtilC-45Hex-bytesToHex arg-0))) (or (and (= (PreludeC-45TypesC-45List-lengthTR (PreludeC-45Types-fastUnpack u--encoded)) (* (PreludeC-45TypesC-45List-lengthTR arg-0) 2)) 1) 0)))) -(define PropertyTests-hexEncodingValid (lambda (arg-0) (let ((u--encoded (OchranceC-45UtilC-45Hex-bytesToHex arg-0))) (PreludeC-45Types-u--foldMap_Foldable_List csegen-123 (lambda (eta-0) (PropertyTests-n--5854-5594-u--isHexChar arg-0 eta-0)) (PreludeC-45Types-fastUnpack u--encoded))))) -(define OchranceC-45UtilC-45Hex-hexCharToNibble (lambda (arg-0) (cond ((equal? arg-0 #\0) (box 0)) ((equal? arg-0 #\1) (box 1)) ((equal? arg-0 #\2) (box 2)) ((equal? arg-0 #\3) (box 3)) ((equal? arg-0 #\4) (box 4)) ((equal? arg-0 #\5) (box 5)) ((equal? arg-0 #\6) (box 6)) ((equal? arg-0 #\7) (box 7)) ((equal? arg-0 #\8) (box 8)) ((equal? arg-0 #\9) (box 9)) ((equal? arg-0 #\a) (box 10)) ((equal? arg-0 #\b) (box 11)) ((equal? arg-0 #\c) (box 12)) ((equal? arg-0 #\d) (box 13)) ((equal? arg-0 #\e) (box 14)) ((equal? arg-0 #\f) (box 15)) ((equal? arg-0 #\A) (box 10)) ((equal? arg-0 #\B) (box 11)) ((equal? arg-0 #\C) (box 12)) ((equal? arg-0 #\D) (box 13)) ((equal? arg-0 #\E) (box 14)) ((equal? arg-0 #\F) (box 15))(else '())))) -(define PreludeC-45Types-u--C-62C-62C-61_Monad_Maybe (lambda (arg-2 arg-3) (if (null? arg-2) '() (let ((e-2 (unbox arg-2))) (arg-3 e-2))))) -(define OchranceC-45UtilC-45Hex-hexPairToByte (lambda (arg-0 arg-1) (PreludeC-45Types-u--C-62C-62C-61_Monad_Maybe (OchranceC-45UtilC-45Hex-hexCharToNibble arg-0) (lambda (u--hiNibble) (PreludeC-45Types-u--C-62C-62C-61_Monad_Maybe (OchranceC-45UtilC-45Hex-hexCharToNibble arg-1) (lambda (u--loNibble) (box (bu+ (bu* u--hiNibble 16 8) u--loNibble 8)))))))) -(define OchranceC-45UtilC-45Hex-parsePairs (lambda (arg-0) (if (null? arg-0) (box '()) (let ((e-2 (car arg-0))) (let ((e-3 (cdr arg-0))) (if (null? e-3) '() (let ((e-6 (car e-3))) (let ((e-7 (cdr e-3))) (PreludeC-45Types-u--C-62C-62C-61_Monad_Maybe (OchranceC-45UtilC-45Hex-hexPairToByte e-2 e-6) (lambda (u--byte) (PreludeC-45Types-u--C-62C-62C-61_Monad_Maybe (OchranceC-45UtilC-45Hex-parsePairs e-7) (lambda (u--restBytes) (box (cons u--byte u--restBytes)))))))))))))) -(define OchranceC-45UtilC-45Hex-hexStringToBytes (lambda (arg-0) (OchranceC-45UtilC-45Hex-parsePairs (PreludeC-45Types-fastUnpack arg-0)))) -(define PreludeC-45Types-u--C-61C-61_Eq_C-40ListC-32C-36aC-41 (lambda (arg-1 arg-2 arg-3) (if (null? arg-2) (if (null? arg-3) 1 0) (let ((e-2 (car arg-2))) (let ((e-3 (cdr arg-2))) (if (null? arg-3) 0 (let ((e-6 (car arg-3))) (let ((e-7 (cdr arg-3))) (let ((sc2 (let ((e-1 (car arg-1))) ((e-1 e-2) e-6)))) (cond ((equal? sc2 1) (PreludeC-45Types-u--C-61C-61_Eq_C-40ListC-32C-36aC-41 arg-1 e-3 e-7)) (else 0))))))))))) -(define PropertyTests-hexRoundtrip (lambda (arg-0) (let ((u--encoded (OchranceC-45UtilC-45Hex-bytesToHex arg-0))) (let ((sc0 (OchranceC-45UtilC-45Hex-hexStringToBytes u--encoded))) (if (null? sc0) 0 (let ((e-2 (unbox sc0))) (PreludeC-45Types-u--C-61C-61_Eq_C-40ListC-32C-36aC-41 csegen-2 e-2 arg-0))))))) -(define OchranceC-45UtilC-45Hex-n--5490-9033-u--toVect (lambda (arg-0 arg-1 arg-2 arg-3) (cond ((equal? arg-2 0) (if (null? arg-3) (box '()) '()))(else (let ((e-0 (- arg-2 1))) (if (null? arg-3) '() (let ((e-3 (car arg-3))) (let ((e-4 (cdr arg-3))) (PreludeC-45Types-u--C-62C-62C-61_Monad_Maybe (OchranceC-45UtilC-45Hex-n--5490-9033-u--toVect arg-0 arg-1 e-0 e-4) (lambda (u--rest) (box (cons e-3 u--rest)))))))))))) -(define OchranceC-45UtilC-45Hex-hexStringToVect (lambda (arg-0 arg-1) (PreludeC-45Types-u--C-62C-62C-61_Monad_Maybe (OchranceC-45UtilC-45Hex-hexStringToBytes arg-1) (lambda (u--bytes) (let ((sc0 (or (and (= (PreludeC-45TypesC-45List-lengthTR u--bytes) arg-0) 1) 0))) (cond ((equal? sc0 0) '()) (else (OchranceC-45UtilC-45Hex-n--5490-9033-u--toVect arg-1 arg-0 arg-0 u--bytes)))))))) -(define DataC-45Vect-foldrImpl (lambda (arg-3 arg-4 arg-5 arg-6) (if (null? arg-6) (arg-5 arg-4) (let ((e-3 (car arg-6))) (let ((e-4 (cdr arg-6))) (DataC-45Vect-foldrImpl arg-3 arg-4 (lambda (eta-0) (arg-5 ((arg-3 e-3) eta-0))) e-4)))))) -(define DataC-45Vect-u--foldr_Foldable_C-40VectC-32C-36nC-41 (lambda (arg-3 arg-4 arg-5) (DataC-45Vect-foldrImpl arg-3 arg-4 (lambda (eta-0) eta-0) arg-5))) -(define DataC-45Vect-u--toList_Foldable_C-40VectC-32C-36nC-41 (lambda (ext-0) (DataC-45Vect-u--foldr_Foldable_C-40VectC-32C-36nC-41 (lambda (eta-0) (lambda (eta-1) (cons eta-0 eta-1))) '() ext-0))) -(define OchranceC-45UtilC-45Hex-vectToHex (lambda (arg-1) (OchranceC-45UtilC-45Hex-bytesToHex (DataC-45Vect-u--toList_Foldable_C-40VectC-32C-36nC-41 arg-1)))) -(define PropertyTests-hexRoundtripVect (lambda (arg-0 arg-1) (let ((u--encoded (OchranceC-45UtilC-45Hex-vectToHex arg-1))) (let ((sc0 (OchranceC-45UtilC-45Hex-hexStringToVect arg-0 u--encoded))) (if (null? sc0) 0 (let ((e-2 (unbox sc0))) (PreludeC-45Types-u--C-61C-61_Eq_C-40ListC-32C-36aC-41 csegen-2 (DataC-45Vect-u--toList_Foldable_C-40VectC-32C-36nC-41 e-2) (DataC-45Vect-u--toList_Foldable_C-40VectC-32C-36nC-41 arg-1)))))))) -(define PropertyTests-hexTests (lambda (ext-0) (let ((act-1 (PreludeC-45IO-prim__putStr "\xa;=== Property 1: Hex Encoding Roundtrip ===\xa;" ext-0))) (let ((act-2 PropertyTests-initStats)) (let ((act-3 (PropertyTests-testCase "Roundtrip empty bytes" (lambda (eta-0) (PropertyTests-hexRoundtrip PropertyTests-emptyBytes)) act-2 ext-0))) (let ((act-4 (PropertyTests-testCase "Roundtrip all zeros" (lambda (eta-0) (PropertyTests-hexRoundtrip PropertyTests-allZeros4)) act-3 ext-0))) (let ((act-5 (PropertyTests-testCase "Roundtrip all 0xFF" (lambda (eta-0) (PropertyTests-hexRoundtrip PropertyTests-allOnes4)) act-4 ext-0))) (let ((act-6 (PropertyTests-testCase "Roundtrip ascending" (lambda (eta-0) (PropertyTests-hexRoundtrip PropertyTests-ascending8)) act-5 ext-0))) (let ((act-7 (PropertyTests-testCase "Roundtrip nibble boundary" (lambda (eta-0) (PropertyTests-hexRoundtrip PropertyTests-nibbleBoundary)) act-6 ext-0))) (let ((act-8 (PropertyTests-testCase "Roundtrip hex digits" (lambda (eta-0) (PropertyTests-hexRoundtrip PropertyTests-hexDigitBytes)) act-7 ext-0))) (let ((act-9 (PropertyTests-testCase "Roundtrip byte 0x00" (lambda (eta-0) (PropertyTests-hexRoundtrip (cons 0 '()))) act-8 ext-0))) (let ((act-10 (PropertyTests-testCase "Roundtrip byte 0xFF" (lambda (eta-0) (PropertyTests-hexRoundtrip (cons 255 '()))) act-9 ext-0))) (let ((act-11 (PropertyTests-testCase "Roundtrip byte 0x0F" (lambda (eta-0) (PropertyTests-hexRoundtrip (cons 15 '()))) act-10 ext-0))) (let ((act-12 (PropertyTests-testCase "Roundtrip byte 0xF0" (lambda (eta-0) (PropertyTests-hexRoundtrip (cons 240 '()))) act-11 ext-0))) (let ((act-13 (PropertyTests-testCase "Roundtrip Vect [0xDE, 0xAD, 0xBE, 0xEF]" (lambda (eta-0) (PropertyTests-hexRoundtripVect 4 (cons 222 (cons 173 (cons 190 (cons 239 '())))))) act-12 ext-0))) (let ((act-14 (PropertyTests-testCase "Roundtrip Vect 32 zeros" (lambda (eta-0) (PropertyTests-hexRoundtripVect 32 (DataC-45Vect-replicate 32 0))) act-13 ext-0))) (let ((act-15 (PropertyTests-testCase "Roundtrip Vect 32 0xFF" (lambda (eta-0) (PropertyTests-hexRoundtripVect 32 (DataC-45Vect-replicate 32 255))) act-14 ext-0))) (let ((act-16 (PropertyTests-testCase "Encoding valid chars (ascending)" (lambda (eta-0) (PropertyTests-hexEncodingValid PropertyTests-ascending8)) act-15 ext-0))) (let ((act-17 (PropertyTests-testCase "Encoding valid chars (nibble)" (lambda (eta-0) (PropertyTests-hexEncodingValid PropertyTests-nibbleBoundary)) act-16 ext-0))) (let ((act-18 (PropertyTests-testCase "Encoding length (empty)" (lambda (eta-0) (PropertyTests-hexEncodingLength PropertyTests-emptyBytes)) act-17 ext-0))) (let ((act-19 (PropertyTests-testCase "Encoding length (4 bytes)" (lambda (eta-0) (PropertyTests-hexEncodingLength PropertyTests-allZeros4)) act-18 ext-0))) (let ((act-20 (PropertyTests-testCase "Encoding length (8 bytes)" (lambda (eta-0) (PropertyTests-hexEncodingLength PropertyTests-ascending8)) act-19 ext-0))) (let ((act-21 (PropertyTests-testCase "Decode rejects odd length" (lambda (eta-0) (let ((sc0 (OchranceC-45UtilC-45Hex-hexStringToBytes "abc"))) (if (null? sc0) 1 0))) act-20 ext-0))) (let ((act-22 (PropertyTests-testCase "Decode rejects non-hex 'gg'" (lambda (eta-0) (let ((sc0 (OchranceC-45UtilC-45Hex-hexStringToBytes "gg"))) (if (null? sc0) 1 0))) act-21 ext-0))) (let ((act-23 (PropertyTests-testCase "Decode rejects spaces" (lambda (eta-0) (let ((sc0 (OchranceC-45UtilC-45Hex-hexStringToBytes "ab cd"))) (if (null? sc0) 1 0))) act-22 ext-0))) (let ((act-24 (PropertyTests-testCase "Decode uppercase hex 'ABCD'" (lambda (eta-0) (let ((sc0 (OchranceC-45UtilC-45Hex-hexStringToBytes "ABCD"))) (if (null? sc0) 0 1))) act-23 ext-0))) (PropertyTests-testCase "Decode mixed case 'aB0F'" (lambda (eta-0) (let ((sc0 (OchranceC-45UtilC-45Hex-hexStringToBytes "aB0F"))) (if (null? sc0) 0 1))) act-24 ext-0))))))))))))))))))))))))))) -(define PropertyTests-main (lambda (ext-0) (let ((act-1 (PreludeC-45IO-prim__putStr "===========================================\xa;" ext-0))) (let ((act-2 (PreludeC-45IO-prim__putStr "Ochrance Property-Based Test Suite\xa;" ext-0))) (let ((act-3 (PreludeC-45IO-prim__putStr "===========================================\xa;" ext-0))) (let ((act-4 (PropertyTests-hexTests ext-0))) (let ((act-5 (PropertyTests-merkleTests ext-0))) (let ((act-6 (PropertyTests-repairTests ext-0))) (let ((act-7 (PropertyTests-validationTests ext-0))) (let ((u--totalPassed (+ (+ (+ (let ((e-0 (vector-ref act-4 0))) e-0) (let ((e-0 (vector-ref act-5 0))) e-0)) (let ((e-0 (vector-ref act-6 0))) e-0)) (let ((e-0 (vector-ref act-7 0))) e-0)))) (let ((u--totalFailed (+ (+ (+ (let ((e-1 (vector-ref act-4 1))) e-1) (let ((e-1 (vector-ref act-5 1))) e-1)) (let ((e-1 (vector-ref act-6 1))) e-1)) (let ((e-1 (vector-ref act-7 1))) e-1)))) (let ((u--totalCount (+ (+ (+ (let ((e-2 (vector-ref act-4 2))) e-2) (let ((e-2 (vector-ref act-5 2))) e-2)) (let ((e-2 (vector-ref act-6 2))) e-2)) (let ((e-2 (vector-ref act-7 2))) e-2)))) (let ((act-8 (PreludeC-45IO-prim__putStr "\xa;===========================================\xa;" ext-0))) (let ((act-9 (PreludeC-45IO-prim__putStr (string-append (string-append "Property Tests: " (string-append (PreludeC-45Show-u--show_Show_Nat u--totalPassed) (string-append "/" (string-append (PreludeC-45Show-u--show_Show_Nat u--totalCount) (string-append " passed, " (string-append (PreludeC-45Show-u--show_Show_Nat u--totalFailed) " failed")))))) "\xa;") ext-0))) (PreludeC-45IO-prim__putStr "===========================================\xa;" ext-0))))))))))))))) -(define PreludeC-45EqOrd-compareInteger (lambda (ext-0 ext-1) (PreludeC-45EqOrd-u--compare_Ord_Integer ext-0 ext-1))) -(define PrimIO-unsafeCreateWorld (lambda (arg-1) (arg-1 #f))) -(define PrimIO-unsafePerformIO (lambda (arg-1) (PrimIO-unsafeCreateWorld (lambda (u--w) (arg-1 u--w))))) -(collect-request-handler - (let* ([gc-counter 1] - [log-radix 2] - [radix-mask (sub1 (bitwise-arithmetic-shift 1 log-radix))] - [major-gc-factor 2] - [trigger-major-gc-allocated (* major-gc-factor (bytes-allocated))]) - (lambda () - (cond - [(>= (bytes-allocated) trigger-major-gc-allocated) - ;; Force a major collection if memory use has doubled - (collect (collect-maximum-generation)) - (blodwen-run-finalisers) - (set! trigger-major-gc-allocated (* major-gc-factor (bytes-allocated)))] - [else - ;; Imitate the built-in rule, but without ever going to a major collection - (let ([this-counter gc-counter]) - (if (> (add1 this-counter) - (bitwise-arithmetic-shift-left 1 (* log-radix (sub1 (collect-maximum-generation))))) - (set! gc-counter 1) - (set! gc-counter (add1 this-counter))) - (collect - ;; Find the minor generation implied by the counter - (let loop ([c this-counter] [gen 0]) - (cond - [(zero? (bitwise-and c radix-mask)) - (loop (bitwise-arithmetic-shift-right c log-radix) - (add1 gen))] - [else - gen]))))])))) -(PrimIO-unsafePerformIO (lambda (eta-0) (PropertyTests-main eta-0))) - (collect-request-handler (lambda () (collect (collect-maximum-generation)) (blodwen-run-finalisers))) - (collect-rendezvous) - - ) \ No newline at end of file diff --git a/tests/property/build/ttc/2025081600/PropertyTests.ttc b/tests/property/build/ttc/2025081600/PropertyTests.ttc deleted file mode 100644 index 1aecac8cc2d00fb4cf720a507f28b78522893220..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 490896 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 bE#MX9{wnw6y#nYwJy#cFtbVZ%miGS#70FCm diff --git a/tests/property/build/ttc/2025081600/PropertyTests.ttm b/tests/property/build/ttc/2025081600/PropertyTests.ttm deleted file mode 100644 index acba471833aaa2b870ab298a016594576a27cc61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216746 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 From 9a0a17f035e644c1ba8d2b8fbfed5933c8d679a6 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 3 Jun 2026 21:39:53 +0000 Subject: [PATCH 02/15] fix(a2ml): prove parser total, fix inverted unless, enforce EOF - Refactor the refs and policy field loops to recurse structurally on the token list (folding in single-use helpers parseRef/parseNumberField/ parseBoolField), removing every 'covering' annotation. The parser is now provably total by structure, satisfying the totality invariant. - Fix an inverted 'unless' helper (3 copies) that raised the error branch when the section field WAS correct, so every well-formed manifest was rejected. Types/totality could not catch this semantic inversion. - Enforce end-of-input in parse: reject trailing tokens (e.g. duplicate @sections) so malformed input cannot smuggle ignored data past the parser. Verified: 16/16 A2ML parser tests and 47/47 property tests pass. --- ochrance-core/Ochrance/A2ML/Parser.idr | 147 ++++++++++--------------- 1 file changed, 59 insertions(+), 88 deletions(-) diff --git a/ochrance-core/Ochrance/A2ML/Parser.idr b/ochrance-core/Ochrance/A2ML/Parser.idr index 21dfd73..676cf50 100644 --- a/ochrance-core/Ochrance/A2ML/Parser.idr +++ b/ochrance-core/Ochrance/A2ML/Parser.idr @@ -82,28 +82,6 @@ parseField (MkState (IDENT name :: EQUALS :: STRING value :: rest) pos) = parseField (MkState (tok :: _) pos) = Left (UnexpectedToken "IDENT = STRING" tok pos) -||| Parse a number field: IDENT EQUALS NUMBER -total -parseNumberField : ParserState -> Either ParseError (String, Integer, ParserState) -parseNumberField (MkState [] pos) = - Left (UnexpectedEOF "number field") -parseNumberField (MkState (IDENT name :: EQUALS :: NUMBER value :: rest) pos) = - Right (name, value, MkState rest (pos + 3)) -parseNumberField (MkState (tok :: _) pos) = - Left (UnexpectedToken "IDENT = NUMBER" tok pos) - -||| Parse a boolean field: IDENT EQUALS IDENT("true"|"false") -total -parseBoolField : ParserState -> Either ParseError (String, Bool, ParserState) -parseBoolField (MkState [] pos) = - Left (UnexpectedEOF "boolean field") -parseBoolField (MkState (IDENT name :: EQUALS :: IDENT "true" :: rest) pos) = - Right (name, True, MkState rest (pos + 3)) -parseBoolField (MkState (IDENT name :: EQUALS :: IDENT "false" :: rest) pos) = - Right (name, False, MkState rest (pos + 3)) -parseBoolField (MkState (tok :: _) pos) = - Left (UnexpectedToken "IDENT = IDENT(true|false)" tok pos) - ||| Parse the @manifest section body. ||| Expects: version = "..." subsystem = "..." [timestamp = "..."] } total @@ -139,41 +117,32 @@ parseManifestBody st = do Left (UnexpectedEOF "manifest body") where unless : Bool -> Either ParseError () -> Either ParseError () - unless True err = err - unless False _ = Right () + unless True _ = Right () + unless False err = err -||| Parse a single ref entry: IDENT COLON HASH +||| Parse the @refs section body, accumulating refs until RBRACE. +||| +||| Total by structural recursion: the inner loop matches on the token +||| list and each accepted ref (IDENT COLON HASH) recurses on a strict +||| tail, so the argument provably shrinks (no fuel, no unsafe escape hatch). total -parseRef : ParserState -> Either ParseError (Ref, ParserState) -parseRef (MkState [] pos) = - Left (UnexpectedEOF "ref entry") -parseRef (MkState (IDENT name :: COLON :: HASH alg value :: rest) pos) = - case parseHashAlgorithm alg of - Just algorithm => - let hash = MkHash algorithm value - ref = MkRef name hash - in Right (ref, MkState rest (pos + 3)) - Nothing => - Left (InvalidValue "ref" name ("unsupported hash algorithm: " ++ alg) pos) -parseRef (MkState (tok :: _) pos) = - Left (UnexpectedToken "IDENT : HASH" tok pos) - -mutual - ||| Parse the @refs section body (accumulates refs until RBRACE). - ||| Uses mutual recursion to accumulate refs. - covering - parseRefsBody : ParserState -> Either ParseError (List Ref, ParserState) - parseRefsBody st = parseRefsLoop st [] - - covering - parseRefsLoop : ParserState -> List Ref -> Either ParseError (List Ref, ParserState) - parseRefsLoop st@(MkState [] pos) acc = - Left (UnexpectedEOF "refs body") - parseRefsLoop st@(MkState (RBRACE :: rest) pos) acc = - Right (reverse acc, MkState rest (S pos)) - parseRefsLoop st acc = do - (ref, st1) <- parseRef st - parseRefsLoop st1 (ref :: acc) +parseRefsBody : ParserState -> Either ParseError (List Ref, ParserState) +parseRefsBody (MkState toks pos) = go toks pos [] + where + go : List Token -> Nat -> List Ref + -> Either ParseError (List Ref, ParserState) + go [] pos acc = + Left (UnexpectedEOF "refs body") + go (RBRACE :: rest) pos acc = + Right (reverse acc, MkState rest (S pos)) + go (IDENT name :: COLON :: HASH alg value :: rest) pos acc = + case parseHashAlgorithm alg of + Just algorithm => + go rest (pos + 3) (MkRef name (MkHash algorithm value) :: acc) + Nothing => + Left (InvalidValue "ref" name ("unsupported hash algorithm: " ++ alg) pos) + go (tok :: _) pos acc = + Left (UnexpectedToken "IDENT : HASH" tok pos) ||| Parse the optional @attestation section. ||| Returns Nothing if @attestation is not present. @@ -208,8 +177,8 @@ parseOptionalAttestation st = _ => Right (Nothing, st) where unless : Bool -> Either ParseError () -> Either ParseError () - unless True err = err - unless False _ = Right () + unless True _ = Right () + unless False err = err ||| Parse verification mode from string total @@ -221,7 +190,11 @@ parseVerificationMode _ = Nothing ||| Parse the optional @policy section. ||| Returns Nothing if @policy is not present. -covering +||| +||| Total by structural recursion: the field loop matches on the token +||| list and each accepted field (IDENT EQUALS value) recurses on a strict +||| tail, so the argument provably shrinks (no fuel, no unsafe escape hatch). +total parseOptionalPolicy : ParserState -> Either ParseError (Maybe Policy, ParserState) parseOptionalPolicy st = case peek st of @@ -230,7 +203,7 @@ parseOptionalPolicy st = st2 <- expectToken LBRACE st1 -- Parse mode field - (mField, mValue, st3) <- parseField st2 + (mField, mValue, MkState toks pos) <- parseField st2 unless (mField == "mode") $ Left (InvalidValue "policy" mField "expected 'mode' field" st.position) @@ -239,43 +212,36 @@ parseOptionalPolicy st = Nothing => Left (InvalidValue "policy" "mode" ("invalid mode: " ++ mValue) st.position) -- Check for optional fields or closing brace - parsePolicyFields st3 mode Nothing False + parsePolicyFields toks pos mode Nothing False _ => Right (Nothing, st) where unless : Bool -> Either ParseError () -> Either ParseError () - unless True err = err - unless False _ = Right () + unless True _ = Right () + unless False err = err - covering - parsePolicyFields : ParserState -> VerificationMode -> Maybe Nat -> Bool + ||| Field loop over the raw token list (structurally decreasing). + parsePolicyFields : List Token -> Nat -> VerificationMode -> Maybe Nat -> Bool -> Either ParseError (Maybe Policy, ParserState) - parsePolicyFields st mode maxAge requireSig = - case peek st of - Just RBRACE => - let policy = MkPolicy mode maxAge requireSig - in Right (Just policy, advance st) - - Just (IDENT "max_age") => do - (_, value, st1) <- parseNumberField st - unless (value >= 0) $ - Left (InvalidValue "policy" "max_age" "must be non-negative" st.position) - parsePolicyFields st1 mode (Just (cast value)) requireSig - - Just (IDENT "require_sig") => do - (_, value, st1) <- parseBoolField st - parsePolicyFields st1 mode maxAge value - - Just tok => - Left (UnexpectedToken "RBRACE, max_age, or require_sig" tok st.position) - - Nothing => - Left (UnexpectedEOF "policy body") + parsePolicyFields (RBRACE :: rest) pos mode maxAge requireSig = + Right (Just (MkPolicy mode maxAge requireSig), MkState rest (S pos)) + parsePolicyFields (IDENT "max_age" :: EQUALS :: NUMBER value :: rest) pos mode maxAge requireSig = + if value >= 0 + then parsePolicyFields rest (pos + 3) mode (Just (cast value)) requireSig + else Left (InvalidValue "policy" "max_age" "must be non-negative" pos) + parsePolicyFields (IDENT "require_sig" :: EQUALS :: IDENT "true" :: rest) pos mode maxAge _ = + parsePolicyFields rest (pos + 3) mode maxAge True + parsePolicyFields (IDENT "require_sig" :: EQUALS :: IDENT "false" :: rest) pos mode maxAge _ = + parsePolicyFields rest (pos + 3) mode maxAge False + parsePolicyFields (tok :: _) pos _ _ _ = + Left (UnexpectedToken "RBRACE, max_age, or require_sig" tok pos) + parsePolicyFields [] _ _ _ _ = + Left (UnexpectedEOF "policy body") ||| Parse a list of tokens into a Manifest. ||| Expects: @manifest { ... } @refs { ... } [@attestation { ... }] [@policy { ... }] public export -covering +total parse : List Token -> Either ParseError Manifest parse tokens = do let st = MkState tokens 0 @@ -296,5 +262,10 @@ parse tokens = do -- Parse optional @policy section (policy, st8) <- parseOptionalPolicy st7 - -- Construct manifest - Right (MkManifest manifestData refs attestation policy) + -- Enforce end-of-input: a complete manifest must be followed only by EOF. + -- This rejects trailing tokens such as duplicate @sections, so malformed + -- input cannot smuggle ignored data past the parser. + case peek st8 of + Just EOF => Right (MkManifest manifestData refs attestation policy) + Nothing => Right (MkManifest manifestData refs attestation policy) + Just tok => Left (UnexpectedToken "end of input" tok st8.position) From 6d472c3b0aef3685d693aa2bf5f6f7d83af4a3af Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 3 Jun 2026 21:39:53 +0000 Subject: [PATCH 03/15] fix(ci): make e2e_test.sh path-independent BASE was hardcoded to a developer-specific absolute path (/var/mnt/eclipse/repos/ochrance) that does not exist in CI, so every file check failed and the e2e job failed on every PR. Derive the repo root from the script's own location so it runs identically in CI, containers, and locally. --- tests/e2e_test.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/e2e_test.sh b/tests/e2e_test.sh index c9b5f6a..18184c2 100644 --- a/tests/e2e_test.sh +++ b/tests/e2e_test.sh @@ -10,7 +10,10 @@ set -euo pipefail PASS=0 FAIL=0 -BASE=/var/mnt/eclipse/repos/ochrance +# Resolve the repository root from this script's own location so the suite +# runs identically in CI ($GITHUB_WORKSPACE), in containers, and locally — +# never a developer-specific absolute path. +BASE="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" assert() { local desc="$1" From 53ab9dffb1ad12022ebed4e0783f373e811c3e28 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 3 Jun 2026 21:39:53 +0000 Subject: [PATCH 04/15] fix(ffi): compile the Zig FFI and implement real BLAKE3/SHA-256/SHA3-256/Ed25519 The Zig library never compiled and lacked the crypto entry points the Idris2 %foreign layer declares. Fixes: - Handle was 'opaque' yet carried fields (illegal); make it a struct (C still sees an opaque pointer). - BUILD_INFO/version/build_info dropped the 0-sentinel on return; fix. - build.zig: linkLibC() (c_allocator needs it); emit a real shared library named 'ochrance' so libochrance.so matches the FFI's link target. - Implement blake3_hash/sha256_hash/sha3_256_hash/ed25519_verify via std.crypto, with RFC/NIST known-answer tests. Verified with Zig 0.11.0: 'zig build' and 'zig build test' pass; nm shows the four symbols exported. e2e_test.sh now reports 22/22 passed. --- ffi/zig/build.zig | 11 ++-- ffi/zig/src/main.zig | 120 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 120 insertions(+), 11 deletions(-) diff --git a/ffi/zig/build.zig b/ffi/zig/build.zig index 47458af..2e295f5 100644 --- a/ffi/zig/build.zig +++ b/ffi/zig/build.zig @@ -17,16 +17,18 @@ pub fn build(b: *std.Build) void { .optimize = optimize, }); + lib.linkLibC(); // std.heap.c_allocator + C ABI b.installArtifact(lib); - // Also create a shared library version - const shared_lib = b.addStaticLibrary(.{ - .name = "ochrance-shared", + // Shared library (libochrance.so) — this is what the Idris2 %foreign + // declarations link against at runtime (C:blake3_hash,libochrance ...). + const shared_lib = b.addSharedLibrary(.{ + .name = "ochrance", .root_source_file = .{ .cwd_relative = "src/main.zig" }, .target = target, .optimize = optimize, }); - shared_lib.linkage = .dynamic; + shared_lib.linkLibC(); b.installArtifact(shared_lib); // Tests @@ -35,6 +37,7 @@ pub fn build(b: *std.Build) void { .target = target, .optimize = optimize, }); + tests.linkLibC(); const run_tests = b.addRunArtifact(tests); const test_step = b.step("test", "Run unit tests"); diff --git a/ffi/zig/src/main.zig b/ffi/zig/src/main.zig index cf9453d..918efdf 100644 --- a/ffi/zig/src/main.zig +++ b/ffi/zig/src/main.zig @@ -9,7 +9,7 @@ const std = @import("std"); // Version information (keep in sync with project) const VERSION = "0.1.0"; -const BUILD_INFO = "OCHRANCE built with Zig " ++ @import("builtin").zig_version_string; +const BUILD_INFO = std.fmt.comptimePrint("OCHRANCE built with Zig {s}", .{@import("builtin").zig_version_string}); /// Thread-local error storage threadlocal var last_error: ?[]const u8 = null; @@ -37,12 +37,12 @@ pub const Result = enum(c_int) { null_pointer = 4, }; -/// Library handle (opaque to prevent direct access) -pub const Handle = opaque { - // Internal state hidden from C +/// Library handle. Declared as a regular struct so the Zig side can carry +/// internal state; C only ever receives an opaque `*Handle` pointer and never +/// inspects the layout, so this remains ABI-safe across the FFI boundary. +pub const Handle = struct { allocator: std.mem.Allocator, initialized: bool, - // Add your fields here }; //============================================================================== @@ -175,6 +175,48 @@ export fn ochrance_process_array( return .ok; } +//============================================================================== +// Cryptographic Hash & Signature FFI +// +// These functions back the Idris2 %foreign declarations in +// ochrance-core/Ochrance/FFI/Crypto.idr and src/abi/Ochrance/ABI/Foreign.idr. +// ABI contracts: +// void blake3_hash (const u8* data, usize len, u8 out[32]) +// void sha256_hash (const u8* data, usize len, u8 out[32]) +// void sha3_256_hash (const u8* data, usize len, u8 out[32]) +// c_int ed25519_verify(const u8 sig[64], const u8 pk[32], +// const u8* msg, usize msg_len) -> 1 valid, 0 invalid +//============================================================================== + +/// BLAKE3 digest (32 bytes) of data[0..len], written to out[0..32]. +export fn blake3_hash(data: [*]const u8, len: usize, out: [*]u8) void { + std.crypto.hash.Blake3.hash(data[0..len], out[0..32], .{}); +} + +/// SHA-256 digest (32 bytes) of data[0..len], written to out[0..32]. +export fn sha256_hash(data: [*]const u8, len: usize, out: [*]u8) void { + std.crypto.hash.sha2.Sha256.hash(data[0..len], out[0..32], .{}); +} + +/// SHA3-256 digest (32 bytes) of data[0..len], written to out[0..32]. +export fn sha3_256_hash(data: [*]const u8, len: usize, out: [*]u8) void { + std.crypto.hash.sha3.Sha3_256.hash(data[0..len], out[0..32], .{}); +} + +/// Verify an Ed25519 signature. Returns 1 if valid, 0 otherwise. +export fn ed25519_verify( + sig: [*]const u8, + pk: [*]const u8, + msg: [*]const u8, + msg_len: usize, +) c_int { + const Ed25519 = std.crypto.sign.Ed25519; + const signature = Ed25519.Signature.fromBytes(sig[0..64].*); + const public_key = Ed25519.PublicKey.fromBytes(pk[0..32].*) catch return 0; + signature.verify(msg[0..msg_len], public_key) catch return 0; + return 1; +} + //============================================================================== // Error Handling //============================================================================== @@ -196,12 +238,12 @@ export fn ochrance_last_error() ?[*:0]const u8 { /// Get the library version export fn ochrance_version() [*:0]const u8 { - return VERSION.ptr; + return VERSION; } /// Get build information export fn ochrance_build_info() [*:0]const u8 { - return BUILD_INFO.ptr; + return BUILD_INFO; } //============================================================================== @@ -272,3 +314,67 @@ test "version" { const ver_str = std.mem.span(ver); try std.testing.expectEqualStrings(VERSION, ver_str); } + +test "blake3 known-answer (abc)" { + var out: [32]u8 = undefined; + const msg = "abc"; + blake3_hash(msg.ptr, msg.len, &out); + const expected = [_]u8{ + 0x64, 0x37, 0xb3, 0xac, 0x38, 0x46, 0x51, 0x33, + 0xff, 0xb6, 0x3b, 0x75, 0x27, 0x3a, 0x8d, 0xb5, + 0x48, 0xc5, 0x58, 0x46, 0x5d, 0x79, 0xdb, 0x03, + 0xfd, 0x35, 0x9c, 0x6c, 0xd5, 0xbd, 0x9d, 0x85, + }; + try std.testing.expectEqualSlices(u8, &expected, &out); +} + +test "sha256 known-answer (abc)" { + var out: [32]u8 = undefined; + const msg = "abc"; + sha256_hash(msg.ptr, msg.len, &out); + const expected = [_]u8{ + 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, + 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23, + 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, + 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad, + }; + try std.testing.expectEqualSlices(u8, &expected, &out); +} + +test "sha3-256 known-answer (abc)" { + var out: [32]u8 = undefined; + const msg = "abc"; + sha3_256_hash(msg.ptr, msg.len, &out); + const expected = [_]u8{ + 0x3a, 0x98, 0x5d, 0xa7, 0x4f, 0xe2, 0x25, 0xb2, + 0x04, 0x5c, 0x17, 0x2d, 0x6b, 0xd3, 0x90, 0xbd, + 0x85, 0x5f, 0x08, 0x6e, 0x3e, 0x9d, 0x52, 0x5b, + 0x46, 0xbf, 0xe2, 0x45, 0x11, 0x43, 0x15, 0x32, + }; + try std.testing.expectEqualSlices(u8, &expected, &out); +} + +test "ed25519 verify (RFC 8032 test 1)" { + const pk = [_]u8{ + 0xd7, 0x5a, 0x98, 0x01, 0x82, 0xb1, 0x0a, 0xb7, + 0xd5, 0x4b, 0xfe, 0xd3, 0xc9, 0x64, 0x07, 0x3a, + 0x0e, 0xe1, 0x72, 0xf3, 0xda, 0xa6, 0x23, 0x25, + 0xaf, 0x02, 0x1a, 0x68, 0xf7, 0x07, 0x51, 0x1a, + }; + const sig = [_]u8{ + 0xe5, 0x56, 0x43, 0x00, 0xc3, 0x60, 0xac, 0x72, + 0x90, 0x86, 0xe2, 0xcc, 0x80, 0x6e, 0x82, 0x8a, + 0x84, 0x87, 0x7f, 0x1e, 0xb8, 0xe5, 0xd9, 0x74, + 0xd8, 0x73, 0xe0, 0x65, 0x22, 0x49, 0x01, 0x55, + 0x5f, 0xb8, 0x82, 0x15, 0x90, 0xa3, 0x3b, 0xac, + 0xc6, 0x1e, 0x39, 0x70, 0x1c, 0xf9, 0xb4, 0x6b, + 0xd2, 0x5b, 0xf5, 0xf0, 0x59, 0x5b, 0xbe, 0x24, + 0x65, 0x51, 0x41, 0x43, 0x8e, 0x7a, 0x10, 0x0b, + }; + const msg = [_]u8{}; + try std.testing.expectEqual(@as(c_int, 1), ed25519_verify(&sig, &pk, &msg, msg.len)); + // A corrupted signature must be rejected. + var bad = sig; + bad[0] ^= 0xff; + try std.testing.expectEqual(@as(c_int, 0), ed25519_verify(&bad, &pk, &msg, msg.len)); +} From 78f10f62430a6be33ef9fb2874f59cd8f490ae68 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 3 Jun 2026 23:11:28 +0000 Subject: [PATCH 05/15] fix(abi): prove Handle non-null invariant; compile the ABI package The ochrance-abi package never type-checked. Fixes: - createHandle: discharge the So (ptr /= 0) invariant at runtime via Data.So.choose, handing the witness to MkHandle. The old 'createHandle 0 = Nothing; createHandle ptr = ...' split could not supply it: matching a Bits64 literal does not refine the variable clause to be non-zero, so the constructor's auto-search had nothing to find. - thisPlatform: drop the no-op '%runElab do pure Linux' (which needed ElabReflection and always returned Linux) for a real System.Info.os map. - Define Byte and the length-indexed HashValue that ABI/Foreign.idr uses. Verified with Idris2 0.8.0: 'idris2 --build ochrance-abi.ipkg' is clean; createHandle 0 = Nothing and createHandle 42 = Just (behavioural check). --- src/abi/Ochrance/ABI/Types.idr | 42 +++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/src/abi/Ochrance/ABI/Types.idr b/src/abi/Ochrance/ABI/Types.idr index 4cfc7e2..d453899 100644 --- a/src/abi/Ochrance/ABI/Types.idr +++ b/src/abi/Ochrance/ABI/Types.idr @@ -10,6 +10,7 @@ module Ochrance.ABI.Types import Data.Bits import Data.So import Data.Vect +import System.Info %default total @@ -21,12 +22,33 @@ import Data.Vect public export data Platform = Linux | Windows | MacOS | BSD | WASM -||| Resolves the execution environment at compile time. +||| Resolves the execution environment of the running target by mapping the +||| backend's reported OS string onto a verified `Platform`. Unknown or +||| unix-like systems fall back to `Linux`. public export thisPlatform : Platform -thisPlatform = - %runElab do - pure Linux +thisPlatform = case os of + "windows" => Windows + "darwin" => MacOS + "freebsd" => BSD + "openbsd" => BSD + "netbsd" => BSD + _ => Linux + +-------------------------------------------------------------------------------- +-- Primitive Byte & Digest Types +-------------------------------------------------------------------------------- + +||| A single octet — the atom of every ABI buffer. +public export +Byte : Type +Byte = Bits8 + +||| A fixed-width hash digest that carries its length in the type, so the FFI +||| boundary can never hand back the wrong number of bytes. +public export +data HashValue : Nat -> Type where + MkHashValue : Vect n Byte -> HashValue n -------------------------------------------------------------------------------- -- Security Result Codes @@ -57,7 +79,15 @@ data Handle : Type where MkHandle : (ptr : Bits64) -> {auto 0 nonNull : So (ptr /= 0)} -> Handle ||| Safe constructor for security handles. +||| +||| The non-null invariant is discharged at runtime with `choose`: when +||| `ptr /= 0` holds we obtain a `So (ptr /= 0)` witness and hand it to +||| `MkHandle`; otherwise we return `Nothing`. This supplies the proof the +||| old `createHandle 0` / `createHandle ptr` split could not — matching a +||| `Bits64` literal does not refine the variable clause to be non-zero, so +||| the constructor's `auto` search had nothing to find. public export createHandle : Bits64 -> Maybe Handle -createHandle 0 = Nothing -createHandle ptr = Just (MkHandle ptr) +createHandle ptr = case choose (ptr /= 0) of + Left nonNull => Just (MkHandle ptr {nonNull = nonNull}) + Right _ => Nothing From 7f87ec62d3384c306718d5c151a281bdf7fc3999 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 3 Jun 2026 23:29:57 +0000 Subject: [PATCH 06/15] feat(merkle): prove inclusion-proof soundness (merkleCorrect) Adds the merkleCorrect theorem promised in the module header: every inclusion proof produced by generateProof for an in-range leaf reconstructs the tree's true root. - reconstruct: the hash a proof folds up from a leaf (the exact value verifyProof compares against the root). - reconstructAppend: reconstruct distributes over path concatenation. - verifyProofReconstructs: verifyProof root leaf prf = (root == reconstruct leaf prf), bridging the theorem to the Bool API. - merkleCorrect: by induction on the tree, reconstruct leaf prf = rootHashBytes t given getLeafHash t i = Just leaf and generateProof t i = Just prf. Stated as a propositional equality on the digest rather than verifyProof ... = True: the residual root == root step is unprovable for the primitive Bits8 equality without an unsafe axiom, so the propositional form is the honest, stronger statement. Total, no holes, no believe_me/assert_*; the ECHIDNA dangerous-pattern gate stays clean. Property tests remain 47/47. --- ochrance-core/Ochrance/Filesystem/Merkle.idr | 86 +++++++++++++++++++- 1 file changed, 83 insertions(+), 3 deletions(-) diff --git a/ochrance-core/Ochrance/Filesystem/Merkle.idr b/ochrance-core/Ochrance/Filesystem/Merkle.idr index b387040..bba0407 100644 --- a/ochrance-core/Ochrance/Filesystem/Merkle.idr +++ b/ochrance-core/Ochrance/Filesystem/Merkle.idr @@ -2,9 +2,10 @@ ||| ||| Ochrance.Filesystem.Merkle - Verified Merkle tree implementation ||| -||| Uses size-indexed types (Vect) to ensure the tree structure is -||| correct at compile time. The merkleCorrect theorem proves that -||| building a tree and extracting its root is consistent. +||| Uses height-indexed types to ensure the tree structure is correct at +||| compile time. The `merkleCorrect` theorem proves inclusion-proof soundness: +||| every proof produced by `generateProof` for an in-range leaf reconstructs +||| the tree's true root (a machine-checked propositional equality). module Ochrance.Filesystem.Merkle @@ -222,3 +223,82 @@ getLeafHash {n = S k} (Node l r) idx = if idx < halfSize then getLeafHash l idx else getLeafHash r (idx `minus` halfSize) + +-------------------------------------------------------------------------------- +-- Inclusion-Proof Soundness (merkleCorrect) +-------------------------------------------------------------------------------- + +||| The hash an inclusion proof reconstructs: start from a leaf hash and fold in +||| each sibling, left or right, exactly as `verifyProof` does. This is the value +||| `verifyProof` compares against the root (see `verifyProofReconstructs`). +public export +reconstruct : HashBytes -> MerkleProof -> HashBytes +reconstruct acc [] = acc +reconstruct acc ((GoLeft, sib) :: rest) = reconstruct (hashPairStub acc sib) rest +reconstruct acc ((GoRight, sib) :: rest) = reconstruct (hashPairStub sib acc) rest + +||| `reconstruct` distributes over path concatenation: folding `p ++ q` equals +||| folding `p`, then folding `q` from that result. +reconstructAppend : (acc : HashBytes) -> (p, q : MerkleProof) + -> reconstruct acc (p ++ q) = reconstruct (reconstruct acc p) q +reconstructAppend acc [] q = Refl +reconstructAppend acc ((GoLeft, sib) :: rest) q = reconstructAppend (hashPairStub acc sib) rest q +reconstructAppend acc ((GoRight, sib) :: rest) q = reconstructAppend (hashPairStub sib acc) rest q + +||| `verifyProof` is exactly a root-equality test on the reconstructed hash. +||| This bridges the propositional soundness theorem below to the Bool API. +export +verifyProofReconstructs : (root, leaf : HashBytes) -> (prf : MerkleProof) + -> verifyProof root leaf prf = (root == reconstruct leaf prf) +verifyProofReconstructs root leaf [] = Refl +verifyProofReconstructs root leaf ((GoLeft, sib) :: rest) = + verifyProofReconstructs root (hashPairStub leaf sib) rest +verifyProofReconstructs root leaf ((GoRight, sib) :: rest) = + verifyProofReconstructs root (hashPairStub sib leaf) rest + +-- Injectivity of `Just`, used to read prf back out of the generated proof. +justInj : {0 a : Type} -> {0 x, y : a} -> Just x = Just y -> x = y +justInj Refl = Refl + +||| SOUNDNESS (merkleCorrect): every inclusion proof produced by `generateProof` +||| for an in-range leaf reconstructs the tree's true root. +||| +||| Stated as a propositional equality on the 32-byte digest — the strongest +||| honest form. `verifyProof` then accepts the proof, because it is exactly +||| `root == reconstruct leaf prf` (`verifyProofReconstructs`) and here the +||| reconstruction equals the root. (The residual `root == root` Bool step holds +||| for any lawful `Eq`; discharging it for the primitive `Bits8` equality would +||| need an unsafe primitive-reflexivity axiom, which is why the propositional +||| statement is the right one.) +export +merkleCorrect : {n : Nat} -> (t : MerkleTree n) -> (i : Nat) + -> (leaf : HashBytes) -> (prf : MerkleProof) + -> getLeafHash t i = Just leaf + -> generateProof t i = Just prf + -> reconstruct leaf prf = rootHashBytes t +merkleCorrect (Leaf h) Z leaf prf gl gp = + rewrite justInj (sym gl) in rewrite justInj (sym gp) in Refl +merkleCorrect (Leaf h) (S j) leaf prf gl gp = absurd gl +merkleCorrect {n = S k} (Node l r) i leaf prf gl gp with (i < power 2 k) proof pb + merkleCorrect {n = S k} (Node l r) i leaf prf gl gp | True with (generateProof l i) proof ps + merkleCorrect {n = S k} (Node l r) i leaf prf gl gp | True | Just sub = + let prfIs : (prf = sub ++ [(GoLeft, rootHashBytes r)]) + prfIs = sym (justInj gp) + ih : (reconstruct leaf sub = rootHashBytes l) + ih = merkleCorrect l i leaf sub gl ps + in rewrite prfIs in + rewrite reconstructAppend leaf sub [(GoLeft, rootHashBytes r)] in + rewrite ih in Refl + merkleCorrect {n = S k} (Node l r) i leaf prf gl gp | True | Nothing = + absurd gp + merkleCorrect {n = S k} (Node l r) i leaf prf gl gp | False with (generateProof r (i `minus` power 2 k)) proof ps + merkleCorrect {n = S k} (Node l r) i leaf prf gl gp | False | Just sub = + let prfIs : (prf = sub ++ [(GoRight, rootHashBytes l)]) + prfIs = sym (justInj gp) + ih : (reconstruct leaf sub = rootHashBytes r) + ih = merkleCorrect r (i `minus` power 2 k) leaf sub gl ps + in rewrite prfIs in + rewrite reconstructAppend leaf sub [(GoRight, rootHashBytes l)] in + rewrite ih in Refl + merkleCorrect {n = S k} (Node l r) i leaf prf gl gp | False | Nothing = + absurd gp From 4a174091eca2da9c25079d0428ddb0c3fc5d6af2 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 4 Jun 2026 02:35:27 +0000 Subject: [PATCH 07/15] refactor: make ochrance-core the single home of the Filesystem subsystem MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Filesystem subsystem existed twice: complete and proven in ochrance-core/Ochrance/Filesystem/ (built by ochrance.ipkg), and as stale 50-60 line stubs in modules/Ochrance/Filesystem/ (built by ochrance-fs.ipkg) — one of which (Repair.idr) had a '...' placeholder that would not even parse. Drop the duplication, keeping the core copy canonical: - Delete the modules/ stubs and the vestigial ochrance-fs.ipkg. - Repoint tests/integration to depend only on the core 'ochrance' package (which already provides Ochrance.Filesystem.*). - Update the Justfile (drop build-fs/repl-fs and ochrance-fs installs) and the docs (CLAUDE.md, EXPLAINME.adoc, ABI-FFI-README.md) to match. Verified: ochrance.ipkg builds 15/15; the integration tests build and pass against the core package alone. --- ABI-FFI-README.md | 3 +- CLAUDE.md | 22 ++++------ EXPLAINME.adoc | 11 +++-- Justfile | 19 ++------ modules/Ochrance/Filesystem/Merkle.idr | 53 ----------------------- modules/Ochrance/Filesystem/Repair.idr | 56 ------------------------ modules/Ochrance/Filesystem/Types.idr | 55 ----------------------- modules/Ochrance/Filesystem/Verify.idr | 60 -------------------------- ochrance-fs.ipkg | 18 -------- tests/integration/tests.ipkg | 1 - 10 files changed, 19 insertions(+), 279 deletions(-) delete mode 100644 modules/Ochrance/Filesystem/Merkle.idr delete mode 100644 modules/Ochrance/Filesystem/Repair.idr delete mode 100644 modules/Ochrance/Filesystem/Types.idr delete mode 100644 modules/Ochrance/Filesystem/Verify.idr delete mode 100644 ochrance-fs.ipkg diff --git a/ABI-FFI-README.md b/ABI-FFI-README.md index b6e3915..82d6f58 100644 --- a/ABI-FFI-README.md +++ b/ABI-FFI-README.md @@ -185,9 +185,8 @@ zig build test # Run Zig unit tests # Ensure libochrance.so is on LD_LIBRARY_PATH export LD_LIBRARY_PATH="$PWD/ffi/zig/zig-out/lib:$LD_LIBRARY_PATH" -# Type-check and build +# Type-check and build (the core package includes the filesystem subsystem) idris2 --build ochrance.ipkg -idris2 --build ochrance-fs.ipkg ``` ### Cross-Compile diff --git a/CLAUDE.md b/CLAUDE.md index 42ab0ca..9cc59ee 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -21,30 +21,26 @@ ochrance/ │ │ ├── Interface.idr # VerifiedSubsystem interface │ │ ├── Proof.idr # Proof witnesses │ │ └── Error.idr # q/p/z error taxonomy +│ ├── Filesystem/ # Reference VerifiedSubsystem +│ │ ├── Types.idr # FSState, Block, FSSnapshot +│ │ ├── Merkle.idr # Verified Merkle tree + merkleCorrect theorem +│ │ ├── Verify.idr # Verification logic +│ │ └── Repair.idr # Linear type repair │ └── FFI/ +│ ├── Crypto.idr # FFI to libochrance.so (BLAKE3/SHA-256/Ed25519) │ └── Echidna.idr # FFI to libechidna.so -├── modules/ -│ └── filesystem/ # Reference VerifiedSubsystem -│ ├── Types.idr # FSState, Block, FSSnapshot -│ ├── Merkle.idr # Verified Merkle tree -│ ├── Verify.idr # Verification logic -│ └── Repair.idr # Linear type repair ├── tests/ # Test suite -├── ochrance.ipkg # Core package -└── ochrance-fs.ipkg # Filesystem module package +└── ochrance.ipkg # Core package (includes the filesystem subsystem) ``` ## Build Commands ```bash -# Type-check core +# Type-check core (includes the filesystem subsystem) idris2 --build ochrance.ipkg -# Type-check filesystem module -idris2 --build ochrance-fs.ipkg - # Check single file -idris2 --check ochrance-core/A2ML/Lexer.idr +idris2 --check ochrance-core/Ochrance/A2ML/Lexer.idr # REPL idris2 --repl ochrance.ipkg diff --git a/EXPLAINME.adoc b/EXPLAINME.adoc index 8c527b1..081c625 100644 --- a/EXPLAINME.adoc +++ b/EXPLAINME.adoc @@ -50,12 +50,11 @@ Also integrates with ECHIDNA for neural proof synthesis — FFI calls to libechi | `ochrance-core/Framework/Proof.idr` | Proof witness types; generic proof structure for all subsystems | `ochrance-core/Framework/Error.idr` | Error taxonomy: q/* (query), p/* (proof), z/* (zone/system) | `ochrance-core/Framework/FFI/Echidna.idr` | FFI to ECHIDNA neural prover (via Zig C ABI) -| `modules/filesystem/Types.idr` | Filesystem types: FSState, Block, FSSnapshot with dependent proofs -| `modules/filesystem/Merkle.idr` | Verified Merkle tree: size-indexed with compile-time structure proofs (placeholder XOR hashes) -| `modules/filesystem/Verify.idr` | Verification logic: block hashes, tree integrity, attestation signatures -| `modules/filesystem/Repair.idr` | Linear type repair: repair operations consume old state (Quantity 1) -| `ochrance.ipkg` | Package definition for core library -| `ochrance-fs.ipkg` | Package definition for filesystem module +| `ochrance-core/Ochrance/Filesystem/Types.idr` | Filesystem types: FSState, Block, FSSnapshot with dependent proofs +| `ochrance-core/Ochrance/Filesystem/Merkle.idr` | Verified Merkle tree: height-indexed with compile-time structure proofs and the `merkleCorrect` inclusion-soundness theorem (placeholder XOR hashes for the pure path) +| `ochrance-core/Ochrance/Filesystem/Verify.idr` | Verification logic: block hashes, tree integrity, attestation signatures +| `ochrance-core/Ochrance/Filesystem/Repair.idr` | Linear type repair: repair operations consume old state (Quantity 1) +| `ochrance.ipkg` | Package definition for the core library (includes the filesystem subsystem) |=== == Testing Critical Paths diff --git a/Justfile b/Justfile index 42ba390..c88b61c 100644 --- a/Justfile +++ b/Justfile @@ -24,10 +24,6 @@ check-versions: build-core: idris2 --build ochrance.ipkg -# Build filesystem module -build-fs: - idris2 --build ochrance-fs.ipkg - # Build ABI layer build-abi: idris2 --build ochrance-abi.ipkg @@ -37,12 +33,11 @@ build-ffi: cd ffi/zig && zig build # Build all components -build: build-core build-fs build-abi build-ffi +build: build-core build-abi build-ffi # Run all tests (builds core, installs, then runs test suites) test: build-core idris2 --install ochrance.ipkg - idris2 --install ochrance-fs.ipkg idris2 --build tests/A2ML/tests.ipkg tests/A2ML/build/exec/a2ml-tests idris2 --build tests/property/tests.ipkg @@ -59,7 +54,6 @@ test-a2ml: build-core # Run integration tests only test-integration: build-core idris2 --install ochrance.ipkg - idris2 --install ochrance-fs.ipkg idris2 --build tests/integration/tests.ipkg tests/integration/build/exec/integration-tests @@ -89,10 +83,6 @@ check FILE: repl: idris2 --repl ochrance.ipkg -# Open REPL for filesystem module -repl-fs: - idris2 --repl ochrance-fs.ipkg - # Find type at position in file type-at FILE LINE COL: idris2 --find-type-at {{FILE}}:{{LINE}}:{{COL}} @@ -100,7 +90,6 @@ type-at FILE LINE COL: # Install packages install: idris2 --install ochrance.ipkg - idris2 --install ochrance-fs.ipkg idris2 --install ochrance-abi.ipkg # Install OSTree hooks @@ -126,11 +115,11 @@ format: stats: @echo "=== Ochránce Statistics ===" @echo "Idris2 modules:" - @find ochrance-core modules -name "*.idr" | wc -l + @find ochrance-core -name "*.idr" | wc -l @echo "Total lines of code:" - @find ochrance-core modules -name "*.idr" -exec cat {} \; | wc -l + @find ochrance-core -name "*.idr" -exec cat {} \; | wc -l @echo "Functions marked total:" - @grep -r 'total' ochrance-core modules | grep -v '%default' | wc -l + @grep -r 'total' ochrance-core | grep -v '%default' | wc -l # Run panic-attacker pre-commit scan assail: diff --git a/modules/Ochrance/Filesystem/Merkle.idr b/modules/Ochrance/Filesystem/Merkle.idr deleted file mode 100644 index 35f7edb..0000000 --- a/modules/Ochrance/Filesystem/Merkle.idr +++ /dev/null @@ -1,53 +0,0 @@ -||| SPDX-License-Identifier: MPL-2.0 -||| -||| Ochrance.Filesystem.Merkle — Formally Verified Integrity Trees. -||| -||| This module implements a Merkle Tree where the balance and height -||| are enforced by the type system (`Nat` index). It provides the -||| mathematical foundation for verifying large block-based filesystems. - -module Ochrance.Filesystem.Merkle - -import Data.Vect -import Ochrance.A2ML.Types -import Ochrance.FFI.Crypto - -%default total - --------------------------------------------------------------------------------- --- Merkle Model --------------------------------------------------------------------------------- - -||| MERKLE TREE: Indexed by its height `n`. -||| A balanced binary tree where every path from leaf to root has length `n`. -public export -data MerkleTree : Nat -> Type where - ||| LEAF: Contains the hash of a single 4KB block. - Leaf : HashBytes -> MerkleTree 0 - ||| NODE: Combines two subtrees of identical height. - Node : MerkleTree n -> MerkleTree n -> MerkleTree (S n) - -||| ROOT CALCULATION: Recursively hashes up the tree using BLAKE3. -||| This version is used in production to generate the authoritative root hash. -export -rootHashBytesIO : HasIO io => MerkleTree n -> io HashBytes -rootHashBytesIO (Leaf h) = pure h -rootHashBytesIO (Node l r) = do - lHash <- rootHashBytesIO l - rHash <- rootHashBytesIO r - hashPairBlake3 lHash rHash - --------------------------------------------------------------------------------- --- Inclusion Proofs --------------------------------------------------------------------------------- - -||| VERIFICATION: Proves that a specific `leaf` hash is part of the tree -||| defined by `root`, given a cryptographic `MerkleProof` path. -export -verifyProofIO : HasIO io => (root : HashBytes) -> (leaf : HashBytes) - -> MerkleProof -> io Bool -verifyProofIO root leaf [] = pure (root == leaf) -verifyProofIO root leaf ((GoLeft, sibling) :: rest) = do - parent <- hashPairBlake3 leaf sibling - verifyProofIO root parent rest --- ... [Right-side case follows same pattern] diff --git a/modules/Ochrance/Filesystem/Repair.idr b/modules/Ochrance/Filesystem/Repair.idr deleted file mode 100644 index 326b7e8..0000000 --- a/modules/Ochrance/Filesystem/Repair.idr +++ /dev/null @@ -1,56 +0,0 @@ -||| SPDX-License-Identifier: MPL-2.0 -||| -||| Ochrance.Filesystem.Repair — Safe State Mutation via Linear Types. -||| -||| This module implements the "Self-Healing" kernel for the filesystem. -||| -||| LINEARITY GUARANTEE: This module uses Idris2 linear types (Quantity 1) -||| to enforce that a filesystem state can only be mutated by consuming -||| its predecessor. This prevents the "Split-Brain" problem where multiple -||| versions of the same state exist simultaneously. - -module Ochrance.Filesystem.Repair - -import Data.Vect -import Ochrance.A2ML.Types --- ... [other imports] - -%default total - --------------------------------------------------------------------------------- --- Linear Repair Primitives --------------------------------------------------------------------------------- - -||| REPAIR: Restores a specific block to its authoritative state. -||| -||| @ 1 oldState : The current filesystem state. MUST be consumed. -||| @ blockIdx : The physical index of the corrupted block. -||| @ expectedHash : The target cryptographic digest for the repair. -||| -||| RETURNS: A new, verified `FSState`. -export -repairBlock : HasIO io - => (1 oldState : FSState) - -> (blockIdx : BlockIndex) - -> (expectedHash : Hash) - -> io (Either OchranceError FSState) -repairBlock oldState blockIdx expectedHash = do - -- SAFETY: Verify indices before creating the new state. - if blockIdx >= oldState.numBlocks - then pure (Left (QError (InvalidManifestPath "Index OOB"))) - else do - -- TRANSITION: Consume oldState and produce newState. - let newState = MkFSState oldState.numBlocks (\idx => ...) oldState.metadata - pure (Right newState) - -||| ORCHESTRATION: Full verify-then-repair pipeline. -||| Consumes the initial state and returns either the same state (if clean) -||| or a repaired state (if corruption was detected). -export -linearVerifyAndRepair : HasIO io - => (1 oldState : FSState) - -> (manifest : ValidManifest) - -> io (Either OchranceError (FSState, RepairProof FSState)) -linearVerifyAndRepair oldState manifest = do - -- ... [Implementation of the high-assurance repair loop] - pure (Right (oldState, NoRepairNeeded manifest)) diff --git a/modules/Ochrance/Filesystem/Types.idr b/modules/Ochrance/Filesystem/Types.idr deleted file mode 100644 index 87b08e9..0000000 --- a/modules/Ochrance/Filesystem/Types.idr +++ /dev/null @@ -1,55 +0,0 @@ -||| SPDX-License-Identifier: MPL-2.0 -||| -||| Ochrance.Filesystem.Types — Verified Storage Models. -||| -||| This module defines the formal types used to verify the integrity -||| of block-level storage. It provides the data structures for tracking -||| block hashes and comparing filesystem snapshots. - -module Ochrance.Filesystem.Types - -import Data.Vect -import Ochrance.A2ML.Types - -%default total - --------------------------------------------------------------------------------- --- Block Layer --------------------------------------------------------------------------------- - -||| STANDARD BLOCK SIZE: Defined as 4096 bytes (4KB). -public export -BlockSize : Nat -BlockSize = 4096 - -||| BLOCK REPRESENTATION: A fixed-size vector of bytes. -public export -Block : Type -Block = Vect BlockSize Bits8 - -||| BLOCK ADDRESS: A unique natural number index within the filesystem. -public export -BlockIndex : Type -BlockIndex = Nat - --------------------------------------------------------------------------------- --- Verification State --------------------------------------------------------------------------------- - -||| FS-STATE: The complete verified state of a filesystem. -||| Tracks the total number of blocks and maps indices to their expected hashes. -public export -record FSState where - constructor MkFSState - numBlocks : Nat - blockHash : BlockIndex -> Maybe Hash -- Integrity map - metadata : ManifestData -- Associated provenance metadata - -||| SNAPSHOT: A point-in-time capture of the filesystem root hash and block count. -||| Used for detecting unauthorized mutations (e.g. offline tampering). -public export -record FSSnapshot where - constructor MkFSSnapshot - rootHash : Hash - blockCount : Nat - refs : List Ref diff --git a/modules/Ochrance/Filesystem/Verify.idr b/modules/Ochrance/Filesystem/Verify.idr deleted file mode 100644 index 7334d4e..0000000 --- a/modules/Ochrance/Filesystem/Verify.idr +++ /dev/null @@ -1,60 +0,0 @@ -||| SPDX-License-Identifier: MPL-2.0 -||| -||| Ochrance.Filesystem.Verify — High-Assurance Integrity Audit. -||| -||| This module implements the verification logic for the filesystem subsystem. -||| It validates that the physical state of the data blocks matches the -||| cryptographic expectations defined in an A2ML manifest. - -module Ochrance.Filesystem.Verify - -import Data.List -import Data.Vect -import Ochrance.A2ML.Types -import Ochrance.Framework.Interface --- ... [other imports] - -%default total - --------------------------------------------------------------------------------- --- Verification Logic --------------------------------------------------------------------------------- - -||| AUDIT: Verifies that every block referenced in the `validManifest` -||| matches the physical hash recorded in the `FSState`. -||| -||| RETURNS: A `VerificationProof` if all hashes match, or an `OchranceError`. -export -verify : HasIO io => FSState -> ValidManifest -> io (Either OchranceError (VerificationProof FSState)) -verify fs validManifest = do - let manifest = unwrapValid validManifest - - -- SUBSYSTEM CHECK: Ensure the manifest is intended for the filesystem. - if manifest.manifestData.subsystem /= fs.metadata.subsystem - then pure (Left (QError (InvalidManifestPath "Subsystem mismatch"))) - else do - -- CONTENT VERIFICATION: Iteratively check each block hash. - result <- verifyAllRefs fs manifest.refs - -- ... [Proof generation logic] - pure (Right (LaxProof validManifest)) - -||| INTERNAL: Recursively checks a list of `Ref` objects against the state. -verifyAllRefs : HasIO io => FSState -> List Ref -> io (Either OchranceError ()) -verifyAllRefs fs [] = pure (Right ()) -verifyAllRefs fs (ref :: refs) = do - -- ... [Block lookup and hash comparison] - pure (Right ()) - --------------------------------------------------------------------------------- --- Framework Integration --------------------------------------------------------------------------------- - -||| VerifiedSubsystem: Formal registration of the filesystem audit engine. -export -implementation VerifiedSubsystem FSState where - subsystemName = "filesystem" - generateManifest = generateManifest - verify = verify - repair = \fs, manifest => do - -- ... [Delegation to linearVerifyAndRepair] - pure (Right fs) diff --git a/ochrance-fs.ipkg b/ochrance-fs.ipkg deleted file mode 100644 index 8822f80..0000000 --- a/ochrance-fs.ipkg +++ /dev/null @@ -1,18 +0,0 @@ --- SPDX-License-Identifier: MPL-2.0 -package ochrance-fs -version = 0.1.0 -authors = "Jonathan D.A. Jewell " -brief = "Ochránce Filesystem Module - Merkle tree verification and repair" -license = "MPL-2.0" -langversion >= 0.8.0 - -depends = ochrance - -sourcedir = "modules" - -modules = Ochrance.Filesystem.Types - , Ochrance.Filesystem.Merkle - , Ochrance.Filesystem.Verify - , Ochrance.Filesystem.Repair - -opts = "--total" diff --git a/tests/integration/tests.ipkg b/tests/integration/tests.ipkg index b2d44e1..8c80ad1 100644 --- a/tests/integration/tests.ipkg +++ b/tests/integration/tests.ipkg @@ -7,7 +7,6 @@ license = "MPL-2.0" langversion >= 0.8.0 depends = ochrance - , ochrance-fs sourcedir = "." From 0a35a285bcd32ebc422e8f117a69e9190daf051c Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 4 Jun 2026 02:38:06 +0000 Subject: [PATCH 08/15] fix(ci): make ECHIDNA dangerous-pattern scan ignore comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The scan grepped for literal tokens (believe_me, assert_total, assert_smaller, unsafePerformIO) anywhere in *.idr — including inside comments. So legitimate documentation (e.g. a proof's doc string noting it needs 'no assert_smaller') would fail the gate. Strip doc (|||) and line (--) comments before matching, so only genuine code uses count. Also drop the deleted modules/ path. Verified locally: clean tree scans 0; a pattern named in a ||| or -- comment is ignored while a real use in code is still caught and fails the gate. --- .github/workflows/echidna-validation.yml | 31 +++++++++++++++--------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/.github/workflows/echidna-validation.yml b/.github/workflows/echidna-validation.yml index 59fd218..f8772aa 100644 --- a/.github/workflows/echidna-validation.yml +++ b/.github/workflows/echidna-validation.yml @@ -31,17 +31,26 @@ jobs: - name: Dangerous pattern scan (Idris2) run: | - echo "=== Idris2 Dangerous Pattern Scan ===" + echo "=== Idris2 Dangerous Pattern Scan (code only; comments excluded) ===" ISSUES=0 for pattern in "believe_me" "assert_total" "assert_smaller" "unsafePerformIO"; do - FOUND=$(grep -rn "$pattern" ochrance-core/ modules/ src/abi/ --include="*.idr" 2>/dev/null | wc -l || echo 0) - if [ "$FOUND" -gt 0 ]; then - echo "CRITICAL: Found $FOUND instances of '$pattern'" - grep -rn "$pattern" ochrance-core/ modules/ src/abi/ --include="*.idr" 2>/dev/null - ISSUES=$((ISSUES + FOUND)) + # Strip doc comments (||| ...) and line comments (-- ...) before + # matching, so documentation that merely names a pattern is not + # flagged: only genuine uses in code count. Without this, a doc + # string like "this proof needs no assert_smaller" would fail the gate. + MATCHES="" + for f in $(find ochrance-core/ src/abi/ -name "*.idr" 2>/dev/null); do + M=$(sed -e 's/|||.*$//' -e 's/--.*$//' "$f" | grep -n "$pattern" | sed "s|^|$f:|" || true) + [ -n "$M" ] && MATCHES="${MATCHES}${M}"$'\n' + done + N=$(printf '%s' "$MATCHES" | grep -c . || true) + if [ "$N" -gt 0 ]; then + echo "CRITICAL: Found $N use(s) of '$pattern' in code:" + printf '%s\n' "$MATCHES" + ISSUES=$((ISSUES + N)) fi done - echo "Total dangerous patterns: $ISSUES" + echo "Total dangerous patterns (in code): $ISSUES" echo "dangerous_count=$ISSUES" >> $GITHUB_OUTPUT if [ "$ISSUES" -gt 0 ]; then @@ -53,7 +62,7 @@ jobs: run: | echo "=== Totality Enforcement ===" MISSING=0 - for f in $(find ochrance-core/ modules/ src/abi/ -name "*.idr" 2>/dev/null); do + for f in $(find ochrance-core/ src/abi/ -name "*.idr" 2>/dev/null); do if ! grep -q "%default total" "$f"; then echo "WARNING: $f missing '%default total'" MISSING=$((MISSING + 1)) @@ -67,11 +76,11 @@ jobs: - name: Partial function check run: | echo "=== Partial Function Check ===" - PARTIAL=$(grep -rn "^partial" ochrance-core/ modules/ src/abi/ --include="*.idr" 2>/dev/null | wc -l || echo 0) + PARTIAL=$(grep -rn "^partial" ochrance-core/ src/abi/ --include="*.idr" 2>/dev/null | wc -l || echo 0) echo "Explicitly partial functions: $PARTIAL" if [ "$PARTIAL" -gt 0 ]; then echo "Review required:" - grep -rn "^partial" ochrance-core/ modules/ src/abi/ --include="*.idr" 2>/dev/null + grep -rn "^partial" ochrance-core/ src/abi/ --include="*.idr" 2>/dev/null fi - name: FFI stub status @@ -100,7 +109,7 @@ jobs: run: | echo "## ECHIDNA Validation Results" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "- Scanned: ochrance-core/, modules/, src/abi/, ffi/zig/" >> $GITHUB_STEP_SUMMARY + echo "- Scanned: ochrance-core/, src/abi/, ffi/zig/" >> $GITHUB_STEP_SUMMARY echo "- Checks: dangerous patterns (believe_me etc), totality enforcement, partial functions, FFI stub status, Zig safety" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "*Powered by ECHIDNA neurosymbolic verification*" >> $GITHUB_STEP_SUMMARY From 2e36ad6e3e04980cc88932dba7564045d848daa9 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 4 Jun 2026 06:19:23 +0000 Subject: [PATCH 09/15] fix(framework): complete and wire in the Progressive assurance proofs Ochrance.Framework.Progressive was a dead orphan (not in any ipkg) with an incomplete Ord instance ('-- ... [Remaining cases]') and an undefined 'atLeast', so its SatisfiesMinimum / attestedSatisfiesLax threshold proof could not check. - Define rank/atLeast, add Eq, complete the Ord instance (the same fix already landed in ochrance-framework). - Add the module to ochrance.ipkg so the threshold proof is now built and CI-verified rather than dead code. Verified: ochrance.ipkg builds 16/16; attestedSatisfiesLax and atLeast are total. --- .../Ochrance/Framework/Progressive.idr | 26 +++++++++++++++---- ochrance.ipkg | 1 + 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/ochrance-core/Ochrance/Framework/Progressive.idr b/ochrance-core/Ochrance/Framework/Progressive.idr index eb45393..478bfd9 100644 --- a/ochrance-core/Ochrance/Framework/Progressive.idr +++ b/ochrance-core/Ochrance/Framework/Progressive.idr @@ -23,13 +23,29 @@ module Ochrance.Framework.Progressive public export data VerificationMode = Lax | Checked | Attested -||| ORDERING: Defines the relationship Lax < Checked < Attested. +||| RANK: numeric strictness, with Lax < Checked < Attested. +public export +rank : VerificationMode -> Nat +rank Lax = 0 +rank Checked = 1 +rank Attested = 2 + +||| Is `mode` at least as strict as `threshold`? +public export +atLeast : (threshold : VerificationMode) -> (mode : VerificationMode) -> Bool +atLeast threshold mode = rank threshold <= rank mode + +public export +Eq VerificationMode where + Lax == Lax = True + Checked == Checked = True + Attested == Attested = True + _ == _ = False + +||| ORDERING: Defines the relationship Lax < Checked < Attested via `rank`. public export Ord VerificationMode where - compare Lax Lax = EQ - compare Lax _ = LT - compare Checked Attested = LT - -- ... [Remaining cases] + compare x y = compare (rank x) (rank y) -------------------------------------------------------------------------------- -- Proof Witnesses diff --git a/ochrance.ipkg b/ochrance.ipkg index 516873b..be855d5 100644 --- a/ochrance.ipkg +++ b/ochrance.ipkg @@ -17,6 +17,7 @@ modules = Ochrance.A2ML.Types , Ochrance.Framework.Interface , Ochrance.Framework.Proof , Ochrance.Framework.Error + , Ochrance.Framework.Progressive , Ochrance.FFI.Crypto , Ochrance.Util.Hex , Ochrance.Filesystem.Types From 5da1afe52e5288a5d1471441cfe25de39cfeb3ac Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 4 Jun 2026 06:40:31 +0000 Subject: [PATCH 10/15] feat(a2ml): prove manifest round-trip invertibility (replace True placeholder) Serializer.roundtripProperty was a vacuous 'roundtripProperty m = True'. A compile-time 'parse (lex (serialize m)) = Right m' theorem is not achievable in Idris2 (the lex stage rests on primitive String ops with no equational theory, and the production parser's if-on-comparison does not reduce at type-check time; it is also simply false for ill-formed manifests, e.g. a non-hex digest). Instead, prove the grammar is invertible with a clean positional token codec over the production types, in new module Ochrance.A2ML.Roundtrip: roundtripManifest : (m : Manifest) -> decodeManifest (encodeManifest m) = Just m by induction (refs list) + case analysis (optional sections), total, with no believe_me/assert_*/postulate. The codec matches token constructors only and delegates enum tags to parseHashAlgorithm-style helpers that do reduce; Nat is encoded in unary to avoid the primitive Integer cast. Also: a real runtime 'roundtripProperty' that exercises the *production* serialize+lex+parse pipeline (the String lexer being the one stage outside the proof's reach), and remove the placeholder from Serializer (it would need to import the parser, creating a cycle). Added Roundtrip to ochrance.ipkg. Verified: builds 17/17; roundtripManifest/refsRT/natRT total; property tests 47/47; the hardened ECHIDNA scan ignores the docstring's pattern mentions. --- ochrance-core/Ochrance/A2ML/Roundtrip.idr | 253 +++++++++++++++++++++ ochrance-core/Ochrance/A2ML/Serializer.idr | 24 +- ochrance.ipkg | 1 + 3 files changed, 262 insertions(+), 16 deletions(-) create mode 100644 ochrance-core/Ochrance/A2ML/Roundtrip.idr diff --git a/ochrance-core/Ochrance/A2ML/Roundtrip.idr b/ochrance-core/Ochrance/A2ML/Roundtrip.idr new file mode 100644 index 0000000..491113f --- /dev/null +++ b/ochrance-core/Ochrance/A2ML/Roundtrip.idr @@ -0,0 +1,253 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +||| Ochrance.A2ML.Roundtrip — a machine-checked manifest round-trip theorem. +||| +||| The production pipeline `parse . lex . serialize` cannot carry a compile-time +||| `= Right m` theorem in Idris2: the `lex` stage rests on primitive String +||| operations (`pack`/`unpack`/`++`/`parseInteger`) that have no provable +||| equational theory, and the production parser is built from `if`-on-comparison +||| (`expectToken`, `unless`) which the type-checker does not reduce. +||| +||| This module instead proves the grammar itself is *invertible*, with a clean +||| positional token codec over the production `Manifest`/`Ref`/... types: +||| +||| decodeManifest (encodeManifest m) = Just m -- for every m +||| +||| The codec pattern-matches on token *constructors* only (never on String +||| literals or `if`), and delegates enum tags to `parseHashAlgorithm`-style +||| helpers that do reduce — so the inductive proof goes through with no +||| `believe_me`, `assert_*`, or `postulate`. The production lexer/parser are +||| then exercised against this reference at runtime (see `roundtripProperty`). + +module Ochrance.A2ML.Roundtrip + +import Ochrance.A2ML.Types +import Ochrance.A2ML.Lexer +import Ochrance.A2ML.Parser +import Ochrance.A2ML.Serializer +import Data.List + +%default total + +-------------------------------------------------------------------------------- +-- Enum tag round-trips (each by case analysis; every case is Refl) +-------------------------------------------------------------------------------- + +algoRT : (a : HashAlgorithm) -> parseHashAlgorithm (show a) = Just a +algoRT SHA256 = Refl +algoRT SHA3_256 = Refl +algoRT BLAKE3 = Refl + +showMode : VerificationMode -> String +showMode Lax = "lax" +showMode Checked = "checked" +showMode Attested = "attested" + +parseMode : String -> Maybe VerificationMode +parseMode "lax" = Just Lax +parseMode "checked" = Just Checked +parseMode "attested" = Just Attested +parseMode _ = Nothing + +modeRT : (m : VerificationMode) -> parseMode (showMode m) = Just m +modeRT Lax = Refl +modeRT Checked = Refl +modeRT Attested = Refl + +-------------------------------------------------------------------------------- +-- Primitive field codecs (markers are nullary token constructors) +-------------------------------------------------------------------------------- + +||| Maybe String: present = LBRACE then the string; absent = RBRACE. +encMStr : Maybe String -> List Token +encMStr Nothing = [RBRACE] +encMStr (Just s) = [LBRACE, STRING s] + +decMStr : List Token -> Maybe (Maybe String, List Token) +decMStr (RBRACE :: rest) = Just (Nothing, rest) +decMStr (LBRACE :: STRING s :: rest) = Just (Just s, rest) +decMStr _ = Nothing + +mstrRT : (x : Maybe String) -> (rest : List Token) -> decMStr (encMStr x ++ rest) = Just (x, rest) +mstrRT Nothing rest = Refl +mstrRT (Just s) rest = Refl + +||| Bool: True = LBRACE, False = RBRACE. +encBool : Bool -> List Token +encBool True = [LBRACE] +encBool False = [RBRACE] + +decBool : List Token -> Maybe (Bool, List Token) +decBool (LBRACE :: rest) = Just (True, rest) +decBool (RBRACE :: rest) = Just (False, rest) +decBool _ = Nothing + +boolRT : (b : Bool) -> (rest : List Token) -> decBool (encBool b ++ rest) = Just (b, rest) +boolRT True rest = Refl +boolRT False rest = Refl + +||| Nat in unary (COLON per successor, EQUALS terminator) — proof-friendly, +||| avoiding the primitive Integer<->Nat cast. +encNat : Nat -> List Token +encNat Z = [EQUALS] +encNat (S k) = COLON :: encNat k + +decNat : List Token -> Maybe (Nat, List Token) +decNat (EQUALS :: rest) = Just (Z, rest) +decNat (COLON :: more) = case decNat more of + Just (k, rest) => Just (S k, rest) + Nothing => Nothing +decNat _ = Nothing + +natRT : (n : Nat) -> (rest : List Token) -> decNat (encNat n ++ rest) = Just (n, rest) +natRT Z rest = Refl +natRT (S k) rest = rewrite natRT k rest in Refl + +||| Maybe Nat. +encMNat : Maybe Nat -> List Token +encMNat Nothing = [RBRACE] +encMNat (Just n) = LBRACE :: encNat n + +decMNat : List Token -> Maybe (Maybe Nat, List Token) +decMNat (RBRACE :: rest) = Just (Nothing, rest) +decMNat (LBRACE :: more) = case decNat more of + Just (n, rest) => Just (Just n, rest) + Nothing => Nothing +decMNat _ = Nothing + +mnatRT : (x : Maybe Nat) -> (rest : List Token) -> decMNat (encMNat x ++ rest) = Just (x, rest) +mnatRT Nothing rest = Refl +mnatRT (Just n) rest = rewrite natRT n rest in Refl + +-------------------------------------------------------------------------------- +-- References (the recursive heart of the grammar) +-------------------------------------------------------------------------------- + +encRef : Ref -> List Token +encRef r = [IDENT r.name, COLON, HASH (show r.hash.algorithm) r.hash.value] + +||| Reference list, terminated by RBRACE. +encRefs : List Ref -> List Token +encRefs [] = [RBRACE] +encRefs (r :: rs) = encRef r ++ encRefs rs + +decRefs : List Token -> Maybe (List Ref, List Token) +decRefs (RBRACE :: rest) = Just ([], rest) +decRefs (IDENT n :: COLON :: HASH a v :: more) = + case parseHashAlgorithm a of + Just algo => case decRefs more of + Just (rs, rest) => Just (MkRef n (MkHash algo v) :: rs, rest) + Nothing => Nothing + Nothing => Nothing +decRefs _ = Nothing + +refsRT : (rs : List Ref) -> (rest : List Token) -> decRefs (encRefs rs ++ rest) = Just (rs, rest) +refsRT [] rest = Refl +refsRT (MkRef n (MkHash a v) :: rs) rest = + rewrite algoRT a in + rewrite refsRT rs rest in Refl + +-------------------------------------------------------------------------------- +-- Attestation (optional) +-------------------------------------------------------------------------------- + +encMAtt : Maybe Attestation -> List Token +encMAtt Nothing = [RBRACE] +encMAtt (Just a) = [LBRACE, STRING a.witness, STRING a.signature, STRING a.pubkey] + +decMAtt : List Token -> Maybe (Maybe Attestation, List Token) +decMAtt (RBRACE :: rest) = Just (Nothing, rest) +decMAtt (LBRACE :: STRING w :: STRING s :: STRING p :: rest) = + Just (Just (MkAttestation w s p), rest) +decMAtt _ = Nothing + +mattRT : (x : Maybe Attestation) -> (rest : List Token) -> decMAtt (encMAtt x ++ rest) = Just (x, rest) +mattRT Nothing rest = Refl +mattRT (Just (MkAttestation w s p)) rest = Refl + +-------------------------------------------------------------------------------- +-- Policy (optional) +-------------------------------------------------------------------------------- + +encMPol : Maybe Policy -> List Token +encMPol Nothing = [RBRACE] +encMPol (Just p) = LBRACE :: STRING (showMode p.mode) :: (encMNat p.maxAge ++ encBool p.requireSig) + +decMPol : List Token -> Maybe (Maybe Policy, List Token) +decMPol (RBRACE :: rest) = Just (Nothing, rest) +decMPol (LBRACE :: STRING modeStr :: more) = + case parseMode modeStr of + Just mode => case decMNat more of + Just (maxAge, more2) => case decBool more2 of + Just (requireSig, rest) => Just (Just (MkPolicy mode maxAge requireSig), rest) + Nothing => Nothing + Nothing => Nothing + Nothing => Nothing +decMPol _ = Nothing + +mpolRT : (x : Maybe Policy) -> (rest : List Token) -> decMPol (encMPol x ++ rest) = Just (x, rest) +mpolRT Nothing rest = Refl +mpolRT (Just (MkPolicy mode ma rs)) rest = + rewrite modeRT mode in + rewrite sym (appendAssociative (encMNat ma) (encBool rs) rest) in + rewrite mnatRT ma (encBool rs ++ rest) in + rewrite boolRT rs rest in Refl + +-------------------------------------------------------------------------------- +-- Whole manifest +-------------------------------------------------------------------------------- + +encodeManifest : Manifest -> List Token +encodeManifest m = + MANIFEST :: STRING m.manifestData.version :: STRING m.manifestData.subsystem + :: (encMStr m.manifestData.timestamp + ++ REFS :: encRefs m.refs + ++ encMAtt m.attestation + ++ encMPol m.policy + ++ [EOF]) + +decodeManifest : List Token -> Maybe Manifest +decodeManifest (MANIFEST :: STRING ver :: STRING sub :: r0) = + case decMStr r0 of + Just (ts, REFS :: r2) => case decRefs r2 of + Just (rs, r3) => case decMAtt r3 of + Just (att, r4) => case decMPol r4 of + Just (pol, EOF :: []) => + Just (MkManifest (MkManifestData ver sub ts) rs att pol) + _ => Nothing + Nothing => Nothing + Nothing => Nothing + _ => Nothing +decodeManifest _ = Nothing + +||| THEOREM: the reference codec is invertible for every manifest. +export +roundtripManifest : (m : Manifest) -> decodeManifest (encodeManifest m) = Just m +roundtripManifest (MkManifest (MkManifestData ver sub ts) rs att pol) = + rewrite mstrRT ts (REFS :: (encRefs rs ++ encMAtt att ++ encMPol pol ++ [EOF])) in + rewrite refsRT rs (encMAtt att ++ encMPol pol ++ [EOF]) in + rewrite mattRT att (encMPol pol ++ [EOF]) in + rewrite mpolRT pol [EOF] in + Refl + +-------------------------------------------------------------------------------- +-- Production-pipeline check (runtime) +-------------------------------------------------------------------------------- + +||| Round-trip check against the *production* pipeline: serialize, then lex and +||| parse, then confirm the result re-serializes identically. +||| +||| `roundtripManifest` above is the formal guarantee (over the reference token +||| codec). This complements it by exercising the real lexer + parser, whose +||| String stage lies outside the proof's reach (primitive `pack`/`unpack` etc. +||| have no equational theory). It holds for well-formed manifests (hex digests, +||| no in-string delimiters) and is exercised by the test suite. +export +roundtripProperty : Manifest -> Bool +roundtripProperty m = + case lex (serialize m) of + Left _ => False + Right toks => case parse toks of + Left _ => False + Right m2 => serialize m2 == serialize m diff --git a/ochrance-core/Ochrance/A2ML/Serializer.idr b/ochrance-core/Ochrance/A2ML/Serializer.idr index 4962d5b..91ef31e 100644 --- a/ochrance-core/Ochrance/A2ML/Serializer.idr +++ b/ochrance-core/Ochrance/A2ML/Serializer.idr @@ -56,19 +56,11 @@ serialize m = -- Roundtrip Verification -------------------------------------------------------------------------------- -||| Test roundtrip property: serialize then parse should produce original manifest -||| This is used in property-based tests to verify serialization correctness. -||| -||| Note: Roundtrip equivalence is semantic, not textual. -||| Whitespace/formatting may differ, but structure must match. -public export -roundtripProperty : Manifest -> Bool -roundtripProperty m = - -- In practice, this would call the lexer and parser: - -- case lex (serialize m) of - -- Right tokens => case parse tokens of - -- Right m' => m == m' - -- Left _ => False - -- Left _ => False - -- For now, we rely on external test harness to verify this. - True -- placeholder - actual verification done in test suite +-- Round-trip correctness lives in `Ochrance.A2ML.Roundtrip`: +-- * `roundtripManifest` — a machine-checked theorem that the grammar is +-- invertible: `decodeManifest (encodeManifest m) = Just m` for every `m`. +-- * `roundtripProperty` — a runtime check composing this serializer with the +-- production lexer and parser. +-- Neither can live here: both must reference the parser, and a serializer that +-- imports the parser would create an import cycle. (The previous placeholder +-- `roundtripProperty m = True` asserted nothing and has been removed.) diff --git a/ochrance.ipkg b/ochrance.ipkg index be855d5..b669993 100644 --- a/ochrance.ipkg +++ b/ochrance.ipkg @@ -14,6 +14,7 @@ modules = Ochrance.A2ML.Types , Ochrance.A2ML.Parser , Ochrance.A2ML.Validator , Ochrance.A2ML.Serializer + , Ochrance.A2ML.Roundtrip , Ochrance.Framework.Interface , Ochrance.Framework.Proof , Ochrance.Framework.Error From 7bba163a7047bbb288d7fdd1d5c79f87f7cfc966 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 4 Jun 2026 06:47:59 +0000 Subject: [PATCH 11/15] test(integration): use valid hex hashes and non-empty Merkle leaves The integration suite (newly runnable now that it builds against the core package instead of the never-building ochrance-fs) had 5 failures, all from invalid test data rather than code defects: - Hashes like "hash_0"/"wrong_hash"/"correct_0" are not hex, so validateManifest correctly rejected them (tests 02, 03, 23) and the lexer could not form a HASH token on round-trip (test 41). Use hex digests. - test 46 built a Merkle tree from two emptyHash leaves; with the XOR placeholder combiner, xor 0 0 = 0, so the root was (correctly) empty while the test expected non-empty. Use distinct non-empty leaves. Verified: integration tests now 55/55; A2ML 16/16; property 47/47. --- tests/integration/IntegrationTests.idr | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/integration/IntegrationTests.idr b/tests/integration/IntegrationTests.idr index 6b287b2..514fb3d 100644 --- a/tests/integration/IntegrationTests.idr +++ b/tests/integration/IntegrationTests.idr @@ -46,7 +46,7 @@ createTestFS numBlocks = MkFSState numBlocks (\idx => if idx < numBlocks - then Just (MkHash BLAKE3 ("hash_" ++ show idx)) + then Just (MkHash BLAKE3 ("deadbeef" ++ show idx)) else Nothing) (MkManifestData "0.1.0" "test-filesystem" Nothing) @@ -94,7 +94,7 @@ test_DetectHashMismatch = do let fs = createTestFS 2 -- Create manifest with different hash for block 0 - let wrongHash = MkHash BLAKE3 "wrong_hash" + let wrongHash = MkHash BLAKE3 "baadf00d" let wrongRef = MkRef "block_0" wrongHash let manifest = MkManifest (MkManifestData "0.1.0" "test-filesystem" Nothing) @@ -176,8 +176,8 @@ test_LinearVerifyAndRepair = do -- Create manifest with correct hashes let manifest = MkManifest (MkManifestData "0.1.0" "test-filesystem" Nothing) - [ MkRef "block_0" (MkHash BLAKE3 "correct_0") - , MkRef "block_1" (MkHash BLAKE3 "correct_1") + [ MkRef "block_0" (MkHash BLAKE3 "c0ffee00") + , MkRef "block_1" (MkHash BLAKE3 "c0ffee01") ] Nothing Nothing @@ -247,8 +247,10 @@ test_RoundtripSerialization = do test_MerkleTreeVerification : IO TestResult test_MerkleTreeVerification = do -- Create simple Merkle tree - let leaf1 = Leaf emptyHash - let leaf2 = Leaf emptyHash + -- distinct, non-empty leaves: with the XOR placeholder combiner, two *empty* + -- leaves would xor to an empty root, so use non-zero leaf hashes here. + let leaf1 = Leaf (replicate 32 1) + let leaf2 = Leaf (replicate 32 2) let tree = Node leaf1 leaf2 -- Get root hash From e7adf725fa540e44ddd248591348fcaecd36866e Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 4 Jun 2026 10:03:34 +0000 Subject: [PATCH 12/15] refactor(merkle): generalize root/verify/soundness over the hash combiner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Parameterize the Merkle construction, verification, and inclusion-proof soundness proof over an arbitrary pure combiner `Combiner = HashBytes -> HashBytes -> HashBytes`: * rootHashWith, verifyProofWith, generateProofWith, reconstructWith, reconstructAppendWith, verifyProofReconstructsWith * merkleCorrectWith : the soundness theorem, which uses NO property of the combiner (combination is an opaque black box) and so holds for every hash function. The existing pure XOR API (rootHashBytes, verifyProof, generateProof, reconstruct, verifyProofReconstructs, merkleCorrect) is recovered as the `hashPairStub` instance of the generic family — definitional aliases, so behavior is byte-identical. XOR is no longer a special case but one point of a universally-quantified result; the BLAKE3 path's soundness is the same theorem at the BLAKE3 combiner, with only its allocation-failure plumbing remaining in the separate ...IO functions. All total, no believe_me/assert_*/postulate. Verified: full core builds from scratch (17/17); property 47/47, integration 55/55, A2ML suite green. --- ochrance-core/Ochrance/Filesystem/Merkle.idr | 221 +++++++++++++------ 1 file changed, 149 insertions(+), 72 deletions(-) diff --git a/ochrance-core/Ochrance/Filesystem/Merkle.idr b/ochrance-core/Ochrance/Filesystem/Merkle.idr index bba0407..7546d80 100644 --- a/ochrance-core/Ochrance/Filesystem/Merkle.idr +++ b/ochrance-core/Ochrance/Filesystem/Merkle.idr @@ -6,6 +6,17 @@ ||| compile time. The `merkleCorrect` theorem proves inclusion-proof soundness: ||| every proof produced by `generateProof` for an in-range leaf reconstructs ||| the tree's true root (a machine-checked propositional equality). +||| +||| The construction, verification, and soundness proof are *parametric in the +||| hash combiner* (`Combiner = HashBytes -> HashBytes -> HashBytes`): see the +||| `...With` family and the `merkleCorrectWith` theorem, whose proof uses no +||| property of the combiner whatsoever (combination is an opaque black box). +||| The pure XOR API (`rootHashBytes`, `verifyProof`, `generateProof`, +||| `reconstruct`, `merkleCorrect`) is recovered as the `hashPairStub` instance, +||| so XOR is no longer a special case but one point of a universally-quantified +||| result; the cryptographic BLAKE3 path's soundness is the same theorem at the +||| BLAKE3 combiner, with only its allocation-failure plumbing living in the +||| separate `...IO` functions. module Ochrance.Filesystem.Merkle @@ -30,6 +41,14 @@ public export emptyHash : HashBytes emptyHash = replicate 32 0 +||| A pure two-input hash combiner over 32-byte digests. The Merkle +||| construction and its soundness proof are universally quantified over this +||| function, so every concrete hash (the XOR placeholder `hashPairStub`, or a +||| cryptographic BLAKE3/SHA-256 combiner) is one instance of the same theorem. +public export +Combiner : Type +Combiner = HashBytes -> HashBytes -> HashBytes + -------------------------------------------------------------------------------- -- Merkle Tree (height-indexed) -------------------------------------------------------------------------------- @@ -43,15 +62,22 @@ data MerkleTree : Nat -> Type where ||| An internal node combining two subtrees of equal height Node : MerkleTree n -> MerkleTree n -> MerkleTree (S n) +||| Root hash under an arbitrary combiner: a leaf is its own hash; a node +||| combines its children's roots with `h`. +public export +rootHashWith : Combiner -> MerkleTree n -> HashBytes +rootHashWith h (Leaf x) = x +rootHashWith h (Node l r) = h (rootHashWith h l) (rootHashWith h r) + ||| Extract the root hash of a Merkle tree (pure placeholder version). ||| For leaves, this is the leaf hash itself. -||| For nodes, this combines the children's hashes using XOR placeholder. +||| For nodes, this combines the children's hashes using the XOR placeholder. ||| -||| NOTE: This uses XOR for totality. Use rootHashBytesIO for cryptographic hashing. +||| NOTE: This is `rootHashWith hashPairStub`. Use rootHashBytesIO for +||| cryptographic hashing. public export rootHashBytes : MerkleTree n -> HashBytes -rootHashBytes (Leaf h) = h -rootHashBytes (Node l r) = hashPairStub (rootHashBytes l) (rootHashBytes r) +rootHashBytes t = rootHashWith hashPairStub t ||| Extract the root hash using BLAKE3 (IO version). ||| This is the cryptographically secure version that should be used in production. @@ -116,17 +142,23 @@ buildMerkleTree {n = S k} hashes = in case splitAt (power 2 k) hashes' of (left, right) => Node (buildMerkleTree left) (buildMerkleTree right) +||| Verify a Merkle inclusion proof against a known root, under combiner `h`. +||| Folds each sibling into the running hash and tests equality with the root. +public export +verifyProofWith : (h : Combiner) -> (root : HashBytes) -> (leaf : HashBytes) + -> MerkleProof -> Bool +verifyProofWith h root leaf [] = root == leaf +verifyProofWith h root leaf ((GoLeft, sibling) :: rest) = + verifyProofWith h root (h leaf sibling) rest +verifyProofWith h root leaf ((GoRight, sibling) :: rest) = + verifyProofWith h root (h sibling leaf) rest + ||| Verify a Merkle inclusion proof against a known root (placeholder version). -||| Uses XOR for totality. Use verifyProofIO for cryptographic verification. +||| This is `verifyProofWith hashPairStub`. Use verifyProofIO for cryptographic +||| verification. public export verifyProof : (root : HashBytes) -> (leaf : HashBytes) -> MerkleProof -> Bool -verifyProof root leaf [] = root == leaf -verifyProof root leaf ((GoLeft, sibling) :: rest) = - let parent = hashPairStub leaf sibling - in verifyProof root parent rest -verifyProof root leaf ((GoRight, sibling) :: rest) = - let parent = hashPairStub sibling leaf - in verifyProof root parent rest +verifyProof root leaf prf = verifyProofWith hashPairStub root leaf prf ||| Verify a Merkle inclusion proof using BLAKE3 (IO version). ||| This is the cryptographically secure version for production use. @@ -157,27 +189,36 @@ export hashLeafIO : HasIO io => List Bits8 -> io (Either OchranceError HashBytes) hashLeafIO bytes = blake3 bytes -||| Generate a Merkle inclusion proof from a tree (pure XOR version). +||| Generate a Merkle inclusion proof from a tree under combiner `h`. ||| Given a leaf index (0-based, left-to-right), extracts the path from -||| leaf to root with sibling hashes at each level. +||| leaf to root with sibling hashes (computed via `rootHashWith h`) at each level. ||| ||| Returns Nothing if the index is out of range. export -generateProof : {n : Nat} -> MerkleTree n -> (leafIdx : Nat) -> Maybe MerkleProof -generateProof {n = Z} (Leaf _) Z = Just [] -generateProof {n = Z} (Leaf _) (S _) = Nothing -generateProof {n = S k} (Node l r) idx = +generateProofWith : {n : Nat} -> (h : Combiner) -> MerkleTree n + -> (leafIdx : Nat) -> Maybe MerkleProof +generateProofWith {n = Z} h (Leaf _) Z = Just [] +generateProofWith {n = Z} h (Leaf _) (S _) = Nothing +generateProofWith {n = S k} h (Node l r) idx = let halfSize = power 2 k in if idx < halfSize then do -- Leaf is in the left subtree - subProof <- generateProof l idx - let siblingHash = rootHashBytes r + subProof <- generateProofWith h l idx + let siblingHash = rootHashWith h r Just (subProof ++ [(GoLeft, siblingHash)]) else do -- Leaf is in the right subtree - subProof <- generateProof r (idx `minus` halfSize) - let siblingHash = rootHashBytes l + subProof <- generateProofWith h r (idx `minus` halfSize) + let siblingHash = rootHashWith h l Just (subProof ++ [(GoRight, siblingHash)]) +||| Generate a Merkle inclusion proof from a tree (pure XOR version). +||| This is `generateProofWith hashPairStub`. +||| +||| Returns Nothing if the index is out of range. +export +generateProof : {n : Nat} -> MerkleTree n -> (leafIdx : Nat) -> Maybe MerkleProof +generateProof t i = generateProofWith hashPairStub t i + ||| Generate a Merkle inclusion proof using BLAKE3 for sibling hashes (IO version). ||| This produces a cryptographically secure proof path. ||| Returns Left on FFI/allocation failure, Right Nothing if index is out of range. @@ -228,40 +269,101 @@ getLeafHash {n = S k} (Node l r) idx = -- Inclusion-Proof Soundness (merkleCorrect) -------------------------------------------------------------------------------- -||| The hash an inclusion proof reconstructs: start from a leaf hash and fold in -||| each sibling, left or right, exactly as `verifyProof` does. This is the value -||| `verifyProof` compares against the root (see `verifyProofReconstructs`). +||| The hash an inclusion proof reconstructs under combiner `h`: start from a +||| leaf hash and fold in each sibling, left or right, exactly as `verifyProofWith +||| h` does. This is the value `verifyProofWith h` compares against the root +||| (see `verifyProofReconstructsWith`). +public export +reconstructWith : Combiner -> HashBytes -> MerkleProof -> HashBytes +reconstructWith h acc [] = acc +reconstructWith h acc ((GoLeft, sib) :: rest) = reconstructWith h (h acc sib) rest +reconstructWith h acc ((GoRight, sib) :: rest) = reconstructWith h (h sib acc) rest + +||| Reconstruct under the XOR placeholder. This is `reconstructWith hashPairStub`. public export reconstruct : HashBytes -> MerkleProof -> HashBytes -reconstruct acc [] = acc -reconstruct acc ((GoLeft, sib) :: rest) = reconstruct (hashPairStub acc sib) rest -reconstruct acc ((GoRight, sib) :: rest) = reconstruct (hashPairStub sib acc) rest - -||| `reconstruct` distributes over path concatenation: folding `p ++ q` equals -||| folding `p`, then folding `q` from that result. -reconstructAppend : (acc : HashBytes) -> (p, q : MerkleProof) - -> reconstruct acc (p ++ q) = reconstruct (reconstruct acc p) q -reconstructAppend acc [] q = Refl -reconstructAppend acc ((GoLeft, sib) :: rest) q = reconstructAppend (hashPairStub acc sib) rest q -reconstructAppend acc ((GoRight, sib) :: rest) q = reconstructAppend (hashPairStub sib acc) rest q - -||| `verifyProof` is exactly a root-equality test on the reconstructed hash. -||| This bridges the propositional soundness theorem below to the Bool API. +reconstruct acc prf = reconstructWith hashPairStub acc prf + +||| `reconstructWith h` distributes over path concatenation: folding `p ++ q` +||| equals folding `p`, then folding `q` from that result. +reconstructAppendWith : (h : Combiner) -> (acc : HashBytes) -> (p, q : MerkleProof) + -> reconstructWith h acc (p ++ q) + = reconstructWith h (reconstructWith h acc p) q +reconstructAppendWith h acc [] q = Refl +reconstructAppendWith h acc ((GoLeft, sib) :: rest) q = + reconstructAppendWith h (h acc sib) rest q +reconstructAppendWith h acc ((GoRight, sib) :: rest) q = + reconstructAppendWith h (h sib acc) rest q + +||| `verifyProofWith h` is exactly a root-equality test on the reconstructed +||| hash. This bridges the propositional soundness theorem below to the Bool API. +export +verifyProofReconstructsWith : (h : Combiner) -> (root, leaf : HashBytes) + -> (prf : MerkleProof) + -> verifyProofWith h root leaf prf + = (root == reconstructWith h leaf prf) +verifyProofReconstructsWith h root leaf [] = Refl +verifyProofReconstructsWith h root leaf ((GoLeft, sib) :: rest) = + verifyProofReconstructsWith h root (h leaf sib) rest +verifyProofReconstructsWith h root leaf ((GoRight, sib) :: rest) = + verifyProofReconstructsWith h root (h sib leaf) rest + +||| `verifyProof` (XOR API) is a root-equality test on `reconstruct`. +||| The `hashPairStub` instance of `verifyProofReconstructsWith`. export verifyProofReconstructs : (root, leaf : HashBytes) -> (prf : MerkleProof) -> verifyProof root leaf prf = (root == reconstruct leaf prf) -verifyProofReconstructs root leaf [] = Refl -verifyProofReconstructs root leaf ((GoLeft, sib) :: rest) = - verifyProofReconstructs root (hashPairStub leaf sib) rest -verifyProofReconstructs root leaf ((GoRight, sib) :: rest) = - verifyProofReconstructs root (hashPairStub sib leaf) rest +verifyProofReconstructs root leaf prf = + verifyProofReconstructsWith hashPairStub root leaf prf -- Injectivity of `Just`, used to read prf back out of the generated proof. justInj : {0 a : Type} -> {0 x, y : a} -> Just x = Just y -> x = y justInj Refl = Refl -||| SOUNDNESS (merkleCorrect): every inclusion proof produced by `generateProof` -||| for an in-range leaf reconstructs the tree's true root. +||| SOUNDNESS, parametric in the combiner `h`: every inclusion proof produced by +||| `generateProofWith h` for an in-range leaf reconstructs (under `reconstructWith +||| h`) the tree's true root (`rootHashWith h`), as a propositional equality on +||| the 32-byte digest. +||| +||| The proof uses no property of `h` at all — combination is treated as an +||| opaque black box — which is precisely why it specialises to *every* hash, the +||| XOR placeholder and a cryptographic BLAKE3 combiner alike. +export +merkleCorrectWith : (h : Combiner) -> {n : Nat} -> (t : MerkleTree n) -> (i : Nat) + -> (leaf : HashBytes) -> (prf : MerkleProof) + -> getLeafHash t i = Just leaf + -> generateProofWith h t i = Just prf + -> reconstructWith h leaf prf = rootHashWith h t +merkleCorrectWith h (Leaf x) Z leaf prf gl gp = + rewrite justInj (sym gl) in rewrite justInj (sym gp) in Refl +merkleCorrectWith h (Leaf x) (S j) leaf prf gl gp = absurd gl +merkleCorrectWith h {n = S k} (Node l r) i leaf prf gl gp with (i < power 2 k) proof pb + merkleCorrectWith h {n = S k} (Node l r) i leaf prf gl gp | True with (generateProofWith h l i) proof ps + merkleCorrectWith h {n = S k} (Node l r) i leaf prf gl gp | True | Just sub = + let prfIs : (prf = sub ++ [(GoLeft, rootHashWith h r)]) + prfIs = sym (justInj gp) + ih : (reconstructWith h leaf sub = rootHashWith h l) + ih = merkleCorrectWith h l i leaf sub gl ps + in rewrite prfIs in + rewrite reconstructAppendWith h leaf sub [(GoLeft, rootHashWith h r)] in + rewrite ih in Refl + merkleCorrectWith h {n = S k} (Node l r) i leaf prf gl gp | True | Nothing = + absurd gp + merkleCorrectWith h {n = S k} (Node l r) i leaf prf gl gp | False with (generateProofWith h r (i `minus` power 2 k)) proof ps + merkleCorrectWith h {n = S k} (Node l r) i leaf prf gl gp | False | Just sub = + let prfIs : (prf = sub ++ [(GoRight, rootHashWith h l)]) + prfIs = sym (justInj gp) + ih : (reconstructWith h leaf sub = rootHashWith h r) + ih = merkleCorrectWith h r (i `minus` power 2 k) leaf sub gl ps + in rewrite prfIs in + rewrite reconstructAppendWith h leaf sub [(GoRight, rootHashWith h l)] in + rewrite ih in Refl + merkleCorrectWith h {n = S k} (Node l r) i leaf prf gl gp | False | Nothing = + absurd gp + +||| SOUNDNESS (merkleCorrect) for the XOR placeholder API: the `hashPairStub` +||| instance of `merkleCorrectWith`. Every inclusion proof produced by +||| `generateProof` for an in-range leaf reconstructs the tree's true root. ||| ||| Stated as a propositional equality on the 32-byte digest — the strongest ||| honest form. `verifyProof` then accepts the proof, because it is exactly @@ -276,29 +378,4 @@ merkleCorrect : {n : Nat} -> (t : MerkleTree n) -> (i : Nat) -> getLeafHash t i = Just leaf -> generateProof t i = Just prf -> reconstruct leaf prf = rootHashBytes t -merkleCorrect (Leaf h) Z leaf prf gl gp = - rewrite justInj (sym gl) in rewrite justInj (sym gp) in Refl -merkleCorrect (Leaf h) (S j) leaf prf gl gp = absurd gl -merkleCorrect {n = S k} (Node l r) i leaf prf gl gp with (i < power 2 k) proof pb - merkleCorrect {n = S k} (Node l r) i leaf prf gl gp | True with (generateProof l i) proof ps - merkleCorrect {n = S k} (Node l r) i leaf prf gl gp | True | Just sub = - let prfIs : (prf = sub ++ [(GoLeft, rootHashBytes r)]) - prfIs = sym (justInj gp) - ih : (reconstruct leaf sub = rootHashBytes l) - ih = merkleCorrect l i leaf sub gl ps - in rewrite prfIs in - rewrite reconstructAppend leaf sub [(GoLeft, rootHashBytes r)] in - rewrite ih in Refl - merkleCorrect {n = S k} (Node l r) i leaf prf gl gp | True | Nothing = - absurd gp - merkleCorrect {n = S k} (Node l r) i leaf prf gl gp | False with (generateProof r (i `minus` power 2 k)) proof ps - merkleCorrect {n = S k} (Node l r) i leaf prf gl gp | False | Just sub = - let prfIs : (prf = sub ++ [(GoRight, rootHashBytes l)]) - prfIs = sym (justInj gp) - ih : (reconstruct leaf sub = rootHashBytes r) - ih = merkleCorrect r (i `minus` power 2 k) leaf sub gl ps - in rewrite prfIs in - rewrite reconstructAppend leaf sub [(GoRight, rootHashBytes l)] in - rewrite ih in Refl - merkleCorrect {n = S k} (Node l r) i leaf prf gl gp | False | Nothing = - absurd gp +merkleCorrect t i leaf prf gl gp = merkleCorrectWith hashPairStub t i leaf prf gl gp From b6645b3fc38da20c1234404d70506ecd5089e030 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 01:00:42 +0000 Subject: [PATCH 13/15] docs(proofs): add the proof-campaign ledger (Stage 0 close) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Authoritative, dependency-sorted plan for verifying the Ochrance estate, designed to survive context compaction as the thread's source of truth. Records: * Estate map + what "verified" means per repo (ochrance / framework / svalinn). * Decisions: D1 converge on ochrance core (retire framework's duplicate, harvest its mode-indexed Interface); D2 crypto binding as a typed CollisionResistant interface; D3 svalinn migrates (AffineScript + Ephapax) before proving. * Current proven surface (clean: all-total, axiom-free). * Remaining program, Stages 1-4, dependency-sorted, with per-stage watch-fors and model guidance (Opus for discovery, Sonnet for mechanisation). * Honestly-bounded items (primitive-reduction walls — documented, not faked). * Disposed-track briefs (svalinn migrate+verify, framework retire+harvest, ABI/Zig FFI, PR #32 CI watch). --- docs/PROOFS.adoc | 216 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 docs/PROOFS.adoc diff --git a/docs/PROOFS.adoc b/docs/PROOFS.adoc new file mode 100644 index 0000000..3c8fcdc --- /dev/null +++ b/docs/PROOFS.adoc @@ -0,0 +1,216 @@ += Ochránce — Proof Campaign Ledger +:toc: macro +:sectnums: + +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) + +This is the authoritative, dependency-sorted plan for driving the formal +verification of the Ochránce estate to completion. It is the durable source of +truth for the proof thread: it survives context compaction, so each working +window starts from this file rather than from chat memory. + +toc::[] + +== Scope & estate map + +Three repositories are in scope. "Verification" means something different in each. + +[cols="1,2,2",options="header"] +|=== +| Repo | What "verified" means | This thread executes? + +| `ochrance` +| Idris2 dependent-type proofs (the canonical core). +| *Yes — primary focus.* + +| `ochrance-framework` +| Architecture + docs. Its `ochrance-core` is a weaker, type-incompatible + duplicate and is being *retired* (see Decision D1). +| Docs/Interface harvest only — core is deleted, not proven. + +| `svalinn` +| ReScript edge gateway → migrating to AffineScript + Ephapax. Type-safety and + schema/property tests, not dependent types. +| *No — disposed* to a delegated session (see Disposed Tracks). Specs tracked here. +|=== + +== Decisions on record + +[cols="1,3",options="header"] +|=== +| ID | Decision + +| *D1 — Converge on ochrance* +| `ochrance/ochrance-core` is the single source of proof truth. + `ochrance-framework/ochrance-core` is retired. Its one genuinely better idea — + the *mode-indexed, subsystem-parameterised* `VerifiedSubsystem` Interface + (`VerificationProof mode SubState SubManifest`) — is harvested into ochrance. + Framework keeps its real value: the docs (A2ML-SPEC, FFI-CONTRACT, THREAT-MODEL, + WHITEPAPER, ROADMAP, L4-POLICIES) and architecture. + +| *D2 — Crypto binding as a typed interface* +| The security half of the Merkle argument (collision resistance) is modelled as + an Idris hypothesis `CollisionResistant h`, and the binding theorem is + discharged against it — not left as prose. Stubbed in Stage 1, discharged in the + final stage. + +| *D3 — svalinn: migrate before proving* +| Prove where the language is final; migrate-then-prove where it is changing. + svalinn migrates ReScript → *AffineScript* (gateway bulk; affine boundary + decoders eliminate `Obj.magic`) + *Ephapax* linear tokens (surgical: JWT/JTI + single-use & revocation, OAuth nonce/PKCE, session/container lifecycle). Its + *specifications* are captured now (Disposed Tracks); its *proofs* come after + migration. Proving the about-to-be-deleted ReScript is waste. +|=== + +== Current proof state (ochrance, canonical) + +The core is *clean*: all 24 modules carry `%default total`; zero +`believe_me` / `assert_*` / `postulate` / holes / `partial` on any proof symbol. + +.Proven, machine-checked (axiom-free) +[cols="2,3",options="header"] +|=== +| Theorem | Statement (shape) + +| `merkleCorrect` / `merkleCorrectWith` +| inclusion-proof soundness; generic over the hash combiner `h` (XOR & BLAKE3 are + instances). `reconstructWith h leaf prf = rootHashWith h t`. +| `verifyProofReconstructs(With)` +| `verifyProofWith h root leaf prf = (root == reconstructWith h leaf prf)`. +| `reconstructAppendWith`, `powerTwoSucc`, `justInj` +| supporting lemmas. +| `roundtripManifest` + sub-codecs (`algoRT`, `modeRT`, `refsRT`, `mpolRT`, …) +| grammar invertibility: `decodeManifest (encodeManifest m) = Just m`. +| `SatisfiesMinimum` / `attestedSatisfiesLax` +| progressive-assurance threshold witness. +| ABI `Handle` / `createHandle` +| `So (ptr /= 0)` non-null invariant discharged via `choose`. +|=== + +== The remaining proof program (dependency-sorted) + +Each stage is sized to roughly one context window; the thread compacts at each +boundary with this file as the hand-off. *Watch-fors* are things that may force a +design change or a model downshift mid-stage. + +=== Stage 1 — Merkle closure + crypto-binding interface [model: Opus] + +. `buildMerkleTree` correctness: `getLeafHash (buildMerkleTree hs) i = Just (index i hs)`, + and the root-fold law relating `rootHashWith h (buildMerkleTree hs)` to `hs`. +. *IO↔pure bridge*: prove `verifyProofIO` / `rootHashBytesIO` compute the + `…With (blake3 combiner)` spec modulo the `Either` allocation-failure plumbing — + connecting the proven theorem to the *production* crypto path. +. *D2*: introduce `CollisionResistant h` and `merkleBinding` (stub/interface). ++ +WATCH-FOR: the `replace`-by-`powerTwoSucc` transport in `buildMerkleTree` may fight +the index lemma; if it forces a builder/API reshape, stop and surface the fork. + +=== Stage 2 — Verify + Validator soundness [model: Opus → Sonnet if mechanical] + +. Validator: validated manifest ⇒ structural invariants hold. +. `verifyState` agrees with the manifest, wired to `merkleCorrect`. +. Hex codec: `hexStringToBytes (bytesToHex bs) = Just bs` and the length law. ++ +WATCH-FOR: `Verify` and `Hex` likely rest on primitive `String`/`Bits8` +comparison — the *same wall* as the lexer round-trip. If so the honest theorem is +propositional-over-decidable (document the boundary; do *not* reach for +`believe_me`). This can shorten Stage 2 and justify a Sonnet downshift. + +=== Stage 3 — Repair correctness (L3, linear types) [model: Opus] + +. `verify (repair s) = Valid` — the meaty linear-type theorem. +. Repair idempotence as a *proof* (today only a property test). +. Harvest framework's mode-indexed Interface; state the `VerifiedSubsystem` law + `verify (repair s m) m = Right …` and prove the FSState instance satisfies it. ++ +WATCH-FOR: may need proof witnesses threaded through the `1`-quantified API — +possible signature changes to `Repair.idr`. + +=== Stage 4 — Completeness, binding discharge, write-up [model: Sonnet; Opus if binding is hard] + +. Merkle *completeness* (converse of soundness): in-range leaf ⇒ a proof exists. +. *D2 discharge*: prove the binding argument against `CollisionResistant`. +. Progressive monotonicity: the remaining `SatisfiesMinimum` cases (all `Refl`). +. Final ledger pass; thesis-aligned summary (ICFP/PLDI/SOSP framing). + +CLEAR = every intended theorem proven *or honestly bounded* (primitive walls +documented, never faked), disposed tracks handed off, PRs landed. + +== Honestly-bounded items (NOT failures — boundaries by design) + +* *Production-pipeline round-trip* (`parse . lex . serialize = Right m`) cannot + carry a compile-time theorem: `pack`/`unpack`/`parseInteger` are primitives with + no equational theory. The honest guarantee is `roundtripManifest` over a + reference token codec, complemented by `roundtripProperty` at runtime. +* *`root == root` Bool step* in `merkleCorrect`: the propositional digest equality + is the strongest honest statement; discharging the residual primitive-`Bits8` + `==` would need an unsafe reflexivity axiom. + +== Disposed tracks (handoff briefs) + +These are *not* this thread's work. Each is a brief for a delegated session, +disposed at Compaction 1. Specs live here so nothing is lost. + +=== svalinn — migrate (AffineScript + Ephapax), then verify [model: Sonnet] + +PRECONDITION: language migration precedes proof (Decision D3). + +. *Migrate* ReScript → AffineScript (gateway, auth, policy, MCP, vörðr, compose). + Affine boundary-decoders replace the *20+ `Obj.magic`* casts in security paths. +. *Ephapax linear tokens* for exactly-once resources: JWT/JTI single-use + the + revocation ledger (fixes the `hasRevocationList = false // TODO` hazard by + construction), OAuth nonce/PKCE, session/container lifecycle. +. *Unblock CI*: the 53 ReScript unit/security tests don't execute under Deno + (`@rescript/core` resolution) — they vanish with the migration; ensure the + AffineScript suite runs in CI. +. *Specs to discharge after migration* (language-agnostic): policy determinism; + `allow ∩ deny` composition + monotonicity; JWT single-use & revocation; + no unchecked boundary casts; JSON-Schema conformance of all 9 gateway types. +. *Planned SPARK properties* (`cerro-torre-integration.adoc §6.2`): attestation + sig, key lookup, threshold sig, log inclusion, policy eval. ++ +DEPENDENCY: Ephapax has *3 Admitted* (Coq) — svalinn's linear guarantees inherit +those holes until closed. Track upstream. + +=== ochrance-framework — retire core, harvest Interface, keep docs [model: Sonnet] + +. Delete `ochrance-framework/ochrance-core`; make the repo depend on / reference + the canonical ochrance core. +. Harvest the mode-indexed `VerifiedSubsystem` Interface into ochrance (Stage 3). +. Fix the weak spots that should *not* be carried over: `decodeSnapshot` always + returns `Nothing` (repair unreachable); `signatureValid : Bool` and + `allPresent : Bool` are unguarded runtime flags; no totality gate in CI. +. Keep and maintain the docs — they are the framework repo's real value. + +=== ochrance ABI / Zig FFI hardening [model: Sonnet/Haiku] + +. `blake3Hash` in `src/abi/Ochrance/ABI/Foreign.idr` is `covering` + a stub + returning `replicate 32 0` — wire it to the real Zig `libochrance` BLAKE3. +. ECHIDNA FFI is entirely stubbed (`echidnaProve` returns + `Left "FFI not yet implemented"`). + +=== CI watch — PR #32 [model: Haiku/Sonnet] + +Keep PR #32 (combiner generalisation) shepherded to green; it is subscribed. + +== Model guidance (per the thread's operating model) + +[cols="1,3",options="header"] +|=== +| Model | Use + +| *Opus 4.8* +| Proof *discovery* — "is this provable, what is the shape": Stages 1, 3, and any + novel theorem or structural-wall reasoning. +| *Sonnet 4.6* +| Proof *mechanisation* (known shape), refactors, tests, and the disposed-track + application work (svalinn AffineScript, framework, ABI). +| *Haiku 4.5* +| Grunt sweeps — suites, grep, SPDX/format, CI watch. +|=== + +RULE: when a stage's remaining work is all mechanical, downshift this thread to +Sonnet to conserve Opus budget; when a *research-grade wall* appears, pause for the +design conversation rather than pushing proofs. From bbbcc110155355b781353ed53ecd02c1cbdc7075 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 01:19:24 +0000 Subject: [PATCH 14/15] docs(proofs): correct svalinn target to Ephapax (was AffineScript) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per maintainer decision, svalinn migrates ReScript → Ephapax (Ephapax replaces ALL ReScript); AffineScript is not the target — it appeared only as a format exemplar for the migration map. Update D3, the estate map, the disposed-track brief, and model guidance accordingly. Record that the first svalinn deliverable is the migration-map (critical chain) handed to an offline Claude with ephapax access, that the chain's root unknown is whether Ephapax is yet an implementable application language, that svalinn main CI is red on pre-existing ReScript breakage (not to be fixed in ReScript), and that the migration structurally discharges svalinn security issue #13. --- docs/PROOFS.adoc | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/docs/PROOFS.adoc b/docs/PROOFS.adoc index 3c8fcdc..3d8f111 100644 --- a/docs/PROOFS.adoc +++ b/docs/PROOFS.adoc @@ -30,8 +30,8 @@ Three repositories are in scope. "Verification" means something different in eac | Docs/Interface harvest only — core is deleted, not proven. | `svalinn` -| ReScript edge gateway → migrating to AffineScript + Ephapax. Type-safety and - schema/property tests, not dependent types. +| ReScript edge gateway → migrating to *Ephapax* (replaces all ReScript). + Type-safety and schema/property tests, not dependent types. | *No — disposed* to a delegated session (see Disposed Tracks). Specs tracked here. |=== @@ -57,11 +57,13 @@ Three repositories are in scope. "Verification" means something different in eac | *D3 — svalinn: migrate before proving* | Prove where the language is final; migrate-then-prove where it is changing. - svalinn migrates ReScript → *AffineScript* (gateway bulk; affine boundary - decoders eliminate `Obj.magic`) + *Ephapax* linear tokens (surgical: JWT/JTI - single-use & revocation, OAuth nonce/PKCE, session/container lifecycle). Its - *specifications* are captured now (Disposed Tracks); its *proofs* come after - migration. Proving the about-to-be-deleted ReScript is waste. + svalinn migrates ReScript → *Ephapax* — Ephapax replaces *all* the ReScript. + Its linear/exactly-once types make JWT/JTI single-use & revocation, OAuth + nonce/PKCE, and session/container lifecycle *compile-time* guarantees, and typed + boundary decoders eliminate the 20+ `Obj.magic`. Its *specifications* are + captured now (Disposed Tracks); its *proofs* come after migration. Proving the + about-to-be-deleted ReScript is waste. (AffineScript is *not* the target — it + surfaced only as a format exemplar for the migration map.) |=== == Current proof state (ochrance, canonical) @@ -153,18 +155,26 @@ documented, never faked), disposed tracks handed off, PRs landed. These are *not* this thread's work. Each is a brief for a delegated session, disposed at Compaction 1. Specs live here so nothing is lost. -=== svalinn — migrate (AffineScript + Ephapax), then verify [model: Sonnet] +=== svalinn — migrate ReScript → Ephapax, then verify [model: Sonnet] -PRECONDITION: language migration precedes proof (Decision D3). +PRECONDITION: language migration precedes proof (Decision D3). The *first* +deliverable is a migration map (the critical chain of blockers) — handed to an +offline Claude with `hyperpolymath/ephapax` access, targeting +`svalinn/docs/ephapax-migration/BLOCKER-LINEAGE.adoc`. ROOT of that chain, and the +one thing this session could not settle (ephapax is out of scope here): whether +Ephapax is yet an implementable application language (compiler, runtime, +HTTP/async I/O, JSON, fetch, crypto, FFI) or still a proof-level calculus. -. *Migrate* ReScript → AffineScript (gateway, auth, policy, MCP, vörðr, compose). - Affine boundary-decoders replace the *20+ `Obj.magic`* casts in security paths. +. *Migrate* ReScript → Ephapax (gateway, auth, policy, validation, MCP, vörðr, + compose; ~27 `src/` modules + the `ui/` ReScript frontend). Typed boundary + decoders make the *20+ `Obj.magic`* casts in security paths impossible. . *Ephapax linear tokens* for exactly-once resources: JWT/JTI single-use + the revocation ledger (fixes the `hasRevocationList = false // TODO` hazard by - construction), OAuth nonce/PKCE, session/container lifecycle. + construction), OAuth nonce/PKCE, session/container lifecycle, vörðr delegation. . *Unblock CI*: the 53 ReScript unit/security tests don't execute under Deno (`@rescript/core` resolution) — they vanish with the migration; ensure the - AffineScript suite runs in CI. + Ephapax suite runs in CI. (svalinn `main` CI is currently red on pre-existing + ReScript breakage — do not fix it in ReScript; it is being replaced.) . *Specs to discharge after migration* (language-agnostic): policy determinism; `allow ∩ deny` composition + monotonicity; JWT single-use & revocation; no unchecked boundary casts; JSON-Schema conformance of all 9 gateway types. @@ -173,6 +183,10 @@ PRECONDITION: language migration precedes proof (Decision D3). + DEPENDENCY: Ephapax has *3 Admitted* (Coq) — svalinn's linear guarantees inherit those holes until closed. Track upstream. ++ +DISCHARGES: svalinn security issue #13 (19 Critical/High panic-attack findings — +`decodeJwt()` without `jwtVerify()`, `JSON.parseExn`) is addressed structurally by +this migration (verified JWT + typed deserialisation), not by patching ReScript. === ochrance-framework — retire core, harvest Interface, keep docs [model: Sonnet] @@ -206,7 +220,7 @@ Keep PR #32 (combiner generalisation) shepherded to green; it is subscribed. novel theorem or structural-wall reasoning. | *Sonnet 4.6* | Proof *mechanisation* (known shape), refactors, tests, and the disposed-track - application work (svalinn AffineScript, framework, ABI). + application work (svalinn Ephapax migration, framework, ABI). | *Haiku 4.5* | Grunt sweeps — suites, grep, SPDX/format, CI watch. |=== From f40c9e61aadabc5682615253e18abe4770e75fd1 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 11:58:36 +0000 Subject: [PATCH 15/15] docs: add post-migration re-entry runbook + link from ledger AFTER-MIGRATION.adoc is the round-trip closure for the disposed svalinn track: read the spike verdict, branch on D3 validity, reconcile (Obj.magic / issue #13 / PR #32 / CI), then resume PROOFS.adoc. The ledger's svalinn brief gains a RE-ENTRY pointer to it. https://claude.ai/code/session_011z2t8zAxfcCNLJzU7YdpBQ --- docs/AFTER-MIGRATION.adoc | 83 +++++++++++++++++++++++++++++++++++++++ docs/PROOFS.adoc | 4 ++ 2 files changed, 87 insertions(+) create mode 100644 docs/AFTER-MIGRATION.adoc diff --git a/docs/AFTER-MIGRATION.adoc b/docs/AFTER-MIGRATION.adoc new file mode 100644 index 0000000..93d7dd6 --- /dev/null +++ b/docs/AFTER-MIGRATION.adoc @@ -0,0 +1,83 @@ += Ochránce — Re-entry After the svalinn → Ephapax Migration +:toc: macro +:sectnums: + +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) + +This is the *round-trip closure* for the svalinn migration that was disposed from +the proof campaign (`docs/PROOFS.adoc`, Decision *D3*; outbound charter at +`svalinn/docs/ephapax-migration/HANDOFF.adoc`). Read it when the migration +excursion *returns*, before resuming the proof program. It exists so the loop +"delegate → migrate → come back" closes cleanly even after this thread is gone. + +toc::[] + +== The loop + +---- +proof thread (here) + └─ dispose svalinn migration → HANDOFF.adoc → [svalinn + ephapax session] + runs the spike, then the map, then the port (its own draft PRs) + ←─ return here → read THIS doc → reconcile → resume PROOFS.adoc +---- + +You are at the *return* step. + +== Reachability first (so you don't hit a 404) + +The migration's outputs live in the *svalinn* repo, not here. To do the +reconciliation below you need *either* `hyperpolymath/svalinn` in this session's +scope, *or* the delegated session to paste you its spike verdict. The proof +campaign itself only needs `ochrance`. + +== Step 1 — Read the spike verdict (the gate) + +The migration was *gated* on a readiness spike (can Ephapax host an HTTP gateway +today?). Its result is the capability matrix in +`svalinn/docs/ephapax-migration/BLOCKER-LINEAGE.adoc`. Branch on it: + +[cols="1,4",options="header"] +|=== +| Verdict | What it means / what you do + +| *GREEN* — Ephapax viable +| The migration proceeded. Go to Step 2. + +| *RED* — a MUST-have absent, *D3 invalidated* +| svalinn's language decision is *reopened*. Do *not* resume svalinn proofs. + Update `PROOFS.adoc` D3 with the new decision (stay ReScript + prove / + AffineScript / wait on Ephapax), then treat svalinn as a fresh disposed track. +|=== + +== Step 2 — Reconcile (green path) + +Fold the migration's results back into the campaign. Checklist: + +* [ ] `BLOCKER-LINEAGE.adoc` exists and its ring-0 critical chain was executed. +* [ ] *Zero* `Obj.magic` in svalinn `src/` (the 20+ casts are gone + *structurally*, not patched). +* [ ] JWT/JTI revocation is true-by-construction → svalinn *issue #13* is + dischargeable: verify and close it. +* [ ] The *Ephapax* test suite runs *green* in CI (the pre-existing ReScript red + is gone because the ReScript is gone — not because it was fixed). +* [ ] svalinn *PR #32* (the AffineScript language-policy PR) was reconciled to + Ephapax or closed; the `.claude/CLAUDE.md` language table was updated. +* [ ] `PROOFS.adoc` updated: tick the svalinn disposed track; *promote* its + post-migration specs (Appendix E of the charter) into the proof program — now + the language is final, they are provable. + +== Step 3 — Resume the proof campaign + +Return to `docs/PROOFS.adoc` and continue at the stage you left (Stage 1 on Opus +if you came straight back). The svalinn specs become a *sibling track* once +Ephapax is the language; prove them via the route the spike established — +Ephapax's own linear types, the Idris ABI layer (`svalinn/src/abi/*.idr`), or +SPARK (`svalinn/docs/cerro-torre-integration.adoc` §6.2). + +== Cross-references + +* `docs/PROOFS.adoc` — the proof-campaign ledger (Decision D3, disposed tracks). +* `svalinn/docs/ephapax-migration/HANDOFF.adoc` — the outbound charter. +* `svalinn/docs/ephapax-migration/BLOCKER-LINEAGE.adoc` — the migration's own + output (spike verdict + critical chain), produced by the delegated session. diff --git a/docs/PROOFS.adoc b/docs/PROOFS.adoc index 3d8f111..3f9a068 100644 --- a/docs/PROOFS.adoc +++ b/docs/PROOFS.adoc @@ -187,6 +187,10 @@ those holes until closed. Track upstream. DISCHARGES: svalinn security issue #13 (19 Critical/High panic-attack findings — `decodeJwt()` without `jwtVerify()`, `JSON.parseExn`) is addressed structurally by this migration (verified JWT + typed deserialisation), not by patching ReScript. ++ +RE-ENTRY: the outbound charter now lives at +`svalinn/docs/ephapax-migration/HANDOFF.adoc`; when this track *returns*, read +`docs/AFTER-MIGRATION.adoc` (the round-trip closure) before resuming the campaign. === ochrance-framework — retire core, harvest Interface, keep docs [model: Sonnet]