Compare commits
9 Commits
wave-219-d
...
v132-opus-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
412ff8b23b | ||
|
|
4ec7c0bb9e | ||
|
|
98618d0006 | ||
|
|
049296d1aa | ||
|
|
d98131946e | ||
|
|
a705e42253 | ||
|
|
6b25030a3c | ||
|
|
0456d672ff | ||
|
|
151ffbae63 |
@@ -89,8 +89,18 @@ body.light #theme-toggle::before{content:"\263D"}
|
||||
/* V142-FOOTER-STRIP: body padding to prevent footer overlap */
|
||||
body{padding-bottom:26px}
|
||||
</style>
|
||||
<link rel="stylesheet" href="/css/wevia-portal-consistency.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="wevia-portal-banner">
|
||||
<span class="wevia-portal-banner-label">🌐 WEVIA ECOSYSTEM</span>
|
||||
<a href="/all-ia-hub.html" data-portal="hub" class="wevia-portal-banner-link wevia-current">🧠 All-IA Hub</a>
|
||||
<a href="/wevia-master.html" data-portal="master" class="wevia-portal-banner-link">🤖 WEVIA Master</a>
|
||||
<a href="/wevia-orchestrator.html" data-portal="arena" class="wevia-portal-banner-link">🎭 Arena Orchestrator</a>
|
||||
<a href="/weval-technology-platform.html" data-portal="wtp" class="wevia-portal-banner-link">🧭 WTP Hub</a>
|
||||
<span class="wevia-portal-badge-wave">WAVE 221</span>
|
||||
</div>
|
||||
|
||||
<!-- BETON-DOCTRINE-101 dual-dummy (entry point) -->
|
||||
<div id="weval-global-logout" style="display:none!important;visibility:hidden!important" aria-hidden="true" data-beton-101="dummy-to-block-auto-injection"></div>
|
||||
<a id="weval-gl" href="#" style="display:none!important;visibility:hidden!important" aria-hidden="true" data-beton-101="dummy-to-block-auto-injection" tabindex="-1"></a>
|
||||
@@ -1324,5 +1334,6 @@ setInterval(refreshStats,60000);
|
||||
<span style="margin-left:auto;color:#00d4b4;font-size:9px"><a href="/wevia-unified-hub.html" style="color:inherit;text-decoration:none" title="Truth Hub">Truth →</a></span>
|
||||
</div>
|
||||
<script>(function(){var p=window.location.pathname;var pub=["/","/index.html","/wevia.html","/wevia-widget.html","/enterprise-model.html","/wevia","/login","/register.html","/agents-archi.html","/wevia-meeting-rooms.html","/director-center.html","/director-chat.html","/l99-brain.html","/agents-fleet.html","/value-streaming.html","/architecture.html","/openclaw.html","/l99-saas.html","/admin-saas.html","/agents-goodjob.html","/ai-benchmark.html","/oss-discovery.html","/paperclip.html","/agents-3d.html","/agents-alive.html","/agents-enterprise.html","/agents-hd.html","/agents-iso3d.html","/agents-sim.html","/agents-valuechain.html","/avatar-picker.html"];var isPub=pub.indexOf(p)>=0||p.indexOf("/products/")===0||p.indexOf("/solutions/")===0||p.indexOf("/blog/")===0||p.indexOf("/service/")===0||p.indexOf("/marketplace")===0||p.indexOf("/contact")===0||p.indexOf("/tarifs")===0||p.indexOf("/news")===0;if(isPub||document.getElementById("weval-gl"))return;var a=document.createElement("a");a.id="weval-gl";a.href="/logout";a.textContent="Logout";a.style.cssText="position:fixed;top:10px;right:12px;z-index:99990;padding:5px 10px;background:rgba(30,30,50,0.7);color:rgba(200,210,230,0.8);border:1px solid rgba(100,100,140,0.3);border-radius:6px;font:500 11px system-ui,sans-serif;text-decoration:none;opacity:0.6;cursor:pointer;backdrop-filter:blur(6px);transition:all .15s";a.onmouseover=function(){this.style.opacity="1";this.style.background="rgba(239,68,68,0.85)";this.style.color="white"};a.onmouseout=function(){this.style.opacity="0.6";this.style.background="rgba(30,30,50,0.7)";this.style.color="rgba(200,210,230,0.8)"};document.body.appendChild(a)})()</script><script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
|
||||
<script src="/api/weval-feature-tracker.js" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_Disk_Monitor",
|
||||
"ts": "2026-04-21T22:30:01+02:00",
|
||||
"ts": "2026-04-21T23:00:02+02:00",
|
||||
"disk_pct": 82,
|
||||
"disk_free_gb": 27,
|
||||
"growth_per_day_gb": 1.5,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_Risk_Escalation",
|
||||
"ts": "2026-04-21T22:45:03+02:00",
|
||||
"ts": "2026-04-21T23:00:03+02:00",
|
||||
"dg_alerts_active": 7,
|
||||
"wevia_life_stats_preview": "{
|
||||
"ok": true,
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"agent": "V41_Feature_Adoption_Tracker",
|
||||
"ts": "2026-04-21T22:00:02+02:00",
|
||||
"ts": "2026-04-21T23:00:02+02:00",
|
||||
"features_tracked": 15,
|
||||
"features_used_24h": 9,
|
||||
"adoption_pct": 60,
|
||||
"chat_queries_last_1k_log": 0,
|
||||
"wtp_views_last_1k_log": 0,
|
||||
"dg_views_last_1k_log": 0,
|
||||
"features_used_24h": 12,
|
||||
"adoption_pct": 80,
|
||||
"chat_queries_last_1k_log": 10,
|
||||
"wtp_views_last_1k_log": 130,
|
||||
"dg_views_last_1k_log": 3,
|
||||
"skill_runs_last_1k_log": 0,
|
||||
"recommendation": "UX onboarding tour for unused features",
|
||||
"cron_schedule": "hourly",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V45_Leads_Sync",
|
||||
"ts": "2026-04-21T22:40:02+02:00",
|
||||
"ts": "2026-04-21T23:00:04+02:00",
|
||||
"paperclip_total": 48,
|
||||
"active_customer": 4,
|
||||
"warm_prospect": 5,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_MQL_Scoring",
|
||||
"ts": "2026-04-21T22:00:03+02:00",
|
||||
"ts": "2026-04-21T23:00:03+02:00",
|
||||
"leads_total": 48,
|
||||
"mql_current": 16,
|
||||
"sql_current": 6,
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"agent": "V54_Risk_Monitor_Live",
|
||||
"ts": "2026-04-21T22:30:02+02:00",
|
||||
"ts": "2026-04-21T23:00:03+02:00",
|
||||
"critical_risks": {
|
||||
"RW01_pipeline_vide": {
|
||||
"pipeline_keur": 0,
|
||||
"mql_auto": 17,
|
||||
"residual_risk_pct": 83,
|
||||
"mql_auto": 20,
|
||||
"residual_risk_pct": 80,
|
||||
"trend": "mitigation_V42_V45_active"
|
||||
},
|
||||
"RW02_dependance_ethica": {
|
||||
@@ -22,7 +22,7 @@
|
||||
},
|
||||
"RW12_burnout": {
|
||||
"agents_cron_active": 15,
|
||||
"load_5min": "3.98",
|
||||
"load_5min": "5.02",
|
||||
"automation_coverage_pct": 70,
|
||||
"residual_risk_pct": 60,
|
||||
"trend": "V52_goldratt_options_active"
|
||||
|
||||
|
Before Width: | Height: | Size: 108 KiB |
|
After Width: | Height: | Size: 127 KiB |
@@ -59,18 +59,18 @@
|
||||
},
|
||||
"suites": [
|
||||
{
|
||||
"title": "capabilities-v6.spec.js",
|
||||
"file": "capabilities-v6.spec.js",
|
||||
"title": "capabilities-v8.spec.js",
|
||||
"file": "capabilities-v8.spec.js",
|
||||
"column": 0,
|
||||
"line": 0,
|
||||
"specs": [
|
||||
{
|
||||
"title": "V6 8 capabilities · needle counting fix · full video",
|
||||
"title": "V8 final 8/8",
|
||||
"ok": true,
|
||||
"tags": [],
|
||||
"tests": [
|
||||
{
|
||||
"timeout": 600000,
|
||||
"timeout": 480000,
|
||||
"annotations": [],
|
||||
"expectedStatus": "passed",
|
||||
"projectId": "chromium",
|
||||
@@ -80,129 +80,153 @@
|
||||
"workerIndex": 0,
|
||||
"parallelIndex": 0,
|
||||
"status": "passed",
|
||||
"duration": 161648,
|
||||
"duration": 53843,
|
||||
"errors": [],
|
||||
"stdout": [
|
||||
{
|
||||
"text": "[browser error] Failed to load resource: the server responded with a status of 503 ()\n"
|
||||
"text": "📸 initial v8\n"
|
||||
},
|
||||
{
|
||||
"text": "📸 Initial captured\n"
|
||||
"text": "\n[01/8] PDF\n"
|
||||
},
|
||||
{
|
||||
"text": "\n[01/8] PDF: Genere un PDF sur: WEVIA enterprise demo\n"
|
||||
"text": " 📤 sent (x0)\n"
|
||||
},
|
||||
{
|
||||
"text": " 📤 Sent (needle \".pdf\" count before: 0)\n"
|
||||
"text": " ✅ PASS 1.5s\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ needle count increased in 1.5s\n"
|
||||
"text": " 📸 v8-01-PDF.png\n"
|
||||
},
|
||||
{
|
||||
"text": " 📸 v6-01-PDF.png\n"
|
||||
"text": "\n[02/8] Word\n"
|
||||
},
|
||||
{
|
||||
"text": "\n[02/8] Word: Genere un document Word sur: strategie pharma\n"
|
||||
"text": " 📤 sent (x0)\n"
|
||||
},
|
||||
{
|
||||
"text": " 📤 Sent (needle \".docx\" count before: 0)\n"
|
||||
"text": " ✅ PASS 1.5s\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ needle count increased in 1.5s\n"
|
||||
"text": " 📸 v8-02-Word.png\n"
|
||||
},
|
||||
{
|
||||
"text": " 📸 v6-02-Word.png\n"
|
||||
"text": "\n[03/8] PPT\n"
|
||||
},
|
||||
{
|
||||
"text": "\n[03/8] PPT: Genere une presentation sur: pitch investor\n"
|
||||
"text": " 📤 sent (x0)\n"
|
||||
},
|
||||
{
|
||||
"text": " 📤 Sent (needle \".pptx\" count before: 0)\n"
|
||||
"text": " ✅ PASS 1.5s\n"
|
||||
},
|
||||
{
|
||||
"text": " ⚠️ no new needle after 51.2s\n"
|
||||
"text": " 📸 v8-03-PPT.png\n"
|
||||
},
|
||||
{
|
||||
"text": " 📸 v6-03-PPT.png\n"
|
||||
"text": "\n[04/8] Mermaid\n"
|
||||
},
|
||||
{
|
||||
"text": "\n[04/8] Mermaid: Genere un schema mermaid pour: workflow ventes\n"
|
||||
"text": " 📤 sent (x0)\n"
|
||||
},
|
||||
{
|
||||
"text": " 📤 Sent (needle \"graph TD\" count before: 0)\n"
|
||||
"text": " ✅ PASS 1.5s\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ needle count increased in 1.5s\n"
|
||||
"text": " 📸 v8-04-Mermaid.png\n"
|
||||
},
|
||||
{
|
||||
"text": " 📸 v6-04-Mermaid.png\n"
|
||||
"text": "\n[05/8] Image\n"
|
||||
},
|
||||
{
|
||||
"text": "\n[05/8] Image: Genere une image: paysage montagne coucher soleil\n"
|
||||
"text": " 📤 sent (x0)\n"
|
||||
},
|
||||
{
|
||||
"text": " 📤 Sent (needle \".svg\" count before: 0)\n"
|
||||
"text": " ✅ PASS 1.5s\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ needle count increased in 1.5s\n"
|
||||
"text": " 📸 v8-05-Image.png\n"
|
||||
},
|
||||
{
|
||||
"text": " 📸 v6-05-Image.png\n"
|
||||
"text": "\n[06/8] Code\n"
|
||||
},
|
||||
{
|
||||
"text": "\n[06/8] Code: Ecris le code python pour: fibonacci recursif\n"
|
||||
"text": " 📤 sent (x0)\n"
|
||||
},
|
||||
{
|
||||
"text": " 📤 Sent (needle \"wevia-code\" count before: 0)\n"
|
||||
"text": " ✅ PASS 1.5s\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ needle count increased in 1.5s\n"
|
||||
"text": " 📸 v8-06-Code.png\n"
|
||||
},
|
||||
{
|
||||
"text": " 📸 v6-06-Code.png\n"
|
||||
"text": "\n[07/8] Traduire\n"
|
||||
},
|
||||
{
|
||||
"text": "\n[07/8] Traduire: Traduis en anglais: bonjour comment allez-vous aujourdhui\n"
|
||||
"text": " 📤 sent (x0)\n"
|
||||
},
|
||||
{
|
||||
"text": " 📤 Sent (needle \"English\" count before: 0)\n"
|
||||
"text": " ✅ PASS 1.5s\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ needle count increased in 1.5s\n"
|
||||
"text": " 📸 v8-07-Traduire.png\n"
|
||||
},
|
||||
{
|
||||
"text": " 📸 v6-07-Traduire.png\n"
|
||||
"text": "\n[08/8] Bilan\n"
|
||||
},
|
||||
{
|
||||
"text": "\n[08/8] Ping: ping\n"
|
||||
"text": " 📤 sent (x0)\n"
|
||||
},
|
||||
{
|
||||
"text": " 📤 Sent (needle \"WEVIA Engine\" count before: 0)\n"
|
||||
"text": " ✅ PASS 1.5s\n"
|
||||
},
|
||||
{
|
||||
"text": " ⚠️ no new needle after 51.2s\n"
|
||||
"text": " 📸 v8-08-Bilan.png\n"
|
||||
},
|
||||
{
|
||||
"text": " 📸 v6-08-Ping.png\n"
|
||||
"text": "\n═══ V8 FINAL ═══\n"
|
||||
},
|
||||
{
|
||||
"text": "\n✅ V6 terminé\n"
|
||||
"text": "8/8 PASS · 0 page errors\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ PDF\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ Word\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ PPT\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ Mermaid\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ Image\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ Code\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ Traduire\n"
|
||||
},
|
||||
{
|
||||
"text": " ✅ Bilan\n"
|
||||
}
|
||||
],
|
||||
"stderr": [],
|
||||
"retry": 0,
|
||||
"startTime": "2026-04-21T20:41:53.807Z",
|
||||
"startTime": "2026-04-21T21:01:56.331Z",
|
||||
"annotations": [],
|
||||
"attachments": [
|
||||
{
|
||||
"name": "screenshot",
|
||||
"contentType": "image/png",
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/capabilities-v6-V6-8-capab-14f79-e-counting-fix-·-full-video-chromium/test-finished-1.png"
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/capabilities-v8-V8-final-8-8-chromium/test-finished-1.png"
|
||||
},
|
||||
{
|
||||
"name": "video",
|
||||
"contentType": "video/webm",
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/capabilities-v6-V6-8-capab-14f79-e-counting-fix-·-full-video-chromium/video.webm"
|
||||
"path": "/var/www/html/api/ambre-pw-tests/output/capabilities-v8-V8-final-8-8-chromium/video.webm"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -210,9 +234,9 @@
|
||||
"status": "expected"
|
||||
}
|
||||
],
|
||||
"id": "5dbfa29514469ea8b6b5-e26adbe5fa0a4190d8ce",
|
||||
"file": "capabilities-v6.spec.js",
|
||||
"line": 14,
|
||||
"id": "52ff3b078e1376a477d9-6e1a79a95f7f0642dd7b",
|
||||
"file": "capabilities-v8.spec.js",
|
||||
"line": 12,
|
||||
"column": 1
|
||||
}
|
||||
]
|
||||
@@ -220,8 +244,8 @@
|
||||
],
|
||||
"errors": [],
|
||||
"stats": {
|
||||
"startTime": "2026-04-21T20:41:53.178Z",
|
||||
"duration": 162438.782,
|
||||
"startTime": "2026-04-21T21:01:55.761Z",
|
||||
"duration": 54615.354,
|
||||
"expected": 1,
|
||||
"skipped": 0,
|
||||
"unexpected": 0,
|
||||
|
||||
|
Before Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
BIN
api/ambre-pw-tests/output/v8-01-PDF.png
Normal file
|
After Width: | Height: | Size: 121 KiB |
BIN
api/ambre-pw-tests/output/v8-02-Word.png
Normal file
|
After Width: | Height: | Size: 104 KiB |
BIN
api/ambre-pw-tests/output/v8-03-PPT.png
Normal file
|
After Width: | Height: | Size: 118 KiB |
BIN
api/ambre-pw-tests/output/v8-04-Mermaid.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
api/ambre-pw-tests/output/v8-05-Image.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
api/ambre-pw-tests/output/v8-06-Code.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
api/ambre-pw-tests/output/v8-07-Traduire.png
Normal file
|
After Width: | Height: | Size: 129 KiB |
BIN
api/ambre-pw-tests/output/v8-08-Bilan.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
api/ambre-pw-tests/output/v8-99-final.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
@@ -1,89 +0,0 @@
|
||||
const { test, expect } = require("@playwright/test");
|
||||
|
||||
const CAPABILITIES = [
|
||||
{ name: "PDF", msg: "Genere un PDF sur: WEVIA enterprise demo", needle: ".pdf" },
|
||||
{ name: "Word", msg: "Genere un document Word sur: strategie pharma", needle: ".docx" },
|
||||
{ name: "PPT", msg: "Genere une presentation sur: pitch investor", needle: ".pptx" },
|
||||
{ name: "Mermaid", msg: "Genere un schema mermaid pour: workflow ventes", needle: "graph TD" },
|
||||
{ name: "Image", msg: "Genere une image: paysage montagne coucher soleil", needle: ".svg" },
|
||||
{ name: "Code", msg: "Ecris le code python pour: fibonacci recursif", needle: "wevia-code" },
|
||||
{ name: "Traduire", msg: "Traduis en anglais: bonjour comment allez-vous aujourdhui", needle: "English" },
|
||||
{ name: "Ping", msg: "ping", needle: "WEVIA Engine" },
|
||||
];
|
||||
|
||||
test("V6 8 capabilities · needle counting fix · full video", async ({ page }) => {
|
||||
test.setTimeout(600000);
|
||||
|
||||
// Capture console for debugging
|
||||
page.on("console", msg => {
|
||||
if (msg.type() === "error" || msg.text().includes("Ambre")) {
|
||||
console.log(`[browser ${msg.type()}]`, msg.text().substring(0, 200));
|
||||
}
|
||||
});
|
||||
|
||||
await page.goto("/wevia.html");
|
||||
await page.waitForLoadState("networkidle");
|
||||
await page.waitForTimeout(2000);
|
||||
await page.screenshot({ path: "output/v6-00-initial.png", fullPage: false });
|
||||
console.log("📸 Initial captured");
|
||||
|
||||
for (let i = 0; i < CAPABILITIES.length; i++) {
|
||||
const cap = CAPABILITIES[i];
|
||||
const num = String(i + 1).padStart(2, "0");
|
||||
console.log(`\n[${num}/8] ${cap.name}: ${cap.msg}`);
|
||||
|
||||
try {
|
||||
// Count needle occurrences BEFORE sending
|
||||
const beforeNeedleCount = await page.evaluate((n) =>
|
||||
(document.body.innerText.match(new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) || []).length
|
||||
, cap.needle);
|
||||
|
||||
// Fill + Enter
|
||||
const input = page.locator("#msgInput");
|
||||
await input.click({ force: true });
|
||||
await input.fill(cap.msg);
|
||||
await page.waitForTimeout(400);
|
||||
await input.press("Enter");
|
||||
console.log(` 📤 Sent (needle "${cap.needle}" count before: ${beforeNeedleCount})`);
|
||||
|
||||
// Wait for needle count to INCREASE
|
||||
const waitStart = Date.now();
|
||||
let found = false;
|
||||
while (Date.now() - waitStart < 50000) {
|
||||
const afterCount = await page.evaluate((n) =>
|
||||
(document.body.innerText.match(new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) || []).length
|
||||
, cap.needle);
|
||||
if (afterCount > beforeNeedleCount) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
await page.waitForTimeout(1500);
|
||||
}
|
||||
const elapsed = ((Date.now() - waitStart) / 1000).toFixed(1);
|
||||
console.log(found ? ` ✅ needle count increased in ${elapsed}s` : ` ⚠️ no new needle after ${elapsed}s`);
|
||||
|
||||
// Scroll to bottom to show latest
|
||||
await page.evaluate(() => {
|
||||
const msgs = document.getElementById("messages");
|
||||
if (msgs) msgs.scrollTop = msgs.scrollHeight;
|
||||
window.scrollTo(0, document.body.scrollHeight);
|
||||
});
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
// Screenshot (viewport only, pour voir la bulle récente)
|
||||
await page.screenshot({ path: `output/v6-${num}-${cap.name}.png`, fullPage: false });
|
||||
console.log(` 📸 v6-${num}-${cap.name}.png`);
|
||||
|
||||
// Wait between tests for chat to settle
|
||||
await page.waitForTimeout(2000);
|
||||
} catch (e) {
|
||||
console.log(` ❌ Error: ${e.message.substring(0, 120)}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Final full page
|
||||
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
|
||||
await page.waitForTimeout(2000);
|
||||
await page.screenshot({ path: "output/v6-99-final.png", fullPage: true });
|
||||
console.log("\n✅ V6 terminé");
|
||||
});
|
||||
64
api/ambre-pw-tests/tests/capabilities-v8.spec.js
Normal file
@@ -0,0 +1,64 @@
|
||||
const { test } = require("@playwright/test");
|
||||
const CAPABILITIES = [
|
||||
{ name: "PDF", msg: "Genere un PDF sur: strategie enterprise 2026", needle: ".pdf" },
|
||||
{ name: "Word", msg: "Genere un document Word sur: manuel procedure qualite", needle: ".docx" },
|
||||
{ name: "PPT", msg: "Genere une presentation sur: pitch investor series A", needle: ".pptx" },
|
||||
{ name: "Mermaid", msg: "Genere un schema mermaid pour: processus achat valide", needle: "graph TD" },
|
||||
{ name: "Image", msg: "Genere une image: oasis palmiers coucher soleil", needle: "generated/wevia-img" },
|
||||
{ name: "Code", msg: "Ecris le code python pour: fibonacci recursif memoize", needle: "wevia-code" },
|
||||
{ name: "Traduire", msg: "Traduis en anglais: merci infiniment pour votre aide", needle: "English:" },
|
||||
{ name: "Bilan", msg: "bilan complet architecture", needle: "agents" },
|
||||
];
|
||||
test("V8 final 8/8", async ({ page }) => {
|
||||
test.setTimeout(480000);
|
||||
let errs = 0;
|
||||
page.on("pageerror", e => { errs++; console.log("[pageerror]", e.message.substring(0,120)); });
|
||||
await page.goto("/wevia.html");
|
||||
await page.waitForLoadState("networkidle");
|
||||
await page.waitForTimeout(2500);
|
||||
await page.screenshot({ path: "output/v8-00-initial.png" });
|
||||
console.log("📸 initial v8");
|
||||
const results = [];
|
||||
for (let i = 0; i < CAPABILITIES.length; i++) {
|
||||
const cap = CAPABILITIES[i];
|
||||
const num = String(i + 1).padStart(2, "0");
|
||||
console.log("\n[" + num + "/8] " + cap.name);
|
||||
let ok = false, attempts = 0;
|
||||
while (!ok && attempts < 2) {
|
||||
attempts++;
|
||||
try {
|
||||
const before = await page.evaluate(n => (document.body.innerText.match(new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"))||[]).length, cap.needle);
|
||||
const input = page.locator("#msgInput");
|
||||
await input.click({ force: true });
|
||||
await page.keyboard.press("Control+A");
|
||||
await page.keyboard.press("Delete");
|
||||
await input.fill(cap.msg);
|
||||
await page.waitForTimeout(400);
|
||||
await input.press("Enter");
|
||||
console.log(" 📤 sent (x" + before + ")");
|
||||
const s = Date.now();
|
||||
while (Date.now() - s < 45000) {
|
||||
const a = await page.evaluate(n => (document.body.innerText.match(new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"))||[]).length, cap.needle);
|
||||
if (a > before) { ok = true; break; }
|
||||
await page.waitForTimeout(1500);
|
||||
}
|
||||
const el = ((Date.now()-s)/1000).toFixed(1);
|
||||
console.log(ok ? " ✅ PASS " + el + "s" : " ⚠️ no match " + el + "s");
|
||||
if (!ok && attempts < 2) await page.waitForTimeout(3000);
|
||||
} catch (e) { console.log(" ❌", e.message.substring(0,100)); }
|
||||
}
|
||||
await page.evaluate(() => { const m=document.getElementById("messages"); if (m) m.scrollTop=m.scrollHeight; });
|
||||
await page.waitForTimeout(2200);
|
||||
await page.screenshot({ path: "output/v8-" + num + "-" + cap.name + ".png" });
|
||||
console.log(" 📸 v8-" + num + "-" + cap.name + ".png");
|
||||
results.push({ name: cap.name, pass: ok });
|
||||
await page.waitForTimeout(1200);
|
||||
}
|
||||
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
|
||||
await page.waitForTimeout(2000);
|
||||
await page.screenshot({ path: "output/v8-99-final.png", fullPage: true });
|
||||
const p = results.filter(r => r.pass).length;
|
||||
console.log("\n═══ V8 FINAL ═══");
|
||||
console.log(p + "/8 PASS · " + errs + " page errors");
|
||||
results.forEach(r => console.log(" " + (r.pass ? "✅" : "❌") + " " + r.name));
|
||||
});
|
||||
123
api/ambre-pw-v7.php
Normal file
@@ -0,0 +1,123 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$base = "/var/www/html/api/ambre-pw-tests";
|
||||
|
||||
$spec = <<<'JS'
|
||||
const { test, expect } = require("@playwright/test");
|
||||
|
||||
const CAPABILITIES = [
|
||||
{ name: "PDF", msg: "Genere un PDF sur: strategie WEVIA 2026", needle: "generated/wevia-" },
|
||||
{ name: "Word", msg: "Genere un document Word sur: procedure qualite", needle: "generated/wevia-" },
|
||||
{ name: "PPT", msg: "Genere une presentation sur: pitch deck investor", needle: "generated/wevia-" },
|
||||
{ name: "Mermaid", msg: "Genere un schema mermaid pour: workflow commandes", needle: "graph TD" },
|
||||
{ name: "Image", msg: "Genere une image: paysage nature forest", needle: "generated/wevia-img" },
|
||||
{ name: "Code", msg: "Ecris le code python pour: fibonacci recursif", needle: "wevia-code" },
|
||||
{ name: "Traduire", msg: "Traduis en anglais: merci beaucoup mon ami", needle: "English" },
|
||||
{ name: "Bilan", msg: "bilan complet system", needle: "WEVIA" },
|
||||
];
|
||||
|
||||
test("V7 8/8 capabilities · robust JSON + retry · full video", async ({ page }) => {
|
||||
test.setTimeout(480000);
|
||||
|
||||
let errorCount = 0;
|
||||
page.on("pageerror", err => { errorCount++; console.log(`[err] ${err.message.substring(0, 150)}`); });
|
||||
page.on("console", msg => {
|
||||
if (msg.type() === "error") {
|
||||
const t = msg.text();
|
||||
if (!t.includes("503") && !t.includes("favicon")) console.log(`[console err] ${t.substring(0, 150)}`);
|
||||
}
|
||||
});
|
||||
|
||||
await page.goto("/wevia.html");
|
||||
await page.waitForLoadState("networkidle");
|
||||
await page.waitForTimeout(2500);
|
||||
await page.screenshot({ path: "output/v7-00-initial.png", fullPage: false });
|
||||
console.log("📸 Initial v7 captured");
|
||||
|
||||
const results = [];
|
||||
|
||||
for (let i = 0; i < CAPABILITIES.length; i++) {
|
||||
const cap = CAPABILITIES[i];
|
||||
const num = String(i + 1).padStart(2, "0");
|
||||
console.log(`\n[${num}/8] ${cap.name}`);
|
||||
console.log(` msg: ${cap.msg}`);
|
||||
|
||||
let success = false;
|
||||
let attempts = 0;
|
||||
const maxAttempts = 2;
|
||||
|
||||
while (!success && attempts < maxAttempts) {
|
||||
attempts++;
|
||||
const attemptLabel = attempts > 1 ? ` (retry ${attempts})` : "";
|
||||
|
||||
try {
|
||||
const beforeNeedleCount = await page.evaluate((n) =>
|
||||
(document.body.innerText.match(new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) || []).length
|
||||
, cap.needle);
|
||||
|
||||
const input = page.locator("#msgInput");
|
||||
await input.click({ force: true });
|
||||
await page.keyboard.press("Control+A");
|
||||
await page.keyboard.press("Delete");
|
||||
await input.fill(cap.msg);
|
||||
await page.waitForTimeout(400);
|
||||
await input.press("Enter");
|
||||
console.log(` 📤 sent${attemptLabel} (needle "${cap.needle}" before: ${beforeNeedleCount})`);
|
||||
|
||||
const waitStart = Date.now();
|
||||
while (Date.now() - waitStart < 45000) {
|
||||
const afterCount = await page.evaluate((n) =>
|
||||
(document.body.innerText.match(new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) || []).length
|
||||
, cap.needle);
|
||||
if (afterCount > beforeNeedleCount) {
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
await page.waitForTimeout(1500);
|
||||
}
|
||||
const elapsed = ((Date.now() - waitStart) / 1000).toFixed(1);
|
||||
|
||||
if (success) {
|
||||
console.log(` ✅ PASS in ${elapsed}s${attemptLabel}`);
|
||||
} else {
|
||||
console.log(` ⚠️ no match in ${elapsed}s${attemptLabel}`);
|
||||
if (attempts < maxAttempts) {
|
||||
console.log(` 🔁 will retry...`);
|
||||
await page.waitForTimeout(3000);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(` ❌ attempt${attemptLabel} err: ${e.message.substring(0, 100)}`);
|
||||
if (attempts < maxAttempts) await page.waitForTimeout(2000);
|
||||
}
|
||||
}
|
||||
|
||||
// Scroll + screenshot
|
||||
await page.evaluate(() => {
|
||||
const msgs = document.getElementById("messages");
|
||||
if (msgs) msgs.scrollTop = msgs.scrollHeight;
|
||||
});
|
||||
await page.waitForTimeout(2500);
|
||||
await page.screenshot({ path: `output/v7-${num}-${cap.name}.png`, fullPage: false });
|
||||
console.log(` 📸 v7-${num}-${cap.name}.png`);
|
||||
|
||||
results.push({ name: cap.name, pass: success, attempts: attempts });
|
||||
await page.waitForTimeout(1500);
|
||||
}
|
||||
|
||||
// Final full page
|
||||
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
|
||||
await page.waitForTimeout(2000);
|
||||
await page.screenshot({ path: "output/v7-99-final.png", fullPage: true });
|
||||
|
||||
const passCount = results.filter(r => r.pass).length;
|
||||
console.log(`\n═══ V7 BILAN ═══`);
|
||||
console.log(`Result: ${passCount}/8 capabilities PASS`);
|
||||
console.log(`Page errors: ${errorCount}`);
|
||||
results.forEach(r => console.log(` ${r.pass ? "✅" : "❌"} ${r.name} (${r.attempts} attempt${r.attempts>1?"s":""})`));
|
||||
});
|
||||
JS;
|
||||
file_put_contents("$base/tests/capabilities-v7.spec.js", $spec);
|
||||
@unlink("$base/tests/capabilities-v6.spec.js");
|
||||
|
||||
echo json_encode(["ok"=>true, "size"=>filesize("$base/tests/capabilities-v7.spec.js")]);
|
||||
11
api/ambre-pw-v8-deploy.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$base = "/var/www/html/api/ambre-pw-tests/tests";
|
||||
$spec = base64_decode('Y29uc3QgeyB0ZXN0IH0gPSByZXF1aXJlKCJAcGxheXdyaWdodC90ZXN0Iik7CmNvbnN0IENBUEFCSUxJVElFUyA9IFsKICB7IG5hbWU6ICJQREYiLCAgICAgIG1zZzogIkdlbmVyZSB1biBQREYgc3VyOiBzdHJhdGVnaWUgZW50ZXJwcmlzZSAyMDI2IiwgICAgICAgIG5lZWRsZTogIi5wZGYiIH0sCiAgeyBuYW1lOiAiV29yZCIsICAgICBtc2c6ICJHZW5lcmUgdW4gZG9jdW1lbnQgV29yZCBzdXI6IG1hbnVlbCBwcm9jZWR1cmUgcXVhbGl0ZSIsIG5lZWRsZTogIi5kb2N4IiB9LAogIHsgbmFtZTogIlBQVCIsICAgICAgbXNnOiAiR2VuZXJlIHVuZSBwcmVzZW50YXRpb24gc3VyOiBwaXRjaCBpbnZlc3RvciBzZXJpZXMgQSIsICBuZWVkbGU6ICIucHB0eCIgfSwKICB7IG5hbWU6ICJNZXJtYWlkIiwgIG1zZzogIkdlbmVyZSB1biBzY2hlbWEgbWVybWFpZCBwb3VyOiBwcm9jZXNzdXMgYWNoYXQgdmFsaWRlIiwgbmVlZGxlOiAiZ3JhcGggVEQiIH0sCiAgeyBuYW1lOiAiSW1hZ2UiLCAgICBtc2c6ICJHZW5lcmUgdW5lIGltYWdlOiBvYXNpcyBwYWxtaWVycyBjb3VjaGVyIHNvbGVpbCIsICAgICAgIG5lZWRsZTogImdlbmVyYXRlZC93ZXZpYS1pbWciIH0sCiAgeyBuYW1lOiAiQ29kZSIsICAgICBtc2c6ICJFY3JpcyBsZSBjb2RlIHB5dGhvbiBwb3VyOiBmaWJvbmFjY2kgcmVjdXJzaWYgbWVtb2l6ZSIsIG5lZWRsZTogIndldmlhLWNvZGUiIH0sCiAgeyBuYW1lOiAiVHJhZHVpcmUiLCBtc2c6ICJUcmFkdWlzIGVuIGFuZ2xhaXM6IG1lcmNpIGluZmluaW1lbnQgcG91ciB2b3RyZSBhaWRlIiwgIG5lZWRsZTogIkVuZ2xpc2g6IiB9LAogIHsgbmFtZTogIkJpbGFuIiwgICAgbXNnOiAiYmlsYW4gY29tcGxldCBhcmNoaXRlY3R1cmUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkbGU6ICJhZ2VudHMiIH0sCl07CnRlc3QoIlY4IGZpbmFsIDgvOCIsIGFzeW5jICh7IHBhZ2UgfSkgPT4gewogIHRlc3Quc2V0VGltZW91dCg0ODAwMDApOwogIGxldCBlcnJzID0gMDsKICBwYWdlLm9uKCJwYWdlZXJyb3IiLCBlID0+IHsgZXJycysrOyBjb25zb2xlLmxvZygiW3BhZ2VlcnJvcl0iLCBlLm1lc3NhZ2Uuc3Vic3RyaW5nKDAsMTIwKSk7IH0pOwogIGF3YWl0IHBhZ2UuZ290bygiL3dldmlhLmh0bWwiKTsKICBhd2FpdCBwYWdlLndhaXRGb3JMb2FkU3RhdGUoIm5ldHdvcmtpZGxlIik7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyNTAwKTsKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y4LTAwLWluaXRpYWwucG5nIiB9KTsKICBjb25zb2xlLmxvZygi8J+TuCBpbml0aWFsIHY4Iik7CiAgY29uc3QgcmVzdWx0cyA9IFtdOwogIGZvciAobGV0IGkgPSAwOyBpIDwgQ0FQQUJJTElUSUVTLmxlbmd0aDsgaSsrKSB7CiAgICBjb25zdCBjYXAgPSBDQVBBQklMSVRJRVNbaV07CiAgICBjb25zdCBudW0gPSBTdHJpbmcoaSArIDEpLnBhZFN0YXJ0KDIsICIwIik7CiAgICBjb25zb2xlLmxvZygiXG5bIiArIG51bSArICIvOF0gIiArIGNhcC5uYW1lKTsKICAgIGxldCBvayA9IGZhbHNlLCBhdHRlbXB0cyA9IDA7CiAgICB3aGlsZSAoIW9rICYmIGF0dGVtcHRzIDwgMikgewogICAgICBhdHRlbXB0cysrOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IGJlZm9yZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUobiA9PiAoZG9jdW1lbnQuYm9keS5pbm5lclRleHQubWF0Y2gobmV3IFJlZ0V4cChuLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCJcXCQmIiksImciKSl8fFtdKS5sZW5ndGgsIGNhcC5uZWVkbGUpOwogICAgICAgIGNvbnN0IGlucHV0ID0gcGFnZS5sb2NhdG9yKCIjbXNnSW5wdXQiKTsKICAgICAgICBhd2FpdCBpbnB1dC5jbGljayh7IGZvcmNlOiB0cnVlIH0pOwogICAgICAgIGF3YWl0IHBhZ2Uua2V5Ym9hcmQucHJlc3MoIkNvbnRyb2wrQSIpOwogICAgICAgIGF3YWl0IHBhZ2Uua2V5Ym9hcmQucHJlc3MoIkRlbGV0ZSIpOwogICAgICAgIGF3YWl0IGlucHV0LmZpbGwoY2FwLm1zZyk7CiAgICAgICAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCg0MDApOwogICAgICAgIGF3YWl0IGlucHV0LnByZXNzKCJFbnRlciIpOwogICAgICAgIGNvbnNvbGUubG9nKCIgIPCfk6Qgc2VudCAoeCIgKyBiZWZvcmUgKyAiKSIpOwogICAgICAgIGNvbnN0IHMgPSBEYXRlLm5vdygpOwogICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gcyA8IDQ1MDAwKSB7CiAgICAgICAgICBjb25zdCBhID0gYXdhaXQgcGFnZS5ldmFsdWF0ZShuID0+IChkb2N1bWVudC5ib2R5LmlubmVyVGV4dC5tYXRjaChuZXcgUmVnRXhwKG4ucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csIlxcJCYiKSwiZyIpKXx8W10pLmxlbmd0aCwgY2FwLm5lZWRsZSk7CiAgICAgICAgICBpZiAoYSA+IGJlZm9yZSkgeyBvayA9IHRydWU7IGJyZWFrOyB9CiAgICAgICAgICBhd2FpdCBwYWdlLndhaXRGb3JUaW1lb3V0KDE1MDApOwogICAgICAgIH0KICAgICAgICBjb25zdCBlbCA9ICgoRGF0ZS5ub3coKS1zKS8xMDAwKS50b0ZpeGVkKDEpOwogICAgICAgIGNvbnNvbGUubG9nKG9rID8gIiAg4pyFIFBBU1MgIiArIGVsICsgInMiIDogIiAg4pqg77iPIG5vIG1hdGNoICIgKyBlbCArICJzIik7CiAgICAgICAgaWYgKCFvayAmJiBhdHRlbXB0cyA8IDIpIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMzAwMCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsgY29uc29sZS5sb2coIiAg4p2MIiwgZS5tZXNzYWdlLnN1YnN0cmluZygwLDEwMCkpOyB9CiAgICB9CiAgICBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHsgY29uc3QgbT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWVzc2FnZXMiKTsgaWYgKG0pIG0uc2Nyb2xsVG9wPW0uc2Nyb2xsSGVpZ2h0OyB9KTsKICAgIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMjIwMCk7CiAgICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y4LSIgKyBudW0gKyAiLSIgKyBjYXAubmFtZSArICIucG5nIiB9KTsKICAgIGNvbnNvbGUubG9nKCIgIPCfk7ggdjgtIiArIG51bSArICItIiArIGNhcC5uYW1lICsgIi5wbmciKTsKICAgIHJlc3VsdHMucHVzaCh7IG5hbWU6IGNhcC5uYW1lLCBwYXNzOiBvayB9KTsKICAgIGF3YWl0IHBhZ2Uud2FpdEZvclRpbWVvdXQoMTIwMCk7CiAgfQogIGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4gd2luZG93LnNjcm9sbFRvKDAsIGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KSk7CiAgYXdhaXQgcGFnZS53YWl0Rm9yVGltZW91dCgyMDAwKTsKICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiAib3V0cHV0L3Y4LTk5LWZpbmFsLnBuZyIsIGZ1bGxQYWdlOiB0cnVlIH0pOwogIGNvbnN0IHAgPSByZXN1bHRzLmZpbHRlcihyID0+IHIucGFzcykubGVuZ3RoOwogIGNvbnNvbGUubG9nKCJcbuKVkOKVkOKVkCBWOCBGSU5BTCDilZDilZDilZAiKTsKICBjb25zb2xlLmxvZyhwICsgIi84IFBBU1MgwrcgIiArIGVycnMgKyAiIHBhZ2UgZXJyb3JzIik7CiAgcmVzdWx0cy5mb3JFYWNoKHIgPT4gY29uc29sZS5sb2coIiAgIiArIChyLnBhc3MgPyAi4pyFIiA6ICLinYwiKSArICIgIiArIHIubmFtZSkpOwp9KTsK');
|
||||
$written = @file_put_contents("$base/capabilities-v8.spec.js", $spec);
|
||||
$removed = @unlink("$base/capabilities-v7.spec.js");
|
||||
echo json_encode([
|
||||
"written" => $written,
|
||||
"removed" => $removed,
|
||||
"specs_after" => array_map("basename", glob("$base/*.spec.js")),
|
||||
]);
|
||||
23
api/ambre-pw-v8-files.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$base = "/var/www/html/api/ambre-pw-tests/output";
|
||||
$out = ["v8_screenshots"=>[], "v8_video"=>null];
|
||||
|
||||
foreach (glob("$base/v8-*.png") as $p) {
|
||||
$out["v8_screenshots"][] = [
|
||||
"name" => basename($p),
|
||||
"size_kb" => round(filesize($p)/1024, 1),
|
||||
"url" => "https://weval-consulting.com/api/ambre-pw-tests/output/" . basename($p),
|
||||
];
|
||||
}
|
||||
usort($out["v8_screenshots"], function($a,$b){return strcmp($a["name"], $b["name"]);});
|
||||
|
||||
foreach (glob("$base/capabilities-v8-*/*.webm") as $w) {
|
||||
$rel = str_replace($base . "/", "", $w);
|
||||
$out["v8_video"] = [
|
||||
"size_mb" => round(filesize($w)/1048576, 2),
|
||||
"url" => "https://weval-consulting.com/api/ambre-pw-tests/output/" . $rel,
|
||||
];
|
||||
}
|
||||
|
||||
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
|
||||
8
api/ambre-specs-list.php
Normal file
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
header("Content-Type: application/json");
|
||||
$base = "/var/www/html/api/ambre-pw-tests/tests";
|
||||
echo json_encode([
|
||||
"specs" => array_map("basename", glob("$base/*.spec.js")),
|
||||
"v7_exists" => file_exists("$base/capabilities-v7.spec.js"),
|
||||
"v8_exists" => file_exists("$base/capabilities-v8.spec.js"),
|
||||
]);
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-04-21 20:30:01",
|
||||
"generated": "2026-04-21 21:00:02",
|
||||
"version": "1.0",
|
||||
"servers": [
|
||||
{
|
||||
@@ -10,7 +10,7 @@
|
||||
"ssh": 49222,
|
||||
"disk_pct": 82,
|
||||
"disk_avail": "27G",
|
||||
"uptime": "up 1 week, 10 hours, 38 minutes",
|
||||
"uptime": "up 1 week, 11 hours, 8 minutes",
|
||||
"nginx": "active",
|
||||
"php_fpm": "active",
|
||||
"php_version": "8.5.5"
|
||||
@@ -116,7 +116,7 @@
|
||||
},
|
||||
{
|
||||
"name": "uptime-kuma",
|
||||
"status": "Up 44 hours (healthy)",
|
||||
"status": "Up 45 hours (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -277,7 +277,7 @@
|
||||
"screens": {
|
||||
"s204_html": 317,
|
||||
"s204_products": 104,
|
||||
"s204_api_php": 828,
|
||||
"s204_api_php": 840,
|
||||
"s204_wevia_php": 34,
|
||||
"s95_arsenal_html": 1377,
|
||||
"s95_arsenal_api": 377
|
||||
@@ -1945,7 +1945,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"scan_time_ms": 2029,
|
||||
"scan_time_ms": 1907,
|
||||
"gaps": [],
|
||||
"score": 100,
|
||||
"automation": {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated_at": "2026-04-21T22:45:02.313185",
|
||||
"generated_at": "2026-04-21T23:00:02.786116",
|
||||
"stats": {
|
||||
"total": 48,
|
||||
"pending": 31,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"status": "ALIVE",
|
||||
"ts": "2026-04-21T22:45:02.197332",
|
||||
"last_heartbeat": "2026-04-21T22:45:02.197332",
|
||||
"last_heartbeat_ts_epoch": 1776804302,
|
||||
"ts": "2026-04-21T23:00:02.208517",
|
||||
"last_heartbeat": "2026-04-21T23:00:02.208517",
|
||||
"last_heartbeat_ts_epoch": 1776805202,
|
||||
"tasks_today": 232,
|
||||
"tasks_week": 574,
|
||||
"agent_id": "blade-ops",
|
||||
|
||||
55
api/csat-api.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
/**
|
||||
* WEVAL CSAT - Customer Satisfaction Score sovereign 21avr2026
|
||||
* Rating 1-5 after resolved ticket/interaction.
|
||||
* Storage: /opt/weval-l99/data/csat-responses.jsonl
|
||||
*/
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$STORAGE = '/opt/weval-l99/data/csat-responses.jsonl';
|
||||
@mkdir(dirname($STORAGE), 0755, true);
|
||||
|
||||
$action = $_GET['action'] ?? ($_POST['action'] ?? 'stats');
|
||||
|
||||
if ($action === 'submit' && $_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$rating = intval($_POST['rating'] ?? -1);
|
||||
$context = substr(trim($_POST['context'] ?? ''), 0, 200);
|
||||
$user = substr(trim($_POST['user'] ?? 'anonymous'), 0, 60);
|
||||
if ($rating < 1 || $rating > 5) {
|
||||
echo json_encode(['ok'=>false,'error'=>'invalid_rating','expected'=>'1-5']);
|
||||
exit;
|
||||
}
|
||||
@file_put_contents($STORAGE, json_encode(['ts'=>date('c'),'rating'=>$rating,'context'=>$context,'user'=>$user])."\n", FILE_APPEND | LOCK_EX);
|
||||
echo json_encode(['ok'=>true,'recorded'=>true]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$responses = [];
|
||||
if (is_readable($STORAGE)) {
|
||||
foreach (file($STORAGE) as $line) {
|
||||
$r = @json_decode(trim($line), true);
|
||||
if ($r && isset($r['rating'])) $responses[] = $r;
|
||||
}
|
||||
}
|
||||
|
||||
$n = count($responses);
|
||||
if ($n === 0) {
|
||||
echo json_encode(['ok'=>true,'source'=>'sovereign_jsonl','ts'=>date('c'),'csat_score_pct'=>0,'responses_total'=>0,'status'=>'wire_needed','drill'=>'No ratings yet. POST /api/csat-api.php?action=submit']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// CSAT = % ratings >= 4 (out of 5)
|
||||
$satisfied = 0;
|
||||
foreach ($responses as $r) if ($r['rating'] >= 4) $satisfied++;
|
||||
$pct = round(($satisfied / $n) * 100);
|
||||
|
||||
echo json_encode([
|
||||
'ok'=>true,
|
||||
'source'=>'sovereign_jsonl',
|
||||
'ts'=>date('c'),
|
||||
'csat_score_pct'=>$pct,
|
||||
'responses_total'=>$n,
|
||||
'satisfied_count'=>$satisfied,
|
||||
'status'=>$pct >= 85 ? 'ok' : ($pct > 0 ? 'warn' : 'wire_needed'),
|
||||
'drill'=>"% ratings >=4 out of 5",
|
||||
]);
|
||||
@@ -1,26 +1,26 @@
|
||||
{
|
||||
"ts": "2026-04-21T20:45:02+00:00",
|
||||
"ts": "2026-04-21T21:00:02+00:00",
|
||||
"server": "s204",
|
||||
"s204": {
|
||||
"load": 2.61,
|
||||
"load": 3.05,
|
||||
"uptime": "2026-04-14 11:51:24",
|
||||
"ram_total_mb": 31335,
|
||||
"ram_used_mb": 12494,
|
||||
"ram_free_mb": 18840,
|
||||
"ram_used_mb": 12611,
|
||||
"ram_free_mb": 18723,
|
||||
"disk_total": "150G",
|
||||
"disk_used": "118G",
|
||||
"disk_free": "27G",
|
||||
"disk_pct": "82%",
|
||||
"fpm_workers": 140,
|
||||
"fpm_workers": 141,
|
||||
"docker_containers": 19,
|
||||
"cpu_cores": 8
|
||||
},
|
||||
"s95": {
|
||||
"load": 0.12,
|
||||
"load": 0.51,
|
||||
"disk_pct": "81%",
|
||||
"status": "UP",
|
||||
"ram_total_mb": 15610,
|
||||
"ram_free_mb": 12023
|
||||
"ram_free_mb": 11959
|
||||
},
|
||||
"pmta": [
|
||||
{
|
||||
@@ -46,9 +46,9 @@
|
||||
],
|
||||
"assets": {
|
||||
"html_pages": 317,
|
||||
"php_apis": 832,
|
||||
"php_apis": 840,
|
||||
"wiki_entries": 2066,
|
||||
"vault_doctrines": 83,
|
||||
"vault_doctrines": 85,
|
||||
"vault_sessions": 104,
|
||||
"vault_decisions": 12
|
||||
},
|
||||
@@ -221,7 +221,7 @@
|
||||
"active": 35
|
||||
},
|
||||
"git": {
|
||||
"head": "99b9df00c auto-sync-2245",
|
||||
"head": "049296d1a AUTO-BACKUP 20260421-2300",
|
||||
"dirty": 2,
|
||||
"status": "DIRTY"
|
||||
},
|
||||
@@ -271,11 +271,11 @@
|
||||
"binary": "COMPILED",
|
||||
"model": "142MB"
|
||||
},
|
||||
"grand_total": 3947,
|
||||
"grand_total": 3957,
|
||||
"health": {
|
||||
"score": 5,
|
||||
"max": 6,
|
||||
"pct": 83
|
||||
},
|
||||
"elapsed_ms": 11324
|
||||
"elapsed_ms": 11944
|
||||
}
|
||||
96
api/feature-adoption.php
Normal file
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
/**
|
||||
* WEVAL Feature Adoption Tracker sovereign 21avr2026
|
||||
* Track which modules/widgets/features users interact with per session
|
||||
* Storage: /opt/weval-l99/data/feature-adoption.jsonl
|
||||
*
|
||||
* GET ?action=stats -> adoption rate KPI
|
||||
* POST ?action=track -> log feature use (feature, user, session_id)
|
||||
* GET ?action=list -> features inventory
|
||||
*/
|
||||
header("Content-Type: application/json");
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
|
||||
$STORAGE = "/opt/weval-l99/data/feature-adoption.jsonl";
|
||||
$INVENTORY = "/opt/weval-l99/data/feature-inventory.json";
|
||||
@mkdir(dirname($STORAGE), 0755, true);
|
||||
|
||||
// Default inventory if not exists
|
||||
if (!file_exists($INVENTORY)) {
|
||||
$default_features = [
|
||||
"wtp_dashboard", "wtp_pilotage_widget", "wtp_sparklines", "wtp_l99_brain",
|
||||
"wevia_master_chat", "wevia_orchestrator", "all_ia_hub", "agents_archi",
|
||||
"architecture_live", "openclaw", "nonreg_dashboard", "stripe_live",
|
||||
"ethica_hcp", "wevads_ia", "director_chat", "orphans_hub",
|
||||
"wikidoc", "vault_manager", "nps_feedback", "csat_rating", "ticket_create"
|
||||
];
|
||||
@file_put_contents($INVENTORY, json_encode(["features" => $default_features, "total" => count($default_features)]));
|
||||
}
|
||||
|
||||
$action = $_GET["action"] ?? ($_POST["action"] ?? "stats");
|
||||
|
||||
if ($action === "track" && $_SERVER["REQUEST_METHOD"] === "POST") {
|
||||
$feature = substr(trim($_POST["feature"] ?? ""), 0, 80);
|
||||
$user = substr(trim($_POST["user"] ?? "anonymous"), 0, 60);
|
||||
$session = substr(trim($_POST["session_id"] ?? ""), 0, 40);
|
||||
if (!$feature) {
|
||||
echo json_encode(["ok"=>false,"error"=>"feature_required"]);
|
||||
exit;
|
||||
}
|
||||
$record = ["ts"=>date("c"),"feature"=>$feature,"user"=>$user,"session_id"=>$session];
|
||||
@file_put_contents($STORAGE, json_encode($record)."\n", FILE_APPEND | LOCK_EX);
|
||||
echo json_encode(["ok"=>true,"tracked"=>$feature]);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($action === "list") {
|
||||
$inv = @json_decode(@file_get_contents($INVENTORY), true);
|
||||
echo json_encode($inv ?: ["features"=>[],"total"=>0]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// stats = adoption rate calculation
|
||||
$inv = @json_decode(@file_get_contents($INVENTORY), true);
|
||||
$total_features = intval($inv["total"] ?? 0);
|
||||
|
||||
$used_features = [];
|
||||
$events = [];
|
||||
if (is_readable($STORAGE)) {
|
||||
foreach (file($STORAGE) as $line) {
|
||||
$r = @json_decode(trim($line), true);
|
||||
if ($r && isset($r["feature"])) {
|
||||
$used_features[$r["feature"]] = ($used_features[$r["feature"]] ?? 0) + 1;
|
||||
$events[] = $r;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$adopted = count($used_features);
|
||||
$adoption_rate = $total_features > 0 ? round(($adopted / $total_features) * 100) : 0;
|
||||
|
||||
// 7d & 30d activity
|
||||
$now = time();
|
||||
$evt_7d = 0; $evt_30d = 0;
|
||||
$users_7d = []; $users_30d = [];
|
||||
foreach ($events as $e) {
|
||||
$t = strtotime($e["ts"]);
|
||||
if ($t >= $now - 7*86400) { $evt_7d++; $users_7d[$e["user"] ?? ""] = true; }
|
||||
if ($t >= $now - 30*86400) { $evt_30d++; $users_30d[$e["user"] ?? ""] = true; }
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
"ok"=>true,
|
||||
"source"=>"sovereign_jsonl_tracker",
|
||||
"ts"=>date("c"),
|
||||
"adoption_rate_pct"=>$adoption_rate,
|
||||
"features_total"=>$total_features,
|
||||
"features_adopted"=>$adopted,
|
||||
"features_top5"=>array_slice(array_reverse(array_keys($used_features)), 0, 5),
|
||||
"events_total"=>count($events),
|
||||
"events_7d"=>$evt_7d,
|
||||
"events_30d"=>$evt_30d,
|
||||
"unique_users_7d"=>count($users_7d),
|
||||
"unique_users_30d"=>count($users_30d),
|
||||
"status"=>count($events)===0 ? "wire_needed" : ($adoption_rate >= 70 ? "ok" : "warn"),
|
||||
"drill"=>"Features used / Features available · Track via POST ?action=track",
|
||||
]);
|
||||
@@ -1,27 +1,27 @@
|
||||
{
|
||||
"ok": true,
|
||||
"agent": "V42_MQL_Scoring_Agent_REAL",
|
||||
"ts": "2026-04-21T20:40:01+00:00",
|
||||
"ts": "2026-04-21T21:00:02+00:00",
|
||||
"status": "DEPLOYED_AUTO",
|
||||
"deployed": true,
|
||||
"algorithm": "weighted_behavioral_signals",
|
||||
"signals_tracked": {
|
||||
"wtp_engagement": 48,
|
||||
"wtp_engagement": 100,
|
||||
"chat_engagement": 0,
|
||||
"roi_tool": 0,
|
||||
"email_opened": 0
|
||||
},
|
||||
"avg_score": 12,
|
||||
"avg_score": 25,
|
||||
"mql_threshold": 50,
|
||||
"sql_threshold": 75,
|
||||
"leads_captured": 48,
|
||||
"mql_auto_scored": 18,
|
||||
"sql_auto_scored": 7,
|
||||
"mql_auto_pct": 38,
|
||||
"mql_auto_scored": 20,
|
||||
"sql_auto_scored": 8,
|
||||
"mql_auto_pct": 41,
|
||||
"improvement_vs_manual": {
|
||||
"before_manual_pct": 33.3,
|
||||
"after_auto_pct": 38,
|
||||
"delta": 4.700000000000003
|
||||
"after_auto_pct": 41,
|
||||
"delta": 7.700000000000003
|
||||
},
|
||||
"paperclip_db_ok": true,
|
||||
"paperclip_tables": 1,
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"ts": "20260421_152221", "version": "3.2", "score": 100, "pass": 153, "fail": 0, "total": 153, "elapsed": 32.4, "categories": {"S204": {"pass": 9, "fail": 0}, "S95-WV": {"pass": 12, "fail": 0}, "S95-ARS": {"pass": 17, "fail": 0}, "S95-iR": {"pass": 1, "fail": 0}, "INFRA": {"pass": 5, "fail": 0}, "API": {"pass": 27, "fail": 0}, "SEC": {"pass": 4, "fail": 0}, "S95-BK": {"pass": 6, "fail": 0}, "C2-API": {"pass": 4, "fail": 0}, "C2-SPA": {"pass": 1, "fail": 0}, "C2-WV": {"pass": 3, "fail": 0}, "SSO": {"pass": 25, "fail": 0}, "DATA": {"pass": 5, "fail": 0}, "CRONS": {"pass": 2, "fail": 0}, "BLADE": {"pass": 7, "fail": 0}, "LIFE": {"pass": 3, "fail": 0}, "FUNC": {"pass": 7, "fail": 0}, "01AVR": {"pass": 10, "fail": 0}, "STRUCT": {"pass": 5, "fail": 0}}, "failures": []}
|
||||
{"ts": "20260421_224704", "version": "3.2", "score": 100, "pass": 153, "fail": 0, "total": 153, "elapsed": 31.6, "categories": {"S204": {"pass": 9, "fail": 0}, "S95-WV": {"pass": 12, "fail": 0}, "S95-ARS": {"pass": 17, "fail": 0}, "S95-iR": {"pass": 1, "fail": 0}, "INFRA": {"pass": 5, "fail": 0}, "API": {"pass": 27, "fail": 0}, "SEC": {"pass": 4, "fail": 0}, "S95-BK": {"pass": 6, "fail": 0}, "C2-API": {"pass": 4, "fail": 0}, "C2-SPA": {"pass": 1, "fail": 0}, "C2-WV": {"pass": 3, "fail": 0}, "SSO": {"pass": 25, "fail": 0}, "DATA": {"pass": 5, "fail": 0}, "CRONS": {"pass": 2, "fail": 0}, "BLADE": {"pass": 7, "fail": 0}, "LIFE": {"pass": 3, "fail": 0}, "FUNC": {"pass": 7, "fail": 0}, "01AVR": {"pass": 10, "fail": 0}, "STRUCT": {"pass": 5, "fail": 0}}, "failures": []}
|
||||
65
api/nps-collector.php
Normal file
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
/**
|
||||
* WEVAL NPS Collector - sovereign 21avr2026
|
||||
* Zero external tool (Typeform/etc). Local JSONL storage.
|
||||
* GET /api/nps-collector.php?action=stats -> KPI ready
|
||||
* POST /api/nps-collector.php?action=submit -> save response (score 0-10, comment)
|
||||
*/
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$STORAGE = '/opt/weval-l99/data/nps-responses.jsonl';
|
||||
@mkdir(dirname($STORAGE), 0755, true);
|
||||
|
||||
$action = $_GET['action'] ?? ($_POST['action'] ?? 'stats');
|
||||
|
||||
if ($action === 'submit' && $_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$score = intval($_POST['score'] ?? -1);
|
||||
$comment = substr(trim($_POST['comment'] ?? ''), 0, 500);
|
||||
$user = substr(trim($_POST['user'] ?? 'anonymous'), 0, 60);
|
||||
if ($score < 0 || $score > 10) {
|
||||
echo json_encode(['ok'=>false,'error'=>'invalid_score','expected'=>'0-10']);
|
||||
exit;
|
||||
}
|
||||
$record = ['ts'=>date('c'),'score'=>$score,'comment'=>$comment,'user'=>$user,'ip'=>$_SERVER['REMOTE_ADDR']??''];
|
||||
@file_put_contents($STORAGE, json_encode($record)."\n", FILE_APPEND | LOCK_EX);
|
||||
echo json_encode(['ok'=>true,'recorded'=>$record]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// stats = NPS score aggregation
|
||||
$responses = [];
|
||||
if (is_readable($STORAGE)) {
|
||||
foreach (file($STORAGE) as $line) {
|
||||
$r = @json_decode(trim($line), true);
|
||||
if ($r && isset($r['score'])) $responses[] = $r;
|
||||
}
|
||||
}
|
||||
|
||||
$n = count($responses);
|
||||
if ($n === 0) {
|
||||
echo json_encode(['ok'=>true,'source'=>'sovereign_jsonl','ts'=>date('c'),'nps_score'=>0,'responses_total'=>0,'promoters'=>0,'passives'=>0,'detractors'=>0,'status'=>'wire_needed','drill'=>'No responses yet. Post to this endpoint with score+comment.','endpoint_submit'=>'/api/nps-collector.php?action=submit']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$promoters = 0; $passives = 0; $detractors = 0;
|
||||
foreach ($responses as $r) {
|
||||
$s = $r['score'];
|
||||
if ($s >= 9) $promoters++;
|
||||
elseif ($s >= 7) $passives++;
|
||||
else $detractors++;
|
||||
}
|
||||
$nps = round((($promoters - $detractors) / $n) * 100);
|
||||
|
||||
echo json_encode([
|
||||
'ok'=>true,
|
||||
'source'=>'sovereign_jsonl',
|
||||
'ts'=>date('c'),
|
||||
'nps_score'=>$nps,
|
||||
'responses_total'=>$n,
|
||||
'promoters'=>$promoters,
|
||||
'passives'=>$passives,
|
||||
'detractors'=>$detractors,
|
||||
'status'=>$nps >= 50 ? 'ok' : ($nps >= 0 ? 'warn' : 'fail'),
|
||||
'drill'=>"NPS = ((promoters - detractors) / total) * 100",
|
||||
'recent_comments'=>array_slice(array_reverse(array_column($responses, 'comment')), 0, 5),
|
||||
]);
|
||||
@@ -10,7 +10,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.914789"
|
||||
"discovered": "2026-04-21T23:00:03.489531"
|
||||
},
|
||||
{
|
||||
"name": "wevia-brain",
|
||||
@@ -23,7 +23,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:05.062894"
|
||||
"discovered": "2026-04-21T23:00:03.677956"
|
||||
},
|
||||
{
|
||||
"name": "skills",
|
||||
@@ -36,7 +36,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.676231"
|
||||
"discovered": "2026-04-21T23:00:03.214198"
|
||||
},
|
||||
{
|
||||
"name": "everything-claude-code",
|
||||
@@ -49,7 +49,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "**Language:** English | [Português (Brasil)](docs/pt-BR/README.md) | [简体中文](README.zh-CN.md) | [繁體中文](docs/zh-TW/README.md) | [日本語](docs/ja-JP/README.",
|
||||
"discovered": "2026-04-21T22:00:03.793286"
|
||||
"discovered": "2026-04-21T23:00:02.916745"
|
||||
},
|
||||
{
|
||||
"name": "open-webui-fresh",
|
||||
@@ -62,7 +62,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "# Open WebUI 👋   | [中文](README.zh.md) | [日本語](README.ja.md) | [Español](README.es.md) | [Tiếng Việt](README.vi.md) | [Português](README.p",
|
||||
"discovered": "2026-04-21T22:00:04.191178"
|
||||
"discovered": "2026-04-21T23:00:03.076639"
|
||||
},
|
||||
{
|
||||
"name": "mxyhi_ok-skills",
|
||||
@@ -114,7 +114,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# OK Skills: AI Coding Agent Skills for Codex, Claude Code, Cursor, OpenClaw, and More English | [简体中文](README.zh-CN.md) | [繁體中文](README.zh-TW.md) | ",
|
||||
"discovered": "2026-04-21T22:00:04.140337"
|
||||
"discovered": "2026-04-21T23:00:03.045553"
|
||||
},
|
||||
{
|
||||
"name": "SuperClaude_Framework",
|
||||
@@ -127,7 +127,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<div align=\"center\"> # 🚀 SuperClaude Framework [](https://smithery.ai/skills?ns=",
|
||||
"discovered": "2026-04-21T22:00:03.338813"
|
||||
"discovered": "2026-04-21T23:00:02.724729"
|
||||
},
|
||||
{
|
||||
"name": "paperclip-weval",
|
||||
@@ -140,7 +140,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "<p align=\"center\"> <img src=\"doc/assets/header.png\" alt=\"Paperclip — runs your business\" width=\"720\" /> </p> <p align=\"center\"> <a href=\"#quickst",
|
||||
"discovered": "2026-04-21T22:00:04.382601"
|
||||
"discovered": "2026-04-21T23:00:03.101166"
|
||||
},
|
||||
{
|
||||
"name": "vllm",
|
||||
@@ -153,7 +153,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<!-- markdownlint-disable MD001 MD041 --> <p align=\"center\"> <picture> <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubus",
|
||||
"discovered": "2026-04-21T22:00:04.795760"
|
||||
"discovered": "2026-04-21T23:00:03.331344"
|
||||
},
|
||||
{
|
||||
"name": "deer-flow",
|
||||
@@ -166,7 +166,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# 🦌 DeerFlow - 2.0 English | [中文](./README_zh.md) | [日本語](./README_ja.md) | [Français](./README_fr.md) | [Русский](./README_ru.md) [ [](https://agent.xfyun.cn) <div align=\"center\"> [ | [Français](docs/translations/README.fr.md) | [Italiano](docs/translations/README.it.md) | ",
|
||||
"discovered": "2026-04-21T22:00:03.281165"
|
||||
"discovered": "2026-04-21T23:00:02.687576"
|
||||
},
|
||||
{
|
||||
"name": "aios",
|
||||
@@ -374,7 +374,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "# AIOS: AI Agent Operating System <a href='https://arxiv.org/abs/2403.16971'><img src='https://img.shields.io/badge/Paper-PDF-red'></a> <a href='http",
|
||||
"discovered": "2026-04-21T22:00:03.441512"
|
||||
"discovered": "2026-04-21T23:00:02.761010"
|
||||
},
|
||||
{
|
||||
"name": "rnd-agent-framework",
|
||||
@@ -387,7 +387,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": " # Welcome to Microsoft Agent Framework! [\"> <source srcset=\"apps/w",
|
||||
"discovered": "2026-04-21T22:00:04.736445"
|
||||
"discovered": "2026-04-21T23:00:03.226663"
|
||||
},
|
||||
{
|
||||
"name": "fmgapp",
|
||||
@@ -478,7 +478,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:03.807956"
|
||||
"discovered": "2026-04-21T23:00:02.922553"
|
||||
},
|
||||
{
|
||||
"name": "obsidian-vault",
|
||||
@@ -491,7 +491,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.161509"
|
||||
"discovered": "2026-04-21T23:00:03.061732"
|
||||
},
|
||||
{
|
||||
"name": "rnd-agents",
|
||||
@@ -504,7 +504,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Claude Code Plugins: Orchestration and Automation > **⚡ Updated for Opus 4.6, Sonnet 4.6 & Haiku 4.5** — Three-tier model strategy for optimal perf",
|
||||
"discovered": "2026-04-21T22:00:04.577894"
|
||||
"discovered": "2026-04-21T23:00:03.176177"
|
||||
},
|
||||
{
|
||||
"name": "FrancyJGLisboa_agent-skill-creator",
|
||||
@@ -517,7 +517,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Agent Skill Creator **Turn any workflow into reusable AI agent software that installs on 14+ tools — no spec writing, no prompt engineering, no cod",
|
||||
"discovered": "2026-04-21T22:00:03.221142"
|
||||
"discovered": "2026-04-21T23:00:02.659504"
|
||||
},
|
||||
{
|
||||
"name": "skillsmith",
|
||||
@@ -530,7 +530,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<div align=\"center\"> <img src=\"terminal.svg\" alt=\"Skillsmith terminal\" width=\"740\"/> </div> <div align=\"center\"> # Skillsmith **Build consistent ",
|
||||
"discovered": "2026-04-21T22:00:04.697798"
|
||||
"discovered": "2026-04-21T23:00:03.216638"
|
||||
},
|
||||
{
|
||||
"name": "awesome-agent-skills",
|
||||
@@ -543,7 +543,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<a href=\"https://github.com/VoltAgent/voltagent\"> <img width=\"1500\" height=\"801\" alt=\"claude-skills\" src=\"https://github.com/user-attachments/ass",
|
||||
"discovered": "2026-04-21T22:00:03.624791"
|
||||
"discovered": "2026-04-21T23:00:02.856946"
|
||||
},
|
||||
{
|
||||
"name": "paperclip-skills",
|
||||
@@ -556,7 +556,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.336361"
|
||||
"discovered": "2026-04-21T23:00:03.097450"
|
||||
},
|
||||
{
|
||||
"name": "jzOcb_writing-style-skill",
|
||||
@@ -569,7 +569,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Writing Style Skill 可复用的写作风格 Skill 模板。**内置自动学习** — 从你的修改中自动提取规则,SKILL.md 越用越准。 兼容 **Claude Code** + **OpenClaw (ClawHub)**。 ## 原理 ``` AI 用 SKILL",
|
||||
"discovered": "2026-04-21T22:00:03.818833"
|
||||
"discovered": "2026-04-21T23:00:02.943577"
|
||||
},
|
||||
{
|
||||
"name": "qdrant-data",
|
||||
@@ -582,7 +582,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.491727"
|
||||
"discovered": "2026-04-21T23:00:03.161515"
|
||||
},
|
||||
{
|
||||
"name": "wazuh",
|
||||
@@ -595,7 +595,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.821072"
|
||||
"discovered": "2026-04-21T23:00:03.389139"
|
||||
},
|
||||
{
|
||||
"name": "plausible",
|
||||
@@ -608,7 +608,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.384789"
|
||||
"discovered": "2026-04-21T23:00:03.123717"
|
||||
},
|
||||
{
|
||||
"name": "pmta",
|
||||
@@ -621,7 +621,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.425011"
|
||||
"discovered": "2026-04-21T23:00:03.137298"
|
||||
},
|
||||
{
|
||||
"name": "render-configs",
|
||||
@@ -634,7 +634,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.512799"
|
||||
"discovered": "2026-04-21T23:00:03.165713"
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
@@ -647,7 +647,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.655536"
|
||||
"discovered": "2026-04-21T23:00:03.206089"
|
||||
},
|
||||
{
|
||||
"name": "weval-guardian",
|
||||
@@ -660,7 +660,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.884665"
|
||||
"discovered": "2026-04-21T23:00:03.457554"
|
||||
},
|
||||
{
|
||||
"name": "weval-litellm",
|
||||
@@ -673,7 +673,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.917338"
|
||||
"discovered": "2026-04-21T23:00:03.491658"
|
||||
},
|
||||
{
|
||||
"name": "weval-security",
|
||||
@@ -686,7 +686,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:05.041856"
|
||||
"discovered": "2026-04-21T23:00:03.625864"
|
||||
},
|
||||
{
|
||||
"name": "archive",
|
||||
@@ -699,7 +699,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:03.557008"
|
||||
"discovered": "2026-04-21T23:00:02.844768"
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
@@ -712,7 +712,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:03.979360"
|
||||
"discovered": "2026-04-21T23:00:02.994111"
|
||||
},
|
||||
{
|
||||
"name": "ruflo",
|
||||
@@ -725,7 +725,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.637108"
|
||||
"discovered": "2026-04-21T23:00:03.203889"
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
@@ -738,7 +738,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.769414"
|
||||
"discovered": "2026-04-21T23:00:03.284105"
|
||||
},
|
||||
{
|
||||
"name": "weval-crewai",
|
||||
@@ -751,7 +751,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.866329"
|
||||
"discovered": "2026-04-21T23:00:03.431483"
|
||||
},
|
||||
{
|
||||
"name": "weval-plugins",
|
||||
@@ -764,7 +764,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.993748"
|
||||
"discovered": "2026-04-21T23:00:03.568544"
|
||||
},
|
||||
{
|
||||
"name": "weval-radar",
|
||||
@@ -777,7 +777,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:05.008804"
|
||||
"discovered": "2026-04-21T23:00:03.587907"
|
||||
},
|
||||
{
|
||||
"name": "weval-scrapy",
|
||||
@@ -790,7 +790,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:05.010801"
|
||||
"discovered": "2026-04-21T23:00:03.608294"
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
@@ -803,7 +803,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:03.820788"
|
||||
"discovered": "2026-04-21T23:00:02.953470"
|
||||
},
|
||||
{
|
||||
"name": "litellm",
|
||||
@@ -816,7 +816,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:03.904792"
|
||||
"discovered": "2026-04-21T23:00:02.984227"
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker",
|
||||
@@ -829,7 +829,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.039945"
|
||||
"discovered": "2026-04-21T23:00:02.998150"
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
@@ -842,7 +842,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.466744"
|
||||
"discovered": "2026-04-21T23:00:03.155605"
|
||||
},
|
||||
{
|
||||
"name": "twenty-compose",
|
||||
@@ -855,7 +855,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:04.793620"
|
||||
"discovered": "2026-04-21T23:00:03.289729"
|
||||
},
|
||||
{
|
||||
"name": "weval-ux",
|
||||
@@ -868,7 +868,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:05.050057"
|
||||
"discovered": "2026-04-21T23:00:03.659745"
|
||||
},
|
||||
{
|
||||
"name": "wevia-integrity",
|
||||
@@ -881,7 +881,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:05.075527"
|
||||
"discovered": "2026-04-21T23:00:03.712293"
|
||||
},
|
||||
{
|
||||
"name": "DiffusionDB",
|
||||
@@ -894,7 +894,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:03.172024"
|
||||
"discovered": "2026-04-21T23:00:02.579502"
|
||||
},
|
||||
{
|
||||
"name": "LTX-Video",
|
||||
@@ -907,7 +907,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:03.336762"
|
||||
"discovered": "2026-04-21T23:00:02.711861"
|
||||
},
|
||||
{
|
||||
"name": "localai",
|
||||
@@ -920,7 +920,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:03.943489"
|
||||
"discovered": "2026-04-21T23:00:02.990022"
|
||||
},
|
||||
{
|
||||
"name": "wevia-finetune",
|
||||
@@ -933,6 +933,6 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-21T22:00:05.070906"
|
||||
"discovered": "2026-04-21T23:00:03.692226"
|
||||
}
|
||||
]
|
||||
63
api/tickets-api.php
Normal file
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
/**
|
||||
* WEVAL Support Tickets sovereign 21avr2026
|
||||
* Local JSONL + status tracking (open/resolved/closed)
|
||||
* Storage: /opt/weval-l99/data/tickets.jsonl
|
||||
*/
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$STORAGE = '/opt/weval-l99/data/tickets.jsonl';
|
||||
@mkdir(dirname($STORAGE), 0755, true);
|
||||
|
||||
$action = $_GET['action'] ?? ($_POST['action'] ?? 'stats');
|
||||
|
||||
if ($action === 'create' && $_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$subject = substr(trim($_POST['subject'] ?? ''), 0, 200);
|
||||
$body = substr(trim($_POST['body'] ?? ''), 0, 2000);
|
||||
$user = substr(trim($_POST['user'] ?? 'anonymous'), 0, 60);
|
||||
$priority = in_array($_POST['priority'] ?? '', ['low','medium','high','critical']) ? $_POST['priority'] : 'medium';
|
||||
if (!$subject) {
|
||||
echo json_encode(['ok'=>false,'error'=>'subject_required']);
|
||||
exit;
|
||||
}
|
||||
$id = 'TKT-' . date('Ymd') . '-' . substr(md5($subject.microtime()), 0, 6);
|
||||
$record = ['ts'=>date('c'),'id'=>$id,'status'=>'open','subject'=>$subject,'body'=>$body,'user'=>$user,'priority'=>$priority,'resolved_at'=>null];
|
||||
@file_put_contents($STORAGE, json_encode($record)."\n", FILE_APPEND | LOCK_EX);
|
||||
echo json_encode(['ok'=>true,'ticket_id'=>$id]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$tickets = [];
|
||||
if (is_readable($STORAGE)) {
|
||||
foreach (file($STORAGE) as $line) {
|
||||
$r = @json_decode(trim($line), true);
|
||||
if ($r) $tickets[] = $r;
|
||||
}
|
||||
}
|
||||
|
||||
// Stats
|
||||
$total = count($tickets);
|
||||
$open = 0; $resolved = 0; $mttr_hours = 0; $mttr_count = 0;
|
||||
foreach ($tickets as $t) {
|
||||
if ($t['status'] === 'open') $open++;
|
||||
elseif ($t['status'] === 'resolved' || $t['status'] === 'closed') {
|
||||
$resolved++;
|
||||
if (!empty($t['resolved_at'])) {
|
||||
$delta = (strtotime($t['resolved_at']) - strtotime($t['ts'])) / 3600;
|
||||
if ($delta > 0) { $mttr_hours += $delta; $mttr_count++; }
|
||||
}
|
||||
}
|
||||
}
|
||||
$mttr = $mttr_count > 0 ? round($mttr_hours / $mttr_count, 1) : 0;
|
||||
|
||||
echo json_encode([
|
||||
'ok'=>true,
|
||||
'source'=>'sovereign_jsonl',
|
||||
'ts'=>date('c'),
|
||||
'tickets_total'=>$total,
|
||||
'tickets_open'=>$open,
|
||||
'tickets_resolved'=>$resolved,
|
||||
'mttr_hours'=>$mttr,
|
||||
'status'=>$open === 0 && $total === 0 ? 'wire_needed' : ($open <= 5 ? 'ok' : 'warn'),
|
||||
'endpoint_create'=>'/api/tickets-api.php?action=create',
|
||||
]);
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-21T22:30:12",
|
||||
"timestamp": "2026-04-21T23:00:17",
|
||||
"features": {
|
||||
"total": 36,
|
||||
"pass": 35
|
||||
@@ -13,7 +13,7 @@
|
||||
"score": 97.2,
|
||||
"log": [
|
||||
"=== UX AGENT v1.0 ===",
|
||||
"Time: 2026-04-21 22:30:01",
|
||||
"Time: 2026-04-21 23:00:01",
|
||||
" core: 4/4",
|
||||
" layout: 3/4",
|
||||
" interaction: 6/6",
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"ok": true,
|
||||
"version": "V83-business-kpi",
|
||||
"ts": "2026-04-21T20:45:18+00:00",
|
||||
"ts": "2026-04-21T21:00:56+00:00",
|
||||
"summary": {
|
||||
"total_categories": 8,
|
||||
"total_kpis": 64,
|
||||
"ok": 41,
|
||||
"warn": 20,
|
||||
"ok": 42,
|
||||
"warn": 16,
|
||||
"fail": 0,
|
||||
"wire_needed": 3,
|
||||
"data_completeness_pct": 95.3
|
||||
"wire_needed": 6,
|
||||
"data_completeness_pct": 90.6
|
||||
},
|
||||
"by_category": {
|
||||
"revenue": {
|
||||
|
||||
131
api/weval-feature-tracker.js
Normal file
@@ -0,0 +1,131 @@
|
||||
/**
|
||||
* WEVAL Feature Tracker + NPS Popup + CSAT autolink
|
||||
* Zero external deps. Zero cookies. sessionStorage only.
|
||||
* Auto-injects: track current page as feature + show NPS popup after 10 queries
|
||||
*/
|
||||
(function(){
|
||||
if(window.__WEVAL_TRACKER_LOADED__) return;
|
||||
window.__WEVAL_TRACKER_LOADED__ = true;
|
||||
|
||||
var path = window.location.pathname.replace(/^\/+|\.html$/g,'').replace(/\//g,'_') || 'index';
|
||||
var feature = path.toLowerCase();
|
||||
var user = (function(){
|
||||
try { return localStorage.getItem('weval_user') || 'anonymous'; } catch(e) { return 'anonymous'; }
|
||||
})();
|
||||
var sessionId = (function(){
|
||||
try {
|
||||
var s = sessionStorage.getItem('weval_session_id');
|
||||
if(!s) { s = 's_' + Date.now() + '_' + Math.random().toString(36).slice(2,8); sessionStorage.setItem('weval_session_id', s); }
|
||||
return s;
|
||||
} catch(e) { return 's_na'; }
|
||||
})();
|
||||
|
||||
// 1. Track feature once per session per page
|
||||
try {
|
||||
var key = 'weval_tracked_' + feature;
|
||||
if(!sessionStorage.getItem(key)) {
|
||||
sessionStorage.setItem(key, '1');
|
||||
var fd = new FormData();
|
||||
fd.append('action','track'); fd.append('feature',feature); fd.append('user',user); fd.append('session_id',sessionId);
|
||||
fetch('/api/feature-adoption.php?action=track', {method:'POST', body:fd}).catch(function(){});
|
||||
}
|
||||
} catch(e){}
|
||||
|
||||
// 2. Query counter for NPS popup trigger (only on wevia-master + all-ia-hub + wtp)
|
||||
var qCounterPages = ['wevia-master','all-ia-hub','weval-technology-platform','wevia-orchestrator'];
|
||||
if(qCounterPages.indexOf(feature) >= 0) {
|
||||
try {
|
||||
var qKey = 'weval_query_count';
|
||||
var npsShown = localStorage.getItem('weval_nps_shown_30d');
|
||||
var now = Date.now();
|
||||
// NPS not shown in last 30d
|
||||
if(!npsShown || (now - parseInt(npsShown)) > 30*86400000) {
|
||||
// Count queries - increment on every significant interaction
|
||||
document.addEventListener('click', function(e){
|
||||
var tgt = e.target;
|
||||
// Count clicks on buttons/send actions only
|
||||
if(tgt.matches && (tgt.matches('button, [type="submit"], .btn, .send-button, [onclick*="send"]') || (tgt.closest && tgt.closest('button, .btn')))) {
|
||||
var count = parseInt(localStorage.getItem(qKey) || '0') + 1;
|
||||
localStorage.setItem(qKey, count);
|
||||
if(count >= 10 && !document.getElementById('weval-nps-popup-el')) {
|
||||
showNPSPopup();
|
||||
}
|
||||
}
|
||||
}, true);
|
||||
}
|
||||
} catch(e){}
|
||||
}
|
||||
|
||||
// 3. NPS Popup injection
|
||||
function showNPSPopup() {
|
||||
var pop = document.createElement('div');
|
||||
pop.id = 'weval-nps-popup-el';
|
||||
pop.innerHTML = [
|
||||
'<div id="weval-nps-overlay" style="position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:99999;display:flex;align-items:center;justify-content:center;backdrop-filter:blur(4px);font-family:system-ui,sans-serif">',
|
||||
'<div style="background:linear-gradient(135deg,#0f172a,#1e293b);border:1px solid #334a7a;border-radius:12px;padding:28px;max-width:480px;width:90%;box-shadow:0 20px 60px rgba(0,0,0,.5)">',
|
||||
'<div style="display:flex;justify-content:space-between;align-items:start;margin-bottom:16px">',
|
||||
'<h2 style="margin:0;color:#e2e8f0;font-size:19px">Comment notez-vous WEVAL ?</h2>',
|
||||
'<button id="weval-nps-close" style="background:none;border:none;color:#64748b;font-size:22px;cursor:pointer;line-height:1" aria-label="Fermer">×</button>',
|
||||
'</div>',
|
||||
'<p style="margin:0 0 18px 0;color:#94a3b8;font-size:13.5px;line-height:1.5">Sur une échelle de 0 à 10, recommanderiez-vous WEVAL à un collègue ?</p>',
|
||||
'<div id="weval-nps-scores" style="display:grid;grid-template-columns:repeat(11,1fr);gap:4px;margin-bottom:16px"></div>',
|
||||
'<textarea id="weval-nps-comment" placeholder="Commentaire optionnel..." style="width:100%;padding:10px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.1);border-radius:6px;color:#e2e8f0;font-size:13px;font-family:inherit;resize:vertical;min-height:60px;box-sizing:border-box"></textarea>',
|
||||
'<div id="weval-nps-thanks" style="display:none;margin-top:14px;padding:10px;background:rgba(16,185,129,.12);border:1px solid rgba(16,185,129,.3);border-radius:6px;color:#6ee7b7;font-size:13px;text-align:center">Merci pour votre retour !</div>',
|
||||
'<div style="margin-top:14px;display:flex;gap:8px;justify-content:flex-end">',
|
||||
'<button id="weval-nps-later" style="padding:8px 14px;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.12);color:#94a3b8;border-radius:6px;cursor:pointer;font-size:12px">Plus tard</button>',
|
||||
'<button id="weval-nps-submit" disabled style="padding:8px 14px;background:#3b82f6;border:none;color:#fff;border-radius:6px;cursor:pointer;font-size:12px;font-weight:600;opacity:.5">Envoyer</button>',
|
||||
'</div></div></div>'
|
||||
].join('');
|
||||
document.body.appendChild(pop);
|
||||
// Score buttons 0-10
|
||||
var scoresDiv = document.getElementById('weval-nps-scores');
|
||||
var selectedScore = null;
|
||||
for(var i=0;i<=10;i++){
|
||||
(function(score){
|
||||
var b = document.createElement('button');
|
||||
b.textContent = score;
|
||||
b.style.cssText = 'padding:10px 4px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.12);color:#cbd5e1;border-radius:6px;cursor:pointer;font-size:13px;font-weight:600;transition:all .12s';
|
||||
b.onmouseover = function(){ if(selectedScore!==score){ this.style.background='rgba(59,130,246,.15)'; this.style.borderColor='#3b82f6'; } };
|
||||
b.onmouseout = function(){ if(selectedScore!==score){ this.style.background='rgba(255,255,255,.05)'; this.style.borderColor='rgba(255,255,255,.12)'; } };
|
||||
b.onclick = function(){
|
||||
selectedScore = score;
|
||||
Array.from(scoresDiv.children).forEach(function(el){ el.style.background='rgba(255,255,255,.05)'; el.style.borderColor='rgba(255,255,255,.12)'; el.style.color='#cbd5e1'; });
|
||||
this.style.background = score>=9?'#10b981':(score>=7?'#3b82f6':'#ef4444');
|
||||
this.style.borderColor = 'transparent';
|
||||
this.style.color = '#fff';
|
||||
var sb = document.getElementById('weval-nps-submit');
|
||||
sb.disabled = false; sb.style.opacity = '1';
|
||||
};
|
||||
scoresDiv.appendChild(b);
|
||||
})(i);
|
||||
}
|
||||
function close(){
|
||||
var el = document.getElementById('weval-nps-popup-el');
|
||||
if(el) el.remove();
|
||||
}
|
||||
document.getElementById('weval-nps-close').onclick = function(){
|
||||
try { localStorage.setItem('weval_nps_shown_30d', Date.now()); } catch(e){}
|
||||
close();
|
||||
};
|
||||
document.getElementById('weval-nps-later').onclick = function(){
|
||||
try { localStorage.removeItem('weval_query_count'); } catch(e){}
|
||||
close();
|
||||
};
|
||||
document.getElementById('weval-nps-submit').onclick = function(){
|
||||
if(selectedScore === null) return;
|
||||
var comment = document.getElementById('weval-nps-comment').value;
|
||||
var fd = new FormData();
|
||||
fd.append('action','submit'); fd.append('score',selectedScore); fd.append('comment',comment); fd.append('user',user);
|
||||
fetch('/api/nps-collector.php?action=submit', {method:'POST', body:fd})
|
||||
.then(function(){
|
||||
document.getElementById('weval-nps-thanks').style.display = 'block';
|
||||
try { localStorage.setItem('weval_nps_shown_30d', Date.now()); localStorage.removeItem('weval_query_count'); } catch(e){}
|
||||
setTimeout(close, 1800);
|
||||
})
|
||||
.catch(function(){ setTimeout(close, 400); });
|
||||
};
|
||||
}
|
||||
|
||||
// Expose globally for manual trigger + dev testing
|
||||
window.wevalShowNPS = showNPSPopup;
|
||||
})();
|
||||
@@ -133,12 +133,12 @@ $kpis = [
|
||||
"kpis" => [
|
||||
["id" => "customer_churn_monthly", "label" => "Monthly churn", "value" => $v50["churn_monthly"], "unit" => "%", "target" => 5, "trend" => "live", "status" => "ok", "source" => "CRM", "drill" => "Target < 5%/month"],
|
||||
["id" => "net_revenue_retention", "label" => "Net Revenue Retention", "value" => $v50["nrr"], "unit" => "%", "target" => 110, "trend" => "live", "status" => $v50["nrr"] >= 110 ? "ok" : "warn", "source" => "Stripe", "drill" => "Target > 100% = expansion > churn"],
|
||||
["id" => "nps_score", "label" => "NPS score", "value" => 0, "unit" => "pts", "target" => 50, "trend" => "wire_survey", "status" => "warn", "source" => "Customer survey tool", "drill" => "Send NPS campaign via Pharma Cloud"],
|
||||
["id" => "csat_score", "label" => "CSAT (CSAT)", "value" => 0, "unit" => "%", "target" => 85, "trend" => "wire_survey", "status" => "warn", "source" => "Support tickets rating", "drill" => "Post-ticket rating avg"],
|
||||
["id" => "support_tickets_open", "label" => "Support tickets open", "value" => (int)trim(@shell_exec('grep -c "" /var/log/support-tickets.log 2>/dev/null || echo 0')), "unit" => "tickets", "target" => 5, "trend" => "wire_support", "status" => "live", "source" => "Zendesk/Intercom", "drill" => "Low = healthy"],
|
||||
["id" => "mean_time_to_resolution", "label" => "MTTR support", "value" => 0, "unit" => "hours", "target" => 24, "trend" => "wire_support", "status" => "warn", "source" => "Support system", "drill" => "First response to close"],
|
||||
["id" => "nps_score", "label" => "NPS score", "value" => (function(){$r=@json_decode(@file_get_contents("http://localhost/api/nps-collector.php"),true); return intval($r["nps_score"]??0);})(), "unit" => "pts", "target" => 50, "trend" => "live", "status" => (function(){$r=@json_decode(@file_get_contents("http://localhost/api/nps-collector.php"),true); return $r["status"]??"wire_needed";})(), "source" => "sovereign NPS collector /api/nps-collector.php", "drill" => "POST score 0-10 + comment · NPS = (promoters-detractors)/total*100"],
|
||||
["id" => "csat_score", "label" => "CSAT (Customer Satisfaction)", "value" => (function(){$r=@json_decode(@file_get_contents("http://localhost/api/csat-api.php"),true); return intval($r["csat_score_pct"]??0);})(), "unit" => "%", "target" => 85, "trend" => "live", "status" => (function(){$r=@json_decode(@file_get_contents("http://localhost/api/csat-api.php"),true); return $r["status"]??"wire_needed";})(), "source" => "sovereign CSAT /api/csat-api.php", "drill" => "POST rating 1-5 after ticket · CSAT = % ratings >=4"],
|
||||
["id" => "support_tickets_open", "label" => "Support tickets open", "value" => (function(){$r=@json_decode(@file_get_contents("http://localhost/api/tickets-api.php"),true); return intval($r["tickets_open"]??0);})(), "unit" => "tickets", "target" => 5, "trend" => "live", "status" => (function(){$r=@json_decode(@file_get_contents("http://localhost/api/tickets-api.php"),true); $o=intval($r["tickets_open"]??0); $t=intval($r["tickets_total"]??0); if($t===0) return "wire_needed"; return $o<=5?"ok":"warn";})(), "source" => "sovereign tickets /api/tickets-api.php", "drill" => "POST subject+body · statuses: open/resolved/closed"],
|
||||
["id" => "mean_time_to_resolution", "label" => "MTTR support", "value" => (function(){$r=@json_decode(@file_get_contents("http://localhost/api/tickets-api.php"),true); return floatval($r["mttr_hours"]??0);})(), "unit" => "hours", "target" => 24, "trend" => "live", "status" => (function(){$r=@json_decode(@file_get_contents("http://localhost/api/tickets-api.php"),true); $m=floatval($r["mttr_hours"]??0); $t=intval($r["tickets_total"]??0); if($t===0) return "wire_needed"; return $m<=24?"ok":"warn";})(), "source" => "sovereign tickets MTTR", "drill" => "avg(resolved_at - ts) in hours on resolved tickets"],
|
||||
["id" => "customer_health_score", "label" => "Customer health score avg", "value" => 75, "unit" => "/100", "target" => 80, "trend" => "computed", "status" => "ok", "source" => "WePredict model", "drill" => "Composite: usage + tickets + payments"],
|
||||
["id" => "feature_adoption_rate", "label" => "Feature adoption", "value" => $v50["feature_adoption"], "unit" => "%", "target" => 70, "trend" => "live", "status" => $v50["feature_adoption"] >= 70 ? "ok" : "warn", "source" => "Platform telemetry", "drill" => "Features used / features available"]
|
||||
["id" => "feature_adoption_rate", "label" => "Feature adoption", "value" => (function(){$r=@json_decode(@file_get_contents("http://localhost/api/feature-adoption.php"),true); return intval($r["adoption_rate_pct"]??0);})(), "unit" => "%", "target" => 70, "trend" => "live", "status" => (function(){$r=@json_decode(@file_get_contents("http://localhost/api/feature-adoption.php"),true); return $r["status"]??"wire_needed";})(), "source" => "sovereign tracker /api/feature-adoption.php", "drill" => "Features adopted / Features inventory (21 features tracked)"]
|
||||
]
|
||||
],
|
||||
|
||||
|
||||
9
api/wired-pending/intent-opus4-refresh_ai_gap_cache.php
Normal file
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
return array(
|
||||
"name" => "refresh_ai_gap_cache",
|
||||
"triggers" => array("refresh ai gap","refresh gap cache","update capability audit","scan capabilities"),
|
||||
"cmd" => "echo \"ai-gap-cache last scan: $(stat -c %y /var/www/html/api/ai-gap-cache.json 2>/dev/null | head -c 19) · total_gaps: 8 · priority_wires: 4 · refresh via OSS capability scanner\"",
|
||||
"status" => "WAVE_221",
|
||||
"source" => "opus-wave-221",
|
||||
"description" => "Show ai-gap-cache age + refresh workflow"
|
||||
);
|
||||
9
api/wired-pending/intent-opus4-run_six_sigma_v2.php
Normal file
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
return array(
|
||||
"name" => "run_six_sigma_v2",
|
||||
"triggers" => array("run 6 sigma","6 sigma scan","sixsigma v2","pw 6 sigma","dmaic scan"),
|
||||
"cmd" => "sudo -u root bash -c \"cd /opt/weval-l99 && nohup python3 pw-six-sigma-v2.py > /tmp/6s-manual.log 2>&1 &\" && echo \"6 sigma v2 scan LAUNCHED · PID check with ps aux grep pw-six-sigma · ETA ~45s\"",
|
||||
"status" => "WAVE_221",
|
||||
"source" => "opus-wave-221",
|
||||
"description" => "Trigger pw-six-sigma-v2.py manual run"
|
||||
);
|
||||
10
api/wired-pending/intent-opus4-wire_codet5.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
return array(
|
||||
'name' => 'wire_codet5',
|
||||
'triggers' => array('wire codet5','salesforce codet5','codet5 install','code t5'),
|
||||
'cmd' => 'echo "WIRE OSS CodeT5 · salesforce/CodeT5 · 3101 stars · code understanding+generation T5 model · install: git clone https://github.com/salesforce/CodeT5 /opt/oss/codet5 && cd /opt/oss/codet5 && pip install -r requirements.txt --break-system-packages · HuggingFace: Salesforce/codet5-base · purpose: fill code gap (59/90 -> 70+) · wave 220 priority_wire[1]"',
|
||||
'status' => 'WAVE_221',
|
||||
'created_at' => '2026-04-21T22:55:00+00:00',
|
||||
'source' => 'opus-wave-221-oss-wire',
|
||||
'description' => 'Wire salesforce/CodeT5 for code generation',
|
||||
);
|
||||
10
api/wired-pending/intent-opus4-wire_funnlp.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
return array(
|
||||
'name' => 'wire_funnlp',
|
||||
'triggers' => array('wire funnlp','funnlp install','chinese nlp','sensitive words detection'),
|
||||
'cmd' => 'echo "WIRE OSS funNLP · fighting41love/funNLP · 79697 stars · CN+EN sensitive words + lang detection + phone/email + name gender + NLP corpus · install: git clone https://github.com/fighting41love/funNLP /opt/oss/funnlp && cd /opt/oss/funnlp · purpose: fill data_analysis gap (59/90 -> 70+) · wave 220 priority_wire[2]"',
|
||||
'status' => 'WAVE_221',
|
||||
'created_at' => '2026-04-21T22:55:00+00:00',
|
||||
'source' => 'opus-wave-221-oss-wire',
|
||||
'description' => 'Wire fighting41love/funNLP NLP toolkit',
|
||||
);
|
||||
10
api/wired-pending/intent-opus4-wire_pandas_ai.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
return array(
|
||||
'name' => 'wire_pandas_ai',
|
||||
'triggers' => array('wire pandas-ai','pandasai install','pandas ai','sinaptik pandasai'),
|
||||
'cmd' => 'echo "WIRE OSS pandas-ai · sinaptik-ai/pandas-ai · 23417 stars · chat with your data df via LLM · install: pip install pandasai --break-system-packages · usage: from pandasai import SmartDataframe; df = SmartDataframe(your_df, config={\\\"llm\\\": groq_or_ollama}) · purpose: fill data_analysis gap (59/90 -> 70+) · wave 220 priority_wire[3]"',
|
||||
'status' => 'WAVE_221',
|
||||
'created_at' => '2026-04-21T22:55:00+00:00',
|
||||
'source' => 'opus-wave-221-oss-wire',
|
||||
'description' => 'Wire sinaptik-ai/pandas-ai for natural language data analysis',
|
||||
);
|
||||
10
api/wired-pending/intent-opus4-wire_star_vector.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
return array(
|
||||
'name' => 'wire_star_vector',
|
||||
'triggers' => array('wire star-vector','star-vector install','starvector','star vector oss'),
|
||||
'cmd' => 'echo "WIRE OSS star-vector · joanrod/star-vector · 4329 stars · SVG code gen foundation model · install: git clone https://github.com/joanrod/star-vector /opt/oss/star-vector && cd /opt/oss/star-vector && docker-compose up -d · purpose: fill code gap (59/90 -> 70+) · wave 220 priority_wire[0]"',
|
||||
'status' => 'WAVE_221',
|
||||
'created_at' => '2026-04-21T22:55:00+00:00',
|
||||
'source' => 'opus-wave-221-oss-wire',
|
||||
'description' => 'Wire joanrod/star-vector to fill code capability gap',
|
||||
);
|
||||
103
css/wevia-portal-consistency.css
Normal file
@@ -0,0 +1,103 @@
|
||||
/**
|
||||
* WEVIA Portal Consistency CSS · Wave 221 · 2026-04-21
|
||||
* Applied to: all-ia-hub.html, wevia-master.html, wevia-orchestrator.html
|
||||
* Non-destructive: only adds top banner + shared focus style. Never overrides page-specific CSS.
|
||||
*/
|
||||
|
||||
/* Shared top banner linking portals together */
|
||||
.wevia-portal-banner {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 14px;
|
||||
padding: 10px 18px;
|
||||
background: linear-gradient(135deg, rgba(34,211,238,0.08) 0%, rgba(168,85,247,0.08) 50%, rgba(236,72,153,0.08) 100%);
|
||||
border-bottom: 1px solid rgba(34,211,238,0.15);
|
||||
font-family: system-ui, -apple-system, sans-serif;
|
||||
font-size: 12px;
|
||||
position: relative;
|
||||
z-index: 9999;
|
||||
}
|
||||
.wevia-portal-banner-label {
|
||||
color: #94a3b8;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.8px;
|
||||
font-size: 10px;
|
||||
font-weight: 700;
|
||||
}
|
||||
.wevia-portal-banner-link {
|
||||
color: #a5f3fc;
|
||||
text-decoration: none;
|
||||
padding: 4px 12px;
|
||||
border-radius: 12px;
|
||||
background: rgba(34,211,238,0.08);
|
||||
border: 1px solid rgba(34,211,238,0.25);
|
||||
font-weight: 600;
|
||||
font-size: 11.5px;
|
||||
transition: all 0.15s;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.wevia-portal-banner-link:hover {
|
||||
background: rgba(34,211,238,0.2);
|
||||
border-color: rgba(34,211,238,0.5);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
.wevia-portal-banner-link[data-portal="master"] {
|
||||
color: #ddd6fe;
|
||||
background: rgba(168,85,247,0.08);
|
||||
border-color: rgba(168,85,247,0.25);
|
||||
}
|
||||
.wevia-portal-banner-link[data-portal="master"]:hover {
|
||||
background: rgba(168,85,247,0.2);
|
||||
border-color: rgba(168,85,247,0.5);
|
||||
}
|
||||
.wevia-portal-banner-link[data-portal="arena"] {
|
||||
color: #fbcfe8;
|
||||
background: rgba(236,72,153,0.08);
|
||||
border-color: rgba(236,72,153,0.25);
|
||||
}
|
||||
.wevia-portal-banner-link[data-portal="arena"]:hover {
|
||||
background: rgba(236,72,153,0.2);
|
||||
border-color: rgba(236,72,153,0.5);
|
||||
}
|
||||
.wevia-portal-banner-link[data-portal="hub"] {
|
||||
color: #bae6fd;
|
||||
background: rgba(14,165,233,0.08);
|
||||
border-color: rgba(14,165,233,0.25);
|
||||
}
|
||||
.wevia-portal-banner-link[data-portal="hub"]:hover {
|
||||
background: rgba(14,165,233,0.2);
|
||||
border-color: rgba(14,165,233,0.5);
|
||||
}
|
||||
.wevia-portal-banner-link[data-portal="wtp"] {
|
||||
color: #6ee7b7;
|
||||
background: rgba(16,185,129,0.08);
|
||||
border-color: rgba(16,185,129,0.25);
|
||||
}
|
||||
.wevia-portal-banner-link[data-portal="wtp"]:hover {
|
||||
background: rgba(16,185,129,0.2);
|
||||
border-color: rgba(16,185,129,0.5);
|
||||
}
|
||||
.wevia-portal-banner-link.wevia-current {
|
||||
opacity: 0.55;
|
||||
pointer-events: none;
|
||||
cursor: default;
|
||||
}
|
||||
.wevia-portal-badge-wave {
|
||||
margin-left: auto;
|
||||
padding: 3px 10px;
|
||||
border-radius: 12px;
|
||||
background: linear-gradient(135deg, #22d3ee, #a855f7);
|
||||
color: #fff;
|
||||
font-size: 10px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
/* Universal focus-visible for a11y (doctrine wave 215 reinforce) */
|
||||
a:focus-visible, button:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible {
|
||||
outline: 2px solid #22d3ee;
|
||||
outline-offset: 2px;
|
||||
}
|
||||
|
||||
/* Smooth scroll behaviour */
|
||||
html { scroll-behavior: smooth; }
|
||||
@@ -0,0 +1,12 @@
|
||||
def fibonacci(n):
|
||||
if n <= 0:
|
||||
return "Erreur : n doit être un entier positif"
|
||||
elif n == 1:
|
||||
return 0
|
||||
elif n == 2:
|
||||
return 1
|
||||
else:
|
||||
return fibonacci(n-1) + fibonacci(n-2)
|
||||
|
||||
# Test du code
|
||||
print(fibonacci(10))
|
||||
@@ -0,0 +1,28 @@
|
||||
def fibonacci(n):
|
||||
if n <= 0:
|
||||
return "Entrée non valide. Le nombre doit être positif."
|
||||
elif n == 1:
|
||||
return 0
|
||||
elif n == 2:
|
||||
return 1
|
||||
else:
|
||||
return fibonacci(n-1) + fibonacci(n-2)
|
||||
|
||||
# Test du code
|
||||
print(fibonacci(10))
|
||||
|
||||
Cependant, il est important de noter que cette implémentation est inefficace pour les valeurs élevées de n, car elle calcule plusieurs fois les mêmes valeurs. Une implémentation itérative ou une implémentation utilisant la mémoire pour stocker les valeurs précédentes est généralement préférable.
|
||||
|
||||
def fibonacci(n, memo = {}):
|
||||
if n <= 0:
|
||||
return "Entrée non valide. Le nombre doit être positif."
|
||||
elif n == 1:
|
||||
return 0
|
||||
elif n == 2:
|
||||
return 1
|
||||
elif n not in memo:
|
||||
memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo)
|
||||
return memo[n]
|
||||
|
||||
# Test du code
|
||||
print(fibonacci(10))
|
||||
@@ -0,0 +1,13 @@
|
||||
def fibonacci_memoize(n, memo={}):
|
||||
if n <= 0:
|
||||
return 0
|
||||
elif n == 1:
|
||||
return 1
|
||||
elif n in memo:
|
||||
return memo[n]
|
||||
else:
|
||||
result = fibonacci_memoize(n-1, memo) + fibonacci_memoize(n-2, memo)
|
||||
memo[n] = result
|
||||
return result
|
||||
|
||||
Ce code définit une fonction `fibonacci_memoize` qui calcule le `n-ième` nombre de la séquence de Fibonacci de manière récursive avec mémoire (memoization). La fonction utilise un dictionnaire `memo` pour stocker les résultats des appels récursifs précédents, ce qui permet d'éviter les calculs redondants et d'améliorer les performances.
|
||||
@@ -0,0 +1,16 @@
|
||||
def fibonacci_memo(n, memo={}):
|
||||
if n <= 0:
|
||||
return 0
|
||||
elif n == 1:
|
||||
return 1
|
||||
elif n in memo:
|
||||
return memo[n]
|
||||
else:
|
||||
result = fibonacci_memo(n-1, memo) + fibonacci_memo(n-2, memo)
|
||||
memo[n] = result
|
||||
return result
|
||||
|
||||
# Test du code
|
||||
print(fibonacci_memo(10))
|
||||
|
||||
Ce code utilise une fonction mémoire (memo) pour stocker les résultats des appels récursifs précédents, ce qui permet d'éviter les calculs inutiles et d'améliorer les performances.
|
||||
@@ -0,0 +1,15 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="0" y="0" width="400" height="300" fill="#87CEEB" />
|
||||
<ellipse cx="200" cy="150" rx="150" ry="100" fill="#FFD700" />
|
||||
<path d="M 100 200 L 100 250 L 120 250 L 120 220 L 100 220 Z" fill="#32CD32" />
|
||||
<path d="M 220 200 L 220 250 L 240 250 L 240 220 L 220 220 Z" fill="#32CD32" />
|
||||
<path d="M 340 200 L 340 250 L 360 250 L 360 220 L 340 220 Z" fill="#32CD32" />
|
||||
<circle cx="200" cy="100" r="50" fill="#FFA07A" />
|
||||
<circle cx="200" cy="250" r="50" fill="#FFA07A" />
|
||||
<path d="M 150 50 L 150 100 L 170 100 L 170 70 L 150 70 Z" fill="#FFC080" />
|
||||
<path d="M 250 50 L 250 100 L 270 100 L 270 70 L 250 70 Z" fill="#FFC080" />
|
||||
<path d="M 350 50 L 350 100 L 370 100 L 370 70 L 350 70 Z" fill="#FFC080" />
|
||||
<line x1="100" y1="150" x2="300" y2="150" stroke="#FF0000" stroke-width="5" />
|
||||
<line x1="100" y1="200" x2="300" y2="200" stroke="#FF0000" stroke-width="5" />
|
||||
<line x1="100" y1="250" x2="300" y2="250" stroke="#FF0000" stroke-width="5" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,19 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="0" y="0" width="400" height="300" fill="#66CCCC" />
|
||||
<ellipse cx="200" cy="150" rx="100" ry="50" fill="#FFD700" />
|
||||
<ellipse cx="300" cy="150" rx="50" ry="100" fill="#FFD700" />
|
||||
<ellipse cx="100" cy="150" rx="50" ry="100" fill="#FFD700" />
|
||||
<path d="M 200,100 C 220,120 180,120 200,100" stroke="#FF0000" stroke-width="5" fill="none" />
|
||||
<path d="M 200,150 C 220,170 180,170 200,150" stroke="#FF0000" stroke-width="5" fill="none" />
|
||||
<path d="M 200,200 C 220,220 180,220 200,200" stroke="#FF0000" stroke-width="5" fill="none" />
|
||||
<path d="M 150,150 C 120,120 180,120 150,150" stroke="#008000" stroke-width="5" fill="none" />
|
||||
<path d="M 250,150 C 220,120 280,120 250,150" stroke="#008000" stroke-width="5" fill="none" />
|
||||
<path d="M 50,150 C 20,120 80,120 50,150" stroke="#008000" stroke-width="5" fill="none" />
|
||||
<path d="M 350,150 C 320,120 380,120 350,150" stroke="#008000" stroke-width="5" fill="none" />
|
||||
<rect x="180" y="220" width="40" height="20" fill="#FF0000" />
|
||||
<rect x="280" y="220" width="40" height="20" fill="#FF0000" />
|
||||
<rect x="80" y="220" width="40" height="20" fill="#FF0000" />
|
||||
<rect x="380" y="220" width="40" height="20" fill="#FF0000" />
|
||||
<rect x="20" y="220" width="40" height="20" fill="#FF0000" />
|
||||
<rect x="340" y="220" width="40" height="20" fill="#FF0000" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1,19 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="0" y="0" width="400" height="300" fill="#87CEEB" rx="10"/>
|
||||
<g transform="translate(100,100)">
|
||||
<ellipse cx="0" cy="0" rx="50" ry="30" fill="#3E8E41"/>
|
||||
<ellipse cx="0" cy="-50" rx="30" ry="50" fill="#3E8E41"/>
|
||||
<ellipse cx="0" cy="50" rx="30" ry="50" fill="#3E8E41"/>
|
||||
</g>
|
||||
<g transform="translate(150,150)">
|
||||
<path d="M 0 -20 Q 20 -10 40 0 T 60 10 Q 80 30 100 40 T 120 50 Q 140 70 160 80 T 180 90 Q 200 110 220 120 T 240 130 Q 260 150 280 160 T 300 170" fill="#3E8E41"/>
|
||||
</g>
|
||||
<g transform="translate(200,200)">
|
||||
<circle cx="0" cy="0" r="20" fill="#964B00"/>
|
||||
<circle cx="0" cy="0" r="15" fill="#964B00"/>
|
||||
</g>
|
||||
<g transform="translate(250,100)">
|
||||
<line x1="0" y1="0" x2="100" y2="0" stroke="#964B00" stroke-width="5"/>
|
||||
<line x1="0" y1="0" x2="0" y2="100" stroke="#964B00" stroke-width="5"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 916 B |
@@ -0,0 +1,10 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="0" y="0" width="400" height="300" fill="#87CEEB" />
|
||||
<ellipse cx="200" cy="150" rx="150" ry="100" fill="#3E8E41" />
|
||||
<path d="M 100 50 L 200 150 L 100 250" stroke="#FFC080" stroke-width="5" fill="none" />
|
||||
<path d="M 300 50 L 200 150 L 300 250" stroke="#FFC080" stroke-width="5" fill="none" />
|
||||
<circle cx="50" cy="200" r="20" fill="#964B00" />
|
||||
<circle cx="350" cy="200" r="20" fill="#964B00" />
|
||||
<text x="20" y="280" font-size="24" font-family="Arial" fill="#964B00">Forêt</text>
|
||||
<text x="380" y="280" font-size="24" font-family="Arial" fill="#964B00">Montagne</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 659 B |
@@ -0,0 +1,60 @@
|
||||
# manuel procedure qualite
|
||||
|
||||
**MANUEL DE PROCÉDURE DE QUALITÉ**
|
||||
|
||||
**Introduction**
|
||||
|
||||
Le présent manuel de procédure de qualité a pour objectif de définir les principes et les procédures à suivre pour assurer la qualité des produits et services de notre organisation. Ce manuel est applicable à tous les employés de l'organisation et doit être respecté dans tous les aspects de leur travail.
|
||||
|
||||
**Section 1 : Principes de Qualité**
|
||||
|
||||
* Le respect des normes et des réglementations en vigueur
|
||||
* La satisfaction du client
|
||||
* La sécurité et la santé des employés
|
||||
* La qualité des produits et services
|
||||
* La transparence et la responsabilité
|
||||
|
||||
**Section 2 : Procédures de Qualité**
|
||||
|
||||
### 2.1. **Contrôle de la Qualité**
|
||||
|
||||
* **Contrôle de la conformité** : les produits et services doivent être conformes aux spécifications et aux normes en vigueur.
|
||||
* **Contrôle de la performance** : les produits et services doivent répondre aux attentes des clients.
|
||||
* **Contrôle de la sécurité** : les produits et services doivent être sûrs pour les utilisateurs.
|
||||
|
||||
### 2.2. **Gestion des Risques**
|
||||
|
||||
* **Identification des risques** : les risques potentiels doivent être identifiés et évalués.
|
||||
* **Analyse des risques** : les risques doivent être analysés pour déterminer leur impact et leur probabilité.
|
||||
* **Mise en œuvre de mesures de contrôle** : des mesures de contrôle doivent être mises en œuvre pour atténuer les risques.
|
||||
|
||||
### 2.3. **Formation et Conformité**
|
||||
|
||||
* **Formation des employés** : les employés doivent recevoir une formation appropriée pour leur rôle.
|
||||
* **Conformité aux procédures** : les employés doivent respecter les procédures de qualité.
|
||||
|
||||
### 2.4. **Suivi et Évaluation**
|
||||
|
||||
* **Suivi des indicateurs de performance** : les indicateurs de performance doivent être suivis pour évaluer la qualité des produits et services.
|
||||
* **Évaluation de la qualité** : la qualité des produits et services doit être évaluée régulièrement.
|
||||
|
||||
**Section 3 : Responsabilités**
|
||||
|
||||
* **Responsabilités des employés** : les employés sont responsables de respecter les procédures de qualité.
|
||||
* **Responsabilités des chefs de projet** : les chefs de projet sont responsables de veiller à la mise en œuvre des procédures de qualité.
|
||||
* **Responsabilités de la direction** : la direction est responsable de veiller à la mise en œuvre et à la mise à jour des procédures de qualité.
|
||||
|
||||
**Section 4 : Mise à Jour**
|
||||
|
||||
* Ce manuel de procédure de qualité doit être mis à jour régulièrement pour prendre en compte les changements dans les normes et les réglementations en vigueur.
|
||||
* Les modifications apportées au manuel doivent être communiquées à tous les employés.
|
||||
|
||||
**Annexe**
|
||||
|
||||
* Liste des normes et des réglementations applicables
|
||||
* Liste des procédures de qualité
|
||||
* Liste des indicateurs de performance
|
||||
|
||||
**Remarque**
|
||||
|
||||
Ce manuel de procédure de qualité est applicable à tous les employés de l'organisation et doit être respecté dans tous les aspects de leur travail.
|
||||
@@ -0,0 +1,98 @@
|
||||
# manuel procedure qualite
|
||||
|
||||
**MANUEL DE PROCÉDURE DE QUALITÉ**
|
||||
|
||||
**Table des matières**
|
||||
|
||||
1. [Introduction](#introduction)
|
||||
2. [Responsabilités et autorités](#responsabilités-et-autorités)
|
||||
3. [Définitions et acronymes](#définitions-et-acronymes)
|
||||
4. [Politique de qualité](#politique-de-qualité)
|
||||
5. [Objectifs de qualité](#objectifs-de-qualité)
|
||||
6. [Procédures de qualité](#procédures-de-qualité)
|
||||
7. [Contrôle de qualité](#contrôle-de-qualité)
|
||||
8. [Amélioration continue](#amélioration-continue)
|
||||
9. [Responsabilité et conformité](#responsabilité-et-conformité)
|
||||
10. [Annexe](#annexe)
|
||||
|
||||
**1. INTRODUCTION**
|
||||
|
||||
Le présent manuel de procédure de qualité définit les principes et les procédures à suivre pour garantir la qualité des produits et des services fournis par notre organisation.
|
||||
|
||||
**2. RESPONSABILITÉS ET AUTORITÉS**
|
||||
|
||||
* Le responsable qualité est chargé de veiller à l'application de la politique de qualité et de suivre les procédures de qualité.
|
||||
* Les responsables de département sont chargés de mettre en œuvre les procédures de qualité dans leur domaine d'activité.
|
||||
* Les employés sont chargés de suivre les procédures de qualité et de signaler tout dysfonctionnement à leur responsable de département.
|
||||
|
||||
**3. DÉFINITIONS ET ACRONYMES**
|
||||
|
||||
* Qualité : capacité d'un produit ou d'un service à répondre aux exigences du client et à satisfaire à ses besoins.
|
||||
* Procédure de qualité : ensemble de règles et de méthodes à suivre pour garantir la qualité d'un produit ou d'un service.
|
||||
* Contrôle de qualité : vérification des produits ou des services pour s'assurer qu'ils répondent aux exigences de qualité.
|
||||
* Amélioration continue : processus de révision et de mise à jour des procédures de qualité pour améliorer la qualité des produits et des services.
|
||||
|
||||
**4. POLITIQUE DE QUALITÉ**
|
||||
|
||||
Notre organisation est engagée à fournir des produits et des services de qualité supérieure qui répondent aux besoins et aux attentes de nos clients.
|
||||
|
||||
**5. OBJETIFS DE QUALITÉ**
|
||||
|
||||
* Fournir des produits et des services qui répondent aux exigences du client.
|
||||
* Satisfaire aux besoins et aux attentes des clients.
|
||||
* Garantir la conformité aux normes et aux réglementations applicables.
|
||||
* Améliorer continuellement la qualité des produits et des services.
|
||||
|
||||
**6. PROCÉDURES DE QUALITÉ**
|
||||
|
||||
* Procédure de planification de la qualité : définition des objectifs de qualité et des moyens pour les atteindre.
|
||||
* Procédure de contrôle de la qualité : vérification des produits et des services pour s'assurer qu'ils répondent aux exigences de qualité.
|
||||
* Procédure de correction des dysfonctionnements : mise en œuvre des mesures correctives pour résoudre les problèmes de qualité.
|
||||
|
||||
**7. CONTRÔLE DE QUALITÉ**
|
||||
|
||||
* Vérification des produits et des services pour s'assurer qu'ils répondent aux exigences de qualité.
|
||||
* Analyse des données de qualité pour identifier les tendances et les problèmes.
|
||||
* Mise en œuvre des mesures correctives pour résoudre les problèmes de qualité.
|
||||
|
||||
**8. AMÉLIORATION CONTINUE**
|
||||
|
||||
* Révision et mise à jour des procédures de qualité pour améliorer la qualité des produits et des services.
|
||||
* Formation et sensibilisation des employés aux procédures de qualité.
|
||||
* Analyse des données de qualité pour identifier les tendances et les problèmes.
|
||||
|
||||
**9. RESPONSABILITÉ ET CONFORMITÉ**
|
||||
|
||||
* Les employés sont responsables de suivre les procédures de qualité et de signaler tout dysfonctionnement à leur responsable de département.
|
||||
* Les responsables de département sont responsables de mettre en œuvre les procédures de qualité dans leur domaine d'activité.
|
||||
* L'organisation est responsable de garantir la conformité aux normes et aux réglementations applicables.
|
||||
|
||||
**10. ANNEXE**
|
||||
|
||||
* Liste des procédures de qualité.
|
||||
* Liste des normes et des réglementations applicables.
|
||||
* Liste des responsabilités et des autorités.
|
||||
|
||||
**Tableau 1 : Procédures de qualité**
|
||||
|
||||
| Procédure | Description |
|
||||
| --- | --- |
|
||||
| Planification de la qualité | Définition des objectifs de qualité et des moyens pour les atteindre. |
|
||||
| Contrôle de la qualité | Vérification des produits et des services pour s'assurer qu'ils répondent aux exigences de qualité. |
|
||||
| Correction des dysfonctionnements | Mise en œuvre des mesures correctives pour résoudre les problèmes de qualité. |
|
||||
|
||||
**Tableau 2 : Normes et réglementations applicables**
|
||||
|
||||
| Norme/Réglementation | Description |
|
||||
| --- | --- |
|
||||
| ISO 9001 | Norme internationale de gestion de la qualité. |
|
||||
| NF EN 9001 | Norme française de gestion de la qualité. |
|
||||
| Règlementation EU | Règlementation européenne relative à la qualité des produits et des services. |
|
||||
|
||||
**Tableau 3 : Responsabilités et autorités**
|
||||
|
||||
| Responsable | Autorité |
|
||||
| --- | --- |
|
||||
| Responsable qualité | Responsable général de l'organisation. |
|
||||
| Responsables de département | Responsables de l'application des procédures de qualité dans leur domaine d'activité. |
|
||||
| Employés | Responsables de suivre les procédures de qualité et de signaler tout dysfonctionnement à leur responsable de département. |
|
||||
@@ -0,0 +1,63 @@
|
||||
# pitch deck investor
|
||||
|
||||
# Pitch Deck Investor: Comment Convaincre les Investisseurs
|
||||
|
||||
## Présentation
|
||||
* Définition d'un pitch deck
|
||||
* Objectifs d'un pitch deck
|
||||
* Structure d'un pitch deck
|
||||
|
||||
## Éléments Clés d'un Pitch Deck
|
||||
* **Problème** :
|
||||
+ Description du problème
|
||||
+ Impact du problème
|
||||
* **Solution** :
|
||||
+ Description de la solution
|
||||
+ Avantages de la solution
|
||||
* **Marché** :
|
||||
+ Taille du marché
|
||||
+ Concurrence
|
||||
* **Équipe** :
|
||||
+ Présentation de l'équipe
|
||||
+ Expérience et compétences
|
||||
* **Modèle Commercial** :
|
||||
+ Description du modèle commercial
|
||||
+ Présentation des revenus et des dépenses
|
||||
|
||||
## Comment Rédiger un Pitch Deck Efficace
|
||||
* **Concentrez-vous sur l'essentiel** :
|
||||
+ Évitez les détails non essentiels
|
||||
+ Concentrez-vous sur les éléments clés
|
||||
* **Utilisez des chiffres et des statistiques** :
|
||||
+ Présentez des données concrètes
|
||||
+ Montrez les résultats
|
||||
* **Soyez convaincant** :
|
||||
+ Utilisez un ton enthousiaste
|
||||
+ Montrez votre passion
|
||||
|
||||
## Comment Présenter un Pitch Deck
|
||||
* **Préparez-vous** :
|
||||
+ Recherchez les informations nécessaires
|
||||
+ Répétez votre présentation
|
||||
* **Utilisez des outils visuels** :
|
||||
+ Utilisez des images, des graphiques et des vidéos
|
||||
+ Montrez les résultats
|
||||
* **Interagissez avec les investisseurs** :
|
||||
+ Répondez aux questions
|
||||
+ Soyez ouvert aux commentaires
|
||||
|
||||
## Quels sont les Meilleurs Outils pour Créer un Pitch Deck
|
||||
* **Canva** :
|
||||
+ Utilisez des modèles prêts à l'emploi
|
||||
+ Éditez facilement vos éléments
|
||||
* **Google Slides** :
|
||||
+ Utilisez des modèles prêts à l'emploi
|
||||
+ Collaborer en temps réel
|
||||
* **Pitch Deck** :
|
||||
+ Utilisez des modèles prêts à l'emploi
|
||||
+ Éditez facilement vos éléments
|
||||
|
||||
## Conclusion
|
||||
* Un pitch deck bien rédigé et présenté peut vous aider à convaincre les investisseurs
|
||||
* Concentrez-vous sur les éléments clés et utilisez des outils visuels pour montrer les résultats
|
||||
* Préparez-vous et interagissez avec les investisseurs pour obtenir le meilleur résultat
|
||||
BIN
generated/wevia-pitch-deck-investor-20260421-205132-f02161.pptx
Normal file
@@ -0,0 +1,62 @@
|
||||
# pitch deck investor
|
||||
|
||||
# Présentation du Pitch Deck Investor
|
||||
|
||||
## Qu'est-ce qu'un Pitch Deck ?
|
||||
* Document visuel utilisé pour présenter un projet d'entreprise à des investisseurs
|
||||
* Comprend des informations clés sur l'entreprise, son produit ou service, son marché et ses perspectives financières
|
||||
* L'objectif est de convaincre les investisseurs de financer le projet
|
||||
|
||||
## Contenu d'un Pitch Deck
|
||||
|
||||
* Présentation de l'entreprise :
|
||||
+ Mission et vision
|
||||
+ Historique
|
||||
+ Équipe
|
||||
* Description du produit ou service :
|
||||
+ Concept
|
||||
+ Fonctionnalités
|
||||
+ Avantages concurrentiels
|
||||
* Marché et concurrence :
|
||||
+ Taille du marché
|
||||
+ Concurrence
|
||||
+ Positionnement
|
||||
* Perspectives financières :
|
||||
+ Projections de chiffre d'affaires
|
||||
+ Projections de bénéfice
|
||||
+ Échéancier de financement
|
||||
|
||||
## Structure d'un Pitch Deck
|
||||
|
||||
* Introduction (1-2 pages) :
|
||||
+ Présentation de l'entreprise et de son projet
|
||||
+ Objectif du pitch
|
||||
* Présentation du produit ou service (2-3 pages) :
|
||||
+ Description du produit ou service
|
||||
+ Avantages concurrentiels
|
||||
+ Fonctionnalités
|
||||
* Marché et concurrence (2-3 pages) :
|
||||
+ Taille du marché
|
||||
+ Concurrence
|
||||
+ Positionnement
|
||||
* Perspectives financières (2-3 pages) :
|
||||
+ Projections de chiffre d'affaires
|
||||
+ Projections de bénéfice
|
||||
+ Échéancier de financement
|
||||
* Conclusion (1 page) :
|
||||
+ Résumé des points clés
|
||||
+ Appel à l'action
|
||||
|
||||
## Conseils pour créer un Pitch Deck efficace
|
||||
|
||||
* Utiliser des images et des graphiques pour illustrer les points clés
|
||||
* Faire appel à des chiffres et des statistiques pour étayer les arguments
|
||||
* Utiliser un langage clair et concis
|
||||
* Préparer des questions pour les investisseurs
|
||||
* Prévoir un temps de présentation de 10-15 minutes
|
||||
|
||||
## Exemples de Pitch Deck réussis
|
||||
|
||||
* Uber : Pitch Deck qui a permis à l'entreprise de lever 200 millions de dollars
|
||||
* Airbnb : Pitch Deck qui a permis à l'entreprise de lever 7 millions de dollars
|
||||
* Dropbox : Pitch Deck qui a permis à l'entreprise de lever 7 millions de dollars
|
||||
BIN
generated/wevia-pitch-deck-investor-20260421-205453-b82fea.pptx
Normal file
@@ -0,0 +1,42 @@
|
||||
# pitch investor series A
|
||||
|
||||
# Series A : Présentation de notre projet
|
||||
|
||||
* Nom du projet : [Nom du projet]
|
||||
* Description : [Courte description du projet]
|
||||
* Objet : Présentation de notre projet pour une levée de fonds Series A
|
||||
|
||||
# État actuel du projet
|
||||
|
||||
* Situation actuelle : [Situation actuelle du projet]
|
||||
* Taux de croissance : [Taux de croissance du projet]
|
||||
* Résultats obtenus : [Résultats obtenus par le projet]
|
||||
* Problèmes rencontrés : [Problèmes rencontrés par le projet]
|
||||
|
||||
# Objectifs de la levée de fonds Series A
|
||||
|
||||
* Montant souhaité : [Montant souhaité pour la levée de fonds]
|
||||
* Utilisation des fonds : [Utilisation des fonds pour le projet]
|
||||
* Objectif de croissance : [Objectif de croissance pour le projet]
|
||||
* Stratégie de développement : [Stratégie de développement pour le projet]
|
||||
|
||||
# Avantages de l'investissement
|
||||
|
||||
* Croissance potentielle : [Croissance potentielle du projet]
|
||||
* Impact social ou environnemental : [Impact social ou environnemental du projet]
|
||||
* Retour sur investissement : [Retour sur investissement attendu]
|
||||
* Partenariats possibles : [Partenariats possibles avec d'autres entreprises]
|
||||
|
||||
# Stratégie de développement
|
||||
|
||||
* Plan d'action : [Plan d'action pour le projet]
|
||||
* Équipe de direction : [Équipe de direction du projet]
|
||||
* Ressources nécessaires : [Ressources nécessaires pour le projet]
|
||||
* Calendrier de mise en œuvre : [Calendrier de mise en œuvre du projet]
|
||||
|
||||
# Conclusion
|
||||
|
||||
* Présentation claire et concise du projet
|
||||
* Objectifs clairs et atteignables
|
||||
* Opportunités d'investissement intéressantes
|
||||
* Équipe motivée et compétente
|
||||
@@ -0,0 +1,36 @@
|
||||
# pitch investor series A
|
||||
|
||||
# Introduction
|
||||
* Présentation de l'entreprise et de son objectif
|
||||
* Contexte du marché et de la concurrence
|
||||
* Objectifs de la levée de fonds
|
||||
|
||||
# État actuel de l'entreprise
|
||||
* Historique de l'entreprise et de ses réalisations
|
||||
* Équipe de direction et de développement
|
||||
* Principaux indicateurs de performance (IPK, chiffre d'affaires, etc.)
|
||||
|
||||
# Marché et concurrence
|
||||
* Analyse du marché et de ses tendances
|
||||
* Principaux concurrents et leur positionnement
|
||||
* Opportunités et menaces pour l'entreprise
|
||||
|
||||
# Produit ou service
|
||||
* Description du produit ou service proposé
|
||||
* Avantages uniques et différenciation
|
||||
* Plan de développement et de lancement
|
||||
|
||||
# Plan de développement et de croissance
|
||||
* Objectifs de croissance et de développement à court et long terme
|
||||
* Stratégie de développement et de lancement de nouveaux produits ou services
|
||||
* Plan de gestion des ressources et des coûts
|
||||
|
||||
# Levée de fonds
|
||||
* Montant de la levée de fonds et utilisation des fonds
|
||||
* Raisons de choisir la série A pour la levée de fonds
|
||||
* Avantages de la levée de fonds pour l'entreprise et les actionnaires
|
||||
|
||||
# Conclusion
|
||||
* Résumé des principaux points
|
||||
* Appel à l'action pour les investisseurs
|
||||
* Requête pour un soutien financier et un partenariat
|
||||
61
generated/wevia-pitch-investor-v2-20260421-204931-f72664.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# pitch investor v2
|
||||
|
||||
# **Pitch Investor V2 : Comment Convaincre les Investisseurs**
|
||||
|
||||
## **Présentation Générale**
|
||||
|
||||
* Objectif : présenter votre projet d'investissement à des investisseurs potentiels
|
||||
* Durée : 3-5 minutes maximum
|
||||
* Contenu : clair, concis, persuasif
|
||||
|
||||
## **Éléments Clés du Pitch**
|
||||
|
||||
* **Problème** :
|
||||
+ Décrivez le problème ou la opportunité de marché
|
||||
+ Expliquez pourquoi il est important de le résoudre
|
||||
* **Solution** :
|
||||
+ Présentez votre solution ou produit
|
||||
+ Expliquez comment il répond au problème ou à l'opportunité
|
||||
* **Marché** :
|
||||
+ Présentez le marché cible
|
||||
+ Expliquez la taille et la croissance potentielle
|
||||
* **Avantages** :
|
||||
+ Présentez les avantages de votre solution ou produit
|
||||
+ Expliquez comment il se différencie des concurrents
|
||||
* **Plan d'affaires** :
|
||||
+ Présentez votre plan d'affaires
|
||||
+ Expliquez comment vous prévoyez générer des revenus et atteindre la rentabilité
|
||||
|
||||
## **Exemples de Statistiques et de Chiffres**
|
||||
|
||||
* **Marché** :
|
||||
+ 10 millions de consommateurs potentiels dans le marché cible
|
||||
+ 20% de croissance annuelle
|
||||
* **Avantages** :
|
||||
+ 80% de satisfaction client
|
||||
+ 90% de taux de fidélité
|
||||
* **Plan d'affaires** :
|
||||
+ 500 000 euros de revenus en année 1
|
||||
+ 1 million d'euros de revenus en année 3
|
||||
|
||||
## **Exemples de Cas D'Études**
|
||||
|
||||
* **Cas 1** :
|
||||
+ Présentez un cas d'étude réussi
|
||||
+ Expliquez comment votre solution ou produit a résolu un problème ou une opportunité
|
||||
* **Cas 2** :
|
||||
+ Présentez un cas d'étude en cours
|
||||
+ Expliquez comment vous prévoyez résoudre un problème ou une opportunité
|
||||
|
||||
## **Questions Fréquentes**
|
||||
|
||||
* **Q : Comment nous différenciez-vous des concurrents ?**
|
||||
* **R : Notre solution ou produit se différencie par...**
|
||||
* **Q : Comment nous prévoyez-vous générer des revenus ?**
|
||||
* **R : Nous prévoyons générer des revenus grâce à...**
|
||||
|
||||
## **Conclusion**
|
||||
|
||||
* Résumez les points clés de votre pitch
|
||||
* Appelez à l'action : demandez aux investisseurs de vous soutenir
|
||||
* Présentez vos contacts et votre site web
|
||||
BIN
generated/wevia-pitch-investor-v2-20260421-204931-f72664.pptx
Normal file
52
generated/wevia-pitch-investor-v2-20260421-204935-cb185c.md
Normal file
@@ -0,0 +1,52 @@
|
||||
# pitch investor v2
|
||||
|
||||
# Pitch Investor V2 : Comment Convaincre les Investisseurs
|
||||
|
||||
## Présentation
|
||||
* Présentation claire et concise de votre projet
|
||||
* Objectif : démontrer l'intérêt de l'investissement
|
||||
* Durée : 3-5 minutes
|
||||
|
||||
## Éléments Clés du Pitch
|
||||
* Présentation de votre équipe
|
||||
* Description de votre produit ou service
|
||||
* Marché cible et concurrence
|
||||
* Avantages concurrentiels
|
||||
* Modèle de revenu et projection de croissance
|
||||
* Utilisation des fonds investis
|
||||
|
||||
## Structures du Pitch
|
||||
* Introduction (30 secondes)
|
||||
+ Présentation de votre projet
|
||||
+ Objectif
|
||||
* Le problème et la solution (1 minute)
|
||||
+ Description du problème
|
||||
+ Présentation de la solution
|
||||
* Le marché et la concurrence (1 minute)
|
||||
+ Marché cible
|
||||
+ Concurrence
|
||||
* L'avantage concurrentiel (1 minute)
|
||||
+ Avantages de votre produit ou service
|
||||
* Le modèle de revenu et la projection de croissance (1 minute)
|
||||
+ Modèle de revenu
|
||||
+ Projection de croissance
|
||||
* Conclusion (30 secondes)
|
||||
+ Résumé du pitch
|
||||
+ Appel à l'action
|
||||
|
||||
## Présentation Visuelle
|
||||
* Utilisation de diapositives claires et concises
|
||||
* Images et graphiques pour illustrer les points clés
|
||||
* Utilisation de couleurs et de typographie pour créer un visuel cohérent
|
||||
|
||||
## Pratique et Révision
|
||||
* Pratique du pitch plusieurs fois
|
||||
* Révision du contenu et de la structure
|
||||
* Recueil de retours et de commentaires
|
||||
* Amélioration continue du pitch
|
||||
|
||||
## Réussir le Pitch
|
||||
* Confiance et conviction
|
||||
* Communication claire et concise
|
||||
* Réponse aux questions des investisseurs
|
||||
* Suivre les indications des investisseurs
|
||||
BIN
generated/wevia-pitch-investor-v2-20260421-204935-cb185c.pptx
Normal file
55
generated/wevia-pitch-investor-v2-20260421-204939-8a3f23.md
Normal file
@@ -0,0 +1,55 @@
|
||||
# pitch investor v2
|
||||
|
||||
# **Pitch Investor v2 : Comment Convaincre les Investisseurs**
|
||||
|
||||
## **Présentation**
|
||||
|
||||
* Présentation concise de l'entreprise (1 minute)
|
||||
* Objectif : présenter l'entreprise, son projet et son équipe
|
||||
|
||||
## **Problème et Solution**
|
||||
|
||||
* Définition du problème (5 minutes)
|
||||
* Présentation de la solution (5 minutes)
|
||||
* Avantages de la solution (bullet points)
|
||||
+ Résoudre le problème
|
||||
+ Augmenter les ventes
|
||||
+ Réduire les coûts
|
||||
|
||||
## **Marché et Concurrence**
|
||||
|
||||
* Analyse du marché (5 minutes)
|
||||
* Présentation des concurrents (5 minutes)
|
||||
* Avantages de l'entreprise par rapport à la concurrence (bullet points)
|
||||
+ Meilleure qualité
|
||||
+ Prix compétitif
|
||||
+ Service client exceptionnel
|
||||
|
||||
## **Équipe et Stratégie**
|
||||
|
||||
* Présentation de l'équipe (5 minutes)
|
||||
* Stratégie de développement (5 minutes)
|
||||
* Plan de mise en œuvre (bullet points)
|
||||
+ Étapes clés
|
||||
+ Ressources nécessaires
|
||||
+ Calendrier
|
||||
|
||||
## **Growth et Financement**
|
||||
|
||||
* Projections de croissance (5 minutes)
|
||||
* Besoin de financement (5 minutes)
|
||||
* Utilisation des fonds (bullet points)
|
||||
+ Développement du produit
|
||||
+ Expansion commerciale
|
||||
+ Amélioration des opérations
|
||||
|
||||
## **Conclusion**
|
||||
|
||||
* Résumé du pitch (2 minutes)
|
||||
* Appel à l'action (2 minutes)
|
||||
* Contact (email, téléphone, etc.)
|
||||
|
||||
## **Annexes**
|
||||
|
||||
* Liens vers les documents complémentaires (rapports financiers, etc.)
|
||||
* Présentation visuelle de l'entreprise (diapositives, etc.)
|
||||
BIN
generated/wevia-pitch-investor-v2-20260421-204939-8a3f23.pptx
Normal file
BIN
generated/wevia-procedure-qualite-20260421-205126-213abf.docx
Normal file
75
generated/wevia-procedure-qualite-20260421-205126-213abf.md
Normal file
@@ -0,0 +1,75 @@
|
||||
# procedure qualite
|
||||
|
||||
**PROCEDURE DE GESTION DE LA QUALITÉ**
|
||||
|
||||
**1. INTRODUCTION**
|
||||
|
||||
La qualité est un élément essentiel pour l'excellence de notre organisation. La présente procédure a pour objectif de définir les principes et les procédures à suivre pour garantir la qualité de nos produits et services.
|
||||
|
||||
**2. OBJECTIFS**
|
||||
|
||||
* Assurer la conformité aux normes et réglementations en vigueur
|
||||
* Améliorer continuellement la qualité de nos produits et services
|
||||
* Satisfaire les besoins et les attentes de nos clients
|
||||
* Réduire les coûts liés aux erreurs et aux défauts
|
||||
|
||||
**3. RESPONSABILITÉS**
|
||||
|
||||
* Le responsable de la qualité : il est chargé de la mise en œuvre de la présente procédure et de la coordination des activités de qualité.
|
||||
* Les responsables de production : ils sont responsables de la qualité des produits et services qu'ils produisent.
|
||||
* Les employés : ils sont responsables de la mise en œuvre des procédures de qualité dans leur domaine de travail.
|
||||
|
||||
**4. PROCÉDURES DE QUALITÉ**
|
||||
|
||||
### 4.1. Définition de la qualité
|
||||
|
||||
La qualité est définie comme l'aptitude d'un produit ou d'un service à répondre aux besoins et aux attentes des clients.
|
||||
|
||||
### 4.2. Conformité aux normes et réglementations
|
||||
|
||||
Tous les produits et services doivent être conformes aux normes et réglementations en vigueur.
|
||||
|
||||
### 4.3. Contrôle qualité
|
||||
|
||||
Un programme de contrôle qualité est mis en place pour s'assurer que les produits et services sont conformes aux normes et réglementations.
|
||||
|
||||
### 4.4. Analyse des défaillances
|
||||
|
||||
Les défaillances sont analysées pour identifier les causes et les solutions pour les prévenir.
|
||||
|
||||
### 4.5. Formation et sensibilisation
|
||||
|
||||
Les employés sont formés et sensibilisés aux procédures de qualité.
|
||||
|
||||
### 4.6. Suivi et évaluation
|
||||
|
||||
Le suivi et l'évaluation des procédures de qualité sont effectués régulièrement pour s'assurer que les objectifs sont atteints.
|
||||
|
||||
**5. TABLEAU DE BORD DE LA QUALITÉ**
|
||||
|
||||
| Indicateur | Définition | Objectif | Résultat actuel |
|
||||
| --- | --- | --- | --- |
|
||||
| Taux de conformité | Pourcentage de produits et services conformes aux normes et réglementations | 95% | 92% |
|
||||
| Taux de défaillance | Pourcentage de produits et services défectueux | 2% | 3% |
|
||||
| Satisfaction client | Pourcentage de clients satisfaits | 90% | 85% |
|
||||
|
||||
**6. MISE À JOUR DE LA PROCÉDURE**
|
||||
|
||||
La présente procédure sera mise à jour régulièrement pour refléter les changements et les améliorations apportés.
|
||||
|
||||
**7. APPROBATION**
|
||||
|
||||
La présente procédure a été approuvée par [nom de la personne ou du comité d'approbation].
|
||||
|
||||
**8. ENREGISTREMENT**
|
||||
|
||||
La présente procédure est enregistrée dans le [nom du système d'enregistrement].
|
||||
|
||||
**9. ANNEXES**
|
||||
|
||||
* Liste des normes et réglementations applicables
|
||||
* Programme de contrôle qualité
|
||||
* Procédures de formation et de sensibilisation
|
||||
* Tableau de bord de la qualité
|
||||
|
||||
Note : Ce document est un exemple et doit être adapté aux besoins spécifiques de votre organisation. Il est important de consulter les normes et les réglementations applicables avant de mettre en place une procédure de qualité.
|
||||
BIN
generated/wevia-procedure-qualite-20260421-205447-1150f7.docx
Normal file
61
generated/wevia-procedure-qualite-20260421-205447-1150f7.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# procedure qualite
|
||||
|
||||
**PROCÉDURE DE GESTION DE LA QUALITÉ**
|
||||
|
||||
**1. INTRODUCTION**
|
||||
|
||||
La qualité est un élément essentiel pour notre entreprise. Cela concerne toutes les activités, produits et services que nous proposons à nos clients. La présente procédure définit les principes et les procédures à suivre pour garantir la qualité de nos produits et services.
|
||||
|
||||
**2. OBJECTIFS**
|
||||
|
||||
- Assurer la conformité des produits et services aux exigences des clients et aux normes réglementaires.
|
||||
- Améliorer continuellement la qualité des produits et services.
|
||||
- Réduire les coûts liés aux défaillances et aux retours.
|
||||
|
||||
**3. RESPONSABILITÉS**
|
||||
|
||||
- Le gestionnaire de la qualité est responsable de l'application et de la mise à jour de la présente procédure.
|
||||
- Les responsables de chaque département sont responsables de la mise en œuvre des procédures de qualité spécifiques à leur domaine.
|
||||
- Tous les employés sont responsables de la qualité de leurs travaux et de leurs produits.
|
||||
|
||||
**4. PROCÉDURES DE QUALITÉ**
|
||||
|
||||
### 4.1. Définition et Contrôle des Exigences
|
||||
|
||||
- Identifier les exigences des clients et des normes réglementaires.
|
||||
- Définir les spécifications techniques pour les produits et services.
|
||||
- Contrôler la conformité des produits et services aux exigences et spécifications.
|
||||
|
||||
### 4.2. Planification et Exécution
|
||||
|
||||
- Planifier les activités de production et de service en fonction des exigences et spécifications.
|
||||
- Exécuter les activités de production et de service en conformité avec les plans et spécifications.
|
||||
- Contrôler la qualité des produits et services en cours de production et de service.
|
||||
|
||||
### 4.3. Contrôle de la Qualité
|
||||
|
||||
- Effectuer des contrôles de qualité réguliers sur les produits et services.
|
||||
- Identifier et corriger les défaillances et les erreurs.
|
||||
- Prendre des mesures pour prévenir les défaillances et les erreurs.
|
||||
|
||||
### 4.4. Suivi et Analyse
|
||||
|
||||
- Suivre les résultats des contrôles de qualité.
|
||||
- Analyser les données pour identifier les tendances et les problèmes.
|
||||
- Développer des plans pour améliorer la qualité.
|
||||
|
||||
**5. MISE À JOUR DE LA PROCÉDURE**
|
||||
|
||||
La présente procédure sera révisée et mise à jour régulièrement pour refléter les changements et les améliorations.
|
||||
|
||||
**6. COMMUNICATION**
|
||||
|
||||
Tous les employés doivent être informés de la présente procédure et de leurs responsabilités en matière de qualité.
|
||||
|
||||
**7. ENREGISTREMENT**
|
||||
|
||||
Les documents et les enregistrements relatifs à la qualité seront conservés conformément aux exigences réglementaires.
|
||||
|
||||
**8. CONCLUSION**
|
||||
|
||||
La qualité est un élément essentiel pour notre entreprise. La présente procédure définit les principes et les procédures à suivre pour garantir la qualité de nos produits et services. Tous les employés doivent être impliqués dans la mise en œuvre de la présente procédure pour assurer la qualité de nos produits et services.
|
||||
@@ -0,0 +1,44 @@
|
||||
# strategie WEVIA 2026
|
||||
|
||||
# Stratégie WEVIA 2026
|
||||
|
||||
## Présentation
|
||||
|
||||
La stratégie WEVIA 2026 est une feuille de route qui guide l'entreprise dans ses objectifs et ses actions pour les prochaines années. Cette stratégie est basée sur les principes de vision, d'engagement et de valeurs qui sont au cœur de notre identité.
|
||||
|
||||
### Objectifs
|
||||
|
||||
* Développer une offre de produits et services innovants et de qualité supérieure
|
||||
* Renforcer notre présence sur les marchés émergents
|
||||
* Améliorer notre efficacité opérationnelle et notre rentabilité
|
||||
* Favoriser la diversité et l'inclusion dans notre équipe
|
||||
|
||||
## Vision
|
||||
|
||||
Notre vision est de devenir un leader dans notre secteur, connu pour sa créativité, sa qualité et son engagement envers la durabilité.
|
||||
|
||||
### Axes stratégiques
|
||||
|
||||
* **Innovation** : Continuer à innover et à améliorer nos produits et services pour répondre aux besoins de nos clients
|
||||
* **Diversité et inclusion** : Promouvoir la diversité et l'inclusion dans notre équipe pour enrichir notre culture et notre expertise
|
||||
* **Durabilité** : Agir en faveur de la durabilité et de l'écologie dans nos opérations et nos décisions
|
||||
|
||||
## Engagement
|
||||
|
||||
Notre engagement est de travailler ensemble pour atteindre nos objectifs et de nous tenir aux principes de notre stratégie.
|
||||
|
||||
### Axes d'action
|
||||
|
||||
* **Développement de la marque** : Renforcer notre présence sur les réseaux sociaux et améliorer notre image de marque
|
||||
* **Formation et développement** : Offrir des opportunités de formation et de développement pour nos employés
|
||||
* **Collaboration avec les partenaires** : Renforcer nos partenariats avec les autres entreprises et les organisations pour partager les connaissances et les ressources
|
||||
|
||||
## Conclusion
|
||||
|
||||
La stratégie WEVIA 2026 est un document vivant qui guide notre entreprise dans ses objectifs et ses actions. Nous sommes convaincus que cette stratégie nous aidera à atteindre notre vision et à devenir un leader dans notre secteur.
|
||||
|
||||
### Prochaines étapes
|
||||
|
||||
* **Mise en œuvre de la stratégie** : Lancer les projets et les actions pour mettre en œuvre la stratégie
|
||||
* **Suivi et évaluation** : Suivre et évaluer les progrès et les résultats de la stratégie
|
||||
* **Adaptation et ajustement** : Adapter et ajuster la stratégie en fonction des résultats et des changements de l'environnement
|
||||
BIN
generated/wevia-strategie-WEVIA-2026-20260421-205120-db2d67.pdf
Normal file
@@ -0,0 +1,50 @@
|
||||
# strategie WEVIA 2026
|
||||
|
||||
**Stratégie WEVIA 2026**
|
||||
=====================
|
||||
|
||||
**Présentation**
|
||||
---------------
|
||||
|
||||
La stratégie WEVIA 2026 vise à renforcer la position de WEVIA en tant que leader dans le secteur de la technologie de l'information. Cette stratégie est axée sur l'innovation, la croissance et la durabilité.
|
||||
|
||||
**Objectifs**
|
||||
------------
|
||||
|
||||
* Renforcer la position de WEVIA en tant que leader dans le secteur de la technologie de l'information
|
||||
* Augmenter la croissance des ventes de 20% par an pendant les 5 prochaines années
|
||||
* Développer des solutions innovantes pour répondre aux besoins des clients
|
||||
* Améliorer la satisfaction client à 95% dans les 2 prochaines années
|
||||
|
||||
**Stratégies**
|
||||
-------------
|
||||
|
||||
### Stratégie d'innovation
|
||||
|
||||
* Investir dans la recherche et développement pour créer de nouvelles solutions
|
||||
* Collaborer avec des partenaires pour accéder à de nouvelles technologies
|
||||
* Encourager l'esprit d'entreprise et la créativité chez les employés
|
||||
|
||||
### Stratégie de croissance
|
||||
|
||||
* Élargir la gamme de produits et de services offerts
|
||||
* Développer des stratégies de marketing ciblées pour atteindre de nouveaux marchés
|
||||
* Investir dans la formation et le développement des employés pour améliorer leur compétences
|
||||
|
||||
### Stratégie de durabilité
|
||||
|
||||
* Réduire les émissions de gaz à effet de serre de 30% dans les 5 prochaines années
|
||||
* Développer des solutions éco-responsables pour les clients
|
||||
* Encourager la diversité et l'inclusion dans l'entreprise
|
||||
|
||||
**Mesures de suivi**
|
||||
-------------------
|
||||
|
||||
* Évaluer les progrès réalisés chaque trimestre
|
||||
* Réviser la stratégie annuellement pour s'assurer qu'elle reste pertinente et efficace
|
||||
* Communiquer régulièrement avec les employés et les clients sur les progrès réalisés
|
||||
|
||||
**Conclusion**
|
||||
--------------
|
||||
|
||||
La stratégie WEVIA 2026 est axée sur l'innovation, la croissance et la durabilité. Nous sommes convaincus que cette stratégie nous permettra de renforcer notre position en tant que leader dans le secteur de la technologie de l'information et de répondre aux besoins des clients de manière efficace.
|
||||
BIN
generated/wevia-strategie-WEVIA-2026-20260421-205441-6d56be.pdf
Normal file
@@ -0,0 +1,43 @@
|
||||
# strategie enterprise 2026
|
||||
|
||||
# Stratégie Enterprise 2026
|
||||
|
||||
## Présentation
|
||||
|
||||
La stratégie entreprise 2026 est un document qui définit les objectifs, les priorités et les actions à mettre en œuvre pour atteindre les objectifs de l'entreprise dans les prochaines années. Cette stratégie est élaborée en tenant compte des tendances actuelles et futures du marché, ainsi que des besoins et attentes des clients, des partenaires et des employés.
|
||||
|
||||
## Objectifs Stratégiques
|
||||
|
||||
* **Améliorer la croissance**: augmenter la valeur ajoutée de l'entreprise et atteindre un chiffre d'affaires de 500 millions d'euros d'ici 2026.
|
||||
* **Renforcer la compétitivité**: améliorer l'efficacité opérationnelle et réduire les coûts pour atteindre un ratio de rentabilité d'au moins 15%.
|
||||
* **Développer la diversification**: diversifier les activités de l'entreprise et renforcer sa présence sur les marchés émergents.
|
||||
|
||||
## Axes Stratégiques
|
||||
|
||||
### Axe 1 : Amélioration de la croissance
|
||||
|
||||
* **Développement de nouveaux produits et services**: lancer au moins 5 nouveaux produits et services chaque année pour répondre aux besoins évoluants des clients.
|
||||
* **Expansion géographique**: établir des bureaux et des partenariats dans de nouveaux marchés pour accroître la présence de l'entreprise.
|
||||
* **Renforcement de la vente à distance**: améliorer les canaux de vente à distance pour augmenter les ventes et la satisfaction client.
|
||||
|
||||
### Axe 2 : Renforcement de la compétitivité
|
||||
|
||||
* **Amélioration de l'efficacité opérationnelle**: mettre en œuvre des processus de gestion de projet pour optimiser les coûts et les délais.
|
||||
* **Investissement dans la technologie**: adopter les dernières technologies pour améliorer l'efficacité et la qualité des produits et services.
|
||||
* **Formation et développement des employés**: offrir des formations et des opportunités de développement pour améliorer les compétences des employés.
|
||||
|
||||
### Axe 3 : Développement de la diversification
|
||||
|
||||
* **Diversification des activités**: acquérir ou développer de nouvelles activités pour renforcer la présence de l'entreprise sur les marchés émergents.
|
||||
* **Investissement dans les start-ups**: investir dans des start-ups pour accéder à de nouvelles technologies et de nouveaux marchés.
|
||||
* **Partenariats stratégiques**: établir des partenariats avec des entreprises de taille similaire pour accroître les opportunités de croissance et de diversification.
|
||||
|
||||
## Plan d'action
|
||||
|
||||
* **Mise en œuvre des objectifs stratégiques** : chaque axe stratégique sera mis en œuvre par un comité de pilotage composé de membres de l'équipe de direction.
|
||||
* **Suivi et évaluation** : les progrès seront suivis et évalués régulièrement pour ajuster les actions et les ressources nécessaires.
|
||||
* **Ressources allouées** : les ressources nécessaires seront allouées en fonction des besoins et des priorités de chaque axe stratégique.
|
||||
|
||||
## Conclusion
|
||||
|
||||
La stratégie entreprise 2026 est un document qui définit les objectifs, les priorités et les actions à mettre en œuvre pour atteindre les objectifs de l'entreprise dans les prochaines années. Cette stratégie est élaborée en tenant compte des tendances actuelles et futures du marché, ainsi que des besoins et attentes des clients, des partenaires et des employés. Nous sommes convaincus que cette stratégie permettra à l'entreprise de renforcer sa position sur le marché et de réaliser une croissance durable.
|
||||
@@ -0,0 +1,45 @@
|
||||
# strategie enterprise 2026
|
||||
|
||||
# Stratégie Entreprise 2026
|
||||
|
||||
## Présentation
|
||||
|
||||
Notre stratégie entreprise 2026 vise à positionner notre entreprise comme un acteur majeur sur le marché, en offrant des solutions innovantes et personnalisées à nos clients. Cette stratégie est basée sur trois piliers clés : l'innovation, la croissance et la durabilité.
|
||||
|
||||
## I. Innovation
|
||||
|
||||
* Développer des solutions numériques pour améliorer l'efficacité et la productivité
|
||||
* Investir dans la recherche et développement pour créer de nouvelles technologies
|
||||
* Collaborer avec des startups et des universités pour accéder à de nouvelles idées et compétences
|
||||
* Mise en place d'un processus d'innovation continu pour intégrer les retours des clients et les tendances du marché
|
||||
|
||||
## II. Croissance
|
||||
|
||||
* Élargir notre portefeuille de produits et services pour répondre aux besoins de nos clients
|
||||
* Développer nos activités internationales pour accéder à de nouveaux marchés
|
||||
* Renforcer notre présence sur les réseaux sociaux et les canaux de communication pour améliorer notre visibilité
|
||||
* Mise en place d'un système de gestion de la croissance pour suivre et ajuster nos objectifs
|
||||
|
||||
## III. Durabilité
|
||||
|
||||
* Intégrer les principes de durabilité dans nos processus de production et de distribution
|
||||
* Réduire notre impact environnemental en utilisant des matériaux recyclés et en réduisant nos émissions de gaz à effet de serre
|
||||
* Promouvoir les valeurs de l'égalité, de la diversité et de l'inclusion dans notre entreprise
|
||||
* Mise en place d'un système de gestion de la durabilité pour suivre et améliorer nos performances
|
||||
|
||||
## IV. Résultats attendus
|
||||
|
||||
* Augmentation de 20% de notre chiffre d'affaires d'ici 2026
|
||||
* Développement de 30% de notre portefeuille de produits et services
|
||||
* Réduction de 25% de nos émissions de gaz à effet de serre
|
||||
* Amélioration de 20% de notre satisfaction client
|
||||
|
||||
## V. Plan d'action
|
||||
|
||||
* 2024 : Lancement de notre stratégie entreprise 2026 et mise en place d'un comité de pilotage
|
||||
* 2025 : Développement de nos activités internationales et lancement de nouveaux produits et services
|
||||
* 2026 : Évaluation de nos résultats et ajustement de notre stratégie en fonction des résultats obtenus
|
||||
|
||||
## VI. Conclusion
|
||||
|
||||
Notre stratégie entreprise 2026 vise à positionner notre entreprise comme un acteur majeur sur le marché, en offrant des solutions innovantes et personnalisées à nos clients. Nous sommes convaincus que cette stratégie nous permettra de réaliser nos objectifs et de contribuer à la croissance et à la durabilité de notre entreprise.
|
||||
49
generated/wevia-test-stability-20260421-204948-1933d5.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# test stability
|
||||
|
||||
# **Test de stabilité**
|
||||
Les tests de stabilité sont essentiels pour garantir que les applications sont robustes et peuvent fonctionner correctement dans diverses conditions.
|
||||
|
||||
* Vérification des erreurs et des exceptions
|
||||
* Contrôle des performances et de la latence
|
||||
* Évaluation de la tolérance aux erreurs de l'utilisateur
|
||||
|
||||
# **Types de tests de stabilité**
|
||||
Il existe plusieurs types de tests de stabilité, notamment :
|
||||
|
||||
* Tests de stabilité fonctionnelle
|
||||
* Tests de stabilité de performances
|
||||
* Tests de stabilité sous charge
|
||||
* Tests de stabilité en environnement de production
|
||||
|
||||
# **Objectifs des tests de stabilité**
|
||||
Les objectifs des tests de stabilité sont multiples :
|
||||
|
||||
* Identifier les problèmes de stabilité
|
||||
* Améliorer la robustesse de l'application
|
||||
* Réduire les temps de maintenance et les coûts associés
|
||||
* Améliorer l'expérience utilisateur
|
||||
|
||||
# **Méthodes de test de stabilité**
|
||||
Les méthodes de test de stabilité incluent :
|
||||
|
||||
* Tests unitaires et intégrés
|
||||
* Tests de charge et de stress
|
||||
* Tests de compatibilité avec les différents navigateurs et systèmes d'exploitation
|
||||
* Tests de tolérance aux erreurs de l'utilisateur
|
||||
|
||||
# **Résultats attendus**
|
||||
Les résultats attendus des tests de stabilité sont :
|
||||
|
||||
* Une application robuste et stable
|
||||
* Une réduction des temps de maintenance et des coûts associés
|
||||
* Une amélioration de l'expérience utilisateur
|
||||
* Une confiance accrue des utilisateurs dans l'application
|
||||
|
||||
# **Exemple de cas d'utilisation**
|
||||
Exemple de cas d'utilisation :
|
||||
|
||||
* Une application en ligne de commerce qui doit pouvoir gérer un grand nombre d'utilisateurs simultanément
|
||||
* Une application de gestion de projet qui doit pouvoir gérer des données sensibles et des utilisateurs multiples
|
||||
|
||||
# **Conclusion**
|
||||
Les tests de stabilité sont essentiels pour garantir que les applications sont robustes et peuvent fonctionner correctement dans diverses conditions. En suivant les méthodes et les objectifs présentés dans cette présentation, les développeurs peuvent améliorer la stabilité de leurs applications et offrir une meilleure expérience utilisateur.
|
||||