{% extends "base.html" %} {% block title %}Health — mdmem{% endblock %} {% block content %}

Health

{% if not health.embed_ok %}

Lexical only. The embedding backend did not answer, so search is running without the dense channel. Notes are still written and indexed; vectors fill in once it recovers.

{% endif %} {# Uniform number tiles: one label, one number, nothing else. Anything that needs a unit, a status or a model name goes in the cards below instead — mixing the two is what made this read as a ragged list rather than a dashboard. #}
{% for s in ['inbox', 'active', 'archive'] %}
{{ s }}
{{ health.counts.get(s, 0) }}
{% endfor %}
Chunks
{{ health.chunks }}
No vector
{{ health.vec_pending }}
Orphans
{{ health.orphans }}

Embeddings

Status
{{ 'ok' if health.embed_ok else 'lexical only' }}
Model
{{ health.embed_model }}
Dimension
{{ health.embed_dim }}
Last call
{{ health.embed_last_ms or '–' }} ms
Errors
{{ health.embed_errors }}

Maintenance

{% if eval_status.startswith("started:") %}

Eval started — report: {{ eval_status[8:] }}

{% elif eval_status.startswith("missing:") %}

No query set at {{ eval_status[8:] }} — label 50–100 real queries first (§11).

{% endif %} {% if health.secrets_in_vault %}

Possible credentials in the vault

{% endif %}

Unresolved links

Recent MCP calls

{% for c in calls %} {% else %}{% endfor %}
TimeToolSourceokmsids
{{ c.ts }}{{ c.tool }}{{ c.get('source', '') }}{{ c.get('ok', '') }}{{ c.get('ms', '') }} {% for i in c.get('ids', []) %}{{ i[:8] }} {% endfor %}
none
{% endblock %}