[FIX] §9 named invocation, and the spec omission that hid it
The steward asked whether he could be invoked. §9 says yes — "the steward calls it by
name, the executor or jurist yields the floor, the fool answers at length" — and it was
not built. Worse, yesterday's spec did not list it: not in what exists, not in what is
owed. A document whose whole job is to say what is and is not there, silently missing a
requirement. Recorded in the spec rather than quietly corrected, because that is the
fourth negative state-claim to go wrong in two days and the second inside a document
written to prevent the class.
The net is widened EXPLICITLY and in one dimension, per the steward's ruling: §9
licenses LENGTH for this surface and nothing else, so the ceiling goes 9 -> 180 and the
one-line rule lifts, while no-advice, no-questions, no-'we', no-vocabulary-of-lack and
no-addresses are untouched and are not parameterised anywhere. Silence-on-violation
holds here too. Six negative controls assert each clause still bites at length — the
executable form of "widen it explicitly, but never relax silence-on-violation".
⚠ Length is where the no-truth-value guard is most at risk: a fool given a paragraph
elaborates, and elaboration is how a gesture becomes a claim. The prompt spends its
budget there rather than on register.
It finds the newest transcript itself, so the steward runs it directly rather than
through the executor. That is the point of the surface: a relayed fool is the executor's
paraphrase of a fool.
⚠ One control asserted a literal the prompt did not use ("NO TRUTH VALUE" against
"NOTHING YOU SAY MAY HAVE A TRUTH VALUE"). It fired, correctly. Rewritten to test the
substance — phrase present AND negated — because the original would have passed happily
on any rewording that dropped the constraint entirely.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J6hZXNYSxEfZseBGTni4sf
This commit is contained in:
co-authored by
Claude Opus 5
parent
8cc0a3159b
commit
8a0e5c448d
@@ -132,11 +132,22 @@ Write ONE line in his voice. Absolute constraints:
|
||||
Output the line and nothing else. No quotes, no preamble."""
|
||||
|
||||
|
||||
def acceptable(line: str) -> tuple[bool, str]:
|
||||
if not line or "\n" in line.strip():
|
||||
def acceptable(line: str, max_words: int = MAX_WORDS,
|
||||
one_line: bool = True) -> tuple[bool, str]:
|
||||
"""The net. Widening is possible but must be PASSED EXPLICITLY at the call site.
|
||||
|
||||
⚠ Steward's ruling, 2026-08-25: "If the seam voice needs a wider net because seams
|
||||
warrant more than nine words, widen it explicitly and say so, but NEVER relax
|
||||
silence-on-violation." So the defaults are the filed ones, a caller that wants more
|
||||
room has to say so in its own source, and no caller can turn the net off — the
|
||||
clauses below are not parameterised, and deliberately.
|
||||
"""
|
||||
if not line:
|
||||
return False, "empty"
|
||||
if one_line and "\n" in line.strip():
|
||||
return False, "not one line"
|
||||
n = len(line.split())
|
||||
if not (MIN_WORDS <= n <= MAX_WORDS):
|
||||
if not (MIN_WORDS <= n <= max_words):
|
||||
return False, f"{n} words"
|
||||
for pat in BANNED:
|
||||
if re.search(pat, line, re.I):
|
||||
@@ -210,6 +221,13 @@ def selftest() -> int:
|
||||
ck("A2n rejects vocabulary of lack", not acceptable("The third one is missing now.")[0])
|
||||
ck("A2n rejects 'we'", not acceptable("We did the second part first.")[0])
|
||||
ck("A2n rejects two lines", not acceptable("First line here.\nSecond line here.")[0])
|
||||
# The widening is explicit, and it widens ONLY what it names.
|
||||
ck("A2 widening admits a longer line",
|
||||
acceptable(" ".join(["word"] * 40), max_words=120)[0])
|
||||
ck("A2n widening does NOT relax the clauses",
|
||||
not acceptable("You should " + " ".join(["word"] * 40), max_words=120)[0])
|
||||
ck("A2n widening does NOT relax 'we'",
|
||||
not acceptable("We " + " ".join(["word"] * 40), max_words=120)[0])
|
||||
|
||||
# A3 — the prompt carries the no-truth-value constraint verbatim, not by intention.
|
||||
p = build_prompt("aside", "SOUL", "MATERIAL")
|
||||
|
||||
Reference in New Issue
Block a user