Files
David F Glidden 7fd2f9efdc [FIX] The twin ledger was incomplete as ground truth, and the gate could not have said so
Caught by the steward asking whether CONTROL-B was PASS 2. It is not — different
document, different question — but checking the answer exposed a defect in the
correlation measurement I had just proposed.

CONTROL-B IS NOT CONTROL-A PLUS FIVE DEFECTS. The transformations overlap the two
real defects trial 04 found:
 · clause-5-out-of-scope   GONE — D4 deletes that quotation outright
 · dropped-qualifier       GONE — D1 replaces the sentence with an explicit
                           version of the same error, which is why the twin
                           carries openly what the control carried concealed
 · asserted precedence     SURVIVES, at line 51, UNLOGGED

So the twin holds six defects and the ledger recorded five. The grading rule
would have scored a correct finding on the sixth as a FALSE POSITIVE.

AND THE GATE COULD NOT HAVE CAUGHT IT. twin.py verifies that the ledger records
every DIFFERENCE between the two documents. It does not verify that the ledger
records every DEFECT in the twin. Those are different claims, and the file
asserted the second while proving only the first — a defect already present in
the control is not a difference, so it passes untouched. Fifth instance of a
check certifying a property of the code while claiming a property of the result,
this time inside the artifact built to escape that class.

Fixed: an inherited_defects list records I1 with its provenance and why it
survives; a defects_not_surviving note records the two that do not, so the twin
is never mistaken for a superset of the control; the grading rule now spans both
sets; and the gate's own output states what it does NOT establish, warning when
inherited_defects is absent — because absent is not the same as none, it means
no one has looked.

The correlation measurement can now use the twin honestly. It could not have
before this.

Note on this message: the first attempt lost three terms to shell command
substitution, because backticks in a -m string are evaluated by zsh. Amended.
Recorded rather than silently repaired, since a commit message is part of the
record and this one is about incomplete records.
2026-08-02 19:03:37 +02:00

99 lines
7.7 KiB
JSON

{
"control": "CONTROL-A-flagging-and-modifying.md",
"twin": "CONTROL-B-flagging-and-modifying-defective.md",
"kernel": "CONTROL-KERNEL-v1.1.md",
"kernel_sha256": "d4b48db23612b30ff66e26b6235065a3c2f3c9be19d750dafc97e80a1329974d",
"created": "2026-08-02",
"principle": "Each defect converts a D into a claim resting on something unstated, WITHOUT naming an assumption. Every defect must survive all mechanical checks: tiling, §3.1 tagging completeness, §3.2 Q-resolution, §3.3 heading screen, and the A-prohibition. A defect a check can catch is not testing the reader.",
"grading": "AMENDED 2026-08-02 after trial 04. A finding is a TRUE POSITIVE iff it identifies a claim recorded EITHER in `defects` (injected) OR in `inherited_defects` (present in CONTROL-A, surviving into the twin). Anything else is a false positive. The original rule counted only `defects`, and would have scored a correct finding on the inherited defect as a false positive.",
"ground_truth_scope": "WHAT THE BIDIRECTIONAL GATE ESTABLISHES, AND WHAT IT DOES NOT. twin.py verifies that the ledger records every DIFFERENCE between control and twin. It does NOT verify that the ledger records every DEFECT in the twin — those are different claims, and the file previously asserted the second while proving only the first. A defect already present in the control passes the gate untouched, because it is not a difference. Trial 04 found two such defects in CONTROL-A; `inherited_defects` below records the one that survives the transformations. The gate remains correct for what it checks.",
"inherited_defects": [
{
"id": "I1",
"type": "ASSERTED-PRECEDENCE",
"origin": "Present in CONTROL-A; not injected. Found by the jurist (Fable 5) in trial 04, as the second half of its Finding 1.",
"text": "It stands over every clause above.",
"undemonstrated": "Asserts that Constitutional Constraint 1 overrides the other quoted clauses. Constraint 1 establishes no such precedence, and the constitution's own precedence language ranks the constraints above 'any session instruction, seed, or convenience' — not above other constitutional clauses. That preamble is not quoted in either document. The severance is load-bearing: the Memory Discipline clause's method terminates in 'then correct whichever layer was wrong', and both documents conclude that correction is closed.",
"survives_because": "No transformation touches it. In CONTROL-B the quotation it severs has itself been deleted by D4, so the assertion is left standing over a remedy the document no longer quotes."
}
],
"defects_not_surviving": "CONTROL-A's other two trial-04 defects do NOT appear in the twin, and this is recorded so the twin is not mistaken for a superset of the control. The clause-5 scope violation is gone because D4 deletes that quotation outright. The dropped-qualifier defect is gone because D1 replaces that sentence with an explicit version of the same error — which is why the twin carries openly what the control carried concealed.",
"defects": [
{
"id": "D1",
"type": "SCOPE-WIDENING",
"target": "the obligation's reach",
"undemonstrated": "The quoted review-cadence clause is triggered by a document's 'stated review dates'. Nothing quoted here establishes that this file has one. The replacement asserts that it does, as a subordinate clause, and the whole later application to this file then rests on it.",
"why_invisible_to_checks": "It parses, carries one primitive, is taggable D, and touches no quotation.",
"provenance": "This is the exact defect the author caught in draft 2 of CONTROL-A and removed. It is reintroduced deliberately, which is the only honest use for it.",
"edits": [
{
"find": "A document that has drifted is to be flagged.",
"replace": "This file, having a stated review date, is to be flagged when it drifts."
}
]
},
{
"id": "D2",
"type": "UNDEFINED-TERM",
"target": "the first horn of the reductio",
"undemonstrated": "Nothing quoted defines a 'limit of the system', and no quoted clause requires that limits be reported — Constraint 4 is not among the five quotations. The claim imports both a term and an obligation from outside the document's own axioms.",
"why_invisible_to_checks": "One primitive, no quotation touched, and it reads as the natural constitutional register.",
"provenance": "Also removed from draft 2 of CONTROL-A, for exactly this reason.",
"edits": [
{
"find": "A conflict between two constitutional clauses exceeds the executor's authority.",
"replace": "A conflict between two constitutional clauses is a limit that the system must report."
}
]
},
{
"id": "D3",
"type": "PREMISE-WEAKENED",
"target": "the inference that the clauses govern different acts",
"undemonstrated": "The conclusion at 'do not, on their face, govern the same act' needs the premise that the binding clauses are about ALTERATION specifically. Weakened to 'the executor's conduct', the premise no longer distinguishes reading from altering, so the conclusion no longer follows from it — while the conclusion itself is left standing unchanged.",
"why_invisible_to_checks": "The support is still present as text; only its content has been drained. No check reads for entailment.",
"edits": [
{
"find": "The prohibition and the escalation rule are both written about alteration.",
"replace": "The prohibition and the escalation rule are both concerned with the executor's conduct."
}
]
},
{
"id": "D4",
"type": "SUPPORT-DELETED",
"target": "the method for testing a document against the substrate",
"undemonstrated": "The fifth quotation is removed entirely, and the three claims that rested on it are left in place. 'A conflict is settled by verifying against the primary substrate', 'The document itself is named as one such substrate', and everything downstream now rest on nothing in the document. The lead sentence is rewritten so no dangling reference betrays the deletion.",
"why_invisible_to_checks": "§3.2 only checks the quotations that remain; a deleted quotation cannot fail to resolve. Nothing requires a document to quote anything.",
"edits": [
{
"find": "**Memory Discipline, on a conflict between layers:**\n\n> On conflict: verify against the **primary substrate** — the code, the git history, the document itself — before acting, then correct whichever layer was wrong.\n\n## The derivation",
"replace": "## The derivation"
},
{
"find": "The fifth clause supplies the method.",
"replace": "The method is settled well enough for the purpose."
}
]
},
{
"id": "D5",
"type": "CIRCULAR",
"target": "the reading/alteration asymmetry",
"undemonstrated": "The restated premise is made to rest on the conclusion it is used to establish. 'As the asymmetry below confirms' points forward to the very asymmetry the sentence is a step toward, so the support runs in a circle. Kernel §2 forbids a D resting on anything not established EARLIER.",
"why_invisible_to_checks": "Nothing mechanical tracks the direction of support; the tags file records a dependency, and the tags file is written by the same hand as the defect.",
"edits": [
{
"find": "Neither the prohibition nor the escalation rule is written about reading.\n\nSo the constitution prices two acts differently.",
"replace": "Neither the prohibition nor the escalation rule reaches an act of reading, as the asymmetry below confirms.\n\nSo the constitution prices two acts differently."
}
]
}
]
}