Skip to content

Commit 8a99f0a

Browse files
committed
docs(engineering): record the main-to-ai-edition port decisions
1 parent ae6f33b commit 8a99f0a

1 file changed

Lines changed: 88 additions & 0 deletions

File tree

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
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

Comments
 (0)