Skip to content

contract: the epistemic triptych — revision.rs, fusion.rs, and the Rubicon revision route - #1075

Merged
AdaWorldAPI merged 6 commits into
mainfrom
claude/epistemic-triptych-contract
Aug 29, 2026
Merged

contract: the epistemic triptych — revision.rs, fusion.rs, and the Rubicon revision route#1075
AdaWorldAPI merged 6 commits into
mainfrom
claude/epistemic-triptych-contract

Conversation

@AdaWorldAPI

@AdaWorldAPI AdaWorldAPI commented Aug 29, 2026

Copy link
Copy Markdown
Owner

Split out of #1074 on operator instruction. #1074 declares itself "PLAN/BOARD ONLY. Measure-before-carve. No contract change, no wiring" and had accumulated 1138 lines of contract code; it is now recut to EWA measurement / attention geometry only. This PR carries the code so each can be reviewed on the questions it actually raises.

None of this is #1074's STOP-gated carrier. That rule targets the EWA/Σ carrier (K1 TrustSigma on TrustQualia), which is untouched here.

What lands

revision.rs — the court PR #1057 (merged) already depends on. #1057 names revision "the only write-back" and "the court of appeal" at its ACCEPT step (D-ECG-3, D-ECG-6), while counterfactual.rs had shipped twice and revision.rs never landed. A merged plan's ACCEPT step was governed by a module that did not exist.

One defect fixed from the draft: evidential_effect guarded three kinds with if has_new_root, then re-listed the same three variants falling through to NoIncrease. All three are derived above under a has_new_root precondition, so the guard could never be false and those arms were unreachable — a guard that cannot fail, with dead arms reading as policy for an impossible state. Replaced with an exhaustive match plus a debug_assert!.

fusion.rs — Horizontverschmelzung as candidate construction. Refuses the cheap outcomes (thesis wins / antithesis wins / 50-50) and asks instead what assumption must change so both horizons become explicable without laundering either one's evidence. FusionOutcome carries IrreducibleTension, because a fake intelligence always synthesises.

The mechanism that makes that refusal checkable rather than stylistic: an assumption is an inherited root. InterpretiveHorizon already separates independent_roots from inherited_roots, so an assumption held only as inherited is revisable (withdrawing it discards no evidence), while one also independently grounded is not. No revisable assumption ⇒ the tension is irreducible and the engine says so.

KanbanColumn::revise + advance_on_revision — closes ISS-KANBAN-PLAN-EXIT-HAS-NO-NAMED-ROUTE. Evaluation's successors are [Commit, Plan, Prune]; advance() takes the first non-Prune (always Commit), veto() takes Prune, and nothing produced Plan. The documented revision exit had legal-edge status and no route. This completes the Rubicon DAG — no edge added, no next_phases change.

verdict route
IncreaseEligible + counterfactual Necessary Commit docket completed
IncreaseEligible, docket incomplete Plan eligible ≠ accepted
NoIncrease Plan understanding rose, evidence did not — re-deliberate carrying the witness
Suspend None tension stays open pending grounding

NoIncrease → Plan is load-bearing: Echo and ClosedCycle both reduce to it, so a cycle that merely re-read inherited material can never reach Commit. That is the closed-path guarantee expressed as motion rather than prose.

The typed docket

IncreaseEligible means exactly "a genuinely new independent root was introduced" — not that the counterfactual passed, the band admitted the operation, or the candidate survived falsification. GadamerRevision::revise emits it from an EncounterEvidence alone, so routing it to Commit was a legal shortcut past Fusion → Counterfactual → Revision. CounterfactualVerdict {Necessary, Dispensable, NotRun} + RevisionVerdict close it, with ::unadjudicated() as the honest default.

Falsifiers — every one disable-verified, each surgical

