From f69bf05208dd6a7479287fd1a421b667f75a6a7e Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Thu, 5 Nov 2026 07:16:04 +0700 Subject: [PATCH 1/7] docs(visual): add genuine ESP32-P4 Ethernet lab photo --- assets/photos/arstack-esp32-p4-lab-demo.webp | Bin 0 -> 51382 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/photos/arstack-esp32-p4-lab-demo.webp diff --git a/assets/photos/arstack-esp32-p4-lab-demo.webp b/assets/photos/arstack-esp32-p4-lab-demo.webp new file mode 100644 index 0000000000000000000000000000000000000000..3b717f69293878ef342fc1cb4a507b388a7fca16 GIT binary patch literal 51382 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 literal 0 HcmV?d00001 From c1b9cf952d15308ced94b81133079eeb0a4be572 Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Thu, 5 Nov 2026 07:16:48 +0700 Subject: [PATCH 2/7] docs(readme): showcase real ESP32-P4 lab photo and official global board store/docs --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index da058af36..41a10dd8e 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,16 @@ Use **ARStack Studio** and one affordable **ESP32-P4 Ethernet board** to generat *Screenshot captured directly from the Windows Qt application by the native GUI test.* +## Real ESP32-P4 Ethernet lab setup + +![Real Waveshare ESP32-P4-ETH series board connected to USB-C and an RJ45 Ethernet cable, held in front of an engineering waveform workspace](assets/photos/arstack-esp32-p4-lab-demo.webp) + +*Real hardware setup photo contributed to the project: an ESP32-P4-ETH-series development board connected over USB and Ethernet with a waveform workspace in the background. This illustrates the bench setup; standards compliance and SV/PTP timing claims are supported by the separate [packet-capture benchmark](docs/releases/PROCESSBUS_AUTONOMOUS_M3H3_OFFICIAL_20261025.md), not by the photograph.* + +**Want to see or buy a board?** [Waveshare official ESP32-P4-ETH product page (including the ESP32-P4-ETH-M option)](https://www.waveshare.com/product/iot-communication/wired-comm-converter/esp32-p4-eth.htm) · [Waveshare board documentation and revision guidance](https://docs.waveshare.com/ESP32-P4-ETH) · [Getting started](docs/GETTING_STARTED.md). + +The ESP32-P4-ETH-M is the version with pre-soldered pin headers. Confirm your actual chip revision in Studio before flashing the **matched firmware**: pre-v3 is supported by historical lab evidence, while v3.x physical compatibility remains an **engineering preview**. Run SV/PTP only on isolated test Ethernet. + ## Get started in minutes 1. **Download Studio** for [Windows (Setup ZIP)](https://github.com/masarray/arstack61850/releases/download/processbus-sim-dual-stable-20261105/ARStack-Studio-win-x64-setup.zip) or [Linux x86_64 (AppImage)](https://github.com/masarray/arstack61850/releases/download/processbus-sim-dual-stable-20261105/ARStack-Studio-linux-x86_64.AppImage). Extract the Windows ZIP and run the installer inside, or mark the Linux AppImage executable and launch it. Windows Portable ZIP and direct EXE are also available. From 1409be348aebb52cbdf254741bb165d452a2fdaf Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Thu, 5 Nov 2026 07:17:19 +0700 Subject: [PATCH 3/7] feat(site): show real ESP32-P4 board lab photo and official global hardware links --- index.html | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index 79879853a..167d282fd 100644 --- a/index.html +++ b/index.html @@ -43,9 +43,17 @@ .evidence{border-top:1px solid #284050;border-bottom:1px solid #284050;background:#0b1b26a8}.metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));padding:23px 0;gap:0}.metric{padding:0 20px;border-right:1px solid #2a4655}.metric:first-child{padding-left:0}.metric:last-child{border:0}.metric strong{display:block;color:#d6f1f9;font-size:clamp(18px,2.1vw,26px);letter-spacing:-.55px;font-weight:600;line-height:1.35;font-variant-numeric:tabular-nums}.metric span{display:block;margin-top:4px;color:#94acbc;font-size:11px;line-height:1.5}.metrics-note{color:#829dab;font-size:10px;padding-bottom:16px} .section{padding:71px 0 0}.sectionhead{display:flex;justify-content:space-between;gap:20px;align-items:end;margin-bottom:25px}.kicker{color:#73c7df;text-transform:uppercase;letter-spacing:1.65px;font-size:10px;margin-bottom:9px}h2{font-size:clamp(24px,2.6vw,32px);letter-spacing:-.65px;line-height:1.26;font-weight:600;margin:0 0 12px}.intro{max-width:730px;color:var(--muted);font-size:13px;line-height:1.8;margin:0}.sectionlink{font-size:12px;white-space:nowrap;color:#9cdeee;text-underline-offset:4px} .cards{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.card{padding:23px 21px;background:linear-gradient(150deg,#132635,#0e1c28);border:1px solid #2b4555;border-radius:10px}.card-num{font-size:11px;color:#6cbdd5;letter-spacing:1px}.card h3{font-size:15px;font-weight:600;letter-spacing:-.1px;margin:14px 0 7px}.card p{font-size:12px;color:#9eb4c1;line-height:1.8;margin:0}.two-col{display:grid;grid-template-columns:1fr 1fr;gap:14px}.panel{background:#10212f;border:1px solid #2d4556;border-radius:10px;padding:23px}.panel h3{font-size:15px;font-weight:600;margin:0 0 11px}.panel p{font-size:12px;line-height:1.8;color:#a5bdc8;margin:0 0 14px}.panel .link{color:#83d6e7;font-size:12px;text-decoration:none}.panel .link:hover{text-decoration:underline}.tagline{margin:0 0 12px;font-size:11px;color:#78d5c4}.panel-list{list-style:none;margin:0;padding:0;display:grid;gap:9px}.panel-list li{font-size:12px;color:#b3c7d1}.panel-list li:before{content:"✓";display:inline-block;margin-right:10px;color:#69dbc0} + .lab-grid{display:grid;grid-template-columns:minmax(0,1.12fr) minmax(0,.88fr);gap:28px;align-items:center} + .lab-photo{margin:0;padding:7px;background:#10212e;border:1px solid #2b4757;border-radius:11px} + .lab-photo img{display:block;width:100%;height:auto;aspect-ratio:960/713;object-fit:cover;border-radius:6px} + .lab-photo figcaption{padding:9px 5px 3px;font-size:10.5px;color:#8da7b6;line-height:1.6} + .lab-copy{min-width:0}.lab-copy h3{font-size:20px;font-weight:600;letter-spacing:-.4px;line-height:1.3;margin:0 0 11px} + .lab-copy p{font-size:12.5px;color:#a6bdc9;line-height:1.85;margin:0 0 12px} + .lab-links{display:flex;flex-direction:column;align-items:flex-start;gap:9px;margin-top:17px} + .lab-links a{font-size:12px;color:#9ce1f0;text-underline-offset:4px} .setup{counter-reset:step;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin:25px 0 14px}.step{padding:20px;background:#102330;border:1px solid #2d4858;border-radius:9px;color:#98acba;font-size:12px;line-height:1.7}.step:before{counter-increment:step;content:"0" counter(step);display:block;font-size:18px;color:#70d1e9;font-weight:650;margin-bottom:10px}.step b{display:block;font-size:13px;color:#eaf5fa;font-weight:600;margin-bottom:6px}.notice{border-left:2px solid #5ba4bc;color:#afc6d1;padding:9px 16px;margin-top:19px;font-size:12px;background:#12263370} .downloads{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:24px}.download{background:linear-gradient(150deg,#132635,#0d1b28);border:1px solid #315061;border-radius:10px;padding:22px;display:flex;flex-direction:column;gap:16px}.download .detail{font-size:11px;color:#9bb3c0;margin:3px 0 0}.download h3{font-size:15px;font-weight:600;margin:0}.download a{font-size:12px;color:#91e1f0;font-weight:600;text-decoration:none;align-self:start}.download a:hover{text-decoration:underline}.small{font-size:11px;color:#89a3b2;line-height:1.8;margin-top:14px}.small a{color:#a8ddec}.footer{margin-top:70px;border-top:1px solid #273d4c;padding:27px 0 31px;color:#88a1ae;font-size:11px}.footer-inner{display:flex;flex-wrap:wrap;justify-content:space-between;gap:13px}.footer-links{display:flex;flex-wrap:wrap;gap:17px}.footer-links a{text-decoration:none}.footer-links a:hover{color:var(--aqua)} - @media(max-width:950px){.hero-grid{grid-template-columns:minmax(0,1fr);gap:28px}.hero-copy{max-width:720px}.hero-visual{max-width:770px;width:100%}.navlinks{gap:15px}} + @media(max-width:950px){.lab-grid{grid-template-columns:1fr;gap:22px}.lab-photo{max-width:730px}.hero-grid{grid-template-columns:minmax(0,1fr);gap:28px}.hero-copy{max-width:720px}.hero-visual{max-width:770px;width:100%}.navlinks{gap:15px}} @media(max-width:700px){.wrap{width:calc(100% - 32px)}.hero{padding:44px 0 38px}.section{padding-top:52px}.metrics{grid-template-columns:repeat(2,1fr);row-gap:16px}.metric:nth-child(2){border:0}.metric:nth-child(3){padding-left:0}.cards{grid-template-columns:1fr}.two-col{grid-template-columns:1fr}.setup{grid-template-columns:repeat(2,1fr)}.sectionhead{display:block}.sectionlink{display:inline-block;margin-top:16px}.navlinks a:not(.nav-github){display:none}} @media(max-width:440px){.hero{padding-top:38px}.brand{font-size:14px}.nav-github{padding:6px 9px}.hero h1{font-size:34px;letter-spacing:-1.2px}.actionrow{flex-direction:column;align-items:stretch}.btn{width:100%}.preview-link{padding:5px}.metrics{padding:20px 0}.metric{padding:0 10px}.metric strong{font-size:17px}.setup,.downloads{grid-template-columns:1fr}.footer-inner{display:block}.footer-links{margin-top:12px}} @media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}.btn,.navlinks a{transition:none}} @@ -102,6 +110,23 @@

