feat: per-candidate elimination reasons in resolution failure facts (#854) - #867
Merged
Merged
Conversation
…854) Record why each near-miss FeatureGroup dropped during the single resolution pass and expose it on EvaluationResult.eliminations. Failure messages now name candidates removed by option-value rejection, domain, scope, capability, non-enabled frameworks, framework pin, or links, which previously vanished. The capture/render precedence duplication is gone: the renderer owns precedence and projects the recorded eliminations from a single hook-free pass.
…view (#854) Record value_rejection inline for criteria-failing candidates only, so a losing rejector is captured even when a sibling wins and matched, winning, or abstract candidates are never re-probed (no validator rerun, no winner in eliminations). Suppress "Did you mean" suggestions that only echo an already-named near-miss. Place the scope callout before the near-miss block in the abstract-only message instead of gluing it to the last bullet. Refresh the resolution-error docs to the new near-miss wording.
TKaltofen
force-pushed
the
feat/854-per-candidate-elimination-reasons
branch
from
July 21, 2026 12:54
54a3d09 to
45028dc
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Per-candidate elimination reasons in resolution failure facts (os-011, was #854; part of #760).
Candidates eliminated by a compute-framework pin, the link filter, frameworks the run did not enable, capability rejection, an option-value rejection, or a domain/scope mismatch previously vanished from failure messages, leaving a generic "No feature groups found". They are now recorded during the single resolution pass and named in the message.
Changes
EvaluationResult.eliminations: a per-candidateElimination(stage, reason)recorded at the first gate each non-winning, name-matching candidate fails, within the single decision pass.Review
Two independent deep reviews (Claude Opus and codex) ran on the first commit. Accepted findings fixed in the second commit:
value_rejectionis recorded only for criteria-failing candidates (matched or winning candidates are never re-probed, and a losing rejector is captured even when a sibling wins), "Did you mean" suggestions that only echo a named near-miss are suppressed, the scope callout is no longer glued to a near-miss bullet, and the resolution-error docs are refreshed.Testing
toxgreen: 7153 passed, 170 skipped; ruff format/check clean; pip-licenses clean; mypy --strict clean (882 files); bandit OK.