sylpheed-port found an asserting step in their suite that could not fail: a swallowed the verdict. Tested the same thing here and both of mine had it. check_refuted.py found a PLANTED unmarked revival, printed it, and exited 0. impossibility_scope.py printed 'CONTROL FAILED' and exited 0 -- in a tool written today, one message after they described the shape. Now: unmarked assertions exit 1; a failed control exits 2. Suppressed mentions do not fail, since they are unverified rather than wrong and failing on them would put the clean state out of reach. Controlled in both directions -- clean 0, planted revival 1, control passing 0, control deliberately broken 2. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
85 lines
4.4 KiB
Python
85 lines
4.4 KiB
Python
#!/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.")
|
|
|
|
# 🔴 The control above PRINTED its failure and this script exited 0 -- so a broken
|
|
# control was indistinguishable from a passing one to anything but a human reading
|
|
# the last line. Fixed 2026-08-31, the same day the tool was written, after
|
|
# sylpheed-port reported the identical shape in their own suite. The LISTING is a
|
|
# prompt and never fails; the CONTROL failing is a hard error, because every hit
|
|
# above is meaningless without it.
|
|
if (not _m) or [w for w in SCOPED if w in _m.group(0).lower()]:
|
|
sys.exit(2)
|