From 30dc3182ab1739a396fae3fc75bbe68589f8a950 Mon Sep 17 00:00:00 2001 From: fy59 Date: Wed, 14 Oct 2026 01:47:19 +0200 Subject: [PATCH] docs(mosaic): record partial STEP20C overnight evidence Record the annotated rebuild, bounded graphics matrices, private release-shape smoke, and remaining integration gates. Preserve STEP20C NEXT and production multi-output NOT YET SUPPORTED. --- CHANGELOG.md | 16 + docs/ARCHITECTURE.md | 25 ++ docs/DEVELOPMENT.md | 15 + docs/KNOWN_LIMITATIONS.md | 26 ++ docs/README.md | 11 + docs/ROADMAP.md | 24 ++ docs/UPSTREAM.md | 14 + .../STEP20C_ANNOTATED_GRAPHICS_MATRIX.md | 72 ++++ ...20C_ANNOTATED_REBUILD_AND_PRIVATE_STAGE.md | 90 +++++ ...C_LIFECYCLE_EFFECTS_AND_NATIVE_ORDERING.md | 63 ++++ ...T_QUALIFICATION_AND_INTEGRATION_GATE_V1.md | 72 ++++ ...C_PRODUCTION_INTEGRATION_DECISION_DRAFT.md | 109 ++++++ .../probes/step20c-overnight/HORIZONTAL.md | 104 ++++++ .../step20c-overnight/horizontal_adapter.py | 131 +++++++ .../step20c-overnight/horizontal_gate.py | 168 +++++++++ .../step20c-overnight/horizontal_tests.py | 139 ++++++++ tooling/probes/step20c-overnight/ledger.py | 122 +++++++ .../probes/step20c-overnight/matrix/README.md | 173 +++++++++ .../step20c-overnight/matrix/analyze.py | 9 + .../probes/step20c-overnight/matrix/cases.py | 266 ++++++++++++++ .../probes/step20c-overnight/matrix/engine.py | 188 ++++++++++ .../probes/step20c-overnight/matrix/gate.py | 109 ++++++ .../step20c-overnight/matrix/geometry.py | 66 ++++ .../step20c-overnight/matrix/prepare.py | 48 +++ .../step20c-overnight/matrix/protocols.py | 44 +++ .../probes/step20c-overnight/matrix/run.py | 24 ++ .../probes/step20c-overnight/matrix/tests.py | 248 +++++++++++++ .../step20c-overnight/qualification/README.md | 18 + .../qualification/provenance.json | 1 + .../step20c-overnight/release_shape/README.md | 11 + .../release_shape/__init__.py | 1 + .../release_shape/adapter.py | 24 ++ .../release_shape/dispatch.py | 91 +++++ .../step20c-overnight/release_shape/gate.py | 333 ++++++++++++++++++ .../step20c-overnight/release_shape/tests.py | 127 +++++++ .../step20c-overnight/replay_annotated.py | 102 ++++++ tooling/probes/step20c-overnight/run.py | 14 + .../probes/step20c-overnight/test_ledger.py | 49 +++ 38 files changed, 3147 insertions(+) create mode 100644 docs/design/STEP20C_ANNOTATED_GRAPHICS_MATRIX.md create mode 100644 docs/design/STEP20C_ANNOTATED_REBUILD_AND_PRIVATE_STAGE.md create mode 100644 docs/design/STEP20C_LIFECYCLE_EFFECTS_AND_NATIVE_ORDERING.md create mode 100644 docs/design/STEP20C_OVERNIGHT_QUALIFICATION_AND_INTEGRATION_GATE_V1.md create mode 100644 docs/design/STEP20C_PRODUCTION_INTEGRATION_DECISION_DRAFT.md create mode 100644 tooling/probes/step20c-overnight/HORIZONTAL.md create mode 100644 tooling/probes/step20c-overnight/horizontal_adapter.py create mode 100644 tooling/probes/step20c-overnight/horizontal_gate.py create mode 100644 tooling/probes/step20c-overnight/horizontal_tests.py create mode 100644 tooling/probes/step20c-overnight/ledger.py create mode 100644 tooling/probes/step20c-overnight/matrix/README.md create mode 100644 tooling/probes/step20c-overnight/matrix/analyze.py create mode 100644 tooling/probes/step20c-overnight/matrix/cases.py create mode 100644 tooling/probes/step20c-overnight/matrix/engine.py create mode 100644 tooling/probes/step20c-overnight/matrix/gate.py create mode 100644 tooling/probes/step20c-overnight/matrix/geometry.py create mode 100644 tooling/probes/step20c-overnight/matrix/prepare.py create mode 100644 tooling/probes/step20c-overnight/matrix/protocols.py create mode 100644 tooling/probes/step20c-overnight/matrix/run.py create mode 100644 tooling/probes/step20c-overnight/matrix/tests.py create mode 100644 tooling/probes/step20c-overnight/qualification/README.md create mode 100644 tooling/probes/step20c-overnight/qualification/provenance.json create mode 100644 tooling/probes/step20c-overnight/release_shape/README.md create mode 100644 tooling/probes/step20c-overnight/release_shape/__init__.py create mode 100644 tooling/probes/step20c-overnight/release_shape/adapter.py create mode 100644 tooling/probes/step20c-overnight/release_shape/dispatch.py create mode 100644 tooling/probes/step20c-overnight/release_shape/gate.py create mode 100644 tooling/probes/step20c-overnight/release_shape/tests.py create mode 100644 tooling/probes/step20c-overnight/replay_annotated.py create mode 100644 tooling/probes/step20c-overnight/run.py create mode 100644 tooling/probes/step20c-overnight/test_ledger.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 93940ce..d937a83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -127,3 +127,19 @@ STEP20C NEXT; production multi-output NOT YET SUPPORTED. preserving the original README as a sealed pre-execution protocol. Final batch audit is PASS / ACCEPTED with no BLOCKING finding. No production source, UX, package, public ABI or cumulative patch change; STEP20C NEXT, multi-output NOT YET SUPPORTED. + +## 2026-10-14 — preserved private STEP20C overnight qualification + +- Record the fresh annotated private rebuild, exact local ABI and five-file + DESTDIR stage, 18 unique graphics attempts/196 captures, and separately built + release-shape horizontal smoke with its own binary identity. +- Preserve positive sampled clip/input observations alongside D2 fixture + ambiguity, saved-buffer NOT EXERCISED, failed whole-H1 effects restoration, + stale-coordinate F assertion, terminal IPC incidents and unproven lifetime, + atomic generation, full damage, legal and package qualification. +- Add the 22-question production integration decision draft and compact + source-only provenance. PRIVATE_CANDIDATE_NEEDS_TARGETED_EVIDENCE remains a + recommendation; STEP20C NEXT and production multi-output NOT YET SUPPORTED. + Final independent review is ACCEPTED / audit PASS for experimental evidence + fidelity; documentary publication is prepared, not executed at this edition. No production + source, current package, UX or historical evidence contract is changed. diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index db70ebb..0249838 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -516,3 +516,28 @@ for normal publication. supersede the original README's sealed pre-execution status only. Architecture remains UNDECIDED for production integration; STEP20C NEXT, production multi-output NOT YET SUPPORTED. + +## Preserved overnight STEP20C qualification — 2026-10-14 + +The [overnight dossier](design/STEP20C_OVERNIGHT_QUALIFICATION_AND_INTEGRATION_GATE_V1.md) +records fresh private annotated and release-shape binaries with separate exact +identities. Sampled owner-derived root popup clipping and fully hidden-owner +empty clips agree with recorded pixels/input in the qualified windows; +release-shape G has its own horizontal smoke only. These are experimental +observations, not adopted runtime architecture or a production dependency. + +Applied scene callbacks, client input-region commits and native output +commit/present events remain separate observations. No atomic transaction, +scene, hit or presented-buffer generation is established. Saved-buffer/GPU +reference and release lifetime, complete frame damage and instrumentation +neutrality remain NOT PROVEN. G retains PI listeners and framebuffer +bind-before-failure ordering after removing reviewed logging statements. +Local header/layout/symbol checks qualify only the exact recorded pair. + +The compositor and its native tiling tree remain authoritative; Row 0 borrows +workspace->tiling and no additional runtime row or UX policy is adopted. +STEP20C remains NEXT, production multi-output NOT YET SUPPORTED. The decision +recommendation is PRIVATE_CANDIDATE_NEEDS_TARGETED_EVIDENCE, not integration. +Final independent review is ACCEPTED / audit PASS for experimental evidence +fidelity. Documentary publication is prepared, not executed at this edition; +final publication identities belong to the private receipt and final handoff. diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 709693f..320aa83 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -144,3 +144,18 @@ SwayFX remains the fallback. All other pairs are NOT QUALIFIED. These decisions do not settle popup UX or close STEP20C production gates. STEP20A DONE; STEP20B EXPERIMENTAL; STEP20C NEXT; STEP20D–G PLANNED. Production multi-output remains NOT YET SUPPORTED. + +## Preserved overnight experimental reproduction + +The [annotated rebuild/private-stage report](design/STEP20C_ANNOTATED_REBUILD_AND_PRIVATE_STAGE.md) +and [source-only qualification index](../tooling/probes/step20c-overnight/qualification/README.md) +record exact pins, ordered patches, private Meson options, local ABI checks, +staging manifests and an immutable 18-run budget outcome. Reproduce only in a +new disposable LAB with verified retained inputs and a separately authorized +budget; the original budget is exhausted and no retry is authorized. Private +patches, source archives and future recipe remain local references, not a +self-contained publicly distributed build kit. Build/model/ELF/stage passed +locally; makepkg metadata/source verification/full build was NOT RUN. No binary +bit-reproducibility or distribution readiness is claimed. Experimental helper +fixtures do not add a production dependency. See the dossier for transport, +cleanup and unexercised-case limits before interpreting runtime results. diff --git a/docs/KNOWN_LIMITATIONS.md b/docs/KNOWN_LIMITATIONS.md index 60b4a4e..f12ef9f 100644 --- a/docs/KNOWN_LIMITATIONS.md +++ b/docs/KNOWN_LIMITATIONS.md @@ -460,3 +460,29 @@ errors, separate from B's accepted104 tests and the historical206 result. Final batch audit is PASS / ACCEPTED. Publication identities are recorded in Git history and the private closeout receipt. STEP20C remains NEXT, production multi-output NOT YET SUPPORTED; no daily-driver qualification follows. + +## Preserved overnight STEP20C qualification — 2026-10-14 + +The [overnight qualification dossier](design/STEP20C_OVERNIGHT_QUALIFICATION_AND_INTEGRATION_GATE_V1.md) +records a fresh annotated private rebuild and its own bounded graphics evidence, +plus a separately built release-shape candidate with its own horizontal smoke. +The [exact matrix](design/STEP20C_ANNOTATED_GRAPHICS_MATRIX.md) contains 18 unique +runs and 196 captures, without retries. Horizontal C is FEASIBLE for sampled +cases; the overall result is PARTIALLY_ADVANCED and the integration recommendation +is PRIVATE_CANDIDATE_NEEDS_TARGETED_EVIDENCE, a draft decision, not adoption. + +Vertical, scaled, R90 and resize/migration observations remain bounded. D2's +fixture root association stopped before input/final qualification; saved-buffer +E2 was NOT EXERCISED; whole-H1 effects restoration failed in both controls; +F's stale-coordinate assertion stopped its remaining mutations. Atomic +transaction/input/present identity, complete damage and GPU buffer lifetime +remain NOT PROVEN. G is SMOKE_FEASIBLE horizontally, without inheriting A's +matrix or establishing instrumentation neutrality. Exact local ABI/staging +checks and future recipe syntax/input checks do not qualify future pairs, +complete makepkg reproduction, actual notice incorporation or legal distribution. + +STEP20A DONE; STEP20B EXPERIMENTAL; STEP20C NEXT; STEP20D–G PLANNED. +Production multi-output remains NOT YET SUPPORTED. No production, UX or current +package contract is changed. Final independent review is ACCEPTED / audit PASS for experimental evidence +fidelity. Documentary publication is prepared, not executed at this edition; +production integration remains undecided. diff --git a/docs/README.md b/docs/README.md index e7599b2..2f93fca 100644 --- a/docs/README.md +++ b/docs/README.md @@ -363,3 +363,14 @@ and the private closeout receipt. Complete damage, atomic generation, wider static graphics/output coverage, maintained ABI and legal/maintenance gates remain open. STEP20C NEXT, production multi-output NOT YET SUPPORTED; no production/UX/packaging contract change. + +Preserved [overnight qualification dossier](design/STEP20C_OVERNIGHT_QUALIFICATION_AND_INTEGRATION_GATE_V1.md): +EXPERIMENTAL / PARTIALLY_ADVANCED, with a [fresh annotated rebuild and private stage](design/STEP20C_ANNOTATED_REBUILD_AND_PRIVATE_STAGE.md), +[18-run graphics matrix](design/STEP20C_ANNOTATED_GRAPHICS_MATRIX.md), +[lifecycle/effects/native-ordering limits](design/STEP20C_LIFECYCLE_EFFECTS_AND_NATIVE_ORDERING.md), +and [22-question production integration decision draft](design/STEP20C_PRODUCTION_INTEGRATION_DECISION_DRAFT.md). +The [compact source-only qualification index](../tooling/probes/step20c-overnight/qualification/README.md) +preserves exact identities, budget and private provenance references. Recommendation: +PRIVATE_CANDIDATE_NEEDS_TARGETED_EVIDENCE; no production decision applied. +STEP20C NEXT; production multi-output NOT YET SUPPORTED. Final independent review is ACCEPTED / audit PASS for experimental evidence +fidelity. Documentary publication is prepared, not executed at this edition. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 2844dcf..3e3f095 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -459,3 +459,27 @@ maintained ABI, notice/legal closure and named maintenance roles remain gates. This is STEP20C evidence, not implementation of roadmap STEP20D. STEP20A DONE; STEP20B EXPERIMENTAL; STEP20C NEXT; STEP20D–G PLANNED. Production multi-output remains NOT YET SUPPORTED. No production/UX/packaging contract changes. + +## Preserved overnight STEP20C qualification — 2026-10-14 + +The [overnight qualification dossier](design/STEP20C_OVERNIGHT_QUALIFICATION_AND_INTEGRATION_GATE_V1.md) +advances private evidence through a fresh annotated rebuild, 18 unique graphics +attempts/196 captures and a separately built release-shape horizontal smoke. +C horizontal is FEASIBLE for sampled cases; the overall scientific result is +PARTIALLY_ADVANCED. PRIVATE_CANDIDATE_NEEDS_TARGETED_EVIDENCE is the proposed +integration decision, not an applied decision or READY status. + +The next justified gate is targeted evidence with a new authorized scope and +budget: trigger an actual saved configure, diagnose whole-H1 effects restoration +against pristine, tie input assertions to applied geometry, and establish +relevant native lifetime/transaction/damage and instrumentation-neutrality +proof. Exact-pair requalification, complete package reproduction, actual notice +incorporation/legal review and release/security nominations remain open. +Popup hide/dismiss/reposition and grab click-through policy remain undecided. +Relevant canonical contracts must precede any future implementation. + +STEP20A DONE; STEP20B EXPERIMENTAL; STEP20C NEXT; STEP20D–G PLANNED. +Production multi-output remains NOT YET SUPPORTED. No STEP20D work or production +integration follows automatically from documentary publication. Final independent +review is ACCEPTED / audit PASS for experimental evidence fidelity. Documentary +publication is prepared, not executed at this edition. diff --git a/docs/UPSTREAM.md b/docs/UPSTREAM.md index 2994c43..4759cc6 100644 --- a/docs/UPSTREAM.md +++ b/docs/UPSTREAM.md @@ -61,3 +61,17 @@ SwayFX remains the fallback. All other pairs are NOT QUALIFIED. These decisions do not settle popup UX or close STEP20C production gates. STEP20A DONE; STEP20B EXPERIMENTAL; STEP20C NEXT; STEP20D–G PLANNED. Production multi-output remains NOT YET SUPPORTED. + +## Overnight private maintenance evidence + +The [annotated reconstruction report](design/STEP20C_ANNOTATED_REBUILD_AND_PRIVATE_STAGE.md) +qualifies only the exact private SceneFX 0.5 source and shared wlroots 0.20.2 +build recorded there. Local header/layout/symbol/relocation checks establish no +future semantic ABI guarantee. Any relevant source or dependency build change +requires impact review, rebuild and fresh qualification of the new binary; +no previous SHA's graphics results are inherited. Release and security roles +remain unnamed, and no SLA is established. Future recipe and notices remain +PARTIALLY_FEASIBLE: syntax/input correspondence passed, complete makepkg and +human legal/distribution review remain open. The [decision draft](design/STEP20C_PRODUCTION_INTEGRATION_DECISION_DRAFT.md) +records proposed monitoring, requalification and rollback without adopting a +production integration or changing normal SwayFX upgrade independence. diff --git a/docs/design/STEP20C_ANNOTATED_GRAPHICS_MATRIX.md b/docs/design/STEP20C_ANNOTATED_GRAPHICS_MATRIX.md new file mode 100644 index 0000000..9092b7c --- /dev/null +++ b/docs/design/STEP20C_ANNOTATED_GRAPHICS_MATRIX.md @@ -0,0 +1,72 @@ +# STEP20C — matrice graphique du binaire annoté + +> EXPERIMENTAL — édition documentaire du 2026-10-14, après revue finale ACCEPTED / audit PASS du dossier expérimental ; publication préparée, non exécutée à cette édition. Les résultats concernent des laboratoires privés ; aucune intégration production, installation ou décision UX. STEP20A DONE ; STEP20B EXPERIMENTAL ; STEP20C NEXT ; STEP20D–G PLANNED. Multi-output de production : NOT YET SUPPORTED. Les anciens rapports restent historiques et leurs résultats ne se transfèrent pas à un nouveau SHA. + +L’autorité brute est le LAB privé `/home/fy59/swayfx-mosaic-overnight-mcolx0gq`. Les chemins LAB ci-dessous sont des références locales de preuve, pas des fichiers distribués. Les sources de fixture préservées se trouvent dans [tooling/probes/step20c-overnight](../../tooling/probes/step20c-overnight/qualification/README.md). La [provenance compacte](../../tooling/probes/step20c-overnight/qualification/provenance.json) lie les identités et reçus sans publier logs, images, binaires, archives ou patches candidats. + +## Matrice réellement exécutée + +18 tentatives uniques, aucun retry, 196 captures compositeur. Chaque run utilise un runtime/socket privé. Le renderer observé dans les startups est SceneFX FX, OpenGL ES 3.2 Mesa 26.2.4-arch1.1, AMD Radeon 780M ; `WLR_RENDERER=pixman` demandé ne constitue pas une preuve pixman. Identités de spawn et proc maps contrôlées. + +| Identité | SHA256 | Build ID | +| --- | --- | --- | +| A annoté, utilisé C1/C2 et Mosaic D/E/F | `979dcd95ab43fa1e465d6e9d262485b73d186cedacd0f957059dd24f482ce6f4` | `fabfeb823754a0f5107f83eb077323ad17ddedd1` | +| G release-shape, smoke propre | `8063478b2d5948da3eb8b1a329978882dc1d045cf36932cc2145a78af20ba76a` | `83896fdb36f3fd21522becec0e8c5219e15f4b8e` | +| Contrôle pristine retenu | `8ac865481bc0487344210cd0e16d8e6c7655b29db887cd58ddc11b0ca22fe494` | `298a9626b331139ff2f081ade9c4efdde2d4fb19` | + +Paire locale : SceneFX 0.5.0 statique privé, wlroots 0.20.2 partagé, bibliothèque SHA256 `7edca9a7d65855addda68e29ba5db94d57c803eb5fa7d0f86db3136b90ca9837`. Tous les autres builds/paires sont NOT QUALIFIED. + +Géométries : C, D4, E, F et G ont H1 `[-800,0,800,600]`, H2 `[0,0,800,600]`, modes 800×600, scale1, normal ; D1 H1 `[0,0,800,600]`, H2 `[0,600,800,600]`. D2 H1 logique `[-800,0,800,600]`, mode1000×750, scale1,25/normal ; D3 même logique, mode750×1000, scale1,25/R90. H2 reste 800×600 scale1/normal. Les cinq marqueurs asymétriques réellement capturés établissent la frame PNG1000×750 avant les conversions D2/D3 : une conversion logique→PNG est appliquée une seule fois. La migration/resize D4 est une mutation mesurée, pas un autre run. Les rectangles utilisent des bornes half-open. Native SHM buffer, configure XDG, destination tiling/IPC assigned, scène applied et origine client globale, viewport logique, mode physique et pixels PNG restent des espaces distincts ; les mesures de destination ne sont pas une identité de buffer. Les adaptations de scale/rotation sont corroborées par marqueurs et wire, sans mélanger l’origine current et applied. + +| Run | Binaire | PNG | Mesure / runtime / cleanup | Portée | +| --- | --- | --- | --- | --- | +| C0 | pristine | 10 | PASS / PASS / PASS | contrôle pristine horizontal | +| C1 | A | 10 | PASS / PASS / PASS | contrôle annoté splith | +| C2 | A | 17 | PASS / PASS / PASS | Mosaic, deux chaînes et retour standard | +| D1-pristine | pristine | 8 | PASS / INCONCLUSIVE / PASS | overflow vertical standard | +| D1-mosaic | A | 8 | PASS / INCONCLUSIVE / PASS | clip vertical + input/dismissal | +| D2-pristine | pristine | 9 | PASS / INCONCLUSIVE / PASS | scale1,25 standard + input | +| D2-mosaic | A | 7 | INCONCLUSIVE / INCONCLUSIVE / PASS | pixels/grabs ; association root fixture ambiguë | +| D3-pristine | pristine | 9 | PASS / INCONCLUSIVE / PASS | R90 standard + input | +| D4-pristine | pristine | 17 | PASS / INCONCLUSIVE / PASS | resize/migration standard | +| D4-mosaic | A | 17 | PASS / INCONCLUSIVE / PASS | resize/migration Mosaic ; input pendant migration non échantillonné | +| E1-mosaic | A | 12 | PASS / INCONCLUSIVE / PASS | hide/return même chaîne | +| E2-mosaic | A | 2 | INCONCLUSIVE / INCONCLUSIVE / PASS | saved configure non déclenché | +| E3-pristine | pristine | 16 | INCONCLUSIVE / INCONCLUSIVE / FAIL clients | ROI cache A/B/A ; full restoration échoue | +| E3-mosaic | A | 16 | INCONCLUSIVE / INCONCLUSIVE / FAIL clients | ROI/cache USE ; full restoration échoue | +| F-pristine | pristine | 8 | INCONCLUSIVE / INCONCLUSIVE / PASS | input regions ; sans trace privée native | +| F-mosaic | A | 4 | INCONCLUSIVE / INCONCLUSIVE / PASS | input regions ; assertion de géométrie périmée | +| G-smoke | G | 17 | PASS / PASS / PASS | preuve propre G horizontal seulement | +| D3-mosaic | A | 9 | PASS / INCONCLUSIVE / PASS | R90 v3 première exécution ; revue runtime acceptée | + +Les trois runs C sont FEASIBLE dans leur scope ; D est PARTIALLY_FEASIBLE globalement. Les receipts structurés préservent serials réels, actions et géométries de chaque run dans la provenance compacte. Les mesures absentes ne sont pas inférées. + +## Pixels, protocoles et input + +C0/C1 : TOPLEVEL→A→B réel, deux grabs serial33/42, configure/ACK/SHM. A[-298,105,350,170], B[-198,165,300,130] traversent x0 ; entrée B puis A réelle sur H2. Huit images homologues C0/C1 entières exactement égales en RGB, sans masque ni tolérance. Fermeture B conservant A et fermeture owner normales, référence H2 finale exacte. + +C2 : deux owners distincts, grabs33/42 puis91/100. A[-218,105,350,170], B[-118,165,300,130], owner appliqué[-318,25,636,573]. H1 conserve les pixels A/B ; H2 complet exact. B visible reçoit51/52 ; B-H2[91,195] ne reçoit aucun bouton, puis done/destroy B→A ; référence62/63 observée. Le retour splith du même owner/root/hierarchie est reconstitué sur deux callbacks old-Mosaic puis six applied-standard sans réactivation du clip, avec B111/112 puis A117/118. Aucun click-through universel. + +D1 : A/B traversent y600 de75/115. Pristine H1 A21200/B2550 et H2 A6000/B19550 ; Mosaic H1 mêmes nombres, H2 A0/B0 et RGB exact. Grabs31/40 pristine,33/42 Mosaic. B H2 réel standard, absent côté Mosaic ; dismissal et référence62/63 observés. Le champ helper historique `crossing` x0 NOT EXERCISED n’est pas le prédicat vertical : revue y600 indépendante. + +D2 : pristine H1 A45150/B40261, H2 A3120/B13260 ; Mosaic H1 A37650/B23961, H2 A0/B0, grabs35/44 réels. Le layer wallpaper de marqueurs crée avant l’owner un host descriptor POPUP ; le fixture exigeait à tort un root global unique/index1 alors que le root XDG est index2. Association source+temps+cardinalité, sans owner-ID natif direct. Arrêt consommé avec7 PNG et2 clics d’ouverture ; input B visible/interdit, dismissal et finals NOT EXERCISED. Aucun rerun D2 ni défaut compositor démontré. + +D3 : pristine contrôle réel avec grabs35/44 et marqueurs. Mosaic v3 a été réparé/revu avant sa première exécution, freeze `7ae5f3ad8cc8cb738740c6a32fe7e1f336d20226b7813a03e22be3030d1507fb`, 1172 entrées ; archive v2 exécutée578 SHA conservée. Mesures runner PASS,9 PNG/4 clics/2 grabs35/44,1 caméra ; H1 A37650/B23961, H2 A0/B0 et480000 pixels exacts ; B visible, interdit puis dismissal final observés. La revue runtime indépendante `reviews/rotation-v3-runtime-review.md` est ACCEPTED / FEASIBLE_SAMPLED_R90 : 11 callbacks baseline avant target owner9 (les trois derniers concernent filler8), puis un callback mapped complet. Neuf négatifs sont refusés ; owner/root association bornée sans IDs natifs. Aucun retour splith testé dans D3. + +D4 : resize H1→960 puis800, workspace/owner H1→H2→H1, IDs et ordre natif préservés, ancienne sortie restaurée exactement. Trois cellules, largeur minimale640/gap0, caméra demandée relative1920 clampée à960. Input durant migration NOT TESTED ; aucune identité de génération atomique. + +G :17 PNG/8 clics/4 grabs,2 chaînes,2 caméras,1 retour splith. Maps G exact et absence SceneFX dynamique. Clips root/owner, H2 Mosaic/final exact, standard H2 A3120/B13260 et input wire corroborés ; cleanup propre. Verdict SMOKE_FEASIBLE horizontal, aucune matrice G complète ni neutralité héritée de A. + +## Transport, limites et budgets + +Toutes les IPC terminales ont code1 « Unable to receive IPC response », stdout vide, compositor0. Les politiques C/G permettent runtime PASS lorsque mesures/fermetures complètes ; matrix conserve runtime INCONCLUSIVE. Cette différence explicite n’est pas harmonisée et la cause de la perte de réponse n’est pas prouvée. E3 : deux clients par run code1/error32 après interruption, cleanup scientifique FAIL ; tous processus sont pourtant reaped et runtimes supprimés, sans watchdog/rescue. Les autres cleanups sont PASS. + +Registre durable flock + remplacement atomique + fsync :2/2 SceneFX,2/2 Mosaic,2/2 stages,18/18 runs,196/220 captures, maximum20/run et12 pour F,150 s/run. Local C3,D1–D4 chacun2,E1=1,E2=1,E3=2,F=2,G=1. Quatre PNG de marqueurs générés sont des inputs séparés :200 nouvelles images ;78 copies d’assets upstream ne sont pas des captures. Aucun remboursement, reset ou relance. Hash final ledger `6ebedc65f30bf2c81f45b1487adf974a390a0049f632cfbb18bbbb00e3bfae3f`. + +Revue indépendante C, premiers D et lifecycle/G acceptées pour ces faits seulement ; preuves/négatifs conservés même lorsqu’un premier script d’analyse a échoué puis été corrigé hors ligne. Revue R90 runtime acceptée ; revue finale du dossier expérimental ACCEPTED / audit PASS, distincte des gates production. Damage de toutes frames, lifetime GPU, génération atomique, sortie réelle non headless et UX popup universelle NOT PROVEN / NOT TESTED. + +## Revue finale observée et publication préparée + +Revue indépendante finale ACCEPTED / audit PASS pour la fidélité du dossier expérimental : 0 BLOCKING, 4 NON_BLOCKING, 3 FUTURE_SCOPE ; 180 checks hors ligne et 15 mutations de preuves réelles rejetées. Rapport privé `reviews/overnight-final-review.md`, SHA256 `bb4000dffb51b07b59e86f91e8dd76bc2c4f0b9513b48a52c9f6bd6c8c3f45af` ; reçu JSON SHA256 `72ba252092ca3375d344faae1c2026c8d5626fd190e87771d5c0c1ad8212c9b0`. Index scientifique post-exécution `seals/index.json`, SHA256 `cdf034e1f8466a9ae8a0e0a33aa8d0d0195273f0d1bc782667b50c3bcf682505`, contexte de preuve courant, pas un binding pré-exécution. + +NB-01 est complété dans l’index compact depuis les grabs wire réels de chacun des huit runs concernés, avec lignes et hashes sources dans `parent/metadata-serial-completion.json`. Les stops fixtures, échecs E3 et incident IPC restent documentés. Les gates lifetime/génération/damage, couverture G, maintenance ABI/paquet/juridique et robustesse/coût des sidecars privés restent ouverts. L’acceptation documentaire ne qualifie pas la production et n’applique aucune décision. Publication préparée, pas encore exécutée à cette édition ; les refs/SHAs finaux et le résultat de publication feront foi dans le reçu privé et le handoff final. diff --git a/docs/design/STEP20C_ANNOTATED_REBUILD_AND_PRIVATE_STAGE.md b/docs/design/STEP20C_ANNOTATED_REBUILD_AND_PRIVATE_STAGE.md new file mode 100644 index 0000000..73a897a --- /dev/null +++ b/docs/design/STEP20C_ANNOTATED_REBUILD_AND_PRIVATE_STAGE.md @@ -0,0 +1,90 @@ +# STEP20C — reconstruction annotée et staging privé + +> EXPERIMENTAL — édition documentaire du 2026-10-14, après revue finale ACCEPTED / audit PASS du dossier expérimental ; publication préparée, non exécutée à cette édition. Les résultats concernent des laboratoires privés ; aucune intégration production, installation ou décision UX. STEP20A DONE ; STEP20B EXPERIMENTAL ; STEP20C NEXT ; STEP20D–G PLANNED. Multi-output de production : NOT YET SUPPORTED. Les anciens rapports restent historiques et leurs résultats ne se transfèrent pas à un nouveau SHA. + +L’autorité brute est le LAB privé `/home/fy59/swayfx-mosaic-overnight-mcolx0gq`. Les chemins LAB ci-dessous sont des références locales de preuve, pas des fichiers distribués. Les sources de fixture préservées se trouvent dans [tooling/probes/step20c-overnight](../../tooling/probes/step20c-overnight/qualification/README.md). La [provenance compacte](../../tooling/probes/step20c-overnight/qualification/provenance.json) lie les identités et reçus sans publier logs, images, binaires, archives ou patches candidats. + +## Reconstruction exacte A et portée H + +A : PASS pour rejeu source, annotations, build, modèle, ELF, ABI locale et stage ; H : PARTIALLY_FEASIBLE pour préparation du paquet et maintenance. La compilation ne prouve pas un comportement graphique. Le nouveau A a ensuite ses propres preuves C/D/E/F ; G possède une identité et un smoke séparés. + +| Source épinglée | Commit | +| --- | --- | +| SwayFX 0.6 | `fd71a6bdc061bd633b488ae7b83e8a6981d22f86` | +| Mosaic source historique | `cd550382b311efdbfe3ed892f4e1d281d852e754` | +| SceneFX 0.5 | `37ccd723bef49e6891156ffafce8f549f01446cc` | +| wlroots 0.20.2 | `d783533489e1f75d6886c2ab5c5960090ef268f8` | + +La revue `reviews/phase-a-review.md` a vérifié les labels commit pax des quatre archives, leurs hashes et le rejeu strict. L’absence de `.git` dans une extraction n’invalide pas cette provenance ; l’avertissement initial d’inventaire est résolu par cette preuve. Huit patches fonctionnels/instrumentation sont rejoués dans l’ordre, puis deux patches de commentaires. `git apply --check` précède chaque application normale ; chaque arbre parent/résultat et les quatre fichiers annotés sont vérifiés. Une comparaison lexicale tenant compte des littéraux conserve tous les tokens C actifs. Les insertions peuvent décaler `__LINE__`. Le NOT REBUILT historique décrivait l’ancien D, pas A. + +| Arbre / ordre | Patch | SHA256 | +| --- | --- | --- | +| scene-source / 0 | scenefx-popup-plus-base.patch | `c74c515b98da8f5f637e260e6a3755c7a75bd78d1c39e54a67850f1c383e30e7` | +| scene-source / 1 | scenefx-timing.patch | `7a7ef1875b559f65a3240a0016592da1da6a8537929d0e96b8aaa2d20ecd46fa` | +| scene-source / 2 | scenefx-cache-trace.patch | `a0fd5a64156a79b1605ff3b52bd9accb20390199b2b36e1970389f5086b68f39` | +| mosaic-source / 0 | mosaic-popup-plus-base.patch | `d416f6413ea097a48a44d231e50ffba363914f46c8687f0ea2e4dcacd5f31fe9` | +| mosaic-source / 1 | hidden-guard.patch | `35785a8f3e863b3c1fd87932d8ff0c2949b03cb04382cc34e1126170968f802b` | +| mosaic-source / 2 | mosaic-output-timing.patch | `4419059231e038675f50a6321889f27ba981c5d8df2779ccbc4a61e02f1d6668` | +| mosaic-source / 3 | presentation-events.patch | `dbf1f1d11c9c741b641916d25ac22bcb13c3455ee3002e1f534aa6794cd8a538` | +| mosaic-source / 4 | sway-source-trace.patch | `b83ff12bf24ee879cc713a134b0c312e9b8bd1b4034ecc2aea124d55a743ebb7` | +| annotations | scenefx-comments.patch | `21f057ff4180bb5dd35af35070aa4a95923be83f81abb864793e5bfb93643b01` | +| annotations | mosaic-comments.patch | `7fee137101abc0cd5024cea172c5904268ddf995bc5855c570e4dfabd643c970` | + +| Identité | SHA256 | Build ID | +| --- | --- | --- | +| A annoté, utilisé C1/C2 et Mosaic D/E/F | `979dcd95ab43fa1e465d6e9d262485b73d186cedacd0f957059dd24f482ce6f4` | `fabfeb823754a0f5107f83eb077323ad17ddedd1` | +| G release-shape, smoke propre | `8063478b2d5948da3eb8b1a329978882dc1d045cf36932cc2145a78af20ba76a` | `83896fdb36f3fd21522becec0e8c5219e15f4b8e` | +| Contrôle pristine retenu | `8ac865481bc0487344210cd0e16d8e6c7655b29db887cd58ddc11b0ca22fe494` | `298a9626b331139ff2f081ade9c4efdde2d4fb19` | + +Paire locale : SceneFX 0.5.0 statique privé, wlroots 0.20.2 partagé, bibliothèque SHA256 `7edca9a7d65855addda68e29ba5db94d57c803eb5fa7d0f86db3136b90ca9837`. Tous les autres builds/paires sont NOT QUALIFIED. + +L’ancien D `616aa504334d88aada5b1596df624957f39b0f1ae975a1a04105fbf73aea6dd0` et l’ancien candidat C `f82557…` sont historiques. Aucun résultat de ces identités ne qualifie A ou G. Les patches cumulatifs annotés privés sont `candidate-cumulative.patch` (`8fea59b98907f5c57f841e624c53437d0fe886b56ccf80f472be8d08389b8ca0`) et `scenefx-cumulative.patch` (`7e1549d68d33945620690d26ee6b1a6cc2f3942e4000c9ac89d79a317f136302`) ; leurs hashes diffèrent volontairement des cumulatifs historiques non annotés. + +## Reproduction bornée + +Reconstituer les inputs vérifiés dans un nouveau LAB ; ne pas utiliser le checkout production comme pristine. Le point d’entrée source est `tooling/probes/step20c-overnight/replay_annotated.py LAB --historical HISTORICAL`, où HISTORICAL est le dossier privé `integration-candidate` retenu avec ses archives, patches et scripts (`/home/fy59/swayfx-mosaic-e2-completion-dk1hq9an/integration-candidate` dans cette campagne). Ce script initialise un nouveau registre, vérifie le rejeu et exécute les builds/stage ; son lancement n’est pas autorisé par ce rapport documentaire et ne doit jamais viser le LAB consommé. Les dépendances privées doivent être conservées et vérifiées avant une reproduction. Les commandes Meson ci-dessous décrivent celles du script, pas une voie permettant de contourner les réservations. Les scripts de fixture et leurs manifests décrivent le rejeu. Le registre réserve avant setup/build/stage, sans reset ni remboursement. Les commandes A effectivement enregistrées dans `raw/commands.jsonl` sont reproduites ci-dessous avec `LAB` désignant ce nouveau répertoire ; `PKG_CONFIG_PATH` reste limité à chaque processus. + +```sh +meson setup "$LAB/scene-build" "$LAB/scene-source" --prefix=/usr \ + -Ddefault_library=static -Dexamples=false -Dwerror=false +meson compile -C "$LAB/scene-build" -j 8 +PKG_CONFIG_PATH="$LAB/scene-build/meson-uninstalled" meson setup \ + "$LAB/mosaic-build" "$LAB/mosaic-source" --prefix=/usr --bindir=bin \ + -Dwerror=false -Dsd-bus-provider=libsystemd -Dmosaic-package=true \ + -Dswaybar=false -Dswaynag=false -Dman-pages=disabled -Ddefault-wallpaper=false +PKG_CONFIG_PATH="$LAB/scene-build/meson-uninstalled" meson compile -C "$LAB/mosaic-build" -j 8 +meson test -C "$LAB/mosaic-build" --no-rebuild mosaic-model --print-errorlogs +meson install -C "$LAB/mosaic-build" --no-rebuild --destdir "$LAB/stage-static" +``` + +Les notices sont ajoutées par simulation privée du futur paquet, puis le manifeste complet est audité. A : SceneFX C23, Mosaic C11 ; audit de layouts C17 `-Wall -Wextra -Werror`. Les 132 commandes A, leurs dates Unix, durées et codes sont conservées ; les dates UTC exactes des setups/compilations figurent dans la provenance compacte. Compilation SceneFX environ 0,90 s, Mosaic environ 7,81 s ; setup séparé. Les deux `git diff --no-index` code 1 produisent les patches privés, sans échec de compilation. Les commandes ultérieures `g-*` dans le même journal ne font pas partie des 132 commandes A. + +G : second build/stage autorisé, exécuté le 2026-10-14T00:35:52+02:00 avec les mêmes options et chemins `release-shape/`. Modèle 1/1, audit C17 et stage PASS. Sortie intégrale Meson/Ninja non conservée par l’adaptateur : les journaux/résultats/extraits existent, sans prétendre à un stdout complet. Les spans `.ninja_log` sont des timings internes et ne remplacent pas une durée murale. Un avertissement `LIBINPUT_CONFIG_SCROLL_CIRCULAR` dans `sway/ipc-json.c:1175` est conservé. + +## ELF et ABI locale + +A et G : ELF64 x86-64 PIE, aucune dépendance SceneFX DT_NEEDED, wlroots partagé attendu, RPATH/RUNPATH vides, `ldd -r` sans symbole indéfini, fonctions clip définies et appels directs inspectés. Comparaison locale de 17 structures et 6 offsets identique ; 121 headers wlroots épinglés ; 85 noms communs caractérisés, distincts des 34 bindings réellement observés par le loader diagnostique. Ni les 85 fournisseurs runtime universels ni l’ABI sémantique future, l’interposition générale ou la neutralité graphique ne sont démontrés. + +## Stage et notices + +Exactement cinq fichiers réguliers dans chacun des deux DESTDIR, binaire 0755 et notices 0644. Le manifeste A est ci-dessous ; G garde le même périmètre mais ses propres hashes, liés dans la provenance. Aucun système installé. + +| Chemin | Octets A | SHA256 A | +| --- | --- | --- | +| `/usr/bin/swayfx-mosaic` | 6760288 | `979dcd95ab43fa1e465d6e9d262485b73d186cedacd0f957059dd24f482ce6f4` | +| `/usr/share/licenses/swayfx-mosaic/INCORPORATED-NOTICES` | 255102 | `cf69048aad394c4d3e3dc875c1b9aae1922946af861fec18e337f0b45aacd7fb` | +| `/usr/share/licenses/swayfx-mosaic/SceneFX-LICENSE` | 1096 | `ffd3737a478b83a8b51b42757d3bf909ef36694508355879722e11fc1fa6736b` | +| `/usr/share/licenses/swayfx-mosaic/SwayFX-LICENSE` | 1061 | `bd35722bff46327f5eded1d211207277bbe043d2a22048b282c42ef801593b8b` | +| `/usr/share/licenses/swayfx-mosaic/wlroots-LICENSE` | 1140 | `35d427c043dcafe8893b9e7247348f599847c81d9a067703587c80707f3d58df` | + +L’inventaire A couvre conservativement 895 inputs, 599 headers, 12 shaders, 7 XML et 282 blocs de notice ; G 894 inputs, 598 headers, 12 shaders, 7 XML, 16 entrées générées et 282 blocs. `parent/package-input-verification.json` a vérifié les 895 hashes A et les cinq fichiers du stage sans mismatch. Ce sont des contributions potentielles de compilation, pas une preuve d’extraction exacte de chaque membre d’archive ni des branches préprocesseur réellement incorporées. Validation humaine juridique et distribution : PARTIAL / NOT QUALIFIED. + +`PKGBUILD.future` reste privé, SHA256 `50b098411d1234bc42f1abc748b312ce1be7ada8efe24be7d9ddb29481cba43d`. Syntaxe shell et Python du heredoc, sept inputs sources et allowlist vérifiés PASS. `makepkg --printsrcinfo`, `--verifysource`, build complet et installation : NOT RUN. Recette reproductible au sens d’un dossier d’inputs local contrôlé seulement ; aucune reproductibilité binaire publique ou distribution Arch validée. Le PKGBUILD réel, le patch production et la dépendance système restent inchangés. + +H propose surveillance, revue d’impact, rebuild/requalification de toute paire modifiée, notices, stage, décision séparée et rollback. Release maintainer et security reviewer non nommés ; aucun SLA. Voir [décision draft](STEP20C_PRODUCTION_INTEGRATION_DECISION_DRAFT.md). + +## Revue finale observée et publication préparée + +Revue indépendante finale ACCEPTED / audit PASS pour la fidélité du dossier expérimental : 0 BLOCKING, 4 NON_BLOCKING, 3 FUTURE_SCOPE ; 180 checks hors ligne et 15 mutations de preuves réelles rejetées. Rapport privé `reviews/overnight-final-review.md`, SHA256 `bb4000dffb51b07b59e86f91e8dd76bc2c4f0b9513b48a52c9f6bd6c8c3f45af` ; reçu JSON SHA256 `72ba252092ca3375d344faae1c2026c8d5626fd190e87771d5c0c1ad8212c9b0`. Index scientifique post-exécution `seals/index.json`, SHA256 `cdf034e1f8466a9ae8a0e0a33aa8d0d0195273f0d1bc782667b50c3bcf682505`, contexte de preuve courant, pas un binding pré-exécution. + +NB-01 est complété dans l’index compact depuis les grabs wire réels de chacun des huit runs concernés, avec lignes et hashes sources dans `parent/metadata-serial-completion.json`. Les stops fixtures, échecs E3 et incident IPC restent documentés. Les gates lifetime/génération/damage, couverture G, maintenance ABI/paquet/juridique et robustesse/coût des sidecars privés restent ouverts. L’acceptation documentaire ne qualifie pas la production et n’applique aucune décision. Publication préparée, pas encore exécutée à cette édition ; les refs/SHAs finaux et le résultat de publication feront foi dans le reçu privé et le handoff final. diff --git a/docs/design/STEP20C_LIFECYCLE_EFFECTS_AND_NATIVE_ORDERING.md b/docs/design/STEP20C_LIFECYCLE_EFFECTS_AND_NATIVE_ORDERING.md new file mode 100644 index 0000000..311fb4e --- /dev/null +++ b/docs/design/STEP20C_LIFECYCLE_EFFECTS_AND_NATIVE_ORDERING.md @@ -0,0 +1,63 @@ +# STEP20C — lifecycle, effets et ordre natif + +> EXPERIMENTAL — édition documentaire du 2026-10-14, après revue finale ACCEPTED / audit PASS du dossier expérimental ; publication préparée, non exécutée à cette édition. Les résultats concernent des laboratoires privés ; aucune intégration production, installation ou décision UX. STEP20A DONE ; STEP20B EXPERIMENTAL ; STEP20C NEXT ; STEP20D–G PLANNED. Multi-output de production : NOT YET SUPPORTED. Les anciens rapports restent historiques et leurs résultats ne se transfèrent pas à un nouveau SHA. + +L’autorité brute est le LAB privé `/home/fy59/swayfx-mosaic-overnight-mcolx0gq`. Les chemins LAB ci-dessous sont des références locales de preuve, pas des fichiers distribués. Les sources de fixture préservées se trouvent dans [tooling/probes/step20c-overnight](../../tooling/probes/step20c-overnight/qualification/README.md). La [provenance compacte](../../tooling/probes/step20c-overnight/qualification/provenance.json) lie les identités et reçus sans publier logs, images, binaires, archives ou patches candidats. + +## E1 — owner caché et retour + +Même chaîne TOPLEVEL→A→B, mêmes identités et grabs ; hide donne clip root vide et pixels A/B nuls, puis le retour conserve la hiérarchie sans recreation et restaure l’entrée B réelle. Les fenêtres hide/return sont rejouées, H2 RGB exact. Une motion sans enter pendant hide est observée ; elle ne prouve pas tous les hits possibles. Mesures PASS, runtime INCONCLUSIVE, cleanup PASS. Aucun UX hide/dismiss/reposition final ni click-through universel décidé. + +## E2 — saved buffers non exercés + +Configure29 puis30 ACKés et `hold_next_configure` armé sont réels ; aucun configure ultérieur ni HELD, deux PNG de référence seulement. Source A `sway/commands/gaps.c` : `gaps inner 30` avec argc2 appelle `gaps_set_defaults`, modifie la config sans arranger le workspace courant ; la branche runtime demande quatre arguments. Le succès IPC n’est pas un configure mesuré. Saved-node identity/render, timeout effectif et lifetime : NOT EXERCISED / NOT PROVEN ; runtime INCONCLUSIVE. Aucun timeout artificiellement prolongé ni rerun. + +L’audit source décrit `view_save_buffer` : arbre saved frère de content_tree, destination/source/transform copiés, buffer courant locké via SceneFX set_buffer ; suppression détruit l’arbre et réactive le contenu. Cela reste SOURCE AUDIT ONLY sur A, pas une observation runtime des identités saved/locks/releases. Les anciens SB/BI/ASI/HIT instruments et résultats appartiennent à d’autres binaires et ne sont pas incorporés ici. + +## E3 — effets et cache : résultat partiel + +Deux tentatives,16 PNG chacune. A/B modifie226908 pixels pristine et182214 Mosaic. Whole-H1 A/A-return reste différent de33883 pixels pristine (bbox402,25–798,598) et32132 Mosaic (bbox482,25–800,598). Le critère de restauration entière échoue réellement dans les deux contrôles ; aucune causalité propre à Mosaic n’est établie. La ROI centrale64×64 change ses4096 pixels A→B puis retrouve exactement A ; quatre ROI adjacentes retrouvent A. Fraîcheur RGB échantillonnée positive, restauration full/cache/damage complet NON démontrée. + +Native Mosaic observe régénération naturelle réussie et optimized=1 USE d’un buffer non nul. Sept états H2 Mosaic restent identiques à la référence. Shadow-on ne change aucun pixel H1, mais déborde sur21598 pixels H2 pristine (bbox0,0–36,600) ; H2 Mosaic reste exact. Les captures classic-floating off/on sont entièrement égales, ROI268,268–332,332 et métrique adjacente0→0 : filtration classic NOT EXERCISED. Classic tiled Mosaic NOT TESTED et optimized tiled spill standard non exercé par ce glass intérieur. + +Les deux runs s’arrêtent avant effects-evidence et fermeture normale/final capture ; glass/background code1/error32 après teardown. Cleanup scientifique FAIL malgré tous les PID reapés et runtime supprimé sans rescue. Ne pas transformer l’absence de résidu en fermeture normale réussie. Verdict PARTIAL_RGB_FRESHNESS_WHOLE_RESTORATION_FAIL_INCONCLUSIVE. + +## F — état appliqué, entrée et ordre natif + +Pristine : trois clics/commits region réels, owner ne reçoit pas de bouton lorsque region vide, restauration mesurée ;8 PNG, verdict INCONCLUSIVE et aucune PI privée native dans ce contrôle non modifié. + +Mosaic : input full→empty→full observé, trois clics,4 PNG, deux livraisons owner autour de l’état vide. Assertion échoue parce qu’elle conserve l’origine initiale(-318,25) pour le clic(-314,30), attend(4,5), alors que l’origine appliquée après restauration est(-638,25), cohérente avec motion wire(324,5) et bouton45/46. Aucun défaut de routing n’en découle ; focus/resize/layout/close suivants NOT EXERCISED. Runtime INCONCLUSIVE, cleanup PASS. + +Les12 premiers couples output/commit_seq natifs analysés sur57 commits bruts ont10 PAIRED et2 MISSING_PRESENT : seq2 H1 et H2. Les45 autres commits restent dans le brut sans être transformés en preuve de pairing. Un event headless present `presented=1` ne démontre pas les pixels du buffer ni une présentation physique. Il serait incorrect de dire12/12 presents ou lifetime qualifié. + +Source wlroots : incrément commit_seq et signal commit synchrone, present headless différé idle, idle annulé au destroy. Source instrumentation : PI_SCENE/OWNER/POPUP échantillonne la scène appliquée dans le callback output commit, PI_POPUP sans owner-ID natif. Les flux séparés ne forment pas une génération atomique. + +| Contrat demandé | État réel | +| --- | --- | +| Géométrie/clip/input observés dans les fenêtres documentées | Échantillonnés, cohérents pour les mesures citées | +| Mutation naturelle commit→input change→present discriminante | NOT EXERCISED | +| Epoch/génération atomique transactions/scène/hit/present | NOT PROVEN | +| Buffer exact présenté et identité native hit | NOT PROVEN | +| Locks/références/releases GPU, saved, teardown exhaustifs | NOT PROVEN | +| Damage complet de toutes frames et stale pixels intermédiaires | NOT PROVEN | +| Damage minimal | NOT PROVEN | + +TEMPORAL_DAMAGE donne temps monotoniques/extents, distincts des captures. Des extents échantillonnés ne prouvent ni toutes frames ni tous pixels ; pas de nouvelle conclusion d’atomicité ou damage-to-present. Aucun GPU readback ajouté à A/G. + +## G et neutralité de l’instrumentation + +Le patch privé `release-shape/release-removal.patch` (`6e8a5b50149732ac70ecd79ab8db9258956f59036aba1bf17a477866bc44a5c1`) retire26 statements de log dans7 fichiers et les helpers démontrés orphelins de trace ; hashes parents/résultats et bindings de revue vérifiés. Les patches fonctionnels clip/owner guard restent. PI listeners et ordre FBO bind avant le chemin d’échec restent : cet ordre peut avoir un effet non passif et sa neutralité n’est pas prouvée. « Sans instrumentation » serait faux. + +G a un build/stage et un smoke horizontal propres, SMOKE_FEASIBLE ; aucune qualification complète de son lifecycle/effets ni équivalence générale trace-off/on héritée. Un nouveau SHA nécessitera contrôles et matrice appropriés. + +## Validation et limites de provenance + +Revue lifecycle/G :32 checks hors ligne sur vrais logs/PNG plus négatifs parent/grab/root/owner/input stale/present/RGB ; archive exécutée v2 exacte578 entrées. Revue premiers D :14 négatifs ; C :7 mutations de preuves ; R90 v3 :9 négatifs. Les échecs initiaux d’extraction/analyse et corrections hors ligne sont conservés, sans réexécution graphique. Les preuves sont `reviews/matrix-lifecycle-runtime-review.{md,json}`, `matrix-lifecycle-analysis.json` et `parent/native-source-audit.json` dans le LAB. + +Tous les runtimes matrix ont terminal IPC1 conservé ; le chemin individuel de runtime matrix n’a pas été journalisé. `runtime_removed=true`, tous PID absents et audit parent de résidus sont observés ; suppression de chaque ancien chemin nommé n’est pas indépendamment revérifiable. La clôture parent vérifie absence de PID/socket privés. Le hash SceneFX système initial n’a pas été enregistré ; hash final seul et ctime antérieure ne doivent pas être décrits comme une comparaison initial/final. Aucun usage IPC de session desktop ni installation système. + +## Revue finale observée et publication préparée + +Revue indépendante finale ACCEPTED / audit PASS pour la fidélité du dossier expérimental : 0 BLOCKING, 4 NON_BLOCKING, 3 FUTURE_SCOPE ; 180 checks hors ligne et 15 mutations de preuves réelles rejetées. Rapport privé `reviews/overnight-final-review.md`, SHA256 `bb4000dffb51b07b59e86f91e8dd76bc2c4f0b9513b48a52c9f6bd6c8c3f45af` ; reçu JSON SHA256 `72ba252092ca3375d344faae1c2026c8d5626fd190e87771d5c0c1ad8212c9b0`. Index scientifique post-exécution `seals/index.json`, SHA256 `cdf034e1f8466a9ae8a0e0a33aa8d0d0195273f0d1bc782667b50c3bcf682505`, contexte de preuve courant, pas un binding pré-exécution. + +NB-01 est complété dans l’index compact depuis les grabs wire réels de chacun des huit runs concernés, avec lignes et hashes sources dans `parent/metadata-serial-completion.json`. Les stops fixtures, échecs E3 et incident IPC restent documentés. Les gates lifetime/génération/damage, couverture G, maintenance ABI/paquet/juridique et robustesse/coût des sidecars privés restent ouverts. L’acceptation documentaire ne qualifie pas la production et n’applique aucune décision. Publication préparée, pas encore exécutée à cette édition ; les refs/SHAs finaux et le résultat de publication feront foi dans le reçu privé et le handoff final. diff --git a/docs/design/STEP20C_OVERNIGHT_QUALIFICATION_AND_INTEGRATION_GATE_V1.md b/docs/design/STEP20C_OVERNIGHT_QUALIFICATION_AND_INTEGRATION_GATE_V1.md new file mode 100644 index 0000000..6581efd --- /dev/null +++ b/docs/design/STEP20C_OVERNIGHT_QUALIFICATION_AND_INTEGRATION_GATE_V1.md @@ -0,0 +1,72 @@ +# SWAYFX_MOSAIC_STEP20C_OVERNIGHT_QUALIFICATION_AND_INTEGRATION_GATE_V1 + +> EXPERIMENTAL — édition documentaire du 2026-10-14, après revue finale ACCEPTED / audit PASS du dossier expérimental ; publication préparée, non exécutée à cette édition. Les résultats concernent des laboratoires privés ; aucune intégration production, installation ou décision UX. STEP20A DONE ; STEP20B EXPERIMENTAL ; STEP20C NEXT ; STEP20D–G PLANNED. Multi-output de production : NOT YET SUPPORTED. Les anciens rapports restent historiques et leurs résultats ne se transfèrent pas à un nouveau SHA. + +L’autorité brute est le LAB privé `/home/fy59/swayfx-mosaic-overnight-mcolx0gq`. Les chemins LAB ci-dessous sont des références locales de preuve, pas des fichiers distribués. Les sources de fixture préservées se trouvent dans [tooling/probes/step20c-overnight](../../tooling/probes/step20c-overnight/qualification/README.md). La [provenance compacte](../../tooling/probes/step20c-overnight/qualification/provenance.json) lie les identités et reçus sans publier logs, images, binaires, archives ou patches candidats. + +## Bilan proposé + +Ticket exact : **SWAYFX_MOSAIC_STEP20C_OVERNIGHT_QUALIFICATION_AND_INTEGRATION_GATE_V1**. État global proposé **PARTIALLY_ADVANCED**, sous réserve de publication observée, recommandation **PRIVATE_CANDIDATE_NEEDS_TARGETED_EVIDENCE** ; jamais PRODUCTION_READY. Aucun gate production fermé par ce ticket. Le budget est clos après18 tentatives uniques et196 captures, sans retry. A et G ont chacun build/stage propres ; les mesures positives et les limites ci-dessous restent simultanément vraies. + +## Phases A–J et verdicts structurés + +| Phase | Verdict enregistré | Preuve / limite | +| --- | --- | --- | +| A replay annoté | PASS | Pins archives pax,8 patches +2 commentaires,4 fichiers tokens équivalents ; nouveau SHA propre | +| A build/model/ELF | PASS local | SceneFX statique/Mosaic, modèle1/1, ELF/relocations/layouts ; ABI future non établie | +| A stage | STATIC_STAGE_WITH_LICENSES=PASS |5 fichiers exacts, DESTDIR privé ; legal PARTIAL | +| B préflight | PASS | Contrôles fixture/identité/budget prélaunch revus ; erreurs préflight corrigées hors ligne avant les runs concernés | +| C horizontal | FEASIBLE sampled |3 runs pristine/annotated-standard/Mosaic→standard ; preuve A propre | +| D géométries | PARTIALLY_FEASIBLE |D1/D3/D4 mesures positives, D2-Mosaic INCONCLUSIVE association fixture ; runtime tous INCONCLUSIVE | +| E1 hide/return | SAMPLED_MEASUREMENTS_PASS_RUNTIME_INCONCLUSIVE |Même hiérarchie, clips/pixels/input échantillonnés | +| E2 saved | NOT_EXERCISED_INCONCLUSIVE |Trigger defaults n’arrange pas courant, aucun configure HELD | +| E3 effets/cache | PARTIAL_RGB_FRESHNESS_WHOLE_RESTORATION_FAIL_INCONCLUSIVE |ROI A/B/A fraîche ; full-H1 return échoue dans les deux contrôles ; cleanup clients FAIL | +| F ordre/input | SAMPLED_INPUT_WITH_CEILINGS_INCONCLUSIVE |Assertion geometry stale, atomic/ref/release NOT PROVEN,10/12 pairs initiaux présents | +| G retrait/build | PASS local / BUILDABLE |26 logs/7 fichiers, revue delta exact ; PI/FBO ordering restent | +| G smoke | SMOKE_FEASIBLE |17 PNG, preuve G propre horizontale ; runtime PASS selon politique C/G avec IPC1 conservé | +| H package/maintenance | PARTIALLY_FEASIBLE |Recette syntaxe/inputs PASS, makepkg NOT RUN, notices/legal PARTIAL, nominations absentes | +| I décision intégration | DRAFT / PRIVATE_CANDIDATE_NEEDS_TARGETED_EVIDENCE |22 réponses ; aucune décision appliquée | +| J docs/revue/publication | Revue finale ACCEPTED / audit PASS ; publication préparée, non exécutée |0 BLOCKING, 4 NON_BLOCKING, 3 FUTURE_SCOPE ; aucun commit/push revendiqué à cette édition | + +## Évidence et discipline + +[Reconstruction annotée](STEP20C_ANNOTATED_REBUILD_AND_PRIVATE_STAGE.md), [matrice graphique](STEP20C_ANNOTATED_GRAPHICS_MATRIX.md), [lifecycle/effets/native ordering](STEP20C_LIFECYCLE_EFFECTS_AND_NATIVE_ORDERING.md) et [22 réponses de décision](STEP20C_PRODUCTION_INTEGRATION_DECISION_DRAFT.md) sont les rapports de cette tranche. Ils ne réécrivent pas les freezes historiques. Provenance compacte liée dans leur en-tête ; source fixtures seulement, sans artefacts générés. + +Préflight corrigé avant lancement : C inverse déco16 tests ; matrix association owner/root/temps et préservation transport33 tests ; R90 v3 association host38 tests ; G-SMOKE01/02 compteurs offline9 tests. Ledger5 tests avec rejets/concurrence ; revue runtime C7 mutations, premiers D14 négatifs, lifecycle32 checks, R90 runtime9 négatifs. Tous diagnostics initiaux et refus sont conservés. Correction offline de validateurs ne constitue pas un retry compositor. La revue source G et le smoke ont leur propre acceptation/gel. + +Budget final : SceneFX2/2, Mosaic2/2, stages2/2, runs18/18, captures196/220 ; C3,D1–D4 chacun2,E1=1,E2=1,E3=2,F=2,G=1. Registre flock/atomique/fsync,18 tokens consommés une fois, aucun remboursement/reset.4 PNG marqueurs inputs séparés donnent200 nouvelles images ;78 assets upstream copiés ne sont pas des captures. Hash ledger `6ebedc65f30bf2c81f45b1487adf974a390a0049f632cfbb18bbbb00e3bfae3f`. + +## Risques et critères de sortie proposés + +Ce tableau est un registre de risques, pas une politique adoptée. P0 : aucun défaut bloquant confirmé dans l’échantillon. P1 : preuve essentielle avant intégration selon périmètre retenu ; P2 : maintenance/instrumentation/notice et décisions humaines ; P3 : couverture future hors tranche. Factuel ou hypothétique est indiqué. Tous environnements mesurés sont privés headless FX/GLES AMD780M et paire exacte A/G ; extrapolation interdite. + +| ID / sévérité | Fait ou hypothèse / source / reproduction | Contrat affecté et travail minimal | Acceptation proposée / dépendance / humain | +| --- | --- | --- | --- | +| R-P0-01 / P0 |Aucun clip/input bloquant confirmé C/D1/D3/E1/G ; hypothèse de défaut ailleurs non testée ; replay PNG/wire |Ne pas conclure absence universelle ; conserver scope exact |Aucun P0 ouvert confirmé ; revue scientifique requise si nouvelle preuve | +| R-LIFE-01 / P1 |Refs/releases GPU/saved non observées ; source audit F-SOURCE-02/07 et E2 non exercé |Ownership/lifetime : fixture configure runtime attesté puis identités natives locks/releases/teardown |Protocole et critères lifetime avant nouveau budget ; dépend revue source/ABI ; reviewer humain | +| R-TXN-01 / P1 |F full→empty→full ;12 couples initiaux10 PAIRED/2 missing,57 commits ; fenêtre discriminante absente |État appliqué render/input/present : mesure native discriminante, sans forcer calendrier pour fabriquer PASS |Preuve d’identité et cohérence de génération selon contrat accepté ; dépend instrumentation/lifetime ; décision architecture | +| R-DAMAGE-01 / P1 |E3 full-H1 return33883 pristine/32132 Mosaic différences, ROI exact ; causalité ouverte |Damage/stale pixels : contrôle comparable et diagnostic fenêtres/effets, all-frame scope explicite |Critères full-frame/frames intermédiaires pertinents satisfaits, sans masque opportuniste ; dépend effets/txn ; revue scientifique | +| R-FIX-01 / P1 |D2 root ambiguity, E2 defaults, F rect stale ; sources/review raw reproductibles offline |Fixtures : owner-derived association, configure runtime attesté, geometry de la fenêtre appliquée |Nouveaux freezes/négatifs acceptés avant première exécution autorisée ; pas de retry du ticket ; reviewer | +| R-G-01 / P1 |G horizontal smoke seul, matrice étendue NOT TESTED |Qualification exact SHA G : relevant matrix complète et contrôles propres |Aucun héritage A ; dépend risque FBO/fixtures ; gate humain | +| R-ABI-01 / P2 |17 structs/6 offsets/121 headers/85 overlaps/34 bindings locaux, aucune ABI future |Paire épinglée ; audit headers/layout/providers/rebuild à chaque build pertinent |Nouvelle paire entièrement requalifiée ; dépend mainteneur/reviewer sécurité nommés | +| R-INST-01 / P2 |G retire26 logs mais PI listeners/FBO bind-before-failed conservés ; neutralité hypothétique |Auditer effets de callbacks/binds, comparer contrôles adéquats |Neutralité pertinente démontrée sans comparer des états non homologues ; dépend R-G/ABI ; reviewer | +| R-LIC-01 / P2 |895/894 inputs conservateurs, exact incorporation/legal PARTIAL |Textes/shaders/protocols/contributions conditionnelles et extraction archive |Inventaire incorporation et notices suffisantes examinés humainement avant distribution ; dépend package complet/release | +| R-PKG-01 / P2 |PKGBUILD.future syntaxe/inputs PASS, makepkg NOT RUN |Build paquet isolé, manifeste exact5 fichiers notices justifiées, coexistence |Validation intégrale source/package/stage et choix publication distinct ; dépend R-LIC/ABI ; release maintainer | +| R-ROLE-01 / P2 |Aucun release/security nominee/SLA ; H proposition privée |Veille/impact/rebuild/requalification/notices et décision release |Nominations humaines avant public distribution ; aucun SLA inventé | +| R-UX-01 / P2 |Hide/dismiss/reposition/click-through ouverts ; routing mesuré seulement |Décision UX explicite avant comportement shipped ; contracts first |Acceptation utilisateur puis docs UX/architecture pertinentes ; pas de changement ici | +| R-TRANSPORT-01 / P2 |IPC exit1 tous runs ; C/G runtime PASS policy, matrix INCONCLUSIVE |Conserver incident et distinguer fermeture process/réponse transport |Cause NOT PROVEN ; protocole futur doit documenter ce critère, sans silent upgrade ; reviewer | +| R-FUTURE-01 / P3 |Sorties physiques/backends autres, matrices exhaustives/future pairs NOT TESTED |Qualification au besoin, pas extension générale du fork |Scope et budget séparés ; STEP20D–G restent PLANNED ; décision utilisateur | + +## État du dépôt et publication + +HEAD initial `4ef16a40192149d353831695fd7dcaeb594fdf01`, branche main ; le répertoire source-only overnight était non suivi avant cette mise à jour. Sept fichiers protégés comparés avant/après identiques dans `parent/protected-integrity-before-publication.json`. Production, UX, Packaging, AGENTS, PKGBUILD, patch cumulatif et fixtures historiques préservés. Aucun stage Git/commit/push par l’auteur documentaire. + +Audit parent `cleanup-after-graphs.json` : aucun PID/socket privé restant ; runtimes supprimés selon cleanup exécuté, chemins matrix individuels non consignés. Aucun live IPC, installation ou remplacement système. SceneFX système initial SHA non enregistré ; le SHA final ne permet pas une égalité initial/final inventée. + +Revue finale indépendante ACCEPTED / audit PASS pour le dossier expérimental. Publication origin/github préparée, non exécutée à cette édition ; le reçu privé et le handoff final porteront le résultat réel et les SHAs finaux, sans autoréférence au futur hash de commit. La publication documentaire ne transforme pas la recommandation en décision production. Prochaine petite étape justifiée : validation du delta documentaire final et publication autorisée, puis gates ciblés dans une nouvelle tranche avant toute intégration. + +## Revue finale observée et publication préparée + +Revue indépendante finale ACCEPTED / audit PASS pour la fidélité du dossier expérimental : 0 BLOCKING, 4 NON_BLOCKING, 3 FUTURE_SCOPE ; 180 checks hors ligne et 15 mutations de preuves réelles rejetées. Rapport privé `reviews/overnight-final-review.md`, SHA256 `bb4000dffb51b07b59e86f91e8dd76bc2c4f0b9513b48a52c9f6bd6c8c3f45af` ; reçu JSON SHA256 `72ba252092ca3375d344faae1c2026c8d5626fd190e87771d5c0c1ad8212c9b0`. Index scientifique post-exécution `seals/index.json`, SHA256 `cdf034e1f8466a9ae8a0e0a33aa8d0d0195273f0d1bc782667b50c3bcf682505`, contexte de preuve courant, pas un binding pré-exécution. + +NB-01 est complété dans l’index compact depuis les grabs wire réels de chacun des huit runs concernés, avec lignes et hashes sources dans `parent/metadata-serial-completion.json`. Les stops fixtures, échecs E3 et incident IPC restent documentés. Les gates lifetime/génération/damage, couverture G, maintenance ABI/paquet/juridique et robustesse/coût des sidecars privés restent ouverts. L’acceptation documentaire ne qualifie pas la production et n’applique aucune décision. Publication préparée, pas encore exécutée à cette édition ; les refs/SHAs finaux et le résultat de publication feront foi dans le reçu privé et le handoff final. diff --git a/docs/design/STEP20C_PRODUCTION_INTEGRATION_DECISION_DRAFT.md b/docs/design/STEP20C_PRODUCTION_INTEGRATION_DECISION_DRAFT.md new file mode 100644 index 0000000..f7fd410 --- /dev/null +++ b/docs/design/STEP20C_PRODUCTION_INTEGRATION_DECISION_DRAFT.md @@ -0,0 +1,109 @@ +# STEP20C — décision d’intégration production, draft + +> EXPERIMENTAL — édition documentaire du 2026-10-14, après revue finale ACCEPTED / audit PASS du dossier expérimental ; publication préparée, non exécutée à cette édition. Les résultats concernent des laboratoires privés ; aucune intégration production, installation ou décision UX. STEP20A DONE ; STEP20B EXPERIMENTAL ; STEP20C NEXT ; STEP20D–G PLANNED. Multi-output de production : NOT YET SUPPORTED. Les anciens rapports restent historiques et leurs résultats ne se transfèrent pas à un nouveau SHA. + +L’autorité brute est le LAB privé `/home/fy59/swayfx-mosaic-overnight-mcolx0gq`. Les chemins LAB ci-dessous sont des références locales de preuve, pas des fichiers distribués. Les sources de fixture préservées se trouvent dans [tooling/probes/step20c-overnight](../../tooling/probes/step20c-overnight/qualification/README.md). La [provenance compacte](../../tooling/probes/step20c-overnight/qualification/provenance.json) lie les identités et reçus sans publier logs, images, binaires, archives ou patches candidats. + +## Recommandation soumise, non appliquée + +**PRIVATE_CANDIDATE_NEEDS_TARGETED_EVIDENCE**. L’état global proposé est PARTIALLY_ADVANCED, sous réserve de publication observée, jamais PRODUCTION_READY. Aucun défaut P0 clip/input confirmé dans le scope mesuré, mais les gates lifetime, damage/transactions, effets, ABI-maintenance, packaging/notices et politique humaine restent ouverts. L’issue globale scientifique est PARTIALLY_ADVANCED ; ce draft ne décide pas une intégration et n’autorise ni distribution ni STEP20D. + +Les réponses sont liées aux [matrices exactes](STEP20C_ANNOTATED_GRAPHICS_MATRIX.md), au [build/stage](STEP20C_ANNOTATED_REBUILD_AND_PRIVATE_STAGE.md) et aux [limites lifecycle](STEP20C_LIFECYCLE_EFFECTS_AND_NATIVE_ORDERING.md). Elles distinguent preuve locale et contrat futur. + +## 1. Le nouveau binaire annoté est-il réellement qualifié? + +A est qualifié localement pour source/build/model/ELF/stage et possède ses propres mesures graphiques C/D/E/F. FEASIBLE pour C horizontal ; PARTIALLY_FEASIBLE globalement. Ni qualification production complète ni READY. + +## 2. Quelles matrices ont été exercées? + +18 runs uniques : C0/C1/C2 horizontal négatif ; D1 vertical pair ; D2 scale1,25 pair ; D3 R90/1,25 pair ; D4 resize/migration pair ; E1 hide/return ; E2 saved trigger ; E3 effets/cache pair ; F regions/ordering pair ; G smoke. Les limites et actions non exercées restent explicites dans la matrice. + +## 3. Quels contrôles pristine sont disponibles? + +C0 et D1/D2/D3/D4/E3/F pristine réellement exécutés sur le SHA retenu. C0/C1 full RGB égal aux huit états homologues ; D2/D3 markers et spill/input ordinary effectifs. Pristine F non modifié ne porte aucune PI privée. Ces contrôles ne qualifient pas un autre SHA. + +## 4. Quels résultats restent partiels? + +D2-Mosaic association root ambiguë avant input/final ; E2 saved NOT EXERCISED ; E3 full-H1 return FAIL dans les deux contrôles, classic NOT EXERCISED ; F géométrie fixture périmée et suite non exercée ; G horizontal smoke seul ; ABI future/notices/legal/package complets non qualifiés. + +## 5. Existe-t-il un défaut bloquant de clipping ou d’input? + +Aucun défaut bloquant démontré dans les fenêtres échantillonnées C/D1/D3/D4/E1/G. D2/F stops sont expliqués par le fixture, sans PASS rétroactif. Cela ne prouve pas l’absence universelle de défaut. + +## 6. Existe-t-il un risque de lifetime non résolu? + +Oui : identité native buffers, locks/références/releases GPU/saved, teardown exhaustif et scénarios de commit rejeté ne sont pas prouvés. Cleanup PID propre est une preuve de processus, pas de lifetime GPU. G garde FBO bind-before-failed potentiellement non passif. + +## 7. Quel est l’état réel du damage? + +Échantillons et traces extents conservés, H2 exact dans les états citées ; whole-H1 A-return effets échoue dans les deux contrôles. Damage exhaustif, minimal, stale pixels intermédiaires et contenu exact présenté NOT PROVEN. + +## 8. Quelle est la portée des preuves de transactions? + +Source applied clip et callbacks échantillonnés, regions full/empty/full observées. Sur12 couples initiaux F,10 PAIRED/2 MISSING_PRESENT ;57 commits bruts. Pas d’epoch atomique ni de fenêtre naturelle discriminante ni d’identité pixels/hit/present complète. + +## 9. Le candidat release-shape existe-t-il? + +Oui, G privé source/build/stage exact existe, SHA8063478b2d5948da3eb8b1a329978882dc1d045cf36932cc2145a78af20ba76a, build ID83896fdb36f3fd21522becec0e8c5219e15f4b8e. Aucun candidat binaire/package public distribué. + +## 10. Son comportement est-il testé ou seulement compilé? + +G est buildable et possède un smoke propre17 PNG/8 clics/4 grabs/retour splith, indépendamment revu. SMOKE_FEASIBLE horizontal seulement ; matrice G étendue et neutralité complète NOT TESTED/NOT PROVEN. + +## 11. Quels patches fonctionnels doivent être conservés? + +Dans le candidat privé : subtree clip SceneFX, clip owner-derived popup, guard owner totalement caché et delta natif Mosaic. Les commentaires token-equivalent sont acceptés. Une extraction de production exige encore revue exacte source/ownership/lifetime et décision, sans appliquer ces patches maintenant. + +## 12. Quels patches de trace peuvent être retirés? + +Seulement le retrait privé G déjà revu :26 logs/7 fichiers et helpers réellement orphelins. Timing/cache/PI ne se retirent pas en bloc sans audit ; PI listeners et FBO bind ordering restent. Aucun patch de production réécrit. + +## 13. Quelle ABI SceneFX est réellement qualifiée? + +SceneFX0.5 statique exact local, ELF appels clip directs,17 structs/6 offsets/85 overlaps/34 diagnostic bindings. Pas une ABI externe stable, ni tous providers runtime, ni une ABI future ou full semantic safety. + +## 14. Quelle paire wlroots est réellement qualifiée? + +Paire locale SceneFX37ccd723bef49e6891156ffafce8f549f01446cc + wlroots0.20.2 d783533489e1f75d6886c2ab5c5960090ef268f8, libSHA7edca9a7d65855addda68e29ba5db94d57c803eb5fa7d0f86db3136b90ca9837 et121 headers épinglés. Tous autres builds/paires NOT QUALIFIED ; changement implique rebuild/requalification. + +## 15. La future recette Arch est-elle reproductible? + +Inputs privés hashés, syntaxe shell/Python et sources PASS ; makepkg metadata/source verification/build NOT RUN. Pas de reproductibilité binaire bit à bit ni de paquet distribution publique validé. PKGBUILD.future ne modifie pas PKGBUILD réel. + +## 16. Quels textes de licence restent à valider? + +Les quatre fichiers stage incluent LICENSE SceneFX/SwayFX/wlroots et INCORPORATED-NOTICES. Inventaires895 A/894 G conservateurs ; incorporation exacte, extraction archives et contributions conditionnelles puis suffisance juridique nécessitent validation humaine. Aucun legal PASS. + +## 17. Qui devra assurer les releases et la sécurité? + +Responsabilité projet pour SceneFX embarqué déjà approuvée dans le périmètre privé ; release maintainer et security reviewer doivent être désignés avant distribution. Aucun nom ni SLA inventé. Veille, impact, rebuild, tests, notices et publication documentés comme procédure proposée. + +## 18. Quelle politique popup UX reste à décider? + +Hide/dismiss/reposition de popup offscreen et comportement sous grab/click-through restent ouverts. Les observations de routing ne fixent pas une politique universelle. Aucun changement UX dans cette tranche. + +## 19. Quelles corrections sont nécessaires avant une intégration dans main? + +Nouveau fixture ciblé saved provoquant configure runtime attesté, diagnostic full-H1 effets avec contrôles, assertion input liée à géométrie appliquée, mesure lifetime/native refs/releases/temporal discriminante et neutralité G/FBO. Chaque gate pertinent doit avoir critères acceptés et nouvelle autorisation/budget ; aucun rerun dans le budget clos. Puis politiques humaines ABI/notices/release/security/UX, contrats canoniques avant code. + +## 20. Quelle est la plus petite tranche de production envisageable après décision utilisateur? + +Après décision humaine et gates pertinents clos seulement : clip natif optionnel dans workspace Sway ordinaire, Row0 empruntant workspace->tiling, owner popup clip et hidden-owner guard revus, restauration standard locale préservée. Contrats Architecture/UX/Packaging/Upstream/Development d’abord, puis petit delta revu/testé. Aucun STEP20D, ligne runtime additionnelle, animation ou taille finale ; aucune implementation ici. + +## 21. Quels tests doivent impérativement être refaits après une intégration? + +Nouveau exact SHA : compile/model/headless IPC et standard pristine, export cumulatif forward apply/source-equivalence/checksum, ELF/header/layout/providers/relocations, manifests stage/notices et package complet, toute matrice graphique C/D/E/F pertinente et smoke propre G, input/popups/grabs/retour standard, geometry scale/rotation/migration, saved/effects/damage/lifetime. Pas d’héritage automatique du LAB. + +## 22. Quel plan de rollback protège SwayFX standard? + +Proposition future : conserver package SwayFX et /usr/bin/sway indépendants, sélectionner sa session existante après quitter la candidate ; retirer seulement fichiers appartenant à Mosaic vérifiés. Aucun provides/conflicts/replaces, système lib/config/dotfiles remplacé. Déploiement et rollback nécessitent décision distincte, jamais exécutés ici. + +## Conditions de décision + +Ce dossier apporte un candidat et des preuves reviewables. La revue finale indépendante est ACCEPTED / audit PASS pour la fidélité de l’évidence expérimentale, sans adoption production. Publication documentaire préparée, non exécutée à cette édition. Publication des docs/fixtures et adoption en production sont des actes distincts ; le résultat réel et les SHAs finaux origin/github feront foi dans le reçu privé et le handoff final, sans faux hash futur dans ce draft. + +## Revue finale observée et publication préparée + +Revue indépendante finale ACCEPTED / audit PASS pour la fidélité du dossier expérimental : 0 BLOCKING, 4 NON_BLOCKING, 3 FUTURE_SCOPE ; 180 checks hors ligne et 15 mutations de preuves réelles rejetées. Rapport privé `reviews/overnight-final-review.md`, SHA256 `bb4000dffb51b07b59e86f91e8dd76bc2c4f0b9513b48a52c9f6bd6c8c3f45af` ; reçu JSON SHA256 `72ba252092ca3375d344faae1c2026c8d5626fd190e87771d5c0c1ad8212c9b0`. Index scientifique post-exécution `seals/index.json`, SHA256 `cdf034e1f8466a9ae8a0e0a33aa8d0d0195273f0d1bc782667b50c3bcf682505`, contexte de preuve courant, pas un binding pré-exécution. + +NB-01 est complété dans l’index compact depuis les grabs wire réels de chacun des huit runs concernés, avec lignes et hashes sources dans `parent/metadata-serial-completion.json`. Les stops fixtures, échecs E3 et incident IPC restent documentés. Les gates lifetime/génération/damage, couverture G, maintenance ABI/paquet/juridique et robustesse/coût des sidecars privés restent ouverts. L’acceptation documentaire ne qualifie pas la production et n’applique aucune décision. Publication préparée, pas encore exécutée à cette édition ; les refs/SHAs finaux et le résultat de publication feront foi dans le reçu privé et le handoff final. diff --git a/tooling/probes/step20c-overnight/HORIZONTAL.md b/tooling/probes/step20c-overnight/HORIZONTAL.md new file mode 100644 index 0000000..81879b9 --- /dev/null +++ b/tooling/probes/step20c-overnight/HORIZONTAL.md @@ -0,0 +1,104 @@ +# Exact annotated horizontal fixture + +EXPERIMENTAL / PREPARATION. Runtime **NOT RUN**, independent review **PENDING**. +No production, UX, PKGBUILD, cumulative patch, installation or desktop action. +STEP20C stays NEXT; production multi-output NOT YET SUPPORTED. + +Only the explicitly owned overnight LAB is accepted. `phase-a.json` supplies the +new annotated staged binary; the previous D binary cannot satisfy the frozen +identity. The retained pristine control is separately bound to its fd71 source +archive, SceneFX37ccd source archive, original build receipt, exact binary and +mapped SceneFX library. Both use the current exact wlroots0.20 library. Native +startup log lines establish the actual FX/GL renderer; requested environment +`WLR_RENDERER=pixman` is metadata, never renderer proof. + +C0 runs pristine splith, C1 annotated splith, C2 annotated Mosaic. Every case has +H1=(-800,0,800,600), H2=(0,0,800,600), scale1, transform normal. H2 is a static +opaque SHM XDG client #303038; two separated initial whole RGB images must be +identical and uniform. No mask, channel tolerance or excluded pixels. + +The clients are copied privately from the actual retained static_cross sources +and compiled with C17. Scanner regeneration must reproduce every retained XDG +and virtual-pointer generated file byte for byte; XML and source hashes are +frozen. TOPLEVEL→A→B hierarchy is checked against actual object IDs, get_popup +wire requests, genuine left-button serials, grab-before-initial-commit, +configure/ACK, buffer dimensions and mapping order. Each serial is consumed by +one distinct grab; C2's second chain uses new owner/PID and four distinct ordered +serials across both chains. + +NativeSHM, XDG configure, IPC assigned destination, applied owner scene, +global logical coordinates, output logical rectangles and physical PNG pixels +remain separate. At scale1 normal the logical-to-physical transform is identity +apart from output origin; all rectangles use half-open bounds. C0 has no private +scene trace: its current IPC assignment is explicitly labelled, then compared +to measured paint and fresh pointer wire coordinates. C1 also corroborates the +assignment against the actual applied PI_OWNER and ordinary unclipped PI_SCENE. +Neither establishes an atomic transaction generation or screenshot/native +buffer identity. + +C0/C1 open a genuine crossing A/B chain, measure full standard popup pixels on +both outputs, click B inside its actual H2 paint, explicitly close B, verify A +survives with no B residual on either output, click A inside its fresh H2 paint, +then close the owner normally. Final whole H2 equals the initial RGB image; +final H1 has no A/B colors. Four complete clicks, two grabs, one chain, +10 captures, five pointer placements; no camera or transition. + +C2 opens E1 after a reserved camera correction derived from measured applied +owner geometry. Owner, A and B must actually cross x=0. H1 retains A/B pixels; +whole H2 stays equal. A real right click inside H1 B must reach B. A real right +click in B's hypothetical H2 extent must reach neither popup; actual popup_done +and destruction order must be B then A. Any reference delivery is recorded as +outside-grab routing, not promised universal click-through. E1 H2 must be clean. +The same compositor then opens fresh E2. A con_id-targeted splith preserves live +A/B; all selected callback records preserve old Mosaic then show two coherent +standard observations and clip removal through B input. Actual standard H2 A/B +pixels, B input, explicit child close/A survival, A input and normal owner close +are checked as in controls. Final whole H2 equality is exact. Eight clicks, +four grabs, two chains, up to two camera corrections, one transition, +17 captures and ten pointer placements. No retry or calibration loop. + +`horizontal_adapter.py` applies explicit unique-occurrence transformations to +the sealed historical E2 runner. Generated runners exist only in LAB, are AST +compiled, source-hashed and reviewed with every reused dependency. The original +historical fixture and its source/receipts remain read only. The transition +validator is rebound to the exact annotated output/transaction/XDG sources; +old binary/source acceptance is never transferred. + +Global ledger:18 runs,220 PNG and exactly three C runs, durable reservation before +compositor creation/capture. Local action ledgers additionally reserve every +click, move, grab, chain, camera and transition before the corresponding action. +Reserved and observed consumed counts remain separate; failures never refund. +Per-run maximum150s, active watchdog143s and bounded logs/process waits. Private +runtime0700, inherited desktop/loader sockets removed, explicit `swaymsg -s` +on every IPC command. Only owned process groups are stopped/reaped; runtime and +sockets are removed. Actual terminal IPC/client/compositor codes are preserved. + +The C controls are comparison evidence, not automatic dispatch vetoes. A shared +fixture defect requires review before continuing; otherwise each case can pass +its own preflight. Missing/failed control prevents a full comparative verdict +and must be reported explicitly; no inferred pristine PASS. + +## Preparation and review + +`horizontal_gate.py prepare LAB` compiles only C clients; it creates no socket +and reserves no graphical run. `horizontal_tests.py --output RECEIPT` executes +pure/isolated negative tests. Failed first-pass receipts are preserved separately. +`horizontal_gate.py seal LAB` freezes final fixture/dependency/client/generated +runner/binary/library/source/provenance/test bytes; it cannot create acceptance. + +A genuine independent read-only reviewer writes LAB/horizontal/review.json: +status ACCEPTED, independent=true, read_only=true, +scope OVERNIGHT_HORIZONTAL_FINAL_BYTES, blockers=[], +freeze_sha256=SHA256(freeze.json), files=the exact freeze files mapping, +report_file=absolute report path, report_sha256=its exact SHA256. +No historical or synthetic acceptance is valid. Final byte changes invalidate +acceptance. `horizontal_gate.py preflight LAB --case C0` is read only and requires +that review. `run.py LAB C0` then consumes a unique O_EXCL case token before the +run debit; C1/C2 have separate tokens. Existing runs, sockets, bad identity, +changed reviewed bytes and exhausted budgets fail closed. No actual run has been +performed during fixture preparation. + +Remaining gates include wider outputs/migration, complete damage/intermediate +frames, atomic generation, static effects/hidden-owner/saved buffers and +ABI/distribution/legal/maintenance. Successful C alone is bounded horizontal +feasibility, never STEP20C production readiness. diff --git a/tooling/probes/step20c-overnight/horizontal_adapter.py b/tooling/probes/step20c-overnight/horizontal_adapter.py new file mode 100644 index 0000000..ae4345d --- /dev/null +++ b/tooling/probes/step20c-overnight/horizontal_adapter.py @@ -0,0 +1,131 @@ +"""Bounded explicit transformations of the sealed E2 runner, never a broad copy. + +Generated runners are private frozen review artifacts. Reused validators retain +native/configured/assigned/applied distinctions and half-open coordinate rules. +""" +from pathlib import Path +import ast +import hashlib + +BASE = Path(__file__).resolve().parent.parent / 'step20c-static-e2-completion' +BASE_SHA = '1bd67d5269b5492f5d9ac6e7b670a4db0345b0e2cd3f89930dcbd154c4473504' +REUSE = ('model.py','observations.py','ipc_predicates.py','pixels.py','predicates.py','lifecycle.py','transition.py','support.py') + +def replace_one(text, old, new): + if text.count(old) != 1: + raise ValueError('sealed transformation occurrence mismatch: '+old[:80]) + return text.replace(old,new,1) + +STANDARD_EXTERIOR = "def splith_exterior(owner, layout):\n # Pinned sway/ipc-json.c:899-906: count=1 unless parent is stacked.\n # This inverse is deliberately scoped to the ordinary splith controls.\n require(layout == 'splith', 'standard-splith-only')\n assigned = owner['rect']; deco = owner['deco_rect']['height']\n require(type(deco) is int and deco >= 0, 'standard-decoration-height')\n return [assigned['x'], assigned['y'] - deco,\n assigned['width'], assigned['height'] + deco]\n\n" + +STANDARD_OPEN = '''def open_standard(name): + global stage,baseline + reserve(lab,'chain');cmd('workspace 1') + proc=spawn(name,[lab/'nested-client','static_cross'],debug=True) + wait(lambda:find('org.mosaic.NestedGrabProbe',proc.pid) and 'TOPLEVEL MAP ' in log(name));time.sleep(.6) + snap=snapshot(name+'-assigned');ws=workspace(snap['tree'],'1') + owner=next(n for n in nodes(ws) if n.get('pid')==proc.pid) + require(ws['layout']=='splith' and owner['visible'] and owner['focused'],'standard-owner') + require(owner['app_id']=='org.mosaic.NestedGrabProbe' and owner['shell']=='xdg_shell','standard-owner-identity') + refstate=validate_reference(snap,refid,ref.pid) + inject('move',[-790,590]);first=capture('H2-reference-1','HEADLESS-2');time.sleep(.6) + second=capture('H2-reference-2','HEADLESS-2');baseline=first + save(lab,'reference-stability',dict(status='PASS',comparison=reference(first,second),reference=refstate)) + topim=capture(name+'-top','HEADLESS-1');bbox=paint(topim,'TOPLEVEL')['bbox'];require(bbox is not None,'standard-owner-paint') + # C0 has no private scene trace. Current IPC assignment is explicitly named; + # the actual painted origin and fresh pointer wire coordinates corroborate it. + assigned=dict(owner['rect']);exterior=splith_exterior(owner,ws['layout']) + measured=dict(id=owner['id'],workspace=ws['id'],scene=exterior,IPC=owner, + raw='CURRENT IPC raw assignment; splith exterior inverse ipc-json.c:899-906; actual painting/input checked separately') + applied=applied_model(measured,owner,log(name),name+'-standard-assigned-observation') + content_rect=content(applied);origin=[content_rect.x,content_rect.y] + require([bbox[0]-800,bbox[1]]==origin,'standard-painted-assigned-origin') + out=output_model(snap,'HEADLESS-1',content_rect.provenance) + verify_paint(content_rect,out,bbox,paint(topim,'TOPLEVEL')['count']) + if CASE=='C1': + scene=scene_from_log(log('compositor'),'HEADLESS-1');real=measure_owner(log('compositor'),owner) + require(not scene['clip_valid'] and scene['layout_enum']==1,'standard-no-native-clip') + require(real['scene']==measured['scene'],'standard-applied-scene-matches-assignment') + owners[name]=dict(id=owner['id'],pid=proc.pid,workspace=ws['id'],assigned=assigned,exterior=exterior,content_origin=origin, + native=applied.native.rectangle.values(),configured=applied.configured.values(),paint=paint(topim,'TOPLEVEL')) + save(lab,'applied-owner-geometry',owners) + xy=point(topim,'TOPLEVEL',-800);require(applied.native.rectangle.contains([xy[0]-origin[0],xy[1]-origin[1]]),'opening-native-bounds') + cp=click(name+'-open-A',name,xy,True,'left');wait(lambda:'POPUP_A MAP ' in log(name));time.sleep(.25) + correlate_pointer(name,xy,content_rect.values(),'TOPLEVEL',cp['pointer_protocol'][name]) + aim=capture(name+'-A','HEADLESS-1');xyA=point(aim,'POPUP_A',-800) + cpB=click(name+'-open-B',name,xyA,True,'left');wait(lambda:'POPUP_B MAP ' in log(name));time.sleep(.3) + prot=protocol(log(name));opening_pair(cp['events'][name],'TOPLEVEL',prot['grabs'][0]['serial']) + opening_pair(cpB['events'][name],'POPUP_A',prot['grabs'][1]['serial']) + require(not any(cp['events'][n] or cpB['events'][n] for n in ('reference','filler')),'opening-other-client') + g=geometry(log(name),origin,content_rect.provenance);require(all(v=='EXERCISED' for v in g['crossing'].values()),'standard-root-child-crossing') + correlate_pointer(name,xyA,g['A'],'POPUP_A',cpB['pointer_protocol'][name]) + left=capture('standard-H1','HEADLESS-1');right=capture('standard-H2','HEADLESS-2') + rgb=popup_pixels(left,right,g,False,baseline);verify_owner_occlusion(left,right,content_rect,g,False) + chains[name]=dict(protocol=prot,geometry=g,pixels=rgb,owner=owners[name]) + save(lab,'xdg-protocol-order',{name:prot});save(lab,'standard-popup-pixels',rgb) + return proc,owner,g,left,right,content_rect +''' + +E1 = ''' E1,owner1,g1,im1=open_chain('E1') + stage='E1-visible-B';xy=point(im1,'POPUP_B',-800);row=click(stage,'E1',xy) + result=delivery(row,'E1','POPUP_B');coords=correlate_pointer('E1',xy,g1['B'],'POPUP_B',row['pointer_protocol']['E1']);mapped(log('E1')) + save(lab,'mosaic-input',dict(status='PASS',pair=result,coordinates=coords,click=row)) + stage='E1-forbidden-B';B=g1['B'];xy=[int((max(0,B[0])+min(800,B[0]+B[2]))//2),B[1]+30] + require(B[0]<=xy[0] LIMITS[kind]: + raise RuntimeError('global budget exhausted: ' + kind) + if kind == 'run': + if amount != 1 or campaign not in CAMPAIGNS or not isinstance(run_id, str) or not run_id or run_id in state['runs']: + raise ValueError('unique run and known campaign required') + if type(duration_s) not in (int, float) or not 0 < duration_s <= 150: + raise ValueError('run duration exceeds 150 seconds') + if state['campaign_used'][campaign] >= CAMPAIGNS[campaign]: + raise RuntimeError('campaign budget exhausted') + state['campaign_used'][campaign] += 1 + state['runs'][run_id] = {'campaign': campaign, 'captures': 0, 'duration_s': duration_s} + elif kind == 'capture': + if campaign is not None or run_id not in state['runs']: + raise ValueError('capture requires reserved run') + run = state['runs'][run_id] + if run['captures'] + amount > (12 if run['campaign'] == 'F' else 20): + raise RuntimeError('run capture budget exhausted') + run['captures'] += amount + elif campaign is not None or run_id is not None: + raise ValueError('build cannot associate run') + state['used'][kind] += amount + event = {'sequence': len(state['events']), 'kind': kind, 'amount': amount, + 'campaign': campaign, 'run_id': run_id, 'reserved_at_ns': time.time_ns()} + state['events'].append(event) + fd, temporary = tempfile.mkstemp(prefix='.budget-', dir=path.parent) + try: + with os.fdopen(fd, 'w') as out: + json.dump(state, out, indent=2); out.write('\n'); out.flush(); os.fsync(out.fileno()) + os.replace(temporary, path) + _sync_dir(path.parent) + finally: + if os.path.exists(temporary): + os.unlink(temporary) + return event diff --git a/tooling/probes/step20c-overnight/matrix/README.md b/tooling/probes/step20c-overnight/matrix/README.md new file mode 100644 index 0000000..8166502 --- /dev/null +++ b/tooling/probes/step20c-overnight/matrix/README.md @@ -0,0 +1,173 @@ +# Prospective v3: D3-mosaic only + +**EXPERIMENTAL / Runtime NOT RUN; independent review PENDING.** +This revision is usable only for the unused `D3-mosaic` case. Every other case +is refused by the entry gate. Consumed v2 results, tokens and receipts are +unchanged. D2-mosaic remains INCONCLUSIVE and cannot be retried. + +Before editing, all 578 files of accepted v2, its freeze/review and all matrix +modules were copied with exact SHA256 verification into +`LAB/matrix/executed-v2-archive/`. `archive-map.json` explicitly binds original +paths to archival paths. The original freeze hash remains +`a20ccb39095ca35363119b5cfe4b5c839c1a75863bd72a097686aeac76dd7d7f`. +Original source paths now contain this prospective revision; verification of +executed v2 uses the archival bytes. The v3 freeze binds and verifies that +complete archive, current import closure, binaries and clients, reports and +executed offline receipt. Its separate scope is +`OVERNIGHT_MATRIX_D3_PROSPECTIVE_V3`; it grants no author acceptance. + +The actual pinned layer-shell constructor creates a descriptor popup host for +wallpaper even without an XDG popup. Before launching the owner, D3 records the +one live marker process, exactly one wallpaper layer creation, no IPC popup +owner, and at least two complete callbacks containing the same pre-existing +host. All baseline callbacks are retained. Opening then requires exactly this +unchanged known host and one new stable root; unknown or additional hosts, +missing known host, reordered indexes, missing owner/workspace, wrong geometry +and every erroneous comparable root clip are refused. Raw callbacks retain +both hosts and their original indexes. Identity selection uses only membership +in the pre-owner set, never the latest box or clipped index. The existing live +XDG parent/grab hierarchy and exact IPC ancestry bind the new root to the owner. + +Constructor + timing + cardinality give bounded association. Native layer/root +owner IDs, host child count and atomic transaction generation are not observed. +The D2 replay tests validate only this fixture algorithm and never upgrade D2's +result. There is no compositor, client, package or production change. + +The v2 preparation description below is historical context. Its general +fourteen-case dispatch is superseded by the single prospective v3 gate. + +# Overnight output/lifetime/effects/ordering matrix + +**EXPERIMENTAL / PREPARATION. Runtime NOT RUN; independent review PENDING.** +This fixture changes no compositor, UX, package, cumulative patch, desktop or +historical LAB. It recompiles only private C17 clients, preserving every source, +protocol XML/scanner input and output, command and resulting binary hash. +STEP20C remains NEXT; production multi-output NOT YET SUPPORTED. + +`protocols.py` defines fourteen unique cases. The private `protocols.json` is +compared with that exact mapping by the gate. Every case specifies the scientific +question, output physical/logical geometry, preconditions, client placement, +ordered actions, point computation, ceilings, stop criteria and raw retention. +`engine.py` provides one small shared Session; `cases.py` supplies bounded +scenarios. No massive historical runner is copied. Existing model/protocol +functions are imported with their exact dependency hashes in a separate matrix +freeze. C's reviewer cannot grant matrix acceptance. + +| Cases | Actual planned captures per run | Scientific ceiling | +| --- | ---: | --- | +| D1 pristine/Mosaic | 8 | sampled vertical true A/B grabs/crossing/input/dismissal | +| D2 pristine/Mosaic | 9 | sampled scale1.25 geometry after actual asymmetric markers | +| D3 pristine/Mosaic | 9 | sampled R90 scale1.25 geometry after actual asymmetric markers | +| D4 pristine/Mosaic | 17 | resize/clamp/migration sampled geometry; no atomic generation | +| E1 Mosaic | 12 | sampled fully hidden owner and same live chain return | +| E2 Mosaic | 8 | always INCONCLUSIVE for saved identity/render: native traces absent | +| E3 pristine/Mosaic | 18 | sampled effects/cache RGB, never complete damage/cache equivalence | +| F pristine/Mosaic | 8 | INCONCLUSIVE for native buffer identity/atomic input epoch | + +Matrix158 + C37 + optional G17 =212/220 captures. Matrix14 + C3 + optional G1 +=18/18 runs. These are fixed planned allocations below the ticket ceilings; +failures consume reservations and are never refunded. Each case independently +checks remaining global budget. Failure in another independent case does not +invent a dispatch veto, transfer a PASS or authorize a retry. + +D1 uses real vertical outputs(0,0)/(0,600), native575-height vertical client and +actual y600 root/child crossing. D2 uses logical H1(-800,0,800,600) physical +1000x750 scale1.25, H2 normal. D3 uses the same logical boxes and H1 physical +750x1000 transform string90. Five distinct marker colors, positions and actual +PNG dimensions establish the frame before any coordinate conversion. The +marker source PNG is generated client content, recorded separately from actual +captures. Every injection uses the observed logical output union, never applies +scale twice, and recomputes a solid measured interior and fresh wire/local +coordinates. Rectangles remain half open. + +The pristine standard origin uses IPC rect+window offset: exported rect.y already +includes decoration. Its exterior is the source-backed inverse(rect.y-deco, +rect.height+deco). Candidate applied origins come from PI_OWNER exterior scene +plus actual decoration/window offsets. Assignment, applied scene, native SHM, +configure, output logical, physical mode and PNG frame are distinct observations. +Root association requires the unique live XDG hierarchy and exact owner ancestry; +PI_POPUP has no owner field. No private generation is invented. + +D4 opens clients before camera calibration, records startup blank H1, resizes H1 +to960 atx-960 then back800 atx-800, and migrates workspace1 H1→H2→H1 once. +The Mosaic request derives maximum from frozen minimum640 policy, known gaps0 +and exact row child count; it requests maximum+960 once and checks actual clamp. +Pristine clamp is NOT EXERCISED. Captures preserve all migration states, logical +order/IDs and legitimate popup dismissal. Input is never sent to an old invisible +surface. Closing owner/fillers restores blank H1 and exact full H2. + +E1 preopens two prefix and two trailing fillers around the owner, then calibrates +once, opens two genuine grabs, clicks visible B, computes a hide camera from the +applied owner's endpoint, requires zero owner intersection and empty root clip, +checks no popup pixels on either output and no popup enter, returns by the exact +inverse, requires unchanged object IDs/no popup_done/recreation, clicks B again +and closes normally. The optional second invisible click is omitted. + +E2 keeps the compiled default200ms timeout. It receives a genuine configure, +records HELD serial and independent wire configure with no ACK, captures only +what the real scheduling permits, and waits for the natural transaction timeout. +A capture named held may already follow timeout; the receipt explicitly says +NOT EXERCISED for native saved content. The responsive client continues dispatch; +natural ping responses are retained if present. No forced ACK, timer override, +code-level save or invented saved-buffer node is used. H2 sampled equality cannot +upgrade native saved identity or rendering from INCONCLUSIVE. + +E3 uses the retained duplicate-configure-safe checker layer and translucent XDG +client. Shadow/no-shadow comparisons precede a classic floating glass wholly +inside H1 (source selects classic for floating). This samples retained ordinary floating +classic filtering, not Mosaic-tiled classic clipping. That same client is then retiled +and recalibrated once for settled tiled optimized blur. Explicit background +A/B/A commands drive real cache reconstruction. Every state has whole H2 capture. +An absent visible shadow or classic ROI is recorded NOT EXERCISED and does not +abort independent optimized measurements. Pristine lacks OBC trace. Native cache +observations, final drawing and input remain distinct; historical maxRGB6 is no +new threshold. No shader/cache/readback edit or compositor rebuild is used. + +F uses a nongrab toplevel with real wl_surface input-region commits. Full/empty/ +full right-button recipients, focus, gaps geometry, candidate camera forward/ +inverse and standard/Mosaic return are sampled within bounds. Native pairs are +selected by exact(output,commit_seq), at most12, with missing presents explicit. +Independent client wire input, PI scene/owner/root, TEMPORAL_DAMAGE and commit/ +present remain separate. Native buffer references/releases and hit epochs are +absent from the candidate. No scheduler manipulation, interval-seeking flood, +forced timing or GPU readback is used. Unobserved natural interleaving remains +NOT EXERCISED; buffer identity/atomic generation remain NOT PROVEN. + +Global run reservation precedes runtime/socket/process creation; local durable +reservations precede every camera, chain, grab, click/move, configuration, +mutation and capture. Typed local counters reconcile exact event sequences and +immutable limits. A unique O_EXCL token makes each failed attempt unretryable. +Private runtime0700 and cleared inherited desktop/loader environment are required; +every swaymsg has explicit -s. Actual renderer startup lines and proc maps bind +candidate/pristine, wlroots and static/private SceneFX. Active watchdog143s, +run150s, per-log32MiB and shared cleanup deadlines bound all owned process groups. +Actual terminal IPC codes, process exit codes, rescue and runtime removal survive +failures. Cleanup failure downgrades the outcome and keeps measurement status. + +## Separate independent review + +Preparation entry: `PYTHONDONTWRITEBYTECODE=1 python matrix/prepare.py`. +This compiles clients only and is O_EXCL for its new private directory. Two +failed offline preparations on absent historical close_a context are retained +under matrix-client-preparation-failure01/02; the final region client reuses only +the exact command branch, with unique-line matching. No graphical attempt followed. +Initial offline tests23PASS/1FAIL asserted205 instead of actual203 planned PNG; +G was subsequently assigned17 captures, so final whole-batch planning is212. +that failed receipt stays preserved. Final negative tests and AST checks are +actual execution, not an acceptance generator or proof of graphics. + +`gate.freeze()` writes LAB/matrix/freeze.json with every final source, reused +module, client source/protocol/binary, source audit, exact binary/library, pristine +provenance and executed receipt. No author-generated acceptance exists. +An independent read-only reviewer writes LAB/matrix/review.json with: +status ACCEPTED, independent=true, read_only=true, blockers=[], +scope OVERNIGHT_MATRIX_FINAL_BYTES, freeze_sha256=SHA256(freeze.json), +files=the exact frozen files mapping, report_file=absolute report, +report_sha256=its exact SHA256. Changed bytes invalidate acceptance. + +Only after acceptance: `PYTHONDONTWRITEBYTECODE=1 python matrix/run.py D1-pristine` +(or another exact case key). The gate fails before any token/run reservation if +review, source/client/binary identity, ownership, socket/process state or budget +is invalid. The author performs no run and grants no acceptance. Independent +review may refuse technically incomplete predicates before any case consumes +its budget; raw results never upgrade unsupported scientific claims. diff --git a/tooling/probes/step20c-overnight/matrix/analyze.py b/tooling/probes/step20c-overnight/matrix/analyze.py new file mode 100644 index 0000000..f4b8b5a --- /dev/null +++ b/tooling/probes/step20c-overnight/matrix/analyze.py @@ -0,0 +1,9 @@ +"""Offline per-case bounded evidence summary; never invent missing native identity.""" +import argparse,json +from pathlib import Path +from gate import LAB +from protocols import RUNS +p=argparse.ArgumentParser();p.add_argument('run_id',choices=RUNS);a=p.parse_args();w=LAB/'matrix'/a.run_id/'run' +raw=json.loads((w/'outcome.json').read_text());spec=RUNS[a.run_id] +print(json.dumps(dict(case=spec['id'],runtime=raw,status=raw['status'],source_observability_ceilings=spec.get('ceilings',[]), + complete_damage='NOT PROVEN',atomic_generation='NOT PROVEN',production='NOT YET SUPPORTED',historical_acceptance_transferred=False),indent=2)) diff --git a/tooling/probes/step20c-overnight/matrix/cases.py b/tooling/probes/step20c-overnight/matrix/cases.py new file mode 100644 index 0000000..9545ac5 --- /dev/null +++ b/tooling/probes/step20c-overnight/matrix/cases.py @@ -0,0 +1,266 @@ +"""Small campaign scenarios over the same reviewed Session; no historical runner copy.""" +import re,time +from PIL import ImageChops +from engine import * +from geometry import * + +def init_reference(s,prefix_fillers=1): + s.cmd('workspace 2');s.launch_client('reference','static-reference');rid=s.find('reference')['id'];s.cmd(f'[con_id={rid}] border none') + s.cmd('workspace 1') + for i in range(prefix_fillers):s.launch_client('filler'+str(i),'static-reference') + s.cmd('layout mosaic' if s.spec['mode']=='mosaic' else 'layout splith') + return rid + +def stable_reference(s): + s.inject('move',[s.outputs[0]['logical'][0]+10,s.outputs[0]['logical'][1]+590]);time.sleep(.15) + a=s.capture('H2-reference1','HEADLESS-2');time.sleep(.6);b=s.capture('H2-reference2','HEADLESS-2');exact(a,b) + need(all(v==(48,48,56) for v in a.get_flattened_data()),'static uniform H2');s.save('reference-stability',dict(status='PASS',exact=exact(a,b)));return a + +def marker_host_baseline(s): + """D3-only pre-XDG association: source + creation timing + cardinality. + + This does not observe native owner IDs or host child count. No root is + selected by clip/index after the owner exists. + """ + from transition import observed_epochs + need(s.spec['id']=='D3-mosaic' and 'owner' not in s.proc,'prospective pre-owner marker baseline') + marker=s.proc.get('marker-background');need(marker is not None and marker.poll() is None,'live marker layer client') + start=next(e['ns'] for e in s.events if e['kind']=='spawn' and e['name']=='marker-background') + end=time.monotonic_ns();trace=s.log('compositor') + creations=[l for l in trace.splitlines() if 'new layer surface: namespace ' in l] + need(len(creations)==1 and 'namespace wallpaper layer 0 ' in creations[0],'one wallpaper layer creation') + snapshot=s.snapshot('pre-XDG-marker-host') + need(not any(n.get('app_id')=='org.mosaic.NestedGrabProbe' for n in nodes(snapshot['tree'])),'no popup owner before baseline') + epochs=observed_epochs(trace,'HEADLESS-1',start,end);tree=None;observed=[] + for e in epochs: + need(e['scene'] is not None,'complete baseline callback') + roots=e['roots'] + if not roots: + need(tree is None,'marker host disappeared before owner');continue + need(len(roots)==1,'unique pre-XDG host') + r=roots[0] + need(r.get('local_index')=='1' and r.get('enabled')=='1' and r.get('clip_valid')=='0' and r.get('clip')=='0,0,0,0','source-backed ordinary layer host') + if tree is None:tree=r['tree'] + need(r['tree']==tree,'stable pre-XDG host') + observed.append(e) + need(len(observed)>=2,'two complete pre-XDG host observations') + baseline=dict(tree=tree,window=[start,end],epochs=epochs,layer_creation=creations[0],marker_pid=marker.pid,snapshot=snapshot, + correlation='single layer constructor + pre-owner timing + stable cardinality; no native layer ID or child count') + s.save('marker-host-baseline',baseline);s.marker_host=baseline + return baseline + +def associated_root(roots,baseline=None,commit_ns=None): + if baseline is None: + need(len(roots)==1 and roots[0].get('local_index')=='1','unique first popup root');return roots[0] + need(commit_ns is not None and commit_ns>baseline['window'][1],'root callback after pre-XDG baseline') + need(len(roots)==2 and len({r.get('tree') for r in roots})==2,'one known layer host plus one new XDG root') + need([r.get('local_index') for r in roots]==['1','2'],'native host order retained') + known=[r for r in roots if r.get('tree')==baseline['tree']] + need(len(known)==1 and known[0].get('enabled')=='1' and known[0].get('clip_valid')=='0' and known[0].get('clip')=='0,0,0,0','same unchanged known layer host') + return next(r for r in roots if r['tree']!=baseline['tree']) + +def root_state(s,state,origin,window_start,expect_hidden=False,previous=None,expected_tree=None): + from transition import observed_epochs + from ipc_predicates import ancestry + end=time.monotonic_ns();output=state['workspace']['output'] + out=next(o['logical'] for o in s.outputs if o['name']==output) + need(state['workspace']['layout']=='mosaic' and origin==state['origin'],'current Mosaic origin') + path=ancestry(state['snapshot']['tree'],state['owner']['id']) + need(path and path[-1]['id']==state['owner']['id'],'exact IPC owner ancestry') + need([n['id'] for n in path if n.get('type')=='workspace']==[state['workspace']['id']] and + [n['name'] for n in path if n.get('type')=='output']==[output],'exact workspace output ancestry') + live=[n for n in nodes(state['snapshot']['tree']) if n.get('app_id')==state['owner']['app_id'] and n.get('visible')] + need(len(live)==1 and live[0]['id']==state['owner']['id'],'unique live XDG owner') + prot=protocol(s.log('owner'));need(len(prot['grabs'])==2,'two real grabs') + epochs=observed_epochs(s.log('compositor'),output,window_start,end) + rows=[];trees=set();applied=False + for e in epochs: + c,sc,roots=e['commit'],e['scene'],e['roots'] + need(c.get('has_buffer') in ('0','1') and sc is not None and sc.get('workspace')==str(state['workspace']['id']) and sc.get('layout')=='5','complete current callback workspace/layout') + owners=[o for o in e['owners'] if o.get('id')==str(state['owner']['id'])] + need(len(owners)==1 and owners[0].get('scene_valid')=='1','exact applied owner') + r=associated_root(roots,getattr(s,'marker_host',None),int(c['ns'])) + o=owners[0];trees.add(r['tree']) + need(len(trees)==1 and (expected_tree is None or r['tree']==expected_tree),'same live root') + need(int(c['ns'])