package semantic import "context" // ElementMatcher is the interface for all element matching strategies. // Implementations include LexicalMatcher (Jaccard-based, zero deps) and // EmbeddingMatcher (cosine similarity on vector embeddings). type ElementMatcher interface { // Find scores elements against a natural language query and returns // the top-K matches above the threshold. Find(ctx context.Context, query string, elements []ElementDescriptor, opts FindOptions) (FindResult, error) // Strategy returns the name of the matching strategy (e.g. "lexical", "embedding"). Strategy() string } // FindOptions controls matching behaviour. type FindOptions struct { Threshold float64 TopK int // Per-request weight overrides (optional). If both are zero the // matcher's default weights are used. LexicalWeight float64 EmbeddingWeight float64 // Explain enables verbose per-match scoring breakdown. Explain bool } // FindResult holds the output of a Find operation. type FindResult struct { Matches []ElementMatch BestRef string BestScore float64 Strategy string ElementCount int // total elements evaluated } // ConfidenceLabel returns a human-readable confidence level for the best // match score. Delegates to CalibrateConfidence for consistent labelling. func (r *FindResult) ConfidenceLabel() string { return CalibrateConfidence(r.BestScore) } // ElementMatch holds a scored match result. type ElementMatch struct { Ref string `json:"ref"` Score float64 `json:"score"` Role string `json:"role,omitempty"` Name string `json:"name,omitempty"` // Explain is populated when FindOptions.Explain is true. Explain *MatchExplain `json:"explain,omitempty"` } // MatchExplain exposes the per-strategy score breakdown for debugging. type MatchExplain struct { LexicalScore float64 `json:"lexical_score"` EmbeddingScore float64 `json:"embedding_score"` Composite string `json:"composite"` }