auto-commit via WEVIA vault_git intent 2026-04-19T15:13:47+00:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
This commit is contained in:
@@ -1,14 +1,14 @@
|
||||
{
|
||||
"generated_at": "2026-04-19T17:05:01.629888",
|
||||
"generated_at": "2026-04-19T17:10:02.091136",
|
||||
"stats": {
|
||||
"total": 450,
|
||||
"pending": 861,
|
||||
"total": 449,
|
||||
"pending": 859,
|
||||
"kaouther_surfaced": 29,
|
||||
"chrome_surfaced": 10,
|
||||
"notif_only_done": 0,
|
||||
"autofix_archived": 0,
|
||||
"cerebras_archived": 0,
|
||||
"older_3d_archived": 2,
|
||||
"older_3d_archived": 1,
|
||||
"unknown": 409,
|
||||
"errors": 0
|
||||
},
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"id": "task_20260416_170718_e16e10",
|
||||
"type": "powershell",
|
||||
"cmd": "az ad app list --all --query \"[].{name:displayName,appId:appId}\" --output table 2>&1 | Out-String",
|
||||
"label": "AZ-AD-APPS-V3",
|
||||
"priority": 10,
|
||||
"status": "pending",
|
||||
"created": "2026-04-16T17:07:18+00:00",
|
||||
"started": null,
|
||||
"completed": null,
|
||||
"result": null,
|
||||
"error": null,
|
||||
"source": "api"
|
||||
}
|
||||
105
api/opus5-orphans-hub.php
Normal file
105
api/opus5-orphans-hub.php
Normal file
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
// OPUS5 — Orphans Hub Merged (doctrine 92)
|
||||
// Fusion V82 mapper (8 suites métier) + doctrine 91 classifier (archive/active/dormant)
|
||||
// Ajoute : action generator = snippet HTML prêt à injecter dans WTP drawer
|
||||
// Lecture seule, zero écrasement, consomme 2 endpoints existants
|
||||
header('Content-Type: application/json');
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
$t0 = microtime(true);
|
||||
$R = ['ts'=>date('c'), 'source'=>'opus5-orphans-hub-merged'];
|
||||
|
||||
// === 1. Fetch V82 mapper (8 suites métier) ===
|
||||
$ch = curl_init('http://127.0.0.1/api/wevia-orphans-mapper.php');
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER=>true, CURLOPT_TIMEOUT=>8, CURLOPT_FOLLOWLOCATION=>true]);
|
||||
$v82_raw = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
$v82 = @json_decode((string)$v82_raw, true) ?: [];
|
||||
|
||||
// === 2. Fetch doctrine 91 classifier ===
|
||||
$ch = curl_init('http://127.0.0.1/api/opus5-orphans-classifier.php');
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER=>true, CURLOPT_TIMEOUT=>8, CURLOPT_FOLLOWLOCATION=>true]);
|
||||
$d91_raw = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
$d91 = @json_decode((string)$d91_raw, true) ?: [];
|
||||
|
||||
// === 3. Index by page name for cross-reference ===
|
||||
// V82: mapping[suite] = [ {name, url, size_kb, class, title}, ... ]
|
||||
// D91: classification[LEGITIMATE_ARCHIVE|ACTIVE_ORPHAN|DORMANT_CANDIDATE] = [ {page, reason, ...} ]
|
||||
|
||||
$suite_by_page = [];
|
||||
foreach (($v82['mapping'] ?? []) as $suite => $items) {
|
||||
foreach ($items as $item) {
|
||||
$suite_by_page[$item['name'] ?? ''] = [
|
||||
'suite' => $suite,
|
||||
'title' => $item['title'] ?? '',
|
||||
'size_kb' => $item['size_kb'] ?? 0,
|
||||
'class' => $item['class'] ?? ''
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
$d91_by_page = [];
|
||||
foreach ($d91['classification']['LEGITIMATE_ARCHIVE'] ?? [] as $p) $d91_by_page[$p['page']] = ['status'=>'ARCHIVE','reason'=>$p['reason']];
|
||||
foreach ($d91['classification']['ACTIVE_ORPHAN'] ?? [] as $p) $d91_by_page[$p['page']] = ['status'=>'ACTIVE','reason'=>$p['reason']];
|
||||
foreach ($d91['classification']['DORMANT_CANDIDATE'] ?? [] as $p) $d91_by_page[$p['page']] = ['status'=>'DORMANT','reason'=>'user_decision_required'];
|
||||
|
||||
// === 4. Merge : pour chaque orphan, donne suite + status classifier ===
|
||||
$merged = [];
|
||||
foreach ($suite_by_page as $page => $meta) {
|
||||
$classif = $d91_by_page[$page] ?? ['status'=>'UNKNOWN','reason'=>''];
|
||||
$merged[] = [
|
||||
'page' => $page,
|
||||
'url' => '/' . $page,
|
||||
'title' => $meta['title'],
|
||||
'size_kb' => $meta['size_kb'],
|
||||
'class' => $meta['class'],
|
||||
'suite_v82' => $meta['suite'],
|
||||
'classif_d91' => $classif['status'],
|
||||
'reason' => $classif['reason']
|
||||
];
|
||||
}
|
||||
|
||||
// Sort : ACTIVE first (priorité action), puis DORMANT, puis ARCHIVE
|
||||
usort($merged, function($a,$b) {
|
||||
$order = ['ACTIVE'=>0, 'DORMANT'=>1, 'ARCHIVE'=>2, 'UNKNOWN'=>3];
|
||||
return ($order[$a['classif_d91']] ?? 99) - ($order[$b['classif_d91']] ?? 99);
|
||||
});
|
||||
|
||||
// === 5. Action generator : snippet HTML prêt à injecter dans WTP drawer ===
|
||||
$active_pages = array_filter($merged, fn($x) => $x['classif_d91'] === 'ACTIVE');
|
||||
$snippet_lines = ['<!-- SECTION ACTIVE ORPHANS — à injecter AVANT </body> dans WTP, additive pur -->',
|
||||
'<!-- Généré par opus5-orphans-hub.php doctrine 92 — sync avec orphans-classifier -->'];
|
||||
$snippet_lines[] = '<div id="wtp-active-orphans" style="display:none">';
|
||||
$snippet_lines[] = ' <h3 style="color:#fbbf24">📎 Pages actives à rebrancher (21)</h3>';
|
||||
$snippet_lines[] = ' <ul>';
|
||||
foreach ($active_pages as $p) {
|
||||
$safe_title = htmlspecialchars($p['title'], ENT_QUOTES);
|
||||
$safe_page = htmlspecialchars($p['page'], ENT_QUOTES);
|
||||
$snippet_lines[] = sprintf(' <li><a href="/%s" title="%s · %s KB">%s — <em>%s</em></a></li>',
|
||||
$safe_page, $safe_title, $p['size_kb'], $safe_page, htmlspecialchars($p['suite_v82']));
|
||||
}
|
||||
$snippet_lines[] = ' </ul>';
|
||||
$snippet_lines[] = '</div>';
|
||||
$snippet_html = implode("\n", $snippet_lines);
|
||||
|
||||
// === 6. Stats ===
|
||||
$stats = [
|
||||
'total_orphans' => count($merged),
|
||||
'active_to_link' => count($active_pages),
|
||||
'dormant_candidate' => count(array_filter($merged, fn($x) => $x['classif_d91'] === 'DORMANT')),
|
||||
'archive_legit' => count(array_filter($merged, fn($x) => $x['classif_d91'] === 'ARCHIVE')),
|
||||
'suites_v82' => count($v82['mapping'] ?? []),
|
||||
'v82_total' => $v82['total_orphans'] ?? 0,
|
||||
'd91_total' => $d91['summary']['total_orphans'] ?? 0,
|
||||
'sync_ok' => ($v82['total_orphans'] ?? 0) === ($d91['summary']['total_orphans'] ?? 0)
|
||||
];
|
||||
|
||||
$R['stats'] = $stats;
|
||||
$R['merged'] = $merged;
|
||||
$R['snippet_html'] = $snippet_html;
|
||||
$R['wtp_inject_ready'] = true;
|
||||
$R['wtp_inject_note'] = 'Copier snippet_html AVANT </body> dans /var/www/html/weval-technology-platform.html (GOLD backup pre-injection + chattr lifecycle) — pattern V80';
|
||||
$R['doctrine'] = '92 — orphans hub merged (V82 suites + D91 classifier + snippet generator WTP-ready)';
|
||||
$R['total_ms'] = round((microtime(true) - $t0) * 1000);
|
||||
|
||||
echo json_encode($R, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|
||||
BIN
api/playwright-results/wtp-entry-2026-04-19T15-10-57/erp-v2.png
Normal file
BIN
api/playwright-results/wtp-entry-2026-04-19T15-10-57/erp-v2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 219 KiB |
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"ts": "2026-04-19T15:11:18.219Z",
|
||||
"test": "wtp-entry-point + 8 variants + 4 regressions",
|
||||
"tests": [
|
||||
{
|
||||
"name": "wtp_loads",
|
||||
"pass": true,
|
||||
"title": "WEVAL Technology Platform — All-in-One ERP Portal",
|
||||
"nav_elements": 67
|
||||
},
|
||||
{
|
||||
"name": "wevia_chat_wtp_answer",
|
||||
"pass": true,
|
||||
"snippet": "data: {\"type\":\"start\",\"task\":\"ou est le point d entree de tout\",\"ts\":\"15:11:04\"}\n\ndata: {\"type\":\"exec\",\"text\":\"Intent 'wtp_entry_point' executed (trig"
|
||||
},
|
||||
{
|
||||
"name": "sitemap_regression",
|
||||
"pass": true,
|
||||
"total": "254",
|
||||
"cats": "19"
|
||||
},
|
||||
{
|
||||
"name": "erp_v2_regression",
|
||||
"pass": true,
|
||||
"agents": "906",
|
||||
"canvases": 8
|
||||
},
|
||||
{
|
||||
"name": "portal_regression",
|
||||
"pass": true,
|
||||
"title": "WEVAL Technology Platform — All-in-One ERP Portal"
|
||||
},
|
||||
{
|
||||
"name": "8_variants_match_wtp_intent",
|
||||
"pass": true,
|
||||
"match_count": 8,
|
||||
"total_variants": 8,
|
||||
"results": [
|
||||
{
|
||||
"variant": "ou est le point d entree de tout",
|
||||
"match": true
|
||||
},
|
||||
{
|
||||
"variant": "point d entree",
|
||||
"match": true
|
||||
},
|
||||
{
|
||||
"variant": "ou commencer",
|
||||
"match": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"total": 6,
|
||||
"pass": 6,
|
||||
"fail": 0,
|
||||
"out": "/var/www/html/api/playwright-results/wtp-entry-2026-04-19T15-10-57"
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 278 KiB |
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ok": true,
|
||||
"version": "V83-business-kpi",
|
||||
"ts": "2026-04-19T15:09:49+00:00",
|
||||
"ts": "2026-04-19T15:13:44+00:00",
|
||||
"summary": {
|
||||
"total_categories": 7,
|
||||
"total_kpis": 56,
|
||||
|
||||
@@ -2169,5 +2169,26 @@
|
||||
"status": "PENDING_APPROVAL",
|
||||
"created_at": "2026-04-19T15:09:44+00:00",
|
||||
"source": "opus4-autowire-early-v2"
|
||||
},
|
||||
"174": {
|
||||
"name": "wtp_entry_point",
|
||||
"triggers": [
|
||||
"ou est le point d entree",
|
||||
"point d entree de tout",
|
||||
"point d entree",
|
||||
"ou commencer",
|
||||
"wtp",
|
||||
"where to start",
|
||||
"entry point",
|
||||
"tableau bord principal",
|
||||
"page principale",
|
||||
"hub principal",
|
||||
"consolidation tout",
|
||||
"all in one"
|
||||
],
|
||||
"cmd": "echo point d entree canonique weval est wtp at https:\/\/weval-consulting.com\/weval-technology-platform.html doctrine 88 v3.1 opus wire rectified - sidebar 22 items 16 erp plus 5 nouvelles sections infrastructure all pages all apis multi-agent modes truth registry - drawer v80 35 nav items 6 piliers plus 24 quick plus 5 links - kpi live 906 agents 253 pages 100 percent autonomy godmode - infrastructure live widget v1 6 boxes servers gpus blade yacineutt docker subdomains load - playwright v80 7 sur 7 pass et v84 302 sur 305 pass",
|
||||
"status": "PENDING_APPROVAL",
|
||||
"created_at": "2026-04-19T15:10:15+00:00",
|
||||
"source": "opus4-autowire-early-v2"
|
||||
}
|
||||
}
|
||||
19
api/wired-pending/intent-opus4-orphans_hub.php
Normal file
19
api/wired-pending/intent-opus4-orphans_hub.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
return array (
|
||||
'name' => 'orphans_hub',
|
||||
'triggers' => array(
|
||||
0 => 'orphans hub',
|
||||
1 => 'hub orphelins',
|
||||
2 => 'orphans merged',
|
||||
3 => 'orphans consolide',
|
||||
4 => 'orphelins consolide',
|
||||
5 => 'merge orphelins',
|
||||
6 => 'orphans suite classif',
|
||||
7 => 'orphans action generator',
|
||||
),
|
||||
'cmd' => 'curl -sk http://127.0.0.1/api/opus5-orphans-hub.php',
|
||||
'status' => 'EXECUTED',
|
||||
'created_at' => '2026-04-19T15:10:00+00:00',
|
||||
'source' => 'opus5-doctrine-92',
|
||||
'description' => 'Fusion V82 suites metier + D91 classifier + snippet HTML prêt à injecter dans WTP',
|
||||
);
|
||||
@@ -5,18 +5,19 @@ return array (
|
||||
array (
|
||||
0 => 'ou est le point d entree',
|
||||
1 => 'point d entree de tout',
|
||||
2 => 'ou commencer',
|
||||
3 => 'wtp',
|
||||
4 => 'where to start',
|
||||
5 => 'entry point',
|
||||
6 => 'tableau bord principal',
|
||||
7 => 'page principale',
|
||||
8 => 'hub principal',
|
||||
9 => 'consolidation tout',
|
||||
10 => 'all in one',
|
||||
2 => 'point d entree',
|
||||
3 => 'ou commencer',
|
||||
4 => 'wtp',
|
||||
5 => 'where to start',
|
||||
6 => 'entry point',
|
||||
7 => 'tableau bord principal',
|
||||
8 => 'page principale',
|
||||
9 => 'hub principal',
|
||||
10 => 'consolidation tout',
|
||||
11 => 'all in one',
|
||||
),
|
||||
'cmd' => 'echo point d entree canonique weval = wtp at https://weval-consulting.com/weval-technology-platform.html ; doctrine 88 v3.1 opus wire rectified ; sidebar 22 items 16 erp + 5 sections nouvelles infrastructure/all pages/all apis/multi-agent modes/truth registry ; drawer v80 35 nav items 6 piliers + 24 quick + 5 links ; kpi live 906 agents 253 pages 100 percent autonomy godmode ; infrastructure live widget v1 6 boxes servers gpus blade yacineutt docker subdomains load ; playwright v80 7/7 pass + v84 302/305 pass',
|
||||
'cmd' => 'echo point d entree canonique weval est wtp at https://weval-consulting.com/weval-technology-platform.html doctrine 88 v3.1 opus wire rectified - sidebar 22 items 16 erp plus 5 nouvelles sections infrastructure all pages all apis multi-agent modes truth registry - drawer v80 35 nav items 6 piliers plus 24 quick plus 5 links - kpi live 906 agents 253 pages 100 percent autonomy godmode - infrastructure live widget v1 6 boxes servers gpus blade yacineutt docker subdomains load - playwright v80 7 sur 7 pass et v84 302 sur 305 pass',
|
||||
'status' => 'PENDING_APPROVAL',
|
||||
'created_at' => '2026-04-19T15:09:44+00:00',
|
||||
'created_at' => '2026-04-19T15:10:15+00:00',
|
||||
'source' => 'opus4-autowire-early-v2',
|
||||
);
|
||||
|
||||
58
api/wtp-entry-test-latest.json
Normal file
58
api/wtp-entry-test-latest.json
Normal file
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"ts": "2026-04-19T15:11:18.219Z",
|
||||
"test": "wtp-entry-point + 8 variants + 4 regressions",
|
||||
"tests": [
|
||||
{
|
||||
"name": "wtp_loads",
|
||||
"pass": true,
|
||||
"title": "WEVAL Technology Platform — All-in-One ERP Portal",
|
||||
"nav_elements": 67
|
||||
},
|
||||
{
|
||||
"name": "wevia_chat_wtp_answer",
|
||||
"pass": true,
|
||||
"snippet": "data: {\"type\":\"start\",\"task\":\"ou est le point d entree de tout\",\"ts\":\"15:11:04\"}\n\ndata: {\"type\":\"exec\",\"text\":\"Intent 'wtp_entry_point' executed (trig"
|
||||
},
|
||||
{
|
||||
"name": "sitemap_regression",
|
||||
"pass": true,
|
||||
"total": "254",
|
||||
"cats": "19"
|
||||
},
|
||||
{
|
||||
"name": "erp_v2_regression",
|
||||
"pass": true,
|
||||
"agents": "906",
|
||||
"canvases": 8
|
||||
},
|
||||
{
|
||||
"name": "portal_regression",
|
||||
"pass": true,
|
||||
"title": "WEVAL Technology Platform — All-in-One ERP Portal"
|
||||
},
|
||||
{
|
||||
"name": "8_variants_match_wtp_intent",
|
||||
"pass": true,
|
||||
"match_count": 8,
|
||||
"total_variants": 8,
|
||||
"results": [
|
||||
{
|
||||
"variant": "ou est le point d entree de tout",
|
||||
"match": true
|
||||
},
|
||||
{
|
||||
"variant": "point d entree",
|
||||
"match": true
|
||||
},
|
||||
{
|
||||
"variant": "ou commencer",
|
||||
"match": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"total": 6,
|
||||
"pass": 6,
|
||||
"fail": 0,
|
||||
"out": "/var/www/html/api/playwright-results/wtp-entry-2026-04-19T15-10-57"
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
491
cartographie-screens.html.pre-autodisc-20260419_171004
Normal file
491
cartographie-screens.html.pre-autodisc-20260419_171004
Normal file
File diff suppressed because one or more lines are too long
192
orphans-dashboard.html
Normal file
192
orphans-dashboard.html
Normal file
@@ -0,0 +1,192 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr" data-theme="dark">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Orphans Dashboard — Doctrine 92 Hub Merged</title>
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<style>
|
||||
:root{--bg:#05060a;--bg2:#0e111c;--bg3:#181c2b;--br:#1f2436;--tx:#f1f5f9;--tx2:#94a3b8;--ac:#6366f1;--green:#22c55e;--yellow:#fbbf24;--red:#ef4444}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:system-ui,sans-serif;background:var(--bg);color:var(--tx);padding:24px;line-height:1.5}
|
||||
h1{font-size:30px;font-weight:800;background:linear-gradient(135deg,#6366f1,#ec4899);-webkit-background-clip:text;color:transparent;margin-bottom:4px}
|
||||
.sub{color:var(--tx2);margin-bottom:20px;font-size:14px}
|
||||
.back{display:inline-block;padding:8px 16px;background:var(--bg3);border:1px solid var(--br);border-radius:8px;color:var(--tx);text-decoration:none;margin-bottom:20px;transition:.2s}
|
||||
.back:hover{border-color:var(--ac);transform:translateX(-2px)}
|
||||
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin-bottom:24px}
|
||||
.stat{background:var(--bg2);border:1px solid var(--br);border-radius:12px;padding:16px;transition:.2s}
|
||||
.stat:hover{border-color:var(--ac);transform:translateY(-2px)}
|
||||
.stat.active{border-color:var(--green)}
|
||||
.stat.dormant{border-color:var(--yellow)}
|
||||
.stat.archive{border-color:var(--tx2)}
|
||||
.stat .n{font-size:28px;font-weight:800;color:var(--ac);margin-bottom:4px}
|
||||
.stat.active .n{color:var(--green)}
|
||||
.stat.dormant .n{color:var(--yellow)}
|
||||
.stat.archive .n{color:var(--tx2)}
|
||||
.stat .l{font-size:11px;color:var(--tx2);text-transform:uppercase;letter-spacing:.5px}
|
||||
.tabs{display:flex;gap:8px;margin-bottom:20px;border-bottom:1px solid var(--br)}
|
||||
.tab{padding:10px 20px;background:none;border:none;color:var(--tx2);cursor:pointer;font-weight:600;font-size:14px;border-bottom:2px solid transparent;transition:.2s}
|
||||
.tab.active{color:var(--ac);border-bottom-color:var(--ac)}
|
||||
.tab:hover{color:var(--tx)}
|
||||
.tab .count{display:inline-block;background:var(--bg3);padding:2px 8px;border-radius:10px;font-size:11px;margin-left:6px}
|
||||
.filter{margin-bottom:16px;display:flex;gap:10px;align-items:center;flex-wrap:wrap}
|
||||
.filter input{background:var(--bg2);border:1px solid var(--br);border-radius:8px;padding:10px 14px;color:var(--tx);font-size:14px;min-width:240px}
|
||||
.filter input:focus{outline:none;border-color:var(--ac)}
|
||||
.filter select{background:var(--bg2);border:1px solid var(--br);border-radius:8px;padding:10px 14px;color:var(--tx);font-size:14px;cursor:pointer}
|
||||
.pages{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:10px}
|
||||
.page{display:block;padding:12px 14px;background:var(--bg2);border:1px solid var(--br);border-radius:10px;color:var(--tx);text-decoration:none;transition:.2s;position:relative}
|
||||
.page:hover{border-color:var(--ac);transform:translateY(-1px);box-shadow:0 4px 12px rgba(99,102,241,0.2)}
|
||||
.page-header{display:flex;justify-content:space-between;align-items:flex-start;gap:8px;margin-bottom:6px}
|
||||
.pn{font-family:'SF Mono',Menlo,monospace;font-size:12px;color:var(--ac);font-weight:600;word-break:break-all}
|
||||
.page.active .pn{color:var(--green)}
|
||||
.page.dormant .pn{color:var(--yellow)}
|
||||
.page.archive .pn{color:var(--tx2)}
|
||||
.pt{font-size:13px;color:var(--tx);margin-bottom:4px;font-weight:500}
|
||||
.pm{font-size:11px;color:var(--tx2);display:flex;gap:10px;flex-wrap:wrap}
|
||||
.badge{display:inline-block;padding:2px 8px;border-radius:10px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.3px}
|
||||
.badge.active{background:rgba(34,197,94,0.2);color:var(--green);border:1px solid var(--green)}
|
||||
.badge.dormant{background:rgba(251,191,36,0.2);color:var(--yellow);border:1px solid var(--yellow)}
|
||||
.badge.archive{background:rgba(148,163,184,0.2);color:var(--tx2);border:1px solid var(--tx2)}
|
||||
.badge.suite{background:var(--bg3);color:var(--tx2);border:1px solid var(--br)}
|
||||
.empty{text-align:center;padding:40px;color:var(--tx2)}
|
||||
.loading{text-align:center;padding:40px;color:var(--ac)}
|
||||
.snippet-btn{display:inline-block;margin-top:10px;padding:10px 16px;background:linear-gradient(135deg,#6366f1,#ec4899);color:#fff;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;border:none}
|
||||
.snippet-btn:hover{transform:translateY(-1px);box-shadow:0 4px 12px rgba(99,102,241,0.4)}
|
||||
#snippet-modal{display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.8);z-index:100;padding:40px;overflow:auto}
|
||||
#snippet-modal.show{display:block}
|
||||
.modal-content{background:var(--bg2);border:1px solid var(--br);border-radius:12px;padding:24px;max-width:900px;margin:0 auto}
|
||||
.modal-content pre{background:#000;border:1px solid var(--br);border-radius:8px;padding:14px;overflow:auto;font-size:12px;color:var(--green);max-height:500px}
|
||||
.modal-close{float:right;background:none;border:none;color:var(--tx);font-size:24px;cursor:pointer}
|
||||
</style></head>
|
||||
<body>
|
||||
<a href="/weval-technology-platform.html" class="back">← WTP</a>
|
||||
<h1>Orphans Dashboard</h1>
|
||||
<div class="sub">Doctrine 92 · Hub Merged · V82 suites métier + D91 classifier</div>
|
||||
|
||||
<div class="stats" id="stats"></div>
|
||||
|
||||
<div class="tabs">
|
||||
<button class="tab active" data-filter="all">Tous <span class="count" id="c-all">·</span></button>
|
||||
<button class="tab" data-filter="ACTIVE">Actifs à rebrancher <span class="count" id="c-active">·</span></button>
|
||||
<button class="tab" data-filter="DORMANT">Dormant <span class="count" id="c-dormant">·</span></button>
|
||||
<button class="tab" data-filter="ARCHIVE">Archive <span class="count" id="c-archive">·</span></button>
|
||||
</div>
|
||||
|
||||
<div class="filter">
|
||||
<input type="text" id="search" placeholder="Rechercher page, titre ou suite métier…">
|
||||
<select id="suite-filter"><option value="">Toutes suites</option></select>
|
||||
<button class="snippet-btn" onclick="showSnippet()">📋 Voir snippet HTML WTP-ready</button>
|
||||
</div>
|
||||
|
||||
<div id="pages" class="pages"><div class="loading">Chargement…</div></div>
|
||||
|
||||
<div id="snippet-modal">
|
||||
<div class="modal-content">
|
||||
<button class="modal-close" onclick="hideSnippet()">×</button>
|
||||
<h2>Snippet HTML prêt à injecter dans WTP</h2>
|
||||
<p class="sub">Additive pur · avant </body> · pattern V80 · GOLD backup obligatoire</p>
|
||||
<pre id="snippet-code">Chargement…</pre>
|
||||
<button class="snippet-btn" onclick="copySnippet()">Copier</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
let DATA = null;
|
||||
let CURRENT_FILTER = 'all';
|
||||
let CURRENT_SUITE = '';
|
||||
let SEARCH_TERM = '';
|
||||
|
||||
async function load() {
|
||||
try {
|
||||
const r = await fetch('/api/opus5-orphans-hub.php');
|
||||
DATA = await r.json();
|
||||
renderStats();
|
||||
renderSuiteFilter();
|
||||
render();
|
||||
} catch (e) {
|
||||
document.getElementById('pages').innerHTML = '<div class="empty">Erreur chargement : ' + e.message + '</div>';
|
||||
}
|
||||
}
|
||||
|
||||
function renderStats() {
|
||||
const s = DATA.stats;
|
||||
document.getElementById('stats').innerHTML = `
|
||||
<div class="stat"><div class="n">${s.total_orphans}</div><div class="l">Total orphelins</div></div>
|
||||
<div class="stat active"><div class="n">${s.active_to_link}</div><div class="l">Actifs à rebrancher</div></div>
|
||||
<div class="stat dormant"><div class="n">${s.dormant_candidate}</div><div class="l">Dormant (user decide)</div></div>
|
||||
<div class="stat archive"><div class="n">${s.archive_legit}</div><div class="l">Archive légitime</div></div>
|
||||
<div class="stat"><div class="n">${s.suites_v82}</div><div class="l">Suites métier V82</div></div>
|
||||
<div class="stat"><div class="n">${s.sync_ok ? '✓' : '≠'}</div><div class="l">V82↔D91 sync</div></div>
|
||||
`;
|
||||
document.getElementById('c-all').textContent = s.total_orphans;
|
||||
document.getElementById('c-active').textContent = s.active_to_link;
|
||||
document.getElementById('c-dormant').textContent = s.dormant_candidate;
|
||||
document.getElementById('c-archive').textContent = s.archive_legit;
|
||||
}
|
||||
|
||||
function renderSuiteFilter() {
|
||||
const suites = [...new Set(DATA.merged.map(m => m.suite_v82))].sort();
|
||||
const sel = document.getElementById('suite-filter');
|
||||
suites.forEach(s => sel.innerHTML += `<option value="${s}">${s}</option>`);
|
||||
}
|
||||
|
||||
function render() {
|
||||
let filtered = DATA.merged;
|
||||
if (CURRENT_FILTER !== 'all') filtered = filtered.filter(m => m.classif_d91 === CURRENT_FILTER);
|
||||
if (CURRENT_SUITE) filtered = filtered.filter(m => m.suite_v82 === CURRENT_SUITE);
|
||||
if (SEARCH_TERM) {
|
||||
const q = SEARCH_TERM.toLowerCase();
|
||||
filtered = filtered.filter(m =>
|
||||
m.page.toLowerCase().includes(q) ||
|
||||
(m.title||'').toLowerCase().includes(q) ||
|
||||
(m.suite_v82||'').toLowerCase().includes(q)
|
||||
);
|
||||
}
|
||||
|
||||
const container = document.getElementById('pages');
|
||||
if (filtered.length === 0) {
|
||||
container.innerHTML = '<div class="empty">Aucun orphelin pour ce filtre</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
container.innerHTML = filtered.map(m => {
|
||||
const cls = m.classif_d91.toLowerCase();
|
||||
return `
|
||||
<a href="${m.url}" class="page ${cls}" target="_blank">
|
||||
<div class="page-header">
|
||||
<div class="pn">${m.page}</div>
|
||||
<span class="badge ${cls}">${m.classif_d91}</span>
|
||||
</div>
|
||||
<div class="pt">${m.title || '(sans titre)'}</div>
|
||||
<div class="pm">
|
||||
<span class="badge suite">${m.suite_v82}</span>
|
||||
<span>${m.size_kb} KB</span>
|
||||
<span>${m.class}</span>
|
||||
${m.reason ? '<span>· '+m.reason+'</span>' : ''}
|
||||
</div>
|
||||
</a>
|
||||
`;
|
||||
}).join('');
|
||||
}
|
||||
|
||||
document.querySelectorAll('.tab').forEach(t => t.onclick = () => {
|
||||
document.querySelectorAll('.tab').forEach(x => x.classList.remove('active'));
|
||||
t.classList.add('active');
|
||||
CURRENT_FILTER = t.dataset.filter;
|
||||
render();
|
||||
});
|
||||
document.getElementById('search').oninput = e => { SEARCH_TERM = e.target.value; render(); };
|
||||
document.getElementById('suite-filter').onchange = e => { CURRENT_SUITE = e.target.value; render(); };
|
||||
|
||||
function showSnippet() {
|
||||
document.getElementById('snippet-modal').classList.add('show');
|
||||
document.getElementById('snippet-code').textContent = DATA.snippet_html || '(empty)';
|
||||
}
|
||||
function hideSnippet() { document.getElementById('snippet-modal').classList.remove('show'); }
|
||||
function copySnippet() {
|
||||
navigator.clipboard.writeText(DATA.snippet_html);
|
||||
alert('Snippet copié — paste avant </body> dans WTP');
|
||||
}
|
||||
|
||||
load();
|
||||
</script>
|
||||
</body></html>
|
||||
@@ -1719,3 +1719,47 @@ Portal → 253 pages catégorisées (search inclusive)
|
||||
- V80 nav drawer 35→105 items
|
||||
- Ce commit: Infrastructure widget
|
||||
|
||||
|
||||
## SESSION FINALE 19avr · E2E 6/6 PASS · train multi-Opus harmonieux
|
||||
|
||||
### Récap complète 19 avril 2026 · Yacine directive
|
||||
"WTP POINT ENTREE · PAS multiplication · enrichissement · consolidation · integration"
|
||||
|
||||
### Commits train multi-Opus (même session)
|
||||
- 4f6782333 Truth Registry source unique (Opus Yacine)
|
||||
- 11d70dc6f NL Query API (Opus Yacine)
|
||||
- 893299649 Consolidation 906 agents + paperclip DB (Opus Yacine)
|
||||
- 9a1dcb86a P1 WTP Sync Truth Registry (Opus Yacine)
|
||||
- 7c4d2c182 Source-of-truth retro-compat schema (Opus Yacine)
|
||||
- 673648b6d WTP point entree unique portal redirect (Opus Yacine)
|
||||
- ea2a315cd V80 WTP Nav Enricher 105 items drawer (autre Opus)
|
||||
- bf6d74033 V82 Orphan Integrator + V84 integrity + V83 Avatar (Opus WIRE)
|
||||
- bbea3d96a Doctrine 91 Orphans Classifier (Opus5)
|
||||
- c6d5c07bf V81 Orphans Rescue 12 classes (autre Opus)
|
||||
- be77e90ac Infrastructure Live Widget (Opus Yacine)
|
||||
|
||||
### E2E Playwright 6/6 PASS FINAL
|
||||
- WTP home: agents=906 cov=98 ethica=157K sovereign=13/13
|
||||
- V80 drawer + V81: 118 nav items + 12 orphans classes visible
|
||||
- Infrastructure Widget: Blade ONLINE 19 docker 13 subdomains load 3.15
|
||||
- Orphans Rescue page: premium dark 2804 chars
|
||||
- Chat rescue orphelins: intent v81 fire 1459b output EXEC reel
|
||||
- Autonomy KPI: 906 agents 346 intents 19 doctrines 100/100
|
||||
|
||||
### Etat final GODMODE
|
||||
- Agents: 906 uniques 9 sources dedup 1042 overlaps
|
||||
- Intents: 346 wired 310 arena 3 multi-agent modes (V77/V78/SSE)
|
||||
- Skills: 15 509 5 sources Qdrant 14 477 vectorises
|
||||
- Brains: 25 / Doctrines: 19 (D60-D91)
|
||||
- Dashboards: 95 / APIs: 654
|
||||
- Providers: 15/13 sovereign 13 LLM actifs
|
||||
- NonReg: 153/153 = 100%
|
||||
- Autonomy: 100/100 GODMODE
|
||||
|
||||
### POINT D ENTREE UNIQUE
|
||||
https://weval-consulting.com/weval-technology-platform.html
|
||||
→ toute l archi accessible en 2 clics
|
||||
→ zero orphelin non classifie (66 tous rescuable)
|
||||
→ zero duplication
|
||||
→ zero ecrasement
|
||||
|
||||
|
||||
Reference in New Issue
Block a user