swayfx-mosaic/docs/design/STEP20C_COREC_V2_INTEGRATION_DECISION.md

33 KiB
Raw Blame History

SWAYFX_MOSAIC_STEP20C_REBUILD_FROM_GIT_COREC_OOM_GPU_NIGHT_SHIFT_V1

2026-10-15. Dossier expérimental de décision, distinct du ticket historique bloqué et du plan de provenance V2. Les contrats canoniques gardent leur autorité. Aucun résultat de ce dossier n'adopte une politique de production.

Disposition : PRIVATE_COREC_V2_NEEDS_TARGETED_EVIDENCE. Recommandation OOM : C_FURTHER_NATIVE_REVIEW. Availability production : UNDECIDED. Résultat global : PARTIALLY_ADVANCED.

STEP20A = DONE
STEP20B = EXPERIMENTAL
STEP20C = NEXT
STEP20D–G = PLANNED
PRODUCTION_MULTI_OUTPUT = NOT_YET_SUPPORTED
PRODUCTION_AUTHORIZED = FALSE

1. Provenance nouvelle et persistance Git

Le début du ticket était 339dda45bc81b953e2f0afadf28765149e3a1ba1, sur main propre. Le nouveau candidat s'appelle COREC_V2_REDERIVED. Il reconstruit des sources natives complètes depuis les objets Git survivants et les sources publiques épinglées. Les anciens arbres privés, binaires CORE/ CORE-C/G1, hooks et captures supprimés restent MISSING_NOT_RECOVERABLE ; aucune égalité avec leurs anciens SHA n'est affirmée. Leurs résultats restent HISTORICAL_REPORTED_ONLY. Les échecs et budgets du ticket précédent restent inchangés.

Élément Identité exacte Rôle
Mosaic parent cd550382b311efdbfe3ed892f4e1d281d852e754 Parent Git de reconstruction
Arbre parent Mosaic 6be2d6cada19bd84673c30dfc4fb900a48b87e86 Vérification des modes et octets
SceneFX 37ccd723bef49e6891156ffafce8f549f01446cc Source publique épinglée
Arbre parent SceneFX 685a78b94f9e44ee683e5fea93874557a9fed457 Vérification des modes et octets
SwayFX pristine fd71a6bdc061bd633b488ae7b83e8a6981d22f86 Contrôle indépendant, pas le checkout modifié
wlroots source d783533489e1f75d6886c2ab5c5960090ef268f8 Audit source, non modifié
wlroots partagé SHA256 7edca9a7d65855addda68e29ba5db94d57c803eb5fa7d0f86db3136b90ca9837 Fournisseur exact qualifié localement
Patch CORE SceneFX SHA256 6039799046d052bb4cf2b15fbeb132983d6e3c1a45ad63752a6a63e83b585627 Delta cumulatif privé
Patch CORE Mosaic SHA256 9eb6afac0be5c747fbf1a1ee5a33a633c193c4ebae0a36b17636abde7a64c879 Delta cumulatif privé

Le kit source-only conserve patches, assemblage, vérification, clients, tests, schémas, budgets et recettes. Il ne contient ni copie complète d'upstream, ni bibliothèque, ni binaire, capture, arbre de build ou socket. Ses suppléments OOM/GPU sont séparés du CORE fonctionnel et portent leurs propres manifests de parents et résultats.

Les commits source-only suivants étaient publiés normalement sur origin (Forgejo) puis github, avant les runs qui en dépendaient :

  • 1053ab2a47f8ff0ab5d52fb0cba92c5dba4ad531 : kit CORE reconstructible ;
  • c0a822a0799ef024727b4a51a7442b8626223a69 : fixtures headless revues ;
  • bf00b0b0ed3e20bfb7c68d2fbbe6553594f3167a : diagnostics OOM/G2 revus.

Le dernier kit compte 105 fichiers, environ 1,18 Mo. La reproduction depuis une archive Git vierge (results/git-next-kit-reproduction.json) vérifie les octets et modes des arbres CORE SceneFX/Mosaic 85/417 fichiers, OOM 86/417, GPU SceneFX 87 ; une reconstruction CORE indépendante avec fetch public avait déjà été acceptée. Cela prouve EXACT_FOR_NEW_TREE, sans garantir un binaire reproductible bit à bit. La recette de build décrit les prérequis et les limites.

La publication documentaire finale reste à sceller par le closeout final ; aucun SHA futur n'est inventé ici. Le contrôle système pré-final confirme les huit hashes protégés, le PID Sway quotidien 2325, son exécutable /usr/bin/sway et son startticks 2833 inchangés par lecture seule. Tous les PIDs privés vérifiés sont absents ; aucun /tmp/smx-* ne reste. Les huit premières entrées du ledger sont structurellement identiques aux reçus initiaux. À cette édition, bf00b0b0ed3e20bfb7c68d2fbbe6553594f3167a est la dernière publication vérifiée. Ce dossier ne prétend pas déjà publié sous son propre futur commit.

2. Contrat technique V2 et audit C

SwayFX garde l'autorité sur arbre, focus, caméra, transactions, scène, input et IPC ; Row 0 emprunte workspace->tiling. Le nouveau delta privé garde les popups root dans leur couche native globale, dérive leur clip de l'owner tiled CURRENT et laisse les descendants nested hériter. Le leaf réellement caché reçoit un clip vide ; les ancêtres CURRENT fullscreen sont parcourus ; les retours standard/floating/fullscreen retirent le clip supplémentaire. Aucune UX hide/dismiss/reposition ni promesse de click-through universel n'en découle.

Option C : la factory réserve le sidecar avant scene_tree_init et avant toute publication. L'échec libère l'arbre non publié et retourne NULL. Le setter n'alloue pas ; NULL désactive en conservant la réservation ; une boîte vide reste active et masque rendu/input. Les réservations inactives sont ignorées par get/render/hit ; destroy retire et libère une seule fois. Un root embedded non réservé est explicitement rejeté par abort, même avec NDEBUG. Ce rejet de précondition n'est pas le traitement OOM de la factory.

L'audit inspecte 294 références / 16 symboles, avec ownership, premiers usages, NULL, rollback et listeners. Les callers du compositor et les helpers wlroots épinglés sont couverts ; tinywl/examples non liés restent hors qualification. Les réparations expérimentales sont bornées à l'admission/back-pointer IME, refocus/rollback, premier usage nullable de dim-rect, admission image-capture XDG et destruction partielle output/workspace/view/seat. Aucun layout public de struct ni signature publique ne change. Les translations/intersections utilisent des bornes larges avant narrowing ; la conversion caméra vérifie finite/range avant conversion.

Mesures natives : arbre 128 octets, sidecar 64 octets pour chaque arbre de factory, y compris inactif et non Mosaic. Lookup linéaire ; overhead de l'allocateur et coût global/performance NOT MEASURED. Trois traces passives restent déclarées (SPIKE_CLIP, PROBE_POPUP_CLIP, PROBE_POPUP_HIDDEN_OWNER) ; leur neutralité temporelle est NOT_PROVEN. NULL et zéro actif peuvent produire la même ligne de log. SPIKE_DAMAGE et les hooks PI/OPT sont absents du CORE fonctionnel.

Les corps C exacts sont liés aux SHA complets et offsets de slices ; types natifs, signaux Wayland et régions Pixman sont réels. Les adapters de damage/ visibility/effects restent explicitement des adapters : ils ne prouvent pas le moteur natif. Normal C17, UBSan (dont float-cast/signed overflow/bounds), ASan+UBSan ont réussi dans le périmètre borné. Les dix mutants compilent tous et sont tous tués par un oracle exécuté. Les échecs de setup et la correction du harness root-return restent archivés ; aucun échec de compilation ne compte comme mutant tué. Le corpus OOM supplémentaire couvre 27 cas dans trois modes, six mutants causaux et neuf négatifs supplémentaires ; il étend le même harnais H1, sans campagne sanitizer H2 full-compositor.

Dix cores systemd précoces (2 261 704 octets sous gestion système hors LAB) et huit événements journal-only ont précédé le correctif de dumpability. Ils n'ont été ni supprimés ni manipulés avec sudo. RLIMIT_CORE seul était insuffisant avec le handler pipé. Le harnais final vérifie PR_SET_DUMPABLE=0 et PR_GET_DUMPABLE ; l'audit final des corpus n'observe pas de nouvelle entrée. Il serait faux d'affirmer zéro écriture hors LAB pour les premières exécutions.

3. Trois couples privés et staging

Couple SHA256 du compositor Build ID
CORE 91f48aae2675331e0a2c60ec2fedf983745c521c75232c704a6516a4140801fb d5d304533f2c8db9d738365e9bd7f2c96779ef8d
OOM 6067946bd79ad6fd8da7669ab9b0b3bacfd2638f5d3d8382002b9118db20d835 9bc3dc9055106b343c80a51ded111a382e98442d
GPU b2ba890908e385b0a8884e786b279bfb2e582eed38c7fcd0587b418326eca5bc b6a52111beabe3c2122e0142a802415d3c84f9a5

Chaque couple a sa revue ELF/build et son DESTDIR privé de cinq fichiers : binaire distinct et quatre notices sous /usr/share/licenses/swayfx-mosaic/. SceneFX est statique ; wlroots partagé est le fournisseur exact ci-dessus. Les revues vérifient symboles privés, layouts, archives, relocations, absence de SceneFX DT_NEEDED et absence de RPATH/RUNPATH. Les traces loader sont distinctes des mappings /proc observés au runtime. L'acceptation vaut pour ces octets, pas pour une future paire simplement proche en version.

Le premier build CORE rencontre un nouvel enum libinput sous Werror ; la recette privée utilise -Wno-error=switch, garde le warning et ne modifie pas le C. Le premier build GPU échoue sur la déclaration de realpath ; la configuration privée -Dc_args=-D_XOPEN_SOURCE=700 définit la macro _XOPEN_SOURCE=700 et résout ce problème, sans edit C. Ces tentatives restent dans leurs réservations de couples ; elles ne sont pas cachées par le succès ultérieur. Trois couples / trois stages consommés ; aucun package installé, aucune modification du vrai PKGBUILD ou du patch production. Notices : LEGAL_NOT_APPROVED ; makepkg/distribution ne sont pas qualifiés par ces stages.

4. Matrice native des 14 cellules prévues

P0/P1 utilisent le contrôle pristine qualifié séparément (SHA256 b7fa32116e3c42706b9b02da7df12f27e76d82dd253deb8bdec81519eed145f6). C1–C8 utilisent uniquement CORE ; O1/O2 uniquement OOM ; G2 uniquement GPU. Une réservation reste consommée après refus ou échec ; aucun retry.

Run Binaire Objet Statut scientifique Captures / cap réservé
P0 pristine Contrôle standard horizontal PARTIALLY_FEASIBLE 10 / 10
C1 CORE Horizontal, nested grabs, retours standard PARTIALLY_FEASIBLE 16 / 18
C2 CORE Vertical PARTIALLY_FEASIBLE 8 / 12
C3 CORE Scale fractionnaire PARTIALLY_FEASIBLE 9 / 12
C4 CORE R90 PARTIALLY_FEASIBLE 9 / 12
C5 CORE Owner caché, même chaîne, retour PARTIALLY_FEASIBLE 12 / 12
C6 CORE Configure retenu, timeout naturel, retour live PARTIALLY_FEASIBLE 10 / 12
C7 CORE Resize/migration dynamique INCONCLUSIVE 10 / 14
P1 pristine Non-leaf fullscreen et débordement réel PARTIALLY_FEASIBLE 10 / 10
C8 CORE Comparaison non-leaf fullscreen INCONCLUSIVE 0 / 12
O1 OOM Première réservation root-popup ciblée INCONCLUSIVE 6 / 8
G2 GPU Première acquisition A, arrêt strict INCONCLUSIVE 2 / 16
O2 OOM Deuxième réservation ciblée NOT_RUN — dépendance O1 fermée 0 / non réservé
R1 aucun Discriminant conditionnel NOT_RUN — non admis 0 / non réservé

Total réconcilié : 12 runs lancés une seule fois / 14 maximum ; 102 captures output / 180 ; somme des caps réservés 148 / 180. Les deux PNG source-marker générés pour C3/C4 ne sont pas des captures output. Le snapshot intermédiaire phase-status.json est désormais réconcilié à 12 runs / 102 captures. Son ancien état 8 runs / 84 captures est préservé dans results/resume-audit/phase-status.json.before et results/phase-status-before-closeout.json, sans modifier les anciens reçus. Maximum par run : 18 captures et 150 secondes ; build -j8 maximum. Une seule campagne sanitizer H1 sur deux autorisées ; pas de H2 full-compositor. L'espace restant dans un budget ne constitue pas une admission à rejouer une cellule consommée.

5. Mesures graphiques et refus conservés

P0 fournit le contrôle standard, avec serial/grab réels, popup root/nested et débordement standard. Les tests du nouveau CORE ont leurs propres chaînes wire, points visibles/interdits, captures et retours. La première revue native vérifie 28 paires wire/input et 30 fermetures pour P0/C1–C7. Les retours H2 finaux sont exacts dans les échantillons acceptés ; un H2 standard contenant encore des popups débordants ne doit pas être comparé à un baseline vide. Les contrôles pristine propres à scale et rotation sont NOT TESTED.

C2 conserve son ancien champ brut X0 NOT_EXERCISED ; l'annotation séparée confirme que l'oracle exécuté utilise l'axe Y à 600, avec A 505..675 et B 585..715. Aucun raw historique n'est réécrit. C3/C4 couvrent les cellules scale/R90 échantillonnées, sans qualification universelle de transformations. C5 garde les mêmes identités et grabs : origin owner -1456 entièrement cachée, puis retour -318 sans outside click ni dismissal provoqué.

C6 retient configure39 après ACK30, mesure la cible 636×513, observe le timeout natif 5000 ms avec une transaction waiting1, puis ACK39 tardif, retour live et fermeture normale. L'identité du buffer saved natif est NOT_PROVEN ; ces événements ne prouvent ni génération atomique ni lifetime GPU.

C7 reste INCONCLUSIVE : la fixture calcule un clamp attendu 800 après migration, mais le focus natif de la cellule 10 (bornes logiques 1280..1920, viewport 800) impose 1120. Le déplacement appelle réellement le refocus ; l'oracle l'omet. Les étapes resize antérieures sont mesurées ; pixels/input post-migration et retour arrière ne sont pas atteints. Aucun défaut CORE n'est établi par cette divergence. Préserver le raw et corriger prospectivement la fixture ne permettrait pas de requalifier ce run consommé.

P1 forme réellement un groupe non-leaf avec deux enfants de largeur 400, groupe fullscreen 800×600, A [-448,105,900,170] et B [-348,165,900,130]. Les captures whole-H2 mapped, A-only et baseline final sont vérifiées exactement. C8 laisse le peer sibling du workspace, hors du groupe qui ne contient que l'owner ; le guard refuse avant capture. La comparaison P1/C8 fullscreen est donc NOT_EXERCISED, même si P1 seul est informatif. Pas de promesse d'exemption fullscreen native qualifiée.

6. OOM : faits natifs et limite de l'oracle

O1 injecte le premier échec sidecar sur le root-popup ciblé par PID/nonce et rôle natif, sans épuiser la mémoire réelle. Les compteurs natifs mesurent matched=1 failures=1 successes=0 initialized=0 listeners=0 published=0 children=0, puis retour NULL. Le même compositor survit : snapshots et IPC ultérieurs, captures pré/post, boutons du voisin serial42/43. Whole-H2 pré/post est exact ; le chemin ne publie pas de scène partielle dans cet échantillon. Le disconnect no_memory n'est pas observé.

L'owner ferme A puis TOPLEVEL, sans B créé. L'oracle commun attend soit B/A/TOPLEVEL, soit TOPLEVEL seul et rejette cette séquence root-only. Les processus sortent pourtant tous à 0, sans rescue ; CLOSE_RECEIVED, EXIT error0 et SHM1/1 sont présents. Les deux captures finales prévues sont absentes. Scientific cleanup=false, runner 1, budget et statut INCONCLUSIVE restent immuables ; la fermeture mécanique correcte ne répare pas le verdict. Le terminal IPC rc1 pendant teardown, avec compositor rc0, décrit la fermeture de l'endpoint et ne prouve pas un bug de shutdown.

La fonction availability vérifie par code PID/exécutable/mappings après injection avant le snapshot ; son retour n'est pas archivé car la sauvegarde finale a été sautée. Les proc-maps conservés sont ceux du startup : ne pas les présenter comme archive post-injection complète. Survie native bornée observée ; disponibilité générale, damage complet et absence universelle de stale listeners NOT_PROVEN. O2 reste NOT_RUN, sa gate dépendant d'un O1 complet ; les injections unitaires de deuxième réservation ne remplacent pas O2 natif.

Choix Availability / fail-closed Coût et callers Preuve / décision
A abort Arrêt du process ; fail-closed par sa mort Allocation au setter ; callers inchangés Historique source ; recovery non prouvé
B bool + masque Recovery à décider ; masque fail-closed à qualifier Réservation par arbre clippé ; 11 setters/admission à traiter Harnais historique, pas nouvelle qualification native
C préallocation NULL avant publication ; survie O1 bornée observée Sidecar pour chaque factory, lookup linéaire ; audit create/rollback V2 natif partiel ; C_FURTHER_NATIVE_REVIEW

Cette recommandation technique ne choisit pas la politique production : COREC_V2_AVAILABILITY_POLICY=UNDECIDED.

7. G2 : observabilité partielle et arrêt conforme

Les nouveaux hooks et sources G2 sont revus séparément ; aucun hook G1 perdu n'est revendiqué. Le shader de calcul est inchangé à la revue source. La première acquisition A atteint point0, puis refuse strictement avec GLES_STATE_NOT_SUPPORTED : EGL client_version=2, tandis que GL_VERSION annonce OpenGL ES 3.2 Mesa 26.2.4-arch1.1. Le contrat figé exige les deux prédicats. Il n'est pas assoupli après observation. B et A-return ne sont pas armés, aucun retry, zéro fichier / zéro octet raw GPU ; seuls deux baselines H2 exacts sont capturés. Les processus sortent tous à 0 sans rescue ; cleanup scientifique et mécanique est observé.

Les métadonnées natives observées décrivent un DMA-BUF 800×600, format 875713112, modifier 020000001046bb04. Plane0 stride3584 offset0 ; plane1 stride1024 offset2293760. Les FDs sont borrowed ; fstat réussit sur le même inode. Cela ne prouve pas la longueur d'allocation ; un plan auxiliaire DCC ne reçoit pas un prédicat de stride d'image inventé. FBO/RBO/texture et objets natifs sont identifiés, sans preuve du contenu présenté.

g2_drain préliminaire, glGetString(GL_VERSION) et drain de query ont été exécutés ; pre_errors et query_errors sont vides. En revanche le refus précède sauvegarde/bind/read/restauration : read_errors / restore_errors vides et champs before/after à zéro sont des valeurs initialisées, pas des observations de lecture ou restauration. Aucun READ_SUCCESS, bits d'uniformes ou halfpixel effectif natif n'est observé. L'attribution des erreurs de readback et la neutralité GL ne sont pas prouvées. Les drains sont intrusifs : ils consomment les erreurs et ne restaurent pas la queue.

GL observability reste PARTIAL. Les tests offline de modifier, framing, uniform/precision et négatifs valident les outils dans leur périmètre ; ils ne fournissent pas les valeurs natives manquantes. Pas d'epsilon ajusté, pas de fit CPU pour transformer le refus en succès. Whole-H1 A/A-return nouveau NOT_PROVEN ; le FAIL whole-H1 historique reste historique, non rejoué et non effacé par une ROI centrale. Causalité whole-field GPU NOT_PROVEN.

8. Input, damage, commit/present et lifetime

Propriété Preuve V2 Limite
Applied/input Géométries CURRENT, points wire et pixels stabilisés échantillonnés PARTIALLY_FEASIBLE ; pas d'atomicité générale
Damage échantillonné H2 et retours exacts aux états capturés PARTIALLY_FEASIBLE ; toutes les frames non couvertes
Damage complet / stale pixels Pas de couverture exhaustive NOT_PROVEN
Commit/present natif Pas de clé native commune instrumentée dans CORE NOT_PROVEN
Identité exacte du buffer physique présenté Pas de lien V2 readback/commit/present NOT_PROVEN
Buffer saved natif Configure/timeout/ACK observés, identité absente NOT_PROVEN
GPU completion / fences / lifetime Aucun signal effectif mesuré NOT_PROVEN
Génération atomique transaction/scène/input Aucun compteur adopté ou prouvé NOT_PROVEN

Les compteurs historiques 57/55/2, 821/789/32 et 414/400/14 sont REPORTED, sans replay depuis les LAB supprimés. Aucun appariement entre runs par proximité temporelle ni aucun héritage d'une instrumentation ancienne. Décorations, ombres, blur/cache et saved buffers complets restent des gates indépendantes, malgré les pixels stabilisés favorables.

9. Revues, sévérité et décisions restantes

Les revues indépendantes source/C, CORE build, fixtures/admission, OOM source/ build, GPU source/build/portable et les deltas fullscreen/FIFO sont liées à leurs manifests et hashes. Le kit conserve les reçus compacts sous reviews/ ; le LAB garde les preuves détaillées. Les tests négatifs directs rejettent notamment mauvais SHA, mauvais fournisseur wlroots, archive dynamique, source stale, ancienne destination LAB et bindings incorrects. Les révisions source invalident l'avis précédent pour les octets modifiés ; une acceptation source/offline ne vaut pas admission native.

La première revue runtime (review-oom-runtime/runtime-receipt.json) garde P0/C1–C6 partiels et C7 inconclusif. La revue review-remaining-runtime/early-receipt.json garde P1 partiel, C8/O1 inconclusifs et O2 fermé. La décision G2 dépendante autorise seulement le diagnostic indépendant après examen de l'absence de défaut commun critique démontré ; elle n'upgrade pas O1. La revue finale runtime accepte la vérification bornée du protocole d'arrêt G2 et de la comptabilité (SHA256 3372e0ba9f7b33da4fbc041dc4eea97ccc000fb1a9cf809b189c29c90b510569). Elle maintient G2 INCONCLUSIVE et toutes les limites de phase I. La revue globale indépendante est désormais ACCEPTED, sans finding BLOCKING ; elle confirme la disposition NEEDS_TARGETED_EVIDENCE et la recommandation C, sans production. Son reçu est conservé dans le kit sous reviews/final-global-review.json.

Priorité Constat Correction ou preuve de clôture Responsable
P0 Aucun nouveau défaut critique commun démontré dans les revues bornées Ne signifie pas sûreté globale Non assigné
P1 Availability OOM production, damage complet, lifetime/présentation, GPU whole-field ouverts Décision de politique et preuves natives ciblées Non assigné
P2 C7 omet refocus migration ; C8 ne forme pas le groupe comparable ; O1 oracle root-only incompatible Correctifs prospectifs source-only et tests directs ; nouveau budget séparé pour run futur Non assigné
P3 Coût mémoire/performance, overhead allocator, neutralité des traces et portabilité future Mesures/requalification dédiées Non assigné

Il n'y a pas d'autorisation de nouveaux runs dans cette clôture. Le plus petit pas ultérieur justifié est une revue native C ciblée et des corrections offline des trois fixtures P2, suivies seulement si autorisées d'une nouvelle tranche de preuves ; pas STEP20D ni intégration production.

10. ABI, licences, maintenance et rollback

Les règles de maintenance upstream et de packaging restent applicables. Toute nouvelle révision SceneFX/wlroots, shaders, dépendances, layout/symboles, clip/damage ou lifetime exige impact review, rebuild, relocation/stage et nouvelles qualifications pertinentes. Aucun autre couple n'est qualifié par proximité de version. Le projet doit assurer veille de sécurité et rebuild du SceneFX embarqué si une future décision l'adopte ; les responsables maintenance, sécurité et release sont non assignés, sans SLA inventé.

Le stage de notices n'est pas une validation juridique : LEGAL_NOT_APPROVED. Les licences/notices exactes et la décision de distribution restent à revoir humainement. Le paquet actuel garde uniquement son binaire distinct ; aucun provides, conflicts ou replaces avec Sway/SwayFX. SwayFX ordinaire doit rester indépendamment actualisable et utilisable comme fallback. Le rollback préparé consiste à revenir au binaire/paquet Mosaic antérieurement qualifié ou au SwayFX standard, en conservant les manifests ; aucun rollback live n'est exécuté. Il ne faut ni remplacer /usr/bin/sway, ni bibliothèque système, session, dotfiles ou configuration QuickShell.

11. Stockage, conservation et purge sélective non exécutée

LAB conservé : /var/tmp/swayfx-mosaic-corec-v2-i516p6po, hors HOME. Le diagnostic initial distingue EDQUOT dans /tmp et écriture possible sous /var/tmp ; TMPDIR/TMP/TEMP et caches sont redirigés par run-env. Le cap généré est 18 Gio, alerte 12 Gio. Le relevé pré-final mesure LAB 677 228 967 octets (environ 646 Mio), SSD libre 279 665 819 648 octets (environ 260 Gio), /tmp libre 1 610 719 232 octets (environ 1,50 Gio). Il ne prétend pas être un maximum historique mesuré. Aucun LAB sous HOME ; le header source transitoire a été régénéré à l'identique, préservé puis retiré. Les sockets privés utilisent de petits /tmp/smx-* retirés après les runs. Les premières commandes de build utilisaient le wrapper TMP mais l'absence de variables de session héritées n'est pas prouvée pour toutes ces commandes ; aucun consommateur IPC quotidien n'a été observé.

Une suppression future du LAB ne doit plus supprimer le code reconstructible. Procédure préparée, non exécutée : vérifier les trois commits publiés, reconstruire/vérifier dans un second répertoire vierge, garder manifests, reviews, ledger et closeout à préserver ; identifier les seuls répertoires générés dispensables appartenant à l'UID et vérifier leurs realpaths sous ce LAB ; supprimer sélectivement uniquement après demande explicite, puis relever espace et inventaire restant. Ne pas lancer de suppression globale, suivre de symlinks, supprimer les cores système ou toucher aux sources Git. Les anciennes preuves perdues ne sont pas récupérées par cette procédure.

12. Marqueurs du ticket

Les PASS suivants désignent les gates bornées réellement validées, jamais STEP20C production. L'audit HOME/protections pré-final et la revue globale indépendante sont acceptés. La publication documentaire finale doit encore être liée à ses observations directes de remotes dans les reçus de clôture.

COREC_V2_STORAGE_GATE=PASS
COREC_V2_GIT_GATE=PASS
COREC_V2_RECONSTRUCTION_FROM_SURVIVING_SOURCES=PASS
COREC_V2_SOURCE_EQUIVALENCE=EXACT_FOR_NEW_TREE
COREC_V2_PLAN_AND_PROVENANCE_REVIEW=ACCEPTED
COREC_V2_FULL_SOURCE_REBUILD=PASS
COREC_V2_OPTION_C_CALLSITE_AUDIT=PASS
COREC_V2_SOURCE_FORWARD_APPLY=PASS
COREC_V2_NATIVE_C_SANITIZERS=PASS
COREC_V2_PRIVATE_BUILD=PASS
COREC_V2_PRIVATE_ELF_ABI=PASS
COREC_V2_PRIVATE_STAGE=PASS
COREC_V2_BUILD_REVIEW=ACCEPTED
COREC_V2_GRAPHICS_OFFLINE_PREFLIGHT=PASS
COREC_V2_STANDARD_COMPARISON=PARTIALLY_FEASIBLE
COREC_V2_HORIZONTAL_RETURN=PARTIALLY_FEASIBLE
COREC_V2_VERTICAL=PARTIALLY_FEASIBLE
COREC_V2_FRACTIONAL=PARTIALLY_FEASIBLE
COREC_V2_R90=PARTIALLY_FEASIBLE
COREC_V2_HIDDEN_SAME_CHAIN=PARTIALLY_FEASIBLE
COREC_V2_SAVED_NATURAL_TIMEOUT=PARTIALLY_FEASIBLE
COREC_V2_DYNAMIC=INCONCLUSIVE
COREC_V2_FULLSCREEN_COMPARISON=NOT_EXERCISED
COREC_V2_NATIVE_OOM_PREFLIGHT=ACCEPTED
COREC_V2_OOM_FIRST_ALLOCATION=INCONCLUSIVE
COREC_V2_OOM_SECOND_ALLOCATION=NOT_RUN
COREC_V2_AVAILABILITY_POLICY=UNDECIDED
COREC_V2_GPU_SOURCE_REVIEW=ACCEPTED
COREC_V2_GPU_METADATA_OFFLINE=PASS
COREC_V2_GPU_GL_OBSERVABILITY=PARTIAL
COREC_V2_GPU_RUNTIME=INCONCLUSIVE
COREC_V2_GPU_WHOLE_FIELD_CAUSALITY=NOT_PROVEN
COREC_V2_APPLIED_INPUT_COHERENCE=PARTIALLY_FEASIBLE
COREC_V2_NATIVE_COMMIT_PRESENT=NOT_PROVEN
COREC_V2_SAMPLED_DAMAGE=PARTIALLY_FEASIBLE
COREC_V2_COMPLETE_DAMAGE=NOT_PROVEN
COREC_V2_NATIVE_BUFFER_IDENTITY=NOT_PROVEN
COREC_V2_GPU_COMPLETION=NOT_PROVEN
COREC_V2_ATOMIC_GENERATION=NOT_PROVEN
COREC_V2_REPRODUCIBLE_KIT=PASS
COREC_V2_INDEPENDENT_REVIEW=ACCEPTED
COREC_V2_DOCUMENTARY_PUBLICATION=PARTIAL
COREC_V2_HOME_CLEAN=PASS
SWAYFX_MOSAIC_STEP20C_REBUILD_FROM_GIT_COREC_OOM_GPU_NIGHT_SHIFT_V1=PARTIALLY_ADVANCED

COREC_V2_HOME_CLEAN=PASS désigne l'absence de LAB/caches lourds sous HOME et le contrôle pré-final ; il n'efface pas les cores système précoces déclarés. La revue globale indépendante est ACCEPTED, sans finding BLOCKING. Le reçu reviews/final-global-review.json est matérialisé explicitement par le parent depuis le retour structuré du reviewer en lecture seule.

13. Réponses aux seize questions imposées

Q1. Reconstruction sans ancien LAB ? Oui, pour cette nouvelle dérivation : Git et sources publiques épinglées suffisent ; vérification exacte des octets et modes. Les anciens octets perdus ne sont pas restaurés.

Q2. Véritables create NULL traités ? Audit source/C accepté pour les callers du compositor et helpers épinglés concernés, avec rollback et premiers usages. Les exemples non liés restent hors périmètre ; cela ne garantit pas tout OOM du compositor.

Q3. Zéro scène/listener/exposition avant publication ? Oui dans les tests exacts et le failpoint root O1 observé (initialized/listeners/published=0). Pas de généralisation à tous sites possibles.