disable fails
eligibility reads the union of roots only two_witnesses_sharing_one_root_never_become_evidentially_eligible
every assumption made revisable only irreducible_tension_is_reachable_when_no_assumption_is_revisable
NoIncrease falls back to advance() only the Plan-route and closed-path tests
eligibility alone reaches Commit only revision_verdict_alone_cannot_reach_commit
has_new_root dropped from HorizonFusion 2 of 9, at the new debug_assert

revision_verdict_alone_cannot_reach_commit proves the shortcut rather than asserting it: it walks the real path with anti-vacuity asserted, then shows unadjudicated routes to Plan and never Commit.

Prior art — named, not implied

fusion.rs records what it restates. BeliefArena::revise_at is canonical for S4 pooling under known overlap. But per PR #854, Stamp::disjoint is sound, not complete: Stamp models source membership and is lossy (1 << (id % 64), ids 0 and 64 alias), and causal_audit.rs:346 leaves independent_strength None because there is no dependence model. Aliasing yields only false overlap, so revision under-pools rather than double-counts. FusionReceipt::shared_roots is therefore CONJECTURE expressing a contract the substrate cannot yet attest — not duplication.

stance_panel is not H₃. Four readings of an existing state (Hegel/Nietzsche/Kant/Wittgenstein), non-destructive by design. revise_at pools the truth of the same CStmt — an Aufhebung metaphor, not the inference of a latent mediator. The Grail survives and is unbuilt.

fuse() establishes synthesis admissibility and provenance, never the new relation XSynthesizedClaim carries no inferred structure. Deliberate: the generative act stays outside, so this module cannot become the thing that both proposes and licenses.

Gates

1247 contract lib tests · clippy -D warnings clean · fmt clean · board hygiene in-commit (LATEST_STATE contract inventory + the five-loci finding) · supersession index regenerated.

🤖 Generated with Claude Code

https://claude.ai/code/session_016b33swuXE23hKtqxsHu9p1


Generated by Claude Code

Summary by CodeRabbit

  • New Features
    • Added evidence-aware revision handling for interpretive horizons, including encounter classification, assumption tracking, and counterfactual verdicts.
    • Added fusion outcomes for combining perspectives, including synthesis, complementary results, suspended states, and irreducible tensions.
    • Added audit receipts and synthesized-claim reporting for fusion results.
    • Added Kanban routing for revision verdicts, preventing premature advancement and returning incomplete work to planning.
  • Bug Fixes
    • Closed the missing Evaluation-to-Plan transition for incomplete or non-increasing revisions.
    • Prevented rootless or inherited evidence from incorrectly increasing eligibility.

claude added 6 commits August 29, 2026 12:37
…ds on

PR #1057 (merged) names revision as "the only write-back" and "the court of
appeal" at the ACCEPT step of its DETECT->BOUND->PROPOSE->FILTER->GATE->TEST
loop (D-ECG-3, D-ECG-6). counterfactual.rs shipped twice; revision.rs never
landed, and zero of its symbols existed anywhere in crates/. A merged plan's
ACCEPT step -- the one place a hypothesis becomes a fact -- was governed by a
module that did not exist. This closes that.

Zero-dep (std::array + std::fmt only), placed beside counterfactual.rs /
temporal_pov.rs / settlement.rs. No production write capability: the output
types stop before actual-world mutation by design.

ONE DEFECT FIXED FROM THE DRAFT. The evidential_effect match guarded three
kinds with `if has_new_root`, then listed the same three variants again
falling through to NoIncrease. But IndependentConfirmation, HorizonExpansion
and HorizonFusion are EACH derived above under a has_new_root precondition,
so the guard can never be false and the second listing is unreachable -- a
guard that cannot fail is the vacuous-guard defect the falsifiability rule
names, and the dead arms read as policy for a state that cannot occur.
Replaced with an exhaustive unguarded match plus a debug_assert! documenting
the coupling, so relaxing a kind condition trips in debug rather than
silently minting evidential weight for a rootless synthesis.

