{# FE2-2: corpus table fragment — returned standalone on HTMX requests and included inside #corpus-table on the full page. #} {% if not rows %}

No papers match these filters. Run a brain-build (lit-monitor brain-build) to populate the corpus.

{% else %} {% for row in rows %} {% endfor %}
Title Year Source Confidence Embedded Graph Notes Updated
{{ row.title or "(untitled)" }} {% if row.year %}{{ row.year }}{% else %}{% endif %} {% if row.source_type %}{{ row.source_type }}{% else %}—{% endif %} {% if row.confidence is not none %} {{ "%.2f" | format(row.confidence | float) }} {% else %} {% endif %} {% if row.embeddings_indexed %} {% else %} {% endif %} {% if row.graph_indexed %} {% else %} {% endif %} {% if row.notes_synced %} {% else %} {% endif %} {% if (row.last_updated or "")[:10] %}{{ (row.last_updated or "")[:10] }}{% else %}—{% endif %}
{# Shared filter query string, captured once so prev/next stay in sync. Values are urlencoded (Jinja autoescape HTML-escapes but does not percent-encode); single line so no stray newlines land in the URL. #} {%- set filter_qs %}search={{ search | urlencode }}&source_type={{ source_type | urlencode }}&status_gap={{ status_gap | urlencode }}&theme={{ theme | urlencode }}&sort={{ sort | urlencode }}&order={{ order | urlencode }}&limit={{ limit }}{% endset -%}
{{ offset + 1 }}–{{ offset + rows|length }} of {{ total }} {% if has_prev %} ← Prev {% endif %} {% if has_next %} Next → {% endif %}
{% endif %}