Skip to content

V0.1 : bascule Windows validée (Lot W) + correctifs de plateforme sur les 4 suites - #527

Merged
donovan-dev-web merged 20 commits into
developfrom
feature/windows-validation-v01
Oct 8, 2026
Merged

donovan-dev-web merged 20 commits into
developfrom
feature/windows-validation-v01

Conversation

@donovan-dev-web

Copy link
Copy Markdown
Owner

Objet

Fusionne la V0.1 validée hors PRISM : la bascule Windows (étapes 4 et 5 de ROADMAP-V01.md), les correctifs de plateforme découverts en rejouant toutes les suites sous Windows, et la documentation associée. Aucune release ni tag dans cette PR (demande explicite).

Contenu (14 commits, 4cc218e..1fa6783)

Lot W — validations Windows + correctifs natifs

  • launcher/Launcher.App/app.manifest : manifestVersion="1.0" ajouté, manifestType retiré — sans cela livex-launcher.exe ne démarrait jamais (SideBySide 11/64) et aucun test ne lançait l'apphost.
  • SessionFileJournal : lecture partagée (FileShare.ReadWrite) — l'export des journaux et le panneau « journaux récents » échouaient en violation de partage sous Windows.
  • ProcessTreeKiller : le Job Object unique était terminé puis fermé à chaque arrêt forcé (tuerait les autres composants vivants et perdait le garde-fou anti-orphelin) → assignation au démarrage + kill borné à l'arbre.
  • Bancs : sonde Windows (connect TCP lent vers un port sans écoute), manifeste executable.windows, compositions/journaux libérés.