THE HOLY-GRAIL ASYMMETRY, now documented on RevisionKind. HorizonFusion is
Horizontverschmelzung as thesis x antithesis x synthesis: thesis =
prior.projected_claims, antithesis = encounter.contradictions, synthesis =
introduced union preserved. It is Gadamer, not Hegel -- unresolved_tension
accumulates by union and is never cleared, so a fusion carries its
contradiction forward as durable structure; a synthesis that RESOLVED its
antithesis would be the false synthesis the policy exists to refuse.
ContradictionPreserved and HorizonFusion see the SAME contradiction; the only
thing separating them is has_new_root. Without it: Suspend, tension held, no
weight minted. That asymmetry is the anti-laundering invariant in executable
form -- no amount of re-reading inherited material can produce a synthesis,
because re-reading yields no new independent root.

Three falsifiers added, all disable-verified. Removing has_new_root from
HorizonFusion's condition fails exactly two of them, at the new debug_assert
(line 328), while the other seven stay green -- surgical:
- contradiction_without_a_new_root_suspends_instead_of_synthesising: the
  identical encounter as the fusion test EXCEPT the root, must land
  ContradictionPreserved + Suspend. Two-sided against its twin; neither half
  can pass for the other's reason. Anti-vacuity asserts the discriminating
  quantity really is absent.
- fusion_accumulates_tension_and_never_clears_prior_tension: Gadamer not
  Hegel, with tension carried in from before.
- no_increase_eligible_outcome_is_reachable_without_a_new_root: sweeps the
  rootless encounter space across claims x resistance x contradiction.

Gates: 9/9 revision tests, 1236 contract lib tests, clippy -D warnings clean,
fmt clean.

(cherry picked from commit 5eb74b1)
Completes the triptych the operator ruled must stay violently separate:

  fusion.rs         GENERATES S   what interpretation makes the relation
                                  between these positions intelligible?
  counterfactual.rs ATTACKS   S   remove S -- does structure collapse?
  revision.rs       LICENSES  S   what mutation is warranted?

Three different questions. fusion answers only the first and its output is a
CANDIDATE; nothing here writes back. PR #1057 ratifies revision as the only
write-back.

REFUSES THE CHEAP OUTCOMES. Not "thesis wins", "antithesis wins", or a 50/50
compromise. The question is: what assumption must change so BOTH horizons
become explicable without laundering either one's evidence? FusionOutcome
therefore carries Synthesis / ThesisSurvives / AntithesisSurvives /
Complementary / IrreducibleTension / Suspended / AskForMeans.

AN ASSUMPTION IS AN INHERITED ROOT -- the mechanism that makes refusal
checkable rather than stylistic. InterpretiveHorizon already separates
independent_roots (contact with the world) from inherited_roots
(interpretations consumed as interpretations), so an assumption held ONLY as
inherited is revisable (withdrawing it discards no evidence) while one that
is also independently grounded is not. Synthesis requires a revisable
assumption; with none, the contradiction is irreducible and the engine says
so. A fake intelligence always synthesises.

THE ANTI-ALCHEMY LAW: understanding may increase without evidence
increasing. Two horizons that look like independent witnesses but trace to
the same root are ONE witness. Eligibility reads DISJOINT roots, never the
union, so shared ancestry can never mint weight however intelligible the
synthesis becomes. FusionReceipt::shared_roots records the collapse.

