PythonInstanceMethodTrampolineTargetSelector.getCallable treats ANY receiver whose class declares a call method as a Keras-style callable, without checking its hierarchy. With class shells in place (#118), the principled gate is a summary-shell ancestor, but the experiment (documented in ponder-lab#498) showed the gate drops 18 tests of forward-pass coverage: every subclass whose framework base does not resolve falls back to object and silently loses dispatch. The bases that do not resolve are exactly the #571 cases (cross-module imports) plus bare-name collisions (#657) and unmodeled base spellings.
Once unresolved-base metadata is complete enough that a hierarchy check has the same recall as the blind treatment, gate the call-name lookups (both the concrete-type lookup and the declaring-class fallback) on the receiver descending from a PythonSummaryShellClass, and update TestIssue127.testIssue127i to opt its synthetic issue127i/C in via super= (the fixture Javadoc already anticipates this).
The precision payoff: an arbitrary source class with a call method but no framework base stops being blindly treated as a callable (the imprecision TestIssue127.testIssue127i's Javadoc documents).
PythonInstanceMethodTrampolineTargetSelector.getCallabletreats ANY receiver whose class declares acallmethod as a Keras-style callable, without checking its hierarchy. With class shells in place (#118), the principled gate is a summary-shell ancestor, but the experiment (documented in ponder-lab#498) showed the gate drops 18 tests of forward-pass coverage: every subclass whose framework base does not resolve falls back toobjectand silently loses dispatch. The bases that do not resolve are exactly the #571 cases (cross-module imports) plus bare-name collisions (#657) and unmodeled base spellings.Once unresolved-base metadata is complete enough that a hierarchy check has the same recall as the blind treatment, gate the
call-name lookups (both the concrete-type lookup and the declaring-class fallback) on the receiver descending from aPythonSummaryShellClass, and updateTestIssue127.testIssue127ito opt its syntheticissue127i/Cin viasuper=(the fixture Javadoc already anticipates this).The precision payoff: an arbitrary source class with a
callmethod but no framework base stops being blindly treated as a callable (the imprecisionTestIssue127.testIssue127i's Javadoc documents).