contract: the epistemic triptych — revision.rs, fusion.rs, and the Rubicon revision route - #1075
Conversation
…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.
Bugbot couldn't run - usage limit reachedBugbot 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) |
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (5)
📝 WalkthroughWalkthroughAdded 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. ChangesEpistemic triptych contracts
Estimated code review effort: 4 (Complex) | ~60 minutes Suggested reviewers: Poem
✨ Finishing Touches📝 Generate docstrings
Comment |
Bugbot couldn't run - usage limit reachedBugbot 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) |
…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
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
TrustSigmaonTrustQualia), 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), whilecounterfactual.rshad shipped twice andrevision.rsnever landed. A merged plan's ACCEPT step was governed by a module that did not exist.One defect fixed from the draft:
evidential_effectguarded three kinds withif has_new_root, then re-listed the same three variants falling through toNoIncrease. All three are derived above under ahas_new_rootprecondition, 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 adebug_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.FusionOutcomecarriesIrreducibleTension, because a fake intelligence always synthesises.The mechanism that makes that refusal checkable rather than stylistic: an assumption is an inherited root.
InterpretiveHorizonalready separatesindependent_rootsfrominherited_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— closesISS-KANBAN-PLAN-EXIT-HAS-NO-NAMED-ROUTE.Evaluation's successors are[Commit, Plan, Prune];advance()takes the first non-Prune(alwaysCommit),veto()takesPrune, and nothing producedPlan. The documented revision exit had legal-edge status and no route. This completes the Rubicon DAG — no edge added, nonext_phaseschange.IncreaseEligible+ counterfactualNecessaryCommitIncreaseEligible, docket incompletePlanNoIncreasePlanSuspendNoneNoIncrease → Planis load-bearing:EchoandClosedCycleboth reduce to it, so a cycle that merely re-read inherited material can never reachCommit. That is the closed-path guarantee expressed as motion rather than prose.The typed docket
IncreaseEligiblemeans exactly "a genuinely new independent root was introduced" — not that the counterfactual passed, the band admitted the operation, or the candidate survived falsification.GadamerRevision::reviseemits it from anEncounterEvidencealone, so routing it toCommitwas a legal shortcut past Fusion → Counterfactual → Revision.CounterfactualVerdict {Necessary, Dispensable, NotRun}+RevisionVerdictclose it, with::unadjudicated()as the honest default.Falsifiers — every one disable-verified, each surgical
two_witnesses_sharing_one_root_never_become_evidentially_eligibleirreducible_tension_is_reachable_when_no_assumption_is_revisableNoIncreasefalls back toadvance()Commitrevision_verdict_alone_cannot_reach_commithas_new_rootdropped fromHorizonFusiondebug_assertrevision_verdict_alone_cannot_reach_commitproves the shortcut rather than asserting it: it walks the real path with anti-vacuity asserted, then shows unadjudicated routes toPlanand neverCommit.Prior art — named, not implied
fusion.rsrecords what it restates.BeliefArena::revise_atis canonical for S4 pooling under known overlap. But per PR #854,Stamp::disjointis sound, not complete:Stampmodels source membership and is lossy (1 << (id % 64), ids 0 and 64 alias), andcausal_audit.rs:346leavesindependent_strengthNonebecause there is no dependence model. Aliasing yields only false overlap, so revision under-pools rather than double-counts.FusionReceipt::shared_rootsis therefore CONJECTURE expressing a contract the substrate cannot yet attest — not duplication.stance_panelis not H₃. Four readings of an existing state (Hegel/Nietzsche/Kant/Wittgenstein), non-destructive by design.revise_atpools the truth of the sameCStmt— 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 relationX—SynthesizedClaimcarries 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 warningsclean · fmt clean · board hygiene in-commit (LATEST_STATEcontract 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