Skip to content

fix(studio-server): sub-composition previews build off the request thread within a deadline #38842

fix(studio-server): sub-composition previews build off the request thread within a deadline

fix(studio-server): sub-composition previews build off the request thread within a deadline #38842

Triggered via pull request November 15, 2026 19:41
Status Failure
Total duration 13m 15s
Artifacts 18

ci.yml

on: pull_request
Studio: edit accuracy CLI build
2m 59s
Studio: edit accuracy CLI build
Matrix: producer-source-tests
Matrix: test-cli
Catalog payloads
Catalog payloads
Release checks
Release checks
GCP BeginFrame image contract
GCP BeginFrame image contract
Lint
45s
Lint
Fallow audit
1m 14s
Fallow audit
Typecheck
3m 54s
Typecheck
Test: skill bootstrap (Windows, Node 24)
Test: skill bootstrap (Windows, Node 24)
Skills: manifest in sync
Skills: manifest in sync
Skills: project-native lint + mirror
Skills: project-native lint + mirror
Codex plugin package
Codex plugin package
SDK: unit + contract + smoke
48s
SDK: unit + contract + smoke
Test: runtime contract
3m 15s
Test: runtime contract
Studio: load smoke
1m 23s
Studio: load smoke
Studio: timeline viewport gate
9m 46s
Studio: timeline viewport gate
CLI smoke (required)
4m 20s
CLI smoke (required)
Matrix: cli-npx-shim
Matrix: studio-edit-accuracy
Catalog: search index covers the registry
Catalog: search index covers the registry
Smoke: global install
2m 28s
Smoke: global install
Studio: edit accuracy retry plan
Studio: edit accuracy retry plan
Matrix: studio-edit-accuracy-retry
Studio: edit accuracy gate
14s
Studio: edit accuracy gate
Fit to window
Zoom out
Zoom in

Annotations

