[{"data":1,"prerenderedAt":4290},["ShallowReactive",2],{"navigation_docs":3,"-engineering-deployment-esp-platform-configuration":348,"-engineering-deployment-esp-platform-configuration-surround":4285},[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":164,"body":350,"description":4279,"extension":4280,"links":4281,"meta":4282,"navigation":1248,"path":165,"seo":4283,"stem":166,"__hash__":4284},"docs\u002F3.engineering\u002Fdeployment\u002Fesp-platform-configuration.md",{"type":351,"value":352,"toc":4241},"minimark",[353,365,380,383,388,391,401,406,490,507,509,513,516,522,526,529,564,568,571,609,613,619,664,668,671,729,733,736,783,787,790,808,820,824,827,897,901,904,934,936,940,956,962,966,1320,1325,1375,1379,1385,1505,1515,1517,1521,1524,1719,1774,1776,1780,1783,1946,1964,1966,1970,1975,2100,2113,2115,2119,2133,2137,2391,2395,2729,2733,3007,3009,3013,3016,3020,3436,3440,3443,3847,3851,3854,4123,4125,4129,4133,4158,4162,4189,4193,4219,4223,4237],[354,355,356,357,364],"p",{},"The ",[358,359,360],"strong",{},[361,362,363],"code",{},"esp-platform"," application is the core backend API for ESProfiler tenant deployments. It is built on Java and Spring Boot, managing tenant databases, distributed background tasks, integrations with central microservices, and AI-driven intelligence engines.",[354,366,367,368,371,372,375,376,379],{},"This guide provides a comprehensive breakdown of ",[361,369,370],{},"application.yml"," and its environment profiles (",[361,373,374],{},"application-dev.yml",", ",[361,377,378],{},"application-hop.yml","), explaining how each configuration section works, how properties map to environment variables in AWS ECS \u002F production deployments, and how individual tenants can be tailored for compliance, branding, feature entitlements, and security.",[381,382],"hr",{},[384,385,387],"h2",{"id":386},"configuration-architecture-resolution-order","Configuration Architecture & Resolution Order",[354,389,390],{},"Spring Boot resolves configuration properties hierarchically. Values defined higher in the list override lower values:",[392,393,398],"pre",{"className":394,"code":396,"language":397},[395],"language-text","┌────────────────────────────────────────────────────────┐\n│  1. System Environment Variables (AWS ECS \u002F Container) │  (Highest priority)\n├────────────────────────────────────────────────────────┤\n│  2. Active Profile Config (e.g. application-dev.yml)   │\n├────────────────────────────────────────────────────────┤\n│  3. Base Application Config (application.yml)          │  (Lowest priority)\n└────────────────────────────────────────────────────────┘\n","text",[361,399,396],{"__ignoreMap":400},"",[402,403,405],"h3",{"id":404},"active-profiles","Active Profiles",[407,408,409,425],"table",{},[410,411,412],"thead",{},[413,414,415,419,422],"tr",{},[416,417,418],"th",{},"Profile",[416,420,421],{},"File",[416,423,424],{},"Purpose",[426,427,428,446,474],"tbody",{},[413,429,430,439,443],{},[431,432,433,438],"td",{},[358,434,435],{},[361,436,437],{},"default"," (Production)",[431,440,441],{},[361,442,370],{},[431,444,445],{},"Production-grade defaults. References environment variables for sensitive credentials, database endpoints, and tenant-specific domains.",[413,447,448,455,459],{},[431,449,450],{},[358,451,452],{},[361,453,454],{},"dev",[431,456,457],{},[361,458,374],{},[431,460,461,462,465,466,469,470,473],{},"Local developer workstation setup. Points to local Docker container ports (e.g. MySQL on ",[361,463,464],{},"33306",", Postgres on ",[361,467,468],{},"25432","), local SPA server (",[361,471,472],{},"9990","), and local central service ports.",[413,475,476,483,487],{},[431,477,478],{},[358,479,480],{},[361,481,482],{},"hop",[431,484,485],{},[361,486,378],{},[431,488,489],{},"TLS\u002FSSL keystore configurations for staging and isolated host environments.",[491,492,494,495,498,499,502,503,506],"callout",{"icon":493},"i-lucide-info","To activate a profile when launching locally or in staging, set the ",[361,496,497],{},"SPRING_PROFILES_ACTIVE"," environment variable (e.g., ",[361,500,501],{},"export SPRING_PROFILES_ACTIVE=dev"," or ",[361,504,505],{},"$env:SPRING_PROFILES_ACTIVE=\"dev\"",").",[381,508],{},[384,510,512],{"id":511},"tenant-customization-configuration-levers","Tenant Customization & Configuration Levers",[354,514,515],{},"In production, each ESProfiler customer runs on a dedicated, isolated ECS service and database instance. You customize each tenant's behavior, branding, security boundaries, and feature set through environment variables injected into the tenant's ECS task definition.",[392,517,520],{"className":518,"code":519,"language":397},[395],"                    ┌────────────────────────────────────────┐\n                    │       Tenant ECS Task Definition       │\n                    └───────────────────┬────────────────────┘\n                                        │\n     ┌──────────────────┬───────────────┴───────────────┬──────────────────┐\n     ▼                  ▼                               ▼                  ▼\n┌──────────────┐ ┌──────────────┐              ┌──────────────┐ ┌──────────────────┐\n│   Identity   │ │  Compliance  │              │ Feature Set  │ │ Privacy & AI     │\n│  & Routing   │ │  & Notices   │              │ Entitlements │ │ Observability    │\n├──────────────┤ ├──────────────┤              ├──────────────┤ ├──────────────────┤\n│Domain \u002F Alias│ │Legal Banner  │              │Commercial    │ │Trace Redaction   │\n│Client UUID   │ │Currency \u002F VAT│              │Threat Engine │ │PostHog Analytics │\n│TLS & Port    │ │S3 File Store │              │Deep Research │ │Gap Sensitivity   │\n└──────────────┘ └──────────────┘              └──────────────┘ └──────────────────┘\n",[361,521,519],{"__ignoreMap":400},[402,523,525],{"id":524},"_1-identity-domain-cas-single-sign-on","1. Identity, Domain & CAS Single Sign-On",[354,527,528],{},"Each tenant has a unique hostname and OAuth2 client registration within the Central Authentication Service (CAS):",[530,531,532,548,556],"ul",{},[533,534,535,540,541,544,545,506],"li",{},[358,536,537],{},[361,538,539],{},"ESP_EXTERNAL_DOMAIN",": The vanity domain used by end users to access the platform (e.g., ",[361,542,543],{},"acme.own.esprofiler.com"," or custom enterprise domain ",[361,546,547],{},"security.acme.com",[533,549,550,555],{},[358,551,552],{},[361,553,554],{},"ESP_CLIENT_ID",": The OAuth2 Client UUID registered in CAS representing this tenant instance.",[533,557,558,563],{},[358,559,560],{},[361,561,562],{},"ESP_SECURITY_ORGANISATION_ALIAS",": The organization slug in CAS used to route authentication to the customer's specific identity provider (e.g. Okta, Azure AD, Google Workspace).",[402,565,567],{"id":566},"_2-ui-pinning-custom-compliance-notices","2. UI Pinning & Custom Compliance Notices",[354,569,570],{},"The Single Page Application (SPA) delivery and login compliance banners can be tailored per tenant:",[530,572,573,585,601],{},[533,574,575,580,581,584],{},[358,576,577],{},[361,578,579],{},"ESP_SPA_TARGET_VERSION",": Allows pinning a tenant to a specific frontend release (e.g., ",[361,582,583],{},"v3-9-12",") for enterprise change-freeze windows, or leaving it blank\u002Fdynamic to track latest releases.",[533,586,587,592,593,596,597,600],{},[358,588,589],{},[361,590,591],{},"ESP_SPA_SHOW_NOTICE"," (",[361,594,595],{},"true","\u002F",[361,598,599],{},"false","): Controls whether a mandatory legal disclaimer is presented before users can interact with the system.",[533,602,603,608],{},[358,604,605],{},[361,606,607],{},"ESP_SPA_NOTICE_MESSAGE",": Custom legal text (e.g. UK Computer Misuse Act 1990, US DoD system banners, or company-specific Acceptable Use Policies).",[402,610,612],{"id":611},"_3-tenant-feature-entitlements-module-toggles","3. Tenant Feature Entitlements & Module Toggles",[354,614,615,616,618],{},"Contract tiers dictate which platform modules are enabled for a tenant. Set any of these to ",[361,617,599],{}," to restrict access:",[392,620,624],{"className":621,"code":622,"language":623,"meta":400,"style":400},"language-properties shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ESP_MODULES_ENABLED_COMMERCIAL=true        # Vendor spend, contract renewal & cost analysis\nESP_MODULES_ENABLED_I_ENGINE=true          # AI Intelligence Engine & recommendations\nESP_MODULES_ENABLED_USER_ASSERTIONS=true   # User verification audits & control assertions\nESP_MODULES_ENABLED_VENDOR_REQUEST=true    # Vendor security assessment request workflows\nESP_MODULES_ENABLED_THREAT_ANALYTICS=true  # Threat intelligence & MITRE ATT&CK mappings\nESP_MODULES_ENABLED_DEEP_RESEARCH=true     # Autonomous agentic deep research capabilities\n","properties",[361,625,626,634,640,646,652,658],{"__ignoreMap":400},[627,628,631],"span",{"class":629,"line":630},"line",1,[627,632,633],{},"ESP_MODULES_ENABLED_COMMERCIAL=true        # Vendor spend, contract renewal & cost analysis\n",[627,635,637],{"class":629,"line":636},2,[627,638,639],{},"ESP_MODULES_ENABLED_I_ENGINE=true          # AI Intelligence Engine & recommendations\n",[627,641,643],{"class":629,"line":642},3,[627,644,645],{},"ESP_MODULES_ENABLED_USER_ASSERTIONS=true   # User verification audits & control assertions\n",[627,647,649],{"class":629,"line":648},4,[627,650,651],{},"ESP_MODULES_ENABLED_VENDOR_REQUEST=true    # Vendor security assessment request workflows\n",[627,653,655],{"class":629,"line":654},5,[627,656,657],{},"ESP_MODULES_ENABLED_THREAT_ANALYTICS=true  # Threat intelligence & MITRE ATT&CK mappings\n",[627,659,661],{"class":629,"line":660},6,[627,662,663],{},"ESP_MODULES_ENABLED_DEEP_RESEARCH=true     # Autonomous agentic deep research capabilities\n",[402,665,667],{"id":666},"_4-localization-currency-management","4. Localization & Currency Management",[354,669,670],{},"Multi-national tenants can define their base reporting currency:",[530,672,673,699,713],{},[533,674,675,680,681,375,684,375,687,375,690,375,693,375,696,506],{},[358,676,677],{},[361,678,679],{},"ESP_CURRENCY_TARGET",": Target reporting currency for commercial spend aggregation (e.g., ",[361,682,683],{},"GBP",[361,685,686],{},"USD",[361,688,689],{},"EUR",[361,691,692],{},"AUD",[361,694,695],{},"CAD",[361,697,698],{},"JPY",[533,700,701,706,707,375,710,506],{},[358,702,703],{},[361,704,705],{},"ESP_CURRENCY_EXCHANGE_PROVIDERS",": Feed providers for live exchange rate calculations (e.g. ",[361,708,709],{},"ECB",[361,711,712],{},"IMF",[533,714,715,720,721,724,725,728],{},[358,716,717],{},[361,718,719],{},"ESP_COST_CALCULATION_ANNUAL_DAYS_MULTIPLIER",": Default is ",[361,722,723],{},"365.25"," for leap-year adjusted amortization, or set to ",[361,726,727],{},"365.0"," for standard non-leap calculations.",[402,730,732],{"id":731},"_5-file-storage-isolation-local-vs-s3","5. File Storage Isolation (Local vs S3)",[354,734,735],{},"Tenants can upload vendor documents, evidence files, and report attachments to dedicated S3 buckets:",[530,737,738,754,769],{},[533,739,740,745,746,749,750,753],{},[358,741,742],{},[361,743,744],{},"ESP_FILE_MODE",": ",[361,747,748],{},"S3"," (production) or ",[361,751,752],{},"LOCAL"," (development\u002Ftesting).",[533,755,756,761,762,765,766,506],{},[358,757,758],{},[361,759,760],{},"ESP_FILE_S3_BUCKET_NAME",": S3 bucket name (e.g. ",[361,763,764],{},"customer.esprofiler.com"," or a dedicated tenant bucket ",[361,767,768],{},"esprofiler-tenant-acme-eu-west-2",[533,770,771,776,777,375,780,506],{},[358,772,773],{},[361,774,775],{},"ESP_FILE_S3_REGION",": AWS Region hosting the bucket (e.g. ",[361,778,779],{},"eu-west-2",[361,781,782],{},"us-east-1",[402,784,786],{"id":785},"_6-cryptographic-salt-integration-secret-storage","6. Cryptographic Salt & Integration Secret Storage",[354,788,789],{},"The platform stores integration API keys (e.g., CrowdStrike, Splunk, Tenable, Sentinel) in an encrypted table using AES-256-GCM:",[530,791,792,800],{},[533,793,794,799],{},[358,795,796],{},[361,797,798],{},"ESP_SECRETS_PASSWORD",": Master encryption key for the tenant's credential vault.",[533,801,802,807],{},[358,803,804],{},[361,805,806],{},"ESP_SECRETS_SALT",": A unique, per-tenant 32-character hexadecimal salt string.",[491,809,811,814,815,502,817,819],{"icon":810},"i-lucide-triangle-alert",[358,812,813],{},"Cryptographic Integrity:","\nNever reuse ",[361,816,798],{},[361,818,806],{}," across different tenants. If either value is lost or modified after credentials have been saved, existing stored integration secrets cannot be decrypted.",[402,821,823],{"id":822},"_7-ai-privacy-telemetry-intelligence-sensitivity","7. AI Privacy, Telemetry & Intelligence Sensitivity",[354,825,826],{},"Depending on tenant data governance requirements (e.g., GDPR, HIPAA, banking secrecy), telemetry and LLM interaction capture can be adjusted:",[530,828,829,857,868,880],{},[533,830,831,836,837],{},[358,832,833],{},[361,834,835],{},"ESP_LLM_OBSERVATION_CONTENT_CAPTURE_MODE",":\n",[530,838,839,845,851],{},[533,840,841,844],{},[361,842,843],{},"FULL",": Standard mode — captures full prompt text, AI responses, and reasoning traces into Langfuse for analysis.",[533,846,847,850],{},[361,848,849],{},"REDACTED",": Automatically redacts personal identifying information (PII) and tenant identifiers from LLM traces.",[533,852,853,856],{},[361,854,855],{},"METADATA_ONLY",": Exports strictly execution latencies, token counts, and HTTP status codes without recording any prompt or completion text.",[533,858,859,864,865,867],{},[358,860,861],{},[361,862,863],{},"ESP_NOTIFICATION_POSTHOG_ENABLED",": Set to ",[361,866,599],{}," for tenants requiring complete opt-out from frontend product telemetry.",[533,869,870,875,876,879],{},[358,871,872],{},[361,873,874],{},"ESP_INTELLIGENCE_STACK_GAP_PHANTOM_THRESHOLD",": Threshold (default ",[361,877,878],{},"0.7"," = 70%) below which a mapped capability with low product utilization is flagged as a \"phantom gap\".",[533,881,882,887,888,375,891,375,894,506],{},[358,883,884],{},[361,885,886],{},"ESP_LANGFUSE_PROMPTS_LABEL",": Selects the prompt bundle label to fetch from Langfuse (e.g., ",[361,889,890],{},"production",[361,892,893],{},"enterprise-v2",[361,895,896],{},"canary",[402,898,900],{"id":899},"_8-custom-gcp-project-bring-your-own-cloud-byoc-ai","8. Custom GCP Project (Bring Your Own Cloud \u002F BYOC AI)",[354,902,903],{},"For enterprise tenants who mandate running Gemini \u002F Vertex AI through their own GCP billing project:",[530,905,906,914,926],{},[533,907,908,913],{},[358,909,910],{},[361,911,912],{},"ESP_GCP_PROJECT_ID",": The customer-owned GCP Project ID.",[533,915,916,921,922,925],{},[358,917,918],{},[361,919,920],{},"ESP_GCP_PRIVATE_KEY",": Base64 encoded (",[361,923,924],{},"B64:...",") or PEM formatted Service Account Private Key.",[533,927,928,933],{},[358,929,930],{},[361,931,932],{},"ESP_GCP_CLIENT_EMAIL",": Service Account Email with Vertex AI User role.",[381,935],{},[384,937,939],{"id":938},"multi-database-architecture","Multi-Database Architecture",[354,941,942,944,945,948,949,955],{},[361,943,363],{}," employs a dual-database architecture: ",[358,946,947],{},"MariaDB \u002F MySQL"," for core relational domain entities, and ",[358,950,951,952],{},"PostgreSQL with ",[361,953,954],{},"pgvector"," for embedding storage and semantic similarity search.",[392,957,960],{"className":958,"code":959,"language":397},[395],"┌────────────────────────────────────────────────────────┐\n│                      esp-platform                      │\n└───────────────┬────────────────────────┬───────────────┘\n                │                        │\n       [ Relational JPA ]       [ Vector Data JPA ]\n                │                        │\n                ▼                        ▼\n        ┌───────────────┐        ┌───────────────┐\n        │ MySQL\u002FMariaDB │        │  PostgreSQL   │\n        │   (Port 3306) │        │   + PGVector  │\n        │  Main Schema  │        │  (Port 25432) │\n        └───────────────┘        └───────────────┘\n",[361,961,959],{"__ignoreMap":400},[402,963,965],{"id":964},"relational-database-mariadb-mysql-aws-aurora","Relational Database (MariaDB \u002F MySQL \u002F AWS Aurora)",[392,967,971],{"className":968,"code":969,"language":970,"meta":400,"style":400},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","spring:\n  datasource:\n    driverClassName: software.aws.rds.jdbc.mysql.Driver\n    jdbc-url: jdbc:${esp.database.type}:\u002F\u002F${esp.database.host}:${esp.database.port}\u002F${esp.database.name}\n    username: ${esp.database.username}\n    password: ${esp.database.password}\n    name: ESPDataSource\n    hikari:\n      maximum-pool-size: 30\n      connection-timeout: 10000\n      max-lifetime: 1140000\n  jpa:\n    open-in-view: false\n    generate-ddl: false\n    hibernate:\n      ddl-auto: none\n    properties:\n      hibernate:\n        auto_quote_keyword: true\n        jdbc:\n          time_zone: UTC\n        type:\n          json_format_mapper: org.hibernate.type.format.jackson.Jackson3JsonFormatMapper\n      org:\n        hibernate:\n          envers:\n            store_data_at_delete: true\n            audit_table_suffix: _aud\n\n  liquibase:\n    enabled: true\n    change-log: \u002Fdb\u002Fchangelog\u002Fdb.changelog-master.xml\n    database-change-log-lock-table: DB_CHANGELOG_LOCK\n    database-change-log-table: DB_CHANGELOG\n    parameters:\n      annualDaysMultiplier: ${esp.cost-calculation.annual-days-multiplier}\n","yaml",[361,972,973,982,989,1001,1011,1021,1031,1042,1050,1062,1073,1084,1092,1104,1114,1122,1133,1141,1149,1160,1168,1179,1187,1198,1206,1214,1222,1232,1243,1250,1258,1268,1279,1290,1301,1309],{"__ignoreMap":400},[627,974,975,979],{"class":629,"line":630},[627,976,978],{"class":977},"swJcz","spring",[627,980,836],{"class":981},"sMK4o",[627,983,984,987],{"class":629,"line":636},[627,985,986],{"class":977},"  datasource",[627,988,836],{"class":981},[627,990,991,994,997],{"class":629,"line":642},[627,992,993],{"class":977},"    driverClassName",[627,995,996],{"class":981},":",[627,998,1000],{"class":999},"sfazB"," software.aws.rds.jdbc.mysql.Driver\n",[627,1002,1003,1006,1008],{"class":629,"line":648},[627,1004,1005],{"class":977},"    jdbc-url",[627,1007,996],{"class":981},[627,1009,1010],{"class":999}," jdbc:${esp.database.type}:\u002F\u002F${esp.database.host}:${esp.database.port}\u002F${esp.database.name}\n",[627,1012,1013,1016,1018],{"class":629,"line":654},[627,1014,1015],{"class":977},"    username",[627,1017,996],{"class":981},[627,1019,1020],{"class":999}," ${esp.database.username}\n",[627,1022,1023,1026,1028],{"class":629,"line":660},[627,1024,1025],{"class":977},"    password",[627,1027,996],{"class":981},[627,1029,1030],{"class":999}," ${esp.database.password}\n",[627,1032,1034,1037,1039],{"class":629,"line":1033},7,[627,1035,1036],{"class":977},"    name",[627,1038,996],{"class":981},[627,1040,1041],{"class":999}," ESPDataSource\n",[627,1043,1045,1048],{"class":629,"line":1044},8,[627,1046,1047],{"class":977},"    hikari",[627,1049,836],{"class":981},[627,1051,1053,1056,1058],{"class":629,"line":1052},9,[627,1054,1055],{"class":977},"      maximum-pool-size",[627,1057,996],{"class":981},[627,1059,1061],{"class":1060},"sbssI"," 30\n",[627,1063,1065,1068,1070],{"class":629,"line":1064},10,[627,1066,1067],{"class":977},"      connection-timeout",[627,1069,996],{"class":981},[627,1071,1072],{"class":1060}," 10000\n",[627,1074,1076,1079,1081],{"class":629,"line":1075},11,[627,1077,1078],{"class":977},"      max-lifetime",[627,1080,996],{"class":981},[627,1082,1083],{"class":1060}," 1140000\n",[627,1085,1087,1090],{"class":629,"line":1086},12,[627,1088,1089],{"class":977},"  jpa",[627,1091,836],{"class":981},[627,1093,1095,1098,1100],{"class":629,"line":1094},13,[627,1096,1097],{"class":977},"    open-in-view",[627,1099,996],{"class":981},[627,1101,1103],{"class":1102},"sfNiH"," false\n",[627,1105,1107,1110,1112],{"class":629,"line":1106},14,[627,1108,1109],{"class":977},"    generate-ddl",[627,1111,996],{"class":981},[627,1113,1103],{"class":1102},[627,1115,1117,1120],{"class":629,"line":1116},15,[627,1118,1119],{"class":977},"    hibernate",[627,1121,836],{"class":981},[627,1123,1125,1128,1130],{"class":629,"line":1124},16,[627,1126,1127],{"class":977},"      ddl-auto",[627,1129,996],{"class":981},[627,1131,1132],{"class":999}," none\n",[627,1134,1136,1139],{"class":629,"line":1135},17,[627,1137,1138],{"class":977},"    properties",[627,1140,836],{"class":981},[627,1142,1144,1147],{"class":629,"line":1143},18,[627,1145,1146],{"class":977},"      hibernate",[627,1148,836],{"class":981},[627,1150,1152,1155,1157],{"class":629,"line":1151},19,[627,1153,1154],{"class":977},"        auto_quote_keyword",[627,1156,996],{"class":981},[627,1158,1159],{"class":1102}," true\n",[627,1161,1163,1166],{"class":629,"line":1162},20,[627,1164,1165],{"class":977},"        jdbc",[627,1167,836],{"class":981},[627,1169,1171,1174,1176],{"class":629,"line":1170},21,[627,1172,1173],{"class":977},"          time_zone",[627,1175,996],{"class":981},[627,1177,1178],{"class":999}," UTC\n",[627,1180,1182,1185],{"class":629,"line":1181},22,[627,1183,1184],{"class":977},"        type",[627,1186,836],{"class":981},[627,1188,1190,1193,1195],{"class":629,"line":1189},23,[627,1191,1192],{"class":977},"          json_format_mapper",[627,1194,996],{"class":981},[627,1196,1197],{"class":999}," org.hibernate.type.format.jackson.Jackson3JsonFormatMapper\n",[627,1199,1201,1204],{"class":629,"line":1200},24,[627,1202,1203],{"class":977},"      org",[627,1205,836],{"class":981},[627,1207,1209,1212],{"class":629,"line":1208},25,[627,1210,1211],{"class":977},"        hibernate",[627,1213,836],{"class":981},[627,1215,1217,1220],{"class":629,"line":1216},26,[627,1218,1219],{"class":977},"          envers",[627,1221,836],{"class":981},[627,1223,1225,1228,1230],{"class":629,"line":1224},27,[627,1226,1227],{"class":977},"            store_data_at_delete",[627,1229,996],{"class":981},[627,1231,1159],{"class":1102},[627,1233,1235,1238,1240],{"class":629,"line":1234},28,[627,1236,1237],{"class":977},"            audit_table_suffix",[627,1239,996],{"class":981},[627,1241,1242],{"class":999}," _aud\n",[627,1244,1246],{"class":629,"line":1245},29,[627,1247,1249],{"emptyLinePlaceholder":1248},true,"\n",[627,1251,1253,1256],{"class":629,"line":1252},30,[627,1254,1255],{"class":977},"  liquibase",[627,1257,836],{"class":981},[627,1259,1261,1264,1266],{"class":629,"line":1260},31,[627,1262,1263],{"class":977},"    enabled",[627,1265,996],{"class":981},[627,1267,1159],{"class":1102},[627,1269,1271,1274,1276],{"class":629,"line":1270},32,[627,1272,1273],{"class":977},"    change-log",[627,1275,996],{"class":981},[627,1277,1278],{"class":999}," \u002Fdb\u002Fchangelog\u002Fdb.changelog-master.xml\n",[627,1280,1282,1285,1287],{"class":629,"line":1281},33,[627,1283,1284],{"class":977},"    database-change-log-lock-table",[627,1286,996],{"class":981},[627,1288,1289],{"class":999}," DB_CHANGELOG_LOCK\n",[627,1291,1293,1296,1298],{"class":629,"line":1292},34,[627,1294,1295],{"class":977},"    database-change-log-table",[627,1297,996],{"class":981},[627,1299,1300],{"class":999}," DB_CHANGELOG\n",[627,1302,1304,1307],{"class":629,"line":1303},35,[627,1305,1306],{"class":977},"    parameters",[627,1308,836],{"class":981},[627,1310,1312,1315,1317],{"class":629,"line":1311},36,[627,1313,1314],{"class":977},"      annualDaysMultiplier",[627,1316,996],{"class":981},[627,1318,1319],{"class":999}," ${esp.cost-calculation.annual-days-multiplier}\n",[1321,1322,1324],"h4",{"id":1323},"configuration-details","Configuration Details",[530,1326,1327,1337,1351,1361],{},[533,1328,1329,1332,1333,1336],{},[358,1330,1331],{},"AWS RDS JDBC Driver",": Uses ",[361,1334,1335],{},"software.aws.rds.jdbc.mysql.Driver"," to provide enhanced failover detection for Aurora MySQL clusters.",[533,1338,1339,1342,1343,1346,1347,1350],{},[358,1340,1341],{},"Hikari Connection Pool",": Capped at ",[361,1344,1345],{},"30"," connections with a max lifetime of 19 minutes (",[361,1348,1349],{},"1140000 ms",") to prevent stale connections across AWS NAT gateways.",[533,1352,1353,1356,1357,1360],{},[358,1354,1355],{},"Hibernate Envers",": Tracks audit history for security compliance using the ",[361,1358,1359],{},"_aud"," table suffix and records deleted records.",[533,1362,1363,1366,1367,1370,1371,1374],{},[358,1364,1365],{},"Liquibase Migrations",": Automatically runs schema migrations on startup against ",[361,1368,1369],{},"DB_CHANGELOG",". The parameter ",[361,1372,1373],{},"annualDaysMultiplier"," is passed into changelog scripts for cost computation formulas.",[402,1376,1378],{"id":1377},"vector-database-postgresql-pgvector","Vector Database (PostgreSQL + PGVector)",[354,1380,1381,1382,1384],{},"Vector embeddings for semantic intelligence are managed under a separate ",[361,1383,954],{}," datasource namespace:",[392,1386,1388],{"className":968,"code":1387,"language":970,"meta":400,"style":400},"pgvector:\n  datasource:\n    jdbc-url: jdbc:postgresql:\u002F\u002F${esp.database.pg.host}:${esp.database.pg.port}\u002F${esp.database.pg.name}\n    username: ${esp.database.pg.username}\n    password: ${esp.database.pg.password}\n    hikari:\n      schema: esp_platform\n    table-name: vector_store\n  liquibase:\n    enabled: true\n    change-log: \u002Fdb\u002Fchangelog\u002Fpostgres-db\u002Fdb.changelog-master.xml\n    database-change-log-lock-table: POSTGRES_DB_CHANGELOG_LOCK\n    database-change-log-table: POSTGRES_DB_CHANGELOG\n    default-schema: esp_platform\n",[361,1389,1390,1396,1402,1411,1420,1429,1435,1445,1455,1461,1469,1478,1487,1496],{"__ignoreMap":400},[627,1391,1392,1394],{"class":629,"line":630},[627,1393,954],{"class":977},[627,1395,836],{"class":981},[627,1397,1398,1400],{"class":629,"line":636},[627,1399,986],{"class":977},[627,1401,836],{"class":981},[627,1403,1404,1406,1408],{"class":629,"line":642},[627,1405,1005],{"class":977},[627,1407,996],{"class":981},[627,1409,1410],{"class":999}," jdbc:postgresql:\u002F\u002F${esp.database.pg.host}:${esp.database.pg.port}\u002F${esp.database.pg.name}\n",[627,1412,1413,1415,1417],{"class":629,"line":648},[627,1414,1015],{"class":977},[627,1416,996],{"class":981},[627,1418,1419],{"class":999}," ${esp.database.pg.username}\n",[627,1421,1422,1424,1426],{"class":629,"line":654},[627,1423,1025],{"class":977},[627,1425,996],{"class":981},[627,1427,1428],{"class":999}," ${esp.database.pg.password}\n",[627,1430,1431,1433],{"class":629,"line":660},[627,1432,1047],{"class":977},[627,1434,836],{"class":981},[627,1436,1437,1440,1442],{"class":629,"line":1033},[627,1438,1439],{"class":977},"      schema",[627,1441,996],{"class":981},[627,1443,1444],{"class":999}," esp_platform\n",[627,1446,1447,1450,1452],{"class":629,"line":1044},[627,1448,1449],{"class":977},"    table-name",[627,1451,996],{"class":981},[627,1453,1454],{"class":999}," vector_store\n",[627,1456,1457,1459],{"class":629,"line":1052},[627,1458,1255],{"class":977},[627,1460,836],{"class":981},[627,1462,1463,1465,1467],{"class":629,"line":1064},[627,1464,1263],{"class":977},[627,1466,996],{"class":981},[627,1468,1159],{"class":1102},[627,1470,1471,1473,1475],{"class":629,"line":1075},[627,1472,1273],{"class":977},[627,1474,996],{"class":981},[627,1476,1477],{"class":999}," \u002Fdb\u002Fchangelog\u002Fpostgres-db\u002Fdb.changelog-master.xml\n",[627,1479,1480,1482,1484],{"class":629,"line":1086},[627,1481,1284],{"class":977},[627,1483,996],{"class":981},[627,1485,1486],{"class":999}," POSTGRES_DB_CHANGELOG_LOCK\n",[627,1488,1489,1491,1493],{"class":629,"line":1094},[627,1490,1295],{"class":977},[627,1492,996],{"class":981},[627,1494,1495],{"class":999}," POSTGRES_DB_CHANGELOG\n",[627,1497,1498,1501,1503],{"class":629,"line":1106},[627,1499,1500],{"class":977},"    default-schema",[627,1502,996],{"class":981},[627,1504,1444],{"class":999},[491,1506,1507,1510,1511,1514],{"icon":810},[361,1508,1509],{},"PgVectorStoreAutoConfiguration"," is explicitly excluded in ",[361,1512,1513],{},"spring.autoconfigure.exclude"," so that the platform can manage custom vector schemas and dedicated Liquibase migrations independently.",[381,1516],{},[384,1518,1520],{"id":1519},"server-runtime-infrastructure","Server & Runtime Infrastructure",[354,1522,1523],{},"These settings control the embedded web server, thread pool management, and request constraints.",[392,1525,1527],{"className":968,"code":1526,"language":970,"meta":400,"style":400},"server:\n  port: 8088\n  shutdown: graceful\n  http2:\n    enabled: true\n  max-http-request-header-size: 40KB\n\nspring:\n  application:\n    name: platform-api\n  threads:\n    virtual:\n      enabled: true\n  lifecycle:\n    timeout-per-shutdown-phase: 20s\n  jackson:\n    time-zone: UTC\n  servlet:\n    multipart:\n      max-file-size: 100MB\n      max-request-size: 100MB\n  task:\n    execution:\n      propagate-context: true\n",[361,1528,1529,1536,1546,1556,1563,1571,1581,1585,1591,1598,1607,1614,1621,1630,1637,1647,1654,1663,1670,1677,1687,1696,1703,1710],{"__ignoreMap":400},[627,1530,1531,1534],{"class":629,"line":630},[627,1532,1533],{"class":977},"server",[627,1535,836],{"class":981},[627,1537,1538,1541,1543],{"class":629,"line":636},[627,1539,1540],{"class":977},"  port",[627,1542,996],{"class":981},[627,1544,1545],{"class":1060}," 8088\n",[627,1547,1548,1551,1553],{"class":629,"line":642},[627,1549,1550],{"class":977},"  shutdown",[627,1552,996],{"class":981},[627,1554,1555],{"class":999}," graceful\n",[627,1557,1558,1561],{"class":629,"line":648},[627,1559,1560],{"class":977},"  http2",[627,1562,836],{"class":981},[627,1564,1565,1567,1569],{"class":629,"line":654},[627,1566,1263],{"class":977},[627,1568,996],{"class":981},[627,1570,1159],{"class":1102},[627,1572,1573,1576,1578],{"class":629,"line":660},[627,1574,1575],{"class":977},"  max-http-request-header-size",[627,1577,996],{"class":981},[627,1579,1580],{"class":999}," 40KB\n",[627,1582,1583],{"class":629,"line":1033},[627,1584,1249],{"emptyLinePlaceholder":1248},[627,1586,1587,1589],{"class":629,"line":1044},[627,1588,978],{"class":977},[627,1590,836],{"class":981},[627,1592,1593,1596],{"class":629,"line":1052},[627,1594,1595],{"class":977},"  application",[627,1597,836],{"class":981},[627,1599,1600,1602,1604],{"class":629,"line":1064},[627,1601,1036],{"class":977},[627,1603,996],{"class":981},[627,1605,1606],{"class":999}," platform-api\n",[627,1608,1609,1612],{"class":629,"line":1075},[627,1610,1611],{"class":977},"  threads",[627,1613,836],{"class":981},[627,1615,1616,1619],{"class":629,"line":1086},[627,1617,1618],{"class":977},"    virtual",[627,1620,836],{"class":981},[627,1622,1623,1626,1628],{"class":629,"line":1094},[627,1624,1625],{"class":977},"      enabled",[627,1627,996],{"class":981},[627,1629,1159],{"class":1102},[627,1631,1632,1635],{"class":629,"line":1106},[627,1633,1634],{"class":977},"  lifecycle",[627,1636,836],{"class":981},[627,1638,1639,1642,1644],{"class":629,"line":1116},[627,1640,1641],{"class":977},"    timeout-per-shutdown-phase",[627,1643,996],{"class":981},[627,1645,1646],{"class":999}," 20s\n",[627,1648,1649,1652],{"class":629,"line":1124},[627,1650,1651],{"class":977},"  jackson",[627,1653,836],{"class":981},[627,1655,1656,1659,1661],{"class":629,"line":1135},[627,1657,1658],{"class":977},"    time-zone",[627,1660,996],{"class":981},[627,1662,1178],{"class":999},[627,1664,1665,1668],{"class":629,"line":1143},[627,1666,1667],{"class":977},"  servlet",[627,1669,836],{"class":981},[627,1671,1672,1675],{"class":629,"line":1151},[627,1673,1674],{"class":977},"    multipart",[627,1676,836],{"class":981},[627,1678,1679,1682,1684],{"class":629,"line":1162},[627,1680,1681],{"class":977},"      max-file-size",[627,1683,996],{"class":981},[627,1685,1686],{"class":999}," 100MB\n",[627,1688,1689,1692,1694],{"class":629,"line":1170},[627,1690,1691],{"class":977},"      max-request-size",[627,1693,996],{"class":981},[627,1695,1686],{"class":999},[627,1697,1698,1701],{"class":629,"line":1181},[627,1699,1700],{"class":977},"  task",[627,1702,836],{"class":981},[627,1704,1705,1708],{"class":629,"line":1189},[627,1706,1707],{"class":977},"    execution",[627,1709,836],{"class":981},[627,1711,1712,1715,1717],{"class":629,"line":1200},[627,1713,1714],{"class":977},"      propagate-context",[627,1716,996],{"class":981},[627,1718,1159],{"class":1102},[530,1720,1721,1732,1746,1754],{},[533,1722,1723,592,1728,1731],{},[358,1724,1725],{},[361,1726,1727],{},"server.port",[361,1729,1730],{},"8088","): The internal HTTP listening port for the container. In AWS ECS, ALB target groups map inbound container traffic to this port.",[533,1733,1734,1739,1740,1745],{},[358,1735,1736],{},[361,1737,1738],{},"server.shutdown: graceful"," & ",[358,1741,1742],{},[361,1743,1744],{},"spring.lifecycle.timeout-per-shutdown-phase: 20s",": Allows in-flight requests up to 20 seconds to complete gracefully before the container terminates during deployments.",[533,1747,1748,1753],{},[358,1749,1750],{},[361,1751,1752],{},"spring.threads.virtual.enabled: true",": Enables Java Project Loom virtual threads for high-throughput concurrent I\u002FO.",[533,1755,1756,1761,1762,1765,1766,1769,1770,1773],{},[358,1757,1758],{},[361,1759,1760],{},"spring.task.execution.propagate-context: true",": Propagates ",[361,1763,1764],{},"Micrometer"," and ",[361,1767,1768],{},"LlmTraceContext"," across asynchronous ",[361,1771,1772],{},"@Async"," thread boundaries.",[381,1775],{},[384,1777,1779],{"id":1778},"distributed-task-scheduler-quartz","Distributed Task Scheduler (Quartz)",[354,1781,1782],{},"The platform runs clustered background jobs (e.g. periodic intelligence re-indexing, compliance sync, notification processing) using Quartz backed by the relational database.",[392,1784,1786],{"className":968,"code":1785,"language":970,"meta":400,"style":400},"spring:\n  quartz:\n    job-store-type: jdbc\n    jdbc:\n      initialize-schema: never\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: ESPClusteredScheduler\n            instanceId: AUTO\n          jobStore:\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            useProperties: false\n            tablePrefix: QRTZ_\n            isClustered: true\n            clusterCheckinInterval: 20000\n          threadPool:\n            threadCount: 10\n",[361,1787,1788,1794,1801,1811,1818,1828,1834,1840,1847,1854,1864,1874,1881,1891,1900,1910,1919,1929,1936],{"__ignoreMap":400},[627,1789,1790,1792],{"class":629,"line":630},[627,1791,978],{"class":977},[627,1793,836],{"class":981},[627,1795,1796,1799],{"class":629,"line":636},[627,1797,1798],{"class":977},"  quartz",[627,1800,836],{"class":981},[627,1802,1803,1806,1808],{"class":629,"line":642},[627,1804,1805],{"class":977},"    job-store-type",[627,1807,996],{"class":981},[627,1809,1810],{"class":999}," jdbc\n",[627,1812,1813,1816],{"class":629,"line":648},[627,1814,1815],{"class":977},"    jdbc",[627,1817,836],{"class":981},[627,1819,1820,1823,1825],{"class":629,"line":654},[627,1821,1822],{"class":977},"      initialize-schema",[627,1824,996],{"class":981},[627,1826,1827],{"class":999}," never\n",[627,1829,1830,1832],{"class":629,"line":660},[627,1831,1138],{"class":977},[627,1833,836],{"class":981},[627,1835,1836,1838],{"class":629,"line":1033},[627,1837,1203],{"class":977},[627,1839,836],{"class":981},[627,1841,1842,1845],{"class":629,"line":1044},[627,1843,1844],{"class":977},"        quartz",[627,1846,836],{"class":981},[627,1848,1849,1852],{"class":629,"line":1052},[627,1850,1851],{"class":977},"          scheduler",[627,1853,836],{"class":981},[627,1855,1856,1859,1861],{"class":629,"line":1064},[627,1857,1858],{"class":977},"            instanceName",[627,1860,996],{"class":981},[627,1862,1863],{"class":999}," ESPClusteredScheduler\n",[627,1865,1866,1869,1871],{"class":629,"line":1075},[627,1867,1868],{"class":977},"            instanceId",[627,1870,996],{"class":981},[627,1872,1873],{"class":999}," AUTO\n",[627,1875,1876,1879],{"class":629,"line":1086},[627,1877,1878],{"class":977},"          jobStore",[627,1880,836],{"class":981},[627,1882,1883,1886,1888],{"class":629,"line":1094},[627,1884,1885],{"class":977},"            driverDelegateClass",[627,1887,996],{"class":981},[627,1889,1890],{"class":999}," org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n",[627,1892,1893,1896,1898],{"class":629,"line":1106},[627,1894,1895],{"class":977},"            useProperties",[627,1897,996],{"class":981},[627,1899,1103],{"class":1102},[627,1901,1902,1905,1907],{"class":629,"line":1116},[627,1903,1904],{"class":977},"            tablePrefix",[627,1906,996],{"class":981},[627,1908,1909],{"class":999}," QRTZ_\n",[627,1911,1912,1915,1917],{"class":629,"line":1124},[627,1913,1914],{"class":977},"            isClustered",[627,1916,996],{"class":981},[627,1918,1159],{"class":1102},[627,1920,1921,1924,1926],{"class":629,"line":1135},[627,1922,1923],{"class":977},"            clusterCheckinInterval",[627,1925,996],{"class":981},[627,1927,1928],{"class":1060}," 20000\n",[627,1930,1931,1934],{"class":629,"line":1143},[627,1932,1933],{"class":977},"          threadPool",[627,1935,836],{"class":981},[627,1937,1938,1941,1943],{"class":629,"line":1151},[627,1939,1940],{"class":977},"            threadCount",[627,1942,996],{"class":981},[627,1944,1945],{"class":1060}," 10\n",[530,1947,1948,1956],{},[533,1949,1950,1955],{},[358,1951,1952],{},[361,1953,1954],{},"isClustered: true",": Allows multiple ECS task instances for the same tenant to safely share scheduled jobs without duplicate execution.",[533,1957,1958,1963],{},[358,1959,1960],{},[361,1961,1962],{},"clusterCheckinInterval: 20000",": Instances heartbeat every 20 seconds to detect failed nodes and reassign jobs.",[381,1965],{},[384,1967,1969],{"id":1968},"central-services-mesh","Central Services Mesh",[354,1971,1972,1974],{},[361,1973,363],{}," coordinates with other ESProfiler central backend services:",[392,1976,1978],{"className":968,"code":1977,"language":970,"meta":400,"style":400},"esp:\n  mfs:\n    url: https:\u002F\u002Fapi.esprofiler.com\u002Fmfs       # Module & Feature Service\n  ces:\n    url: https:\u002F\u002Fapi.esprofiler.com\u002Fces       # Capability Engine Service\n  cps:\n    url: https:\u002F\u002Fapi.esprofiler.com\u002Fcps       # Customer Platform Service\n  ccs:\n    url: https:\u002F\u002Fapi.esprofiler.com\u002Fccs       # Capability Catalog Service\n  pes:\n    url: https:\u002F\u002Fapi.esprofiler.com\u002Fpes       # Policy Engine Service\n  task-hub:\n    url: https:\u002F\u002F${esp.external-domain}\u002Ftask-hub\n",[361,1979,1980,1987,1994,2008,2015,2027,2034,2046,2053,2065,2072,2084,2091],{"__ignoreMap":400},[627,1981,1982,1985],{"class":629,"line":630},[627,1983,1984],{"class":977},"esp",[627,1986,836],{"class":981},[627,1988,1989,1992],{"class":629,"line":636},[627,1990,1991],{"class":977},"  mfs",[627,1993,836],{"class":981},[627,1995,1996,1999,2001,2004],{"class":629,"line":642},[627,1997,1998],{"class":977},"    url",[627,2000,996],{"class":981},[627,2002,2003],{"class":999}," https:\u002F\u002Fapi.esprofiler.com\u002Fmfs",[627,2005,2007],{"class":2006},"sHwdD","       # Module & Feature Service\n",[627,2009,2010,2013],{"class":629,"line":648},[627,2011,2012],{"class":977},"  ces",[627,2014,836],{"class":981},[627,2016,2017,2019,2021,2024],{"class":629,"line":654},[627,2018,1998],{"class":977},[627,2020,996],{"class":981},[627,2022,2023],{"class":999}," https:\u002F\u002Fapi.esprofiler.com\u002Fces",[627,2025,2026],{"class":2006},"       # Capability Engine Service\n",[627,2028,2029,2032],{"class":629,"line":660},[627,2030,2031],{"class":977},"  cps",[627,2033,836],{"class":981},[627,2035,2036,2038,2040,2043],{"class":629,"line":1033},[627,2037,1998],{"class":977},[627,2039,996],{"class":981},[627,2041,2042],{"class":999}," https:\u002F\u002Fapi.esprofiler.com\u002Fcps",[627,2044,2045],{"class":2006},"       # Customer Platform Service\n",[627,2047,2048,2051],{"class":629,"line":1044},[627,2049,2050],{"class":977},"  ccs",[627,2052,836],{"class":981},[627,2054,2055,2057,2059,2062],{"class":629,"line":1052},[627,2056,1998],{"class":977},[627,2058,996],{"class":981},[627,2060,2061],{"class":999}," https:\u002F\u002Fapi.esprofiler.com\u002Fccs",[627,2063,2064],{"class":2006},"       # Capability Catalog Service\n",[627,2066,2067,2070],{"class":629,"line":1064},[627,2068,2069],{"class":977},"  pes",[627,2071,836],{"class":981},[627,2073,2074,2076,2078,2081],{"class":629,"line":1075},[627,2075,1998],{"class":977},[627,2077,996],{"class":981},[627,2079,2080],{"class":999}," https:\u002F\u002Fapi.esprofiler.com\u002Fpes",[627,2082,2083],{"class":2006},"       # Policy Engine Service\n",[627,2085,2086,2089],{"class":629,"line":1086},[627,2087,2088],{"class":977},"  task-hub",[627,2090,836],{"class":981},[627,2092,2093,2095,2097],{"class":629,"line":1094},[627,2094,1998],{"class":977},[627,2096,996],{"class":981},[627,2098,2099],{"class":999}," https:\u002F\u002F${esp.external-domain}\u002Ftask-hub\n",[354,2101,2102,2103,2105,2106,2109,2110,506],{},"In the ",[361,2104,454],{}," profile, these are remapped to local development ports (",[361,2107,2108],{},"localhost:8990"," - ",[361,2111,2112],{},"8997",[381,2114],{},[384,2116,2118],{"id":2117},"complete-environment-variable-reference-matrix","Complete Environment Variable Reference Matrix",[354,2120,2121,2122,375,2125,2128,2129,2132],{},"The following matrix categorizes all supported environment variables into ",[358,2123,2124],{},"Tenant-Mandatory",[358,2126,2127],{},"Tenant-Customizable",", and ",[358,2130,2131],{},"Shared Platform Defaults",".",[402,2134,2136],{"id":2135},"_1-tenant-mandatory-variables-must-be-unique-for-every-tenant","1. Tenant-Mandatory Variables (Must be unique for every tenant)",[407,2138,2139,2155],{},[410,2140,2141],{},[413,2142,2143,2146,2149,2152],{},[416,2144,2145],{},"Environment Variable",[416,2147,2148],{},"YAML Path",[416,2150,2151],{},"Description",[416,2153,2154],{},"Example",[426,2156,2157,2175,2194,2214,2234,2254,2275,2295,2314,2334,2353,2372],{},[413,2158,2159,2163,2168,2171],{},[431,2160,2161],{},[361,2162,539],{},[431,2164,2165],{},[361,2166,2167],{},"esp.external-domain",[431,2169,2170],{},"Vanity domain for this tenant",[431,2172,2173],{},[361,2174,543],{},[413,2176,2177,2181,2186,2189],{},[431,2178,2179],{},[361,2180,554],{},[431,2182,2183],{},[361,2184,2185],{},"esp.client-id",[431,2187,2188],{},"Tenant OAuth2 Client ID UUID",[431,2190,2191],{},[361,2192,2193],{},"a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d",[413,2195,2196,2201,2206,2209],{},[431,2197,2198],{},[361,2199,2200],{},"ESP_DATABASE_HOST",[431,2202,2203],{},[361,2204,2205],{},"esp.database.host",[431,2207,2208],{},"Tenant RDS MySQL\u002FAurora endpoint",[431,2210,2211],{},[361,2212,2213],{},"rds-acme.c38dj2.eu-west-2.rds.amazonaws.com",[413,2215,2216,2221,2226,2229],{},[431,2217,2218],{},[361,2219,2220],{},"ESP_DATABASE_NAME",[431,2222,2223],{},[361,2224,2225],{},"esp.database.name",[431,2227,2228],{},"Tenant MySQL database name",[431,2230,2231],{},[361,2232,2233],{},"esp_platform",[413,2235,2236,2241,2246,2249],{},[431,2237,2238],{},[361,2239,2240],{},"ESP_DATABASE_USERNAME",[431,2242,2243],{},[361,2244,2245],{},"esp.database.username",[431,2247,2248],{},"Tenant MySQL user",[431,2250,2251],{},[361,2252,2253],{},"esp_user_acme",[413,2255,2256,2261,2266,2269],{},[431,2257,2258],{},[361,2259,2260],{},"ESP_DATABASE_PASSWORD",[431,2262,2263],{},[361,2264,2265],{},"esp.database.password",[431,2267,2268],{},"Tenant MySQL password",[431,2270,2271],{},[2272,2273,2274],"em",{},"(Stored in Secrets Manager)",[413,2276,2277,2282,2287,2290],{},[431,2278,2279],{},[361,2280,2281],{},"ESP_DATABASE_PG_HOST",[431,2283,2284],{},[361,2285,2286],{},"esp.database.pg.host",[431,2288,2289],{},"Tenant PostgreSQL pgvector endpoint",[431,2291,2292],{},[361,2293,2294],{},"rds-pg-acme.c38dj2.eu-west-2.rds.amazonaws.com",[413,2296,2297,2302,2307,2310],{},[431,2298,2299],{},[361,2300,2301],{},"ESP_DATABASE_PG_NAME",[431,2303,2304],{},[361,2305,2306],{},"esp.database.pg.name",[431,2308,2309],{},"Tenant PostgreSQL database name",[431,2311,2312],{},[361,2313,2233],{},[413,2315,2316,2321,2326,2329],{},[431,2317,2318],{},[361,2319,2320],{},"ESP_DATABASE_PG_USERNAME",[431,2322,2323],{},[361,2324,2325],{},"esp.database.pg.username",[431,2327,2328],{},"Tenant PostgreSQL user",[431,2330,2331],{},[361,2332,2333],{},"esp_pg_acme",[413,2335,2336,2341,2346,2349],{},[431,2337,2338],{},[361,2339,2340],{},"ESP_DATABASE_PG_PASSWORD",[431,2342,2343],{},[361,2344,2345],{},"esp.database.pg.password",[431,2347,2348],{},"Tenant PostgreSQL password",[431,2350,2351],{},[2272,2352,2274],{},[413,2354,2355,2359,2364,2367],{},[431,2356,2357],{},[361,2358,798],{},[431,2360,2361],{},[361,2362,2363],{},"esp.iengine.secrets.password",[431,2365,2366],{},"Master AES-256 vault encryption key",[431,2368,2369],{},[2272,2370,2371],{},"(Random 32+ char secret string)",[413,2373,2374,2378,2383,2386],{},[431,2375,2376],{},[361,2377,806],{},[431,2379,2380],{},[361,2381,2382],{},"esp.iengine.secrets.salt",[431,2384,2385],{},"Master AES-256 32-char hex salt",[431,2387,2388],{},[361,2389,2390],{},"19a0e18a1f8d24b56ed7e38bc4cc7d09",[402,2392,2394],{"id":2393},"_2-tenant-customizable-variables-tailored-per-contract-tier","2. Tenant-Customizable Variables (Tailored per contract \u002F tier)",[407,2396,2397,2411],{},[410,2398,2399],{},[413,2400,2401,2403,2405,2408],{},[416,2402,2145],{},[416,2404,2148],{},[416,2406,2407],{},"Default",[416,2409,2410],{},"Purpose \u002F Customization Options",[426,2412,2413,2436,2462,2480,2498,2517,2536,2555,2574,2593,2612,2631,2656,2674,2692,2710],{},[413,2414,2415,2419,2424,2429],{},[431,2416,2417],{},[361,2418,562],{},[431,2420,2421],{},[361,2422,2423],{},"esp.security.organisation-alias",[431,2425,2426],{},[361,2427,2428],{},"esprofiler",[431,2430,2431,2432,2435],{},"CAS Org Alias to map SSO \u002F IdP (e.g. ",[361,2433,2434],{},"acme-corp",")",[413,2437,2438,2442,2447,2451],{},[431,2439,2440],{},[361,2441,679],{},[431,2443,2444],{},[361,2445,2446],{},"esp.currency.target",[431,2448,2449],{},[361,2450,683],{},[431,2452,2453,2454,375,2456,375,2458,375,2460,2435],{},"Base reporting currency (",[361,2455,686],{},[361,2457,689],{},[361,2459,683],{},[361,2461,692],{},[413,2463,2464,2468,2473,2477],{},[431,2465,2466],{},[361,2467,579],{},[431,2469,2470],{},[361,2471,2472],{},"esp.spa.target-version",[431,2474,2475],{},[361,2476,583],{},[431,2478,2479],{},"Pin frontend UI version or leave empty for latest",[413,2481,2482,2486,2491,2495],{},[431,2483,2484],{},[361,2485,591],{},[431,2487,2488],{},[361,2489,2490],{},"esp.spa.show-notice",[431,2492,2493],{},[361,2494,599],{},[431,2496,2497],{},"Enable\u002Fdisable mandatory legal compliance modal",[413,2499,2500,2504,2509,2514],{},[431,2501,2502],{},[361,2503,607],{},[431,2505,2506],{},[361,2507,2508],{},"esp.spa.notice-message",[431,2510,2511],{},[2272,2512,2513],{},"(Standard text)",[431,2515,2516],{},"Custom legal text \u002F Acceptable Use Policy",[413,2518,2519,2524,2529,2533],{},[431,2520,2521],{},[361,2522,2523],{},"ESP_MODULES_ENABLED_COMMERCIAL",[431,2525,2526],{},[361,2527,2528],{},"esp.modules.enabled.commercial",[431,2530,2531],{},[361,2532,595],{},[431,2534,2535],{},"Enable\u002Fdisable Commercial Spend tracking",[413,2537,2538,2543,2548,2552],{},[431,2539,2540],{},[361,2541,2542],{},"ESP_MODULES_ENABLED_I_ENGINE",[431,2544,2545],{},[361,2546,2547],{},"esp.modules.enabled.i-engine",[431,2549,2550],{},[361,2551,595],{},[431,2553,2554],{},"Enable\u002Fdisable AI Recommendation Engine",[413,2556,2557,2562,2567,2571],{},[431,2558,2559],{},[361,2560,2561],{},"ESP_MODULES_ENABLED_USER_ASSERTIONS",[431,2563,2564],{},[361,2565,2566],{},"esp.modules.enabled.user-assertions",[431,2568,2569],{},[361,2570,595],{},[431,2572,2573],{},"Enable\u002Fdisable User Assertions workflows",[413,2575,2576,2581,2586,2590],{},[431,2577,2578],{},[361,2579,2580],{},"ESP_MODULES_ENABLED_VENDOR_REQUEST",[431,2582,2583],{},[361,2584,2585],{},"esp.modules.enabled.vendor-request",[431,2587,2588],{},[361,2589,595],{},[431,2591,2592],{},"Enable\u002Fdisable Vendor Assessment Requests",[413,2594,2595,2600,2605,2609],{},[431,2596,2597],{},[361,2598,2599],{},"ESP_MODULES_ENABLED_THREAT_ANALYTICS",[431,2601,2602],{},[361,2603,2604],{},"esp.modules.enabled.threat-analytics",[431,2606,2607],{},[361,2608,595],{},[431,2610,2611],{},"Enable\u002Fdisable MITRE ATT&CK & Threat Analytics",[413,2613,2614,2619,2624,2628],{},[431,2615,2616],{},[361,2617,2618],{},"ESP_MODULES_ENABLED_DEEP_RESEARCH",[431,2620,2621],{},[361,2622,2623],{},"esp.modules.enabled.deep-research",[431,2625,2626],{},[361,2627,595],{},[431,2629,2630],{},"Enable\u002Fdisable Agentic Deep Research",[413,2632,2633,2637,2642,2646],{},[431,2634,2635],{},[361,2636,835],{},[431,2638,2639],{},[361,2640,2641],{},"esp.llm.observation.content-capture-mode",[431,2643,2644],{},[361,2645,843],{},[431,2647,2648,2649,375,2651,2653,2654],{},"Privacy mode: ",[361,2650,843],{},[361,2652,849],{},", or ",[361,2655,855],{},[413,2657,2658,2662,2667,2671],{},[431,2659,2660],{},[361,2661,863],{},[431,2663,2664],{},[361,2665,2666],{},"esp.notification.posthog.enabled",[431,2668,2669],{},[361,2670,595],{},[431,2672,2673],{},"Enable\u002Fdisable frontend product usage tracking",[413,2675,2676,2680,2685,2689],{},[431,2677,2678],{},[361,2679,760],{},[431,2681,2682],{},[361,2683,2684],{},"esp.file.s3.bucket-name",[431,2686,2687],{},[361,2688,764],{},[431,2690,2691],{},"Dedicated or shared tenant S3 storage bucket",[413,2693,2694,2698,2703,2707],{},[431,2695,2696],{},[361,2697,874],{},[431,2699,2700],{},[361,2701,2702],{},"esp.intelligence.stack-gap.phantom-threshold",[431,2704,2705],{},[361,2706,878],{},[431,2708,2709],{},"Sensitivity threshold for phantom gap identification",[413,2711,2712,2716,2721,2726],{},[431,2713,2714],{},[361,2715,912],{},[431,2717,2718],{},[361,2719,2720],{},"esp.gcp.project-id",[431,2722,2723],{},[361,2724,2725],{},"esp-production",[431,2727,2728],{},"Bring-your-own GCP AI Project ID",[402,2730,2732],{"id":2731},"_3-shared-platform-defaults-common-across-standard-deployments","3. Shared Platform Defaults (Common across standard deployments)",[407,2734,2735,2748],{},[410,2736,2737],{},[413,2738,2739,2741,2743,2746],{},[416,2740,2145],{},[416,2742,2148],{},[416,2744,2745],{},"Default Value",[416,2747,2151],{},[426,2749,2750,2768,2788,2807,2827,2847,2867,2887,2907,2927,2947,2967,2987],{},[413,2751,2752,2757,2761,2765],{},[431,2753,2754],{},[361,2755,2756],{},"SERVER_PORT",[431,2758,2759],{},[361,2760,1727],{},[431,2762,2763],{},[361,2764,1730],{},[431,2766,2767],{},"Container internal listening port",[413,2769,2770,2775,2780,2785],{},[431,2771,2772],{},[361,2773,2774],{},"ESP_EXTERNAL_PORT",[431,2776,2777],{},[361,2778,2779],{},"esp.external-port",[431,2781,2782],{},[361,2783,2784],{},"443",[431,2786,2787],{},"External HTTPS port",[413,2789,2790,2795,2800,2804],{},[431,2791,2792],{},[361,2793,2794],{},"ESP_EXTERNAL_SSL",[431,2796,2797],{},[361,2798,2799],{},"esp.external-ssl",[431,2801,2802],{},[361,2803,595],{},[431,2805,2806],{},"URL protocol scheme helper",[413,2808,2809,2814,2819,2824],{},[431,2810,2811],{},[361,2812,2813],{},"ESP_SECURITY_CAS_HOST",[431,2815,2816],{},[361,2817,2818],{},"esp.security.cas-host",[431,2820,2821],{},[361,2822,2823],{},"https:\u002F\u002Flogin.esprofiler.com",[431,2825,2826],{},"Central CAS OAuth2 server",[413,2828,2829,2834,2839,2844],{},[431,2830,2831],{},[361,2832,2833],{},"ESP_SECURITY_SERVICE_CLIENT_ID",[431,2835,2836],{},[361,2837,2838],{},"esp.security.service.client-id",[431,2840,2841],{},[2272,2842,2843],{},"(Platform Client ID)",[431,2845,2846],{},"Inter-service OAuth2 Client ID",[413,2848,2849,2854,2859,2864],{},[431,2850,2851],{},[361,2852,2853],{},"ESP_SECURITY_SERVICE_CLIENT_SECRET",[431,2855,2856],{},[361,2857,2858],{},"esp.security.service.client-secret",[431,2860,2861],{},[2272,2862,2863],{},"(Secret)",[431,2865,2866],{},"Inter-service OAuth2 Client Secret",[413,2868,2869,2874,2879,2884],{},[431,2870,2871],{},[361,2872,2873],{},"ESP_MFS_URL",[431,2875,2876],{},[361,2877,2878],{},"esp.mfs.url",[431,2880,2881],{},[361,2882,2883],{},"https:\u002F\u002Fapi.esprofiler.com\u002Fmfs",[431,2885,2886],{},"Module & Feature Service endpoint",[413,2888,2889,2894,2899,2904],{},[431,2890,2891],{},[361,2892,2893],{},"ESP_CES_URL",[431,2895,2896],{},[361,2897,2898],{},"esp.ces.url",[431,2900,2901],{},[361,2902,2903],{},"https:\u002F\u002Fapi.esprofiler.com\u002Fces",[431,2905,2906],{},"Capability Engine Service endpoint",[413,2908,2909,2914,2919,2924],{},[431,2910,2911],{},[361,2912,2913],{},"ESP_CPS_URL",[431,2915,2916],{},[361,2917,2918],{},"esp.cps.url",[431,2920,2921],{},[361,2922,2923],{},"https:\u002F\u002Fapi.esprofiler.com\u002Fcps",[431,2925,2926],{},"Customer Platform Service endpoint",[413,2928,2929,2934,2939,2944],{},[431,2930,2931],{},[361,2932,2933],{},"ESP_CCS_URL",[431,2935,2936],{},[361,2937,2938],{},"esp.ccs.url",[431,2940,2941],{},[361,2942,2943],{},"https:\u002F\u002Fapi.esprofiler.com\u002Fccs",[431,2945,2946],{},"Capability Catalog Service endpoint",[413,2948,2949,2954,2959,2964],{},[431,2950,2951],{},[361,2952,2953],{},"ESP_PES_URL",[431,2955,2956],{},[361,2957,2958],{},"esp.pes.url",[431,2960,2961],{},[361,2962,2963],{},"https:\u002F\u002Fapi.esprofiler.com\u002Fpes",[431,2965,2966],{},"Policy Engine Service endpoint",[413,2968,2969,2974,2979,2984],{},[431,2970,2971],{},[361,2972,2973],{},"ESP_LLM_OBSERVATION_OTLP_ENDPOINT",[431,2975,2976],{},[361,2977,2978],{},"esp.llm.observation.otlp.endpoint",[431,2980,2981],{},[361,2982,2983],{},"https:\u002F\u002Fesplf.esprofiler.com\u002Fapi\u002Fpublic\u002Fotel\u002Fv1\u002Ftraces",[431,2985,2986],{},"Langfuse OTLP ingest endpoint",[413,2988,2989,2994,2999,3004],{},[431,2990,2991],{},[361,2992,2993],{},"ESP_LLM_OBSERVATION_ENVIRONMENT",[431,2995,2996],{},[361,2997,2998],{},"esp.llm.observation.environment",[431,3000,3001],{},[361,3002,3003],{},"prod",[431,3005,3006],{},"Langfuse environment tag",[381,3008],{},[384,3010,3012],{"id":3011},"tenant-configuration-archetypes-examples","Tenant Configuration Archetypes (Examples)",[354,3014,3015],{},"Below are practical configuration examples illustrating how environment variables are set up for different customer profiles in AWS ECS.",[402,3017,3019],{"id":3018},"archetype-a-standard-commercial-tenant-uk-gbp","Archetype A: Standard Commercial Tenant (UK \u002F GBP)",[392,3021,3025],{"className":3022,"code":3023,"language":3024,"meta":400,"style":400},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"name\": \"ESP_EXTERNAL_DOMAIN\",\n  \"value\": \"fintech-uk.own.esprofiler.com\"\n},\n{\n  \"name\": \"ESP_CLIENT_ID\",\n  \"value\": \"7f83b2c1-4d5e-4a6b-9c8d-0e1f2a3b4c5d\"\n},\n{\n  \"name\": \"ESP_SECURITY_ORGANISATION_ALIAS\",\n  \"value\": \"fintech-uk\"\n},\n{\n  \"name\": \"ESP_CURRENCY_TARGET\",\n  \"value\": \"GBP\"\n},\n{\n  \"name\": \"ESP_MODULES_ENABLED_COMMERCIAL\",\n  \"value\": \"true\"\n},\n{\n  \"name\": \"ESP_MODULES_ENABLED_THREAT_ANALYTICS\",\n  \"value\": \"true\"\n},\n{\n  \"name\": \"ESP_MODULES_ENABLED_DEEP_RESEARCH\",\n  \"value\": \"true\"\n},\n{\n  \"name\": \"ESP_LLM_OBSERVATION_CONTENT_CAPTURE_MODE\",\n  \"value\": \"FULL\"\n},\n{\n  \"name\": \"ESP_NOTIFICATION_POSTHOG_ENABLED\",\n  \"value\": \"true\"\n}\n","json",[361,3026,3027,3032,3056,3075,3083,3087,3105,3122,3128,3132,3150,3167,3173,3177,3195,3211,3217,3221,3239,3255,3261,3265,3283,3299,3305,3309,3327,3343,3349,3353,3371,3387,3393,3397,3415,3431],{"__ignoreMap":400},[627,3028,3029],{"class":629,"line":630},[627,3030,3031],{"class":981},"{\n",[627,3033,3034,3037,3041,3044,3046,3049,3051,3053],{"class":629,"line":636},[627,3035,3036],{"class":981},"  \"",[627,3038,3040],{"class":3039},"spNyl","name",[627,3042,3043],{"class":981},"\"",[627,3045,996],{"class":981},[627,3047,3048],{"class":981}," \"",[627,3050,539],{"class":999},[627,3052,3043],{"class":981},[627,3054,3055],{"class":981},",\n",[627,3057,3058,3060,3063,3065,3067,3069,3072],{"class":629,"line":642},[627,3059,3036],{"class":981},[627,3061,3062],{"class":3039},"value",[627,3064,3043],{"class":981},[627,3066,996],{"class":981},[627,3068,3048],{"class":981},[627,3070,3071],{"class":999},"fintech-uk.own.esprofiler.com",[627,3073,3074],{"class":981},"\"\n",[627,3076,3077,3080],{"class":629,"line":648},[627,3078,3079],{"class":981},"}",[627,3081,3055],{"class":3082},"sTEyZ",[627,3084,3085],{"class":629,"line":654},[627,3086,3031],{"class":981},[627,3088,3089,3091,3093,3095,3097,3099,3101,3103],{"class":629,"line":660},[627,3090,3036],{"class":981},[627,3092,3040],{"class":3039},[627,3094,3043],{"class":981},[627,3096,996],{"class":981},[627,3098,3048],{"class":981},[627,3100,554],{"class":999},[627,3102,3043],{"class":981},[627,3104,3055],{"class":981},[627,3106,3107,3109,3111,3113,3115,3117,3120],{"class":629,"line":1033},[627,3108,3036],{"class":981},[627,3110,3062],{"class":3039},[627,3112,3043],{"class":981},[627,3114,996],{"class":981},[627,3116,3048],{"class":981},[627,3118,3119],{"class":999},"7f83b2c1-4d5e-4a6b-9c8d-0e1f2a3b4c5d",[627,3121,3074],{"class":981},[627,3123,3124,3126],{"class":629,"line":1044},[627,3125,3079],{"class":981},[627,3127,3055],{"class":3082},[627,3129,3130],{"class":629,"line":1052},[627,3131,3031],{"class":981},[627,3133,3134,3136,3138,3140,3142,3144,3146,3148],{"class":629,"line":1064},[627,3135,3036],{"class":981},[627,3137,3040],{"class":3039},[627,3139,3043],{"class":981},[627,3141,996],{"class":981},[627,3143,3048],{"class":981},[627,3145,562],{"class":999},[627,3147,3043],{"class":981},[627,3149,3055],{"class":981},[627,3151,3152,3154,3156,3158,3160,3162,3165],{"class":629,"line":1075},[627,3153,3036],{"class":981},[627,3155,3062],{"class":3039},[627,3157,3043],{"class":981},[627,3159,996],{"class":981},[627,3161,3048],{"class":981},[627,3163,3164],{"class":999},"fintech-uk",[627,3166,3074],{"class":981},[627,3168,3169,3171],{"class":629,"line":1086},[627,3170,3079],{"class":981},[627,3172,3055],{"class":3082},[627,3174,3175],{"class":629,"line":1094},[627,3176,3031],{"class":981},[627,3178,3179,3181,3183,3185,3187,3189,3191,3193],{"class":629,"line":1106},[627,3180,3036],{"class":981},[627,3182,3040],{"class":3039},[627,3184,3043],{"class":981},[627,3186,996],{"class":981},[627,3188,3048],{"class":981},[627,3190,679],{"class":999},[627,3192,3043],{"class":981},[627,3194,3055],{"class":981},[627,3196,3197,3199,3201,3203,3205,3207,3209],{"class":629,"line":1116},[627,3198,3036],{"class":981},[627,3200,3062],{"class":3039},[627,3202,3043],{"class":981},[627,3204,996],{"class":981},[627,3206,3048],{"class":981},[627,3208,683],{"class":999},[627,3210,3074],{"class":981},[627,3212,3213,3215],{"class":629,"line":1124},[627,3214,3079],{"class":981},[627,3216,3055],{"class":3082},[627,3218,3219],{"class":629,"line":1135},[627,3220,3031],{"class":981},[627,3222,3223,3225,3227,3229,3231,3233,3235,3237],{"class":629,"line":1143},[627,3224,3036],{"class":981},[627,3226,3040],{"class":3039},[627,3228,3043],{"class":981},[627,3230,996],{"class":981},[627,3232,3048],{"class":981},[627,3234,2523],{"class":999},[627,3236,3043],{"class":981},[627,3238,3055],{"class":981},[627,3240,3241,3243,3245,3247,3249,3251,3253],{"class":629,"line":1151},[627,3242,3036],{"class":981},[627,3244,3062],{"class":3039},[627,3246,3043],{"class":981},[627,3248,996],{"class":981},[627,3250,3048],{"class":981},[627,3252,595],{"class":999},[627,3254,3074],{"class":981},[627,3256,3257,3259],{"class":629,"line":1162},[627,3258,3079],{"class":981},[627,3260,3055],{"class":3082},[627,3262,3263],{"class":629,"line":1170},[627,3264,3031],{"class":981},[627,3266,3267,3269,3271,3273,3275,3277,3279,3281],{"class":629,"line":1181},[627,3268,3036],{"class":981},[627,3270,3040],{"class":3039},[627,3272,3043],{"class":981},[627,3274,996],{"class":981},[627,3276,3048],{"class":981},[627,3278,2599],{"class":999},[627,3280,3043],{"class":981},[627,3282,3055],{"class":981},[627,3284,3285,3287,3289,3291,3293,3295,3297],{"class":629,"line":1189},[627,3286,3036],{"class":981},[627,3288,3062],{"class":3039},[627,3290,3043],{"class":981},[627,3292,996],{"class":981},[627,3294,3048],{"class":981},[627,3296,595],{"class":999},[627,3298,3074],{"class":981},[627,3300,3301,3303],{"class":629,"line":1200},[627,3302,3079],{"class":981},[627,3304,3055],{"class":3082},[627,3306,3307],{"class":629,"line":1208},[627,3308,3031],{"class":981},[627,3310,3311,3313,3315,3317,3319,3321,3323,3325],{"class":629,"line":1216},[627,3312,3036],{"class":981},[627,3314,3040],{"class":3039},[627,3316,3043],{"class":981},[627,3318,996],{"class":981},[627,3320,3048],{"class":981},[627,3322,2618],{"class":999},[627,3324,3043],{"class":981},[627,3326,3055],{"class":981},[627,3328,3329,3331,3333,3335,3337,3339,3341],{"class":629,"line":1224},[627,3330,3036],{"class":981},[627,3332,3062],{"class":3039},[627,3334,3043],{"class":981},[627,3336,996],{"class":981},[627,3338,3048],{"class":981},[627,3340,595],{"class":999},[627,3342,3074],{"class":981},[627,3344,3345,3347],{"class":629,"line":1234},[627,3346,3079],{"class":981},[627,3348,3055],{"class":3082},[627,3350,3351],{"class":629,"line":1245},[627,3352,3031],{"class":981},[627,3354,3355,3357,3359,3361,3363,3365,3367,3369],{"class":629,"line":1252},[627,3356,3036],{"class":981},[627,3358,3040],{"class":3039},[627,3360,3043],{"class":981},[627,3362,996],{"class":981},[627,3364,3048],{"class":981},[627,3366,835],{"class":999},[627,3368,3043],{"class":981},[627,3370,3055],{"class":981},[627,3372,3373,3375,3377,3379,3381,3383,3385],{"class":629,"line":1260},[627,3374,3036],{"class":981},[627,3376,3062],{"class":3039},[627,3378,3043],{"class":981},[627,3380,996],{"class":981},[627,3382,3048],{"class":981},[627,3384,843],{"class":999},[627,3386,3074],{"class":981},[627,3388,3389,3391],{"class":629,"line":1270},[627,3390,3079],{"class":981},[627,3392,3055],{"class":3082},[627,3394,3395],{"class":629,"line":1281},[627,3396,3031],{"class":981},[627,3398,3399,3401,3403,3405,3407,3409,3411,3413],{"class":629,"line":1292},[627,3400,3036],{"class":981},[627,3402,3040],{"class":3039},[627,3404,3043],{"class":981},[627,3406,996],{"class":981},[627,3408,3048],{"class":981},[627,3410,863],{"class":999},[627,3412,3043],{"class":981},[627,3414,3055],{"class":981},[627,3416,3417,3419,3421,3423,3425,3427,3429],{"class":629,"line":1303},[627,3418,3036],{"class":981},[627,3420,3062],{"class":3039},[627,3422,3043],{"class":981},[627,3424,996],{"class":981},[627,3426,3048],{"class":981},[627,3428,595],{"class":999},[627,3430,3074],{"class":981},[627,3432,3433],{"class":629,"line":1311},[627,3434,3435],{"class":981},"}\n",[402,3437,3439],{"id":3438},"archetype-b-strict-compliance-privacy-tenant-us-healthcare-usd","Archetype B: Strict Compliance & Privacy Tenant (US Healthcare \u002F USD)",[354,3441,3442],{},"Enforces prompt redaction in Langfuse, displays a mandatory HIPAA\u002FLegal disclaimer modal, turns off product usage analytics, and aggregates spend in USD:",[392,3444,3446],{"className":3022,"code":3445,"language":3024,"meta":400,"style":400},"{\n  \"name\": \"ESP_EXTERNAL_DOMAIN\",\n  \"value\": \"healthcorp.own.esprofiler.com\"\n},\n{\n  \"name\": \"ESP_CLIENT_ID\",\n  \"value\": \"3b2a1c0d-9e8f-4a5b-6c7d-8e9f0a1b2c3d\"\n},\n{\n  \"name\": \"ESP_SECURITY_ORGANISATION_ALIAS\",\n  \"value\": \"healthcorp-us\"\n},\n{\n  \"name\": \"ESP_CURRENCY_TARGET\",\n  \"value\": \"USD\"\n},\n{\n  \"name\": \"ESP_SPA_SHOW_NOTICE\",\n  \"value\": \"true\"\n},\n{\n  \"name\": \"ESP_SPA_NOTICE_MESSAGE\",\n  \"value\": \"WARNING: This system contains confidential patient and healthcare data. Unauthorized access or export is strictly prohibited and subject to legal prosecution under HIPAA and federal law.\"\n},\n{\n  \"name\": \"ESP_LLM_OBSERVATION_CONTENT_CAPTURE_MODE\",\n  \"value\": \"REDACTED\"\n},\n{\n  \"name\": \"ESP_NOTIFICATION_POSTHOG_ENABLED\",\n  \"value\": \"false\"\n},\n{\n  \"name\": \"ESP_INTELLIGENCE_STACK_GAP_PHANTOM_THRESHOLD\",\n  \"value\": \"0.80\"\n}\n",[361,3447,3448,3452,3470,3487,3493,3497,3515,3532,3538,3542,3560,3577,3583,3587,3605,3621,3627,3631,3649,3665,3671,3675,3693,3710,3716,3720,3738,3754,3760,3764,3782,3798,3804,3808,3826,3843],{"__ignoreMap":400},[627,3449,3450],{"class":629,"line":630},[627,3451,3031],{"class":981},[627,3453,3454,3456,3458,3460,3462,3464,3466,3468],{"class":629,"line":636},[627,3455,3036],{"class":981},[627,3457,3040],{"class":3039},[627,3459,3043],{"class":981},[627,3461,996],{"class":981},[627,3463,3048],{"class":981},[627,3465,539],{"class":999},[627,3467,3043],{"class":981},[627,3469,3055],{"class":981},[627,3471,3472,3474,3476,3478,3480,3482,3485],{"class":629,"line":642},[627,3473,3036],{"class":981},[627,3475,3062],{"class":3039},[627,3477,3043],{"class":981},[627,3479,996],{"class":981},[627,3481,3048],{"class":981},[627,3483,3484],{"class":999},"healthcorp.own.esprofiler.com",[627,3486,3074],{"class":981},[627,3488,3489,3491],{"class":629,"line":648},[627,3490,3079],{"class":981},[627,3492,3055],{"class":3082},[627,3494,3495],{"class":629,"line":654},[627,3496,3031],{"class":981},[627,3498,3499,3501,3503,3505,3507,3509,3511,3513],{"class":629,"line":660},[627,3500,3036],{"class":981},[627,3502,3040],{"class":3039},[627,3504,3043],{"class":981},[627,3506,996],{"class":981},[627,3508,3048],{"class":981},[627,3510,554],{"class":999},[627,3512,3043],{"class":981},[627,3514,3055],{"class":981},[627,3516,3517,3519,3521,3523,3525,3527,3530],{"class":629,"line":1033},[627,3518,3036],{"class":981},[627,3520,3062],{"class":3039},[627,3522,3043],{"class":981},[627,3524,996],{"class":981},[627,3526,3048],{"class":981},[627,3528,3529],{"class":999},"3b2a1c0d-9e8f-4a5b-6c7d-8e9f0a1b2c3d",[627,3531,3074],{"class":981},[627,3533,3534,3536],{"class":629,"line":1044},[627,3535,3079],{"class":981},[627,3537,3055],{"class":3082},[627,3539,3540],{"class":629,"line":1052},[627,3541,3031],{"class":981},[627,3543,3544,3546,3548,3550,3552,3554,3556,3558],{"class":629,"line":1064},[627,3545,3036],{"class":981},[627,3547,3040],{"class":3039},[627,3549,3043],{"class":981},[627,3551,996],{"class":981},[627,3553,3048],{"class":981},[627,3555,562],{"class":999},[627,3557,3043],{"class":981},[627,3559,3055],{"class":981},[627,3561,3562,3564,3566,3568,3570,3572,3575],{"class":629,"line":1075},[627,3563,3036],{"class":981},[627,3565,3062],{"class":3039},[627,3567,3043],{"class":981},[627,3569,996],{"class":981},[627,3571,3048],{"class":981},[627,3573,3574],{"class":999},"healthcorp-us",[627,3576,3074],{"class":981},[627,3578,3579,3581],{"class":629,"line":1086},[627,3580,3079],{"class":981},[627,3582,3055],{"class":3082},[627,3584,3585],{"class":629,"line":1094},[627,3586,3031],{"class":981},[627,3588,3589,3591,3593,3595,3597,3599,3601,3603],{"class":629,"line":1106},[627,3590,3036],{"class":981},[627,3592,3040],{"class":3039},[627,3594,3043],{"class":981},[627,3596,996],{"class":981},[627,3598,3048],{"class":981},[627,3600,679],{"class":999},[627,3602,3043],{"class":981},[627,3604,3055],{"class":981},[627,3606,3607,3609,3611,3613,3615,3617,3619],{"class":629,"line":1116},[627,3608,3036],{"class":981},[627,3610,3062],{"class":3039},[627,3612,3043],{"class":981},[627,3614,996],{"class":981},[627,3616,3048],{"class":981},[627,3618,686],{"class":999},[627,3620,3074],{"class":981},[627,3622,3623,3625],{"class":629,"line":1124},[627,3624,3079],{"class":981},[627,3626,3055],{"class":3082},[627,3628,3629],{"class":629,"line":1135},[627,3630,3031],{"class":981},[627,3632,3633,3635,3637,3639,3641,3643,3645,3647],{"class":629,"line":1143},[627,3634,3036],{"class":981},[627,3636,3040],{"class":3039},[627,3638,3043],{"class":981},[627,3640,996],{"class":981},[627,3642,3048],{"class":981},[627,3644,591],{"class":999},[627,3646,3043],{"class":981},[627,3648,3055],{"class":981},[627,3650,3651,3653,3655,3657,3659,3661,3663],{"class":629,"line":1151},[627,3652,3036],{"class":981},[627,3654,3062],{"class":3039},[627,3656,3043],{"class":981},[627,3658,996],{"class":981},[627,3660,3048],{"class":981},[627,3662,595],{"class":999},[627,3664,3074],{"class":981},[627,3666,3667,3669],{"class":629,"line":1162},[627,3668,3079],{"class":981},[627,3670,3055],{"class":3082},[627,3672,3673],{"class":629,"line":1170},[627,3674,3031],{"class":981},[627,3676,3677,3679,3681,3683,3685,3687,3689,3691],{"class":629,"line":1181},[627,3678,3036],{"class":981},[627,3680,3040],{"class":3039},[627,3682,3043],{"class":981},[627,3684,996],{"class":981},[627,3686,3048],{"class":981},[627,3688,607],{"class":999},[627,3690,3043],{"class":981},[627,3692,3055],{"class":981},[627,3694,3695,3697,3699,3701,3703,3705,3708],{"class":629,"line":1189},[627,3696,3036],{"class":981},[627,3698,3062],{"class":3039},[627,3700,3043],{"class":981},[627,3702,996],{"class":981},[627,3704,3048],{"class":981},[627,3706,3707],{"class":999},"WARNING: This system contains confidential patient and healthcare data. Unauthorized access or export is strictly prohibited and subject to legal prosecution under HIPAA and federal law.",[627,3709,3074],{"class":981},[627,3711,3712,3714],{"class":629,"line":1200},[627,3713,3079],{"class":981},[627,3715,3055],{"class":3082},[627,3717,3718],{"class":629,"line":1208},[627,3719,3031],{"class":981},[627,3721,3722,3724,3726,3728,3730,3732,3734,3736],{"class":629,"line":1216},[627,3723,3036],{"class":981},[627,3725,3040],{"class":3039},[627,3727,3043],{"class":981},[627,3729,996],{"class":981},[627,3731,3048],{"class":981},[627,3733,835],{"class":999},[627,3735,3043],{"class":981},[627,3737,3055],{"class":981},[627,3739,3740,3742,3744,3746,3748,3750,3752],{"class":629,"line":1224},[627,3741,3036],{"class":981},[627,3743,3062],{"class":3039},[627,3745,3043],{"class":981},[627,3747,996],{"class":981},[627,3749,3048],{"class":981},[627,3751,849],{"class":999},[627,3753,3074],{"class":981},[627,3755,3756,3758],{"class":629,"line":1234},[627,3757,3079],{"class":981},[627,3759,3055],{"class":3082},[627,3761,3762],{"class":629,"line":1245},[627,3763,3031],{"class":981},[627,3765,3766,3768,3770,3772,3774,3776,3778,3780],{"class":629,"line":1252},[627,3767,3036],{"class":981},[627,3769,3040],{"class":3039},[627,3771,3043],{"class":981},[627,3773,996],{"class":981},[627,3775,3048],{"class":981},[627,3777,863],{"class":999},[627,3779,3043],{"class":981},[627,3781,3055],{"class":981},[627,3783,3784,3786,3788,3790,3792,3794,3796],{"class":629,"line":1260},[627,3785,3036],{"class":981},[627,3787,3062],{"class":3039},[627,3789,3043],{"class":981},[627,3791,996],{"class":981},[627,3793,3048],{"class":981},[627,3795,599],{"class":999},[627,3797,3074],{"class":981},[627,3799,3800,3802],{"class":629,"line":1270},[627,3801,3079],{"class":981},[627,3803,3055],{"class":3082},[627,3805,3806],{"class":629,"line":1281},[627,3807,3031],{"class":981},[627,3809,3810,3812,3814,3816,3818,3820,3822,3824],{"class":629,"line":1292},[627,3811,3036],{"class":981},[627,3813,3040],{"class":3039},[627,3815,3043],{"class":981},[627,3817,996],{"class":981},[627,3819,3048],{"class":981},[627,3821,874],{"class":999},[627,3823,3043],{"class":981},[627,3825,3055],{"class":981},[627,3827,3828,3830,3832,3834,3836,3838,3841],{"class":629,"line":1303},[627,3829,3036],{"class":981},[627,3831,3062],{"class":3039},[627,3833,3043],{"class":981},[627,3835,996],{"class":981},[627,3837,3048],{"class":981},[627,3839,3840],{"class":999},"0.80",[627,3842,3074],{"class":981},[627,3844,3845],{"class":629,"line":1311},[627,3846,3435],{"class":981},[402,3848,3850],{"id":3849},"archetype-c-starter-light-tier-tenant-restricted-features","Archetype C: Starter \u002F Light Tier Tenant (Restricted Features)",[354,3852,3853],{},"Deploys a basic subscription where advanced modules like Autonomous Deep Research and Vendor Requests are disabled:",[392,3855,3857],{"className":3022,"code":3856,"language":3024,"meta":400,"style":400},"{\n  \"name\": \"ESP_EXTERNAL_DOMAIN\",\n  \"value\": \"starter-co.own.esprofiler.com\"\n},\n{\n  \"name\": \"ESP_CLIENT_ID\",\n  \"value\": \"c8d9e0f1-2a3b-4c5d-6e7f-8a9b0c1d2e3f\"\n},\n{\n  \"name\": \"ESP_MODULES_ENABLED_COMMERCIAL\",\n  \"value\": \"true\"\n},\n{\n  \"name\": \"ESP_MODULES_ENABLED_THREAT_ANALYTICS\",\n  \"value\": \"true\"\n},\n{\n  \"name\": \"ESP_MODULES_ENABLED_VENDOR_REQUEST\",\n  \"value\": \"false\"\n},\n{\n  \"name\": \"ESP_MODULES_ENABLED_DEEP_RESEARCH\",\n  \"value\": \"false\"\n}\n",[361,3858,3859,3863,3881,3898,3904,3908,3926,3943,3949,3953,3971,3987,3993,3997,4015,4031,4037,4041,4059,4075,4081,4085,4103,4119],{"__ignoreMap":400},[627,3860,3861],{"class":629,"line":630},[627,3862,3031],{"class":981},[627,3864,3865,3867,3869,3871,3873,3875,3877,3879],{"class":629,"line":636},[627,3866,3036],{"class":981},[627,3868,3040],{"class":3039},[627,3870,3043],{"class":981},[627,3872,996],{"class":981},[627,3874,3048],{"class":981},[627,3876,539],{"class":999},[627,3878,3043],{"class":981},[627,3880,3055],{"class":981},[627,3882,3883,3885,3887,3889,3891,3893,3896],{"class":629,"line":642},[627,3884,3036],{"class":981},[627,3886,3062],{"class":3039},[627,3888,3043],{"class":981},[627,3890,996],{"class":981},[627,3892,3048],{"class":981},[627,3894,3895],{"class":999},"starter-co.own.esprofiler.com",[627,3897,3074],{"class":981},[627,3899,3900,3902],{"class":629,"line":648},[627,3901,3079],{"class":981},[627,3903,3055],{"class":3082},[627,3905,3906],{"class":629,"line":654},[627,3907,3031],{"class":981},[627,3909,3910,3912,3914,3916,3918,3920,3922,3924],{"class":629,"line":660},[627,3911,3036],{"class":981},[627,3913,3040],{"class":3039},[627,3915,3043],{"class":981},[627,3917,996],{"class":981},[627,3919,3048],{"class":981},[627,3921,554],{"class":999},[627,3923,3043],{"class":981},[627,3925,3055],{"class":981},[627,3927,3928,3930,3932,3934,3936,3938,3941],{"class":629,"line":1033},[627,3929,3036],{"class":981},[627,3931,3062],{"class":3039},[627,3933,3043],{"class":981},[627,3935,996],{"class":981},[627,3937,3048],{"class":981},[627,3939,3940],{"class":999},"c8d9e0f1-2a3b-4c5d-6e7f-8a9b0c1d2e3f",[627,3942,3074],{"class":981},[627,3944,3945,3947],{"class":629,"line":1044},[627,3946,3079],{"class":981},[627,3948,3055],{"class":3082},[627,3950,3951],{"class":629,"line":1052},[627,3952,3031],{"class":981},[627,3954,3955,3957,3959,3961,3963,3965,3967,3969],{"class":629,"line":1064},[627,3956,3036],{"class":981},[627,3958,3040],{"class":3039},[627,3960,3043],{"class":981},[627,3962,996],{"class":981},[627,3964,3048],{"class":981},[627,3966,2523],{"class":999},[627,3968,3043],{"class":981},[627,3970,3055],{"class":981},[627,3972,3973,3975,3977,3979,3981,3983,3985],{"class":629,"line":1075},[627,3974,3036],{"class":981},[627,3976,3062],{"class":3039},[627,3978,3043],{"class":981},[627,3980,996],{"class":981},[627,3982,3048],{"class":981},[627,3984,595],{"class":999},[627,3986,3074],{"class":981},[627,3988,3989,3991],{"class":629,"line":1086},[627,3990,3079],{"class":981},[627,3992,3055],{"class":3082},[627,3994,3995],{"class":629,"line":1094},[627,3996,3031],{"class":981},[627,3998,3999,4001,4003,4005,4007,4009,4011,4013],{"class":629,"line":1106},[627,4000,3036],{"class":981},[627,4002,3040],{"class":3039},[627,4004,3043],{"class":981},[627,4006,996],{"class":981},[627,4008,3048],{"class":981},[627,4010,2599],{"class":999},[627,4012,3043],{"class":981},[627,4014,3055],{"class":981},[627,4016,4017,4019,4021,4023,4025,4027,4029],{"class":629,"line":1116},[627,4018,3036],{"class":981},[627,4020,3062],{"class":3039},[627,4022,3043],{"class":981},[627,4024,996],{"class":981},[627,4026,3048],{"class":981},[627,4028,595],{"class":999},[627,4030,3074],{"class":981},[627,4032,4033,4035],{"class":629,"line":1124},[627,4034,3079],{"class":981},[627,4036,3055],{"class":3082},[627,4038,4039],{"class":629,"line":1135},[627,4040,3031],{"class":981},[627,4042,4043,4045,4047,4049,4051,4053,4055,4057],{"class":629,"line":1143},[627,4044,3036],{"class":981},[627,4046,3040],{"class":3039},[627,4048,3043],{"class":981},[627,4050,996],{"class":981},[627,4052,3048],{"class":981},[627,4054,2580],{"class":999},[627,4056,3043],{"class":981},[627,4058,3055],{"class":981},[627,4060,4061,4063,4065,4067,4069,4071,4073],{"class":629,"line":1151},[627,4062,3036],{"class":981},[627,4064,3062],{"class":3039},[627,4066,3043],{"class":981},[627,4068,996],{"class":981},[627,4070,3048],{"class":981},[627,4072,599],{"class":999},[627,4074,3074],{"class":981},[627,4076,4077,4079],{"class":629,"line":1162},[627,4078,3079],{"class":981},[627,4080,3055],{"class":3082},[627,4082,4083],{"class":629,"line":1170},[627,4084,3031],{"class":981},[627,4086,4087,4089,4091,4093,4095,4097,4099,4101],{"class":629,"line":1181},[627,4088,3036],{"class":981},[627,4090,3040],{"class":3039},[627,4092,3043],{"class":981},[627,4094,996],{"class":981},[627,4096,3048],{"class":981},[627,4098,2618],{"class":999},[627,4100,3043],{"class":981},[627,4102,3055],{"class":981},[627,4104,4105,4107,4109,4111,4113,4115,4117],{"class":629,"line":1189},[627,4106,3036],{"class":981},[627,4108,3062],{"class":3039},[627,4110,3043],{"class":981},[627,4112,996],{"class":981},[627,4114,3048],{"class":981},[627,4116,599],{"class":999},[627,4118,3074],{"class":981},[627,4120,4121],{"class":629,"line":1200},[627,4122,3435],{"class":981},[381,4124],{},[384,4126,4128],{"id":4127},"troubleshooting-common-misconfigurations","Troubleshooting Common Misconfigurations",[402,4130,4132],{"id":4131},"_1-database-connection-timeout-on-boot","1. Database Connection Timeout on Boot",[530,4134,4135,4144],{},[533,4136,4137,4140,4141,2132],{},[358,4138,4139],{},"Symptom:"," ",[361,4142,4143],{},"HikariPool-1 - Connection is not available, request timed out after 10000ms",[533,4145,4146,4149,4150,4153,4154,4157],{},[358,4147,4148],{},"Remedy:"," Ensure the ECS Security Group allows outbound TCP on port ",[361,4151,4152],{},"3306"," (MySQL) and ",[361,4155,4156],{},"5432"," (PostgreSQL) to the RDS security group. Check that RDS instance endpoints resolve in the tenant VPC.",[402,4159,4161],{"id":4160},"_2-gcp-private-key-formatting-error","2. GCP Private Key Formatting Error",[530,4163,4164,4172],{},[533,4165,4166,4140,4168,4171],{},[358,4167,4139],{},[361,4169,4170],{},"IllegalArgumentException: Invalid private key format"," or JSON parsing error.",[533,4173,4174,4176,4177,4180,4181,4184,4185,4188],{},[358,4175,4148],{}," When passing the GCP private key via ECS Task Definition environment variables, newline characters (",[361,4178,4179],{},"\\n",") can get unescaped. Either encode the key in Base64 and prefix with ",[361,4182,4183],{},"B64:"," (e.g., ",[361,4186,4187],{},"B64:MIIEvQIBAD...","), or store the multiline key directly in AWS Secrets Manager and reference it via ECS secret value ARN.",[402,4190,4192],{"id":4191},"_3-opentelemetry-langfuse-4318-post-error","3. OpenTelemetry \u002F Langfuse 4318 POST Error",[530,4194,4195,4203],{},[533,4196,4197,4199,4200,2132],{},[358,4198,4139],{}," Continuous ",[361,4201,4202],{},"Failed to export metrics: localhost:4318\u002Fv1\u002Fmetrics connection refused",[533,4204,4205,4207,4208,4211,4212,4214,4215,4218],{},[358,4206,4148],{}," Verify that ",[361,4209,4210],{},"management.otlp.metrics.export.enabled"," is set to ",[361,4213,599],{},". Langfuse only accepts traces (",[361,4216,4217],{},"\u002Fapi\u002Fpublic\u002Fotel\u002Fv1\u002Ftraces","), not OpenTelemetry metrics.",[402,4220,4222],{"id":4221},"_4-quartz-lock-cluster-check-in-failure","4. Quartz Lock \u002F Cluster Check-in Failure",[530,4224,4225,4232],{},[533,4226,4227,4140,4229,2132],{},[358,4228,4139],{},[361,4230,4231],{},"ClusterManager: Error managing cluster: Failure obtaining db row lock: Table 'QRTZ_LOCKS' doesn't exist",[533,4233,4234,4236],{},[358,4235,4148],{}," Verify that Liquibase successfully ran on startup and that the database user has permissions to create and lock Quartz tables.",[4238,4239,4240],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":400,"searchDepth":636,"depth":636,"links":4242},[4243,4246,4256,4260,4261,4262,4263,4268,4273],{"id":386,"depth":636,"text":387,"children":4244},[4245],{"id":404,"depth":642,"text":405},{"id":511,"depth":636,"text":512,"children":4247},[4248,4249,4250,4251,4252,4253,4254,4255],{"id":524,"depth":642,"text":525},{"id":566,"depth":642,"text":567},{"id":611,"depth":642,"text":612},{"id":666,"depth":642,"text":667},{"id":731,"depth":642,"text":732},{"id":785,"depth":642,"text":786},{"id":822,"depth":642,"text":823},{"id":899,"depth":642,"text":900},{"id":938,"depth":636,"text":939,"children":4257},[4258,4259],{"id":964,"depth":642,"text":965},{"id":1377,"depth":642,"text":1378},{"id":1519,"depth":636,"text":1520},{"id":1778,"depth":636,"text":1779},{"id":1968,"depth":636,"text":1969},{"id":2117,"depth":636,"text":2118,"children":4264},[4265,4266,4267],{"id":2135,"depth":642,"text":2136},{"id":2393,"depth":642,"text":2394},{"id":2731,"depth":642,"text":2732},{"id":3011,"depth":636,"text":3012,"children":4269},[4270,4271,4272],{"id":3018,"depth":642,"text":3019},{"id":3438,"depth":642,"text":3439},{"id":3849,"depth":642,"text":3850},{"id":4127,"depth":636,"text":4128,"children":4274},[4275,4276,4277,4278],{"id":4131,"depth":642,"text":4132},{"id":4160,"depth":642,"text":4161},{"id":4191,"depth":642,"text":4192},{"id":4221,"depth":642,"text":4222},"Comprehensive deployment and configuration guide for the esp-platform application.yml, covering tenant-specific customization, environment profiles, database connections, central services, AI\u002FLLM observability, and ECS variables.","md",null,{},{"title":164,"description":4279},"TqBHkRGL6-9BBJDCB2mRQvcpFRwBrVTVgTywUK1CD4c",[4286,4288],{"title":160,"path":161,"stem":162,"description":4287,"children":-1},"Complete step-by-step guide for deploying and configuring Langfuse on AWS ECS using our latest task definitions, EFS for ClickHouse, S3, ALB target groups, and Cloudflare.",{"title":168,"path":169,"stem":170,"description":4289,"children":-1},"A comprehensive overview of the deployment process for new ESProfiler tenants",1789726610388]