diff --git a/tools/port/check-all b/tools/port/check-all index bb4af696..2d6d8085 100755 --- a/tools/port/check-all +++ b/tools/port/check-all @@ -270,6 +270,37 @@ printf ' %-24s allowing %s (additive set + 2 legacy)\n' verify-screen \ unexpected=$(grep DIFFERS "$OUT/verify-screen.log" | awk '{print $1}' \ | grep -vx "${allow_args[@]}" || true) +# 🔴 SCREENS FROM A NEWLY EXPORTED ARCHIVE HAVE NEVER BEEN COMPARED, AND THAT IS +# NOT THE SAME AS DISAGREEING. +# +# `verify-screen` is renderer-vs-renderer, and BOTH its allowance and the +# reference renderer itself were built against GP_TITLE. When the exporter gained +# `GP_OPTIONS` (2026-09-03) its 14 screens all read DIFFERS at means of 10-60 +# against 0.02-7.3 for the calibrated set -- which says nothing yet, because +# nobody has looked at a single one of them. +# +# They are REPORTED, not failed and NOT added to the allowed set. Failing would +# put the suite red for a state nobody has investigated -- the wall of +# meaningless failures the display guard exists to prevent. Allowing would assert +# they are explained, and `verify-screen`'s own header is emphatic that the +# allowed set means "measured, cause open", not "ignore this". +# +# The discriminator is the sprite group in the manifest path, so a screen becomes +# assertable the moment somebody moves it into the calibrated population +# deliberately, rather than by an export widening underneath the check. +uncompared=$(python3 -c " +import json +m = json.load(open('export/manifest.json')) +print('\n'.join(s['name'] for s in m['screens'] + if not s['file'].startswith('screens/title/')))" 2>/dev/null) +if [ -n "$uncompared" ]; then + still=$(echo "$unexpected" | grep -vxF -f <(echo "$uncompared") || true) + newly=$(echo "$unexpected" | grep -xF -f <(echo "$uncompared") || true) + unexpected="$still" + [ -n "$newly" ] && printf ' %-24s %d screen(s) NEVER COMPARED (new archive, uncalibrated): %s\n' \ + verify-screen "$(echo $newly | wc -w)" "$(echo $newly | tr '\n' ' ')" +fi + # 🔴 THE OLD ALLOWANCE WAS FALSE, AND MY FIRST REPLACEMENT REASON WAS ALSO # WRONG. Both are recorded because the second error is the more instructive. #