From c00cca45ff3d76f1c68f0ad8835f7b692a967d52 Mon Sep 17 00:00:00 2001 From: giles Date: Sun, 7 Jun 2026 11:37:46 +0000 Subject: [PATCH] conformance: migrate go onto shared driver (dict, 609/609 parity) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Go has the same structure as erlang: suites load into one session and each exposes a pass counter plus a *count* (total) counter rather than a fail counter. MODE=dict fits — each suite's runner is a dict literal {:passed P :failed (- count P) :total count}. No driver change; conformance.conf + 3-line shim, historical scoreboard schema preserved. Parity verified 609/609 (0 fail), every suite matching baseline. Co-Authored-By: Claude Opus 4.8 (1M context) --- lib/go/conformance.conf | 65 ++++++++++ lib/go/conformance.sh | 142 +--------------------- lib/go/scoreboard.json | 3 +- lib/go/scoreboard.md | 1 - plans/agent-briefings/conformance-loop.md | 7 +- 5 files changed, 75 insertions(+), 143 deletions(-) create mode 100644 lib/go/conformance.conf diff --git a/lib/go/conformance.conf b/lib/go/conformance.conf new file mode 100644 index 00000000..b86399cb --- /dev/null +++ b/lib/go/conformance.conf @@ -0,0 +1,65 @@ +# Go-on-SX conformance config — sourced by lib/guest/conformance.sh. +# +# Like erlang: suites load into one session and each exposes a pass counter and +# a *count* (total) counter, not a fail counter. dict mode fits — each runner is +# a dict literal computing :failed as count - pass. + +LANG_NAME=go +MODE=dict + +PRELOADS=( + lib/guest/lex.sx + lib/guest/ast.sx + lib/guest/pratt.sx + lib/go/lex.sx + lib/go/parse.sx + lib/go/types.sx + lib/go/sched.sx + lib/go/eval.sx + lib/go/std/strings.sx + lib/go/std/strconv.sx +) + +# name:file:(runner) — runner is a dict literal {:passed :failed :total}. +SUITES=( + "lex:lib/go/tests/lex.sx:{:passed go-test-pass :failed (- go-test-count go-test-pass) :total go-test-count}" + "parse:lib/go/tests/parse.sx:{:passed go-parse-test-pass :failed (- go-parse-test-count go-parse-test-pass) :total go-parse-test-count}" + "types:lib/go/tests/types.sx:{:passed go-types-test-pass :failed (- go-types-test-count go-types-test-pass) :total go-types-test-count}" + "eval:lib/go/tests/eval.sx:{:passed go-eval-test-pass :failed (- go-eval-test-count go-eval-test-pass) :total go-eval-test-count}" + "runtime:lib/go/tests/runtime.sx:{:passed go-rt-test-pass :failed (- go-rt-test-count go-rt-test-pass) :total go-rt-test-count}" + "stdlib:lib/go/tests/stdlib.sx:{:passed go-std-test-pass :failed (- go-std-test-count go-std-test-pass) :total go-std-test-count}" + "e2e:lib/go/tests/e2e.sx:{:passed go-e2e-test-pass :failed (- go-e2e-test-count go-e2e-test-pass) :total go-e2e-test-count}" +) + +# Preserve the historical scoreboard schema so consumers of +# lib/go/scoreboard.json keep working. +emit_scoreboard_json() { + local n=${#GC_NAMES[@]} i status + printf '{\n' + printf ' "language": "go",\n' + printf ' "total_pass": %d,\n' "$GC_TOTAL_PASS" + printf ' "total": %d,\n' "$GC_TOTAL" + printf ' "suites": [' + for ((i=0; i&2 - exit 1 -fi - -VERBOSE="${1:-}" -TMPFILE=$(mktemp) -OUTFILE=$(mktemp) -trap "rm -f $TMPFILE $OUTFILE" EXIT - -# Each suite: name | pass-counter | total-counter -SUITES=( - "lex|go-test-pass|go-test-count" - "parse|go-parse-test-pass|go-parse-test-count" - "types|go-types-test-pass|go-types-test-count" - "eval|go-eval-test-pass|go-eval-test-count" - "runtime|go-rt-test-pass|go-rt-test-count" - "stdlib|go-std-test-pass|go-std-test-count" - "e2e|go-e2e-test-pass|go-e2e-test-count" -) - -cat > "$TMPFILE" <<'EPOCHS' -(epoch 1) -(load "lib/guest/lex.sx") -(load "lib/guest/ast.sx") -(load "lib/guest/pratt.sx") -(load "lib/go/lex.sx") -(load "lib/go/parse.sx") -(load "lib/go/types.sx") -(load "lib/go/sched.sx") -(load "lib/go/eval.sx") -(load "lib/go/std/strings.sx") -(load "lib/go/std/strconv.sx") -(load "lib/go/tests/lex.sx") -(load "lib/go/tests/parse.sx") -(load "lib/go/tests/types.sx") -(load "lib/go/tests/eval.sx") -(load "lib/go/tests/runtime.sx") -(load "lib/go/tests/stdlib.sx") -(load "lib/go/tests/e2e.sx") -EPOCHS - -idx=0 -for entry in "${SUITES[@]}"; do - name="${entry%%|*}" - pass_var=$(echo "$entry" | awk -F'|' '{print $2}') - total_var=$(echo "$entry" | awk -F'|' '{print $3}') - epoch=$((100 + idx)) - echo "(epoch $epoch)" >> "$TMPFILE" - echo "(eval \"(list $pass_var $total_var)\")" >> "$TMPFILE" - idx=$((idx + 1)) -done - -"$SX_SERVER" < "$TMPFILE" > "$OUTFILE" 2>&1 - -parse_pair() { - local epoch="$1" - local line - line=$(grep -A1 "^(ok-len $epoch " "$OUTFILE" | tail -1) - echo "$line" | sed -E 's/[()]//g' -} - -TOTAL_PASS=0 -TOTAL_COUNT=0 -JSON_SUITES="" -MD_ROWS="" - -idx=0 -for entry in "${SUITES[@]}"; do - name="${entry%%|*}" - epoch=$((100 + idx)) - pair=$(parse_pair "$epoch") - pass=$(echo "$pair" | awk '{print $1}') - count=$(echo "$pair" | awk '{print $2}') - if [ -z "$pass" ] || [ -z "$count" ]; then - pass=0 - count=0 - fi - TOTAL_PASS=$((TOTAL_PASS + pass)) - TOTAL_COUNT=$((TOTAL_COUNT + count)) - status="ok" - marker="✅" - if [ "$pass" != "$count" ]; then - status="fail" - marker="❌" - fi - if [ "$VERBOSE" = "-v" ]; then - printf " %-12s %s/%s\n" "$name" "$pass" "$count" - fi - if [ -n "$JSON_SUITES" ]; then JSON_SUITES+=","; fi - JSON_SUITES+=$'\n ' - JSON_SUITES+="{\"name\":\"$name\",\"pass\":$pass,\"total\":$count,\"status\":\"$status\"}" - MD_ROWS+="| $marker | $name | $pass | $count |"$'\n' - idx=$((idx + 1)) -done - -printf '\nGo-on-SX conformance: %d / %d\n' "$TOTAL_PASS" "$TOTAL_COUNT" - -cat > lib/go/scoreboard.json < lib/go/scoreboard.md <