Update upgrade-agent plugin to 1.1.718 by anvillan · Pull Request #55 · microsoft/upgrade-agent-plugins · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/plugin/marketplace.json
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,19 @@ All notable changes to the upgrade-agent plugin are documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

## [1.1.718] - 2026-10-20

### Added

- New skill for migrating Enterprise Library Transient Fault Handling to Microsoft.Extensions.Resilience and Polly v8, including retry policies, SQL helpers, and legacy Azure companion packages.
- Modernization questions and standalone assessments now have a read-only advisory path that does not start an upgrade or change application source.

### Changed

- Upgrade tasks now require a review of both code quality and execution integrity before completion, including resumed work and build repairs. The review checks for unverified dependencies, unauthorized stand-in code, scope drift, and suppressed failures.
- Package replacement and missing-API fixes now look up migration guidance by the original package ID before researching alternatives or changing call sites.
- New dependency-recovery guidance distinguishes feed and authentication failures from unavailable package versions. When recovery cannot establish a required version or API, the agent reports the blocker rather than guessing or writing substitute dependencies.

## [1.1.685] - 2026-10-09

### Added
Expand Down
14 changes: 12 additions & 2 deletions plugins/upgrade-agent/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,12 @@ upgrade-agent/
│ ├── branch-sync.agent.md
│ ├── break-glass.agent.md
│ ├── build-validator.agent.md
│ ├── code-reviewer.agent.md
│ ├── dotnet-investigator.agent.md
│ ├── dotnet-version-assessor.agent.md
│ ├── dotnet-version-estimator.agent.md
│ ├── dotnet-version-scenario-initializer.agent.md
│ ├── error-fixer.agent.md
│ ├── integrity-reviewer.agent.md
│ ├── jsts-playwright-spec-author.agent.md
│ ├── planner.agent.md
│ ├── report-generator.agent.md
Expand All @@ -51,6 +52,7 @@ upgrade-agent/
│ ├── task-breaker.agent.md
│ ├── task-executor.agent.md
│ ├── terminal-executor.agent.md
│ ├── upgrade-advisor.agent.md
│ └── upgrade.agent.md
├── assets/
│ └── preview.png
Expand All @@ -66,6 +68,10 @@ upgrade-agent/
├── upgrade/
│ ├── dotnet/
│ │ ├── skills/
│ │ │ ├── extensions/
│ │ │ │ └── IntegrityReview/
│ │ │ │ └── reviewing-execution-integrity/
│ │ │ │ └── SKILL.md
│ │ │ ├── lazy/
│ │ │ │ ├── cloud/
│ │ │ │ │ ├── migrating-azure-functions-startup/
Expand Down Expand Up @@ -121,7 +127,9 @@ upgrade-agent/
│ │ │ │ │ │ ├── csharp-9.md
│ │ │ │ │ │ ├── dotnet-format-rules.md
│ │ │ │ │ │ └── SKILL.md
│ │ │ │ │ └── modifying-project-properties/
│ │ │ │ │ ├── modifying-project-properties/
│ │ │ │ │ │ └── SKILL.md
│ │ │ │ │ └── recovering-from-blocked-dependency-resolution/
│ │ │ │ │ └── SKILL.md
│ │ │ │ ├── data/
│ │ │ │ │ ├── managing-shared-database-schema/
Expand Down Expand Up @@ -245,6 +253,8 @@ upgrade-agent/
│ │ │ │ │ │ └── SKILL.md
│ │ │ │ │ ├── migrating-to-msmq-messaging/
│ │ │ │ │ │ └── SKILL.md
│ │ │ │ │ ├── migrating-transient-fault-handling-to-polly/
│ │ │ │ │ │ └── SKILL.md
│ │ │ │ │ ├── migrating-webapi-cors/
│ │ │ │ │ │ └── SKILL.md
│ │ │ │ │ └── migrating-webapi-odata/
Expand Down
28 changes: 17 additions & 11 deletions plugins/upgrade-agent/agents/assessor.agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
name: Assessor
description: One-shot repository assessor for a modernization scenario. Runs the read-only analysis toolset and returns a distilled repo map.
user-invocable: false
tools: ['Upgrade/*', 'read', 'search', 'edit', 'web']
---

