From b42bafb711695ccd0a9b996fe0e2b5d746de727e Mon Sep 17 00:00:00 2001 From: Nitsu45 Date: Fri, 23 Oct 2026 13:59:15 +0200 Subject: [PATCH] Unify processed case listing with blocked states and package downloads --- docs/test-results/processed-cases-20261023.md | 31 +++++++++++++++++++ docs/web-console.md | 19 ++++++++++-- src/viano_bug_analysis/api/dashboard.py | 4 ++- src/viano_bug_analysis/web/case-detail.js | 22 +++++++++---- src/viano_bug_analysis/web/dashboard.css | 1 + src/viano_bug_analysis/web/index.html | 8 ++--- tests/dashboard-smoke.mjs | 6 ++++ tests/test_dashboard.py | 4 ++- 8 files changed, 81 insertions(+), 14 deletions(-) create mode 100644 docs/test-results/processed-cases-20261023.md diff --git a/docs/test-results/processed-cases-20261023.md b/docs/test-results/processed-cases-20261023.md new file mode 100644 index 0000000..c80bb0f --- /dev/null +++ b/docs/test-results/processed-cases-20261023.md @@ -0,0 +1,31 @@ +# Bearbeitete Fälle – 2026-10-23 + +Die bisher auf terminale Zustände begrenzte Ergebnisliste wurde zur gemeinsamen +Liste bearbeiteter Fälle erweitert: OUTPUT_READY, HANDED_OFF, BLOCKED und +FAILED_TO_ANALYZE. Filter für Kategorie und Projekt, Suche, Sortierung nach +Aktualisierung/Kategorie/Projekt, Routingziel, Sperrgrund und linksseitiger +Iconknopf für den bestehenden projektgeschützten Paketdownload. Blockierte Fälle +werden nicht als abgeschlossen gewertet. Analysezustände/Budgets unverändert. + +Lokale Validierung: + +```text +python -m pytest tests/test_dashboard.py tests/test_web_auth.py tests/test_human_web.py -q +26 passed, 1 dependency deprecation warning +node tests/dashboard-smoke.mjs +PASS, console_errors: [], overflow: false +node --check src/viano_bug_analysis/web/case-detail.js +PASS +``` + +Echter Browser prüft die gemeinsame Liste mit Ergebnis und blockiertem Fall, +linken Downloadknöpfen, Testerantwort-Hinweis, Kategorieauswahl und bestehender +Detailnavigation. Mobile Ansicht visuell kontrolliert. Bestehende Tests sichern +projektgebundene Detail-/ZIP-Endpunkte und Anmeldung ab. Routingdaten werden aus +dem Manifest übernommen; die Liste scannt nicht separat das Exportverzeichnis. + +Vor Testbeginn Trials 16.939.129.428 Bytes, Fehlerkorpus 2.471.041 Bytes, nur kleine +temporäre UI-/Unit-Testdaten. Entwicklungsbudget weiterhin unter 20 GB. +Keine LLM-/Cloud-Aufrufe oder Kosten, keine Änderung produktiver Fälle/Dienste. +Serverinstallation, HTTPS, echter automatischer Feldtest und Betriebssicherung +bleiben Aufgaben auf dem Linux-Zielsystem. diff --git a/docs/web-console.md b/docs/web-console.md index 7dba303..f49161b 100644 --- a/docs/web-console.md +++ b/docs/web-console.md @@ -83,8 +83,23 @@ Diagnose sowie Coding- und Human-Dev-Auftrag. Befunde bleiben ausdrücklich KI-Bewertungen mit Belegreferenzen. Das Belegverzeichnis zeigt Herkunft und Abdeckungsinformationen; die vollständigen Recherchepayloads stehen im ZIP. Ein expliziter Auftrag „Kein Auftrag“ wird von einem noch nicht erstellten Dokument -unterschieden. Die separate Ergebnisliste enthält abgeschlossene und zur -menschlichen Prüfung ausgeleitete Fälle, mit Projektfilter und Suche. +unterschieden. Die gemeinsame Liste **Bearbeitete Fälle** enthält Ergebnisse +(`OUTPUT_READY`, Ziel Outbox), bereits übergebene Fälle (`HANDED_OFF`), blockierte +Fälle (`BLOCKED`) und gescheiterte Analysen (`FAILED_TO_ANALYZE`, Ziel Review). +Blockierte Fälle bleiben ausdrücklich unvollständig und können weiterhin auch +in der Übersicht wartender Fälle erscheinen. Ein Sperrgrund wird angezeigt; +`AWAITING_TEST_FEEDBACK` erscheint als „Wartet auf Testerantwort“. + +Projekt- und Kategoriefilter sowie Suche sind kombinierbar. Die Sortierung erlaubt +neueste/älteste Aktualisierung, Kategorie oder Projekt. Links in jeder Zeile lädt +ein beschrifteter Iconknopf die vollständige aktuelle Fallakte herunter, auch für +blockierte oder gescheiterte Analysen. Der Download ändert keinen Status und löst +keine Analyse aus. Die Ablagespalte zeigt das im Manifest gespeicherte Routingziel; +es ist keine unabhängige Bestandsprüfung des Outbox-Dateiverzeichnisses. Der Download +liest die verwaltete aktuelle Akte und funktioniert auch ohne separate Exportkopie. +Angezeigt wird der aktuelle Stand je Fall/Paket. Nach Wiedereröffnung erscheinen +aktive Fälle wieder in der laufenden Übersicht; ältere Revisionen bleiben in der +Detailansicht erhalten. Berechtigungen und Projektgrenzen gelten auch für Downloads. Die Revisionsauswahl liest akzeptierte Artefakte aus der Checkpointhistorie der aktuellen vollständigen Akte. Ergebnisse neuerer Revisionen erscheinen nicht in diff --git a/src/viano_bug_analysis/api/dashboard.py b/src/viano_bug_analysis/api/dashboard.py index 82c6db2..7a0b51f 100644 --- a/src/viano_bug_analysis/api/dashboard.py +++ b/src/viano_bug_analysis/api/dashboard.py @@ -103,7 +103,9 @@ def case_view(reader): 'key':key(manifest['case_id']) + '.' + key(manifest['package_id']), 'project_id': manifest['project'].get('id'), 'title': title, 'progress': round(sum(complete) / len(complete) * 100), 'calls': calls, - 'updated_at': manifest['updated_at']} + 'updated_at': manifest['updated_at'], + 'destination':manifest.get('routing',{}).get('destination'), + 'reason':manifest.get('routing',{}).get('reason')} def aggregate(cases): diff --git a/src/viano_bug_analysis/web/case-detail.js b/src/viano_bug_analysis/web/case-detail.js index 614e783..b127d83 100644 --- a/src/viano_bug_analysis/web/case-detail.js +++ b/src/viano_bug_analysis/web/case-detail.js @@ -29,14 +29,23 @@ function panel(title,content,expanded=true){ } function renderArchive(){ if(!overview)return; - const project=$('result-project').value,search=$('result-search').value.trim().toLocaleLowerCase('de-DE'); - const list=overview.cases.filter(c=>finished.has(c.state)&&(!project||project===c.project_id)&&(!search||`${c.case_id} ${c.title}`.toLocaleLowerCase('de-DE').includes(search))).sort((a,b)=>b.updated_at.localeCompare(a.updated_at)); + const project=$('result-project').value,search=$('result-search').value.trim().toLocaleLowerCase('de-DE'),status=$('result-status').value,sort=$('result-sort').value; + const labels={OUTPUT_READY:'Ergebnis bereit',HANDED_OFF:'Übergeben',BLOCKED:'Blockiert / wartet',FAILED_TO_ANALYZE:'Analyse gescheitert / Review'}; + const list=overview.cases.filter(c=>(finished.has(c.state)||c.state==='BLOCKED')&&(!status||status===c.state)&&(!project||project===c.project_id)&&(!search||`${c.case_id} ${c.title}`.toLocaleLowerCase('de-DE').includes(search))).sort((a,b)=>{ + const tie=b.updated_at.localeCompare(a.updated_at)||a.key.localeCompare(b.key); + if(sort==='category')return labels[a.state].localeCompare(labels[b.state],'de')||tie; + if(sort==='project')return a.project_id.localeCompare(b.project_id,'de')||tie; + return sort==='oldest'?-tie:tie; + }); + $('result-count').textContent=`${list.length} ${list.length===1?'Fall':'Fälle'}`; const body=$('result-rows');body.replaceChildren(); list.forEach(c=>{const row=document.createElement('tr'),name=document.createElement('td'),link=text('a',c.case_id,'case-link');link.href=`#case/${c.key}`; - name.append(link,text('small',c.title));row.append(name,text('td',c.project_id),text('td',({OUTPUT_READY:'Ergebnis bereit',HANDED_OFF:'Übergeben',FAILED_TO_ANALYZE:'Menschliches Review'})[c.state]),text('td',String(c.analysis_revision)),text('td',new Date(c.updated_at).toLocaleString('de-DE')));body.append(row);}); - if(!list.length){const row=document.createElement('tr'),cell=text('td','Keine abgeschlossenen Fälle für diese Auswahl.','empty');cell.colSpan=5;row.append(cell);body.append(row);} + const action=document.createElement('td'),download=text('button','↓','package-icon');download.type='button';download.title=`Fallakte ${c.case_id} herunterladen`;download.setAttribute('aria-label',download.title);download.addEventListener('click',()=>downloadCase(c,download));action.append(download); + const category=text('td',labels[c.state]);if(c.reason)category.append(text('small',c.reason==='AWAITING_TEST_FEEDBACK'?'Wartet auf Testerantwort':c.reason)); + name.append(link,text('small',c.title));row.append(action,name,text('td',c.project_id),category,text('td',({outbox:'Outbox',review:'Review',inbox:'Inbox',cases:'Fallablage'})[c.destination]||'Fallablage'),text('td',String(c.analysis_revision)),text('td',new Date(c.updated_at).toLocaleString('de-DE')));body.append(row);}); + if(!list.length){const row=document.createElement('tr'),cell=text('td','Keine bearbeiteten Fälle für diese Auswahl.','empty');cell.colSpan=7;row.append(cell);body.append(row);} } -function clearDetails(){selectedCase=null;detailHash=null;detailLoading=false;$('result-search').value='';} +function clearDetails(){selectedCase=null;detailHash=null;detailLoading=false;$('result-search').value='';$('result-status').value='';$('result-sort').value='newest';$('result-count').textContent='0 Fälle';} async function downloadCase(data,button){ const generation=session,credential=token;button.disabled=true;error(); try{const response=await fetch(`/v1/cases/${data.key}/package`,{credentials:'same-origin',cache:'no-store'}); @@ -113,9 +122,10 @@ function route(){ if($('test-page'))$('test-page').hidden=true; const detail=location.hash.startsWith('#case/'),results=location.hash==='#results',submissionPage=location.hash==='#submit'; $('overview-page').hidden=detail||results||submissionPage;$('results').hidden=!results;$('case-detail').hidden=!detail;$('submit').hidden=!submissionPage; - document.querySelector('header h1').textContent=detail?'Die Fallakte.':results?'Abgeschlossene Fälle.':submissionPage?'Auftrag übergeben.':'Analyse im Blick.'; + document.querySelector('header h1').textContent=detail?'Die Fallakte.':results?'Bearbeitete Fälle.':submissionPage?'Auftrag übergeben.':'Analyse im Blick.'; document.querySelectorAll('nav a').forEach(a=>a.classList.toggle('selected',detail?a.hash==='#cases':a.hash===(results?'#results':submissionPage?'#submit':location.hash==='#cases'?'#cases':'#overview'))); if(detail)loadDetail(location.hash);if(results)renderArchive(); } $('result-project').addEventListener('change',renderArchive);$('result-search').addEventListener('input',renderArchive); +$('result-status').addEventListener('change',renderArchive);$('result-sort').addEventListener('change',renderArchive); window.addEventListener('hashchange',route);route(); diff --git a/src/viano_bug_analysis/web/dashboard.css b/src/viano_bug_analysis/web/dashboard.css index 84e4cc7..8b17853 100644 --- a/src/viano_bug_analysis/web/dashboard.css +++ b/src/viano_bug_analysis/web/dashboard.css @@ -4,3 +4,4 @@ .case-link{color:#4f61c7;font-weight:650;text-decoration:none}.case-link:hover{text-decoration:underline}.detail-panel>summary{font-size:18px;font-weight:650;cursor:pointer}.detail-body{margin-top:20px}.semantic-text{color:#45516a;white-space:pre-wrap;overflow-wrap:anywhere;margin:5px 0 12px}.semantic-fields{display:grid;grid-template-columns:minmax(130px,190px) minmax(0,1fr);gap:12px 22px;margin:0}.semantic-fields dt{font-size:12px;color:#7c8599;font-weight:600}.semantic-fields dd{margin:0;min-width:0}.semantic-fields .semantic-fields{grid-template-columns:130px minmax(0,1fr)}.semantic-list{display:grid;gap:10px}.semantic-item{border-left:2px solid #e6eaf6;padding-left:13px}.statement small{display:block;color:#9299a8}.reference-list{color:#7785ae;font-size:11px;overflow-wrap:anywhere}.hypothesis-card{border:1px solid #e6e9f1;border-radius:9px;padding:20px;margin-bottom:16px}.hypothesis-heading{display:flex;align-items:center;justify-content:space-between;gap:12px}.hypothesis-heading h3{font-size:16px;margin:0}.hypothesis-heading .badge{flex-shrink:0}.hypothesis-card .detail-panel{margin:16px 0 0;padding:14px;box-shadow:none}.hypothesis-card .detail-panel>summary{font-size:13px}.evidence-columns{display:grid;grid-template-columns:1fr 1fr;gap:26px;margin-top:18px}.evidence-columns h4{font-size:12px;color:#68758c}.evidence-columns>div{background:#f7f8fc;padding:16px;border-radius:7px;min-width:0}.detail-controls{display:flex;align-items:center;gap:16px}.detail-controls label{margin:0;min-width:170px}.detail-controls button{margin-top:20px}.history-note{background:#f1f3fd;color:#6472ae;padding:12px;border-radius:6px;font-size:12px}.assignment-status{font-weight:650;color:#34436a}.human-document{white-space:pre-wrap;overflow-wrap:anywhere;font:13px/1.7 system-ui}.next-actions p{color:#5f6d85}#case-detail .panel{scroll-margin-top:20px}@media(max-width:900px){.semantic-fields,.semantic-fields .semantic-fields{grid-template-columns:1fr;gap:4px}.semantic-fields dd{margin-bottom:12px}.detail-controls{flex-wrap:wrap}}@media(max-width:700px){.hypothesis-heading{align-items:flex-start;flex-direction:column}.evidence-columns{grid-template-columns:1fr}.detail-controls{width:100%}.detail-controls button{margin-top:0}.hypothesis-card{padding:14px}.rail{flex-wrap:wrap}.rail nav{flex-wrap:wrap}} #key-projects{border:1px solid var(--line);border-radius:8px;padding:12px;margin-bottom:14px}#key-projects label{display:flex;align-items:center;gap:10px;margin:8px 0}#key-projects input{width:auto;margin:0}#key-list button{margin:10px 8px 0 0}#key-list input{font-family:monospace} +#result-rows .package-icon{width:34px;height:34px;padding:0;font-size:22px;line-height:1;border-radius:8px}#result-rows td small{display:block;max-width:320px;overflow-wrap:anywhere;color:var(--muted);font-size:11px} diff --git a/src/viano_bug_analysis/web/index.html b/src/viano_bug_analysis/web/index.html index a3f2c74..26944ca 100644 --- a/src/viano_bug_analysis/web/index.html +++ b/src/viano_bug_analysis/web/index.html @@ -6,7 +6,7 @@
BETRIEBSÜBERSICHT

Analyse im Blick.

Aktuelle Arbeit und messbarer Verbrauch.

Warte auf Verbindung
@@ -30,9 +30,9 @@
FALLAKTEN

Aktuelle Untersuchungen

FallProjektZustandRevisionFortschritt
- +