Skip to content

bug: search sin content-type agota silenciosamente 200 candidatos por tabla al paginar #201

Closed

Description

@pablontiv

Contexto y evidencia

Derivado de #198 y pablontiv/homeserver#485. Fuente cotejada en main, HEAD f280884a359f88e0e71bef48d69b0a1052d6fa30. Las mediciones siguientes ya fueron ejecutadas en la investigación; este triage no ejecuta builds ni modifica el índice. Evidencia local (no adjunta ni pública): /tmp/backscroll-485-handoff/reports/. Solo se publican conteos, comandos y referencias de código.

Problema independiente de la ordenación BM25

internal/storage/search.go:59-77,370-377 aplica búsqueda paginable directa si hay content-type, pero sin filtro fija 200 candidatos por tabla FTS, offset 0, antes del merge RRF. La paginación final no permite alcanzar coincidencias fuera del conjunto inicial. #77 ya corrigió inversión BM25; se deja evidencia adicional allí y este issue posee la pérdida silenciosa de cobertura/paginación que persiste con el orden correcto. #145 trata list/patterns, no esta ruta.

Reproducción ya ejecutada

lim-uniform-metric.md:80-90,222 y siguientes (ledger): consultas amplias sin content-type agotaban el conjunto de candidatos. Enumerar por separado text/code/tool/reasoning con --limit 300 --offset N alcanzó páginas adicionales y una página terminal corta.

backscroll search 'Actions' --all-projects --role user --json --limit 300 --offset 0
backscroll search 'Actions' --all-projects --role user --content-type text --json --limit 300 --offset 0
backscroll search 'Actions' --all-projects --role user --content-type text --json --limit 300 --offset 300

El corpus medido devolvió 3.599 filas agregadas por streams tipados para esta consulta (antes de deduplicar sesiones), no una exportación equivalente sin filtro. No se reproduce texto de resultados.

Contrato y aceptación

docs/search.md:261 menciona genéricamente candidate limits; el diseño split-FTS documenta ranking aproximado, pero no un contrato público explícito de truncamiento 200 por tabla ni cómo afecta offset. Search es discovery rankeado, no exportación completa; el defecto aquí es paginación aceptada con agotamiento silencioso no explicitado.

  • El contrato público especifica alcance de limit/offset y comportamiento de agotamiento de candidatos sin content-type.
  • Las páginas solicitadas son alcanzables según ese contrato o se informa explícitamente el límite/truncamiento, distinguiéndolo de ausencia de más coincidencias.
  • Prueba conductual con más de 200 matches por tabla demuestra páginas posteriores, ranking estable, y comportamiento contrastado con búsquedas tipadas.
  • Se preservan filtros de ámbito y exclusión de query echoes; no se usa el fix de BM25 como prueba de cobertura completa.

Duplicados: inventario open/closed, search candidate, "candidate cap"; #77 solo ordenación/candidatos invertidos y #145 list/patterns. Sin ticket de esta paginación silenciosa independiente.

Activity

  1. pablontiv commented on Oct 20, 2026

    @pablontiv
    OwnerAuthor

    Pregunta

    Detect proven unfiltered FTS candidate truncation and expose it without changing RRF ranking, typed pagination, or JSON array shape.

    BASIS

    Issue201 documents exercised candidate exhaustion; deterministic SQLite/Go bounded query and output correction with no new external runtime.

    REVIEW

    TriageReview201

  2. pablontiv commented on Oct 20, 2026

    @pablontiv
    OwnerAuthor

    Pregunta

    Expose proven unfiltered candidate truncation while preserving ranking, typed pagination, filters and complete output budgets.

    BASIS

    Existing bounded implementation at retained clean SHA 2a936ab passed actual isolated CLI and just check plus just ci; replacement preserves the documented same-issue retained candidate after infrastructure failure.

    REVIEW

    TriageReview201v2

  3. pablontiv commented on Oct 20, 2026

    @pablontiv
    OwnerAuthor

    Pregunta

    Expose proven unfiltered candidate truncation while preserving ranking, typed pagination, scope, query-echo exclusions and complete output budgets.

    BASIS

    Retained implementation and null-to-array correction already exercised by real CLI; original gate PASS. Source094 PR453 officialDagu retained-capture proof and BackscrollPR208 nativeSucceeded establish replacement mechanics; actual201 recovery remains to verify.

    REVIEW

    TriageReview201v3

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions