Repository navigation
Add 0047: a rule may conclude a relation - #820
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: WaylandYang <wayland0916@gmail.com>
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.
Which record
Adds 0047 · A rule may conclude a relation, proposed, nothing built. Revises the edge exclusion stated in 0021, which gains a dated revision note where the original claim stands. No code, no schema, no migration.
The gap
A rule reads one entity's own attributes and concludes about that same entity. So a threshold over a chain cannot be written at all: a holding above 50% in a company that itself holds above 50% in another is a control relation nobody can express. The rule engine has the threshold and no chain; the axiom engine has the chain and cannot read a value.
paths_betweenanswers the question once at query time, and that answer has no interval, no premises, no retirement and nothing a review queue can see.From #818.
What the record decides
derived_factsalready carriessubject_id,predicate_idandobject_id, so this is a fourth conclusion shape in the evaluator rather than a new table.derive()reads, and the axiom pass runs once per round. This couples the two reasoners for the first time.MAX_COMBOS,MAX_DERIVED_PER_PREDICATE,MAX_DEPTHrounds) are set by measurement published in the PR that changes them, not chosen here.Why decision 3 is the whole argument
0021 excluded an edge conclusion because "the ordering is therefore free of a cycle by construction, which a rule concluding an edge would not be". That sentence was written when the rule pass ran once.
0030 has since made the rule pass a fixed point, and in doing so replaced the property being defended: safety now rests on the derivable space being finite, not on the ordering being acyclic. 0030 then parked the rest explicitly — "Axioms and rules stay two reasoners … Folding both into one fixed point is a different question with a different cost, and nobody has asked it." #818 asks it, and this record answers with 0030's own argument rather than a new one.
The obvious alternative, one extra
derive()after the rule fixed point, is recorded as a dead end with the reason 0030 already gave: a rule joining on a predicate another rule concluded would silently never fire, and in the result "the criterion was not met" and "the edge was never seen" look identical.What the record does not re-decide
0032 already decided that a rule may reach a value across a relation (
well → field → depth), and has not built it. That is the read side. This record depends on the single-hop edge loader 0032 calls "the bulk of the implementation" and leaves the decision where it is.Costs named in the record
derive()runs per round; the repeated pass is the expensive one, so the number is measured before the cut lands.RulesPanel,list_rulesandrule_matcheshave to show the new shape, the three places Preserve condition groups in rule descriptions returned to agents #808, Render computed rule conclusions from their stored expressions #815 and Preserve validity intervals in rule-match descriptions #816 just touched.Checked
docs/decisions/README.mdcontiguous 0001–0047reasoning::materialize()rather than recalled:derive()runs once before the rule rounds, the rounds are bounded byMAX_DEPTH,contradictions()runs once on the single derivation🤖 Generated with Claude Code