RE

release-testing

Executes integration tests to ensure SkiaSharp NuGet packages are functional before publishing.

Install

mkdir -p .claude/skills/release-testing && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/4569" && unzip -o skill.zip -d .claude/skills/release-testing && rm skill.zip

Installs to .claude/skills/release-testing

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Run integration tests to verify SkiaSharp NuGet packages work correctly before publishing. Use when user asks to: - Test/verify packages before release - Run integration tests - Test on specific device (iPad, iPhone, Android emulator, Mac, Windows) - Verify SkiaSharp rendering works - Check if packages are ready for publishing - Run smoke/console/blazor/maui tests - Continue with release - Test version X Triggers: "test the release", "verify packages", "run tests on iPad", "check ios tests", "test mac catalyst", "run android tests", "continue", "test 3.119.2-preview.2".
576 chars✓ has a “when” triggerlonger than Claude Code's old 250-char listing cap (fine on current versions)
Advanced

Key capabilities

  • →Verify SkiaSharp NuGet packages
  • →Run integration tests on multiple platforms
  • →Execute tests on Android and iOS emulators
  • →Check CI pipeline status
  • →Validate rendering with screenshots

How it works

It automates the execution of integration tests across various device runtimes and verifies results against expected outputs.

Inputs & outputs

You give it
Release version
You get back
Test execution report

When to use release-testing

  • →Testing packages before release
  • →Verifying on Android emulator
  • →Running cross-platform integration tests

About this skill

Release Package Approval Testing

dnceng Build/Tests + BAR -> release-testing -> team publication

This skill is the human approval gate for one completed BAR build. It resolves that build's per-build Darc feed, verifies the package family, runs the approved host/device matrix, and reports the release decision. It never publishes packages, changes BAR state, creates tags/releases, or merges code.

Boundaries

  • Before planning, confirm the connected Build and Tests runs succeeded and the Tests run consumed the exact Build resource selected for release. The planner validates BAR/package identity, not pipeline status.
  • Start from the exact SkiaSharp package version selected for release. When Maestro finds more than one producing BAR, require its exact --bar-id.
  • Reject a BAR that is already released; this workflow is a pre-publication approval gate.
  • Verify SkiaSharp, SkiaSharp.HarfBuzz, and the bridge's concrete HarfBuzzSharp dependency from the resolved BAR feed.
  • Require the three packages to agree on source branch/commit, then require SkiaSharp's package metadata to match the selected BAR.
  • Pin the package versions and resolved feed in every runner command. Never substitute another build, feed, package version, or target runtime. Runners may choose a compatible profile/device only within the exact approved target.
  • Obtain approval for the exact host matrix before setup or execution.
  • Run every approved item once. A failure blocks release approval but does not stop collection of unrelated results.
  • Platform runners validate their prerequisites; mobile runners own temporary device lifecycle. Run mobile items sequentially and never delete user-owned devices.
  • Appium and its platform drivers must meet the tested minimum versions. Use Appium's npm-aware launcher and active extension context; do not infer driver filesystem paths or force an exact newer version.
  • Product assertions and rendering differences remain failures. Do not change expectations, skips, targets, or package pins to manufacture a pass.
  • Preserve every initial failure, repair, retry, and artifact review.
  • Release approval requires combined reports covering every required matrix ID. Host-inapplicable and customized omissions remain blocking unless the release owner explicitly records an override.

Test matrix

IDCoverageHost
smokeNative loadingAll
consoleConsole and HarfBuzzSharpAll
linuxLinux packages in DockerAll
blazorNative WASM in ChromiumAll
android-26Minimum Android test targetAll
android-37.1Maximum Android test targetAll
maccatalystMac Catalyst renderingmacOS
ios-18.6Minimum iOS test targetmacOS
ios-26.5Maximum iOS test targetmacOS
windowsMAUI Windows renderingWindows

iOS 18.6 and Android 26 are minimum release-test targets, not product support minimums. Exact mobile targets must already be installed. The approved plan must state every host-inapplicable or intentionally omitted item.

Runner ownership

ScriptResponsibility
scripts/plan-release-tests.pyResolve the BAR/feed, verify packages, and emit the host matrix.
scripts/prepare-test-run.ps1Restore pinned local tools and clear prior integration output once.
scripts/run-host-tests.pyRun smoke, console, Docker/Linux, Blazor, Mac Catalyst, and Windows items.
scripts/run-android-tests.pyOwn Android/Appium setup, temporary or reused emulator, test, and cleanup.
scripts/run-ios-tests.pyOwn iOS/Appium setup, fresh simulator, test, and cleanup.
scripts/release_test_common.pyShare package/feed arguments, heartbeats, prerequisite validation, and test invocation.

Do not manually duplicate runner-owned SDK, Appium, device, Docker, or test commands. Use setup.md for prerequisites, monitoring.md for live progress, and troubleshooting.md after failures.

Runbook

1. Resolve and verify the BAR package family

python3 .agents/skills/release-testing/scripts/plan-release-tests.py 4.150.3

The planner uses darc get-asset to find the producing BAR. If the version is ambiguous, rerun with the exact ID reported by the planner:

python3 .agents/skills/release-testing/scripts/plan-release-tests.py \
  4.150.3 --bar-id 329644

Maestro queries default to the last 30 days. For an older release candidate, increase the search window explicitly with --max-age {days}; never use it to select a different package version.

The planner:

  1. reads the BAR build, source branch/commit, build link, and Darc feed location;
  2. resolves that feed's GUID-backed NuGet flat-container endpoint;
  3. downloads the three anchor packages from that feed;
  4. verifies package IDs, versions, source metadata, and bridge dependency;
  5. requires package metadata to match the selected BAR; and
  6. emits host-specific commands with the exact versions and feed pinned.

Render the plan:

## Release package test plan

**BAR:** `{release.barBuildId}` / `{release.buildNumber}`
**Build:** `{release.buildLink}`
**Source:** `{release.branch}` @ `{release.commit}`
**Packages:** SkiaSharp `{release.ciPackages.SkiaSharp}`,
HarfBuzzSharp `{release.ciPackages.HarfBuzzSharp}`
**Darc location:** `{packageSources.barLocation}`
**GUID feed:** `{packageSources.guidFeed}`
**Host:** `{host.os}` / `{host.architecture}`

| ID | Test | Target | Estimate |
|----|------|--------|----------|
| `{id}` | `{label}` | `{target}` | `{estimatedMinutes}` min |

Include every missingCoverage[].

2. Approve the exact matrix

Use ask_user:

  1. Run the full available matrix (Recommended)
  2. Customize the matrix
  3. Cancel release testing

After customization, confirm the exact final item IDs.

3. Prepare once

pwsh -NoLogo -NoProfile -File `
  .agents/skills/release-testing/scripts/prepare-test-run.ps1

Keep preparation after approval: it changes local tool state and clears prior integration artifacts, while planning remains read-only.

4. Run every approved item

Run emitted commands sequentially:

  1. Show the exact command and full pending/running/passed/failed table.
  2. Use a visible terminal canvas; use attached async Bash only when unavailable.
  3. Relay new [release-test] output and refresh the complete table every five seconds. Never duplicate a command after a delayed read.
  4. Record duration, failing phase, diagnostics, artifacts, and result.
  5. Continue after failure once runner-owned cleanup finishes.

5. Repair and retry

After every initial attempt, present the complete failure inventory and group shared root causes. Apply only concrete, safe environment repairs, then retry affected items. Ask before installing/upgrading software, changing permissions, or touching user-owned devices.

Archive the initial artifacts before a retry because fixed screenshot names may be overwritten. Preserve initial and retry outcomes.

6. Report and decide

Review screenshots under output/logs/testlogs/integration/. Report:

  • immutable BAR/build ID, build link, source branch/commit, and package feed;
  • exact SkiaSharp and HarfBuzzSharp versions;
  • every approved ID with initial, repair, retry, and final result;
  • missing or intentionally omitted host coverage; and
  • screenshot paths and review status.

Combine host reports before deciding. Approve the exact BAR package family for team publication only when all required results and artifact checks pass, or when the release owner explicitly records an omission override. Otherwise state that release approval is blocked. This skill reports the decision but never performs the publication.

When not to use it

  • →When CI builds have not completed
  • →When hardware for specific tests is unavailable

Prerequisites

dotnet SDKadbXcode

Limitations

  • →Requires specific hardware or emulators
  • →Fails the entire release on any test failure

How it compares

It automates the entire cross-platform test matrix and CI verification process instead of manual verification.

Compared to similar skills

release-testing side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
release-testing (this skill)13moReviewAdvanced
agent-production-validator37moReviewAdvanced
validate-delivery17moReviewBeginner
documenso-ci-integration12moReviewIntermediate

Try saying

Example prompts that trigger this skill in your AI assistant.

add-api

mono

Add new C# APIs to SkiaSharp by wrapping Skia C++ functionality. Structured 6-phase workflow: C++ analysis → C API creation → submodule commits → binding generation → C# wrapper → testing. Triggers: - Issue classified as "New API" (after fetching and classification) - Direct request: "add DrawFoo method", "expose SkSurface::draw", "wrap sk_foo_bar" - Keywords: "add API", "expose function", "wrap method", "create binding for"

68

bug-fix

mono

Fix bugs in SkiaSharp C# bindings. Structured workflow for investigating, fixing, and testing bug reports. Triggers: Crash, exception, AccessViolationException, incorrect output, wrong behavior, memory leak, disposal issues, "fails", "broken", "doesn't work", "investigate issue", "fix issue", "look at #NNNN", any GitHub issue number referencing a bug. For adding new APIs, use `add-api` skill instead.

426

api-docs

mono

Write and review XML API documentation for SkiaSharp following .NET guidelines. Triggers: "document class", "add XML docs", "write XML documentation", "add triple-slash comments", "review documentation quality", "check docs for errors", "fix doc issues", "fill in missing docs", "remove To be added placeholders", API documentation requests.

110

native-dependency-update

mono

Update native dependencies (libpng, libexpat, zlib, libwebp, harfbuzz, freetype, libjpeg-turbo, etc.) in SkiaSharp's Skia fork. Handles security CVE fixes, bug fixes, and version bumps. Use when user asks to: - Bump/update a native dependency (libpng, zlib, expat, webp, etc.) - Fix a CVE or security vulnerability in a native library - Update Skia's DEPS file - Check what version of a dependency is currently used - Analyze breaking changes between dependency versions Triggers: "bump libpng", "update zlib", "fix CVE in expat", "update native deps", "what version of libpng", "check for breaking changes". For security audits (finding CVEs, checking PR coverage), use the `security-audit` skill instead.

11

release-branch

mono

Create a release branch for SkiaSharp. Use when user says "release X", "start release X", "create release branch for X", "I want to release", or "release now". This is the FIRST step of releasing - creates branch and pushes to trigger CI. Can auto-detect next preview version from main branch.

12

release-publish

mono

Publish SkiaSharp packages and finalize the release. Use when user says "publish X", "finalize X", "tag X", or "finish release X". This is the FINAL step - after release-testing passes. Publishes to NuGet.org, creates tag, GitHub release, and closes milestone. Triggers: "publish the release", "push to nuget", "create github release", "tag the release", "close the milestone", "annotate release notes", "testing passed what's next", "finalize 3.119.2", "release is ready".

19

Search skills

Search the agent skills registry