149 lines
6.8 KiB
Bash
149 lines
6.8 KiB
Bash
#!/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<label>[A-Z][A-Z0-9_]*)")|' \
|
|
"$WORK/mut/tools/check_lint.py"
|
|
python3 "$WORK/mut/tools/check_lint.py" --selftest >"$WORK/mut.out" 2>&1
|
|
mut_rc=$?
|
|
if [ "$mut_rc" -eq 1 ] && grep -q '^selftest: [0-9][0-9]* cells, [0-9][0-9]* passed, 6 failed$' "$WORK/mut.out"; then
|
|
row mutant "PASS a label rule that cannot match reds its own selftest: $(tail -n 1 "$WORK/mut.out")"
|
|
passed=$((passed + 1))
|
|
else
|
|
fault mutant "rc=$mut_rc (want 1 with 6 failed)"
|
|
tail -4 "$WORK/mut.out"
|
|
fi
|
|
|
|
# --- leg 5: the consumer no longer pins a count ------------------------------
|
|
python3 "$FORGE" >"$WORK/forge.out" 2>&1
|
|
forge_rc=$?
|
|
added="$(sed -n 's/.*pair(s) all survive (\([0-9][0-9]*\) cell(s) added).*/\1/p' "$WORK/forge.out" | head -1)"
|
|
if [ "$forge_rc" -eq 0 ] && grep -q '^verify: 11 checks, 11 passed, 0 failed$' "$WORK/forge.out" \
|
|
&& [ -n "$added" ] && [ "$added" -gt 0 ]; then
|
|
row consumer "PASS forge verifier 11/11 rc 0, parity leg reports $added added cell(s), no pinned count"
|
|
passed=$((passed + 1))
|
|
else
|
|
fault consumer "rc=$forge_rc added='$added'"
|
|
tail -4 "$WORK/forge.out"
|
|
fi
|
|
|
|
# --- leg 6: the record ------------------------------------------------------
|
|
# The block, not a fixed window: the class is named nine lines into the record,
|
|
# and an -A window made this leg red on a correct append.
|
|
q="$ROOT/WORK-QUEUE.md"
|
|
awk '/^## Q158 closure/{f=1; next} f && /^## /{f=0} f' "$q" >"$WORK/q158.md"
|
|
q_lines="$(wc -l <"$WORK/q158.md" | tr -d ' ')"
|
|
if grep -q '^## Q158 closure' "$q" && [ "${q_lines:-0}" -gt 0 ] \
|
|
&& grep -q 'LABEL_PREFIX' "$WORK/q158.md"; then
|
|
row record "PASS WORK-QUEUE.md carries the Q158 closure ($q_lines lines) and names LABEL_PREFIX"
|
|
passed=$((passed + 1))
|
|
else
|
|
fault record "the Q158 closure is missing from WORK-QUEUE.md, empty, or does not name the class (lines=$q_lines)"
|
|
fi
|
|
|
|
echo
|
|
echo "CHECK-q158: $passed leg(s) passed, $failed fault(s), $ungradable ungradable"
|
|
[ "$failed" -eq 0 ] || exit 1
|
|
[ "$ungradable" -eq 0 ] || exit 2
|
|
exit 0
|