THE RECEIPT PRESERVES BOTH ORIGINALS. A synthesis never overwrites thesis or
antithesis -- tomorrow evidence may falsify it, and the system must then be
able to ask why it looked compelling, which support was independent, which
assumptions were fused, which contradiction was hidden. Without that,
revision is history rewriting. Deliberately absent: any synthesis confidence
scalar. Scalar confidence stays in NARS (f,c); CE64 61-63 stays a permission
band (#1057).

Six falsifiers, two disable-verified and each surgical:
- eligibility reading the UNION instead of disjoint roots fails ONLY
  two_witnesses_sharing_one_root_never_become_evidentially_eligible;
- making every assumption revisable fails ONLY
  irreducible_tension_is_reachable_when_no_assumption_is_revisable.
Both anti-alchemy tests are two-sided: the shared-root refusal is paired with
disjoint_roots_plus_a_revisable_assumption_earn_a_synthesis, so neither half
can pass for the other's reason.

Gates: 6/6 fusion, 1242 contract lib tests, clippy -D warnings clean, fmt.
(cherry picked from commit 28cc1df)
Closes ISS-KANBAN-PLAN-EXIT-HAS-NO-NAMED-ROUTE, filed earlier this session.

Evaluation's successors are [Commit, Plan, Prune]. advance() takes the first
non-Prune and therefore ALWAYS returns Commit; veto() takes Prune. NO named
primitive produced Plan, so the documented revision exit -- "re-enter Planning
carrying the witness" -- had legal-edge status (a persist_sink test asserts
the edge is legal) and no route to it. The only (Evaluation, Plan) occurrence
in the whole workspace was that test.

KanbanColumn::revise() is the third primitive, symmetric with advance()/veto():
the successor equal to Plan, or None. It COMPLETES the Rubicon DAG rather than
routing around it -- no edge added, no next_phases change, and every column it
returns is one try_advance_phase already accepts.

advance_on_revision(EvidentialEffect) is the TEST->ACCEPT step of #1057's loop,
where revision is "the only write-back" and "the court of appeal". The three
verdicts map 1:1 onto three routes:

  IncreaseEligible -> advance() -> Commit   a new independent root was
                                            contacted; calcify
  NoIncrease       -> revise()  -> Plan     understanding rose, evidence did
                                            not -- re-deliberate CARRYING THE
                                            WITNESS, which is the semantic
                                            movement itself
  Suspend          -> None                  tension stays open pending
                                            grounding

NoIncrease -> Plan is load-bearing: Echo and ClosedCycle both reduce to it, so
a cycle that merely re-read inherited material returns to deliberation with
what it learned and can NEVER reach Commit. That is the closed-path guarantee
(F-MEP-0d) expressed as motion instead of prose. Revision never prunes --
Prune is the MUL gate's Block (Libet free-won't), a different act on a
different arm; the absence is deliberate.

Four falsifiers, disable-verified: making NoIncrease fall back to advance()
fails exactly the two tests that assert the Plan route and the closed-path
guarantee, and nothing else.

PRIOR-ART CORRECTION, same commit. fusion.rs now names what it restates
instead of implying novelty: BeliefArena::revise_at already implements BOTH
the synthesis primitive and the anti-alchemy law -- its guard is
b.stamp.disjoint(stamp), and since Stamp carries evidential ancestry,
disjointness IS the independence test, so FusionReceipt::shared_roots is a
re-derivation of it over a different carrier. And nars::stance::stance_panel
already reads a contradiction set through four philosophical stances, its own
doc stating the Hegel mapping exactly: the three meanings of aufheben ARE
revise_at's three fields (cancelled = pooled truth, preserved = contradiction,
lifted = rung), with Nietzsche/Kant/Wittgenstein as the other three, all
late-bound and non-destructive. Hegelian synthesis was already in the
substrate. fusion.rs adds only a zero-dep contract-layer seam for consumers
that cannot depend on the planner; where the two disagree, revise_at is
canonical.

Gates: 1246 contract lib tests, clippy -D warnings clean, fmt clean.
(cherry picked from commit cb923d5)
…he five-loci finding

Board-hygiene rule discharged for 5eb74b1 / 28cc1df / cb923d5, which added
contract types without the same-commit LATEST_STATE update the rule requires --
a rule this session cited repeatedly and then broke.

Records the net delta (three modules, one primitive), why revision.rs exists
(PR #1057 depends on it as 'the only write-back'), that
ISS-KANBAN-PLAN-EXIT-HAS-NO-NAMED-ROUTE is closed, and a scope note stating
against myself that 1138 lines of contract code now sit on a PR whose status
line says PLAN/BOARD ONLY -- with the split recommended but NOT done, since
rewriting a pushed branch is the operator's call.

Also records the prior art this session re-derived thinner versions of:
revise_at (stamp disjointness IS the independence test; canonical),
stance_panel (Hegel/Nietzsche/Kant/Wittgenstein, aufheben == revise_at's three
fields), and the epistemic-quadrant probe (only-the-elimination-returns). The
architecture lives in five uncited loci; scattered, not missing.

(cherry picked from commit 25e53d3)
… shortcut

Operator sent back three corrections rather than more code. All three were
verified against source before landing; two of them correct claims I made.

1. Stamp::disjoint is NOT the canonical independence test (I was wrong).
   I recorded "disjointness IS the independence test; revise_at is canonical".
   PR #854 had already ruled otherwise:
   event identity != evidential-base membership != source dependence
   (LATEST_STATE:1567). Stamp models source MEMBERSHIP and is lossy --
   Stamp::source(id) = 1 << (id % 64), so ids 0 and 64 alias -- and
   causal_audit.rs:346 leaves independent_strength None because there is NO
   DEPENDENCE MODEL. So disjoint is SOUND BUT NOT COMPLETE: aliasing yields
   only false overlap, never false disjointness, so revision under-pools
   rather than double-counts. It rejects KNOWN overlap; it does not establish
   independence. The remedy (EvidenceEventId, EvidentialBase<K>, TRI-STATE
   OverlapKnowledge/Independence) is designed and unbuilt -- tri-state being
   the tell, since disjoint returns a bool and collapses Unknown.
   Corrected register: revise_at canonical for S4 pooling under known
   overlap; the #854 ruling canonical for independence NOT being established.
   FusionReceipt::shared_roots is therefore CONJECTURE expressing a contract
   the substrate cannot yet attest -- not duplication.

2. stance_panel is NOT H3 (I overcorrected).
   I concluded "Hegelian synthesis was already in the substrate" and the new
   horizon "is already four horizons". Those are four READINGS of an existing
   state -- blend modes over the same pixels, non-destructive by design. The
   Grail question is what new explanatory structure makes H1 and H2
   intelligible as partial horizons of a larger whole. revise_at pools the
   truth of the SAME CStmt under the S4 guard, which is an Aufhebung
   metaphor, not the inference of a latent mediator, revised ontology or
   perspective transform. THE GRAIL SURVIVES, and is unbuilt.

3. IncreaseEligible -> Commit was a legal shortcut past the architecture.
   IncreaseEligible means exactly "a genuinely new independent root was
   introduced". It does NOT mean the counterfactual passed, the band admitted
   the operation, provenance is authoritative, or the candidate survived
   falsification. GadamerRevision::revise emits it from an EncounterEvidence
   ALONE -- no FusionReceipt, no attack -- so routing it to Commit bypassed
   Fusion -> Counterfactual -> Revision entirely.

   Fixed by typing the docket: CounterfactualVerdict {Necessary, Dispensable,
   NotRun} + RevisionVerdict {effect, counterfactual} with
   ::unadjudicated() as the honest default. advance_on_revision now takes the
   VERDICT, not the bare effect: Commit requires effect==IncreaseEligible AND
   counterfactual==Necessary; eligible-but-unattacked routes to Plan
   (understanding rose, docket incomplete, re-deliberate carrying the
   witness). NoIncrease -> Plan and Suspend -> None are unchanged.

   revision_verdict_alone_cannot_reach_commit PROVES the shortcut rather than
   asserting it: it walks the real path (EncounterEvidence -> GadamerRevision
   -> IncreaseEligible, anti-vacuity asserted), then shows unadjudicated
   routes to Plan and never Commit, that Necessary does open the gate, and
   that Dispensable does not. Disable-verified: restoring the old
   unconditional arm fails exactly that test and nothing else.

Also records in fusion.rs that fuse() establishes synthesis ADMISSIBILITY and
provenance, never the new relation X -- SynthesizedClaim carries no inferred
structure, and that boundary is deliberate so this module cannot become the
thing that both proposes and licenses.

Gates: 1247 contract lib tests, clippy -D warnings clean, fmt clean.
(cherry picked from commit 0dc6d92)
The five contract commits are cut onto claude/epistemic-triptych-contract
from main, and #1074 is recut to EWA measurement / attention geometry only,
per operator instruction. Supersession index regenerated against this
branch's plan set.
@cursor

cursor Bot commented Aug 29, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_54589c45-612a-40b4-acfc-97a67392c612)

