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
Defines the file every benchmark trial writes, so the dashboard and README can read results from one place. Part of #1179 (second in the stack, uses the arm names from #1180).
This draft is for the team to review the format. It adds the schema, a doc, a validator and one example, and makes both harnesses write the files (see "Where the files are written"). It also adds publish-results.ps1, which stages a release and opens a PR into benchmark-data. It does not create that branch.
One JSON file per trial (one agent attempt: one scenario, one model, one arm). Release results go on the benchmark-data branch, one folder per release:
apps only: judge model and designScore (0-10). Detail only, never decides pass/fail
usage
object
Tokens, credits, time (below)
skills[]
optional
Plugin skills loaded: name, count, optional atMs
winappCommands[]
optional
winapp commands run: command, count
error
optional
Set only when the harness failed, not the agent
Pass/fail. No single score. If any required check fails, the trial fails. If an improvement check fails, the trial still passes and improvements.met goes down by one.
tasks: required = the checks already marked required. The rest are improvements. A partly done task is not a pass.
apps: required = the gates (builds, launches, right framework, Native AOT). Quality checks and judge-checked requirements are improvements. A scenario can mark a requirement as required.
nanoAiu is the AI credits Copilot CLI reports, as an exact integer (1 AIU = 1,000,000,000). null if not reported.
Where the files are written
tasks: <run dir>\trials\<scenario>__<arm>__<model>__<trial>.json. release is the pinned release with -Winapp release, else dev. set comes from task.json (default tuning).
apps: <trial dir>\trial-result.json. release comes from BENCH_RELEASE (default dev). set and required_requirements come from the scenario config. Setups that are not one of the three arms (published) write no file.
Both keep their existing output (runs.jsonl, results.json). apps token counts are now also kept as exact integers.
Publishing (one manual step)
Runs on any machine stay local. For a release, the release owner runs:
It validates the files, writes <release>\index.json (a summary per scenario/arm/model, so readers load one file instead of hundreds), and opens a PR into benchmark-data (not main). A second person reviews; merging is the publish. Without -OpenPr it only previews. -OpenPr refuses a dev run, mixed commits, a dirty or different checkout, or a release already on the branch. A maintainer still needs to create benchmark-data and add a ruleset that only allows PRs.
pwsh benchmarks\validate-results.ps1 -Path .\v0.7.1# OK: 1 result file(s) valid.
Besides the schema, it checks that passed and improvements match checks, check ids are unique, the file name matches its fields, and the folder matches release.
Full reference: benchmarks\RESULTS-FORMAT.md.
Real runs (one trial each, dev)
Run
Result
File
taskswinforms-msix, cli-only
passed, 14.9 credits
validates; publish-results.ps1 preview staged it and wrote index.json
appscalc, cli-only
passed, 12/16 improvements
trial-result.json valid
appscalc, cli-plus-plugins@main
score 92
counts from the real log: skill winui-dev-workflow x1; winappnew x1, run x4, ui ... x5
The last run exposed a bug (the arm name cli-plus-plugins@main was not recognized, so no file was written); fixed in this PR.
Before / after
Nothing a user runs changes.
Not tested / risks
publish-results.ps1 -OpenPr is tested only up to its guards; it has not pushed or opened a PR (the branch does not exist).
Only one trial per harness was run for real (below), to check the files, not the numbers.
subAgentTokens is always null for tasks.
Questions for the team:
Keep subAgentTokens and premiumRequests? The decision lists only input, output, cache-read and credits.
Is a reviewed PR into benchmark-data the right publish gate?
set is a new optional field on each scenario/task, default tuning. Is that the right place?
Checklist
Tests added or updated (Pester: validator and publish script, 8 passing)
Tested locally on Windows
Docs, samples, and plugins/winapp/skills/ updated if user-facing behavior changed (new benchmarks\RESULTS-FORMAT.md; no plugin changes needed)
Other suites are reflected in the overall validation status above.
✅ 10920 passed, 44 skipped out of 10964 tests in 2067.0s (+281.3s vs. baseline)
Test Coverage
✅ 87.6% line coverage, 81.6% branch coverage · ✅ no change vs. baseline
CLI Startup Time
73ms median (x64, winapp --version) · ✅ no change vs. baseline
Try This Build
Installs the MSIX for your architecture, replacing any previously installed build. Needs the GitHub CLI — the command offers to install it and sign you in if it is missing.
The reason will be displayed to describe this comment to others. Learn more.
🤖 AI-generated review (winappcli pr-review skill) — verify before acting.
Decision
Changes required — previewing results can delete the input files, and exported results can report successes, source commits, and activity counts incorrectly.
Reviewed commit 821426963da81cc7356555d241fd1081a00e9108 against main.
Must fix
Preview can delete the results it is reading
What is wrong: The publisher deletes its destination before checking whether it contains the source files. It also uses release as a path before validating it.
Show me: In an isolated fixture, -Path .\results -OutDir .\results deleted the original release JSON, then failed copying it. A malformed "release":"..\\victim" also deleted a sibling marker before validation rejected the file.
Why it matters: A preview can destroy files without -OpenPr.
Smallest fix: Validate source data before filesystem changes, constrain destinations to the staging directory, and reject destinations containing source files.
Location:benchmarks\publish-results.ps1:50–59
Failed judging becomes a passing app trial
What is wrong: When the judge—the model checking the app’s requirements—fails, the writer substitutes an empty requirement list and ignores the recorded failure.
Show me: Passing build/launch checks, failReason: "Validation timed out", and an untested required requirement produced "outcome":"valid","passed":true. The real validator accepted it, and the publisher counted validTrials: 1, passed: 1.
Why it matters: A tooling failure inflates the published success rate.
Smallest fix: Skip trial emission when attempted judging fails, matching the documented current policy for harness failures.
Release results can identify the wrong plugin commit
What is wrong: The exported commit comes from the harness checkout, although the plugins can come from another Git ref. The default plugin ref is main.
Show me: From release checkout A, --agent cli-plus-plugins@B resolves plugins at B, but the result records A through currentCommit(). The publisher’s checkout check then passes against A.
Why it matters: Published release numbers can describe different, potentially unreleased plugins.
Smallest fix: Reject release-labeled exports when the resolved plugin commit differs from the claimed commit.
What is wrong: The converter reads object properties, but its production caller passes an ordered dictionary. Those lookups miss the dictionary entries.
Show me: A production-shaped record with three winapp-setup loads and four package commands exported skills: [{"name":"winapp-setup"}] and no winappCommands.
Why it matters: Published summaries undercount skill use and omit command activity.
Smallest fix: Pass [pscustomobject]$record, as the preceding serialization already does, and cover the production dictionary shape in a test.
npm --prefix .\benchmarks\apps run typecheck — passed.
Isolated reproductions confirmed deletion, count loss, failed-judge acceptance through publication staging, and exit-code masking.
No paid benchmark trials or GitHub publication were run. The plugin-commit mismatch was traced through source resolution and export code, not exercised with a full trial.
Preview no longer deletes its own source; unsafe path values are rejected first.
Failed judging and plugin/commit mismatches no longer produce trial files.
Task exports keep skill and command counts. gh pr create failures now fail the script.
Co-authored-by: Copilot App <[email protected]>
Fixed in 05bc7e5: publishing a preview no longer deletes its own results (unsafe release/scenario/arm/model values and an -OutDir that overlaps the source are rejected first). Apps trials with failed judging, or plugins from a different commit than a release, no longer write a trial file. Task exports keep skill and command counts. A failed gh pr create now fails the script.
Revalidation keeps the original release, commit and start time and clears stale trial files.
Unchecked required requirements fail the trial. Task release exports require clean, matching plugins.
Index summaries stay arrays, debug configurations are not exported, and non-valid outcomes validate.
Co-authored-by: Copilot App <[email protected]>
Prevent subcommand matching from crossing newlines
benchmarks/apps/src/runner/activity.ts:28
Do not consume the next command as a subcommand. For a multiline shell call containing winapp restore\nwinapp run, the optional second-token match crosses the newline and consumes the second winapp, so the exported activity records only restore. Restrict token spacing to spaces and tabs so each command remains available to the next match.
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
ready-for-reviewAgent work and technical checks complete; awaiting review or re-review, not approval or merge
3 participants
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.
What and why
Defines the file every benchmark trial writes, so the dashboard and README can read results from one place. Part of #1179 (second in the stack, uses the arm names from #1180).
This draft is for the team to review the format. It adds the schema, a doc, a validator and one example, and makes both harnesses write the files (see "Where the files are written"). It also adds
publish-results.ps1, which stages a release and opens a PR intobenchmark-data. It does not create that branch.Refs #1181
The schema
One JSON file per trial (one agent attempt: one scenario, one model, one arm). Release results go on the
benchmark-databranch, one folder per release:Dev trials use the same format with
"release": "dev"and stay local.schemaVersion1releasevX.Y.Zordevcommitbenchmarkapps|tasksscenariosettuning|held-outarmnone|cli-only|cli-plus-pluginsmodeltrialstartedAtpassedtruewhen everyrequiredcheck passedimprovements{ met, total }improvementchecks met out of totalchecks[]id,kind(required|improvement),passed, optionalsource(harness|judge), optionaldetailjudgeappsonly: judgemodelanddesignScore(0-10). Detail only, never decides pass/failusageskills[]name,count, optionalatMswinappCommands[]winappcommands run:command,counterrorPass/fail. No single score. If any
requiredcheck fails, the trial fails. If animprovementcheck fails, the trial still passes andimprovements.metgoes down by one.tasks:required= the checks already marked required. The rest are improvements. A partly done task is not a pass.apps:required= the gates (builds, launches, right framework, Native AOT). Quality checks and judge-checked requirements are improvements. A scenario can mark a requirement as required.Usage. No dollar costs, no price table.
nanoAiuis the AI credits Copilot CLI reports, as an exact integer (1 AIU = 1,000,000,000).nullif not reported.Where the files are written
tasks:<run dir>\trials\<scenario>__<arm>__<model>__<trial>.json.releaseis the pinned release with-Winapp release, elsedev.setcomes fromtask.json(defaulttuning).apps:<trial dir>\trial-result.json.releasecomes fromBENCH_RELEASE(defaultdev).setandrequired_requirementscome from the scenario config. Setups that are not one of the three arms (published) write no file.runs.jsonl,results.json).appstoken counts are now also kept as exact integers.Publishing (one manual step)
Runs on any machine stay local. For a release, the release owner runs:
It validates the files, writes
<release>\index.json(a summary per scenario/arm/model, so readers load one file instead of hundreds), and opens a PR intobenchmark-data(notmain). A second person reviews; merging is the publish. Without-OpenPrit only previews.-OpenPrrefuses adevrun, mixed commits, a dirty or different checkout, or a release already on the branch. A maintainer still needs to createbenchmark-dataand add a ruleset that only allows PRs.Example
benchmarks\examples\v0.7.1\winforms-msix__cli-only__sonnet-5.5__1.json: passed, 1 of 2 improvements met.Validate
Besides the schema, it checks that
passedandimprovementsmatchchecks, check ids are unique, the file name matches its fields, and the folder matchesrelease.Full reference:
benchmarks\RESULTS-FORMAT.md.Real runs (one trial each,
dev)taskswinforms-msix,cli-onlypublish-results.ps1preview staged it and wroteindex.jsonappscalc,cli-onlytrial-result.jsonvalidappscalc,cli-plus-plugins@mainwinui-dev-workflowx1;winappnewx1,runx4,ui ...x5The last run exposed a bug (the arm name
cli-plus-plugins@mainwas not recognized, so no file was written); fixed in this PR.Before / after
Nothing a user runs changes.
Not tested / risks
publish-results.ps1 -OpenPris tested only up to its guards; it has not pushed or opened a PR (the branch does not exist).subAgentTokensis alwaysnullfortasks.subAgentTokensandpremiumRequests? The decision lists only input, output, cache-read and credits.benchmark-datathe right publish gate?setis a new optional field on each scenario/task, defaulttuning. Is that the right place?Checklist
plugins/winapp/skills/updated if user-facing behavior changed (newbenchmarks\RESULTS-FORMAT.md; no plugin changes needed)