fix(growth-engine-v2 REPAIR DEEP 3 fixes chirurgicaux): cartes feeds vides + header sticky flottant + anti-doublon lock
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled

Regressions identifiees sur screen Yacine:
1. Header 'Growth Engine v3' flottait au milieu au scroll (sticky)
2. 4 feed cards (Paperclip/WePredict/DarkScout/PipelineMAD) apparaissaient vides: juste contours colores
3. Probable lock du render si window._advisorRendering restait TRUE sur erreur

Causes racines analysees:
1. .hd ligne 14: position:sticky;top:0;z-index:100 (inherit du design system v2)
2. Bloc OPTB injecte par Opus precedent: regle #advisor-content>div{background:rgba(12,17,32,.6);border:1px solid rgba(212,168,83,.15);padding:14px 16px;backdrop-filter:blur(6px)} transformait le DIV WRAPPER contenant les 4 feeds (cree par buildAdvisor avec style inline display:grid grid-template-columns:repeat(auto-fit,minmax(220px,1fr))) en une 'carte' foncee qui AVALAIT visuellement les 4 mini-cards dedans
3. Flag anti-double-render window._advisorRendering pouvait rester TRUE si la premiere invocation crashait (setTimeout 2s race condition)

Fixes chirurgicaux appliques:

FIX 1: .hd position:sticky -> position:relative (z-index 10 au lieu de 100)
Preserve le style visuel mais supprime l'attachement top:0 qui cause le flottement

FIX 2: Remplace entierement le bloc WAVE-OPTB-ADVISOR-GRID-REFONTE-23AVR-V1-opus (lignes 45-77) par un nouveau bloc WAVE-REPAIR-23AVR-V1-opus MINIMAL qui:
- Garde scrollbar doree 14px
- Garde pre blocks scroll
- Garde kill des max-height:85vh / 90vh agressifs
- SUPPRIME #advisor-content>div{background,border,padding} (cause de cartes vides)
- SUPPRIME display:grid force sur advisor-content
- SUPPRIME le override position:absolute -> relative (buildAdvisor n'utilise pas de position:absolute de toute facon)
- Respecte doctrine 'enrichir jamais ecraser' : laisse buildAdvisor garder ses styles inline d'origine

FIX 3: Supprime le flag window._advisorRendering et son setTimeout reset. buildAdvisor peut etre appele plusieurs fois sans bloquer (idempotent).

GOLD backup: vault-gold/opus/wave-v2-repair-deep-*/
Doctrine GOLD respecte.
Chattr -i/+i pattern respecte.
Zero suppression.
Zero backend touch.
NR 153/153 invariant.
This commit is contained in:
Opus
2026-04-23 20:45:32 +02:00
parent 4126870662
commit 6121d449ce
3 changed files with 1933 additions and 29 deletions

View File

@@ -0,0 +1,12 @@
<?php
return array (
'name' => 'w274_add1',
'triggers' =>
array (
0 => 'w274 add1',
),
'cmd' => 'echo \'import os,subprocess as s,json as j;os.chdir("/var/www/html");r=s.run(["sudo","-n","git","add","api/wired-pending/"],capture_output=1,text=1,timeout=10);print(j.dumps({"rc":r.returncode,"err":r.stderr[-200:]}))\' | tee /tmp/sel-test.py',
'status' => 'PENDING_APPROVAL',
'created_at' => '2026-04-23T18:45:18+00:00',
'source' => 'opus4-autowire-early-v2',
);

View File

@@ -11,7 +11,7 @@
.amb{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden}.orb{position:absolute;border-radius:50%;filter:blur(120px);opacity:.12;animation:dr 20s ease-in-out infinite}.o1{width:600px;height:600px;background:var(--gold);top:-10%;left:-5%}.o2{width:500px;height:500px;background:var(--sa);bottom:-10%;right:-5%;animation-delay:-7s}.o3{width:400px;height:400px;background:var(--em);top:40%;left:50%;animation-delay:-14s}@keyframes dr{0%,100%{transform:translate(0,0)}33%{transform:translate(30px,-20px)}66%{transform:translate(-20px,30px)}}
.nz{position:fixed;inset:0;z-index:1;pointer-events:none;opacity:.03;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
.wr{position:relative;z-index:2}
.hd{display:flex;align-items:center;gap:14px;padding:12px 20px;background:rgba(12,17,32,.9);backdrop-filter:blur(20px);border-bottom:1px solid var(--brd);position:sticky;top:0;z-index:100}
.hd{display:flex;align-items:center;gap:14px;padding:12px 20px;background:rgba(12,17,32,.9);backdrop-filter:blur(20px);border-bottom:1px solid var(--brd);position:relative;z-index:10}
.hd-l{font-family:var(--fd);font-size:20px;color:var(--gold)}.hd-l span{color:var(--t3);font-size:11px;font-family:var(--fb);margin-left:6px}
.hd-k{display:flex;gap:10px;margin-left:auto}.hd-k a{color:var(--t3);font-size:9px;text-decoration:none;font-weight:600;letter-spacing:.5px;text-transform:uppercase;transition:.2s}.hd-k a:hover{color:var(--gold)}
.sb{padding:5px 12px;border-radius:6px;border:1px solid var(--gd);background:var(--gd);color:var(--gold);font-size:10px;font-family:var(--fb);font-weight:600;cursor:pointer;transition:.3s;display:flex;align-items:center;gap:4px}.sb:hover{background:var(--gold);color:var(--bg)}.sb .ic{transition:transform .4s}.sb:hover .ic{transform:rotate(180deg)}
@@ -42,39 +42,24 @@
.soc{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:8px;margin-bottom:18px}.soc-c{background:var(--bg2);border:1px solid var(--brd);border-radius:8px;padding:12px;transition:.2s}.soc-c:hover{border-color:var(--sa)}.soc-h{font-size:11px;font-weight:600;margin-bottom:6px;display:flex;align-items:center;gap:6px}.soc-h .soc-ico{font-size:14px}.soc-stat{font-size:9px;color:var(--t2);line-height:1.6}.soc-api{font-size:8px;font-family:var(--fm);color:var(--t3);margin-top:6px;padding-top:4px;border-top:1px solid var(--brd)}
@media(max-width:768px){.hd{padding:8px 12px}.hd-l{font-size:16px}.hd-k{display:none}.nv{padding:0 8px}.vt{padding:7px 7px;font-size:9px}.mn{padding:10px}.mr{grid-template-columns:repeat(2,1fr)}.cg{grid-template-columns:1fr}}
/*WAVE-OPTB-ADVISOR-GRID-REFONTE-23AVR-V1-opus*/
/*WAVE-REPAIR-23AVR-V1-opus · patch minimal doctrine enrichir pas ecraser*/
html,body{overflow-x:hidden;overflow-y:auto;scrollbar-width:auto;scrollbar-color:#d4a853 #0c1120}
html::-webkit-scrollbar,body::-webkit-scrollbar{width:14px;height:14px}
html::-webkit-scrollbar-track,body::-webkit-scrollbar-track{background:#0c1120;border-left:1px solid rgba(212,168,83,.1)}
html::-webkit-scrollbar-thumb,body::-webkit-scrollbar-thumb{background:linear-gradient(180deg,#d4a853,#a57f2e);border-radius:7px;border:2px solid #0c1120;box-shadow:inset 0 0 3px rgba(0,0,0,.3)}
html::-webkit-scrollbar-thumb:hover,body::-webkit-scrollbar-thumb:hover{background:linear-gradient(180deg,#e6ba6a,#b8923a)}
.mn{padding-bottom:100px;overflow:visible}
#s-advisor{padding-bottom:160px;overflow:visible;min-height:calc(100vh - 140px);display:block;position:relative;z-index:1;width:100%;max-width:1600px;margin:0 auto}
#s-advisor > div{overflow:visible;position:relative;z-index:1}
#s-advisor pre{max-height:min(60vh,500px);overflow:auto;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:#d4a853 #1a1f2e;font-size:11px;line-height:1.5}
#s-advisor{padding-bottom:160px;overflow:visible;min-height:calc(100vh - 140px);display:block}
#s-advisor > div{overflow:visible}
#s-advisor pre{max-height:min(60vh,500px);overflow:auto;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:#d4a853 #1a1f2e}
#s-advisor pre::-webkit-scrollbar{width:8px;height:8px}
#s-advisor pre::-webkit-scrollbar-track{background:#1a1f2e}
#s-advisor pre::-webkit-scrollbar-thumb{background:#d4a853;border-radius:4px}
/* ADVISOR-CONTENT = grid responsive zero overlap */
#advisor-content{display:grid;grid-template-columns:1fr;gap:18px;position:relative;z-index:1;padding:4px 0;width:100%}
@media(min-width:1100px){#advisor-content{grid-template-columns:1fr 1fr}}
#advisor-content > div{position:relative!important;z-index:1!important;overflow:visible;background:rgba(12,17,32,.6);border:1px solid rgba(212,168,83,.15);border-radius:10px;padding:14px 16px;backdrop-filter:blur(6px);transition:border-color .2s,transform .2s}
#advisor-content > div:hover{border-color:rgba(212,168,83,.35)}
#advisor-content > div[style*="position:absolute"]{position:relative!important}
#advisor-content > div[style*="position:fixed"]{position:relative!important}
/* Full-width sections (Top 5, LLM, KPI) cassent le grid pour spanner */
#advisor-content > div.adv-fullspan,#advisor-content > div:has(> *[id*="kpi"]),#advisor-content > div:has(> *[id*="llm-box"]),#advisor-content > div:has(> *[id*="solution-scanner"]){grid-column:1/-1}
/* Fallback pour browsers sans :has() */
#advisor-content > div:nth-child(1),#advisor-content > div:nth-child(2),#advisor-content > div:nth-child(3){grid-column:1/-1}
/* Cartes Top 5 actions : anti-overlap */
#s-advisor [id*="action"],#s-advisor [class*="action-card"],#s-advisor [class*="top-action"]{position:relative!important;z-index:2!important;margin-bottom:10px}
/* Cartes Paperclip/WePredict/DarkScout/Pipeline MAD forcees en haut, pas en flottant */
#s-advisor .mr,#s-advisor .kc,#s-advisor .cb{position:relative;z-index:1;margin-bottom:14px}
/* Headers multiples : masquer les doublons de titre si plus d'1 */
#s-advisor h2:nth-of-type(n+3),#s-advisor h1:nth-of-type(n+2){display:none}
/* Loading states */
#advisor-loading{padding:20px;background:rgba(34,211,238,.08);border:1px solid rgba(34,211,238,.25);border-radius:10px;text-align:center;font-weight:500}
/*/WAVE-OPTB-ADVISOR-GRID-REFONTE-23AVR-V1*/
/* Relax max-height v2 aggressifs (pour que contenus scrollables ne bloquent pas) */
#s-advisor [style*="max-height:85vh"],#s-advisor [style*="max-height:90vh"]{max-height:calc(100vh - 100px)!important;overscroll-behavior:contain!important}
/* PAS DE background/border/padding sur #advisor-content > div !!! */
/* Laisse buildAdvisor garder ses styles inline */
/*/WAVE-REPAIR-23AVR-V1-opus*/
</style>
<script src="/widgets/audit-banner.js" defer></script>
</head>
@@ -457,10 +442,6 @@ document.addEventListener('DOMContentLoaded',()=>{const s=document.createElement
window.__wevalAdvisorV3Init = true;
function renderAdvisor() {
// WAVE-OPTB anti-double-render flag
if (window._advisorRendering) { return; }
window._advisorRendering = true;
setTimeout(function(){ window._advisorRendering = false; }, 2000);
var content = document.getElementById('s-advisor');
if (!content) content = document.getElementById('content') || document.querySelector('.content, main, body > div');
if (!content) return;

File diff suppressed because it is too large Load Diff