Ball Valve Nested Results
Ball Valve is nested because the matcher has to separate technical relevance from procurement release.
Result Layers
Section titled “Result Layers”| Layer | Location | Purpose |
|---|---|---|
| Flat rows | match_result.results | Raw candidate/result rows after policy decoration. |
| Summary contract | match_result.summary.grouped_output_contract | Public counts and policy checks for grouped output. |
| Decision trace | match_result.decision.decision_trace | Top-level branch and recommendation conclusion. |
| Row trace | results[].decision_trace | Row-level why-not map and suppression reasons. |
| Presentation | PipelineResult.presentation | Grouped display payload for frontend/docs explanation. |
Grouping
Section titled “Grouping”The current grouped helper groups by:
- Manufacturer
- Brand
- Result rows
Logic20 presentation can also group by:
- Manufacturer
- Brand
- Family
- Result rows
Non-Actionable Branches
Section titled “Non-Actionable Branches”When status is AMBIGUOUS_MATCHES, INPUT_RECHECK_REQUIRED, or NO_REFERENCE, rows are not procurement-ready. They are confirmation or discovery artifacts.
| Status | Result row policy |
|---|---|
AMBIGUOUS_MATCHES | CONFIRMATION_OPTIONS_ONLY |
INPUT_RECHECK_REQUIRED | CONFIRMATION_OPTIONS_ONLY or EMPTY_INPUT_RECHECK |
NO_REFERENCE | EMPTY_NO_DEFENSIBLE_REFERENCE |
Why This Matters
Section titled “Why This Matters”Frontend and docs must not flatten Ball Valve output into a simple class list. A row can be technically promising while still blocked by evidence, reference confirmation, modification approval, or procurement policy.