Repository navigation
refactor: migrate agent prompts to skills and relocate MCP config - #13331
DariuszPorowski wants to merge 5 commits into
Conversation
Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com>
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Scanned FilesNone |
There was a problem hiding this comment.
🟡 Changes recommended
Missing workflow instructions, broken relocated links, and an incompatible gopls transport prevent the migrated entry points from working as intended.
2 open issues
What changed in this PR
Migrates Radius and Spec Kit entry points from prompts to manually invoked skills and relocates MCP configuration. Radius application code is unchanged.
Changes:
- Introduces 17 hyphenated skill packages with automatic invocation disabled.
- Removes the corresponding prompt wrappers and prompt-specific metadata.
- Moves GitHub/gopls MCP definitions to root-level
.mcp.json.
| File | Description |
|---|---|
.vscode/mcp.json |
Removes VS Code MCP configuration. |
.mcp.json |
Adds root-level MCP server definitions. |
.github/skills/speckit-taskstoissues/SKILL.md |
Adds tasks-to-issues skill metadata. |
.github/skills/speckit-tasks/SKILL.md |
Adds task-generation skill metadata. |
.github/skills/speckit-specify/SKILL.md |
Adds specification skill metadata. |
.github/skills/speckit-plan/SKILL.md |
Adds planning skill metadata. |
.github/skills/speckit-implement/SKILL.md |
Adds implementation skill metadata. |
.github/skills/speckit-git-validate/SKILL.md |
Adds branch-validation skill metadata. |
.github/skills/speckit-git-remote/SKILL.md |
Adds remote-detection skill metadata. |
.github/skills/speckit-git-initialize/SKILL.md |
Adds repository-initialization skill metadata. |
.github/skills/speckit-git-feature/SKILL.md |
Adds feature-branch skill metadata. |
.github/skills/speckit-git-commit/SKILL.md |
Adds commit skill metadata. |
.github/skills/speckit-constitution/SKILL.md |
Adds constitution skill metadata. |
.github/skills/speckit-clarify/SKILL.md |
Adds clarification skill metadata. |
.github/skills/speckit-checklist/SKILL.md |
Adds checklist skill metadata. |
.github/skills/speckit-analyze/SKILL.md |
Adds analysis skill metadata. |
.github/skills/radius-speckit-prompt/SKILL.md |
Replaces agent selection with skill metadata. |
.github/skills/radius-create-pr/SKILL.md |
Migrates PR workflow and removes tool declarations. |
.github/skills/radius-add-ai-capability/SKILL.md |
Migrates capability workflow to a skill. |
.github/prompts/speckit.taskstoissues.prompt.md |
Removes tasks-to-issues prompt. |
.github/prompts/speckit.tasks.prompt.md |
Removes task-generation prompt. |
.github/prompts/speckit.specify.prompt.md |
Removes specification prompt. |
.github/prompts/speckit.plan.prompt.md |
Removes planning prompt. |
.github/prompts/speckit.implement.prompt.md |
Removes implementation prompt. |
.github/prompts/speckit.git.validate.prompt.md |
Removes branch-validation prompt. |
.github/prompts/speckit.git.remote.prompt.md |
Removes remote-detection prompt. |
.github/prompts/speckit.git.initialize.prompt.md |
Removes repository-initialization prompt. |
.github/prompts/speckit.git.feature.prompt.md |
Removes feature-branch prompt. |
.github/prompts/speckit.git.commit.prompt.md |
Removes commit prompt. |
.github/prompts/speckit.constitution.prompt.md |
Removes constitution prompt. |
.github/prompts/speckit.clarify.prompt.md |
Removes clarification prompt. |
.github/prompts/speckit.checklist.prompt.md |
Removes checklist prompt. |
.github/prompts/speckit.analyze.prompt.md |
Removes analysis prompt. |
Review effort: Balanced
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #13331 +/- ##
==========================================
- Coverage 61.13% 61.12% -0.01%
==========================================
Files 749 749
Lines 44463 44463
==========================================
- Hits 27181 27178 -3
- Misses 17282 17285 +3 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com>
…t#13332) ## Summary <!-- Provide a concise description of what this PR does. --> Updates the PR lifecycle-label reconciler, `.github/scripts/pr-status-labels.mjs`, so that handoff labels follow two policy rules: - **Copilot review threads keep the PR with the author.** Any unresolved review thread that contains a submitted comment from the Copilot pull request reviewer forces `pr:waiting-for-author` until it is resolved. The reviewer is GraphQL Bot `copilot-pull-request-reviewer` (REST `copilot-pull-request-reviewer[bot]`); both identities were confirmed from live API data. This applies regardless of approvals, author pushes or comments, and re-requests, and it blocks the approved and ready-for-queue labels. Resolving the threads clears it. The blocking bots are listed in a generic frozen `BLOCKING_BOT_REVIEWERS` array, which currently contains only the Copilot reviewer; more bots can be added later by appending their lowercase GraphQL Bot logins. Bots not in the list are still ignored, except where an approval summary endorses them (existing behavior). - **Author responses hand human feedback back to reviewers.** Human feedback covers unresolved human inline threads, outstanding `CHANGES_REQUESTED` reviews, and approval-endorsed bot feedback. The PR returns to `pr:waiting-for-review` without a re-request when the author responds after the latest outstanding feedback in either way: - **Push:** the current head differs from the commit that the most recently submitted outstanding feedback was made on. Subsequent reviews from a reviewer with outstanding feedback count as feedback. This uses the review-thread comment's `pullRequestReview.commit` and the REST review `commit_id`. Older reviews, such as a superseded approval, and older threads are ignored, so force-pushing back to an earlier commit after the latest feedback also counts. - **Comment:** the author's latest PR conversation comment (timeline `created_at`) or own submitted review, which includes review-thread replies, is newer than the latest outstanding feedback. Feedback time includes edits and subsequent submitted reviews. If any reviewer's feedback is newer than the author's latest response, the PR stays `pr:waiting-for-author`. The per-reviewer re-request handoff from radius-project#13255 still works as an alternative. - **GitHub's changes-requested decision:** an aggregate `CHANGES_REQUESTED` review decision no longer keeps the PR waiting for the author once the author has responded to the identified change requests. It still blocks the approved and ready-for-queue labels. If GitHub reports changes requested but no human change request can be identified, the PR stays waiting for the author, as before. The following are unchanged: - Manual holds (`pr:needs-author-response`, `pr:do-not-merge`), draft precedence, and closed precedence. - The label names in `.github/configs/pr-status-labels.json`. - The ruleset approval fallback and last-push guard. - The queue and required-check gates, including `BEHIND` handling. - The fork-safe trusted execution model and review-signal binding. - Fail-closed pagination and repository-wide concurrency. - All workflows. **Known trade-offs** - **Any new head counts as a push response.** GitHub returns `pushedDate: null` for ordinary pushes and records no pusher for them, so push evidence relies on commit identity, not on spoofable git dates. As a result: - A push by anyone, such as a maintainer pushing to the branch, hands the PR back. - A reviewer who submits against a stale page after a push can be misread as already answered. - A reviewer's comment edit made after a push does not return the turn to the author. - If GitHub does not report the latest feedback commit, only comments count. - Resetting the branch to exactly the commit the latest feedback was made on does not count as a push. - **Held runs and PR comments wait for the schedule.** PR conversation comments do not trigger the workflow. The repository's Actions approval policy can hold `PR Review Signal` runs for Copilot review activity (actor `Copilot`, even on same-repository PRs) and for review activity on fork PRs. A held run ends `action_required` and never triggers the `workflow_run` writer. These changes are picked up by the nominal 15-minute scheduled reconciliation or a manual dispatch. Pushes still reconcile immediately through `pull_request_target` `synchronize`. Workflow triggers and approval settings are intentionally unchanged; the latency is documented instead. - **More timeline fetches.** The timeline is now fetched whenever human feedback exists, not only when reviews are pending. It is skipped while Copilot threads are unresolved. In the all-open-PR dry run, the baseline and updated reconcilers each made 88 API calls. ## Reason for change <!--Explain why this change is needed. If it addresses a GitHub issue, link it below so it is automatically closed when this PR merges (optional).--> - **Copilot feedback did not change the label.** Copilot reviewer threads were ignored, so a PR with open Copilot feedback stayed `pr:waiting-for-review`. - **Author responses did not hand the PR back.** A PR stayed `pr:waiting-for-author` after the author addressed human feedback unless every reviewer was explicitly re-requested. For example, on radius-project#13327 a maintainer requested changes on `deefd00a1`; the author then pushed `27c69ed3b` and commented, yet the label stayed `pr:waiting-for-author`. The agreed policy: Copilot threads keep the PR waiting for the author until they are resolved; for human feedback, a push or comment hands the PR back to review. No linked issue. ## How to test <!-- Give reproducible validation steps a reviewer can follow, including prerequisites, commands or actions, and expected results. Do not substitute a list of checks you already ran. --> **Prerequisites:** Node.js from `.node-version` (24) and `pnpm install` at the repository root. **Static checks.** Run these from the repository root; each should exit 0 with no findings: 1. `node --check .github/scripts/pr-status-labels.mjs` 2. `node .github/scripts/pr-status-labels.mjs`. This loads and validates the label mapping without calling GitHub. 3. `pnpm exec prettier --config .github/linters/.prettierrc.yml --check .github/scripts/pr-status-labels.mjs` 4. `pnpm exec markdown-table-formatter --check docs/contributing/contributing-pull-requests/README.md` 5. `pnpm exec markdownlint-cli2 --config .github/linters/.markdownlint-cli2.yaml docs/contributing/contributing-pull-requests/README.md` 6. `cspell lint --config .github/linters/.cspell.yml --no-progress docs/contributing/contributing-pull-requests/README.md` **Behavior after merge.** The workflow runs trusted script code from `main`. Use `PR Status Labels` → `workflow_dispatch` with `pr_number`: 1. radius-project#13327, if it is still in its current state: expect `pr:waiting-for-review`. The author pushed after the change request. 2. A PR with an unresolved Copilot reviewer thread, such as radius-project#13331 or radius-project#13233 if still unresolved: expect `pr:waiting-for-author`. Resolve every Copilot thread and rerun; the label is recomputed from the remaining review state. 3. On a test PR, request changes as a human reviewer: expect `pr:waiting-for-author`. - Push a new commit as the author. Expect `pr:waiting-for-review` on the `synchronize` run. - Alternatively, add a PR comment as the author. Expect `pr:waiting-for-review` after the next scheduled or manual run. - Then leave a new reviewer comment on the current head. Expect `pr:waiting-for-author` again. 4. Approve a PR that still has an unresolved Copilot thread: expect `pr:waiting-for-author`, with no `pr:review-approved` or `pr:ready-for-queue`. 5. On a test PR, approve commit A, push commit B, and request changes on B. Then force-push the branch back to A: expect `pr:waiting-for-review`. **Validation performed for this PR (all passed)** - `node --check .github\scripts\pr-status-labels.mjs`: exit 0 - `node .github\scripts\pr-status-labels.mjs`: exit 0 - `pnpm exec prettier --config .github\linters\.prettierrc.yml --check .github\scripts\pr-status-labels.mjs`: "All matched files use Prettier code style!" - `pnpm exec markdown-table-formatter --check docs\contributing\contributing-pull-requests\README.md`: exit 0 - `pnpm exec markdownlint-cli2 --config .github\linters\.markdownlint-cli2.yaml docs\contributing\contributing-pull-requests\README.md`: "0 issues in 0 files" - `pnpm dlx cspell@9 lint --config .github\linters\.cspell.yml --no-progress docs\contributing\contributing-pull-requests\README.md`: "Issues found: 0 in 0 files" - `git diff --check`: exit 0 - **Synthetic scenarios.** An external scratch script, not checked in and since deleted, ran 31 scenarios; 31/31 passed. They covered: - Holds, draft, and closed PRs. - Re-request handoff. - Author comments, replies, and pushes. - Newer reviewer feedback and reviewer edits. - An unrelated commenter. - A bot-authored PR, including a REST `[bot]` login. - A User account impersonating the Copilot login. - An unknown feedback commit. - Approval-endorsed bot feedback. - Approval combined with an unresolved Copilot thread. - Copilot threads after resolution. - **Live read-only dry run.** The baseline (`main` at `97e14dc0c`) and updated reconcilers ran through a fetch shim that allowed only `GET` requests and GraphQL queries. Label writes and mutations were stubbed, and live labels were verified unchanged afterwards. Results across all 41 open PRs; only these changed: | PR | Baseline | Updated | Evidence | | -- | -------- | ------- | -------- | | radius-project#13327 | `pr:waiting-for-author` | `pr:waiting-for-review` | Author pushed `27c69ed3b` after `CHANGES_REQUESTED` on `deefd00a1` | | radius-project#13331 | `pr:waiting-for-review` | `pr:waiting-for-author` | 2 unresolved Copilot threads | | radius-project#13233 | `pr:waiting-for-review` | `pr:waiting-for-author` | 7 unresolved Copilot threads (fork PR) | | radius-project#13270 | `pr:waiting-for-author` | `pr:waiting-for-review` | Author pushed and replied after the change request | | radius-project#13246 | `pr:waiting-for-author` | `pr:waiting-for-review` | Author replied and pushed after the inline threads | The other 36 open PRs, including radius-project#13329 (Copilot threads resolved, stays `pr:waiting-for-review`), were unchanged, and none failed. - **`BLOCKING_BOT_REVIEWERS` follow-up (`7a2d14f8a`).** - Every static check above was rerun and passed. - A read-only live dry run gave the same labels as before: radius-project#13327 `pr:waiting-for-review`, radius-project#13331 and radius-project#13233 `pr:waiting-for-author`, radius-project#13329 `pr:waiting-for-review`. - A scratch copy with a second login appended to the list was checked. An unresolved thread from that bot forced `pr:waiting-for-author`, matching the login without regard to case. An unlisted bot was still ignored. 4/4 passed. - **Branch-reset follow-up (`f6028339c`).** This addresses review feedback about superseded reviews blocking the handoff after a reset. - Before the fix, four new scratch regressions reproduced the bug: each case stayed `pr:waiting-for-author`. The cases were: - an approval on A, changes requested on B, then a reset to A; - a commented review on A, a thread on B, then a reset to A; - outstanding threads on A then B, then a reset to A; - an older unknown commit blocking a newer push. - After the fix, all 36 scenarios pass: the original 31, the four resets, and "latest feedback on head stays with author". - Every static check above was rerun and passed. - The read-only live comparison of `7a2d14f8a` against `f6028339c` was identical on all 42 open PRs. ## File change summary <!-- Summarize the change made in each file that was modified. --> | File | Summary of change | | ---- | ----------------- | | `.github/scripts/pr-status-labels.mjs` | Adds the `BLOCKING_BOT_REVIEWERS` list (Copilot reviewer only), detects unresolved threads from those bots, and forces `waitingForAuthor` after the manual hold. Records the commit of the most recently submitted outstanding feedback, and adds `isPullAuthor` and `hasAuthorResponse`, which hand human feedback back on a different head or a later author comment or review. Keeps the re-request handoff as an alternative and skips approval inference and the checks probe while blocking bot threads are open. | | `docs/contributing/contributing-pull-requests/README.md` | Updates the handoff label definitions. Documents the blocking-bot thread rule and how to extend `BLOCKING_BOT_REVIEWERS`, the author-response handoff based on the latest feedback commit with re-request as an alternative, and the endorsement and change-request interactions. Revises the "Hand review back" guidance and the troubleshooting note on held review signals and PR-comment latency. | --------- Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
@copilot with this PR remove anything related to speckit, like skills, scripts, etc |
Complete removal includes Spec Kit agent files, which this environment cannot modify. Should I remove the accessible skills, scripts, configuration, and documentation references, leaving the agent files for manual removal? No files have been changed yet. |
Co-authored-by: DariuszPorowski <3431813+DariuszPorowski@users.noreply.github.com>
|
@copilot do not change anything in changelogs/release notes - it must be as it is |
Co-authored-by: DariuszPorowski <3431813+DariuszPorowski@users.noreply.github.com>
Radius functional test overviewClick here to see the test run details
Test Status⌛ Building Radius and pushing container images for functional tests... |

