Phase 0 / Hotfix / Scheduler livelock investigation#15
Merged
guysenpai merged 33 commits intoMay 24, 2026
Conversation
6 entrées intégrées suite à la review Claude.ai de la PR #15 (M0.2.1 — Scheduler livelock investigation) : - Workflow thermal-aware bench MBP M-series : `caffeinate -i` obligatoire pour boucles longues. - Workflow milestone hotfix à cause root inconnue : décomposition E1..En et tiers cumulatifs de validation. - Anti-hallucination E1 : vérifier symboles nommés dans brief par lecture directe code. - Pattern atomic packing pour racing snapshots `(a, b)`. - Pattern comptime layout guards cache-line. - Garde-fou interprétation baselines bench héritées (vérifier conformité au protocole opposable).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Brief
Implémente le hotfix M0.2.1 conformément à
briefs/M0.2.1-scheduler-livelock.md.Cause root
Race wave-lifecycle dans le scheduler ECS work-stealing (
src/core/jobs/scheduler.zig).Sous préemption entre la mise à jour de
last_generationpar un worker etsa lecture de
chunk_countà l'entrée depushShare, un worker pouvaitcontribuer 2
fetchSubà la wave G+1 au lieu d'1, produisant un underflowde
pending_count(u64::MAX) et un spin infini depublishWaveAndWait.Probabilité observée : ~30 % par pre-push complet, ~2.7 % par signal de
stress synthétique.
Fix appliqué
Packing atomique
(generation: u32, chunk_count: u32) → gen_and_n: std.atomic.Value(u64). Un load.acquire64-bit fournit un snapshotatomique de la paire par construction, fermant prouvablement la fenêtre
de race. Coût perf nul vs deux loads séparées (un load 64-bit aligné
coûte autant qu'un load 32-bit sur Apple Silicon et x86_64).
Belt-and-suspenders :
prev > 0au siège defetchSub(scheduler.zig:333)publishWaveAndWait(Debug + ReleaseSafe)gen_and_n↔pending_countValidation
test-stresstest-stresstest-stressaveccaffeinate -icaffeinate -iCumul : 330+ invocations sans hang vs ~2.7 % de reproduction synthétique
et ~30 % pre-push pré-fix observée pendant M0.2.
Non-régression bench (thermal-aware MBP M-series)
Protocole : 30 min idle initial, ≥ 15 min idle entre runs, 3 runs/session,
powermetrics --samplers thermal,cpu_power -i 100Nominal sur 100 % dessamples (265 samples cumulés sur les 6 runs).
Rapports archivés :
bench/reports/ecs_benchmark_S1_2026-05-23-thermal-aware.mdbench/reports/ecs_benchmark_C0.1_2026-05-23-thermal-aware.mdPoints à signaler en review
helpUntilDone(mentionné enhypothèse du brief) confirmé absent du code par lecture directe ;
ranking H1..H5 originel ajusté en conséquence avant E2.
B-E2bis-1, B-E3-1, E4 plan A/Option fix, review E5/E6/E7) — conformes
au protocole hotfix de diagnostic, non-symptomatiques d'un re-scope.
race, juste la déplaçait à 2 lignes de distance. Option 2 (atomic
packé) retenue pour fermeture prouvable par construction.
plafond ~2.7 % atteint après ajouts cumulés (sursubscription CPU,
forks de processes, fs I/O). Plan E7 cumulatif Tier 1 (200×
synthétique) + Tier 2 (30× pre-push) compense, gates statistiques
validés.
caffeinate -irequis pour toute boucle longue thermal-awaresur MBP — 3 faux positifs de hang observés lors de la première
tentative E7 Tier 1 sans caffeinate (sleep macOS). À acter dans
CLAUDE.md / engine-phase-0-criteria.md à la review.
Dettes résiduelles documentées
publishWaveAndWaitspin-yield sur
pending_countau lieu d'utiliser sleep/wake commeacté par le squash M0.1 (D-S1-3). À investiguer dans un milestone
ECS Phase 0.1+ dédié.
vs baseline M0.1 documentée à 14.2 ms (≈ 3.8× delta). À éclaircir :
changement de paramètres du bench, opportunité de re-baseline, ou
bug de mesure. Milestone Phase 0.1+ dédié.
pending_count. load(.acquire)dans la belt-and-suspenders depublishWaveAndWait.Correct mais redondant. À nettoyer dans un commit cleanup futur.
Checklist validation pré-PR
zig build,zig build test(Debug + ReleaseSafe),zig fmt --check,zig build lintvertsdocs(brief): close M0.2.1Closes M0.2.1.