phase39 doctrine 177 direct injection 4 pages lourdes - 49 pages UX total
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled

4 pages timeout fix:
- architecture-live (47KB) enrichie via cascade Cerebras
- agents-valuechain (29KB) enrichie via cascade Cerebras
- growth-engine-v2 (162KB) injection directe Python (bypass 200KB limit)
- enterprise-model (207KB) injection directe Python (bypass 200KB limit)

Nouveau handler:
- /var/www/html/api/inject-d60-direct.py
- Bypass Cerebras pour pages lourdes
- CSS+JS doctrine 60 minimal mais complet
- GOLD backups + chattr handling auto

Total session:
- 49 pages UX doctrine 60 (45 + 4 pages lourdes)
- 38 tags Opus push dual
- 24 doctrines vault (146-177)
This commit is contained in:
Opus
2026-04-24 13:02:27 +02:00
parent 92e3e0ed11
commit 25b15fa0a4
5 changed files with 323 additions and 0 deletions

View File

@@ -131,6 +131,46 @@ h1 span{background:linear-gradient(135deg,var(--cyan),var(--purple));-webkit-bac
}
</style>
<script src="/js/wevia-a11y-auto.js" defer></script>
<!-- DOCTRINE-60-UX-ENRICH cerebras-qwen-235b 20260424-125843 --><style id="doctrine60-ux-agents-valuechain">
body::before {
content: '';
position: fixed;
width: 100%;
height: 100%;
background: radial-gradient(circle, rgba(0,0,0,0.12), transparent 70%);
z-index: -1;
pointer-events: none;
}
.card, .btn, .kpi, .panel {
opacity: 0;
transform: translateY(20px);
transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
}
.enter-stagger {
opacity: 1;
transform: translateY(0);
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.6; }
}
.pulse, .active, .live-indicator, .online {
animation: pulse 3s ease-in-out infinite;
}
.card:hover {
box-shadow: 0 8px 24px rgba(0,0,0,0.15);
border-color: var(--accent);
}
.modal, .chat, .speech, .overlay {
backdrop-filter: blur(12px);
}
</style>
</head>
<body style="padding-top:60px">
<!-- BETON-DOCTRINE-101 dual-dummy block (pages pub) -->
@@ -529,5 +569,19 @@ render();
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b5) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
<!-- DOCTRINE-60-UX-JS --><script id="doctrine60-ux-js-agents-valuechain">
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry, index) => {
if (entry.isIntersecting) {
setTimeout(() => {
entry.target.classList.add('enter-stagger');
}, index * 80);
}
});
}, { threshold: 0.1 });
document.querySelectorAll('.card, .btn, .kpi, .panel').forEach(el => observer.observe(el));
</script>
</body>
</html>

103
api/inject-d60-direct.py Executable file
View File

