---
name: find_result
lang: py
domain: core
version: "1.0.0"
algebraic: product
definition: |
  @dataclass
  class FindResult:
      memories: list[MatchedContext]
      resources: list[MatchedContext]
      skills: list[MatchedContext]
      query_plan: QueryPlan | None = None
      query_results: list[QueryResult] | None = None
      total: int = 0
description: "Resultado final de una busqueda completa, agrupado por tipo de contexto. Opcionalmente incluye provenance (traza de busqueda) para observabilidad."
tags: [retrieval, result, rag, search, find, aggregation]
uses_types: [matched_context_py_core, query_plan_py_core, query_result_py_core]
file_path: "python/types/core/find_result.py"
---

## Notas

`__post_init__` calcula `total` automaticamente al construir la instancia. Si se modifica `memories`, `resources` o `skills` despues de la construccion, `total` no se actualiza automaticamente — se debe reconstruir o actualizar manualmente.

`__iter__` permite iterar sobre todos los contextos en orden: memories → resources → skills. Facilita patrones como `for ctx in result: process(ctx)` sin necesidad de concatenar las listas.

`to_dict(include_provenance=True)` incluye el query_plan y un resumen de los query_results. El provenance es util para debugging y observabilidad pero puede ser verboso — por eso es opt-in.

`from_dict` reconstruye el resultado desde un dict serializado. Los campos de provenance (query_plan, query_results) no se reconstruyen — quedan como None. Si se necesita provenance en la deserializacion, hay que reconstruirlos separadamente.
