diff --git a/api/agent-avatars-v75.php b/api/agent-avatars-v75.php index bddda64ce..6d08c90ea 100644 --- a/api/agent-avatars-v75.php +++ b/api/agent-avatars-v75.php @@ -39,9 +39,9 @@ foreach ($data as $name => $rec) { $emoji = isset($rec['emoji']) ? (string)$rec['emoji'] : ''; $url = isset($rec['url']) ? (string)$rec['url'] : ''; - // v75 shape : emoji + svg (dynamic endpoint) + url (fallback) - // Priority: if emoji set → SVG endpoint uses it - // else if url set (dicebear or custom SVG) → use url + // v75 shape : emoji + svg (dynamic endpoint) + url + // DOCTRINE: emoji custom prend priorite sur url heritage + // (Wave-277: si user set emoji explicite, il override url Dicebear) $svg = ''; if ($emoji !== '') { $svg = $SVG_EP . '?n=' . rawurlencode($name) . '&e=' . rawurlencode($emoji); @@ -51,10 +51,13 @@ foreach ($data as $name => $rec) { $svg = $SVG_EP . '?n=' . rawurlencode($name) . '&e=' . rawurlencode('👤'); } + // url field: emoji SVG override pour que legacy consumers (img src=url) voient le nouveau + $final_url = ($emoji !== '') ? $svg : ($url !== '' ? $url : $svg); + $out[$name] = [ 'emoji' => $emoji, 'svg' => $svg, - 'url' => $url !== '' ? $url : $svg + 'url' => $final_url ]; } diff --git a/api/agent-avatars.php b/api/agent-avatars.php index 266ae4ff1..09318c4fa 100644 --- a/api/agent-avatars.php +++ b/api/agent-avatars.php @@ -63,13 +63,14 @@ if ($format === '2' || $format === 'v2' || $format === 'full') { $out = []; foreach ($v2 as $name => $a) { if (!is_array($a)) continue; - if (!empty($a['url'])) { - $out[$name] = $a['url']; - } elseif (!empty($a['emoji'])) { - // Legacy shape needs a URL; wrap emoji in SVG endpoint + // DOCTRINE 14 fix (Wave-277): emoji custom > url heritage + // Si user a set emoji explicite, il override le url Dicebear par defaut + if (!empty($a['emoji'])) { $enc = urlencode($a['emoji']); $safeN = urlencode($name); $out[$name] = "/api/agent-avatar-svg.php?n=$safeN&e=$enc"; + } elseif (!empty($a['url'])) { + $out[$name] = $a['url']; } else { $out[$name] = ""; } diff --git a/proofs/avatar-propagation-e2e/agents-archi-wave277.png b/proofs/avatar-propagation-e2e/agents-archi-wave277.png new file mode 100644 index 000000000..26e3996ad Binary files /dev/null and b/proofs/avatar-propagation-e2e/agents-archi-wave277.png differ diff --git a/proofs/avatar-propagation-e2e/enterprise-model-wave277.png b/proofs/avatar-propagation-e2e/enterprise-model-wave277.png new file mode 100644 index 000000000..2bee194e7 Binary files /dev/null and b/proofs/avatar-propagation-e2e/enterprise-model-wave277.png differ diff --git a/proofs/avatar-propagation-e2e/meeting-rooms-wave277.png b/proofs/avatar-propagation-e2e/meeting-rooms-wave277.png new file mode 100644 index 000000000..ad480f156 Binary files /dev/null and b/proofs/avatar-propagation-e2e/meeting-rooms-wave277.png differ diff --git a/proofs/avatar-propagation-e2e/run-wave277.log b/proofs/avatar-propagation-e2e/run-wave277.log new file mode 100644 index 000000000..866defb0c --- /dev/null +++ b/proofs/avatar-propagation-e2e/run-wave277.log @@ -0,0 +1,32 @@ +=== WAVE-277 FINAL E2E TEST === +timestamp: 2026-04-23T19:31:45.668Z +agent: Analyst 2 | target emoji: 🎯 +login: 302 + +BEFORE: emoji="🎯" url=https://api.dicebear.com/9.x/adventurer/svg?seed=Analyst2 +UPDATE: ok=true + +=== 3 SSOT SOURCES (priority fix applied) === + /api/agent-avatars-v2.json : FAIL emoji="🎯" url=https://api.dicebear.com/9.x/adventurer/svg?seed=Analyst2 + /api/agent-avatars.php : OK → /api/agent-avatar-svg.php?n=Analyst+2&e=%F0%9F%8E%AF + /api/agent-avatars-v75.php : OK emoji="🎯" url=/api/agent-avatar-svg.php?n=Analyst%202&e=%F0%9F%8E%AF + +=== 3 PAGES RENDER CHECK === + +--- enterprise-model --- + body: 213547 chars | imgs: 0 | matching: 0 | with NEW emoji: 0 | data-agent: 0 + screenshot: proofs/avatar-propagation-e2e/enterprise-model-wave277.png + +--- agents-archi --- + body: 171334 chars | imgs: 1 | matching: 0 | with NEW emoji: 0 | data-agent: 0 + screenshot: proofs/avatar-propagation-e2e/agents-archi-wave277.png + +--- meeting-rooms --- + body: 57657 chars | imgs: 0 | matching: 0 | with NEW emoji: 0 | data-agent: 0 + screenshot: proofs/avatar-propagation-e2e/meeting-rooms-wave277.png + +=== ROLLBACK === + rollback OK → emoji="🎯" +video: proofs/avatar-propagation-e2e/wave-277-final.webm + +DONE diff --git a/proofs/avatar-propagation-e2e/summary-wave277.json b/proofs/avatar-propagation-e2e/summary-wave277.json new file mode 100644 index 000000000..921135c10 --- /dev/null +++ b/proofs/avatar-propagation-e2e/summary-wave277.json @@ -0,0 +1,40 @@ +{ + "timestamp": "2026-04-23T19:33:27.741Z", + "agent": "Analyst 2", + "new_emoji": "🎯", + "results": { + "enterprise-model": { + "http": 200, + "final_url": "https://weval-consulting.com/enterprise-model.html", + "url": "https://weval-consulting.com/enterprise-model.html", + "total_imgs": 0, + "matched_imgs": 0, + "with_new_emoji": 0, + "sample_srcs": [], + "data_agent_els": 0, + "body_size": 213547 + }, + "agents-archi": { + "http": 200, + "final_url": "https://weval-consulting.com/agents-archi.html", + "url": "https://weval-consulting.com/agents-archi.html", + "total_imgs": 1, + "matched_imgs": 0, + "with_new_emoji": 0, + "sample_srcs": [], + "data_agent_els": 0, + "body_size": 171334 + }, + "meeting-rooms": { + "http": 200, + "final_url": "https://weval-consulting.com/wevia-meeting-rooms.html", + "url": "https://weval-consulting.com/wevia-meeting-rooms.html", + "total_imgs": 0, + "matched_imgs": 0, + "with_new_emoji": 0, + "sample_srcs": [], + "data_agent_els": 0, + "body_size": 57657 + } + } +} \ No newline at end of file diff --git a/proofs/avatar-propagation-e2e/wave-277-final.webm b/proofs/avatar-propagation-e2e/wave-277-final.webm new file mode 100644 index 000000000..a9104d32c Binary files /dev/null and b/proofs/avatar-propagation-e2e/wave-277-final.webm differ