13 errors, 43 warnings, and 43 notices
Test (support)
Process completed with exit code 1.
Test
Process completed with exit code 1.
Test
A package test shard did not succeed.
src/routes/preview.compDeadline.test.ts > a sub-composition preview build > inside its deadline is served whole, and the request thread stays free for all of it: packages/studio-server/src/routes/preview.compDeadline.test.ts#L74
AssertionError: expected 503 to be 200 // Object.is equality - Expected + Received - 200 + 503 ❯ src/routes/preview.compDeadline.test.ts:74:25
src/routes/preview.compDeadline.test.ts > a sub-composition preview build > after a refused one, the next page still builds: packages/studio-server/src/routes/preview.compDeadline.test.ts#L83
AssertionError: expected '<!DOCTYPE html>\n<html>\n<head><scrip…' to contain '<p>Hi</p>' - Expected + Received - <p>Hi</p> + <!DOCTYPE html> + <html> + <head><script data-hf-gsap-fallback> + (function(){ + var cdnBase="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/"; + var loaded={}; + function loadFallback(file){ + if(loaded[file])return loaded[file]; + return loaded[file]=new Promise(function(ok,fail){ + var s=document.createElement("script"); + s.src=cdnBase+file;s.hfGsapFallback=true;s.onload=ok;s.onerror=fail; + document.head.appendChild(s); + }); + } + document.addEventListener("error",function(e){ + var t=e.target; + if(!t||t.tagName!=="SCRIPT"||!t.src||t.hfGsapFallback)return; + var m=t.src.match(/gsap[^/]*\/dist\/(.+\.js)/); + if(m)loadFallback(m[1]).catch(function(){ + reportError(new Error("GSAP could not load from "+t.src+" or "+cdnBase+m[1]+", so this preview's animations will not play.")); + }); + },true); + })(); + </script> + <meta name="hyperframes-gsap-base-url" content="https://cdn.jsdelivr.net/npm"> + <meta name="hyperframes-studio-preview"><script>(function(){var seen=window.__hfPreviewErrors=[],kinds=window.__hfPreviewErrorKinds=[],known={SyntaxError:1,TypeError:1,ReferenceError:1,RangeError:1},runtime="/api/runtime.js"; + addEventListener("error",function(e){seen.push(e.message||String(e)); + var name=e.error&&e.error.constructor&&e.error.constructor.name,path=""; + try{var url=e.filename&&new URL(e.filename,window.location.href);if(url&&url.origin===window.location.origin)path=url.pathname}catch(_){} + kinds.push({name:known[name]===1?name:"other",origin:!path?"unknown":path===runtime?"runtime":path.indexOf("/api/projects/")===0?"project":"studio"})});})();</script> + <script data-hyperframes-preview-runtime="1" src="/api/runtime.js"></script> + <script type="importmap">{"imports":{"/":"/api/projects/demo/preview/","/api/projects/demo/preview/":"/api/projects/demo/preview/"}}</script> + <base href="/api/projects/demo/preview/"> + + + <script src="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/gsap.min.js"></script> + <meta name="hyperframes-project-signature" content="58ab92fea1df679747af8132"> + </head> + <body> + <script>window.__timelines=window.__timelines||{};</script> + <div data-hf-id="hf-bmsl" data-composition-id="small" data-width="320" data-height="180" data-composition-file="scenes/small.html"><p data-hf-id="hf-b938">Hi</p></div> + </body> + </html> ❯ src/routes/preview.compDeadline.test.ts:83:30
src/routes/preview.compDeadline.test.ts > a sub-composition preview build > inside its deadline is served whole, and the request thread stays free for all of it: packages/studio-server/src/routes/preview.compDeadline.test.ts#L74
AssertionError: expected 503 to be 200 // Object.is equality - Expected + Received - 200 + 503 ❯ src/routes/preview.compDeadline.test.ts:74:25
src/routes/preview.compDeadline.test.ts > a sub-composition preview build > after a refused one, the next page still builds: packages/studio-server/src/routes/preview.compDeadline.test.ts#L83
AssertionError: expected '<!DOCTYPE html>\n<html>\n<head><scrip…' to contain '<p>Hi</p>' - Expected + Received - <p>Hi</p> + <!DOCTYPE html> + <html> + <head><script data-hf-gsap-fallback> + (function(){ + var cdnBase="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/"; + var loaded={}; + function loadFallback(file){ + if(loaded[file])return loaded[file]; + return loaded[file]=new Promise(function(ok,fail){ + var s=document.createElement("script"); + s.src=cdnBase+file;s.hfGsapFallback=true;s.onload=ok;s.onerror=fail; + document.head.appendChild(s); + }); + } + document.addEventListener("error",function(e){ + var t=e.target; + if(!t||t.tagName!=="SCRIPT"||!t.src||t.hfGsapFallback)return; + var m=t.src.match(/gsap[^/]*\/dist\/(.+\.js)/); + if(m)loadFallback(m[1]).catch(function(){ + reportError(new Error("GSAP could not load from "+t.src+" or "+cdnBase+m[1]+", so this preview's animations will not play.")); + }); + },true); + })(); + </script> + <meta name="hyperframes-gsap-base-url" content="https://cdn.jsdelivr.net/npm"> + <meta name="hyperframes-studio-preview"><script>(function(){var seen=window.__hfPreviewErrors=[],kinds=window.__hfPreviewErrorKinds=[],known={SyntaxError:1,TypeError:1,ReferenceError:1,RangeError:1},runtime="/api/runtime.js"; + addEventListener("error",function(e){seen.push(e.message||String(e)); + var name=e.error&&e.error.constructor&&e.error.constructor.name,path=""; + try{var url=e.filename&&new URL(e.filename,window.location.href);if(url&&url.origin===window.location.origin)path=url.pathname}catch(_){} + kinds.push({name:known[name]===1?name:"other",origin:!path?"unknown":path===runtime?"runtime":path.indexOf("/api/projects/")===0?"project":"studio"})});})();</script> + <script data-hyperframes-preview-runtime="1" src="/api/runtime.js"></script> + <script type="importmap">{"imports":{"/":"/api/projects/demo/preview/","/api/projects/demo/preview/":"/api/projects/demo/preview/"}}</script> + <base href="/api/projects/demo/preview/"> + + + <script src="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/gsap.min.js"></script> + <meta name="hyperframes-project-signature" content="4e837f144b58a1222a286420"> + </head> + <body> + <script>window.__timelines=window.__timelines||{};</script> + <div data-hf-id="hf-bmsl" data-composition-id="small" data-width="320" data-height="180" data-composition-file="scenes/small.html"><p data-hf-id="hf-b938">Hi</p></div> + </body> + </html> ❯ src/routes/preview.compDeadline.test.ts:83:30
src/routes/preview.compDeadline.test.ts > a sub-composition preview build > after a refused one, the next page still builds: packages/studio-server/src/routes/preview.compDeadline.test.ts#L83
AssertionError: expected '<!DOCTYPE html>\n<html>\n<head><scrip…' to contain '<p>Hi</p>' - Expected + Received - <p>Hi</p> + <!DOCTYPE html> + <html> + <head><script data-hf-gsap-fallback> + (function(){ + var cdnBase="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/"; + var loaded={}; + function loadFallback(file){ + if(loaded[file])return loaded[file]; + return loaded[file]=new Promise(function(ok,fail){ + var s=document.createElement("script"); + s.src=cdnBase+file;s.hfGsapFallback=true;s.onload=ok;s.onerror=fail; + document.head.appendChild(s); + }); + } + document.addEventListener("error",function(e){ + var t=e.target; + if(!t||t.tagName!=="SCRIPT"||!t.src||t.hfGsapFallback)return; + var m=t.src.match(/gsap[^/]*\/dist\/(.+\.js)/); + if(m)loadFallback(m[1]).catch(function(){ + reportError(new Error("GSAP could not load from "+t.src+" or "+cdnBase+m[1]+", so this preview's animations will not play.")); + }); + },true); + })(); + </script> + <meta name="hyperframes-gsap-base-url" content="https://cdn.jsdelivr.net/npm"> + <meta name="hyperframes-studio-preview"><script>(function(){var seen=window.__hfPreviewErrors=[],kinds=window.__hfPreviewErrorKinds=[],known={SyntaxError:1,TypeError:1,ReferenceError:1,RangeError:1},runtime="/api/runtime.js"; + addEventListener("error",function(e){seen.push(e.message||String(e)); + var name=e.error&&e.error.constructor&&e.error.constructor.name,path=""; + try{var url=e.filename&&new URL(e.filename,window.location.href);if(url&&url.origin===window.location.origin)path=url.pathname}catch(_){} + kinds.push({name:known[name]===1?name:"other",origin:!path?"unknown":path===runtime?"runtime":path.indexOf("/api/projects/")===0?"project":"studio"})});})();</script> + <script data-hyperframes-preview-runtime="1" src="/api/runtime.js"></script> + <script type="importmap">{"imports":{"/":"/api/projects/demo/preview/","/api/projects/demo/preview/":"/api/projects/demo/preview/"}}</script> + <base href="/api/projects/demo/preview/"> + + + <script src="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/gsap.min.js"></script> + <meta name="hyperframes-project-signature" content="63757370eff8a325a1dd40cd"> + </head> + <body> + <script>window.__timelines=window.__timelines||{};</script> + <div data-hf-id="hf-bmsl" data-composition-id="small" data-width="320" data-height="180" data-composition-file="scenes/small.html"><p data-hf-id="hf-b938">Hi</p></div> + </body> + </html> ❯ src/routes/preview.compDeadline.test.ts:83:30
src/routes/preview.compDeadline.test.ts > a sub-composition preview build > inside its deadline is served whole, and the request thread stays free for all of it: packages/studio-server/src/routes/preview.compDeadline.test.ts#L74
AssertionError: expected 503 to be 200 // Object.is equality - Expected + Received - 200 + 503 ❯ src/routes/preview.compDeadline.test.ts:74:25
src/routes/preview.compDeadline.test.ts > a sub-composition preview build > after a refused one, the next page still builds: packages/studio-server/src/routes/preview.compDeadline.test.ts#L83
AssertionError: expected '<!DOCTYPE html>\n<html>\n<head><scrip…' to contain '<p>Hi</p>' - Expected + Received - <p>Hi</p> + <!DOCTYPE html> + <html> + <head><script data-hf-gsap-fallback> + (function(){ + var cdnBase="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/"; + var loaded={}; + function loadFallback(file){ + if(loaded[file])return loaded[file]; + return loaded[file]=new Promise(function(ok,fail){ + var s=document.createElement("script"); + s.src=cdnBase+file;s.hfGsapFallback=true;s.onload=ok;s.onerror=fail; + document.head.appendChild(s); + }); + } + document.addEventListener("error",function(e){ + var t=e.target; + if(!t||t.tagName!=="SCRIPT"||!t.src||t.hfGsapFallback)return; + var m=t.src.match(/gsap[^/]*\/dist\/(.+\.js)/); + if(m)loadFallback(m[1]).catch(function(){ + reportError(new Error("GSAP could not load from "+t.src+" or "+cdnBase+m[1]+", so this preview's animations will not play.")); + }); + },true); + })(); + </script> + <meta name="hyperframes-gsap-base-url" content="https://cdn.jsdelivr.net/npm"> + <meta name="hyperframes-studio-preview"><script>(function(){var seen=window.__hfPreviewErrors=[],kinds=window.__hfPreviewErrorKinds=[],known={SyntaxError:1,TypeError:1,ReferenceError:1,RangeError:1},runtime="/api/runtime.js"; + addEventListener("error",function(e){seen.push(e.message||String(e)); + var name=e.error&&e.error.constructor&&e.error.constructor.name,path=""; + try{var url=e.filename&&new URL(e.filename,window.location.href);if(url&&url.origin===window.location.origin)path=url.pathname}catch(_){} + kinds.push({name:known[name]===1?name:"other",origin:!path?"unknown":path===runtime?"runtime":path.indexOf("/api/projects/")===0?"project":"studio"})});})();</script> + <script data-hyperframes-preview-runtime="1" src="/api/runtime.js"></script> + <script type="importmap">{"imports":{"/":"/api/projects/demo/preview/","/api/projects/demo/preview/":"/api/projects/demo/preview/"}}</script> + <base href="/api/projects/demo/preview/"> + + + <script src="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/gsap.min.js"></script> + <meta name="hyperframes-project-signature" content="4729c61dbbb4f5626dbbffb5"> + </head> + <body> + <script>window.__timelines=window.__timelines||{};</script> + <div data-hf-id="hf-bmsl" data-composition-id="small" data-width="320" data-height="180" data-composition-file="scenes/small.html"><p data-hf-id="hf-b938">Hi</p></div> + </body> + </html> ❯ src/routes/preview.compDeadline.test.ts:83:30
src/routes/preview.compDeadline.test.ts > a sub-composition preview build > inside its deadline is served whole, and the request thread stays free for all of it: packages/studio-server/src/routes/preview.compDeadline.test.ts#L74
AssertionError: expected 503 to be 200 // Object.is equality - Expected + Received - 200 + 503 ❯ src/routes/preview.compDeadline.test.ts:74:25
src/routes/preview.compDeadline.test.ts > a sub-composition preview build > after a refused one, the next page still builds: packages/studio-server/src/routes/preview.compDeadline.test.ts#L83
AssertionError: expected '<!DOCTYPE html>\n<html>\n<head><scrip…' to contain '<p>Hi</p>' - Expected + Received - <p>Hi</p> + <!DOCTYPE html> + <html> + <head><script data-hf-gsap-fallback> + (function(){ + var cdnBase="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/"; + var loaded={}; + function loadFallback(file){ + if(loaded[file])return loaded[file]; + return loaded[file]=new Promise(function(ok,fail){ + var s=document.createElement("script"); + s.src=cdnBase+file;s.hfGsapFallback=true;s.onload=ok;s.onerror=fail; + document.head.appendChild(s); + }); + } + document.addEventListener("error",function(e){ + var t=e.target; + if(!t||t.tagName!=="SCRIPT"||!t.src||t.hfGsapFallback)return; + var m=t.src.match(/gsap[^/]*\/dist\/(.+\.js)/); + if(m)loadFallback(m[1]).catch(function(){ + reportError(new Error("GSAP could not load from "+t.src+" or "+cdnBase+m[1]+", so this preview's animations will not play.")); + }); + },true); + })(); + </script> + <meta name="hyperframes-gsap-base-url" content="https://cdn.jsdelivr.net/npm"> + <meta name="hyperframes-studio-preview"><script>(function(){var seen=window.__hfPreviewErrors=[],kinds=window.__hfPreviewErrorKinds=[],known={SyntaxError:1,TypeError:1,ReferenceError:1,RangeError:1},runtime="/api/runtime.js"; + addEventListener("error",function(e){seen.push(e.message||String(e)); + var name=e.error&&e.error.constructor&&e.error.constructor.name,path=""; + try{var url=e.filename&&new URL(e.filename,window.location.href);if(url&&url.origin===window.location.origin)path=url.pathname}catch(_){} + kinds.push({name:known[name]===1?name:"other",origin:!path?"unknown":path===runtime?"runtime":path.indexOf("/api/projects/")===0?"project":"studio"})});})();</script> + <script data-hyperframes-preview-runtime="1" src="/api/runtime.js"></script> + <script type="importmap">{"imports":{"/":"/api/projects/demo/preview/","/api/projects/demo/preview/":"/api/projects/demo/preview/"}}</script> + <base href="/api/projects/demo/preview/"> + + + <script src="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/gsap.min.js"></script> + <meta name="hyperframes-project-signature" content="9da73e4f7f258a087678e9bd"> + </head> + <body> + <script>window.__timelines=window.__timelines||{};</script> + <div data-hf-id="hf-bmsl" data-composition-id="small" data-width="320" data-height="180" data-composition-file="scenes/small.html"><p data-hf-id="hf-b938">Hi</p></div> + </body> + </html> ❯ src/routes/preview.compDeadline.test.ts:83:30
src/routes/preview.compDeadline.test.ts > a sub-composition preview build > inside its deadline is served whole, and the request thread stays free for all of it: packages/studio-server/src/routes/preview.compDeadline.test.ts#L74
AssertionError: expected 503 to be 200 // Object.is equality - Expected + Received - 200 + 503 ❯ src/routes/preview.compDeadline.test.ts:74:25
Semantic PR title
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: amannn/action-semantic-pull-request@e32d7e603df1aa1ba07e981f2a23455dee596825. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
File size check
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Detect changes
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Test reachability
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Lint
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
SDK: unit + contract + smoke
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830, actions/checkout@11d5960a326750d5838078e36cf38b85af677262. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
CLI: npx shim (ubuntu-latest)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Format
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Fallow audit
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
CLI: npx shim (macos-latest)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: load smoke
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Producer: unit tests
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
CLI: npx shim (windows-latest)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy CLI build
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Test: runtime contract
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Test (support)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830, actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, browser-actions/setup-chrome@c785b87e244131f27c9f19c1a33e2ead956ab7ce. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Build
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Typecheck
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
CLI smoke (required)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830, actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy (9/15)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Test (cli 2/2)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830, actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy (3/15)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy (2/15)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy (11/15)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy (1/15)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy (15/15)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy (6/15)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy (4/15)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy (10/15)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy (8/15)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy (12/15)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy (13/15)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Smoke: global install
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy (14/15)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy (7/15)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Test (cli 1/2)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830, actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy (5/15)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: edit accuracy gate
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02, marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Test (runtime)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830, actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Test (studio)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830, actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Studio: timeline viewport gate
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830, actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02, browser-actions/setup-chrome@c785b87e244131f27c9f19c1a33e2ead956ab7ce. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Producer: integration tests
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830, actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Flake gate
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830, actions/checkout@11d5960a326750d5838078e36cf38b85af677262, actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020, browser-actions/setup-chrome@c785b87e244131f27c9f19c1a33e2ead956ab7ce. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Semantic PR title
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
File size check
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Detect changes
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Test reachability
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Lint
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
SDK: unit + contract + smoke
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
CLI: npx shim (ubuntu-latest)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Format
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Fallow audit
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
CLI: npx shim (macos-latest)
Due to capacity constraints, jobs targeting macOS arm64 runners may experience longer queue times.
Studio: load smoke
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Producer: unit tests
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy CLI build
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Test: runtime contract
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Test (support)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Build
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Typecheck
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
CLI smoke (required)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy (9/15)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Test (cli 2/2)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy (3/15)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy (2/15)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy (11/15)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy (1/15)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy (15/15)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy (6/15)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy (4/15)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy (10/15)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy (8/15)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy (12/15)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy (13/15)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Smoke: global install
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy (14/15)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy (7/15)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Test (cli 1/2)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy (5/15)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: edit accuracy gate
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Test (runtime)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Test (studio)
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Studio: timeline viewport gate
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Producer: integration tests
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Test
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"
Flake gate
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see https://github.com/actions/runner-images/issues/14748"

Artifacts

Produced during runtime
Name Size Digest
edit-accuracy-cli
8.35 MB
sha256:087ca723a2fa3c592d711d6a078fb5723f255246b44fa396dd618e60a6ecfe33
edit-accuracy-gate
960 Bytes
sha256:a2394fdf17a43a161882b2b1757290c72142ad27ab3b093b2b5ca66f6cdaa274
edit-accuracy-shard-1
30.6 KB
sha256:728e76d7ca114370a826bfddaa0f2a06351b4ae18e2f99be09939d0c673202a0
edit-accuracy-shard-10
34.2 KB
sha256:8bf8ef729ca75b33cab517a57cc515cafbb123aade022cc3bcc0b5e2af33ee39
edit-accuracy-shard-11
27.8 KB
sha256:ddf986dd38a5277e14c8377272720bb807818bc23ee9fb0d6099574395b86902
edit-accuracy-shard-12
36.1 KB
sha256:d9b93b5b59afc6747f2ec98ff210caad33d3a2374e1d0c2b5f1980127c35434d
edit-accuracy-shard-13
37.6 KB
sha256:0bd7e4c34be313ccf718fba6a27ad7b8274c7c0419211249fb4a16fb293eadc3
edit-accuracy-shard-14
32.4 KB
sha256:a81d692bcc8ffdb9f8aa4c7b0f691653c4c0a04c09af10dfed7bb81a2b3fa636
edit-accuracy-shard-15
33.7 KB
sha256:551e53e8906f6d70fa80709edfa97f78a3dc867760d0db632036ed4a09162413
edit-accuracy-shard-2
35.6 KB
sha256:72fda5ff8d4bde7fdff05448eb631042458c4b87a514009d25784ff125f8ba09
edit-accuracy-shard-3
32.3 KB
sha256:493106edaabb4c54dc56af512306c8313cfc4b68d4a23cd5d16ead23dde32ec9
edit-accuracy-shard-4
31 KB
sha256:deaef3433a301d8bb48b6c3283f76f6ab4c8cb5432bd008e0810263a20e00710
edit-accuracy-shard-5
167 KB
sha256:e7c0a899cfbc61ccce4533acf621b14e8baa71a4f2dd3d93a4b1f43c7c9d04a4
edit-accuracy-shard-6
35.7 KB
sha256:bf98659e4046482857804e085e4922ba79a1edaf9ad3929225e9903a7c44f291
edit-accuracy-shard-7
38.3 KB
sha256:bdae42ce0c632274d45468fb43b35f2df95948b45d11a6e7330458ab13503ca0
edit-accuracy-shard-8
34.8 KB
sha256:c451043c3a82abca0ae8c94d8295543b66944f672b3256177e58c7508220230a
edit-accuracy-shard-9
32.1 KB
sha256:a32af42ecab57b56f8a5dae179bc525177724f459ad1091051e85b52132ae795
timeline-viewport-gate-evidence
941 KB
sha256:9fc11addbb36bd124571c915a98aab7990aa56bdc291f9adf9fff1e9973b4bb3