1 analyse

De repo heeft al een bruikbaar taskmodel voor copy, move, download en duplicate, maar de main WebUI gebruikt dat model voor copy/move nog nauwelijks. In de hoofd-UI ziet de gebruiker na start nu vooral een korte statusregel of summary; live voortgang staat feitelijk alleen in `F1 > Settings > Logs`. Daardoor ontbreekt directe, persistente feedback in de hoofd-UI en is er geen zichtbare rem op dubbel starten.

Belangrijkste conclusie:

- Copy en move hebben al echte backend-tasks met progressvelden.
- De bron van truth voor lopende copy/move-taken is al `/api/tasks`.
- Er bestaat nu geen cancel/abort voor copy of move.
- Een eerlijke abortknop voor copy/move kan dus nu niet frontend-only worden toegevoegd.
- De kleinste veilige stap is een compacte live task-indicator in de bestaande header/toolbar-zone, gevoed door de bestaande task-feed.

2 bestaande functionaliteit

A. Taskmodel / backend

- `copy` en `move` gebruiken hetzelfde taskmechanisme via [tasks_runner.py](/workspace/webmanager-mvp/webui/backend/app/tasks_runner.py), [task_repository.py](/workspace/webmanager-mvp/webui/backend/app/db/task_repository.py), [copy_task_service.py](/workspace/webmanager-mvp/webui/backend/app/services/copy_task_service.py) en [move_task_service.py](/workspace/webmanager-mvp/webui/backend/app/services/move_task_service.py).
- Taskstatussen die al bestaan in [task_repository.py](/workspace/webmanager-mvp/webui/backend/app/db/task_repository.py):
  - `queued`
  - `running`
  - `completed`
  - `failed`
  - daarnaast voor download ook `requested`, `preparing`, `ready`, `cancelled`
- Progressinformatie bestaat al:
  - files: `done_bytes`, `total_bytes`, `current_item`
  - batch/directory: `done_items`, `total_items`, `current_item`
- Copy:
  - file copy gebruikt byte-progress callback
  - directory copy is grof: `0/1` naar `1/1`
  - batch copy gebruikt item-progress
- Move:
  - same-root file move heeft praktisch geen tussentijdse progress, alleen start/einde
  - cross-root file move gebruikt copy-progress en delete na afloop
  - directory move is grof `0/1` naar `1/1`
  - batch move gebruikt item-progress
- Er is al read-API voor tasks:
  - `GET /api/tasks`
  - `GET /api/tasks/{task_id}`
- Er is geen cancel-API voor copy/move.
- De enige echte cancel in de repo zit nu bij archive-downloads in [archive_download_task_service.py](/workspace/webmanager-mvp/webui/backend/app/services/archive_download_task_service.py) en `POST /api/files/download/archive/{task_id}/cancel`.
- Copy/move workers in [tasks_runner.py](/workspace/webmanager-mvp/webui/backend/app/tasks_runner.py) hebben geen cooperative cancel checks.
- Copy/move history bestaat al via [history_repository.py](/workspace/webmanager-mvp/webui/backend/app/db/history_repository.py): `queued`, `completed`, `failed`.

B. Bestaande frontend feedback

- In de hoofd-UI starten copy en move vanuit [app.js](/workspace/webmanager-mvp/webui/html/app.js):
  - `startCopySelected()`
  - `executeMoveSelection()`
- Huidige feedback voor copy/move:
  - `setStatus(...)` onderin/headerstatus
  - `showActionSummary(...)`
  - `openFeedbackModal(...)` via `actions-error`
- Die feedback is niet persistent als live taskweergave.
- Er is nu geen compacte taskindicator in de hoofd-UI.
- `state.selectedTaskId` en `refreshTasksSnapshot()` bestaan al in [app.js](/workspace/webmanager-mvp/webui/html/app.js), maar worden voor copy/move alleen gebruikt om een snapshotcount op te halen; er is geen zichtbare hoofd-UI-component die dit toont.
- Buiten download is er geen modal of popover voor actieve taken in de hoofd-UI.

C. Logs / history / settings

- `F1 > Settings > Logs` toont al twee side-by-side secties:
  - `Tasks`
  - `History`
- Deze UI gebruikt al de bestaande feeds:
  - `/api/tasks`
  - `/api/history`
- Polling bestaat al in [app.js](/workspace/webmanager-mvp/webui/html/app.js):
  - `loadTasksForSettings()`
  - `loadHistoryForSettings()`
  - `loadLogsAndTasksForSettings()`
  - `scheduleSettingsLogsPolling()`
- De UI rendert taskdetails al compact via `formatTaskLine(task)`:
  - status
  - source/destination
  - `done_items/total_items`
  - `current_item`
- Dat betekent dat de repo al een bruikbare frontend formatteringslaag heeft die ook buiten Settings herbruikbaar is.

D. Abort/cancel haalbaarheid

- Copy/move kunnen nu technisch niet veilig worden afgebroken via bestaande code.
- Er is geen taskstatus-overgang of API-contract voor copy/move-cancel.
- Er is geen cooperative worker-check in copy/move loops.
- Er is geen rollback.
- Eerlijke cancelsemantiek voor copy/move zou dus moeten zijn:
  - stop resterende verwerking zo snel mogelijk op een checkpunt
  - reeds verwerkte bestanden blijven zoals ze zijn
  - geen rollback
- Maar die semantiek is nog niet geïmplementeerd.
- Conclusie: een abortknop voor copy/move is nu buiten scope zonder backendwerk.

3 scope

Minimale veilige volgende stap, op basis van wat al bestaat:

- frontend-only hoofd-UI verbetering
- geen layoutwijziging van de dual-pane browse-UI
- geen nieuw vast paneel
- wel een compacte task/status chip in bestaande headerbar of function-bar zone
- alleen zichtbaar als er actieve taken zijn (`queued`, `running`, en eventueel download `requested/preparing`)
- klik opent een kleine popover/dropdown met actieve taken
- popover hergebruikt bestaande taskdata en formattering uit `/api/tasks`
- popover bevat link/actie naar `F1 > Settings > Logs`
- geen abortknop voor copy/move in deze fase

Waarom dit binnen scope past:

- gebruikt bestaande task-feed
- gebruikt bestaande taaksemantiek
- verandert de hoofd-layout niet
- geeft persistente feedback zonder modal-first patroon
- is compatibel met de OneDrive-achtige richting: compacte indicator, detail op aanvraag

4 impact

Positief:

- gebruiker ziet direct in de hoofd-UI dat copy/move loopt
- feedback blijft zichtbaar zolang taak actief is
- minder kans op dubbel starten
- geen extra structureel paneel
- F1 Logs blijft intact als detailbron

Beperkingen:

- zonder backendwerk is er nog geen eerlijke cancel voor copy/move
- progress blijft zo nauwkeurig als bestaande taskdata toelaat
- same-root move en directory move blijven qua progress relatief grof

5 risico

Laag tot middel als alleen de voorgestelde frontendstap wordt gebouwd.

Belangrijkste risico’s:

- polling in de hoofd-UI kan onrustig worden als hij niet net zo stabiel wordt gebouwd als de bestaande Settings-polling
- een te opvallende indicator kan visueel concurreren met de bestaande headerstatus
- als een abortknop zonder backendsteun zou worden toegevoegd, zou dat misleidend zijn; dat moet expliciet niet gebeuren

Expliciet risico buiten scope:

- copy/move-cancel vereist backend-aanpassing aan taskmodel, runner en waarschijnlijk history

6 testplan

Voor de minimale frontendstap:

- gerichte UI smoke/golden checks voor:
  - indicator aanwezig in header/toolbar markup
  - indicator alleen bedoeld voor actieve taken
  - popover/dropdown markup aanwezig
  - link naar bestaande logs-entrypoint aanwezig
- gerichte JS-checks voor:
  - actieve taken worden uit `/api/tasks` gefilterd
  - `queued`/`running` tonen indicator
  - `completed`/`failed` verdwijnen uit de actieve indicator
  - polling start/stop logisch zonder extra layoutreset
- geen backend golden updates nodig zolang `/api/tasks` contract ongewijzigd blijft

Niet nu testen:

- abort voor copy/move, want die functionaliteit bestaat nog niet

7 acceptatiecriteria

Voor de voorgestelde minimale stap:

- Een gestart copy- of move-proces is zichtbaar in de hoofd-UI zonder navigatie naar `F1 > Settings / Logs`.
- De oplossing verandert de dual-panel layout niet structureel.
- De feedback blijft zichtbaar zolang de taak actief is.
- De oplossing gebruikt bestaande taskdata als bron van truth.
- Er wordt geen fake progress getoond.
- Er wordt geen fake cancelknop getoond voor copy/move.
- Bestaande task/log/history-functionaliteit blijft intact.
- API-contract blijft ongewijzigd.

Voor abort/cancel:

- Niet acceptabel in deze fase zonder backendsteun.
- Eerst aparte backendfase nodig.

8 codex-uitvoering / voorstel

Huidige stap:

- Alleen analyse uitgevoerd.
- Geen functionele implementatie gedaan.

Waarom:

- `CHANGE_POLICY.md` zegt dat frontend flow aanpassen eerst een voorstel nodig heeft.
- De opdracht vroeg expliciet om eerst grondige repo-inspectie en pas daarna een minimaal voorstel.
- Cancel/abort voor copy/move is niet eerlijk implementeerbaar zonder backendwerk.

Minimaal wijzigingsvoorstel dat ik hierna zou uitvoeren als vervolgstap:

1. Frontend-only compacte task chip
- plaats in `#title-zone-actions` of direct naast `#status`
- toont bijvoorbeeld:
  - `1 task running`
  - `3 active tasks`

2. Kleine popover/dropdown
- opent op klik op de chip
- toont alleen actieve taken uit `/api/tasks`
- hergebruikt bestaande `formatTaskLine(task)` of een kleine variant daarop
- toont eerlijke status:
  - `queued`
  - `running`
  - eventueel later download `requested/preparing`

3. Polling hergebruik
- hergebruik bestaande `/api/tasks`
- implementeer lichte polling alleen als er actieve taken zijn of als de popover open is
- gebruik stabiele rerender-aanpak zoals in Settings > Logs

4. Doorgang naar detail
- knop of link `View in Logs`
- opent bestaande `F1 > Settings > Logs`

5. Expliciet nog niet doen
- geen cancelknop voor copy/move
- geen extra paneel
- geen fake progressbar

Vervolgvoorstel voor latere backendfase als abort gewenst is:

- copy/move taskstatus uitbreiden met `cancelled`
- cancel-endpoint voor copy/move
- cooperative checks in `TaskRunner` tussen items/chunks
- eerlijke semantiek:
  - stop resterende verwerking
  - reeds verwerkte bestanden blijven bestaan
  - geen rollback

9 gewijzigde bestanden

- [project_docs/UI_FEEDACK.md](/workspace/webmanager-mvp/project_docs/UI_FEEDACK.md)

10 uitgevoerde tests

Wel gedaan:

- code-inspectie van backend taskmodel, runners, services, routes en frontend task/log UI

Niet gedaan:

- geen functionele tests
- geen implementatiechecks

Reden:

- deze stap is bewust alleen analyse + voorstel, geen implementatie