Correctifs de plateforme (nouveaux dans cette PR, invisibles sur Linux)

  • SYNE — verrou mortel : ObservabilityServer fermait le socket pendant qu'une ReceiveAsync était en vol ; sur Windows (WebSocketBase.TakeLocks / Monitor.Enter) les deux fils s'attendaient sans fin → 2 tests sur 4 de la classe WebSocket pétaient, testhost bloqué à l'infini après les assertions. Fermeture ordonnée (CTS par session → annuler la réception → attendre DrainAsync bornée → fermer). Classe rejouée 10/10 (≈ 2/10 avant).
  • ECHOS — 43 lectures/écritures sans encoding= lisaient les fixtures UTF-8 en ANSI cp1252 (6 échecs) ; contrats d'adaptateur POSIX rendus portables (bit d'exécution conditionné, echos-launcher.cmd lancé via COMSPEC /c, nettoyage d'arbre).
  • syne-mock — SIGTERM/SIGINT non livrables sous Windows (≈ TerminateProcess) : 2 tests de fermeture gracieuse ajournés avec motif (le chemin POSIX reste couvert par Linux) ; bit d'exécution conditionné.
  • Launcher — 2 tests de non-régression ajoutés : AppHostLaunchTests (lance réellement l'apphost publié, 8 contrôles de --check) et SessionFileJournalTests (lecture partagée pendant l'écriture + échec prouvé d'un lecteur naïf).

Preuves locales (Windows 11 10.0.26200, branche courante)

Suite Résultat
Launcher build --warnaserror 0 avertissement / 0 erreur
Launcher (162 unit + 17 intégration + 32 E2E) 211/211, 0 orphelin
SYNE (79 Console + 514 Core) 593/593, classe WebSocket 10/10
ECHOS flake8 + pytest -q 0, + intégrations U8 et mock → ECHOS
syne-mock npm test 44 pass / 0 fail / 2 skip
validate_manifests.py + heuristique secrets OK

L'E2E Launcher a été exécuté avec LIVEX_SYNE_PUBLISHED_ROOT, exactement comme le fait le job CI.

À constater en CI

Les 4 jobs windows-latest (syne-dotnet-windows, echos-python-windows, syne-mock-node-windows, launcher-dotnet-windows) ne se sont jamais exécutés : le workflow ne se déclenche que sur une PR vers develop/main ou un push sur ces branches. Cette PR les déclenche pour la première fois, avec les jobs Linux correspondants.

Périmètre

Hors PRISM, sans release ni tag — la définition de « LIVEX V0.1 livrée » (ROADMAP-V01.md §7) reste à boucler après constat CI.

donovan-dev-web and others added 20 commits October 8, 2026 11:23
POST /api/control/reset relançait le run sur ConfigLoader.LoadDefaults()
au lieu du profil de référence : une campagne pilotée longue par reset
pouvait redémarrer sur un autre profil que prepare (mesuré le 30/09 :
extinction t300 par reset vs survie 1200/1200 par prepare).

PrepareCoreAsync applique désormais SimulationProfiles.ReferenceJson()
quand aucune surcouche n'est fournie : le chemin HTTP ne dépend plus des
défauts intégrés (défaut 1 du RAPPORT-ELEMENTS-OUVERTS §5.1, doctrine
ADR-016). Propriété PreparedOptions exposée pour l'assertion.

Test de non-régression : reset sans config == prepare sans config ==
profil de référence. SYNE vert : 590 tests (514 Core + 76 Console),
0 échec, oracles inchangés, engineVersion conservée.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
Réaligne les documents racine et composants sur l'état réel du dépôt
(commit a51c95d) :

- README : version SYNE 0.13.0 -> 0.15.0 (badge, tableau, engineVersion).
- Livex-status : SYNE publie son manifeste et son contrat (J2A accepté),
  ECHOS est headless avec /analysis/* (J2B accepté) — plus aucune
  prétention à une interface ECHOS ni à l'absence de manifeste SYNE.
- Références mortes : docs/PLAN-CORRECTIFS-CAMPAGNE-RUNS.md (absent de
  l'historique git) remplacé par RAPPORT-ELEMENTS-OUVERTS §5.1 dans ses 6
  citants ; docs/docs_prototype/ (supprimé par PR #502) : tombstones
  ARCHITECTURE, ADR-002 PRISM, changelogs, docs/README.
- ROADMAP : ISSUES/KANBAN racine -> docs/governance/ ; U8 ne référence
  plus le milestone ph8 ECHOS retiré par ADR-007.
- CHANGELOG : section Removed complétée (retrait echos-ui + shell Electron
  par ADR-007), entrées Electron du 23/09 marquées surclassées.
- docs-echos : écrans web [OUVERT] closes par ADR-007 (ISSUES + ROADMAP),
  milestone ph8 marqué RETRAITÉ, en-têtes datés à jour.

Critère : grep de référence cassée = 0 sur les chemins listés (hors
tombstones annotés et snapshot Monographie).

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
Arbitrage A1 de ROADMAP-V01.md : Docker est retiré définitivement du
projet — l'installation et l'orchestration sont portées par le Launcher
(artefacts natifs, --check), le jalon T6 de la Monographie n'a plus lieu
d'être pour LIVEX.

- ROADMAP.md : T6 barré + motif du retrait.
- CI_CD.md : principe « Conteneurisation », étape docker du tableau de
  validation, étapes 2/3 de la release (GHCR) et jalon « compose < 30 s »
  retirés ; secret GHCR remplacé.
- ARCHITECTURE.md : lignes Conteneurisation/GHCR et compose.yml du
  dépôt retirées.
- docs/docs-syne/ARCHITECTURE.md : Dockerfile « à venir » retiré de
  l'arborescence et des points ouverts.
- docs/docs-launcher/OBSERVABILITY.md : piste docker-compose retirée
  (la mention négative §26 est conservée).
- release.yml : TODO de publication d'images supprimé (YAML revalidé).
- CHANGELOG : entrée Removed + réécriture de la ligne Unreleased.
- ROADMAP-V01.md : fichier ajouté au suivi, étapes 1/3/10 cochées avec
  leurs preuves (ef878f2, 0c4d223, ce commit).

Critère : grep docker sur les sources = annotations/négatifs/historique
uniquement ; snapshot Monographie et copies bin/ exclus.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
…-V01)

Procédure rejouée sur un environnement vierge et preuves vives
consignées dans INTEGRATION_CONTRACT.md §10.3 :

- prérequis : Python >= 3.11 (testé 3.14.4) ; piège documenté du
  paquet python3-venv absent -> contournement --without-pip + get-pip.py ;
  venv ~212 Mo (pyarrow) ; uv non requis.
- pytest echos/tests vert dans le venv.
- /health/ready 200 après migrations (< 30 s), base par défaut
  <LIVEX_DATA>/echos/analytics.sqlite hors work-dir (503 explicite si
  inutilisable).
- GET /api/runs 200 ; POST /analysis/run|experiment|report 422 à erreur
  de schéma structurée (aucun 500, aucune interface — ADR-007).
- /control/shutdown sans jeton 401 (auth) ; SIGTERM sans orphelin.
- OS supportés : Linux x86-64 seul (manifeste executable.linux) ;
  Windows = étape 5.

Case J2B de launcher/ROADMAP-V1.md cochée (la porte J3 reste ouverte) et
étape 9 de ROADMAP-V01.md cochée avec preuves.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
…P-V01)

POST /api/control/reset accepte une surcouche config (JSON partiel, meme
regle que start/prepare ; contrat API_CONTRACTS.md elargi a
{ seed?, config?, maxTicks? }) — indispensable pour enchainer des runs de
populations differentes par reset, la population n'etant plus portee que
par prepare.

Preuve scientifique : scripts/reset-campaign.py rejoue la campagne
ADR-016 (50 et 100 agents x 2500 ticks x 3 seeds) en une session --serve
enchainee start -> reset x5, flux WS segmente par runId (2500 snapshots
et 125 000/250 000 decisions par run) :

  50/12345 -0,0014 | 50/424242 -0,0037 | 50/999 -0,0027
  100/12345 -0,0018 | 100/424242 -0,0028 | 100/999 -0,0025

6/6 : 0 extinction, 0 mort, |pente| <= 0,0037 < 0,005/tick, population =
initiale — pentes identiques a celles du chemin prepare. Defaut 1 du
RAPPORT-ELEMENTS-OUVERTS ferme (nouveau paragraphe 5.1 bis).

Tests : suite SYNE verte (514 Core + 78 Console, 0 echec, relances
apres un flaky non reproductible sous charge campagne) ;
ControlServerWireTests.Reset_WithConfig_BuildsTheNewRunWithThatSurcouche
et Reset_WithNonObjectConfig_IsRejected ajoutes.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
Machine de performance V0.1 figee (arbitrage A3) : i7-8750H 6c/12t,
14 Gio, Ubuntu x86-64, .NET 10.0.401. Deux passes --benchmark le
08/10/2026, protocol identique au ph9 (300 ticks, monde 500x500,
seeds 12345/999/7) : checksums FNV-1a identiques, debits a +/-3 %.

Premieres mesures honnaises a charge complete — les chiffres ph9
(>=1187 a N=500, >=505 a N=1000) mesuraient des populations mourantes
en cours de run :

  50   -> 1354-2257 t/s  (cible 30)  OK ~45x
  500  -> 42,8-53,9 t/s  (cible 20)  OK ~2,1x
  1000 -> 5,9-6,5 t/s    (cible 10)  ECART ~1,7x

Part de computation 92-99,8 % (seuil 30 % tenu partout). Goulot :
perception, puis evenements (~15 ms/tick a N=1000). Ecart documente
comme chantier d'optimisation hors blocage V0.1 (scenarios reels a
<= 100 agents). Ligne V5 du RAPPORT cloturee, PERFORMANCE.md ouverts
mis a jour.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
… de ROADMAP-V01)

- Livex-status.md réédité au 08/10 : inventaire 632 fichiers (tokei 13.0.0),
  suites 1 205 tests verts / 13 ignorés / 0 échec, couvertures ECHOS 91,57 %
  et SYNE 85,86 % (Core 88,68 %, Console 73,49 %), statuts J2A/J2B acceptés
  et installation ECHOS Linux validée intégrés, limites recalées sur les
  étapes restantes de ROADMAP-V01 (4, 5, 6, 8).
- G5 tranché « livré côté Launcher mais non franchi » : scénario vert contre
  un ECHOS réel non encore prouvé (stubs seulement) — docs/docs-launcher/
  ROADMAP.md réécrit, raison obsolète de launcher/README.md corrigée.
- J3 ramenée à ses seuls items ouverts dans launcher/ROADMAP-V1.md (reprise
  sans rejouer un run terminé cochée, preuves CampaignRunnerTests).
- RAPPORT-ELEMENTS-OUVERTS.md : V3/V4/V6 restantes (V5 déjà rayée), 13 tests
  ignorés et long-run A2 reflétés.
- docs/docs-installer/ (11 fichiers) versé au dépôt comme prévu par
  ROADMAP-V01 ; étape 11 cochée.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
…V01)

- J3RealComponentsEndToEndTests : campagne contre SYNE publié + ECHOS réel
  (installation hermétique, base d'analyse dédiée) — interruption après le
  run 1, reprise sans rejouer RUN-0001, analyses via l'API réelle, rapport
  archivé octet à octet, empreintes et frontières du paquet vérifiées ;
  second test : ECHOS arrêté entre deux runs, données SYNE intactes,
  absence de rapport consignée.
- IAnalysisService.AnalysisComponentVersion : la version d'ECHOS qui a
  produit le rapport est consignée dans le manifeste du paquet.
- PublishedSyneInstaller extrait et partagé entre les deux bancs.
- CI Linux : le job Launcher crée le venv ECHOS pour exécuter les tests J3.
- Cases J3 cochées avec preuves (launcher/ROADMAP-V1.md), étape 4 partie
  Linux cochée ; critère CI Windows reste à l'étape 5.

Suite Launcher : 208 tests (162 unit + 15 intégration + 31 E2E), 0 échec.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
…r (etape 6 de ROADMAP-V01)

Correctif : SendTextAsync ne filtrait pas le TimeoutException de
WaitAsync(SendTimeout) — un client WS lent n'etait jamais retire et chaque
trame rebloquait 2 s, figeant le moteur a 1,5 t/s au lieu de ~77 avec le
consommateur gele. TimeoutException ajoutee au catch -> RemoveClient, test de
non-regression ObservabilityServer_ClientThatStopsReading_IsRemovedAndBroadcastKeepsWorking.

Validation V3 : outillage rejouable scripts/v3-campaign.py (SYNE --serve +
worker echos.dev_ingest reels, 3 phases x 2 passes 100 et 50 t/s), reprise du
worker apres mort violente automatee (test U8, 3/3 : 0,01 s / 0,55-0,60 s),
parcours UI couverts par les 66 tests ViewModel. Rapport complet
RAPPORT-ELEMENTS-OUVERTS.md §5.3, artefacts docs/campaign-runs/v3/ (hors git),
etape 6 bouclée dans ROADMAP-V01.md.

Verifs : SYNE 593/593, ECHOS suite complete 0 echec (+ integree
LIVEX_SYNE_E2E=1), Launcher 162 unit + 15 integration + 31 E2E, 0 echec.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
…CI windows-latest (etape 5 de ROADMAP-V01)

Manifestes : executable.windows sur les trois composants — SYNE vers la
publication win-x64 (.../win-x64/publish/Simulation.Console.exe, CI publie avec
-r win-x64), ECHOS vers le nouveau echos-launcher.cmd (venv prioritaire, python
en repli), syne-mock vers src/cli.js. validate_manifests.py impose la forme
"path" ou les deux cles linux + windows.

Portabilite Launcher : ProcessManager execute les .cmd via cmd.exe /c
(CreateProcess ne lance que des .exe) ; PublishedSyneInstaller lit la cle de la
plateforme courante ; bancs J3 et EarlyExit multi-OS (venv .venv\Scripts, copie
des deux lanceurs, junctions Windows, exit-now.cmd).

CI : 4 jobs windows-latest — syne-dotnet-windows, echos-python-windows,
syne-mock-node-windows, launcher-dotnet-windows (unit + integration + E2E avec
SYNE publie et ECHOS reel).

Verifies sur Linux : validate_manifests OK, YAML OK, build --warnaserror vert,
Launcher 162 + 15 + 31 = 208 tests 0 echec, contrat ECHOS vert, flake8 OK.
Constats windows-latest et Lot W (machine Windows) restent a faire (§8).

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
… des statuts

Decision : aucune release, publication ni tag tant que toute la validation
n'est pas complete. ROADMAP-V01 : section etape 8 supprimee, ligne P2
requalifiee, diagramme de sequence et consignes de bascule §8 ajustes (on ne
coche plus que les etapes 5 et 4 depuis la machine Windows).

Livex-status aligne sur les realisations du jour : J3 (etape 4) et V3
(etape 6) valides, etape 5 Lot L committé — il ne reste que la validation
Windows (Lot W + constat CI windows-latest) ; la publication multiplateforme
disparait du §7 et de la conclusion.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
Nouveau NAMING_CONVENTIONS.md (identifiants en anglais, commentaires en
francais, regles par langage C#, Python, JS, C++/Unreal, structure des
commentaires) reference par CONTRIBUTING.md (dependance + checklist PR) et
docs/README.md. Ajout de PLAN-REFONTE-DOCUMENTATION.md : refonte de la
documentation fondee sur le code reellement implemente, deux supports
independants (doc technique / monographie), verite par le code.

Lot de documentation saisi pendant le travail des etapes 4 a 6, committi pour
rendre le depot coherent avant bascule sur la machine Windows.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
…ifs (étapes 4 et 5 de ROADMAP-V01)

Machine DESKTOP-MQQ150J (Windows 11 10.0.26200, dotnet 10.0.401 / SDK .NET
10.0.12, Node 25.9.0, Python 3.12.10, dépôt D:\LIVEX, branche
feature/windows-validation-v01).

Résultats : build --warnaserror 0 avertissement, Launcher 162 unit + 15
intégration + 31 E2E = 208 tests, 0 échec, aucun processus orphelin après les
trois suites. E2E contre SYNE publié win-x64 + ECHOS réel (venv .venv\Scripts,
echos-launcher.cmd) : campagne → interruption → reprise → analyse → paquet
.livexp scellé et relu. --check : 8 contrôles, code 0 avec SYNE installé via
LIVEX_HOME, code 2 sans composant. Tests filtrés Arret|Manifeste|Sonde|
Injoignable|Detect|Installation : 24/24.

Trois défauts Windows produits corrigés :
- app.manifest sans manifestVersion (et portant manifestType, attribut non
  autorisé) : livex-launcher.exe ne démarrait jamais (SideBySide 11 puis 64,
  « configuration côté-à-côté incorrecte »), y compris sous PowerShell — aucun
  test ne lance l'apphost, le défaut était donc invisible en CI.
- Journal de session lu sous verrou : export en erreur et panneau « journaux
  récents » jamais rafraîchi sur Windows (File.ReadAllText/ReadLines sur un
  fichier encore ouvert en écriture) → SessionFileJournal.ReadSharedLines /
  ReadSharedTextAsync (FileShare.ReadWrite), réutilisé par le banc J3.
- Job Object unique terminé puis fermé à chaque arrêt forcé : tuait aussi les
  autres composants vivants et retirait KILL_ON_JOB_CLOSE → assignation au
  démarrage (MakeOwnProcessGroup) et arrêt forcé borné à l'arbre du composant
  (Kill(entireProcessTree: true)).

Bancs rendus valides sous Windows : WaitForHealthyAsync intercepte aussi
l'expiration de requête (un port sans écoute ne rend ECONNREFUSED qu'après
~2,05 s sous Windows), manifeste executable.windows du banc
CampaignEndToEndTests, libération des compositions et du journal
PublishedSyneHarness, horizon de sonde porté au-delà du délai de sondage
(assertions inchangées).

Docs : ROADMAP-V01 (étapes 4 et 5 cochées avec preuves, §8, points ouverts),
CHANGELOG, Livex-status, INTEGRATION_CONTRACT (OS supportés).

Reste le constat CI windows-latest : aucun run GitHub Actions pour la branche
(total_count = 0) — push explicite requis (arbitrage A4).

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
… avant PR

Rejoue de TOUTES les suites sous Windows avant la PR : trois défauts
invisibles sur Linux, plus les deux tests de non-régression du Lot W.

- SYNE : ObservabilityServer fermait le socket pendant qu'une ReceiveAsync
  était en vol — sur Windows (WebSocketBase.TakeLocks / Monitor.Enter) les
  deux fils s'attendaient sans fin : 2 tests sur 4 de la classe WebSocket
  pétaient et le testhost restait bloqué à l'infini, après les assertions,
  au niveau du await using. Fermeture ordonnée désormais : CTS par session →
  annuler la réception → attendre DrainAsync (bornée 2 s) → fermer ;
  RemoveClient ne ferme plus pendant qu'une réception tourne. Preuve :
  classe rejouée 10/10 (≈2/10 avant), SYNE 593 tests verts, warnaserror 0/0.
- ECHOS : 43 lectures/écritures sans encoding= lisaient les fixtures UTF-8
  avec l'ANSI cp1252 (6 échecs) ; contrats d'adaptateur POSIX rendus
  portables — bit d'exécution conditionné à la plateforme, echos-launcher.cmd
  lancé via COMSPEC /c avec nettoyage d'arbre (WinError 193 avant).
- syne-mock : SIGTERM/SIGINT non livrables sous Windows (child.kill vaut
  TerminateProcess) → 2 tests de fermeture gracieuse ajournés avec motif ;
  même garde plateforme sur le bit d'exécution de src/cli.js.
- Launcher : AppHostLaunchTests lance réellement l'apphost publié (le défaut
  de manifeste restait invisible car aucune suite ne lançait l'exécutable) et
  SessionFileJournalTests relit le journal pendant l'écriture — 211 tests.

Preuves locales : Launcher 162+17+32 = 211, SYNE 79+514 = 593, ECHOS
flake8 0 + pytest 0 échec (+ intégrations U8 et mock→ECHOS), syne-mock
44 pass / 0 fail / 2 skip, manifests validés, 0 processus orphelin.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
… dynamique

Les 4 jobs windows-latest ne s'étaient JAMAIS exécutés (le workflow ne se
déclenche que sur PR vers develop/main) : deux défauts de CI sont donc
apparus au premier passage de la PR #527.

- syne-mock (Windows) : `npm test` s'exécute sous PowerShell, qui n'étend
  pas les glob — `node --test test/*.test.js` cherchait littéralement le
  fichier `test\*.test.js` et sortait en code 1. `node --test` sans argument
  utilise la recherche récursive par défaut du test runner (46 tests, mêmes
  résultats sous bash et PowerShell).
- Launcher (Linux) : le saut dynamique `SkipException.ForSkip` n'est pas
  converti en « ignoré » par xunit 2.9.3 + vstest — le banc de journal
  déclarait `$XunitDynamicSkip$…` en erreur. Saut posé à la découverte via
  `[WindowsOnlyFact]` (propriété `Skip` de l'attribut), mécanisme supporté
  par tous les runners : vérifié en inversant la condition → `ignorée(s): 1`,
  puis restauré → 17/17 sous Windows.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
…être fixe

Deux bancs vérifiaient la cadence 2 t/s en attendant 150 ms puis en exigeant
qu'aucun second tick ne soit passé (`Assert.Equal(1ul, Tick)` et
`Assert.InRange(Tick, 1, 1)`). La boucle est à délai fixe (tick → 500 ms →
tick) : le tick 2 ne pouvait être vu dans la fenêtre que si la reprise du fil
de test était tardive — exactement ce que fait un runner CI chargé. Sur
`windows-latest`, `PrepareStoresRequestedTickRateForTheFollowingRun` a donc
échoué (Expected 1, Actual 2) sans aucune anomalie de cadence, alors que le
banc avait passé au passage précédent.

L'invariant devient la durée mesurée du run, ancrée sur `start` : deux ticks
à 2 t/s exigent deux intervalles (≥ 900 ms), un run à la cadence par défaut
(≈ 200 ms) échoue. La latence ne peut plus fausser le constat, et la sœur
`UsesConfiguredTicksPerSecondAndKeepsRunIdentityInSnapshots` — même motif —
est couverte par le même contrôle. Les trames `[1, 2]` et le `TicksPerSecond`
du monde préparé restent vérifiés.

Vérifié : build `--warnaserror` 0/0, Simulation.Console.Tests 79/79.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
`windows-latest` échouait 1 fois sur 3 sur
`ScaleTargetsTests.FiveHundredEntities_StayAboveRegressionFloor`
(« Débit à 500 entités sous le plancher ») alors que le moteur n'avait pas
régressé : le job lançait `dotnet test` une seule fois, ce qui exécute
`Simulation.Core.Tests` et `Simulation.Console.Tests` dans deux testhost
simultanés — le banc de débit, purement CPU, mesurait sous contention.

- ci.yml : les deux assemblées SYNE passent en deux étapes séquentielles
  (même découpage que les jobs Launcher qui, eux, n'ont jamais flaké), Linux
  et Windows.
- ScaleTargetsTests : meilleur de 3 à meilleur de 5 essais (plusieurs fenêtres
  de charge) et message d'échec portant la valeur mesurée pour calibrer un
  plancher à partir d'une preuve plutôt que d'une hypothèse. Les planchers
  (120/30/20 t/s) et l'intention du test sont inchangés.
- PERFORMANCE.md §9.4 : convention mise à jour (5 essais, étapes séquentielles).

Vérifié : build `--warnaserror` 0/0, Simulation.Core.Tests 514/514.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
…erts Lot W

La branche a enfin été poussée et une PR ouverte vers develop : les 4 jobs
`windows-latest` — jamais exécutés depuis la création du workflow — ont tourné
aux côtés des 9 jobs Linux. **13/13 verts** (run 37843436072, commit 270e586)
après quatre passages ayant révélé et fait corriger quatre défauts de CI.

- ROADMAP-V01.md : critère de sortie étape 5 coché [x], sous-étape 4 de §8
  cochée avec le numéro de run, « Suite immédiate » remportée, points restés
  ouverts alignés (constat CI fait, défauts Windows couverts par des tests).
- CHANGELOG.md : note du Lot W remplacée par le constat CI et les 4 défauts.
- Livex-status.md : les trois mentions « reste à constater la CI » deviennent
  « fait le 08/10/2026 » ; le test de débit n'est plus signalé comme fragile
  (meilleur de 5 essais + étapes séquentielles en CI).

Aucune release ni tag (périmètre V0.1 hors PRISM, arbitrage A4).

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
L'archivage lisait stdout.log avec File.ReadAllBytes pendant que la pompe
détachée du moteur peut encore l'écrire : sous Windows, violation de partage.
Un run réussi devenait Échoué, puis la collecte d'échec levait à son tour et
l'exception remplaçait la cause réelle (échec de la reprise J3 en CI).

RunLogArchive.Collect (FileShare.ReadWrite) réutilisé par les deux chemins ;
un journal illisible est consigné dans logs-unreadable.txt avec sa cause au
lieu d'être fatal. 3 tests dont 2 Windows.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
@donovan-dev-web
donovan-dev-web merged commit 0c99c24 into develop Oct 8, 2026
13 checks passed
@donovan-dev-web
donovan-dev-web deleted the feature/windows-validation-v01 branch October 11, 2026 05:54
donovan-dev-web added a commit that referenced this pull request Oct 12, 2026
… les 4 suites (#527)

Étapes 4 et 5 de ROADMAP-V01 : validations Windows de bout en bout (apphost natif,
Job Object, journaux de session partagés, --check, E2E contre SYNE publié win-x64 et
ECHOS réel) ; suite Launcher 214 tests verts, build --warnaserror 0/0.

CI : 4 nouveaux jobs windows-latest, 13/13 verts (Linux + Windows). Cinq défauts
trouvés et corrigés au passage : glob shell non étendu par PowerShell, saut dynamique
xunit non converti en « ignoré », verrou mortel CloseAsync/ReceiveAsync du serveur
d'observabilité SYNE, plancher de débit mesuré sous contention entre assemblées de
tests, et archivage des journaux de run en violation de partage (RunLogArchive,
lecture FileShare.ReadWrite).

Docs : ROADMAP-V01, CHANGELOG, Livex-status alignés sur le constat CI.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant