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
Fall
Projekt
Zustand
Revision
Fortschritt
-
ERGEBNISSE
Abgeschlossene Fälle
Diagnosen, Aufträge und Fälle für menschliches Review.
-
-
Fall
Projekt
Ergebnis
Revision
Aktualisiert
+
FALLABLAGE
Bearbeitete Fälle
Ergebnisse in der Outbox, übergebene, blockierte und gescheiterte Analysen. Blockiert bedeutet noch nicht abgeschlossen.