feat(disk-delete): definitief verwijderen vanuit de prullenbak #86

Merged
janpeter merged 19 commits from feat/disk-delete into main 2026-09-21 22:39:11 +02:00
Owner

Een bestand in de prullenbak werd alleen in de app verborgen. Deze wijziging voegt definitief verwijderen van schijf toe na expliciete browserbevestiging, per bestand of voor maximaal 100 geselecteerde bestanden.

De browser legt de bevestigde bestandsvingerafdruk vast. Een kortlevende delete-worker controleert die tegen de actuele index en het bestand op de geaccepteerde mount. Alleen deze worker krijgt tijdens zijn run schrijftoegang tot de mediamounts; web, scan-worker en video-worker houden hun read-only binds.

Gedrag en herstel

  • Additieve migratie voor duurzame opdrachten, auditregels en een exclusief slot per mount. Scan- en video-admission worden met verwijderen gecoördineerd; een bezet of stale slot blokkeert scan-finalise.
  • Restore vóór destructieve admission maakt de oude bevestiging ongeldig, ook na opnieuw trashen. Na admission blokkeert restore zolang de verwijderende actor niet aantoonbaar beëindigd is.
  • Een gestarte opdracht met onzekere uitkomst krijgt geen tweede verwijderpoging, ook niet na een audit-/statusfout of leaseverloop. Bewezen verwijderde bestanden hervatten alleen de opruiming van index en caches.
  • BigInt-transport beperkt zich tot size en inode; geldige padstrings zoals 123n blijven behouden.
  • Compose-service, launcher, systemd-units, binding aan het gedeployde image en runbook zijn opgenomen.
  • De vaste systemd-service krijgt bij installatie de UID van een expliciet gekozen bestaand deploy-account. Het runbook weigert root en een ontbrekend/onbekend account, valideert beide units vóór en na installatie en controleert de effectieve User vóór timeractivering. User=%i is vervangen door een verplicht in te vullen placeholder.

Bronnen

Scrum4Me: sprint S-2026-09-21-2 (cmubjcyuu0052zb17l6g7r731), story ST-050. De aanvullende race-/transportcorrecties en systemd-correctie zijn expliciet door JP goedgekeurd.

Verificatie

Geteste bestandsinhoud vastgelegd in commit 6fc69521f8d31f64acc4717b8e88bd6c05d04b3f, Node 22.23.2 en een eigen PostgreSQL 17-wegwerpdatabase zonder echte mediamounts:

  • npm test: 883 tests, 876 pass, 0 fail, 7 platformgebonden skips.
  • npm run typecheck, npm run lint, npm run build en git diff --check: geslaagd. Lint heeft uitsluitend 3 bestaande waarschuwingen in media-sort.ts.
  • Additieve migratie en schema-diff gecontroleerd; gerichte mutatietests bewijzen de veiligheidscontroles.
  • 14 aanvullende permanente regressies voor onder meer restore/retrash-interleaving, opslagfouten plus leaseherstel en directe finalise-publicatie.
  • 9 installatieregressies voeren het werkelijke Bash-recept uit met geïsoleerde hostcommando's. Ze dekken accountkeuze, UID-rendering, verificatiefouten en afwijkende effectieve User. De effectieve-User-guard weglaten veroorzaakt de drie bedoelde testfouten.
  • Veilige Linux-proef op Debian/systemd 252.39: echte accountlookup, rendering, installatie in een wegwerpcontainer en beide systemd-analyze verify-stappen slagen. Ontbrekende, root- en onbekende accounts worden vóór installatie geweigerd. systemctl was hierbij gesimuleerd; deze proef heeft geen service gestart.

Activering

De echte max2/NFS-operatorproef blijft nodig vóór brede activering: onder meer effectieve ro/rw-binds, /proc/self/fd, lege-queuegedrag (AC-2b), NFS silly-rename en launcher/reaper-herstel. Merge, deployment, SOPS en systemd-activering blijven afzonderlijke JP-beslissingen.

