# Debug & post-mortems

Ce fichier sert à capitaliser sur les problèmes rencontrés.

## À documenter

- bug pénible
- mauvaise compréhension
- fausse hypothèse
- solution finale

## Objectif

Ne plus jamais perdre du temps sur le même problème.

---

# Post‑mortems

## SQL Server qui crash dans un conteneur LXC Proxmox

### Contexte

NUC personnel sous Proxmox avec plusieurs services en conteneurs LXC.
Un conteneur SQL Server (Microsoft SQL Server Linux) ne démarrait plus.

### Symptômes

- `sqlcmd` impossible → timeout
- service `mssql-server` en boucle de restart
- logs contenant :

```
Operation not permitted
chmod: changing permissions of '/var/opt/mssql/log/...'
```

- crash + génération de core dump

### Cause probable

SQL Server utilise certaines opérations système qui sont mal supportées dans les conteneurs LXC (permissions, filesystem, capabilities).

Dans un environnement Proxmox LXC, cela peut casser après :

- une mise à jour
- un changement de permissions
- un changement de configuration du conteneur

### Conclusion

SQL Server **n'est pas un bon candidat pour un conteneur LXC Proxmox**.

### Décision architecturale

Pour un homelab ou un petit serveur :

- éviter SQL Server en LXC
- préférer :
  - PostgreSQL
  - MariaDB / MySQL

Si SQL Server est nécessaire :

- utiliser une **VM complète** plutôt qu'un conteneur.

### Règle à retenir

> Éviter les bases lourdes nécessitant des capabilities système avancées dans des conteneurs LXC.

---

## Suppression silencieuse due à deux éditions concurrentes sur le même fichier

### Contexte

Un même fichier a été modifié par deux mécanismes proches dans le temps :
édition en cours d’agent et passe outillée/linter/formatteur.

### Symptômes

- bloc de code disparu sans erreur explicite
- diff final incohérent avec l’intention de modification
- impression de “régression fantôme” après une édition pourtant correcte

### Cause probable

Deux processus ont réécrit le même fichier sans coordination, le second
écrasant silencieusement une partie du travail du premier.

### Correctif / règle à retenir

- éviter deux passes d’écriture concurrentes sur le même fichier
- relire le diff immédiatement après toute passe automatique
- privilégier une séquence stricte : édition, puis lint/format, puis vérification

---

## tsx + NestJS : injection par type cassée silencieusement

### Contexte

Projet `app-alexandrie`, Epic 3, le 10-03-2026.
Le backend NestJS tournait avec `tsx watch` dans un contexte ESM (`module: nodenext`), notamment pour rester compatible avec Prisma v7.

### Symptômes

- `TypeError: Cannot read properties of undefined (reading 'get')` dans le constructeur d’un service
- `ConfigService` injecté par type mais `undefined` au runtime
- `@Injectable()` et `ConfigModule` correctement configurés, sans erreur de compilation

### Cause probable

`tsx` repose sur esbuild pour transpiler TypeScript.
Dans ce contexte, `emitDecoratorMetadata` est ignoré même s’il est activé dans `tsconfig.json`.
NestJS ne peut donc plus résoudre correctement certaines injections par type, notamment `constructor(private readonly config: ConfigService)`.

### Correctif / règle à retenir

- ne pas supposer que `emitDecoratorMetadata` fonctionne avec `tsx`
- dans ce contexte, éviter l’injection par type de `ConfigService` pour les services d’infra
- lire explicitement les variables via `process.env`, après chargement amont de `ConfigModule.forRoot()`

Exemple :

```typescript
// AVANT
constructor(private readonly config: ConfigService) {
  const host = this.config.get('REDIS_HOST');
}

// APRES
constructor() {
  const host = process.env['REDIS_HOST'] ?? 'localhost';
}
```

### Alternative écartée

`nest start --watch` a été testé mais a introduit des conflits ESM/CJS dans ce contexte (`exports is not defined`).

---

## `export { fn }` ne constitue pas un import local — détecté uniquement au build

### Contexte

Projet `app-template-resto`, story 2-4, le 17-03-2026.
Dans `getPublicHomeData.ts`, la fonction `resolvePublicTenantSelection` avait été déplacée dans `src/server/tenant/resolvePublicTenant.ts` et re-exportée depuis l'ancien emplacement.

### Symptômes

- `Cannot find name 'resolvePublicTenantSelection'` au `next build` uniquement
- ESLint et `tsc` (hors build) ne signalaient rien
- La fonction était utilisée localement dans le même fichier qui la re-exportait

### Cause

```typescript
// getPublicHomeData.ts
export { resolvePublicTenantSelection } from "@/server/tenant/resolvePublicTenant";

// puis, plus bas dans le même fichier :
const result = resolvePublicTenantSelection(env); // ← NameError au build
```

Un re-export (`export { fn } from "..."`) ne crée pas de binding local dans le fichier. La fonction est exportée vers l'extérieur mais n'est pas disponible comme variable locale.

### Correctif / règle à retenir

Si une fonction est utilisée dans le même fichier qui la re-exporte, ajouter un `import` séparé en plus du `export` :

```typescript
import { resolvePublicTenantSelection } from "@/server/tenant/resolvePublicTenant";
export { resolvePublicTenantSelection }; // pour les appelants externes
```
