plan: mq.2 — Type-driven dispatch mechanism, 9 tasks
Installs the dispatch infrastructure without retiring MethodNameCollision yet: - 2 new CheckError variants (AmbiguousMethodResolution, UnknownClass) - NoInstance gains optional candidate_classes field - ResidualConstraint gains optional candidates: BTreeSet<String> - Env gains workspace-flat method_to_candidate_classes index - New resolve_method_dispatch helper implementing the 5-step rule - Synth Var-arm rewritten to route through the helper - Constraint-discharge refines multi-candidate residuals (concrete-type path → registry filter; rigid-var path → declared-constraint filter) - Mono's residual-to-target mapping mirrors the discharge refinement End-to-end multi-class fixtures still gated by MethodNameCollision (iter mq.3); new path exercised in this iter only by 6 unit-test cases on resolve_method_dispatch + 3 each on refine and mono resolver. Boss decisions on recon open questions: residual extension via Option<BTreeSet<String>> field; index lives workspace-flat on Env; NoInstance.candidate_classes wired through to_diagnostic this iter; qualify_class_ref_in_check consolidation deferred per mq.1 known-debt.
This commit is contained in: