swayfx-mosaic/docs/design/STEP20C_TARGETED_SAVED_BUFFER_LIFECYCLE.md
fy59 ed9375797e test(mosaic): record targeted STEP20C partial closure
Record exact-SHA scale and extended G samples, same-source blur measurements
and retained negative saved/input results. Keep STEP20C NEXT and production
multi-output unsupported; no production integration.

Preserve immutable probe fixtures, offline regressions and compact artifact
provenance. Fourteen consumed runs / 125 output captures, independent final
audit accepted. Saved timeout/GPU lifetime, whole-H1 return, input after camera
mutation and all-frame damage remain open.
2026-10-14 07:00:33 +02:00

66 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# STEP20C — lifecycle ciblé des saved buffers
> EXPERIMENTAL — édition du 2026-10-14, clôture documentaire des quatorze runs ciblés, diagnostic C3 inclus. Revue finale indépendante : ACCEPTED, audit PASS pour la fidélité de l’évidence expérimentale. Publication documentaire autorisée et préparée, non exécutée à cette édition. Le diagnostic C3 est exécuté : résultat INCONCLUSIVE, observations natives partielles sans transfert à A/G. STEP20A DONE ; STEP20B EXPERIMENTAL ; STEP20C NEXT ; STEP20D–G PLANNED. Multi-output de production : NOT YET SUPPORTED. Aucune intégration, installation ou décision UX.
L’autorité brute est le LAB privé `/home/fy59/swayfx-mosaic-targeted-7gge6h8b` ; HIST désigne `/home/fy59/swayfx-mosaic-overnight-mcolx0gq`. Les chemins LAB/HIST sont des artefacts externes locaux, pas des fichiers distribués. Le [rapport de clôture](STEP20C_TARGETED_CLOSURE_DECISION.md) donne les identités exactes, la matrice des quatorze runs et les limites. Les sources de [fixture ciblé](../../tooling/probes/step20c-targeted/README.md) restent des entrées expérimentales ; elles n’ajoutent aucune dépendance de production. Les rapports historiques et leurs verdicts restent inchangés.
## Configure réellement obtenu, gate incomplet
Deux runs distincts, `saved-A` et `saved-G`, ont chacun deux PNG de référence H2. La demande réelle `gaps inner current set 30` provoque un nouveau configure serial 39 après ACK 30 : 636×573 devient 636×513. Le client annonce HELD, aucun ACK 39 n’est enregistré. Le validateur partagé puis son replay confirment la propriété `HELD_WIRE_VALIDATED` ; le trigger de configure est FEASIBLE pour les données observées.
La fixture s’arrête néanmoins sur `Ambiguous: same ws1 owner and requested runtime gaps`, car elle exige le champ workspace IPC `gaps` absent. L’audit source confirme l’action runtime et les deux argv contiennent `-Dtxn-timeout=2500`. Aucun timeout naturel n’est observé : la connexion est détruite par le teardown du compositeur, et le client écrit `EXIT ... mapped=1 held=1 error=32`, malgré son code de processus 0. Le `cleanup_pass=true` mécanique ne devient donc pas scientific cleanup PASS. Résultat runtime, scientific cleanup et campagne : **INCONCLUSIVE**. Images pendant hold/timeout, normal owner close et identité native saved-node/render : **NOT EXERCISED / NOT OBSERVABLE**.
## Identités et propriété native
L’audit `parent/native-lifetime-audit.json` est **SOURCE_AUDIT_ONLY**. `view_save_buffer_iterator` crée un autre `wlr_scene_buffer` sous l’arbre saved, copie destination/source-box/transform et référence le buffer de la scène live. SceneFX déverrouille l’ancienne référence, invalide la texture cached et locke le nouveau `wlr_buffer`. Le saved tree est frère de content_tree ; retirer les saved nodes détruit leur arbre et réactive le live. La destruction d’un scene buffer libère sa référence. Ces chemins source ne sont pas une preuve de release GPU au runtime.
Il faut distinguer SHM client, wl_buffer release client, nœud saved natif, texture/cache, output-state buffer, commit/present et fin GPU. Ni A ni G n’offrent les identités natives saved/locks/releases recherchées. Les traces d’un autre binaire historique ne leur sont pas transférées. Lifetime GPU, références exhaustives, commit rejeté et cohérence atomique restent **NOT PROVEN**.
## C3 réellement consommé — observation native partielle
C3 (`saved-diagnostic-A`) utilise un troisième binaire privé avec un seul
build Mosaic stage1, sans nouveau build SceneFX. LAB
`diagnostic/build-stage.json` lie le SHA
`9c0dc0e94ccc7fcbd7a6cddf14e90f1bb7b7bf385a0740e85ec7d0e1c1c1e705`
et build ID `67a4bcb6a37e8ec691a0da5099d12275429a7076`.
LAB `parent/c3-observations.json` et `parent/run-summary-final.json` enregistrent
la tentative consommée, sans réparation de fixture ni relance.
Le runtime et la mesure sont **INCONCLUSIVE**, runner exit1 : le bounded wait
expire après une durée totale de run de 3,682 s. Ce stop n’est **pas** le timeout
naturel d’une transaction. Le prédicat figé `saved_identity` rejette
`unique unreused saved node` : l’adresse de nœud est réellement réutilisée.
Une première tree owner 10 précède la commande gaps runtime ; une nouvelle tree
owner 10 est créée après cette commande. Exiger une adresse globalement unique
était trop strict pour cette lifetime ; l’analyse hors ligne ne répare ni
requalifie le prédicat original.
Après gaps, le wire retient configure 39 HELD sans ACK,636×573→636×513.
`SD_CREATE` observe owner 10, tree `0x55f011797c80`, saved node
`0x55f011792290`, source buffer `0x55f01170eae0`, destination 636×573 et
locks 3→4. Un vrai draw H1 de ce nœud/source et un sample natif sont retenus :
bbox globale[-318,25,636,573], intersection héritée[-318,25,318,573], clip
viewport global[-800,0,800,600] ; le draw output-local va de(482,25) à(800,598).
Ce sont des observations de création/rendu de saved node, distinctes des PNG
client ou d’une identité de buffer réellement présenté.
`SD_NODE_DESTROY`, `SD_RELEASE` à locks 0 et `SD_BUFFER_DESTROY` apparaissent
uniquement pendant le teardown après l’arrêt anticipé. Le client owner termine
`EXIT error=32` malgré code de processus 0. Natural transaction timeout,
normal owner close, PNG held puis live et contrôle H2 pendant hold :
**NOT EXERCISED**. Scientific cleanup **INCONCLUSIVE**, GPU completion et
identité source-SHM/output **NOT PROVEN**. Processus0/reaped/runtime_removed
et IPC terminal1 restent enregistrés séparément.
Le découpage offline create→next destroy est descriptif, avec source pointer
et ancestor tree ; il n’invente ni génération native ni identité valable à
toute réutilisation d’adresse. **SAVED_NODE_LIFECYCLE : partiellement observé
(création/rendu/teardown)** ; clipping **INCONCLUSIVE**, sans PNG held H2 ;
native GPU lifetime **NOT PROVEN**. Aucun résultat C3 ne se transfère à A/G.
La revue finale indépendante est **ACCEPTED**, audit PASS pour la fidélité du dossier expérimental. La publication documentaire est autorisée et préparée, non exécutée à cette édition.
Preuves A/G : LAB `runs/saved-{A,G}/run/`, `parent/run-summary.json`,
`parent/native-lifetime-audit.json`, `reviews/runtime-validation-13.json`.
Preuves C3 : LAB `runs/saved-diagnostic-A/run/`, `parent/c3-observations.json`,
`parent/run-summary-final.json`. Total campagne final 14 runs/125 PNG/520 événements ;
les treize runs initiaux et leurs preuves restent intacts.