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