@coderabbitai

coderabbitai Bot commented Aug 29, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 56e97b3f-8cfa-4061-b0d6-6ecfae0020a9

📥 Commits

Reviewing files that changed from the base of the PR and between b239bda and 15982f7.

📒 Files selected for processing (5)
  • .claude/board/LATEST_STATE.md
  • crates/lance-graph-contract/src/fusion.rs
  • crates/lance-graph-contract/src/kanban.rs
  • crates/lance-graph-contract/src/lib.rs
  • crates/lance-graph-contract/src/revision.rs

📝 Walkthrough

Walkthrough

Added public revision and fusion contracts for interpretive horizons. Added tests for evidence independence, contradiction handling, synthesis, and fixed-width masks. Added Kanban routing for revision verdicts and documented the contract branch state.

Changes

Epistemic triptych contracts

Layer / File(s) Summary
Revision contract and policy
crates/lance-graph-contract/src/revision.rs
Defines evidence masks, interpretive horizons, encounter evidence, revision verdicts, deltas, outcomes, and the GadamerRevision policy. Tests cover echoes, cycles, independent roots, contradictions, fusion, rootless evidence, and array-backed masks.
Horizon fusion contract
crates/lance-graph-contract/src/fusion.rs
Adds FusionOutcome, SynthesizedClaim, FusionReceipt, and fuse. The implementation tracks root overlap, preserved claims, unresolved tension, synthesis, and evidential eligibility.
Revision-based Kanban routing
crates/lance-graph-contract/src/kanban.rs
Adds KanbanColumn::revise and advance_on_revision. Revision verdicts route to normal advancement, Plan, or no transition.
Public exposure and architecture record
crates/lance-graph-contract/src/lib.rs, .claude/board/LATEST_STATE.md
Exposes the new modules and records branch scope, contract inventory, prior art, stance boundaries, and architectural cross-reference gaps.

Estimated code review effort: 4 (Complex) | ~60 minutes

Suggested reviewers: claude

Poem

A rabbit reviews roots by moonlit light
New claims meet old claims in careful flight
Fusion keeps tensions where they belong
Kanban sends revisions along
Masks guard evidence, crisp and bright
Contracts now hop into sight

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands.

@AdaWorldAPI
AdaWorldAPI marked this pull request as ready for review August 29, 2026 18:46
@AdaWorldAPI
AdaWorldAPI merged commit 69016d9 into main Aug 29, 2026
9 checks passed
@cursor

cursor Bot commented Aug 29, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_e6413dc6-07ea-41fb-b091-b077ff1d2a6c)

AdaWorldAPI added a commit that referenced this pull request Aug 29, 2026
board: arc entries for #1074 + #1075, batched (hygiene-only — chain terminates here)
AdaWorldAPI pushed a commit that referenced this pull request Aug 30, 2026
…evisionDelta gap narrowed

The register's three shapes (Markov temporal window / downstream
inheritance+accumulation / upstream signed-bits quorum) map 1:1 onto
fusion.rs GENERATES / counterfactual.rs ATTACKS / revision.rs LICENSES --
'kept violently separate' (operator 2026-08-29), already merged in #1075;
the Fusion->Counterfactual->Revision routing is the shape sequence.
Corrects this census's earlier particle/wave/binding improvisation and my
grading of RevisionDelta's masks as result-side-only: they are the signed
quorum accounting (inherited_roots vs new_independent_roots, resistance,
contradictions); the open remainder is operator lineage only.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KCGhDYoQBXs3poaR7sFuqp
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants