[{"data":1,"prerenderedAt":677},["ShallowReactive",2],{"navigation_docs":3,"-engineering-tools":348,"-engineering-tools-surround":673},[4,8,68,98,216,245,259,280,344],{"title":5,"path":6,"stem":7},"Introduction","\u002Fintroduction","0.introduction",{"title":9,"icon":10,"path":11,"stem":12,"children":13,"page":63},"Company","i-lucide-building-2","\u002Fcompany","1.company",[14,18,22,26,30,34,38,42,46,50,64],{"title":15,"path":16,"stem":17},"About","\u002Fcompany\u002Fabout","1.company\u002F0.about",{"title":19,"path":20,"stem":21},"Values","\u002Fcompany\u002Fvalues","1.company\u002F1.values",{"title":23,"path":24,"stem":25},"Communication","\u002Fcompany\u002Fcommunication","1.company\u002Fcommunication",{"title":27,"path":28,"stem":29},"Competition","\u002Fcompany\u002Fcompetition","1.company\u002Fcompetition",{"title":31,"path":32,"stem":33},"Hybrid Working","\u002Fcompany\u002Fhybrid-working","1.company\u002Fhybrid-working",{"title":35,"path":36,"stem":37},"Manchester Office","\u002Fcompany\u002Foffice","1.company\u002Foffice",{"title":39,"path":40,"stem":41},"Operations","\u002Fcompany\u002Foperations","1.company\u002Foperations",{"title":43,"path":44,"stem":45},"Policies","\u002Fcompany\u002Fpolicies","1.company\u002Fpolicies",{"title":47,"path":48,"stem":49},"Product Strategy","\u002Fcompany\u002Fproduct-strategy","1.company\u002Fproduct-strategy",{"title":51,"path":52,"stem":53,"children":54,"page":63},"Products","\u002Fcompany\u002Fproducts","1.company\u002Fproducts",[55,59],{"title":56,"path":57,"stem":58},"Capability Exchange","\u002Fcompany\u002Fproducts\u002Fcapability-exchange","1.company\u002Fproducts\u002Fcapability-exchange",{"title":60,"path":61,"stem":62},"ESProfiler Platform","\u002Fcompany\u002Fproducts\u002Fesprofiler","1.company\u002Fproducts\u002Fesprofiler",false,{"title":65,"path":66,"stem":67},"Security","\u002Fcompany\u002Fsecurity","1.company\u002Fsecurity",{"title":69,"icon":70,"path":71,"stem":72,"children":73,"page":63},"People Ops","i-lucide-users","\u002Fpeople-ops","2.people-ops",[74,78,82,86,90,94],{"title":75,"path":76,"stem":77},"Compensation","\u002Fpeople-ops\u002Fcompensation","2.people-ops\u002Fcompensation",{"title":79,"path":80,"stem":81},"Education","\u002Fpeople-ops\u002Feducation","2.people-ops\u002Feducation",{"title":83,"path":84,"stem":85},"Expenses","\u002Fpeople-ops\u002Fexpenses","2.people-ops\u002Fexpenses",{"title":87,"path":88,"stem":89},"Holiday & Leave","\u002Fpeople-ops\u002Fleave","2.people-ops\u002Fleave",{"title":91,"path":92,"stem":93},"Onboarding","\u002Fpeople-ops\u002Fonboarding","2.people-ops\u002Fonboarding",{"title":95,"path":96,"stem":97},"Recruitment","\u002Fpeople-ops\u002Frecruitment","2.people-ops\u002Frecruitment",{"title":99,"icon":100,"path":101,"stem":102,"children":103,"page":63},"Engineering","i-lucide-rocket","\u002Fengineering","3.engineering",[104,147,151,171,192,196,204,208,212],{"title":105,"path":106,"stem":107,"children":108,"page":63},"Contributing","\u002Fengineering\u002Fcontributing","3.engineering\u002Fcontributing",[109,113,117,121,125,138],{"title":110,"path":111,"stem":112},"Development Setup","\u002Fengineering\u002Fcontributing\u002Fdevelopment-setup","3.engineering\u002Fcontributing\u002F1.development-setup",{"title":114,"path":115,"stem":116},"Engineering Operations","\u002Fengineering\u002Fcontributing\u002Fengineering-operations","3.engineering\u002Fcontributing\u002F2.engineering-operations",{"title":118,"path":119,"stem":120},"Documentation","\u002Fengineering\u002Fcontributing\u002Fdocumentation","3.engineering\u002Fcontributing\u002F3.documentation",{"title":122,"path":123,"stem":124},"Agentic Coding","\u002Fengineering\u002Fcontributing\u002Fagentic-coding","3.engineering\u002Fcontributing\u002Fagentic-coding",{"title":126,"path":127,"stem":128,"children":129,"page":63},"Back End","\u002Fengineering\u002Fcontributing\u002Fback-end","3.engineering\u002Fcontributing\u002Fback-end",[130,134],{"title":131,"path":132,"stem":133},"API Guidelines","\u002Fengineering\u002Fcontributing\u002Fback-end\u002Fapi-guidelines","3.engineering\u002Fcontributing\u002Fback-end\u002Fapi-guidelines",{"title":135,"path":136,"stem":137},"LLM Prompts & Langfuse Integration","\u002Fengineering\u002Fcontributing\u002Fback-end\u002Fllm-prompts","3.engineering\u002Fcontributing\u002Fback-end\u002Fllm-prompts",{"title":139,"path":140,"stem":141,"children":142,"page":63},"Front End","\u002Fengineering\u002Fcontributing\u002Ffront-end","3.engineering\u002Fcontributing\u002Ffront-end",[143],{"title":144,"path":145,"stem":146},"Testing","\u002Fengineering\u002Fcontributing\u002Ffront-end\u002Ftesting","3.engineering\u002Fcontributing\u002Ffront-end\u002Ftesting",{"title":148,"path":149,"stem":150},"Production Database","\u002Fengineering\u002Fdatabase-connection","3.engineering\u002Fdatabase-connection",{"title":152,"path":153,"stem":154,"children":155},"Deployment","\u002Fengineering\u002Fdeployment","3.engineering\u002Fdeployment",[156,159,163,167],{"title":56,"path":157,"stem":158},"\u002Fengineering\u002Fdeployment\u002Fcapability-exchange","3.engineering\u002Fdeployment\u002Fcapability-exchange",{"title":160,"path":161,"stem":162},"Langfuse Deployment","\u002Fengineering\u002Fdeployment\u002Fecs-langfuse-deployment","3.engineering\u002Fdeployment\u002Fecs-langfuse-deployment",{"title":164,"path":165,"stem":166},"ESP Platform Configuration","\u002Fengineering\u002Fdeployment\u002Fesp-platform-configuration","3.engineering\u002Fdeployment\u002Fesp-platform-configuration",{"title":168,"path":169,"stem":170},"Platform","\u002Fengineering\u002Fdeployment\u002Fplatform","3.engineering\u002Fdeployment\u002Fplatform",{"title":172,"path":173,"stem":174,"children":175,"page":63},"Github","\u002Fengineering\u002Fgithub","3.engineering\u002Fgithub",[176,180,184,188],{"title":177,"path":178,"stem":179},"Packages","\u002Fengineering\u002Fgithub\u002Fpackages","3.engineering\u002Fgithub\u002Fpackages",{"title":181,"path":182,"stem":183},"Personal Access Token","\u002Fengineering\u002Fgithub\u002Fpersonal-access-token","3.engineering\u002Fgithub\u002Fpersonal-access-token",{"title":185,"path":186,"stem":187},"Troubleshooting","\u002Fengineering\u002Fgithub\u002Ftroubleshooting","3.engineering\u002Fgithub\u002Ftroubleshooting",{"title":189,"path":190,"stem":191},"Workflows","\u002Fengineering\u002Fgithub\u002Fworkflows","3.engineering\u002Fgithub\u002Fworkflows",{"title":193,"path":194,"stem":195},"Platform Ops","\u002Fengineering\u002Fplatform-ops","3.engineering\u002Fplatform-ops",{"title":168,"path":197,"stem":198,"children":199,"page":63},"\u002Fengineering\u002Fplatform","3.engineering\u002Fplatform",[200],{"title":201,"path":202,"stem":203},"useAPI","\u002Fengineering\u002Fplatform\u002Fuse-api","3.engineering\u002Fplatform\u002Fuse-api",{"title":205,"path":206,"stem":207},"Project Management","\u002Fengineering\u002Fproject-management","3.engineering\u002Fproject-management",{"title":209,"path":210,"stem":211},"Releases","\u002Fengineering\u002Frelease","3.engineering\u002Frelease",{"title":213,"path":214,"stem":215},"Tools","\u002Fengineering\u002Ftools","3.engineering\u002Ftools",{"title":217,"icon":218,"path":219,"stem":220,"children":221,"page":63},"Design","i-lucide-palette","\u002Fdesign","4.design",[222,226,230,234,238,241],{"title":223,"path":224,"stem":225},"Design Thinking","\u002Fdesign\u002Fdesign-thinking","4.design\u002F1.design-thinking",{"title":227,"path":228,"stem":229},"Figma","\u002Fdesign\u002Ffigma-structure","4.design\u002F2.figma-structure",{"title":231,"path":232,"stem":233},"Design & Development","\u002Fdesign\u002Fdesign-and-development","4.design\u002F3.design-and-development",{"title":235,"path":236,"stem":237},"Branding","\u002Fdesign\u002Fbranding","4.design\u002F4.branding",{"title":213,"path":239,"stem":240},"\u002Fdesign\u002Ftools","4.design\u002F5.tools",{"title":242,"path":243,"stem":244},"Customer Success","\u002Fdesign\u002Fworking-with-customers","4.design\u002F6.working-with-customers",{"title":246,"icon":247,"path":248,"stem":249,"children":250,"page":63},"Sales","i-lucide-dollar-sign","\u002Fsales","4.sales",[251,255],{"title":252,"path":253,"stem":254},"Customer Onboarding","\u002Fsales\u002Fonboarding","4.sales\u002Fonboarding",{"title":256,"path":257,"stem":258},"Sales Tools","\u002Fsales\u002Ftools","4.sales\u002Ftools",{"title":260,"icon":261,"path":262,"stem":263,"children":264,"page":63},"Marketing","i-lucide-book-image","\u002Fmarketing","5.marketing",[265,269,273,276],{"title":266,"path":267,"stem":268},"Content","\u002Fmarketing\u002Fcontent","5.marketing\u002Fcontent",{"title":270,"path":271,"stem":272},"Messaging","\u002Fmarketing\u002Fmessaging","5.marketing\u002Fmessaging",{"title":213,"path":274,"stem":275},"\u002Fmarketing\u002Ftools","5.marketing\u002Ftools",{"title":277,"path":278,"stem":279},"Website","\u002Fmarketing\u002Fwebsite","5.marketing\u002Fwebsite",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":63},"AI & Data Ops","i-lucide-database","\u002Fdata-ops","6.data-ops",[286,294,298,323,340],{"title":56,"path":287,"stem":288,"children":289,"page":63},"\u002Fdata-ops\u002Fcapability-exchange","6.data-ops\u002FCapability Exchange",[290],{"title":291,"path":292,"stem":293},"Leaderboard Calculation","\u002Fdata-ops\u002Fcapability-exchange\u002Fleaderboard-calculation","6.data-ops\u002FCapability Exchange\u002Fleaderboard-calculation",{"title":295,"path":296,"stem":297},"Account Portal (CAS)","\u002Fdata-ops\u002Faccount-portal","6.data-ops\u002Faccount-portal",{"title":299,"path":300,"stem":301,"children":302,"page":63},"Data Management","\u002Fdata-ops\u002Fdata-management","6.data-ops\u002Fdata-management",[303,307,311,315,319],{"title":304,"path":305,"stem":306},"Adding Products","\u002Fdata-ops\u002Fdata-management\u002Fadding-products","6.data-ops\u002Fdata-management\u002Fadding-products",{"title":308,"path":309,"stem":310},"Adding Vendors","\u002Fdata-ops\u002Fdata-management\u002Fadding-vendors","6.data-ops\u002Fdata-management\u002Fadding-vendors",{"title":312,"path":313,"stem":314},"Framework Mapping","\u002Fdata-ops\u002Fdata-management\u002Fframework-mapping","6.data-ops\u002Fdata-management\u002Fframework-mapping",{"title":316,"path":317,"stem":318},"Refreshing Vendors","\u002Fdata-ops\u002Fdata-management\u002Frefreshing-vendors","6.data-ops\u002Fdata-management\u002Frefreshing-vendors",{"title":320,"path":321,"stem":322},"Reviewing Draft Vendors","\u002Fdata-ops\u002Fdata-management\u002Freviewing-draft-vendors","6.data-ops\u002Fdata-management\u002Freviewing-draft-vendors",{"title":324,"path":325,"stem":326,"children":327,"page":63},"LLM Ops","\u002Fdata-ops\u002Fllm-ops","6.data-ops\u002Fllm-ops",[328,332,336],{"title":329,"path":330,"stem":331},"Agents","\u002Fdata-ops\u002Fllm-ops\u002Fagents","6.data-ops\u002Fllm-ops\u002F1.agents",{"title":333,"path":334,"stem":335},"ESPi Architecture & Query Flow","\u002Fdata-ops\u002Fllm-ops\u002Fespi-architecture","6.data-ops\u002Fllm-ops\u002F2.espi-architecture",{"title":337,"path":338,"stem":339},"Evaluating Agents","\u002Fdata-ops\u002Fllm-ops\u002Fevaluations","6.data-ops\u002Fllm-ops\u002F3.evaluations",{"title":341,"path":342,"stem":343},"Message Queues","\u002Fdata-ops\u002Fmessage-queues","6.data-ops\u002Fmessage-queues",{"title":345,"path":346,"stem":347},"Glossary","\u002Fglossary","glossary",{"id":349,"title":213,"body":350,"description":666,"extension":667,"links":668,"meta":669,"navigation":670,"path":214,"seo":671,"stem":215,"__hash__":672},"docs\u002F3.engineering\u002Ftools.md",{"type":351,"value":352,"toc":653},"minimark",[353,358,368,372,381,385,388,401,405,408,412,420,426,433,436,442,447,453,457,460,468,473,478,483,486,503,506,512,516,519,566,569,576,582,586,590],[354,355,357],"h2",{"id":356},"project-management-github-projects","Project Management - GitHub Projects",[359,360,361,362,367],"p",{},"We use ",[363,364,366],"a",{"href":365},".\u002Fproject-management#github-projects","GitHub Projects"," as our project management software. We use it for tracking development work across sprints, backlogs, creating timeline views and defining our future roadmap.",[354,369,371],{"id":370},"code-version-control-github","Code Version Control - GitHub",[359,373,374,380],{},[363,375,379],{"href":376,"rel":377},"https:\u002F\u002Fgithub.com\u002FES-Profiler",[378],"nofollow","GitHub"," is our code version control software. We use it for tracking changes to our codebase, managing our repositories and to automate our CI\u002FCD pipeline.",[354,382,384],{"id":383},"integrated-development-environment-ide","Integrated Development Environment (IDE)",[359,386,387],{},"We have a few recommendations and options that the development team can use for their local development environments:",[389,390,391,395,398],"ul",{},[392,393,394],"li",{},"JetBrains\u002FWebStorm",[392,396,397],{},"Cursor",[392,399,400],{},"Antigravity",[354,402,404],{"id":403},"agentic-ai","Agentic AI",[359,406,407],{},"At ESProfiler we encourage the use of innovative tools to help us with our work, including Agentic AI. We have a few recommendations and options that the development team can use for their local development environments:",[409,410,397],"h3",{"id":411},"cursor",[359,413,414,415,419],{},"In Cursor, you ",[416,417,418],"em",{},"must"," ensure that \"Privacy Mode\" is toggled on. This ensures that none of our code base is shared with Cursor, or the underlying models for further training. You can find this option in:",[421,422,423],"blockquote",{},[359,424,425],{},"File > Preferences > Cursor Settings > General > Privacy",[359,427,428],{},[429,430],"img",{"alt":431,"src":432},"Cursor Privacy Mode","\u002Fimages\u002Fengineering\u002Fcursor-privacy-settings.png",[409,434,400],{"id":435},"antigravity",[359,437,438,439,441],{},"In Antigravity, you ",[416,440,418],{}," ensure that \"Enable Telemetry\" is toggled off. This ensures that none of our code base is shared with Antigravity, or the underlying models for further training. You can find this option in:",[421,443,444],{},[359,445,446],{},"Settings > Account > Enable Telemetry",[359,448,449],{},[429,450],{"alt":451,"src":452},"Antigravity Telemetry","\u002Fimages\u002Fengineering\u002Fantigravity-telemetry-settings.png",[409,454,456],{"id":455},"openai-codex","OpenAI Codex",[359,458,459],{},"OpenAI Codex licenses are granted by Louis Holt.",[359,461,462,463,467],{},"The local download for the Windows desktop app is located at ",[464,465,466],"code",{},"G:\\Shared drives\\ESP Common\\Onboarding\\Software",".",[359,469,470],{},[429,471],{"alt":456,"src":472},"\u002Fimages\u002Fengineering\u002Fopenai-codex.png",[474,475,477],"h4",{"id":476},"local-platform-setup-with-codex","Local Platform Setup with Codex",[479,480,482],"h5",{"id":481},"prepare-the-docker-compose-stack","Prepare the Docker Compose stack",[359,484,485],{},"Start the Docker Compose development stack, then stop the following three containers in Docker Desktop because they will be run locally through Codex:",[389,487,488,493,498],{},[392,489,490],{},[464,491,492],{},"platform-frontend",[392,494,495],{},[464,496,497],{},"platform-api",[392,499,500],{},[464,501,502],{},"api-iengine-runner",[359,504,505],{},"Leave the remaining containers running so that the local applications can use the services they depend on.",[359,507,508],{},[429,509],{"alt":510,"src":511},"Docker Compose stack with the Platform containers stopped","\u002Fimages\u002Fengineering\u002Fcodex-docker-setup.jpg",[479,513,515],{"id":514},"set-up-the-terminals-and-browser","Set up the terminals and browser",[359,517,518],{},"When working on the Platform locally, open the parent workspace that contains the Platform repositories in Codex. Create three integrated terminal tabs and point each one at a different repository:",[520,521,522,535],"table",{},[523,524,525],"thead",{},[526,527,528,532],"tr",{},[529,530,531],"th",{},"Terminal",[529,533,534],{},"Working directory",[536,537,538,548,557],"tbody",{},[526,539,540,544],{},[541,542,543],"td",{},"Frontend",[541,545,546],{},[464,547,492],{},[526,549,550,553],{},[541,551,552],{},"Platform API",[541,554,555],{},[464,556,497],{},[526,558,559,562],{},[541,560,561],{},"iEngine runner",[541,563,564],{},[464,565,502],{},[359,567,568],{},"Start each application's usual local development process in its terminal and keep all three terminals running. This allows Codex to inspect the output from each part of the Platform while you work.",[359,570,571,572,575],{},"Once the frontend build is running, open Codex's integrated browser and navigate to ",[464,573,574],{},"http:\u002F\u002F127.0.0.1:9990",". The browser will display the local Platform build and can be used to test changes alongside the terminal output.",[359,577,578],{},[429,579],{"alt":580,"src":581},"Codex terminals and integrated browser configured for local Platform development","\u002Fimages\u002Fengineering\u002Fcodex-terminal-setup.jpg",[474,583,585],{"id":584},"platform-authentication-within-codex-browser","Platform authentication within Codex browser",[587,588,589],"tip",{},"This authentication issue should now be resolved. If authentication still does not work automatically, follow the guidance below.",[591,592,593,603,619,632,644],"ol",{},[392,594,595,596,599],{},"Get the Session ID from the Admin Console.",[597,598],"br",{},[429,600],{"alt":601,"src":602},"Copy the Session ID from the Admin Console","\u002Fimages\u002Fengineering\u002Fcodex-auth-01.jpg",[392,604,605,606,608,609,467,613,615],{},"Open the local browser in Codex, go to ",[464,607,574],{},", and click ",[610,611,612],"strong",{},"Authenticate",[597,614],{},[429,616],{"alt":617,"src":618},"Open the local application in the Codex browser and select Authenticate","\u002Fimages\u002Fengineering\u002Fcodex-auth-02.jpg",[392,620,621,622,625,626,628],{},"Open the developer tools for the authentication iframe that appears and find the ",[464,623,624],{},"ESPSESSIONID"," cookie.",[597,627],{},[429,629],{"alt":630,"src":631},"Open the authentication iframe in the Codex browser","\u002Fimages\u002Fengineering\u002Fcodex-auth-03.jpg",[392,633,634,635,467,638,640],{},"Replace the cookie value with the Session ID copied from the Admin Console and press ",[610,636,637],{},"Enter",[597,639],{},[429,641],{"alt":642,"src":643},"Replace the ESPSESSIONID cookie in the authentication iframe","\u002Fimages\u002Fengineering\u002Fcodex-auth-04.jpg",[392,645,646,647,649],{},"Close the developer tools, exit the iframe, and refresh the local browser page. You should now be authenticated.",[597,648],{},[429,650],{"alt":651,"src":652},"Authenticated application in the Codex browser","\u002Fimages\u002Fengineering\u002Fcodex-auth-05.jpg",{"title":654,"searchDepth":655,"depth":655,"links":656},"",2,[657,658,659,660],{"id":356,"depth":655,"text":357},{"id":370,"depth":655,"text":371},{"id":383,"depth":655,"text":384},{"id":403,"depth":655,"text":404,"children":661},[662,664,665],{"id":411,"depth":663,"text":397},3,{"id":435,"depth":663,"text":400},{"id":455,"depth":663,"text":456},"Recommended tooling we use in the Engineering organisation, and if required, how to go about requesting licenses.","md",null,{},true,{"title":213,"description":666},"o_9JmLtCxxd8FOuJVn5RGJ9wUmuAuZ8dsK_eIWjrdUE",[674,676],{"title":209,"path":210,"stem":211,"description":675,"children":-1},"This guide will walk you through the process of releasing a new version of the backend services or frontend applications and websites.",{"title":223,"path":224,"stem":225,"description":654,"children":-1},1789726606043]