Skip to content

fix(ruby): resolve inherited member calls - #3585

Open
oleksii-tumanov wants to merge 1 commit into
Graphify-Labs:v8from
oleksii-tumanov:fix/ruby-inherited-member-calls
Open

oleksii-tumanov wants to merge 1 commit into
Graphify-Labs:v8from
oleksii-tumanov:fix/ruby-inherited-member-calls

Conversation

@oleksii-tumanov

Copy link
Copy Markdown
Contributor

Fixes #3584

Typed Ruby member calls now follow a safe, unambiguous inheritance chain when the method is not defined directly on the receiver class. Direct methods still win, and Graphify leaves incomplete or unsafe cases unresolved.

Tests:

  • pytest tests/test_ruby_resolution.py -q (68 passed)
  • pytest tests/ -q --tb=short (5741 passed, 14 skipped)
  • ruff check graphify/ruby_resolution.py tests/test_ruby_resolution.py

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Graphify reviewed this change.

Worth a look — the grounded gate found no coupling regressions or blocking issues, but 1 advisory finding(s) below merit a look before merge.

Formal verification. No changes could be formally verified in this run.


Graphify review — findings

Extends typed member-call resolution so p.run on a typed receiver resolves to a safely inherited Processor#run when the subclass doesn't define it, preferring a direct override and emitting at EXTRACTED/1.0 only via _inherited_method over the "instance" kind. Guards the inherited lookup behind a complete Ruby schema and bails when any file is ruby_lookup_unsafe, refinements are present, or external owners/aliases touch the class. Replaces the ad-hoc Path(...).name file-node detection with the shared _is_file_node_label.

Worth a look

  • Unrelated external method owner blocks typed inherited resolution globallygraphify/ruby_resolution.py:518 · Escalate · medium
    • agreed by 2 of 2 members but NOT verified (no proof, no reproducing execution) — consensus is not a verdict; needs human review
Analysis details — impact, health, verification

Impact & health

Graphify review

Impact — 131 functions depend on the 126 functions this change touches.

Health — this change adds coupling hotspots:

  • new: resolve_ruby_member_calls() — 5 callers, 13 callees
  • new: _resolve_csharp_member_calls() — 0 callers, 6 callees

Verification — 131 functions in the blast radius were not formally verified this run (proofs are advisory here).

Gate & verification

graphify gate

PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.

Advisory (not blocking):

  • verification_scope: 131 function(s) in the blast radius were not formally verified this run

Test selection

Test selection

2 of 283 test file(s) selected (1%) via static blast radius.

  • tests/test_extract.py — impact
  • tests/test_ruby_resolution.py — impact, changed-test

Selection is safe under the controlled-regression assumption; always-run tests + a periodic full run are the backstops. Advisory — it never changes the check verdict.

Formal verification

Could not verify: Could not verify resolve\_ruby\_member\_calls.

The verifier did not have enough to check resolve\_ruby\_member\_calls, so it is saying so rather than guessing. No false assurance is the whole point.

Guarantee: No guarantee either way, this is an honest abstention, not a pass.

Note: Reason: non-vacuity: domain too small (only 1 distinct inputs exercised, need 3) — 'no divergence' would be near-vacuous

· 2 more finding(s) on lines outside this diff (see the check run).

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.

Ruby typed member calls do not resolve inherited instance methods

1 participant