Summary
disable-model-invocation: true.mcpServers, alocalgopls server, and explicit wildcard tool lists.Reason for change
Reorganize the existing agent workflow entry points as explicitly invoked skills and relocate MCP configuration outside the VS Code-specific directory. This changes agent configuration and invocation surfaces, not Radius application code.
No linked issue.
How to test
With Node.js, the repository-pinned pnpm, and its existing development dependencies installed, run these read-only checks from the repository root in PowerShell:
Expected: no Markdown, table-formatting, whitespace, or JSON syntax errors.
Reload the checkout in an agent host supporting repository skills. Verify that the new Radius and Spec Kit skill names are discoverable, that their frontmatter disables automatic model invocation, and that the removed dotted-name prompt wrappers are no longer listed as repository prompts. Inspect the retained Radius workflow instructions and their referenced resources.
In a client supporting root-level MCP configuration, with GitHub authentication and
goplsavailable on PATH, reload the configuration and verify that thegithubandgoplsservers can start and expose tools.Validation performed against commit
5fdade7445dd360a6fe5cc45fa17ab28e9b8a552:git diff --check refs/remotes/origin/main...5fdade7445dd360a6fe5cc45fa17ab28e9b8a552 --Get-Content -Raw -LiteralPath '.\.mcp.json' | ConvertFrom-Json | Out-Nullpnpm exec markdownlint-cli2 @files --config '.\.github\linters\.markdownlint-cli2.yaml'pnpm exec markdown-table-formatter @files --checkFor the executed Markdown commands,
$filescontained the 17 added or moved Markdown files fromrefs/remotes/origin/main...5fdade7445dd360a6fe5cc45fa17ab28e9b8a552, with paths converted to Windows separators. Agent-host discovery, workflow execution, and MCP startup were not tested. Go/Helm tests were not run because this change does not modify application code or charts.File change summary
In the table below, old prompt paths are under
.github/prompts/; new skill paths are under.github/skills/.radius.add-ai-capability.prompt.md→ radius-add-ai-capability/SKILL.mdradius.create-pr.prompt.md→ radius-create-pr/SKILL.mdradius.speckit.prompt.prompt.md→ radius-speckit-prompt/SKILL.mdspeckit.analyze.prompt.md→ speckit-analyze/SKILL.mdspeckit.checklist.prompt.md→ speckit-checklist/SKILL.mdspeckit.clarify.prompt.md→ speckit-clarify/SKILL.mdspeckit.constitution.prompt.md→ speckit-constitution/SKILL.mdspeckit.git.commit.prompt.md→ speckit-git-commit/SKILL.mdspeckit.git.feature.prompt.md→ speckit-git-feature/SKILL.mdspeckit.git.initialize.prompt.md→ speckit-git-initialize/SKILL.mdspeckit.git.remote.prompt.md→ speckit-git-remote/SKILL.mdspeckit.git.validate.prompt.md→ speckit-git-validate/SKILL.mdspeckit.implement.prompt.md→ speckit-implement/SKILL.mdspeckit.plan.prompt.md→ speckit-plan/SKILL.mdspeckit.specify.prompt.md→ speckit-specify/SKILL.mdspeckit.tasks.prompt.md→ speckit-tasks/SKILL.mdspeckit.taskstoissues.prompt.md→ speckit-taskstoissues/SKILL.md.vscode/mcp.json→ .mcp.json