[{"data":1,"prerenderedAt":1650},["ShallowReactive",2],{"navigation_docs":3,"-engineering-github-workflows":279,"-engineering-github-workflows-surround":1645},[4,8,67,96,162,186,199,216,275],{"title":5,"path":6,"stem":7},"Introduction","\u002Fintroduction","0.introduction",{"title":9,"path":10,"stem":11,"children":12,"page":62},"Company","\u002Fcompany","1.company",[13,17,21,25,29,33,37,41,45,49,63],{"title":14,"path":15,"stem":16},"About","\u002Fcompany\u002Fabout","1.company\u002F0.about",{"title":18,"path":19,"stem":20},"Values","\u002Fcompany\u002Fvalues","1.company\u002F1.values",{"title":22,"path":23,"stem":24},"Communication","\u002Fcompany\u002Fcommunication","1.company\u002Fcommunication",{"title":26,"path":27,"stem":28},"Competition","\u002Fcompany\u002Fcompetition","1.company\u002Fcompetition",{"title":30,"path":31,"stem":32},"Hybrid Working","\u002Fcompany\u002Fhybrid-working","1.company\u002Fhybrid-working",{"title":34,"path":35,"stem":36},"Manchester Office","\u002Fcompany\u002Foffice","1.company\u002Foffice",{"title":38,"path":39,"stem":40},"Operations","\u002Fcompany\u002Foperations","1.company\u002Foperations",{"title":42,"path":43,"stem":44},"Policies","\u002Fcompany\u002Fpolicies","1.company\u002Fpolicies",{"title":46,"path":47,"stem":48},"Product Strategy","\u002Fcompany\u002Fproduct-strategy","1.company\u002Fproduct-strategy",{"title":50,"path":51,"stem":52,"children":53,"page":62},"Products","\u002Fcompany\u002Fproducts","1.company\u002Fproducts",[54,58],{"title":55,"path":56,"stem":57},"Capability Exchange","\u002Fcompany\u002Fproducts\u002Fcapability-exchange","1.company\u002Fproducts\u002Fcapability-exchange",{"title":59,"path":60,"stem":61},"ESProfiler Platform","\u002Fcompany\u002Fproducts\u002Fesprofiler","1.company\u002Fproducts\u002Fesprofiler",false,{"title":64,"path":65,"stem":66},"Security","\u002Fcompany\u002Fsecurity","1.company\u002Fsecurity",{"title":68,"path":69,"stem":70,"children":71,"page":62},"People Ops","\u002Fpeople-ops","2.people-ops",[72,76,80,84,88,92],{"title":73,"path":74,"stem":75},"Compensation","\u002Fpeople-ops\u002Fcompensation","2.people-ops\u002Fcompensation",{"title":77,"path":78,"stem":79},"Education","\u002Fpeople-ops\u002Feducation","2.people-ops\u002Feducation",{"title":81,"path":82,"stem":83},"Expenses","\u002Fpeople-ops\u002Fexpenses","2.people-ops\u002Fexpenses",{"title":85,"path":86,"stem":87},"Holiday & Leave","\u002Fpeople-ops\u002Fleave","2.people-ops\u002Fleave",{"title":89,"path":90,"stem":91},"Onboarding","\u002Fpeople-ops\u002Fonboarding","2.people-ops\u002Fonboarding",{"title":93,"path":94,"stem":95},"Recruitment","\u002Fpeople-ops\u002Frecruitment","2.people-ops\u002Frecruitment",{"title":97,"path":98,"stem":99,"children":100,"page":62},"Engineering","\u002Fengineering","3.engineering",[101,105,109,113,125,146,150,154,158],{"title":102,"path":103,"stem":104},"Development Setup","\u002Fengineering\u002Fdevelopment-setup","3.engineering\u002F1.development-setup",{"title":106,"path":107,"stem":108},"Contributing","\u002Fengineering\u002Fcontributing","3.engineering\u002Fcontributing",{"title":110,"path":111,"stem":112},"Production Database","\u002Fengineering\u002Fdatabase-connection","3.engineering\u002Fdatabase-connection",{"title":114,"path":115,"stem":116,"children":117},"Deployment","\u002Fengineering\u002Fdeployment","3.engineering\u002Fdeployment",[118,121],{"title":55,"path":119,"stem":120},"\u002Fengineering\u002Fdeployment\u002Fcapability-exchange","3.engineering\u002Fdeployment\u002Fcapability-exchange",{"title":122,"path":123,"stem":124},"Platform","\u002Fengineering\u002Fdeployment\u002Fplatform","3.engineering\u002Fdeployment\u002Fplatform",{"title":126,"path":127,"stem":128,"children":129,"page":62},"Github","\u002Fengineering\u002Fgithub","3.engineering\u002Fgithub",[130,134,138,142],{"title":131,"path":132,"stem":133},"Packages","\u002Fengineering\u002Fgithub\u002Fpackages","3.engineering\u002Fgithub\u002Fpackages",{"title":135,"path":136,"stem":137},"Personal Access Token","\u002Fengineering\u002Fgithub\u002Fpersonal-access-token","3.engineering\u002Fgithub\u002Fpersonal-access-token",{"title":139,"path":140,"stem":141},"Troubleshooting","\u002Fengineering\u002Fgithub\u002Ftroubleshooting","3.engineering\u002Fgithub\u002Ftroubleshooting",{"title":143,"path":144,"stem":145},"Workflows","\u002Fengineering\u002Fgithub\u002Fworkflows","3.engineering\u002Fgithub\u002Fworkflows",{"title":147,"path":148,"stem":149},"Platform Ops","\u002Fengineering\u002Fplatform-ops","3.engineering\u002Fplatform-ops",{"title":151,"path":152,"stem":153},"Project Management","\u002Fengineering\u002Fproject-management","3.engineering\u002Fproject-management",{"title":155,"path":156,"stem":157},"Releases","\u002Fengineering\u002Frelease","3.engineering\u002Frelease",{"title":159,"path":160,"stem":161},"Tools","\u002Fengineering\u002Ftools","3.engineering\u002Ftools",{"title":163,"path":164,"stem":165,"children":166,"page":62},"Design","\u002Fdesign","4.design",[167,171,175,179,182],{"title":168,"path":169,"stem":170},"Branding","\u002Fdesign\u002Fbranding","4.design\u002Fbranding",{"title":172,"path":173,"stem":174},"Design Thinking","\u002Fdesign\u002Fdesign-thinking","4.design\u002Fdesign-thinking",{"title":176,"path":177,"stem":178},"Figma","\u002Fdesign\u002Ffigma-structure","4.design\u002Ffigma-structure",{"title":159,"path":180,"stem":181},"\u002Fdesign\u002Ftools","4.design\u002Ftools",{"title":183,"path":184,"stem":185},"Customer Success","\u002Fdesign\u002Fworking-with-customers","4.design\u002Fworking-with-customers",{"title":187,"path":188,"stem":189,"children":190,"page":62},"Sales","\u002Fsales","4.sales",[191,195],{"title":192,"path":193,"stem":194},"Customer Onboarding","\u002Fsales\u002Fonboarding","4.sales\u002Fonboarding",{"title":196,"path":197,"stem":198},"Sales Tools","\u002Fsales\u002Ftools","4.sales\u002Ftools",{"title":200,"path":201,"stem":202,"children":203,"page":62},"Marketing","\u002Fmarketing","5.marketing",[204,208,212],{"title":205,"path":206,"stem":207},"Content","\u002Fmarketing\u002Fcontent","5.marketing\u002Fcontent",{"title":209,"path":210,"stem":211},"Messaging","\u002Fmarketing\u002Fmessaging","5.marketing\u002Fmessaging",{"title":213,"path":214,"stem":215},"Website","\u002Fmarketing\u002Fwebsite","5.marketing\u002Fwebsite",{"title":217,"path":218,"stem":219,"children":220,"page":62},"AI & Data Ops","\u002Fdata-ops","6.data-ops",[221,229,233,258,271],{"title":55,"path":222,"stem":223,"children":224,"page":62},"\u002Fdata-ops\u002Fcapability-exchange","6.data-ops\u002FCapability Exchange",[225],{"title":226,"path":227,"stem":228},"Leaderboard Calculation","\u002Fdata-ops\u002Fcapability-exchange\u002Fleaderboard-calculation","6.data-ops\u002FCapability Exchange\u002Fleaderboard-calculation",{"title":230,"path":231,"stem":232},"Account Portal (CAS)","\u002Fdata-ops\u002Faccount-portal","6.data-ops\u002Faccount-portal",{"title":234,"path":235,"stem":236,"children":237,"page":62},"Data Management","\u002Fdata-ops\u002Fdata-management","6.data-ops\u002Fdata-management",[238,242,246,250,254],{"title":239,"path":240,"stem":241},"Adding Products","\u002Fdata-ops\u002Fdata-management\u002Fadding-products","6.data-ops\u002Fdata-management\u002Fadding-products",{"title":243,"path":244,"stem":245},"Adding Vendors","\u002Fdata-ops\u002Fdata-management\u002Fadding-vendors","6.data-ops\u002Fdata-management\u002Fadding-vendors",{"title":247,"path":248,"stem":249},"Framework Mapping","\u002Fdata-ops\u002Fdata-management\u002Fframework-mapping","6.data-ops\u002Fdata-management\u002Fframework-mapping",{"title":251,"path":252,"stem":253},"Refreshing Vendors","\u002Fdata-ops\u002Fdata-management\u002Frefreshing-vendors","6.data-ops\u002Fdata-management\u002Frefreshing-vendors",{"title":255,"path":256,"stem":257},"Reviewing Draft Vendors","\u002Fdata-ops\u002Fdata-management\u002Freviewing-draft-vendors","6.data-ops\u002Fdata-management\u002Freviewing-draft-vendors",{"title":259,"path":260,"stem":261,"children":262,"page":62},"LLM Ops","\u002Fdata-ops\u002Fllm-ops","6.data-ops\u002Fllm-ops",[263,267],{"title":264,"path":265,"stem":266},"Agents","\u002Fdata-ops\u002Fllm-ops\u002Fagents","6.data-ops\u002Fllm-ops\u002F1.agents",{"title":268,"path":269,"stem":270},"ESPi Architecture & Query Flow","\u002Fdata-ops\u002Fllm-ops\u002Fespi-architecture","6.data-ops\u002Fllm-ops\u002F2.espi-architecture",{"title":272,"path":273,"stem":274},"Message Queues","\u002Fdata-ops\u002Fmessage-queues","6.data-ops\u002Fmessage-queues",{"title":276,"path":277,"stem":278},"Glossary","\u002Fglossary","glossary",{"id":280,"title":143,"body":281,"description":1639,"extension":1640,"links":1641,"meta":1642,"navigation":351,"path":144,"seo":1643,"stem":145,"__hash__":1644},"docs\u002F3.engineering\u002Fgithub\u002Fworkflows.md",{"type":282,"value":283,"toc":1631},"minimark",[284,289,298,305,310,320,481,484,488,493,501,1388,1392,1399,1596,1598,1600,1604,1619,1627],[285,286,288],"h2",{"id":287},"centralised-workflows","Centralised workflows",[290,291,292,293,297],"p",{},"We can define reusable GitHub Actions workflows in a central repository and call them from multiple repositories using ",[294,295,296],"code",{},"workflow_call",".",[290,299,300,301,304],{},"At ESProfiler, these shared workflows live in ",[294,302,303],{},"ES-Profiler\u002F.github-private"," and are consumed from project repositories to keep automation consistent and avoid duplicated workflow logic.",[306,307,309],"h4",{"id":308},"calling-a-shared-workflow","Calling a Shared Workflow",[290,311,312,313,315,316,319],{},"In any repository within the ESProfiler organisation, you can call a centrally defined workflow. These workflows must be stored in the ",[294,314,303],{}," repository. This example shows how to call the ",[294,317,318],{},"mark-released-items-done"," workflow:",[321,322,327],"pre",{"className":323,"code":324,"language":325,"meta":326,"style":326},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name: Mark released issues as 'Done'\n\non:\n  release:\n    types: [published]\n\njobs:\n  call-shared-workflow:\n    uses: ES-Profiler\u002F.github-private\u002F.github\u002Fworkflows\u002Fmark-released-items-done.yml@main\n    secrets: inherit\n    permissions:\n      contents: read\n      pull-requests: read\n      issues: write\n      repository-projects: write\n","yaml","",[294,328,329,346,353,363,371,388,393,401,409,420,431,439,450,460,471],{"__ignoreMap":326},[330,331,334,338,342],"span",{"class":332,"line":333},"line",1,[330,335,337],{"class":336},"swJcz","name",[330,339,341],{"class":340},"sMK4o",":",[330,343,345],{"class":344},"sfazB"," Mark released issues as 'Done'\n",[330,347,349],{"class":332,"line":348},2,[330,350,352],{"emptyLinePlaceholder":351},true,"\n",[330,354,356,360],{"class":332,"line":355},3,[330,357,359],{"class":358},"sfNiH","on",[330,361,362],{"class":340},":\n",[330,364,366,369],{"class":332,"line":365},4,[330,367,368],{"class":336},"  release",[330,370,362],{"class":340},[330,372,374,377,379,382,385],{"class":332,"line":373},5,[330,375,376],{"class":336},"    types",[330,378,341],{"class":340},[330,380,381],{"class":340}," [",[330,383,384],{"class":344},"published",[330,386,387],{"class":340},"]\n",[330,389,391],{"class":332,"line":390},6,[330,392,352],{"emptyLinePlaceholder":351},[330,394,396,399],{"class":332,"line":395},7,[330,397,398],{"class":336},"jobs",[330,400,362],{"class":340},[330,402,404,407],{"class":332,"line":403},8,[330,405,406],{"class":336},"  call-shared-workflow",[330,408,362],{"class":340},[330,410,412,415,417],{"class":332,"line":411},9,[330,413,414],{"class":336},"    uses",[330,416,341],{"class":340},[330,418,419],{"class":344}," ES-Profiler\u002F.github-private\u002F.github\u002Fworkflows\u002Fmark-released-items-done.yml@main\n",[330,421,423,426,428],{"class":332,"line":422},10,[330,424,425],{"class":336},"    secrets",[330,427,341],{"class":340},[330,429,430],{"class":344}," inherit\n",[330,432,434,437],{"class":332,"line":433},11,[330,435,436],{"class":336},"    permissions",[330,438,362],{"class":340},[330,440,442,445,447],{"class":332,"line":441},12,[330,443,444],{"class":336},"      contents",[330,446,341],{"class":340},[330,448,449],{"class":344}," read\n",[330,451,453,456,458],{"class":332,"line":452},13,[330,454,455],{"class":336},"      pull-requests",[330,457,341],{"class":340},[330,459,449],{"class":344},[330,461,463,466,468],{"class":332,"line":462},14,[330,464,465],{"class":336},"      issues",[330,467,341],{"class":340},[330,469,470],{"class":344}," write\n",[330,472,474,477,479],{"class":332,"line":473},15,[330,475,476],{"class":336},"      repository-projects",[330,478,341],{"class":340},[330,480,470],{"class":344},[482,483],"hr",{},[285,485,487],{"id":486},"example-workflows","Example Workflows",[489,490,492],"h3",{"id":491},"marking-released-items-as-done","Marking released items as \"Done\"",[290,494,495,496,500],{},"This workflow finds pull requests referenced in release notes, discovers the issues those PRs close, updates their project status to ",[497,498,499],"strong",{},"Done",", and comments on each issue with a link back to the published release.",[321,502,504],{"className":323,"code":503,"language":325,"meta":326,"style":326},"name: Mark released issues as 'Done'\n\non:\n  workflow_call:\n\njobs:\n  update-issues:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      pull-requests: read\n      issues: write\n      repository-projects: write\n    steps:\n      - name: Update project status for issues in this release\n        uses: actions\u002Fgithub-script@v8\n        with:\n          github-token: ${{ secrets.PROJECT_V2_TOKEN || secrets.GITHUB_TOKEN }}\n          script: |\n            const owner = context.repo.owner;\n            const repo = context.repo.repo;\n            const release = context.payload.release;\n\n            \u002F\u002F Your IDs\n            const PROJECT_ID = '\u003Cinsert ID>';\n            const STATUS_FIELD_ID = '\u003Cinsert ID>';\n            const DONE_OPTION_ID = '\u003Cinsert ID>';\n\n            const releaseUrl = release.html_url;\n            const body = release.body || '';\n\n            \u002F\u002F Collect PR numbers mentioned in the release body: \"#123\" or \"pull\u002F123\"\n            const prNumbers = [...body.matchAll(\u002F(?:#|pull\\\u002F)(\\d+)\u002Fg)]\n              .map(m => parseInt(m[1], 10))\n              .filter((n, i, arr) => arr.indexOf(n) === i);\n\n            console.log('PRs found in release notes:', prNumbers);\n\n            const gql = (query, variables) => github.graphql(query, variables);\n\n            for (const prNumber of prNumbers) {\n              console.log(`Processing PR #${prNumber}`);\n\n              \u002F\u002F 1) Get issues that PR closes\n              const prData = await gql(\n                `\n                query($owner: String!, $repo: String!, $pr: Int!) {\n                  repository(owner: $owner, name: $repo) {\n                    pullRequest(number: $pr) {\n                      closingIssuesReferences(first: 50) {\n                        nodes {\n                          id\n                          number\n                          title\n                        }\n                      }\n                    }\n                  }\n                }\n                `,\n                { owner, repo, pr: prNumber }\n              );\n\n              const issues =\n                prData.repository.pullRequest?.closingIssuesReferences?.nodes || [];\n\n              if (!issues.length) {\n                console.log(`No closing issues for PR #${prNumber}`);\n                continue;\n              }\n\n              for (const issue of issues) {\n                console.log(`Updating project status for issue #${issue.number}`);\n\n                \u002F\u002F 2) Find the ProjectV2 item for this issue on your project\n                const itemData = await gql(\n                  `\n                  query($projectId: ID!, $issueSearch: String!) {\n                    node(id: $projectId) {\n                      ... on ProjectV2 {\n                        items(first: 50, query: $issueSearch) {\n                          nodes {\n                            id\n                            content {\n                              ... on Issue {\n                                id\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                  `,\n                  { projectId: PROJECT_ID, issueSearch: `${issue.number}` }\n                );\n\n                const items = itemData.node?.items?.nodes || [];\n                const projectItem = items.find(\n                  (it) => it.content && it.content.id === issue.id\n                );\n\n                if (!projectItem) {\n                  console.log(`No project item found for issue #${issue.number}`);\n                  continue;\n                }\n\n                const itemId = projectItem.id;\n\n                \u002F\u002F 3) Set Status = Done\n                await gql(\n                  `\n                  mutation($projectId: ID!, $itemId: ID!, $fieldId: ID!, $optionId: String!) {\n                    updateProjectV2ItemFieldValue(\n                      input: {\n                        projectId: $projectId\n                        itemId: $itemId\n                        fieldId: $fieldId\n                        value: { singleSelectOptionId: $optionId }\n                      }\n                    ) {\n                      projectV2Item { id }\n                    }\n                  }\n                  `,\n                  {\n                    projectId: PROJECT_ID,\n                    itemId,\n                    fieldId: STATUS_FIELD_ID,\n                    optionId: DONE_OPTION_ID,\n                  }\n                );\n\n                console.log(\n                  `Issue #${issue.number} status moved to Done (release ${release.tag_name})`\n                );\n\n                \u002F\u002F 4) Add a comment linking back to this release\n                await github.rest.issues.createComment({\n                  owner,\n                  repo,\n                  issue_number: issue.number,\n                  body: `Marked as **Done** when release [${release.tag_name}](${releaseUrl}) was published (includes PR #${prNumber}).`\n                });\n              }\n            }\n",[294,505,506,514,518,524,531,535,541,548,558,564,572,580,588,596,603,616,627,635,646,658,664,670,676,681,687,693,699,705,710,716,722,727,733,739,745,751,756,762,767,773,778,784,790,795,801,807,813,819,825,831,837,843,849,855,861,867,873,879,885,891,897,903,909,914,920,926,931,937,943,949,955,960,966,972,977,983,989,995,1001,1007,1013,1019,1025,1031,1037,1043,1049,1055,1061,1067,1072,1077,1082,1087,1093,1099,1105,1110,1116,1122,1128,1133,1138,1144,1150,1156,1161,1166,1172,1177,1183,1189,1194,1200,1206,1212,1218,1224,1230,1236,1241,1247,1253,1258,1263,1268,1274,1280,1286,1292,1298,1303,1308,1313,1319,1325,1330,1335,1341,1347,1353,1359,1365,1371,1377,1382],{"__ignoreMap":326},[330,507,508,510,512],{"class":332,"line":333},[330,509,337],{"class":336},[330,511,341],{"class":340},[330,513,345],{"class":344},[330,515,516],{"class":332,"line":348},[330,517,352],{"emptyLinePlaceholder":351},[330,519,520,522],{"class":332,"line":355},[330,521,359],{"class":358},[330,523,362],{"class":340},[330,525,526,529],{"class":332,"line":365},[330,527,528],{"class":336},"  workflow_call",[330,530,362],{"class":340},[330,532,533],{"class":332,"line":373},[330,534,352],{"emptyLinePlaceholder":351},[330,536,537,539],{"class":332,"line":390},[330,538,398],{"class":336},[330,540,362],{"class":340},[330,542,543,546],{"class":332,"line":395},[330,544,545],{"class":336},"  update-issues",[330,547,362],{"class":340},[330,549,550,553,555],{"class":332,"line":403},[330,551,552],{"class":336},"    runs-on",[330,554,341],{"class":340},[330,556,557],{"class":344}," ubuntu-latest\n",[330,559,560,562],{"class":332,"line":411},[330,561,436],{"class":336},[330,563,362],{"class":340},[330,565,566,568,570],{"class":332,"line":422},[330,567,444],{"class":336},[330,569,341],{"class":340},[330,571,449],{"class":344},[330,573,574,576,578],{"class":332,"line":433},[330,575,455],{"class":336},[330,577,341],{"class":340},[330,579,449],{"class":344},[330,581,582,584,586],{"class":332,"line":441},[330,583,465],{"class":336},[330,585,341],{"class":340},[330,587,470],{"class":344},[330,589,590,592,594],{"class":332,"line":452},[330,591,476],{"class":336},[330,593,341],{"class":340},[330,595,470],{"class":344},[330,597,598,601],{"class":332,"line":462},[330,599,600],{"class":336},"    steps",[330,602,362],{"class":340},[330,604,605,608,611,613],{"class":332,"line":473},[330,606,607],{"class":340},"      -",[330,609,610],{"class":336}," name",[330,612,341],{"class":340},[330,614,615],{"class":344}," Update project status for issues in this release\n",[330,617,619,622,624],{"class":332,"line":618},16,[330,620,621],{"class":336},"        uses",[330,623,341],{"class":340},[330,625,626],{"class":344}," actions\u002Fgithub-script@v8\n",[330,628,630,633],{"class":332,"line":629},17,[330,631,632],{"class":336},"        with",[330,634,362],{"class":340},[330,636,638,641,643],{"class":332,"line":637},18,[330,639,640],{"class":336},"          github-token",[330,642,341],{"class":340},[330,644,645],{"class":344}," ${{ secrets.PROJECT_V2_TOKEN || secrets.GITHUB_TOKEN }}\n",[330,647,649,652,654],{"class":332,"line":648},19,[330,650,651],{"class":336},"          script",[330,653,341],{"class":340},[330,655,657],{"class":656},"s7zQu"," |\n",[330,659,661],{"class":332,"line":660},20,[330,662,663],{"class":344},"            const owner = context.repo.owner;\n",[330,665,667],{"class":332,"line":666},21,[330,668,669],{"class":344},"            const repo = context.repo.repo;\n",[330,671,673],{"class":332,"line":672},22,[330,674,675],{"class":344},"            const release = context.payload.release;\n",[330,677,679],{"class":332,"line":678},23,[330,680,352],{"emptyLinePlaceholder":351},[330,682,684],{"class":332,"line":683},24,[330,685,686],{"class":344},"            \u002F\u002F Your IDs\n",[330,688,690],{"class":332,"line":689},25,[330,691,692],{"class":344},"            const PROJECT_ID = '\u003Cinsert ID>';\n",[330,694,696],{"class":332,"line":695},26,[330,697,698],{"class":344},"            const STATUS_FIELD_ID = '\u003Cinsert ID>';\n",[330,700,702],{"class":332,"line":701},27,[330,703,704],{"class":344},"            const DONE_OPTION_ID = '\u003Cinsert ID>';\n",[330,706,708],{"class":332,"line":707},28,[330,709,352],{"emptyLinePlaceholder":351},[330,711,713],{"class":332,"line":712},29,[330,714,715],{"class":344},"            const releaseUrl = release.html_url;\n",[330,717,719],{"class":332,"line":718},30,[330,720,721],{"class":344},"            const body = release.body || '';\n",[330,723,725],{"class":332,"line":724},31,[330,726,352],{"emptyLinePlaceholder":351},[330,728,730],{"class":332,"line":729},32,[330,731,732],{"class":344},"            \u002F\u002F Collect PR numbers mentioned in the release body: \"#123\" or \"pull\u002F123\"\n",[330,734,736],{"class":332,"line":735},33,[330,737,738],{"class":344},"            const prNumbers = [...body.matchAll(\u002F(?:#|pull\\\u002F)(\\d+)\u002Fg)]\n",[330,740,742],{"class":332,"line":741},34,[330,743,744],{"class":344},"              .map(m => parseInt(m[1], 10))\n",[330,746,748],{"class":332,"line":747},35,[330,749,750],{"class":344},"              .filter((n, i, arr) => arr.indexOf(n) === i);\n",[330,752,754],{"class":332,"line":753},36,[330,755,352],{"emptyLinePlaceholder":351},[330,757,759],{"class":332,"line":758},37,[330,760,761],{"class":344},"            console.log('PRs found in release notes:', prNumbers);\n",[330,763,765],{"class":332,"line":764},38,[330,766,352],{"emptyLinePlaceholder":351},[330,768,770],{"class":332,"line":769},39,[330,771,772],{"class":344},"            const gql = (query, variables) => github.graphql(query, variables);\n",[330,774,776],{"class":332,"line":775},40,[330,777,352],{"emptyLinePlaceholder":351},[330,779,781],{"class":332,"line":780},41,[330,782,783],{"class":344},"            for (const prNumber of prNumbers) {\n",[330,785,787],{"class":332,"line":786},42,[330,788,789],{"class":344},"              console.log(`Processing PR #${prNumber}`);\n",[330,791,793],{"class":332,"line":792},43,[330,794,352],{"emptyLinePlaceholder":351},[330,796,798],{"class":332,"line":797},44,[330,799,800],{"class":344},"              \u002F\u002F 1) Get issues that PR closes\n",[330,802,804],{"class":332,"line":803},45,[330,805,806],{"class":344},"              const prData = await gql(\n",[330,808,810],{"class":332,"line":809},46,[330,811,812],{"class":344},"                `\n",[330,814,816],{"class":332,"line":815},47,[330,817,818],{"class":344},"                query($owner: String!, $repo: String!, $pr: Int!) {\n",[330,820,822],{"class":332,"line":821},48,[330,823,824],{"class":344},"                  repository(owner: $owner, name: $repo) {\n",[330,826,828],{"class":332,"line":827},49,[330,829,830],{"class":344},"                    pullRequest(number: $pr) {\n",[330,832,834],{"class":332,"line":833},50,[330,835,836],{"class":344},"                      closingIssuesReferences(first: 50) {\n",[330,838,840],{"class":332,"line":839},51,[330,841,842],{"class":344},"                        nodes {\n",[330,844,846],{"class":332,"line":845},52,[330,847,848],{"class":344},"                          id\n",[330,850,852],{"class":332,"line":851},53,[330,853,854],{"class":344},"                          number\n",[330,856,858],{"class":332,"line":857},54,[330,859,860],{"class":344},"                          title\n",[330,862,864],{"class":332,"line":863},55,[330,865,866],{"class":344},"                        }\n",[330,868,870],{"class":332,"line":869},56,[330,871,872],{"class":344},"                      }\n",[330,874,876],{"class":332,"line":875},57,[330,877,878],{"class":344},"                    }\n",[330,880,882],{"class":332,"line":881},58,[330,883,884],{"class":344},"                  }\n",[330,886,888],{"class":332,"line":887},59,[330,889,890],{"class":344},"                }\n",[330,892,894],{"class":332,"line":893},60,[330,895,896],{"class":344},"                `,\n",[330,898,900],{"class":332,"line":899},61,[330,901,902],{"class":344},"                { owner, repo, pr: prNumber }\n",[330,904,906],{"class":332,"line":905},62,[330,907,908],{"class":344},"              );\n",[330,910,912],{"class":332,"line":911},63,[330,913,352],{"emptyLinePlaceholder":351},[330,915,917],{"class":332,"line":916},64,[330,918,919],{"class":344},"              const issues =\n",[330,921,923],{"class":332,"line":922},65,[330,924,925],{"class":344},"                prData.repository.pullRequest?.closingIssuesReferences?.nodes || [];\n",[330,927,929],{"class":332,"line":928},66,[330,930,352],{"emptyLinePlaceholder":351},[330,932,934],{"class":332,"line":933},67,[330,935,936],{"class":344},"              if (!issues.length) {\n",[330,938,940],{"class":332,"line":939},68,[330,941,942],{"class":344},"                console.log(`No closing issues for PR #${prNumber}`);\n",[330,944,946],{"class":332,"line":945},69,[330,947,948],{"class":344},"                continue;\n",[330,950,952],{"class":332,"line":951},70,[330,953,954],{"class":344},"              }\n",[330,956,958],{"class":332,"line":957},71,[330,959,352],{"emptyLinePlaceholder":351},[330,961,963],{"class":332,"line":962},72,[330,964,965],{"class":344},"              for (const issue of issues) {\n",[330,967,969],{"class":332,"line":968},73,[330,970,971],{"class":344},"                console.log(`Updating project status for issue #${issue.number}`);\n",[330,973,975],{"class":332,"line":974},74,[330,976,352],{"emptyLinePlaceholder":351},[330,978,980],{"class":332,"line":979},75,[330,981,982],{"class":344},"                \u002F\u002F 2) Find the ProjectV2 item for this issue on your project\n",[330,984,986],{"class":332,"line":985},76,[330,987,988],{"class":344},"                const itemData = await gql(\n",[330,990,992],{"class":332,"line":991},77,[330,993,994],{"class":344},"                  `\n",[330,996,998],{"class":332,"line":997},78,[330,999,1000],{"class":344},"                  query($projectId: ID!, $issueSearch: String!) {\n",[330,1002,1004],{"class":332,"line":1003},79,[330,1005,1006],{"class":344},"                    node(id: $projectId) {\n",[330,1008,1010],{"class":332,"line":1009},80,[330,1011,1012],{"class":344},"                      ... on ProjectV2 {\n",[330,1014,1016],{"class":332,"line":1015},81,[330,1017,1018],{"class":344},"                        items(first: 50, query: $issueSearch) {\n",[330,1020,1022],{"class":332,"line":1021},82,[330,1023,1024],{"class":344},"                          nodes {\n",[330,1026,1028],{"class":332,"line":1027},83,[330,1029,1030],{"class":344},"                            id\n",[330,1032,1034],{"class":332,"line":1033},84,[330,1035,1036],{"class":344},"                            content {\n",[330,1038,1040],{"class":332,"line":1039},85,[330,1041,1042],{"class":344},"                              ... on Issue {\n",[330,1044,1046],{"class":332,"line":1045},86,[330,1047,1048],{"class":344},"                                id\n",[330,1050,1052],{"class":332,"line":1051},87,[330,1053,1054],{"class":344},"                              }\n",[330,1056,1058],{"class":332,"line":1057},88,[330,1059,1060],{"class":344},"                            }\n",[330,1062,1064],{"class":332,"line":1063},89,[330,1065,1066],{"class":344},"                          }\n",[330,1068,1070],{"class":332,"line":1069},90,[330,1071,866],{"class":344},[330,1073,1075],{"class":332,"line":1074},91,[330,1076,872],{"class":344},[330,1078,1080],{"class":332,"line":1079},92,[330,1081,878],{"class":344},[330,1083,1085],{"class":332,"line":1084},93,[330,1086,884],{"class":344},[330,1088,1090],{"class":332,"line":1089},94,[330,1091,1092],{"class":344},"                  `,\n",[330,1094,1096],{"class":332,"line":1095},95,[330,1097,1098],{"class":344},"                  { projectId: PROJECT_ID, issueSearch: `${issue.number}` }\n",[330,1100,1102],{"class":332,"line":1101},96,[330,1103,1104],{"class":344},"                );\n",[330,1106,1108],{"class":332,"line":1107},97,[330,1109,352],{"emptyLinePlaceholder":351},[330,1111,1113],{"class":332,"line":1112},98,[330,1114,1115],{"class":344},"                const items = itemData.node?.items?.nodes || [];\n",[330,1117,1119],{"class":332,"line":1118},99,[330,1120,1121],{"class":344},"                const projectItem = items.find(\n",[330,1123,1125],{"class":332,"line":1124},100,[330,1126,1127],{"class":344},"                  (it) => it.content && it.content.id === issue.id\n",[330,1129,1131],{"class":332,"line":1130},101,[330,1132,1104],{"class":344},[330,1134,1136],{"class":332,"line":1135},102,[330,1137,352],{"emptyLinePlaceholder":351},[330,1139,1141],{"class":332,"line":1140},103,[330,1142,1143],{"class":344},"                if (!projectItem) {\n",[330,1145,1147],{"class":332,"line":1146},104,[330,1148,1149],{"class":344},"                  console.log(`No project item found for issue #${issue.number}`);\n",[330,1151,1153],{"class":332,"line":1152},105,[330,1154,1155],{"class":344},"                  continue;\n",[330,1157,1159],{"class":332,"line":1158},106,[330,1160,890],{"class":344},[330,1162,1164],{"class":332,"line":1163},107,[330,1165,352],{"emptyLinePlaceholder":351},[330,1167,1169],{"class":332,"line":1168},108,[330,1170,1171],{"class":344},"                const itemId = projectItem.id;\n",[330,1173,1175],{"class":332,"line":1174},109,[330,1176,352],{"emptyLinePlaceholder":351},[330,1178,1180],{"class":332,"line":1179},110,[330,1181,1182],{"class":344},"                \u002F\u002F 3) Set Status = Done\n",[330,1184,1186],{"class":332,"line":1185},111,[330,1187,1188],{"class":344},"                await gql(\n",[330,1190,1192],{"class":332,"line":1191},112,[330,1193,994],{"class":344},[330,1195,1197],{"class":332,"line":1196},113,[330,1198,1199],{"class":344},"                  mutation($projectId: ID!, $itemId: ID!, $fieldId: ID!, $optionId: String!) {\n",[330,1201,1203],{"class":332,"line":1202},114,[330,1204,1205],{"class":344},"                    updateProjectV2ItemFieldValue(\n",[330,1207,1209],{"class":332,"line":1208},115,[330,1210,1211],{"class":344},"                      input: {\n",[330,1213,1215],{"class":332,"line":1214},116,[330,1216,1217],{"class":344},"                        projectId: $projectId\n",[330,1219,1221],{"class":332,"line":1220},117,[330,1222,1223],{"class":344},"                        itemId: $itemId\n",[330,1225,1227],{"class":332,"line":1226},118,[330,1228,1229],{"class":344},"                        fieldId: $fieldId\n",[330,1231,1233],{"class":332,"line":1232},119,[330,1234,1235],{"class":344},"                        value: { singleSelectOptionId: $optionId }\n",[330,1237,1239],{"class":332,"line":1238},120,[330,1240,872],{"class":344},[330,1242,1244],{"class":332,"line":1243},121,[330,1245,1246],{"class":344},"                    ) {\n",[330,1248,1250],{"class":332,"line":1249},122,[330,1251,1252],{"class":344},"                      projectV2Item { id }\n",[330,1254,1256],{"class":332,"line":1255},123,[330,1257,878],{"class":344},[330,1259,1261],{"class":332,"line":1260},124,[330,1262,884],{"class":344},[330,1264,1266],{"class":332,"line":1265},125,[330,1267,1092],{"class":344},[330,1269,1271],{"class":332,"line":1270},126,[330,1272,1273],{"class":344},"                  {\n",[330,1275,1277],{"class":332,"line":1276},127,[330,1278,1279],{"class":344},"                    projectId: PROJECT_ID,\n",[330,1281,1283],{"class":332,"line":1282},128,[330,1284,1285],{"class":344},"                    itemId,\n",[330,1287,1289],{"class":332,"line":1288},129,[330,1290,1291],{"class":344},"                    fieldId: STATUS_FIELD_ID,\n",[330,1293,1295],{"class":332,"line":1294},130,[330,1296,1297],{"class":344},"                    optionId: DONE_OPTION_ID,\n",[330,1299,1301],{"class":332,"line":1300},131,[330,1302,884],{"class":344},[330,1304,1306],{"class":332,"line":1305},132,[330,1307,1104],{"class":344},[330,1309,1311],{"class":332,"line":1310},133,[330,1312,352],{"emptyLinePlaceholder":351},[330,1314,1316],{"class":332,"line":1315},134,[330,1317,1318],{"class":344},"                console.log(\n",[330,1320,1322],{"class":332,"line":1321},135,[330,1323,1324],{"class":344},"                  `Issue #${issue.number} status moved to Done (release ${release.tag_name})`\n",[330,1326,1328],{"class":332,"line":1327},136,[330,1329,1104],{"class":344},[330,1331,1333],{"class":332,"line":1332},137,[330,1334,352],{"emptyLinePlaceholder":351},[330,1336,1338],{"class":332,"line":1337},138,[330,1339,1340],{"class":344},"                \u002F\u002F 4) Add a comment linking back to this release\n",[330,1342,1344],{"class":332,"line":1343},139,[330,1345,1346],{"class":344},"                await github.rest.issues.createComment({\n",[330,1348,1350],{"class":332,"line":1349},140,[330,1351,1352],{"class":344},"                  owner,\n",[330,1354,1356],{"class":332,"line":1355},141,[330,1357,1358],{"class":344},"                  repo,\n",[330,1360,1362],{"class":332,"line":1361},142,[330,1363,1364],{"class":344},"                  issue_number: issue.number,\n",[330,1366,1368],{"class":332,"line":1367},143,[330,1369,1370],{"class":344},"                  body: `Marked as **Done** when release [${release.tag_name}](${releaseUrl}) was published (includes PR #${prNumber}).`\n",[330,1372,1374],{"class":332,"line":1373},144,[330,1375,1376],{"class":344},"                });\n",[330,1378,1380],{"class":332,"line":1379},145,[330,1381,954],{"class":344},[330,1383,1385],{"class":332,"line":1384},146,[330,1386,1387],{"class":344},"            }\n",[489,1389,1391],{"id":1390},"handling-new-issues-added-to-a-repo","Handling new issues added to a repo",[290,1393,1394,1395,1398],{},"This workflow applies the ",[294,1396,1397],{},"Needs Triage"," label to newly opened issues and adds them to the Development Board.",[321,1400,1402],{"className":323,"code":1401,"language":325,"meta":326,"style":326},"name: Process New Issues\n\non:\n  workflow_call:\n\njobs:\n  label_issues:\n    runs-on: ubuntu-latest\n    permissions:\n      issues: write\n    steps:\n      - name: Add 'Needs Triage' label\n        run: |\n          curl -X POST \\\n            -H \"Accept: application\u002Fvnd.github+json\" \\\n            -H \"Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}\" \\\n            -H \"X-GitHub-Api-Version: 2022-11-28\" \\\n            https:\u002F\u002Fapi.github.com\u002Frepos\u002F${{ github.repository }}\u002Fissues\u002F${{ github.event.issue.number }}\u002Flabels \\\n            -d '{\"labels\":[\"Needs Triage\"]}'\n  add-to-dev-project:\n    name: Add issue to dev project\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fadd-to-project@244f685bbc3b7adfa8466e08b698b5577571133e # v1.0.2\n        with:\n          project-url: https:\u002F\u002Fgithub.com\u002Forgs\u002FES-Profiler\u002Fprojects\u002F2\n          github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}\n",[294,1403,1404,1413,1417,1423,1429,1433,1439,1446,1454,1460,1468,1474,1485,1494,1499,1504,1509,1514,1519,1524,1531,1541,1549,1555,1571,1577,1587],{"__ignoreMap":326},[330,1405,1406,1408,1410],{"class":332,"line":333},[330,1407,337],{"class":336},[330,1409,341],{"class":340},[330,1411,1412],{"class":344}," Process New Issues\n",[330,1414,1415],{"class":332,"line":348},[330,1416,352],{"emptyLinePlaceholder":351},[330,1418,1419,1421],{"class":332,"line":355},[330,1420,359],{"class":358},[330,1422,362],{"class":340},[330,1424,1425,1427],{"class":332,"line":365},[330,1426,528],{"class":336},[330,1428,362],{"class":340},[330,1430,1431],{"class":332,"line":373},[330,1432,352],{"emptyLinePlaceholder":351},[330,1434,1435,1437],{"class":332,"line":390},[330,1436,398],{"class":336},[330,1438,362],{"class":340},[330,1440,1441,1444],{"class":332,"line":395},[330,1442,1443],{"class":336},"  label_issues",[330,1445,362],{"class":340},[330,1447,1448,1450,1452],{"class":332,"line":403},[330,1449,552],{"class":336},[330,1451,341],{"class":340},[330,1453,557],{"class":344},[330,1455,1456,1458],{"class":332,"line":411},[330,1457,436],{"class":336},[330,1459,362],{"class":340},[330,1461,1462,1464,1466],{"class":332,"line":422},[330,1463,465],{"class":336},[330,1465,341],{"class":340},[330,1467,470],{"class":344},[330,1469,1470,1472],{"class":332,"line":433},[330,1471,600],{"class":336},[330,1473,362],{"class":340},[330,1475,1476,1478,1480,1482],{"class":332,"line":441},[330,1477,607],{"class":340},[330,1479,610],{"class":336},[330,1481,341],{"class":340},[330,1483,1484],{"class":344}," Add 'Needs Triage' label\n",[330,1486,1487,1490,1492],{"class":332,"line":452},[330,1488,1489],{"class":336},"        run",[330,1491,341],{"class":340},[330,1493,657],{"class":656},[330,1495,1496],{"class":332,"line":462},[330,1497,1498],{"class":344},"          curl -X POST \\\n",[330,1500,1501],{"class":332,"line":473},[330,1502,1503],{"class":344},"            -H \"Accept: application\u002Fvnd.github+json\" \\\n",[330,1505,1506],{"class":332,"line":618},[330,1507,1508],{"class":344},"            -H \"Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}\" \\\n",[330,1510,1511],{"class":332,"line":629},[330,1512,1513],{"class":344},"            -H \"X-GitHub-Api-Version: 2022-11-28\" \\\n",[330,1515,1516],{"class":332,"line":637},[330,1517,1518],{"class":344},"            https:\u002F\u002Fapi.github.com\u002Frepos\u002F${{ github.repository }}\u002Fissues\u002F${{ github.event.issue.number }}\u002Flabels \\\n",[330,1520,1521],{"class":332,"line":648},[330,1522,1523],{"class":344},"            -d '{\"labels\":[\"Needs Triage\"]}'\n",[330,1525,1526,1529],{"class":332,"line":660},[330,1527,1528],{"class":336},"  add-to-dev-project",[330,1530,362],{"class":340},[330,1532,1533,1536,1538],{"class":332,"line":666},[330,1534,1535],{"class":336},"    name",[330,1537,341],{"class":340},[330,1539,1540],{"class":344}," Add issue to dev project\n",[330,1542,1543,1545,1547],{"class":332,"line":672},[330,1544,552],{"class":336},[330,1546,341],{"class":340},[330,1548,557],{"class":344},[330,1550,1551,1553],{"class":332,"line":678},[330,1552,600],{"class":336},[330,1554,362],{"class":340},[330,1556,1557,1559,1562,1564,1567],{"class":332,"line":683},[330,1558,607],{"class":340},[330,1560,1561],{"class":336}," uses",[330,1563,341],{"class":340},[330,1565,1566],{"class":344}," actions\u002Fadd-to-project@244f685bbc3b7adfa8466e08b698b5577571133e",[330,1568,1570],{"class":1569},"sHwdD"," # v1.0.2\n",[330,1572,1573,1575],{"class":332,"line":689},[330,1574,632],{"class":336},[330,1576,362],{"class":340},[330,1578,1579,1582,1584],{"class":332,"line":695},[330,1580,1581],{"class":336},"          project-url",[330,1583,341],{"class":340},[330,1585,1586],{"class":344}," https:\u002F\u002Fgithub.com\u002Forgs\u002FES-Profiler\u002Fprojects\u002F2\n",[330,1588,1589,1591,1593],{"class":332,"line":701},[330,1590,640],{"class":336},[330,1592,341],{"class":340},[330,1594,1595],{"class":344}," ${{ secrets.ADD_TO_PROJECT_PAT }}\n",[482,1597],{},[482,1599],{},[285,1601,1603],{"id":1602},"important-token-requirements-for-project-access","Important: token requirements for project access",[290,1605,1606,1607,1610,1611,1614,1615,1618],{},"For GitHub Project operations in centralised workflows, you will typically need a PAT secret (for example, ",[294,1608,1609],{},"PROJECT_V2_TOKEN"," or ",[294,1612,1613],{},"ADD_TO_PROJECT_PAT",") because ",[294,1616,1617],{},"GITHUB_TOKEN"," may not have the required project-level access across repositories.",[290,1620,1621,1622,297],{},"Use a fine-grained PAT with the minimum required permissions and store it in repository or organisation secrets. For setup instructions, see ",[1623,1624,1626],"a",{"href":1625},".\u002Fpersonal-access-token#how-to-create-a-fine-grained-token","How to create a fine-grained token",[1628,1629,1630],"style",{},"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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}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}",{"title":326,"searchDepth":348,"depth":348,"links":1632},[1633,1634,1638],{"id":287,"depth":348,"text":288},{"id":486,"depth":348,"text":487,"children":1635},[1636,1637],{"id":491,"depth":355,"text":492},{"id":1390,"depth":355,"text":1391},{"id":1602,"depth":348,"text":1603},"Reusable and centralised GitHub Actions workflows used across ESProfiler repositories.","md",null,{},{"title":143,"description":1639},"E4qxEMz5znQKgohVNYt7ZfkC9PSJZxVxMvmOY6GGfT4",[1646,1648],{"title":139,"path":140,"stem":141,"description":1647,"children":-1},"Troubleshooting guide for GitHub issues.",{"title":147,"path":148,"stem":149,"description":1649,"children":-1},"Everything you need to know about observability of ESProfiler, as well as reporting and handling issues as they arise with infrastructure and hosting.",1784892033086]