From 30e53f599cfb2fd9a930d0b3fe815abc8c3c2531 Mon Sep 17 00:00:00 2001 From: Sylpheed RE agent Date: Wed, 26 Aug 2026 22:55:58 +0000 Subject: [PATCH] tools: reject degenerate captures in screen_id instead of classifying them Every statistic in screen_id is an AREA FRACTION, so a capture that is not a game frame still produces clean numbers. Measured 2026-08-26: a guard shot came back 10x710 -- a sliver -- and classified as `menu` with green=0.0000, white=0.0157. The guard passed, the fixed key sequence went out anyway, and the run loaded a TUTORIAL instead of the save's Stage 02. This is the second time this failure has been paid for. bin/screenshot's own header records the first (2026-08-18): a second window of class "xenia_canary" meant grabs came back as slivers and "a whole session's screen ids were noise". That fix hardened the CAPTURE side only, so the same failure still reached the oracles by any other path. Reject it at the point the answer is consumed too: features() now returns None below 640x360 and classify() reports `none`. Verified: the 10x710 sliver -> `none`; readyroom, flight and the briefing capture all still classify as before. --- .../re/captures/sliver-classified-as-menu.png | Bin 0 -> 4514 bytes tools/re-capture/screen_id.py | 29 +++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 docs/re/captures/sliver-classified-as-menu.png diff --git a/docs/re/captures/sliver-classified-as-menu.png b/docs/re/captures/sliver-classified-as-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..f5d4c6a0dae6e2ea67a177d6102b07cab483924f GIT binary patch literal 4514 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