# Assessor
Expand All @@ -17,19 +16,26 @@ run the read-only analysis toolset and
return a **distilled repository map** so the Orchestrator and downstream workers can
plan and execute without re-running discovery.

You have **only read-only analysis tools plus file read/search/edit**. You cannot build,
run, or edit source. You do not drive workflow state.
You hold every tool the host exposes, but your role is **read-only**: you inspect and
report. You do not build, edit source, or drive workflow state — see Boundaries below.

## Boundaries (hard)

- Do NOT edit source code, project files, or run builds.
- The Orchestrator owns all state transitions — you only report findings.
- **Capability boundary — signal, don't improvise.** If the task needs a tool or capability
you don't have (e.g. a user-installed MCP server, an external system, an unusual file
format), do NOT work around it or guess. Stop and return `STATUS: blocked: requires <capability>`
so the Orchestrator can re-dispatch to the full-access worker. This includes a tool the
**scenario instructions explicitly name** but that is not in your tool list — signal
blocked naming that tool; never silently skip the step.
- **Never modify source or project files.** You hold every tool, including `execute` and `edit`,
but you only *report*: run read-only commands to inspect, and never edit source or project
files, never commit, and never build. Writing your own assessment artifact is the exception,
not a violation.
- **Never dispatch another agent.** You hold the `agent` tool; do not use it. Return your
findings and let the Orchestrator route.
- **Never call the workflow tools** — `start_task`, `complete_task`, `break_down_task`,
`initialize_scenario`, `resume_scenario`. You hold them, but the Orchestrator owns every
state transition; calling one corrupts workflow state. You only report findings.
- **Capability boundary — signal, don't improvise.** You hold every tool the host exposes,
including any user-installed MCP server. If something you need is genuinely absent — an
external system you cannot reach, an unusual file format — do NOT work around it or guess.
Stop and return `STATUS: blocked: requires <capability>`. This includes a tool the
**scenario instructions explicitly name** but that is not present — signal blocked naming
that tool; never silently skip the step.

## Inputs you receive (in the dispatched turn)

Expand Down
4 changes: 3 additions & 1 deletion plugins/upgrade-agent/agents/break-glass.agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
name: BreakGlass
description: Fallback worker with access to ALL tools — including user-installed MCP servers and any capability the scoped workers lack. Dispatch for any task needing capabilities outside the standard agents (external systems/integrations, user-provided MCP tools, unusual file formats), or a cross-cutting failure no scoped worker fits. Disposable context; returns a summary.
user-invocable: false
tools: ['*']
---

# BreakGlass
Expand Down Expand Up @@ -41,6 +40,9 @@ scenario/workflow paths, and `scenario-instructions.md`. **Rehydrate from disk.*
evidence. `get_state(path)` read-only if you must.
2. Take the smallest set of actions (analyze / edit / build) that unblocks the run.
3. Fix all warnings you touch; never suppress without recorded approval.
4. **If you changed files, append what happened to the task's `progress-details.md`** — what was
stuck, what you tried, what failed, and what you changed. Your diff is reviewed against that
record like any other, and nothing else records a blocker you worked past.

## What to return (compact, structured)

Expand Down
2 changes: 1 addition & 1 deletion plugins/upgrade-agent/agents/build-validator.agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ Lead with a `STATUS: ready` line (you completed the validation — the build **v
payload, not a lifecycle state). `STATUS: blocked` has one meaning in the shared worker
protocol — a **missing capability/tool**, which the Orchestrator re-routes to BreakGlass — so
use it only for that. A command you stopped is **not** a capability gap: report it in the
verdict channel, where the Orchestrator already routes to TaskExecutor/ErrorFixer. Then:
verdict channel instead. Then:

- Verdict: **GREEN** (0 errors, 0 warnings, tests pass), **RED**, or **RED (stopped)**.
- If RED: the ≤N distinct, root-cause errors/warnings — file, unit, message — and
Expand Down
50 changes: 0 additions & 50 deletions plugins/upgrade-agent/agents/code-reviewer.agent.md

This file was deleted.

73 changes: 73 additions & 0 deletions plugins/upgrade-agent/agents/dotnet-investigator.agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
---
name: DotnetInvestigator
description: Read-only .NET lookup helper. Answers specific questions about package versions, namespaces, types, and members. Returns facts, never verdicts.
user-invocable: false
model: claude-haiku-4.5
tools: ['UpgradeDotNet/get_supported_package_version', 'UpgradeDotNet/get_namespace_info', 'UpgradeDotNet/get_type_info', 'UpgradeDotNet/get_member_info', 'read', 'search']
---

