You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Adds evidence-based issue investigation after triage, adapted from Azure/azure-sdk-for-net#60514 for Python and PyPI.
Protecting existing workflows
Existing triage label/comment/assignment budgets, owner-routing code/dependencies, permissions, and failure reporting are preserved against main. Investigation is handled by a separate completion-triggered relay, not by a prerequisite of triage writes or completion. The existing Actionlint workflow is restored byte-for-byte; new native contracts run in a separate path-filtered CI workflow.
Automatic handoff is disabled by default. A maintainer can set GH_AW_ENABLE_ISSUE_INVESTIGATION=true after rollout validation. Manual investigation dispatch remains available. The relay verifies a successful same-repository/default-branch triage run, attempt-specific jobs and current artifacts, the explicit safe detection verdict, the target cross-checked from trusted activation-job logs, the applied analysis comment, and owner routing before native dispatch. Its failures cannot gate or roll back the completed triage workflow. The existing triage source, generated workflow, and shared Actionlint are byte-for-byte identical to current upstream main; runtime selection and concurrency are unchanged.
Changes and review fixes
Use an independent, opt-in completion relay after successful triage. Preserve single-owner assignment and mention-based routing using actual application receipts.
Validate nonempty terminal outputs before mutations. Reject incomplete/error outputs and conflicting actions rather than returning a misleading successful run.
Bind investigation comments and closures to the dispatched issue before invoking native handlers; the pinned close handler does not itself enforce its configured target. Recheck open/unlocked status and all clean-triage labels before mutations and Copilot assignment.
Use the closure handler's comment-first behavior and gate Copilot assignment on the applied recommendation comment's Outcome. Keep authentication/availability skips best-effort.
Preserve lifecycle-aware compatible-release guidance, specific duplicate evidence, targeted information requests, service-ownership evidence, and human-review exclusions. Read all comment pages before deciding whether an investigation is repeated.
Generate the workflows with gh-aw v0.88.8 and pin Copilot CLI 1.0.80. Run native handler/serializer and baseline-compatibility contracts in a separate path-filtered CI workflow.
Local validation
The added investigation compiles with strict/schema validation and zero warnings; its generated output is reproducible. Existing triage source and generated YAML are restored exactly from upstream, not regenerated.
21 automated test groups pass, including 370 named deterministic gate, corner-case, and relay integration scenarios. Coverage includes full-file legacy parity, missing/expired/ambiguous artifacts, reruns, actual native dispatcher calls with mocked GitHub writes, every handoff predicate, scope validation, and supported target representations.
Native actionlint v1.7.12, repository cspell, and whitespace checks pass.
The real single-owner receipt is rejected by the previously published helper and accepted by the corrected helper.
Live evidence and remaining limitations
Earlier live runs verified a targeted information request and a bounded documentation-fix recommendation on commit 06bc1d0, plus a negative handoff that lacked a valid analysis receipt. Most of the planned live gate matrix was not executed before cleanup. The corrected relay selected the issue and artifact IDs read-only from real upstream triage run 38799256886. Full live gate coverage, automatic completion-triggered dispatch, and persistent coding-agent assignment remain unverified; a native handler success log alone is not proof of assignment. No full-live-validation claim is made for this update.
Copilot assignment remains best-effort with the existing credential chain. Ownership/version decisions remain model-based, and separate API calls are not transactional. Native runtime scripts are pinned and tested rather than copied or modified.
API, compatibility, and security
No SDK implementation, public API, package version, dependency, or release metadata changes. The color-based label taxonomy is unchanged: all service names and all six current category colors remain supported, including future service names using the same color. Positive integer forms, case-insensitive colors, and an optional leading color hash remain accepted. Closed/locked/manual-triage issues and cross-issue output targets are intentionally excluded. The agent stays read-only with shell access disabled; no new secrets or external inference endpoints are introduced.
Reviewer risks
Likely reviewer
Comment they might leave
Evidence checked
Fix made or reason deliberately kept
Azure SDK engineering owners
Handcrafted receipts do not reflect runtime behavior
Pinned handler and serializer execution
Real runtime regression tests in CI
Copilot reviewer
Scoped closures or gated assignment still affect the wrong issue
Native close-target probe, applied receipts, current issue state
Trusted output binding and clean-triage revalidation
Python owners
Upgrade advice rejects supported versions or previews
Published lifecycle policy and release conventions
Compatible-release guidance, no service/cloud allowlist
All SDK Contribution checklist
No SDK breaking changes.
Package CHANGELOG: not applicable to this workflow-only change.
Contribution guidelines read.
Title and description reflect the implementation and known validation limits.
Existing PR history preserved; no merge or force push requested.
Ports the Azure SDK for .NET Agentic Issue Investigation workflow to
azure-sdk-for-python, adapted for Python conventions (PyPI package
metadata, azure-<service>-<package> naming, sdk/<service>/TROUBLESHOOTING.md
lookups).
- Adds .github/workflows/issue-investigation.md + compiled lock.yml
- Updates issue-triage.md to add Step 7: Dispatch Agentic Investigation,
auto-chaining into the new investigation workflow after a clean triage
handoff, plus the dispatch-workflow safe-output declaration
Same decision gates as .NET: handoff validation, version currency,
duplicate detection, insufficient context, working-as-designed/service-side,
actionable SDK issue (with exclusions), and an overarching confidence gate.
For testing/validation in this fork only.
Azure Pipelines:
Successfully started running 1 pipeline(s).
9 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
Adds an automated, evidence-gated investigation stage after issue triage.
Changes:
Adds issue investigation and decision rules.
Dispatches investigations after clean triage.
Adds compiled workflow definitions.
Reviewed changes
Copilot reviewed 3 out of 4 changed files in this pull request and generated 6 comments.
File
Description
.github/workflows/issue-investigation.md
Defines investigation behavior and outputs.
.github/workflows/issue-investigation.lock.yml
Compiles the investigation workflow.
.github/workflows/issue-triage.md
Dispatches eligible issues for investigation.
.github/workflows/issue-triage.lock.yml
Compiles updated triage orchestration.
Suppressed comments (1)
.github/workflows/issue-investigation.md:61
The assignment sink is also repository-wide, so a compromised or mistaken investigation can assign Copilot to an issue other than the dispatched one. Restrict the safe output to the supplied issue number.
The prior actionable-path example claimed a StopIteration/continuation_token
bug in azure-core PageIterator/_list_blobs_helper.py that does not actually
exist -- current source (paging.py:79-80) already guards against it.
Presenting a false root cause as a worked example risked priming the
investigator to reproduce it on a superficially similar real report.
Replaced with a verified-real example: an etag operand-order bug in
azure-appconfiguration's set_configuration_setting (confirmed present in
current source by direct inspection), which silently ignores an explicit
etag kwarg whenever the ConfigurationSetting object already has one set.
Thanks for the thorough review — addressing each finding:
1. Fabricated worked example (issue-investigation.md:310) — FIXED. Verified: azure-core/paging.py:79-80 does already guard against the None continuation-token case I claimed was missing. Replaced the example with a real, verified bug I found and confirmed by direct source inspection: an etag operand-order bug in azure-appconfiguration's set_configuration_setting (etag=configuration_setting.etag or etag instead of etag=etag or configuration_setting.etag). See commit 1b600f3.
2 & 5. Stale gh-aw compiler version (v0.81.6) on both lock files. Confirmed valid — this repo's other workflows are on v0.87.1+, and the older compiler's Copilot CLI invocation pattern doesn't copy the binary to a mounted path first. I attempted to upgrade my local gh-aw CLI to match, but the v0.87.10 download was blocked by Windows Defender as a false-positive in my environment, and I'm not going to work around an AV block. This needs a maintainer with a clean v0.87.1+ install to recompile both lock files before merge — flagging clearly rather than shipping something I couldn't verify.
3. Version Currency wording ("only available for the latest package version"). This is intentional and inherited verbatim from the already-merged .NET workflow (Azure/azure-sdk-for-net PR #60514), where it was explicitly requested by that workflow's maintainer as a mandatory decision point rather than soft guidance. I don't think this Python PR should unilaterally soften wording that was deliberately hardened upstream — but happy to revisit if this repo's policy genuinely differs, that's a maintainer call.
4. Exclusion routing ambiguity (noop vs. "Requires a human"). Confirmed this same tension exists verbatim in the current .NET source too — it's not something introduced by this port. Reading intent: well-evidenced excluded cases → "Requires a human" (post the analysis); cases lacking evidence → noop. Open to tightening the wording, but wanted to flag this is a pre-existing ambiguity, not new.
6. Wildcard target: "*" on close-issue/assign-to-agent. Also inherited verbatim from .NET's current production config. Valid architectural question — today the safety boundary relies on the prompt instructing the agent to only act on the dispatched issue_number, not on safe-output-level enforcement. I didn't find a gh-aw option to bind target to a dynamic issue number; if one exists, happy to apply it here and suggest it back upstream to .NET too.
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
Copilot reviewed 3 out of 4 changed files in this pull request and generated 1 comment.
Suppressed comments (3)
.github/workflows/issue-investigation.md:129
This is stricter than the Azure SDK support policy: an Active major version is fully supported, while customers are only encouraged to use the latest compatible release. The Version Currency rule consequently short-circuits valid reports from any older minor/patch and tells supported customers that support only applies to latest. Reframe currency as diagnostic guidance and reserve support-based deferral for lifecycle/compatibility cases rather than every non-latest version.
## Support Policy Expectation
By policy, Azure SDK support is only available for the latest package version. Version currency is a mandatory decision point, not just background guidance.
.github/workflows/issue-investigation.md:224
For confirmed SDK-side issues that hit an exclusion, this rule directs the agent to noop, but the Comment Format explicitly defines Requires a human. Analysis provided below for those same cases. As written, complex but well-evidenced SDK issues can silently disappear instead of giving maintainers the prepared analysis. Emit the human-review outcome for confirmed SDK-side exclusions, while retaining targeted requests/noop only when ownership or required evidence is unresolved.
Do not assign Copilot, even if the above are met, when the issue requires any of the following. Use `noop` or a targeted Insufficient Context request instead:
.github/workflows/issue-triage.lock.yml:1
This regenerated lockfile is also pinned to gh-aw v0.81.6 and retains the older direct /usr/local/bin/copilot invocation. Recompile issue-triage.md with the current gh-aw release so it uses the repository's mounted Copilot CLI pattern and commit the resulting lockfile; generated YAML should not be patched manually.
The reason will be displayed to describe this comment to others. Learn more.
🟡 Changes recommended
The workflows contain unsafe wildcard targets, an incorrect support-policy gate, contradictory outcome instructions, and outdated generated locks.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
Suppressed comments (5)
.github/workflows/issue-investigation.md:224
This makes the documented Requires a human outcome unreachable: exclusions are told to emit noop, while lines 260 and 279 say those same exclusions should produce the human-analysis comment. Confirmed SDK-side issues requiring API, security, reliability, or broad design work will therefore receive no investigation result. Route confirmed exclusions to the human outcome and reserve noop for cases lacking enough evidence.
Do not assign Copilot, even if the above are met, when the issue requires any of the following. Use `noop` or a targeted Insufficient Context request instead:
.github/workflows/issue-investigation.md:42
The workflow already has one trusted target in github.event.inputs.issue_number, but target: "*" allows model output influenced by untrusted issue text to close any issue in the repository. Restrict this destructive safe output to that input (and preferably require customer-reported) so the safe-output boundary contains a misdirected action.
target: "*"
.github/workflows/issue-triage.lock.yml:1
This regenerated lock also remains on gh-aw v0.81.6 and invokes /usr/local/bin/copilot rather than the mounted ${RUNNER_TEMP}/gh-aw/bin/copilot pattern emitted by the repository's v0.87.1 workflow. Recompile issue-triage with the repository-standard current gh-aw before merging so the newly chained triage run does not fail at agent startup.
The Azure SDK support policy does not limit support to the latest point release: Active major versions are fully supported, while the latest compatible release is only encouraged because it receives fixes. Making this a mandatory early exit will incorrectly reject valid reports against supported older minor/patch releases. Base the gate on lifecycle status and known fixes instead of exact version currency.
By policy, Azure SDK support is only available for the latest package version. Version currency is a mandatory decision point, not just background guidance.
.github/workflows/issue-investigation.md:39
This wildcard lets untrusted issue content redirect the investigation comment to an unrelated issue. Scope add-comment to ${{ github.event.inputs.issue_number }} so output can only affect the issue selected by the dispatcher.
- Fix stale tool reference: prompt said get_issue, the pinned GitHub MCP
server (v1.4.0) exposes issue_read with no alias for the old name.
Earlier runs worked because the model self-corrected, but that's fragile.
- Scope add-comment/close-issue/assign-to-agent target to the dispatched
issue_number instead of wildcard *, so a misdirected or injected output
can no longer affect an unrelated issue. Verified in compiled output.
- Fix a real contradiction: the Actionable SDK Issue exclusions said to
noop, while the Comment Format section said the same condition should
produce the 'Requires a human' outcome, making that outcome unreachable.
Now routes well-evidenced exclusions to the human outcome and reserves
noop for cases lacking evidence.
Update after a second automated review pass surfaced 3 more real findings — fixed all 3:
get_issue → issue_read. Confirmed via my own earlier successful test runs that the model was self-correcting to the real tool name — but that's fragile, not something to rely on. Fixed the prompt to reference the actual tool.
Wildcard target: "*" on add-comment/close-issue/assign-to-agent. Took the suggested fix and verified it actually works: scoped all three to ${{ github.event.inputs.issue_number }}, confirmed in the compiled lock output (not silently ignored).
Exclusion routing contradiction. You're right that this was a real bug, not just an inherited quirk worth leaving — "noop" and "Requires a human" were both instructed for the same condition, making the human-analysis outcome unreachable. Fixed: well-evidenced exclusions now route to "Requires a human," noop/Insufficient-Context reserved for when the exclusion itself lacks evidence.
Still open, honestly:
gh-aw compiler version (both lock files). Still couldn't safely upgrade past v0.81.6 in my environment (Defender false-positive on v0.87.10). This is a real, functional risk per your note that triage could fail at agent startup — needs a maintainer with a clean install to recompile before merge.
Version Currency wording ("support only for latest package version"). I'm intentionally leaving this matching .NET's current, deliberately-reviewed wording rather than unilaterally softening it — but I recognize you've now flagged this twice with specific reasoning (lifecycle/major-version vs. exact-version-currency). This is a genuine policy question, not a text bug, so I don't think it's mine to resolve alone — flagging for whoever owns Python SDK support-policy interpretation.
The reason will be displayed to describe this comment to others. Learn more.
🟡 Changes recommended
The support-policy gate is inaccurate, closed issues are not excluded, and both lockfiles require recompilation with current gh-aw.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
Suppressed comments (3)
Previously missed (1) — in code that hasn't changed since the last review.
.github/workflows/issue-investigation.md:96
The handoff gate never checks that the issue is still open. Because the investigation is queued after triage, an author or maintainer can close the issue before this run starts; that closed issue still passes these label checks and can receive a new automated comment or Copilot-assignment attempt. Require the retrieved issue state to be open so stale/manual dispatches no-op.
.github/workflows/issue-investigation.md:129
This version gate is based on an incorrect support-policy premise. The Azure SDK lifecycle policy says an Active major version is fully supported and only encourages customers to use the latest compatible minor/patch release; it does not make every older point release unsupported. As written, the workflow will stop investigation and send supported customers away whenever their point release is not the newest. Please rewrite this section and the Version Currency rule to treat lifecycle status as the support boundary, while recommending an upgrade when the issue may already be fixed.
By policy, Azure SDK support is only available for the latest package version. Version currency is a mandatory decision point, not just background guidance.
.github/workflows/issue-triage.lock.yml:1
This lockfile was regenerated with gh-aw v0.81.6, so it retains the old hard-coded /usr/local/bin/copilot sandbox invocation (line 938). The repository's v0.87.1-generated workflow instead resolves Copilot from PATH, copies it into ${RUNNER_TEMP}/gh-aw/bin, mounts that directory, and invokes the copied binary (mgmt-sdk-pr-review.lock.yml:772-809); without that pattern, the installed CLI may not be available in the sandbox. Recompile this workflow with the repository's current gh-aw version before merging.
Merge upstream main, regenerate the triage and investigation workflows with gh-aw v0.88.8, align version guidance with the Azure SDK lifecycle policy, and preserve issue-scoped outputs and per-issue concurrency.
Add workflow contract regressions for handoff requirements, compatibility guidance, failure reporting, compiler bootstrap, and dispatch integration, and run them in the existing Actionlint workflow.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
ROHIT SINGHAL (rohitsinghal4u)
changed the title
Add agentic issue investigation workflow (ported from azure-sdk-for-net)
Add agentic issue investigation workflow
Sep 28, 2026
Move eligibility checks and native workflow dispatch into trusted post-processing after buffered label/comment operations and owner notification succeed. Verify current issue state and the analysis comment receipt, and prevent early, partial, staged, or failed handoffs.
Add executable handoff regressions, use canonical issue_read in triage, and fix the spelling failure in the workflow contract test name. Regenerate gh-aw sources with the repository-matching compiler.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Handle both existing owner-routing paths: completed direct assignment for a single SDK owner, and successful mention notification for multiple or service owners. Read trusted safe-output receipts to identify the actual analysis comment instead of mistaking the earlier routing comment for analysis.
Reuse native assignment normalization, reject incomplete triage, initialize native audit output paths, and cover single-owner and missing-receipt cases with executable regressions.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The reason will be displayed to describe this comment to others. Learn more.
Copilot review overview
🟡 Changes recommended
Independent safe-output processing can close or assign issues without the required analysis comment, and assignment receipts are not fully bound to the target issue.
The reason will be displayed to describe this comment to others. Learn more.
Copilot review overview
🔵 Needs a closer look
The workflow can close customer issues and initiate coding-agent work, so final human review is warranted despite the comprehensive safeguards and tests.
…ingle-owner verification
- Require exactly one assignment request and receipt matching the investigated issue for single-owner triage routing.
- Supply service-side explanation in close_issue body so closure aborts if comment fails.
- Defer assign_to_agent and gate in copilot_assignment job on applied analysis-comment receipt.
- Pin engine copilot version to 1.0.80 in both workflows.
- Add copilot_assignment helper script and comprehensive unit/contract tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…nts, and hyphenate ignore-if-error
- Accept completed_with_skips with 0 items applied in confirm-assignment step, preserving best-effort assignment behavior.
- Instruct issue_read to use perPage: 100 and paginate through all pages when checking for prior investigations.
- Use hyphenated ignore-if-error in copilot_assignment handler config and assert in test.
- Update workflow contract tests to cover pagination and assignment skip handling.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Fix single-owner routing using the pinned runtime receipt shape without trusting a missing number field. Preserve exactly one target-bound assignment request and one applied receipt.
Validate terminal output before mutations, bind closure/comment targets to the dispatch input, recheck clean triage before writes and Copilot assignment, and reject contradictory actions. Share validation logic and run real pinned handler contracts in CI.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Use workflow token for preflight reads to preserve best-effort auth
.github/workflows/issue-investigation.md:164
The assignment credential is also being used for the helper's issue/comment reads. If GH_AW_AGENT_TOKEN is expired or lacks repository read access, prepareAssignment fails before the native handler can apply ignore-if-error, so the documented best-effort authentication behavior becomes a hard job failure. Use the normal workflow token for preflight reads and pass the elevated credential separately through the handler's supported GH_AW_ASSIGN_TO_AGENT_TOKEN variable, matching the generated safe-outputs job.
Restore baseline triage output budgets, owner-notification dependencies and failure reporting. Move native investigation dispatch into an independent completed-run relay with verified activation context, current application receipts and explicit detection verdict.
Make automatic handoff opt-in, preserve manual investigation dispatch, and move native contract tests into a separate path-filtered workflow. Add golden baseline checks proving original routing/control contracts and Actionlint remain unchanged.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Restore existing triage source and lock exactly to upstream, including original runtime selection and concurrency. Resolve investigation targets from verified attempt-specific activation job context when completed runs no longer expose activation artifacts, and recheck the parent attempt before dispatch.
Preserve native numeric and same-repository target forms while rejecting ambiguous inputs and cross-repository assignment requests. Add whole-file legacy parity and 370 named deterministic relay, gate, and corner-case scenarios, including execution of the real relay script with the pinned dispatcher.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The reason will be displayed to describe this comment to others. Learn more.
🔵 Needs a closer look
Privileged workflow chaining and model-driven closures need human review, especially with unresolved correctness issues and incomplete live validation.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Adds evidence-based issue investigation after triage, adapted from Azure/azure-sdk-for-net#60514 for Python and PyPI.
Protecting existing workflows
Existing triage label/comment/assignment budgets, owner-routing code/dependencies, permissions, and failure reporting are preserved against main. Investigation is handled by a separate completion-triggered relay, not by a prerequisite of triage writes or completion. The existing Actionlint workflow is restored byte-for-byte; new native contracts run in a separate path-filtered CI workflow.
Automatic handoff is disabled by default. A maintainer can set
GH_AW_ENABLE_ISSUE_INVESTIGATION=trueafter rollout validation. Manual investigation dispatch remains available. The relay verifies a successful same-repository/default-branch triage run, attempt-specific jobs and current artifacts, the explicit safe detection verdict, the target cross-checked from trusted activation-job logs, the applied analysis comment, and owner routing before native dispatch. Its failures cannot gate or roll back the completed triage workflow. The existing triage source, generated workflow, and shared Actionlint are byte-for-byte identical to current upstream main; runtime selection and concurrency are unchanged.Changes and review fixes
Local validation
Live evidence and remaining limitations
Earlier live runs verified a targeted information request and a bounded documentation-fix recommendation on commit 06bc1d0, plus a negative handoff that lacked a valid analysis receipt. Most of the planned live gate matrix was not executed before cleanup. The corrected relay selected the issue and artifact IDs read-only from real upstream triage run 38799256886. Full live gate coverage, automatic completion-triggered dispatch, and persistent coding-agent assignment remain unverified; a native handler success log alone is not proof of assignment. No full-live-validation claim is made for this update.
Copilot assignment remains best-effort with the existing credential chain. Ownership/version decisions remain model-based, and separate API calls are not transactional. Native runtime scripts are pinned and tested rather than copied or modified.
API, compatibility, and security
No SDK implementation, public API, package version, dependency, or release metadata changes. The color-based label taxonomy is unchanged: all service names and all six current category colors remain supported, including future service names using the same color. Positive integer forms, case-insensitive colors, and an optional leading color hash remain accepted. Closed/locked/manual-triage issues and cross-issue output targets are intentionally excluded. The agent stays read-only with shell access disabled; no new secrets or external inference endpoints are introduced.
Reviewer risks
All SDK Contribution checklist