fix(ruby): resolve inherited member calls - #3585
oleksii-tumanov wants to merge 1 commit into
Conversation
There was a problem hiding this comment.
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 globally —
graphify/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— impacttests/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).
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