PageSourceSearch

https://kernelci.org/blog/

html kernelci.org collected 2026-10-02 10:13:52 UTC 385,987 bytes, 3,076 lines download raw bytes

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 &#8211; 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 &raquo; Feed" href="https://kernelci.org/feed/" />
12<link rel="alternate" type="application/rss+xml" title="KernelCI Foundation &raquo; 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&#038;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&#038;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 &amp; 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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9d51d869609c79398e721cbc89c552de38176c4105c60fc37a6f313c28252213?s=180&#038;d=mm&#038;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">, &#8220;Make possible to use kci-dev as a Python library&#8221;, 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&#8217;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&#8217;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&#8217;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&#8217;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 &#8211;instance &lt;name&gt; 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&#8217;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 &#8220;what is red today, and is any of it new?&#8221;. 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 &#8220;all three reported build failures match known issues; no unmatched build failures were found in this checkout&#8221;, 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&#8217;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&#8217;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"> &#8220;
415no member named bh_work&#8221; 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 &#8211;nodeid &lt;id&gt;</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&#8217;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&#8217;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">&#8211;runtime=null</span><span style="font-weight: 400"> for </span><span style="font-weight: 400">&#8211;runtime=podman</span><span style="font-weight: 400"> or </span><span style="font-weight: 400">&#8211;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 &#8220;the chatbot can click buttons for you&#8221;. 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&#8217;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&#8217;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. &#8220;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&#8221; 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 &#8216;kci-dev[mcp]&#8217;</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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9d51d869609c79398e721cbc89c552de38176c4105c60fc37a6f313c28252213?s=180&#038;d=mm&#038;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&#8217;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&#8217;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&#8217;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&#8217;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&#8217;ve needed—the ability to learn when a reported regression gets fixed and update our Dashboard accordingly. Regzbot&#8217;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&#8217;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&#8217;re exploring redesigning regzbot&#8217;s scraper functionality as a standalone service that could benefit other kernel community use cases. We&#8217;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&#8217;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&#8217;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&#8217;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&#8217;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&#8217;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&#8217;re interested in following this work:</span></p>
498<ul>
499<li style="font-weight: 400"><span style="font-weight: 400">Visit regzbot&#8217;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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9d51d869609c79398e721cbc89c552de38176c4105c60fc37a6f313c28252213?s=180&#038;d=mm&#038;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 &#8211; 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&#8217;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 &#8220;Labs&#8221; 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">&#8211; </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">&#8211; </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">&#8211; </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 &amp; 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>&nbsp;</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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9d51d869609c79398e721cbc89c552de38176c4105c60fc37a6f313c28252213?s=180&#038;d=mm&#038;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) &#8211; </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 &#8211; 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&#8217;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&#8217;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&#8217;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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9d51d869609c79398e721cbc89c552de38176c4105c60fc37a6f313c28252213?s=180&#038;d=mm&#038;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&#8217;s testing ecosystem. Arm&#8217;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&#8217;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&#8217;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&#8217;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&#8217;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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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 &#8211; 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.&nbsp;</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&amp;__hssc=140487916.4.1758205539577&amp;__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&amp;__hssc=140487916.4.1758205539577&amp;__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 &amp; 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.&nbsp;</p>
722
723
724
725<p class="wp-block-paragraph">During the workshop, we discussed how to fulfill maintainers&#8217; 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&amp;accessLevel=meeting&amp;canPlayFromShare=true&amp;from=share_recording_detail&amp;continueMode=true&amp;componentName=rec-play&amp;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&#8217;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&#8217;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&nbsp;</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.&nbsp; In daily operations, this translates to production updates that require minimal supervision and minimal downtime &#8211; what previously took hours now takes less than one minute. We&#8217;ve also developed our own storage solution that gives us greater control over data costs by maintaining a &#8220;hot&#8221; 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 &#8211; 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&#8217;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 &#8211;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 &#8212; 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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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 &#8211; 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&#8217;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.&#8221; 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.&nbsp;</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>,&nbsp; <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 &#8211; 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>.&nbsp;</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.&nbsp;</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&#8217;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% &#8211; 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&#8217;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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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&#8217;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 &#8211; 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">&gt; 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">&gt; <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">&gt; <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">&gt; <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">&gt; <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">&gt; <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&#8217;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&#8217;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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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 &#8211; 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 &#8211; 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-&gt;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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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=&amp;labels=&amp;projects=&amp;template=new-kernel-branch.md&amp;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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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 &#8220;<a href="https://lpc.events/event/18/contributions/1739/">Meeting the New KernelCI</a>&#8221; presentation from Don Zickus (Red Hat) and Gustavo Padovan(Collabora) in LPC&#8217;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 &#8220;hallway track&#8221; 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 &amp; 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&nbsp; </strong><a href="https://lpc.events/event/18/contributions/1751/"><strong>Unifying GitLab CI approaches for the Linux Kernel</strong></a> in the Graphics &amp; DRM MC (Hall L1). By Helen Koike (Collabora),&nbsp; Sebastian Fricke(Collabora)</li>
1349
1350
1351
1352<li><strong>17:00&nbsp; </strong><a href="https://lpc.events/event/18/contributions/1728/"><strong>A little GitLab won&#8217;t hurt you</strong></a> in the <a href="https://lpc.events/event/18/sessions/176/">LPC Refereed Track</a> (Hall L2/L3). By&nbsp; Helen Koike (Collabora) Nikolai Kondrashov (Red Hat)&nbsp; 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 &#8211; 18:00</strong> <strong>KernelCI Booth</strong> in the Hallway Track. By the KernelCI community.</li>
1367
1368
1369
1370<li><strong>19:00 &#8211; 21:00 KernelCI Happy Hour</strong> &#8211; 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>&nbsp; <a href="https://lpc.events/event/18/contributions/1794/"><strong>Towards common mainline device testing</strong></a> in the Kernel Testing &amp; Dependability MC (Hall N2). By Nícolas Prado(Collabora)</li>
1381
1382
1383
1384<li><strong>13:00</strong>&nbsp; <a href="https://lpc.events/event/18/contributions/1792/"><strong>Interacting with kernel test results</strong></a>&nbsp; in the Kernel Testing &amp; 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 &amp; Embedded MC (Room 1.15 &#8211; 1.16). By Laura Nao (Collabora)</li>
1389
1390
1391
1392<li><strong>17:00</strong>&nbsp; <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 &#8211; 1.86). By Gustavo Padovan (Collabora),&nbsp; 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&nbsp; <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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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&nbsp;<a href="https://www.lavasoftware.org/">LAVA</a>&nbsp;
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&nbsp;<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&nbsp;<a href="https://lore.kernel.org/lkml/[email protected]/">GitLab CI support in the mainline</a>&nbsp;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&nbsp;<strong>ALL</strong>&nbsp;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&nbsp;<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&nbsp;<strong>post-processing the test results</strong>&nbsp;in&nbsp;<a href="https://github.com/kernelci/kcidb">KCIDB</a>&nbsp;&#8211; 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&nbsp;<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 &amp; Linux Fellow at The Linux Foundation.</p>
1480
1481
1482
1483<p class="wp-block-paragraph">A dedicated&nbsp;<a href="https://lore.kernel.org/kernelci/[email protected]/T/#u">announcement</a>&nbsp;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&nbsp;<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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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 &amp;
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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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&nbsp;<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis/">UX Analysis RFP</a>&nbsp;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&nbsp;<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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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&nbsp;<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&nbsp;<a href="https://kernelci.org/docs/api/early-access/">Early Access</a>&nbsp;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 &amp; 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>&nbsp;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&nbsp;<code>kci find node</code>&nbsp;rather than&nbsp;<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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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 &lt;[email protected]&gt;
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&nbsp;<a href="https://git-scm.com/">Git</a>&nbsp;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 &#8211; and that’s why we’re finally launching the new API &amp; 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&nbsp;<code>kci</code>&nbsp;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 &amp; 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 &amp; 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&nbsp;<em>by</em>&nbsp;these dates and conversely retire the legacy system&nbsp;<em>no sooner than</em>&nbsp;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&nbsp;<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&nbsp;<a href="mailto:[email protected]">mailing list</a>&nbsp;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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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 &#8211; Q&amp;A</a></h2>
1809          </div>
1810          
1811          
1812<p class="wp-block-paragraph">Following the&nbsp;<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&nbsp;<a href="https://kernelci.org/blog/posts/2020/07/09/">community survey</a>&nbsp;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&nbsp;<a href="https://linux.kernelci.org/job/">old web dashboard</a>&nbsp;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&nbsp;<a href="https://staging.kernelci.org:9000/latest/docs">auto-generated documentation</a>&nbsp;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&nbsp;<a href="https://kernelci.org/docs/kcidb/">KCIDB</a>&nbsp;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&nbsp;<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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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&nbsp;<a href="https://kernelci.org/blog/posts/2023/rfp-ux-analysis/RFP-UX-Analysis-2023-v2.pdf">RFP-UX-Analysis-2023-v2.pdf</a>&nbsp;document for all the details. Proposals should be sent by email directly to the&nbsp;<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&nbsp;<strong>10th July 2023</strong>, six weeks after it has been made public. Then the KernelCI Advisory Board of Members will vote on the&nbsp;<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&nbsp;<strong>24th July 2023</strong>&nbsp;and the advisory board is planning to hold a vote on&nbsp;<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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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:&nbsp;<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&nbsp;<a href="https://kernelci.org/docs/tests/howto/">get started</a>&nbsp;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&nbsp;<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&nbsp;<a href="https://github.com/kernelci/kcidb/blob/main/tests.yaml">catalog</a>&nbsp;(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&nbsp;<a href="https://fosdem.org/2023/schedule/track/testing_and_automation/">Testing and Automation devroom</a>&nbsp;(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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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&nbsp;<a href="https://kernelci.org/blog/posts/2022/rfp-sysadmin/">Request For Proposals</a>&nbsp;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&nbsp;<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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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&nbsp;<a href="https://kernelci.org/blog/posts/2022/rfp-sysadmin/RFP-Sysadmin-Maintenance-2022-v3.pdf">RFP-Sysadmin-Maintenance-2022-v3.pdf</a>&nbsp;document for all the details. Proposals should be sent by email directly to the&nbsp;<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&nbsp;<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&nbsp;<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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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&nbsp;<a href="https://lore.kernel.org/kernelci/">KernelCI mailing list</a>&nbsp;as well as&nbsp;<a href="https://lkml.org/">LKML</a>&nbsp;and&nbsp;<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&nbsp;<a href="https://kernelci.org/docs/instances/staging/">staging instance</a>&nbsp;before the patches for the test and the fix are sent to any mailing list, in which case the fix would get a&nbsp;<code>Tested-by: "kernelci.org bot" &lt;[email protected]&gt;</code>&nbsp;
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 &#8211; 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 &#8211; 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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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 &#8211; 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 &#8211; 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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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.&nbsp; Maybe slightly less “interesting” than the rest of the world-changing events of 2020, but it’s still been an adventure.&nbsp; 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>&nbsp; Throughout 2020 we gave talks and led discussions at several virtual conferences such as FOSDEM, Open-Source Summit / Embedded Linux Conference (ELC).&nbsp; Check out <a href="https://foundation.kernelci.org/blog/">our blog</a> for more details about the talks and discussions from these events.&nbsp;</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.&nbsp; This survey has helped guide where we focus our time and resources.&nbsp; 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.&nbsp; 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.&nbsp; We’re calling this common datastore for kernel testing results kcidb.&nbsp; 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.&nbsp; 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.&nbsp; As you might expect, we do lots of kernel builds, and that requires lots of compute horsepower.&nbsp; Our build capacity had been capped by a fixed number of donated build machines.&nbsp; 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&#8217;s executive committee.&nbsp; We are very happy to welcome Guillaume Tucker (Collabora) as the new board chair and Chris Paterson (CIP/Renesas) as the new treasurer.&nbsp; We also say a big thank you to outgoing chair Kevin Hilman (BayLibre) and outgoing treasurer Guy Lunardi (Collabora).&nbsp;&nbsp;</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.&nbsp; We want it to be easy for anyone doing kernel testing to be able to submit results to our open, centralized datastore: KCIDB.&nbsp; 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.&nbsp; 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.&nbsp; 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 &amp; 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.&nbsp; 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.&nbsp; 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.&nbsp; 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?&nbsp; We’re looking for help!&nbsp; 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&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9fb9ee6c55e1f028bbffd2ab37334220a6967962f1f51d3735c3c8a923023bb?s=180&#038;d=mm&#038;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&amp;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 &#8220;custom&#8221; 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&amp;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 &#8220;make&#8221;, 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 &#8220;ran test X, which requires kernel config flag Y, on architecture/platform Z on kernel version V&#8221;.</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&#8217;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 &#8220;Let&#8217;s Test with KernelCI&#8221; 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&amp;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 &#8211; 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 &amp; 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.