|
| 1 | +# Portage `main` → `feat/ai-edition` (juillet 2026) |
| 2 | + |
| 3 | +## Contexte |
| 4 | + |
| 5 | +`feat/ai-edition` diverge lourdement de `main` : **273 commits** d'un côté |
| 6 | +(compositeur natif poc-d3d, éditeur V4, timeline clip-anchored, export v2 |
| 7 | +multi-asset), **24 commits** de l'autre depuis le point de divergence |
| 8 | +(`68d3a685`, 15 juil. 2026). Là où `main` a corrigé l'éditeur navigateur |
| 9 | +legacy, `ai-edition` l'a **supprimé** — donc la plupart des correctifs `main` |
| 10 | +patchent du code mort ici. |
| 11 | + |
| 12 | +Stratégie retenue (au lieu d'un rebase brut des 273 commits) : |
| 13 | + |
| 14 | +1. **Cherry-pick** ce qui est archi-compatible. |
| 15 | +2. **Portage fonctionnel + revalidation** là où le même fichier a divergé mais |
| 16 | + reste vivant (export audio). |
| 17 | +3. **Recensement** des features liées au code supprimé → décider, par feature, |
| 18 | + si c'est déjà couvert en V4/natif, obsolète, ou à ré-implémenter. |
| 19 | + |
| 20 | +Un rebase littéral aurait rejoué `ai-edition` par-dessus ces 24 commits ; le |
| 21 | +contenu **fonctionnel** net qu'il aurait apporté est exactement les 11 commits |
| 22 | +ci-dessous (les 13 autres = bumps de version, workflow Discord, docs RC du |
| 23 | +legacy, et patches de l'éditeur supprimé — no-ops ou bruit). |
| 24 | + |
| 25 | +## 1. Cherry-pické (archi-compatible) — 11 commits |
| 26 | + |
| 27 | +| Commit | Feature | Résolution de conflit | |
| 28 | +|---|---|---| |
| 29 | +| `e129e408`, `49338719` | Infra release (pin dispatch, nommage branche RC) | clean (workflows non touchés par ai-edition) | |
| 30 | +| `d75cb57e` | WGC : ne plus tenir le mutex pendant `WriteSample` (#115) | **fusion** : timing webcam horloge-réelle CFR d'ai-edition **+** split capture-sous-mutex / submit-hors-mutex de `main`. `writeBgraFrame`→`captureBgraSample`. | |
| 31 | +| `21828bfd` | WGC : dims capture arrondies au pair | clean | |
| 32 | +| `90d9bf2f` | WGC : garde-fou anti-hang (`cv.wait`→`wait_for(100ms)`) | clean | |
| 33 | +| `cd088673` | HUD : le drag ne dérive plus du curseur | garde `hudAllocatedSizeRef` d'ai-edition **+** ajoute `isDraggingHudRef` | |
| 34 | +| `c6cd9436` | Test de régression drag HUD | garde `shrink-0` d'ai-edition **+** `data-testid` | |
| 35 | +| `42ab20dc` | Packaging Microsoft Store (MSIX/appx) | `build:win:store` reflète les étapes natives d'ai-edition (compositor + ffmpeg), sinon le build Store livrerait sans compositeur natif | |
| 36 | +| `282a617e` | Désactiver Vulkan sur Wayland (import DMA-BUF PipeWire) | clean — ai-edition **a** le bloc Wayland ciblé | |
| 37 | + |
| 38 | +## 2. Portage fonctionnel — mixage audio multi-piste (`1c01a873`, `f65de972`) |
| 39 | + |
| 40 | +**Bug (macOS)** : les captures natives macOS écrivent système + micro en 2 pistes |
| 41 | +AAC ; l'exporteur ne prenait que la 1re (souvent silencieuse) → export muet |
| 42 | +malgré un micro enregistré. |
| 43 | + |
| 44 | +**Pourquoi c'était le point sensible** : `audioEncoder.ts` est **vivant** sur |
| 45 | +ai-edition (l'export v2 `documentExporter`/`renderPlan`/`audioConcatPlan` |
| 46 | +l'appelle encore) et `audioConcatPlan` est couplé à sa comptabilité |
| 47 | +d'échantillons. |
| 48 | + |
| 49 | +**Ce qui a rendu l'intégration safe** : le changement d'ai-edition sur |
| 50 | +`audioEncoder.ts` est **purement additif** (+72/-0 : une nouvelle méthode |
| 51 | +`encodePcmToMuxer` pour la boucle segment v2) et **disjoint** du chemin de |
| 52 | +décodage que `main` réécrit → `audioEncoder.ts` s'est appliqué **clean**. Le |
| 53 | +mixage est réellement câblé : `streamingDecoder.loadMetadata()` renvoie |
| 54 | +`audioStreamCount` → passé au blocker source-copy qui refuse le multi-piste → |
| 55 | +le chemin plein mixe via `mixPlanarSources`. Pas inerte. |
| 56 | + |
| 57 | +Conflits résolus à la main dans `videoExporter.ts` / `.test.ts` en **conservant |
| 58 | +les deux** familles de blockers (frame-rate/codec d'ai-edition + multi-piste |
| 59 | +`#108` de `main`), `SourceCopyVideoInfo` enrichi de `audioStreamCount?`. |
| 60 | + |
| 61 | +**Revalidation** : `tsc` clean, **118/118 tests** (les tests de mixage de `main` |
| 62 | ++ les 4 tests d'export v2 d'ai-edition passent ensemble), biome clean. Le test |
| 63 | +navigateur `audioMixExport.browser.test.ts` (fixture dual-audio) n'a pas été |
| 64 | +exécuté ici (nécessite `npm run test:browser:install`) — à lancer via |
| 65 | +`npm run test:browser`. |
| 66 | + |
| 67 | +## 3. Recensement des features divergentes (code legacy supprimé) |
| 68 | + |
| 69 | +| Feature `main` | Verdict | Détail | |
| 70 | +|---|---|---| |
| 71 | +| `e4ef4768` perf playhead découplé du re-render ancêtre (#111) | ✅ **Déjà couvert** | `V4Timeline` a `PlayheadOverlay` memoïsé + `rafSeekRef`/`pendingSeekTimeRef` (coalescing rAF) + `playheadElRef` (DOM direct). Archi découplée équivalente/supérieure. | |
| 72 | +| `574b685c` ref écrit en render (anti-pattern React, #120) | ✅ **Déjà couvert** | `PlayheadOverlay` V4 est pur/memoïsé, `pct` en prop, aucune écriture de ref en render. | |
| 73 | +| `9844c782` zoom auto suit le curseur (`focusMode:"auto"`, #72) | ✅ **Déjà couvert** | `src/lib/ai-edition/store/zoomSuggestions.ts` met déjà `focusMode:"auto"` par défaut sur les zooms auto-suggérés (+ `zoomSuggestions.test.ts`). Exactement le fix #72. | |
| 74 | +| `5cfdeb3c`/`0884032f` #2 durée capée après reload | ✅ **Déjà couvert** | ai-edition remplace la durée provisoire (placeholder 60s) par la vraie durée média au probe : `applyProbedDuration.ts`, gardes `useTimeline.ts`, commit `49602a14`. La race legacy (`resetDurationResolution` clobbered) n'existe pas dans ce modèle. | |
| 75 | +| `5cfdeb3c`/`0884032f` #1 annotation texte vide + placeholder | ⚠️ **Décision produit** | ai-edition crée le texte avec un défaut *baked* `content:"New annotation"` (`useTimeline.ts:259`), pas vide+placeholder. Pas le bug legacy exact (« Enter text… »), mais même friction UX possible. À trancher : garder « New annotation » (défaut sensé) ou aligner sur vide+placeholder. | |
| 76 | +| Docs RC e2e (`1e572232`, `dacea226`, `7013b8bd`) | ⛔ **Obsolète** | `rc-e2e-checklist.md` supprimé sur ai-edition ; écrit contre l'UI de l'éditeur legacy. | |
| 77 | +| Bumps de version + workflow Discord | ⛔ **Skip** | Chore de release ; ai-edition gère son propre versioning. | |
| 78 | + |
| 79 | +## Seule décision ouverte |
| 80 | + |
| 81 | +Le défaut de contenu des annotations texte (⚠️ ci-dessus) — choix UX à valider. |
| 82 | +Tout le reste des features divergentes est déjà ré-implémenté nativement dans |
| 83 | +ai-edition. |
| 84 | + |
| 85 | +## Repères techniques |
| 86 | + |
| 87 | +- Ref de sécurité avant cherry-picks : tag `rebase-safety-before-cherrypick`. |
| 88 | +- `node_modules` du worktree = junction vers le repo principal (pour tsc/vitest). |
0 commit comments