phase2d: gemeinsames Ziel-Modell, KI-Box als erster Adapter, strukturierter Update-Verlauf
- kern/ziele.py: Ziel -> Bausteine mit Stand (neu/aktuell/unbekannt/festgehalten/wird-geprueft), Versionen und dem Knopf, der das Update anstoesst; gleiches Modell fuer Box und Homelab - services/box_updates.py: Update-Zwischenspeicher aus dem Router geholt, ki_box_ziel() als Box-Adapter; GET /api/ziele - Update-Verlauf strukturiert: autoupdate.sh und die Update-Knoepfe schreiben je Baustein eine JSON-Zeile (mc2-update-verlauf.jsonl); die Meldungstexte bleiben gleich, aeltere Laeufe kommen weiter aus dem Meldeprotokoll. Updates per Knopf erscheinen jetzt auch im Verlauf. - jobengine: Abschluss-Haken fuer jedes Ende (neben der Nacharbeit fuer den Erfolg) - Sonntags-Lauf setzt seinen Anlass; Hermes-Job aus dem Lauf schreibt nicht doppelt - Vertragstest Bash-Schreiber gegen Python-Leser (laeuft auf der Box mit jq) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
22bb8c672b
commit
589c14d5e9
@@ -61,3 +61,29 @@ def test_hermes_version_auch_wenn_der_abruf_haengt(monkeypatch, tmp_path):
|
||||
info = maintenance.hermes_update_details()
|
||||
assert info["installed_version"] == "0.21.4"
|
||||
assert "error" in info
|
||||
|
||||
|
||||
def test_update_per_knopf_landet_im_verlauf(monkeypatch):
|
||||
"""Einzel-Updates und „Alle aktualisieren“ schreiben ins strukturierte Verlauf-Format; bei einer
|
||||
gescheiterten Kette zeigt die letzte Teil-Marke, welcher Teil scheiterte."""
|
||||
from services import jobengine, update_verlauf
|
||||
|
||||
zeilen: list[tuple] = []
|
||||
monkeypatch.setattr(update_verlauf, "eintragen", lambda *a: zeilen.append(a))
|
||||
job = {"id": "x", "state": "done", "returncode": 0, "started_at": 1790000000.0,
|
||||
"abschluss_daten": {"bausteine": ["engine"]}}
|
||||
maintenance._update_im_verlauf(job)
|
||||
assert zeilen[-1][1:] == ("Update von Hand", "engine", "eingespielt", "Per Knopf eingespielt, Prüfung grün.")
|
||||
|
||||
zeilen.clear()
|
||||
monkeypatch.setattr(jobengine, "protokoll", lambda job_id: [
|
||||
"$ bash -c …", "════════ [1/3] Engine (llama.cpp) ════════", "ok",
|
||||
"════════ [2/3] Router (llama-swap) ════════", "Stack-Check rot"])
|
||||
maintenance._update_im_verlauf({**job, "state": "failed", "returncode": 1,
|
||||
"abschluss_daten": {"bausteine": ["engine", "swap", "hermes"]}})
|
||||
assert [(z[2], z[3]) for z in zeilen] == [
|
||||
("engine", "eingespielt"), ("swap", "zurueckgerollt"), ("hermes", "offen")]
|
||||
|
||||
zeilen.clear()
|
||||
maintenance._update_im_verlauf({**job, "abschluss_daten": {}})
|
||||
assert zeilen == []
|
||||
|
||||
Reference in New Issue
Block a user