Een bestand in de prullenbak werd alleen in de app verborgen. Deze wijziging voegt definitief verwijderen van schijf toe na expliciete browserbevestiging, per bestand of voor maximaal 100 geselecteerde bestanden. De browser legt de bevestigde bestandsvingerafdruk vast. Een kortlevende delete-worker controleert die tegen de actuele index en het bestand op de geaccepteerde mount. Alleen deze worker krijgt tijdens zijn run schrijftoegang tot de mediamounts; web, scan-worker en video-worker houden hun read-only binds. ## Gedrag en herstel - Additieve migratie voor duurzame opdrachten, auditregels en een exclusief slot per mount. Scan- en video-admission worden met verwijderen gecoördineerd; een bezet of stale slot blokkeert scan-finalise. - Restore vóór destructieve admission maakt de oude bevestiging ongeldig, ook na opnieuw trashen. Na admission blokkeert restore zolang de verwijderende actor niet aantoonbaar beëindigd is. - Een gestarte opdracht met onzekere uitkomst krijgt geen tweede verwijderpoging, ook niet na een audit-/statusfout of leaseverloop. Bewezen verwijderde bestanden hervatten alleen de opruiming van index en caches. - BigInt-transport beperkt zich tot size en inode; geldige padstrings zoals `123n` blijven behouden. - Compose-service, launcher, systemd-units, binding aan het gedeployde image en runbook zijn opgenomen. - De vaste systemd-service krijgt bij installatie de UID van een expliciet gekozen bestaand deploy-account. Het runbook weigert root en een ontbrekend/onbekend account, valideert beide units vóór en na installatie en controleert de effectieve `User` vóór timeractivering. `User=%i` is vervangen door een verplicht in te vullen placeholder. ## Bronnen - [Goedgekeurd implementatieplan r4](https://git.jp-visser.nl/janpeter/Media-Organizer/src/commit/a2b14958515caa4b306825b235111b500e276b20/docs/superpowers/plans/2026-09-21-disk-delete.md). - [Goedgekeurde specificatie r6](https://git.jp-visser.nl/janpeter/Media-Organizer/src/commit/a2b14958515caa4b306825b235111b500e276b20/docs/superpowers/specs/2026-09-21-disk-delete-design.md). - [Actueel deployment- en herstelrunbook](https://git.jp-visser.nl/janpeter/Media-Organizer/src/commit/6fc69521f8d31f64acc4717b8e88bd6c05d04b3f/docs/runbooks/disk-delete-deploy.md). Scrum4Me: sprint **S-2026-09-21-2** (`cmubjcyuu0052zb17l6g7r731`), story **ST-050**. De aanvullende race-/transportcorrecties en systemd-correctie zijn expliciet door JP goedgekeurd. ## Verificatie Geteste bestandsinhoud vastgelegd in commit `6fc69521f8d31f64acc4717b8e88bd6c05d04b3f`, Node 22.23.2 en een eigen PostgreSQL 17-wegwerpdatabase zonder echte mediamounts: - `npm test`: **883 tests, 876 pass, 0 fail, 7 platformgebonden skips**. - `npm run typecheck`, `npm run lint`, `npm run build` en `git diff --check`: geslaagd. Lint heeft uitsluitend 3 bestaande waarschuwingen in `media-sort.ts`. - Additieve migratie en schema-diff gecontroleerd; gerichte mutatietests bewijzen de veiligheidscontroles. - 14 aanvullende permanente regressies voor onder meer restore/retrash-interleaving, opslagfouten plus leaseherstel en directe finalise-publicatie. - 9 installatieregressies voeren het werkelijke Bash-recept uit met geïsoleerde hostcommando's. Ze dekken accountkeuze, UID-rendering, verificatiefouten en afwijkende effectieve `User`. De effectieve-User-guard weglaten veroorzaakt de drie bedoelde testfouten. - Veilige Linux-proef op Debian/systemd **252.39**: echte accountlookup, rendering, installatie in een wegwerpcontainer en beide `systemd-analyze verify`-stappen slagen. Ontbrekende, root- en onbekende accounts worden vóór installatie geweigerd. `systemctl` was hierbij gesimuleerd; deze proef heeft geen service gestart. ## Activering De echte max2/NFS-operatorproef blijft nodig vóór brede activering: onder meer effectieve ro/rw-binds, `/proc/self/fd`, lege-queuegedrag (AC-2b), NFS silly-rename en launcher/reaper-herstel. Merge, deployment, SOPS en systemd-activering blijven afzonderlijke JP-beslissingen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Alle 8 codex-bevindingen (2 BLOCKER + 6 MAJOR) + claude MAJOR/MINOR
gerepareerd in de referentie en de 5 patches opnieuw gegenereerd uit de
nieuwe commits (794554e·55d175f·6d3e8c9·edf4427·cd9742f). Nieuwe
beslissingen P-9..P-13, P-8 finalise nu 'stopped'. Boom-identiteit en de
volledige suite (847/840/0/7) geverifieerd.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Alle 8 ronde-2-bevindingen (codex 2 BLOCKER + 5 MAJOR, claude 1 MAJOR)
gerepareerd als één coördinatie-probleem: atomaire claimSlot (P-11),
restore-fence op vastgehouden slot (P-9), reaper spaart deleted (P-13),
excludeIds/skip (P-12), cleanup capture+cascade in één lock (P-10),
launcher-psql + release + OPEN_WORK_STATUSES-parse (P-13). Nieuwe hashes
794554e·49affa2·b5da5f2·d23d95c·b3f59d7. Boom-identiteit en suite
(851/844/0/7) geverifieerd.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ronde 3: claude GO, codex NO-GO (1 BLOCKER + 2 MAJOR); M3/M5/M6/M7 +
convergentie bevestigd gesloten. Drie resterende punten gefixt als één
slot-levensduur/toelatingsprobleem: releaseOnExit-beslissing direct na
runChild (P-9), gedeelde pg_advisory_xact_lock(212,mount_id) in alle drie
toelatingspaden + hercheck (P-11), launcher release/reconcile SELECT in
de parent met || fail (P-13). Nieuwe hashes 794554e·eb04c12·0fba83a·
b19fca7·3761d8b. Boom-identiteit en suite (856/849/0/7) geverifieerd.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Planloop afgerond in 4 rondes; status approved. Referentie 794554e·
eb04c12·0fba83a·b19fca7·3761d8b op 98228c7, suite 856/849/0/7. Volgende
stap = JP-gate vóór de Scrum4Me-ceremonie.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
fix(disk-delete): voorkom herhaalde verwijderpogingen en verouderde bevestigingen
All checks were successful
CI / test (historical-bootstrap) (pull_request) Successful in 49s
CI / test (video-migration) (pull_request) Successful in 1m6s
CI / test (suite) (pull_request) Successful in 2m55s
CI / docker-build (pull_request) Successful in 3m19s
dd810c6c22
s4m-codex-reviewer requested changes 2026-09-21 21:31:31 +02:00
Dismissed
s4m-codex-reviewer left a comment

