openvibers/openvibe.host Commits
browser-check --network-down (ADR-024, roadmap WS-E task 1): every site's home loads with openvibe.network unreachable (Shared 1.21.0 checkUnreachable) at 390 and 1280 px and must still paint: 200, settled, 120+ characters, a --accent theme token and a background. First run 20/22 (Media had no theme tokens, fixed in Media 2be314b and the index page; Billing's short sign-in page was under the old 200-character bar); recorded run 22/22. Plus two 23/23 full browser checks after today's deploys
Changes
@@@ -879,3 +879,471 @@ Known errors, counted and not failed (`--strict-errors` fails them):- idle 5s after settle: CPU 0.1% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 6 KB (`https://openvibe.wiki/shared/release-watch.js`, `https://openvibe.wiki/release.json`, `https://events.openvibe.network/realtime/stream`)</details>++++### Run 2026-09-26T10:30:41.088Z (local; Chrome/150.0.7843.0)++++23/23 sites pass. Widths 390, 768, 1280; axe axe-core 4.13.0, WCAG 2.1 A/AA; navigation 5 laps. Cells: ✓ all pass, **n✗** routes failing, n! warnings, - not run.++++| Site | Routes | Status | Errors | Overflow | Scripts | No-JS | Canonical | JSON-LD | axe | Nav | axe serious/critical (moderate) | Growth lap 2→last | Idle 5 s: CPU · requests · infinite animations |++|---|---|---|---|---|---|---|---|---|---|---|---|---|---|++| ai.openvibe.network | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -1 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |++| billing.openvibe.network | 1 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | -1 KB · 0 nodes · 0 lst | 0% · 0 req |++| openvibe.blog | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +5 KB · 0 nodes · 0 lst | 0.1% · 4 req |++| openvibe.chat | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | +4 KB · 0 nodes · 0 lst | 0.3% · 4 req |++| openvibe.codes | 7 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | +2 KB · 0 nodes · 0 lst | 0.1% · 4 req |++| openvibe.community | 6 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.2% · 4 req |++| openvibe.coupons | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +1 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |++| openvibe.deals | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -6 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |++| openvibe.games | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +26 KB · 0 nodes · +2 lst | 15.4% · 3 req · 1 anim |++| openvibe.host | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.3% · 3 req · 3 anim |++| openvibe.live | 8 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -77 KB · 0 nodes · 0 lst | 24.8% · 17 req · 33 anim |++| openvibe.media | 3 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | -1 KB · 0 nodes · -2 lst | 0.1% · 4 req |++| openvibe.network | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +1 KB · 0 nodes · 0 lst | 30.3% · 4 req · 19 anim |++| openvibe.news | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -7 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |++| openre.stream | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +2 KB · 0 nodes · 0 lst | 0.3% · 3 req · 3 anim |++| openvibe.reviews | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +1 KB · 0 nodes · 0 lst | 0.3% · 3 req · 3 anim |++| search.openvibe.network | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.4% · 4 req |++| sources.openvibe.network | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0% · 0 req |++| openvibe.tips | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -1 KB · 0 nodes · 0 lst | 0.5% · 3 req · 3 anim |++| openvibe.tools | 8 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -3 KB · 0 nodes · -2 lst | 0.1% · 4 req |++| openvibe.trade | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +1 KB · 0 nodes · 0 lst | 0.3% · 3 req · 3 anim |++| openvibe.vip | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.4% · 3 req · 3 anim |++| openvibe.wiki | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -6 KB · 0 nodes · -2 lst | 0.2% · 4 req |++++Known errors, counted and not failed (`--strict-errors` fails them):++- Cloudflare Web Analytics beacon, injected at the edge, blocked by the site CSP: 17× on openvibe.media, sources.openvibe.network++++<details><summary>Details: routes and findings per site</summary>++++**https://ai.openvibe.network**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap -1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://ai.openvibe.network/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://billing.openvibe.network**: pass (1 route(s), Chrome/150.0.7843.0)++- `/policy`: pass++- navigation `/policy` ↔ `/policy` ×5 (load): pass; growth lap 2→5: heap -1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0% (script 0 ms, style 0 ms, layout 0 ms), 0 request(s), 0 KB++++**https://openvibe.blog**: pass (4 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/updates`: pass++- `/@openvibe/patch-notes-chat-parity-script`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/updates` ×5 (link): pass; growth lap 2→5: heap +5 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.1% (script 2 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.blog/shared/release-watch.js`, `https://openvibe.blog/release.json`, `https://openvibe.blog/release-metrics`, `https://events.openvibe.network/realtime/stream`)++++**https://openvibe.chat**: pass (4 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/rooms`: pass++- `/updates`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/rooms` ×5 (link): pass; growth lap 2→5: heap +4 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts -1, sockets 0++ - idle 5s after settle: CPU 0.3% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.chat/shared/release-watch.js`, `https://openvibe.chat/release.json`, `https://openvibe.chat/release-metrics`, `https://events.openvibe.network/realtime/stream`)++++**https://openvibe.codes**: pass (7 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/tools/webhooks`: pass++- `/manifests/validate`: pass++- `/docs`: pass++- `/oauth`: pass++- `/policy`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/tools/webhooks` ×5 (link): pass; growth lap 2→5: heap +2 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.1% (script 2 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.codes/shared/release-watch.js`, `https://openvibe.codes/release.json`, `https://openvibe.codes/release-metrics`, `https://events.openvibe.network/realtime/stream`)++++**https://openvibe.community**: pass (6 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/pastes`: pass++- `/pulse`: pass++- `/p/rogue-frame-5292`: pass++- `/s`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/pastes` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts -1, sockets 0++ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.community/shared/release-watch.js`, `https://openvibe.community/release.json`, `https://openvibe.community/release-metrics`, `https://events.openvibe.network/realtime/stream`)++++**https://openvibe.coupons**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.coupons/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://openvibe.deals**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap -6 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.deals/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://openvibe.games**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +26 KB, nodes 0, listeners +2, documents 0, intervals 0, timeouts -1, sockets 0++ - idle 5s after settle: CPU 15.4% (script 5 ms, style 42 ms, layout 0 ms), 3 request(s), 0.3 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.games/release.json`, `https://events.openvibe.network/realtime/stream`); 1 running animation(s), 1 infinite: `pulse on a.play-cta`++++**https://openvibe.host**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.3% (script 6 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.host/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://openvibe.live**: pass (8 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/content`: pass++- `/chat`: pass++- `/search?q=minecraft`: pass++- `/vod/5627`: pass++- `/clip/369`: pass++- `/@JapaneseOldGuy`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/content` ×5 (in-page+link): pass; growth lap 2→5: heap -77 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 24.8% (script 55 ms, style 182 ms, layout 22 ms), 17 request(s), 158.8 KB; 36 running animation(s), 33 infinite: `opacity on div.hero-float-inner`, `transform on div.hero-float-inner`, `heroBgKenBurns on div.hero-bg-layer`, `heroFloat3d on a.hero-float`++++**https://openvibe.media**: pass (3 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/updates`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/updates` ×5 (link): pass; growth lap 2→5: heap -1 KB, nodes 0, listeners -2, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.1% (script 2 ms, style 0 ms, layout 0 ms), 4 request(s), 6.4 KB (`https://openvibe.media/shared/release-watch.js`, `https://openvibe.media/release.json`, `https://openvibe.media/release-metrics`, `https://events.openvibe.network/realtime/stream`)++++**https://openvibe.network**: pass (4 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/updates`: pass++- `/login`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/updates` ×5 (link): pass; growth lap 2→5: heap +1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 30.3% (script 3 ms, style 123 ms, layout 164 ms), 4 request(s), 6.4 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.network/release.json`, `https://openvibe.network/release-metrics`, `https://events.openvibe.network/realtime/stream`); 19 running animation(s), 19 infinite: `orb-drift on div.orb`, `ovmFloat on svg`, `ovmGlow on circle`, `ovmComet on circle`++++**https://openvibe.news**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap -7 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.2% (script 4 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.news/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://openre.stream**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +2 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.3% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.3 KB (`https://openvibe.network/shared/release-watch.js`, `https://openre.stream/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://openvibe.reviews**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.3% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.reviews/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://search.openvibe.network**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass (application/problem+json: only the status is checked)++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.4% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.7 KB (`https://search.openvibe.network/shared/release-watch.js`, `https://search.openvibe.network/release.json`, `https://search.openvibe.network/release-metrics`, `https://events.openvibe.network/realtime/stream`)++ - error during navigation: network: Failed to load resource: the server responded with a status of 404 ()++++**https://sources.openvibe.network**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass (application/problem+json: only the status is checked)++- navigation `/` ↔ `/` ×5 (load): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0% (script 0 ms, style 0 ms, layout 0 ms), 0 request(s), 0 KB++++**https://openvibe.tips**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap -1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.5% (script 7 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.tips/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://openvibe.tools**: pass (8 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/developers`: pass++- `/updates`: pass++- `/tool/yaml`: pass++- `/all-tools`: pass++- `/network-tools`: pass++- `/developer-tools`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/developers` ×5 (link): pass; growth lap 2→5: heap -3 KB, nodes 0, listeners -2, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.1% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.4 KB (`https://openvibe.tools/shared/release-watch.js`, `https://openvibe.tools/release.json`, `https://openvibe.tools/release-metrics`, `https://events.openvibe.network/realtime/stream`)++++**https://openvibe.trade**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.3% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.trade/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://openvibe.vip**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.4% (script 7 ms, style 0 ms, layout 0 ms), 3 request(s), 6.4 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.vip/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://openvibe.wiki**: pass (4 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/updates`: pass++- `/s/openvibe`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/updates` ×5 (link): pass; growth lap 2→5: heap -6 KB, nodes 0, listeners -2, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.2% (script 7 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.wiki/shared/release-watch.js`, `https://openvibe.wiki/release.json`, `https://openvibe.wiki/release-metrics`, `https://events.openvibe.network/realtime/stream`)++++</details>++++### Run 2026-09-26T10:46:24.226Z (local; Chrome/150.0.7843.0)++++23/23 sites pass. Widths 390, 768, 1280; axe axe-core 4.13.0, WCAG 2.1 A/AA; navigation 5 laps. Cells: ✓ all pass, **n✗** routes failing, n! warnings, - not run.++++| Site | Routes | Status | Errors | Overflow | Scripts | No-JS | Canonical | JSON-LD | axe | Nav | axe serious/critical (moderate) | Growth lap 2→last | Idle 5 s: CPU · requests · infinite animations |++|---|---|---|---|---|---|---|---|---|---|---|---|---|---|++| ai.openvibe.network | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +3 KB · 0 nodes · +2 lst | 0.3% · 3 req · 3 anim |++| billing.openvibe.network | 1 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | -1 KB · 0 nodes · 0 lst | 0% · 0 req |++| openvibe.blog | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +2 KB · 0 nodes · 0 lst | 0.2% · 4 req |++| openvibe.chat | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | +1 KB · 0 nodes · 0 lst | 0.1% · 4 req |++| openvibe.codes | 7 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.1% · 4 req |++| openvibe.community | 6 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.2% · 4 req |++| openvibe.coupons | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -16 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |++| openvibe.deals | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |++| openvibe.games | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -1 KB · 0 nodes · 0 lst | 12.9% · 3 req · 1 anim |++| openvibe.host | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +2 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |++| openvibe.live | 8 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +34 KB · +10 nodes · +1 lst | 22% · 17 req · 33 anim |++| openvibe.media | 3 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | +3 KB · 0 nodes · 0 lst | 0.3% · 4 req |++| openvibe.network | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -3 KB · 0 nodes · +1 lst | 28.4% · 4 req · 19 anim |++| openvibe.news | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +1 KB · 0 nodes · 0 lst | 0.6% · 3 req · 3 anim |++| openre.stream | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +3 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |++| openvibe.reviews | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -2 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |++| search.openvibe.network | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.3% · 4 req |++| sources.openvibe.network | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0% · 0 req |++| openvibe.tips | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +2 KB · 0 nodes · 0 lst | 0.3% · 3 req · 3 anim |++| openvibe.tools | 8 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +2 KB · 0 nodes · -2 lst | 0.2% · 4 req |++| openvibe.trade | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |++| openvibe.vip | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +2 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |++| openvibe.wiki | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.1% · 4 req |++++Known errors, counted and not failed (`--strict-errors` fails them):++- Cloudflare Web Analytics beacon, injected at the edge, blocked by the site CSP: 17× on openvibe.media, sources.openvibe.network++++<details><summary>Details: routes and findings per site</summary>++++**https://ai.openvibe.network**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +3 KB, nodes 0, listeners +2, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.3% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://ai.openvibe.network/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://billing.openvibe.network**: pass (1 route(s), Chrome/150.0.7843.0)++- `/policy`: pass++- navigation `/policy` ↔ `/policy` ×5 (load): pass; growth lap 2→5: heap -1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0% (script 0 ms, style 0 ms, layout 0 ms), 0 request(s), 0 KB++++**https://openvibe.blog**: pass (4 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/updates`: pass++- `/@openvibe/patch-notes-chat-parity-script`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/updates` ×5 (link): pass; growth lap 2→5: heap +2 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts -1, sockets 0++ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.blog/shared/release-watch.js`, `https://openvibe.blog/release.json`, `https://openvibe.blog/release-metrics`, `https://events.openvibe.network/realtime/stream`)++++**https://openvibe.chat**: pass (4 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/rooms`: pass++- `/updates`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/rooms` ×5 (link): pass; growth lap 2→5: heap +1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts -1, sockets 0++ - idle 5s after settle: CPU 0.1% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.chat/shared/release-watch.js`, `https://openvibe.chat/release.json`, `https://openvibe.chat/release-metrics`, `https://events.openvibe.network/realtime/stream`)++++**https://openvibe.codes**: pass (7 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/tools/webhooks`: pass++- `/manifests/validate`: pass++- `/docs`: pass++- `/oauth`: pass++- `/policy`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/tools/webhooks` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.1% (script 2 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.codes/shared/release-watch.js`, `https://openvibe.codes/release.json`, `https://openvibe.codes/release-metrics`, `https://events.openvibe.network/realtime/stream`)++++**https://openvibe.community**: pass (6 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/pastes`: pass++- `/pulse`: pass++- `/p/rogue-frame-5292`: pass++- `/s`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/pastes` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts -1, sockets 0++ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.community/shared/release-watch.js`, `https://openvibe.community/release.json`, `https://openvibe.community/release-metrics`, `https://events.openvibe.network/realtime/stream`)++++**https://openvibe.coupons**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap -16 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.coupons/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://openvibe.deals**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.2% (script 2 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.deals/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://openvibe.games**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap -1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 12.9% (script 3 ms, style 35 ms, layout 0 ms), 3 request(s), 0.3 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.games/release.json`, `https://events.openvibe.network/realtime/stream`); 1 running animation(s), 1 infinite: `pulse on a.play-cta`++++**https://openvibe.host**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +2 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.host/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://openvibe.live**: pass (8 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/content`: pass++- `/chat`: pass++- `/search?q=minecraft`: pass++- `/vod/5627`: pass++- `/clip/369`: pass++- `/@JapaneseOldGuy`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/content` ×5 (in-page+link): pass; growth lap 2→5: heap +34 KB, nodes +10, listeners +1, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 22% (script 46 ms, style 182 ms, layout 20 ms), 17 request(s), 158.8 KB; 36 running animation(s), 33 infinite: `opacity on div.hero-float-inner`, `transform on div.hero-float-inner`, `heroBgKenBurns on div.hero-bg-layer`, `heroFloat3d on a.hero-float`++++**https://openvibe.media**: pass (3 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/updates`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/updates` ×5 (link): pass; growth lap 2→5: heap +3 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.3% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.4 KB (`https://openvibe.media/shared/release-watch.js`, `https://openvibe.media/release.json`, `https://openvibe.media/release-metrics`, `https://events.openvibe.network/realtime/stream`)++++**https://openvibe.network**: pass (4 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/updates`: pass++- `/login`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/updates` ×5 (link): pass; growth lap 2→5: heap -3 KB, nodes 0, listeners +1, documents 0, intervals -1, timeouts 0, sockets 0++ - idle 5s after settle: CPU 28.4% (script 3 ms, style 130 ms, layout 155 ms), 4 request(s), 6.4 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.network/release.json`, `https://openvibe.network/release-metrics`, `https://events.openvibe.network/realtime/stream`); 19 running animation(s), 19 infinite: `orb-drift on div.orb`, `ovmFloat on svg`, `ovmGlow on circle`, `ovmComet on circle`++++**https://openvibe.news**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.6% (script 7 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.news/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://openre.stream**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +3 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openre.stream/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://openvibe.reviews**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap -2 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.reviews/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://search.openvibe.network**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass (application/problem+json: only the status is checked)++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts -2, sockets 0++ - idle 5s after settle: CPU 0.3% (script 5 ms, style 0 ms, layout 0 ms), 4 request(s), 6.6 KB (`https://search.openvibe.network/shared/release-watch.js`, `https://search.openvibe.network/release.json`, `https://search.openvibe.network/release-metrics`, `https://events.openvibe.network/realtime/stream`)++ - error during navigation: network: Failed to load resource: the server responded with a status of 404 ()++++**https://sources.openvibe.network**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass (application/problem+json: only the status is checked)++- navigation `/` ↔ `/` ×5 (load): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0% (script 0 ms, style 0 ms, layout 0 ms), 0 request(s), 0 KB++++**https://openvibe.tips**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +2 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.3% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.tips/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://openvibe.tools**: pass (8 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/developers`: pass++- `/updates`: pass++- `/tool/yaml`: pass++- `/all-tools`: pass++- `/network-tools`: pass++- `/developer-tools`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/developers` ×5 (link): pass; growth lap 2→5: heap +2 KB, nodes 0, listeners -2, documents 0, intervals 0, timeouts -1, sockets 0++ - idle 5s after settle: CPU 0.2% (script 2 ms, style 0 ms, layout 0 ms), 4 request(s), 6.4 KB (`https://openvibe.tools/shared/release-watch.js`, `https://openvibe.tools/release.json`, `https://openvibe.tools/release-metrics`, `https://events.openvibe.network/realtime/stream`)++++**https://openvibe.trade**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.2% (script 2 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.trade/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://openvibe.vip**: pass (2 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +2 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.vip/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`++++**https://openvibe.wiki**: pass (4 route(s), Chrome/150.0.7843.0)++- `/`: pass++- `/updates`: pass++- `/s/openvibe`: pass++- `/__ovcheck-404`: pass++- navigation `/` ↔ `/updates` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0++ - idle 5s after settle: CPU 0.1% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.wiki/shared/release-watch.js`, `https://openvibe.wiki/release.json`, `https://openvibe.wiki/release-metrics`, `https://events.openvibe.network/realtime/stream`)++++</details>++++### Network-down run 2026-09-26T11:03:32.079Z (ADR-024)++++20/22 sites paint with openvibe.network unreachable (every request to it fails). Checked at 390 and 1280 px: status 200, settled, at least 200 characters of text, a `--accent` theme token and a background.++++| Site | 390 | 1280 | --accent | Note |++|---|---|---|---|---|++| ai.openvibe.network | ✓ | ✓ | #3b82f6 | |++| billing.openvibe.network | **✗** 200 188 chars | ✓ | #7aa7ff | |++| openvibe.blog | ✓ | ✓ | #3b82f6 | |++| openvibe.chat | ✓ | ✓ | #3b82f6 | |++| openvibe.codes | ✓ | ✓ | #3b82f6 | |++| openvibe.community | ✓ | ✓ | #3b82f6 | |++| openvibe.coupons | ✓ | ✓ | #3b82f6 | |++| openvibe.deals | ✓ | ✓ | #3b82f6 | |++| openvibe.games | ✓ | ✓ | #3b82f6 | |++| openvibe.host | ✓ | ✓ | #3b82f6 | |++| openvibe.live | ✓ | ✓ | #3b82f6 | |++| openvibe.media | **✗** 200 no theme | **✗** 200 no theme | — | |++| openvibe.news | ✓ | ✓ | #3b82f6 | |++| openre.stream | ✓ | ✓ | #3b82f6 | |++| openvibe.reviews | ✓ | ✓ | #3b82f6 | |++| search.openvibe.network | ✓ | ✓ | #3b82f6 | |++| sources.openvibe.network | ✓ | ✓ | #7aa2ff | |++| openvibe.tips | ✓ | ✓ | #3b82f6 | |++| openvibe.tools | ✓ | ✓ | #3b82f6 | |++| openvibe.trade | ✓ | ✓ | #3b82f6 | |++| openvibe.vip | ✓ | ✓ | #3b82f6 | |++| openvibe.wiki | ✓ | ✓ | #3b82f6 | |++++### Network-down run 2026-09-26T11:09:21.983Z (ADR-024)++++22/22 sites paint with openvibe.network unreachable (every request to it fails). Checked at 390 and 1280 px: status 200, settled, at least 120 characters of text, a `--accent` theme token and a background.++++| Site | 390 | 1280 | --accent | Note |++|---|---|---|---|---|++| ai.openvibe.network | ✓ | ✓ | #3b82f6 | |++| billing.openvibe.network | ✓ | ✓ | #7aa7ff | |++| openvibe.blog | ✓ | ✓ | #3b82f6 | |++| openvibe.chat | ✓ | ✓ | #3b82f6 | |++| openvibe.codes | ✓ | ✓ | #3b82f6 | |++| openvibe.community | ✓ | ✓ | #3b82f6 | |++| openvibe.coupons | ✓ | ✓ | #3b82f6 | |++| openvibe.deals | ✓ | ✓ | #3b82f6 | |++| openvibe.games | ✓ | ✓ | #3b82f6 | |++| openvibe.host | ✓ | ✓ | #3b82f6 | |++| openvibe.live | ✓ | ✓ | #3b82f6 | |++| openvibe.media | ✓ | ✓ | #3b82f6 | |++| openvibe.news | ✓ | ✓ | #3b82f6 | |++| openre.stream | ✓ | ✓ | #3b82f6 | |++| openvibe.reviews | ✓ | ✓ | #3b82f6 | |++| search.openvibe.network | ✓ | ✓ | #3b82f6 | |++| sources.openvibe.network | ✓ | ✓ | #7aa2ff | |++| openvibe.tips | ✓ | ✓ | #3b82f6 | |++| openvibe.tools | ✓ | ✓ | #3b82f6 | |++| openvibe.trade | ✓ | ✓ | #3b82f6 | |++| openvibe.vip | ✓ | ✓ | #3b82f6 | |++| openvibe.wiki | ✓ | ✓ | #3b82f6 | |@@@ -26,6 +26,12 @@* the report is written here. The remote needs Node 22+ and Chrome (CHROME_BIN or /usr/bin/google-chrome),* and reaches the sites itself. OVHOST_SSH overrides the ssh command (e.g. "ssh -p 2222").*++ * --network-down (ADR-024, WS-E task 1): instead, each site's home page loads with openvibe.network unreachable++ * (the harness's checkUnreachable: every request to it fails), at 390 and 1280 px, and must still paint: status++ * 200, settled, 120+ characters of text (a blank page has none; a short sign-in page has ~190), a --accent++ * theme token and a background. openvibe.network itself is left out. Needs++ * a harness with checkUnreachable (Shared 1.21.0 and later, or --harness a checkout).++ ** The harness comes from --harness, else openvibe-shared/browser-harness (Shared 1.16.0 and later), else a* sibling OpenVibe.Shared checkout. Needs Chrome and Node 22. (--routes-json '<json>' is --routes-file inline;* --remote uses it to carry the routes file.)@@@ -227,8 +233,39 @@ function runRemote(host, harnessFile) {// ─── Main ─────────────────────────────────────────────────────────────────────────────────────────++/** --network-down: every site's home with openvibe.network unreachable (ADR-024). */++async function networkDown(h) {++ if (typeof h.checkUnreachable !== 'function') throw new Error('this harness has no checkUnreachable (Shared 1.21.0+); pass --harness <OpenVibe.Shared/browser-harness.js>');++ const netHost = new URL(NETWORK).hostname;++ const sites = (await resolveSites(await registry())).filter((s) => new URL(s.origin).hostname !== netHost);++ const block = [`*://${netHost}/*`];++ const results = [];++ const browser = await h.launch({});++ try {++ for (const site of sites) {++ let r;++ try { r = await h.checkUnreachable(`${site.origin}/`, { block, widths: [390, 1280], browser, minText: 120 }); } catch (e) { r = { url: `${site.origin}/`, ok: false, error: e.message, widths: [] }; }++ r.id = site.id;++ results.push(r);++ errLog(`${r.ok ? 'ok ' : 'FAIL'} ${site.origin}${r.error ? ` (${r.error})` : ''}`);++ }++ } finally { await browser.close(); }++ const at = new Date().toISOString();++ const rows = results.map((r) => {++ const w = (px) => r.widths.find((x) => x.width === px) || {};++ const cell = (x) => (x.ok ? '✓' : x.status == null ? '—' : `**✗** ${x.status}${x.settled === false ? ' unsettled' : ''}${x.accent ? '' : ' no theme'}${(x.textChars || 0) < 120 ? ` ${x.textChars || 0} chars` : ''}`);++ return `| ${new URL(r.url).hostname} | ${cell(w(390))} | ${cell(w(1280))} | ${(w(1280).accent || '—')} | ${r.error ? r.error.slice(0, 80) : ''} |`;++ });++ const md = `### Network-down run ${at} (ADR-024)\n\n${results.filter((r) => r.ok).length}/${results.length} sites paint with ${netHost} unreachable (every request to it fails). Checked at 390 and 1280 px: status 200, settled, at least 120 characters of text, a \`--accent\` theme token and a background.\n\n| Site | 390 | 1280 | --accent | Note |\n|---|---|---|---|---|\n${rows.join('\n')}\n`;++ if (has('json')) process.stdout.write(`${JSON.stringify(results, null, 2)}\n`);++ else console.log(md);++ if (arg('out')) fs.appendFileSync(arg('out'), `\n${md}`);++ process.exit(results.every((r) => r.ok) ? 0 : 1);++}++(async () => {const { h, file: harnessFile } = loadHarness();++ if (has('network-down')) return networkDown(h);const widths = arg('widths') ? arg('widths').split(',').map(Number) : h.WIDTHS;const meta = { at: new Date().toISOString(), runner: 'local', widths, axe: has('no-axe') ? 'off' : `axe-core ${h.AXE.version}, WCAG 2.1 A/AA`, nav: has('no-nav') ? 'off' : `${Number(arg('laps') || 5)} laps` };let reports, code;
@@ -879,3 +879,471 @@ Known errors, counted and not failed (`--strict-errors` fails them):
@@ -879,3 +879,471 @@ Known errors, counted and not failed (`--strict-errors` fails them):
- idle 5s after settle: CPU 0.1% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 6 KB (`https://openvibe.wiki/shared/release-watch.js`, `https://openvibe.wiki/release.json`, `https://events.openvibe.network/realtime/stream`)
- idle 5s after settle: CPU 0.1% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 6 KB (`https://openvibe.wiki/shared/release-watch.js`, `https://openvibe.wiki/release.json`, `https://events.openvibe.network/realtime/stream`)
</details>
</details>
+
+### Run 2026-09-26T10:30:41.088Z (local; Chrome/150.0.7843.0)
+
+23/23 sites pass. Widths 390, 768, 1280; axe axe-core 4.13.0, WCAG 2.1 A/AA; navigation 5 laps. Cells: ✓ all pass, **n✗** routes failing, n! warnings, - not run.
+
+| Site | Routes | Status | Errors | Overflow | Scripts | No-JS | Canonical | JSON-LD | axe | Nav | axe serious/critical (moderate) | Growth lap 2→last | Idle 5 s: CPU · requests · infinite animations |
+|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
+| ai.openvibe.network | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -1 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |
+| billing.openvibe.network | 1 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | -1 KB · 0 nodes · 0 lst | 0% · 0 req |
+| openvibe.blog | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +5 KB · 0 nodes · 0 lst | 0.1% · 4 req |
+| openvibe.chat | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | +4 KB · 0 nodes · 0 lst | 0.3% · 4 req |
+| openvibe.codes | 7 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | +2 KB · 0 nodes · 0 lst | 0.1% · 4 req |
+| openvibe.community | 6 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.2% · 4 req |
+| openvibe.coupons | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +1 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |
+| openvibe.deals | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -6 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |
+| openvibe.games | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +26 KB · 0 nodes · +2 lst | 15.4% · 3 req · 1 anim |
+| openvibe.host | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.3% · 3 req · 3 anim |
+| openvibe.live | 8 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -77 KB · 0 nodes · 0 lst | 24.8% · 17 req · 33 anim |
+| openvibe.media | 3 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | -1 KB · 0 nodes · -2 lst | 0.1% · 4 req |
+| openvibe.network | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +1 KB · 0 nodes · 0 lst | 30.3% · 4 req · 19 anim |
+| openvibe.news | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -7 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |
+| openre.stream | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +2 KB · 0 nodes · 0 lst | 0.3% · 3 req · 3 anim |
+| openvibe.reviews | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +1 KB · 0 nodes · 0 lst | 0.3% · 3 req · 3 anim |
+| search.openvibe.network | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.4% · 4 req |
+| sources.openvibe.network | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0% · 0 req |
+| openvibe.tips | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -1 KB · 0 nodes · 0 lst | 0.5% · 3 req · 3 anim |
+| openvibe.tools | 8 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -3 KB · 0 nodes · -2 lst | 0.1% · 4 req |
+| openvibe.trade | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +1 KB · 0 nodes · 0 lst | 0.3% · 3 req · 3 anim |
+| openvibe.vip | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.4% · 3 req · 3 anim |
+| openvibe.wiki | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -6 KB · 0 nodes · -2 lst | 0.2% · 4 req |
+
+Known errors, counted and not failed (`--strict-errors` fails them):
+- Cloudflare Web Analytics beacon, injected at the edge, blocked by the site CSP: 17× on openvibe.media, sources.openvibe.network
+
+<details><summary>Details: routes and findings per site</summary>
+
+**https://ai.openvibe.network**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap -1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://ai.openvibe.network/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://billing.openvibe.network**: pass (1 route(s), Chrome/150.0.7843.0)
+- `/policy`: pass
+- navigation `/policy` ↔ `/policy` ×5 (load): pass; growth lap 2→5: heap -1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0% (script 0 ms, style 0 ms, layout 0 ms), 0 request(s), 0 KB
+
+**https://openvibe.blog**: pass (4 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/updates`: pass
+- `/@openvibe/patch-notes-chat-parity-script`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/updates` ×5 (link): pass; growth lap 2→5: heap +5 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.1% (script 2 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.blog/shared/release-watch.js`, `https://openvibe.blog/release.json`, `https://openvibe.blog/release-metrics`, `https://events.openvibe.network/realtime/stream`)
+
+**https://openvibe.chat**: pass (4 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/rooms`: pass
+- `/updates`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/rooms` ×5 (link): pass; growth lap 2→5: heap +4 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts -1, sockets 0
+ - idle 5s after settle: CPU 0.3% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.chat/shared/release-watch.js`, `https://openvibe.chat/release.json`, `https://openvibe.chat/release-metrics`, `https://events.openvibe.network/realtime/stream`)
+
+**https://openvibe.codes**: pass (7 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/tools/webhooks`: pass
+- `/manifests/validate`: pass
+- `/docs`: pass
+- `/oauth`: pass
+- `/policy`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/tools/webhooks` ×5 (link): pass; growth lap 2→5: heap +2 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.1% (script 2 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.codes/shared/release-watch.js`, `https://openvibe.codes/release.json`, `https://openvibe.codes/release-metrics`, `https://events.openvibe.network/realtime/stream`)
+
+**https://openvibe.community**: pass (6 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/pastes`: pass
+- `/pulse`: pass
+- `/p/rogue-frame-5292`: pass
+- `/s`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/pastes` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts -1, sockets 0
+ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.community/shared/release-watch.js`, `https://openvibe.community/release.json`, `https://openvibe.community/release-metrics`, `https://events.openvibe.network/realtime/stream`)
+
+**https://openvibe.coupons**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.coupons/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://openvibe.deals**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap -6 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.deals/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://openvibe.games**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +26 KB, nodes 0, listeners +2, documents 0, intervals 0, timeouts -1, sockets 0
+ - idle 5s after settle: CPU 15.4% (script 5 ms, style 42 ms, layout 0 ms), 3 request(s), 0.3 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.games/release.json`, `https://events.openvibe.network/realtime/stream`); 1 running animation(s), 1 infinite: `pulse on a.play-cta`
+
+**https://openvibe.host**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.3% (script 6 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.host/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://openvibe.live**: pass (8 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/content`: pass
+- `/chat`: pass
+- `/search?q=minecraft`: pass
+- `/vod/5627`: pass
+- `/clip/369`: pass
+- `/@JapaneseOldGuy`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/content` ×5 (in-page+link): pass; growth lap 2→5: heap -77 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 24.8% (script 55 ms, style 182 ms, layout 22 ms), 17 request(s), 158.8 KB; 36 running animation(s), 33 infinite: `opacity on div.hero-float-inner`, `transform on div.hero-float-inner`, `heroBgKenBurns on div.hero-bg-layer`, `heroFloat3d on a.hero-float`
+
+**https://openvibe.media**: pass (3 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/updates`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/updates` ×5 (link): pass; growth lap 2→5: heap -1 KB, nodes 0, listeners -2, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.1% (script 2 ms, style 0 ms, layout 0 ms), 4 request(s), 6.4 KB (`https://openvibe.media/shared/release-watch.js`, `https://openvibe.media/release.json`, `https://openvibe.media/release-metrics`, `https://events.openvibe.network/realtime/stream`)
+
+**https://openvibe.network**: pass (4 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/updates`: pass
+- `/login`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/updates` ×5 (link): pass; growth lap 2→5: heap +1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 30.3% (script 3 ms, style 123 ms, layout 164 ms), 4 request(s), 6.4 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.network/release.json`, `https://openvibe.network/release-metrics`, `https://events.openvibe.network/realtime/stream`); 19 running animation(s), 19 infinite: `orb-drift on div.orb`, `ovmFloat on svg`, `ovmGlow on circle`, `ovmComet on circle`
+
+**https://openvibe.news**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap -7 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.2% (script 4 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.news/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://openre.stream**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +2 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.3% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.3 KB (`https://openvibe.network/shared/release-watch.js`, `https://openre.stream/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://openvibe.reviews**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.3% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.reviews/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://search.openvibe.network**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass (application/problem+json: only the status is checked)
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.4% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.7 KB (`https://search.openvibe.network/shared/release-watch.js`, `https://search.openvibe.network/release.json`, `https://search.openvibe.network/release-metrics`, `https://events.openvibe.network/realtime/stream`)
+ - error during navigation: network: Failed to load resource: the server responded with a status of 404 ()
+
+**https://sources.openvibe.network**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass (application/problem+json: only the status is checked)
+- navigation `/` ↔ `/` ×5 (load): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0% (script 0 ms, style 0 ms, layout 0 ms), 0 request(s), 0 KB
+
+**https://openvibe.tips**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap -1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.5% (script 7 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.tips/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://openvibe.tools**: pass (8 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/developers`: pass
+- `/updates`: pass
+- `/tool/yaml`: pass
+- `/all-tools`: pass
+- `/network-tools`: pass
+- `/developer-tools`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/developers` ×5 (link): pass; growth lap 2→5: heap -3 KB, nodes 0, listeners -2, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.1% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.4 KB (`https://openvibe.tools/shared/release-watch.js`, `https://openvibe.tools/release.json`, `https://openvibe.tools/release-metrics`, `https://events.openvibe.network/realtime/stream`)
+
+**https://openvibe.trade**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.3% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.trade/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://openvibe.vip**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.4% (script 7 ms, style 0 ms, layout 0 ms), 3 request(s), 6.4 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.vip/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://openvibe.wiki**: pass (4 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/updates`: pass
+- `/s/openvibe`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/updates` ×5 (link): pass; growth lap 2→5: heap -6 KB, nodes 0, listeners -2, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.2% (script 7 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.wiki/shared/release-watch.js`, `https://openvibe.wiki/release.json`, `https://openvibe.wiki/release-metrics`, `https://events.openvibe.network/realtime/stream`)
+
+</details>
+
+### Run 2026-09-26T10:46:24.226Z (local; Chrome/150.0.7843.0)
+
+23/23 sites pass. Widths 390, 768, 1280; axe axe-core 4.13.0, WCAG 2.1 A/AA; navigation 5 laps. Cells: ✓ all pass, **n✗** routes failing, n! warnings, - not run.
+
+| Site | Routes | Status | Errors | Overflow | Scripts | No-JS | Canonical | JSON-LD | axe | Nav | axe serious/critical (moderate) | Growth lap 2→last | Idle 5 s: CPU · requests · infinite animations |
+|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
+| ai.openvibe.network | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +3 KB · 0 nodes · +2 lst | 0.3% · 3 req · 3 anim |
+| billing.openvibe.network | 1 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | -1 KB · 0 nodes · 0 lst | 0% · 0 req |
+| openvibe.blog | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +2 KB · 0 nodes · 0 lst | 0.2% · 4 req |
+| openvibe.chat | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | +1 KB · 0 nodes · 0 lst | 0.1% · 4 req |
+| openvibe.codes | 7 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.1% · 4 req |
+| openvibe.community | 6 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.2% · 4 req |
+| openvibe.coupons | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -16 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |
+| openvibe.deals | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |
+| openvibe.games | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -1 KB · 0 nodes · 0 lst | 12.9% · 3 req · 1 anim |
+| openvibe.host | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +2 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |
+| openvibe.live | 8 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +34 KB · +10 nodes · +1 lst | 22% · 17 req · 33 anim |
+| openvibe.media | 3 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | +3 KB · 0 nodes · 0 lst | 0.3% · 4 req |
+| openvibe.network | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -3 KB · 0 nodes · +1 lst | 28.4% · 4 req · 19 anim |
+| openvibe.news | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +1 KB · 0 nodes · 0 lst | 0.6% · 3 req · 3 anim |
+| openre.stream | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +3 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |
+| openvibe.reviews | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | -2 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |
+| search.openvibe.network | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.3% · 4 req |
+| sources.openvibe.network | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0% · 0 req |
+| openvibe.tips | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +2 KB · 0 nodes · 0 lst | 0.3% · 3 req · 3 anim |
+| openvibe.tools | 8 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +2 KB · 0 nodes · -2 lst | 0.2% · 4 req |
+| openvibe.trade | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |
+| openvibe.vip | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | +2 KB · 0 nodes · 0 lst | 0.2% · 3 req · 3 anim |
+| openvibe.wiki | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0/0 (0) | 0 KB · 0 nodes · 0 lst | 0.1% · 4 req |
+
+Known errors, counted and not failed (`--strict-errors` fails them):
+- Cloudflare Web Analytics beacon, injected at the edge, blocked by the site CSP: 17× on openvibe.media, sources.openvibe.network
+
+<details><summary>Details: routes and findings per site</summary>
+
+**https://ai.openvibe.network**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +3 KB, nodes 0, listeners +2, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.3% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://ai.openvibe.network/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://billing.openvibe.network**: pass (1 route(s), Chrome/150.0.7843.0)
+- `/policy`: pass
+- navigation `/policy` ↔ `/policy` ×5 (load): pass; growth lap 2→5: heap -1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0% (script 0 ms, style 0 ms, layout 0 ms), 0 request(s), 0 KB
+
+**https://openvibe.blog**: pass (4 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/updates`: pass
+- `/@openvibe/patch-notes-chat-parity-script`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/updates` ×5 (link): pass; growth lap 2→5: heap +2 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts -1, sockets 0
+ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.blog/shared/release-watch.js`, `https://openvibe.blog/release.json`, `https://openvibe.blog/release-metrics`, `https://events.openvibe.network/realtime/stream`)
+
+**https://openvibe.chat**: pass (4 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/rooms`: pass
+- `/updates`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/rooms` ×5 (link): pass; growth lap 2→5: heap +1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts -1, sockets 0
+ - idle 5s after settle: CPU 0.1% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.chat/shared/release-watch.js`, `https://openvibe.chat/release.json`, `https://openvibe.chat/release-metrics`, `https://events.openvibe.network/realtime/stream`)
+
+**https://openvibe.codes**: pass (7 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/tools/webhooks`: pass
+- `/manifests/validate`: pass
+- `/docs`: pass
+- `/oauth`: pass
+- `/policy`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/tools/webhooks` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.1% (script 2 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.codes/shared/release-watch.js`, `https://openvibe.codes/release.json`, `https://openvibe.codes/release-metrics`, `https://events.openvibe.network/realtime/stream`)
+
+**https://openvibe.community**: pass (6 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/pastes`: pass
+- `/pulse`: pass
+- `/p/rogue-frame-5292`: pass
+- `/s`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/pastes` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts -1, sockets 0
+ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.community/shared/release-watch.js`, `https://openvibe.community/release.json`, `https://openvibe.community/release-metrics`, `https://events.openvibe.network/realtime/stream`)
+
+**https://openvibe.coupons**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap -16 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.coupons/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://openvibe.deals**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.2% (script 2 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.deals/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://openvibe.games**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap -1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 12.9% (script 3 ms, style 35 ms, layout 0 ms), 3 request(s), 0.3 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.games/release.json`, `https://events.openvibe.network/realtime/stream`); 1 running animation(s), 1 infinite: `pulse on a.play-cta`
+
+**https://openvibe.host**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +2 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.host/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://openvibe.live**: pass (8 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/content`: pass
+- `/chat`: pass
+- `/search?q=minecraft`: pass
+- `/vod/5627`: pass
+- `/clip/369`: pass
+- `/@JapaneseOldGuy`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/content` ×5 (in-page+link): pass; growth lap 2→5: heap +34 KB, nodes +10, listeners +1, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 22% (script 46 ms, style 182 ms, layout 20 ms), 17 request(s), 158.8 KB; 36 running animation(s), 33 infinite: `opacity on div.hero-float-inner`, `transform on div.hero-float-inner`, `heroBgKenBurns on div.hero-bg-layer`, `heroFloat3d on a.hero-float`
+
+**https://openvibe.media**: pass (3 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/updates`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/updates` ×5 (link): pass; growth lap 2→5: heap +3 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.3% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.4 KB (`https://openvibe.media/shared/release-watch.js`, `https://openvibe.media/release.json`, `https://openvibe.media/release-metrics`, `https://events.openvibe.network/realtime/stream`)
+
+**https://openvibe.network**: pass (4 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/updates`: pass
+- `/login`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/updates` ×5 (link): pass; growth lap 2→5: heap -3 KB, nodes 0, listeners +1, documents 0, intervals -1, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 28.4% (script 3 ms, style 130 ms, layout 155 ms), 4 request(s), 6.4 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.network/release.json`, `https://openvibe.network/release-metrics`, `https://events.openvibe.network/realtime/stream`); 19 running animation(s), 19 infinite: `orb-drift on div.orb`, `ovmFloat on svg`, `ovmGlow on circle`, `ovmComet on circle`
+
+**https://openvibe.news**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +1 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.6% (script 7 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.news/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://openre.stream**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +3 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openre.stream/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://openvibe.reviews**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap -2 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.reviews/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://search.openvibe.network**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass (application/problem+json: only the status is checked)
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts -2, sockets 0
+ - idle 5s after settle: CPU 0.3% (script 5 ms, style 0 ms, layout 0 ms), 4 request(s), 6.6 KB (`https://search.openvibe.network/shared/release-watch.js`, `https://search.openvibe.network/release.json`, `https://search.openvibe.network/release-metrics`, `https://events.openvibe.network/realtime/stream`)
+ - error during navigation: network: Failed to load resource: the server responded with a status of 404 ()
+
+**https://sources.openvibe.network**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass (application/problem+json: only the status is checked)
+- navigation `/` ↔ `/` ×5 (load): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0% (script 0 ms, style 0 ms, layout 0 ms), 0 request(s), 0 KB
+
+**https://openvibe.tips**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +2 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.3% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.tips/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://openvibe.tools**: pass (8 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/developers`: pass
+- `/updates`: pass
+- `/tool/yaml`: pass
+- `/all-tools`: pass
+- `/network-tools`: pass
+- `/developer-tools`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/developers` ×5 (link): pass; growth lap 2→5: heap +2 KB, nodes 0, listeners -2, documents 0, intervals 0, timeouts -1, sockets 0
+ - idle 5s after settle: CPU 0.2% (script 2 ms, style 0 ms, layout 0 ms), 4 request(s), 6.4 KB (`https://openvibe.tools/shared/release-watch.js`, `https://openvibe.tools/release.json`, `https://openvibe.tools/release-metrics`, `https://events.openvibe.network/realtime/stream`)
+
+**https://openvibe.trade**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.2% (script 2 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.trade/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://openvibe.vip**: pass (2 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/` ×5 (link): pass; growth lap 2→5: heap +2 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.2% (script 3 ms, style 0 ms, layout 0 ms), 3 request(s), 0.2 KB (`https://openvibe.network/shared/release-watch.js`, `https://openvibe.vip/release.json`, `https://events.openvibe.network/realtime/stream`); 3 running animation(s), 3 infinite: `drift on i`
+
+**https://openvibe.wiki**: pass (4 route(s), Chrome/150.0.7843.0)
+- `/`: pass
+- `/updates`: pass
+- `/s/openvibe`: pass
+- `/__ovcheck-404`: pass
+- navigation `/` ↔ `/updates` ×5 (link): pass; growth lap 2→5: heap 0 KB, nodes 0, listeners 0, documents 0, intervals 0, timeouts 0, sockets 0
+ - idle 5s after settle: CPU 0.1% (script 3 ms, style 0 ms, layout 0 ms), 4 request(s), 6.1 KB (`https://openvibe.wiki/shared/release-watch.js`, `https://openvibe.wiki/release.json`, `https://openvibe.wiki/release-metrics`, `https://events.openvibe.network/realtime/stream`)
+
+</details>
+
+### Network-down run 2026-09-26T11:03:32.079Z (ADR-024)
+
+20/22 sites paint with openvibe.network unreachable (every request to it fails). Checked at 390 and 1280 px: status 200, settled, at least 200 characters of text, a `--accent` theme token and a background.
+
+| Site | 390 | 1280 | --accent | Note |
+|---|---|---|---|---|
+| ai.openvibe.network | ✓ | ✓ | #3b82f6 | |
+| billing.openvibe.network | **✗** 200 188 chars | ✓ | #7aa7ff | |
+| openvibe.blog | ✓ | ✓ | #3b82f6 | |
+| openvibe.chat | ✓ | ✓ | #3b82f6 | |
+| openvibe.codes | ✓ | ✓ | #3b82f6 | |
+| openvibe.community | ✓ | ✓ | #3b82f6 | |
+| openvibe.coupons | ✓ | ✓ | #3b82f6 | |
+| openvibe.deals | ✓ | ✓ | #3b82f6 | |
+| openvibe.games | ✓ | ✓ | #3b82f6 | |
+| openvibe.host | ✓ | ✓ | #3b82f6 | |
+| openvibe.live | ✓ | ✓ | #3b82f6 | |
+| openvibe.media | **✗** 200 no theme | **✗** 200 no theme | — | |
+| openvibe.news | ✓ | ✓ | #3b82f6 | |
+| openre.stream | ✓ | ✓ | #3b82f6 | |
+| openvibe.reviews | ✓ | ✓ | #3b82f6 | |
+| search.openvibe.network | ✓ | ✓ | #3b82f6 | |
+| sources.openvibe.network | ✓ | ✓ | #7aa2ff | |
+| openvibe.tips | ✓ | ✓ | #3b82f6 | |
+| openvibe.tools | ✓ | ✓ | #3b82f6 | |
+| openvibe.trade | ✓ | ✓ | #3b82f6 | |
+| openvibe.vip | ✓ | ✓ | #3b82f6 | |
+| openvibe.wiki | ✓ | ✓ | #3b82f6 | |
+
+### Network-down run 2026-09-26T11:09:21.983Z (ADR-024)
+
+22/22 sites paint with openvibe.network unreachable (every request to it fails). Checked at 390 and 1280 px: status 200, settled, at least 120 characters of text, a `--accent` theme token and a background.
+
+| Site | 390 | 1280 | --accent | Note |
+|---|---|---|---|---|
+| ai.openvibe.network | ✓ | ✓ | #3b82f6 | |
+| billing.openvibe.network | ✓ | ✓ | #7aa7ff | |
+| openvibe.blog | ✓ | ✓ | #3b82f6 | |
+| openvibe.chat | ✓ | ✓ | #3b82f6 | |
+| openvibe.codes | ✓ | ✓ | #3b82f6 | |
+| openvibe.community | ✓ | ✓ | #3b82f6 | |
+| openvibe.coupons | ✓ | ✓ | #3b82f6 | |
+| openvibe.deals | ✓ | ✓ | #3b82f6 | |
+| openvibe.games | ✓ | ✓ | #3b82f6 | |
+| openvibe.host | ✓ | ✓ | #3b82f6 | |
+| openvibe.live | ✓ | ✓ | #3b82f6 | |
+| openvibe.media | ✓ | ✓ | #3b82f6 | |
+| openvibe.news | ✓ | ✓ | #3b82f6 | |
+| openre.stream | ✓ | ✓ | #3b82f6 | |
+| openvibe.reviews | ✓ | ✓ | #3b82f6 | |
+| search.openvibe.network | ✓ | ✓ | #3b82f6 | |
+| sources.openvibe.network | ✓ | ✓ | #7aa2ff | |
+| openvibe.tips | ✓ | ✓ | #3b82f6 | |
+| openvibe.tools | ✓ | ✓ | #3b82f6 | |
+| openvibe.trade | ✓ | ✓ | #3b82f6 | |
+| openvibe.vip | ✓ | ✓ | #3b82f6 | |
+| openvibe.wiki | ✓ | ✓ | #3b82f6 | |
@@ -26,6 +26,12 @@
@@ -26,6 +26,12 @@
* the report is written here. The remote needs Node 22+ and Chrome (CHROME_BIN or /usr/bin/google-chrome),
* the report is written here. The remote needs Node 22+ and Chrome (CHROME_BIN or /usr/bin/google-chrome),
* and reaches the sites itself. OVHOST_SSH overrides the ssh command (e.g. "ssh -p 2222").
* and reaches the sites itself. OVHOST_SSH overrides the ssh command (e.g. "ssh -p 2222").
*
*
+ * --network-down (ADR-024, WS-E task 1): instead, each site's home page loads with openvibe.network unreachable
+ * (the harness's checkUnreachable: every request to it fails), at 390 and 1280 px, and must still paint: status
+ * 200, settled, 120+ characters of text (a blank page has none; a short sign-in page has ~190), a --accent
+ * theme token and a background. openvibe.network itself is left out. Needs
+ * a harness with checkUnreachable (Shared 1.21.0 and later, or --harness a checkout).
+ *
* The harness comes from --harness, else openvibe-shared/browser-harness (Shared 1.16.0 and later), else a
* The harness comes from --harness, else openvibe-shared/browser-harness (Shared 1.16.0 and later), else a
* sibling OpenVibe.Shared checkout. Needs Chrome and Node 22. (--routes-json '<json>' is --routes-file inline;
* sibling OpenVibe.Shared checkout. Needs Chrome and Node 22. (--routes-json '<json>' is --routes-file inline;
* --remote uses it to carry the routes file.)
* --remote uses it to carry the routes file.)
@@ -227,8 +233,39 @@ function runRemote(host, harnessFile) {
@@ -227,8 +233,39 @@ function runRemote(host, harnessFile) {
// ─── Main ─────────────────────────────────────────────────────────────────────────────────────────
// ─── Main ─────────────────────────────────────────────────────────────────────────────────────────
+/** --network-down: every site's home with openvibe.network unreachable (ADR-024). */
+async function networkDown(h) {
+ if (typeof h.checkUnreachable !== 'function') throw new Error('this harness has no checkUnreachable (Shared 1.21.0+); pass --harness <OpenVibe.Shared/browser-harness.js>');
+ const netHost = new URL(NETWORK).hostname;
+ const sites = (await resolveSites(await registry())).filter((s) => new URL(s.origin).hostname !== netHost);
+ const block = [`*://${netHost}/*`];
+ const results = [];
+ const browser = await h.launch({});
+ try {
+ for (const site of sites) {
+ let r;
+ try { r = await h.checkUnreachable(`${site.origin}/`, { block, widths: [390, 1280], browser, minText: 120 }); } catch (e) { r = { url: `${site.origin}/`, ok: false, error: e.message, widths: [] }; }
+ r.id = site.id;
+ results.push(r);
+ errLog(`${r.ok ? 'ok ' : 'FAIL'} ${site.origin}${r.error ? ` (${r.error})` : ''}`);
+ }
+ } finally { await browser.close(); }
+ const at = new Date().toISOString();
+ const rows = results.map((r) => {
+ const w = (px) => r.widths.find((x) => x.width === px) || {};
+ const cell = (x) => (x.ok ? '✓' : x.status == null ? '—' : `**✗** ${x.status}${x.settled === false ? ' unsettled' : ''}${x.accent ? '' : ' no theme'}${(x.textChars || 0) < 120 ? ` ${x.textChars || 0} chars` : ''}`);
+ return `| ${new URL(r.url).hostname} | ${cell(w(390))} | ${cell(w(1280))} | ${(w(1280).accent || '—')} | ${r.error ? r.error.slice(0, 80) : ''} |`;
+ });
+ const md = `### Network-down run ${at} (ADR-024)\n\n${results.filter((r) => r.ok).length}/${results.length} sites paint with ${netHost} unreachable (every request to it fails). Checked at 390 and 1280 px: status 200, settled, at least 120 characters of text, a \`--accent\` theme token and a background.\n\n| Site | 390 | 1280 | --accent | Note |\n|---|---|---|---|---|\n${rows.join('\n')}\n`;
+ if (has('json')) process.stdout.write(`${JSON.stringify(results, null, 2)}\n`);
+ else console.log(md);
+ if (arg('out')) fs.appendFileSync(arg('out'), `\n${md}`);
+ process.exit(results.every((r) => r.ok) ? 0 : 1);
+}
+
(async () => {
(async () => {
const { h, file: harnessFile } = loadHarness();
const { h, file: harnessFile } = loadHarness();
+ if (has('network-down')) return networkDown(h);
const widths = arg('widths') ? arg('widths').split(',').map(Number) : h.WIDTHS;
const widths = arg('widths') ? arg('widths').split(',').map(Number) : h.WIDTHS;
const meta = { at: new Date().toISOString(), runner: 'local', widths, axe: has('no-axe') ? 'off' : `axe-core ${h.AXE.version}, WCAG 2.1 A/AA`, nav: has('no-nav') ? 'off' : `${Number(arg('laps') || 5)} laps` };
const meta = { at: new Date().toISOString(), runner: 'local', widths, axe: has('no-axe') ? 'off' : `axe-core ${h.AXE.version}, WCAG 2.1 A/AA`, nav: has('no-nav') ? 'off' : `${Number(arg('laps') || 5)} laps` };
let reports, code;
let reports, code;