Date: 2026-09-02 (America/Chicago) Input: fable51-r10pre-execution-v4.zip + sidecar SHA-256 Disposition: SCIENTIFIC RESULTS GO. F35 EXACT ATTACK CLOSED. `package-v2.6` STRUCTURE ACCEPTED, BUT A v2.7 EVIDENCE-STATE PATCH IS REQUIRED BY THIS ADJUDICATION. R0.8 REMAINS OPEN FOR ONE NEW CRASH-CUT CONTROL. NO BROAD FABLE THEORY ROUND.
The supplied SHA-256 sidecar matches exactly:
79d11f839e1bf4f36b95cc473e5dc3949c08ba1d09dea38547858e0c963cf1b6
SHA256SUMS verifies successfully.
Independent run:
drift_gate v2.6: scanned 12 current-facing files;
56 crosswalk records;
5 promotions
DRIFT GATE PASS
The v2.6 gate rejects v2.5. It catches stale R0.8.6 status, stale L1 vocabulary, missing E-50a/E-50b/E-51, and the old untyped evidence-state schema.
Across PYTHONHASHSEED=0,1,42,123:
6 expectations, 0 failed
sha256:
60722f414e56c6497d59783c8cb2806c20d4090099e3642d19a3167015b1eafa
Across the same four seeds:
19 expectations, 0 failed
sha256:
b4e675ffe3371fad4c54022218d0364b4d445cffe714967bb1998209c7acb21f
The terminology correction is real:
RESOLVABLE
!=
EVENTUALITY GUARANTEED
and the model now separates environment offer from system attach.
Independent run:
14 expectations, 0 failed
Independent run:
35 expectations, 0 failed
Raw E-42/E-43 remain red. The adapters measure A-IDEMPOTENT and L-ANCESTRY rather than pre-empting TRVM governance.
The project-agnostic validator admits the real v2.6 projection:
check-evidence-transitions:
evidence-state@1
56 records
5 promotions
✓ ADMISSIBLE
Its selftest baseline passes and all eleven built-in mutations are refused.
The complete handback is shipped.
Its internal SHA256SUMS.txt verifies successfully.
The source history is:
479e007 R0.8.6 falsification — NC28 fails on purpose
afcb374 F35 repair + verifier hardening
747f025 record the three-way fsync outcome at the discard
The retained series reports:
21 PASS / 0 FAIL of 21
with seven independently logged legs per run:
guards
nc15
nc25
nc26
nc27
nc28
run_r08
and verify_battery.py re-derives each leg's subject marker from its retained log rather than trusting only exit=0.
Representative NC28 after repair:
foreign successor:
revision 3 / head c3b1c27d...
presented to honest anchor:
ok=false
anchor revision/head unchanged
NC28 PASS
I can independently inspect the shipped source, git history, logs, hashes and receipts. This review sandbox does not provide the original PX13 Docker/Rust runner, so I am not claiming an independent re-execution of the 21-run PX13 battery.
The defect was:
root.revision == anchor.revision + 1
was treated as sufficient evidence that the ahead root was the honest deployment's interrupted successor.
That proved only:
ORDER
not:
PROVENANCE / AUTHORIZATION
A valid successor produced from the same ancestor under a different anchor could occupy the same one-ahead position.
R0.8.6 changes the anchor from:
committed revision/head
to:
committed revision/head
+
pending successor revision/head
and writes the pending authorization before the root records the pending transition.
The admission question is now:
"is this exact next head the one this anchor authorized?"
rather than:
"is this candidate exactly one revision ahead?"
The foreign-successor control is a direct falsifier and flips FAIL -> PASS.
F35 exact foreign-successor-substitution defect: CLOSED under:
single host
one protected deployment-owned anchor namespace
trusted root/anchor directory
content-addressed canonical successor head
This is a real strengthening of S3 continuity.
I particularly accept moving anchor reconciliation out of Root::open.
Previously a candidate could move the trust anchor before Ctl::open had verified:
store re-derivation
canonical head
schema contract
integrity_check
R0.8.6 now:
Root::open:
validates whether an ahead root was authorized
DOES NOT advance the anchor
Ctl::open:
validates the candidate store/root semantics
THEN reconcile_anchor()
That is the correct trust ordering.
A trust anchor must not be advanced merely because an untrusted candidate has the right numerical shape.
I do not see evidence in this bundle of a new F36 that re-opens the F35 semantic repair.
However, the repair introduces a new load-bearing sequence:
A. anchor pending-successor authorization persisted
B. root pending transition persisted
C. store successor committed
D. root committed
E. anchor committed / pending authorization cleared
The existing runtime crash hook:
after-pending
fires after Root::set_pending() returns, therefore after both A and B.
It does not directly hit:
A succeeded
B did not happen
nor the sibling case:
A succeeded
root persistence B returned an error
The source ordering is sensible, but this exact cut is now load-bearing because A is new trusted durable state.
Add a small NC29 or equivalent fault-injection control:
NC29 — anchor-authorized / root-unwritten crash cut
1. start from committed R/H0
2. compute intended successor H1
3. persist anchor pending R+1/H1
4. inject process death or root-persist failure BEFORE root pending lands
5. restart against root/store still at R/H0
It should establish explicitly:
a. the controller does not invent that H1 committed;
b. a one-ahead root Hforeign != H1 is refused;
c. the exact H1 successor, if later presented with a semantically matching
canonical store, is the only ahead successor the anchor can admit;
d. after an explicit replacement/cancellation policy (if replacement is
permitted before the root pending lands), the old H1 can no longer be
admitted;
e. the recovery/report surface exposes enough state to distinguish
"nothing ever authorized" from "successor H1 was durably authorized but
the root never recorded pending", OR the design explicitly documents why
that distinction is intentionally not externally observable.
This is an evidence gap, not a demonstrated defect.
Do not mint F36 unless the control actually produces an unsafe or dishonest state.
My current ruling:
F31 CLOSED
F32 CLOSED
F33 CLOSED under trusted/fixed SQLite interpreter profile
F34 CLOSED under stated correctness profile
F24 CLOSED
F22 exact attack CLOSED under deployment-directory trust profile
F30 CLOSED
F35 CLOSED under the single-host deployment-anchor profile
NC29 new authorization/root cut:
UNTESTED
Therefore:
R0.8 = OPEN
but much more narrowly than before.
I would not keep R0.8 open merely because power-loss durability is unclaimed if the round's declared scope is process-crash continuity.
Instead make the profile explicit:
R0.8:
process crash / restart
single host
trusted canonical root + anchor parent directory
no power-loss / block-layer persistence theorem
no distributed consensus theorem
If NC29 is green and no new process-crash defect appears, I would seriously consider freezing R0.8 within that profile.
Power-loss / directory-durability semantics can then be a distinct later profile/round rather than an eternal reason R0.8 cannot close.
package-v2.6 — structure ACCEPTED; final evidence state needs v2.7The §18 patch is complete and internally coherent.
I accept the typed projection architecture:
record
promotion
status
artifact
derived count
and the generic rules A–H.
However, v2.6 deliberately says:
F35 = OPEN-UNADJUDICATED
because it was waiting for this review.
This adjudication changes that fact.
So v2.6 cannot remain the final current evidence state after this ruling.
No theory.
Update only evidence state / current-facing doctrine:
F35:
CLOSED by R0.8.6 under the explicit single-host trusted-anchor profile
R0.8:
OPEN due to NC29 untested authorization/root crash cut
+ explicit out-of-scope profile limits
E-13b:
extend the closure from CLOSED-F31/CLOSED-F32
to include CLOSED-F35
with the same trust-profile qualifier
Preserve the F35 failing witness and repair witness append-only.
The v2.7 gate should refuse:
F35 still OPEN-UNADJUDICATED
after this adjudication.
The current promotion record shape is good:
record_id
from
to
sensitivity_witness
executed
executed_by
runtime
pre_fix_witness
repair_witness
promoted_in
history
I would keep it, but I recommend four fields/normalizations before making it a long-term factory contract.
Do not make giant prose strings in from / to the machine comparison.
Prefer:
{
"from_token": "FALSIFIED",
"to_token": "TESTED-CONDITIONAL",
"from_detail": "...",
"to_detail": "..."
}
The prose remains useful for humans; the token is what the station reasons over.
Every executed promotion should carry:
subject_identity:
repo
commit
tree
artifact digest where applicable
A runtime receipt without the exact subject identity is weaker than it needs to be.
For cross-lane evidence classes such as this R0.8.6 closure:
adjudication_ref
adjudicator
adjudicated_at
should be available.
Execution and adjudication are distinct acts.
evidence_state.json should be a deterministic projection from canonical lane registries + promotion records.
Its own hash should go in the station receipt.
That avoids solving registry drift by creating one more registry to drift.
evidence_state.json?At promotion/freeze/closure boundaries: YES.
On every ordinary development commit: NO.
Recommended station rule:
if a lane requests any of:
evidence-class promotion
FALSIFIED -> repaired/tested
OPEN -> CLOSED/FROZEN
candidate -> accepted/corollary
scope/trust-profile strengthening
then:
an evidence-state projection is mandatory
and the generic validator must admit it
If the lane claims no evidence-state transition, the station can instead derive:
promotions = 0
and prove the projection is unchanged.
This keeps the epistemic discipline at the exact place it matters without turning every code edit into registry ceremony.
The rule is strong and the factory kit is good.
But I would not mark the broad claim PROVED yet.
Why:
The checker proves, over its declared evidence-state@1 domain, that it enforces mechanical requirements such as:
no silent promotion
typed witness
receipt exists
receipt hash matches
executed flag
runtime identity
conditional claim has conditions
OPEN has open findings
FALSIFIED->TESTED preserves prefix witness
derived counts agree
and its eleven mutations prove the checker can say FAIL.
That is excellent executable evidence.
But the broad claim also contains:
the control reaches the intended subject and discriminates the forbidden state.
The kit itself admits it cannot generically decide the semantic CONTENT of a receipt or what "reaches the intended subject" means.
Therefore:
FAC-CONTROL-SENSITIVITY:
DECLARED
strongly supported / executable implementation binding exists
not:
PROVED
The factory could separately mint something like:
FAC-EVIDENCE-TRANSITION-SCHEMA-CLOSED
whose domain is exactly the structural rules A/C/D/E/F/G plus typed/hash-bound B metadata.
That narrower property is much closer to PROVED / exhaustive-in-declared-domain.
Then FAC-CONTROL-SENSITIVITY remains the semantic factory rule that says what the receipts must actually mean.
The model found an important correction:
blocking UNKNOWN only is insufficient
because a same-key replay after an already-COMMITTED intent is also a second effect by construction on a naive far side.
So this statement is correct:
a claim whose stable intent key is unresolved OR already satisfied is not a freely claimable fresh attempt.
But I would not use the same override for both states.
For:
UNKNOWN / indeterminate completion
the S5 rule applies:
refuse ordinary replay
OR
require REPLAY_RISK_AUTHORIZED
because the operator is explicitly accepting the possibility that the prior attempt already landed.
For:
COMMITTED
SUPERSEDED because another attempt satisfied the intent
the same intent is already done.
The normal behavior should be:
do not execute another effect under the same intent key
return / derive the existing satisfaction
REPLAY_RISK_AUTHORIZED should not normally turn a satisfied intent into a license to repeat it.
If the user actually wants another physical effect, that is a new intent, even if it is semantically related to the previous one:
new effect_key / intent_id
repeat_of = old_intent
fresh approval / authority
If the product wants a special "knowingly repeat the same satisfied action" operation, give it a different concept such as:
REPEAT_INTENT_AUTHORIZED
rather than overloading uncertainty replay.
Therefore:
key has UNKNOWN:
blocked unless REPLAY_RISK_AUTHORIZED
key is SATISFIED:
blocked as already satisfied;
a new physical effect requires a new intent identity
key attempts all FAILED-ABSENT:
retry/new attempt under same intent is admissible
This is cleaner than one override for both uncertainty and known completion.
Yes.
If the far side provides no stable effect identity, a lookup that does not find a keyed record cannot prove:
the effect did not happen
Therefore:
UNKNOWN stays UNKNOWN
is the honest reconciliation result.
Progress then requires explicit duplicate-risk authority.
That is exactly S5:
absence of evidence
!=
evidence of non-completion
The strict reconciler is the correct default for an unkeyed/unanalyzable far side.
The model's separation is correct:
INTENT
ATTEMPT
RISK AUTHORIZATION
ATTEMPT TERMINAL
INTENT SATISFACTION
SUPERSEDED is a useful attempt-level terminal relation:
this attempt did not land
another attempt of this intent did
It must not be confused with the intent's outcome itself.
A far-side record should name:
intent/effect key
attempt id
effect id / result
and reconciliation attributes the result to the actual attempt.
This is a good Super/ampd handoff.
The v2.6 split is a real improvement:
ENV-SUCCESSOR:
a valid willing successor is offered
SYS-ATTACH-FAIRNESS:
a continuously enabled valid attach is eventually processed
The finite witness correctly shows neither alone is enough.
However, the model makes attach enabled automatically whenever:
holder == none
and
offered != none
That hides one real-system obligation.
In the actual architecture, an offered successor may still need:
authority
grant / capability
policy permission
generation/finality proof
resource compatibility
world/locus admission
before attach becomes enabled.
So the real contract should distinguish:
ENV-SUCCESSOR-AVAILABILITY
an eligible/willing candidate exists and is offered
SYS-SUCCESSOR-ENABLEMENT
after valid finality + a valid offer, the system establishes or recognizes
the authority/policy state that makes at least one successor attachment
admissible
SYS-ATTACH-FAIRNESS
once that admissible attach remains enabled, the scheduler/control plane
does not postpone it forever
If the phrase "valid offer" is defined to include every system-owned authority precondition, the third item is hidden inside the environment assumption, which is the wrong ownership boundary.
I recommend making SYS-SUCCESSOR-ENABLEMENT explicit in the next temporal model.
It is not necessarily another irreducible L-law; it may be a mechanism obligation required to discharge L1 under the continue-service policy.
The measured refinement is sensible:
same scope source digest:
semantic no-op
changed source digest:
world transition
But the adapter currently keeps the source digest outside the World.
A native implementation must make:
compare source digest
+
decide no-op/change
+
mutate registry/version/log
one protected semantic operation.
Otherwise the no-op optimization can introduce a TOCTOU hole between the external digest check and the World mutation.
This belongs in the TRVM governance decision.
The experiment shows why both coordinates matter:
world / birth identity
+
history position / ancestry
A pre-fork warrant can be portable to a descendant if the architecture deliberately says:
fork creates a descendant world identity with explicit ancestry
while twins/copies outside fork() remain unrelated.
That is coherent.
But whether a warrant SHOULD cross a fork remains a semantic policy choice.
The TRVM lane should choose first:
fork = new independent world
or
fork = descendant world with inherited ancestry
Then warrant portability follows from that choice.
The R10-pre lane was right not to promote the law itself.
S1 Admission singularity
World Locus-birth uniqueness remains an S1 scoped corollary
S2 Authority non-amplification
S3 Continuity / anti-resurrection
currentness/exclusivity
canonical-history continuity
exact successor authorization/provenance
F35 exact attack CLOSED
NC29 authorization/root crash cut UNTESTED
S4 Semantic observability
E-42/E-43 remain red
better candidate contracts now measured
S5 External-effect honesty
TESTED under first real-adapter profile
E-50a/E-50b remain red for Super
L1? Recoverable resolution / succession
L1-PRE:
resolution path exists
L1-closed:
eventual closure/terminalization under WF(finality)
L1-service-succession:
conditional on:
ENV-SUCCESSOR-AVAILABILITY
SYS-SUCCESSOR-ENABLEMENT (make explicit next)
SYS-ATTACH-FAIRNESS
FAC-CONTROL-SENSITIVITY:
DECLARED candidate
strong executable support
not yet PROVED because semantic subject-reach/content remains adjudicative
narrow structural evidence-state validator:
candidate for a stronger PROVED classification
No theory.
Apply this adjudication:
F35 CLOSED
E-13b includes CLOSED-F35
R0.8 remains OPEN only for NC29 + explicit profile boundaries
E-50a distinguishes UNKNOWN replay authorization from already-satisfied intent
L1 names SYS-SUCCESSOR-ENABLEMENT
This is now the highest-value small ComputeDriven experiment.
Instrument:
after anchor pending-successor persist
before root pending persist
and separately:
anchor persist succeeds
root persist returns error
Preserve the failing witness if one exists before changing machinery.
Do not make power-loss durability part of the freeze accidentally.
Freeze exactly what was tested.
Take E-50a/E-50b.
Use:
UNKNOWN:
REPLAY_RISK_AUTHORIZED may permit another attempt
SATISFIED:
same intent is done;
another physical effect gets a new intent identity
SUPERSEDED:
attempt-level relation, not intent outcome
Adjudicate:
E-43 A-IDEMPOTENT atomically inside the World boundary
E-42 world identity + ancestry/history position
Run the actual promotion round.
My recommendation:
FAC-CONTROL-SENSITIVITY = DECLARED
station requires evidence-state projection at every evidence promotion /
closure / freeze boundary, not every ordinary commit
Consider a narrower structural validator claim for PROVED.
Add SYS-SUCCESSOR-ENABLEMENT to the temporal model before making production liveness machinery depend on the three-way contract.
Still operator-gated.
No spend authorization is implied by this adjudication.
v4 is another strong execution return.
Most important changes in knowledge:
F35's exact foreign-successor attack is CLOSED.
The anchor now authorizes identity, not merely freshness/order.
Trust-anchor movement occurs only after semantic candidate validation.
The new repair exposes one untested micro crash cut; this is an evidence
gap, not yet a new defect.
The L1 environment/system split is correct, and it exposes a third
real-system obligation: successor enablement.
E-51's key-state result is directionally right, but uncertainty replay and
already-satisfied repetition should not share one override.
An unkeyed far side must preserve UNKNOWN; absence cannot be inferred.
The factory validator is strong executable machinery, but the broad
FAC-CONTROL-SENSITIVITY semantic claim should remain DECLARED until "subject reach" is itself formalized.
package-v2.6 is structurally accepted, but this adjudication necessarily
creates the need for package-v2.7 because F35 is no longer OPEN-UNADJUDICATED.
GO to the codebase / governance lanes.
Do not return to a broad Fable invariant-search round yet.
Next loop:
v2.7 evidence patch
-> NC29
-> Super E-50
-> TRVM E-42/E-43 governance
-> factory promotion round
-> GPT adjudication