A contradiction points at an error upstream (B2a) - #238
Merged
Conversation
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This was referenced Sep 3, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements B2a of 0017: the engine and the queue. B2b (visibility in the graph and the entity panel) stays planned.
Engine (
utopia-reason):derive::contradictionsmeasures a derivation againstfunctional/inverse_functional/asymmetric/irreflexivewith overlapping validity. Derived vs asserted comes out per item; derived vs derived is aggregated by rule pair. Five unit tests.Queue (
utopia-store, migration0020):runrecordsaxiom_violationsof kindderived_contradiction(left = the assertion hit, right = the last premise, the derived triple indetail, capped at 50 per predicate); rule clashes land inontology_defectsasrules_disagree.materializeuses the same function to hold those derivations back; anacceptedpair lands on the next run. Both load edges through onetimed_edgesso the queue and the graph never disagree. Integration test covers block → close → land → accept → rule clash → clear.Review: the card shows the derived line, the asserted line and one clue (
stale/duplicate/unsure), with repairs right there: end date (fact_closed, new resolution), retract, see duplicates, open ontology, let both stand. The endpoint performs the repair and re-materializes. New colour token--u-contest.Decision records: 0017 status line updated to "B2a implemented"; 0002 and 0016 carry a revision note; index row updated. This branch carries the 0017 record from #237, so #237 can be closed once this merges.
Verified end to end on the isolated DB: the card appears after "Run check", "Give the assertion an end date" closes the assertion, resolves the row and lands the derivation; a real
rules_disagreesurfaced in the demo KB (paired withsymmetric vsallied withinverse, against asymmetry).🤖 Generated with Claude Code