.NET MAUI Release Readiness
dotnet/maui
Produces evidence-backed ship-readiness verdicts for .NET MAUI Servicing Releases and Previews, and drafts public-safe release handoff pages from the result.
Run the pi-lens release-readiness QA pass — witness the feature × modality matrix against a real pi, count coverage, and issue a ship / ship-with-caveats / don't-ship / blocked line.
$ npx skills add apmantza/pi-lens --skill release-qa -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install apmantza/pi-lens release-qa --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/apmantza/pi-lens.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/release-qa .claude/skills/release-qa && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "release-qa" agent skill from https://github.com/apmantza/pi-lens/tree/master/.claude/skills/release-qa into .claude/skills/release-qa/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release-qa", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/apmantza/pi-lens/tree/master/.claude/skills/release-qaType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add apmantza/pi-lens --skill release-qa -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install apmantza/pi-lens release-qa --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/apmantza/pi-lens.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/release-qa .agents/skills/release-qa && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "release-qa" agent skill from https://github.com/apmantza/pi-lens/tree/master/.claude/skills/release-qa into .agents/skills/release-qa/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release-qa", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add apmantza/pi-lens --skill release-qa -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install apmantza/pi-lens release-qa --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/apmantza/pi-lens.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/release-qa .cursor/skills/release-qa && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "release-qa" agent skill from https://github.com/apmantza/pi-lens/tree/master/.claude/skills/release-qa into .cursor/skills/release-qa/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release-qa", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/apmantza/pi-lens.git --path .claude/skills/release-qa--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add apmantza/pi-lens --skill release-qa -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install apmantza/pi-lens release-qa --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/apmantza/pi-lens.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/release-qa .gemini/skills/release-qa && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "release-qa" agent skill from https://github.com/apmantza/pi-lens/tree/master/.claude/skills/release-qa into .gemini/skills/release-qa/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release-qa", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install apmantza/pi-lens release-qaInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add apmantza/pi-lens --skill release-qa -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/apmantza/pi-lens.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/release-qa .github/skills/release-qa && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "release-qa" agent skill from https://github.com/apmantza/pi-lens/tree/master/.claude/skills/release-qa into .github/skills/release-qa/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release-qa", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add apmantza/pi-lens --skill release-qa -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install apmantza/pi-lens release-qa --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/apmantza/pi-lens.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/release-qa .opencode/skills/release-qa && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "release-qa" agent skill from https://github.com/apmantza/pi-lens/tree/master/.claude/skills/release-qa into .opencode/skills/release-qa/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release-qa", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
release-qaRun the pi-lens release-readiness QA pass — witness the feature × modality matrix against a real pi, count coverage, and issue a ship / ship-with-caveats / don't-ship / blocked line.
Release QA is an agent skill from apmantza/pi-lens. Run the pi-lens release-readiness QA pass — witness the feature × modality matrix against a real pi, count coverage, and issue a ship / ship-with-caveats / don't-ship / blocked line. Use before cutting a release tag, or when asked whether a build is shippable.
Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Product & Project Management, covering Feature launches and release readiness. The repository describes itself as: Real-time code feedback for pi — LSP, linters, formatters, structural analysis. The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit b7b16f1. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitnodenpmnpxFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, npm and npx, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Release QA loads about 2.6k tokens when it runs. Until then it costs about 68 tokens; SKILL.md has 1,469 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from apmantza/pi-lens at commit b7b16f1, republished under its MIT licence (© apmantza). 1,469 words, ~2,621 tokens.
.claude/skills/release-qa/SKILL.md (or your agent's skills folder).The pass that runs before a release is cut. Sibling of the merge policy (docs/pi-lens-merge-policy.md): that policy
decides whether one PR may land, this one decides whether the accumulated result
may ship.
Why it exists: #2587. Four shipped skills were suspected of never registering for four releases (3.8.51 → 4.1.3) because no check ever asked a real pi what it loaded. The unit suite (~10.8k tests) and the nightly smokes (install, compat, tool, lifecycle, parser) are per-seam; nothing composed them into a release verdict with counted coverage, so a missing row read as absence rather than arithmetic.
These outrank convenience, habit, and the shape of any previous pass.
discovered / rows / untested arithmetic the runner prints, verbatim. "All
the important paths were checked" is not a coverage statement.docs/release-qa-baseline.md and
AGENTS.md are the contract. If a step here disagrees with them, they win
and this file is wrong.docs/release-qa-baseline.md is the matrix — row ids, entry points, pass
criteria, witness kinds. Read it before running anything; the runner parses this
same document, so a row you cannot explain is a row the runner will execute
anyway.
The BASE rows are the matrix. The DIFF rows are what THIS release changed, and
.changelog/ is the diff inventory:
git describe --tags --abbrev=0 # the last tag
ls .changelog/*.md # every pending entry = one changeFor each fragment, ask: does it touch a surface the matrix already covers, or a new one? A fragment that adds a modality, a new entry point, or a new shipped resource needs a row. Two outcomes are acceptable and one is not:
docs/release-qa-baseline.md (and a probe in
scripts/release-qa.mjs — the two lists are tied and the unit test enforces
it), orSilently leaving a change unrowed is the failure this skill exists to prevent.
A change to .github/workflows/release.yml or to package.json's
packageManager pin is already rowed: publish-toolchain-pinned drives the
publish job's own npx -y "npm@<pin>" invocation against the candidate (#2940).
Name it in the report as the covering row rather than re-deriving one — and if
it reads SKIPPED, the publish path was NOT witnessed for this candidate.
git status --porcelain # must be empty; the runner packs a commit
node scripts/release-qa.mjs --pi <path-to-pi>Useful flags:
--from npm:pi-lens@<version> — QA a PUBLISHED release instead of the working
tree. This is how a regression is demonstrated against the last release.--git-ref <ref> — enable the git-install row against a pushed ref. Without
it that row is SKIPPED, because a git: install resolves a pushed ref rather
than the working tree.--poll-cap-ms <n> — the cap for polled rows. State the value you used.--keep — leave the scratch root for inspection.Use the pi version install-smoke.yml pins (bump by hand, #731) and, when a
newer line exists, repeat against the newest one. Both readings go in the
report.
| code | verdict | what it means |
|---|---|---|
| 0 | SHIP | every discovered row PASSED with a witness |
| 1 | DO-NOT-SHIP | a row FAILED, or the candidate would not install or activate |
| 2 | SHIP-WITH-CAVEATS | every witnessed row passed; some produced no witness |
| 3 | BLOCKED or INCONCLUSIVE | no verdict: pi did not boot, or nothing was witnessed |
| 4 | usage / self-check error | bad option, unparseable matrix, arithmetic mismatch |
2 is the EXPECTED verdict for a plain working-tree run — git-install-loads
is SKIPPED without --git-ref, and one SKIPPED row is a caveat by definition.
Do not read a 2 as a failure, and do not read it as a clean bill either: name
the caveat. A CI lane treats 2 as a warning and 1/3/4 as failures.
The runner pins HOME, USERPROFILE, PI_LENS_HOME, PILENS_DATA_DIR,
PI_LENS_INSTALL_LOG and npm_config_cache inside its own scratch root, and
passes that environment to every child — pi, the MCP server, node, and
npm. All six matter. PI_LENS_INSTALL_LOG is the one that is easy to miss:
scripts/warm-loader-cache.mjs (which prepare runs on every pack) prefers
THAT variable for its install log and falls back to PI_LENS_HOME/install.log
(or ~/.pi-lens/install.log when neither is set). The runner's first six runs
pinned the pi-lens home, passed no environment to npm, and put 41
warm_loader_cache records into the maintainer's real ~/.pi-lens/install.log
(#2619 review F1).
The pack runs in a git archive HEAD export inside the scratch root, never in
the live checkout, because npm pack fires our own prepack
(scripts/strip-dev-deps-for-pack.mjs rewrites package.json AND
package-lock.json, restored only by postpack, with no signal trap — an
interrupted pack leaves the checkout stripped) and prepare (rebuilds dist/,
downloads grammars over the network, reinstalls the git hooks). A dirty checkout
is REFUSED rather than packed as its last commit, because a report whose "QA
target" is not what the operator is looking at is the failure this runner
exists to end.
Cost and cleanup. A run installs a production dependency tree twice (the
export, then the scratch project) and builds dist/, so budget ~1.1 GB under
/tmp and about a minute of wall clock. The scratch root is removed on exit
unless --keep — but an INTERRUPTED run leaves it behind, so
ls -d /tmp/pi-lens-release-qa-* after a Ctrl-C session, and remove what you
find.
Remaining side effects on the checkout: none that persist. git archive and
git status are reads. The runner writes release-qa-report.md and
release-qa-evidence/ into --out (the cwd by default; both are gitignored at
the repo root). Everything else lands in the scratch root, which is removed
unless --keep. Verify rather than trust: git status --porcelain before and
after a run must be identical, and
wc -l ~/.pi-lens/install.log must not change.
Never run any release probe without those pins — an unpinned probe writes into
the maintainer's real ~/.pi and ~/.pi-lens (#2506).
The bump PR changes three things the unit suite reads as data: the package
version, the CHANGELOG.md release headings, and the .changelog/ fragment
population (which the roll DELETES). Tests calibrated against the pre-roll
tree go red only on the bump PR, after the gate has already said ship. The
4.1.4 bump (2026-09-07) hit two: config-deprecation-registry demanded
deprecatedSince <= the announcing release (the window said 4.2.0; the
Deprecated entries shipped in 4.1.4), and tracked-control-bytes's Markdown
floor of 80 had been calibrated while 110 fragments existed (64 files remain).
So, in a scratch export, roll for the target version and run the tests that read release state:
S=$(mktemp -d) && git archive HEAD | tar -x -C "$S"
node scripts/changelog-release.mjs <version> --root-dir "$S"
(cd "$S" && npm version <version> --no-git-tag-version >/dev/null && ln -s "$OLDPWD/node_modules" node_modules && npm run build >/dev/null && \
npx vitest run $(grep -rl "CHANGELOG.md\|\.changelog\|package.json" tests/ | grep -v "^tests/support\|fixtures" | tr '\n' ' '))Read the release body too: (cd "$S" && node scripts/changelog-extract.mjs <version> --summary)
must list only audience: user entries and end with the internal count.
Every red here is a release-only calibration: fix it IN the bump PR (a
trailing commit after the bump+roll commit is fine) and name it in the PR
body. Also read the rolled section for a "next version" literal that the
fragments assumed (4.2.0 in a Deprecated since … line when the release is
a patch) and correct it in code, docs and the rolled section together.
The bump PR title is chore(release): <version> (refs #<tracker>) — the
PR-title lint requires the conventional prefix AND an issue ref, and a title
missing either reds ci-verdict on an otherwise green workflow (the 4.2.0
bump was retitled after exactly that).
The runner writes release-qa-report.md and release-qa-evidence/<row-id>.*.
The report you hand back carries, in this order:
ship / ship-with-caveats / don't ship / blocked /
inconclusive — with its exit code;tree, or the published version);ship-with-caveats requires the caveats to be named in the release notes. A
caveat nobody wrote down is a defect that shipped.
scripts/smoke-tools.mjs does that nightly.© apmantza, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/release-qa of apmantza/pi-lens.
Open the folder on GitHubat commit b7b16f1
Release QA next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Release QA this skillapmantza/pi-lens | 463 | — | ~2.6k | Automated safety check: Pass | MIT | |
| .NET MAUI Release Readinessdotnet/maui | 23k | — | ~15k | Automated safety check: Pass | MIT | |
| Release ValidationMesh-LLM/mesh-llm | 3.5k | — | ~2.6k | Automated safety check: Pass | Apache-2.0 | |
| Final Release Reviewopenai/openai-agents-python | 30k | — | ~5.4k | Automated safety check: Pass | MIT | |
| Final Release Reviewopenai/openai-agents-js | 3.9k | — | ~4k | Automated safety check: Pass | MIT | |
| Acceptance Demo GeneratorChachamaru127/claude-code-harness | 3.2k | — | ~3.4k | Automated safety check: Notes | MIT |
dotnet/maui
Produces evidence-backed ship-readiness verdicts for .NET MAUI Servicing Releases and Previews, and drafts public-safe release handoff pages from the result.
Mesh-LLM/mesh-llm
A skill your agent uses when validating a MeshLLM release candidate or current HEAD against the last GitHub release, assembling the canonical feature/fix/modification inventory, testing locally…
openai/openai-agents-python
Assess a Python SDK release candidate or release plan against the previous release and recommend ship or block.
openai/openai-agents-js
Assess a JS SDK release candidate or release plan against the previous release and recommend ship or block.
Chachamaru127/claude-code-harness
Renders a single HTML page showing each acceptance criterion as verified or not, with a ship, wait, or reject recommendation for non-engineers.
blader/schematic
Reverse engineer a detailed product and technical specification document from a git branch's implementation.
apmantza/pi-lens
A skill your agent uses when searching or replacing code patterns - use ast-grep instead of text search for semantic accuracy
apmantza/pi-lens
A skill your agent uses when writing a new pi-lens ast-grep rule YAML file — covers schema, drop path, gotchas, and NAPI runner constraints
apmantza/pi-lens
A skill your agent uses when writing a new pi-lens tree-sitter query rule YAML file — covers schema, S-expression syntax, capture names, predicates, and gotchas
apmantza/pi-lens
Navigate code with IDE features and run proactive LSP diagnostics on files/folders/batches.
apmantza/pi-lens
Run the pi-lens retrospective — turn a session, an incident, or a merged bug fix into environment changes (checks, hooks, contract lines, deletions), classified mechanical-vs-judgement, each with…
Categories
Run the pi-lens release-readiness QA pass — witness the feature × modality matrix against a real pi, count coverage, and issue a ship / ship-with-caveats / don't-ship / blocked line. Release QA is an agent skill from apmantza/pi-lens. Run the pi-lens release-readiness QA pass — witness the feature × modality matrix against a real pi, count coverage, and issue a ship / ship-with-caveats / don't-ship / blocked line.
Release QA fits situations like: tasks that involve Feature launches and release readiness.
Run `npx skills add apmantza/pi-lens --skill release-qa -a claude-code`. Or copy the skill folder (.claude/skills/release-qa in apmantza/pi-lens) into .claude/skills/release-qa in your project. Claude Code loads it when a task matches its description.
Run `npx skills add apmantza/pi-lens --skill release-qa -a codex`. Or copy the skill folder (.claude/skills/release-qa in apmantza/pi-lens) into .agents/skills/release-qa in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add apmantza/pi-lens --skill release-qa -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/release-qa, .gemini/skills/release-qa, .github/skills/release-qa and .opencode/skills/release-qa in your project.
Going by SKILL.md and its folder, Release QA needs the command-line tools its instructions call (git, node, npm and npx). Our summary lists: Node.js.
SKILL.md contains no URLs. Its commands use git, npm and npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Release QA is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.6k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Release QA: .NET MAUI Release Readiness (dotnet/maui, 23k stars), Release Validation (Mesh-LLM/mesh-llm, 3.5k stars), Final Release Review (openai/openai-agents-python, 30k stars) and Final Release Review (openai/openai-agents-js, 3.9k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
apmantza (a GitHub user) maintains it in apmantza/pi-lens, which has 463 GitHub stars. The repository holds 6 skills in this directory. The repository was last updated on October 8, 2026.
Source: apmantza/pi-lens on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.