[{"data":1,"prerenderedAt":640},["ShallowReactive",2],{"navigation_docs":3,"-engineering-platform-ops":279,"-engineering-platform-ops-surround":635},[4,8,67,96,162,186,199,216,275],{"title":5,"path":6,"stem":7},"Introduction","\u002Fintroduction","0.introduction",{"title":9,"path":10,"stem":11,"children":12,"page":62},"Company","\u002Fcompany","1.company",[13,17,21,25,29,33,37,41,45,49,63],{"title":14,"path":15,"stem":16},"About","\u002Fcompany\u002Fabout","1.company\u002F0.about",{"title":18,"path":19,"stem":20},"Values","\u002Fcompany\u002Fvalues","1.company\u002F1.values",{"title":22,"path":23,"stem":24},"Communication","\u002Fcompany\u002Fcommunication","1.company\u002Fcommunication",{"title":26,"path":27,"stem":28},"Competition","\u002Fcompany\u002Fcompetition","1.company\u002Fcompetition",{"title":30,"path":31,"stem":32},"Hybrid Working","\u002Fcompany\u002Fhybrid-working","1.company\u002Fhybrid-working",{"title":34,"path":35,"stem":36},"Manchester Office","\u002Fcompany\u002Foffice","1.company\u002Foffice",{"title":38,"path":39,"stem":40},"Operations","\u002Fcompany\u002Foperations","1.company\u002Foperations",{"title":42,"path":43,"stem":44},"Policies","\u002Fcompany\u002Fpolicies","1.company\u002Fpolicies",{"title":46,"path":47,"stem":48},"Product Strategy","\u002Fcompany\u002Fproduct-strategy","1.company\u002Fproduct-strategy",{"title":50,"path":51,"stem":52,"children":53,"page":62},"Products","\u002Fcompany\u002Fproducts","1.company\u002Fproducts",[54,58],{"title":55,"path":56,"stem":57},"Capability Exchange","\u002Fcompany\u002Fproducts\u002Fcapability-exchange","1.company\u002Fproducts\u002Fcapability-exchange",{"title":59,"path":60,"stem":61},"ESProfiler Platform","\u002Fcompany\u002Fproducts\u002Fesprofiler","1.company\u002Fproducts\u002Fesprofiler",false,{"title":64,"path":65,"stem":66},"Security","\u002Fcompany\u002Fsecurity","1.company\u002Fsecurity",{"title":68,"path":69,"stem":70,"children":71,"page":62},"People Ops","\u002Fpeople-ops","2.people-ops",[72,76,80,84,88,92],{"title":73,"path":74,"stem":75},"Compensation","\u002Fpeople-ops\u002Fcompensation","2.people-ops\u002Fcompensation",{"title":77,"path":78,"stem":79},"Education","\u002Fpeople-ops\u002Feducation","2.people-ops\u002Feducation",{"title":81,"path":82,"stem":83},"Expenses","\u002Fpeople-ops\u002Fexpenses","2.people-ops\u002Fexpenses",{"title":85,"path":86,"stem":87},"Holiday & Leave","\u002Fpeople-ops\u002Fleave","2.people-ops\u002Fleave",{"title":89,"path":90,"stem":91},"Onboarding","\u002Fpeople-ops\u002Fonboarding","2.people-ops\u002Fonboarding",{"title":93,"path":94,"stem":95},"Recruitment","\u002Fpeople-ops\u002Frecruitment","2.people-ops\u002Frecruitment",{"title":97,"path":98,"stem":99,"children":100,"page":62},"Engineering","\u002Fengineering","3.engineering",[101,105,109,113,125,146,150,154,158],{"title":102,"path":103,"stem":104},"Development Setup","\u002Fengineering\u002Fdevelopment-setup","3.engineering\u002F1.development-setup",{"title":106,"path":107,"stem":108},"Contributing","\u002Fengineering\u002Fcontributing","3.engineering\u002Fcontributing",{"title":110,"path":111,"stem":112},"Production Database","\u002Fengineering\u002Fdatabase-connection","3.engineering\u002Fdatabase-connection",{"title":114,"path":115,"stem":116,"children":117},"Deployment","\u002Fengineering\u002Fdeployment","3.engineering\u002Fdeployment",[118,121],{"title":55,"path":119,"stem":120},"\u002Fengineering\u002Fdeployment\u002Fcapability-exchange","3.engineering\u002Fdeployment\u002Fcapability-exchange",{"title":122,"path":123,"stem":124},"Platform","\u002Fengineering\u002Fdeployment\u002Fplatform","3.engineering\u002Fdeployment\u002Fplatform",{"title":126,"path":127,"stem":128,"children":129,"page":62},"Github","\u002Fengineering\u002Fgithub","3.engineering\u002Fgithub",[130,134,138,142],{"title":131,"path":132,"stem":133},"Packages","\u002Fengineering\u002Fgithub\u002Fpackages","3.engineering\u002Fgithub\u002Fpackages",{"title":135,"path":136,"stem":137},"Personal Access Token","\u002Fengineering\u002Fgithub\u002Fpersonal-access-token","3.engineering\u002Fgithub\u002Fpersonal-access-token",{"title":139,"path":140,"stem":141},"Troubleshooting","\u002Fengineering\u002Fgithub\u002Ftroubleshooting","3.engineering\u002Fgithub\u002Ftroubleshooting",{"title":143,"path":144,"stem":145},"Workflows","\u002Fengineering\u002Fgithub\u002Fworkflows","3.engineering\u002Fgithub\u002Fworkflows",{"title":147,"path":148,"stem":149},"Platform Ops","\u002Fengineering\u002Fplatform-ops","3.engineering\u002Fplatform-ops",{"title":151,"path":152,"stem":153},"Project Management","\u002Fengineering\u002Fproject-management","3.engineering\u002Fproject-management",{"title":155,"path":156,"stem":157},"Releases","\u002Fengineering\u002Frelease","3.engineering\u002Frelease",{"title":159,"path":160,"stem":161},"Tools","\u002Fengineering\u002Ftools","3.engineering\u002Ftools",{"title":163,"path":164,"stem":165,"children":166,"page":62},"Design","\u002Fdesign","4.design",[167,171,175,179,182],{"title":168,"path":169,"stem":170},"Branding","\u002Fdesign\u002Fbranding","4.design\u002Fbranding",{"title":172,"path":173,"stem":174},"Design Thinking","\u002Fdesign\u002Fdesign-thinking","4.design\u002Fdesign-thinking",{"title":176,"path":177,"stem":178},"Figma","\u002Fdesign\u002Ffigma-structure","4.design\u002Ffigma-structure",{"title":159,"path":180,"stem":181},"\u002Fdesign\u002Ftools","4.design\u002Ftools",{"title":183,"path":184,"stem":185},"Customer Success","\u002Fdesign\u002Fworking-with-customers","4.design\u002Fworking-with-customers",{"title":187,"path":188,"stem":189,"children":190,"page":62},"Sales","\u002Fsales","4.sales",[191,195],{"title":192,"path":193,"stem":194},"Customer Onboarding","\u002Fsales\u002Fonboarding","4.sales\u002Fonboarding",{"title":196,"path":197,"stem":198},"Sales Tools","\u002Fsales\u002Ftools","4.sales\u002Ftools",{"title":200,"path":201,"stem":202,"children":203,"page":62},"Marketing","\u002Fmarketing","5.marketing",[204,208,212],{"title":205,"path":206,"stem":207},"Content","\u002Fmarketing\u002Fcontent","5.marketing\u002Fcontent",{"title":209,"path":210,"stem":211},"Messaging","\u002Fmarketing\u002Fmessaging","5.marketing\u002Fmessaging",{"title":213,"path":214,"stem":215},"Website","\u002Fmarketing\u002Fwebsite","5.marketing\u002Fwebsite",{"title":217,"path":218,"stem":219,"children":220,"page":62},"AI & Data Ops","\u002Fdata-ops","6.data-ops",[221,229,233,258,271],{"title":55,"path":222,"stem":223,"children":224,"page":62},"\u002Fdata-ops\u002Fcapability-exchange","6.data-ops\u002FCapability Exchange",[225],{"title":226,"path":227,"stem":228},"Leaderboard Calculation","\u002Fdata-ops\u002Fcapability-exchange\u002Fleaderboard-calculation","6.data-ops\u002FCapability Exchange\u002Fleaderboard-calculation",{"title":230,"path":231,"stem":232},"Account Portal (CAS)","\u002Fdata-ops\u002Faccount-portal","6.data-ops\u002Faccount-portal",{"title":234,"path":235,"stem":236,"children":237,"page":62},"Data Management","\u002Fdata-ops\u002Fdata-management","6.data-ops\u002Fdata-management",[238,242,246,250,254],{"title":239,"path":240,"stem":241},"Adding Products","\u002Fdata-ops\u002Fdata-management\u002Fadding-products","6.data-ops\u002Fdata-management\u002Fadding-products",{"title":243,"path":244,"stem":245},"Adding Vendors","\u002Fdata-ops\u002Fdata-management\u002Fadding-vendors","6.data-ops\u002Fdata-management\u002Fadding-vendors",{"title":247,"path":248,"stem":249},"Framework Mapping","\u002Fdata-ops\u002Fdata-management\u002Fframework-mapping","6.data-ops\u002Fdata-management\u002Fframework-mapping",{"title":251,"path":252,"stem":253},"Refreshing Vendors","\u002Fdata-ops\u002Fdata-management\u002Frefreshing-vendors","6.data-ops\u002Fdata-management\u002Frefreshing-vendors",{"title":255,"path":256,"stem":257},"Reviewing Draft Vendors","\u002Fdata-ops\u002Fdata-management\u002Freviewing-draft-vendors","6.data-ops\u002Fdata-management\u002Freviewing-draft-vendors",{"title":259,"path":260,"stem":261,"children":262,"page":62},"LLM Ops","\u002Fdata-ops\u002Fllm-ops","6.data-ops\u002Fllm-ops",[263,267],{"title":264,"path":265,"stem":266},"Agents","\u002Fdata-ops\u002Fllm-ops\u002Fagents","6.data-ops\u002Fllm-ops\u002F1.agents",{"title":268,"path":269,"stem":270},"ESPi Architecture & Query Flow","\u002Fdata-ops\u002Fllm-ops\u002Fespi-architecture","6.data-ops\u002Fllm-ops\u002F2.espi-architecture",{"title":272,"path":273,"stem":274},"Message Queues","\u002Fdata-ops\u002Fmessage-queues","6.data-ops\u002Fmessage-queues",{"title":276,"path":277,"stem":278},"Glossary","\u002Fglossary","glossary",{"id":280,"title":147,"body":281,"description":628,"extension":629,"links":630,"meta":631,"navigation":632,"path":148,"seo":633,"stem":149,"__hash__":634},"docs\u002F3.engineering\u002Fplatform-ops.md",{"type":282,"value":283,"toc":619},"minimark",[284,289,301,305,310,318,333,342,347,350,353,360,363,389,392,402,405,411,414,420,427,431,439,472,476,491,494,517,521,534,542,545,549,560,563,582,585,601,612],[285,286,288],"h2",{"id":287},"platform-tasks","Platform Tasks",[290,291,292,293,300],"p",{},"Often we will need to perform tasks on the platform as a platform admin, or even higher level, setting up tenants, etc. When we conduct these tasks, we should document them in GitHub as part of the ",[294,295,299],"a",{"href":296,"rel":297},"https:\u002F\u002Fgithub.com\u002FES-Profiler\u002Fadmin",[298],"nofollow","admin repository",". This ensures that the tasks are not forgotten and have clear ownership.",[285,302,304],{"id":303},"production-logs","Production Logs",[306,307,309],"h3",{"id":308},"posthog","PostHog",[290,311,312,313,317],{},"We use ",[294,314,309],{"href":315,"rel":316},"https:\u002F\u002Feu.posthog.com\u002Fproject\u002F118187",[298]," to track product usage across the platform. We use PostHog's \"Autocapture\" feature to capture product interaction, as well as emitting specific events from our backend to PostHog such as:",[319,320,321,328],"ul",{},[322,323,324],"li",{},[325,326,327],"code",{},"esp-capability-mapping-requested",[322,329,330],{},[325,331,332],{},"espi-message",[290,334,335,336,341],{},"You can view ",[294,337,340],{"href":338,"rel":339},"https:\u002F\u002Feu.posthog.com\u002Fproject\u002F118187\u002Factivity\u002Fexplore",[298],"PostHog Activity"," to see a raw list of all events captured.",[343,344,346],"h4",{"id":345},"report-tagging-and-taxonomy","Report tagging and taxonomy",[290,348,349],{},"We want to ensure we have consistent and resilient tagging on elements within the platform.",[290,351,352],{},"This allows us to follow a practical naming taxonomy giving confidence that changes to structures within the codebase will not affect our PostHog reporting, further allowing us to quickly determine how new elements should be named.",[290,354,355,356,359],{},"We use the ",[325,357,358],{},"data-"," attribute on HTML elements to ensure safe selection of objects.",[290,361,362],{},"These include:",[319,364,365,371,377,383],{},[322,366,367,370],{},[325,368,369],{},"data-nav"," - Tag elements that have a sole purpose of moving a user from one place to another. This is used for any navigation item in a side bar, tab or any of the primary navigation dropdown menus for switching team or user options.",[322,372,373,376],{},[325,374,375],{},"data-form"," - Identify particular form elements like text-input, textarea of dropdowns using this tag.",[322,378,379,382],{},[325,380,381],{},"data-action"," - Used to identify buttons that do not navigate, but instead complete an action. This could include submitting a form, or opening a dialog.",[322,384,385,388],{},[325,386,387],{},"data-el"," - A catch all for everything else, an element that we're likely going to want to capture, but doesn't fit into any of the other categories.",[290,390,391],{},"For the structure of the target object we propose:",[393,394,399],"pre",{"className":395,"code":397,"language":398},[396],"language-text","[area].[subject]-[element]\n","text",[325,400,397],{"__ignoreMap":401},"",[290,403,404],{},"This could be nested with:",[393,406,409],{"className":407,"code":408,"language":398},[396],"[area].[area].[subject]-[element]\n",[325,410,408],{"__ignoreMap":401},[290,412,413],{},"An example would be",[393,415,418],{"className":416,"code":417,"language":398},[396],"data-action=\"header.notifications-btn\"\n",[325,419,417],{"__ignoreMap":401},[290,421,422],{},[423,424],"img",{"alt":425,"src":426},"Examples of data-form and data-action tags on header elements","\u002Fimages\u002Fengineering\u002Fplatform-ops\u002Fposthog-taxonomy.png",[343,428,430],{"id":429},"posthog-actions","PostHog Actions",[290,432,433,434,438],{},"We can classify our self-defined events and autocapture  classified as ",[294,435,430],{"href":436,"rel":437},"https:\u002F\u002Feu.posthog.com\u002Fproject\u002F118187\u002Fdata-management\u002Factions",[298],", where you can select user interactions in the form of explicit events or other behaviours. The benefit here is that you might have multiple events (that occur in different parts of the application) that all classify as the same \"Action\". Examples of a PostHog action include:",[319,440,441,448,454,460,466],{},[322,442,443,447],{},[444,445,446],"strong",{},"Auth: Platform Login"," - Tracks when a user has logged into the platform.",[322,449,450,453],{},[444,451,452],{},"User Task: Create Task"," - Tracks when a user has created a new user task.",[322,455,456,459],{},[444,457,458],{},"ESPi: New Message"," - Tracks when a user has sent a message to ESPi.",[322,461,462,465],{},[444,463,464],{},"Portfolio: Map Capabilities"," - Tracks when a user has triggered a new mapping process for their portfolio.",[322,467,468,471],{},[444,469,470],{},"Agent Task: Start Task"," - Tracks when a user has started a new deep research\u002Fagent task.",[343,473,475],{"id":474},"integrations-posthog-destinations","Integrations: PostHog Destinations",[290,477,478,479,484,485,490],{},"We setup ",[294,480,483],{"href":481,"rel":482},"https:\u002F\u002Feu.posthog.com\u002Fproject\u002F118187\u002Fdata-management\u002Fdestinations",[298],"PostHog Destinations"," to automatically funnel events from PostHog out to other resources. We use Slack primarily here and report into the ",[294,486,489],{"href":487,"rel":488},"https:\u002F\u002Fesprofiler.slack.com\u002Farchives\u002FC0ANWSPAVEV",[298],"#ops-production"," channel.",[290,492,493],{},"If you want to start recording new events in Slack, add a new Destination. You can then define which events which you want to feed to the destination and the message format that is sent to Slack too. It is advised to follow conventions:",[319,495,496,505,511],{},[322,497,498,501,502],{},[444,499,500],{},"Bot Name:"," ",[325,503,504],{},"PostHog: Platform Ops",[322,506,507,510],{},[444,508,509],{},"Emoji Icon:"," Use an appropriate emoji that differentiates it from other event types.",[322,512,513,516],{},[444,514,515],{},"Trigger Options:"," This can be a useful tool to limit the notification traffic going into Slack. You can choose whether every action\u002Fevent triggers a message, or set intervals\u002Flimits, e.g. sending a notification just when a user sends their first ESPi message, rather than every message.",[306,518,520],{"id":519},"uptimerobot","UptimeRobot",[290,522,312,523,527,528,533],{},[294,524,520],{"href":525,"rel":526},"https:\u002F\u002Fuptimerobot.com\u002F",[298]," to monitor the uptime of both our tenants and services. We also have it set up to alert us to any outage via the Slack channel ",[294,529,532],{"href":530,"rel":531},"https:\u002F\u002Fesprofiler.slack.com\u002Farchives\u002FC0B7HR24Y49",[298],"#ops-uptime",".",[290,535,536,537,533],{},"For our public-facing websites and applications, we also have a publicly viewable ",[294,538,541],{"href":539,"rel":540},"https:\u002F\u002Fstatus.esprofiler.com\u002F",[298],"status page",[290,543,544],{},"In order to edit or add a new status check, you need to be granted access. Louis is the best person to ask; if he is not available, Rory or Joe can be contacted.",[343,546,548],{"id":547},"adding-a-new-monitor","Adding a New Monitor",[290,550,551,552,555,556,559],{},"Once you have access, you can view all of the current monitors by clicking on ",[325,553,554],{},"Louis Holt"," under the ",[325,557,558],{},"Your teams"," section in the left-hand navigation bar.",[290,561,562],{},"To add a new monitor, click the \"New Monitor\" button in the top right corner. Enter the URL you would like to monitor. Depending on whether you want to monitor a tenant or a service, the URL format will be different:",[319,564,565,574],{},[322,566,567,570,571],{},[444,568,569],{},"Tenant",": ",[325,572,573],{},"https:\u002F\u002F\u003Ctenant>.own.esprofiler.com\u002Fbootstrap",[322,575,576,570,579],{},[444,577,578],{},"Service",[325,580,581],{},"https:\u002F\u002Flogin.esprofiler.com\u002F\u003Cservice>\u002Fv1\u002Fact\u002Fhealth",[290,583,584],{},"The naming format is as follows:",[319,586,587,594],{},[322,588,589,570,591],{},[444,590,569],{},[325,592,593],{},"C | \u003CCustomer's Name>",[322,595,596,570,598],{},[444,597,578],{},[325,599,600],{},"P | \u003CService Name>",[290,602,603,604,607,608,611],{},"Next, select the ",[325,605,606],{},"Integrations & Team"," tab and select \"All\" for notifying team members. The ",[444,609,610],{},"most important"," thing is to ensure that the ESPROFILER Slack integration is selected, as this ensures that any outage gets notified on our Slack.",[290,613,614,615,618],{},"To finish, click ",[325,616,617],{},"Create monitor"," at the bottom of the page.",{"title":401,"searchDepth":620,"depth":620,"links":621},2,[622,623],{"id":287,"depth":620,"text":288},{"id":303,"depth":620,"text":304,"children":624},[625,627],{"id":308,"depth":626,"text":309},3,{"id":519,"depth":626,"text":520},"Everything you need to know about observability of ESProfiler, as well as reporting and handling issues as they arise with infrastructure and hosting.","md",null,{},true,{"title":147,"description":628},"JWEv6zTBAUmsgMawiLSrTcD5vuv1CgrVFWGqx4n0wJM",[636,638],{"title":143,"path":144,"stem":145,"description":637,"children":-1},"Reusable and centralised GitHub Actions workflows used across ESProfiler repositories.",{"title":151,"path":152,"stem":153,"description":639,"children":-1},"A comprehensive overview of project management processes and procedures that guide product development at ESProfiler.",1784892030535]