Skip to content

Add Azure DevOps Services support to respond-to-pr-comments#253

Closed
abeltrano wants to merge 2 commits intomainfrom
feat/respond-to-pr-comments-ado-support
Closed

Add Azure DevOps Services support to respond-to-pr-comments#253
abeltrano wants to merge 2 commits intomainfrom
feat/respond-to-pr-comments-ado-support

Conversation

@abeltrano
Copy link
Copy Markdown
Collaborator

Extends the respond-to-pr-comments template, skill, and format to handle Azure DevOps Services pull requests alongside GitHub. The workflow shape is shared and only the API recipes branch per platform; users do not need to pass a new parameter or pick a platform.

What's new

  • Auto-detect platform from the PR URL (github.com vs dev.azure.com / *.visualstudio.com), with fallback to git remote -v (handles SSH remotes including git@ssh.dev.azure.com:v3/... and {org}@vs-ssh.visualstudio.com:v3/...). Prompts on ambiguity — does not guess.
  • ADO auth via az login + az rest --resource <ADO GUID> on every call. No Personal Access Token path.
  • Native status vocabulary preserved — no cross-platform normalization. ADO uses fixed (not resolved) per the official CommentThreadStatus REST enum.
  • ADO reply payload uses content + parentCommentId + commentType: "text". parentCommentId is always set, including for PR-wide threads (reply to the latest text comment).
  • System threads are filtered (commentType: "system" or system CodeReviewThreadType properties); threads with no text comments are flagged for the user, not auto-skipped.
  • Conservative outdated detection — prefer the ADO iterations + items APIs; fall back to the local working tree only when HEAD matches the iteration's source-branch tip; otherwise mark "unknown / not verified" and ask. PR-wide threads (null threadContext) skip outdated detection.
  • GitHub recipe paginates both outer reviewThreads and inner comments via follow-up cursored queries.
  • Out of scope, fail fast: ADO Server / on-prem / TFS / custom hostnames stop with a clear message rather than attempting unsupported API calls.

Files changed

  • templates/respond-to-pr-comments.md — added Phase 1 platform detection and per-platform branches in Phase 2 (gather) and Phase 5 (apply); ADO edge cases in Phase 6; expanded Quality Checklist.
  • .github/skills/respond-to-pr-comments/SKILL.md — mirrors the template with compact per-platform recipes side-by-side.
  • formats/pr-comment-responses.md — generalized status tables and the Action Summary to use platform-native vocabulary.
  • manifest.yaml — updated entry description to mention ADO Services.

Validation

  • python tests/validate-manifest.py passes (manifest ↔ template protocol sync unchanged).
  • Two rubber-duck critique passes were applied; ADO REST shape verified against MS Learn docs (CommentThreadStatus, threads/comments endpoints, payload field names).

Extends the respond-to-pr-comments template, skill, and format to

handle Azure DevOps Services PRs alongside GitHub. Platform is

auto-detected from the PR URL (with git-remote fallback); the

workflow shape is shared and only API recipes branch per platform.

- Auto-detect platform from PR URL or git remote (handles SSH and

  legacy visualstudio.com hosts); prompt on ambiguity, do not guess.

- ADO auth uses 'az login' + 'az rest --resource <ADO GUID>' on

  every call; no Personal Access Token path.

- Preserve each platform's native status vocabulary in output (no

  cross-platform normalization). ADO uses 'fixed' (not 'resolved')

  per the CommentThreadStatus REST enum.

- ADO reply payload uses content + parentCommentId + commentType

  ('text'); always set parentCommentId, including for PR-wide threads.

- Filter ADO system threads (commentType 'system' or system

  CodeReviewThreadType properties); flag, do not auto-skip, threads

  with no text comments.

- Conservative outdated detection: prefer ADO iteration/items API,

  fall back to local working tree only when HEAD matches the

  iteration's source-branch tip; otherwise mark unverified.

- GitHub recipe paginates both reviewThreads and inner comments via

  follow-up cursored queries.

- ADO Server / on-prem / TFS / custom hostnames are out of scope —

  stop with a clear message.

- Update format file with per-platform status tables and add

  byDesign to the closed-state action summary.

- Update manifest description to mention ADO Services.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings May 4, 2026 18:19
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Extends the respond-to-pr-comments workflow/template ecosystem to support Azure DevOps Services PRs alongside GitHub by adding platform detection, ADO-specific API recipes (auth via az rest), and platform-native status vocabulary throughout.

Changes:

  • Added a new “detect platform + resolve coordinates” phase and branched gather/apply steps for GitHub vs Azure DevOps Services.
  • Updated the shared output format to use platform-native thread status vocabulary (GitHub pending/outdated/resolved; ADO active/pending/fixed/... + “potentially outdated”).
  • Updated the skill doc and manifest description to reflect the new ADO Services support.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 4 comments.

