#!/usr/bin/env sh set -eu cpp_card=${CPP_CARD:-../lab-rv32i-freertos-task-stack-vector} contract=config/paired-experiment.json test -f "$cpp_card/include/FreeRTOSConfig.h" || { echo "paired K02 not found at $cpp_card" >&2 exit 1 } cmp include/FreeRTOSConfig.h "$cpp_card/include/FreeRTOSConfig.h" cmp vendor/FreeRTOS-Kernel/UPSTREAM.md "$cpp_card/vendor/FreeRTOS-Kernel/UPSTREAM.md" check_hash() { path=$1 key=$2 expected=$(jq -r ".kernel.files_sha256[\"$key\"]" "$contract") actual=$(sha256sum "$path" | awk '{print $1}') test "$actual" = "$expected" || { echo "pair contract hash mismatch: $path" >&2 exit 1 } } check_hash vendor/FreeRTOS-Kernel/tasks.c tasks.c check_hash vendor/FreeRTOS-Kernel/list.c list.c check_hash vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c heap_4.c check_hash vendor/FreeRTOS-Kernel/portable/GCC/RISC-V/port.c port.c check_hash vendor/FreeRTOS-Kernel/portable/GCC/RISC-V/portASM.S portASM.S config_hash=$(sha256sum include/FreeRTOSConfig.h | awk '{print $1}') test "$config_hash" = "$(jq -r .config.sha256 "$contract")" grep -Fq 'work_limit = 20000U' "$cpp_card/src/tasks/task01_task_wrapper.cpp" grep -Fq 'expected_sum = 200010000U' "$cpp_card/src/tasks/task01_task_wrapper.cpp" grep -Fq 'worker_stack_words = 256U' "$cpp_card/src/tasks/task01_task_wrapper.cpp" grep -Fq 'supervisor_stack_words = 160U' "$cpp_card/src/tasks/task01_task_wrapper.cpp" echo "PASS pair: kernel/config/workload/stack contract matches K02 C++"