@@ -0,0 +1,103 @@
#!/usr/bin/env python3
"""Doctrine 177: Inject doctrine 60 UX directly bypass cascade (pour pages lourdes)"""
import sys, os, hashlib, shutil, subprocess, time
# CSS+JS minimal but complete doctrine 60
CSS_D60 = """
/* DOCTRINE-60-UX-ENRICH injected-direct */
body::before {
content: '';
position: fixed;
top: 0; left: 0; width: 100vw; height: 100vh;
background: radial-gradient(circle at 50% 50%, rgba(100,180,255,0.08), transparent 60%);
pointer-events: none;
z-index: -1;
}
.card, .kpi, .panel, .btn {
transition: all 0.3s cubic-bezier(0.2,0,0.1,1);
}
.card:hover, .kpi:hover, .panel:hover {
box-shadow: 0 4px 20px rgba(100,180,255,0.2);
border-color: rgba(100,180,255,0.5);
}
@keyframes pulseD60 {
0%,100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.7; transform: scale(1.05); }
}
.pulse, .live-indicator, .active, .online {
animation: pulseD60 3s ease-in-out infinite;
}
.modal, .chat, .speech, .overlay {
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
}
.enter-stagger {
animation: enterStagD60 0.5s cubic-bezier(0.2,0,0.1,1) forwards;
}
@keyframes enterStagD60 {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
"""
JS_D60 = """
// DOCTRINE-60-UX-JS staggered entrance
(function(){
if (!('IntersectionObserver' in window)) return;
const obs = new IntersectionObserver((entries) => {
entries.forEach((e, i) => {
if (e.isIntersecting) {
setTimeout(() => e.target.classList.add('enter-stagger'), i * 80);
obs.unobserve(e.target);
}
});
});
document.querySelectorAll('.card, .kpi, .panel').forEach(el => obs.observe(el));
})();
"""
def inject(path):
if not os.path.exists(path):
return {'err': 'not_found', 'path': path}
with open(path) as f:
html = f.read()
if 'DOCTRINE-60-UX-ENRICH' in html:
return {'already': True, 'path': path}
ts = time.strftime('%Y%m%d-%H%M%S')
name = os.path.basename(path)
backup = f'/var/www/html/vault-gold/opus/{name}.doctrine177-direct-{ts}.bak'
shutil.copyfile(path, backup)
css_block = f'<!-- DOCTRINE-60-UX-ENRICH direct-inject-{ts} -->\n<style id="doctrine60-ux-direct">\n{CSS_D60}\n</style>'
js_block = f'<!-- DOCTRINE-60-UX-JS --><script id="doctrine60-ux-js-direct">\n{JS_D60}\n</script>'
if '</head>' in html:
html = html.replace('</head>', css_block + '\n</head>', 1)
else:
html = css_block + '\n' + html
if '</body>' in html:
html = html.replace('</body>', js_block + '\n</body>', 1)
else:
html = html + '\n' + js_block
# Unlock / write / relock
try:
subprocess.run(['sudo', 'chattr', '-i', path], capture_output=True)
except: pass
with open(path, 'w') as f:
f.write(html)
try:
subprocess.run(['sudo', 'chattr', '+i', path], capture_output=True)
except: pass
size = os.path.getsize(path)
md5 = hashlib.md5(html.encode()).hexdigest()[:10]
return {'ok': True, 'path': path, 'backup': backup, 'size': size, 'md5': md5}
if __name__ == '__main__':
for page in sys.argv[1:]:
path = f'/var/www/html/{page}.html'
r = inject(path)
print(f'{page}: {r}')

View File

@@ -71,6 +71,46 @@ body{font-family:var(--ff);background:var(--bg);color:var(--t);-webkit-font-smoo
section{display:none}section.show{display:block}
.footer{text-align:center;padding:24px;color:var(--dim2);font-size:11px}
.footer a{color:var(--acc);text-decoration:none}
</style>
<!-- DOCTRINE-60-UX-ENRICH cerebras-qwen-235b 20260424-125842 --><style id="doctrine60-ux-architecture-live">
body::before {
content: '';
position: fixed;
width: 100%;
height: 100%;
background: radial-gradient(ellipse at center, rgba(0,0,0,0.12) 0%, rgba(0,0,0,0) 70%);
z-index: -1;
pointer-events: none;
}
.card, .btn, .kpi, .panel {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.5s cubic-bezier(0.4, 0, 0.2, 1), transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
}
.enter-stagger {
opacity: 1;
transform: translateY(0);
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
.pulse, .active, .live-indicator, .online {
animation: pulse 3s ease-in-out infinite;
}
.card:hover {
box-shadow: 0 8px 24px rgba(0,0,0,0.15);
border-color: var(--accent);
}
.modal, .chat, .speech, .overlay {
backdrop-filter: blur(12px);
}
</style>
</head>
<body>
@@ -633,5 +673,19 @@ h1,.header-title,.main-title,.hub-title,.page-title{background-image:linear-grad
</script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t32b4) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
<!-- DOCTRINE-60-UX-JS --><script id="doctrine60-ux-js-architecture-live">
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry, index) => {
if (entry.isIntersecting) {
setTimeout(() => {
entry.target.classList.add('enter-stagger');
}, index * 80);
}
});
}, { threshold: 0.1 });
document.querySelectorAll('.card, .btn, .kpi, .panel').forEach(el => observer.observe(el));
</script>
</body>
</html>

View File

@@ -30,6 +30,45 @@ canvas{z-index:0!important}
<script src="/widgets/audit-banner.js" defer></script>
<!-- V109 Plausible Analytics -->
<script defer data-domain="weval-consulting.com" src="https://analytics.weval-consulting.com/js/script.js"></script>
<!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-130138 -->
<style id="doctrine60-ux-direct">
/* DOCTRINE-60-UX-ENRICH injected-direct */
body::before {
content: '';
position: fixed;
top: 0; left: 0; width: 100vw; height: 100vh;
background: radial-gradient(circle at 50% 50%, rgba(100,180,255,0.08), transparent 60%);
pointer-events: none;
z-index: -1;
}
.card, .kpi, .panel, .btn {
transition: all 0.3s cubic-bezier(0.2,0,0.1,1);
}
.card:hover, .kpi:hover, .panel:hover {
box-shadow: 0 4px 20px rgba(100,180,255,0.2);
border-color: rgba(100,180,255,0.5);
}
@keyframes pulseD60 {
0%,100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.7; transform: scale(1.05); }
}
.pulse, .live-indicator, .active, .online {
animation: pulseD60 3s ease-in-out infinite;
}
.modal, .chat, .speech, .overlay {
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
}
.enter-stagger {
animation: enterStagD60 0.5s cubic-bezier(0.2,0,0.1,1) forwards;
}
@keyframes enterStagD60 {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
</style>
</head><body>
<!-- BETON-DOCTRINE-101 dual-dummy block (pages pub) -->
<div id="weval-global-logout" style="display:none!important;visibility:hidden!important" aria-hidden="true" data-beton-101="dummy-to-block-auto-injection"></div>
@@ -1681,4 +1720,21 @@ if(typeof window._deptUpdate==='function') window._deptUpdate();
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr tour30) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
<!-- DOCTRINE-60-UX-JS --><script id="doctrine60-ux-js-direct">
// DOCTRINE-60-UX-JS staggered entrance
(function(){
if (!('IntersectionObserver' in window)) return;
const obs = new IntersectionObserver((entries) => {
entries.forEach((e, i) => {
if (e.isIntersecting) {
setTimeout(() => e.target.classList.add('enter-stagger'), i * 80);
obs.unobserve(e.target);
}
});
});
document.querySelectorAll('.card, .kpi, .panel').forEach(el => obs.observe(el));
})();
</script>
</body></html>

View File

@@ -68,6 +68,45 @@ html::-webkit-scrollbar-thumb:hover,body::-webkit-scrollbar-thumb:hover{backgrou
.opus-x-btn{display:none!important;visibility:hidden!important;pointer-events:none!important}
</style>
<script src="/widgets/audit-banner.js" defer></script>
<!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-130137 -->
<style id="doctrine60-ux-direct">
/* DOCTRINE-60-UX-ENRICH injected-direct */
body::before {
content: '';
position: fixed;
top: 0; left: 0; width: 100vw; height: 100vh;
background: radial-gradient(circle at 50% 50%, rgba(100,180,255,0.08), transparent 60%);
pointer-events: none;
z-index: -1;
}
.card, .kpi, .panel, .btn {
transition: all 0.3s cubic-bezier(0.2,0,0.1,1);
}
.card:hover, .kpi:hover, .panel:hover {
box-shadow: 0 4px 20px rgba(100,180,255,0.2);
border-color: rgba(100,180,255,0.5);
}
@keyframes pulseD60 {
0%,100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.7; transform: scale(1.05); }
}
.pulse, .live-indicator, .active, .online {
animation: pulseD60 3s ease-in-out infinite;
}
.modal, .chat, .speech, .overlay {
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
}
.enter-stagger {
animation: enterStagD60 0.5s cubic-bezier(0.2,0,0.1,1) forwards;
}
@keyframes enterStagD60 {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
</style>
</head>
<body>
<div class="amb"><div class="orb o1"></div><div class="orb o2"></div><div class="orb o3"></div></div>
@@ -1897,5 +1936,22 @@ document.addEventListener('DOMContentLoaded',()=>{const s=document.createElement
})();
</script>
<!-- DOCTRINE-60-UX-JS --><script id="doctrine60-ux-js-direct">
// DOCTRINE-60-UX-JS staggered entrance
(function(){
if (!('IntersectionObserver' in window)) return;
const obs = new IntersectionObserver((entries) => {
entries.forEach((e, i) => {
if (e.isIntersecting) {
setTimeout(() => e.target.classList.add('enter-stagger'), i * 80);
obs.unobserve(e.target);
}
});
});
document.querySelectorAll('.card, .kpi, .panel').forEach(el => obs.observe(el));
})();
</script>
</body>
</html>