Q4. Survie privée à l'injection ? Oui observée pour O1 : même PID, IPC, voisin serial42/43 et sorties 0. Le run reste INCONCLUSIVE pour l'oracle de fermeture ; O2 natif non exécuté.

Q5. Régression damage/rendu/hit ? Pas de régression démontrée dans les échantillons qualifiés ; damage complet, effets et disponibilité générale restent NOT_PROVEN. Une absence de défaut échantillonné n'est pas une garantie.

Q6. Qualification propre au nouveau SHA ? Oui, C1–C6 fournissent les échantillons horizontal/vertical/scale/R90/hidden/saved et retours ; statuts PARTIALLY_FEASIBLE, contrôles scale/rotation dédiés NOT TESTED.

Q7. Fullscreen vraiment comparable ? P1 pristine oui pour le non-leaf mesuré ; C8 échoue à construire le même groupe avant capture. Comparaison CORE/pristine NOT_EXERCISED.

Q8. Même chaîne hidden ? Oui, C5 conserve IDs et grabs sans outside click entre dissimulation et retour ; portée bornée à cette chaîne.

Q9. Saved configure/timeout/live/close ? C6 observe hold39, timeout naturel, ACK tardif, live et close. Identité native saved buffer NOT_PROVEN.

Q10. GPU nouveau et revu ? Oui, sources/hooks G2 nouveaux, revues propres, binaire GPU distinct ; premier A refusé, aucune usurpation de G1.

Q11. DCC/halfpixel sans prédicat inventé ? Métadonnées réelles par plan, pas de fausse borne allocation ; halfpixel natif non observé à cause du refus. Pas de tolérance apprise après coup.

Q12. Attribution GL et interférence ? Drains pré/version exécutés et vides ; lecture/restauration non atteintes, donc pas de preuve read-success/error queue pour ces étapes. Les drains consomment la queue, interférence explicitée.

Q13. Whole-H1 A/A-return égal ? Non mesuré en V2 : B/A-return non armés. Causalité whole-field NOT_PROVEN ; FAIL historique conservé sans replay.

Q14. Cohérence effectivement mesurée ? Input/applied et damage stabilisé partiels ; commit/present natif, buffer physique, GPU completion/lifetime et génération atomique NOT_PROVEN.

Q15. Code survivant à la suppression de /var/tmp ? Oui pour les patches, scripts et fixtures publiés et reproduits depuis Git. Les captures et logs volumineux privés ne sont pas garantis survivants sans conservation séparée ; le LAB n'est pas supprimé.

Q16. Décisions humaines restantes ? Availability OOM production ; UX popup offscreen hide/dismiss/reposition ; acceptation juridique des notices ; responsables maintenance/sécurité/release et décision de distribution ; admission d'une future tranche native et intégration éventuelle. Toutes restent ouvertes ; aucun statut production n'est adopté par ce dossier.

14. Validation documentaire et état de clôture

Cette édition documentaire ajoute seulement le présent dossier et de courts renvois dans README documentaire, Architecture, Known Limitations, Roadmap, Development, Upstream et Changelog. UX, Packaging, AGENTS, production, PKGBUILD et patch cumulatif ne sont pas modifiés par cette rédaction. git diff --check réussit ; 348 liens locaux des huit documents sont résolus, les 43 marqueurs et les seize réponses imposées sont présents. La première assertion de comptage documentaire omettait R90 dans sa regex sans chiffres ; le contrôle corrigé compte les 43 noms exacts, sans changement de résultat. Cette rédaction n'a exécuté aucun build, test runtime, commit ou push.

La validation de clôture du parent trouve initialement 1 échec sur 48 tests offline : le test d'environnement utilisait le chemin O1 réel désormais muni d'un token consommé. Il ne s'agit pas d'un run O1 supplémentaire. Une correction bornée du test vers son propre répertoire OFFLINE_TEST_ONLY donne 48/48 tests réussis ; sa revue de delta indépendante est acceptée. Le vrai jeton O1 et le ledger sont inchangés, le jeton factice existant est refusé. L'échec initial reste conservé. Les reçus reviews/offline-post-run-delta-review.json et reviews/final-global-review.json sont matérialisés explicitement par le parent depuis les retours structurés des reviewers en lecture seule. La revue globale est ACCEPTED sans blocage ; la publication reste à sceller.

Les autres validations finales transmises à cette édition réussissent : AST des 43 Python, C17 fullscreen/G2, cinq bindings, manifests historiques 54/105, budget immuable et diff-check. Les nouveaux fichiers de preuves et la correction offline du parent sont visibles séparément dans le worktree ; ils ne sont pas des changements effectués par cette rédaction documentaire.