OpenSRE provides GitHub workflow tools for engineering coordination. The public workflow is:
Read a GitHub snapshot.
Generate a report or community follow-up summary.
Render a mutation proposal for explicit Slack-sourced task requests.
Execute the proposal only through the runtime approval path.
The workflow tools deliberately separate read-only snapshots from mutating execution. Headless or non-approved runs can produce proposals, but they cannot execute workflow mutations.For ad-hoc chat mutations outside the Slack proposal flow (create issue, assign, merge, gh api, etc.), use github_cli instead — see GitHub.
Connect or reconnect GitHub in the OpenSRE app.Security alert endpoints require token scopes that GitHub enforces separately. If the token cannot read one alert class, the tool returns an error for that alert type while still returning any alert classes it can read.
list_github_security_alerts when security status is relevant
summarize_github_pr_status does not trust list-endpoint mergeability. It fetches each PR detail endpoint so mergeable and mergeable_state are authoritative. Unknown mergeability is reported as unknown, not as ready to merge.
Use generate_work_status_report for morning check-ins, Slack updates, blockers, owners, and next actions.If the report tool performs its own GitHub reads and a required read fails, it returns:
available: false
incomplete: true
an errors list
It must not produce a false “no blockers” report from partial data.Use summarize_community_followups for contributor questions, community meeting agenda items, and suggested replies. It reads repository issue comments directly with pagination instead of performing one request per issue.
execute_github_issue_mutation is the only workflow mutating tool. It has no confirm argument. Ad-hoc GitHub writes in chat go through github_cli.Mutation behavior:
create: searches for the idempotency marker first; creates only if no existing issue is found.
update: fetches the issue, adds the Slack follow-up as a comment unless the proposal marker is already present, and patches title/labels/assignees only when those fields are explicitly present. It never replaces the issue body.
close: fetches the issue, adds a closing comment unless the proposal marker is already present, then patches state=closed and state_reason=completed. It never replaces the issue body.
Do not expose execute_github_issue_mutation outside the runtime approval path. Headless runs may render proposals, but should not execute mutations directly.
Keep read tools and mutating execute on separate approval paths.
Prefer least-privilege tokens; add security scopes only when you need alert listing.
Store tokens in .env, not in source control.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"OpenSRE Documentation","colors":{"primary":"#000000","light":"#FFFFFF","dark":"#000000"},"logo":{"light":"https://mintcdn.com/tracer/rmdYtNSoc9Q5D-5B/images/opensre-logo-black.svg?fit=max\u0026auto=format\u0026n=rmdYtNSoc9Q5D-5B\u0026q=85\u0026s=7ea8db5a1f8e1665db7544632022e298","dark":"https://mintcdn.com/tracer/rmdYtNSoc9Q5D-5B/images/opensre-logo-white.svg?fit=max\u0026auto=format\u0026n=rmdYtNSoc9Q5D-5B\u0026q=85\u0026s=cb153f8bae517d3cea2b823ad2e51327"},"favicon":"https://mintcdn.com/tracer/iKd9uDADI-KBLmoJ/favicon.ico?fit=max\u0026auto=format\u0026n=iKd9uDADI-KBLmoJ\u0026q=85\u0026s=cf78c0f1195ee204bf1022d69a921204","navbar":{"links":[{"icon":"discord","href":"https://discord.gg/opensre","label":"Discord"},{"icon":"box","href":"https://github.com/Tracer-Cloud/opensre/releases","label":"Releases"},{"icon":"github","href":"https://github.com/Tracer-Cloud/opensre","label":"GitHub"}]},"footer":{"socials":{"website":"https://www.opensre.com","github":"https://github.com/Tracer-Cloud/opensre","linkedin":"https://linkedin.com/company/tracercloud","discord":"https://discord.gg/opensre"}},"seo":{"metatags":{},"indexing":"all"},"integrations":{"hotjar":{"hjid":"6568352","hjsv":"6"},"posthog":{"apiKey":"phc_zutpVhmQw7oUmMkbawKNdYCKQWjpfASATtf5ywB75W2","apiHost":"https://us.i.posthog.com","sessionRecording":true}},"contextual":{"options":[],"display":"header"},"interaction":{"drilldown":false},"styling":{"latex":false},"navigation":{"directory":"card","pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"tracer","hasAudioNarration":false,"actualSubdomain":"tracer","customDomains":["opensre.com"],"gitSource":{"type":"github","owner":"tracer-cloud","repo":"opensre","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae8e7d29a7f94b38af35926","collectionId":"54b1096e-9d7c-4398-93e1-59fb3c5b4cb8","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae8e7d29a7f94b38af35926"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae8e7d29a7f94b38af35926","clientVersion":"0.0.4054","searchFilterCounts":[{"language":"default","tag":"Integrations","count":80},{"language":"default","tag":"Monitoring","count":16},{"language":"default","tag":"Databases","count":13},{"language":"default","tag":"Cloud","count":12},{"language":"default","tag":"Code and CI","count":12},{"language":"default","tag":"Get started","count":10},{"language":"default","tag":"Platform","count":10},{"language":"default","tag":"Messaging","count":9},{"language":"default","tag":"Incidents","count":8},{"language":"default","tag":"Workflows","count":6}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":false},"basePath":"/docs","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[],"googleFontsInlined":false},"customCss":[{"filePath":"custom.css","href":"/docs/_mintlify/custom/tracer/5463e43fad15ff95/custom.css"},{"filePath":"sidebar.css","content":":root{--opensre-sidebar-muted:#737373;--opensre-sidebar-link:#a3a3a3;--opensre-sidebar-link-hover:#e5e5e5;--opensre-sidebar-active-bg:rgba(255, 255, 255, 0.08)}:root:not(.dark){--opensre-sidebar-muted:#a3a3a3;--opensre-sidebar-link:#525252;--opensre-sidebar-link-hover:#171717;--opensre-sidebar-active-bg:rgba(0, 0, 0, 0.06)}#navigation-items .sidebar-group-header,#navigation-items .sidebar-group-header h5,#navigation-items [class*=sidebar-group-header],#sidebar .sidebar-group-header,#sidebar .sidebar-group-header h5,#sidebar [class*=SidebarGroup]>:first-child,#sidebar [class*=sidebar-group-header]{font-family:\"Britti Sans Trial\",sans-serif!important;font-size:11px!important;font-weight:600!important;letter-spacing:.08em!important;text-transform:uppercase!important;line-height:1.4!important;color:var(--opensre-sidebar-muted)!important;margin-top:1.25rem!important;margin-bottom:.35rem!important;padding-top:.25rem!important}#navigation-items .sidebar-group:first-child .sidebar-group-header,#sidebar .sidebar-group:first-child .sidebar-group-header,#sidebar nav>.sidebar-group:first-child .sidebar-group-header{margin-top:.25rem!important}#navigation-items a:not([href*=sign-up]),#sidebar a:not([href*=sign-up]){font-family:\"Britti Sans Trial\",sans-serif!important;font-size:14px!important;font-weight:400!important;letter-spacing:normal!important;color:var(--opensre-sidebar-link)!important;border-radius:.375rem!important}#navigation-items a:not([href*=sign-up]):hover,#sidebar a:not([href*=sign-up]):hover{color:var(--opensre-sidebar-link-hover)!important}#navigation-items [data-active=true]>a,#navigation-items a.active,#navigation-items a[aria-current=page],#navigation-items a[data-active=true],#navigation-items li[data-active=true]>a,#sidebar [data-active=true]>a,#sidebar a.active,#sidebar a[aria-current=page],#sidebar a[data-active=true],#sidebar li[data-active=true]>a{color:#fff!important;background:var(--opensre-sidebar-active-bg)!important;font-weight:500!important}:root:not(.dark) #navigation-items [data-active=true]>a,:root:not(.dark) #navigation-items a.active,:root:not(.dark) #navigation-items a[aria-current=page],:root:not(.dark) #navigation-items a[data-active=true],:root:not(.dark) #navigation-items li[data-active=true]>a,:root:not(.dark) #sidebar [data-active=true]>a,:root:not(.dark) #sidebar a.active,:root:not(.dark) #sidebar a[aria-current=page],:root:not(.dark) #sidebar a[data-active=true],:root:not(.dark) #sidebar li[data-active=true]>a{color:#171717!important}header img[src*=\"Tracer-Head-Black.png\"],header img[src*=\"Tracer-Head-White.png\"],nav img[src*=\"Tracer-Head-Black.png\"],nav img[src*=\"Tracer-Head-White.png\"]{width:1rem!important;height:1rem!important;object-fit:contain!important}html.dark img[src*=\"Tracer-Head-Black.png\"]{filter:brightness(0) invert(1)!important}.toc-custom-actions{margin-top:.75rem;padding-top:.75rem;border-top:1px solid rgba(0,0,0,.1)}html.dark .toc-custom-actions{border-top-color:rgba(255,255,255,.1)}.toc-custom-action{display:flex;align-items:center;gap:.5rem;padding-left:.25rem;font-size:.875rem;line-height:1.75rem;color:inherit}.toc-custom-action span{display:inline-block}#table-of-contents-content,[class*=table-of-contents],[data-testid=table-of-contents],nav[aria-label*=\"Table of contents\"]{padding-left:0!important}#table-of-contents-content ul,[class*=table-of-contents] ul,[data-testid=table-of-contents] ul,nav[aria-label*=\"Table of contents\"] ul{padding-left:0!important;margin-left:0!important}#table-of-contents-content a,[class*=table-of-contents] a,[data-testid=table-of-contents] a,nav[aria-label*=\"Table of contents\"] a{padding-left:.25rem!important;margin-left:0!important}[class*=right-sidebar] #table-of-contents-content,[class*=right-sidebar] [class*=table-of-contents],[class*=right-sidebar] [data-testid=table-of-contents],[class*=right-sidebar] nav[aria-label*=\"Table of contents\"]{text-align:left!important;align-items:flex-start!important;justify-content:flex-start!important}[class*=right-sidebar] #table-of-contents-content a,[class*=right-sidebar] [class*=table-of-contents] a,[class*=right-sidebar] [data-testid=table-of-contents] a,[class*=right-sidebar] nav[aria-label*=\"Table of contents\"] a{display:block!important;width:100%!important;text-align:left!important}"}],"page":{"pagePath":"integrations/code/github-workflow-tools","slug":"/integrations/code/github-workflow-tools","pageMetadata":{"title":"GitHub workflow tools","description":"Use GitHub-backed tools for read snapshots, status reports, follow-up summaries, and approved issue mutations","href":"/integrations/code/github-workflow-tools"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Use GitHub-backed tools for read snapshots, status reports, follow-up summaries, and approved issue mutations\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`overview`,children:`Overview`}),`\n`,_jsx(_components.p,{children:`OpenSRE provides GitHub workflow tools for engineering coordination. The public workflow is:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Read a GitHub snapshot.`}),`\n`,_jsx(_components.li,{children:`Generate a report or community follow-up summary.`}),`\n`,_jsx(_components.li,{children:`Render a mutation proposal for explicit Slack-sourced task requests.`}),`\n`,_jsx(_components.li,{children:`Execute the proposal only through the runtime approval path.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`The workflow tools deliberately separate read-only snapshots from mutating execution. Headless or non-approved runs can produce proposals, but they cannot execute workflow mutations.`}),`\n`,_jsxs(_components.p,{children:[`For ad-hoc chat mutations outside the Slack proposal flow (create issue, assign, merge, `,_jsx(_components.code,{children:`gh api`}),`, etc.), use `,_jsx(_components.strong,{children:_jsx(_components.code,{children:`github_cli`})}),` instead — see `,_jsx(_components.a,{href:`/integrations/code/github`,children:`GitHub`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`GitHub connected via `,_jsx(_components.a,{href:`/integrations/code/github`,children:`GitHub integration`})]}),`\n`,_jsxs(_components.li,{children:[`Token with at least `,_jsx(_components.code,{children:`repo`}),` scope; add security-alert scopes for `,_jsx(_components.code,{children:`list_github_security_alerts`})]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`setup`,children:`Setup`}),`\n`,_jsxs(_components.p,{children:[`Workflow tools use the same GitHub MCP credentials as the `,_jsx(_components.a,{href:`/integrations/code/github`,children:`GitHub integration`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`opensre`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` integrations`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` setup`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` github`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`opensre`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` integrations`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` verify`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` github`})]}),`\n`]})})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Requirement`}),_jsx(_components.th,{children:`Details`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Token`})}),_jsx(_components.td,{children:`Connect GitHub in the OpenSRE app`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Scopes`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`repo`}),` minimum; add security alert scopes for `,_jsx(_components.code,{children:`list_github_security_alerts`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Alternate env`})}),_jsx(_components.td,{children:`Local environment tokens do not authorize these tools`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`example-repl-turn`,children:`Example REPL turn`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`> generate a Slack-ready morning check-in for Tracer-Cloud/opensre`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`· gathering via GitHub · list work items…`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`2`,id:`credentials`,children:`Credentials`}),`\n`,_jsx(_components.p,{children:`Connect or reconnect GitHub in the OpenSRE app.`}),`\n`,_jsx(_components.p,{children:`Security alert endpoints require token scopes that GitHub enforces separately. If the token cannot read one alert class, the tool returns an error for that alert type while still returning any alert classes it can read.`}),`\n`,_jsx(Heading,{level:`2`,id:`tools`,children:`Tools`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`Role`}),_jsx(_components.th,{children:`Side effects`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_github_work_items`})}),_jsxs(_components.td,{children:[`Reads issues and classifies work as `,_jsx(_components.code,{children:`taken`}),`, `,_jsx(_components.code,{children:`up_for_grabs`}),`, or `,_jsx(_components.code,{children:`unassigned`}),`.`]}),_jsx(_components.td,{children:`None`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`summarize_github_pr_status`})}),_jsx(_components.td,{children:`Reads PR detail endpoints, authoritative mergeability, check runs, and blocking reasons.`}),_jsx(_components.td,{children:`None`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_github_security_alerts`})}),_jsx(_components.td,{children:`Reads Dependabot, secret-scanning, and code-scanning alerts when token scope allows.`}),_jsx(_components.td,{children:`None`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`generate_work_status_report`})}),_jsx(_components.td,{children:`Produces a Slack-ready status report from work items and PR status.`}),_jsx(_components.td,{children:`None`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`summarize_community_followups`})}),_jsx(_components.td,{children:`Reads repository issue comments, then summarizes unanswered questions, agenda items, and suggested replies.`}),_jsx(_components.td,{children:`None`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`propose_github_issue_mutation_from_slack`})}),_jsx(_components.td,{children:`Builds a deterministic proposal for creating, updating, or closing a GitHub issue from an explicit Slack request.`}),_jsx(_components.td,{children:`None`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`execute_github_issue_mutation`})}),_jsx(_components.td,{children:`Executes an approved proposal.`}),_jsx(_components.td,{children:`Mutating; requires runtime approval`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`workflow`,children:`Workflow`}),`\n`,_jsx(Heading,{level:`4`,id:`1-read-snapshot`,children:`1. Read snapshot`}),`\n`,_jsx(_components.p,{children:`Use read tools first:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`list_github_work_items`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`summarize_github_pr_status`})}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`list_github_security_alerts`}),` when security status is relevant`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`summarize_github_pr_status`}),` does not trust list-endpoint mergeability. It fetches each PR detail endpoint so `,_jsx(_components.code,{children:`mergeable`}),` and `,_jsx(_components.code,{children:`mergeable_state`}),` are authoritative. Unknown mergeability is reported as `,_jsx(_components.code,{children:`unknown`}),`, not as ready to merge.`]}),`\n`,_jsx(Heading,{level:`4`,id:`2-report-or-summarize`,children:`2. Report or summarize`}),`\n`,_jsxs(_components.p,{children:[`Use `,_jsx(_components.code,{children:`generate_work_status_report`}),` for morning check-ins, Slack updates, blockers, owners, and next actions.`]}),`\n`,_jsx(_components.p,{children:`If the report tool performs its own GitHub reads and a required read fails, it returns:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`available: false`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`incomplete: true`})}),`\n`,_jsxs(_components.li,{children:[`an `,_jsx(_components.code,{children:`errors`}),` list`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`It must not produce a false “no blockers” report from partial data.`}),`\n`,_jsxs(_components.p,{children:[`Use `,_jsx(_components.code,{children:`summarize_community_followups`}),` for contributor questions, community meeting agenda items, and suggested replies. It reads repository issue comments directly with pagination instead of performing one request per issue.`]}),`\n`,_jsx(Heading,{level:`4`,id:`3-propose-mutation`,children:`3. Propose mutation`}),`\n`,_jsxs(_components.p,{children:[`Only when the user explicitly asks to turn a Slack request into a GitHub task, call `,_jsx(_components.code,{children:`propose_github_issue_mutation_from_slack`}),`.`]}),`\n`,_jsx(_components.p,{children:`Good proposal triggers:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`“Add this Slack request to the project task list.”`}),`\n`,_jsx(_components.li,{children:`“Create a GitHub task from this thread.”`}),`\n`,_jsx(_components.li,{children:`“Update issue 42 with this Slack context.”`}),`\n`,_jsx(_components.li,{children:`“Close task 51; PR #2973 shipped.”`}),`\n`]}),`\n`,_jsx(_components.p,{children:`The proposal includes:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`operation: `,_jsx(_components.code,{children:`create`}),`, `,_jsx(_components.code,{children:`update`}),`, or `,_jsx(_components.code,{children:`close`})]}),`\n`,_jsx(_components.li,{children:`target issue, when applicable`}),`\n`,_jsx(_components.li,{children:`rendered GitHub payload`}),`\n`,_jsx(_components.li,{children:`source Slack link`}),`\n`,_jsxs(_components.li,{children:[`deterministic `,_jsx(_components.code,{children:`proposal_id`})]}),`\n`,_jsx(_components.li,{children:`idempotency marker for retry detection`}),`\n`]}),`\n`,_jsx(Heading,{level:`4`,id:`4-execute-mutations`,children:`4. Execute mutations`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`execute_github_issue_mutation`}),` is the only `,_jsx(_components.strong,{children:`workflow`}),` mutating tool. It has no `,_jsx(_components.code,{children:`confirm`}),` argument. Ad-hoc GitHub writes in chat go through `,_jsx(_components.code,{children:`github_cli`}),`.`]}),`\n`,_jsx(_components.p,{children:`Mutation behavior:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`create`}),`: searches for the idempotency marker first; creates only if no existing issue is found.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`update`}),`: fetches the issue, adds the Slack follow-up as a comment unless the proposal marker is already present, and patches title/labels/assignees only when those fields are explicitly present. It never replaces the issue body.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`close`}),`: fetches the issue, adds a closing comment unless the proposal marker is already present, then patches `,_jsx(_components.code,{children:`state=closed`}),` and `,_jsx(_components.code,{children:`state_reason=completed`}),`. It never replaces the issue body.`]}),`\n`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Do not expose `,_jsx(_components.code,{children:`execute_github_issue_mutation`}),` outside the runtime approval path. Headless runs may render proposals, but should not execute mutations directly.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`example-prompts`,children:`Example prompts`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`“Which PRs are mergeable, blocked, or unknown in `,_jsx(_components.code,{children:`Tracer-Cloud/opensre`}),`?”`]}),`\n`,_jsx(_components.li,{children:`“What issues are taken vs up for grabs?”`}),`\n`,_jsx(_components.li,{children:`“Generate a Slack-ready morning check-in from current GitHub work.”`}),`\n`,_jsx(_components.li,{children:`“List unanswered community questions from recent issue comments.”`}),`\n`,_jsx(_components.li,{children:`“Propose a GitHub issue from this Slack request and keep the source link.”`}),`\n`,_jsx(_components.li,{children:`“Execute this approved GitHub issue proposal.”`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`verify`,children:`Verify`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`opensre`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` integrations`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` verify`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` github`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`There is no separate `,_jsx(_components.code,{children:`github-workflow`}),` verify target. Workflow tools become available when GitHub credentials validate.`]}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Symptom`}),_jsx(_components.th,{children:`Fix`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Tools unavailable`})}),_jsx(_components.td,{children:`Connect GitHub in the OpenSRE app, then refresh the connection`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Security alerts error for one class`})}),_jsx(_components.td,{children:`Token lacks that alert scope — other alert classes may still return`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`False “no blockers” concern`})}),_jsxs(_components.td,{children:[`If report reads fail, expect `,_jsx(_components.code,{children:`available: false`}),` / `,_jsx(_components.code,{children:`incomplete: true`}),` rather than an empty green report`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Mutation not executing`})}),_jsx(_components.td,{children:`Headless/non-approved runs can propose only — execute needs the runtime approval path`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Want ad-hoc issue create outside Slack flow`})}),_jsxs(_components.td,{children:[`Use `,_jsx(_components.code,{children:`github_cli`}),` — see `,_jsx(_components.a,{href:`/integrations/code/github`,children:`GitHub`})]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`security`,children:`Security`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Keep read tools and mutating execute on separate approval paths.`}),`\n`,_jsx(_components.li,{children:`Prefer least-privilege tokens; add security scopes only when you need alert listing.`}),`\n`,_jsxs(_components.li,{children:[`Store tokens in `,_jsx(_components.code,{children:`.env`}),`, not in source control.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"GitHub workflow tools","description":"Use GitHub-backed tools for read snapshots, status reports, follow-up summaries, and approved issue mutations","href":"/integrations/code/github-workflow-tools"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Overview","slug":"overview","depth":2,"children":[]},{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Setup","slug":"setup","depth":2,"children":[{"title":"Example REPL turn","slug":"example-repl-turn","depth":3,"children":[]}]},{"title":"Credentials","slug":"credentials","depth":2,"children":[]},{"title":"Tools","slug":"tools","depth":2,"children":[{"title":"Workflow","slug":"workflow","depth":3,"children":[]},{"title":"1. Read snapshot","slug":"1-read-snapshot","depth":4,"children":[]},{"title":"2. Report or summarize","slug":"2-report-or-summarize","depth":4,"children":[]},{"title":"3. Propose mutation","slug":"3-propose-mutation","depth":4,"children":[]},{"title":"4. Execute mutations","slug":"4-execute-mutations","depth":4,"children":[]},{"title":"Example prompts","slug":"example-prompts","depth":3,"children":[]}]},{"title":"Verify","slug":"verify","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Security","slug":"security","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/docs/_mintlify/custom/tracer/3640b424f7229c9e/toc-actions.js","/docs/_mintlify/custom/tracer/3efb8263c18eafe6/public/radar-chart.js"],"subdomain":"tracer","siteName":"OpenSRE Documentation","title":"GitHub workflow tools - OpenSRE Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-08T23:56:26.042Z","originalFileLocation":"integrations/code/github-workflow-tools.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Use GitHub-backed tools for read snapshots, status reports, follow-up summaries, and approved issue mutations\">\u003cmeta data-mint-head name=\"application-name\" content=\"OpenSRE Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/tracer/YbZGPFHeNcvj92i8/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/tracer/YbZGPFHeNcvj92i8/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/tracer/YbZGPFHeNcvj92i8/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/tracer/YbZGPFHeNcvj92i8/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/tracer/YbZGPFHeNcvj92i8/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/tracer/YbZGPFHeNcvj92i8/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/tracer/YbZGPFHeNcvj92i8/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/tracer/YbZGPFHeNcvj92i8/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/tracer/YbZGPFHeNcvj92i8/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"GitHub workflow tools - OpenSRE Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Use GitHub-backed tools for read snapshots, status reports, follow-up summaries, and approved issue mutations\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"OpenSRE Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://opensre.com/docs/integrations/code/github-workflow-tools\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://tracer.mintlify.app/_mintlify/api/og/v2?division=Code+and+CI\u0026amp;title=GitHub+workflow+tools\u0026amp;description=Use+GitHub-backed+tools+for+read+snapshots%2C+status+reports%2C+follow-up+summaries%2C+and+approved+issue+mutations\u0026amp;theme=ecba481d104c5d7db3f22fd8\u0026amp;signature=0d75f03939a0606b76f80793af2424881714b24a1bdc9888cfdc6f405462ec90\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"GitHub workflow tools - OpenSRE Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Use GitHub-backed tools for read snapshots, status reports, follow-up summaries, and approved issue mutations\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://tracer.mintlify.app/_mintlify/api/og/v2?division=Code+and+CI\u0026amp;title=GitHub+workflow+tools\u0026amp;description=Use+GitHub-backed+tools+for+read+snapshots%2C+status+reports%2C+follow-up+summaries%2C+and+approved+issue+mutations\u0026amp;theme=ecba481d104c5d7db3f22fd8\u0026amp;signature=0d75f03939a0606b76f80793af2424881714b24a1bdc9888cfdc6f405462ec90\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/tracer/YbZGPFHeNcvj92i8/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"OpenSRE Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#000000\">\u003clink data-mint-head rel=\"canonical\" href=\"https://opensre.com/docs/integrations/code/github-workflow-tools\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/integrations/code/github-workflow-tools.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://opensre.com/#organization\",\"name\":\"OpenSRE Documentation\",\"url\":\"https://opensre.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/tracer/rmdYtNSoc9Q5D-5B/images/opensre-logo-black.svg?fit=max\u0026auto=format\u0026n=rmdYtNSoc9Q5D-5B\u0026q=85\u0026s=7ea8db5a1f8e1665db7544632022e298\"}},{\"@type\":\"WebSite\",\"@id\":\"https://opensre.com/docs#website\",\"name\":\"OpenSRE Documentation\",\"url\":\"https://opensre.com/docs\",\"publisher\":{\"@id\":\"https://opensre.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://opensre.com/docs/integrations/code/github-workflow-tools#webpage\",\"url\":\"https://opensre.com/docs/integrations/code/github-workflow-tools\",\"name\":\"GitHub workflow tools\",\"description\":\"Use GitHub-backed tools for read snapshots, status reports, follow-up summaries, and approved issue mutations\",\"dateModified\":\"2026-10-08T23:56:26.042Z\",\"isPartOf\":{\"@id\":\"https://opensre.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://opensre.com/docs/integrations/code/github-workflow-tools#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://opensre.com/docs/integrations/code/github-workflow-tools#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Integrations\",\"item\":\"https://opensre.com/docs/integrations/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Code and CI\",\"item\":\"https://opensre.com/docs/integrations/code/architecture-audit-tool\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"GitHub workflow tools\",\"item\":\"https://opensre.com/docs/integrations/code/github-workflow-tools\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://opensre.com/docs/integrations/code/github-workflow-tools#article\",\"headline\":\"GitHub workflow tools\",\"name\":\"GitHub workflow tools\",\"description\":\"Use GitHub-backed tools for read snapshots, status reports, follow-up summaries, and approved issue mutations\",\"url\":\"https://opensre.com/docs/integrations/code/github-workflow-tools\",\"mainEntityOfPage\":{\"@id\":\"https://opensre.com/docs/integrations/code/github-workflow-tools#webpage\"},\"dateModified\":\"2026-10-08T23:56:26.042Z\",\"publisher\":{\"@id\":\"https://opensre.com/#organization\"},\"isPartOf\":{\"@id\":\"https://opensre.com/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"OpenSRE Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"OpenSRE Documentation","nav":{"global":null,"directory":"card","groups":[{"group":"Welcome","pages":[{"title":"Welcome to OpenSRE","href":"/index"},{"title":"Showcase","href":"/getting-started/showcase"},{"title":"Features","href":"/getting-started/features"},{"title":"FAQ","href":"/guides/faq"}]},{"group":"Get started","pages":[{"title":"Quickstart","href":"/getting-started/quickstart"},{"title":"Install OpenSRE","href":"/install/index"},{"title":"Local and on-prem setup","href":"/install/install-local"},{"title":"Enterprise setup (OpenSRE Cloud)","href":"/install/install-enterprise"},{"group":"Platforms","expanded":false,"pages":[{"title":"macOS","href":"/install/macos"},{"title":"Linux","href":"/install/linux-local"},{"title":"Windows","href":"/install/windows-local"},{"title":"Docker","href":"/install/docker"}]},{"title":"Environment Variables","href":"/install/environment-variables"},{"title":"Sync to your own object store","href":"/install/remote-sync"}]},{"group":"CI/CD","pages":[{"title":"CI/CD with OpenSRE","href":"/cicd/overview"},{"title":"CI/CD analytics demo","href":"/cicd/cicd-analytics-demo"},{"title":"Fix GitHub CI","href":"/cicd/github-ci-fix"},{"title":"Keep CI green with an agent","href":"/cicd/ci-repair-agent"},{"title":"Scan CI health across repositories","href":"/cicd/github-ci-health-scan"}]},{"group":"Using the shell","pages":[{"title":"Shell commands","href":"/getting-started/interactive-shell-commands"},{"title":"Agent with connected tools","href":"/getting-started/interactive-shell-assistant"},{"title":"Goals","href":"/getting-started/goals"}]},{"group":"Guides","pages":[{"title":"OTel payment auto-triage pilot","href":"/guides/otel-payment-triage"}]},{"group":"Run it anywhere","pages":[{"title":"Deployment","href":"/guides/deployment"},{"title":"Headless CLI","href":"/guides/headless-cli"},{"title":"HTTP API","href":"/guides/api"},{"title":"Python API","href":"/guides/python-api"},{"title":"Hosting the Agent","href":"/guides/hosting-the-agent"}]},{"group":"Platform","pages":[{"title":"LLM Providers","href":"/platform/llm-providers"},{"title":"Multi-instance integrations","href":"/platform/multi-instance-integrations"},{"title":"Masking Sensitive Identifiers","href":"/platform/masking"},{"title":"Interactive Shell Privacy","href":"/platform/interactive-shell-privacy"},{"title":"Session History","href":"/platform/sessions"},{"title":"Principal-scoped storage (Slack and Discord)","href":"/platform/principal-scoped-storage"},{"title":"Long-Term Memory","href":"/platform/memory"},{"title":"Work Management","href":"/platform/work-management"},{"title":"Scheduled Deliveries (Cron)","href":"/platform/cron"},{"title":"Closed-Loop Learning","href":"/platform/closed-loop-learning"}]},{"group":"Integrations","pages":[{"title":"Integrations overview","href":"/integrations/index"},{"group":"Monitoring","expanded":false,"pages":[{"title":"Azure Monitor","href":"/integrations/monitoring/azure-monitor"},{"title":"Better Stack Telemetry","href":"/integrations/monitoring/betterstack"},{"title":"Coralogix","href":"/integrations/monitoring/coralogix"},{"title":"Datadog","href":"/integrations/monitoring/datadog"},{"title":"Grafana","href":"/integrations/monitoring/grafana"},{"title":"Grafana Annotations","href":"/integrations/monitoring/grafana_annotations"},{"title":"groundcover","href":"/integrations/monitoring/groundcover"},{"title":"Honeycomb","href":"/integrations/monitoring/honeycomb"},{"title":"New Relic","href":"/integrations/monitoring/new_relic"},{"title":"OpenObserve","href":"/integrations/monitoring/openobserve"},{"title":"PostHog","href":"/integrations/monitoring/posthog"},{"title":"PostHog (MCP)","href":"/integrations/monitoring/posthog-mcp"},{"title":"SigNoz","href":"/integrations/monitoring/signoz"},{"title":"Splunk","href":"/integrations/monitoring/splunk"},{"title":"Grafana Tempo","href":"/integrations/monitoring/tempo"},{"title":"VictoriaLogs","href":"/integrations/monitoring/victoria_logs"}]},{"group":"Incidents","expanded":false,"pages":[{"title":"Alertmanager","href":"/integrations/incidents/alertmanager"},{"title":"Runbook-guided investigations","href":"/integrations/incidents/runbook-guided-investigations"},{"title":"incident.io","href":"/integrations/incidents/incident_io"},{"title":"PagerDuty","href":"/integrations/incidents/pagerduty"},{"title":"Sentry","href":"/integrations/incidents/sentry"},{"title":"Sentry (MCP)","href":"/integrations/incidents/sentry-mcp"},{"title":"ServiceNow","href":"/integrations/incidents/servicenow"},{"title":"Fix a Sentry issue","href":"/integrations/incidents/fix-sentry-issue"}]},{"group":"Cloud","expanded":false,"pages":[{"title":"Argo CD","href":"/integrations/cloud/argocd"},{"title":"AWS","href":"/integrations/cloud/aws"},{"title":"AWS Lambda","href":"/integrations/cloud/aws_lambda"},{"title":"AWS CloudTrail","href":"/integrations/cloud/cloudtrail_events"},{"title":"AWS EC2","href":"/integrations/cloud/ec2"},{"title":"AWS ELB","href":"/integrations/cloud/elb"},{"title":"Helm (CLI)","href":"/integrations/cloud/helm"},{"title":"Kubernetes","href":"/integrations/cloud/kubernetes"},{"title":"Railway","href":"/integrations/cloud/railway"},{"title":"AWS S3","href":"/integrations/cloud/s3"},{"title":"AWS SQS","href":"/integrations/cloud/sqs_queues"},{"title":"Vercel","href":"/integrations/cloud/vercel"}]},{"group":"Code and CI","expanded":false,"pages":[{"title":"Architecture audit tool","href":"/integrations/code/architecture-audit-tool"},{"title":"Structured file reads","href":"/integrations/code/structured-file-tool"},{"title":"Counting files","href":"/integrations/code/counting-files"},{"title":"Bitbucket","href":"/integrations/code/bitbucket"},{"title":"GitHub","href":"/integrations/code/github"},{"title":"Fix GitHub security and quality findings","href":"/integrations/code/github-security-fix"},{"title":"Resolve merge conflicts","description":"Ask OpenSRE to resolve the conflicts of a git merge with a coding agent, review each hunk side by side, then commit and push.","href":"/integrations/code/resolve-merge-conflicts"},{"title":"GitHub workflow tools","href":"/integrations/code/github-workflow-tools"},{"title":"GitHub Actions","description":"Trace incidents back to failing GitHub Actions workflow runs, jobs, and step logs","href":"/integrations/code/github-actions"},{"title":"GitLab","href":"/integrations/code/gitlab"},{"title":"Jenkins","href":"/integrations/code/jenkins"},{"title":"Pi coding tasks","href":"/integrations/code/pi-coding"}]},{"group":"Collaboration","expanded":false,"pages":[{"title":"Google Docs","href":"/integrations/collaboration/google-docs"},{"title":"Jira","href":"/integrations/collaboration/jira"},{"title":"Trello","href":"/integrations/collaboration/trello"}]},{"group":"Messaging","expanded":false,"pages":[{"title":"Messaging","href":"/integrations/messaging/index"},{"title":"SMTP","href":"/integrations/messaging/smtp"},{"title":"Buzz","href":"/integrations/messaging/buzz"},{"title":"Slack","href":"/integrations/messaging/slack"},{"title":"Discord","href":"/integrations/messaging/discord"},{"title":"Telegram","href":"/integrations/messaging/telegram"},{"title":"Rocket.Chat","href":"/integrations/messaging/rocketchat"},{"title":"WhatsApp","href":"/integrations/messaging/whatsapp"},{"title":"Twilio SMS","href":"/integrations/messaging/twilio-sms"}]},{"group":"Databases","expanded":false,"pages":[{"title":"Azure SQL","href":"/integrations/databases/azure-sql"},{"title":"ClickHouse","href":"/integrations/databases/clickhouse"},{"title":"AWS Elasticsearch (AWS ES)","href":"/integrations/databases/elasticsearch"},{"title":"MariaDB","href":"/integrations/databases/mariadb"},{"title":"MongoDB","href":"/integrations/databases/mongodb"},{"title":"MongoDB Atlas","href":"/integrations/databases/mongodb-atlas"},{"title":"MySQL","href":"/integrations/databases/mysql"},{"title":"OpenSearch / Elasticsearch","href":"/integrations/databases/opensearch"},{"title":"PostgreSQL","href":"/integrations/databases/postgresql"},{"title":"AWS RDS","href":"/integrations/databases/rds"},{"title":"Redis","href":"/integrations/databases/redis"},{"title":"Snowflake","href":"/integrations/databases/snowflake"},{"title":"Supabase","href":"/integrations/databases/supabase"}]},{"group":"Workflows","expanded":false,"pages":[{"title":"Airflow","href":"/integrations/workflows/airflow"},{"title":"Dagster","href":"/integrations/workflows/dagster"},{"title":"Kafka","href":"/integrations/workflows/kafka"},{"title":"Prefect","href":"/integrations/workflows/prefect"},{"title":"RabbitMQ","href":"/integrations/workflows/rabbitmq"},{"title":"Temporal","href":"/integrations/workflows/temporal"}]}]},{"group":"Community","pages":[{"title":"Community Giveaway","href":"/guides/bi-weekly-giveaway"},{"title":"Pull request review flow","href":"/guides/pr-review-flow"}]}]},"basePath":"","title":"GitHub workflow tools - OpenSRE Documentation","buildId":"dpl_GWQzn6k13MqphA3qck3hQKoQXDzM","deploymentId":"dpl_GWQzn6k13MqphA3qck3hQKoQXDzM","dynamics":[],"chunks":[]}