Agent skill

Release QA

by apmantza in 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.

MITAuto-check passedProduct & Project Management

Install Release QA

skills CLI
$ npx skills add apmantza/pi-lens --skill release-qa -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install apmantza/pi-lens release-qa --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
release-qa
GitHub stars
463
Token cost
~2.6k tokens
SKILL.md length
1,469 words
Files
1
Skills in repo
6
Repo updated
First seen
Licence
MIT

At a glance

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.

  • Works in 4 steps: Read the baseline → Derive the DIFF rows → Run the runner → …
  • Tasks that involve Feature launches and release readiness
  • SKILL.md covers Hard rules, Procedure and What this is not
  • Calls git, node and npm

What it does

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.

When your agent uses it

  • Tasks that involve Feature launches and release readiness

Example prompts

  • “/release-qa”

Requirements

  • Node.js

Workflow steps

4 steps, taken from the step headings in SKILL.md.

  1. Read the baseline
  2. Derive the DIFF rows
  3. Run the runner
  4. Report

What it can do on your machine

Read from SKILL.md and the folder at commit b7b16f1. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • node
    • npm
    • npx

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    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.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~68
When it runs · the whole SKILL.md, loaded when a task matches
~2.6k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from apmantza/pi-lens at commit b7b16f1, republished under its MIT licence (© apmantza). 1,469 words, ~2,621 tokens.

Download SKILL.mdSave it as .claude/skills/release-qa/SKILL.md (or your agent's skills folder).
name
release-qa
description
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.

Release QA

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.

Hard rules

These outrank convenience, habit, and the shape of any previous pass.

  1. No witness, no verdict. A row is PASS only when an artifact SHOWS the pass criterion. A witness that merely exists — a log file that was written, a process that exited 0 — is not a witness. Quote the line.
  2. Reachability is decided in planning, not discovered mid-run. A row that cannot be reached in this run is SKIPPED with the reason written down BEFORE the run, never a PASS that quietly measured nothing.
  3. Coverage is counted, never claimed. Report the discovered / rows / untested arithmetic the runner prints, verbatim. "All the important paths were checked" is not a coverage statement.
  4. An expired poll is UNTESTED, never PASS. Async rows are polled to a terminal state under a stated cap. Expiry means you did not see the result.
  5. BLOCKED is not a failure and not a pass. If pi cannot boot, no ship verdict is issued at all. Say BLOCKED and stop.
  6. The repo's runbook outranks habit. 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.

Procedure

1. Read the baseline

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.

2. Derive the DIFF rows

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 change

For 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:

  • add the row to docs/release-qa-baseline.md (and a probe in scripts/release-qa.mjs — the two lists are tied and the unit test enforces it), or
  • record in the report that the change is covered by an existing row, naming which.

Silently 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.

3. Run the runner
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.

Exit codes — read them, do not infer from the log
codeverdictwhat it means
0SHIPevery discovered row PASSED with a witness
1DO-NOT-SHIPa row FAILED, or the candidate would not install or activate
2SHIP-WITH-CAVEATSevery witnessed row passed; some produced no witness
3BLOCKED or INCONCLUSIVEno verdict: pi did not boot, or nothing was witnessed
4usage / self-check errorbad 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.

Show full SKILL.md (733 more words)Show less
What the run touches, and what it must not

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).

3b. Pre-bump dry roll (before opening the bump PR)

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).

4. Report

The runner writes release-qa-report.md and release-qa-evidence/<row-id>.*. The report you hand back carries, in this order:

  1. the verdict line — ship / ship-with-caveats / don't ship / blocked / inconclusive — with its exit code;
  2. the coverage arithmetic, quoted verbatim from the runner;
  3. every non-PASS row with its cause or reason;
  4. the pi version(s) driven and the QA target (tree, or the published version);
  5. the DIFF rows derived in step 2 and where each landed.

ship-with-caveats requires the caveats to be named in the release notes. A caveat nobody wrote down is a defect that shipped.

What this is not

  • Not a substitute for CI. Unit tests and Lint are still the per-PR gate.
  • Not a per-language tool sweep — scripts/smoke-tools.mjs does that nightly.
  • Not a model-driven test. Every row is model-free by construction; a row that needs a real LLM turn cannot be a release gate.

© apmantza, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/release-qa of apmantza/pi-lens.

Open the folder on GitHubat commit b7b16f1

Compare with similar skills

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.

Release QA compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Release QA this skillapmantza/pi-lens463—~2.6kAutomated safety check: PassMIT
.NET MAUI Release Readinessdotnet/maui23k—~15kAutomated safety check: PassMIT
Release ValidationMesh-LLM/mesh-llm3.5k—~2.6kAutomated safety check: PassApache-2.0
Final Release Reviewopenai/openai-agents-python30k—~5.4kAutomated safety check: PassMIT
Final Release Reviewopenai/openai-agents-js3.9k—~4kAutomated safety check: PassMIT
Acceptance Demo GeneratorChachamaru127/claude-code-harness3.2k—~3.4kAutomated safety check: NotesMIT

Similar skills

  • Official

    Produces evidence-backed ship-readiness verdicts for .NET MAUI Servicing Releases and Previews, and drafts public-safe release handoff pages from the result.

    23k GitHub stars~15k tokensUpdated today
    Product & Project ManagementAuto-check passed
  • Release Validation

    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…

    3.5k GitHub stars~2.6k tokensUpdated today
    Product & Project ManagementAuto-check passed
  • Final Release Review

    openai/openai-agents-python

    Official

    Assess a Python SDK release candidate or release plan against the previous release and recommend ship or block.

    30k GitHub stars~5.4k tokensUpdated today
    Product & Project ManagementAuto-check passed
  • Final Release Review

    openai/openai-agents-js

    Official

    Assess a JS SDK release candidate or release plan against the previous release and recommend ship or block.

    3.9k GitHub stars~4k tokensUpdated yesterday
    Product & Project ManagementAuto-check passed
  • Acceptance Demo Generator

    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.

    3.2k GitHub stars~3.4k tokensUpdated 3 days ago
    Product & Project ManagementAuto-check: notes
  • Schematic

    blader/schematic

    Reverse engineer a detailed product and technical specification document from a git branch's implementation.

    240 GitHub stars~2.2k tokensUpdated 7 mo ago
    Product & Project ManagementAuto-check passed

More from apmantza/pi-lens

  • Pi Lens Ast Grep

    apmantza/pi-lens

    A skill your agent uses when searching or replacing code patterns - use ast-grep instead of text search for semantic accuracy

    463 GitHub stars~2k tokensUpdated today
    Auto-check passed
  • 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

    463 GitHub stars~2.1k tokensUpdated today
    Auto-check passed
  • 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

    463 GitHub stars~1.2k tokensUpdated today
    Auto-check passed
  • Pi Lens Lsp Navigation

    apmantza/pi-lens

    Navigate code with IDE features and run proactive LSP diagnostics on files/folders/batches.

    463 GitHub stars~1.6k tokensUpdated today
    Auto-check passed
  • Retro

    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…

    463 GitHub stars~531 tokensUpdated today
    Auto-check passed

Questions about Release QA

What does Release QA do?

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.

When should I use Release QA?

Release QA fits situations like: tasks that involve Feature launches and release readiness.

How do I install Release QA in Claude Code?

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.

How do I install Release QA in Codex?

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.

Can I use Release QA in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Release QA need to run?

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.

Does Release QA access the network?

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.

Is Release QA safe to install?

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.

What licence does Release QA use?

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.

How many tokens does Release QA use?

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.

What are the alternatives to Release QA?

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.

Who maintains Release QA?

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.