diff --git a/docs/re/data/impossibility-scope-sweep.txt b/docs/re/data/impossibility-scope-sweep.txt new file mode 100644 index 00000000..e8c2b1be --- /dev/null +++ b/docs/re/data/impossibility-scope-sweep.txt @@ -0,0 +1,45 @@ +# Are this corpus's negatives about the WORLD or about an INSTRUMENT? +# 2026-08-31. The sweep I said I owed after fixing one instance by hand. +# +# The mission's third classification is "undecodable, WITH REACH". A negative +# written as a property of the SUBJECT when what was established is a property of +# the METHOD is the failure that put "an individual SE's audio is not extractable +# yet" at the head of a page whose own later section had located the waves, and +# left INDEX quoting it for days. sylpheed-port swept their tree and reported +# clean; this is mine. +# +# TOOL: tools/re-capture/impossibility_scope.py +# +################################################################################ +# 🔴 THE TOOL FAILED ITS OWN CONTROL TWICE, and the control is the only reason +# this sweep means anything. The control is the ONE KNOWN true positive -- the +# heading I fixed by hand this week. +# +# FAILURE 1: the pattern required a sentence-ending period. HEADINGS DO NOT END +# IN PERIODS, and the known instance was a heading. It matched nothing in any +# heading in the corpus, so a "clean" report would have been vacuous. +# +# FAILURE 2: with that fixed, the scoring HID it. "yet" was in my list of words +# that scope a negative to a method. ⚠️ IT IS NOT ONE. "yet" and "so far" are +# temporal HEDGES that name no instrument, no search and no place looked -- and +# that is precisely what let "not extractable yet" read as bounded while +# claiming a property of the audio. A scope names a METHOD or a PLACE +# ("from the file", "by sorting", "from the hash alone"). +# +# ✅ Control passes now: the known heading is matched and shown. +# +################################################################################ +# ✅ RESULT, where it matters most: the two AMPLIFIER files are CLEAN. +# Every hit in INDEX.md and HANDOFF.md was read. All are legitimate: +# * logical facts -- "layers that never touch the same pixel cannot be ordered +# wrongly", "95 s apart is impossible"; +# * the legend's own definition of *measured* ("not on the disc in any form we +# found" -- itself scoped); +# * claims quoted in order to mark them retracted; +# * INDEX 158, which is my own strikethrough of the refuted SE-audio claim. +# +# ⚠️ REACH, and it is large: 147 candidate sentences corpus-wide, 130 of which +# name no scope in the same sentence. I read the INDEX and HANDOFF subset only. +# The other files are NOT swept, and the regex has a high false-positive rate -- +# "for a directory that no longer exists" is a match. This is a prompt to read, +# not a defect count, and reading 130 by hand is the cost nobody has paid yet. diff --git a/tools/re-capture/impossibility_scope.py b/tools/re-capture/impossibility_scope.py new file mode 100644 index 00000000..342d6474 --- /dev/null +++ b/tools/re-capture/impossibility_scope.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 +"""Which negatives in this corpus are about the WORLD, and which about an INSTRUMENT? + +The mission's third classification is "undecodable, WITH REACH" -- looked here, +here and here. A negative written as a property of the subject when what was +established is a property of the method is the failure that put +"an individual SE's audio is not extractable yet" at the head of a page whose own +later section located the waves, and left it quoted in INDEX for days +(data/index-vs-pages-audit.txt). + +sylpheed-port swept their own docs for this and came back clean. Mine has not been +swept. This finds the candidate sentences; ⚠️ IT DOES NOT JUDGE THEM. A negative +IS allowed to be about the world -- "a 24-bit modulus cannot name an 8-character +identifier uniquely" is a fact, not a limitation of a tool. Every hit is read. + +Scored, so the reading is ordered rather than exhaustive: a sentence that already +names an instrument, a search, or a reach is very likely fine. + + impossibility_scope.py [--all] +""" +import re, sys +from pathlib import Path + +CLAIM = re.compile( + r"[^.\n]*\b(?:not (?:extractable|recoverable|available|possible|decodable|knowable)" + r"|cannot be (?:\w+ ){0,3}\w+|is impossible|are impossible|no \w+ exists" + r"|nowhere on the disc|unrecoverable|not on the disc)\b[^.\n]*(?:\.|$)", re.I) +# words that SCOPE a negative to a method, a search or a reach +# ⚠️ "yet" and "so far" were in this list and are NOT scopes -- they are temporal +# HEDGES that name no instrument, no search and no place looked. That is exactly +# what made "an individual SE's audio is not extractable yet" read as bounded while +# claiming a property of the audio, and it is why this tool's own control failed +# twice before the list was right. A scope names a METHOD or a PLACE. +SCOPED = ("looked", "searched", "scan", "probe", "reach", "instrument", "harness", + "this container", "with the tools", "our reader", "from the file", + "from the disc", "from the image", "from the hash", "by sorting", + "by counting", "by re-running", "by key list", "attack", "exhaustive", + "we could not", "i could not", "could not find", "not found by", "tested") + +files = sorted(Path("docs").rglob("*.md")) +hits = [] +for f in files: + if f.name in ("REFUTED.md", "METHOD.md"): + continue # these are ABOUT dead claims; quoting one is not asserting it + for n, line in enumerate(f.read_text(errors="replace").splitlines(), 1): + for m in CLAIM.finditer(line): + s = m.group(0).strip() + if len(s) < 30: + continue + scoped = sum(1 for w in SCOPED if w in s.lower()) + hits.append((scoped, f, n, s)) + +hits.sort(key=lambda h: h[0]) +show = hits if "--all" in sys.argv else [h for h in hits if h[0] == 0] +print(f"{len(hits)} negative claim(s); {sum(1 for h in hits if h[0]==0)} name no " + f"instrument, search or reach in the same sentence.\n") +for scoped, f, n, s in show[:40]: + print(f" {f}:{n}") + print(f" {s[:150]}") + +# 🔴 CONTROL, and it must pass before any output above is believed. The one known +# instance of this defect in this corpus was a HEADING -- "an individual SE's audio +# is not extractable yet" -- and the first version of this regex required a +# sentence-ending period, so it matched NOTHING in any heading and would have +# reported the corpus clean. Run the control after every edit to the pattern. +KNOWN = "## \u2754 And a new negative: an individual SE's audio is not extractable yet" +_m = CLAIM.search(KNOWN) +print("\ncontrol -- the known true positive (a heading, since fixed):") +if not _m: + print(" \U0001F534 CONTROL FAILED: the pattern does not match it. Nothing above means anything.") +else: + _sc = [w for w in SCOPED if w in _m.group(0).lower()] + print(f" matched; scope words {_sc} -> {'HIDDEN by scoring' if _sc else 'shown'}") + if _sc: + print(" \U0001F534 CONTROL FAILED: scored as scoped, so it would not appear in the default listing.")