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 Testing

This skill is Step 3 of 5:

release-branchrelease-statusrelease-testingrelease-publishrelease-milestones

Contract

  • Run the read-only planner first and preserve its exact source commit, managed run, tests run, and paired package versions throughout testing.
  • Obtain user approval for the matrix before preparation or execution.
  • Test stable releases with exact *-stable.{build} packages, never the future bare public version.
  • Execute every approved item once even when earlier items fail. A failed item blocks publication but does not stop collection of unrelated results.
  • Never turn a failure into a skip or silently substitute a runtime, image, device, package version, or expected artifact.
  • Each platform runner checks its own prerequisites and owns setup/cleanup. Do not manually duplicate its SDK, Appium, device, Docker, or test commands.
  • Run mobile items sequentially. Runners must not delete user-owned devices.
  • Invoke release-publish after every approved item and artifact check passes, unless the user explicitly overrides this gate. Record the override and proceed without investigating or challenging it.
  • This skill never publishes packages, creates tags/releases, or merges code.

Fixed 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. Missing or host-inapplicable coverage must be explicit in the approved plan.

Script contract

ScriptResponsibility
scripts/plan-release-tests.pyRead-only release-status handoff and exact host matrix.
scripts/prepare-test-run.pyRestore pinned local tools and clear prior integration output once.
scripts/run-host-tests.pySmoke, console, Docker/Linux, Blazor, Mac Catalyst, and Windows host items.
scripts/run-android-tests.pyAndroid environment, Appium, temporary/reused emulator, test, and cleanup.
scripts/run-ios-tests.pyFresh iOS simulator, Appium test, and cleanup.
scripts/release_test_common.pyShared versions, heartbeat execution, validation, package arguments, and test invocation.

Planner actions:

nextActionResponse
approve-test-matrixPresent and obtain approval.
wait-for-tests-trigger / wait-for-testsReturn to release-status, unless the user explicitly overrides only this wait with --allow-incomplete-ci.
retry-testsInvestigate/retry failed CI tests; never override them here.
Anything elseReturn to release-status.

Use setup.md for prerequisites, monitoring.md for live progress, and troubleshooting.md only after failures.

Workflow

1. Plan and approve

python3 .agents/skills/release-testing/scripts/plan-release-tests.py \
  {release-branch-or-commit}

If readyToPlan is false, report nextAction and stop. Otherwise render:

## Release test plan

**Release:** `{release.branch}`
**Commit:** `{release.commit}`
**Managed/tests runs:** `{release.managedRunId}` / `{release.testsRunId}`
**Packages:** SkiaSharp `{test version}`, HarfBuzzSharp `{test version}`
**Host:** `{host.os}` / `{host.architecture}`

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

Include every missingCoverage[] and release warning. Use ask_user:

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

Confirm the exact final IDs after customization.

2. Prepare once

python3 .agents/skills/release-testing/scripts/prepare-test-run.py

3. Collect every result

For each approved item, run its emitted command sequentially:

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

4. Repair and retry

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

Product assertions and rendering differences remain failures; do not alter expectations, skips, or package pins to make them pass.

5. Report the gate

Review expected screenshots under output/logs/testlogs/integration/. The final report must include:

  • Immutable release/run/package identity.
  • Every approved ID with initial, repair, retry, and final result.
  • Missing or intentionally omitted coverage.
  • Screenshot paths and review status.

Proceed to release-publish when all final results and artifact checks pass, or when the user explicitly overrides the gate.

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)11moReviewAdvanced
agent-production-validator36moReviewAdvanced
validate-delivery15moReviewBeginner
documenso-ci-integration127dReviewIntermediate

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