# Install lock fix — build 87→88 apply-flow

**Dato:** 2026-06-05 23:10  
**Branch:** `integration/platform-sprint-before-phase1`  
**POC:** `C:\NinjaNexusPOC`

## Rodårsag

| Symptom | Årsag |
|---------|--------|
| `e_sqlite3.dll` låst | `NexusIdentity.Api` kørte stadig (via `IdentityHostService` eller separat proces) mens `Expand-Archive -Force` overskrev `identity/` |
| Hang ved "afventer / forbereder installation" | `UpdateService` satte `Installing` og startede `apply-pending-update.ps1` uden pre-stop; i `--safe-poc` lukkede Shell **ikke** efter planlagt genstart, så filer forblev låst og UI hang i forberedelse |
| Ingen fejl / retry | Ingen fil-lås preflight, ingen timeout på `Preparing`, ingen persisted job-state |

### Proces- og fillås-kæde (før fix)

```mermaid
sequenceDiagram
    participant Shell as NexusShell
    participant US as UpdateService
    participant PS as apply-pending-update.ps1
    participant Id as NexusIdentity.Api

    Shell->>US: InstallStagedUpdateAsync
    US->>PS: Start hidden (Shell stadig kører i safe-poc)
    PS->>Id: Kill by name (race / tree)
    PS->>PS: Expand-Archive identity/ (FAIL e_sqlite3.dll locked)
    Note over Shell: UI: Preparing/Installing — ingen timeout
```

## Ændringer

1. **NexusUpdateProcessStopper** — stopper kun `NexusShell` / `NexusIdentity.Api` under `InstallRoot` (+ PID-fil); aldrig global `dotnet` kill.
2. **NexusUpdateFileLockChecker** — exclusive open preflight på `e_sqlite3.dll`, Identity exe, Shell exe.
3. **NexusPlatformUpdateJobStore** — `%LocalAppData%\NinjaNexus\update\pending-job.json`; timeout Preparing 3 min / Applying 10 min; stale recovery ved startup.
4. **UpdateService** — faser `Preparing` → lock check → `Installing`; `Blocked`/`Failed` med danske beskeder; retry via `RetryInstallAsync`.
5. **apply-pending-update.ps1** — STOP-NEXUS-mønster, versioneret extract til `versions\{build}\`, kopier shell/identity, retry med backoff, `NEXUS_DB_CONNECTION` → `data\`.
6. **DB-placering** — SQLite i `{InstallRoot}\data\nexus-identity.db` (ikke i `identity/` publish-mappe).
7. **Shell shutdown** — genstart planlagt **altid** lukker Shell (også safe-poc).
8. **UI** — danske statuser, Prøv igen, Åbn logs.
9. **NexusInstallQueue** — job-timeout (default 5 min).

## DB-struktur (efter fix)

```
C:\NinjaNexusPOC\
  data\nexus-identity.db      ← persistent (overskrives IKKE ved update)
  identity\                   ← binaries (e_sqlite3.dll, NexusIdentity.Api.exe)
  shell\
  versions\{build}\           ← staging extract
  logs\apply-update.log
  logs\apply-result.json
```

Fallback: `%LocalAppData%\NinjaNexus\data\` hvis install-root mangler.

## Unit tests (26/26 PASS)

- Fil-lås blokerer preflight
- Stale Preparing → Failed
- Blocked job recovery
- Identity DB under `data/`
- Install-kø timeout
- SHA256 mismatch (eksisterende)

## Retest 87→88 (laptop POC)

| Step | Handling |
|------|----------|
| 1 | `STOP-NEXUS.ps1` i `C:\NinjaNexusPOC` |
| 2 | Verificer build 87: `shell\config\version.poc.json` eller Settings → build 87 |
| 3 | Start Shell safe-poc, Settings → Updates → Check → Download → Installér |
| 4 | Shell lukker; `apply-pending-update.ps1` kører; tjek `logs\apply-result.json` = `completed` |
| 5 | Shell genstarter build 88 |

**Status:** PENDING — fuld laptop 87→88 ikke kørt i denne session (undgår at overskrive aktiv POC uden bruger-bekræftelse). Kode + tests PASS.

## Fremtid (ikke i scope)

- Fuld atomisk swap via junction `current` → `versions\{build}` (dokumenteret som næste skridt hvis in-place copy stadig fejler på langsomme diske).
