Repository navigation
glove-parity: functional relation carrier — out(rel) as a method (D-CMH-G1-4a) - #1514
Conversation
…hod (D-CMH-G1-4a) A Glove carries Relations: a canonical key field, the target's glove, and where a call supplies the target's live plane and value lanes. Cond::Reaches (out(rel)) binds to Quack's Semijoin over the target's live plane, Cond::Via (out(rel).has) adds EqU32Via. The anchor stays (#1311's rule). R2IL has no GATHER and refuses by name; a call checks the target's population. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh
…ed (#1508) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh
|
Warning Review limit reachedYour organization has reached its usage spending cap. Adjust your spending cap in the billing tab. Next included review available in 54 minutes. View limit details
Warning Billing warning: we have not been able to collect payment for this subscription for more than 72 hours. Please update the payment method or pay any pending invoices in Billing to avoid service interruption. Comment |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4f73869628
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
A call names one population per target concept, so a method whose two relations reach the same concept in different universes cannot say which one each relation reads. Preparation now refuses it (ConflictingUniverse) instead of keeping the first. Codex review on #1514. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh
glove-parity: refuse two populations of one relation target concept (#1514 follow-up)
What
A method
Glovenow carries functional relations. Each one declares:This is #1311's anchor rule, moved into the method layer. Relations that fan out are not covered here.
out(rel)→Cond::Reaches→Filter::Semijoin(fk, target live plane). As in Gremlin, a traverser whose edge leads nowhere is dropped. A dangling key and a key pointing at a dead row both fail.out(rel).has(f, eq|neq)→Cond::Via→Filter::EqU32Via, negated forneq. The liveness test is emitted once per relation.count()after the hop counts anchor rows, because the anchor does not move.SecondHop)valueson the target (ValueThroughRelation)dedupon the target (DedupThroughRelation)where(method())on the target (WhereThroughRelation)in/both(FanOut)relation.field. The key itself joinsrequired.CallError::ForeignUniverse.VIAbut noGATHER. A relation method on R2IL returnsCallError::FrontendGap { R2il, "GATHER" }. Methods without relations still run on both frontends.There is no new op in Quack, mask-risc or R2IL. The Gremlin text form (
decl.rs) loadsout(rel)too.Evidence
crates/lance-graph-glove-parity/tests/relation.rshas 7 tests. The fixture is a syntheticline -billed_to-> partnerpair with dangling keys, dead partners and dead lines. Every answer is checked against a row loop over the field text at n ∈ {1, 64, 65, 4097}.Six disable runs each turned red the test that names the guard:
neqnegationthe_target_population_is_checked_at_the_callrequiredr2il_names_the_missing_gatherRemoving the liveness test fails the oracle. So
EqU32Viaalone is notout(rel): it keeps rows whose target is dead.Two existing refusal pins were updated because the behaviour changed:
in/bothnow returnFanOut.out(performed_by)on the SAP glove now composes, and preparation refuses it withUnknownRelation.The crate suite passes, and clippy runs clean with
-D warningsand fmt.Board
gremlin-composable-algebra-v1.md§8 is new, and the matrix rows and counts are updated (DIRECT 10→12, COMPOSE 22→20).STATUS_BOARD.mdis updated. G1-0..3 are marked Shipped (D-CMH-G1: Gremlin steps as composable ClassId methods — billable_hours calls is_billable, no new Rust #1508), and D-CMH-G1-4 is split into 4a (this PR) and the fan-out remainder.2026-10-12-functional-relation-carrier.md.Still open
Fan-out (
in, M:N,E(),outE/inV) and the second hop are still unsupported. D-SAG-1-4's multi-hop dependency is still blocked on the second hop.🤖 Generated with Claude Code
https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh
Generated by Claude Code