638 lines
105 KiB
HTML
638 lines
105 KiB
HTML
<!doctype html>
|
||
<html lang="en-US">
|
||
<head>
|
||
<meta charset="UTF-8" />
|
||
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1">
|
||
<meta http-equiv="X-UA-Compatible" content="ie=edge"><script type="text/javascript">(window.NREUM||(NREUM={})).init={ajax:{deny_list:["bam.nr-data.net"]}};(window.NREUM||(NREUM={})).loader_config={licenseKey:"NRJS-c60051e0ab14573e082",applicationID:"490326177",browserID:"490326491"};;/*! For license information please see nr-loader-rum-1.321.0.min.js.LICENSE.txt */
|
||
(()=>{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)),a=0===Object.keys(r).length?e:r;for(let s in a)if(void 0!==e[s])try{if(null===e[s]){r[s]=null;continue}Array.isArray(e[s])&&Array.isArray(t[s])?r[s]=Array.from(new Set([...e[s],...t[s]])):e[s]instanceof Map||e[s]instanceof Set||e[s]instanceof Date||e[s]instanceof RegExp?r[s]=e[s]:"object"==typeof e[s]&&null!==t[s]&&"object"==typeof t[s]?r[s]=i(e[s],t[s]):r[s]=e[s]}catch(e){r[s]||(0,n.R)(1,e)}return r}catch(e){(0,n.R)(2,e)}}},2555(e,t,r){"use strict";r.d(t,{f:()=>s});var n=r(384),i=r(8122);const a={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 s(e){try{return!!e.licenseKey&&!!e.errorBeacon&&!!e.applicationID}catch(e){return!1}}r.d(t,["D",0,e=>(0,i.a)(e,a)])},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,["xv",0,"1.321.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"}])},6154(e,t,r){"use strict";var n=r(1863);const i="undefined"!=typeof window&&!!window.document,a="undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self.navigator instanceof WorkerNavigator||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis.navigator instanceof WorkerNavigator),s=i?window:"undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis),o=Boolean("hidden"===s?.document?.visibilityState),c=""+s?.location,u=/iPad|iPhone|iPod/.test(s.navigator?.userAgent),d=u&&"undefined"==typeof SharedWorker,l=((()=>{const e=s.navigator?.userAgent?.match(/Firefox[/\s](\d+\.\d+)/);Array.isArray(e)&&e.length>=2&&e[1]})(),Date.now()-(0,n.t)());r.d(t,["OF",0,u,"RI",0,i,"WN",0,l,"bv",0,a,"gm",0,s,"m",0,c,"mw",0,o,"sb",0,d,"zk",0,()=>{const e=s?.performance?.getEntriesByType?.("navigation")?.[0];if(e&&e.responseStart>0&&e.responseStart<s.performance.now())return e}])},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:()=>u,x3:()=>c});var n=r(3241),i=r(3606),a=r(860),s=r(2646);function o(e,t){if(!e)return;const r={staged:!1,priority:a.P3[t]||0};e.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&&d(e))}function u(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,d(e)}}function d(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 a=e.ee,o=i.i.handlers;if(a&&!a.aborted&&a.backlog&&o){if((0,n.W)({type:"lifecycle",name:"drain",feature:t}),r){const e=a.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 s.y&&!t[0].listeners(e).includes(t[1])&&t[0].on(e,t[1])})})}}a.isolatedBacklog||delete o[t],a.backlog[t]=null,a.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],a=e[2];n.apply(i,a)}})}},7836(e,t,r){"use strict";var n=r(384),i=r(8990),a=r(2646),s=r(5607);const o="nr@context:".concat(s.W),c=function e(t,r){var n={},s={},d={},l=!1;try{l=16===r.length&&u.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,a){!1!==a&&(a=!0);if(c.aborted&&!i)return;t&&a&&t.emit(e,r,n);var o=g(n);m(e).forEach(e=>{e.apply(o,r)});var u=v()[s[e]];u&&u.push([f,e,r,o]);return o},get:h,listeners:m,context:g,buffer:function(e,t){const r=v();if(t=t||"feature",f.aborted)return;Object.entries(e||{}).forEach(([e,n])=>{s[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()[s[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 g(e){return e&&e instanceof a.y?e:e?(0,i.I)(e,o,()=>new a.y(o)):new a.y(o)}function p(e,t){n[e]=m(e).concat(t)}function m(e){return n[e]||[]}function h(t){return d[t]=d[t]||e(f,t)}function v(){return f.backlog}}(void 0,"globalEE"),u=(0,n.Zm)();u.ee||(u.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,a){a?(a.buffer([e],i),a.emit(e,t,r)):(n.buffer([e],i),n.emit(e,t,r))}},3606(e,t,r){"use strict";r.d(t,{i:()=>a});var n=r(9908);a.on=s;var i=a.handlers={};function a(e,t,r,a){s(a||n.d,i,e,t,r)}function s(e,t,r,i,a){a||(a="feature"),e||(e=n.d);var s=t[a]=t[a]||{};(s[r]=s[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 a(e,t,r=!1,i){document.addEventListener(e,t,n(r,i))}r.d(t,{DD:()=>a,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:()=>s,bz:()=>a});var n=r(6154);function i(e,t){return e?15&e[t]:16*Math.random()|0}function a(){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 s(e){const t=n.gm?.crypto||n.gm?.msCrypto;let r,a=0;t&&t.getRandomValues&&(r=t.getRandomValues(new Uint8Array(e)));const s=[];for(var o=0;o<e;o++)s.push(i(r,a++).toString(16));return s.join("")}},2614(e,t,r){"use strict";r.d(t,["BB",0,18e5,"Wt",0,"NRBA_SESSION::","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])},1863(e,t,r){"use strict";function n(){return Math.floor(performance.now())}r.d(t,{t:()=>n})},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:()=>a});var n=r(944);const i=new Map;function a(...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]"),a=t.includes("nrWrapper");return r||a||(0,n.R)(64,e?.name||t),i.set(e,r),r})}},5289(e,t,r){"use strict";r.d(t,{GG:()=>s,Qr:()=>c,sB:()=>o});var n=r(3878),i=r(6389);function a(){return"undefined"==typeof document||"complete"===document.readyState}function s(e,t){if(a())return e();const r=(0,i.J)(e),s=setInterval(()=>{a()&&(clearInterval(s),r())},500);(0,n.sp)("load",r,t)}function o(e){if(a())return e();(0,n.DD)("DOMContentLoaded",e)}function c(e){if(a())return e();(0,n.sp)("popstate",e)}},384(e,t,r){"use strict";r.d(t,{Zm:()=>c,bQ:()=>d,dV:()=>u,pV:()=>l});var n=r(6154),i=r(1863),a=r(944),s=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 u(){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,s.i)(...Object.values(e.o))),e}function d(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,a.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}}(),u(),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:()=>a,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 a(e,t,r){(0,n.sp)("pagehide",e,t,r)}},9300(e,t,r){"use strict";r(860).K7.ajax;r.d(t,["mo",0,{NONE:"none",FAILURES:"failures",ALL:"all"}])},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])},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:()=>a});var n=r(9566),i=r(1741);class a extends i.W{agentIdentifier=(0,n.LA)(16)}},1741(e,t,r){"use strict";r.d(t,{W:()=>a});var n=r(944),i=r(4261);class a{#e(e,...t){if(this[e]!==a.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","k6",0,"addRelease","nb",0,"setApplicationVersion","o5",0,"noticeError"])},1738(e,t,r){"use strict";r.d(t,{U:()=>l,Y:()=>d});var n=r(3241),i=r(9908),a=r(1863),s=r(944),o=r(3969),c=r(8362),u=r(860);function d(e,t,r,a){const d=a||r;!d||d[e]&&d[e]!==c.d.prototype[e]||(d[e]=function(){(0,i.p)(o.xV,["API/"+e+"/called"],void 0,u.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,s.R)(23,e)}})}function l(e,t,r,n,s){const o=e.info;null===r?delete o.jsAttributes[t]:o.jsAttributes[t]=r,(s||null===r)&&(0,i.p)("api-"+n,[(0,a.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",a="browser/blobs",s="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},u={[o.pageViewEvent]:"rum",[o.pageViewTiming]:n,[o.ajax]:n,[o.softNav]:n,[o.metrics]:i,[o.jserrors]:i,[o.sessionTrace]:a,[o.sessionReplay]:a,[o.logging]:s,[o.genericEvents]:"ins"};r.d(t,["$J",0,u,"K7",0,o,"P3",0,c,"XX",0,i,"Yy",0,s,"df",0,a,"hg",0,"connect"])}};const t={};function r(n){const i=t[n];if(void 0!==i)return i.exports;const a=t[n]={exports:{}};return e[n](a,a.exports,r),a.exports}r.m=e,r.d=(e,t)=>{if(Array.isArray(t))for(var n=0;n<t.length;){var i=t[n++],a=t[n++];r.o(e,i)?0===a&&n++:0===a?Object.defineProperty(e,i,{enumerable:!0,value:t[n++]}):Object.defineProperty(e,i,{enumerable:!0,get:a})}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=>"nr-rum-1.321.0.min.js",r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{const e={},t="NRBA-1.321.0.PROD:";r.l=(n,i,a,s)=>{if(e[n])return void e[n].push(i);let o,c;if(void 0!==a){const e=document.getElementsByTagName("script");for(var u=0;u<e.length;u++){const r=e[u];if(r.getAttribute("src")==n||r.getAttribute("data-webpack")==t+a){o=r;break}}}if(!o){c=!0;var d={296:"sha512-auOJN989wXoxmQeiyRE/ZlrR6yqeuq5/WjLH1btsNQ6Iqm/RK+IqmjTuvad7oOBZyozPaWg6y2Uu2qAZy3e0cQ=="};o=document.createElement("script"),o.charset="utf-8",r.nc&&o.setAttribute("nonce",r.nc),o.setAttribute("data-webpack",t+a),o.src=n,0!==o.src.indexOf(window.location.origin+"/")&&(o.crossOrigin="anonymous"),d[s]&&(o.integrity=d[s])}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={374:0,840: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 a=new Promise((r,n)=>i=e[t]=[r,n]);n.push(i[2]=a);const s=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(s,c,"chunk-"+t,t)}};const t=(t,n)=>{let[i,a,s]=n;var o,c,u=0;if(i.some(t=>0!==e[t])){for(o in a)r.o(a,o)&&(r.m[o]=a[o]);if(s)s(r)}for(t&&t(n);u<i.length;u++)c=i[u],r.o(e,c)&&e[c]&&e[c][0](),e[c]=0},n=self["webpackChunk:NRBA-1.321.0.PROD"]=self["webpackChunk:NRBA-1.321.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),a=r(1741);var s=r(2555),o=r(981);t.K7.genericEvents,o.R.PA,o.R.UA,o.R.BP;const c={RESOURCES:"experimental.resources",REGISTER:"register"};var u=r(9300);const d=e=>{if(!e||"string"!=typeof e)return!1;try{document.createDocumentFragment().querySelector(e)}catch{return!1}return!0};var l=r(2614),f=r(944),g=r(8122);const p="[data-nr-mask]",m=e=>(0,g.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:u.mo.NONE},api:{register:{get enabled(){return e.feature_flags.includes(c.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(c.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,f.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(c.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:l.wk,inactiveMs:l.BB},session_replay:{autoStart:!0,enabled:!1,preload:!1,sampling_rate:10,error_sampling_rate:100,collect_fonts:!1,inline_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(p):""===t||null===t?e.mask_selector=p:(0,f.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,f.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,f.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 h=r(6154),v=r(9324);let b=0;const y={buildEnv:"PROD",distMethod:"CDN",version:v.xv,originTime:h.WN},_={consented:!1},w={activatedFeatures:void 0,appMetadata:{},configured:!1,get consented(){return this.session?.state?.consent||_.consented},set consented(e){_.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++b},listeningForIframeMessages:!1},R="BA";var A=r(7836),x=r(3241);const E={accountID:void 0,trustKey:void 0,agentID:void 0,licenseKey:void 0,applicationID:void 0,xpid:void 0};var S=r(9908);const k="newrelic-iframe-";function T(e,t={},n,o){let{init:c,info:u,loader_config:d,runtime:l={},exposed:f=!0}=t;if(!u){const e=(0,i.pV)();c=e.init,u=e.info,d=e.loader_config}var p;e.init=m(c||{}),e.loader_config=(p=d||{},(0,g.a)(p,E)),u.jsAttributes??={},h.bv&&(u.jsAttributes.isWorker=!0),e.info=(0,s.D)(u);const v=e.init;e.runtime??=(e=>{const t=(0,g.a)(e,w),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:R,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(a.W.prototype).forEach(r=>{const n=a.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=A.ee.get(e.agentIdentifier),e.exposed=f,(0,x.W)({drained:!!e.runtime.activatedFeatures,type:"lifecycle",name:"initialize",feature:void 0,data:e.config}),e.init.api.register.allow_iframe_bridge&&h.gm.addEventListener("message",t=>{"string"==typeof t.data?.type&&t.data.type.startsWith(k)&&(0,S.p)("iframe-message",[t],void 0,"IFRAME",e.ee)}),e.runtime.configured=!0)}var j=r(1863),P=r(4261),N=r(1738);var O=r(1687),M=r(4234),I=r(5289),D=r(7767);function V(e){return!!(0,i.dV)().o.MO&&(0,D.V)(e)&&!0===e?.session_trace.enabled}var W=r(6389),B=r(7699);const C=new WeakSet,K=new WeakMap;class U 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,W.J)(()=>{(0,O.Ak)(e,this.featureName),t()}))}):(0,O.Ak)(e,t)}importAggregator(e,t,n={}){if(this.featAggregate)return;const i=async()=>{if(await this.deferred,this.#t(e),!(0,s.f)(e.info))return(0,f.R)(43),e.ee.abort(),void this.loadedSuccessfully(!1);try{await async function(e,t,n){if(K.has(e))return K.get(e);const i=(async()=>{if((0,D.V)(e.init))try{const{setupAgentSession:t}=await r.e(296).then(r.bind(r,8391));t(e)}catch(e){(0,f.R)(20,e),t.emit("internal-error",[e]),(0,S.p)(B.qh,[e],void 0,n,t)}if(e.init.api.register.allow_iframe_bridge)try{const{setupIframeMFEMessageListener:t}=await Promise.resolve().then(function(){const e=new Error("Cannot find module '../../loaders/configure/iframe-message-handler'");throw e.code="MODULE_NOT_FOUND",e});t(e)}catch(e){(0,f.R)(23,e)}const[{Connector:i},{Harvester:a}]=await Promise.all([r.e(296).then(r.bind(r,6589)),r.e(296).then(r.bind(r,5237))]);e.runtime.connector=new i(e),e.runtime.harvester=new a(e);const s=Object.values(e.features).filter(t=>e.runtime.drainRegistry.has(t.featureName));Promise.all(s.map(e=>e.onAggregateImported)).then(()=>e.runtime.harvester.startTimer())})();K.set(e,i),await i}(e,this.ee,this.featureName)}catch(e){return(0,f.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,O.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,f.R)(34,e),this.abortHandler?.(),(0,O.Ze)(this.agentRef,this.featureName,!0),this.loadedSuccessfully(!1)}};h.RI?(0,I.GG)(()=>i(),!0):i()}#r(e,r,n){if(this.blocked)return!1;switch(e){case t.K7.sessionReplay:return V(n)&&!!r;case t.K7.sessionTrace:return!!r;default:return!0}}#t(e){if(!C.has(e)&&(C.add(e),!(0,s.f)(e.info))){const t=(0,i.pV)();let r={...t.info?.jsAttributes};try{r={...r,...e.info?.jsAttributes}}catch(e){}T(e,{...t,info:{...t.info,jsAttributes:r},runtime:e.runtime},e.runtime.loaderType)}}}var L=r(6630);class F extends U{static featureName=L.T;constructor(e){var t;super(e,L.T),this.setupInspectionEvents(),t=e,(0,N.Y)(P.Fw,function(e,r){"string"==typeof e&&("/"!==e.charAt(0)&&(e="/"+e),t.runtime.customTransaction=(r||"http://custom.transaction")+e,(0,S.p)("api-"+P.Fw,[(0,j.t)()],void 0,void 0,t.ee))},t),this.importAggregator(e,()=>e.init.feature_flags.includes("rum_v2")?r.e(296).then(r.bind(r,908)):r.e(296).then(r.bind(r,7927)))}setupInspectionEvents(){const e=(e,t)=>{e&&(0,x.W)({timeStamp:e.timeStamp,loaded:"complete"===e.target.readyState,type:"window",name:t,data:e.target.location+""})};(0,I.sB)(t=>{e(t,"DOMContentLoaded")}),(0,I.GG)(t=>{e(t,"load")}),(0,I.Qr)(t=>{e(t,"navigate")}),this.ee.on(l.tS.UPDATE,(e,t)=>{(0,x.W)({type:"lifecycle",name:"session",data:t})})}}class G extends e.d{constructor(e){var t;(super(),h.gm)?(this.features={},(0,i.bQ)(this.agentIdentifier,this),this.desiredFeatures=new Set(e.features||[]),this.desiredFeatures.add(F),T(this,e,e.loaderType||"agent"),t=this,(0,N.Y)(P.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,P.cD,n);(0,f.R)(40,typeof r)}else(0,f.R)(39,typeof e)},t),function(e){(0,N.Y)(P.Dl,function(t,r=!1){if("string"!=typeof t&&null!==t)return void(0,f.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,P.Dl,!0)},e)}(this),function(e){(0,N.Y)(P.nb,function(t){if("string"==typeof t||null===t)return(0,N.U)(e,"application.version",t,P.nb,!1);(0,f.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)(P.Pv,function(t=!0){if("boolean"==typeof t){if((0,S.p)("api-"+P.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,f.R)(65,typeof t)},e)}(this),this.run()):(0,f.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,f.R)(36,{targetFeature:r.featureName,missingDependencies:n}),this.features[r.featureName]=new r(this)})}catch(e){(0,f.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 H=r(2843),z=r(782);class Y extends U{static featureName=z.T;constructor(e){super(e,z.T),h.RI&&((0,H.u)(()=>(0,S.p)("docHidden",[(0,j.t)()],void 0,z.T,this.ee),!0),(0,H.G)(()=>(0,S.p)("winPagehide",[(0,j.t)()],void 0,z.T,this.ee)),this.importAggregator(e,()=>r.e(296).then(r.bind(r,9981))))}}var Z=r(3969);class q extends U{static featureName=Z.TZ;constructor(e){super(e,Z.TZ),this.importAggregator(e,()=>r.e(296).then(r.bind(r,9623)))}}new G({features:[F,Y,q],loaderType:"lite"})})()})();</script>
|
||
<link rel="profile" href="https://gmpg.org/xfn/11" />
|
||
<link rel="shortcut icon" href="https://slack.engineering/wp-content/themes/tinyspeck/assets/public/icons/favicon.png" sizes="16x16 32x32 48x48" type="image/png">
|
||
<!-- Optanon Consent Notice start -->
|
||
<script src="https://d34u8crftukxnk.cloudfront.net/onetrust/slack.engineering/production/scripttemplates/otSDKStub.js" type="text/javascript" charset="UTF-8" data-domain-script="019872bf-9ff8-7d80-8158-f0c910bcdfad"></script>
|
||
<!-- Optanon Consent Notice end -->
|
||
<title>There’s No Such Thing as a Free Lunch! | Engineering at Slack</title>
|
||
<meta name="description" content="Incident Management takes time Incidents need responders that are trained and experienced. At Slack, training is a foundation of our incident management program. Self-service training and live courses based mainly on prepared content are one piece of the puzzle, but there can be a missing piece in many organizations. How can staff get practical experience…">
|
||
<meta property="og:url" content="https://slack.engineering/theres-no-such-thing-as-a-free-lunch/">
|
||
<meta property="og:type" content="website">
|
||
<meta property="og:title" content="There’s No Such Thing as a Free Lunch!">
|
||
<meta property="og:description" content="Incident Management takes time Incidents need responders that are trained and experienced. At Slack, training is a foundation of our incident management program. Self-service training and live courses based mainly on prepared content are one piece of the puzzle, but there can be a missing piece in many organizations. How can staff get practical experience…">
|
||
<meta property="og:image" content="https://slack.engineering/wp-content/uploads/sites/7/2024/11/team-lunch.jpg">
|
||
<meta property="og:image:width" content="6000">
|
||
<meta property="og:image:height" content="4000">
|
||
<meta name="twitter:card" content="summary_large_image">
|
||
<meta property="twitter:domain" content="slack.engineering">
|
||
<meta property="twitter:url" content="https://slack.engineering/theres-no-such-thing-as-a-free-lunch/">
|
||
<meta name="twitter:title" content="There’s No Such Thing as a Free Lunch!">
|
||
<meta name="twitter:description" content="Incident Management takes time Incidents need responders that are trained and experienced. At Slack, training is a foundation of our incident management program. Self-service training and live courses based mainly on prepared content are one piece of the puzzle, but there can be a missing piece in many organizations. How can staff get practical experience…">
|
||
<meta name="twitter:image" content="https://slack.engineering/wp-content/uploads/sites/7/2024/11/team-lunch.jpg">
|
||
|
||
<!-- Google tag (gtag.js) -->
|
||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-590Q1VHB01"></script>
|
||
<script>
|
||
window.dataLayer = window.dataLayer || [];
|
||
function gtag(){dataLayer.push(arguments);}
|
||
gtag('js', new Date());
|
||
gtag('config', 'G-590Q1VHB01');
|
||
</script>
|
||
<!-- End Google Analytics -->
|
||
<title>There’s No Such Thing as a Free Lunch! – Engineering at Slack</title>
|
||
<meta name='robots' content='max-image-preview:large' />
|
||
<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://slack.engineering/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fslack.engineering%2Ftheres-no-such-thing-as-a-free-lunch%2F" />
|
||
<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://slack.engineering/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fslack.engineering%2Ftheres-no-such-thing-as-a-free-lunch%2F&format=xml" />
|
||
<style id="wp-img-auto-sizes-contain-inline-css">
|
||
img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
|
||
/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
|
||
</style>
|
||
<style id="wp-emoji-styles-inline-css">
|
||
|
||
img.wp-smiley, img.emoji {
|
||
display: inline !important;
|
||
border: none !important;
|
||
box-shadow: none !important;
|
||
height: 1em !important;
|
||
width: 1em !important;
|
||
margin: 0 0.07em !important;
|
||
vertical-align: -0.1em !important;
|
||
background: none !important;
|
||
padding: 0 !important;
|
||
}
|
||
/*# sourceURL=wp-emoji-styles-inline-css */
|
||
</style>
|
||
<style id="wp-block-library-inline-css">
|
||
: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;--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}}
|
||
|
||
/*# sourceURL=/wp-includes/css/dist/block-library/common.min.css */
|
||
</style>
|
||
<style id="classic-theme-styles-inline-css">
|
||
/*! This file is auto-generated */
|
||
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
|
||
/*# sourceURL=/wp-includes/css/classic-themes.min.css */
|
||
</style>
|
||
|
||
<style id="global-styles-inline-css">
|
||
: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%);--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%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}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;}.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;}
|
||
/*# sourceURL=global-styles-inline-css */
|
||
</style>
|
||
|
||
<link rel='stylesheet' id='all-css-12' href='https://slack.engineering/_static/??/wp-content/plugins/slack-config/style/shortcodes.css,/wp-content/themes/tinyspeck/assets/public/css/site.css?m=1783352904' type='text/css' media='all' />
|
||
<script type="text/javascript" src="https://slack.engineering/_static/??-eJyFi0sOgCAQQy+kjiRGdGE8i0HEQRiUT4y3FxL3rprXvsJ91sJRlBThNEkhBQhmEUdpN1SgM+/OR+FWGRodKsgPJGFS5rLqK0n/fNFYpF+ptqj8EuUnz3ZifOB9242s0y+jLDUm" ></script><link rel="https://api.w.org/" href="https://slack.engineering/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://slack.engineering/wp-json/wp/v2/posts/17276" /> <style>img#wpstats{display:none}</style>
|
||
<link rel="icon" href="https://slack.engineering/wp-content/uploads/sites/7/2020/05/cropped-octothrope-1.png?w=32" sizes="32x32" />
|
||
<link rel="icon" href="https://slack.engineering/wp-content/uploads/sites/7/2020/05/cropped-octothrope-1.png?w=192" sizes="192x192" />
|
||
<link rel="apple-touch-icon" href="https://slack.engineering/wp-content/uploads/sites/7/2020/05/cropped-octothrope-1.png?w=180" />
|
||
<meta name="msapplication-TileImage" content="https://slack.engineering/wp-content/uploads/sites/7/2020/05/cropped-octothrope-1.png?w=270" />
|
||
</head>
|
||
|
||
<body class="wp-singular post-template-default single single-post postid-17276 single-format-standard wp-embed-responsive wp-theme-tinyspeck">
|
||
<a class="ts-skip-link" href="#main">Skip to main content</a>
|
||
<div class="ts-site">
|
||
<div class="ts-site-inner">
|
||
<div class="ts-header-before"></div>
|
||
<header class="ts-header">
|
||
<div class="ts-container">
|
||
<div class="ts-header__inner ts-header__inner-desktop">
|
||
<div class="ts-header__col ts-col-left">
|
||
<div class="ts-logo">
|
||
<a class="ts-header__logo" href="https://slack.engineering/">
|
||
<img src="https://slack.engineering/wp-content/themes/tinyspeck/assets/public/images/logo.svg" alt="Slack Engineering"/>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
<div class="ts-header__col ts-col-center"></div>
|
||
<div class="ts-header__col ts-col-right">
|
||
<!--<a href="https://slack.engineering/articles/">Articles</a>
|
||
<a href="https://slack.engineering/about/">About</a>-->
|
||
<span class="ts-header__search-toggle" role="button" data-search-toggle="open">
|
||
<span class="ts-header__search-toggle-label">Search</span>
|
||
<svg class="ts-icon ts-icon-search" width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M21 21L16.7 16.7M19 11C19 15.4183 15.4183 19 11 19C6.58172 19 3 15.4183 3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||
</span>
|
||
</div>
|
||
</div>
|
||
<div class="ts-header__inner ts-header__inner-mobile">
|
||
<div class="ts-header__col ts-col-left"></div>
|
||
<div class="ts-header__col ts-col-center">
|
||
<div class="ts-logo">
|
||
<a class="ts-header__logo" href="https://slack.engineering/">
|
||
<img src="https://slack.engineering/wp-content/themes/tinyspeck/assets/public/images/logo.svg" alt="Slack Engineering"/>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
<div class="ts-header__col ts-col-right">
|
||
<span class="ts-header__search-toggle" role="button" data-search-toggle="open">
|
||
<span class="ts-header__search-toggle-label">Search</span>
|
||
<svg class="ts-icon ts-icon-search" width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M21 21L16.7 16.7M19 11C19 15.4183 15.4183 19 11 19C6.58172 19 3 15.4183 3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||
</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="ts-search">
|
||
<div class="ts-container">
|
||
<div class="ts-search__close">
|
||
<div class="ts-search__close-inner" role="button" data-search-toggle="close">
|
||
<span class="ts-search__close-label">Close</span>
|
||
<svg class="ts-search__close-icon ts-icon ts-icon-x" width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M18 6L6 18M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||
</div>
|
||
</div>
|
||
<div class="ts-search__wrapper">
|
||
<form role="search" method="get" class="ts-search__nav-form" action="https://slack.engineering/">
|
||
<div class="ts-search__group">
|
||
<input class="ts-search__input" type="search" required value="" name="s" placeholder="What are you looking for?">
|
||
<button class="ts-search__submit">Search</button>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
<main id="main" class="ts-site-primary">
|
||
<div class="ts-site-content ts-sidebar-enabled ts-singular-thumbnail-enabled">
|
||
<div class="ts-container">
|
||
<div class="ts-main-content">
|
||
|
||
<div class="ts-content-area">
|
||
<div class="ts-entry__header ts-entry__header-large">
|
||
<div class="ts-entry__header-inner">
|
||
<div class="ts-entry__header-info">
|
||
<div class="ts-entry__post-meta-wrapper">
|
||
<div class="ts-entry__post-meta">
|
||
<div class="ts-meta-date">November 14, 2024</div>
|
||
<div class="ts-meta-reading-time">13 min read</div> </div>
|
||
</div>
|
||
<h1 class="ts-jumbo"><span>There’s No Such Thing as a Free Lunch!</span></h1> <p class="ts-hero-paragraph">How Slack trains engineers in incident response by ordering lunch together.</p>
|
||
<div class="c-article__author__meta"><div class="c-article__author"><div class="c-article__author__avatar"><img src="https://slack.engineering/wp-content/uploads/sites/7/2024/11/slack-profile-pic.png"/></div><div class="c-article__author__info"><span class="c-article__author__name">Scott Nelson Windels</span><span class="c-article__author__title">Engineering Manager</span></div></div></div> </div>
|
||
<figure class="ts-entry__post-media post-media filter-mayfair">
|
||
<img src="https://slack.engineering/wp-content/uploads/sites/7/2024/11/team-lunch.jpg?w=1020" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" decoding="async" fetchpriority="high" srcset="https://slack.engineering/wp-content/uploads/sites/7/2024/11/team-lunch.jpg 7952w, https://slack.engineering/wp-content/uploads/sites/7/2024/11/team-lunch.jpg?resize=640,427 640w, https://slack.engineering/wp-content/uploads/sites/7/2024/11/team-lunch.jpg?resize=768,512 768w, https://slack.engineering/wp-content/uploads/sites/7/2024/11/team-lunch.jpg?resize=1280,854 1280w, https://slack.engineering/wp-content/uploads/sites/7/2024/11/team-lunch.jpg?resize=1536,1025 1536w, https://slack.engineering/wp-content/uploads/sites/7/2024/11/team-lunch.jpg?resize=2048,1366 2048w, https://slack.engineering/wp-content/uploads/sites/7/2024/11/team-lunch.jpg?resize=380,253 380w, https://slack.engineering/wp-content/uploads/sites/7/2024/11/team-lunch.jpg?resize=800,534 800w, https://slack.engineering/wp-content/uploads/sites/7/2024/11/team-lunch.jpg?resize=1160,774 1160w" sizes="(max-width: 1020px) 100vw, 1020px" /> </figure>
|
||
</div>
|
||
</div>
|
||
<div class="ts-entry__wrap">
|
||
<div class="ts-entry__container">
|
||
|
||
<aside class="ts-widget-area ts-sidebar__area">
|
||
<div class="ts-sidebar__inner">
|
||
<!-- Search -->
|
||
<div class="widget widget_search">
|
||
<p class="ts-section-heading">Search</p>
|
||
|
||
<form role="search" method="get" class="ts-search__form" action="https://slack.engineering/">
|
||
<div class="ts-search__container">
|
||
<input required class="ts-search__input" type="search" value="" name="s" placeholder="">
|
||
<button class="ts-search__submit"><svg class="ts-icon ts-icon-search" width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M21 21L16.7 16.7M19 11C19 15.4183 15.4183 19 11 19C6.58172 19 3 15.4183 3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></button>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
|
||
<!-- Latest Posts -->
|
||
<div class="widget">
|
||
<p class="ts-section-heading">Latest Posts</p>
|
||
<div class="widget-body ts-widget-posts">
|
||
<ul>
|
||
<li class="ts-post-item">
|
||
<article class="post-17832 post type-post status-publish format-standard has-post-thumbnail category-uncategorized tag-aws tag-migration ts-entry">
|
||
<div class="ts-entry__outer">
|
||
<div class="ts-entry__inner ts-entry__content">
|
||
<div class="ts-entry__post-meta ">
|
||
<div class="ts-meta-date">July 14, 2026</div> <div class="ts-meta-reading-time">15 min read</div> </div>
|
||
<h2 class="ts-entry__title">
|
||
<a href="https://slack.engineering/shipyard-how-we-built-slacks-next-generation-ec2-platform/">Shipyard: How We Built Slack’s Next-Generation EC2 Platform</a>
|
||
</h2>
|
||
</div>
|
||
</div>
|
||
</article>
|
||
</li>
|
||
<li class="ts-post-item">
|
||
<article class="post-17854 post type-post status-publish format-standard has-post-thumbnail category-uncategorized tag-automation-testing tag-developer-productivity tag-innovation ts-entry">
|
||
<div class="ts-entry__outer">
|
||
<div class="ts-entry__inner ts-entry__content">
|
||
<div class="ts-entry__post-meta ">
|
||
<div class="ts-meta-date">June 11, 2026</div> <div class="ts-meta-reading-time">12 min read</div> </div>
|
||
<h2 class="ts-entry__title">
|
||
<a href="https://slack.engineering/agentic-testing-where-agents-fit-in-the-e2e-testing-stack/">Agentic Testing: Where Agents Fit in the E2E Testing Stack</a>
|
||
</h2>
|
||
</div>
|
||
</div>
|
||
</article>
|
||
</li>
|
||
<li class="ts-post-item">
|
||
<article class="post-17812 post type-post status-publish format-standard has-post-thumbnail category-uncategorized tag-aws tag-backend tag-cloud-computing tag-collaboration tag-engineering tag-infrastructure tag-innovation tag-machine-learning tag-software-development ts-entry">
|
||
<div class="ts-entry__outer">
|
||
<div class="ts-entry__inner ts-entry__content">
|
||
<div class="ts-entry__post-meta ">
|
||
<div class="ts-meta-date">May 28, 2026</div> <div class="ts-meta-reading-time">17 min read</div> </div>
|
||
<h2 class="ts-entry__title">
|
||
<a href="https://slack.engineering/slack-ai-the-path-to-multi-cloud/">Slack AI: The Path to Multi-Cloud</a>
|
||
</h2>
|
||
</div>
|
||
</div>
|
||
</article>
|
||
</li>
|
||
<li class="ts-post-item">
|
||
<article class="post-17774 post type-post status-publish format-standard has-post-thumbnail category-uncategorized tag-airflow tag-aws tag-big-data tag-data-engineering tag-data-infrastructure tag-security ts-entry">
|
||
<div class="ts-entry__outer">
|
||
<div class="ts-entry__inner ts-entry__content">
|
||
<div class="ts-entry__post-meta ">
|
||
<div class="ts-meta-date">May 5, 2026</div> <div class="ts-meta-reading-time">15 min read</div> </div>
|
||
<h2 class="ts-entry__title">
|
||
<a href="https://slack.engineering/from-ssh-to-rest-a-security-driven-modernization-of-slacks-emr-data-pipelines/">From SSH to REST: A Security-Driven Modernization of Slack’s EMR Data Pipelines</a>
|
||
</h2>
|
||
</div>
|
||
</div>
|
||
</article>
|
||
</li>
|
||
<li class="ts-post-item">
|
||
<article class="post-17752 post type-post status-publish format-standard has-post-thumbnail category-uncategorized tag-development tag-security tag-software-engineering ts-entry">
|
||
<div class="ts-entry__outer">
|
||
<div class="ts-entry__inner ts-entry__content">
|
||
<div class="ts-entry__post-meta ">
|
||
<div class="ts-meta-date">April 13, 2026</div> <div class="ts-meta-reading-time">14 min read</div> </div>
|
||
<h2 class="ts-entry__title">
|
||
<a href="https://slack.engineering/managing-context-in-long-run-agentic-applications/">Managing context in long-run agentic applications</a>
|
||
</h2>
|
||
</div>
|
||
</div>
|
||
</article>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Archives -->
|
||
<div class="widget">
|
||
<p class="ts-section-heading">Archives</p>
|
||
<ul class="wp-block-archives-list wp-block-archives">
|
||
<li><a href='https://slack.engineering/2026/'>2026</a> (7)</li>
|
||
<li><a href='https://slack.engineering/2025/'>2025</a> (9)</li>
|
||
<li><a href='https://slack.engineering/2024/'>2024</a> (19)</li>
|
||
<li><a href='https://slack.engineering/2023/'>2023</a> (16)</li>
|
||
<li><a href='https://slack.engineering/2022/'>2022</a> (21)</li>
|
||
<li><a href='https://slack.engineering/2021/'>2021</a> (24)</li>
|
||
<li><a href='https://slack.engineering/2020/'>2020</a> (26)</li>
|
||
<li><a href='https://slack.engineering/2019/'>2019</a> (21)</li>
|
||
<li><a href='https://slack.engineering/2018/'>2018</a> (11)</li>
|
||
<li><a href='https://slack.engineering/2017/'>2017</a> (21)</li>
|
||
<li><a href='https://slack.engineering/2016/'>2016</a> (19)</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</aside>
|
||
|
||
<div class="ts-entry__content-wrap">
|
||
<div class="ts-single-post ts-wysiwyg">
|
||
<h3><span style="font-weight: 400">Incident Management takes time</span></h3>
|
||
<p><span style="font-weight: 400">Incidents need responders that are trained and experienced. At Slack, training is a foundation of our incident management program.</span></p>
|
||
<p><span style="font-weight: 400">Self-service training and live courses based mainly on prepared content are one piece of the puzzle, but there can be a missing piece in many organizations. How can staff get practical experience with incident response before joining a real incident?</span></p>
|
||
<h3><span style="font-weight: 400">Our first experience with the Incident Lunch</span></h3>
|
||
<p><span style="font-weight: 400">Our first experience with what we now call the Incident Lunch exercise was in a training session with the team from </span><a href="https://www.blackrock3.com/"><span style="font-weight: 400">Blackrock 3 Partners</span></a><span style="font-weight: 400"> in March 2018. They ran a two-day training for a team at Slack centered around The Incident Management System (IMS) and how it can be used to build an incident response program. During our sessions, they ran an exercise they call The Lunch Break exercise. They assign some roles to the group and set a limited time box for the group to get lunch to the training room. The focus was on having some constraints in place, teaching through role modeling some of the incident roles, and putting time pressure on the group. It was a lot of fun and we took that exercise and turned it into a regular occurrence in our Slack training options. It also gave the engineer that led the program an opportunity to get Slack to buy them lunch once a week.</span></p>
|
||
<p><span style="font-weight: 400">Those key elements of this exercise to reiterate were:</span></p>
|
||
<ul>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Time pressure,</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Role playing,</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Constraints (they called them considerations, but imagine simple rules like no pizza or fast food),</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">And it was fun to boot!</span></li>
|
||
</ul>
|
||
<h3><span style="font-weight: 400">Bringing the Incident Lunch to the rest of Slack</span></h3>
|
||
<p><span style="font-weight: 400">The team who took our initial incident training sessions wanted to bring things back to a wider group of engineers across Slack. The Incident Lunch we started is easily accessible for anyone in the company — there is no setup or expertise required for the participants. It turns out everyone is a subject matter expert at ordering and eating lunch.</span></p>
|
||
<p><span style="font-weight: 400">Folks are invited to a two-hour incident training exercise at lunchtime, and told that lunch will be provided. When they arrive, everybody gets a 15 minute refresher on our incident process, and then we drop the bomb: the lunch order fell through, so their exercise now is to obtain lunch for everybody in the room, subject to a few constraints. They need to do this using our incident response practices; somebody needs to be the incident commander, we need to communicate in an incident Slack channel, we need to post periodic status reports in the channel, etc.</span></p>
|
||
<p><span style="font-weight: 400">The trainer acts as referee and coach for the exercise. So far, no team has failed to get lunch, though there have been some close calls!</span></p>
|
||
<p><span style="font-weight: 400">From the perspective of our Incident Management Program, minimal resources are needed to repeat the exercise on a regular cadence. The framework for running the lunch is:</span></p>
|
||
<ul>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">An outline for the setup and kickoff of the in-person exercise</span>
|
||
<ul>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">We use a GitHub repository with a markdown file that we set up to run as a GitHub Pages slide deck. The outline has the 15 minute introduction and refresher into what IMS is and a brief overview of how we respond to incidents at Slack.</span></li>
|
||
</ul>
|
||
</li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">A conference room or two</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">A workflow to announce and invite people to the exercise</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">One or two staff to facilitate the exercise (did we mention they get free lunch every time they run the exercise</span><span style="font-weight: 400">‽</span><span style="font-weight: 400">)</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">A small budget to pay for lunch, probably around $300-500 per session, an order of magnitude less than any third-party firm might charge for an hour of on-site training.</span></li>
|
||
</ul>
|
||
<p><span style="font-weight: 400">A former lead engineer on a team called App Ops, created a key element for our Slack version that sprinkled some extra fun and more time pressure into the exercise. We’ve come to call what they added, the “Chaos Cards”. These added new key elements to the exercise which are </span><b>variability</b><span style="font-weight: 400"> and </span><b>unpredictability</b><span style="font-weight: 400">. The sets of cards have different actions or events that can change the course of the exercise. One card might be something like the Laptop Trouble card where you pick an SME at random that can no longer use their laptop for the rest of the exercise, or it might be a card that says Eerily Quiet (pick a new card in two minutes!). We play these cards throughout the exercise at a timed cadence, usually starting at five minutes, to add an unpredictable element to the exercise. It often makes participants more uncomfortable, which is something that happens in incidents. </span></p>
|
||
<h3><span style="font-weight: 400">Why the Incident Lunch has been a success at Slack</span></h3>
|
||
<p><span style="font-weight: 400">There are a few key reasons why this particular exercise has been a success. First I’ll share why it works really well for the team organizing and running it.</span></p>
|
||
<p><span style="font-weight: 400">“I’m sure you all have spare capacity sitting around for engineering folks to create games from scratch and play them with other engineers,” said no one in most companies. Even if you were lucky enough to have some engineers create something like this — were they able to keep it up? I’ve heard tales of companies running a Dungeons and Dragons-like incident game. There is a </span><a href="https://medium.com/slalom-build/teach-incident-response-with-games-5a69cf19fa88"><span style="font-weight: 400">blog post</span></a><span style="font-weight: 400"> by Paul Kirk, where he has a great discussion about teaching incident response with games centered around using Keep Talking and Nobody Explodes. Games with a detailed story and choosing your own adventure setup can be really engaging for engineers, but they take a huge amount of investment to set up and keep running or up-to-date. A game centered around something like Keep Talking and Nobody Explodes can be limited to a small number of users and takes some amount of setup by each person participating. Scaling it up can be a growing investment of time. When we started running the Incident Lunch exercise regularly we found some great benefits as a small team trying to keep time for real incidents in our schedule. </span></p>
|
||
<p><span style="font-weight: 400">We created a Slack channel for coordinating folks who facilitated our lunch exercise and have things set up so that it can be run in remote offices where you have willing facilitators.</span></p>
|
||
<p><span style="font-weight: 400">It also works really well for your staff. Any staff can attend. We include our Customer Experience teams and we’ve included folks from Customer Success, Sales, and other non-technical teams in the organization. There is nothing they need to do to prepare for the training, though they should probably bring a laptop and they’ll need to block out two hours of their day. We don’t have any required preparation listed and we only tell them that we’re having an “exercise”. We fib a little bit and part of the setup is that we tell them lunch will be provided so they have an incentive to attend.</span></p>
|
||
<h3><span style="font-weight: 400">How does it work in practice?</span></h3>
|
||
<p><span style="font-weight: 400">When we run the lunch exercise there are a few simple steps for the facilitator.</span></p>
|
||
<p><span style="font-weight: 400"> </span><b>Exercise set up</b></p>
|
||
<ol>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Invite folks, make a calendar invite</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Reserve a conference room</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Find a volunteer who can be in the Incident Commander role. This is often someone who has taken the exercise before and wants to level-up their skills while keeping the exercise surprise</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Check that our slides are up to date with any incident process updates</span>
|
||
<ol>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">If you are in a new location you may add a map slide with the lunch exclusion zone</span></li>
|
||
</ol>
|
||
</li>
|
||
</ol>
|
||
<p><b>Facilitating the exercise</b></p>
|
||
<ol>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Run through the training introduction</span>
|
||
<ol>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Give some background on IMS and/or Incident Response — the basics of why are we here</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Walk through some of the common roles in your Incident Response process</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Talk through how an incident starts at your company</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">What is the main goal of your incident response process?</span>
|
||
<ol>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">At most places it is to restore service as quickly as possible — say this part out loud</span></li>
|
||
</ol>
|
||
</li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Give some tips and tricks commonly used in incident response</span>
|
||
<ol>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Be clear and concise</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Develop multiple plans</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Use time boxing to keep things moving</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Focus on roles not individuals</span></li>
|
||
</ol>
|
||
</li>
|
||
</ol>
|
||
</li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Once you’ve introduced those basics it’s time to spring the surprise on them.</span>
|
||
<ol>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Lunch has fallen through. The front desk notified us that the bike messenger delivering lunch ended up on the other side of town.</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Now they must come together as an incident response team and get lunch delivered as quickly as possible — hopefully before the two hours is up</span></li>
|
||
</ol>
|
||
</li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Set the ground rules / constraints</span>
|
||
<ol>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Order must be made outside the lunch exclusion zone, to avoid making things too easy — no running to the Subway across the street</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">They can pick up or order in (delivery timing is often unpredictable)</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Set a per-person budget limit (approx $25 USD/person is a good spot)</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Lunch is expensed, so keep receipts (someone has to submit an expense report)</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">They can use whatever resources at hand — laptops, phones, Slack, Zoom, etc.</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Anyone with real dietary restrictions must be accommodated (and the chaos cards simulate some dietary restrictions as well)</span></li>
|
||
</ol>
|
||
</li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Have the group pick an Incident Commander (we recommend planting this person if you can); for groups entirely made of people new to the process, often the facilitator acts as The Incident Commander.</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Hand it over and start your timer for Chaos Cards</span>
|
||
<ol>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Have someone from the group (or the facilitator) pick a chaos card every five minutes: if they’re doing a great job you can speed them up, and if the group is struggling you can slow them down a little bit (remember this should still be fun!)</span></li>
|
||
</ol>
|
||
</li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Hopefully, once lunch is delivered, we run a quick retrospective while we eat. The facilitator should share some things they noticed but lean into the group to see what insights they had during the exercise.</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Clean up the conference room and you’re all done!</span></li>
|
||
</ol>
|
||
<h3><span style="font-weight: 400">What have we learned as we run these exercises?</span></h3>
|
||
<p><span style="font-weight: 400">Adding the Chaos Cards into the exercise really helped compound the time pressure with a level of unpredictability — that feels more realistic as that is how incidents often unfold in complex systems. The Chaos Cards give you some levers to make things easier or harder as you can slow or speed up the picking of them (or skip them if it would really ruin the day of everyone playing). If you have return participants you can make sure some of the harder chaos cards show up at the top of the stack — playing a card like Network Outage early in the exercise and making everyone figure out how to tether via their cell phones can get pretty spicy.</span></p>
|
||
<p><span style="font-weight: 400">After a few runs, we discovered that it can be good to find someone who is willing to be the IC up front. That isn’t always possible, but the worst experiences we had were when no one really was ready to role play the IC and it turned into a struggle. We often didn’t let the person who agreed to start as the IC know too much about the exercise so it was often still a surprise for them. That leads into another great facet of this exercise — you’ll discover folks who have a predisposed skill set for facilitating an incident that you couldn’t uncover in a normal training session. This became an internal recruiting tool for us. It also can be a tool to build up ICs who want more experience and are willing to play along. If you end up in the situation where someone in the IC role is struggling, you can coach them, ask questions to prompt them, and slow down the cadence of drawing additional chaos cards.</span></p>
|
||
<p><span style="font-weight: 400">People will quickly forget or become sidetracked in pursuit of their primary goal. Mitigating the issue and restoring service as quickly as possible is the goal in a real incident response. If you run these you’ll find that teams that finish quickly can get their order in within 15-20 minutes of starting the exercise. When a team decides they want to take a poll across the assembled responders about where to eat (not too different from asking everyone in an incident to weigh in on the best solution), you’d better hope you’ll get lunch within the two hour window. Incident Response isn’t an exercise in democracy — it’s about making decisions quickly and efficiently and often making trade offs that you wouldn’t make without time pressure — like choosing your favorite food of the day instead of thinking about what will be the fastest food option. If they do take a poll, that’s a great opportunity to talk about gaining fast consensus in an incident context by using the, “Are there any strong objections?” tactic.</span></p>
|
||
<p><span style="font-weight: 400">We also see that choosing delivery instead of picking up in person is more likely to slow things down. You’re adding more complexity into your response by adding new dependencies. We had one lunch where the order was never delivered to the restaurant from the online ordering system; we ended up with a pretty late lunch that day.</span></p>
|
||
<h3><span style="font-weight: 400">What improvements are still on the table?</span></h3>
|
||
<p><span style="font-weight: 400">A big caveat for this exercise is that it works best in person. We never figured out a virtual substitute during the pandemic that seemed to satisfy how easy this is to run in real life. Finding alternate versions of the exercise that were as simple but work in a hybrid or remote work environment would be a great upgrade. As we experimented with running these we would often include one or two remote employees but didn’t have a requirement to deliver lunch to them, we’d prepare them beforehand if they needed their own lunch. This did give an option that meant they had to include someone remote though and added a nice realism to how our work environment is day-to-day.</span></p>
|
||
<p><span style="font-weight: 400">We don’t use our daily incident tooling during The Incident Lunch. Setting up a large group of users in our staging environment would add too much overhead. Having an ability to use our internal tooling in dry-run or demo mode would add a nice touch to the exercise by giving participants hands-on experience with the tooling they’ll use in a real incident.</span></p>
|
||
<p><span style="font-weight: 400">Keep a log of your retrospective insights and notes about what happened in each lunch. They can be helpful as you look back to help you evolve your program.</span></p>
|
||
<p><span style="font-weight: 400">We hope that you’ll share with us if you implement The Incident Lunch exercise for your teams and let us know what you learn and how the exercise evolves in your environment. Thanks for reading!</span></p>
|
||
<h3><span style="font-weight: 400">References</span></h3>
|
||
<ul>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Sev0 Conference 2024: </span><a href="https://www.youtube.com/watch?v=SDykX7HWn6U"><span style="font-weight: 400">There is no such thing as a free lunch. How Slack runs their incident lunch exercise</span></a><span style="font-weight: 400"> talk by Scott Nelson Windels</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">PagerDuty Summit 2021:</span><a href="https://pagerduty.wistia.com/medias/nvfpsyz3th"> <span style="font-weight: 400">It all Starts with a Page – How CE and Engineering respond to Incidents together at Slack</span></a><span style="font-weight: 400"> talk by Niamh Tighe and Scott Nelson Windels</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">SRECon 2021:</span><a href="https://www.usenix.org/conference/srecon21/presentation/chapman"> <span style="font-weight: 400">Evolution of Incident Management at Slack</span></a><span style="font-weight: 400"> talk by Brent Chapman</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Slack Engineering Blog</span><a href="https://slack.engineering/all-hands-on-deck/"> <span style="font-weight: 400">All Hands on Deck</span></a><span style="font-weight: 400"> by Ryan Katkov</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Medium blog post</span><a href="https://medium.com/slalom-build/teach-incident-response-with-games-5a69cf19fa88"> <span style="font-weight: 400">Teach Incident Response with Games</span></a><span style="font-weight: 400"> by Paul Kirk</span></li>
|
||
<li style="font-weight: 400"><span style="font-weight: 400">Incident Lunch example </span><a href="https://github.com/drenalin23/incident-lunch"><span style="font-weight: 400">public repository</span></a></li>
|
||
</ul>
|
||
<h4><span style="font-weight: 400">Acknowledgments</span></h4>
|
||
<p><span style="font-weight: 400">This work could not have happened without the original training and ideas from the </span><a href="https://www.blackrock3.com/"><span style="font-weight: 400">Blackrock 3 Partners</span></a><span style="font-weight: 400">. The dedication of staff at Slack who made sure this got off the ground, </span><a href="https://www.linkedin.com/in/asymmetricia/"><span style="font-weight: 400">Tricia Bogen</span></a><span style="font-weight: 400">, </span><a href="https://www.linkedin.com/in/yasumoto/"><span style="font-weight: 400">Joe Smith</span></a><span style="font-weight: 400">, and </span><a href="https://greatcircle.com/"><span style="font-weight: 400">Brent Chapman</span></a><i><span style="font-weight: 400">, </span></i><span style="font-weight: 400">was key to making this a success.</span></p>
|
||
</div>
|
||
<div class="ts-tags-section"><span class="ts-tag">#<a href="https://slack.engineering/tags/incident-management/" rel="tag">incident-management</a></span><span class="ts-tag">#<a href="https://slack.engineering/tags/incident-response/" rel="tag">incident-response</a></span></div> </div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<aside class="ts-metabar__area">
|
||
<div class="ts-metabar__inner">
|
||
<div class="ts-metabar__item">
|
||
<div class="ts-share-buttons-wrap">
|
||
<div class="ts-share-buttons-items">
|
||
<div class="ts-share-buttons-item ts-share-buttons-twitter">
|
||
<a href="https://x.com/intent/post?url=https%3A%2F%2Fslack.engineering%2Ftheres-no-such-thing-as-a-free-lunch%2F" class="ts-share-buttons-link" target="_blank">
|
||
<svg class="ts-share-buttons-icon ts-icon ts-icon-twitter" width="21" viewBox="0 0 72 65" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M22.6891 0H0L26.9014 35.3477L1.72089 65H13.355L32.3999 42.5731L49.3109 64.794H72L44.317 28.4191L44.366 28.4818L68.2015 0.412927H56.5674L38.8667 21.2573L22.6891 0ZM12.524 6.19052H19.5874L59.476 58.603H52.4126L12.524 6.19052Z" fill="currentColor"/></svg>
|
||
</a>
|
||
</div>
|
||
<div class="ts-share-buttons-item ts-share-buttons-linkedin">
|
||
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fslack.engineering%2Ftheres-no-such-thing-as-a-free-lunch%2F" class="ts-share-buttons-link" target="_blank">
|
||
<svg class="ts-share-buttons-icon ts-icon ts-icon-linkedin" width="21" height="21" viewBox="0 0 70 70" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M15.8066 23.0188H1.17969V69.663H15.8066V23.0188Z" fill="currentColor"/><path d="M55.3732 22.0077C54.834 21.9403 54.2611 21.9066 53.6881 21.8729C45.4984 21.5359 40.8812 26.389 39.2635 28.4786C38.8254 29.0515 38.6231 29.3886 38.6231 29.3886V23.1536H24.6366V69.7978H38.6231H39.2635C39.2635 65.0458 39.2635 60.3274 39.2635 55.5754C39.2635 53.014 39.2635 50.4526 39.2635 47.8912C39.2635 44.7232 39.0276 41.3529 40.6116 38.4545C41.9597 36.0279 44.3862 34.8147 47.1161 34.8147C55.2047 34.8147 55.3732 42.1281 55.3732 42.8021C55.3732 42.8358 55.3732 42.8695 55.3732 42.8695V70H70.0001V39.5667C70.0001 29.1526 64.7088 23.0188 55.3732 22.0077Z" fill="currentColor"/><path d="M8.49301 16.986C13.1836 16.986 16.9861 13.1836 16.9861 8.49303C16.9861 3.80246 13.1836 0 8.49301 0C3.80244 0 0 3.80246 0 8.49303C0 13.1836 3.80244 16.986 8.49301 16.986Z" fill="currentColor"/></svg>
|
||
</a>
|
||
</div>
|
||
<div class="ts-share-buttons-item ts-share-buttons-facebook">
|
||
<a href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fslack.engineering%2Ftheres-no-such-thing-as-a-free-lunch%2F" class="ts-share-buttons-link" target="_blank">
|
||
<svg class="ts-share-buttons-icon ts-icon ts-icon-facebook" width="21" height="21" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_11_112)"><path d="M12 0C18.6274 0 24 5.37259 24 12C24 18.1352 19.3955 23.1944 13.4538 23.9121V15.667L16.7001 15.667L17.3734 12H13.4538V10.7031C13.4538 9.73417 13.6439 9.06339 14.0799 8.63483C14.5159 8.20627 15.1979 8.01993 16.1817 8.01993C16.4307 8.01993 16.6599 8.02241 16.8633 8.02736C17.1591 8.03456 17.4002 8.047 17.568 8.06467V4.74048C17.501 4.72184 17.4218 4.70321 17.3331 4.68486C17.1321 4.6433 16.8822 4.60324 16.6136 4.56806C16.0523 4.49453 15.4093 4.4423 14.9594 4.4423C13.1424 4.4423 11.7692 4.83102 10.8107 5.63619C9.65388 6.60791 9.10108 8.18622 9.10108 10.4199V12H6.62659V15.667H9.10108V23.6466C3.87432 22.3498 0 17.6277 0 12C0 5.37259 5.37259 0 12 0Z" fill="currentColor"/></g><defs><clipPath id="clip0_11_112"><rect width="24" height="24" fill="white"/></clipPath></defs></svg>
|
||
</a>
|
||
</div>
|
||
<div class="ts-share-buttons-item ts-share-buttons-threads">
|
||
<a href="https://www.threads.net/intent/post?text=+https%3A%2F%2Fslack.engineering%2Ftheres-no-such-thing-as-a-free-lunch%2F" class="ts-share-buttons-link" target="_blank">
|
||
<svg class="ts-share-buttons-icon ts-icon" width="21" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M331.5 235.7c2.2 .9 4.2 1.9 6.3 2.8c29.2 14.1 50.6 35.2 61.8 61.4c15.7 36.5 17.2 95.8-30.3 143.2c-36.2 36.2-80.3 52.5-142.6 53h-.3c-70.2-.5-124.1-24.1-160.4-70.2c-32.3-41-48.9-98.1-49.5-169.6V256v-.2C17 184.3 33.6 127.2 65.9 86.2C102.2 40.1 156.2 16.5 226.4 16h.3c70.3 .5 124.9 24 162.3 69.9c18.4 22.7 32 50 40.6 81.7l-40.4 10.8c-7.1-25.8-17.8-47.8-32.2-65.4c-29.2-35.8-73-54.2-130.5-54.6c-57 .5-100.1 18.8-128.2 54.4C72.1 146.1 58.5 194.3 58 256c.5 61.7 14.1 109.9 40.3 143.3c28 35.6 71.2 53.9 128.2 54.4c51.4-.4 85.4-12.6 113.7-40.9c32.3-32.2 31.7-71.8 21.4-95.9c-6.1-14.2-17.1-26-31.9-34.9c-3.7 26.9-11.8 48.3-24.7 64.8c-17.1 21.8-41.4 33.6-72.7 35.3c-23.6 1.3-46.3-4.4-63.9-16c-20.8-13.8-33-34.8-34.3-59.3c-2.5-48.3 35.7-83 95.2-86.4c21.1-1.2 40.9-.3 59.2 2.8c-2.4-14.8-7.3-26.6-14.6-35.2c-10-11.7-25.6-17.7-46.2-17.8H227c-16.6 0-39 4.6-53.3 26.3l-34.4-23.6c19.2-29.1 50.3-45.1 87.8-45.1h.8c62.6 .4 99.9 39.5 103.7 107.7l-.2 .2zm-156 68.8c1.3 25.1 28.4 36.8 54.6 35.3c25.6-1.4 54.6-11.4 59.5-73.2c-13.2-2.9-27.8-4.4-43.4-4.4c-4.8 0-9.6 .1-14.4 .4c-42.9 2.4-57.2 23.2-56.2 41.8l-.1 .1z"></path></svg>
|
||
</a>
|
||
</div>
|
||
<div class="ts-share-buttons-item ts-share-buttons-copy">
|
||
<a href="#" class="ts-share-buttons-link" data-share-link title="Copy link">
|
||
<svg width="21" height="21" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M10 13C10.4295 13.5741 10.9774 14.0491 11.6066 14.3929C12.2357 14.7367 12.9315 14.9411 13.6467 14.9923C14.3618 15.0435 15.0796 14.9403 15.7513 14.6897C16.4231 14.4392 17.0331 14.047 17.54 13.54L20.54 10.54C21.4508 9.59695 21.9548 8.33394 21.9434 7.02296C21.932 5.71198 21.4061 4.45791 20.4791 3.53087C19.5521 2.60383 18.298 2.07799 16.987 2.0666C15.676 2.0552 14.413 2.55918 13.47 3.46997L11.75 5.17997M14 11C13.5705 10.4259 13.0226 9.9508 12.3934 9.60704C11.7642 9.26328 11.0684 9.05886 10.3533 9.00765C9.63816 8.95643 8.92037 9.05961 8.24861 9.3102C7.57685 9.56079 6.96684 9.95291 6.45996 10.46L3.45996 13.46C2.54917 14.403 2.04519 15.666 2.05659 16.977C2.06798 18.288 2.59382 19.542 3.52086 20.4691C4.4479 21.3961 5.70197 21.922 7.01295 21.9334C8.32393 21.9447 9.58694 21.4408 10.53 20.53L12.24 18.82" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||
</a>
|
||
<span class="ts-share-notification" data-share-notification>Copied!</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</aside>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Next and Previous Post Pagination -->
|
||
<div style="margin-top: 5rem;">
|
||
<div class="ts-container">
|
||
<div class="ts-post-pagination">
|
||
<div>
|
||
<p class="ts-section-heading">Previous Post</p>
|
||
<div class="ts-post-unfurl">
|
||
<div class="ts-post-unfurl-content">
|
||
<div>
|
||
<a href="https://slack.engineering/empowering-engineers-with-ai/">
|
||
<strong>Empowering Engineers with AI</strong>
|
||
<span aria-label="(opens in new tab)"></span>
|
||
</a>
|
||
<p class="ts-post-unfurl-text">
|
||
Background and motivation In the fast-paced world of software development, having the right tools can… </p>
|
||
</div>
|
||
<div class="ts-entry__post-meta">
|
||
<div class="ts-meta-date">November 8, 2024</div>
|
||
<div class="ts-meta-reading-time"><div class="ts-meta-reading-time">9 min read</div></div>
|
||
</div>
|
||
</div>
|
||
<div class="ts-post-unfurl-img">
|
||
<img src="https://slack.engineering/wp-content/uploads/sites/7/2024/11/Screenshot-2024-11-07-at-4.09.53 PM.png?w=160&h=160&crop=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://slack.engineering/wp-content/uploads/sites/7/2024/11/Screenshot-2024-11-07-at-4.09.53 PM.png?resize=160,160 160w, https://slack.engineering/wp-content/uploads/sites/7/2024/11/Screenshot-2024-11-07-at-4.09.53 PM.png?resize=80,80 80w, https://slack.engineering/wp-content/uploads/sites/7/2024/11/Screenshot-2024-11-07-at-4.09.53 PM.png?resize=110,110 110w" sizes="auto, (max-width: 160px) 100vw, 160px" /> </div>
|
||
</div>
|
||
</div>
|
||
|
||
<div>
|
||
<p class="ts-section-heading">Next Post</p>
|
||
<div class="ts-post-unfurl">
|
||
<div class="ts-post-unfurl-content">
|
||
<a href="https://slack.engineering/astra-dynamic-chunks-how-we-saved-by-redesigning-a-key-part-of-astra/">
|
||
<strong>Astra Dynamic Chunks: How We Saved by Redesigning a Key Part of Astra</strong>
|
||
<span aria-label="(opens in new tab)"></span>
|
||
</a>
|
||
<p class="ts-post-unfurl-text">
|
||
Introduction Slack handles a lot of log data. In fact, we consume over 6 million… </p>
|
||
<div class="ts-entry__post-meta">
|
||
<div class="ts-meta-date">November 18, 2024</div>
|
||
<div class="ts-meta-reading-time"><div class="ts-meta-reading-time">7 min read</div></div>
|
||
</div>
|
||
</div>
|
||
<div class="ts-post-unfurl-img">
|
||
<img src="https://slack.engineering/wp-content/uploads/sites/7/2024/11/clay-leconey-93MIqDdKQZ0-unsplash.jpg?w=160&h=160&crop=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://slack.engineering/wp-content/uploads/sites/7/2024/11/clay-leconey-93MIqDdKQZ0-unsplash.jpg?resize=160,160 160w, https://slack.engineering/wp-content/uploads/sites/7/2024/11/clay-leconey-93MIqDdKQZ0-unsplash.jpg?resize=80,80 80w, https://slack.engineering/wp-content/uploads/sites/7/2024/11/clay-leconey-93MIqDdKQZ0-unsplash.jpg?resize=110,110 110w" sizes="auto, (max-width: 160px) 100vw, 160px" /> </div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="ts-entry__post-related">
|
||
<div class="ts-container">
|
||
<p class="ts-section-heading">Recommended Reading</p>
|
||
<div class="ts-entry__post-wrap">
|
||
<article class="post-17513 post type-post status-publish format-standard has-post-thumbnail category-uncategorized tag-automation tag-ci-cd tag-deployment tag-engineering tag-incident-response tag-infrastructure tag-observability ts-entry">
|
||
<div class="ts-entry__outer">
|
||
<div class="ts-entry__inner ts-entry__thumbnail">
|
||
<div class="ts-overlay-background filter-mayfair">
|
||
<img src="https://slack.engineering/wp-content/uploads/sites/7/2025/05/deploy-safety-smaller.jpeg?w=380&h=250&crop=1" class="attachment-tinyspeck-thumbnail size-tinyspeck-thumbnail wp-post-image" alt="A rocket streaking across the sky wearing a life vest to symbolize deploying safely" decoding="async" loading="lazy" /> </div>
|
||
<a href="https://slack.engineering/deploy-safety/" class="ts-overlay-link"></a>
|
||
</div>
|
||
<div class="ts-entry__inner ts-entry__content">
|
||
<div class="ts-entry__post-meta">
|
||
<div class="ts-meta-date">October 7, 2025</div> <div class="ts-meta-reading-time">11 min read</div> </div>
|
||
<h2 class="ts-entry__title"><a href="https://slack.engineering/deploy-safety/"><span>Deploy Safety: Reducing customer impact from change</span></a></h2><span class="ts-mention">@Sam Bailey</span> </div>
|
||
</div>
|
||
</article>
|
||
<article class="post-17534 post type-post status-publish format-standard has-post-thumbnail category-uncategorized tag-incident-response tag-security ts-entry">
|
||
<div class="ts-entry__outer">
|
||
<div class="ts-entry__inner ts-entry__thumbnail">
|
||
<div class="ts-overlay-background filter-mayfair">
|
||
<img src="https://slack.engineering/wp-content/uploads/sites/7/2025/06/pexels-scottwebb-430208.jpg?w=380&h=250&crop=1" class="attachment-tinyspeck-thumbnail size-tinyspeck-thumbnail wp-post-image" alt="" decoding="async" loading="lazy" /> </div>
|
||
<a href="https://slack.engineering/building-slacks-anomaly-event-response/" class="ts-overlay-link"></a>
|
||
</div>
|
||
<div class="ts-entry__inner ts-entry__content">
|
||
<div class="ts-entry__post-meta">
|
||
<div class="ts-meta-date">September 4, 2025</div> <div class="ts-meta-reading-time">9 min read</div> </div>
|
||
<h2 class="ts-entry__title"><a href="https://slack.engineering/building-slacks-anomaly-event-response/"><span>Building Slack’s Anomaly Event Response</span></a></h2><span class="ts-mention">@Nathan Lehotsky</span><span class="ts-mention">@Ryan Persaud</span> </div>
|
||
</div>
|
||
</article>
|
||
<article class="post-14817 post type-post status-publish format-standard has-post-thumbnail category-uncategorized tag-ci-cd tag-developer-productivity tag-incident-management tag-infrastructure ts-entry">
|
||
<div class="ts-entry__outer">
|
||
<div class="ts-entry__inner ts-entry__thumbnail">
|
||
<div class="ts-overlay-background filter-mayfair">
|
||
<img src="https://slack.engineering/wp-content/uploads/sites/7/2022/08/florian-wehde-vZSOzoC59RU-unsplash.jpg?w=380&h=250&crop=1" class="attachment-tinyspeck-thumbnail size-tinyspeck-thumbnail wp-post-image" alt="" decoding="async" loading="lazy" /> </div>
|
||
<a href="https://slack.engineering/circuit-breakers/" class="ts-overlay-link"></a>
|
||
</div>
|
||
<div class="ts-entry__inner ts-entry__content">
|
||
<div class="ts-entry__post-meta">
|
||
<div class="ts-meta-date">August 19, 2022</div> <div class="ts-meta-reading-time">19 min read</div> </div>
|
||
<h2 class="ts-entry__title"><a href="https://slack.engineering/circuit-breakers/"><span>Slowing Down to Speed Up – Circuit Breakers for Slack’s CI/CD</span></a></h2><span class="ts-mention">@Frank Chen</span> </div>
|
||
</div>
|
||
</article>
|
||
<article class="post-14657 post type-post status-publish format-standard has-post-thumbnail category-uncategorized tag-data-infrastructure tag-debugging tag-incident-response ts-entry">
|
||
<div class="ts-entry__outer">
|
||
<div class="ts-entry__inner ts-entry__thumbnail">
|
||
<div class="ts-overlay-background filter-mayfair">
|
||
<img src="https://slack.engineering/wp-content/uploads/sites/7/2022/04/black-swan-gd3523927a_1920.jpg?w=380&h=250&crop=1" class="attachment-tinyspeck-thumbnail size-tinyspeck-thumbnail wp-post-image" alt="Photo of a pair of black swans" decoding="async" loading="lazy" /> </div>
|
||
<a href="https://slack.engineering/slacks-incident-on-2-22-22/" class="ts-overlay-link"></a>
|
||
</div>
|
||
<div class="ts-entry__inner ts-entry__content">
|
||
<div class="ts-entry__post-meta">
|
||
<div class="ts-meta-date">April 26, 2022</div> <div class="ts-meta-reading-time">14 min read</div> </div>
|
||
<h2 class="ts-entry__title"><a href="https://slack.engineering/slacks-incident-on-2-22-22/"><span>Slack’s Incident on 2-22-22</span></a></h2><span class="ts-mention">@Laura Nolan</span> </div>
|
||
</div>
|
||
</article>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<!-- Arc -->
|
||
<div class="c-arc concave-up">
|
||
<div class="c-arc__upper color-blue"></div>
|
||
<div class="c-arc__lower color-white"></div>
|
||
</div>
|
||
</div>
|
||
</main>
|
||
<footer class="ts-footer">
|
||
<div class="ts-container">
|
||
<div class="ts-footer__item">
|
||
<div class="ts-footer__col ts-col-left">
|
||
<div class="ts-footer__inner">
|
||
<div class="ts-logo">
|
||
<a class="ts-footer__logo" href="https://slack.engineering/">
|
||
<img src="https://slack.engineering/wp-content/themes/tinyspeck/assets/public/images/logo.svg" alt="Slack Engineering"/>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="ts-footer__col ts-col-canter">
|
||
<div class="ts-footer__inner">
|
||
<nav class="ts-footer__nav">
|
||
<div class="ts-footer__nav-item">
|
||
<ul class="ts-footer__nav-inner">
|
||
<li><a href="https://slack.engineering/articles/">Articles</a></li>
|
||
<!--<li><a href="https://slack.engineering/about/">About</a></li>-->
|
||
<li><a href="https://slack.com/careers/dept/software-engineering" target="_blank">Careers</a></li>
|
||
<li><a href="https://slack.dev/blog/" target="_blank">Slack Developer Blog</a></li>
|
||
<li><a href="https://slack.com/blog/" target="_blank">The Slack Blog</a></li>
|
||
</ul>
|
||
</div>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
<div class="ts-footer__col ts-col-right">
|
||
<div class="ts-footer__inner">
|
||
<span>
|
||
<a href="https://x.com/SlackEng" target="_blank" class="ts-share-buttons-twitter">
|
||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M9.70487 6.85148L15.289 0.5H13.9657L9.11705 6.0149L5.24443 0.5H0.777832L6.63398 8.8395L0.777832 15.5H2.10116L7.22147 9.67608L11.3112 15.5H15.7778L9.70455 6.85148H9.70487ZM7.89239 8.91297L7.29905 8.08255L2.57797 1.47476H4.61052L8.42048 6.80746L9.01383 7.63788L13.9663 14.5696H11.9338L7.89239 8.91329V8.91297Z" fill="currentcolor"></path>
|
||
</svg>
|
||
</a>
|
||
<a href="https://www.youtube.com/@Slackhq" target="_blank" class="ts-share-buttons-youtube">
|
||
<svg width="21" height="14" viewBox="0 0 21 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.463 0C19.0721 0 20.1483 0 20.1483 7C20.1483 14 19.0721 14 10.463 14C1.85397 14 0.777832 14 0.777832 7C0.777832 0 1.85397 0 10.463 0ZM8.46143 2.7998C8.10631 2.7998 7.77271 3.0798 7.77271 3.4998V10.4998C7.77271 10.9521 8.11707 11.1998 8.46143 11.1998C8.60133 11.1998 8.7197 11.1567 8.82732 11.0921L14.3694 7.59211C14.5846 7.47365 14.6923 7.26904 14.6923 6.9998C14.6923 6.73057 14.5846 6.52596 14.3694 6.4075L8.82732 2.9075C8.70894 2.83211 8.59057 2.7998 8.46143 2.7998Z" fill="currentcolor"></path>
|
||
</svg>
|
||
</a>
|
||
</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<br/><br/>
|
||
<div class="ts-footer__item">
|
||
<p class="ts-footer__info">
|
||
<a href="https://slack.com/terms-of-service/user" target="_blank">Terms of Service</a>
|
||
<a href="https://slack.com/trust/privacy/privacy-policy" target="_blank">Privacy Information</a>
|
||
<a href="#" class="optanon-show-settings">Cookie Preferences</a>
|
||
<a href="https://www.salesforce.com/form/other/privacy-request/?_gl=1*1yvb56x*_gcl_au*OTY0OTg5MzcuMTcyNTkxMjE5Nw..*_ga*MTMzNjk3MzQ3MC4xNzE4MDQ0MzEy*_ga_QTJQME5M5D*MTcyNjI2OTEwNy40OS4xLjE3MjYyNjkyMzAuNS4wLjA." target="_blank">Your Privacy Choices</a>
|
||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="30" height="14"><path d="M7.4 12.8h6.8l3.1-11.6H7.4C4.2 1.2 1.6 3.8 1.6 7s2.6 5.8 5.8 5.8z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#fff"/><path d="M22.6 0H7.4c-3.9 0-7 3.1-7 7s3.1 7 7 7h15.2c3.9 0 7-3.1 7-7s-3.2-7-7-7zm-21 7c0-3.2 2.6-5.8 5.8-5.8h9.9l-3.1 11.6H7.4c-3.2 0-5.8-2.6-5.8-5.8z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#06f"/><path d="M24.6 4c.2.2.2.6 0 .8L22.5 7l2.2 2.2c.2.2.2.6 0 .8-.2.2-.6.2-.8 0l-2.2-2.2-2.2 2.2c-.2.2-.6.2-.8 0-.2-.2-.2-.6 0-.8L20.8 7l-2.2-2.2c-.2-.2-.2-.6 0-.8.2-.2.6-.2.8 0l2.2 2.2L23.8 4c.2-.2.6-.2.8 0z" style="fill:#fff"/><path d="M12.7 4.1c.2.2.3.6.1.8L8.6 9.8c-.1.1-.2.2-.3.2-.2.1-.5.1-.7-.1L5.4 7.7c-.2-.2-.2-.6 0-.8.2-.2.6-.2.8 0L8 8.6l3.8-4.5c.2-.2.6-.2.9 0z" style="fill:#06f"/></svg>
|
||
<br/><br/>
|
||
© 2026 Slack Technologies, LLC, a Salesforce company. All rights reserved. Various trademarks held by their respective owners.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
</div>
|
||
</div>
|
||
|
||
<a href="#top" data-scroll-to-top class="ts-scroll-to-top">
|
||
<svg class="ts-icon-up" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M5 12H19M19 12L12 5M19 12L12 19" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||
<span>scroll to top</span>
|
||
</a>
|
||
|
||
<script type="speculationrules">
|
||
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/sites/7/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/tinyspeck/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
|
||
</script>
|
||
<script type="text/javascript" src="https://slack.engineering/_static/??/wp-includes/js/imagesloaded.min.js,/wp-content/themes/tinyspeck/assets/src/js/site.js?m=1787604914j" ></script><script id="jetpack-stats-js-before">
|
||
_stq = window._stq || [];
|
||
_stq.push([ "view", {"v":"ext","blog":"195077423","post":"17276","tz":"-7","srv":"slack.engineering","hp":"vip","j":"1:16.1.3"} ]);
|
||
_stq.push([ "clickTrackerInit", "195077423", "17276" ]);
|
||
//# sourceURL=jetpack-stats-js-before
|
||
</script>
|
||
<script data-wp-strategy="defer" defer fetchpriority="low" id="jetpack-stats-js" src="https://stats.wp.com/e-202637.js"></script>
|
||
<script id="wp-emoji-settings" type="application/json">
|
||
{"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://slack.engineering/wp-includes/js/wp-emoji-release.min.js?ver=7.1"}}
|
||
</script>
|
||
<script type="module">
|
||
/*! This file is auto-generated */
|
||
var 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)))});
|
||
//# sourceURL=https://slack.engineering/wp-includes/js/wp-emoji-loader.min.js
|
||
</script>
|
||
<script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","licenseKey":"NRJS-c60051e0ab14573e082","applicationID":"490326177","transactionName":"NlEHMENZXUVRVkQKWg8bJAdFUVxYH0ZZDVINUQ==","queueTime":0,"applicationTime":254,"atts":"GhYQRgtDThoSVBJZThxJ","errorBeacon":"bam.nr-data.net","agent":""}</script></body>
|
||
</html>
|