Verdict: REQUEST_CHANGES

Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

Findings

  • BLOCKER — deploy/systemd/media-organizer-delete.service:11: de unit zet User=%i, maar het bestand is geen template-unit (media-organizer-delete.service) en de timer start expliciet Unit=media-organizer-delete.service. Daardoor is er geen instance-naam om in %i te substitueren. In de meegeleverde installatie-instructie wordt ook alleen media-organizer-delete.timer enabled, niet bijvoorbeeld een media-organizer-delete@<user>.timer. Het gevolg is dat de oneshot launcher niet betrouwbaar als deploy-gebruiker kan starten; de timer kan dus geen delete-worker runnen en definitief verwijderen blijft in productie steken op queued/running werk. Maak de service/timer óf echte template-units (media-organizer-delete@.service met bijpassende timer/enable-instructie), óf vervang User=%i door een concrete operator/deploy-gebruiker in het unitbestand of deploymentrecept.

Samenvatting

De destructieve worker-kern en de bijbehorende race-afscherming ogen zorgvuldig opgezet en zijn breed getest in de diff. Deze PR kan echter niet worden goedgekeurd zolang de systemd-activatie van de enige rw-worker niet klopt, omdat dat de primaire runtime-route van de feature blokkeert.

# Verdict: REQUEST_CHANGES Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. ## Findings - **BLOCKER** — `deploy/systemd/media-organizer-delete.service:11`: de unit zet `User=%i`, maar het bestand is geen template-unit (`media-organizer-delete.service`) en de timer start expliciet `Unit=media-organizer-delete.service`. Daardoor is er geen instance-naam om in `%i` te substitueren. In de meegeleverde installatie-instructie wordt ook alleen `media-organizer-delete.timer` enabled, niet bijvoorbeeld een `media-organizer-delete@<user>.timer`. Het gevolg is dat de oneshot launcher niet betrouwbaar als deploy-gebruiker kan starten; de timer kan dus geen delete-worker runnen en definitief verwijderen blijft in productie steken op queued/running werk. Maak de service/timer óf echte template-units (`media-organizer-delete@.service` met bijpassende timer/enable-instructie), óf vervang `User=%i` door een concrete operator/deploy-gebruiker in het unitbestand of deploymentrecept. ## Samenvatting De destructieve worker-kern en de bijbehorende race-afscherming ogen zorgvuldig opgezet en zijn breed getest in de diff. Deze PR kan echter niet worden goedgekeurd zolang de systemd-activatie van de enige rw-worker niet klopt, omdat dat de primaire runtime-route van de feature blokkeert.
fix(disk-delete): validate deploy identity before timer activation
All checks were successful
CI / test (historical-bootstrap) (pull_request) Successful in 1m2s
CI / test (video-migration) (pull_request) Successful in 1m7s
CI / test (suite) (pull_request) Successful in 3m26s
CI / docker-build (pull_request) Successful in 2m44s
6fc69521f8
s4m-codex-reviewer left a comment

APPROVED

geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

Findings

  • Geen blokkerende of error-severity findings gevonden.

Reviewnotities

  • De wijziging past binnen de productstandaard dat web, scan-worker en video-worker read-only blijven en dat alleen de kortlevende delete-worker rw-binds krijgt.
  • De risicovolle paden zijn expliciet afgedekt: vingerafdrukvalidatie, media_file-rijlock bij restore, per-mount slot/lease, fail-closed child-uitkomsten, launcher-release met bewezen afwezigheid, en compose/runbook-validatie.
  • Tests en docs zijn meegeleverd voor de nieuwe worker-, UI-, launcher-, compose- en installatiepaden.
# APPROVED geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. ## Findings - Geen blokkerende of error-severity findings gevonden. ## Reviewnotities - De wijziging past binnen de productstandaard dat `web`, `scan-worker` en `video-worker` read-only blijven en dat alleen de kortlevende `delete-worker` rw-binds krijgt. - De risicovolle paden zijn expliciet afgedekt: vingerafdrukvalidatie, media_file-rijlock bij restore, per-mount slot/lease, fail-closed child-uitkomsten, launcher-release met bewezen afwezigheid, en compose/runbook-validatie. - Tests en docs zijn meegeleverd voor de nieuwe worker-, UI-, launcher-, compose- en installatiepaden.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/Media-Organizer!86
No description provided.