1<!doctype html> 2<html lang="en-US" class="no-js"> 3<head> 4 <meta charset="UTF-8">
4<script type="text/javascript">(window.NREUM||(NREUM={})).init={privacy:{cookies_enabled:true},ajax:{deny_list:["bam.nr-data.net"]},distributed_tracing:{enabled:true}};(window.NREUM||(NREUM={})).loader_config={agentID:"594424436",accountID:"4028038",trustKey:"66686",xpid:"UAYFWVZQABAFUFFVDggGUlE=",licenseKey:"NRJS-31a57c2b1fe38cc7620",applicationID:"540799145",browserID:"594424436"};;/*! For license information please see nr-loader-spa-1.322.0.min.js.LICENSE.txt */ 5(()=>{var e={8122(e,t,r){"use strict";r.d(t,{a:()=>i});var n=r(944);function i(e,t){try{if(!e||"object"!=typeof e)return(0,n.R)(3);if(!t||"object"!=typeof t)return(0,n.R)(4);const r=Object.create(Object.getPrototypeOf(t),Object.getOwnPropertyDescriptors(t)),s=0===Object.keys(r).length?e:r;for(let a in s)if(void 0!==e[a])try{if(null===e[a]){r[a]=null;continue}Array.isArray(e[a])&&Array.isArray(t[a])?r[a]=Array.from(new Set([...e[a],...t[a]])):e[a]instanceof Map||e[a]instanceof Set||e[a]instanceof Date||e[a]instanceof RegExp?r[a]=e[a]:"object"==typeof e[a]&&null!==t[a]&&"object"==typeof t[a]?r[a]=i(e[a],t[a]):r[a]=e[a]}catch(e){r[a]||(0,n.R)(1,e)}return r}catch(e){(0,n.R)(2,e)}}},2555(e,t,r){"use strict";r.d(t,{f:()=>a});var n=r(384),i=r(8122);const s={beacon:n.NT.beacon,errorBeacon:n.NT.errorBeacon,licenseKey:void 0,applicationID:void 0,sa:void 0,queueTime:void 0,applicationTime:void 0,ttGuid:void 0,user:void 0,account:void 0,product:void 0,extra:void 0,jsAttributes:{},userAttributes:void 0,atts:void 0,transactionName:void 0,tNamePlain:void 0};function a(e){try{return!!e.licenseKey&&!!e.errorBeacon&&!!e.applicationID}catch(e){return!1}}r.d(t,["D",0,e=>(0,i.a)(e,s)])},7699(e,t,r){"use strict";var n=r(860);const i={[n.K7.logging]:!0,[n.K7.genericEvents]:!0,[n.K7.jserrors]:!0,[n.K7.ajax]:!0};r.d(t,["It",0,1e6,"KC",0,i,"qh",0,"SESSION_ERROR"])},9324(e,t,r){"use strict";r.d(t,["A",0,"@newrelic/rrweb","x",0,"1.322.0"])},981(e,t,r){"use strict";r.d(t,["R",0,{AJAX:"AjaxRequest",PA:"PageAction",UA:"UserAction",BP:"BrowserPerformance",WS:"WebSocket",SPV:"SecurityPolicyViolation",JSE:"JavaScriptError",LOG:"Log",PVE:"PageView",PVT:"PageViewTiming",SR:"SessionReplay",ST:"SessionTrace",BI:"BrowserInteraction"}])},9752(e,t,r){"use strict";const n="newrelic-iframe-",i=n+"timing-update",s=n+"api",a=n+"api-response",o=n+"vitals-update",c=n+"ajax";r.d(t,["$8",0,o,"Gi",0,a,"KU",0,c,"Pl",0,n,"cS",0,s,"cr",0,i])},6154(e,t,r){"use strict";var n=r(1863);const i="undefined"!=typeof window&&!!window.document,s="undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self.navigator instanceof WorkerNavigator||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis.navigator instanceof WorkerNavigator),a=i?window:"undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis),o=Boolean("hidden"===a?.document?.visibilityState),c=""+a?.location,d=/iPad|iPhone|iPod/.test(a.navigator?.userAgent),u=d&&"undefined"==typeof SharedWorker,l=(()=>{const e=a.navigator?.userAgent?.match(/Firefox[/\s](\d+\.\d+)/);return Array.isArray(e)&&e.length>=2?+e[1]:0})(),f=Date.now()-(0,n.t)();r.d(t,["OF",0,d,"RI",0,i,"WN",0,f,"bv",0,s,"gm",0,a,"lR",0,l,"m",0,c,"mw",0,o,"sb",0,u,"zk",0,()=>{const e=a?.performance?.getEntriesByType?.("navigation")?.[0];if(e&&e.responseStart>0&&e.responseStart<a.performance.now())return e}])},7295(e,t,r){"use strict";r.d(t,{Xv:()=>a,gX:()=>i,iW:()=>s});var n=[];function i(e){if(!e||s(e))return!1;if(0===n.length)return!0;if("*"===n[0].hostname)return!1;for(var t=0;t<n.length;t++){var r=n[t];if(r.hostname.test(e.hostname)&&r.pathname.test(e.pathname))return!1}return!0}function s(e){return void 0===e.hostname}function a(e){if(n=[],e&&e.length)for(var t=0;t<e.length;t++){let r=e[t];if(!r)continue;if("*"===r)return void(n=[{hostname:"*"}]);0===r.indexOf("http://")?r=r.substring(7):0===r.indexOf("https://")&&(r=r.substring(8));const i=r.indexOf("/");let s,a;i>0?(s=r.substring(0,i),a=r.substring(i)):(s=r,a="*");let[c]=s.split(":");n.push({hostname:o(c),pathname:o(a,!0)})}}function o(e,t=!1){const r=e.replace(/[.+?^${}()|[\]\\]/g,e=>"\\"+e).replace(/\*/g,".*?");return new RegExp((t?"^":"")+r+"$")}},3241(e,t,r){"use strict";r.d(t,{W:()=>i});var n=r(6154);function i(e={}){try{n.gm.dispatchEvent(new CustomEvent("newrelic",{detail:e}))}catch(e){}}},1687(e,t,r){"use strict";r.d(t,{Ak:()=>o,Ze:()=>d,x3:()=>c});var n=r(3241),i=r(3606),s=r(860),a=r(2646);function o(e,t){if(!e)return;const r={staged:!1,priority:s.P3[t]||0};
5e.runtime.drainRegistry.get(t)||e.runtime.drainRegistry.set(t,r)}function c(e,t){if(!e)return;const r=e.runtime.drainRegistry;r&&(r.get(t)&&r.delete(t),l(e,t,!1),r.size&&u(e))}function d(e,t="feature",r=!1){if(e){if(!e.runtime.drainRegistry.get(t)||r)return l(e,t);e.runtime.drainRegistry.get(t).staged=!0,u(e)}}function u(e){if(!e)return;const t=Array.from(e.runtime.drainRegistry);t.every(([e,t])=>t.staged)&&(t.sort((e,t)=>e[1].priority-t[1].priority),t.forEach(([t])=>{e.runtime.drainRegistry.delete(t),l(e,t)}))}function l(e,t,r=!0){if(!e)return;const s=e.ee,o=i.i.handlers;if(s&&!s.aborted&&s.backlog&&o){if((0,n.W)({type:"lifecycle",name:"drain",feature:t}),r){const e=s.backlog[t],r=o[t];if(r){for(let t=0;e&&t<e.length;++t)f(e[t],r);Object.entries(r).forEach(([e,t])=>{Object.values(t||{}).forEach(t=>{t[0]?.on&&t[0].context()instanceof a.y&&!t[0].listeners(e).includes(t[1])&&t[0].on(e,t[1])})})}}s.isolatedBacklog||delete o[t],s.backlog[t]=null,s.emit("drain-"+t,[])}}function f(e,t){var r=e[1];Object.values(t[r]||{}).forEach(t=>{var r=e[0];if(t[0]===r){var n=t[1],i=e[3],s=e[2];n.apply(i,s)}})}},7836(e,t,r){"use strict";var n=r(384),i=r(8990),s=r(2646),a=r(5607);const o="nr@context:".concat(a.W),c=function e(t,r){var n={},a={},u={},l=!1;try{l=16===r.length&&d.initializedAgents?.[r]?.runtime.isolatedBacklog}catch(e){}var f={on:p,addEventListener:p,removeEventListener:function(e,t){var r=n[e];if(!r)return;for(var i=0;i<r.length;i++)r[i]===t&&r.splice(i,1)},emit:function(e,r,n,i,s){!1!==s&&(s=!0);if(c.aborted&&!i)return;t&&s&&t.emit(e,r,n);var o=h(n);g(e).forEach(e=>{e.apply(o,r)});var d=v()[a[e]];d&&d.push([f,e,r,o]);return o},get:m,listeners:g,context:h,buffer:function(e,t){const r=v();if(t=t||"feature",f.aborted)return;Object.entries(e||{}).forEach(([e,n])=>{a[n]=t,t in r||(r[t]=[])})},abort:function(){f._aborted=!0,Object.keys(f.backlog).forEach(e=>{delete f.backlog[e]})},isBuffering:function(e){return!!v()[a[e]]},debugId:r,backlog:l?{}:t&&"object"==typeof t.backlog?t.backlog:{},isolatedBacklog:l};return Object.defineProperty(f,"aborted",{get:()=>{let e=f._aborted||!1;return e||(t&&(e=t.aborted),e)}}),f;function h(e){return e&&e instanceof s.y?e:e?(0,i.I)(e,o,()=>new s.y(o)):new s.y(o)}function p(e,t){n[e]=g(e).concat(t)}function g(e){return n[e]||[]}function m(t){return u[t]=u[t]||e(f,t)}function v(){return f.backlog}}(void 0,"globalEE"),d=(0,n.Zm)();d.ee||(d.ee=c),r.d(t,["P",0,o,"ee",0,c])},2646(e,t,r){"use strict";r.d(t,{y:()=>n});class n{constructor(e){this.contextId=e}}},9908(e,t,r){"use strict";r.d(t,{d:()=>n,p:()=>i});var n=r(7836).ee.get("handle");function i(e,t,r,i,s){s?(s.buffer([e],i),s.emit(e,t,r)):(n.buffer([e],i),n.emit(e,t,r))}},3606(e,t,r){"use strict";r.d(t,{i:()=>s});var n=r(9908);s.on=a;var i=s.handlers={};function s(e,t,r,s){a(s||n.d,i,e,t,r)}function a(e,t,r,i,s){s||(s="feature"),e||(e=n.d);var a=t[s]=t[s]||{};(a[r]=a[r]||[]).push([e,i])}},3878(e,t,r){"use strict";function n(e,t){return{capture:e,passive:!1,signal:t}}function i(e,t,r=!1,i){window.addEventListener(e,t,n(r,i))}function s(e,t,r=!1,i){document.addEventListener(e,t,n(r,i))}r.d(t,{DD:()=>s,jT:()=>n,sp:()=>i})},5607(e,t,r){"use strict";const n=(0,r(9566).bz)();r.d(t,["W",0,n])},9566(e,t,r){"use strict";r.d(t,{LA:()=>a,ZF:()=>o,bz:()=>s,el:()=>c});var n=r(6154);function i(e,t){return e?15&e[t]:16*Math.random()|0}function s(){const e=n.gm?.crypto||n.gm?.msCrypto;let t,r=0;return e&&e.getRandomValues&&(t=e.getRandomValues(new Uint8Array(30))),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".split("").map(e=>"x"===e?i(t,r++).toString(16):"y"===e?(3&i()|8).toString(16):e).join("")}function a(e){const t=n.gm?.crypto||n.gm?.msCrypto;let r,s=0;t&&t.getRandomValues&&(r=t.getRandomValues(new Uint8Array(e)));const a=[];for(var o=0;o<e;o++)a.push(i(r,s++).toString(16));return a.join("")}function o(){return a(16)}function c(){return a(32)}},2614(e,t,r){"use strict";r.d(t,["BB",0,18e5,"Wt",0,"NRBA_SESSION::","g",0,{OFF:0,FULL:1,ERROR:2},"iL",0,{SAME_TAB:"same-tab",CROSS_TAB:"cross-tab"},"tS",0,{STARTED:"session-started",PAUSE:"session-pause",RESET:"session-reset",RESUME:"session-resume",UPDATE:"session-update"},"wk",0,144e5])},733(e,t,r){"use strict";function n(e,t){return function(e){let t=2166136261;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}("".concat(String(e),":").concat(String(t)))}r.d(t,{Y:()=>n})},1863(e,t,r){"use strict";function n(){return Math.floor(performance.now())}r.d(t,{t:()=>n})},9119(e,t,r){"use strict";r.d(t,{L:()=>s});var n=/([^?#]*)[^#]*(#[^?]*|$).*/,i=/([^?#]*)().*/;function s(e,t){return e?e.replace(t?n:i,"$1$2"):e}},7485(e,t,r){"use strict";r.d(t,{D:()=>i});var n=r(6154);function i(e){if(0===(e||"").indexOf("data:"))return{protocol:"data"};try{const t=new URL(e,location.href),r={port:t.port,hostname:t.hostname,pathname:t.pathname,search:t.search,protocol:t.protocol.slice(0,t.protocol.indexOf(":")),sameOrigin:t.protocol===n.gm?.location?.protocol&&t.host===n.gm?.location?.host};return r.port&&""!==r.port||("http:"===t.protocol&&(r.port="80"),"https:"===t.protocol&&(r.port="443")),r.pathname&&""!==r.pathname?r.pathname.startsWith("/")||(r.pathname="/".concat(r.pathname)):r.pathname="/",r}catch(e){return{}}}},7866(e,t,r){"use strict";r.d(t,["Nc",0,/^\s*at Function code \(Function code:\d+:\d+\)\s*/i,"cn",0,/^\s*(?:([^@]*)(?:\(.*?\))?@)?((?:file|http|https|chrome|safari-extension).*?):(\d+)(?::(\d+))?\s*$/i,"fL",0,/^\s*at .+ \(eval at \S+ \((?:(?:file|http|https):[^)]+)?\)(?:, [^:]*:\d+:\d+)?\)$/i,"h3",0,/function (.+?)\s*\(/,"hB",0,/^\s*at (?:((?:\[object object\])?(?:[^(]*\([^)]*\))*[^()]*(?: \[as \S+\])?) )?\(?((?:file|http|https|chrome-extension):.*?)?:(\d+)(?::(\d+))?\)?\s*$/i])},944(e,t,r){"use strict";r.d(t,{R:()=>i});var n=r(3241);function i(e,t){"function"==typeof console.debug&&(console.debug("New Relic Warning: https://github.com/newrelic/newrelic-browser-agent/blob/main/docs/warning-codes.md#".concat(e),t),(0,n.W)({drained:null,type:"data",name:"warn",feature:"warn",data:{code:e,secondary:t}}))}},8990(e,t,r){"use strict";r.d(t,{I:()=>i});var n=Object.prototype.hasOwnProperty;function i(e,t,r){if(n.call(e,t))return e[t];var i=r();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,t,{value:i,writable:!0,enumerable:!1}),i}catch(e){}return e[t]=i,i}},6389(e,t,r){"use strict";function n(e,t=500,r={}){const n=r?.leading||!1;let i;return(...r)=>{n&&void 0===i&&(e.apply(this,r),i=setTimeout(()=>{i=clearTimeout(i)},t)),n||(clearTimeout(i),i=setTimeout(()=>{e.apply(this,r)},t))}}function i(e){let t=!1;return(...r)=>{t||(t=!0,e.apply(this,r))}}r.d(t,{J:()=>i,s:()=>n})},1910(e,t,r){"use strict";r.d(t,{i:()=>s});var n=r(944);const i=new Map;function s(...e){return e.every(e=>{if(i.has(e))return i.get(e);const t="function"==typeof e?e.toString():"",r=t.includes("[native code]"),s=t.includes("nrWrapper");return r||s||(0,n.R)(64,e?.name||t),i.set(e,r),r})}},3304(e,t,r){"use strict";r.d(t,{A:()=>i});var n=r(7836);function i(e){try{return JSON.stringify(e,(()=>{const e=new WeakSet;return(t,r)=>{if("object"==typeof r&&null!==r){if(e.has(r))return;e.add(r)}return r}})())??""}catch(e){try{n.ee.emit("internal-error",[e])}catch(e){}return""}}},9232(e,t,r){"use strict";r.d(t,["f",0,{MFE:"MFE",BA:"BA"}])},7560(e,t,r){"use strict";r.d(t,{N:()=>a,j:()=>c});var n=r(9119),i=r(944);const s=(0,r(6389).J)(e=>(0,i.R)(80,e));function a(e){if(!Array.isArray(e?.assets)||!e.assets.length)return;
5const t=e.assets.map(o).filter(Boolean);return t.length?{assets:t,scripts:t.filter(e=>e.isScript)}:void 0}function o(e){if(!e||"object"!=typeof e)return;const{matcher:t,type:r}=e;let i="string"==typeof t&&t.endsWith(".js");return void 0!==r&&(!function(e){return"script"===e||"asset"===e}(r)?s(r):i=function(e){return"script"===e}(r)),a=t,"[object RegExp]"===Object.prototype.toString.call(a)?{pattern:t,test:e=>(t.lastIndex=0,t.test((0,n.L)(e))),isScript:i}:"string"==typeof t&&t.length>0?{pattern:t,test:e=>(0,n.L)(e).includes(t),isScript:i}:void s(t);var a}function c(e,t,{scriptsOnly:r=!1}={}){if(!e||!t)return!1;return(r?e.scripts:e.assets).some(e=>e.test(t))}},5718(e,t,r){"use strict";r.d(t,{xo:()=>T,AZ:()=>v,cI:()=>g,Qr:()=>A,QL:()=>y});var n=r(6154),i=r(1863),s=r(9119),a=r(7866);class o{dom=new c;performance=new c;constructor(e){this.url=e,this.claimedBy=new Set}get script(){const e=Math.max(this.dom.start,this.performance.end);return{start:e,end:Math.max(this.dom.end,this.performance.end,e)}}}class c{start=0;end=0;value=void 0}function d(e=()=>{},t){return{get:()=>void 0!==t?t:e(),set:e=>{t=e}}}let u;try{u=v(y())[0]}catch(e){u=v(e)[0]}const l=new Map;let f=[];const h=new WeakMap;function p(e){let t=h.get(e);return t||(t={weighedAssetUrls:new Set,recordManifestScriptWindow:(t,r)=>{t&&(e.scriptStart=e.scriptStart>0?Math.min(e.scriptStart,t):t),r&&(e.scriptEnd=e.scriptEnd>0?Math.max(e.scriptEnd,r):r)}},h.set(e,t)),t}function g(e){return l.get(e)}function m(e){const t=g(e);
5if(t)return t;const r=new o(e);if(l.set(e,r),l.size>1e3){const e=l.keys().next().value;l.delete(e)}return r}if(n.gm.MutationObserver&&n.gm.document){new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{if("SCRIPT"===e.nodeName&&e.src){const t=m((0,s.L)(e.src));t.dom.start=(0,i.t)(),t.dom.value=e;const r=()=>{t.dom.end=(0,i.t)()};["load","error"].forEach(t=>e.addEventListener(t,r,{once:!0}))}})})}).observe(n.gm.document,{childList:!0,subtree:!0})}if(n.gm.PerformanceObserver?.supportedEntryTypes.includes("resource")){new PerformanceObserver(e=>{e.getEntries().forEach(e=>{if((e=>"script"===e.initiatorType||["link","fetch"].includes(e.initiatorType)&&(0,s.L)(e.name).endsWith(".js"))(e)){const t=m((0,s.L)(e.name));t.performance.start=Math.floor(e.startTime),t.performance.end=Math.floor(e.responseEnd),t.performance.value=e}if(!f.length)return;const t=[];f.forEach(({test:r,addedAt:n},s)=>{(r(e)||(0,i.t)()-n>1e4)&&t.push(s)}),f=f.filter((e,r)=>!t.includes(r))})}).observe({type:"resource",buffered:!0})}function v(e){if(!e||"string"!=typeof e)return[];const t=new Set,r=e.split("\n");for(const e of r){const r=e.match(a.cn)||e.match(a.hB)||e.match(a.fL);if(r&&r[2])t.add((0,s.L)(r[2]));else{const r=e.match(/\(([^)]+\.js):\d+:\d+\)/)||e.match(/^\s+at\s+([^\s(]+\.js):\d+:\d+/);r&&r[1]&&t.add((0,s.L)(r[1]))}}return[...t]}function y(){let e;try{const t=Error.stackTraceLimit;Error.stackTraceLimit=50,e=(new Error).stack,Error.stackTraceLimit=t}catch(t){e=(new Error).stack}return e}function b(e,t){return(0,s.L)(e.name)===t}function E(e,t){e.fetchStart=Math.floor(t.startTime),e.fetchEnd=Math.floor(t.responseEnd),e.asset=t.name,e.type=t.initiatorType,w(e,t)}function w(e,t){const r=(0,s.L)(t.name),{weighedAssetUrls:n}=p(e);n.has(r)||(n.add(r),e.totalWeight=(e.totalWeight||0)+(t.transferSize||0),"blocking"===t.renderBlockingStatus?e.renderBlocking=!0:"non-blocking"===t.renderBlockingStatus&&!0!==e.renderBlocking&&(e.renderBlocking=!1))}function R(e,t,r,n,i){if(w(e,t),"scripts"!==i&&"all"!==i)return;if("all"===i||r.isScript){const r=Math.floor(t.startTime),n=Math.floor(t.responseEnd);e.fetchStart=e.fetchStart>0?Math.min(e.fetchStart,r):r,e.fetchEnd=e.fetchEnd>0?Math.max(e.fetchEnd,n):n}if(r.isScript){const r=g((0,s.L)(t.name));if(r){const t=()=>{const{start:t,end:n}=r.script;p(e).recordManifestScriptWindow(t,n)};t(),!r.dom.end&&r.dom.value&&["load","error"].forEach(e=>r.dom.value.addEventListener(e,t,{once:!0}))}n.resolved||(e.asset=t.name,e.type=t.initiatorType,n.resolved=!0)}}function T(e,t){const r=t?.manifest;if(!r||!r.assets.length)return;const s={resolved:!1},a=new Set(r.assets);(n.gm.performance?.getEntriesByType("resource")||[]).forEach(r=>{const n=[...a].find(e=>e.test(r.name));n&&(R(e,r,n,s,t.timingMethod),a.delete(n))}),a.size&&function(e,t,r,s){n.gm.PerformanceObserver?.supportedEntryTypes?.includes("resource")&&f.push({addedAt:(0,i.t)(),test:n=>{const i=[...t].find(e=>e.test(n.name));return i&&(R(e,n,i,r,s),t.delete(i)),0===t.size}})}(e,a,s,t.timingMethod)}function A(e){const t=e?.id,r={registeredAt:(0,i.t)(),reportedAt:void 0,fetchStart:0,fetchEnd:0,scriptStart:0,scriptEnd:0,asset:void 0,type:"unknown",totalWeight:0,renderBlocking:void 0},a=y();if(!a)return r;const o=n.gm.performance?.getEntriesByType("navigation")?.[0]?.name||"";try{const e=v(a),c=(e.length>1?e.filter(e=>u!==e):e)[0];if(!c)return r;if(o.includes(c))return r.asset=(0,s.L)(o),r.type="inline",r;r.correlation=g(c);const l=r.correlation?.performance.value||n.gm.performance?.getEntriesByType("resource")?.find(e=>b(e,c));if(l)E(r,l);else{(function(e){if(!e||!n.gm.document)return!1;try{const t=n.gm.document.querySelectorAll('link[rel="preload"][as="script"]');for(const r of t)if((0,s.L)(r.href)===e)return!0}catch(e){}return!1})(c)&&(r.asset=c,r.type="preload"),function(e,t){n.gm.PerformanceObserver?.supportedEntryTypes?.includes("resource")&&f.push({addedAt:(0,i.t)(),test:r=>!!b(r,t)&&(E(e,r),!0)})}(r,c)}const h=r.correlation,m=!!t&&!!h?.claimedBy.has(t);h&&t&&h.claimedBy.add(t);const y=()=>{const e=h?.script.start;if(!m||!e)return!1;return r.registeredAt-e>1e4};let w=0,R=0;p(r).recordManifestScriptWindow=(e,t)=>{e&&(w=w>0?Math.min(w,e):e),t&&(R=R>0?Math.max(R,t):t)},Object.defineProperty(r,"scriptStart",d(()=>{const e=y()?r.registeredAt:h?.script.start??r.fetchEnd;return w>0?Math.min(e,w):e})),Object.defineProperty(r,"scriptEnd",d(()=>{const e=y()?r.registeredAt:h?.script.end??r.registeredAt;return R>0?Math.max(e,R):e}))}catch(e){}return r}},5732(e,t,r){"use strict";r.d(t,{$5:()=>m,B5:()=>g,K6:()=>u,M$:()=>
5o,Ms:()=>d,NG:()=>c,Ux:()=>h,YA:()=>p,yx:()=>l});var n=r(5718),i=r(7560),s=r(9119),a=r(9232);function o(e){return e?.type===a.f.MFE}function c(e,t){if(!y(e,t))return;const r=t.runtime.registeredEntities;return r?.find(t=>t.metadata.target.iframeInterfaceId===e)}function d(e,t){if(!y(e,t))return[];const r=t.runtime.registeredEntities;return r?.filter(t=>String(t.metadata.target.id)===String(e)).map(e=>e.metadata.target)||[]}function u(e,t){if(!y(e,t))return[];const r=t.runtime.registeredEntities,n=(0,s.L)(e),a=r?.filter(t=>{const r=t.metadata.target?.manifest;return r?(0,i.j)(r,e,{scriptsOnly:!1}):!!t.metadata.timings?.asset&&(0,s.L)(t.metadata.timings.asset)===n});return f(a).map(e=>e.metadata.target)}function l(e,t){if(!y(e,t))return[];const r=t.runtime.registeredEntities,n=r?.filter(t=>{const r=t.metadata.target?.manifest;return r?(0,i.j)(r,e,{scriptsOnly:!0}):!!t.metadata.timings?.asset?.endsWith(e)});return f(n).map(e=>e.metadata.target)}function f(e){if(!e?.length)return e||[];const t=new Map,r=[];for(const n of e){const e=n.metadata?.timings?.asset;if(!e){r.push(n);continue}const i="".concat(e,"::").concat(n.metadata?.target?.id),s=t.get(i);if(s){if(s.metadata.target?.blocked&&!n.metadata.target?.blocked){const e=r.indexOf(s);-1!==e&&(r[e]=n),t.set(i,n)}}else t.set(i,n),r.push(n)}return r}function h(e,t){return v(t)?o(e)?e.attributes:t.agentRef.runtime.v2Target.attributes:{}}function p(e,t){return g(e,t)?{"child.id":e.id,"child.type":e.type,...h(void 0,t)}:{}}function g(e,t){return o(e)&&!!v(t)&&t.agentRef.init.api.register.duplicate_data_to_container}function m(e){if(!e?.runtime)return[];if(!y(!0,e)||!e.runtime.registeredEntities?.length)return[e.runtime.v2Target];const t=[];try{var r=(0,n.AZ)((0,n.QL)());let i=r.length-1;for(;r[i];)t.push(...l(r[i--],e))}catch(e){}const i=function(e){const t=new Set,r=[];for(const n of e){const e=n?.instance;t.has(e)||(t.add(e),r.push(n))}return r}(t);return i.length||i.push(e.runtime.v2Target),i}function v(e){return 2===e?.harvestEndpointVersion}function y(e,t){return!!e&&!!t?.init.api.register.enabled}},5289(e,t,r){"use strict";r.d(t,{GG:()=>a,Qr:()=>c,sB:()=>o});var n=r(3878),i=r(6389);function s(){return"undefined"==typeof document||"complete"===document.readyState}function a(e,t){if(s())return e();const r=(0,i.J)(e),a=setInterval(()=>{s()&&(clearInterval(a),r())},500);(0,n.sp)("load",r,t)}function o(e){if(s())return e();(0,n.DD)("DOMContentLoaded",e)}function c(e){if(s())return e();(0,n.sp)("popstate",e)}},384(e,t,r){"use strict";r.d(t,{Zm:()=>c,bQ:()=>u,dV:()=>d,pV:()=>l});var n=r(6154),i=r(1863),s=r(944),a=r(1910);const o={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net"};function c(){return n.gm.NREUM||(n.gm.NREUM={}),void 0===n.gm.newrelic&&(n.gm.newrelic=n.gm.NREUM),n.gm.NREUM}function d(){let e=c();return e.o||(e.o={ST:n.gm.setTimeout,SI:n.gm.setImmediate||n.gm.setInterval,CT:n.gm.clearTimeout,XHR:n.gm.XMLHttpRequest,REQ:n.gm.Request,EV:n.gm.Event,PR:n.gm.Promise,MO:n.gm.MutationObserver,FETCH:n.gm.fetch,WS:n.gm.WebSocket},(0,a.i)(...Object.values(e.o))),e}function u(e,t){let r=c();r.initializedAgents??={},t.initializedAt={ms:(0,i.t)(),date:new Date},r.initializedAgents[e]=t,2===Object.keys(r.initializedAgents).length&&(0,s.R)(69)}function l(){return function(){let e=c();const t=e.info||{};e.info={beacon:o.beacon,errorBeacon:o.errorBeacon,...t}}(),function(){let e=c();const t=e.init||{};e.init={...t}}(),d(),function(){let e=c();const t=e.loader_config||{};e.loader_config={...t}}(),c()}r.d(t,["NT",0,o])},2843(e,t,r){"use strict";r.d(t,{G:()=>s,u:()=>i});var n=r(3878);function i(e,t=!1,r,i){(0,n.DD)("visibilitychange",function(){if(t)return void("hidden"===document.visibilityState&&e());e(document.visibilityState)},r,i)}function s(e,t,r){(0,n.sp)("pagehide",e,t,r)}},8139(e,t,r){"use strict";r.d(t,{u:()=>f});var n=r(7836),i=r(3434),s=r(8990),a=r(6154);const o={},c=a.gm.XMLHttpRequest,d="addEventListener",u="removeEventListener",l="nr@wrapped:".concat(n.P);function f(e,t){var r=function(e){return(e||n.ee).get("events")}(e);if(o[r.debugId]++)return r;o[r.debugId]=1;var f=(0,i.YM)(r,!0,t);function p(e){f.inPlace(e,[d,u],"-",g)}function g(e,t){return e[1]}return"getPrototypeOf"in Object&&(a.RI&&h(document,p),c&&h(c.prototype,p),h(a.gm,p)),r.on(d+"-start",function(e,t){var r=e[1];if(null!==r&&("function"==typeof r||"object"==typeof r)&&"newrelic"!==e[0]){var n=(0,s.I)(r,l,function(){var e={object:function(){if("function"!=typeof r.handleEvent)return;return r.handleEvent.apply(r,arguments)},function:r}[typeof r];return e?f(e,"fn-",null,e.name||"anonymous"):r});this.wrapped=e[1]=n}}),r.on(u+"-start",function(e){e[1]=this.wrapped||e[1]}),r}function h(e,t,...r){let n=e;for(;"object"==typeof n&&!Object.prototype.hasOwnProperty.call(n,d);)n=Object.getPrototypeOf(n);n&&t(n,...r)}},3434(e,t,r){"use strict";r.d(t,{YM:()=>d});var n=r(7836),i=r(5607),s=r(5732);const a="nr@original:".concat(i.W);var o=Object.prototype.hasOwnProperty,c=!1;function d(e,t,r){return e||(e=n.ee),i.inPlace=function(e,t,r,n,s,a){r||(r="");const o="-"===r.charAt(0);for(let c=0;c<t.length;c++){const d=t[c],u=e[d];l(u)||(e[d]=i(u,o?d+r:r,n,d,s,a))}},i.flag=a,i;function i(t,n,i,c,f,h){return l(t)?t:(n||(n=""),nrWrapper[a]=t,function(e,t,r){if(Object.defineProperty&&Object.keys)try{return Object.keys(e).forEach(function(r){Object.defineProperty(t,r,{get:function(){return e[r]},set:function(t){return e[r]=t,t}})}),t}catch(e){u([e],r)}for(var n in e)o.call(e,n)&&(t[n]=e[n])}
5(t,nrWrapper,e),nrWrapper);function nrWrapper(){var a,o,l,p;let g,m;try{o=this,a=[...arguments],m=h?(0,s.$5)(r):[r?.runtime?.v2Target],l="function"==typeof i?i(a,o):i||{}}catch(t){u([t,"",[a,o,c],l],e)}d(n+"start",[a,o,c,m],l,f);const v=performance.now();let y;try{return p=t.apply(o,a),y=performance.now(),p}catch(e){throw y=performance.now(),d(n+"err",[a,o,e,m],l,f),g=e,g}finally{const e=y-v,t={start:v,end:y,duration:e,isLongTask:e>=50,methodName:c,thrownError:g};t.isLongTask&&d("long-task",[t,o,m],l,f),d(n+"end",[a,o,p,m],l,f)}}}function d(r,n,i,s){if(!c||t){var a=c;c=!0;try{e.emit(r,n,i,t,s)}catch(t){u([t,r,n,i],e)}c=a}}}function u(e,t){t||(t=n.ee);try{t.emit("internal-error",e)}catch(e){}}function l(e){return!(e&&"function"==typeof e&&e.apply&&!e[a])}r.d(t,["Jt",0,a])},9300(e,t,r){"use strict";const n=r(860).K7.ajax;r.d(t,["TZ",0,n,"f5",0,"ajaxRequest.id","mo",0,{NONE:"none",FAILURES:"failures",ALL:"all"}])},3333(e,t,r){"use strict";var n=r(981);const i=r(860).K7.genericEvents,s=[n.R.PA,n.R.UA,n.R.BP];r.d(t,["$v",0,{RESOURCES:"experimental.resources",REGISTER:"register"},"TZ",0,i,"Zp",0,["auxclick","click","copy","keydown","paste","scrollend"],"kd",0,s,"qN",0,["focus","blur"]])},6774(e,t,r){"use strict";const n=r(860).K7.jserrors;r.d(t,["T",0,n])},993(e,t,r){"use strict";const n=r(860).K7.logging;r.d(t,["A$",0,{OFF:0,ERROR:1,WARN:2,INFO:3,DEBUG:4,TRACE:5},"TZ",0,n,"p_",0,{ERROR:"ERROR",WARN:"WARN",INFO:"INFO",DEBUG:"DEBUG",TRACE:"TRACE"}])},3785(e,t,r){"use strict";r.d(t,{R:()=>c,b:()=>d});var n=r(9908),i=r(1863),s=r(860),a=r(3969),o=r(993);function c(e,t,r={},c=o.p_.INFO,d=!0,u,l=(0,i.t)()){(0,n.p)(a.xV,["API/logging/".concat(c.toLowerCase(),"/called")],void 0,s.K7.metrics,e),(0,n.p)("log",[l,t,r,c,d,u],void 0,s.K7.logging,e)}function d(e){return"string"==typeof e&&Object.values(o.p_).some(t=>t===e.toUpperCase().trim())}},3969(e,t,r){"use strict";const n=r(860).K7.metrics;r.d(t,["TZ",0,n,"XG",0,"storeEventMetrics","xV",0,"storeSupportabilityMetrics"])},6630(e,t,r){"use strict";const n=r(860).K7.pageViewEvent;r.d(t,["T",0,n])},782(e,t,r){"use strict";const n=r(860).K7.pageViewTiming;r.d(t,["T",0,n])},6344(e,t,r){"use strict";var n=r(2614);const i=r(860).K7.sessionReplay,s={[n.g.ERROR]:15e3,[n.g.FULL]:3e5,[n.g.OFF]:0}
5;r.d(t,["Qb",0,{API:"api",RESUME:"resume",SWITCH_TO_FULL:"switchToFull",INITIALIZE:"initialize",PRELOAD:"preload"},"TZ",0,i,"Vh",0,"errorDuringReplay","_s",0,{DomContentLoaded:0,Load:1,FullSnapshot:2,IncrementalSnapshot:3,Meta:4,Custom:5},"bc",0,{RESET:{message:"Session was reset",sm:"Reset"},IMPORT:{message:"Recorder failed to import",sm:"Import"},TOO_MANY:{message:"429: Too Many Requests",sm:"Too-Many"},TOO_BIG:{message:"Payload was too large",sm:"Too-Big"},CROSS_TAB:{message:"Session Entity was set to OFF on another tab",sm:"Cross-Tab"},ENTITLEMENTS:{message:"Session Replay is not allowed and will not be started",sm:"Entitlement"}},"yP",0,s])},5270(e,t,r){"use strict";r.d(t,{Aw:()=>a,SR:()=>s,rF:()=>o});var n=r(384),i=r(7767);function s(e){return!!(0,n.dV)().o.MO&&(0,i.V)(e)&&!0===e?.session_trace.enabled}function a(e){return!0===e?.session_replay.preload&&s(e)}function o(e,t){try{if("string"==typeof t?.type&&"password"===t.type.toLowerCase())return"*".repeat(e?.length||0);if(void 0!==t?.dataset?.nrUnmask||t?.classList?.contains("nr-unmask"))return e}catch(e){}return"string"==typeof e?e.replace(/[\S]/g,"*"):"*".repeat(e?.length||0)}},3738(e,t,r){"use strict";const n=r(860).K7.sessionTrace,i="-start",s="-end",a="fn"+i,o="fn"+s;r.d(t,["He",0,"bstResource","Kp",0,s,"Lc",0,o,"Rz",0,"pushState","TZ",0,n,"bD",0,"resource","bc",0,{CROSS_TAB:{message:"Session Entity was set to OFF on another tab"},ENTITLEMENTS:{message:"Session Trace is not allowed and will not be started"},RESET:{message:"Session was reset"},SESSION_CHANGED:{message:"Session identifier changed unexpectedly"}},"d3",0,i,"uP",0,a])},3962(e,t,r){"use strict";const n=r(860).K7.softNav;r.d(t,["O2",0,{INITIAL_PAGE_LOAD:"",ROUTE_CHANGE:1,UNSPECIFIED:2},"OV",0,"popstate","Qu",0,{INTERACTION:1,AJAX:2,CUSTOM_END:3,CUSTOM_TRACER:4},"TZ",0,n,"ih",0,{IP:"in progress",PF:"pending finish",FIN:"finished",CAN:"cancelled"},"pP",0,"initialPageLoad","tC",0,["click","keydown","submit"]])},4234(e,t,r){"use strict";r.d(t,{W:()=>i});var n=r(1687);class i{constructor(e,t){this.agentRef=e,this.ee=e?.ee,this.featureName=t,this.blocked=!1}deregisterDrain(){(0,n.x3)(this.agentRef,this.featureName)}}},7767(e,t,r){"use strict";var n=r(6154);r.d(t,["V",0,e=>n.RI&&!0===e?.privacy.cookies_enabled])},8362(e,t,r){"use strict";r.d(t,{d:()=>s});var n=r(9566),i=r(1741);class s extends i.W{agentIdentifier=(0,n.LA)(16)}},1741(e,t,r){"use strict";r.d(t,{W:()=>s});var n=r(944),i=r(4261);class s{#e(e,...t){if(this[e]!==s.prototype[e])return this[e](...t);(0,n.R)(35,e)}addPageAction(e,t){return this.#e(i.hG,e,t)}register(e){return this.#e(i.eY,e)}recordCustomEvent(e,t){return this.#e(i.fF,e,t)}setPageViewName(e,t){return this.#e(i.Fw,e,t)}setCustomAttribute(e,t,r){return this.#e(i.cD,e,t,r)}noticeError(e,t){return this.#e(i.o5,e,t)}setUserId(e,t=!1){return this.#e(i.Dl,e,t)}setApplicationVersion(e){return this.#e(i.nb,e)}setErrorHandler(e){return this.#e(i.bt,e)}addRelease(e,t){return this.#e(i.k6,e,t)}log(e,t){return this.#e("log",e,t)}start(){return this.#e("start")}finished(e){return this.#e(i.BL,e)}recordReplay(){return this.#e(i.CH)}pauseReplay(){return this.#e(i.Tb)}addToTrace(e){return this.#e(i.U2,e)}setCurrentRouteName(e){return this.#e(i.PA,e)}interaction(e){return this.#e(i.dT,e)}wrapLogger(e,t,r){return this.#e(i.Wb,e,t,r)}measure(e,t){return this.#e(i.V1,e,t)}consent(e){return this.#e(i.Pv,e)}}},4261(e,t,r){"use strict";r.d(t,["BL",0,"finished","CH",0,"recordReplay","Dl",0,"setUserId","Fw",0,"setPageViewName","PA",0,"setCurrentRouteName","Pv",0,"consent","Tb",0,"pauseReplay","U2",0,"addToTrace","V1",0,"measure","Wb",0,"wrapLogger","bt",0,"setErrorHandler","cD",0,"setCustomAttribute","dT",0,"interaction","eY",0,"register","fF",0,"recordCustomEvent","hG",0,"addPageAction","hw",0,"api-ixn-","k6",0,"addRelease","nb",0,"setApplicationVersion","o5",0,"noticeError"])},1738(e,t,r){"use strict";r.d(t,{U:()=>l,Y:()=>u});var n=r(3241),i=r(9908),s=r(1863),a=r(944),o=r(3969),c=r(8362),d=r(860);function u(e,t,r,s){const u=s||r;!u||u[e]&&u[e]!==c.d.prototype[e]||(u[e]=function(){(0,i.p)(o.xV,["API/"+e+"/called"],void 0,d.K7.metrics,r.ee),(0,n.W)({drained:!!r.runtime?.activatedFeatures,type:"data",name:"api",feature:"api-"+e,data:{}});try{return t.apply(this,arguments)}catch(e){(0,a.R)(23,e)}})}function l(e,t,r,n,a){const o=e.info;null===r?delete o.jsAttributes[t]:o.jsAttributes[t]=r,(a||null===r)&&(0,i.p)("api-"+n,[(0,s.t)(),t,r],void 0,"session",e.ee)}},8374(e,t,r){r.nc=(()=>{try{return document?.currentScript?.nonce}catch(e){}return""})()},860(e,t,r){"use strict";const n="events",i="jserrors",s="browser/blobs",a="browser/logs",o={ajax:"ajax",genericEvents:"generic_events",jserrors:i,logging:"logging",metrics:"metrics",pageAction:"page_action",pageViewEvent:"page_view_event",pageViewTiming:"page_view_timing",sessionReplay:"session_replay",sessionTrace:"session_trace",softNav:"soft_navigations"},c={[o.pageViewEvent]:1,[o.pageViewTiming]:2,[o.metrics]:3,[o.jserrors]:4,[o.softNav]:5,[o.ajax]:6,[o.sessionTrace]:7,[o.sessionReplay]:8,[o.logging]:9,[o.genericEvents]:10},d={[o.pageViewEvent]:"rum",[o.pageViewTiming]:n,[o.ajax]:n,[o.softNav]:n,[o.metrics]:i,[o.jserrors]:i,[o.sessionTrace]:s,[o.sessionReplay]:s,[o.logging]:a,[o.genericEvents]:"ins"};r.d(t,["$J",0,d,"K7",0,o,"P3",0,c,"XX",0,i,"Yy",0,a,"df",0,s,"hg",0,"connect"])}};const t={};function r(n){const i=t[n];if(void 0!==i)return i.exports;const s=t[n]={exports:{}};return e[n](s,s.exports,r),s.exports}r.m=e,r.d=(e,t)=>{if(Array.isArray(t))for(var n=0;n<t.length;){var i=t[n++],s=t[n++];r.o(e,i)?0===s&&n++:0===s?Object.defineProperty(e,i,{enumerable:!0,value:t[n++]}):Object.defineProperty(e,i,{enumerable:!0,get:s})}else for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((t,n)=>(r.f[n](e,t),t),[])),r.u=e=>({212:"nr-spa-compressor",238:"nr-spa-iframe-message-handler",249:"nr-spa-recorder",478:"nr-spa"}[e]+"-1.322.0.min.js"),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{const e={},t="NRBA-1.322.0.PROD:";r.l=(n,i,s,a)=>
5{if(e[n])return void e[n].push(i);let o,c;if(void 0!==s){const e=document.getElementsByTagName("script");for(var d=0;d<e.length;d++){const r=e[d];if(r.getAttribute("src")==n||r.getAttribute("data-webpack")==t+s){o=r;break}}}if(!o){c=!0;var u={478:"sha512-SARROoir04gFygxlr/+mTI+PyMeFL+epi1vnUA2G5mTQ7s3G44ItQBJKbOaIMdIE5OBzuaKhb4k5JYta0NICxg==",249:"sha512-6DKQo5WP7YlpzX6l9UfYkgGLGK2oITdoaYTcZtgl5Foa22NY63lED/0z1hBBLeD7qZCz/YdlY19/r8drlol1tg==",212:"sha512-CYxuvSpDx6ErqWJwAvpoHn54eY37YdMcFao/axOumlw3BsSL7yioOeB2LWViY/Njs818sQG10dSglUhYCMfLPw==",238:"sha512-mvbMILWa3ohYst+u6TLfNrmtY2swUIB3rbJFN/uzt3W62KhgvUVwB81UEZ1R0/it5bfrQ5EVz864pi/CAmucNQ=="};o=document.createElement("script"),o.charset="utf-8",r.nc&&o.setAttribute("nonce",r.nc),o.setAttribute("data-webpack",t+s),o.src=n,0!==o.src.indexOf(window.location.origin+"/")&&(o.crossOrigin="anonymous"),u[a]&&(o.integrity=u[a])}e[n]=[i];const l=(t,r)=>{o.onerror=o.onload=null,clearTimeout(f);const i=e[n];if(delete e[n],o.parentNode?.removeChild(o),i?.forEach(e=>e(r)),t)return t(r)},f=setTimeout(l.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=l.bind(null,o.onerror),o.onload=l.bind(null,o.onload),c&&document.head.appendChild(o)}})(),r.r=e=>{Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="https://js-agent.newrelic.com/",(()=>{const e={38:0,788:0};r.f.j=(t,n)=>{let i=r.o(e,t)?e[t]:void 0;if(0!==i)if(i)n.push(i[2]);else{const s=new Promise((r,n)=>i=e[t]=[r,n]);n.push(i[2]=s);const a=r.p+r.u(t),o=new Error,c=n=>{if(r.o(e,t)&&(i=e[t],0!==i&&(e[t]=void 0),i)){const e=n&&("load"===n.type?"missing":n.type),r=n&&n.target&&n.target.src;o.message="Loading chunk "+t+" failed: ("+e+": "+r+")",o.name="ChunkLoadError",o.type=e,o.request=r,i[1](o)}};r.l(a,c,"chunk-"+t,t)}};const t=(t,n)=>{let[i,s,a]=n;var o,c,d=0;if(i.some(t=>0!==e[t])){for(o in s)r.o(s,o)&&(r.m[o]=s[o]);if(a)a(r)}for(t&&t(n);d<i.length;d++)c=i[d],r.o(e,c)&&e[c]&&e[c][0](),e[c]=0},n=self["webpackChunk:NRBA-1.322.0.PROD"]=self["webpackChunk:NRBA-1.322.0.PROD"]||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})(),(()=>{"use strict";r(8374);var e=r(8362),t=r(860);const n=Object.values(t.K7);var i=r(384),s=r(1741);var a=r(2555),o=r(3333),c=r(9300);const d=e=>{if(!e||"string"!=typeof e)return!1;try{document.createDocumentFragment().querySelector(e)}catch{return!1}return!0};var u=r(2614),l=r(944),f=r(8122);const h="[data-nr-mask]",p=e=>(0,f.a)(e,(()=>{const e={feature_flags:[],experimental:{register:!1,resources:!1,iframe_bridge:!1,iframe_domains:[]},mask_selector:"*",block_selector:"[data-nr-block]",mask_input_options:{color:!1,date:!1,"datetime-local":!1,email:!1,month:!1,number:!1,range:!1,search:!1,tel:!1,text:!1,time:!1,url:!1,week:!1,textarea:!1,select:!1,password:!0}};return{ajax:{deny_list:void 0,block_internal:!0,enabled:!0,autoStart:!0,capture_payloads:c.mo.NONE},api:{register:{get enabled(){return e.feature_flags.includes(o.$v.REGISTER)||e.experimental.register},set enabled(t){e.experimental.register=t},duplicate_data_to_container:!1,get allow_iframe_bridge(){return e.feature_flags.includes(o.$v.IFRAME_BRIDGE)||e.experimental.iframe_bridge},set allow_iframe_bridge(t){e.experimental.iframe_bridge=t},get iframe_domains(){return e.experimental.iframe_domains},set iframe_domains(t){Array.isArray(t)?e.experimental.iframe_domains=t:(0,l.R)(1,t)}}},browser_consent_mode:{enabled:!1},distributed_tracing:{enabled:void 0,exclude_newrelic_header:void 0,cors_use_newrelic_header:void 0,cors_use_tracecontext_headers:void 0,allowed_origins:void 0},get feature_flags(){return e.feature_flags},set feature_flags(t){e.feature_flags=t},generic_events:{enabled:!0,autoStart:!0},harvest:{interval:30},jserrors:{enabled:!0,autoStart:!0},logging:{enabled:!0,autoStart:!0},metrics:{enabled:!0,autoStart:!0},obfuscate:void 0,page_action:{enabled:!0},page_view_event:{enabled:!0,autoStart:!0},page_view_timing:{enabled:!0,autoStart:!0},performance:{capture_marks:!1,capture_measures:!1,capture_detail:!0,resources:{get enabled(){return e.feature_flags.includes(o.$v.RESOURCES)||e.experimental.resources},set enabled(t){e.experimental.resources=t},asset_types:[],first_party_domains:[],ignore_newrelic:!0}},privacy:{cookies_enabled:!0},proxy:{assets:void 0,beacon:void 0},session:{expiresMs:u.wk,inactiveMs:u.BB},session_replay:{autoStart:!0,enabled:!1,preload:!1,sampling_rate:10,error_sampling_rate:100,collect_fonts:!1,inl
5ine_images:!1,fix_stylesheets:!0,mask_all_inputs:!0,get mask_text_selector(){return e.mask_selector},set mask_text_selector(t){d(t)?e.mask_selector="".concat(t,",").concat(h):""===t||null===t?e.mask_selector=h:(0,l.R)(5,t)},get block_class(){return"nr-block"},get ignore_class(){return"nr-ignore"},get mask_text_class(){return"nr-mask"},get block_selector(){return e.block_selector},set block_selector(t){d(t)?e.block_selector+=",".concat(t):""!==t&&(0,l.R)(6,t)},get mask_input_options(){return e.mask_input_options},set mask_input_options(t){t&&"object"==typeof t?e.mask_input_options={...t,password:!0}:(0,l.R)(7,t)}},session_trace:{enabled:!0,autoStart:!0},soft_navigations:{enabled:!0,autoStart:!0},ssl:void 0,user_actions:{enabled:!0,elementAttributes:["id","className","tagName","type"]},web_sockets:{enabled:!1}}})());var g=r(6154),m=r(9324);let v=0;const y={buildEnv:"PROD",distMethod:"CDN",version:m.x,originTime:g.WN},b={consented:!1},E={activatedFeatures:void 0,appMetadata:{},configured:!1,get consented(){return this.session?.state?.consent||b.consented},set consented(e){b.consented=e},customTransaction:void 0,denyList:[],disabled:!1,drainRegistry:new Map,connector:void 0,harvester:void 0,v2Target:void 0,isolatedBacklog:!1,isRecording:!1,loaderType:void 0,maxBytes:3e4,obfuscator:void 0,onerror:void 0,ptid:void 0,releaseIds:{},session:void 0,timeKeeper:void 0,registeredEntities:[],jsAttributesMetadata:{bytes:0},get harvestCount(){return++v},listeningForIframeMessages:!1};var w=r(9232);var R=r(7836),T=r(3241);const A={accountID:void 0,trustKey:void 0,agentID:void 0,licenseKey:void 0,applicationID:void 0,xpid:void 0};var S=r(9908),x=r(9752);function O(e,t={},n,o){let{init:c,info:d,loader_config:u,runtime:l={},exposed:h=!0}=t;if(!d){const e=(0,i.pV)();c=e.init,d=e.info,u=e.loader_config}var m;e.init=p(c||{}),e.loader_config=(m=u||{},(0,f.a)(m,A)),d.jsAttributes??={},g.bv&&(d.jsAttributes.isWorker=!0),e.info=(0,a.D)(d);const v=e.init;e.runtime??=(e=>{const t=(0,f.a)(e,E),r=Object.keys(y).reduce((e,t)=>(e[t]={value:y[t],writable:!1,configurable:!0,enumerable:!0},e),{});return Object.defineProperties(t,r)})(l),e.runtime.v2Target??={type:w.f.BA,instance:e.agentIdentifier,get id(){return e.runtime.appMetadata?.agents?.[0]?.entityGuid},get attributes(){return{"entity.guid":this.id,appId:e.info.applicationID}}},v.proxy.assets&&(e=>{const t=e.startsWith("http");e+="/",r.p=t?e:"https://"+e})(v.proxy.assets),e.runtime.configured||(Object.defineProperty(e,"beacons",{get:()=>[e.info.beacon,e.info.errorBeacon,e.init.proxy.assets,e.init.proxy.beacon].filter(Boolean)}),Object.defineProperty(e.runtime,"denyList",{get:()=>[...e.init.ajax.deny_list||[],...e.init.ajax.block_internal?e.beacons:[]]}),e.runtime.ptid=e.agentIdentifier,function(e){const t=(0,i.pV)();Object.getOwnPropertyNames(s.W.prototype).forEach(r=>{const n=s.W.prototype[r];if("function"!=typeof n||"constructor"===n)return;let i=t[r];e[r]&&!1!==e.exposed&&"micro-agent"!==e.runtime?.loaderType&&(t[r]=(...t)=>{const n=e[r](...t);return i?i(...t):n})})}(e),e.runtime.loaderType=n,e.ee=R.ee.get(e.agentIdentifier),e.exposed=h,(0,T.W)({drained:!!e.runtime.activatedFeatures,type:"lifecycle",name:"initialize",feature:void 0,data:e.config}),e.init.api.register.allow_iframe_bridge&&g.gm.addEventListener("message",t=>{"string"==typeof t.data?.type&&t.data.type.startsWith(x.Pl)&&(0,S.p)("iframe-message",[t],void 0,"IFRAME",e.ee)}),e.runtime.configured=!0)}var _=r(1863),k=r(4261),N=r(1738);var L=r(1687),M=r(4234),P=r(5289),I=r(5270),j=r(7767),C=r(6389),D=r(7699);const B=new WeakSet,H=new WeakMap;class W extends M.W{constructor(e,t){super(e,t),this.abortHandler=void 0,this.featAggregate=void 0,this.loadedSuccessfully=void 0,this.onAggregateImported=new Promise(e=>{this.loadedSuccessfully=e}),this.deferred=Promise.resolve(),!1===e.init[this.featureName].autoStart?this.deferred=new Promise((t,r)=>{this.ee.on("manual-start-all",(0,C.J)(()=>{(0,L.Ak)(e,this.featureName),t()}))}):(0,L.Ak)(e,t)}importAggregator(e,t,n={}){if(this.featAggregate)return;const i=async()=>{if(await this.deferred,this.#t(e),!(0,a.f)(e.info))return(0,l.R)(43),e.ee.abort(),void this.loadedSuccessfully(!1);try{await async function(e,t,n){if(H.has(e))return H.get(e);const i=(async()=>
5{if((0,j.V)(e.init))try{const{setupAgentSession:t}=await r.e(478).then(r.bind(r,8766));t(e)}catch(e){(0,l.R)(20,e),t.emit("internal-error",[e]),(0,S.p)(D.qh,[e],void 0,n,t)}if(e.init.api.register.allow_iframe_bridge)try{const{setupIframeMFEMessageListener:t}=await r.e(238).then(r.bind(r,6417));t(e)}catch(e){(0,l.R)(23,e)}const[{Connector:i},{Harvester:s}]=await Promise.all([r.e(478).then(r.bind(r,6589)),r.e(478).then(r.bind(r,5237))]);e.runtime.connector=new i(e),e.runtime.harvester=new s(e);const a=Object.values(e.features).filter(t=>e.runtime.drainRegistry.has(t.featureName));Promise.all(a.map(e=>e.onAggregateImported)).then(()=>e.runtime.harvester.startTimer())})();H.set(e,i),await i}(e,this.ee,this.featureName)}catch(e){return(0,l.R)(79,e),this.ee.abort(),void this.loadedSuccessfully(!1)}try{if(!this.#r(this.featureName,e.runtime.session,e.init))return this.abortHandler?.(),(0,L.Ze)(this.agentRef,this.featureName),void this.loadedSuccessfully(!1);const{Aggregate:r}=await t();this.featAggregate=new r(e,n),e.runtime.harvester.initializedAggregates.push(this.featAggregate),this.loadedSuccessfully(!0)}catch(e){(0,l.R)(34,e),this.abortHandler?.(),(0,L.Ze)(this.agentRef,this.featureName,!0),this.loadedSuccessfully(!1)}};g.RI?(0,P.GG)(()=>i(),!0):i()}#r(e,r,n){if(this.blocked)return!1;switch(e){case t.K7.sessionReplay:return(0,I.SR)(n)&&!!r;case t.K7.sessionTrace:return!!r;default:return!0}}#t(e){if(!B.has(e)&&(B.add(e),!(0,a.f)(e.info))){const t=(0,i.pV)();let r={...t.info?.jsAttributes};try{r={...r,...e.info?.jsAttributes}}catch(e){}O(e,{...t,info:{...t.info,jsAttributes:r},runtime:e.runtime},e.runtime.loaderType)}}}var U=r(6630);class K extends W{static featureName=U.T;constructor(e){var t;super(e,U.T),this.setupInspectionEvents(),t=e,(0,N.Y)(k.Fw,function(e,r){"string"==typeof e&&("/"!==e.charAt(0)&&(e="/"+e),t.runtime.customTransaction=(r||"http://custom.transaction")+e,(0,S.p)("api-"+k.Fw,[(0,_.t)()],void 0,void 0,t.ee))},t),this.importAggregator(e,()=>e.init.feature_flags.includes("rum_v2")?r.e(478).then(r.bind(r,908)):r.e(478).then(r.bind(r,7927)))}setupInspectionEvents(){const e=(e,t)=>{e&&(0,T.W)({timeStamp:e.timeStamp,loaded:"complete"===e.target.readyState,type:"window",name:t,data:e.target.location+""})};(0,P.sB)(t=>{e(t,"DOMContentLoaded")}),(0,P.GG)(t=>{e(t,"load")}),(0,P.Qr)(t=>{e(t,"navigate")}),this.ee.on(u.tS.UPDATE,(e,t)=>{(0,T.W)({type:"lifecycle",name:"session",data:t})})}}class F extends e.d{constructor(e){var t;(super(),g.gm)?(this.features={},(0,i.bQ)(this.agentIdentifier,this),this.desiredFeatures=new Set(e.features||[]),this.desiredFeatures.add(K),O(this,e,e.loaderType||"agent"),t=this,(0,N.Y)(k.cD,function(e,r,n=!1){if("string"==typeof e){if(["string","number","boolean"].includes(typeof r)||null===r)return(0,N.U)(t,e,r,k.cD,n);(0,l.R)(40,typeof r)}else(0,l.R)(39,typeof e)},t),function(e){(0,N.Y)(k.Dl,function(t,r=!1){if("string"!=typeof t&&null!==t)return void(0,l.R)(41,typeof t);const n=e.info.jsAttributes["enduser.id"];r&&null!=n&&n!==t?(0,S.p)("api-setUserIdAndResetSession",[t],void 0,"session",e.ee):(0,N.U)(e,"enduser.id",t,k.Dl,!0)},e)}(this),function(e){(0,N.Y)(k.nb,function(t){if("string"==typeof t||null===t)return(0,N.U)(e,"application.version",t,k.nb,!1);(0,l.R)(42,typeof t)},e)}(this),function(e){(0,N.Y)("start",function(){e.ee.emit("manual-start-all")},e)}(this),function(e){(0,N.Y)(k.Pv,function(t=!0){if("boolean"==typeof t){if((0,S.p)("api-"+k.Pv,[t],void 0,"session",e.ee),e.runtime.consented=t,t){const t=e.features.page_view_event;t.onAggregateImported.then(e=>{const r=t.featAggregate;e&&!r.sentRum&&r.sendRum?.()})}}else(0,l.R)(65,typeof t)},e)}(this),this.run()):(0,l.R)(21)}get config(){return{info:this.info,init:this.init,loader_config:this.loader_config,runtime:this.runtime}}get api(){return this}run(){try{const e=function(e){const t={};return n.forEach(r=>{t[r]=!!e[r]?.enabled}),t}(this.init),r=[...this.desiredFeatures],i=this.init.feature_flags.includes("rum_v2");r.sort((e,r)=>t.P3[e.featureName]-t.P3[r.featureName]),r.forEach(r=>{if(!e[r.featureName]&&(i||r.featureName!==t.K7.pageViewEvent))return;const n=function(e){switch(e){case t.K7.ajax:return[t.K7.jserrors];case t.K7.sessionTrace:return[t.K7.ajax,t.K7.pageViewEvent];case t.K7.sessionReplay:return[t.K7.sessionTrace];case t.K7.pageViewTiming:return[t.K7.pageViewEvent];default:return[]}}(r.featureName).filter(e=>!(e in this.features));n.length>0&&(0,l.R)(36,{targetFeature:r.featureName,missingDependencies:n}),this.features[r.featureName]=new r(this)})}catch(e){(0,l.R)(22,e);for(const e in this.features)this.features[e].abortHandler?.();const t=(0,i.Zm)();delete t.initializedAgents[this.agentIdentifier]?.features,delete this.sharedAggregator;return t.ee.get(this.agentIdentifier).abort(),!1}}}var V=r(2843),z=r(782);class G extends W{static featureName=z.T;constructor(e){super(e,z.T),g.RI&&((0,V.u)(()=>(0,S.p)("docHidden",[(0,_.t)()],void 0,z.T,this.ee),!0),(0,V.G)(()=>(0,S.p)("winPagehide",[(0,_.t)()],void 0,z.T,this.ee)),this.importAggregator(e,()=>r.e(478).then(r.bind(r,9917))))}}var q=r(3969);class Y extends W{static featureName=q.TZ;constructor(e){super(e,q.TZ),this.importAggregator(e,()=>r.e(478).then(r.bind(r,6555)))}}var Z=r(6774),J=r(3878),X=r(3304);class Q{constructor(e,t,r,n,i){this.name="UncaughtError",this.message="string"==typeof e?e:(0,X.A)(e),this.sourceURL=t,this.line=r,this.column=n,this.__newrelic=i}}function ee(e){return ne(e)?e:new Q(void 0!==e?.message?e.message:e,e?.filename||e?.sourceURL,e?.lineno||e?.line,e?.colno||e?.col,e?.__newrelic,e?.cause)}function te(e){const t="Unhandled Promise Rejection: ";if(!e?.reason)return;if(ne(e.reason)){try{e.reason.message.startsWith(t)||(e.reason.message=t+e.reason.message)}catch(e){}return ee(e.reason)}const r=ee(e.reason);return(r.message||"").startsWith(t)||(r.message=t+r.message),r}function re(e){if(e.error instanceof SyntaxError&&!/:\d+$/.test(e.error.stack?.trim())){const t=new Q(e.message,e.filename,e.lineno,e.colno,e.error.__newrelic,e.cause);return t.name=SyntaxError.name,t}return ne(e.error)?e.error:ee(e)}function ne(e){return e instanceof Error&&!!e.stack}function ie(e,r,n,i,s=(0,_.t)()){"string"==typeof e&&(e=new Error(e)),(0,S.p)("err",[e,s,!1,r,n.runtime.isRecording,void 0,i],void 0,t.K7.jserrors,n.ee),(0,S.p)("uaErr",[],void 0,t.K7.genericEvents,n.ee)}var se=r(993),ae=r(3785);function oe(e,{customAttributes:t={},level:r=se.p_.INFO}={},n,i,s=(0,_.t)()){(0,ae.R)(n.ee,e,t,r,!1,i,s)}function ce(e,r,n,i,s=(0,_.t)()){(0,S.p)("api-"+k.hG,[s,e,r,i],void 0,t.K7.genericEvents,n.ee)}function de(e,r,n,i,s=(0,_.t)()){const{start:a,end:o,customAttributes:c}=r||{},d={customAttributes:c||{}};if("object"!=typeof d.customAttributes||"string"!=typeof e||0===e.length)return void(0,l.R)(57);const u=(e,t)=>
5null==e?t:"number"==typeof e?e:e instanceof PerformanceMark?e.startTime:Number.NaN;if(d.start=u(a,0),d.end=u(o,s),Number.isNaN(d.start)||Number.isNaN(d.end))(0,l.R)(57);else{if(d.duration=d.end-d.start,!(d.duration<0))return(0,S.p)("api-"+k.V1,[d,e,i],void 0,t.K7.genericEvents,n.ee),d;(0,l.R)(58)}}function ue(e,r={},n,i,s=(0,_.t)()){(0,S.p)("api-"+k.fF,[s,e,r,i],void 0,t.K7.genericEvents,n.ee)}var le=r(5718);const fe=(e,t)=>e?.nrMfeId===t.id&&(!e?.nrMfeObserved||e?.nrMfeObserved===t.instance),he=e=>{try{return g.gm.CSS.escape(e)}catch(t){return e}},pe=(e,t={})=>{const r=t.id,n=t.instance;if(!e||!r||!n)return!1;try{let r=1===e.nodeType?e:e.parentElement;for(;r?.tagName;){if(fe(r.dataset,t))return r.dataset.nrMfeObserved=n,!0;r=r.parentNode}}catch(e){}return!1},ge=(e,t)=>{const r=g.gm.document?.querySelectorAll('[data-nr-mfe-id="'.concat(he(e.id),'"]')),n=(Array.from(r)||[]).find(t=>fe(t.dataset,e));let i=!!n;i&&(n.dataset.nrMfeObserved??=e.instance);const s=new g.gm.MutationObserver(r=>{r.forEach(r=>{r.addedNodes.forEach(r=>{const n=1===r.nodeType?r:null;!i&&fe(n?.dataset,e)&&(s.disconnect(),s.observe(n,{childList:!0,subtree:!0}),i=!0,n.dataset.nrMfeObserved=e.instance),(e=>{try{return e?.textContent?.trim()||["img","video","canvas","svg"].includes(e?.nodeName?.toLowerCase())}catch(e){return!1}})(r)&&(i||pe(r,e))&&t(r,s)})})});return s.observe(n||g.gm.document,{childList:!0,subtree:!0}),s},me=(e,t,r)=>{try{const n=new g.gm.PerformanceObserver(e=>{e.getEntries().forEach(r)});return n.observe(t),e.push(n),n}catch(e){return null}};function ve(e,t){let r,n,i=!1;const s=e=>null==e?e:e-(t?.scriptStart||t?.registeredAt||0),a={fcp:{get value(){const e=s(r);return e>1e4?void 0:e},set value(e){i||(r=e)}},lcp:{get value(){if(void 0!==a.fcp.value)return s(n)},set value(e){i||(n=e)}},cls:{value:void 0},inp:{value:void 0},disconnect:()=>{}};if(!(e&&g.RI&&g.gm.MutationObserver&&g.gm.PerformanceObserver))return a;const o=[];setTimeout(()=>{r||a.disconnect()},1e4);const c=()=>{if(!i){if(null==r){const e=(0,_.t)();if(s(e)>1e4)return void a.disconnect();r=e}n??=(0,_.t)(),a.cls.value??=0}},d=ge(e,(e,t)=>{c(),t.disconnect()});o.push(d);let u=0,l=null;const f=new Set;try{l=new g.gm.ResizeObserver(e=>{i||e.forEach(e=>{try{const t=e.contentRect.width*e.contentRect.height;t>u&&(u=t,a.lcp.value=(0,_.t)()),l.unobserve(e.target)}catch(e){}})})}catch(e){}const h=ge(e,e=>{if(c(),l)try{const t=1===e.nodeType?e:e.parentElement;t&&!f.has(t)&&(f.add(t),"IMG"===t.tagName?t.complete?l.observe(t):t.addEventListener("load",()=>{l.observe(t)},{once:!0}):"VIDEO"===t.tagName?t.readyState>=2?l.observe(t):t.addEventListener("loadeddata",()=>{l.observe(t)},{once:!0}):l.observe(t))}catch(e){}});l&&o.push(l),o.push(h),me(o,{type:"layout-shift",buffered:!0},t=>{i||t.hadRecentInput||(t.sources||[]).some(r=>!!pe(r.node,e)&&(c(),a.cls.value+=t.value,!0))}),me(o,{type:"event",buffered:!0,durationThreshold:40},t=>{!i&&t.interactionId&&pe(t.target,e)&&(void 0===a.inp.value||t.duration>a.inp.value)&&(c(),a.inp.value=t.duration)});const p=["pointerdown","keydown"],m=()=>{p.forEach(e=>{g.gm.removeEventListener(e,v,{passive:!0})})};a.disconnect=()=>{i=!0,o.forEach(e=>{try{e?.disconnect()}catch(e){}}),m(),["visibilitychange","pagehide"].forEach(e=>{g.gm.removeEventListener(e,a.disconnect,{once:!0,passive:!0})})};const v=t=>{pe(t?.target,e)&&((()=>{try{h?.disconnect(),l?.disconnect()}catch(e){}})(),m())};p.forEach(e=>{g.gm.addEventListener(e,v,{passive:!0})}),["visibilitychange","pagehide"].forEach(e=>{g.gm.addEventListener(e,a.disconnect,{once:!0,passive:!0})});const y=g.gm.document?.querySelectorAll('[data-nr-mfe-id="'.concat(he(e.id),'"]'));return Array.from(y||[]).some(t=>fe(t.dataset,e))&&c(),a}var ye=r(9566),be=r(7560),Ee=r(9119);const we=["entry","scripts","all"],Re=["name","id","type"],Te=new Map([[ce,"addPageAction"],[oe,"log"],[de,"measure"],[ie,"noticeError"],[ue,"recordCustomEvent"]]),Ae={experimental:(0,C.J)(()=>(0,l.R)(54,"newrelic.register")),disabled:(0,C.J)(()=>(0,l.R)(55)),invalidTarget:(0,C.J)(e=>(0,l.R)(48,e)),deregistered:(0,C.J)(()=>(0,l.R)(68)),invalidTimingMethod:(0,C.J)(e=>(0,l.R)(80,e)),duplicateName:(0,C.J)(e=>(0,l.R)(81,e)),duplicateId:(0,C.J)(e=>(0,l.R)(82,e))};function Se(e){(0,N.Y)(k.eY,function(t){return xe(e,t)},e)}function xe(e,r){Ae.experimental(),r||={},r.instance=(0,ye.LA)(8),r.type=w.f.MFE,r.licenseKey||=e.info.licenseKey,r.blocked=!1,("object"!=typeof r.tags||null===r.tags||Array.isArray(r.tags))&&(r.tags={}),r.parent??={get id(){return e.runtime.appMetadata.agents?.[0].entityGuid},type:w.f.BA},r.manifest=(0,be.N)(r.manifest),void 0===r.timingMethod||we.includes(r.timingMethod)||(Ae.invali
5dTimingMethod(r.timingMethod),r.timingMethod=void 0);const n=(0,le.Qr)(r);r.manifest&&(0,le.xo)(n,r);const i=ve(r,n),s=(0,Ee.L)(""+location),a={};Object.prototype.hasOwnProperty.call(r,"attributes")||Object.defineProperty(r,"attributes",{get:()=>({...a,"source.id":r.id,"source.name":r.name,"source.type":r.type,"parent.type":r.parent?.type||w.f.BA,"parent.id":r.parent?.id})}),Object.entries(r.tags).forEach(([e,t])=>{Re.includes(e)||(a["source.".concat(e)]=t)});let o=()=>{};const c=e.runtime.registeredEntities,d=e=>{r.blocked=!0,o=e};function u(e){return"string"==typeof e&&!!e.trim()&&e.trim().length<501}e.init.api.register.enabled||d(Ae.disabled),u(r.id)&&u(r.name)||d(()=>Ae.invalidTarget(r)),c.forEach(e=>{try{const{name:t,id:n}=e.metadata.target;t===r.name&&n!==r.id&&Ae.duplicateName(r),n===r.id&&t!==r.name&&Ae.duplicateId(r)}catch(e){}});const f={addPageAction:(t,n={})=>m(ce,[t,{...a,...n},e],r),deregister:()=>{p(),d(Ae.deregistered)},log:(t,n={})=>m(oe,[t,{...n,customAttributes:{...a,...n.customAttributes||{}}},e],r),measure:(t,n={})=>m(de,[t,{...n,customAttributes:{...a,...n.customAttributes||{}}},e],r),noticeError:(t,n={})=>m(ie,[t,{...a,...n},e],r),recordCustomEvent:(t,n={})=>m(ue,[t,{...a,...n},e],r),setApplicationVersion:e=>g("application.version",e),setCustomAttribute:(e,t)=>g(e,t),setUserId:e=>g("enduser.id",e),metadata:{get customAttributes(){return a},target:r,timings:n,vitals:i,events:{latestTimestamp:void 0}}},h=()=>(r.blocked&&o(),r.blocked);function p(){if(n.reportedAt)return;n.reportedAt=(0,_.t)(),i.disconnect(),n.fcp=i.fcp,n.lcp=i.lcp,n.cls=i.cls,n.inp=i.inp;const e=n.fetchEnd-n.fetchStart,t=n.scriptEnd-n.scriptStart,r={assetUrl:n.asset,assetType:n.type,registerUrl:s,deregisterUrl:(0,Ee.L)(""+location),pageUrl:void 0,currentUrl:void 0,timeAlive:n.reportedAt-n.registeredAt,timeToBeRequested:n.fetchStart,timeToExecute:t,timeToFetch:e,timeToLoad:e+t,t
5imeToRegister:n.registeredAt,totalWeight:n.totalWeight,...void 0!==n.renderBlocking&&{renderBlocking:n.renderBlocking},...i.fcp.value>=0&&{"vitals.fcp.value":i.fcp.value},...i.lcp.value>=0&&{"vitals.lcp.value":i.lcp.value},...i.cls.value>=0&&{"vitals.cls.value":i.cls.value},...i.inp.value>=0&&{"vitals.inp.value":i.inp.value}};f.recordCustomEvent("MicroFrontEndTiming",r)}h()||(c.push(f),(0,V.G)(p));const g=(e,t)=>{h()||(a[e]=t)},m=(r,n,i)=>{if(h()&&r!==xe)return;const s=f.metadata.events.latestTimestamp??(0,_.t)();f.metadata.events.latestTimestamp=void 0;const a=Te.get(r)||"unknown";(0,S.p)(q.xV,["API/register/".concat(a,"/called")],void 0,t.K7.metrics,e.ee);try{return r(...n,i,s)}catch(e){(0,l.R)(50,e)}};return f}class Oe extends W{static featureName=Z.T;constructor(e){var t;super(e,Z.T),t=e,(0,N.Y)(k.o5,(e,r)=>ie(e,r,t),t),function(e){(0,N.Y)(k.bt,function(t){e.runtime.onerror=t},e)}(e),function(e){let t=0;(0,N.Y)(k.k6,function(e,r){++t>10||(this.runtime.releaseIds[e.slice(-200)]=(""+r).slice(-200))},e)}(e),Se(e);try{this.removeOnAbort=new AbortController}catch(e){}this.ee.on("internal-error",(t,r)=>{this.abortHandler&&(0,S.p)("ierr",[ee(t),(0,_.t)(),!0,{},e.runtime.isRecording,r],void 0,this.featureName,this.ee)}),g.gm.addEventListener("unhandledrejection",t=>{this.abortHandler&&(0,S.p)("err",[te(t),(0,_.t)(),!1,{unhandledPromiseRejection:1},e.runtime.isRecording],void 0,this.featureName,this.ee)},(0,J.jT)(!1,this.removeOnAbort?.signal)),g.gm.addEventListener("error",t=>{this.abortHandler&&(0,S.p)("err",[re(t),(0,_.t)(),!1,{},e.runtime.isRecording],void 0,this.featureName,this.ee)},(0,J.jT)(!1,this.removeOnAbort?.signal)),this.abortHandler=this.#n,this.importAggregator(e,()=>r.e(478).then(r.bind(r,9377)))}#n(){this.removeOnAbort?.abort(),this.abortHandler=void 0}}var _e=r(8990);let ke=1;function Ne(e){const t=typeof e;return!e||"object"!==t&&"function"!==t?-1:e===g.gm?0:(0,_e.I)(e,"nr@id",function(){return ke++})}function Le(e){if("string"==typeof e)return e.length;if("object"==typeof e){if("undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer&&e.byteLength)return e.byteLength;if("undefined"!=typeof Blob&&e instanceof Blob&&e.size)return e.size;if(!("undefined"!=typeof FormData&&e instanceof FormData))try{return(0,X.A)(e).length}catch(e){return}}}var Me=r(8139),Pe=r(3434),Ie=r(5732);const je={},Ce=["open","send","setRequestHeader"];function De(e,t){var r=e||R.ee;const n=function(e){return(e||R.ee).get("xhr")}(r);if(void 0===g.gm.XMLHttpRequest)return n;if(je[n.debugId]++)return n;je[n.debugId]=1,(0,Me.u)(r,t);var i=(0,Pe.YM)(n,void 0,t),s=g.gm.XMLHttpRequest,a=g.gm.MutationObserver,o=g.gm.Promise,c=g.gm.setInterval,d="readystatechange",u=["onload","onerror","onabort","onloadstart","onloadend","onprogress","ontimeout"],f=[],h=g.gm.XMLHttpRequest=function(e){const r=new s(e),a=n.context(r);a.targets=(0,Ie.$5)(t);try{n.emit("new-xhr",[r],a),r.addEventListener(d,(o=a,function(){var e=this;e.readyState>3&&!o.resolved&&(o.resolved=!0,n.emit("xhr-resolved",[],e)),i.inPlace(e,u,"fn-",E)}),(0,J.jT)(!1))}catch(e){(0,l.R)(15,e);try{n.emit("internal-error",[e])}catch(e){}}var o;return r};function p(e,t){i.inPlace(t,["onreadystatechange"],"fn-",E)}if(function(e,t){for(var r in e)t[r]=e[r]}(s,h),h.prototype=s.prototype,i.inPlace(h.prototype,Ce,"-xhr-",E),n.on("send-xhr-start",function(e,t){p(e,t),function(e){f.push(e),a&&(m?m.then(b):c?c(b):(v=-v,y.data=v))}(t)}),n.on("open-xhr-start",p),a){var m=o&&o.resolve();if(!c&&!o){var v=1,y=document.createTextNode(v);new a(b).observe(y,{characterData:!0})}}else r.on("fn-end",function(e){e[0]&&e[0].type===d||b()});function b(){for(var e=0;e<f.length;e++)p(0,f[e]);f.length&&(f=[])}function E(e,t){return t}return n}var Be="fetch-",He=Be+"body-",We=["arrayBuffer","blob","json","text","formData"],Ue=g.gm.Request,Ke=g.gm.Response,Fe="prototype";const Ve={};function ze(e,t){const r=function(e){return(e||R.ee).get("fetch")}(e);if(!(Ue&&Ke&&g.gm.fetch))return r;if(Ve[r.debugId]++)return r;function n(e,n,i){var s=e[n];"function"==typeof s&&(e[n]=function(){var e=[...arguments];const n={},a=(0,Ie.$5)(t);var o;r.emit(i+"before-start",[e],n),n[R.P]&&n[R.P].dt&&(o=n[R.P].dt);var c=s.apply(this,e);return r.emit(i+"start",[e,o],c),c.then(function(e){return r.emit(i+"end",[null,e,a],c),e},function(e){throw r.emit(i+"end",[e,void 0,a],c),e})})}
5return Ve[r.debugId]=1,We.forEach(e=>{n(Ue[Fe],e,He),n(Ke[Fe],e,He)}),n(g.gm,"fetch",Be),r.on(Be+"end",function(e,n,i){var s=this;if(s.targets=i||[t.runtime.v2Target],n){var a=n.headers.get("content-length");null!==a&&(s.rxSize=a),r.emit(Be+"done",[null,n],s)}else r.emit(Be+"done",[e],s)}),r}var Ge=r(7485);class qe{constructor(e){this.agentRef=e}generateTracePayload(e){const t=this.agentRef.loader_config;if(!this.shouldGenerateTrace(e)||!t)return null;var r=(t.accountID||"").toString()||null,n=(t.agentID||"").toString()||null,i=(t.trustKey||"").toString()||null;if(!r||!n)return null;var s=(0,ye.ZF)(),a=(0,ye.el)(),o=Date.now(),c={spanId:s,traceId:a,timestamp:o};return(e.sameOrigin||this.isAllowedOrigin(e)&&this.useTraceContextHeadersForCors())&&(c.traceContextParentHeader=this.generateTraceContextParentHeader(s,a),c.traceContextStateHeader=this.generateTraceContextStateHeader(s,o,r,n,i)),(e.sameOrigin&&!this.excludeNewrelicHeader()||!e.sameOrigin&&this.isAllowedOrigin(e)&&this.useNewrelicHeaderForCors())&&(c.newrelicHeader=this.generateTraceHeader(s,a,o,r,n,i)),c}generateTraceContextParentHeader(e,t){return"00-"+t+"-"+e+"-01"}generateTraceContextStateHeader(e,t,r,n,i){return i+"@nr=0-1-"+r+"-"+n+"-"+e+"----"+t}generateTraceHeader(e,t,r,n,i,s){if(!("function"==typeof g.gm?.btoa))return null;var a={v:[0,1],d:{ty:"Browser",ac:n,ap:i,id:e,tr:t,ti:r}};return s&&n!==s&&(a.d.tk=s),btoa((0,X.A)(a))}shouldGenerateTrace(e){return this.agentRef.init?.distributed_tracing?.enabled&&this.isAllowedOrigin(e)}isAllowedOrigin(e){var t=!1;const r=this.agentRef.init?.distributed_tracing;if(e.sameOrigin)t=!0;else if(r?.allowed_origins instanceof Array)for(var n=0;n<r.allowed_origins.length;n++){var i=(0,Ge.D)(r.allowed_origins[n]);if(e.hostname===i.hostname&&e.protocol===i.protocol&&e.port===i.port){t=!0;break}}return t}excludeNewrelicHeader(){var e=this.agentRef.init?.distributed_tracing;return!!e&&!!e.exclude_newrelic_header}useNewrelicHeaderForCors(){var e=this.agentRef.init?.distributed_tracing;return!!e&&!1!==e.cors_use_newrelic_header}useTraceContextHeadersForCors(){var e=this.agentRef.init?.distributed_tracing;return!!e&&!!e.cors_use_tracecontext_headers}}var Ye=r(7295);function Ze(e){return"string"==typeof e?e:e instanceof(0,i.dV)().o.REQ?e.url:g.gm?.URL&&e instanceof URL?e.href:void 0}function $e(e,t){var r=(0,Ge.D)(t),n=e.params||e;n.hostname=r.hostname,n.port=r.port,n.protocol=r.protocol,n.host=r.hostname+":"+r.port,n.pathname=r.pathname,e.parsedOrigin=r,e.sameOrigin=r.sameOrigin}var Je=["load","error","abort","timeout"],Xe=Je.length,Qe=(0,i.dV)().o.REQ,et=(0,i.dV)().o.XHR;const tt="X-NewRelic-App-Data",rt="internal-error";class nt extends W{static featureName=c.TZ;constructor(e){super(e,c.TZ),this.dt=new qe(e),this.handler=(e,t,r,n)=>(0,S.p)(e,t,r,n,this.ee);try{const e={xmlhttprequest:"xhr",fetch:"fetch",beacon:"beacon"};g.gm?.performance?.getEntriesByType("resource").forEach(r=>{if(r.initiatorType in e&&0!==r.responseStatus){const n={status:r.responseStatus},i={rxSize:r.transferSize,duration:Math.floor(r.duration),cbTime:0};$e(n,r.name),this.handler("xhr",[n,i,r.startTime,r.responseEnd,e[r.initiatorType]],void 0,t.K7.ajax)}})}catch(e){}ze(this.ee,e),De(this.ee,e),function(e,r,n,i){const s=[c.mo.ALL,c.mo.FAILURES].includes(e.init.ajax?.capture_payloads);function a(e){var t=this;t.totalCbs=0,t.called=0,t.cbTime=0,t.end=A,t.ended=!1,t.xhrGuids={},t.lastSize=null,t.loadCaptureCalled=!1,t.params=this.params||{},t.metrics=this.metrics||{},t.latestLongtaskEnd=0,e.addEventListener("load",function(r){O(t,e)},(0,J.jT)(!1)),g.lR||e.addEventListener("progress",function(e){t.lastSize=e.loaded},(0,J.jT)(!1))}function o(e){this.params={method:e[0]},$e(this,e[1]),this.metrics={}}function d(t,r){e.loader_config.xpid&&this.sameOrigin&&r.setRequestHeader("X-NewRelic-ID",e.loader_config.xpid);var n=i.generateTracePayload(this.parsedOrigin);if(n){var s=!1;n.newrelicHeader&&(r.setRequestHeader("newrelic",n.newrelicHeader),s=!0),n.traceContextParentHeader&&(r.setRequestHeader("traceparent",n.traceContextParentHeader),n.traceContextStateHeader&&r.setRequestHeader("tracestate",n.traceContextStateHeader),s=!0),s&&(this.dt=n)}}function u(e,t){s&&e.length>=2&&(this.requestHeaders??={},this.requestHeaders[e[0].toLowerCase()]=e[1])}function l(e,t){var n=this.metrics,i=e[0],s=this;if(n&&i){var a=Le(i);a&&(n.txSize=a)}this.startTime=(0,_.t)(),this.requestBody=i,this.listener=function(e){try{"abort"!==e.type||s.loadCaptureCalled||(s.params.aborted=!0),("load"
5!==e.type||s.called===s.totalCbs&&(s.onloadCalled||"function"!=typeof t.onload)&&"function"==typeof s.end)&&s.end(t)}catch(e){try{r.emit(rt,[e])}catch(e){}}};for(var o=0;o<Xe;o++)t.addEventListener(Je[o],this.listener,(0,J.jT)(!1))}function f(e,t,r){this.cbTime+=e,t?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&"function"==typeof r.onload||"function"!=typeof this.end||this.end(r)}function h(e,t){var r=""+Ne(e)+!!t;this.xhrGuids&&!this.xhrGuids[r]&&(this.xhrGuids[r]=!0,this.totalCbs+=1)}function p(e,t){var r=""+Ne(e)+!!t;this.xhrGuids&&this.xhrGuids[r]&&(delete this.xhrGuids[r],this.totalCbs-=1)}function m(){this.endTime=(0,_.t)()}function v(e,t){t instanceof et&&"load"===e[0]&&r.emit("xhr-load-added",[e[1],e[2]],t)}function y(e,t){t instanceof et&&"load"===e[0]&&r.emit("xhr-load-removed",[e[1],e[2]],t)}function b(e,t,r){t instanceof et&&("onload"===r&&(this.onload=!0),("load"===(e[0]&&e[0].type)||this.onload)&&(this.xhrCbStart=(0,_.t)()))}function E(e,t){this.xhrCbStart&&r.emit("xhr-cb-time",[(0,_.t)()-this.xhrCbStart,this.onload,t],t)}function w(e){var t,r=e[1]||{};if("string"==typeof e[0]?0===(t=e[0]).length&&g.RI&&(t=""+g.gm.location.href):e[0]&&e[0].url?t=e[0].url:g.gm?.URL&&e[0]&&e[0]instanceof URL?t=e[0].href:"function"==typeof e[0].toString&&(t=e[0].toString()),"string"==typeof t&&0!==t.length){t&&(this.parsedOrigin=(0,Ge.D)(t),this.sameOrigin=this.parsedOrigin.sameOrigin);var n=i.generateTracePayload(this.parsedOrigin);if(n&&(n.newrelicHeader||n.traceContextParentHeader))if(e[0]&&e[0].headers)o(e[0].headers,n)&&(this.dt=n);else{var s={};for(var a in r)s[a]=r[a];s.headers=new Headers(r.headers||{}),o(s.headers,n)&&(this.dt=n),e.length>1?e[1]=s:e.push(s)}}function o(e,t){var r=!1;return t.newrelicHeader&&(e.set("newrelic",t.newrelicHeader),r=!0),t.traceContextParentHeader&&(e.set("traceparent",t.traceContextParentHeader),t.traceContextStateHeader&&e.set("tracestate",t.traceContextStateHeader),r=!0),r}}function R(e,t){this.params={},this.metrics={},this.startTime=(0,_.t)(),this.dt=t;let[r,n={}]=e;$e(this,Ze(r));const i=(""+(r&&r instanceof Qe&&r.method||n.method||"GET")).toUpperCase();this.params.method=i,this.txSize=Le(n.body||r?.body)||0;try{var a=n.headers||r?.headers;if(s&&a)if(this.requestHeaders??={},a instanceof Headers)a.forEach(function(e,t){this.requestHeaders[t.toLowerCase()]=e}.bind(this));else if("object"==typeof a)for(var o in a)this.requestHeaders[o.toLowerCase()]=a[o]}catch(e){}this.requestBody=n.body||r?.body}function T(e,t){if(this.endTime=(0,_.t)(),this.params||(this.params={}),(0,Ye.iW)(this.params))return;this.params.status=t?t.status:0;const n=()=>{const e=+this.rxSize,t=null==this.rxSize||isNaN(e)?void 0:e,r={txSize:this.txSize,rxSize:t,duration:this.endTime-this.startTime},n=[this.params,r,this.startTime,this.endTime,"fetch"];this.targets.forEach(e=>x(n,this,e))};t&&s?t.clone().text().then(e=>{this.responseBody=e,this.rxSize&&"0"!==this.rxSize&&0!==this.rxSize||void 0===e||0===this.params.status||(this.rxSize=Le(e)),t?.headers&&(this.responseHeaders={},t.headers.forEach(function(e,t){this.responseHeaders[t.toLowerCase()]=e}.bind(this)))}).catch(e=>{r.emit(rt,[e])}).finally(()=>{n()}):n()}function A(e){const t=this.params,n=this.metrics;if(this.ended)return;this.ended=!0;for(let t=0;t<Xe;t++)e.removeEventListener(Je[t],this.listener,!1);if(t.aborted)return;if((0,Ye.iW)(t))return;if(n.duration=this.endTime-this.startTime,this.loadCaptureCalled||4!==e.readyState?null==t.status&&(t.status=0):O(this,e),n.cbTime=this.cbTime,s){try{this.responseBody=e.responseText}catch(t){this.responseBody=e.response}if((!n.rxSize||0===n.rxSize)&&void 0!==this.responseBody&&0!==t.status){const e=Le(this.responseBody);void 0!==e&&(n.rxSize=e)}try{this.responseHeaders=function(e){const t={};return e?(e.split("\r\n").forEach(function(e){const r=e.indexOf(": ");if(r>0){const n=e.substring(0,r),i=e.substring(r+2);t[n.toLowerCase()]=i}}),t):t}(e.getAllResponseHeaders())}catch(e){r.emit(rt,[e])}}const i=[t,n,this.startTime,this.endTime,"xhr"];this.targets.forEach(e=>x(i,this,e))}function x(e,r,i){n("xhr",[...e,i],r,t.K7.ajax)}function O(e,n){e.params.status=n.status;var i=function(e,t){var r=e.responseType;return"json"===r&&null!==t?t:"arraybuffer"===r||"blob"===r||"json"===r?Le(e.response):"text"===r||""===r||void 0===r?Le(e.responseText):void 0}(n,e.lastSize);if(void 0!==i&&0!==n.status&&(e.metrics.rxSize=i),e.sameOrigin&&n.getAllResponseHeaders().indexOf(tt)>=0){var s=n.getResponseHeader(tt);s&&((0,S.p)("sm",["Ajax/CrossApplicationTracing/Header/Seen"],void 0,t.K7.metrics,r),e.params.cat=s.split(", ").pop())}e.loadCaptureCalled=!0}r.on("new-xhr",a),r.on("open-xhr-start",o),r.on("open-xhr-end",d),r.on("send-xhr-start",l),r.on("setRequestHeader-xhr-start",u),r.on("xhr-cb-time",f),r.on("xhr-load-added",h),r.on("xhr-load-removed",p),r.on("xhr-resolved",m),r.on("addEventListener-end",v),r.on("removeEventListener-end",y),r.on("fn-end",E),r.on("fetch-before-start",w),r.on("fetch-start",R),r.on("fn-start",b),r.on("fetch-done",T)}(e,this.ee,this.handler,this.dt),this.importAggregator(e,()=>r.e(478).then(r.bind(r,3845)))}}const it={},st=["pushState","replaceState"];function at(e,t){const r=function(e){return(e||R.ee).get("history")}(e);return!g.RI||it[r.debugId]++||(it[r.debugId]=1,(0,Pe.YM)(r,void 0,t).inPlace(window.history,st,"-")),r}var ot=r(3738);function ct(e){(0,N.Y)(k.BL,function(r=Date.now()){const n=r-g.WN;n<0&&(0,l.R)(62,r),(0,S.p)(q.XG,[k.BL,{time:n}],void 0,t.K7.metrics,e.ee),e.addToTrace({name:k.BL,start:r,origin:"nr"}),(0,S.p)("api-"+k.hG,[n,k.BL],void 0,t.K7.genericEvents,e.ee)},e)}const{He:dt,bD:ut,d3:lt,Kp:ft,TZ:ht,Lc:pt,uP:gt,Rz:mt}=ot;class vt extends W{static featureName=ht;constructor(e){var n;super(e,ht),n=e,(0,N.Y)(k.U2,function(e){if(!(e&&"object"==typeof e&&e.name&&e.start))return;const r={n:e.name,s:e.start-g.WN,e:(e.end||e.start)-g.WN,o:e.origin||"",t:"api"};r.s<0||r.e<0||r.e<r.s?(0,l.R)(61,{start:r.s,end:r.e}):(0,S.p)("bstApi",[r],void 0,t.K7.sessionTrace,n.ee)},n),ct(e);
5if(!(0,j.V)(e.init))return void this.deregisterDrain();const i=this.ee;let s;at(i,e),this.eventsEE=(0,Me.u)(i,e),this.eventsEE.on(gt,function(e,t){this.bstStart=(0,_.t)()}),this.eventsEE.on(pt,function(e,r){(0,S.p)("bst",[e[0],r,this.bstStart,(0,_.t)()],void 0,t.K7.sessionTrace,i)}),i.on(mt+lt,function(e){this.time=(0,_.t)(),this.startPath=location.pathname+location.hash}),i.on(mt+ft,function(e){(0,S.p)("bstHist",[location.pathname+location.hash,this.startPath,this.time],void 0,t.K7.sessionTrace,i)});try{s=new PerformanceObserver(e=>{const r=e.getEntries();(0,S.p)(dt,[r],void 0,t.K7.sessionTrace,i)}),s.observe({type:ut,buffered:!0})}catch(e){}this.importAggregator(e,()=>r.e(478).then(r.bind(r,6974)),{resourceObserver:s})}}var yt=r(733),bt=r(6344);class Et extends W{static featureName=bt.TZ;#i;recorder;constructor(e){var n;let i;super(e,bt.TZ),n=e,(0,N.Y)(k.CH,function(){(0,S.p)(k.CH,[],void 0,t.K7.sessionReplay,n.ee)},n),function(e){(0,N.Y)(k.Tb,function(){(0,S.p)(k.Tb,[],void 0,t.K7.sessionReplay,e.ee)},e)}(e);const s="".concat(u.Wt).concat((0,yt.Y)(e.info.licenseKey,e.info.applicationID));try{i=JSON.parse(localStorage.getItem(s))}catch(e){}(0,I.SR)(e.init)&&this.ee.on(k.CH,()=>this.#s()),this.#a(i)&&this.importRecorder().then(e=>{e.startRecording(bt.Qb.PRELOAD,i?.sessionReplayMode)}),this.abortHandler=this.#n,this.importAggregator(this.agentRef,()=>r.e(478).then(r.bind(r,6167)),this),this.ee.on("err",e=>{this.blocked||this.agentRef.runtime.isRecording&&(this.errorNoticed=!0,(0,S.p)(bt.Vh,[e],void 0,this.featureName,this.ee))})}#a(e){return e&&(e.sessionReplayMode===u.g.FULL||e.sessionReplayMode===u.g.ERROR)||(0,I.Aw)(this.agentRef.init)}importRecorder(){return this.recorder?Promise.resolve(this.recorder):(this.#i??=Promise.all([r.e(478),r.e(249)]).then(r.bind(r,4866)).then(({Recorder:e})=>(this.recorder=new e(this),this.recorder)).catch(e=>{throw this.ee.emit("internal-error",[e]),this.blocked=!0,e}),this.#i)}#s(){this.blocked||(this.featAggregate?this.featAggregate.mode!==u.g.FULL&&this.featAggregate.initializeRecording(u.g.FULL,!0,bt.Qb.API):this.importRecorder().then(()=>{this.recorder.startRecording(bt.Qb.API,u.g.FULL)}))}#n(){this.recorder?.stopRecording()}}var wt=r(3962);class Rt extends W{static featureName=wt.TZ;constructor(e){if(super(e,wt.TZ),function(e){const r=e.ee.get("tracer");function n(){}(0,N.Y)(k.dT,function(e){return(new n).get("object"==typeof e?e:{})},e);const i=n.prototype={createTracer:function(n,i){var s={},a=this,o="function"==typeof i;return(0,S.p)(q.xV,["API/createTracer/called"],void 0,t.K7.metrics,e.ee),function(){if(r.emit((o?"":"no-")+"fn-start",[(0,_.t)(),a,o],s),o)try{return i.apply(this,arguments)}catch(e){const t="string"==typeof e?new Error(e):e;throw r.emit("fn-err",[arguments,this,t],s),t}finally{r.emit("fn-end",[(0,_.t)()],s)}}}};["actionText","setName","setAttribute","save","ignore","onEnd","getContext","end","get"].forEach(r=>{N.Y.apply(this,[r,function(){return(0,S.p)(k.hw+r,[performance.now(),...arguments],this,t.K7.softNav,e.ee),this},e,i])}),(0,N.Y)(k.PA,function(){(0,S.p)(k.hw+"routeName",[performance.now(),...arguments],void 0,t.K7.softNav,e.ee)},e)}(e),!g.RI||!(0,i.dV)().o.MO)return;const n=at(this.ee,e);try{this.removeOnAbort=new AbortController}catch(e){}wt.tC.forEach(e=>{(0,J.sp)(e,e=>{c(e)},!0,this.removeOnAbort?.signal)}
5);const s=()=>(0,S.p)("newURL",[(0,_.t)(),""+window.location],void 0,this.featureName,this.ee);n.on("pushState-end",s),n.on("replaceState-end",s),(0,J.sp)(wt.OV,e=>{c(e),(0,S.p)("newURL",[e.timeStamp,""+window.location],void 0,this.featureName,this.ee)},!0,this.removeOnAbort?.signal);let a=!1;const o=new((0,i.dV)().o.MO)((e,t)=>{a||(a=!0,requestAnimationFrame(()=>{(0,S.p)("newDom",[(0,_.t)()],void 0,this.featureName,this.ee),a=!1}))}),c=(0,C.s)(e=>{"loading"!==document.readyState&&((0,S.p)("newUIEvent",[e],void 0,this.featureName,this.ee),o.observe(document.body,{attributes:!0,childList:!0,subtree:!0,characterData:!0}))},100,{leading:!0});this.abortHandler=function(){this.removeOnAbort?.abort(),o.disconnect(),this.abortHandler=void 0},this.importAggregator(e,()=>r.e(478).then(r.bind(r,4393)),{domObserver:o})}}var Tt=r(981);const At={},St=new Set;function xt(e){return"string"==typeof e?{type:"string",size:(new TextEncoder).encode(e).length}:e instanceof ArrayBuffer?{type:"ArrayBuffer",size:e.byteLength}:e instanceof Blob?{type:"Blob",size:e.size}:e instanceof DataView?{type:"DataView",size:e.byteLength}:ArrayBuffer.isView(e)?{type:"TypedArray",size:e.byteLength}:{type:"unknown",size:0}}class Ot{constructor(e,t){this.timestamp=(0,_.t)(),this.currentUrl=(0,Ee.L)(window.location.href),this.socketId=(0,ye.LA)(8),this.requestedUrl=(0,Ee.L)(e),this.requestedProtocols=Array.isArray(t)?t.join(","):t||"",this.openedAt=void 0,this.protocol=void 0,this.extensions=void 0,this.binaryType=void 0,this.messageOrigin=void 0,this.messageCount=0,this.messageBytes=0,this.messageBytesMin=0,this.messageBytesMax=0,this.messageTypes=void 0,this.sendCount=0,this.sendBytes=0,this.sendBytesMin=0,this.sendBytesMax=0,this.sendTypes=void 0,this.closedAt=void 0,this.closeCode=void 0,this.closeReason="unknown",this.closeWasClean=void 0,this.connectedDuration=0,this.hasErrors=void 0}}class _t extends W{static featureName=o.TZ;constructor(e){super(e,o.TZ);const n=e.init.feature_flags.includes("websockets")||e.init.web_sockets?.enabled,s=!e.init.feature_flags.includes("no_spv"),a=[e.init.page_action.enabled,e.init.performance.capture_marks,e.init.performance.capture_measures,e.init.performance.resources.enabled,e.init.user_actions.enabled,n,s];var c;let d;if(c=e,(0,N.Y)(k.hG,(e,t)=>ce(e,t,c),c),function(e){(0,N.Y)(k.fF,(t,r)=>ue(t,r,e),e)}(e),ct(e),Se(e),function(e){(0,N.Y)(k.V1,(t,r)=>de(t,r,e),e)}(e),this.removeOnAbort=new AbortController,this.abortHandler=()=>{this.removeOnAbort.abort(),this.abortHandler=void 0},n){const u=function(e,t){if(!(0,i.dV)().o.WS)return e;const r=e.get("websockets");if(At[r.debugId]++)return r;At[r.debugId]=1,(0,V.G)(()=>{const e=(0,_.t)();St.forEach(t=>{t.nrData.closedAt=e,t.nrData.closeCode=1001,t.nrData.closeReason="Page navigating away",t.nrData.closeWasClean=!1,t.nrData.openedAt&&(t.nrData.connectedDuration=e-t.nrData.openedAt),r.emit("ws",[t.nrData,t.targets],t)})});
5class n extends WebSocket{static name=Tt.R.WS;static toString(){return"function WebSocket() { [native code] }"}toString(){return"[object WebSocket]"}get[Symbol.toStringTag](){return n.name}#o(e){(e.__newrelic??={}).socketId=this.nrData.socketId,this.nrData.hasErrors??=!0}constructor(...e){super(...e),this.nrData=new Ot(e[0],e[1]),this.targets=(0,Ie.$5)(t),this.addEventListener("open",()=>{this.nrData.openedAt=(0,_.t)(),["protocol","extensions","binaryType"].forEach(e=>{this.nrData[e]=this[e]}),St.add(this)}),this.addEventListener("message",e=>{const{type:t,size:r}=xt(e.data);this.nrData.messageOrigin??=(0,Ee.L)(e.origin),this.nrData.messageCount++,this.nrData.messageBytes+=r,this.nrData.messageBytesMin=Math.min(this.nrData.messageBytesMin||1/0,r),this.nrData.messageBytesMax=Math.max(this.nrData.messageBytesMax,r),(this.nrData.messageTypes??"").includes(t)||(this.nrData.messageTypes=this.nrData.messageTypes?"".concat(this.nrData.messageTypes,",").concat(t):t)}),this.addEventListener("close",e=>{this.nrData.closedAt=(0,_.t)(),this.nrData.closeCode=e.code,e.reason&&(this.nrData.closeReason=e.reason),this.nrData.closeWasClean=e.wasClean,this.nrData.connectedDuration=this.nrData.closedAt-this.nrData.openedAt,St.delete(this),r.emit("ws",[this.nrData,this.targets],this)})}addEventListener(e,t,...r){const n=this,i="function"==typeof t?function(...e){try{return t.apply(this,e)}catch(e){throw n.#o(e),e}}:t?.handleEvent?{handleEvent:function(...e){try{return t.handleEvent.apply(t,e)}catch(e){throw n.#o(e),e}}}:t;return super.addEventListener(e,i,...r)}send(e){if(this.readyState===WebSocket.OPEN){const{type:t,size:r}=xt(e);this.nrData.sendCount++,this.nrData.sendBytes+=r,this.nrData.sendBytesMin=Math.min(this.nrData.sendBytesMin||1/0,r),this.nrData.sendBytesMax=Math.max(this.nrData.sendBytesMax,r),(this.nrData.sendTypes??"").includes(t)||(this.nrData.sendTypes=this.nrData.sendTypes?"".concat(this.nrData.sendTypes,",").concat(t):t)}try{return super.send(e)}catch(e){throw this.#o(e),e}}close(...e){try{super.close(...e)}catch(e){throw this.#o(e),e}}}return g.gm.WebSocket=n,r}(this.ee,e);u.on("ws",(e,t)=>{(0,S.p)("ws-complete",[e,t],void 0,this.featureName,this.ee)})}if(s){if("function"==typeof g.gm.ReportingObserver){const l=new g.gm.ReportingObserver(e=>{e.forEach(e=>{(0,S.p)("spv",[kt(e),(0,_.t)()],void 0,t.K7.genericEvents,this.ee)}),l.disconnect()},{types:["csp-violation"],buffered:!0});l.observe()}g.gm.addEventListener("securitypolicyviolation",e=>{(0,S.p)("spv",[kt(e),e.timeStamp],void 0,t.K7.genericEvents,this.ee)},(0,J.jT)(!1,this.removeOnAbort.signal))}if(g.RI){if(ze(this.ee,e),De(this.ee,e),d=at(this.ee,e),e.init.user_actions.enabled){function f(t){const r=(0,Ge.D)(t);return e.beacons.includes(r.hostname+":"+r.port)}function h(){d.emit("navChange")}o.Zp.forEach(e=>(0,J.sp)(e,e=>(0,S.p)("ua",[e],void 0,this.featureName,this.ee),!0)),o.qN.forEac
5h(e=>{const t=(0,C.s)(e=>{(0,S.p)("ua",[e],void 0,this.featureName,this.ee)},500,{leading:!0});(0,J.sp)(e,t)}),g.gm.addEventListener("error",()=>{(0,S.p)("uaErr",[],void 0,t.K7.genericEvents,this.ee)},(0,J.jT)(!1,this.removeOnAbort.signal)),this.ee.on("open-xhr-start",(e,r)=>{f(e[1])||r.addEventListener("readystatechange",()=>{2===r.readyState&&(0,S.p)("uaXhr",[],void 0,t.K7.genericEvents,this.ee)},(0,J.jT)(void 0,this.removeOnAbort.signal))}),this.ee.on("fetch-start",e=>{e.length>=1&&!f(Ze(e[0]))&&(0,S.p)("uaXhr",[],void 0,t.K7.genericEvents,this.ee)}),d.on("pushState-end",h),d.on("replaceState-end",h),window.addEventListener("hashchange",h,(0,J.jT)(!0,this.removeOnAbort.signal)),window.addEventListener("popstate",h,(0,J.jT)(!0,this.removeOnAbort.signal))}if(e.init.performance.resources.enabled&&g.gm.PerformanceObserver?.supportedEntryTypes.includes("resource")){new PerformanceObserver(e=>{e.getEntries().forEach(e=>{(0,S.p)("browserPerformance.resource",[e],void 0,this.featureName,this.ee)})}).observe({type:"resource",buffered:!0})}}a.some(e=>e)?this.importAggregator(e,()=>r.e(478).then(r.bind(r,8019))):this.deregisterDrain()}}function kt(e){const t=e.body??e;return{blockedUrl:t.blockedURL??e.blockedURI,documentUrl:t.documentURL??e.documentURI,effectiveDirective:t.effectiveDirective,originalPolicy:t.originalPolicy,sourceFile:t.sourceFile,statusCode:t.statusCode,lineNumber:t.lineNumber,columnNumber:t.columnNumber,disposition:"reporting"===t.disposition?"report":t.disposition,sample:t.sample,referrer:t.referrer}}var Nt=r(2646);const Lt=new Map;function Mt(e,t,r,n,i=!0,s){if("object"!=typeof t||!t||"string"!=typeof r||!r||"function"!=typeof t[r])return(0,l.R)(29);const a=function(e){return(e||R.ee).get("logger")}(e),o=(0,Pe.YM)(a,void 0,s),c=new Nt.y(R.P);c.level=n.level,c.customAttributes=n.customAttributes,c.autoCaptured=i;const d=t[r]?.[Pe.Jt]||t[r];return Lt.set(d,c),o.inPlace(t,[r],"wrap-logger-",()=>Lt.get(d),void 0,!0),a}var Pt=r(1910);class It extends W{static featureName=se.TZ;constructor(e){var t;super(e,se.TZ),t=e,(0,N.Y)("log",(e,r)=>oe(e,r,t),t),function(e){(0,N.Y)(k.Wb,(t,r,{customAttributes:n={},level:i=se.p_.INFO}={})=>{Mt(e.ee,t,r,{customAttributes:n,level:i},!1,e)},e)}(e),Se(e);const n=this.ee;["log","error","warn","info","debug","trace"].forEach(t=>{(0,Pt.i)(g.gm.console[t]),Mt(n,g.gm.console,t,{level:"log"===t?"info":t},void 0,e)}),this.ee.on("wrap-logger-end",function([t],r,i,s=[e.runtime.v2Target]){const{level:a,customAttributes:o,autoCaptured:c}=this;s.forEach(e=>{(0,ae.R)(n,t,o,a,c,e)})}),this.importAggregator(e,()=>r.e(478).then(r.bind(r,5288)))}}new F({features:[nt,K,G,vt,Et,Y,Oe,_t,It,Rt],loaderType:"spa"})})()})();</script>
5 6 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" /><title>Blog – KernelCI Foundation</title> 7<style>li#wp-admin-bar-my-sites ul#wp-admin-bar-my-sites-list {height: 550px !important; width: 1100px !important; display: flex !important; flex-direction: column !important; flex-wrap: wrap !important;}</style><style>#wpadminbar .menupop li.hover>.ab-sub-wrapper {z-index: 9999 !important;}#wpadminbar .ab-sub-wrapper,#wpadminbar ul,#wpadminbar ul li {z-index: inherit !important;}</style><meta name='robots' content='max-image-preview:large' /> 8<link rel='dns-prefetch' href='//kernelci.org' /> 9<link rel='dns-prefetch' href='//use.fontawesome.com' /> 10<link rel='dns-prefetch' href='//fonts.googleapis.com' /> 11<link rel="alternate" type="application/rss+xml" title="KernelCI Foundation » Feed" href="https://kernelci.org/feed/" /> 12<link rel="alternate" type="application/rss+xml" title="KernelCI Foundation » Comments Feed" href="https://kernelci.org/comments/feed/" /> 13<style id="wp-img-auto-sizes-contain-inline-css"> 14img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px} 15/*# sourceURL=wp-img-auto-sizes-contain-inline-css */ 16</style> 17<style id="wp-emoji-styles-inline-css"> 18 19 img.wp-smiley, img.emoji { 20 display: inline !important; 21 border: none !important; 22 box-shadow: none !important; 23 height: 1em !important; 24 width: 1em !important; 25 margin: 0 0.07em !important; 26 vertical-align: -0.1em !important; 27 background: none !important; 28 padding: 0 !important; 29 } 30/*# sourceURL=wp-emoji-styles-inline-css */ 31</style> 32<style id="wp-block-library-inline-css"> 33:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;
33--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style^=border-color],[style*=";border-color"],[style*="; border-color"]){border-style:solid}html :where([style^=border-top-color],[style*=";border-top-color"],[style*="; border-top-color"]){border-top-style:solid}html :where([style^=border-right-color],[style*=";border-right-color"],[style*="; border-right-color"]){border-right-style:solid}html :where([style^=border-bottom-color],[style*=";border-bottom-color"],[style*="; border-bottom-color"]){border-bottom-style:solid}html :where([style^=border-left-color],[style*=";border-left-color"],[style*="; border-left-color"]){border-left-style:solid}html :where([style^=border-width],[style*=";border-width"],[style*="; border-width"]){border-style:solid}html :where([style^=border-top-width],[style*=";border-top-width"],[style*="; border-top-width"]){border-top-style:solid}html :where([style^=border-right-width],[style*=";border-right-width"],[style*="; border-right-width"]){border-right-style:solid}html :where([style^=border-bottom-width],[style*=";border-bottom-width"],[style*="; border-bottom-width"]){border-bottom-style:solid}html :where([style^=border-left-width],[style*=";border-left-width"],[style*="; border-left-width"]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}} 34 35/*# sourceURL=/wp-includes/css/dist/block-library/common.min.css */ 36</style> 37<style id="wp-block-archives-inline-css"> 38.wp-block-archives{box-sizing:border-box}.wp-block-archives-dropdown label{display:block} 39/*# sourceURL=https://kernelci.org/wp-includes/blocks/archives/style.min.css */ 40</style> 41<style id="wp-block-categories-inline-css"> 42.wp-block-categories{box-sizing:border-box}.wp-block-categories.alignleft{margin-right:2em}.wp-block-categories.alignright{margin-left:2em}.wp-block-categories.wp-block-categories-dropdown.aligncenter{text-align:center}.wp-block-categories .wp-block-categories__label:not(.screen-reader-text){display:block;width:100%} 43/*# sourceURL=https://kernelci.org/wp-includes/blocks/categories/style.min.css */ 44</style> 45<style id="wp-block-heading-inline-css"> 46h1:where(.wp-block-heading).has-background,h2:where(.wp-block-heading).has-background,h3:where(.wp-block-heading).has-background,h4:where(.wp-block-heading).has-background,h5:where(.wp-block-heading).has-background,h6:where(.wp-block-heading).has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg} 47/*# sourceURL=https://kernelci.org/wp-includes/blocks/heading/style.min.css */ 48</style> 49<style id="wp-block-image-inline-css"> 50.wp-block-image>a,.wp-block-image>figure>a{display:inline-block}.wp-block-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom}@media not (prefers-reduced-motion){.wp-block-image img.hide{visibility:hidden}.wp-block-image img.show{animation:show-content-image .4s}}.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{border-radius:inherit}.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull>a,.wp-block-image.alignwide>a{width:100%}.wp-block-image.alignfull img,.wp-block-image.alignwide img{height:auto;width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{display:table}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{caption-side:bottom;display:table-caption}.wp-block-image .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-image .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-image .aligncenter{margin-left:auto;margin-right:auto}.wp-block-image :where(figcaption){margin-bottom:1em;margin-top:.5em}.wp-block-image.is-style-circle-mask img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.wp-block-image.is-style-circle-mask img{border-radius:0;-webkit-mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-mode:alpha;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}}:root :where(.wp-block-image.is-style-rounded img,.wp-block-image .is-style-rounded img){border-radius:9999px}.wp-block-image figure{margin:0}.wp-lightbox-container{display:flex;flex-direction:column;position:relative}.wp-lightbox-container img{cursor:zoom-in}.wp-lightbox-container img:hover+button{opacity:1}.wp-lightbox-container button{align-items:center;backdrop-filter:blur(16px) saturate(180%);background-color:rgba(90,90,90,.25);border:none;border-radius:4px;cursor:zoom-in;display:flex;height:20px;justify-content:center;opacity:0;padding:0;position:absolute;right:16px;text-align:center;top:16px;width:20px;z-index:100}@media not (prefers-reduced-motion){.wp-lightbox-container button{transition:opacity .2s ease}}.wp-lightbox-container button:focus-visible{outline:3px auto rgba(90,90,90,.25);outline:3px auto -webkit-focus-ring-color;outline-offset:3px}.wp-lightbox-container button:hover{cursor:pointer;opacity:1}.wp-lightbox-container button:focus{opacity:1}.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){background-color:rgba(90,90,90,.25);border:none}.wp-lightbox-overlay{box-sizing:border-box;
50cursor:zoom-out;height:100vh;left:0;overflow:hidden;position:fixed;top:0;visibility:hidden;width:100%;z-index:100000}.wp-lightbox-overlay .wp-lightbox-close-button{align-items:center;cursor:pointer;display:flex;font-family:inherit;gap:8px;justify-content:center;line-height:1;min-height:40px;min-width:40px;padding:0 4px;position:absolute;right:calc(env(safe-area-inset-right) + 16px);top:calc(env(safe-area-inset-top) + 16px);z-index:5000000}.wp-lightbox-overlay .wp-lightbox-close-button:focus,.wp-lightbox-overlay .wp-lightbox-close-button:hover,.wp-lightbox-overlay .wp-lightbox-close-button:not(:hover):not(:active):not(.has-background){background:none;border:none}.wp-lightbox-overlay .wp-lightbox-close-button:has(.wp-lightbox-close-text:not([hidden])) .wp-lightbox-close-icon svg{height:1em;width:1em}.wp-lightbox-overlay .wp-lightbox-close-icon svg{display:block}.wp-lightbox-overlay .wp-lightbox-navigation-button-next,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{align-items:center;bottom:16px;cursor:pointer;display:flex;font-family:inherit;gap:4px;justify-content:center;line-height:1;min-height:40px;min-width:40px;padding:0 8px;position:absolute;z-index:2000002}.wp-lightbox-overlay .wp-lightbox-navigation-button-next[hidden],.wp-lightbox-overlay .wp-lightbox-navigation-button-prev[hidden]{display:none}@media (min-width:960px){.wp-lightbox-overlay .wp-lightbox-navigation-button-next,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{bottom:50%;transform:translateY(-50%)}}.wp-lightbox-overlay .wp-lightbox-navigation-button-next:focus,.wp-lightbox-overlay .wp-lightbox-navigation-button-next:hover,.wp-lightbox-overlay .wp-lightbox-navigation-button-next:not(:hover):not(:active):not(.has-background),.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:focus,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:hover,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:not(:hover):not(:active):not(.has-background){background:none;border:none;padding:0 8px}.wp-lightbox-overlay .wp-lightbox-navigation-button-next:has(.wp-lightbox-navigation-text:not([hidden])) .wp-lightbox-navigation-icon svg,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:has(.wp-lightbox-navigation-text:not([hidden])) .wp-lightbox-navigation-icon svg{display:block;height:1.5em;width:1.5em}.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{left:calc(env(safe-area-inset-left) + 16px)}.wp-lightbox-overlay .wp-lightbox-navigation-button-next{right:calc(env(safe-area-inset-right) + 16px)}.wp-lightbox-overlay .wp-lightbox-navigation-icon svg{vertical-align:middle}.wp-lightbox-overlay .lightbox-image-container{height:var(--wp--lightbox-container-height);left:50%;overflow:hidden;position:absolute;top:50%;transform:translate(-50%,-50%);transform-origin:top left;width:var(--wp--lightbox-container-width);z-index:2000001}.wp-lightbox-overlay .wp-block-image{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:center;margin:0;position:relative;transform-origin:0 0;width:100%;z-index:3000000}.wp-lightbox-overlay .wp-block-image img{height:var(--wp--lightbox-image-height);min-height:var(--wp--lightbox-image-height);min-width:var(--wp--lightbox-image-width);width:var(--wp--lightbox-image-width)}.wp-lightbox-overlay .wp-block-image figcaption{display:none}.wp-lightbox-overlay button{background:none;border:none}.wp-lightbox-overlay .scrim{background-color:#fff;height:100%;opacity:.9;position:absolute;width:100%;z-index:2000000}.wp-lightbox-overlay.active{visibility:visible}@media not (prefers-reduced-motion){.wp-lightbox-overlay.active{animation:turn-on-visibility .25s both}.wp-lightbox-overlay.active img{animation:turn-on-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active){animation:turn-off-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active) img{animation:turn-off-visibility .25s both}.wp-lightbox-overlay.zoom.active{animation:none;opacity:1;visibility:visible}.wp-lightbox-overlay.zoom.active .lightbox-image-container{animation:lightbox-zoom-in .4s}.wp-lightbox-overlay.zoom.active .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.active .scrim{animation:turn-on-visibility .4s forwards}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active){animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container{animation:lightbox-zoom-out .4s}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .scrim{animation:turn-off-visibility .4s forwards}}
50@keyframes show-content-image{0%{visibility:hidden}99%{visibility:hidden}to{visibility:visible}}@keyframes turn-on-visibility{0%{opacity:0}to{opacity:1}}@keyframes turn-off-visibility{0%{opacity:1;visibility:visible}99%{opacity:0;visibility:visible}to{opacity:0;visibility:hidden}}@keyframes lightbox-zoom-in{0%{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale))}to{transform:translate(-50%,-50%) scale(1)}}@keyframes lightbox-zoom-out{0%{transform:translate(-50%,-50%) scale(1);visibility:visible}99%{visibility:visible}to{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));visibility:hidden}} 51/*# sourceURL=https://kernelci.org/wp-includes/blocks/image/style.min.css */ 52</style> 53<style id="wp-block-latest-posts-inline-css"> 54.wp-block-latest-posts{box-sizing:border-box}.wp-block-latest-posts.alignleft{margin-right:2em}.wp-block-latest-posts.alignright{margin-left:2em}.wp-block-latest-posts.wp-block-latest-posts__list{list-style:none}.wp-block-latest-posts.wp-block-latest-posts__list li{clear:both;overflow-wrap:break-word}.wp-block-latest-posts.is-grid:not(.is-layout-grid){display:flex;flex-wrap:wrap}.wp-block-latest-posts.is-grid:not(.is-layout-grid) li{margin:0 1.25em 1.25em 0;width:100%}@media (min-width:600px){.wp-block-latest-posts.columns-2:not(.is-layout-grid) li{width:calc(50% - .625em)}.wp-block-latest-posts.columns-2:not(.is-layout-grid) li:nth-child(2n){margin-right:0}.wp-block-latest-posts.columns-3:not(.is-layout-grid) li{width:calc(33.33333% - .83333em)}.wp-block-latest-posts.columns-3:not(.is-layout-grid) li:nth-child(3n){margin-right:0}.wp-block-latest-posts.columns-4:not(.is-layout-grid) li{width:calc(25% - .9375em)}.wp-block-latest-posts.columns-4:not(.is-layout-grid) li:nth-child(4n){margin-right:0}.wp-block-latest-posts.columns-5:not(.is-layout-grid) li{width:calc(20% - 1em)}.wp-block-latest-posts.columns-5:not(.is-layout-grid) li:nth-child(5n){margin-right:0}.wp-block-latest-posts.columns-6:not(.is-layout-grid) li{width:calc(16.66667% - 1.04167em)}.wp-block-latest-posts.columns-6:not(.is-layout-grid) li:nth-child(6n){margin-right:0}}@media (max-width:600px){.wp-block-latest-posts-is-layout-grid[class*=columns-]:not(.has-native-responsive-grid){grid-template-columns:1fr}}:root :where(.wp-block-latest-posts.is-grid){padding:0}:root :where(.wp-block-latest-posts.wp-block-latest-posts__list){padding-left:0}.wp-block-latest-posts__post-author,.wp-block-latest-posts__post-date{display:block;font-size:.8125em}.wp-block-latest-posts__post-excerpt,.wp-block-latest-posts__post-full-content{margin-bottom:1em;margin-top:.5em}.wp-block-latest-posts__featured-image a{display:inline-block}.wp-block-latest-posts__featured-image img{height:auto;max-width:100%;width:auto}.wp-block-latest-posts__featured-image.alignleft{float:left;margin-right:1em}.wp-block-latest-posts__featured-image.alignright{float:right;margin-left:1em}.wp-block-latest-posts__featured-image.aligncenter{margin-bottom:1em;text-align:center} 55/*# sourceURL=https://kernelci.org/wp-includes/blocks/latest-posts/style.min.css */ 56</style> 57<style id="wp-block-list-inline-css"> 58ol,ul{box-sizing:border-box}:root :where(.wp-block-list.has-background){padding:1.25em 2.375em} 59/*# sourceURL=https://kernelci.org/wp-includes/blocks/list/style.min.css */ 60</style> 61<style id="wp-block-paragraph-inline-css"> 62.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}:root :where(p.has-background){padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg} 63/*# sourceURL=https://kernelci.org/wp-includes/blocks/paragraph/style.min.css */ 64</style> 65<style id="wp-block-search-inline-css"> 66.wp-block-search__button{margin-left:10px;word-break:normal}.wp-block-search__button.has-icon{line-height:0}.wp-block-search__button svg{fill:currentColor;height:1.25em;min-height:24px;min-width:24px;vertical-align:text-bottom;width:1.25em}:where(.wp-block-search__button){border:1px solid #ccc;padding:6px 10px}.wp-block-search__inside-wrapper{display:flex;flex:auto;flex-wrap:nowrap;max-width:100%}.wp-block-search__label{width:100%}.wp-block-search.wp-block-search__button-only .wp-block-search__button{box-sizing:border-box;display:flex;flex-shrink:0;justify-content:center;margin-left:0;max-width:100%}.wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{min-width:0!important;transition-property:width}.wp-block-search.wp-block-search__button-only .wp-block-search__input{flex-basis:100%;transition-duration:.3s}.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden,.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__inside-wrapper{overflow:hidden}.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__input{border-left-width:0!important;border-right-width:0!important;flex-basis:0;flex-grow:0;margin:0;min-width:0!important;padding-left:0!important;padding-right:0!important;width:0!important}:where(.wp-block-search__input){-webkit-appearance:initial;-moz-appearance:initial;appearance:none;border:1px solid #949494;flex-grow:1;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin-left:0;margin-right:0;min-width:3rem;padding:8px;text-decoration:unset!important;text-transform:inherit}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper){background-color:#fff;border:1px solid #949494;box-sizing:border-box;padding:4px}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input{border:none;border-radius:0;padding:0 4px}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input:focus{outline:none}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) :where(.wp-block-search__button){padding:4px 8px}.wp-block-search.aligncenter .wp-block-search__inside-wrapper{margin:auto}.wp-block[data-align=right] .wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{float:right} 67/*# sourceURL=https://kernelci.org/wp-includes/blocks/search/style.min.css */ 68</style> 69<style id="wp-block-code-inline-css"> 70.wp-block-code{box-sizing:border-box}.wp-block-code code{direction:ltr;display:block;font-family:inherit;overflow-wrap:break-word;text-align:initial;white-space:break-spaces} 71/*# sourceURL=https://kernelci.org/wp-includes/blocks/code/style.min.css */ 72</style> 73<style id="wp-block-embed-inline-css"> 74.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{max-width:360px;width:100%}.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{min-width:280px}.wp-block-cover .wp-block-embed{min-height:240px;min-width:320px}.wp-block-group.is-layout-flex .wp-block-embed{flex:1 1 0%;min-width:0}.wp-block-embed{overflow-wrap:break-word}.wp-block-embed :where(figcaption){margin-bottom:1em;margin-top:.5em}.wp-block-embed iframe{max-width:100%}.wp-block-embed__wrapper{position:relative}.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{content:"";display:block;padding-top:50%}.wp-embed-responsive .wp-has-aspect-ratio iframe{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{padding-top:42.85%}.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{padding-top:50%}.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{padding-top:56.25%}.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{padding-top:75%}.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{padding-top:100%}.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{padding-top:177.77%}.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{padding-top:200%} 75/*# sourceURL=https://kernelci.org/wp-includes/blocks/embed/style.min.css */ 76</style> 77<style id="wp-block-quote-inline-css"> 78.wp-block-quote{box-sizing:border-box;overflow-wrap:break-word}
78.wp-block-quote.is-large:where(:not(.is-style-plain)),.wp-block-quote.is-style-large:where(:not(.is-style-plain)){margin-bottom:1em;padding:0 1em}.wp-block-quote.is-large:where(:not(.is-style-plain)) p,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) p{font-size:1.5em;font-style:italic;line-height:1.6}.wp-block-quote.is-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-large:where(:not(.is-style-plain)) footer,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) footer{font-size:1.125em;text-align:right}.wp-block-quote>cite{display:block} 79/*# sourceURL=https://kernelci.org/wp-includes/blocks/quote/style.min.css */ 80</style> 81<style id="wp-block-separator-inline-css"> 82@charset "UTF-8";.wp-block-separator{border:none;border-top:2px solid}:root :where(.wp-block-separator.is-style-dots){height:auto;line-height:1;text-align:center}:root :where(.wp-block-separator.is-style-dots):before{color:currentColor;content:"···";font-family:serif;font-size:1.5em;letter-spacing:2em;padding-left:2em}.wp-block-separator.is-style-dots{background:none!important;border:none!important} 83/*# sourceURL=https://kernelci.org/wp-includes/blocks/separator/style.min.css */ 84</style> 85<style id="wp-block-spacer-inline-css"> 86.wp-block-spacer{clear:both} 87/*# sourceURL=https://kernelci.org/wp-includes/blocks/spacer/style.min.css */ 88</style> 89 90 91<style id="global-styles-inline-css"> 92:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);
92--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:root { --wp--style--global--content-size: 1300px;--wp--style--global--wide-size: 1300px; }:where(body) { margin: 0; }.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}.is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
92.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} 93:where(.wp-block-latest-posts.is-layout-flex){gap: 1.25em;}:where(.wp-block-latest-posts.is-layout-grid){gap: 1.25em;} 94/*# sourceURL=global-styles-inline-css */ 95</style> 96 97<link rel='stylesheet' id='people-grid-style-css' href='https://kernelci.org/wp-content/themes/salient-child/vc-addons/css/people.css?ver=18.3.0' media='all' /> 98<link rel='stylesheet' id='salient-child-featherlight-style-css' href='https://kernelci.org/wp-content/themes/salient-child/vc-addons/css/featherlight.css?ver=7.1.2' media='all' /> 99<link rel='stylesheet' id='youtube-playlist-css' href='https://kernelci.org/wp-content/themes/salient-child/vc-addons/css/youtube-playlist.css?ver=1.0.0' media='all' /> 100<link rel='stylesheet' id='cookie-settings-style-css' href='https://kernelci.org/wp-content/themes/salient-child/includes/cookie-settings/cookie-settings.css?ver=18.3.0' media='all' /> 101<link rel='stylesheet' id='salient-child-style-css' href='https://kernelci.org/wp-content/themes/salient-child/style.css?ver=18.3.0' media='all' /> 102<link rel='stylesheet' id='vc-addons-style-css' href='https://kernelci.org/wp-content/themes/salient-child/vc-addons/css/vc-addons.css?ver=18.3.0' media='all' /> 103<link rel='stylesheet' id='templates-style-css' href='https://kernelci.org/wp-content/themes/salient-child/templates/css/templates.css?ver=1790836773' media='all' /> 104<link rel='stylesheet' id='widgets-style-css' href='https://kernelci.org/wp-content/themes/salient-child/widgets/css/widgets.css?ver=18.3.0' media='all' /> 105<link rel='stylesheet' id='results-style-css' href='https://kernelci.org/wp-content/themes/salient-child/search-filter/css/results.css?ver=18.3.0' media='all' /> 106<link rel='stylesheet' id='fonts-style-css' href='https://kernelci.org/wp-content/themes/salient-child/fonts/fonts.css?ver=18.3.0' media='all' /> 107<link rel='stylesheet' id='events-calendar-style-css' href='https://kernelci.org/wp-content/themes/salient-child/css/events-calendar.css?ver=18.3.0' media='all' /> 108<link rel='stylesheet' id='linux-foundation-components-style-css' href='https://kernelci.org/wp-content/themes/salient-child/vc-addons/css/linux-foundation-components.css?ver=18.3.0' media='all' /> 109<link rel='stylesheet' id='latest-posts-style-css' href='https://kernelci.org/wp-content/themes/salient-child/vc-addons/css/latest-posts.css?ver=18.3.0' media='all' /> 110<link rel='stylesheet' id='projects-style-css' href='https://kernelci.org/wp-content/themes/salient-child/vc-addons/css/projects.css?ver=18.3.0' media='all' /> 111<link rel='stylesheet' id='members-style-css' href='https://kernelci.org/wp-content/themes/salient-child/vc-addons/css/members.css?ver=18.3.0' media='all' /> 112<link rel='stylesheet' id='insights-style-css' href='https://kernelci.org/wp-content/themes/salient-child/templates/css/insights.css?ver=1790836773' media='all' /> 113<link rel='stylesheet' id='projects-banner-style-css' href='https://kernelci.org/wp-content/themes/salient-child/css/projects-banner.css?ver=18.3.0' media='all' /> 114<link rel='stylesheet' id='font-awesome-css' href='https://use.fontawesome.com/releases/v6.0.0/css/all.css?ver=6.0.0' media='all' /> 115<link rel='stylesheet' id='font-awesome-shim-css' href='https://use.fontawesome.com/releases/v6.0.0/css/v4-shims.css?ver=6.0.0' media='all' /> 116<link rel='stylesheet' id='salient-grid-system-css' href='https://kernelci.org/wp-content/themes/salient/css/build/grid-system.css?ver=18.3.0' media='all' /> 117<link rel='stylesheet' id='main-styles-css' href='https://kernelci.org/wp-content/themes/salient/css/build/style.css?ver=18.3.0' media='all' /> 118<link rel='stylesheet' id='nectar-element-recent-posts-css' href='https://kernelci.org/wp-content/themes/salient/css/build/elements/element-recent-posts.css?ver=18.3.0' media='all' />
119<link rel='stylesheet' id='nectar_default_font_open_sans-css' href='https://fonts.googleapis.com/css?family=Open+Sans%3A300%2C400%2C600%2C700&subset=latin%2Clatin-ext' media='all' /> 120<link rel='stylesheet' id='nectar-blog-standard-minimal-css' href='https://kernelci.org/wp-content/themes/salient/css/build/blog/standard-minimal.css?ver=18.3.0' media='all' /> 121<link rel='stylesheet' id='responsive-css' href='https://kernelci.org/wp-content/themes/salient/css/build/responsive.css?ver=18.3.0' media='all' /> 122<link rel='stylesheet' id='skin-ascend-css' href='https://kernelci.org/wp-content/themes/salient/css/build/ascend.css?ver=18.3.0' media='all' /> 123<link rel='stylesheet' id='salient-wp-menu-dynamic-css' href='https://kernelci.org/wp-content/uploads/sites/36/salient/menu-dynamic.css?ver=14064' media='all' /> 124<link rel='stylesheet' id='nectar-portfolio-css' href='https://kernelci.org/wp-content/plugins/salient-core/css/fallback/portfolio.css?ver=3.1.6' media='all' /> 125<link rel='stylesheet' id='js_composer_front-css' href='https://kernelci.org/wp-content/themes/salient/css/build/plugins/js_composer.css?ver=18.3.0' media='all' /> 126<link rel='stylesheet' id='dynamic-css-css' href='https://kernelci.org/wp-content/uploads/sites/36/salient/salient-dynamic-styles-multi-id-36.css?ver=84623' media='all' /> 127<style id="dynamic-css-inline-css"> 128@media only screen and (min-width:1000px){body #ajax-content-wrap.no-scroll{min-height:calc(100vh - 70px);height:calc(100vh - 70px)!important;}}@media only screen and (min-width:1000px){#page-header-wrap.fullscreen-header,#page-header-wrap.fullscreen-header #page-header-bg,html:not(.nectar-box-roll-loaded) .nectar-box-roll > #page-header-bg.fullscreen-header,.nectar_fullscreen_zoom_recent_projects,#nectar_fullscreen_rows:not(.afterLoaded) > div{height:calc(100vh - 69px);}.wpb_row.vc_row-o-full-height.top-level,.wpb_row.vc_row-o-full-height.top-level > .col.span_12{min-height:calc(100vh - 69px);}html:not(.nectar-box-roll-loaded) .nectar-box-roll > #page-header-bg.fullscreen-header{top:70px;}.nectar-slider-wrap[data-fullscreen="true"]:not(.loaded),.nectar-slider-wrap[data-fullscreen="true"]:not(.loaded) .swiper-container{height:calc(100vh - 68px)!important;}.admin-bar .nectar-slider-wrap[data-fullscreen="true"]:not(.loaded),.admin-bar .nectar-slider-wrap[data-fullscreen="true"]:not(.loaded) .swiper-container{height:calc(100vh - 68px - 32px)!important;}}.admin-bar[class*="page-template-template-no-header"] .wpb_row.vc_row-o-full-height.top-level,.admin-bar[class*="page-template-template-no-header"] .wpb_row.vc_row-o-full-height.top-level > .col.span_12{min-height:calc(100vh - 32px);}body[class*="page-template-template-no-header"] .wpb_row.vc_row-o-full-height.top-level,body[class*="page-template-template-no-header"] .wpb_row.vc_row-o-full-height.top-level > .col.span_12{min-height:100vh;}@media only screen and (max-width:999px){.using-mobile-browser #nectar_fullscreen_rows:not(.afterLoaded):not([data-mobile-disable="on"]) > div{height:calc(100vh - 126px);}.using-mobile-browser .wpb_row.vc_row-o-full-height.top-level,.using-mobile-browser .wpb_row.vc_row-o-full-height.top-level > .col.span_12,[data-permanent-transparent="1"].using-mobile-browser .wpb_row.vc_row-o-full-height.top-level,[data-permanent-transparent="1"].using-mobile-browser .wpb_row.vc_row-o-full-height.top-level > .col.span_12{min-height:calc(100vh - 126px);}html:not(.nectar-box-roll-loaded) .nectar-box-roll > #page-header-bg.fullscreen-header,.nectar_fullscreen_zoom_recent_projects,.nectar-slider-wrap[data-fullscreen="true"]:not(.loaded),.nectar-slider-wrap[data-fullscreen="true"]:not(.loaded) .swiper-container,#nectar_fullscreen_rows:not(.afterLoaded):not([data-mobile-disable="on"]) > div{height:calc(100vh - 73px);}.wpb_row.vc_row-o-full-height.top-level,.wpb_row.vc_row-o-full-height.top-level > .col.span_12{min-height:calc(100vh - 73px);}body[data-transparent-header="false"] #ajax-content-wrap.no-scroll{min-height:calc(100vh - 73px);height:calc(100vh - 73px);}}#nectar_fullscreen_rows{background-color:transparent;}.screen-reader-text,.nectar-skip-to-content:not(:focus){border:0;clip:rect(1px,1px,1px,1px);clip-path:inset(50%);
128height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute!important;width:1px;word-wrap:normal!important;}.row .col img:not([srcset]){width:auto;}.row .col img.img-with-animation.nectar-lazy:not([srcset]){width:100%;} 129.nectar-love { 130 display: none !important; 131} 132 133.meta-comment-count { 134 display: none !important; 135} 136 137.home .blog-recent .col .post-header h3, 138.blog-recent .col .post-header h3 { 139 font-size: 24px !important; 140} 141 142#footer-outer #footer-widgets .col ul li a, 143.widget_text { 144 font-size: 14px !important; 145} 146 147#footer-outer #footer-widgets { 148 padding: 0px 0px !important; 149 color: #969696 !important; 150} 151 152/* ANDREW'S CODE AFTER MIGRATION TO MS1 */ 153.members-grid-item.vc_col-sm-4 img { 154 max-width: 200px; 155} 156/*# sourceURL=dynamic-css-inline-css */ 157</style> 158<link rel='stylesheet' id='redux-google-fonts-salient_redux-css' href='https://fonts.googleapis.com/css?family=Roboto:400,500,700,300&ver=7.1.2' media='all' />
159<script id="jquery-core-js" src="https://kernelci.org/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
vendor: 1 bytes, line 159
159
160<script id="jquery-migrate-js" src="https://kernelci.org/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1"></script>
vendor: 1 bytes, line 160
160
161<script type="text/javascript" nonce="d710cee414adeabf60cdc94ee0b12f09"></script>
161<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://kernelci.org/xmlrpc.php?rsd" /> 162<meta name="generator" content="WordPress 7.1.2" /> 163<link rel="canonical" href="https://kernelci.org/blog/" /> 164<link rel='shortlink' href='https://kernelci.org/?p=94' />
165<script type="text/javascript" nonce="d710cee414adeabf60cdc94ee0b12f09"> var root = document.getElementsByTagName( "html" )[0]; root.setAttribute( "class", "js" ); </script>
165<script 166 src="https://transcend-cdn.com/cm/f484e2d0-ad2e-43a9-9d64-d07f6fa20966/airgap.js" 167 data-cfasync="false" 168 data-prompt="auto" 169></script>
169 170<!-- LFX Segments Analytics -->
171<script src="https://lfx-segment.platform.linuxfoundation.org/latest/lfx-segment-analytics.min.js"></script>
vendor: 2 bytes, line 171
171
172<script type="text/javascript" nonce="d710cee414adeabf60cdc94ee0b12f09"> 173 // Initialize with default configuration (no custom write key needed) 174 LfxAnalytics.LfxSegmentsAnalytics.getInstance().init(); 175</script>
175 176<!-- Google Tag Manager -->
177<script type="text/javascript" nonce="d710cee414adeabf60cdc94ee0b12f09">
vendor: 331 bytes, lines 177-181
177(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 178new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 179j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 180'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 181})(window,document,'script','dataLayer','
181GTM-N75D4NVH
vendor: 3 bytes, line 181
181');
181</script>
181 182<!-- End Google Tag Manager --><meta name="generator" content="Powered by WPBakery Page Builder - drag and drop page builder for WordPress."/> 183<link rel="icon" href="https://kernelci.org/wp-content/uploads/sites/36/2020/07/cropped-kernelci_fav-1-1-150x150.png" sizes="32x32" /> 184<link rel="icon" href="https://kernelci.org/wp-content/uploads/sites/36/2020/07/cropped-kernelci_fav-1-1-300x300.png" sizes="192x192" /> 185<link rel="apple-touch-icon" href="https://kernelci.org/wp-content/uploads/sites/36/2020/07/cropped-kernelci_fav-1-1-300x300.png" /> 186<meta name="msapplication-TileImage" content="https://kernelci.org/wp-content/uploads/sites/36/2020/07/cropped-kernelci_fav-1-1-300x300.png" /> 187<noscript><style> .wpb_animate_when_almost_visible { opacity: 1; }</style></noscript><link data-pagespeed-no-defer data-nowprocket data-wpacu-skip data-no-optimize data-noptimize rel='stylesheet' id='main-styles-non-critical-css' href='https://kernelci.org/wp-content/themes/salient/css/build/style-non-critical.css?ver=18.3.0' media='all' /> 188<link data-pagespeed-no-defer data-nowprocket data-wpacu-skip data-no-optimize data-noptimize rel='stylesheet' id='magnific-css' href='https://kernelci.org/wp-content/themes/salient/css/build/plugins/magnific.css?ver=8.6.0' media='all' /> 189<link data-pagespeed-no-defer data-nowprocket data-wpacu-skip data-no-optimize data-noptimize rel='stylesheet' id='nectar-ocm-core-css' href='https://kernelci.org/wp-content/themes/salient/css/build/off-canvas/core.css?ver=18.3.0' media='all' /> 190 191</head><body class="wp-singular page-template-default page page-id-94 wp-theme-salient wp-child-theme-salient-child ascend wpb-js-composer js-comp-ver-8.7.3 vc_responsive" data-footer-reveal="false" data-footer-reveal-shadow="none" data-header-format="default" data-body-border="off" data-boxed-style="" data-header-breakpoint="1000" data-dropdown-style="minimal" data-cae="easeOutCubic" data-cad="650" data-megamenu-width="contained" data-aie="none" data-ls="magnific" data-apte="standard" data-hhun="0" data-fancy-form-rcs="default" data-form-style="default" data-form-submit="default" data-is="minimal" data-button-style="rounded" data-user-account-button="false" data-flex-cols="true" data-col-gap="default" data-header-inherit-rc="false" data-header-search="true" data-animated-anchors="true" data-ajax-transitions="false" data-full-width-header="false" data-slide-out-widget-area="true" data-slide-out-widget-area-style="slide-out-from-right" data-user-set-ocm="off" data-loading-animation="none" data-bg-header="false" data-responsive="1" data-ext-responsive="true" data-ext-padding="90" data-header-resize="1" data-header-color="light" data-transparent-header="false" data-cart="false" data-remove-m-parallax="" data-remove-m-video-bgs="" data-m-animate="0" data-force-header-trans-color="light" data-smooth-scrolling="0" data-permanent-transparent="false" > 192 193
193<script type="text/javascript" nonce="d710cee414adeabf60cdc94ee0b12f09"> 194 (function(window, document) { 195 196 document.documentElement.classList.remove("no-js"); 197 198 if(navigator.userAgent.match(/(Android|iPod|iPhone|iPad|BlackBerry|IEMobile|Opera Mini)/)) { 199 document.body.className += " using-mobile-browser mobile "; 200 } 201 if(navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2) { 202 document.body.className += " using-ios-device "; 203 } 204 205 if( !("ontouchstart" in window) ) { 206 207 var body = document.querySelector("body"); 208 var winW = window.innerWidth; 209 var bodyW = body.clientWidth; 210 211 if (winW > bodyW + 4) { 212 213 var vwTestEl = document.createElement("div"); 214 vwTestEl.style.position = "absolute"; 215 vwTestEl.style.top = "-9999px"; 216 vwTestEl.style.width = "100vw"; 217 body.appendChild(vwTestEl); 218 var vwWidth = vwTestEl.offsetWidth; 219 body.removeChild(vwTestEl); 220 221 if (vwWidth > bodyW + 4) { 222 body.setAttribute("style", "--scroll-bar-w: " + (winW - bodyW - 4) + "px"); 223 } else { 224 body.setAttribute("style", "--scroll-bar-w: 0px"); 225 } 226 227 } else { 228 body.setAttribute("style", "--scroll-bar-w: 0px"); 229 } 230 } 231 232 })(window, document); 233 </script>
233<!-- Google Tag Manager (noscript) -->
vendor: 69 bytes, lines 233-234
233 234<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
234GTM-N75D4NVH
vendor: 85 bytes, lines 234-235
234" 235height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
236<!-- End Google Tag Manager (noscript) --><nav aria-label="Skip links" class="nectar-skip-to-content-wrap" data-nosnippet><a href="#ajax-content-wrap" class="nectar-skip-to-content">Skip to main content</a></nav><div class='lfprojects'><div class='container'><a href='https://www.linuxfoundation.org/projects' target='_blank' rel='noopener noreferrer'><img src='/wp-content/uploads/banners/lfprojects_banner_other.svg' alt='THE LINUX FOUNDATION PROJECTS'></a></div></div> 237 <div id="header-space" data-header-mobile-fixed='1'></div> 238 239 <div id="header-outer" data-has-menu="true" data-has-buttons="yes" data-header-button_style="default" data-using-pr-menu="false" data-mobile-fixed="1" data-ptnm="false" data-lhe="default" data-user-set-bg="#ffffff" data-format="default" data-permanent-transparent="false" data-megamenu-rt="0" data-remove-fixed="0" data-header-resize="1" data-cart="false" data-transparency-option="0" data-box-shadow="small" data-shrink-num="6" data-using-secondary="0" data-using-logo="1" data-logo-height="50" data-m-logo-height="50" data-padding="10" data-full-width="false" data-condense="false" > 240 241<header id="top" role="banner" aria-label="Main Menu"> 242 <div class="container"> 243 <div class="row"> 244 <div class="col span_3"> 245 <a id="logo" href="https://kernelci.org" data-supplied-ml-starting-dark="false" data-supplied-ml-starting="false" data-supplied-ml="false" > 246 <img class="stnd skip-lazy dark-version" width="" height="" alt="KernelCI" src="https://kernelci.org/wp-content/uploads/sites/36/2019/10/kernelci-horizontal-color-1.svg" /> </a> 247 </div><!--/span_3--> 248 249 <div class="col span_9 col_last"> 250 <div class="nectar-mobile-only mobile-header"><div class="inner"></div></div> 251 <a class="mobile-search" href="#searchbox"><span class="nectar-icon icon-salient-search" aria-hidden="true"></span><span class="screen-reader-text">search</span></a> 252 <div class="slide-out-widget-area-toggle mobile-icon slide-out-from-right" data-custom-color="false" data-icon-animation="simple-transform"> 253 <div> <a href="#slide-out-widget-area" role="button" aria-label="Navigation Menu" aria-expanded="false" class="closed"> 254 <span class="screen-reader-text">Menu</span><span aria-hidden="true"> <i class="lines-button x2"> <i class="lines"></i> </i> </span> </a></div> 255 </div> 256 257 <nav aria-label="Main Menu"> 258 <ul class="sf-menu"> 259 <li id="menu-item-492" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home nectar-regular-menu-item menu-item-492"><a href="https://kernelci.org/"><span class="menu-title-text">Home</span></a></li> 260<li id="menu-item-484" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children nectar-regular-menu-item menu-item-484"><a aria-haspopup="true" aria-expanded="false"><span class="menu-title-text">Community</span></a> 261<ul class="sub-menu"> 262 <li id="menu-item-482" class="menu-item menu-item-type-custom menu-item-object-custom nectar-regular-menu-item menu-item-482"><a href="https://dashboard.kernelci.org/"><span class="menu-title-text">Dashboard</span></a></li> 263 <li id="menu-item-481" class="menu-item menu-item-type-custom menu-item-object-custom nectar-regular-menu-item menu-item-481"><a href="https://docs.kernelci.org/"><span class="menu-title-text">Documentation</span></a></li> 264 <li id="menu-item-483" class="menu-item menu-item-type-custom menu-item-object-custom nectar-regular-menu-item menu-item-483"><a href="https://github.com/kernelci/"><span class="menu-title-text">GitHub</span></a></li> 265 <li id="menu-item-488" class="menu-item menu-item-type-custom menu-item-object-custom nectar-regular-menu-item menu-item-488"><a href="https://discord.gg/KWbrbWEyqb"><span class="menu-title-text">Discord chat</span></a></li> 266 <li id="menu-item-489" class="menu-item menu-item-type-custom menu-item-object-custom nectar-regular-menu-item menu-item-489"><a href="https://www.youtube.com/@KernelCI"><span class="menu-title-text">Videos (YouTube)</span></a></li> 267 <li id="menu-item-596" class="menu-item menu-item-type-post_type menu-item-object-page nectar-regular-menu-item menu-item-596"><a href="https://kernelci.org/service-providers/"><span class="menu-title-text">Service Providers</span></a></li> 268 <li id="menu-item-487" class="menu-item menu-item-type-post_type menu-item-object-page nectar-regular-menu-item menu-item-487"><a href="https://kernelci.org/community-contact/"><span class="menu-title-text">Contact</span></a></li> 269</ul> 270</li> 271<li id="menu-item-493" class="menu-item menu-item-type-post_type menu-item-object-page nectar-regular-menu-item menu-item-493"><a href="https://kernelci.org/mission-objectives/"><span class="menu-title-text">Mission & Objectives</span></a></li> 272<li id="menu-item-491" class="menu-item menu-item-type-post_type menu-item-object-page nectar-regular-menu-item menu-item-491"><a href="https://kernelci.org/news/"><span class="menu-title-text">News</span></a></li> 273<li id="menu-item-485" class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-94 current_page_item nectar-regular-menu-item menu-item-485"><a href="https://kernelci.org/blog/" aria-current="page"><span class="menu-title-text">Blog</span></a></li> 274<li id="menu-item-490" class="menu-item menu-item-type-post_type menu-item-object-page nectar-regular-menu-item menu-item-490"><a href="https://kernelci.org/calendar/"><span class="menu-title-text">Calendar</span></a></li> 275<li id="menu-item-486" class="menu-item menu-item-type-custom menu-item-object-custom button_solid_color menu-item-486"><a target="_blank" rel="noopener" href="http://joinnow.platform.linuxfoundation.org/?project=kernelci"><span class="menu-title-text">Join Now</span></a></li> 276<li id="social-in-menu" class="button_social_group"><a target="_blank" rel="noopener" href="https://www.youtube.com/@KernelCI"><span class="screen-reader-text">youtube</span><i class="fa fa-youtube-play" aria-hidden="true"></i> </a></li> </ul> 277 <ul class="buttons sf-menu" data-user-set-ocm="off"><li id="search-btn"><div><a href="#search-box"><span class="icon-salient-search" aria-hidden="true"></span><span class="screen-reader-text">search</span></a></div> </li></ul> 278 279 </nav> 280 281 282 </div><!--/span_9--> 283 284 285 </div><!--/row--> 286 </div><!--/container--> 287 </header> 288 289 </div> 290
290<script type="text/javascript" nonce="d710cee414adeabf60cdc94ee0b12f09"> 291 // SIZE #header-space TO THE REAL HEADER HEIGHT IMMEDIATELY, RATHER THAN WAITING FOR THE 292 // window.load EVENT (SALIENT'S headerSpace() DOESN'T RUN UNTIL THEN). THE STATIC 90px 293 // DEFAULT IN style.css DOESN'T ACCOUNT FOR THE NOTIFICATIONS BAR, SO WITHOUT THIS THE 294 // PAGE VISIBLY JUMPS ONCE ALL ASSETS FINISH LOADING AND SALIENT CORRECTS IT LATE. 295 (function () { 296 var headerEl = document.getElementById('header-outer'); 297 var spaceEl = document.getElementById('header-space'); 298 if (headerEl && spaceEl) { 299 spaceEl.style.height = headerEl.clientHeight + 'px'; 300 } 301 })(); 302 </script>
302 303 304<div id="search-outer" class="nectar" data-nosnippet> 305 <div id="search"> 306 <div class="container"> 307 <div id="search-box"> 308 <div class="inner-wrap"> 309 <div class="col span_12"> 310 <form role="search" action="https://kernelci.org/" method="GET"> 311 <input type="text" name="s" value="Start Typing..." aria-label="Search" data-placeholder="Start Typing..." /> 312 313 <span><i>Press enter to begin your search</i></span> 314 <button aria-label="Search" class="search-box__button" type="submit">Search</button> </form> 315 </div><!--/span_12--> 316 </div><!--/inner-wrap--> 317 </div><!--/search-box--> 318 <div id="close"><a href="#" role="button"><span class="screen-reader-text">Close Search</span> 319 <span class="icon-salient-x" aria-hidden="true"></span> </a></div> 320 </div><!--/container--> 321 </div><!--/search--> 322</div><!--/search-outer--> 323 <div id="ajax-content-wrap"> 324<div class="container-wrap"> 325 <div class="container main-content" role="main"> 326 <div class="row"> 327 328 <div id="fws_6abf83dd81501" data-column-margin="default" data-midnight="dark" class="wpb_row vc_row-fluid vc_row top-level" style="padding-top: 0px; padding-bottom: 0px; "><div class="row-bg-wrap" data-bg-animation="none" data-bg-animation-delay="" data-bg-overlay="false"><div class="inner-wrap row-bg-layer" ><div class="row-bg viewport-desktop" style=""></div></div></div><div class="row_col_wrap_12 col span_12 dark left"> 329 <div class="vc_col-sm-12 wpb_column column_container vc_column_container col no-extra-padding inherit_tablet inherit_phone " data-padding-pos="all" data-has-bg-color="false" data-bg-color="" data-bg-opacity="1" data-animation="" data-delay="0" > 330 <div class="vc_column-inner" > 331 <div class="wpb_wrapper"> 332 333<div class="row"> 334 335 <div class="post-area col standard-minimal span_9 " data-ams="" data-remove-post-date="" data-remove-post-author="" data-remove-post-comment-number="1" data-remove-post-nectar-love="1"> <div class="posts-container" data-load-animation="none"> 336 337<article id="post-602" class="post-602 post type-post status-publish format-standard category-blog"> 338 <div class="inner-wrap animated"> 339 <div class="post-content"> 340 341<div class="post-author"> 342 <div class="grav-wrap"><a href="https://kernelci.org/author/mwaqar/"><img alt='mwaqar' src='https://secure.gravatar.com/avatar/9d51d869609c79398e721cbc89c552de38176c4105c60fc37a6f313c28252213?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/9d51d869609c79398e721cbc89c552de38176c4105c60fc37a6f313c28252213?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/mwaqar/" rel="author">mwaqar</a></span> 343 344 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a></span></div> <div class="content-inner"> 345 <div class="article-content-wrap"> 346 <div class="post-header"> 347 <h2 class="title"><a href="https://kernelci.org/blog/2026/09/12/talk-to-kernelci-kci-dev-now-speaks-mcp/"> Talk to KernelCI: kci-dev now speaks MCP</a></h2> 348 </div> 349 350 <p><i><span style="font-weight: 400">By Ben Copeland (Linaro)</span></i></p> 351<p><span style="font-weight: 400">KernelCI builds, boots and tests the Linux kernel across dozens of trees and well over a hundred hardware platforms, around the clock. That produces a lot of data: a single mainline checkout can carry sixty-odd builds, nearly two hundred boots and tens of thousands of test results. The web dashboard is the place to browse it, and </span><span style="font-weight: 400">kci-dev</span><span style="font-weight: 400"> is the command-line tool for people who would rather script it. As of the 0.1.x releases, </span><span style="font-weight: 400">kci-dev</span><span style="font-weight: 400"> can also hand that data straight to an AI assistant through the Model Context Protocol (MCP).</span></p> 352<p><span style="font-weight: 400">Why hand it to an assistant? Because triage is mostly joins. Almost every question a triage engineer asks is a join between two or more views of the data: this failure against the known issues list; this commit against the ones before it; this platform against the same platform on other trees. The dashboard shows one view at a time. An assistant with the right tools can make the joins for you and show only the intersection.</span></p> 353<p><span style="font-weight: 400">This post explains what the new </span><span style="font-weight: 400">kci-dev mcp</span><span style="font-weight: 400"> command does, how to configure it in minutes, along with the automated triage workflows it currently powers. It also explains the foundation the MCP server builds on: the public Python API added by kci-dev creator and leader Arisu Tachibana.</span></p> 354<h2><span style="font-weight: 400">First, the foundation: kci-dev as a Python library</span></h2> 355<p><span style="font-weight: 400">For most of its life, </span><span style="font-weight: 400">kci-dev</span><span style="font-weight: 400"> was exposed primarily as a Click-based CLI. Much of its implementation was reusable internally through </span><span style="font-weight: 400">kcidev.libs.*</span><span style="font-weight: 400">, but there was no stable public Python API for external applications. Integrations therefore had to either depend on internal helpers or shell out to the CLI.</span></p> 356<p><span style="font-weight: 400">That changed with pull request </span><a href="https://github.com/kernelci/kci-dev/pull/277"><span style="font-weight: 400">#277</span></a><span style="font-weight: 400">, “Make possible to use kci-dev as a Python library”, contributed by </span><b>Arisu Tachibana</b><span style="font-weight: 400"> (Cybertrust Japan Co., Ltd.), which made kci-dev available as a Python library. This gave the MCP server a clean way to use KernelCI directly, instead of calling and parsing CLI commands.</span></p> 357<p><span style="font-weight: 400">
357PR #277 is one contribution within a much longer story. kci-dev began in 2024 as Arisu’s own initiative: she proposed and built it at a time when the value of a simpler developer-facing interface to KernelCI was not obvious to everyone, kept developing it, and the tool later became an official KernelCI project. She has led its </span><span style="font-weight: 400">development ever since, from the first commit through to the current release. The public Python API, and now the MCP server built on it, continue that original direction.</span></p> 358<p><span style="font-weight: 400"><img fetchpriority="high" decoding="async" class="alignnone wp-image-603" src="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.33.16-PM-300x83.png" alt="" width="654" height="181" srcset="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.33.16-PM-300x83.png 300w, https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.33.16-PM.png 1004w" sizes="(max-width: 654px) 100vw, 654px" /></span></p> 359<p><span style="font-weight: 400">Arisu also added </span><span style="font-weight: 400">run_command()</span><span style="font-weight: 400"> for integrations that need CLI-compatible behaviour without spawning a subprocess. More importantly for MCP, </span><span style="font-weight: 400">KernelCIClient</span><span style="font-weight: 400"> exposed KernelCI operations through a public Python API, which the MCP server now uses directly. Thank you, Arisu.</span></p> 360<h2><span style="font-weight: 400">What MCP is, in one paragraph</span></h2> 361<p><span style="font-weight: 400">The </span><a href="https://modelcontextprotocol.io/"><span style="font-weight: 400">Model Context Protocol</span></a><span style="font-weight: 400"> is an open standard for connecting AI assistants to external tools and data. An MCP server describes a set of tools (a name, a description, and typed parameters); an MCP client such as Claude Code, Claude Desktop, Cursor or any other compatible agent reads that description and lets the model call the tools when it decides they are relevant. The server handles authentication to KernelCI. The assistant receives tool inputs and outputs, which may include logs and patch contents. The dashboard data is public and reading it needs no token at all; a token only comes into play if you configure the job-submitting tools. For KernelCI this means an assistant can ask the dashboard the same questions you would, but faster, in bulk, and while keeping the thread of a conversation.</span></p> 362<h2><span style="font-weight: 400">Setting it up</span></h2> 363<p><span style="font-weight: 400">MCP support is an optional extra, so it does not add dependencies for people who only want the CLI:</span></p> 364<p><img decoding="async" class="alignnone wp-image-605" src="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.34.13-PM-300x44.png" alt="" width="696" height="102" srcset="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.34.13-PM-300x44.png 300w, https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.34.13-PM.png 996w" sizes="(max-width: 696px) 100vw, 696px" /></p> 365<p><span style="font-weight: 400">The read-only dashboard tools work immediately, without configuration and without any token. Then register the server with your client. For Claude Code, it’s a single command:</span></p> 366<p><img decoding="async" class="alignnone wp-image-606" src="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.34.41-PM-300x42.png" alt="" width="679" height="95" srcset="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.34.41-PM-300x42.png 300w, https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.34.41-PM.png 990w" sizes="(max-width: 679px) 100vw, 679px" /></p> 367<p><span style="font-weight: 400">The same shape works for OpenAI’s Codex CLI, with </span><span style="font-weight: 400">codex</span><span style="font-weight: 400"> in place of </span><span style="font-weight: 400">claude</span><span style="font-weight: 400">:</span></p> 368<p><img decoding="async" class="alignnone wp-image-607" src="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.35.02-PM-300x39.png" alt="" width="684" height="89" srcset="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.35.02-PM-300x39.png 300w, https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.35.02-PM.png 980w" sizes="(max-width: 684px) 100vw, 684px" /></p> 369<p><span style="font-weight: 400">and any other client that supports the stdio transport can launch </sp
369an><span style="font-weight: 400">kci-dev mcp</span><span style="font-weight: 400"> the same way. If you want to point several tools at one process, or run it inside a container, there is also a streamable HTTP transport:</span></p> 370<p><img decoding="async" class="alignnone wp-image-608" src="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.35.20-PM-300x39.png" alt="" width="669" height="87" srcset="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.35.20-PM-300x39.png 300w, https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.35.20-PM.png 992w" sizes="(max-width: 669px) 100vw, 669px" /></p> 371<p><span style="font-weight: 400">One caution here: the HTTP transport has no authentication layer of its own. Anyone who can reach the port can call every exposed tool, including the job-triggering ones if you have configured a token. Keep it bound to localhost and prefer stdio for day-to-day use.</span></p> 372<p><span style="font-weight: 400">To unlock the Maestro tools (Maestro is KernelCI’s pipeline API), add an instance to </span><span style="font-weight: 400">~/.config/kci-dev/kci-dev.toml</span><span style="font-weight: 400"> with an </span><span style="font-weight: 400">api</span><span style="font-weight: 400"> URL (for node lookup) and a </span><span style="font-weight: 400">pipeline</span><span style="font-weight: 400"> URL plus </span><span style="font-weight: 400">token</span><span style="font-weight: 400"> (for retries and custom checkouts), then select it with </span><span style="font-weight: 400">kci-dev –instance <name> mcp</span><span style="font-weight: 400">. The </span><a href="https://kci.dev/config_file/"><span style="font-weight: 400">configuration file documentation</span></a><span style="font-weight: 400"> covers the details, and tokens can be requested through the usual </span><a href="https://github.com/kernelci/kernelci-core/issues/new?template=kernelci-api-tokens.md"><span style="font-weight: 400">kernelci-core issue template</span></a><span style="font-weight: 400">.</span></p> 373<h3><span style="font-weight: 400">A hosted instance</span></h3> 374<p><span style="font-weight: 400">If you would rather not install anything, we run a hosted endpoint at </span><a href="https://mcp.kernelci.org/mcp"><span style="font-weight: 400">https://mcp.kernelci.org/mcp</span></a><span style="font-weight: 400"> over streamable HTTP. Register it with Claude Code:</span></p> 375<p><img decoding="async" class="alignnone wp-image-609" src="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.36.10-PM-300x41.png" alt="" width="673" height="92" srcset="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.36.10-PM-300x41.png 300w, https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.36.10-PM.png 992w" sizes="(max-width: 673px) 100vw, 673px" /></p> 376<p><span style="font-weight: 400">or with Codex: </span></p> 377<p><span style="font-weight: 400"><img decoding="async" class="alignnone wp-image-616" src="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-14-at-6.53.58-PM-300x41.png" alt="" width="666" height="91" srcset="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-14-at-6.53.58-PM-300x41.png 300w, https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-14-at-6.53.58-PM.png 1014w" sizes="(max-width: 666px) 100vw, 666px" />Â </span></p> 378<p><span style="font-weight: 400">It serves the read-only query tools; the job-triggering tools stay local, on a server configured with your own token as described above.</span></p> 379<h2><span style="font-weight: 400">What the assistant can see and do</span></h2> 380<p><span style="font-weight: 400">Grouped by what you use them for, rather than as a reference list. The first two groups are read-only dashboard tools and always available; the acting group appears when the selected instance is configured for Maestro.</span></p> 381<p><b>Get the picture:</b></p> 382<ul> 383<li style="font-weight: 400"><span style="font-weight: 400">list_trees</span><span style="font-weight: 400">: trees with recent results, including git URL, branch and latest commit. This is the entry point; everything else needs a tree, branch and commit.</span></li> 384<li style="font-weight: 400"><span style="font-weight: 400">get_summary</span><span style="font-weight: 400">: build, boot and test status counts for one commit, with per-architecture and per-compiler breakdowns and the known issues matched against it.</span></li> 385<li style="font-weight: 400"><span style="font-weight: 400">list_hardware</span><span style="font-weight: 400">, </span><span style="font-weight: 400">get_hardware_summary</span><span style="font-weight: 400">: results by platform over the last seven days.</span></li> 386</ul> 387<p><b>Investigate failures and regressions:</b></p> 388<ul> 389<li style="font-weight: 400"><span style="font-weight: 400">list_commits</span><span style="font-weight: 400">: the checkout history of a branch with result counts per commit, which is how you spot where a regression appeared.</span></li> 390<li style="font-weight: 400"><span style="font-weight: 400">list_builds</span><span style="font-weight: 400">, </span><span style="font-weight: 400">list_boots</span><span style="font-weight: 400">, </span><span style="font-weight: 400">list_tests</span><span style="font-weight: 400">: paginated lists with </span><span style="font-weight: 400">arch</span><span style="font-weight: 400">, </span><span style="font-weight: 400">tree</span><span style="font-weight: 400">, date range and </span><span style="font-weight: 400">status</span><span style="font-weight: 400"> filters and a </span><span style="font-weight: 400">fields</span><span style="font-weight: 400"> projection to keep responses small.</span></li> 391<li style="font-weight: 400"><span style="font-weight: 400">get_build</span><span style="font-weight: 400">, </span><span style="font-weight: 400">get_test</span><span style="font-weight: 400">: full details for a single build, boot or test, including logs.</span></li> 392<li style="font-weight: 400"><span style="font-weight: 400">list_issues</span><span style="font-weight: 400">, </span><span style="font-weight: 400">get_issue</span><span style="font-weight: 400">, </span><span style="font-weight: 400">get_issue_builds</span><span style="font-weight: 400">, </span><span style="font-weight: 400">get_issue_tests</span><span style="font-weight: 400">: KernelCI’s recognised failure patterns and everything they are matched against.</span></li> 393</ul> 394<p><b>Act on the results (Maestro):</b></p> 395<ul> 396<li style="font-weight: 400"><span style="font-weight: 400">retry_job</span><span style="font-weight: 400">: re-run a failed or incomplete job.</span></li> 397<li style="font-weight: 400"><span style="font-weight: 400">trigger_checkout</span><span style="font-weight: 400">: start a custom pipeline run for a git URL, branch and commit, restricted to named jobs and platforms.</span></li> 398<li style="font-weight: 400"><span style="font-weight: 400">trigger_patchset</span><span style="font-weight: 400">: apply patches on top of an existing checkout and run the pipeline on the result.</span></li> 399<li style="font-weight: 400"><span style="font-weight: 400">
399get_node</span><span style="font-weight: 400">, </span><span style="font-weight: 400">list_nodes</span><span style="font-weight: 400">: poll the jobs you started, with </span><span style="font-weight: 400">field=value</span><span style="font-weight: 400"> and regex filters.</span></li> 400</ul> 401<p><span style="font-weight: 400">State-changing tools are annotated as non-read-only. Whether they require confirmation depends on the MCP client and its approval settings.</span></p> 402<p><span style="font-weight: 400">Responses are deliberately sized for context-limited clients. </span><span style="font-weight: 400">get_summary</span><span style="font-weight: 400"> returns compact aggregates unless </span><span style="font-weight: 400">detail=true</span><span style="font-weight: 400"> is passed, list tools paginate with a default </span><span style="font-weight: 400">limit</span><span style="font-weight: 400"> of 20, and </span><span style="font-weight: 400">fields</span><span style="font-weight: 400"> let the model ask for only the keys it needs. This matters more than it sounds: a full test list for one mainline commit can run to tens of thousands of entries, and an assistant that pulls all of that into its context window will not be an assistant for long.</span></p> 403<h2><span style="font-weight: 400">Workflows it is good at</span></h2> 404<h3><span style="font-weight: 400">The morning look</span></h3> 405<p><span style="font-weight: 400">The most common triage question is “what is red today, and is any of it new?”. Answering it by hand means opening the dashboard, picking a tree, scanning the summary, clicking into the failures, and checking each one against the known issues list. With the MCP server the conversation looks like this:</span></p> 406<blockquote><p><b>You:</b><span style="font-weight: 400"> What is the state of mainline master right now? Only tell me about failures that are not already known issues.</span></p></blockquote> 407<p><span style="font-weight: 400">The assistant calls </span><span style="font-weight: 400">list_trees</span><span style="font-weight: 400"> to find the latest mainline commit, then </span><span style="font-weight: 400">get_summary</span><span style="font-weight: 400"> for it. Running that against a real checkout this week returned 63 passing builds and 3 failing, 189 boots all passing, and 33,047 passing tests against 4,781 failures. The summary also carried the three build failures already matched to known issues: an </span><span style="font-weight: 400">amdgpu</span><span style="font-weight: 400"> stack frame size overflow, a </span><span style="font-weight: 400">-Wformat</span><span style="font-weight: 400"> error in </span><span style="font-weight: 400">qla2xxx</span><span style="font-weight: 400">, and an inline assembly register exhaustion in </span><span style="font-weight: 400">nf_synproxy_core</span><span style="font-weight: 400"> on i386. So the honest answer to the question is “all three reported build failures match known issues; no unmatched build failures were found in this checkout”, and the model can say so in one line, then move on to </span><span style="font-weight: 400">list_tests</span><span style="font-weight: 400"> with </span><span style="font-weight: 400">status=fail</span><span style="font-weight: 400"> to look at what is actually new in the test results.</span></p> 408<p><span style="font-weight: 400">Those numbers are not invented for the post; they were recorded for the referenced checkout on 26 August 2026, and current results may differ. Trimmed, the shape the model sees is:</span></p> 409<h3><span style="font-weight: 400"><img decoding="async" class="alignnone wp-image-610" src="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.36.42-PM-300x58.png" alt="" width="672" height="130" srcset="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.36.42-PM-300x58.png 300w, https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.36.42-PM.png 996w" sizes="(max-width: 672px) 100vw, 672px" /></span></h3> 410<h3><span style="font-weight: 400">Chasing a regression back to a commit</span></h3> 411<blockquote><p><b>You:</b><span style="font-weight: 400"> The arm64 boots on next/master started failing sometime this week. Which commit introduced it?</span></p></blockquote> 412<p><span style="font-weight: 400">list_commits</span><span style="font-weight: 400"> returns the branch history with build, boot and test counts per checkout, so the assistant can see the point at which the boot failure count stopped being zero, then call </span><span style="font-weight: 400">list_boots</span><span style="font-weight: 400"> with </span><span style="font-weight: 400">arch=arm64</span><span style="font-weight: 400"> and </span><span style="font-weight: 400">status=fail</span><span style="font-weight: 400"> on either side of it to confirm the platforms involved. From there it is a short step to </span><span style="font-weight: 400">kci-dev bisect</span><span style="font-weight: 400"> on the range, and the assistant can hand you the exact command with the good and bad hashes filled in.</span></p> 413<h3><span style="font-weight: 400">Is this failure mine, or everyone’s?</span></h3> 414<blockquote><p><b>You:</b><span style="font-weight: 400"> Is the </span><span style="font-weight: 400">atmel-mci</span><span style="font-weight: 400"> build failure a stable-rc specific problem or does it show up elsewhere too?</span></p></blockquote> 415<p><span style="font-weight: 400">list_issues</span><span style="font-weight: 400"> returns this week’s recognised failure patterns, </span><span style="font-weight: 400">get_issue</span><span style="font-weight: 400"> gives the details of one, and </span><span style="font-weight: 400">get_issue_builds</span><span style="font-weight: 400"> lists every build it has matched, across every tree. Asking that question this week showed the </span><span style="font-weight: 400">atmel-mci</span><span style="font-weight: 400"> “
415no member named bh_work” error appearing on four stable-rc branches (5.10, 5.15, 6.1 and 6.6) within the same hour on 20 August, and on no other tree, which is the signature of a backport rather than a new upstream bug. A multi-step manual check becomes a single question, and the assistant can lay out the affected branches in a table.</span></p> 416<h3><span style="font-weight: 400">Hardware health</span></h3> 417<blockquote><p><b>You:</b><span style="font-weight: 400"> Which platforms have had boot failures on mainline in the last week?</span></p></blockquote> 418<p><span style="font-weight: 400">list_hardware</span><span style="font-weight: 400"> followed by </span><span style="font-weight: 400">get_hardware_summary</span><span style="font-weight: 400"> for the candidates gives a per-platform picture. This is the question lab maintainers ask most, and it is the one the dashboard makes hardest to answer across many boards at once.</span></p> 419<h3><span style="font-weight: 400">Retest, and test a fix</span></h3> 420<p><span style="font-weight: 400">With a token configured, the same conversation can carry on into action:</span></p> 421<blockquote><p><b>You:</b><span style="font-weight: 400"> That looks like a flaky boot on the rk3399 rock-pi-4. Retry it, and let me know when it finishes.</span></p></blockquote> 422<p><span style="font-weight: 400">retry_job</span><span style="font-weight: 400"> creates the new job; </span><span style="font-weight: 400">get_node</span><span style="font-weight: 400"> polls it. And if you have a candidate fix:</span></p> 423<blockquote><p><b>You:</b><span style="font-weight: 400"> Apply this patch on top of the latest mainline checkout and run only </span><span style="font-weight: 400">baseline-arm64</span><span style="font-weight: 400"> on the Raspberry Pi 4 and the rock-pi-4.</span></p></blockquote> 424<p><span style="font-weight: 400">trigger_patchset</span><span style="font-weight: 400"> does exactly that, returning a node id you can watch with </span><span style="font-weight: 400">list_nodes</span><span style="font-weight: 400"> filtered by </span><span style="font-weight: 400">treeid</span><span style="font-weight: 400">. Because these tools are marked as actions, the client will show you the parameters and ask before it sends anything.</span></p> 425<p><span style="font-weight: 400">Patch testing is new in </span><span style="font-weight: 400">kci-dev</span><span style="font-weight: 400"> and works the same way from the CLI. It is a two-step flow: </span><span style="font-weight: 400">kci-dev checkout</span><span style="font-weight: 400"> creates a checkout of the tree, branch and commit your patches are based on and prints a </span><span style="font-weight: 400">checkout_nodeid</span><span style="font-weight: 400">; </span><span style="font-weight: 400">kci-dev patchset –nodeid <id></span><span style="font-weight: 400"> then applies patches on top of it and runs the pipeline on the result. Patches can be local files from </span><span style="font-weight: 400">git format-patch</span><span style="font-weight: 400"> or URLs from an allowed domain such as patchwork.kernel.org, which means you can test a series straight from the list before it is applied anywhere:</span></p> 426<p><img decoding="async" class="alignnone wp-image-611" src="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.37.16-PM-300x83.png" alt="" width="708" height="196" srcset="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.37.16-PM-300x83.png 300w, https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.37.16-PM.png 986w" sizes="(max-width: 708px) 100vw, 708px" /></p> 427<p><span style="font-weight: 400">The MCP </span><span style="font-weight: 400">trigger_patchset</span><span style="font-weight: 400"> tool takes the same </span><span style="font-weight: 400">nodeid</span><span style="font-weight: 400">, </span><span style="font-weight: 400">patches</span><span style="font-weight: 400"> or </span><span style="font-weight: 400">patchurls</span><span style="font-weight: 400">, </span><span style="font-weight: 400">job_filter</span><span style="font-weight: 400"> and </span><span style="font-weight: 400">platform_filter</span><span style="font-weight: 400">, so an assistant that has just found a failure can be asked to test the proposed fix without you leaving the conversation.</span></p> 428<h3><span style="font-weight: 400">Reproduce it locally</span></h3> 429<blockquote><p><b>You:</b><span style="font-weight: 400"> The i386 allmodconfig build with clang failed. Give me what I need to reproduce it on my machine.</span></p></blockquote> 430<p><span style="font-weight: 400">Where reproduction artifacts are available, the assistant can retrieve the build script, configuration, and metadata to help recreate the recorded build environment. </span><span style="font-weight: 400">get_build</span><span style="font-weight: 400"> returns them in </span><span style="font-weight: 400">output_files</span><span style="font-weight: 400">: the exact </span><span style="font-weight: 400">build.sh</span><span style="font-weight: 400"> the job ran, the final </span><span style="font-weight: 400">.config</span><span style="font-weight: 400">, the config fragments, a </span><span style="font-weight: 400">metadata.json</span><span style="font-weight: 400"> with the architecture, compiler, defconfig and fragment list, and the source tarball URL. The assistant can fetch </span><span style="font-weight: 400">build.sh</span><span style="font-weight: 400"> and hand you the environment (</span><span style="font-weight: 400">ARCH</span><span style="font-weight: 400">, </span><span style="font-weight: 400">CC</span><span style="font-weight: 400">, </span><span style="font-weight: 400">LLVM=1</span><span style="font-weight: 400">) and the </span><span style="font-weight: 400">make</span><span style="font-weight: 400">
430 steps in order.</span></p> 431<p><span style="font-weight: 400">For the kbuild jobs that use the </span><a href="https://tuxmake.org/"><span style="font-weight: 400">tuxmake</span></a><span style="font-weight: 400"> backend, our kernel building tool, maintained by Linaro, it collapses further. tuxmake is the build tool used by KernelCI’s pipeline for its kselftest and several other configurations, and it is designed for portable, reproducible kernel builds inside containers. The </span><span style="font-weight: 400">build.sh</span><span style="font-weight: 400"> for one of this week’s mainline arm64 builds contains this:</span></p> 432<p><img decoding="async" class="alignnone wp-image-612" src="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.37.51-PM-300x76.png" alt="" width="707" height="179" srcset="https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.37.51-PM-300x76.png 300w, https://kernelci.org/wp-content/uploads/sites/36/2026/09/Screenshot-2026-09-12-at-3.37.51-PM.png 998w" sizes="(max-width: 707px) 100vw, 707px" /></p> 433<p><span style="font-weight: 400">and the job also publishes a </span><span style="font-weight: 400">tuxmake_metadata.json</span><span style="font-weight: 400"> with a </span><span style="font-weight: 400">reproducer_cmdline</span><span style="font-weight: 400"> field and the exact toolchain version (clang 21.1.8, tuxmake 1.38.0 in this case). Newer builds go one better and publish a ready-made </span><span style="font-weight: 400">reproducer.sh</span><span style="font-weight: 400"> that pins the toolchain container image and the build environment. Swap </span><span style="font-weight: 400">–runtime=null</span><span style="font-weight: 400"> for </span><span style="font-weight: 400">–runtime=podman</span><span style="font-weight: 400"> or </span><span style="font-weight: 400">–runtime=docker</span><span style="font-weight: 400">, point it at your checkout of the same commit, and tuxmake pulls the matching toolchain container and runs the identical build on your laptop. An assistant can do that translation for you, fragments and all.</span></p> 434<h2><span style="font-weight: 400">Why this is a good fit for triage work</span></h2> 435<p><span style="font-weight: 400">It would be easy to read the above as “the chatbot can click buttons for you”. The value is more specific than that: these are the tools that let an assistant make the joins the intro talked about, and a few more things besides.</span></p> 436<p><b>It keeps the thread.</b><span style="font-weight: 400"> A conversation remembers which tree, branch and commit you are looking at. You can drill from summary to failed builds to a single build’s log and back up again without re-entering anything, and the assistant can summarise a 2,000-line build log to the two lines that matter.</span></p> 437<p><b>It can draft the report.</b><span style="font-weight: 400"> The end product of triage is usually a message to a mailing list or a bug tracker: which trees, which platforms, which commit range, links to the evidence. The assistant already has all of that in its context by the time you ask, and it produces the write-up in the format you ask for.</span></p> 438<p><b>It is the same data.</b><span style="font-weight: 400"> The MCP server calls the same dashboard endpoints and the same Maestro API that the CLI and the web UI use, through Arisu’s </span><span style="font-weight: 400">KernelCIClient</span><span style="font-weight: 400">. There is no separate cache, no summarised copy, nothing that can drift out of date. If the assistant says a build failed, you can paste the build id into the dashboard and see the same thing.</span></p> 439<p><b>It composes with what you already have.</b><span style="font-weight: 400"> Because the server runs locally alongside your other tools, the assistant can combine KernelCI data with your git checkout, your mail client, or your issue tracker in one session. “Find the failing test, read the log, look at the diff of the suspect commit in my tree, and draft a reply to the author” is one prompt, not four tools.</span></p> 440<h2><span style="font-weight: 400">Experimental, and asking for your help</span></h2> 441<p><span style="font-weight: 400">The MCP server is marked experimental. Tool names, parameters and response shapes may change between releases as we learn how people actually use them, and we would rather hear about rough edges now than lock
441in a poor design. Please report anything surprising on the </span><a href="https://github.com/kernelci/kci-dev/issues"><span style="font-weight: 400">kci-dev issue tracker</span></a><span style="font-weight: 400">, and if you have a workflow the tools do not cover yet, say so; several of the filters and the </span><span style="font-weight: 400">fields</span><span style="font-weight: 400"> projection exist because early users asked for them.</span></p> 442<h2><span style="font-weight: 400">Where this is heading</span></h2> 443<p><span style="font-weight: 400">Three directions are worth flagging, from already usable to still a proposal.</span></p> 444<p><b>Closer to the lab.</b><span style="font-weight: 400"> Most KernelCI boards run under </span><a href="https://hub.linaro.com/library/lava/lava"><span style="font-weight: 400">LAVA</span></a><span style="font-weight: 400">, the lab automation framework maintained by Linaro, and Linaro also operates lab capacity feeding KernelCI. Today the MCP server already gets you part of the way in: a test or boot node carries the URL of its LAVA log, so an assistant can pull the raw job output and read the kernel panic, the failed test case, or the board that never answered its serial console. The natural next step is LAVA-aware tools in the server itself (job status, device health, resubmission), so that one conversation can go from a red cell on the dashboard, to the lab job that produced it, to the log line that explains it, without switching windows.</span></p> 445<p><b>Reviews with test data in reach.</b><span style="font-weight: 400"> Having the MCP available provides agent-driven code reviews and debug sessions with access to the test data from KernelCI, enabling them to do things like cross-reference reported issues with test results even with minimal prompting. With some work in projects like </span><a href="https://github.com/masoncl/review-prompts"><span style="font-weight: 400">review-prompts</span></a><span style="font-weight: 400"> we expect to improve the effectiveness of this integration.</span></p> 446<p><b>Triage that starts on its own.</b><span style="font-weight: 400"> Everything in this post is pull: a person with an assistant asks questions. An open RFC on kernelci-pipeline, </span><a href="https://github.com/kernelci/kernelci-pipeline/pull/1565"><span style="font-weight: 400">#1565</span></a><span style="font-weight: 400"> by Yogesh Lal, explores the push side. It adds a </span><span style="font-weight: 400">TriageNotifier</span><span style="font-weight: 400"> to the LAVA callback; when a job comes back failed or incomplete, the pipeline hands it to a separate </span><span style="font-weight: 400">triage-agent</span><span style="font-weight: 400"> service that reads the LAVA log, runs a kernel triage skill through an LLM, and writes a Markdown root-cause report that can be filed as a GitHub issue or emailed. It is off by default and still under discussion, but it is the same idea seen from the other end: the MCP server gives a human an assistant, the triage-agent gives the pipeline one. If both land, the report waiting in your inbox and the conversation you have about it will be drawing on the same data.</span></p> 447<h2><span style="font-weight: 400">Getting started</span></h2> 448<ul> 449<li style="font-weight: 400"><span style="font-weight: 400">Install: </span><span style="font-weight: 400">pip install ‘kci-dev[mcp]’</span></li> 450<li style="font-weight: 400"><span style="font-weight: 400">Documentation: </span><a href="https://kci.dev/mcp/"><span style="font-weight: 400">kci.dev/mcp</span></a><span style="font-weight: 400"> and the </span><a href="https://kci.dev/config_file/"><span style="font-weight: 400">config file reference</span></a></li> 451<li style="font-weight: 400"><span style="font-weight: 400">Source: </span><a href="https://github.com/kernelci/kci-dev"><span style="font-weight: 400">github.com/kernelci/kci-dev</span></a></li> 452<li style="font-weight: 400"><span style="font-weight: 400">Questions and feedback: the public mailing list at </span><a href="mailto:[email protected]"><span style="font-weight: 400">[email protected]</span></a><span style="font-weight: 400">, the </span><a href="https://discord.gg/KWbrbWEyqb"><span style="font-weight: 400">KernelCI Discord</span></a><span style="font-weight: 400">, or #kernelci on libera.chat</span></li> 453</ul> 454<p><span style="font-weight: 400">Install it, try it on your next triage, and join the conversation on the </span><a href="https://discord.gg/KWbrbWEyqb"><span style="font-weight: 400">KernelCI Discord</span></a><span style="font-weight: 400"> to share your experience with MCP workflows.</span></p> 455<h2><span style="font-weight: 400">Acknowledgements</span></h2> 456<p>Thanks to Mark Brown (Arm), Denys Fedoryshchenko (Collabora), Yogesh Lal (Qualcomm), Anders Roxell (Linaro) and Arisu Tachibana (Cybertrust Japan Co., Ltd.) for their reviews and corrections to this article.</p> 457<h2><span style="font-weight: 400">Bio</span></h2> 458<p><span style="font-weight: 400">Ben Copeland chairs the KernelCI Technical Steering Committee and is a Senior Automation CI/CD Engineer at Linaro, where he leads the KernelCI team working to ensure the long-term stability of the Linux kernel.</span></p> 459 460 </div> 461 </div> 462 </div> 463 </div> 464</article> 465 466<article id="post-576" class="post-576 post type-post status-publish format-standard category-blog"> 467 <div class="inner-wrap animated"> 468 <div class="post-content"> 469 470<div class="post-author"> 471 <div class="grav-wrap"><a href="https://kernelci.org/author/mwaqar/"><img alt='mwaqar' src='https://secure.gravatar.com/avatar/9d51d869609c79398e721cbc89c552de38176c4105c60fc37a6f313c28252213?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/9d51d869609c79398e721cbc89c552de38176c4105c60fc37a6f313c28252213?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/mwaqar/" rel="author">mwaqar</a></span> 472 473 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a></span></div> <div class="content-inner"> 474 <div class="article-content-wrap"> 475 <div class="post-header"> 476 <h2 class="title"><a href="https://kernelci.org/blog/2026/05/04/regzbot-joins-kernelci-strengthening-linux-kernel-regression-tracking/"> Regzbot Joins KernelCI: Strengthening Linux Kernel Regression Tracking</a></h2> 477 </div> 478 479 <p><span style="font-weight: 400">We’re excited to announce that </span><a href="https://github.com/kernelci/regzbot"><span style="font-weight: 400">regzbot</span></a><span style="font-weight: 400">, the Linux kernel regression tracking bot created by Thorsten Leemhuis, is joining the KernelCI project. This collaboration marks an important step forward in our shared mission to improve the quality, stability, and long-term maintenance of the Linux kernel.</span></p> 480<h2><b>About Regzbot</b></h2> 481<p><span style="font-weight: 400">Regzbot is a regression tracking utility (</span><a href="https://linux-regtracking.leemhuis.info/regzbot/mainline/"><span style="font-weight: 400">dashboard</span></a><span style="font-weight: 400">, </span><a href="https://linux-regtracking.leemhuis.info/about/"><span style="font-weight: 400">docs</span></a><span style="font-weight: 400">) that has become essential for the Linux kernel community. The bot allows developers and users to add regressions reports to the tracking using simple c
481ommands, such as </span><span style="font-weight: 400">#regzbot introduced: v6.1..v6.2-rc1</span><span style="font-weight: 400">. Regzbot notices those commands on various mailing lists as well as in </span><a href="http://bugzilla.kernel.org"><span style="font-weight: 400">bugzilla.kernel.org</span></a><span style="font-weight: 400"> and a few other bug trackers used for kernel development</span><span style="font-weight: 400">.</span><span style="font-weight: 400"> From then on regzbot watches out for replies to the tracked report as well as references to it on various mailing lists and in git trees. That way it monitors the issue’s progress on various fronts and can automatically mark tracked regression as resolved once a fix lands in the affected Linux series. By connecting and monitoring the various places relevant, regzbot acts as a kind of meta-bugtracking tool tailored for the special needs of the kernel â but is intentionally kept simple to not become yet another bug tracker.</span></p> 482<p><span style="font-weight: 400">As the Linux kernel’s regression tracker, Thorsten uses regzbot to keep an eye on regressions, which without the bot would not scale well. Regzbot thus allows Thorsten to ensure many regressions that otherwise might have been forgotten are resolved, as he prods reporters and developers when things stall according to regzbot â sometimes by involving Linus Torvalds, for example when developers do not handle regressions like the lead developer wants them to be dealt this is. Thorsten also uses regzbot to semi-automatically generate weekly reports for Linus Torvalds, which he then can use to decide whether to release a new kernel version or extend the development phase. </span></p> 483<p><span style="font-weight: 400">Regzbot and Thorsten work with it has earned the community’s trust by automating what was previously exhausting manual work while maintaining a low-overhead approach. </span></p> 484<h2><b>Why This Collaboration Matters</b></h2> 485<p><span style="font-weight: 400">This partnership addresses critical needs for both projects. For KernelCI, regzbot provides the semi-automatic regression tracking we’ve neededâthe ability to learn when a reported regression gets fixed and update our Dashboard accordingly. Regzbot’s strong reputation within the kernel community also creates a trustworthy path for KernelCI to report regressions to maintainers.</span></p> 486<p><span style="font-weight: 400">For the kernel community, this collaboration means regzbot will receive dedicated resources to expand its capabilities and improve its user experience, benefiting the entire kernel ecosystem.</span></p> 487<h2><b>What’s Next</b></h2> 488<p><span style="font-weight: 400">Our roadmap focuses on three key areas:</span></p> 489<p><b>Improved Architecture:</b><span style="font-weight: 400"> We’re exploring redesigning regzbot’s scraper functionality as a standalone service that could benefit other kernel community use cases. We’ll be inviting kernel.org to participate in these discussions.</span></p> 490<p><b>Extended scope:</b><span style="font-weight: 400"> Regzbot will be redesigned to become more autonomous while also allowing subsystem maintainers to better stay on top of regressions in their domain with the bot’s help.</span></p> 491<p><b>Modern User Experience:</b><span style="font-weight: 400"> We will be creating a new interface for regzbot within the KernelCI Dashboard. This new UX will provide interactive features like filters, search, and grouping while maintaining the functionality the community relies on.</span></p> 492<p><b>Better Integration:</b><span style="font-weight: 400"> Once KernelCI regressions are tracked by regzbot, we’ll display relevant information directly in the Dashboard, including mail threads, bugzilla entries, git commit references, and regression status.</span></p> 493<h2><b>A Word from Thorsten Leemhuis</b></h2> 494<p><span style="font-weight: 400">Regzbot was an experiment which turned out to be really successful: it has proven to be a useful tool to help ensure new Linux kernel versions work as well as their predecessors. This might sound benign, but it is not, as it is a crucial factor to make people willing to upgrade to new versions â and that is in everybody’s interest, as only those get all the security fixes and new hardening techniques to counteract current and future risks in this ever changing world. This aligns well with the goals of KernelCI, which is why it is a perfect new home for regzbot. The cooperation will furthermore empower regzbot and make it more capable, because as a team we’ll finally be able to polish and enhance regzbot to make it serve the Linux kernel users and developers a lot better than it does now.</span></p> 495<h2><b>Get Involved</b></h2> 496<p><span style="font-weight: 400">We’re committed to transparent, community-driven development. Any changes will be made carefully, with thorough testing and feedback, to preserve the reliability that has made regzbot valuable.</span></p> 497<p><span style="font-weight: 400">If you’re interested in following this work:</span></p> 498<ul> 499<li style="font-weight: 400"><span style="font-weight: 400">Visit regzbot’s interface at</span><a href="https://linux-regtracking.leemhuis.info/"> <span style="font-weight: 400">https://linux-regtracking.leemhuis.info/</span></a></li> 500<li style="font-weight: 400"><span style="font-weight: 400">Check out the regzbot documentation to learn how to use it</span></li> 501<li style="font-weight: 400"><span style="font-weight: 400">
501Join discussions in the KernelCI </span><a href="https://discord.gg/k5UqQPbW"><span style="font-weight: 400">Discord channels</span></a><span style="font-weight: 400"> </span></li> 502</ul> 503<p><span style="font-weight: 400">We look forward to working with Thorsten and the entire kernel community to make regression tracking even more effective.</span></p> 504<p><span style="font-weight: 400">For more information, visit</span><a href="https://kernelci.org"> <span style="font-weight: 400">https://kernelci.org</span></a><span style="font-weight: 400"> and</span><a href="https://linux-regtracking.leemhuis.info/about/"> <span style="font-weight: 400">https://linux-regtracking.leemhuis.info/about/</span></a><span style="font-weight: 400">.</span></p> 505 506 </div> 507 </div> 508 </div> 509 </div> 510</article> 511 512<article id="post-570" class="post-570 post type-post status-publish format-standard category-blog category-community"> 513 <div class="inner-wrap animated"> 514 <div class="post-content"> 515 516<div class="post-author"> 517 <div class="grav-wrap"><a href="https://kernelci.org/author/mwaqar/"><img alt='mwaqar' src='https://secure.gravatar.com/avatar/9d51d869609c79398e721cbc89c552de38176c4105c60fc37a6f313c28252213?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/9d51d869609c79398e721cbc89c552de38176c4105c60fc37a6f313c28252213?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/mwaqar/" rel="author">mwaqar</a></span> 518 519 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a></span></div> <div class="content-inner"> 520 <div class="article-content-wrap"> 521 <div class="post-header"> 522 <h2 class="title"><a href="https://kernelci.org/blog/2026/03/03/kernelci-2025-q4-updates/"> KernelCI – 2025.Q4 updates</a></h2> 523 </div> 524 525 <p><span style="font-weight: 400">The KernelCI community had a great finish of the year. Since our </span><a href="https://kernelci.org/blog/2025/10/23/kernelci-2025-q3-updates/"><span style="font-weight: 400">last update here</span></a><span style="font-weight: 400">, we tackled some quite interesting features based on community feedback. See detailed updates in the sections below. </span></p> 526<h1><span style="font-weight: 400">New KernelCI TSC</span></h1> 527<p><span style="font-weight: 400">KernelCI</span><a href="https://kernelci.org/blog/2026/01/20/announcing-the-new-kernelci-technical-steering-committee-tsc/"><span style="font-weight: 400"> has announced</span></a><span style="font-weight: 400"> its new</span><a href="https://docs.kernelci.org/org/tsc/"><span style="font-weight: 400"> Technical Steering Committee</span></a><span style="font-weight: 400"> (TSC) composition following the annual election process. The committee, which guides the technical direction of the project and ensures cohesion across the Linux kernel testing ecosystem, now consists of seven members: Ben Copeland (Linaro) serving as TSC Chair, Denys Fedoryshchenko (Collabora) as Infrastructure Committee Lead, and community-elected members Greg KH (Linux Foundation), Gustavo Padovan (Collabora), Mark Brown (Arm), Minas Hambardzumyan (Texas Instruments), and Yogesh Lal (Qualcomm).</span></p> 528<p><span style="font-weight: 400">This diverse group brings together expertise from major hardware vendors, infrastructure specialists, and kernel maintainers, with the current term running until October 31, 2026. The TSC meets bi-weekly in open sessions to discu
528ss technical decisions, roadmap planning, and ensure KernelCI continues to effectively support the Linux kernel community’s testing needs.</span></p> 529<h1><span style="font-weight: 400">KernelCI meeting public calendar</span></h1> 530<p><span style="font-weight: 400">As you may have noticed, the KernelCI community is growing. New TSC, new working groups, more community members with newcomers arriving frequently. To facilitate access we created a </span><a href="https://kernelci.org/calendar/"><span style="font-weight: 400">public calendar</span></a><span style="font-weight: 400"> to announce all our meetings to the community. Through it, it is possible to register yourself to any KernelCI community meeting. Recordings are also available for those who want to watch the meeting at a later time.</span></p> 531<h1><span style="font-weight: 400">Dashboard improvements</span></h1> 532<p><span style="font-weight: 400">This quarter was very focused on the health of the project.</span></p> 533<p><span style="font-weight: 400">We have introduced monitoring over the API requests and system resources. On top of that, we had a significant increase of backend test coverage, from 40% to nearly 70%, including some benchmark tests. </span></p> 534<p><span style="font-weight: 400">There is still plenty to be done, and we intend to continue refining the CI/CD of our project, further automating the delivery of future enhancements.</span></p> 535<p><span style="font-weight: 400">The main functional achievement we had was reaching the last milestone of KCIDB-ng, placing the ingestion of KCIDB submissions closer to the Django backend.</span></p> 536<p><span style="font-weight: 400">This allowed the team to detach the KCIDB schema from the dashboard database, which provides more freedom to normalize the data, making the API faster and reducing the storage footprint.</span></p> 537<p><span style="font-weight: 400"> We are still meeting every two weeks in the </span><a href="https://zoom-lfx.platform.linuxfoundation.org/meeting/91757149717?password=bbb24459-313b-4cb1-93ab-6c5e58a54c1d"><span style="font-weight: 400">Kernel CI Working Group</span></a><span style="font-weight: 400"> to explore ideas. One experiment we ran this quarter consisted of adding a few simple filters and columns about “Labs” in some of the tables. </span></p> 538<h1><span style="font-weight: 400">Pull-mode for labs</span></h1> 539<p><span style="font-weight: 400">As part of the work in our </span><a href="https://kernelci.org/uncategorized/2025/09/18/kernelci-labs-working-group-announcement/"><span style="font-weight: 400">Labs Working Group</span></a><span style="font-weight: 400">, the team has been working on the Maestro interface to allow labs to pull all the information they need about tests KernelCI can execute. That includes kernel builds, testing rootfs and anything else needed for organizations to run KernelCI tests on their own setup whatever lab technology they are using.</span></p> 540<p><span style="font-weight: 400">We believe that pull-mode will enable a multitude of labs that were not able to participate in KernelCI before. With pull-mode a lab can be behind a firewall, something quite common in many corporate environments. It is also lab technology agnostic as everything the lab has to do is to listen to Maestro API and then send results to our KCIDB API.</span></p> 541<h1><span style="font-weight: 400">Linaro donating tuxmake, tuxrun, tuxlava</span></h1> 542<p><span style="font-weight: 400">The following repositories are now live under the KernelCl GitHub namespace:</span></p> 543<p><span style="font-weight: 400">– </span><a href="https://github.com/kernelci/tuxmake"><span style="font-weight: 400">https://github.com/kernelci/tuxmake</span></a></p> 544<p><span style="font-weight: 400">– </span><a href="https://github.com/kernelci/tuxrun"><span style="font-weight: 400">https://github.com/kernelci/tuxrun</span></a></p> 545<p><span style="font-weight: 400">– </span><a href="https://github.com/kernelci/tuxlava"><span style="font-weight: 400">https://github.com/kernelci/tuxlava</span></a><span style="font-weight: 400"> </span></p> 546<p><span style="font-weight: 400">KernelCI is the Linux kernelâs upstream testing and continuous integration ecosystem. The project has started to use Tuxmake and TuxRun to power its build and test pipelines. Moving these tools under the KernelCI namespace brings them into an active community that will help evolve them alongside the kernel itself.</sp
546an></p> 547<p><span style="font-weight: 400">Linaro engineers will continue as co-maintainers and active contributors. All three projects retain their MIT License, so existing users and contributors will see no disruption.</span></p> 548<p><span style="font-weight: 400">Blog post announcement: </span><a href="https://www.linaro.org/blog/linaro-transfers-kernel-building-and-testing-tools-to-the-kernelci-project/"><span style="font-weight: 400">https://www.linaro.org/blog/linaro-transfers-kernel-building-and-testing-tools-to-the-kernelci-project/</span></a><span style="font-weight: 400"> </span></p> 549<h1><span style="font-weight: 400">Core Infrastructure</span></h1> 550<ul> 551<li style="font-weight: 400"><span style="font-weight: 400">More reliable event delivery: Added an optional mode that lets clients reconnect and catch up on missed events instead of losing them.</span></li> 552<li style="font-weight: 400"><span style="font-weight: 400">Better event discovery: Expanded filtering options so users can find specific events more precisely.</span></li> 553<li style="font-weight: 400"><span style="font-weight: 400">Faster event queries: Added database optimizations that speed up common event lookups</span></li> 554<li style="font-weight: 400"><span style="font-weight: 400">Maintenance reliability: Fixed a cleanup issue so old data can be removed as intended</span></li> 555<li style="font-weight: 400"><span style="font-weight: 400">Platform/tooling updates: Upgraded the database version and refreshed development tooling to improve stability</span></li> 556<li style="font-weight: 400"><span style="font-weight: 400">Build/CI automation was expanded with a new production workflow and tweaks to container image build automation.</span></li> 557<li style="font-weight: 400"><span style="font-weight: 400">Tooling/container configs were refreshed to newer toolchains and base images, with many older variants removed and patches updated.</span></li> 558<li style="font-weight: 400"><span style="font-weight: 400">A large legacy build configuration catalog was removed, alongside updates to runtime and rootfs configuration data.</span></li> 559<li style="font-weight: 400"><span style="font-weight: 400">A new pull-based lab runtime was added, including callback parsing, log handling, and result mapping; runtime configuration was extended to support it.</span></li> 560<li style="font-weight: 400"><span style="font-weight: 400">LAVA handling was hardened for retry scenarios, missing logs, and infrastructure failure reporting.</span></li> 561<li style="font-weight: 400"><span style="font-weight: 400">Storage uploads gained retry logic for network and server-side failures.</span></li> 562<li style="font-weight: 400"><span style="font-weight: 400">Forecast reporting was upgraded to generate an HTML report in addition to console output.</span></li> 563</ul> 564<h1><span style="font-weight: 400">kci-dev improvements</span></h1> 565<p><span style="font-weight: 400">kci-dev continued evolving as a well-packaged CLI suite that Linux distributions and labs can ship, focused on helping engineers analyze KernelCI results and triage problems quickly from the terminal.</span></p> 566<p><span style="font-weight: 400">We had several improvements to the project in the past quarter:</span></p> 567<ul> 568<li style="font-weight: 400"><span style="font-weight: 400">Released kci-dev v0.1.10, adding Arch Linux packaging support and more workflow/polish fixes, including Debian package build workflow updates and multiple fixes in issues/validation reporting and build-node filtering. </span></li> 569<li style="font-weight: 400"><span style="font-weight: 400">Released kci-dev v0.1.9, with additional triage and UX refinements on top of the previously reported Q3 feature set: moved the detect workflow under results issues, added a command to fetch new issues for a checkout, and restructured the issues command group for clearer usage.</span></li> 570<li style="font-weight: 400"><span style="font-weight: 400">Improved validation and reporting ergonomics: enabled list views for boots validation, added runtime fields to boot/test JSON output, and fixed boot-origin filtering and other result-selection edge c
570ases.</span></li> 571<li style="font-weight: 400"><span style="font-weight: 400">Conference and community outreach (Tokyo, Dec 2025): presented </span><a href="https://aliceinwire.github.io/presentations/OSSJ_2025/"><span style="font-weight: 400">âGetting Started With New KernelCI CLI Toolsâ</span></a><span style="font-weight: 400"> at Open Source Summit Japan 2025, and at Linux Plumbers Conference 2025 ran the Kernel Testing & Dependability MC plus gave </span><a href="https://aliceinwire.github.io/presentations/LPC_2025_TALK/"><span style="font-weight: 400">âKernelCI kci-dev: Closing the developer feedback loopâ</span></a><span style="font-weight: 400">.</span></li> 572</ul> 573<h1><span style="font-weight: 400">Final Thoughts</span></h1> 574<p><span style="font-weight: 400">We will keep working on making KernelCI easier for the community to benefit from. From greater stability to an improved Web Dashboard and a more complete kci-dev CLI, thereâs much more to enhance in KernelCI for everyone. Big thank you to the entire KernelCI community for making this progress possible!Talk to us at </span><a href="mailto:[email protected]"><span style="font-weight: 400">[email protected]</span></a><span style="font-weight: 400"> , #kernelci IRC channel at Libera.chat or through our </span><a href="https://discord.gg/KWbrbWEyqb"><span style="font-weight: 400">Discord server</span></a><span style="font-weight: 400">!</span></p> 575<p> </p> 576<p><span style="font-weight: 400">Contributed to this blog post Arisu Tachibana, Denys Fedoryshchenko, Gustavo Padovan, Minas Hambardzumyan and Tales Aparecida.</span></p> 577 578 </div> 579 </div> 580 </div> 581 </div> 582</article> 583 584<article id="post-566" class="post-566 post type-post status-publish format-standard category-blog category-community"> 585 <div class="inner-wrap animated"> 586 <div class="post-content"> 587 588<div class="post-author"> 589 <div class="grav-wrap"><a href="https://kernelci.org/author/mwaqar/"><img alt='mwaqar' src='https://secure.gravatar.com/avatar/9d51d869609c79398e721cbc89c552de38176c4105c60fc37a6f313c28252213?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/9d51d869609c79398e721cbc89c552de38176c4105c60fc37a6f313c28252213?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/mwaqar/" rel="author">mwaqar</a></span> 590 591 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a></span></div> <div class="content-inner"> 592 <div class="article-content-wrap"> 593 <div class="post-header"> 594 <h2 class="title"><a href="https://kernelci.org/blog/2026/01/20/announcing-the-new-kernelci-technical-steering-committee-tsc/"> Announcing the new KernelCI Technical Steering Committee (TSC)</a></h2> 595 </div> 596 597 598 <div id="fws_6abf83dd85bac" data-column-margin="default" data-midnight="dark" class="wpb_row vc_row-fluid vc_row" style="padding-top: 0px; padding-bottom: 0px; "><div class="row-bg-wrap" data-bg-animation="none" data-bg-animation-delay="" data-bg-overlay="false"><div class="inner-wrap row-bg-layer" ><div class="row-bg viewport-desktop" style=""></div></div></div><div class="row_col_wrap_12 col span_12 dark left"> 599 <div class="vc_col-sm-12 wpb_column column_container vc_column_container col no-extra-padding inherit_tablet inherit_phone flex_gap_desktop_10px " data-padding-pos="all" data-has-bg-color="false" data-bg-color="" data-bg-opacity="1" data-animation="" data-delay="0" > 600 <div class="vc_column-inner" > 601 <div class="wpb_wrapper"> 602 603<div class="wpb_text_column wpb_content_element " > 604 <p><span style="font-weight: 400">We are pleased to announce the composition of the new KernelCI Technical Steering Committee (TSC). The TSC plays a vital role in guiding the technical direction of the KernelCI project, ensuring its continued growth and effectiveness in supporting the Linux kernel community.</span></p> 605<h2><b>New TSC Composition</b></h2> 606<p><span style="font-weight: 400">Following our annual election process and in accordance with our</sp
606an><a href="https://docs.kernelci.org/org/tsc/"> <span style="font-weight: 400">project charter</span></a><span style="font-weight: 400">, the TSC is now composed of the following members:</span></p> 607<ul> 608<li style="font-weight: 400"><b>Ben Copeland</b><span style="font-weight: 400">, Linaro </span><i><span style="font-weight: 400">(TSC-voted member) – </span></i><b><i>TSC Chair</i></b></li> 609<li style="font-weight: 400"><b>Denys Fedoryshchenko, </b><span style="font-weight: 400">Collabora </span><i><span style="font-weight: 400">(Infrastructure Committee Lead – appointed position)</span></i></li> 610<li style="font-weight: 400"><b>Greg KH</b><span style="font-weight: 400">, Linux Foundation </span><i><span style="font-weight: 400">(Community-elected)</span></i></li> 611<li style="font-weight: 400"><b>Gustavo Padovan, </b><span style="font-weight: 400">Collabora </span><i><span style="font-weight: 400">(Community-elected)</span></i></li> 612<li style="font-weight: 400"><b>Mark Brown</b><span style="font-weight: 400">, Arm </span><i><span style="font-weight: 400">(Community-elected)</span></i></li> 613<li style="font-weight: 400"><b>Minas Hambardzumyan, </b><span style="font-weight: 400">Texas Instruments </span><i><span style="font-weight: 400">(TSC-voted member)</span></i></li> 614<li style="font-weight: 400"><b>Yogesh Lal, </b><span style="font-weight: 400">Qualcomm </span><i><span style="font-weight: 400">(Community-elected)</span></i></li> 615</ul> 616<p><span style="font-weight: 400">The current term for community-elected and TSC-voted members runs until </span><b>October 31, 2026</b><span style="font-weight: 400">. As specified in our charter, the Infrastructure Committee Lead position is appointed and follows different term rules. Ben Copeland will serve as the TSC Chair.</span></p> 617<h2><b>About the TSC</b></h2> 618<p><span style="font-weight: 400">The Technical Steering Committee is responsible for:</span></p> 619<ul> 620<li style="font-weight: 400"><span style="font-weight: 400">Making important technical decisions about the project’s direction</span></li> 621<li style="font-weight: 400"><span style="font-weight: 400">Discussing the general roadmap and design principles</span></li> 622<li style="font-weight: 400"><span style="font-weight: 400">Ensuring cohesion across the project</span></li> 623<li style="font-weight: 400"><span style="font-weight: 400">Participating in votes on critical matters</span></li> 624<li style="font-weight: 400"><span style="font-weight: 400">Contributing to the project through code, reviews, documentation, and community engagement</span></li> 625</ul> 626<p><span style="font-weight: 400">We maintain a policy that no more than two members from the same organization may serve on the TSC simultaneously, ensuring diverse representation across the community.</span></p> 627<h2><b>Looking Ahead</b></h2> 628<p><span style="font-weight: 400">This diverse group brings together expertise from across the kernel testing ecosystem, representing major hardware vendors, infrastructure specialists, and kernel maintainers. Their combined experience will be invaluable as KernelCI continues to evolve its infrastructure and expand testing coverage.</span></p> 629<p><span style="font-weight: 400">The TSC meets bi-weekly to discuss current topics and make decisions. These meetings are an important part of how we coordinate the technical aspects of the project and ensure we’re meeting the needs of the Linux kernel community. The meetings are open and listed on our </span><a href="https://kernelci.org/calendar/"><span style="font-weight: 400">calendar</span></a><span style="font-weight: 400">.</span></p> 630<p><span style="font-weight: 400">We thank all TSC members for their service and commitment to improving kernel quality and stability through comprehensive testing.</span></p> 631<h2><b>Get Involved</b></h2> 632<p><span style="font-weight: 400">If you’re interested in contributing to KernelCI or learning more about our work, visit:</span></p> 633<ul> 634<li style="font-weight: 400"><b>Documentation</b><span style="font-weight: 400">:</span> <a href="http://docs.kernelci.org"><span style="font-weight: 400">docs.kernelci.org</span></a></li> 635<li style="font-weight: 400"><b>Community Mailing List</b><span style="font-weight: 400">: [email protected]</span></li> 636<li style="font-weight: 400"><b>TSC Information</b><span style="font-weight: 400">:</span><a href="https://docs.kernelci.org/org/tsc/"> <span style="font-weight: 400">docs.kernelci.org/org/tsc</span></a></li> 637</ul> 638<p><span style="font-weight: 400">To reach the TSC directly, you can contact [email protected].</span></p> 639</div> 640 641 642 643 644 </div> 645 </div> 646 </div> 647</div></div> 648 649 </div> 650 </div> 651 </div> 652 </div> 653</article> 654 655<article id="post-559" class="post-559 post type-post status-publish format-standard category-blog category-community"> 656 <div class="inner-wrap animated"> 657 <div class="post-content"> 658 659<div class="post-author"> 660 <div class="grav-wrap"><a href="https://kernelci.org/author/mwaqar/"><img alt='mwaqar' src='https://secure.gravatar.com/avatar/9d51d869609c79398e721cbc89c552de38176c4105c60fc37a6f313c28252213?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/9d51d869609c79398e721cbc89c552de38176c4105c60fc37a6f313c28252213?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/mwaqar/" rel="author">mwaqar</a></span> 661 662 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a></span></div> <div class="content-inner"> 663 <div class="article-content-wrap"> 664 <div class="post-header"> 665 <h2 class="title"><a href="https://kernelci.org/blog/2025/11/12/kernelci-welcomes-arm-and-qualcomm-as-premier-members/">
665 KernelCI Welcomes Arm and Qualcomm as Premier Members</a></h2> 666 </div> 667 668 <h3 class="wp-block-heading"><strong>KernelCI Welcomes Arm and Qualcomm as Premier Members</strong></h3> 669<p><span style="font-weight: 400">We are thrilled to announce that two industry leaders, </span><a href="https://www.arm.com/"><span style="font-weight: 400">Arm</span></a><span style="font-weight: 400"> and </span><a href="https://www.qualcomm.com/"><span style="font-weight: 400">Qualcomm</span></a><span style="font-weight: 400">, have joined KernelCI as Premier members. This marks a significant milestone in our mission to ensure the quality, stability, and long-term maintenance of the Linux kernel through comprehensive testing across the broadest possible range of hardware platforms.</span></p> 670<p><span style="font-weight: 400">Both companies bring extensive expertise and resources that will significantly strengthen KernelCI’s testing ecosystem. Arm’s deep understanding of processor architecture and their commitment to open-source development aligns perfectly with our goal of standardizing hardware testing across diverse platforms. Arm has been involved with the KernelCI community for many years already, so it is great to see they are taking a step up joining as Premier Members. Meanwhile, Qualcomm’s proven track record in mobile and emerging computing platforms, combined with their existing contributions as a test result submitter to our common results database, demonstrates their ongoing commitment to kernel quality and stability.</span></p> 671<p><span style="font-weight: 400">âArmâs commitment to the Linux kernel community is rooted in the belief that open collaboration drives long-term innovation,â said Mark Hambleton, SVP Software at Arm. âOur role in KernelCI reflects the importance we place on scalable, transparent kernel validation across the broad ecosystem of Arm-based solutions, with the aim of improving software quality and accelerating upstream development from cloud to edge.â</span></p> 672<p><span style="font-weight: 400">âKernelCI is a cornerstone of upstream Linux kernel development, it enables open-source developers to easily validate and test on a large number of different platforms, including Qualcomm’s, ensuring consistency and quality across the entire ecosystemâ, said Leendert van Doorn, Qualcomm SVP of Engineering. âIt is a capability that is front and center for Qualcomm’s increasing reliance on upstream enablement.â</span></p> 673<p><span style="font-weight: 400">The addition of Arm and Qualcomm as Premier members comes at an exciting time for KernelCI. Our </span><a href="https://docs.kernelci.org/intro/architecture/"><span style="font-weight: 400">new infrastructure</span></a><span style="font-weight: 400"> dramatically improved the possibilities of KernelCI and the ecosystem we are building around it. So KernelCI is well-positioned to leverage the expertise and resources these new Premier members bring. Their involvement will help us expand testing coverage, improve hardware validation processes, and ultimately deliver better Linux kernel quality to the entire open-source community. We look forward to collaborating with both organizations as we continue to grow KernelCI’s impact on upstream kernel development.</span></p> 674 675 </div> 676 </div> 677 </div> 678 </div> 679</article> 680 681<article id="post-479" class="post-479 post type-post status-publish format-standard category-blog category-community"> 682 <div class="inner-wrap animated"> 683 <div class="post-content"> 684 685<div class="post-author"> 686 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 687 688 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a></span></div> <div class="content-inner"> 689 <div class="article-content-wrap"> 690 <div class="post-header"> 691 <h2 class="title"><a href="https://kernelci.org/blog/2025/10/23/kernelci-2025-q3-updates/"> KernelCI – 2025.Q3 updates</a></h2> 692 </div> 693 694 695<p class="wp-block-paragraph">The KernelCI community continues to make great progress on multiple fronts of the project. Since our <a href="https://kernelci.org/blog/2025/06/23/june-2025-updates-linaro-and-elisa-joined-kernelci/">
695last update here</a>, we have had two in-person events, a few technical achievements and new working groups launched. See detailed updates in the sections below. </p> 696 697 698 699<h1 class="wp-block-heading">Videos from Automated Testing Summit</h1> 700 701 702 703<p class="wp-block-paragraph">KernelCI hosted the <a href="https://events.linuxfoundation.org/open-source-summit-north-america/features/co-located-events/?__hstc=140487916.e447d4824b22bace02d6336a7039f014.1725968416684.1758201210603.1758205539577.69&__hssc=140487916.4.1758205539577&__hsfp=2988489284#automated-testing-summit-2025">Automated Testing Summit</a>(ATS) 2025 in Denver, CO, USA. It is co-located with the <a href="https://events.linuxfoundation.org/open-source-summit-north-america/?__hstc=140487916.e447d4824b22bace02d6336a7039f014.1725968416684.1758201210603.1758205539577.69&__hssc=140487916.4.1758205539577&__hsfp=2988489284">Open Source Summit North America</a>. The event was great and we had many interesting discussions.</p> 704 705 706 707<p class="wp-block-paragraph">All the sessions were recorded and videos are available:</p> 708 709 710 711<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper"> 712<iframe title="Automated Testing Summit | Welcome + Opening Remarks - Gustavo Padovan, Sasha Levin & Tim Bird" width="1080" height="608" src="https://www.youtube.com/embed/9S38BQg2ZZo?list=PLjaT52x3HVboZtdwZnONSHQHM8217ELcc" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> 713</div></figure> 714 715 716 717<h1 class="wp-block-heading">KernelCI Workshop in Amsterdam</h1> 718 719 720 721<p class="wp-block-paragraph">In the last week of August, we hosted our first KernelCI workshop in a while. We had 12 participants in-person and a few who joined us online. The workshop was great to kick start some important discussions about the new KernelCI Architecture with the community. </p> 722 723 724 725<p class="wp-block-paragraph">During the workshop, we discussed how to fulfill maintainers’ use case, dealing with KernelCI labs issues, improving data quality and regression identification, KCIDB transition, RISC-V support and more. Check our <a href="https://docs.google.com/document/d/1PQVe5GkMWzXXitDJq4l2z48LyAaCGKIMWKyN4UGEfRM/edit?tab=t.0#heading=h.3ns3y9637t7">notes</a> and full video <a href="https://zoom.us/rec/play/w1LZVECv8gMnZDTpdOla6twRW5y-LdP9c8rdMyxln2QZrCrqkle7vt4FkPAITA_ZiL9Xy99YGe5-dR32.7jQPBqjYwxpbraZs?eagerLoadZvaPages=sidemenu.billing.plan_management&accessLevel=meeting&canPlayFromShare=true&from=share_recording_detail&continueMode=true&componentName=rec-play&originRequestUrl=https%3A%2F%2Fzoom.us%2Frec%2Fshare%2FPt4y1k56HBHxlte375o-00REfcpqb8a7B46pVyZPdT7vgF4XRZRio7toAIOfxdk0.LwI-gkX5rx20mStd">recording</a>.</p> 726 727 728 729<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://kernelci.org/wp-content/uploads/sites/36/2025/10/image-1-1024x576.jpeg" alt="" class="wp-image-480" srcset="https://kernelci.org/wp-content/uploads/sites/36/2025/10/image-1-1024x576.jpeg 1024w, https://kernelci.org/wp-content/uploads/sites/36/2025/10/image-1-300x169.jpeg 300w, https://kernelci.org/wp-content/uploads/sites/36/2025/10/image-1.jpeg 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure> 730 731 732 733<h1 class="wp-block-heading">Transition out of legacy KCIDB</h1> 734 735 736 737<p class="wp-block-paragraph">We finally completed our transition out of the legacy KCIDB. This was a very important step for the new KernelCI architecture. KCIDB is our common database for results, so on one end it has an API to receive test results white on the other is it as PostgreSQL database. The submission API has been supplanted by KCIDB-ng, but with no changes to the results submission JSON schema. Submitters are still sending the same files, but to a different API endpoint. KCIDB-ng is a fast Rust-based API to receive and store the JSON results files.</p> 738 739 740 741<p class="wp-block-paragraph">We’re transforming the KCIDB project into a more versatile, cloud-agnostic solution that can be deployed on-premise when needed. This flexibility allowed us to migrate KCIDB to Azure seamlessly. Additionally, we’ve rewritten portions of KCIDB in Rust, which has resolved longstanding performance bottlenecks.</p> 742 743 744 745<p class="wp-block-paragraph">All the other responsibilities were handed over to our Dashboard, so it is responsible for processing and ingesting the data in the JSON files to our PostgreSQL database. The schema of the database remained the same as legacy </p> 746 747 748 749<h1 class="wp-block-heading">
749Core Infrastructure</h1> 750 751 752 753<p class="wp-block-paragraph">Our new infrastructure has enabled us to significantly reduce complexity by implementing proper DevOps practices. Throughout Q3, we improved our deployment systems. In daily operations, this translates to production updates that require minimal supervision and minimal downtime – what previously took hours now takes less than one minute. We’ve also developed our own storage solution that gives us greater control over data costs by maintaining a “hot” cache on VMs while storing longer-term data in object storage with lifecycle policies and more economical storage classes.</p> 754 755 756 757<p class="wp-block-paragraph">There was also an effort to enhance monitoring and alerting systems to proactively prevent issues before they affect users. This includes implementing more granular metrics and establishing alerts for critical performance indicators.</p> 758 759 760 761<p class="wp-block-paragraph">These infrastructure improvements have collectively enabled us to scale more effectively, reduce operational costs, and enhance overall reliability. We remain committed to continuing our infrastructure investments to support our growing demands and ensure we can meet the needs of our expanding user base.</p> 762 763 764 765<h1 class="wp-block-heading">New Labs WG</h1> 766 767 768 769<p class="wp-block-paragraph">As a great outcome from the KernelCI Workshop, we created the <a href="https://kernelci.org/uncategorized/2025/09/18/kernelci-labs-working-group-announcement/">Labs Working Group</a>
769(WG) to discuss challenges for connecting test labs to KernelCI.</p> 770 771 772 773<p class="wp-block-paragraph">The Labs WG is already a pretty busy space with over 10 people joining the calls in our bi-weekly sync. The current focus includes improving Maestro API for labs to pull test information from KernelCI, adding support for Labgrid and evaluating dashboards for lab metrics.</p> 774 775 776 777<p class="wp-block-paragraph">The team identified several key challenges that prevent labs from connecting to KernelCI. The primary obstacle is that many labs cannot expose their APIs to the public internet due to strict security policies. To address this limitation, we proposed a pull-mode architecture that reverses the traditional workflow – allowing labs to pull test jobs from KernelCI rather than having KernelCI push jobs directly to them. This approach enables labs to maintain their existing security policies while still actively participating in KernelCI testing. We’re currently developing the protocols and implementations necessary to support this pull-mode architecture.</p> 778 779 780 781<h1 class="wp-block-heading">Dashboard WG</h1> 782 783 784 785<p class="wp-block-paragraph">Inspired by the Labs WG, we started the KernelCI Dashboard Working Group (<a href="https://lore.kernel.org/all/010101992a9a3b51-fdf26386-9ac2-4716-9e5c-12cf21bd1800-000000@us-west-2.amazonses.com/">first invite</a>), gathering users and the development team from ProFUSION to talk about bugs and features prioritization.</p> 786 787 788 789<p class="wp-block-paragraph">In two meetings, with 8 attendees, we have defined an action plan to improve the performance of the website, which was affecting user experience, stopped the development of a feature that did not spark joy, and defined the next target for the team: Handling hardware data from labs. Which will require more discussions regarding how that data could be used by the users.</p> 790 791 792 793<h1 class="wp-block-heading">kci-dev improvements</h1> 794 795 796 797<p class="wp-block-paragraph">kci-dev has evolved from a small command-line tool into a well-packaged suite of tools that Linux distributions can ship, aimed at analyzing KernelCI results and helping engineers triage problems quickly.</p> 798 799 800 801<p class="wp-block-paragraph">We had many improvements to the project in the past quarter:</p> 802 803 804 805<ul class="wp-block-list"> 806<li>Added Debian/RPM packaging and OBS workflows/services automation so labs can build and publish updates automatically, so every client gets the same, reproducible toolchain.</li> 807 808 809 810<li>Added results compare command for commit-to-commit regression detection (with tables + JSON output as well).</li> 811 812 813 814<li>Consolidated results issues group to list/show issues and fetch related builds/tests.</li> 815 816 817 818<li>Improved tree-level views with tree-report. </li> 819 820 821 822<li>Added code coverage information through new maestro coverage flow (currently only for chromiumos trees) with per-day buckets, a graph view, and report-info helpers, making stability/coverage trends far clearer.</li> 823 824 825 826<li>Improved validation tooling filters (arch filter; better build selection and considering build/job retry during validation). The validation commands allows us to compare if the tests Maestro is running are landing properly in KCIDB.</li> 827 828 829 830<li>Added –history to results summary.</li> 831 832 833 834<li>Fixed results hardware list and added more filters. </li> 835</ul> 836 837 838 839<h1 class="wp-block-heading">
839Hardware Information Registry</h1> 840 841 842 843<p class="wp-block-paragraph">One of the challenges discussed in various KernelCI forums has been the inconsistency of hardware platform names reported from different testing labs, making it challenging to find/sort/filter results. To address this, a new YAML-based schema has been proposed by Minas Hambardzumyan and is <a href="https://lore.kernel.org/kernelci/[email protected]/T/#mfcb82ad79af84ff7c659c0374dccc9e5dd12a1c2">currently in review</a>. The schema organizes information into lists of platforms, processors, and vendors — providing a path to standardization of the reported platform names and adding traceability to product/vendor web pages for more information.</p> 844 845 846 847<h1 class="wp-block-heading">Final Thoughts</h1> 848 849 850 851<p class="wp-block-paragraph">We will keep working on making KernelCI easier for the community to benefit from. From greater stability to an improved Web Dashboard and a more complete kci-dev CLI, thereâs much more to enhance in KernelCI for everyone. Big thank you to the entire KernelCI community for making this progress possible!Talk to us at <a href="mailto:[email protected]">[email protected]</a> , #kernelci IRC channel at Libera.chat or through our <a href="https://discord.gg/KWbrbWEyqb">Discord server</a>!</p> 852 853 854 855<p class="wp-block-paragraph">Contributed to this blog post Arisu Tachibana, Denys Fedoryshchenko, Gustavo Padovan, Minas Hambardzumyan and Tales Aparecida.</p> 856 857 </div> 858 </div> 859 </div> 860 </div> 861</article> 862 863<article id="post-396" class="post-396 post type-post status-publish format-standard category-blog category-news"> 864 <div class="inner-wrap animated"> 865 <div class="post-content"> 866 867<div class="post-author"> 868 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 869 870 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="news" href="https://kernelci.org/category/news/">News</a></span></div> <div class="content-inner"> 871 <div class="article-content-wrap"> 872 <div class="post-header"> 873 <h2 class="title"><a href="https://kernelci.org/blog/2025/06/23/june-2025-updates-linaro-and-elisa-joined-kernelci/"> June 2025 updates – Linaro and ELISA joined KernelCI!</a></h2> 874 </div> 875 876 877<p class="wp-block-paragraph">A lot has happened in KernelCI since our <a href="https://kernelci.org/blog/2025/02/20/kernelci-february-2025-updates/">last blog</a> update. The community continues to grow with Linaro and ELISA joining as members and more contributors and companies adding test results. The infra as a whole continues to evolve. And we are in the first stages of the development of the kernelci.yml test plan standard.</p> 878 879 880 881<h1 class="wp-block-heading">Linaro and ELISA joined us a members</h1> 882 883 884 885<p class="wp-block-paragraph"><a href="https://www.linaro.org/">Linaro</a> is joining as a Premier member and <a href="https://elisa.tech/">ELISA</a> as an Associate Member. We thank you both for their commitment to take part in the KernelCI community and join us in our mission to ensure the quality, stability and long-term maintenance of the Linux kernel.</p> 886 887 888 889<p class="wp-block-paragraph">âLinaro is excited to be rejoining the KernelCI project. KernelCI’s mission to provide Linux Kernel developers with testing at scale across a diverse set of platforms is key to ensuring the long term quality, reliability and security of the Linux kernel. Linaro looks forward to helping KernelCI to grow and become an even more valuable resource.” said Grant Likely, Linaro CTO.</p> 890 891 892 893<p class="wp-block-paragraph">âLinking the requirements to the tests will enable more efficiency in regression testing,â said Kate Stewart, Vice President of Dependable Embedded Systems at the Linux Foundation. âBeing able to connect the traceability between code, requirements and tests will get us closer to improving the code coverage and quality of the Linux kernel images. The ELISA Project is focusing on kernel requirements and is looking forward to working with the KernelCI community to make the regression testing more effective over time.â</p> 894 895 896 897<h1 class="wp-block-heading">Automated Testing Summit coming up</h1> 898 899 900 901<p class="wp-block-paragraph">KernelCI is hosting the <a href="https://events.linuxfoundation.org/open-source-summit-north-america/features/co-located-events/#automated-testing-summit-2025">Automated Testing Summit</a>(ATS) 2025 in Denver, CO, USA. It is co-located with the <a href="https://events.linuxfoundation.org/open-source-summit-north-america/">Open Source Summit North America</a>. The <a href="https://ats25.sched.com/">agenda</a> is out and a presentation from KernelCI bringing you the latest project updates is on the schedule. </p> 902 903 904 905<p class="wp-block-paragraph">There is still time to sign up and meet us there. It is a hybrid event, so both in-person and virtual attendees are welcome.</p> 906 907 908 909<h1 class="wp-block-heading"><strong>Qualcomm</strong>, <strong>RISC-V International</strong> and <strong>Texas Instruments</strong> International submitting results</h1> 910 911 912 913<p class="wp-block-paragraph">KernelCI gained data from 3 new submitters. Both <a href="https://www.qualcomm.com/">Qualcomm</a>, <a href="https://riscv.org/">RISC-V International</a> and <a href="https://www.ti.com/">Texas Instruments</a> connected their test systems to KernelCI. If you look at our <a href="https://docs.kernelci.org/architecture/">architecture</a>, they are part of our CI ecosystem. They start off by listening to new build events from Maestro, then they download the binaries for the built kernel and artifacts from Maestro. With the kernel and artifacts, they can execute the testing on their environment – sometimes hidden behind a firewall. When tests are completed, they submit c
913omplete results to KCIDB, which then becomes accessible through our <a href="https://dashboard.kernelci.org/">Dashboard</a> and <a href="https://kci.dev/">kci-dev</a>. </p> 914 915 916 917<h1 class="wp-block-heading">.kernelci.yml test plan</h1> 918 919 920 921<p class="wp-block-paragraph">We are proposing to introduce a standardized <a href="https://lore.kernel.org/kernelci/20250428083706.GA691378@rocinante/T/#u">.kernelci.yml</a> file in upstream kernel repositories to help the KernelCI community automatically discover and configure testing for each kernel tree. Part of the goal is to also transfer the ownership of the test plan by maintaining such files close to them or inside their subsystem folder. </p> 922 923 924 925<p class="wp-block-paragraph">This YAML file would specify branches to be tested, kernel configs to build, tests to execute, etc, enabling project maintainers to directly declare their KernelCI preferences. The main benefit is reducing manual effort and guesswork currently involved in onboarding new trees to KernelCI, ultimately making kernel testing more scalable, transparent, and easier to maintain for both KernelCI maintainers and kernel developers.</p> 926 927 928 929<h1 class="wp-block-heading">KCIDB-ng</h1> 930 931 932 933<p class="wp-block-paragraph">With the amount of test results data received by KernelCI everyday growing, KCIDB started to show wear off signs. To address the limitations, including a previous implementation heavily dependent on specific Google Cloud technologies, we created <a href="https://github.com/kernelci/kcidb-ng">kcidb-ng</a>. The new project brings a system that is easy to deploy not only locally for development but also can be run on any cloud environment. It also simplified a lot the ingestion process. </p> 934 935 936 937<p class="wp-block-paragraph">Essentially, we have an API that receives json files with the test result content and stores the files in the spool directory. This entrypoint was written in Rust for efficiency. Then, we have an ingester looping in the server taking the files and ingesting them into PostgreSQL.</p> 938 939 940 941<p class="wp-block-paragraph">Additionally, kcidb-ng comes with <a href="https://github.com/kernelci/logspec">logspec</a> integration out of the box. So now data from any origin can be parsed to generate insights about build and test failures to generate KCIDB issue objects. The issues objects are the bridge between seeing a test failures and being able to report it as a regression to the community.</p> 942 943 944 945<p class="wp-block-paragraph">Right now, we are working with all KCIDB origins to move them over to the new API.</p> 946 947 948 949<h1 class="wp-block-heading">Strengthening core infra</h1> 950 951 952 953<p class="wp-block-paragraph">Behind the scenes, we’ve been working hard to optimize our infrastructure costs and performance. Our build times on Azure build cluster improved dramatically from 88 to 17 minutes after migrating to modern D8lds_v6 instances, while actually reducing costs. We also implemented a caching solution for linux-firmware that cut our data egress costs by over 95% – from a projected $69k annually down to manageable levels. These optimizations mean faster feedback for developers and more sustainable operations for the project. Additionally, we’ve begun migrating KCIDB components to more cost-effective cloud services, starting with kcidb-rest, which will help us maintain reliable service while keeping infrastructure costs under control.</p> 954 955 956 957<h1 class="wp-block-heading">Final thoughts</h1> 958 959 960 961<p class="wp-block-paragraph">We will keep working on making KernelCI easier for the community to benefit from. From greater stability to an improved Web Dashboard and a more complete kci-dev CLI, thereâs much more to enhance in KernelCI for everyone. Big thank you to the entire KernelCI community for making this progress possible!Talk to us at [email protected] , #kernelci IRC channel at Libera.chat or through our <a href="https://discord.gg/KWbrbWEyqb">Discord server</a>!</p> 962 963 </div> 964 </div> 965 </div> 966 </div> 967</article> 968 969<article id="post-389" class="post-389 post type-post status-publish format-standard category-blog category-news"> 970 <div class="inner-wrap animated"> 971 <div class="post-content"> 972 973<div class="post-author"> 974 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 975 976 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="news" href="https://kernelci.org/category/news/">News</a></span></div> <div class="content-inner"> 977 <div class="article-content-wrap"> 978 <div class="post-header"> 979 <h2 class="title"><a href="https://kernelci.org/blog/2025/06/03/exploring-the-kernelci-dashboard/"> Exploring the KernelCI Dashboard</a></h2> 980 </div> 981 982 983<p class="wp-block-paragraph">The KernelCI project is a critical initiative in the Linux kernel development ecosystem, providing automated testing and continuous integration for kernel builds. In this blog post, we’ll explore the current features available in the KernelCI Dashboard at <a href="https://dashboard.kernelci.org">https://dashboard.kernelci.org</a>.</p> 984 985 986 987<h1 class="wp-block-heading">KernelCI Dashboard Overview</h1> 988 989 990 991<p class="wp-block-paragraph">The current KernelCI Dashboard provides a comprehensive view of kernel testing activities, organizing information into three primary sections: Trees, Hardware, and Issues. This structure allows developers to easily navigate between different aspects of kernel testing. In this web dashboard, itâs possible to see the results of CI systems from different maintainers, checking their status, details, history and issues, while gathering valuable insight to work on a better and more reliable kernel.</p> 992 993 994 995<h2 class="wp-block-heading">Trees</h2> 996 997 998 999<p class="wp-block-paragraph">The Trees section serves as the main entry point to the dashboard, displaying a tabular view of kernel trees, branches, and commits being tested. The Dashboard visitor is then able to select the one they are interested in – a tree is a fork of the linux kernel with a specific branch and targeting a specific url.</p> 1000 1001 1002 1003<figure class="wp-block-image"><img decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXe6i7X3YDpPwhCmqAXctFNPeWupQThsMq20c8mEbUN2bUo0ragwkAey0AxKORdz7bv1xCrKILw9N9V_TCWBeVOGj-CVKQx9vxT7pKRDvwg7jmO2iU12lhgUWKAfh4Rc4bqoKfRFGA?key=MhoCSRwptWpq9IrT3QW4jn9L" alt="" /></figure> 1004 1005 1006 1007<p class="wp-block-paragraph">> Image: The Tree Listing page. It shows the website menu on the left, a header on top with a search bar and a table listing the 10 trees with the most number of tests, each row has the tree information as well as counts for how many builds, boots and tests were executed on it.</p> 1008 1009 1010 1011<p class="wp-block-paragraph">With options for sorting and searching for a specific tree, it is possible to check the details of a desired tree, where a user can see which configurations, ar
1011chitectures, hardware, and a history of the builds, boots and tests.</p> 1012 1013 1014 1015<p class="wp-block-paragraph">This allows maintainers to see the successes, failures and other results of the CI systems and are able to focus their attention on what matters the most to them. A preview of a build or test can be seen right on this page, reviewing tests or builds outputs, with highlights to failures and errors, and a list of issues that were triggered from it.</p> 1016 1017 1018 1019<figure class="wp-block-image"><img decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdh11_mj2WZPBVJRjR-5wKb-Au-3jQR_Xd1z__95qf--pbwXFnsD7vvf_bGEiRqipjNts4CF6TzR78QDZaiGBQ2KVeXrY72c0Pmmb4Gq7mcRdc1xMd6vuZxFLqCF1PuxOn2Srbs?key=MhoCSRwptWpq9IrT3QW4jn9L" alt="" /></figure> 1020 1021 1022 1023<p class="wp-block-paragraph">> <a href="https://drive.google.com/file/d/1UCvFeWO4ucB3hFIEqzMnblRj10Wtsz5F/view?usp=drive_link">Video</a>: Navigating to the mainline Tree Details. There are cards with information about the specifications used, graphs for the result status and history of results, and a list of boot tests. A boot is selected and its output and issues are shown.</p> 1024 1025 1026 1027<h2 class="wp-block-heading">Builds and Tests</h2> 1028 1029 1030 1031<p class="wp-block-paragraph">Each build and test also has a lot of data that a maintainer can find useful, so by pressing âView more detailsâ, the user is directed to a page containing more information about that specific item, such as a the platform that was tested on, a history of a test result, the artifacts (logs or result files) that a test or build produced, and miscellaneous data. For a build, it is also possible to see every test that was executed on it, with links to the details of those tests.</p> 1032 1033 1034 1035<figure class="wp-block-image"><img decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcpT-_dcJtuqEG0Pn_Gv_ETLhEy6BD0wBl2imVMX8MInSQDEhHWe549KrCaJkYo1xZ2uBB8EjMKrX0CQtKS4Q2xORYY6V9yTHwa1YeiBfB89gyVPtwarNe7EHElItWL7hMu_yufTg?key=MhoCSRwptWpq9IrT3QW4jn9L" alt="" /></figure> 1036 1037 1038 1039<p class="wp-block-paragraph">> <a href="https://drive.google.com/file/d/1AABxhWkHi-dFwE1jwxUZW--fhivCb6r5/view?usp=drive_link">Video</a>: A boot test details page. There are sections with basic information, as well as the history of its results, miscellaneous data from it, and the files it produced as artifacts.</p> 1040 1041 1042 1043<figure class="wp-block-image"><img decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeGSjCRx6rDYtEdpIl1CAp8JY4YfKJ7-XBI5gzqTJj9uR0SfACKtW5m5our6wjxkOT_z0W6Dil0Ci1kF7c31-AJl1D-mFdaL1y5c_mghsFMERPvSGaRnoTbL9dbv3qz0cgeFIO6tA?key=MhoCSRwptWpq9IrT3QW4jn9L" alt="" /></figure> 1044 1045 1046 1047<p class="wp-block-paragraph">> <a href="https://drive.google.com/file/d/1I3auYuHc19HAXdjfcAdKu7BZTGqSrCGE/view?usp=drive_link">Video</a>: A page with details of a build. There are sections with basic information, miscellaneous data, output files, and a table listing the tests that were performed on it.</p> 1048 1049 1050 1051<h2 class="wp-block-heading">
1051Hardware</h2> 1052 1053 1054 1055<p class="wp-block-paragraph">The Hardware section focuses on the physical devices used for testing, providing insights into how different kernels perform across various hardware platforms. Maintainers of such items might want to see the results of tests for that hardware independently of which tree it came from. For that purpose, the dashboard also contains a tab for listing the hardware that were tested on.</p> 1056 1057 1058 1059<p class="wp-block-paragraph">The listing is similar to that of trees, but when entering the details pages, it is possible to see all the trees that contributed to testing on that hardware, as well as disabling or enabling the visualization of the results from that tree.</p> 1060 1061 1062 1063<figure class="wp-block-image"><img decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeT4qXsDObT-s6asM6NkLToNb16hDPj36cVJSC-qq8EjPxdzn-33P5sH0qy9eXh8-k-WZf2t6cM-Y8vsZ1pVYvQv830VbglNOIjQ5e9rdcWnacfekT9UU84jNYDSo67PIno-T9QrA?key=MhoCSRwptWpq9IrT3QW4jn9L" alt="" /></figure> 1064 1065 1066 1067<p class="wp-block-paragraph">> <a href="https://drive.google.com/file/d/18eN9dduFvXck1UGBsy8Ezny2Jc3lyqWn/view?usp=sharing">Video</a>: Navigation from the hardware listing page to a hardware details page. The details page shows a table at the top listing the trees that tested or had builds on that hardware, with their corresponding commit and counting of total builds, boots and tests.</p> 1068 1069 1070 1071<p class="wp-block-paragraph">Not only for trees in a specific hardware or hardware on a specific tree, it is also possible to filter for any of the card items by clicking on them or using the Filters button, allowing for better visibility of items that a user may be interested in.</p> 1072 1073 1074 1075<h2 class="wp-block-heading">Issues</h2> 1076 1077 1078 1079<p class="wp-block-paragraph">The Issues section is dedicated to tracking problems identified during testing, making it easier for developers to identify and address failures.</p> 1080 1081 1082 1083<p class="wp-block-paragraph">Issues group tests or builds when their results had a certain status or had a certain message in their logs or other conditions. In the dashboard, it is possible to list the most recent issues and when and where they have appeared, resembling the other listing pages.</p> 1084 1085 1086 1087<p class="wp-block-paragraph">From that page or from links throughout the dashboard, a user can navigate to a page with details of that issue, including the first time that issue caught a result, the specific data of how that issue came to be, and a list of every incident of that issue, builds or tests.</p> 1088 1089 1090 1091<figure class="wp-block-image"><img decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfc7gY0FoxKa0IMwe4-Bdeytk-j1KAmBklGEao63_z_4j4vb0bQBGm8H3MTxPtXMjRTTA5EvyaAc6u_eZYtZy3ZrBwsdmKRVTjGeYbYPOo_GJmefLQBEkVFemEiat2YrT5sD2SgLw?key=MhoCSRwptWpq9IrT3QW4jn9L" alt="" /></figure> 1092 1093 1094 1095<p class="wp-block-paragraph">> <a href="https://drive.google.com/file/d/19GwBoO2WZz7ZKPreO3Maz86evKmcwCfA/view?usp=sharing">Video</a>: Navigating from the issue listing to an issue details page. The detailed page shows sections of the issueâs information, its first incident, the specifications of its error, miscellaneous data, and a table with builds that triggered that issue.</p> 1096 1097 1098 1099<h2 class="wp-block-heading">Closing thoughts</h2> 1100 1101 1102 1103<p class="wp-block-paragraph">The current KernelCI Dashboard provides a powerful interface for monitoring, analyzing, and troubleshooting kernel testing results. Its comprehensive features make it an essential tool for kernel developers, distributions, and hardware vendors who rely on Linux kernel stability and compatibility.</p> 1104 1105 1106 1107<p class="wp-block-paragraph">The dashboard allows users to inspect CI results from trees, hardware, builds, and tests; checking for specific issues, filtering for certain configurations and looking over results of their interest. Coupled with detailed pages, interactions and CI results history, it provides better tools for specific use cases, enhanced visualization, and improved troubleshooting capabilities. With a redesigned interface and easy shareability and filtering, the Dashboard can address the needs of different users in the kernel development ecosystem, from maintainers to lab operators.</p> 1108 1109 1110 1111<p class="wp-block-paragraph">Whether you’re a kernel developer tracking your patches, a distribution maintainer ensuring stability, or a hardware vendor verifying compatibility, the KernelCI Dashboard (both current and future versions) offers the insights and tools needed to ensure Linux kernel quality across the ecosystem.</p> 1112 1113 1114 1115<p class="wp-block-paragraph">Users are encouraged to report bugs and suggestions to <a href="mailto:[email protected]">[email protected]</a> to help improve this vital project.</p> 1116 1117 1118 1119<p class="wp-block-paragraph">We’d like to thank you <a href="https://profusion.mobi/">ProFUSION</a> for their contributions to this project as supplier of the KernelCI Project. This blog post was written by then.</p> 1120 1121 </div> 1122 </div> 1123 </div> 1124 </div> 1125</article> 1126 1127<article id="post-368" class="post-368 post type-post status-publish format-standard category-blog category-news"> 1128 <div class="inner-wrap animated"> 1129 <div class="post-content"> 1130 1131<div class="post-author"> 1132 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 1133 1134 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="news" href="https://kernelci.org/category/news/">News</a></span></div> <div class="content-inner"> 1135 <div class="article-content-wrap"> 1136 <div class="post-header"> 1137 <h2 class="title"><a href="https://kernelci.org/blog/2025/02/20/kernelci-february-2025-updates/"> KernelCI – February 2025 updates</a></h2> 1138 </div> 1139 1140 1141<p class="wp-block-paragraph">For those of you who were at <a href="https://kernelci.org/blog/2024/09/11/kernelci-lpc2024/">Linux Plumbers Conference</a> last September, you got a great amount of updates from the KernelCI project. However, September is long in the past now. So it is time for a new round of updates.</p> 1142 1143 1144 1145<p class="wp-block-paragraph">In summary, in the past few months, we successfully stabilized our new infrastru
1145cture, shut down our legacy system. Then, we also developed <a href="https://github.com/kernelci/logspec">logspec</a> for parsing test logs, made more progress on the new <a href="https://dashboard.kernelci.org/">Web Dashboard</a>, launched <a href="https://kci.dev/">kci-dev</a> for kernel developers, and began testing regression notifications via email. Letâs now dive into specific topics for a short update!</p> 1146 1147 1148 1149<h1 class="wp-block-heading">Web Dashboard development progress</h1> 1150 1151 1152 1153<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="1024" height="549" src="https://kernelci.org/wp-content/uploads/sites/36/2025/02/Screenshot-from-2025-02-20-11-35-52-1-1024x549.png" alt="" class="wp-image-375" srcset="https://kernelci.org/wp-content/uploads/sites/36/2025/02/Screenshot-from-2025-02-20-11-35-52-1-1024x549.png 1024w, https://kernelci.org/wp-content/uploads/sites/36/2025/02/Screenshot-from-2025-02-20-11-35-52-1-300x161.png 300w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure> 1154 1155 1156 1157<p class="wp-block-paragraph">While we believe the <a href="https://dashboard.kernelci.org/">Web Dashboard</a> still has a lot to evolve, it is already able to provide results information for many use cases. The development team, funded by the KernelCI project, is continuously improving the dashboard based on user feedback. We invite everyone to use our new dashboard and <a href="https://github.com/kernelci/dashboard/issues/new">share any feedback</a> they may have.</p> 1158 1159 1160 1161<h1 class="wp-block-heading">logspec – new log parsing skills</h1> 1162 1163 1164 1165<p class="wp-block-paragraph"><a href="https://github.com/kernelci/logspec">logspec</a> is a new log parser designed to recognize contextual nuances. It is able to match patterns around build failures, boot issues, NULL pointer dereference, Kernel Panic, Kernel Bug, UBSAN warnings etc. We have integrated it in<a href="https://docs.kernelci.org/architecture/"> Maestro</a> so far. There, it sits on the Maestro->KCIDB bridge and creates new issues in KCIDB when it finds any of the tracked patterns in the code. So, here are examples of a <a href="https://dashboard.kernelci.org/issue/maestro:15d7ea9fd5f2bedae85bc45a4267a66024d1b429">build</a> issue and <a href="https://dashboard.kernelci.org/issue/maestro:18a6cd3bd705698b41106eef2a1d7f2e411c7aab">boot</a> issue. logspec is a new project, but already helping the community find key information quite fast. We hope to evolve it over the next few years.</p> 1166 1167 1168 1169<h1 class="wp-block-heading">Announcing kci-dev cmdline</h1> 1170 1171 1172 1173<p class="wp-block-paragraph">A few months ago, we started <a href="http://kci.dev">kci-dev</a>, our command line tooling for kernel developers and maintainers. kci-dev is still beta but its core features are taking shape:</p> 1174 1175 1176 1177<ul class="wp-block-list"> 1178<li>sending specific test requests to Maestro: today we support testing any commit on any tree/branch <a href="https://github.com/kernelci/kernelci-pipeline/blob/main/config/pipeline.yaml#L1998">available</a> in KernelCIâs Maestro.</li> 1179 1180 1181 1182<li>running bisections: we have an experimental tooling that allows us to run bisections for some regressions we found.</li> 1183 1184 1185 1186<li>fetching test results from the dashboard: Today, we have basic support to fetch test results and download logs through the `kci-dev results` command. </li> 1187</ul> 1188 1189 1190 1191<p class="wp-block-paragraph">Example run to fetch summary of results:</p> 1192 1193 1194 1195<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="891" height="189" src="https://kernelci.org/wp-content/uploads/sites/36/2025/02/Screenshot-from-2025-02-20-11-19-31-1.png" alt="" class="wp-image-370" srcset="https://kernelci.org/wp-content/uploads/sites/36/2025/02/Screenshot-from-2025-02-20-11-19-31-1.png 891w, https://kernelci.org/wp-content/uploads/sites/36/2025/02/Screenshot-from-2025-02-20-11-19-31-1-300x64.png 300w" sizes="(max-width: 891px) 100vw, 891px" /></figure> 1196 1197 1198 1199<p class="wp-block-paragraph">We invite developers to try it out and <a href="https://github.com/kernelci/kci-dev/issues/new">give us feedback</a> on the functionalities they want to see in kci-dev.</p> 1200 1201 1202 1203<h1 class="wp-block-heading">Experimenting with results notifications</h1> 1204 1205 1206 1207<p class="wp-block-paragraph">Over the past month, weâve been developing <a href="https://github.com/padovan/kernelci-notifications">kernelci-notifications</a> that are already capable of watching for new <a href="https://docs.kernelci.org/kcidb/submitter_guide/#issues">KCIDB issues</a> and generating notifications for build and boot regressions filed in KCIDB. Currently, we are experimenting with issues created by Maestro, but the notification system is being designed for use with any CI system submitting data to KCIDB. You can see examples of issues reported <a href="https://groups.io/g/kernelci-results/messages?start=2:2025:480">here</a>. And excerpt follows as well:</p> 1208 1209 1210 1211<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="740" height="645" src="https://kernelci.org/wp-content/uploads/sites/36/2025/02/Screenshot-from-2025-02-20-11-24-33-1.png" alt="" class="wp-image-371" srcset="https://kernelci.org/wp-content/uploads/sites/36/2025/02/Screenshot-from-2025-02-20-11-24-33-1.png 740w, https://kernelci.org/wp-content/uploads/sites/36/2025/02/Screenshot-from-2025-02-20-11-24-33-1-300x261.png 300w" sizes="(max-width: 740px) 100v
1211w, 740px" /></figure> 1212 1213 1214 1215<h1 class="wp-block-heading">KCIDB</h1> 1216 1217 1218 1219<p class="wp-block-paragraph">KCIDB receives increasing amounts of kernel test data every day. As the project grows, so do its challenges. We are currently looking at improving the performance of KCIDB with long-term needs in mind. A few weeks ago, the KernelCI project published a RFQ for a specialist <a href="https://lore.kernel.org/kernelci/[email protected]/T/#u">DBA support for KCIDB</a>.</p> 1220 1221 1222 1223<h1 class="wp-block-heading">More hardware support</h1> 1224 1225 1226 1227<p class="wp-block-paragraph">In the recent weeks, we have seen <a href="https://pengutronix.de/">Penguntronix</a> enable their lab in KernelCIâs Maestro, MediaTek Genio to add their newest hardware through the <a href="https://www.collabora.com/">Collabora</a> lab. As we speak, <a href="https://www.qualcomm.com/">Qualcomm</a> is working to enable more of their labs in KernelCI too.</p> 1228 1229 1230 1231<h1 class="wp-block-heading">New test Infra continues stabilization</h1> 1232 1233 1234 1235<p class="wp-block-paragraph">We continue improving our core infra. Recently, we added automatic deployment of Maestro through GitHub actions and we also created <a href="https://github.com/nuclearcat/kernelci-storage">kernelci-storage</a>, a solution to help the KernelCI ecosystem to store test artifacts.</p> 1236 1237 1238 1239<h1 class="wp-block-heading">Final thoughts</h1> 1240 1241 1242 1243<p class="wp-block-paragraph">We will keep working on making KernelCI easier for the community to benefit from. From greater stability to an improved Web Dashboard and a more complete kci-dev CLI, thereâs much more to enhance in KernelCI for everyone. Big thank you to the entire KernelCI community for making this progress possible!<br>Talk to us at <a href="mailto:[email protected]">[email protected]</a>, #kernelci IRC channel at Libera.chat or through our <a href="https://discord.gg/KWbrbWEyqb">Discord server</a>!</p> 1244 1245 1246 1247<p class="wp-block-paragraph"></p> 1248 1249 </div> 1250 </div> 1251 </div> 1252 </div> 1253</article> 1254 1255<article id="post-340" class="post-340 post type-post status-publish format-standard category-blog"> 1256 <div class="inner-wrap animated"> 1257 <div class="post-content"> 1258 1259<div class="post-author"> 1260 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 1261 1262 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a></span></div> <div class="content-inner"> 1263 <div class="article-content-wrap"> 1264 <div class="post-header"> 1265 <h2 class="title"><a href="https://kernelci.org/blog/2024/09/12/bring-your-tree-to-the-new-kernelci/"> Bring your tree to the new KernelCI</a></h2> 1266 </div> 1267 1268 1269<p class="wp-block-paragraph">KernelCI is entering an exciting new phase, and weâre inviting kernel maintainers to register their trees with us.</p> 1270 1271 1272 1273<p class="wp-block-paragraph">We now support over 220 build configurations, run boot tests on 45 different hardware platforms (totaling over 300 machines in all labs), 7 CI systems contributing tests results and have test suites like kselftest, kunit and LTP already enabled, ensuring comprehensive coverage for your kernel trees across diverse platforms.</p> 1274 1275 1276 1277<p class="wp-block-paragraph">At the upcoming <a href="https://lpc.events/event/18/contributions/1739/">Linux Plumbers Conference</a>, weâll be unveiling our new Web Dashboard, which allows you to easily track your test results. Also, our team is ready to support you with custom Grafana dashboards tailored to your needs and optional email notifications. We can also enable your preferred test suites.</p> 1278 1279 1280 1281<p class="wp-block-paragraph">Weâre committed to delivering real value and working closely with maintainers, developers, hardware vendors and product makers to provide specific solutions. Each subsystem and maintainer has unique needs, and weâre adapting our approach accordingly. We can build custom views and configure personalized notifications to help you focus on the results that matter most, minimizing unnecessary noise.</p> 1282 1283 1284 1285<p class="wp-block-paragraph">We encourage all maintainers to register their trees and take advantage of these new features. To get started, <a href="https://github.com/kernelci/kernelci-core/issues/new?assignees=&labels=&projects=&template=new-kernel-branch.md&title=Add+branch+BRANCH+from+TREE">submit your request via our GitHub project</a> or contact us directly at <a href="mailto:[email protected]">[email protected]</a> .</p> 1286 1287 1288 1289<p class="wp-block-paragraph">During the Linux Plumbers Conference, weâll have a hallway boothâplease stop by to discu
1289ss your needs and share your feedback. KernelCI is committed to deliver solutions that matter to you.</p> 1290 1291 1292 1293<p class="wp-block-paragraph">Learn more about KernelCI in our <a href="https://docs.kernelci.org">documentation</a>.</p> 1294 1295 </div> 1296 </div> 1297 </div> 1298 </div> 1299</article> 1300 1301<article id="post-334" class="post-334 post type-post status-publish format-standard category-blog category-news"> 1302 <div class="inner-wrap animated"> 1303 <div class="post-content"> 1304 1305<div class="post-author"> 1306 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 1307 1308 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="news" href="https://kernelci.org/category/news/">News</a></span></div> <div class="content-inner"> 1309 <div class="article-content-wrap"> 1310 <div class="post-header"> 1311 <h2 class="title"><a href="https://kernelci.org/blog/2024/09/11/kernelci-lpc2024/"> KernelCI at Linux Plumbers Conference 2024</a></h2> 1312 </div> 1313 1314 1315<p class="wp-block-paragraph">The KernelCI community will have a busy few days at the upcoming <a href="https://lpc.events/">Linux Plumbers Conference</a>(LPC) in Vienna, Austria. We will be presenting 2 talks in the Refereed track, 4 Micro-conferences sessions and 1 BoF.</p> 1316 1317 1318 1319<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="351" src="https://kernelci.org/wp-content/uploads/sites/36/2024/09/Screenshot-from-2024-09-11-08-57-12-1-1024x351.png" alt="" class="wp-image-336" srcset="https://kernelci.org/wp-content/uploads/sites/36/2024/09/Screenshot-from-2024-09-11-08-57-12-1-1024x351.png 1024w, https://kernelci.org/wp-content/uploads/sites/36/2024/09/Screenshot-from-2024-09-11-08-57-12-1-300x103.png 300w, https://kernelci.org/wp-content/uploads/sites/36/2024/09/Screenshot-from-2024-09-11-08-57-12-1.png 1897w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure> 1320 1321 1322 1323<p class="wp-block-paragraph">For those interested in an overview of everything happening in KernelCI, come to the “<a href="https://lpc.events/event/18/contributions/1739/">Meeting the New KernelCI</a>” presentation from Don Zickus (Red Hat) and Gustavo Padovan(Collabora) in LPC’s Refereed Track Thursday at 12:00pm CEST.</p> 1324 1325 1326 1327<p class="wp-block-paragraph">Following the talk, on Thursday afternoon, starting at 3pm, the KernelCI team will set up a small corner in the “hallway track” to dive into more discussions with the community. Come talk to us and dive further in usecases, demo the dashboard, collect feedback, etc.</p> 1328 1329 1330 1331<p class="wp-block-paragraph">Hardware Vendors are key for KernelCI success, so we will be hosting a discussion with Hardware Vendors to understand how we can improve the kernel testing and integration overall and how KernelCI, as an organization can help drive progress. This will happen Wednesday at 1:30pm to 3:00pm (Room 1.34). If you are interested in joining please send an email to <a href="mailto:[email protected]">[email protected]</a>. Open Source Summit attendees are also welcome in this session.</p> 1332 1333 1334 1335<p class="wp-block-paragraph">Apart from that we will also bring several technical challenges for discussions in the micro-conferences, host a talk on GitLab and a Kernel Testing BoF. Check our full agenda:</p> 1336 1337 1338 1339<p class="wp-block-paragraph"><strong>Wednesday</strong></p> 1340 1341 1342 1343<ul class="wp-block-list"> 1344<li><strong>13:30 <a href="https://kernelci.org/news/2024/09/13/hw-vendors-meet
1344-in-vienna/">KernelCI & Hardware Vendors</a></strong> at LPC Room 1.34. Hosted by KernelCI. (More info coming soon).</li> 1345 1346 1347 1348<li><strong>15:05 </strong><a href="https://lpc.events/event/18/contributions/1751/"><strong>Unifying GitLab CI approaches for the Linux Kernel</strong></a> in the Graphics & DRM MC (Hall L1). By Helen Koike (Collabora), Sebastian Fricke(Collabora)</li> 1349 1350 1351 1352<li><strong>17:00 </strong><a href="https://lpc.events/event/18/contributions/1728/"><strong>A little GitLab won’t hurt you</strong></a> in the <a href="https://lpc.events/event/18/sessions/176/">LPC Refereed Track</a> (Hall L2/L3). By Helen Koike (Collabora) Nikolai Kondrashov (Red Hat) Tales da Aparecida (Red Hat).</li> 1353</ul> 1354 1355 1356 1357<p class="wp-block-paragraph"><strong>Thursday</strong></p> 1358 1359 1360 1361<ul class="wp-block-list"> 1362<li><strong>12:00</strong> <a href="https://lpc.events/event/18/contributions/1739/"><strong>Meet the New KernelCI</strong></a> in the LPC Refereed Track (Hall L2/L3). By Don Zickus (Red Hat), Gustavo Padovan(Collabora)</li> 1363 1364 1365 1366<li><strong>15:00 – 18:00</strong> <strong>KernelCI Booth</strong> in the Hallway Track. By the KernelCI community.</li> 1367 1368 1369 1370<li><strong>19:00 – 21:00 KernelCI Happy Hour</strong> – Location: <a href="https://maps.app.goo.gl/B8ze9GCgwSt4J1vK8" target="_blank" rel="noreferrer noopener">The View Café-Bar-Restaurant</a>. 25 min walk from the conference venue.</li> 1371</ul> 1372 1373 1374 1375<p class="wp-block-paragraph"><strong>Friday</strong></p> 1376 1377 1378 1379<ul class="wp-block-list"> 1380<li><strong>12:30</strong> <a href="https://lpc.events/event/18/contributions/1794/"><strong>Towards common mainline device testing</strong></a> in the Kernel Testing & Dependability MC (Hall N2). By NÃcolas Prado(Collabora)</li> 1381 1382 1383 1384<li><strong>13:00</strong> <a href="https://lpc.events/event/18/contributions/1792/"><strong>Interacting with kernel test results</strong></a> in the Kernel Testing & Dependability MC(Hall N2). By Helen Koike(Collabora), RIcardo Cañuelo(Collabora)</li> 1385 1386 1387 1388<li><strong>15:30 </strong><a href="https://lpc.events/event/18/contributions/1700/"><strong>Boot time testing with ftrace</strong></a> in the Internet of Things & Embedded MC (Room 1.15 – 1.16). By Laura Nao (Collabora)</li> 1389 1390 1391 1392<li><strong>17:00</strong> <a href="https://lpc.events/event/18/contributions/1851/"><strong>Continuously testing the Linux kernel</strong></a> in Birds of a Feather (BoF) Track ( Room 1.85 – 1.86). By Gustavo Padovan (Collabora), Nikolai Kondrashov (Red Hat)</li> 1393</ul> 1394 1395 1396 1397<p class="wp-block-paragraph">Times are in the Vienna/CEST Timezone.</p> 1398 1399 1400 1401<p class="wp-block-paragraph">As you can see it is a pretty busy agenda. If you want to talk to us please reach out at <a href="mailto:[email protected]">[email protected]</a>. We will be happy to see you at LPC!</p> 1402 1403 </div> 1404 </div> 1405 </div> 1406 </div> 1407</article> 1408 1409<article id="post-286" class="post-286 post type-post status-publish format-standard category-blog category-community category-news"> 1410 <div class="inner-wrap animated"> 1411 <div class="post-content"> 1412 1413<div class="post-author"> 1414 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 1415 1416 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a>, <a class="news" href="https://kernelci.org/category/news/">News</a></span></div> <div class="content-inner"> 1417 <div class="article-content-wrap"> 1418 <div class="post-header"> 1419 <h2 class="title"><a href="https://kernelci.org/blog/2024/04/08/strategic-updates/"> Strategic updates from the KernelCI project</a></h2> 1420 </div> 1421 1422 1423<p class="wp-block-paragraph">The KernelCI project continues on its mission to ensure the quality, stability and long-term maintenance of the Linux kernel. That means
1423supporting the community (especially maintainers) to not just run their code in a Continuous Integration (CI) system, but also deliver relevant, high confidence results and reports. In this post, we will give you a strategic overview of the steps we have taken towards our mission over the past few months.</p> 1424 1425 1426 1427<h2 class="wp-block-heading" id="enabling-new-infrastructure-to-run-tests">Enabling new infrastructure to run tests<a href="https://kernelci.org/blog/posts/2024/strategic-updates/#enabling-new-infrastructure-to-run-tests"></a></h2> 1428 1429 1430 1431<p class="wp-block-paragraph">Our legacy system has shown its age and it has been failing to meet the growing testing needs of the community. It is a quite limited, unstable python2 project that focuses on embedded hardware. We continue on the journey to put in place our new infrastructure, so we can finally move away from the legacy KernelCI system.</p> 1432 1433 1434 1435<p class="wp-block-paragraph">We bring good news! The new core service for running tests is already in place, but still going through a stabilization phase. So, the team is ramping up the number of tests slowly to deal with issues that arise especially when it comes to the quality of the testing KernelCI provides. We do not want to repeat past mistakes with results that canât really be trusted, so our focus right now is on quality rather than quantity. The team is iterating quickly on that process to enable open, wide adoption in the coming months.</p> 1436 1437 1438 1439<p class="wp-block-paragraph">In our new KernelCI infrastructure, we already have support to run tests in labs (through <a href="https://www.lavasoftware.org/">LAVA</a>
1439only at the moment), Docker containers, Kubernetes and natively. Adding new labs or test environments should be relatively straightforward. Then, as we add more test environments, we are also laying down the foundation for integration with other CI systems across the community so we can share kernel builds and offer test environments.</p> 1440 1441 1442 1443<p class="wp-block-paragraph">As we shared <a href="https://kernelci.org/blog/posts/2023/api-early-access/">before</a>, the new infrastructure exposes an API for users to create accounts, query results and even drive tests themselves. At the moment, we are focusing on enabling our own pipeline there, so we can shut down the legacy system. But anyone is welcome to request a user account and try it out.</p> 1444 1445 1446 1447<p class="wp-block-paragraph">Another initiative from the KernelCI community is the <a href="https://lore.kernel.org/lkml/[email protected]/">GitLab CI support in the mainline</a> kernel. Here, the goal is to offer maintainers a CI environment that they can manage themselves. With time, KernelCI API can be leveraged to provide a backend for builds and test runs for repositories using GitLab CI.</p> 1448 1449 1450 1451<h2 class="wp-block-heading" id="trusting-tests-results-and-reports">Trusting tests results and reports<a href="https://kernelci.org/blog/posts/2024/strategic-updates/#trusting-tests-results-and-reports"></a></h2> 1452 1453 1454 1455<p class="wp-block-paragraph">On one end, we are stabilizing our new infrastructure to run the tests. On the other end, we are looking into improving the quality of the reports KernelCI sends out, so maintainers and developers can actually trust them. Given the huge amount of data coming out of test systems and bots today, we must invest in improving the delivery of the results, or else, KernelCI will be contributing to increasing the maintainer burnout rather than helping solve it. That means improving the quality and confidence of the data, so maintainers and developers only receive reports packed with relevant information and no noise or false-positives.</p> 1456 1457 1458 1459<p class="wp-block-paragraph">At the time of this writing, we have a handful of trees enabled, boot testing and a few tests enabled (including kselftest support) in our new test infrastru
1459cture. That setup is enabling the team to triage <strong>ALL</strong> the results to identify infrastructure failures and test patterns in general (flakiness, config issue, intermittent issues, etc). There is a significant investment to develop better tests together with the community (like the <a href="https://www.collabora.com/news-and-blog/blog/2023/12/11/a-new-kselftest-for-verifying-driver-probe-of-devicetree-based-platforms/">device tree probe kselftest</a>) that is improving the quality of the results compared to what exists in our legacy system.</p> 1460 1461 1462 1463<p class="wp-block-paragraph">As part of the effort, we are developing a layer for <strong>post-processing the test results</strong> in <a href="https://github.com/kernelci/kcidb">KCIDB</a> – the KernelCI database to collect test results from the entire Linux kernel test ecosystem. The work in this area is at proof-of-concept level, but it is already enabling the team to evaluate the results coming from our new infrastructure. The post-processing layer should be a key part of the feedback loop with the community. The goal is to increase <a href="https://www.collabora.com/news-and-blog/blog/2024/03/14/automatic-regression-handling-and-reporting-for-the-linux-kernel/">automation in triaging the results</a>, saving precious time from kernel maintainers. Also, because KCIDB collects data from various CI systems, the post-processing of test results can be enabled for more systems than just KernelCI.</p> 1464 1465 1466 1467<p class="wp-block-paragraph">On top of that, the KernelCI team is redesigning the Web Dashboard UX to enable rich visualization of all that data for the entire community. A public request for feedback on UX should go out in the coming weeks.</p> 1468 1469 1470 1471<h2 class="wp-block-heading" id="its-all-about-engaging-the-community-in-testing">Itâs all about engaging the community in testing<a href="https://kernelci.org/blog/posts/2024/strategic-updates/#its-all-about-engaging-the-community-in-testing"></a></h2> 1472 1473 1474 1475<p class="wp-block-paragraph">Solving CI needs for the Linux kernel community is not just a technical challenge. It is in big part a community engagement challenge too. The KernelCI project has a strong focus on engaging the community in testing processes. With our new infrastructure coming into place, we are ready to give a new spin to our Community Engagement initiative.</p> 1476 1477 1478 1479<p class="wp-block-paragraph">For that, we are forming a Community Engagement Working Group (WG). The WG will focus on connecting with maintainers to discuss and implement improvements in test quality for their subsystems and also act as a feedback recipient for improvements in our post-processing of the test results. The Community Engagement WG will be led by Shuah Khan, kernel maintainer & Linux Fellow at The Linux Foundation.</p> 1480 1481 1482 1483<p class="wp-block-paragraph">A dedicated <a href="https://lore.kernel.org/kernelci/[email protected]/T/#u">announcement</a> of the Community Engagement WG was sent to the KernelCI mailing list. If you are interested in participating, raise your hand!</p> 1484 1485 1486 1487<h2 class="wp-block-heading" id="where-are-we-going-from-here">Where are we going from here?<a href="https://kernelci.org/blog/posts/2024/strategic-updates/#where-are-we-going-from-here"></a></h2> 1488 1489 1490 1491<p class="wp-block-paragraph">As you can see, a lot is going on in KernelCI at the moment. The team is iterating quickly on the development of the new infrastructure, so we will be engaging with new maintainers and developers every month from now on, bringing them to the new infra and pushing the system limit further. If you are a maintainer and want to bring your tests to KernelCI please send us an email at <a href="mailto:[email protected]">[email protected]</a>.</p> 1492 1493 1494 1495<p class="wp-block-paragraph">Thatâs all for now! Stay tuned for updates on topics discussed in this article. Likewise, as the new infrastructure stabilizes, expect a significant amount of documentation updates too.</p> 1496 1497 1498 1499<p class="wp-block-paragraph">We thank all KernelCIÂ <a href="https://docs.kernelci.org/org/members/">member organizations</a>Â and developer community who have been investing in the project over the years. It is only because of the continued support from our community that we are making the legacy system a past story!</p> 1500 1501 </div> 1502 </div> 1503 </div> 1504 </div> 1505</article> 1506 1507<article id="post-285" class="post-285 post type-post status-publish format-standard category-blog category-community category-news"> 1508 <div class="inner-wrap animated"> 1509 <div class="post-content"> 1510 1511<div class="post-author"> 1512 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 1513 1514 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a>, <a class="news" href="https://kernelci.org/category/news/">News</a></span></div> <div class="content-inner"> 1515 <div class="article-content-wrap"> 1516 <div class="post-header"> 1517 <h2 class="title"><a href="https://kernelci.org/blog/2024/04/02/exciting-kernelci-tsc-updates/"> Exciting KernelCI TSC updates</a></h2> 1518 </div> 1519 1520 1521<p class="wp-block-paragraph">During our last TSC meeting, on March 14th, we had two votes that brought new winds to our community:</p> 1522 1523 1524 1525<p class="wp-block-paragraph"><strong>Shuah Khan joins the TSC</strong></p> 1526 1527 1528 1529<p class="wp-block-paragraph">Shuah, Kernel Maintainer &
1529 Linux Fellow at The Linux Foundation, has been elected a new member of the TSC. We believe Shuahâs experience will help the KernelCI project expand its kernel community engagement efforts, taking testing and CI to more parts of the upstream kernel. Welcome, Shuah!</p> 1530 1531 1532 1533<p class="wp-block-paragraph"><strong>Nikolai Kondrashov elected as the new TSC Chair</strong></p> 1534 1535 1536 1537<p class="wp-block-paragraph">Nikolai has been a longstanding contributor under the KernelCI umbrella and the person behind KCIDB. At Red Hat he also contributes to kernel integration technology. His knowledge around the problems KernelCI needs to solve will help the project greatly. His role will be effective on April 1st. All the best to Nikolai in his new role!</p> 1538 1539 1540 1541<p class="wp-block-paragraph">While at it, we thank Guillaume for his tenure as TSC Chair of the project!</p> 1542 1543 1544 1545<p class="wp-block-paragraph">The detail of the motions which were voted can be found on the TSCÂ <a href="https://docs.kernelci.org/org/tsc/votes/#2024-03-14">documentation</a>.</p> 1546 1547 </div> 1548 </div> 1549 </div> 1550 </div> 1551</article> 1552 1553<article id="post-281" class="post-281 post type-post status-publish format-standard category-blog category-community category-news"> 1554 <div class="inner-wrap animated"> 1555 <div class="post-content"> 1556 1557<div class="post-author"> 1558 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 1559 1560 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a>, <a class="news" href="https://kernelci.org/category/news/">News</a></span></div> <div class="content-inner"> 1561 <div class="article-content-wrap"> 1562 <div class="post-header"> 1563 <h2 class="title"><a href="https://kernelci.org/blog/2023/12/04/ux-research-for-the-new-web-dashboard/"> UX Research for the new Web Dashboard</a></h2> 1564 </div> 1565 1566 1567<p class="wp-block-paragraph">Following the <a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis/">UX Analysis RFP</a> we shared a few months ago, weâre now delighted to announce that the KernelCI Advisory Board has accepted a proposal. First of all, weâre grateful to have received such a series of high-quality proposals. Many thanks once again to all the submitters for your interest in the project.</p> 1568 1569 1570 1571<p class="wp-block-paragraph">After carefully considering all the options with the board and some TSC members, the vote came out in favour of <a href="https://profusion.mobi/index-en.html">ProFUSION</a>. Congratulations! Weâre looking forward to the next milestones, in fact the work has already started.</p> 1572 1573 1574 1575<h2 class="wp-block-heading" id="milestones">Milestones<a href="https://kernelci.org/blog/posts/2023/ux-analysis/#milestones"></a></h2> 1576 1577 1578 1579<p class="wp-block-paragraph">The UX Analysis project is broken down into three milestones with four weeks assigned to each, so a total of twelve weeks. Some breaks will also be scheduled during this time so the calendar end date is likely to be in March 2024.</p> 1580 1581 1582 1583<h3 class="wp-block-heading" id="m1-result-of-interviews">M1: Result of interviews<a href="https://kernelci.org/blog/posts/2023/ux-analysis/#m1-result-of-interviews"></a></h3> 1584 1585 1586 1587<p class="wp-block-paragraph">Some interviews will be carried out with various stakeholders to help refine user stories and start modelling the user experience and some design aspects.</p> 1588 1589 1590 1591<h3 class="wp-block-heading" id="m2-first-ux-design-proposal">
1591M2: First UX design proposal<a href="https://kernelci.org/blog/posts/2023/ux-analysis/#m2-first-ux-design-proposal"></a></h3> 1592 1593 1594 1595<p class="wp-block-paragraph">A first interactive prototype will then be created and made available for members of the public to evaluate and provide feedback.</p> 1596 1597 1598 1599<h3 class="wp-block-heading" id="m3-final-ux-design-proposal">M3: Final UX design proposal<a href="https://kernelci.org/blog/posts/2023/ux-analysis/#m3-final-ux-design-proposal"></a></h3> 1600 1601 1602 1603<p class="wp-block-paragraph">Based on the feedback and outcome of the first two milestones, the last part is about creating high-level specifications of the web dashboard design suitable for the implementation phase.</p> 1604 1605 1606 1607<ul class="wp-block-list"> 1608<li></li> 1609</ul> 1610 1611 </div> 1612 </div> 1613 </div> 1614 </div> 1615</article> 1616 1617<article id="post-280" class="post-280 post type-post status-publish format-standard category-blog category-community"> 1618 <div class="inner-wrap animated"> 1619 <div class="post-content"> 1620 1621<div class="post-author"> 1622 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 1623 1624 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a></span></div> <div class="content-inner"> 1625 <div class="article-content-wrap"> 1626 <div class="post-header"> 1627 <h2 class="title"><a href="https://kernelci.org/blog/2023/09/04/kernelci-api-early-access/"> KernelCI API Early Access</a></h2> 1628 </div> 1629 1630 1631<h2 class="wp-block-heading" id="free-for-all">Free for all<a href="https://kernelci.org/blog/posts/2023/api-early-access/#free-for-all"></a></h2> 1632 1633 1634 1635<p class="wp-block-paragraph">Today is the beginning of the Early Access phase for the new KernelCI API. As explained briefly in the <a href="https://kernelci.org/blog/posts/2023/api-timeline/">previous blog post</a>, this is to give everyone a chance to create a user account and start using the API for beta-testing purposes. Thereâs now an <a href="https://kernelci.org/docs/api/early-access/">Early Access</a> documentation page with a quick guide to get started, so please go take a look there and start taking part.</p> 1636 1637 1638 1639<h2 class="wp-block-heading" id="a-work-in-progress">A work in progress<a href="https://kernelci.org/blog/posts/2023/api-early-access/#a-work-in-progress"></a></h2> 1640 1641 1642 1643<p class="wp-block-paragraph">Although the fundamental principles of the API & Pipeline have now settled a bit, it is still under active development. In particular, weâre expecting to see a fair amount of changes in these areas:</p> 1644 1645 1646 1647<h3 class="wp-block-heading" id="kci-command-line-tool"><code>kci</code> command line tool<a href="https://kernelci.org/blog/posts/2023/api-early-access/#kci-command-line-tool"></a></h3> 1648 1649 1650 1651<p class="wp-block-paragraph">Itâs still very new and only provides some basic features, so now it needs some proper design. For example, new commands should be added and it might become more human-readable with things like <code>kci find node</code> rather than <code>kci node find</code>.</p> 1652 1653 1654 1655<h3 class="wp-block-heading" id="build-and-test-coverage">Build and test coverage<a href="https://kernelci.org/blog/posts/2023/api-early-access/#build-and-test-coverage"></a></h3> 1656 1657 1658 1659<p class="wp-block-paragraph">This can only grow as right now thereâs only KUnit, one x86 build and one QEMU smoke test run for each kernel revision (and only from mainline). Starting to scale this up will help tackle the main bottlenecks and performance issues in the infrastru
1659cture before reaching production quality.</p> 1660 1661 1662 1663<h3 class="wp-block-heading" id="documentation">Documentation<a href="https://kernelci.org/blog/posts/2023/api-early-access/#documentation"></a></h3> 1664 1665 1666 1667<p class="wp-block-paragraph">Yes, now that things are shaping up we should also be taking good care of the overall documentation and general ease of use of the project. This should also encompass things such as moderation rules to ensure continuity of the project.</p> 1668 1669 1670 1671<h2 class="wp-block-heading" id="a-two-way-process">A two-way process<a href="https://kernelci.org/blog/posts/2023/api-early-access/#a-two-way-process"></a></h2> 1672 1673 1674 1675<p class="wp-block-paragraph">This system is made for you, all the members of the wider Linux kernel ecosystem. So while thereâs a small but growing team of developers still typing away all the code needed to make it happen, we need your feedback to help shape things up in such a way that it actually delivers on its expectations.</p> 1676 1677 1678 1679<p class="wp-block-paragraph">Please experiment as much as you like and share your stories, thoughts and questions via the projectâs usual communication channels. Also feel free to create issues on GitHub and send pull requests of course.</p> 1680 1681 1682 1683<p class="wp-block-paragraph"><strong>Happy beta-testing!</strong></p> 1684 1685 </div> 1686 </div> 1687 </div> 1688 </div> 1689</article> 1690 1691<article id="post-279" class="post-279 post type-post status-publish format-standard category-blog category-community"> 1692 <div class="inner-wrap animated"> 1693 <div class="post-content"> 1694 1695<div class="post-author"> 1696 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 1697 1698 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a></span></div> <div class="content-inner"> 1699 <div class="article-content-wrap"> 1700 <div class="post-header"> 1701 <h2 class="title"><a href="https://kernelci.org/blog/2023/07/28/api-transition-timeline/"> API Transition Timeline</a></h2> 1702 </div> 1703 1704 1705<p class="wp-block-paragraph">Once upon a time, on a Thursday afternoon somewhere in Italy, a KernelCI backend API was created:</p> 1706 1707 1708 1709<pre class="wp-block-code"><code>commit 08c9b0879ebe81463e124308192670c0e7447e0b 1710Author: Milo Casagrande <[email protected]> 1711Date: Thu Feb 20 16:10:41 2014 +0100 1712 1713 First commit. 1714</code></pre> 1715 1716 1717 1718<p class="wp-block-paragraph">As you can see, it was nearly 10 years ago. How much does that represent in the modern software world? Of course, it depends. The Linux kernel is much older, still written in C and still going strong. But in most cases, including this particular one, it means a whole new world. The old API was written in Python 2.7 which stopped being maintained as a language on 1st January 2020. We could have just rewritten it in Python 3, which was the initial thought. But in the meantime, KernelCI was also growing as a project. It wasnât just about building ARM kernels and doing boot testing on embedded dev boards any more. It had become a Linux Foundation project aiming to test the whole upstream kernel.</p> 1719 1720 1721 1722<h2 class="wp-block-heading" id="what-is-this-new-api">What is this new API?<a href="https://kernelci.org/blog/posts/2023/api-timeline/#what-is-this-new-api"></a></h2> 1723 1724 1725 1726<p class="wp-block-paragraph">Following this move, an increasing number of people became interested as it got under the spotlight. That is when we started to realise that the architecture needed to fundamentally evolve in order to match the scale of the new mission it had been assigned. The Linux kernel is a vast and complex open-source project with a unique ecosystem. As such, it requires some unique tooling too. We all know that <a href="https://git-scm.com/">Git</a> was initially created out of a need to manage all the kernel patches. Now KernelCI needs an automated testing tool tailor-made to its unique requirements – and thatâs why weâre finally launching the new API & Pipeline.</p> 1727 1728 1729 1730<p class="wp-block-paragraph">It comes with lots of improvements and itâs still a work-in-progress. Weâll keep publishing blog posts and update the documentation as things evolve over the next few months. Right now we have a pipeline that can monitor Git repositories for new revisions, take a snapshot of the kernel source tree in a tarball, run KUnit with it as well as an x86 kernel build and smoke test it in QEMU. It can then also send a summary email and detect regressions. Thatâs basically enough to prove we have a workable system. Nothing too groundbreaking there, you might think. So, whatâs all the fuss about?</p> 1731 1732 1733 1734<p class="wp-block-paragraph">In a nutshell: a Pub/Sub interface to orchestrate distributed client-side services that can be run anywhere. You could have your own too at home. Also: user accounts so you can keep your own personal test data there, an abstraction for runtime environments so jobs can be run seamlessly in Docker, Kubernetes, a local shell, LAVA, [insert your own system here]⦠a new <code>kci</code> command line tool to rule them all and a unified Node schema to contain all the test data (revision, build, runtime test, regressionâ¦) in a tree. But again, weâll go through all that later in more detail. Itâs all based on requirements gathered from the community over the past few years.</p> 1735 1736 1737 1738<h2 class="wp-block-heading" id="timeline">Timeline<a href="https://kernelci.org/blog/posts/2023/api-timeline/#timeline"></a></h2> 1739 1740 1741 1742<p class="wp-block-paragraph">The main message in this blog post is the timeline for retiring the old system and getting the new API in production. Hereâs the proposal:Early AccessMonday 4th September 2023Production DeploymentMonday 4th December 2023Legacy System DeprecationMonday 4th March 2024Legacy System SunsetMonday 4th November 2024</p> 1743 1744 1745 1746<p class="wp-block-paragraph">It only takes four Monday-the-Forth milestones to get through all this. Hereâs what they mean:</p> 1747 1748 1749 1750<h3 class="wp-block-heading" id="early-access">Early Access<a href="https://kernelci.org/blog/posts/2023/api-timeline/#early-access"></a></h3> 1751 1752 1753 1754<p class="wp-block-paragraph">This is when a new API & Pipeline instance becomes available to let the public experiment with it. It can be seen as some form of beta-testing. It will be deployed in the Cloud to evaluate how a real production instance would behave, but itâs only kept online as a best effort. There should be frequent updates as the code evolves, probably at least weekly and at most daily. Only changes that made it through early testing on the staging instance should be deployed so itâs meant to be reasonably stable.</p> 1755 1756 1757 1758<h3 class="wp-block-heading" id="production-deployment">Production Deployment<a href="https://kernelci.org/blog/posts/2023/api-timeline/#production-deployment"></a></h3> 1759 1760 1761 1762<p class="wp-block-paragraph">The plan is to build upon the experience learned from the Early Access deployment to prepare a persistent instance that would eventually become the production one. Data should be carefully kept and backed up, changes in the database schema should go through managed migrations and the API code should be deployed from tagged releases. As soon as this has become reliable enough we might shut down the Early Access instance since it should have become redundant by then.</p> 1763 1764 1765 1766<h3 class="wp-block-heading" id="legacy-system-deprecation">Legacy System Deprecation<a href="https://kernelci.org/blog/posts/2023/api-timeline/#legacy-system-deprecation"></a></h3> 1767 1768 1769 1770<p class="wp-block-paragraph">In other words, this is when the new API & Pipeline production instance becomes the official main KernelCI instance. Weâll first be going through a transition phase to ramp up the build and test coverage on the new API while equally reducing the load on the legacy system to avoid overloading the shared infrastru
1770cture. Ideally, coverage should have reached 80% on the new API and 20% on the old one by this date.</p> 1771 1772 1773 1774<h3 class="wp-block-heading" id="legacy-system-sunset">Legacy System Sunset<a href="https://kernelci.org/blog/posts/2023/api-timeline/#legacy-system-sunset"></a></h3> 1775 1776 1777 1778<p class="wp-block-paragraph">After being deprecated, the legacy system will keep running with a bare minimal amount of coverage just to facilitate the transition for users who depended the most on it. It will be definitely shut down and the data will be archived when finally reaching the Sunset milestone.</p> 1779 1780 1781 1782<h2 class="wp-block-heading" id="stay-tuned">Stay tuned<a href="https://kernelci.org/blog/posts/2023/api-timeline/#stay-tuned"></a></h2> 1783 1784 1785 1786<p class="wp-block-paragraph">These dates have been identified as realistic targets for having the new API rolled out and retiring the old one with a transition in between. Weâll be aiming to have the new API in place <em>by</em> these dates and conversely retire the legacy system <em>no sooner than</em> announced here.</p> 1787 1788 1789 1790<p class="wp-block-paragraph">In the meantime, weâll be posting updates as these milestones get reached or if any alterations need to be managed. Weâll also clarify how to use the API and exactly what features become available alongside the main <a href="https://kernelci.org/docs/api">documentation</a>. Please share with us any feedback you may have, if you need some clarifications or to raise any concerns. The best way to do this is via the <a href="mailto:[email protected]">mailing list</a> as always. Stay tuned!</p> 1791 1792 </div> 1793 </div> 1794 </div> 1795 </div> 1796</article> 1797 1798<article id="post-274" class="post-274 post type-post status-publish format-standard category-blog category-community"> 1799 <div class="inner-wrap animated"> 1800 <div class="post-content"> 1801 1802<div class="post-author"> 1803 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 1804 1805 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a></span></div> <div class="content-inner"> 1806 <div class="article-content-wrap"> 1807 <div class="post-header"> 1808 <h2 class="title"><a href="https://kernelci.org/blog/2023/07/20/request-for-proposals-ux-analysis-2023-qa/"> Request for Proposals: UX Analysis 2023 – Q&A</a></h2> 1809 </div> 1810 1811 1812<p class="wp-block-paragraph">Following the <a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis/">UX Analysis RFP</a>, weâve received a number of questions which seem worth sharing publicly in order to equally benefit all the proposals we receive.</p> 1813 1814 1815 1816<h2 class="wp-block-heading" id="big-picture">Big Picture<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#big-picture"></a></h2> 1817 1818 1819 1820<h3 class="wp-block-heading" id="what-are-your-organizations-most-important-broader-goals-with-this-new-dashboard">What are your organizationâs most important broader goals with this new dashboard?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#what-are-your-organizations-most-important-broader-goals-with-this-new-dashboard"></a></h3> 1821 1822 1823 1824<p class="wp-block-paragraph">Weâve identified a requirement to have a web dashboard in a <a href="https://kernelci.org/blog/posts/2020/07/09/">community survey</a> we did a couple of years ago. Itâs mostly about providing Linux kernel developers with the information they need to facilitate their daily workflows, and also other types of users for example if theyâre basing their products on the upstream kernel and need to monitor its quality.</p> 1825 1826 1827 1828<h3 class="wp-block-heading" id="what-are-biggest-issues-or-problems-youre-having-with-your-current-system-that-prompted-this-ux-analysis-rfp">What are biggest issues or problems youâre having with your current system that prompted this UX Analysis RFP?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#what-are-biggest-issues-or-problems-youre-having-with-your-current-system-that-prompted-this-ux-analysis-rfp"></a></h3> 1829 1830 1831 1832<p class="wp-block-paragraph">We currently have a very <a href="https://linux.kernelci.org/job/">old web dashboard</a> with an associated backend that canât be maintained any more. On top of that, the project has been growing and weâre now redesigning the whole approach to be able to better scale with a new API which doesnât have any actual web dashboard right now.</p> 1833 1834 1835 1836<h3 class="wp-block-heading" id="what-factors-made-your-team-decide-to-release-an-rfp-for-this-project">What factors made your team decide to release an RFP for this project?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#what-factors-made-your-team-decide-to-release-an-rfp-for-this-project"></a></h3> 1837 1838 1839 1840<p class="wp-block-paragraph">None of the KernelCI LF project members had enough in-house expertise. Also, looking for an independent external supplier appeared as an appropriate choice in this case.</p> 1841 1842 1843 1844<h3 class="wp-block-heading" id="is-there-an-incumbent-bidder-on-this-project">Is there an incumbent bidder on this project?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#is-there-an-incumbent-bidder-on-this-project"></a></h3> 1845 1846 1847 1848<p class="wp-block-paragraph">No, this is the first RFP we do about UX Analysis and web development in general.</p> 1849 1850 1851 1852<h3 class="wp-block-heading" id="how-will-vendors-be-evaluated-and-scored">How will vendors be evaluated and scored?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#how-will-vendors-be-evaluated-and-scored"></a></h3> 1853 1854 1855 1856<p class="wp-block-paragraph">We will come up with some criteria as a basic comparison method, then each member of the advisory board will look at all the proposals and weâll discuss it and eventually hold a vote. We may al
1856so inquire further with some vendors if needed.</p> 1857 1858 1859 1860<h3 class="wp-block-heading" id="how-many-rounds-of-revisions-and-how-many-ux-flows-are-you-expecting-as-part-of-this-project">How many rounds of revisions and how many UX flows are you expecting as part of this project?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#how-many-rounds-of-revisions-and-how-many-ux-flows-are-you-expecting-as-part-of-this-project"></a></h3> 1861 1862 1863 1864<p class="wp-block-paragraph">This is very hard to predict as weâre still in the early design stages. There should probably be a small number both of revisions and flows (e.g. 2 or 3), maybe later we would be dealing with incremental changes resulting in more revisions as part of the full implementation efforts.</p> 1865 1866 1867 1868<h3 class="wp-block-heading" id="do-you-have-a-preference-regarding-the-vendors-location">Do you have a preference regarding the vendorâs location?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#do-you-have-a-preference-regarding-the-vendors-location"></a></h3> 1869 1870 1871 1872<p class="wp-block-paragraph">No, there is no preference over the country where the vendor is located. The KernelCI projectâs team is remotely distributed around the world.</p> 1873 1874 1875 1876<h2 class="wp-block-heading" id="content">Content<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#content"></a></h2> 1877 1878 1879 1880<h3 class="wp-block-heading" id="would-you-need-any-copywriting-or-content-migration-services">Would you need any copywriting or content migration services?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#would-you-need-any-copywriting-or-content-migration-services"></a></h3> 1881 1882 1883 1884<p class="wp-block-paragraph">None that weâre currently aware of.</p> 1885 1886 1887 1888<h3 class="wp-block-heading" id="would-you-need-any-original-or-stock-videography-or-photography">Would you need any original or stock videography or photography?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#would-you-need-any-original-or-stock-videography-or-photography"></a></h3> 1889 1890 1891 1892<p class="wp-block-paragraph">Not with the UX Analysis phase. We might need some original content for a final website in production.</p> 1893 1894 1895 1896<h3 class="wp-block-heading" id="how-much-content-do-you-currently-have-on-your-website">How much content do you currently have on your website?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#how-much-content-do-you-currently-have-on-your-website"></a></h3> 1897 1898 1899 1900<p class="wp-block-paragraph">Our static websites have tens of pages. Our current dynamic web dashboard has millions of entries, and this is what weâre expecting to see covered by the UX Analysis. Some static content may be part of the interactive web dashboard but itâs not the primary goal.</p> 1901 1902 1903 1904<h3 class="wp-block-heading" id="is-there-a-cms-that-you-have-a-preference-for-over-the-other">Is there a CMS that you have a preference for over the other?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#is-there-a-cms-that-you-have-a-preference-for-over-the-other"></a></h3> 1905 1906 1907 1908<p class="wp-block-paragraph">No, however we do have an API for storing our data. How this is turned into a UX and web dashboard is up to the vendor to decide as part of the proposal.</p> 1909 1910 1911 1912<h3 class="wp-block-heading" id="what-cms-platform-do-you-use-currently">What CMS platform do you use currently?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#what-cms-platform-do-you-use-currently"></a></h3> 1913 1914 1915 1916<p class="wp-block-paragraph">For some static websites we use WordPress and Hugo, but this UX Analysis work is for an interactive web dashboard. We donât have any particular CMS requirements for it.</p> 1917 1918 1919 1920<h2 class="wp-block-heading" id="requirements">Requirements<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#requirements"></a></h2> 1921 1922 1923 1924<h3 class="wp-block-heading" id="would-you-require-hosting-dns-or-ssl-services">Would you require hosting, dns or ssl services?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#would-you-require-hosting-dns-or-ssl-services"></a></h3> 1925 1926 1927 1928<p class="wp-block-paragraph">No, the KernelCI project can take care of this.</p> 1929 1930 1931 1932<h3 class="wp-block-heading" id="how-much-initial-research-has-been-done-as-part-of-this-rfp">How much initial research has been done as part of this RFP?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#how-much-initial-research-has-been-done-as-part-of-this-rfp"></a></h3> 1933 1934 1935 1936<p class="wp-block-paragraph">A lot of research has been done in the past few years to try and understand what the public and users need. Whatâs missing is how this may translate into an actual UX. We now have some ideas about âwhatâ we need but not âhowâ users can have it.</p> 1937 1938 1939 1940<h3 class="wp-block-heading" id="are-there-any-factors-driving-the-timeline-for-the-completion-of-the-work">Are there any factors driving the timeline for the completion of the work?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#are-there-any-factors-driving-the-timeline-for-the-completion-of-the-work"></a></h3> 1941 1942 1943 1944<p class="wp-block-paragraph">Weâre developing a new API which will be used hand-in-hand with the web dashboard. The timeline isnât set in stone but having a prototype dashboard or basic demo around the end of September would be great. Weâre thinking of having the new API in production in the first half of 2024 so it would be good to see the web dashboard getting finalised around that time too.</p> 1945 1946 1947 1948<h3 class="wp-block-heading" id="can-you-give-us-a-high-level-overview-of-the-demographics-of-each-persona-from-the-user-stories">Can you give us a high-level overview of the demographics of each persona from the user stories?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#can-you-give-us-a-high-level-overview-of-the-demographics-of-each-persona-from-the-user-stories"></a></h3> 1949 1950 1951 1952<ul class="wp-block-list"> 1953<li>âSomeone who cares about the kernelâ can be literally anyone, from a student to a high-profile maintainer or developer. The only real criteria is that they need to know about the upstream kernel code quality. There may be a million people in this category.</li> 1954 1955 1956 1957<li>âKernel / subsystem maintainerâ are a relatively small set of people in charge of accepting changes into the kernel. They form some sort of pyramid of trust with several maintainers sending their collected changes to a common maintainer etc. Like any kernel contributors, they are located around the world and have various levels of experience. Thereâs maybe about 100 subsystem maintainers and 1000 maintainers responsible for smaller areas of the code.</li> 1958</ul> 1959 1960 1961 1962<h3 class="wp-block-heading" id="do-you-have-examples-of-the-email-reports-that-are-sent-with-summaries-of-test-results">Do you have examples of the email reports that are sent with summaries of test results?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#do-you-have-examples-of-the-email-reports-that-are-sent-with-summaries-of-test-results"></a></h3> 1963 1964 1965 1966<ul class="wp-block-list"> 1967<li>Hereâs a particular one about a bisection result which found a commit that caused some test to fail:<br><a href="https://lore.kernel.org/all/Y%[email protected]/">https://lore.kernel.org/all/Y%[email protected]/</a></li> 1968 1969 1970 1971<li>Hereâs the full archive with all the email reports weâre currently sending:<br><a href="https://groups.io/g/kernelci-results/topics">https://groups.io/g/kernelci-results/topics</a></li> 1972 1973 1974 1975<li>Hereâs also a KCIDB email report, which collects results from other test systems into a single report:<br><a href="https://groups.io/g/kernelci-results-staging/message/48385">https://groups.io/g/kernelci-results-staging/message/48385</a></li> 1976</ul> 1977 1978 1979 1980<h3 class="wp-block-heading" id="are-the-test-results-currently-stored-in-a-database-that-the-new-web-dashboard-will-visualize">Are the test results currently stored in a database that the new web dashboard will visualize?<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis-q-and-a/#are-the-test-results-currently-stored-in-a-database-that-the-new-web-dashboard-will-visualize"></a></h3> 1981 1982 1983 1984<p class="wp-block-paragraph">Yes, the new API has an <a href="https://staging.kernelci.org:9000/latest/docs">auto-generated documentation</a> with OpenAPI description. This is still a staging instance for experiments, weâre planning to roll out a production-like instance in the coming weeks and start refining the schema. Basically, all the test data is contained in a tree of Node objects. The underlying engine is MongoDB, and weâre looking into using Atlas for this. The API also features a Pub/Sub interface for events that trigger different stages of the testing pipeline on the client side.</p> 1985 1986 1987 1988<p class="wp-block-paragraph">The <a href="https://kernelci.org/docs/kcidb/">KCIDB</a> database has a different schema, but the web dashboard wouldnât necessarily need to read data from both
1988sources. Thatâs something we still need to define, there are several ways to solve this. Itâs also something which might depend on the outcome of the UX Analysis. Thereâs already an interim web dashboard for KCIDB based on <a href="https://kcidb.kernelci.org/">Grafana</a>.</p> 1989 1990 </div> 1991 </div> 1992 </div> 1993 </div> 1994</article> 1995 1996<article id="post-275" class="post-275 post type-post status-publish format-standard category-blog category-community category-news"> 1997 <div class="inner-wrap animated"> 1998 <div class="post-content"> 1999 2000<div class="post-author"> 2001 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 2002 2003 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a>, <a class="news" href="https://kernelci.org/category/news/">News</a></span></div> <div class="content-inner"> 2004 <div class="article-content-wrap"> 2005 <div class="post-header"> 2006 <h2 class="title"><a href="https://kernelci.org/blog/2023/05/29/request-for-proposals-ux-analysis-2023/"> Request for Proposals: UX Analysis 2023</a></h2> 2007 </div> 2008 2009 2010<p class="wp-block-paragraph">
2010The KernelCI project runs thousands of Linux kernel tests every day, generating a huge amount of data to help the community identify issues and trends. One way to communicate all this is through a bespoke web application that truly embodies the kernel communityâs use cases. This Request For Proposals (RFP) aims to be an initial investigation to understand how the User Experience (UX) of the Web Dashboard could look like based on a set of user stories compiled by the KernelCI team.</p> 2011 2012 2013 2014<h2 class="wp-block-heading" id="budget">Budget<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis/#budget"></a></h2> 2015 2016 2017 2018<p class="wp-block-paragraph">Weâre expecting vendors to submit a fixed-price proposal showing the total costs for the different phases they plan for the project. Optional or extra phases can be included as well. The vendors have autonomy to propose a process for the iterative feedback roadmap. Payments would be made by the Linux Foundation using the projectâs own budget.</p> 2019 2020 2021 2022<h2 class="wp-block-heading" id="sending-proposals">Sending proposals<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis/#sending-proposals"></a></h2> 2023 2024 2025 2026<p class="wp-block-paragraph">Please take a look at the full <a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis/RFP-UX-Analysis-2023-v2.pdf">RFP-UX-Analysis-2023-v2.pdf</a> document for all the details. Proposals should be sent by email directly to the <a href="mailto:[email protected]">project members</a>.</p> 2027 2028 2029 2030<p class="wp-block-paragraph">The deadline for responding to this RFP is <strong>10th July 2023</strong>, six weeks after it has been made public. Then the KernelCI Advisory Board of Members will vote on the <strong>24th July 2023</strong>. Exact dates might be subject to change in case of a major practical issue or unavailability of voting members.</p> 2031 2032 2033 2034<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"> 2035<p class="wp-block-paragraph"><strong>Edit</strong>: Following a surge in last-minute queries, the timeline has now been extended. The new deadline for submitting proposals is <strong>24th July 2023</strong> and the advisory board is planning to hold a vote on <strong>9th August 2023</strong>.</p> 2036</blockquote> 2037 2038 </div> 2039 </div> 2040 </div> 2041 </div> 2042</article> 2043 2044<article id="post-271" class="post-271 post type-post status-publish format-standard category-blog category-community category-news"> 2045 <div class="inner-wrap animated"> 2046 <div class="post-content"> 2047 2048<div class="post-author"> 2049 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 2050 2051 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a>, <a class="news" href="https://kernelci.org/category/news/">News</a></span></div> <div class="content-inner"> 2052 <div class="article-content-wrap"> 2053 <div class="post-header"> 2054 <h2 class="title"><a href="https://kernelci.org/blog/2023/01/27/kernelci-at-fosdem-2023/"> KernelCI at FOSDEM 2023</a></h2> 2055 </div> 2056 2057 2058<p class="wp-block-paragraph">Taking place February 4th and 5th, FOSDEM is a fantastic event organised âby the community for the communityâ in Brussels, Belgium, Europe. FOSDEM provides Open Source communities a place to meet in person.</p> 2059 2060 2061 2062<p class="wp-block-paragraph">The KernelCI initiative is delighted to be present at FOSDEM 2023.</p> 2063 2064 2065 2066<p class="wp-block-paragraph">Testing is recognized by all to be critically important for Open Source communities at large, and not enough is being done. The KernelCI initiative (
2066a Linux Foundation project) intends to change that.</p> 2067 2068 2069 2070<p class="wp-block-paragraph">During the weekend of FOSDEM 2023, please keep testing in mind throughout the conversations you will be having with peers and members of the community.</p> 2071 2072 2073 2074<p class="wp-block-paragraph">Remind yourself and your interlocutors of the importance of testing and the existence of the KernelCI initiative.</p> 2075 2076 2077 2078<h2 class="wp-block-heading" id="find-out-more-about-kernelci">Find out more about KernelCI<a href="https://kernelci.org/blog/posts/2023/fosdem-2023/#find-out-more-about-kernelci"></a></h2> 2079 2080 2081 2082<p class="wp-block-paragraph">Mission statement: <a href="https://kernelci.org/docs/org/">https://kernelci.org/docs/org/</a></p> 2083 2084 2085 2086<p class="wp-block-paragraph">Interested to see your tests ran by KernelCI natively? Here is how to <a href="https://kernelci.org/docs/tests/howto/">get started</a> with KernelCI.</p> 2087 2088 2089 2090<p class="wp-block-paragraph">You already have your own automated execution of tests and would be interested/willing to contribute your results? Please see the <a href="https://github.com/kernelci/kcidb/blob/main/doc/submitter_guide.md">KCIDB submitter guide</a>.</p> 2091 2092 2093 2094<p class="wp-block-paragraph">You can find the <a href="https://github.com/kernelci/kcidb/blob/main/tests.yaml">catalog</a> (yaml file) of the tests integrated today here. Some of the most notable test suites reporting today: bpf, kselftest, ltp, perftool, podman, Redhatâs test suites, stress-ng, syzkaller, xfstests, and many more.</p> 2095 2096 2097 2098<p class="wp-block-paragraph">If you would like some help, please reach out to the KernelCI community:</p> 2099 2100 2101 2102<ul class="wp-block-list"> 2103<li>
2103Mailing list:Â <a href="http://lore.kernel.org/kernelci/">http://lore.kernel.org/kernelci/</a></li> 2104 2105 2106 2107<li>Code:Â <a href="http://github.com/kernelci">http://github.com/kernelci</a></li> 2108 2109 2110 2111<li>Twitter:Â <a href="https://twitter.com/kernelci">https://twitter.com/kernelci</a></li> 2112</ul> 2113 2114 2115 2116<p class="wp-block-paragraph">Members of the KernelCI Advisory Board (AB) and Technical Steering Committee (TSC) will be present in-person at FOSDEM 2023. Many will be in the <a href="https://fosdem.org/2023/schedule/track/testing_and_automation/">Testing and Automation devroom</a> (Sunday morning in room UB4.132).</p> 2117 2118 2119 2120<p class="wp-block-paragraph">Looking forward to meeting as many as possible in Brussels, February 4th and 5th 2023.</p> 2121 2122 2123 2124<h2 class="wp-block-heading" id="kernelci-related-talks-at-fosdem-2023">KernelCI related talks at FOSDEM 2023<a href="https://kernelci.org/blog/posts/2023/fosdem-2023/#kernelci-related-talks-at-fosdem-2023"></a></h2> 2125 2126 2127 2128<p class="wp-block-paragraph"><a href="https://fosdem.org/2023/schedule/event/graph_case_for_dag/">A case for DAG databases Correlating revision history with CI results</a></p> 2129 2130 2131 2132<ul class="wp-block-list"> 2133<li>Track: Graph Systems and Algorithms devroom</li> 2134 2135 2136 2137<li>Room: K.4.601</li> 2138 2139 2140 2141<li>Day: Saturday</li> 2142 2143 2144 2145<li>Start: 12:00</li> 2146</ul> 2147 2148 2149 2150<p class="wp-block-paragraph"><a href="https://fosdem.org/2023/schedule/event/growing_testing_lab/">Growing a lab for automated upstream testing: challenges and lessons learned</a></p> 2151 2152 2153 2154<ul class="wp-block-list"> 2155<li>Track: Testing and Automation devroom</li> 2156 2157 2158 2159<li>Room: UB4.132</li> 2160 2161 2162 2163<li>Day: Sunday</li> 2164 2165 2166 2167<li>Start: 09:30</li> 2168</ul> 2169 2170 2171 2172<p class="wp-block-paragraph"><a href="https://fosdem.org/2023/schedule/event/device_support/">Rethinking device support for the long-term</a></p> 2173 2174 2175 2176<ul class="wp-block-list"> 2177<li>Track: Kernel devroom</li> 2178 2179 2180 2181<li>Room: UA2.220 (Guillissen)</li> 2182 2183 2184 2185<li>Day: Sunday</li> 2186 2187 2188 2189<li>Start: 16:30</li> 2190</ul> 2191 2192 </div> 2193 </div> 2194 </div> 2195 </div> 2196</article> 2197 2198<article id="post-270" class="post-270 post type-post status-publish format-standard category-blog category-community category-news"> 2199 <div class="inner-wrap animated"> 2200 <div class="post-content"> 2201 2202<div class="post-author"> 2203 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 2204 2205 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a>, <a class="news" href="https://kernelci.org/category/news/">News</a></span></div> <div class="content-inner"> 2206 <div class="article-content-wrap"> 2207 <div class="post-header"> 2208 <h2 class="title"><a href="https://kernelci.org/blog/2022/09/28/now-kernelci-has-a-dedicated-sysadmin/">
2208 Now KernelCI has a dedicated SysAdmin!</a></h2> 2209 </div> 2210 2211 2212<p class="wp-block-paragraph">Recently, we posted about the <a href="https://kernelci.org/blog/posts/2022/rfp-sysadmin/">Request For Proposals</a> to undertake SysAdmin tasks for KernelCI.org. That process is now complete, and we are delighted to announce that the KernelCI advisory board hired Vince Hillier from Revenni Inc to conduct the work.</p> 2213 2214 2215 2216<p class="wp-block-paragraph">Vince will work together with the Technical Steering Committee (<a href="https://kernelci.org/docs/org/tsc/">TSC</a>) to maintain and improve the current project infrastructure. As KernelCI.org scales with more kernels being built and more tests being run, we definitely need help to keep our systems stable and up to date.</p> 2217 2218 2219 2220<p class="wp-block-paragraph">The KernelCI project relies on a number of web services which need constant maintenance. These include databases, automation tools and web dashboards for several <a href="https://kernelci.org/docs/instances/">instances</a>. Some are hosted on dedicated virtual machines (VMs), others in the cloud.</p> 2221 2222 </div> 2223 </div> 2224 </div> 2225 </div> 2226</article> 2227 2228<article id="post-266" class="post-266 post type-post status-publish format-standard category-blog category-community category-news"> 2229 <div class="inner-wrap animated"> 2230 <div class="post-content"> 2231 2232<div class="post-author"> 2233 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 2234 2235 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a>, <a class="news" href="https://kernelci.org/category/news/">News</a></span></div> <div class="content-inner"> 2236 <div class="article-content-wrap"> 2237 <div class="post-header"> 2238 <h2 class="title"><a href="https://kernelci.org/blog/2022/06/27/request-for-proposals-sysadmin-maintenance-2022/"> Request for Proposals: Sysadmin Maintenance 2022</a></h2> 2239 </div> 2240 2241 2242<h2 class="wp-block-heading" id="summary">Summary<a href="https://kernelci.org/blog/posts/2022/rfp-sysadmin/#summary"></a></h2> 2243 2244 2245 2246<p class="wp-block-paragraph">The KernelCI project relies on a number of web services which need constant maintenance. These include databases, automation tools and web dashboards for several instances. Some are hosted on dedicated virtual machines (VMs), others in the cloud. This Request for Proposals seeks to extend the current team with dedicated sysadmins to ensure the maintenance of these services is being carried out to guarantee a good quality of service. Additionally, some improvements can be made to reduce the maintenance burden.</p> 2247 2248 2249 2250<h2 class="wp-block-heading" id="budget">Budget<a href="https://kernelci.org/blog/posts/2022/rfp-sysadmin/#budget"></a></h2> 2251 2252 2253 2254<p class="wp-block-paragraph">Weâre expecting quotations for this work package to range between 15,000 and 30,000 USD depending on the contents of the proposal and for a period of six months. Longer sysadmin time available and extra improvements can justify a higher price. Payments would be made via the Linux Foundation using the projectâs own budget.</p> 2255 2256 2257 2258<h2 class="wp-block-heading" id="sending-proposals">Sending proposals<a href="https://kernelci.org/blog/posts/2022/rfp-sysadmin/#sending-proposals"></a></h2> 2259 2260 2261 2262<p class="wp-block-paragraph">Please take a look at the full <a href="https://kernelci.org/blog/posts/2022/rfp-sysadmin/RFP-Sysadmin-Maintenance-2022-v3.pdf">RFP-Sysadmin-Maintenance-2022-v3.pdf</a> document for all the details. Proposals should be sent by email directly to the <a href="mailto:[email protected]">project members</a>.</p> 2263 2264 2265 2266<p class="wp-block-paragraph">The deadline for responding to this RFP is <strong>8th August 2022</strong>
2266, six weeks after it has been made public. Then the KernelCI Advisory Board of Members will vote on the <strong>24th August 2022</strong>. Exact dates might be subject to change in case of a major practical issue or unavailability of voting members.</p> 2267 2268 </div> 2269 </div> 2270 </div> 2271 </div> 2272</article> 2273 2274<article id="post-263" class="post-263 post type-post status-publish format-standard category-blog category-community"> 2275 <div class="inner-wrap animated"> 2276 <div class="post-content"> 2277 2278<div class="post-author"> 2279 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 2280 2281 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a></span></div> <div class="content-inner"> 2282 <div class="article-content-wrap"> 2283 <div class="post-header"> 2284 <h2 class="title"><a href="https://kernelci.org/blog/2021/09/20/kernelci-hackfests/"> KernelCI Hackfests</a></h2> 2285 </div> 2286 2287 2288<p class="wp-block-paragraph">KernelCI hackfests span over a few days during which a number of contributors get together to focus on upstream Linux kernel testing. So far, mainly kernel and automated test system developers have been taking part in the hackfests but anyone is welcome to join. Topics mostly include extending test coverage in various ways: enabling new test suites as well as adding test cases to established frameworks such as kselftest and LTP, building additional kernel flavours, bringing up new types of hardware to be testedâ¦</p> 2289 2290 2291 2292<p class="wp-block-paragraph">There have been two hackfests to date. The current plan is to hold one every few months. Future hackfests will be announced on the <a href="https://lore.kernel.org/kernelci/">KernelCI mailing list</a> as well as <a href="https://lkml.org/">LKML</a> and <a href="https://twitter.com/kernelci">Twitter</a>. Stay tuned!</p> 2293 2294 2295 2296<h2 class="wp-block-heading" id="connecting-the-dots">Connecting the dots<a href="https://kernelci.org/blog/posts/2021/hackfests/#connecting-the-dots"></a></h2> 2297 2298 2299 2300<p class="wp-block-paragraph">There is a large ecosystem around the Linux kernel which includes testing in many shapes and forms: kernel developers, test developers, test system developers, OEMs testing fully integrated products⦠All these teams of people donât necessarily interact with each other very much outside of their organisations, and kernel developers arenât necessarily in the habit of writing tests as part of their daily work.</p> 2301 2302 2303 2304<p class="wp-block-paragraph">Events such as the KernelCI hackfests give a chance for people from these different areas to work together on solving common issues and keep the ecosystem healthy. It also helps with shifting the upstream Linux kernel development culture towards a more test-driven workflow, to bring mainline Linux closer to the real world where it is actually being used.</p> 2305 2306 2307 2308<p class="wp-block-paragraph">Letâs consider a plausible hackfest story. A first participant writes a new test, say in kselftest. A second participant enables the test to run in KernelCI, which fails in some cases and a kernel bug is found. A third participant makes a fix for the bug, which can then be tested directly in KernelCI to confirm it works as expected. This may even happen on the <a href="https://kernelci.org/docs/instances/staging/">staging instance</a> before the patches for the test and the fix are sent to any mailing list, in which case the fix would get a <code>Tested-by: "kernelci.org bot" <[email protected]></code>
2308trailer from the start. This scenario also relies on some hardware previously made available in test labs by other people, putting together efforts from at least four different participants.</p> 2309 2310 2311 2312<h2 class="wp-block-heading" id="timeline">Timeline<a href="https://kernelci.org/blog/posts/2021/hackfests/#timeline"></a></h2> 2313 2314 2315 2316<p class="wp-block-paragraph">Hereâs a summary of the first two hackfests:</p> 2317 2318 2319 2320<h3 class="wp-block-heading" id="hackfest-1---27th-may-to-4th-june-2021">Hackfest #1 – 27th May to 4th June 2021<a href="https://kernelci.org/blog/posts/2021/hackfests/#hackfest-1---27th-may-to-4th-june-2021"></a></h3> 2321 2322 2323 2324<ul class="wp-block-list"> 2325<li>Workboard: <a href="https://github.com/orgs/kernelci/projects/3">https://github.com/orgs/kernelci/projects/3</a></li> 2326 2327 2328 2329<li>Participans 2330<ul class="wp-block-list"> 2331<li>Several kernel developers from <a href="https://www.google.com/intl/en_uk/chromebook/chrome-os/">Google Chrome OS</a></li> 2332 2333 2334 2335<li>Several kernel developers from <a href="https://collabora.com/">Collabora</a></li> 2336 2337 2338 2339<li>A few members of the core KernelCI team</li> 2340</ul> 2341</li> 2342 2343 2344 2345<li>Achievements 2346<ul class="wp-block-list"> 2347<li>New KernelCI instance for Chrome OS on <a href="https://chromeos.kernelci.org/">https://chromeos.kernelci.org</a></li> 2348 2349 2350 2351<li>Added support for building Chrome OS configs on top of mainline</li> 2352 2353 2354 2355<li>Enabled clang-13 builds for Chrome OS and main KernelCI builds</li> 2356 2357 2358 2359<li>New test suite for libcamera enabled on <a href="https://linux.kernelci.org/">https://linux.kernelci.org</a></li> 2360 2361 2362 2363<li>Enabled LTP crypto tests with extra kernel config fragment</li> 2364 2365 2366 2367<li>Several patches were also sent to extend kselftest and KUnit coverage in the kernel tree</li> 2368</ul> 2369</li> 2370</ul> 2371 2372 2373 2374<h3 class="wp-block-heading" id="hackfest-2---6th-to-10th-september-2021">Hackfest #2 – 6th to 10th September 2021<a href="https://kernelci.org/blog/posts/2021/hackfests/#hackfest-2---6th-to-10th-september-2021"></a></h3> 2375 2376 2377 2378<ul class="wp-block-list"> 2379<li>Workboard: <a href="https://github.com/orgs/kernelci/projects/5">https://github.com/orgs/kernelci/projects/5</a></li> 2380 2381 2382 2383<li>Participants 2384<ul class="wp-block-list"> 2385<li>More members of the <a href="https://kernelci.org/docs/org/tsc/">TSC</a> took part than first hackfest</li> 2386 2387 2388 2389<li>New contributor: Denis Efremov (floppy disk kernel maintainer)</li> 2390 2391 2392 2393<li>Alice from <a href="https://www.cip-project.org/">Civil Infrastructure Platform</a> (CIP) / <a href="https://www.cybertrust.co.jp/english/">Cybertrust Japan</a></li> 2394 2395 2396 2397<li>Chris from <a href="https://www.cip-project.org/">Civil Infrastructure Platform</a> (CIP) / <a href="https://www.renesas.com/eu/en">Renesas</a></li> 2398 2399 2400 2401<li>Nikolai from <a href="https://cki-project.org/">Red Hatâs CKI</a></li> 2402 2403 2404 2405<li>Several KernelCI developers from <a href="https://collabora.com/">Collabora</a></li> 2406</ul> 2407</li> 2408 2409 2410 2411<li>Achievements 2412<ul class="wp-block-list"> 2413<li>New Docker images and initial steps for running <a href="https://github.com/evdenis/cvehound"><code>cvehound</code></a></li> 2414 2415 2416 2417<li>On-going progress with Chrome OS tests using QEMU and hardware in LAVA</li> 2418 2419 2420 2421<li>Support for CIP kernel configs</li> 2422 2423 2424 2425<li>Initial work to enable CIP Core images (Debian based)</li> 2426 2427 2428 2429<li>Set up redirect from <a href="https://cip.kernelci.org/">cip.kernelci.org</a> to the web dashboard page with <a href="https://linux.kernelci.org/job/cip/">CIP jobs</a></li> 2430 2431 2432 2433<li>Support for <code>xilinx-zcu102</code> device</li> 2434 2435 2436 2437<li>Initial work to enable IEC cybersecurity tests</li> 2438 2439 2440 2441<li>Initial work to enable kselftest livepatch</li> 2442 2443 2444 2445<li>Most of the content from <a href="https://foundation.kernelci.org/">https://foundation.kernelci.org</a> replicated on the new <a href="https://kernelci.org/">kernelci.org</a> static site</li> 2446 2447 2448 2449<li>Started adding support for including kernel firmware files in test jobs</li> 2450 2451 2452 2453<li>Many various bug fixes and improvements in the KernelCI core code</li> 2454</ul> 2455</li> 2456</ul> 2457 2458 2459 2460<h2 class="wp-block-heading" id="lessons-learned">Lessons Learned<a href="https://kernelci.org/blog/posts/2021/hackfests/#lessons-learned"></a></h2> 2461 2462 2463 2464<h3 class="wp-block-heading" id="what-went-well">What went well<a href="https://kernelci.org/blog/posts/2021/hackfests/#what-went-well"></a></h3> 2465 2466 2467 2468<ul class="wp-block-list"> 2469<li>There were several new contributors. The hackfest is a great way to get people started with KernelCI.</li> 2470 2471 2472 2473<li>Hackfest #2 showed more diversity with a wider representation from the ecosystem.</li> 2474 2475 2476 2477<li>There were many improvements in various areas (bug fixes, documentation) which is a sign of a healthy project.</li> 2478 2479 2480 2481<li>The workflow based on GitHub and the Big Blue Button platform appear to have been easily adopted by the participants.</li> 2482</ul> 2483 2484 2485 2486<h3 class="wp-block-heading" id="what-needs-to-be-improved">What needs to be improved<a href="https://kernelci.org/blog/posts/2021/hackfests/#what-needs-to-be-improved"></a></h3> 2487 2488 2489 2490<ul class="wp-block-list"> 2491<li>Having more kernel maintainers involved would help with setting priorities and ojectives for KernelCI in accordance with kernel developersâ needs.
2491</li> 2492 2493 2494 2495<li>A hackfest every 3 months may be a bit too often, or maybe some could be shorter or have a more particular theme.</li> 2496 2497 2498 2499<li>Changes can take a long time to get merged. The main limitation seems to be the number of people available to do code reviews and drive discussions.</li> 2500 2501 2502 2503<li>KernelCI has been focusing on running more tests for over a year (kselftest, LTP, IGTâ¦). Now the core architecture needs to be improved to scale better.</li> 2504</ul> 2505 2506 2507 2508<h2 class="wp-block-heading" id="next-hackfest">Next hackfest<a href="https://kernelci.org/blog/posts/2021/hackfests/#next-hackfest"></a></h2> 2509 2510 2511 2512<p class="wp-block-paragraph">The actual dates havenât been confirmed yet, but with the current 3-month frequency the next hackfest should be taking place early December 2021. A proposed theme could be âKernelCI for newbiesâ, with a selection of tasks well suited for first-time contributors and documentation improved in that area prior to the hackfest. As always, suggestions are always welcome so please do get in touch if you have any.</p> 2513 2514 2515 2516<p class="wp-block-paragraph">See you there!</p> 2517 2518 </div> 2519 </div> 2520 </div> 2521 </div> 2522</article> 2523 2524<article id="post-231" class="post-231 post type-post status-publish format-standard category-blog category-community tag-kernel tag-linux tag-testing"> 2525 <div class="inner-wrap animated"> 2526 <div class="post-content"> 2527 2528<div class="post-author"> 2529 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 2530 2531 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a></span></div> <div class="content-inner"> 2532 <div class="article-content-wrap"> 2533 <div class="post-header"> 2534 <h2 class="title"><a href="https://kernelci.org/blog/2021/06/24/the-first-ever-kernelci-hackfest/"> The first ever KernelCI hackfest</a></h2> 2535 </div> 2536 2537 2538<p class="wp-block-paragraph">The first KernelCI test development and coverage hackfest took place from 27<sup>th</sup> May to 4<sup>th</sup> June 2021. For a total of seven days, developers from the KernelCI team, Google, and Collabora worked to improve many different aspects of KernelCI testing capabilities.</p> 2539 2540 2541 2542<p class="wp-block-paragraph">The hackfest was a community event promoted by the KernelCI team. It aimed at bringing developers and companies together to improve testing for areas of the Linux kernel they care about. Through this effort, the KernelCI team also expects to increase awareness for continuous kernel testing and validation – more hackfests will happen in the future, so stay tuned if you want to join.</p> 2543 2544 2545 2546<p class="wp-block-paragraph">The first-ever KernelCI hackfest was a success. It kicked off the work to enable kernel testing through Chromium OS, a product-specific userspace. Enabling full userspace images and real-world tests like video call simulations adds a lot of complexity to the testing process. However, the benefits are a clear win for the community. They allow a more thorough kernel testing and validation through real application use cases, which can exercise several different kernel areas at the same time in an organized manner. Generally, it is not simple for lower-level kernel test suites like kselftests or LTP to orchestrate a similar use case.</p> 2547 2548 2549 2550<p class="wp-block-paragraph">Consider video call simulation for example. Once the user starts a video call, the test can begin by measuring the time needed to set up the video feed and show it in the browser rendered with the rest of the video call website. Then, as soon as the video call is up, many other measurements can be made: camera capture latency, camera stream to network latency, memory consumption, power consumption, GPU performance, background tasks latency, and user interaction latency. These types of tests stress the kernel in unique ways, exposing problems that might otherwise go unnoticed from release to release.</p> 2551 2552 2553 2554<p class="wp-block-paragraph">The support for the Chromium OS userspace is the start of full-stack tests in KernelCI. It is still quite experimental, but the support will evolve over the next few months, opening the path for other product-specific userspaces. Increased kernel testing diversity will definitely result in catching more regressions earlier. âKeeping upstream healthy is really important to us in the Chrome OS team (and Google broadly!) since we constantly pull in stable fixes and regularly push out major kernel version upgrades to our users.â said Jesse Barnes who leads the Base OS team of Chrome OS at Google.</p> 2555 2556 2557 2558<p class="wp-block-paragraph">On another <a href="https://www.collabora.com/news-and-blog/news-and-events/successful-first-kernelci-hackfest.html">front</a>, there was progress enabling more testing for different kernel areas as well as improvements to the rootfs testing images used by KernelCI:</p> 2559 2560 2561 2562<ul class="wp-block-list"><li>kselftests received new tests for the futex() system call, basic semantics validation, and soft-dirty page table entry mechanism corner cases;</li><li>improved LTP crypto tests by enabling missing kernel configs needed;</li><li><a href="https://www.collabora.com/news-and-blog/blog/2021/06/15/testing-cameras-with-lc-compliance-on-kernelci/">libcamera now has its first few tests running on KernelCI</a>;</li><li>fs/unicode tests converted to the new Kunit mechanism;</li><li>bootr test to check if all CPUs went online successfully;</li><li>experimental support for including firmware files in the rootfs.</li></ul> 2563 2564 2565 2566<p class="wp-block-paragraph">The overall results were significant for only a few days of work. Kernel testing through product-specific userspace opens a whole new avenue of possibilities for KernelCI. On top of that, there was an accomplishment for many test cases and test suites, as detailed above. âIt has been an amazing week and a half. Weâve achieved a lot in such a short time, in spite of a few workflow weaknesses which weâre now addressing to help further grow the KernelCI community with new developers.â said Guillaume Tucker, KernelCI project lead and Senior Softw
2566are Engineer at Collabora.</p> 2567 2568 2569 2570<p class="wp-block-paragraph">More hackfests will come in the future – this was only the first one. Dates are being discussed for the next hackfest to happen around the end of August, a few weeks before the Linux Plumbers Conference. The KernelCI team invites developers and companies to participate. Joining a hackfest is a great way to quickly evolve the kernel testing knowledge of your team, leading to products and services that work better with easier maintenance over time. So make sure to raise your hand and join the next time a KernelCI hackfest happens.</p> 2571 2572 2573 2574<hr class="wp-block-separator" /> 2575 2576 2577 2578<p class="wp-block-paragraph">KernelCI is a Linux Foundation project. If you are interested in learning more or becoming a member <a href="https://foundation.kernelci.org/#message">contact us</a>.</p> 2579 2580 </div> 2581 </div> 2582 </div> 2583 </div> 2584</article> 2585 2586<article id="post-223" class="post-223 post type-post status-publish format-standard category-blog category-community"> 2587 <div class="inner-wrap animated"> 2588 <div class="post-content"> 2589 2590<div class="post-author"> 2591 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 2592 2593 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a></span></div> <div class="content-inner"> 2594 <div class="article-content-wrap"> 2595 <div class="post-header"> 2596 <h2 class="title"><a href="https://kernelci.org/blog/2021/03/16/looking-back-looking-forward/"> Looking back, looking forward</a></h2> 2597 </div> 2598 2599 2600<p class="wp-block-paragraph">2020 was the first year of the KernelCI project under the Linux Foundation and has been an interesting one. Maybe slightly less âinterestingâ than the rest of the world-changing events of 2020, but itâs still been an adventure. This article aims to give a quick summary of the major milestones of the first year of KernelCI project, and highlight our goals for the next year.</p> 2601 2602 2603 2604<p class="has-text-align-center wp-block-paragraph"><img decoding="async" width="624" height="337.7962760131436" src="https://lh5.googleusercontent.com/9NN8ekNwV-ywEfGfk7GLKJun5szDFdBBQdrSDKjnnGW5RiOVFczWWYF7m6SKK_luz1ttYv94dwS1_QjCsYFYIrGL1UlTPADqIf3Jw8hkXxT7Hg5Rfg3pBsLYUlY5wXKi1TYLzFoy"></p> 2605 2606 2607 2608<h2 class="wp-block-heading">Highlights of the first year</h2> 2609 2610 2611 2612<p class="wp-block-paragraph">The founding members spent the end of 2019 doing a formal launch and ramping up the project structure and organization. This led to <a href="https://foundation.kernelci.org/mission-objectives/">our mission statement and key goals.</a> Throughout 2020 we gave talks and led discussions at several virtual conferences such as FOSDEM, Open-Source Summit / Embedded Linux Conference (ELC). Check out <a href="https://foundation.kernelci.org/blog/">our blog</a> for more details about the talks and discussions from these events. </p> 2613 2614 2615 2616<p class="wp-block-paragraph"><strong>Community Collaboration</strong></p> 2617 2618 2619 2620<p class="wp-block-paragraph">In the middle of 2020, we did a Community survey to get a sense for what the kernel testing and automation community was looking for. This survey has helped guide where we focus our time and resources. See our blog for an article covering the <a href="https://foundation.kernelci.org/blog/2020/07/09/kernelci-community-survey-report/">full results of the survey</a>.</p> 2621 2622 2623 2624<p class="wp-block-paragraph">One highlight of the 2020 conference circuit was Linux Plumbers Conference (LPC). At LPC, we gave talks and held focused discu
2624ssions with our target audience: kernel developers and maintainers. The full details are <a href="https://foundation.kernelci.org/blog/2020/09/23/kernelci-notes-from-plumbers-2020/">in a blog article covering the event </a>, but this is where we kicked off public discussions of how to unify test results and reporting from various testing and CI efforts in the community. Weâre calling this common datastore for kernel testing results kcidb. Thanks to the discussions kicked off at LPC, weâre now collecting results from several other projects such as Red Hat CKI, Google syzbot, Arm, Gentoo, and the Fuego project. Continued collaboration with these projects as well as other new ones will be a focus area for 2021.</p> 2625 2626 2627 2628<p class="wp-block-paragraph"><strong>Infrastructure</strong></p> 2629 2630 2631 2632<p class="wp-block-paragraph">Another area of growth in 2020 was in our IT infrastructure. As you might expect, we do lots of kernel builds, and that requires lots of compute horsepower. Our build capacity had been capped by a fixed number of donated build machines. But now, thanks to the generous donations of founding members Google and Microsoft, we now have scalable cloud compute resources under Google Compute Platform (GCP) and Microsoft Azure which we manage with Kubernetes so that we can dynamically scale as our compute needs grow.</p> 2633 2634 2635 2636<h2 class="wp-block-heading"><strong>Looking forward</strong></h2> 2637 2638 2639 2640<p class="wp-block-paragraph"><strong>Kicking off 2021</strong></p> 2641 2642 2643 2644<p class="wp-block-paragraph">The governing board kicked off our 2nd year with some project organizational matters such as budgeting and electing this year’s executive committee. We are very happy to welcome Guillaume Tucker (Collabora) as the new board chair and Chris Paterson (CIP/Renesas) as the new treasurer. We also say a big thank you to outgoing chair Kevin Hilman (BayLibre) and outgoing treasurer Guy Lunardi (Collabora). </p> 2645 2646 2647 2648<p class="has-medium-font-size wp-block-paragraph"><strong>Focus areas</strong></p> 2649 2650 2651 2652<p class="wp-block-paragraph"><strong>Data</strong></p> 2653 2654 2655 2656<p class="wp-block-paragraph">As mentioned above, the collaboration with other testing and CI projects will remain a major focus for 2021. We want it to be easy for anyone doing kernel testing to be able to submit results to our open, centralized datastore: KCIDB. The amount of data weâre collecting is growing rapidly, so weâre also looking for help from âbig dataâ experts to help us build the tooling to visualize and learn from all the data. Please write to us on the mailing list if you have any interest in helping here.</p> 2657 2658 2659 2660<p class="wp-block-paragraph"><strong>Infrastructure</strong></p> 2661 2662 2663 2664<p class="wp-block-paragraph">Weâve been using Jenkins for years to manage our CI pipeline jobs, but as weâve moved more of our infrastructure into the cloud, weâre looking at ways to migrate our CI infrastructure to a cloud-native framework such as Tekton or Jenkins-X. Weâre in the early stages of exploration here, so anyone with experience here that could help guide us, weâd love to hear from you!</p> 2665 2666 2667 2668<p class="wp-block-paragraph"><strong>Data Visualization & Analysis</strong></p> 2669 2670 2671 2672<p class="wp-block-paragraph">Weâre also in the early stages of planning new dashboards for visualization and analysis of our growing data set. Weâre soliciting feedback from the broader community by <a href="https://github.com/kernelci/kernelci-core/discussions/618">collecting user stories</a> to better understand what our users want from new dashboards. In addition to making all the testing data and logs available through advanced visualization tools, weâd also like to enable analytics and deep learning on our growing data set. Once again, this is something weâd love your help on, so if youâre a big data enthusiast and want to put your skills to use to help the Linux kernel, please let us know.</p> 2673 2674 2675 2676<p class="wp-block-paragraph"><strong>Get involved!</strong></p> 2677 2678 2679 2680<p class="wp-block-paragraph">Did you notice any themes above? Weâre looking for help! We have some big ideas and plans, but weâre still a very small team and are looking for expertise in a few areas to help guide the future of the project.</p> 2681 2682 2683 2684<p class="wp-block-paragraph">Please keep in touch with what weâre up to or to get involved, you can read <a href="https://foundation.kernelci.org/blog/">our blog</a>, follow on twitter <a href="https://twitter.com/kernelci">@kernelci</a> or join our <a href="https://groups.io/g/kernelci/topics">mailing list.</a></p> 2685 2686 </div> 2687 </div> 2688 </div> 2689 </div> 2690</article> 2691 2692<article id="post-202" class="post-202 post type-post status-publish format-standard category-blog category-community tag-linux tag-opensourcesummit"> 2693 <div class="inner-wrap animated"> 2694 <div class="post-content"> 2695 2696<div class="post-author"> 2697 <div class="grav-wrap"><a href="https://kernelci.org/author/kernelcifoundation/"><img alt='kernelcifoundation' src='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo' height='90' width='90' /></a></div> <span class="meta-author"> <a href="https://kernelci.org/author/kernelcifoundation/" rel="author">kernelcifoundation</a></span> 2698 2699 <span class="meta-category"><span class="in">In </span><a class="blog" href="https://kernelci.org/category/blog/">Blog</a>, <a class="community" href="https://kernelci.org/category/community/">Community</a></span></div> <div class="content-inner"> 2700 <div class="article-content-wrap"> 2701 <div class="post-header"> 2702 <h2 class="title"><a href="https://kernelci.org/blog/2020/11/05/notes-from-oss-elc-europe-2020/"> Notes from OSS/ELC Europe 2020</a></h2> 2703 </div> 2704 2705 2706<p class="wp-block-paragraph">The <a href="https://osseu2020.sched.com/">OSS/ELC Europe 2020</a> conference took place online from 26th to 28th October. There was one BoF session and one talk about KernelCI, followed by an impromptu video call. The notes below were gathered based on these events.</p> 2707 2708 2709 2710<h2 class="wp-block-heading">BoF: Lessons Learned</h2> 2711 2712 2713 2714<h4 class="wp-block-heading">Guillaume Tucker, Collabora</h4> 2715 2716 2717 2718<div style="height:21px" aria-hidden="true" class="wp-block-spacer"></div> 2719 2720 2721 2722<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>A lot has happened since KernelCI was announced as a new Linux Foundation project at ELC-E 2019 in Lyon. One year on, what have we learnt?</p></blockquote> 2723 2724 2725 2726<p class="wp-block-paragraph">See the full <a href="https://osseu2020.sched.com/event/fb18cc9bee7174e2e83257dd18e54238">Event description</a> for slides and more details. Below are a list of Q&A gathered from the session.</p> 2727 2728 2729 2730<p class="wp-block-paragraph"><strong>Q: I wonder if you plan to add any subsystem-specific CI? Are there any plans/ideas? e.g. for scsi drivers</strong></p> 2731 2732 2733 2734<p class="wp-block-paragraph">There are already subsystem-specific tests being run, and subsystem branches can be monitored. Then results can be sent to subsystem mailing lists. For example, this is the case with v4l2: kernelci.org runs v4l2-compliance on a number of platforms for several branches including the media tree, mainline, stable and linux-next, and sends reports with regressions.</p> 2735 2736 2737 2738<p class="wp-block-paragraph">
2738There should not be any subsystem-specific infrastructure needed on kernelci.org, but rather different tests and maybe different parameters to adjust to the workflows according to maintainersâ needs.</p> 2739 2740 2741 2742<p class="wp-block-paragraph"><strong>Q: Some time ago there was a way to search for test runs in a specific lab. I mean on the dashboard. But it seems this feature is gone now. Was that intended? Is it coming back? Can we help and contribute here? ð</strong></p> 2743 2744 2745 2746<p class="wp-block-paragraph">The web frontend was scaled down to accommodate for functional testing rather than boot testing. This was because all the boot testing search pages were tailor-made, which doesnât scale very well and is very hard to maintain.</p> 2747 2748 2749 2750<p class="wp-block-paragraph">Weâre now looking into a fresh web dashboard design with flexible search features to be able to do that. As a first step, we are collecting user stories. If you have any, such as âI want to find out all the test results for the devices in my labâ, feel free to reply to this thread:<br><a href="https://groups.io/g/kernelci/topic/rfc_dashboards/77367531">https://groups.io/g/kernelci/topic/rfc_dashboards/77367531<br></a>âRFC: dashboards, visualization and analytics for test resultsâ</p> 2751 2752 2753 2754<p class="wp-block-paragraph"><strong>Q: What is the relationship between KernelCI project and LAVA project? Does KernelCI have non-upstream changes to LAVA? Do LAVA people participate in KernelCI?</strong></p> 2755 2756 2757 2758<p class="wp-block-paragraph">LAVA is used in many test labs that provide results to KernelCI, but KernelCI doesnât run any labs itself. Some people do contribute to both, as KernelCI is one of the biggest public use-cases of LAVA, but they really are independent projects. The core KernelCI tools are designed to facilitate working with LAVA labs, but this is not a requirement and other test lab frameworks are also used.</p> 2759 2760 2761 2762<p class="wp-block-paragraph"><strong>Q: Is there any documentation on how to write those “custom” tests and to integrate it with KernelCI? (e.g. the SCSI drivers/storage devices you just mention before)</strong></p> 2763 2764 2765 2766<p class="wp-block-paragraph">See Khouloud Touilsâ talk <a href="https://osseu2020.sched.com/event/eCNl/lets-test-with-kernelci-khouloud-touil-baylibre">Letâs Test with KernelCI</a> with some hands-on examples.</p> 2767 2768 2769 2770<p class="wp-block-paragraph">There is also the user guide as part of the KernelCI documentation:<br><a href="https://github.com/kernelci/kernelci-core/blob/master/doc/kci_testsuite.md">https://github.com/kernelci/kernelci-core/blob/master/doc/kci_testsuite.md</a></p> 2771 2772 2773 2774<p class="wp-block-paragraph">Each test is a bit different as they all have their own dependencies and are written in various languages. Typically, they will require a user-space image with all the required packages installed to be able to run as well as the latest versions of some test suites built from source. This is the case with v4l-utils, igt-gpu-tools or LTP. Some are plain scripts and donât depend on anything in particular, such as bootrr.</p> 2775 2776 2777 2778<p class="wp-block-paragraph">When prototyping some new tests to run in LAVA, the easiest approach is to use nfsroot with the plain Debian Buster image provided by KernelCI and install extra packages at runtime, before starting the tests. Then when this is working well, dependencies and any data files can be baked into a fixed rootfs image for performance and reproducibility.</p> 2779 2780 2781 2782<p class="wp-block-paragraph"><strong>Q: How to properly deal with boards which are able to boot only from a mass-storage device and prevent them from being stuck with a non-working image?</strong></p> 2783 2784 2785 2786<p class="wp-block-paragraph">In order to be useful with KernelCI, itâs required to at least be able to dynamically load the kernel image as well as any modules and device tree with a ramdisk for the tests that fit in a small enough image. If this canât be done, then the kernel and user-space images need to be written to the persistent storage before each job. It might also be possible to load the kernel over TFTP and then extract the image onto the persistent storage and use it as a chroot. Ultimately this is the labâs responsibility and it will depend on many things. If the kernel and the user-space canât be changed at all, or if there is a possibility of bricking the device, then itâs basically not practical to do any CI on such a platform.</p> 2787 2788 2789 2790<h2 class="wp-block-heading">Letâs Test with KernelCI</h2> 2791 2792 2793 2794<h4 class="wp-block-heading">Khouloud Touil, Baylibre</h4> 2795 2796 2797 2798<div style="height:21px" aria-hidden="true" class="wp-block-spacer"></div> 2799 2800 2801 2802<blockquote class="wp-block-quote is-style-default is-layout-flow wp-block-quote-is-layout-flow"><p>A growing number of Linux developers want to use KernelCI to run their test suites, but thereâs a bit of a learning curve for how to make test suites work with KernelCI. âLetâs Test with KernelCIâ will give an overview of the ways to integrate test suites and/or test results into the KernelCI modular pipeline.</p></blockquote> 2803 2804 2805 2806<p class="wp-block-paragraph">See the full <a href="https://osseu2020.sched.com/event/eCNl/lets-test-with-kernelci-khouloud-touil-baylibre">Event description</a> for more details. Below are a list of Q&A gathered from the session.</p> 2807 2808 2809 2810<p class="wp-block-paragraph"><strong>Q: Is there also support for custom YP/OE distros or is it currently limited to the usage of predefined kernels and file systems?</strong></p> 2811 2812 2813 2814<p class="wp-block-paragraph">The kernels are all built with regular “make”, not any packaging or yocto recipe is supported right now. However, that c
2814ould be done with a bit of plumbing. Then for user-space, kernelci only really tests the kernel: the buildroot and debian images are only there to be able to run kernel tests. If you create your own KernelCI instance, you can run tests with your own user-space built using Yocto and extend testing to cover some user-space if you want.</p> 2815 2816 2817 2818<p class="wp-block-paragraph"><strong>Q: Is there some kind of test config to require a certain kernel flag active? I am basically thinking about running some pre-defined test base, based on my own kernel config and then report back the results with something like “ran test X, which requires kernel config flag Y, on architecture/platform Z on kernel version V”.</strong></p> 2819 2820 2821 2822<p class="wp-block-paragraph">Yes, there are a couple of ways to adjust the kernel config on kernelci.org. One way is with a special syntax like defconfig+CONFIG_SOMETHING=y. Another way is to define a config fragment. Each KernelCI test result will have the information you mentioned as meta-data.</p> 2823 2824 2825 2826<p class="wp-block-paragraph"><strong>Q: Which firewall streams must be permitted in order for KernelCI to use a custom Lab? I mean if we want to contribute a lab (with associated boards) to KernelCI.org?</strong></p> 2827 2828 2829 2830<p class="wp-block-paragraph">LAVA exposes a REST API over HTTPS. Itâs also possible to have the LAVA server hosted publicly and using LAVA dispatchers in a private network which will be connecting to the server as clients, with no incoming connections.</p> 2831 2832 2833 2834<p class="wp-block-paragraph">When not using LAVA, you can also periodically poll storage.kernelci.org for new kernel builds to appear, and download them to test them then send results to api.kernelci.org. In this case, no incoming connections are required either.</p> 2835 2836 2837 2838<p class="wp-block-paragraph"><strong>Q: In real life how are tests that need to check hardware I/O done? For example in your audio playback case it’s probably not enough to run the play command but we want to check that something was actually played e.g. by capturing the output</strong>.</p> 2839 2840 2841 2842<p class="wp-block-paragraph">For audio (and video), some hardware has loopback devices which can be used to compare against expected output. For more advanced setup, labs can have external capture equipment as well. But this ends up to be lab-specific since there are many ways to do it.</p> 2843 2844 2845 2846<h2 class="wp-block-heading">Follow-up impromptu video discussion</h2> 2847 2848 2849 2850<p class="wp-block-paragraph">As we neared the end of the time slot for the “Let’s Test with KernelCI” talk, we decided to start a public video call with anyone who was interested and attended the talk. We discussed various general things about the project, and a few notes and Q&A were captured:</p> 2851 2852 2853 2854<p class="wp-block-paragraph"><strong>Q: How can a test lab get added to kernelci.org?</strong></p> 2855 2856 2857 2858<p class="wp-block-paragraph">This is something that would require better documentation. We can distinguish 3 different âlevelsâ of integration for labs:</p> 2859 2860 2861 2862<ol class="wp-block-list"><li><strong>LAVA-style: fully integrated into the pipeline</strong><br>If you have a LAVA lab, itâs the easiest way to contribute test results to KernelCI. It also enables automated bisection and is the most efficient way of getting tests run.</li><li><strong>Asynchronous test lab</strong><br>If you have a test lab with no way to receive requests to run tests, you can look for kernelci.org builds to appear and submit results with kci_data. A typical example is Labgrid. One way to improve this is to implement some notification protocol so these labs could avoid polling and get requests to run tests like the LAVA labs.</li><li><strong>Autonomous CI system: KCIDB</strong><br>With options 1 and 2, tests use kernel builds from kernelci.org and report results to the same backend. This is called the ânativeâ KernelCI tests. Option 3 is for full CI systems creating their own kernel builds and running their own set of tests. The results are sent to the common reporting database using the KCIDB tools.</li></ol> 2863 2864 2865 2866<p class="wp-block-paragraph"><strong>Q: Where can we find the source and definition of tests visible on kernelci.org frontend?</strong></p> 2867 2868 2869 2870<p class="wp-block-paragraph">This is also something that would require better documentation, with a directory of all the test plans and how they are created. Functional tests are fairly recent on kernelci.org, which is why we donât have that yet.</p> 2871 2872 2873 2874<p class="wp-block-paragraph">All the tests are normally defined in the <a href="https://github.com/kernelci/kernelci-core/">kernelci-core</a> repository. This includes building some test suites from source and including them in user-space rootfs images, and defining how to run the tests.</p> 2875 2876 2877 2878<p class="wp-block-paragraph"><strong>User story: Checking results for devices in âmyâ lab across all the branches and revisions.</strong></p> 2879 2880 </div> 2881 </div> 2882 </div> 2883 </div> 2884</article> 2885 </div><!--/posts container--> 2886 2887 2888</div><!--/post area--> 2889 2890
2891 <div id="sidebar" data-nectar-ss="" class="col span_3 col_last"> 2892 <div id="block-8" class="widget widget_block widget_search"><form role="search" method="get" action="https://kernelci.org/" class="wp-block-search__button-outside wp-block-search__text-button wp-block-search" ><label class="wp-block-search__label" for="wp-block-search__input-1" >Search</label><div class="wp-block-search__inside-wrapper" ><input class="wp-block-search__input" id="wp-block-search__input-1" placeholder="" value="" type="search" name="s" required /><button aria-label="Search" class="wp-block-search__button wp-element-button" type="submit" >Search</button></div></form></div><div id="block-9" class="widget widget_block"> 2893<h2 class="wp-block-heading">Recent Posts</h2> 2894</div><div id="block-10" class="widget widget_block widget_recent_entries"><ul class="wp-block-latest-posts__list wp-block-latest-posts is-layout-flow wp-block-latest-posts-is-layout-flow"><li><a class="wp-block-latest-posts__post-title" href="https://kernelci.org/blog/2026/09/12/talk-to-kernelci-kci-dev-now-speaks-mcp/">Talk to KernelCI: kci-dev now speaks MCP</a></li> 2895<li><a class="wp-block-latest-posts__post-title" href="https://kernelci.org/blog/2026/05/04/regzbot-joins-kernelci-strengthening-linux-kernel-regression-tracking/">Regzbot Joins KernelCI: Strengthening Linux Kernel Regression Tracking</a></li> 2896<li><a class="wp-block-latest-posts__post-title" href="https://kernelci.org/blog/2026/03/03/kernelci-2025-q4-updates/">KernelCI – 2025.Q4 updates</a></li> 2897<li><a class="wp-block-latest-posts__post-title" href="https://kernelci.org/blog/2026/01/20/announcing-the-new-kernelci-technical-steering-committee-tsc/">Announcing the new KernelCI Technical Steering Committee (TSC)</a></li> 2898<li><a class="wp-block-latest-posts__post-title" href="https://kernelci.org/blog/2025/11/12/kernelci-welcomes-arm-and-qualcomm-as-premier-members/">KernelCI Welcomes Arm and Qualcomm as Premier Members</a></li> 2899</ul></div><div id="block-11" class="widget widget_block"> 2900<h2 class="wp-block-heading">Archives</h2> 2901</div><div id="block-12" class="widget widget_block widget_archive"><ul class="wp-block-archives-list wp-block-archives"> <li><a href='https://kernelci.org/2026/09/'>September 2026</a></li> 2902 <li><a href='https://kernelci.org/2026/05/'>May 2026</a></li> 2903 <li><a href='https://kernelci.org/2026/03/'>March 2026</a></li> 2904 <li><a href='https://kernelci.org/2026/01/'>January 2026</a></li> 2905 <li><a href='https://kernelci.org/2025/11/'>November 2025</a></li> 2906 <li><a href='https://kernelci.org/2025/10/'>October 2025</a></li> 2907 <li><a href='https://kernelci.org/2025/09/'>September 2025</a></li> 2908 <li><a href='https://kernelci.org/2025/06/'>June 2025</a></li> 2909 <li><a href='https://kernelci.org/2025/02/'>February 2025</a></li> 2910 <li><a href='https://kernelci.org/2024/09/'>September 2024</a></li> 2911 <li><a href='https://kernelci.org/2024/06/'>June 2024</a></li> 2912 <li><a href='https://kernelci.org/2024/04/'>April 2024</a></li> 2913 <li><a href='https://kernelci.org/2023/12/'>December 2023</a></li> 2914 <li><a href='https://kernelci.org/2023/09/'>September 2023</a></li> 2915 <li><a href='https://kernelci.org/2023/07/'>July 2023</a></li> 2916 <li><a href='https://kernelci.org/2023/05/'>May 2023</a></li> 2917 <li><a href='https://kernelci.org/2023/01/'>January 2023</a></li> 2918 <li><a href='https://kernelci.org/2022/09/'>September 2022</a></li> 2919 <li><a href='https://kernelci.org/2022/06/'>June 2022</a></li> 2920 <li><a href='https://kernelci.org/2021/09/'>September 2021</a></li> 2921 <li><a href='https://kernelci.org/2021/06/'>June 2021</a></li> 2922 <li><a href='https://kernelci.org/2021/03/'>March 2021</a></li> 2923 <li><a href='https://kernelci.org/2020/11/'>November 2020</a></li> 2924 <li><a href='https://kernelci.org/2020/09/'>September 2020</a></li> 2925 <li><a href='https://kernelci.org/2020/08/'>August 2020</a></li> 2926 <li><a href='https://kernelci.org/2020/07/'>July 2020</a></li> 2927 <li><a href='https://kernelci.org/2020/05/'>May 2020</a></li> 2928 <li><a href='https://kernelci.org/2019/11/'>November 2019</a></li> 2929 <li><a href='https://kernelci.org/2019/10/'>October 2019</a></li> 2930</ul></div><div id="block-13" class="widget widget_block"> 2931<h2 class="wp-block-heading">Categories</h2> 2932</div><div id="block-14" class="widget widget_block widget_categories"><ul class="wp-block-categories-list wp-block-categories-taxonomy-category wp-block-categories"> <li class="cat-item cat-item-2"><a href="https://kernelci.org/category/blog/">Blog</a> 2933</li> 2934 <li class="cat-item cat-item-3"><a href="https://kernelci.org/category/community/">Community</a> 2935</li> 2936 <li class="cat-item cat-item-4"><a href="https://kernelci.org/category/news/">News</a> 2937</li> 2938 <li class="cat-item cat-item-1"><a href="https://kernelci.org/category/uncategorized/">Uncategorized</a> 2939</li> 2940</ul></div> </div><!--/span_3--> 2941 2942</div> 2943 2944 2945 </div> 2946 </div> 2947 </div> 2948</div></div> 2949 </div> 2950 </div> 2951 </div> 2952 2953<div id="footer-outer" data-midnight="light" data-cols="4" data-custom-color="false" data-disable-copyright="false" data-matching-section-color="true" data-copyright-line="false" data-using-bg-img="false" data-bg-img-overlay="0.8" data-full-width="false" data-using-widget-area="false" data-link-hover="default"role="contentinfo"> 2954 2955 2956 <div class="row" id="copyright" data-layout="default"> 2957 2958 <div class="container"> 2959 2960 <div class="col span_5"> 2961 2962 <p>Copyright © 2025 KernelCI Foundation The Linux Foundation® . All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our <a href="https://www.linuxfoundation.org/trademark-usage">Trademark Usage</a> page. Linux is a registered trademark of Linus Torvalds. <a href="http://www.linuxfoundation.org/privacy">Privacy Policy</a> and <a href="http://www.linuxfoundation.org/terms">Terms of Use</a>.</p> 2963 </div><!--/span_5--> 2964 2965 <div class="col span_7 col_last"> 2966 <ul class="social"> 2967 <li><a target="_blank" rel="noopener" href="https://www.youtube.com/@KernelCI"><span class="screen-reader-text">youtube</span><i class="fa fa-youtube-play" aria-hidden="true"></i></a></li> </ul> 2968 </div><!--/span_7--> 2969 2970 2971 </div><!--/container--> 2972 </div><!--/row--> 2973 2974</div><!--/footer-outer--> 2975 2976 2977 <div id="slide-out-widget-area-bg" class="slide-out-from-right dark">
2978 </div> 2979 2980 <div id="slide-out-widget-area" role="dialog" aria-modal="true" aria-label="Off Canvas Menu" class="slide-out-from-right" data-dropdown-func="default" data-back-txt="Back"> 2981 2982 <div class="inner-wrap"> 2983 <div class="inner" data-prepend-menu-mobile="false"> 2984 2985 <a class="slide_out_area_close" href="#"><span class="screen-reader-text">Close Menu</span> 2986 <span class="icon-salient-x icon-default-style"></span> </a> 2987 2988 2989 <div class="off-canvas-menu-container mobile-only" role="navigation"> 2990 2991 2992 <ul class="menu"> 2993 <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-492"><a href="https://kernelci.org/">Home</a></li> 2994<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-484"><a aria-haspopup="true" aria-expanded="false">Community</a> 2995<ul class="sub-menu"> 2996 <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-482"><a href="https://dashboard.kernelci.org/">Dashboard</a></li> 2997 <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-481"><a href="https://docs.kernelci.org/">Documentation</a></li> 2998 <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-483"><a href="https://github.com/kernelci/">GitHub</a></li> 2999 <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-488"><a href="https://discord.gg/KWbrbWEyqb">Discord chat</a></li> 3000 <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-489"><a href="https://www.youtube.com/@KernelCI">Videos (YouTube)</a></li> 3001 <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-596"><a href="https://kernelci.org/service-providers/">Service Providers</a></li> 3002 <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-487"><a href="https://kernelci.org/community-contact/">Contact</a></li> 3003</ul> 3004</li> 3005<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-493"><a href="https://kernelci.org/mission-objectives/">Mission & Objectives</a></li> 3006<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-491"><a href="https://kernelci.org/news/">News</a></li> 3007<li class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-94 current_page_item menu-item-485"><a href="https://kernelci.org/blog/" aria-current="page">Blog</a></li> 3008<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-490"><a href="https://kernelci.org/calendar/">Calendar</a></li> 3009<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-486"><a target="_blank" href="http://joinnow.platform.linuxfoundation.org/?project=kernelci">Join Now</a></li> 3010 3011 </ul> 3012 3013 <ul class="menu secondary-header-items"> 3014 </ul> 3015 </div> 3016 3017 </div> 3018 3019 <div class="bottom-meta-wrap"><ul class="off-canvas-social-links mobile-only"><li><a target="_blank" rel="noopener" href="https://www.youtube.com/@KernelCI"><span class="screen-reader-text">youtube</span><i class="fa fa-youtube-play" aria-hidden="true"></i> </a></li></ul></div><!--/bottom-meta-wrap--></div> <!--/inner-wrap--> 3020 </div> 3021 3022</div> <!--/ajax-content-wrap--> 3023 3024 <a id="to-top" aria-label="Back to top" role="button" href="#" class="mobile-disabled"><i role="presentation" class="fa fa-angle-up"></i></a> 3025
3025<script type="speculationrules"> 3026{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/sites/36/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/salient-child/*","/wp-content/themes/salient/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} 3027</script>
3027 3028<a href="#" class="cookie-settings-link" aria-label="Cookie Settings"><?xml version="1.0" encoding="UTF-8"?> 3029<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 400 400"> 3030 <!-- Generator: Adobe Illustrator 30.8.0, SVG Export Plug-In . SVG Version: 2.1.4 Build 114) --> 3031 <defs> 3032 <style> 3033 .st0 { 3034 fill: #fff; 3035 stroke: #d5d5d5; 3036 stroke-miterlimit: 10; 3037 } 3038 </style> 3039 </defs> 3040 <circle class="st0" cx="200" cy="200" r="196.5"/> 3041 <path d="M354.5,169.9c-1.9.5-3.8.7-5.8.7-12.8,0-23.2-10.4-23.2-23.2s.3-4,.8-5.9c-5.6,3.7-12.2,5.9-19.5,5.9-19.3,0-34.9-15.6-34.9-34.9h0c-.9,0-1.8,0-2.8,0-24.3,0-43.9-19.7-43.9-43.9s1.8-14.2,4.9-20.2c-8.6-1.5-17.5-2.3-26.6-2.3-85.1,0-154,68.9-154,154s68.9,154,154,154,154-68.9,154-154-1-20.4-3-30.2ZM126.1,286.5c-11.2,0-20.3-9.1-20.3-20.3s9.1-20.3,20.3-20.3,20.3,9.1,20.3,20.3-9.1,20.3-20.3,20.3ZM129.9,193.1c-12.2,0-22.1-9.9-22.1-22.1s9.9-22.1,22.1-22.1,22.1,9.9,22.1,22.1-9.9,22.1-22.1,22.1ZM152.8,105.5c-7.8,0-14.1-6.3-14.1-14.1s6.3-14.1,14.1-14.1,14.1,6.3,14.1,14.1-6.3,14.1-14.1,14.1ZM191.3,135.1c0-9.1,7.4-16.5,16.5-16.5s16.5,7.4,16.5,16.5-7.4,16.5-16.5,16.5-16.5-7.4-16.5-16.5ZM225.1,308.8c-7.8,0-14.1-6.3-14.1-14.1s6.3-14.1,14.1-14.1,14.1,6.3,14.1,14.1-6.3,14.1-14.1,14.1ZM225.1,240.8c-10.5,0-19-8.5-19-19s8.5-19,19-19,19,8.5,19,19-8.5,19-19,19ZM295.6,259.3c-9.8,0-17.8-8-17.8-17.8s8-17.8,17.8-17.8,17.8,8,17.8,17.8-8,17.8-17.8,17.8Z"/> 3042</svg></a>
3042<script id="wpb-modifications"> window.wpbCustomElement = 1; </script>
3042<script id="salient-child-featherlight-script-js" src="https://kernelci.org/wp-content/themes/salient-child/vc-addons/js/featherlight.js?ver=3.6.1"></script>
vendor: 1 bytes, line 3042
3042
3043<script id="youtube-playlist-js" src="https://kernelci.org/wp-content/themes/salient-child/vc-addons/js/youtube-playlist.js?ver=1.0.0"></script>
vendor: 1 bytes, line 3043
3043
3044<script id="cookie-settings-script-js" src="https://kernelci.org/wp-content/themes/salient-child/includes/cookie-settings/cookie-settings.js?ver=18.3.0"></script>
vendor: 1 bytes, line 3044
3044
3045<script id="salient-child-javascript-js" src="https://kernelci.org/wp-content/themes/salient-child/javascript.js?ver=3.6.1"></script>
vendor: 1 bytes, line 3045
3045
3046<script id="jquery-easing-js" src="https://kernelci.org/wp-content/themes/salient/js/build/third-party/jquery.easing.min.js?ver=1.3"></script>
vendor: 1 bytes, line 3046
3046
3047<script id="nectar_priority-js" src="https://kernelci.org/wp-content/themes/salient/js/build/priority.js?ver=18.3.0"></script>
vendor: 1 bytes, line 3047
3047
3048<script id="nectar-transit-js" src="https://kernelci.org/wp-content/themes/salient/js/build/third-party/transit.min.js?ver=0.9.9"></script>
vendor: 1 bytes, line 3048
3048
3049<script id="nectar-waypoints-js" src="https://kernelci.org/wp-content/themes/salient/js/build/third-party/waypoints.js?ver=4.0.2"></script>
vendor: 1 bytes, line 3049
3049
3050<script id="imagesLoaded-js" src="https://kernelci.org/wp-content/themes/salient/js/build/third-party/imagesLoaded.min.js?ver=4.1.4"></script>
vendor: 1 bytes, line 3050
3050
3051<script id="hoverintent-js" src="https://kernelci.org/wp-content/themes/salient/js/build/third-party/hoverintent.min.js?ver=1.9"></script>
vendor: 1 bytes, line 3051
3051
3052<script id="magnific-js" src="https://kernelci.org/wp-content/themes/salient/js/build/third-party/magnific.js?ver=7.0.1"></script>
vendor: 1 bytes, line 3052
3052
3053<script id="anime-js" src="https://kernelci.org/wp-content/themes/salient/js/build/third-party/anime.min.js?ver=4.5.1"></script>
vendor: 1 bytes, line 3053
3053
3054<script id="touchswipe-js" src="https://kernelci.org/wp-content/plugins/salient-core/js/third-party/touchswipe.min.js?ver=3.1.6"></script>
vendor: 1 bytes, line 3054
3054
3055<script id="flexslider-js" src="https://kernelci.org/wp-content/themes/salient/js/build/third-party/flexslider.min.js?ver=2.1"></script>
vendor: 1 bytes, line 3055
3055
3056<script id="stickykit-js" src="https://kernelci.org/wp-content/themes/salient/js/build/third-party/stickkit.js?ver=18.3.0"></script>
vendor: 1 bytes, line 3056
3056
3057<script id="superfish-js" src="https://kernelci.org/wp-content/themes/salient/js/build/third-party/superfish.js?ver=1.5.8"></script>
vendor: 1 bytes, line 3057
3057
3058<script id="nectar-frontend-js-extra"> 3059var nectarLove = {"ajaxurl":"https://kernelci.org/wp-admin/admin-ajax.php","postID":"94","rooturl":"https://kernelci.org","disqusComments":"false","loveNonce":"27e31244ff","mapApiKey":""}; 3060var nectarOptions = {"delay_js":"false","smooth_scroll":"false","smooth_scroll_strength":"50","quick_search":"false","react_compat":"disabled","header_entrance":"false","body_border_func":"default","disable_box_roll_mobile":"false","body_border_mobile":"0","dropdown_hover_intent":"default","simplify_ocm_mobile":"0","mobile_header_format":"default","ocm_btn_position":"default","left_header_dropdown_func":"default","ajax_add_to_cart":"0","ocm_remove_ext_menu_items":"remove_images","woo_product_filter_toggle":"0","woo_sidebar_toggles":"true","woo_sticky_sidebar":"0","woo_minimal_product_hover":"default","woo_minimal_product_effect":"default","woo_related_upsell_carousel":"false","woo_product_variable_select":"default","woo_using_cart_addons":"false","view_transitions_effect":""}; 3061var nectar_front_i18n = {"menu":"Menu","next":"Next","previous":"Previous","close":"Close","slide_of":"Slide %1$s of %2$s","slide":"slide"}; 3062//# sourceURL=nectar-frontend-js-extra 3063</script>
vendor: 1 bytes, line 3063
3063
3064<script id="nectar-frontend-js" src="https://kernelci.org/wp-content/themes/salient/js/build/init.js?ver=18.3.0"></script>
vendor: 1 bytes, line 3064
3064
3065<script id="wpb_composer_front_js-js" src="https://kernelci.org/wp-content/plugins/js_composer_salient/assets/js/dist/js_composer_front.min.js?ver=8.7.3"></script>
vendor: 1 bytes, line 3065
3065
3066<script id="wp-emoji-settings" type="application/json"> 3067{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://kernelci.org/wp-includes/js/wp-emoji-release.min.js?ver=7.1.2"}} 3068</script>
vendor: 1 bytes, line 3068
3068
3069<script type="module"> 3070/*! This file is auto-generated */ 3071var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))}); 3072//# sourceURL=https://kernelci.org/wp-includes/js/wp-emoji-loader.min.js 3073</script>
vendor: 1 bytes, line 3073
3073
3074<script type="text/javascript" nonce="d710cee414adeabf60cdc94ee0b12f09"></script>
3074<script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","licenseKey":"NRJS-31a57c2b1fe38cc7620","applicationID":"540799145","transactionName":"YAcHNhMDD0NSUU0PC1lNJAEVCw5eHEJYAQE=","queueTime":0,"applicationTime":391,"atts":"TEAEQFsZHE0=","errorBeacon":"bam.nr-data.net","agent":""}</script>
3074</body> 3075</html> 3076<!-- plugin=object-cache-pro client=phpredis metric#hits=6598 metric#misses=17 metric#hit-ratio=99.7 metric#bytes=1567953 metric#prefetches=287 metric#store-reads=32 metric#store-writes=10 metric#store-hits=297 metric#store-misses=6 metric#sql-queries=10 metric#ms-total=389.28 metric#ms-cache=25.40 metric#ms-cache-avg=0.6196 metric#ms-cache-ratio=6.5 -->
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.