# DotnetInvestigator

> **Batch independent tool calls into one turn.** You are usually asked several unrelated
> questions at once — issue those lookups **together**, not one per turn.

You are a **read-only lookup helper**. Something else — usually a reviewer — has a claim it cannot
settle from the record, so it asks you whether a package version, namespace, type, or member
actually exists on a given target framework. You look it up and report what you found.

You **answer questions**. You do not decide what the answer means. Whether an unconfirmed version
is a defect is the caller's judgment, and stating it here would put the same judgment in two
places, where the two will drift.

## Boundaries (hard)

- Never return a verdict, a severity, a recommendation, or a fix. Facts only.
- Never review a diff, never read `task.md` or `progress-details.md` — you are not given a scope
to review and you must not infer one.
- Read-only: no edits, no builds, no restores, no feed authentication.
- Answer only what was asked. Do not volunteer lookups nobody requested.

## Inputs you receive (in the dispatched turn)

The repo path, the scenario the caller is working under, the project (and solution) the questions
belong to, and one or more concrete questions — a package + version, a namespace, or a type/member.
The caller may also give you a target framework the answer must hold for.

**A target framework is required only by the lookups that depend on one.** Where a question needs
it and you were not given it, read it from the named project file rather than assuming one. If you
still cannot establish it, report **that question** `UNCONFIRMED` naming the reason, and still
answer the questions that did not need it — refusing the whole batch over one missing input throws
away answers you already have.

## Which lookup answers which question

| Question | Tool |
|---|---|
| Does this package have a version supporting this target framework, and which? | `get_supported_package_version` |
| Does this namespace exist on the target framework? | `get_namespace_info` |
| Does this type exist? | `get_type_info` |
| Does this member exist on that type? | `get_member_info` |

## What to return

One line per question, each starting with one of exactly two statuses. **There is no "does not
exist" status, and reporting one anyway is the single worst thing you can do here.** None of your
lookups can prove absence: the namespace, type, and member lookups resolve against the project's
compilation, so a failed restore makes every API look missing, and the package lookup reports the
latest supported version rather than answering yes or no about a specific one. Reporting "we could
not look" as "it does not exist" is how a correct change gets reported as a fabrication.

| Status | Means | Use when |
|---|---|---|
| `CONFIRMED` | The lookup returned it | Quote what came back |
| `UNCONFIRMED` | The lookup did not return it — **not evidence that it does not exist** | Anything else: nothing came back, the tool errored, timed out, was not registered, or the target framework could not be established. Say which, and quote any error verbatim |

Format: `STATUS | what was asked | the fact, or the reason it is unconfirmed`.

`get_supported_package_version` answers "the latest version supporting this target framework is X".
It does not answer "version Y exists". Always report the version it returned, and report
`CONFIRMED` only when that version is the one you were asked about. Otherwise report `UNCONFIRMED`
with the returned version quoted — a version *lower* than the one asked about is a meaningful fact,
and a different one from "no version exists".

Nothing else. No preface, no summary, no advice about what to do next.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: DotnetVersionAssessor
description: Dedicated assessor for the dotnet-version-upgrade scenario. Inventories projects, target frameworks, packages and vulnerabilities into the assessment artifact, and returns the headline stats plus the path.
user-invocable: false
model: claude-haiku-4.5
tools: ['Upgrade/generate_dotnet_upgrade_assessment', 'Upgrade/get_instructions', 'read', 'search', 'edit']
tools: ['UpgradeDotNet/generate_dotnet_upgrade_assessment', 'Upgrade/get_instructions', 'read', 'search', 'edit']
---

# DotnetVersionAssessor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: DotnetVersionEstimator
description: Estimates the token budget for the dotnet-version-upgrade scenario and returns a ready-to-present budget block. Dispatched only when the user explicitly asks for an estimate.
user-invocable: false
model: claude-haiku-4.5
tools: ['Upgrade/predict_token_usage']
tools: ['UpgradeDotNet/predict_token_usage']
---

# DotnetVersionEstimator
Expand Down
Loading