A process bus lab.
Without the test rack.

03 / ENGINEERING WORKFLOW

SCL identities and Studio control

Import supported SCD, SCL, CID or IID files, deploy supported SV profiles, tune waveforms, START/STOP, capture and reconnect without resetting the powered board.

+ +
+
A real hardware bench

See the ESP32-P4 lab setup.

A real photo of a compact ESP32-P4 development board connected to USB-C and Ethernet, with the engineering waveform workspace in the background.

+
+
+ Real ESP32-P4-ETH-series development board connected to a green Ethernet RJ45 cable and white USB-C cable in front of a three-phase waveform workspace +
Project hardware demo photo · real board and cables. On-wire SV/PTP benchmark evidence is documented separately.
+
+
+
AFFORDABLE PROCESS BUS EXPERIMENTS
+

Explore with Waveshare ESP32-P4-ETH.

+

The ESP32-P4-ETH family includes the ESP32-P4-ETH-M with pre-soldered headers. For the ARStack lab, use a compatible Ethernet board and release-matched firmware; use a dedicated, isolated test network.

+

Board revisions matter. ARStack Studio distributes distinct pre-v3 and v3.x firmware images. The newer v3.x firmware is still in engineering-preview hardware qualification.

+ +
+
+
Latest software progress

Three virtual Merging Units. One ESP32-P4.

M4 software includes SCL-driven three-virtual-MU configuration and group START/STOP with shared sample/PTP timing. The publicly shipped dual-firmware stable package carries these integrated controls, while sustained 3 × 4,000 fps on-wire load acceptance and v3.x hardware qualification are still being collected.

Implementation details ↗
From 7bf488aebdfc2b6ba9c004920805fb05a824f19f Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Thu, 5 Nov 2026 07:17:38 +0700 Subject: [PATCH 4/7] ci(pages): deploy real hardware photo and verify exact published bytes --- .github/workflows/m3h-project-pages-publish.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/m3h-project-pages-publish.yml b/.github/workflows/m3h-project-pages-publish.yml index ca9a97bbd..a72b3b6c1 100644 --- a/.github/workflows/m3h-project-pages-publish.yml +++ b/.github/workflows/m3h-project-pages-publish.yml @@ -6,6 +6,7 @@ on: paths: - 'index.html' - 'assets/screenshots/arstack-studio-windows.png' + - 'assets/photos/arstack-esp32-p4-lab-demo.webp' - 'assets/studio_icon/**' - 'scripts/check_site_visual_assets.py' - '.github/workflows/m3h-project-pages-publish.yml' @@ -41,6 +42,8 @@ jobs: grep -Fq 'class="actionrow hero-downloads"' index.html grep -Fq 'Download for Windows' index.html grep -Fq 'Download for Linux' index.html + grep -Fq 'assets/photos/arstack-esp32-p4-lab-demo.webp' index.html + grep -Fq 'https://docs.waveshare.com/ESP32-P4-ETH' index.html grep -Fq 'ARStack-Studio-linux-x86_64.AppImage' index.html grep -Fq 'data-asset="firmware"' index.html grep -Fq 'M3.H' index.html @@ -53,13 +56,15 @@ jobs: python3 scripts/check_site_visual_assets.py mkdir -p _site cp index.html _site/index.html - mkdir -p _site/assets/screenshots _site/assets/studio_icon + mkdir -p _site/assets/screenshots _site/assets/studio_icon _site/assets/photos for asset in android-chrome-192x192.png android-chrome-512x512.png favicon.ico favicon-16x16.png favicon-32x32.png apple-touch-icon.png site.webmanifest; do test -s "assets/studio_icon/$asset" cp "assets/studio_icon/$asset" "_site/assets/studio_icon/$asset" done test -s assets/screenshots/arstack-studio-windows.png cp assets/screenshots/arstack-studio-windows.png _site/assets/screenshots/arstack-studio-windows.png + test -s assets/photos/arstack-esp32-p4-lab-demo.webp + cp assets/photos/arstack-esp32-p4-lab-demo.webp _site/assets/photos/arstack-esp32-p4-lab-demo.webp touch _site/.nojekyll - uses: actions/configure-pages@v5 - uses: actions/upload-pages-artifact@v4 @@ -83,9 +88,10 @@ jobs: grep -Fq 'Download for Windows' /tmp/arstack-live.html && grep -Fq 'Download for Linux' /tmp/arstack-live.html && grep -Fq 'assets/studio_icon/android-chrome-192x192.png' /tmp/arstack-live.html && + grep -Fq 'assets/photos/arstack-esp32-p4-lab-demo.webp' /tmp/arstack-live.html && grep -Fq '4,705,090' /tmp/arstack-live.html && grep -Fq 'processbus-sim-dual-stable-20261105' /tmp/arstack-live.html; then - for asset in assets/studio_icon/android-chrome-192x192.png assets/studio_icon/android-chrome-512x512.png assets/studio_icon/favicon.ico assets/studio_icon/favicon-16x16.png assets/studio_icon/favicon-32x32.png assets/studio_icon/apple-touch-icon.png assets/studio_icon/site.webmanifest assets/screenshots/arstack-studio-windows.png; do + for asset in assets/studio_icon/android-chrome-192x192.png assets/studio_icon/android-chrome-512x512.png assets/studio_icon/favicon.ico assets/studio_icon/favicon-16x16.png assets/studio_icon/favicon-32x32.png assets/studio_icon/apple-touch-icon.png assets/studio_icon/site.webmanifest assets/screenshots/arstack-studio-windows.png assets/photos/arstack-esp32-p4-lab-demo.webp; do published="/tmp/arstack-live-$(basename "$asset")" curl --fail --location --silent --show-error "https://masarray.github.io/arstack61850/$asset?build=$GITHUB_SHA" -o "$published" cmp --silent "$asset" "$published" || { echo "FAIL: published image differs from repository $asset" >&2; exit 1; } From 9a277f4a55812c4ad3582f9371b8b4840c0517e7 Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Thu, 5 Nov 2026 07:18:00 +0700 Subject: [PATCH 5/7] test(site): require authentic locally shipped lab photo and official board links --- scripts/check_site_visual_assets.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/scripts/check_site_visual_assets.py b/scripts/check_site_visual_assets.py index 1b6c57d46..6da982df3 100644 --- a/scripts/check_site_visual_assets.py +++ b/scripts/check_site_visual_assets.py @@ -26,6 +26,7 @@ f"{ICON_ROOT}/apple-touch-icon.png", f"{ICON_ROOT}/site.webmanifest", ) +LAB_PHOTO = "assets/photos/arstack-esp32-p4-lab-demo.webp" errors: list[str] = [] for path, expected in REQUIRED_PNG.items(): @@ -45,9 +46,20 @@ if not (ROOT / path).is_file() or (ROOT / path).stat().st_size == 0: errors.append(f"Missing canonical Studio identity asset: {path}") +# Verify that the contributed real board photo is a local, committed WebP. +photo_path = ROOT / LAB_PHOTO +if not photo_path.is_file() or photo_path.stat().st_size < 15000: + errors.append(f"Missing or implausibly small hardware demo photo: {LAB_PHOTO}") +else: + webp_header = photo_path.read_bytes()[:16] + if webp_header[:4] != b"RIFF" or webp_header[8:12] != b"WEBP": + errors.append(f"Hardware demo photo is not a WebP image: {LAB_PHOTO}") + required_html = [ rf']*>\s*', + r'
', + r']*href="{ICON_ROOT}/favicon.ico"', rf']*href="{ICON_ROOT}/favicon-16x16.png"', @@ -69,6 +81,12 @@ if HTML.count(' Date: Thu, 5 Nov 2026 07:18:14 +0700 Subject: [PATCH 6/7] test(site): browser-verify real ESP32-P4 photo and Waveshare global link at all widths --- .github/workflows/m3h-landing-browser-acceptance.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/m3h-landing-browser-acceptance.yml b/.github/workflows/m3h-landing-browser-acceptance.yml index 230d35aca..e2981a53d 100644 --- a/.github/workflows/m3h-landing-browser-acceptance.yml +++ b/.github/workflows/m3h-landing-browser-acceptance.yml @@ -3,9 +3,9 @@ name: ARStack Latest Stable Landing Browser and Mobile Acceptance on: push: branches: [main] - paths: ['index.html', 'assets/screenshots/arstack-studio-windows.png', 'assets/studio_icon/**', 'scripts/check_site_visual_assets.py', '.github/workflows/m3h-landing-browser-acceptance.yml'] + paths: ['index.html', 'assets/screenshots/arstack-studio-windows.png', 'assets/photos/arstack-esp32-p4-lab-demo.webp', 'assets/studio_icon/**', 'scripts/check_site_visual_assets.py', '.github/workflows/m3h-landing-browser-acceptance.yml'] pull_request: - paths: ['index.html', 'assets/screenshots/arstack-studio-windows.png', 'assets/studio_icon/**', 'scripts/check_site_visual_assets.py', '.github/workflows/m3h-landing-browser-acceptance.yml'] + paths: ['index.html', 'assets/screenshots/arstack-studio-windows.png', 'assets/photos/arstack-esp32-p4-lab-demo.webp', 'assets/studio_icon/**', 'scripts/check_site_visual_assets.py', '.github/workflows/m3h-landing-browser-acceptance.yml'] workflow_dispatch: permissions: @@ -42,7 +42,7 @@ jobs: const page=await browser.newPage({viewport:{width,height:900},deviceScaleFactor:1}); const response=await page.goto('http://127.0.0.1:4173/',{waitUntil:'domcontentloaded',timeout:30000}); if(response.status()!==200)throw new Error('LIVE_HTTP_'+response.status()); - await Promise.all([page.locator('.brand img').evaluate(el=>el.decode()),page.locator('.hero-visual img').evaluate(el=>el.decode())]); + await Promise.all([page.locator('.brand img').evaluate(el=>el.decode()),page.locator('.hero-visual img').evaluate(el=>el.decode()),page.locator('.lab-photo img').evaluate(el=>el.decode())]); const data=await page.evaluate(()=>{ const buttons=[...document.querySelectorAll('a[data-asset="windows"],a[data-asset="portable"],a[data-asset="firmware"]')]; const releaseLink=/^https:\/\/github\.com\/masarray\/arstack61850\/releases\/(latest|tag\/[^/]+|download\/[^/]+\/[^/]+)$/; @@ -53,6 +53,8 @@ jobs: heroDownloads:[...document.querySelectorAll('.hero-downloads a')].map(el=>({label:el.textContent.trim(),href:el.href,visible:el.getBoundingClientRect().width>0&&el.getBoundingClientRect().height>0})), officialBrand:(()=>{const el=document.querySelector('.brand img');return el?.naturalWidth===192&&el.getAttribute('src')==='assets/studio_icon/android-chrome-192x192.png'})(), nativeScreenshot:(()=>{const el=document.querySelector('.hero-visual img');return el?.naturalWidth===960&&el?.naturalHeight===680&&el.getAttribute('src')==='assets/screenshots/arstack-studio-windows.png'})(), + realBenchPhoto:(()=>{const el=document.querySelector('.lab-photo img');return el?.naturalWidth===960&&el?.naturalHeight===713&&el.getAttribute('src')==='assets/photos/arstack-esp32-p4-lab-demo.webp'})(), + officialBoardLink:!!document.querySelector('a[href="https://www.waveshare.com/product/iot-communication/wired-comm-converter/esp32-p4-eth.htm"]'), studioFavicons:[...document.querySelectorAll('link[rel="icon"],link[rel="apple-touch-icon"],link[rel="manifest"]')].every(el=>el.getAttribute('href').startsWith('assets/studio_icon/')), studioSocialImage:document.querySelector('meta[property="og:image"]')?.content?.endsWith('/assets/studio_icon/android-chrome-512x512.png')===true, noPaintedMock:!document.querySelector('.monitor,.wave'), @@ -62,7 +64,7 @@ jobs: await page.screenshot({path:'evidence/m3h-'+width+'.png',fullPage:true}); if(!data.latest||!data.benchmark||!data.og||data.buttons!==4||!data.anyVisible||!data.linksValid||!data.linuxReady)throw new Error('MISSING_LATEST_RELEASE_LINKS_'+width); if(data.heroDownloads.length!==2||!data.heroDownloads.every(x=>x.visible)||data.heroDownloads[0].label!=='Download for Windows'||data.heroDownloads[1].label!=='Download for Linux'||!/ARStack-Studio-win-x64-setup\.zip$/.test(data.heroDownloads[0].href)||!/ARStack-Studio-linux-x86_64\.AppImage$/.test(data.heroDownloads[1].href))throw new Error('HERO_DIRECT_PLATFORM_DOWNLOADS_'+width); - if(!data.officialBrand||!data.nativeScreenshot||!data.noPaintedMock||!data.studioFavicons||!data.studioSocialImage)throw new Error('NONCANONICAL_STUDIO_ICON_OR_MOCK_SCREEN_'+width); + if(!data.officialBrand||!data.nativeScreenshot||!data.realBenchPhoto||!data.officialBoardLink||!data.noPaintedMock||!data.studioFavicons||!data.studioSocialImage)throw new Error('NONCANONICAL_STUDIO_ICON_OR_MOCK_SCREEN_'+width); if(data.scroll>data.width+2)throw new Error('HORIZONTAL_OVERFLOW_'+width+':'+data.scroll+'>'+data.width); await page.close(); } From 7154e760eaa250eac013a0a265f4c2feba7b1d03 Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Thu, 5 Nov 2026 07:19:16 +0700 Subject: [PATCH 7/7] test(site): reliably trigger lazy hardware photo loading before decode assertion --- .github/workflows/m3h-landing-browser-acceptance.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/m3h-landing-browser-acceptance.yml b/.github/workflows/m3h-landing-browser-acceptance.yml index e2981a53d..360aca4b1 100644 --- a/.github/workflows/m3h-landing-browser-acceptance.yml +++ b/.github/workflows/m3h-landing-browser-acceptance.yml @@ -42,7 +42,9 @@ jobs: const page=await browser.newPage({viewport:{width,height:900},deviceScaleFactor:1}); const response=await page.goto('http://127.0.0.1:4173/',{waitUntil:'domcontentloaded',timeout:30000}); if(response.status()!==200)throw new Error('LIVE_HTTP_'+response.status()); - await Promise.all([page.locator('.brand img').evaluate(el=>el.decode()),page.locator('.hero-visual img').evaluate(el=>el.decode()),page.locator('.lab-photo img').evaluate(el=>el.decode())]); + await Promise.all([page.locator('.brand img').evaluate(el=>el.decode()),page.locator('.hero-visual img').evaluate(el=>el.decode())]); + await page.locator('.lab-photo img').scrollIntoViewIfNeeded(); + await page.locator('.lab-photo img').evaluate(el=>el.decode()); const data=await page.evaluate(()=>{ const buttons=[...document.querySelectorAll('a[data-asset="windows"],a[data-asset="portable"],a[data-asset="firmware"]')]; const releaseLink=/^https:\/\/github\.com\/masarray\/arstack61850\/releases\/(latest|tag\/[^/]+|download\/[^/]+\/[^/]+)$/;