#!/usr/bin/env bash # CHECK-q158 -- tools/check_lint.py can see a leading label, and its forge # consumer stopped pinning a cell count (volt, 2026-11-02). # # The defect: a CHECK written `CHECK: selftest: python3 v.py` -- a label word, # a colon, then the command -- was graded SOUND by this rubric while bash exits # 127 on it (`selftest:: command not found`) before running anything. Measured # on this lane's own ralph iteration, 2026-11-02, and on the runner's # 2026-10-27 forge log (`line: python3 ...`), which lost an iteration to it. # The fix added the eighth class, LABEL_PREFIX. The repair that followed is the # second half: wizard-work/forge/verify_check_lint_classes_dry.py asserted # `selftest: 37 cells` and byte-identity of the two selftest outputs, so every # cell check_lint gained reddened a verifier about a refactor nobody touched. # # Legs: # rubric the selftest is green at the count the docstring claims, and the # baseline pin agrees with both # label the two real shapes grade LABEL_PREFIX, `--fail-on-fault` exits # 1 on them, and the cut point is printed # control the three boundary shapes (colon not in the first word, colon in # an assignment, quoted first token) stay SOUND, so the rule is # anchored rather than "any colon anywhere" # mutant a copy whose label rule cannot match reds its own selftest with # six cells failing -- the new cells are load-bearing # consumer the forge verifier exits 0, reports 11/11, and its parity leg # prints a positive added-cell count instead of pinning 37 # record this item's queue record is present and names the class # # Exit codes: 0 all legs passed, 1 a fault, 2 could not grade. set -u set -o pipefail cd "$(dirname "${BASH_SOURCE[0]}")" || exit 2 ROOT="$(pwd)" TOOL="$ROOT/tools/check_lint.py" FORGE="$ROOT/wizard-work/forge/verify_check_lint_classes_dry.py" BASELINE="$ROOT/tools/selftest_baseline.tsv" WORK="$(mktemp -d "${TMPDIR:-/tmp}/check-q158.XXXXXX")" || exit 2 trap 'rm -rf "$WORK"' EXIT passed=0 failed=0 ungradable=0 row() { printf ' %-10s %s\n' "$1" "$2"; } fault() { row "$1" "FAULT $2"; failed=$((failed + 1)); } # --- leg 1: the rubric, its docstring claim, and the pinned count ------------- python3 "$TOOL" --selftest >"$WORK/self.out" 2>&1 self_rc=$? cells="$(sed -n 's/^selftest: \([0-9][0-9]*\) cells,.*/\1/p' "$WORK/self.out" | head -1)" grep -q "^selftest: [0-9][0-9]* cells, [0-9][0-9]* passed, 0 failed$" "$WORK/self.out" shape_rc=$? doc_claim="$(grep -c "^ python3 check_lint.py --selftest .* # ${cells} cells" "$TOOL" 2>/dev/null)" pin="$(awk -F'\t' '$1 == "check_lint.py" {print $2; exit}' "$BASELINE" 2>/dev/null)" if [ "$self_rc" -eq 0 ] && [ "$shape_rc" -eq 0 ] && [ -n "$cells" ] \ && [ "$doc_claim" = "1" ] && [ "$pin" = "$cells" ]; then row rubric "PASS $(tail -n 1 "$WORK/self.out"); docstring claim and baseline pin both $cells" passed=$((passed + 1)) elif [ -z "$cells" ] || [ -z "$pin" ]; then row rubric "UNGRADABLE no count parsed (cells='$cells' pin='$pin')" cat "$WORK/self.out" ungradable=$((ungradable + 1)) else fault rubric "rc=$self_rc shape_rc=$shape_rc doc_claim=$doc_claim pin=$pin cells=$cells" cat "$WORK/self.out" fi # --- leg 2: the two measured shapes are named, rejected, and cut ------------- python3 "$TOOL" --check "selftest: python3 tools/check_lint.py --selftest" \ >"$WORK/l1.out" 2>&1 l1=$? python3 "$TOOL" --check "line: python3 tools/check_lint.py --selftest" \ >"$WORK/l2.out" 2>&1 l2=$? python3 "$TOOL" --check "selftest: python3 x.py" --fail-on-fault >/dev/null 2>&1 l3=$? if [ "$l1" -eq 0 ] && [ "$l2" -eq 0 ] \ && grep -q '^LABEL_PREFIX:' "$WORK/l1.out" \ && grep -q '^LABEL_PREFIX:' "$WORK/l2.out" \ && grep -q '"command_after_label": "python3 tools/check_lint.py --selftest"' "$WORK/l1.out" \ && [ "$l3" -eq 1 ]; then row label "PASS selftest:/line: -> LABEL_PREFIX, cut point printed, --fail-on-fault rc 1" passed=$((passed + 1)) else fault label "rc($l1,$l2,$l3) want (0,0,1) with a LABEL_PREFIX verdict and a cut point" head -3 "$WORK/l1.out" "$WORK/l2.out" fi # --- leg 3: the boundary stays SOUND ----------------------------------------- bad=0 for c in "python3 x.py: --selftest" "PATH=/a:/b python3 x.py" "'note: x' cmd"; do python3 "$TOOL" --check "$c" --fail-on-fault >"$WORK/c.out" 2>&1 || bad=$((bad + 1)) done if [ "$bad" -eq 0 ]; then row control "PASS three boundary shapes stay SOUND under --fail-on-fault" passed=$((passed + 1)) else fault control "$bad of 3 boundary shapes were graded a fault" cat "$WORK/c.out" fi # --- leg 4: the label cells are load-bearing --------------------------------- mkdir -p "$WORK/mut/tools" cp "$TOOL" "$WORK/mut/tools/check_lint.py" sed -i 's|^LABEL_RE = re.compile(.*)$|LABEL_RE = re.compile(r"^(?P