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
{{ message }}
Repository navigation
Commit 1f139e5
Browse filesBrowse the repository at this point in the historyBrowse files
Turn the implement-ticket agent into a spec, implement, check and review pipeline (#5575)
* Make the implement-ticket agent prove its change and build faster
The first agent run only screenshotted that a new control existed, never
used it, captured a page still loading, lost a turn to a blocked
Stop-Process pipeline, and spent most of its time waiting on builds and
formatters.
- Add Stop-UniGetUIDev.ps1, which stops UniGetUI by process id, since
Copilot CLI refuses `Get-Process | Stop-Process`.
- Add Wait-UniGetUIIdle.ps1, which waits until the page has finished
loading packages (LoadingProgressBar is out of the UI Automation tree)
and the window has stopped changing, and can save a screenshot then.
- Keep the shared compiler server for the agent's dev builds and skip
restore while project files are unchanged; locally, a rebuild after an
edit drops from 33-39s to 15s.
- Have the prompt ask for acceptance criteria and assumptions up front,
a screenshot of each criterion being exercised through the UI, one
formatter pass at the end, and fix its claim that no packages are
installed on the runner.
- Warn from the export step when code changed without any after-*.png.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Install AwakeCoding.PSRemoting with ModuleFast in the desktop session
IronRDP's harness installs the module with Install-Module when it is
missing. Installing it first with ModuleFast, pinned to v0.6.1 and to
AwakeCoding.PSRemoting 2026.10.21, into the same CurrentUser folder lets
the harness skip that install; locally ModuleFast takes about 5s where
Save-Module takes 12s.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Install Devolutions Agent with its RDP extension in the desktop session
The agent's RDP extension (MSI feature F.Session, Session.Enabled in
agent.json) starts DevolutionsSession in each RDP session, which serves
the NOW protocol over a virtual channel for remote execution.
- Install the Devolutions.Agent winget package, 2026.3.1.0 by default,
with ADDLOCAL=F.Agent,F.Session, before the desktop session connects:
the agent only starts DevolutionsSession on RDP connect and logon.
winget is not on the runner image, so the MSI comes from the package's
winget manifest and is checked against the manifest's SHA256.
- Check that DevolutionsSession runs in the desktop session, and copy the
agent's config and logs into the session artifacts.
- An empty devolutions-agent-version input skips both steps.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Negotiate the NOW channel as soon as the desktop session connects
The first run with Devolutions Agent showed DevolutionsSession starting
in the RDP session and exiting 5 seconds later. It opens the
Devolutions::Now::Agent channel and gives up unless NOW negotiation
starts within 5 seconds, while ironrdp-agent only negotiates on its first
NOW request, so nothing negotiated and the agent never restarted it.
- Start-DesktopSession.ps1 -NowChannel runs `ironrdp-agent now
capabilities` right after connecting; it waits for the channel and
negotiates in time, and the daemon keeps the channel alive afterwards.
- The check step now runs a PowerShell command over NOW and checks that
it ran in the desktop session, and also collects DevolutionsSession's
logs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Make the NOW channel handshake opt-in until ironrdp-agent can send on it
The second run negotiated in time, but the RDP session dropped on the
first NOW message: ironrdp-dvc-pipe-proxy encodes its messages for the
channel yet hands them to the client as channel 0, and the client's
DvcMessageBatch::try_new rejects the mismatch and ends the session.
Devolutions Agent is still installed; the handshake and the remote
execution check only run with the new now-channel input set to true.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Give the implement-ticket agent Avalonia's Build MCP
The agent now gets the avalonia-docs MCP server
(https://docs-mcp.avaloniaui.net/mcp) through --additional-mcp-config,
and the prompt has it load get_avalonia_expert_rules before writing UI
code and look up Avalonia 12 APIs in the docs rather than from memory.
It is a public, read-only documentation service and gets no credential.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Restore again after a Release restore, and keep the agent off dotnet publish
In run 39806855126 the agent ran a NativeAOT publish twice (about 6
minutes). Its Release restore rewrote project.assets.json without the
Debug-only diagnostics package, and Start-UniGetUIDev.ps1 then skipped
restore because no project file had changed, so the next Debug build
failed.
- The restore stamp also records each project's project.assets.json
timestamp, so any other restore forces a fresh one.
- The prompt tells the agent not to run dotnet publish; the PR's CI
checks the NativeAOT build.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Drop the Rust build cache from the desktop-session action
Swatinem/rust-cache saved about 400 MB per branch (77s at job end), and
with the repository's Actions cache at its 10 GB limit that evicted the
cached ironrdp-agent and NuGet packages, so run 39862220431 rebuilt
ironrdp-agent and restored NuGet from scratch. The built agent is
already cached by IronRDP commit, so the Rust cache only shortened the
rare full rebuild (about 9 minutes without it).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Add spec approval, checks, review, evidence, triggers and eval to the agent workflow
Turns the implement-ticket workflow into a pipeline around the agent:
- Spec stage: mode spec (or the agent:spec label, or "/agent spec" on an
issue) has an agent write a spec with acceptance criteria and a UI
sketch, posted on the issue; "/agent implement" (or spec_run_id)
implements the approved spec.
- Checks after the agent (Test-AgentChange.ps1): paths, build, the
tests of projects that reference the change, formatting of the
changed files, and new translation keys, reported in the PR.
- Review by a second agent on a different model (REVIEW_PROMPT.md),
with its verdict and findings in the PR.
- Screenshot evidence (New-ScreenshotEvidence.ps1): taskbar cropped,
each before/after step pair outlined in red, nearly identical pairs
flagged.
- Triggers: agent:spec / agent:implement labels, "/agent ..." comments
on issues, "/agent <feedback>" on agent PRs to iterate on them, all
limited to users with write access (Resolve-AgentRequest.ps1);
results are posted back on the issue.
- Invoke-CopilotAgent.ps1 runs every agent with JSON output and records
the model, Copilot usage and what the agent ran; the report adds the
phase timings. agent-eval.yml replays merged PRs and scores them.
- NuGet packages are restored from main's cache without saving one per
agent branch; Invoke-DesktopNowCommand runs commands over NOW once
the desktop session's now-channel input is on.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* TEMPORARY: run the agent eval on pushes to this branch (case 5561)
A new workflow can only be dispatched once it is on the default branch.
To be removed before merging.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Start the agent when called from the eval, whatever the caller's event
A called workflow sees its caller's event, so a push-triggered eval
skipped every job. A run with an artifact prefix is a workflow call.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Enable the NOW channel in the agent workflow with the IronRDP pipe proxy fix
The desktop-session action now applies ironrdp-patches/*.patch on top of
ironrdp-ref before building ironrdp-agent, and keys the agent's cache on
them. 0001 is IronRDP 2cc70912, not merged upstream yet: the DVC pipe
proxy reported channel 0 for the NOW messages it sent, and the client
dropped the RDP session. With it, the agent workflow turns now-channel
on, so DevolutionsSession's NOW channel is negotiated and checked, and
the agent can use Invoke-DesktopNowCommand.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Keep the IronRDP patches' line endings on Windows checkouts
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Name the PR description path in the agent's prompt, and keep the report
In eval run 39893339409 the agent wrote its description next to the
ticket instead of to $env:AGENT_PR_BODY, so the report and the review
had none. The prompt now names that file and the screenshots folder.
The report is also uploaded and printed, and the review tries Sonnet
before Opus (34 AI credits for one review against 4.6 for the change).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Remove the temporary push trigger of the agent eval
Eval run 39893339409 (case 5561) passed through it; from the default
branch the eval is started by hand.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Run the TUI tests in the agent checks only when the TUI changed
In run 39899544626 UniGetUI.Tui.Tests crashed in its test host after 104
of 225 tests (Avalonia CreateWindow), where run 39893563369 had passed
them. They take about five minutes; the pull request's CI runs them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix review findings and failed checks once, on the same desktop
The review moves into the desktop job, after the checks and the
screenshot evidence, so its findings can be fixed where the app runs:
- REVIEW_PROMPT.md asks for structured findings (id, severity, file,
line, details, fix) with an implementable flag: local, one clear
resolution, no design or spec decision.
- Invoke-AgentReview.ps1 runs the reviewer on a different model against
the working tree and puts the implementer's change back if the review
touched it.
- Select-AgentFixes.ps1 picks, without an agent, the failed checks and
the implementable blocker, major and minor findings.
- One fix round (FIX_PROMPT.md) fixes only those, on the same desktop,
updates the description and reports each item fixed or not. The
checks and the evidence then run again; the first round is kept in
before-fix/. There is no second review or second fix round.
- The report lists each problem with its outcome, what was left for the
maintainer, the checks before the fix, and the fixer's metrics; the
eval counts cases with no blocker or major finding left unfixed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Retry the NOW check, and go on without NOW when it keeps failing
In run 39958994732 the NOW handshake succeeded but the check's command
failed with "NOW operation stream closed before a terminal event", and
DevolutionsSession logged nothing after the handshake; the same check
passed in run 39893563369. The command is now tried three times; if it
still fails, the job continues with DESKTOP_SESSION_NOW=0 and a warning.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Pin IronRDP to the merge of its DVC pipe proxy fix, and drop the patch
IronRDP#2209 (10199db3) merged the fix that ironrdp-patches/0001
carried: the pipe proxy now sends NOW messages on their own channel.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Skip the agent report after a cancelled run, and report a failed one
The report job ran after cancelled run 39969885850 and failed to
download the change it never got. It now runs only after an implement
job that succeeded or failed, tolerates a missing change, and the report
script no longer trips over an empty fix request in strict mode.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Put the agent job's NuGet caches on D:, and stop caching them between runs
Following https://awakecoding.com/posts/speeding-up-dotnet-builds-on-windows-nuget-cache/:
on Windows runners NuGet's package and HTTP caches default to C:, the
slow OS disk. NUGET_PACKAGES and NUGET_HTTP_CACHE_PATH now point under
RUNNER_TEMP on D: for the whole job (base build, the agents' builds and
tests, the checks). The NuGet cache restored from main is dropped:
every run restores from scratch.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Put NuGet's HTTP cache next to the packages in the other .NET workflows
build-release, dotnet-test, cli-headless-e2e and the unigetui-build
action already keep NUGET_PACKAGES in the workspace, on D: on Windows
runners. NUGET_HTTP_CACHE_PATH now goes beside it in .nuget/http-cache
instead of defaulting to C:. Their NuGet caches are unchanged and still
cover only .nuget/packages.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Set the NuGet cache folders once per workflow, not per job or action
NUGET_PACKAGES and NUGET_HTTP_CACHE_PATH move to the workflow-level env
of build-release, dotnet-test and cli-headless-e2e, and desktop-smoke
gets them too; the unigetui-build action no longer sets its own and
uses its caller's. dotnet-test keeps its exact path, so its NuGet cache
still matches; build-release's Windows build job now uses the forward
slashes of its other jobs, so its cache misses once.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
0 commit comments