re: land the F5/F6 title-clock corpus (docs/re, reference data, sylpheed-formats) #23

Merged
fabi merged 511 commits from auto/frame-blend-draw-path into main 2026-09-13 11:16:19 +00:00
2 changed files with 120 additions and 0 deletions
Showing only changes of commit 3d9309dace - Show all commits

View File

@@ -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.

View File

@@ -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.")