File Description
templates/respond-to-pr-comments.md Adds platform detection and ADO Services branches for gather/apply/status update workflows.
.github/skills/respond-to-pr-comments/SKILL.md Mirrors the template with compact GitHub vs ADO recipes and constraints.
formats/pr-comment-responses.md Generalizes the reporting format and status tables for GitHub vs ADO.
manifest.yaml Updates the template description to mention ADO Services and platform autodetection.

Comment thread templates/respond-to-pr-comments.md Outdated
Comment thread .github/skills/respond-to-pr-comments/SKILL.md Outdated
Comment thread templates/respond-to-pr-comments.md Outdated
Comment thread .github/skills/respond-to-pr-comments/SKILL.md Outdated
- ADO reply POST switched to temp-file pattern (--body @reply.json)

  to handle apostrophes/newlines/backslashes in real reply text;

  mirrors the GitHub recipe.

- pr_reference param doc clarified: URL auto-detect with git-remote

  fallback and ambiguity prompt (covers #42 / !123 inputs).

- All shell command fences in SKILL labeled bash for clarity.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@abeltrano abeltrano requested a review from Alan-Jowett May 4, 2026 19:07
@abeltrano abeltrano changed the title feat(respond-to-pr-comments): add Azure DevOps Services support Add Azure DevOps Services support to respond-to-pr-comments May 4, 2026
@abeltrano
Copy link
Copy Markdown
Collaborator Author

Superseded by #254, which contains all commits from this branch plus the human-voice-fidelity protocol on top. The merge-after dependency in #254's description is being removed; #254 now stands alone against main.

@abeltrano abeltrano closed this May 4, 2026
Alan-Jowett pushed a commit that referenced this pull request May 6, 2026
…fidelity protocol (#254)

* feat(respond-to-pr-comments): add Azure DevOps Services support

Extends the respond-to-pr-comments template, skill, and format to

handle Azure DevOps Services PRs alongside GitHub. Platform is

auto-detected from the PR URL (with git-remote fallback); the

workflow shape is shared and only API recipes branch per platform.

- Auto-detect platform from PR URL or git remote (handles SSH and

  legacy visualstudio.com hosts); prompt on ambiguity, do not guess.

- ADO auth uses 'az login' + 'az rest --resource <ADO GUID>' on

  every call; no Personal Access Token path.

- Preserve each platform's native status vocabulary in output (no

  cross-platform normalization). ADO uses 'fixed' (not 'resolved')

  per the CommentThreadStatus REST enum.

- ADO reply payload uses content + parentCommentId + commentType

  ('text'); always set parentCommentId, including for PR-wide threads.

- Filter ADO system threads (commentType 'system' or system

  CodeReviewThreadType properties); flag, do not auto-skip, threads

  with no text comments.

- Conservative outdated detection: prefer ADO iteration/items API,

  fall back to local working tree only when HEAD matches the

  iteration's source-branch tip; otherwise mark unverified.

- GitHub recipe paginates both reviewThreads and inner comments via

  follow-up cursored queries.

- ADO Server / on-prem / TFS / custom hostnames are out of scope —

  stop with a clear message.

- Update format file with per-platform status tables and add

  byDesign to the closed-state action summary.

- Update manifest description to mention ADO Services.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(respond-to-pr-comments): address PR #253 review feedback

- ADO reply POST switched to temp-file pattern (--body @reply.json)

  to handle apostrophes/newlines/backslashes in real reply text;

  mirrors the GitHub recipe.

- pr_reference param doc clarified: URL auto-detect with git-remote

  fallback and ambiguity prompt (covers #42 / !123 inputs).

- All shell command fences in SKILL labeled bash for clarity.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat(human-voice-fidelity): add opt-in voice-preservation guardrail protocol

Adds a new opt-in guardrail protocol that preserves the user's

communication style when an agent drafts externally visible text on

the user's behalf. Scoped narrowly to user-authored prose; analysis,

code, command output, and quoted reviewer text are exempt.

Protocol features:

- Pluggable voice sources (session samples, prior repo PRs, session

  history, org tools, explicit style notes), in priority order.

- Calibrated style extraction (sentence length, hedging, technical

  density, openers/closers, characteristic phrases, punctuation).

- Per-output self-check that bans em-dashes and a list of AI-tell

  phrases unless they appear in the user's own samples.

- Neutral collaborative default + explicit disclosure when no

  voice samples are available; never claims voice match without

  evidence.

- Output annotation requiring a Voice Calibration note.

Integration:

- protocols/guardrails/human-voice-fidelity.md (new, 163 lines)

- manifest.yaml: register protocol under guardrails.

- respond-to-pr-comments template: add protocol to frontmatter and

  manifest protocols list; reference the protocol when drafting

  reviewer replies.

Out of scope (deferred): delegation matrix, work-item proposal

phase, expanded format schema, and SKILL rewrite from the prior

exploration branch — those will land in separate PRs if pursued.

Validation: python tests/validate-manifest.py passes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat(human-voice-fidelity): apply to review-pull-request

Adds human-voice-fidelity to the review-pull-request template, the

second template that drafts text posted externally under the user's

identity. Action mode of review-pull-request POSTs inline review

comments and an overall review summary to GitHub via the Reviews

API; both bodies are user-voice prose where AI tells (em-dashes,

AI-tell phrases) would betray non-human authorship.

Changes:

- protocols/guardrails/human-voice-fidelity.md: add review-pull-request

  to applicable_to.

- manifest.yaml: add human-voice-fidelity to review-pull-request

  protocols list.

- templates/review-pull-request.md: add to frontmatter; reference the

  protocol in Phase 5 action-mode step where comment bodies are

  drafted, with the same scope note (drafted prose only; code/paths

  /quoted text exempt).

Validation: python tests/validate-manifest.py passes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Generalize Phase 1 voice-sample sourcing to multiple SCMs

Replace the GitHub-only gh recipe in Phase 1 item 2 with a per-platform list (GitHub, Azure DevOps Services, GitLab, Bitbucket Cloud, Gitea/Forgejo) plus a fallback bullet for unspecified SCMs. The underlying intent is unchanged: sample 5-20 recent self-authored comment bodies, preferring inline review-comment bodies over commit messages.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Generalize Phase 1 agent-history and style-notes sources to be LLM-agnostic

Item 3 was Copilot-CLI-specific; reframe as 'prior agent session history' with examples for GitHub Copilot CLI (session_store_sql), Claude Code (~/.claude/projects JSONL transcripts), and Cursor/Windsurf/IDE-embedded agents, plus a fallback for other agents.

Item 5 was copilot-instructions.md-only; expand the example list to also include CLAUDE.md, AGENTS.md, .cursorrules, and .windsurfrules.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Address PR #254 review feedback (10 threads)

Voice-fidelity protocol (4 threads):

- Em-dash rule now conditional on user's own samples (T1, T5)

- Bullet-list rule moved from hard rules to soft rules (T6)

- Add consent and confidentiality requirements before sampling

  agent transcripts or org-tool history (T9)

respond-to-pr-comments template/skill (6 threads):

- Soften ADO threads pagination claim and add defensive

  continuationToken handling (T2)

- URL-encode {project} and {repoName} in all ADO az rest example

  URIs via {projectEnc}/{repoNameEnc} placeholders (T3, T4, T10)

- Replace GitLab-style !123 PR id notation with bare 123 or

  ado:123 prefix (T7)

- Rename 'all pending' selector to 'all open' to avoid collision

  with ADO's distinct 'pending' status (T8)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Address PR #254 second-pass review feedback

ADO status enum casing (5 threads):

- Replace 'lowercase API enum values' wording in template, skill,

  PATCH instructions, and checklist with 'exact case-sensitive enum

  values' noting wontFix and byDesign are camelCase

Voice fidelity (2 threads):

- Tighten source 4 (org communication tools) to require explicit,

  per-session opt-in; default behavior is to skip

- Tighten Consent block: disclose what, approximate volume, and

  that consent does not carry between sessions

- Clarify Voice Calibration note placement: reported in agent

  chat output / action summary, NOT inserted into the produced

  format artifact (prevents format drift in pr-comment-responses

  and investigation-report)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Revert: remove unrelated cli/specs/audit-2026-03-30* files

These were accidentally included via git add -A in 7650489. They are

not part of the human-voice-fidelity protocol work.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Address PR #254 third-pass review feedback (5 threads)

- Soften voice-fidelity self-check paraphrases in template, manifest,
  and review-pull-request to reflect the protocol's conditional rules
  (avoid restating the rules to prevent future drift)
- Switch ADO/GitHub status tables in pr-comment-responses format to
  API enum literals for consistency with surrounding text
- Add human-voice-fidelity reference to SKILL.md draft-reply step

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(respond-to-pr-comments): warn against shell escape sequences in reply text

Serialization to JSON may preserve shell-specific character escape
sequences literally rather than the intended Unicode character. Add
guidance to use literal UTF-8 characters directly in reply text.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Address PR #254 fourth-pass review feedback (6 threads)

- Phase 1: make `ado:` prefix an explicit platform override that
  bypasses remote inspection; carry only the numeric `prId`
- Phase 2 GitHub: reference concrete GraphQL fields
  (`isResolved`/`isOutdated`) instead of a non-existent `state` field
- Phase 2 ADO: reuse Phase 1 coordinates instead of re-parsing the URL
- Format: reframe GitHub status table as derived workflow labels
  (`open`/`outdated`/`resolved`); cascade `pending`->`open` in skill
- Format: standardize per-thread placeholder examples to lowercase
  code literals matching the Thread Summary tables
- SKILL.md: mirror the `ado:` prefix handling

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@abeltrano abeltrano deleted the feat/respond-to-pr-comments-ado-support branch May 6, 2026 19:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants