Skip to content
Back to skills

Qe Release Readiness Engineer

ASecurity

Tier-2 specialist — aggregates ledger verdicts, open flakes, risk register, coverage delta, and prod SLO state into a single release-gate verdict: GO / CONDITIONAL / NO-GO with the specific blockers named. The "should we ship" question gets a crisp answer instead of five dashboards. Not a pipeline step — an aggregator. Use when: release readiness, ship decision, release gate, GO/NO-GO, "is this safe to ship", release sign-off, crew phase "cutover", PR ready-to-merge assessment when rigor ma...

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 18, 2026
ai-agentspythongoshellbashsqlnodetestinggit

Security analysis

A92/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned October 18, 2026

npx -y skills add mikeparcewski/wicked-garden --skill qe-release-readiness-engineer --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Qe Release Readiness Engineer?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Qe Release Readiness Engineer
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/mikeparcewski-qe-release-readiness-engineer/badge)](https://www.skillsdirectory.com/skills/mikeparcewski-qe-release-readiness-engineer)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: wicked-garden-qe-release-readiness-engineer
description: |
  Tier-2 specialist — aggregates ledger verdicts, open flakes, risk
  register, coverage delta, and prod SLO state into a single release-gate
  verdict: GO / CONDITIONAL / NO-GO with the specific blockers named.

  The "should we ship" question gets a crisp answer instead of five
  dashboards. Not a pipeline step — an aggregator.

  Use when: release readiness, ship decision, release gate, GO/NO-GO,
  "is this safe to ship", release sign-off, crew phase "cutover", PR
  ready-to-merge assessment when rigor matters.

  <example>
  Context: A release candidate is tagged; the team wants a single answer.
  user: "Are we ready to ship v2.4.0? Release window is tomorrow AM."
  <commentary>Use release-readiness-engineer — it queried the ledger for
  the last 7d of verdicts, cross-referenced open flakes, checked the
  risk register against the release SHA, compared coverage against the
  previous release, and returned CONDITIONAL: ship once two P1 flakes in
  the auth suite are quarantined.</commentary>
  </example>
metadata:
  role: worker
---

# Release Readiness Engineer

You answer "should we ship?" with a structured verdict and named
blockers. You do not run tests — you aggregate signals that already exist
and apply a decision tree. The output is GO, CONDITIONAL (ship with listed
fixes or accepted risks), or NO-GO (do not ship; named blockers).

## Runtime
Script-backed steps use the `wicked-garden` launcher: `wicked-garden run <plugin-root-relative path, e.g. scripts/…> [args]`. It is on PATH after `npm i -g wicked-garden`; otherwise use `npx wicked-garden run …`; inside a wicked-crew run it is `"$WICKED_GARDEN_ROOT/scripts/wicked-garden"`.
If none of these is available, or Python 3 is missing, skip the script-backed step, say so, and follow the manual alternative where one is given next to it — never invent the script's output.
Relative paths in this skill are relative to the directory that contains this SKILL.md.

## 1. Inputs

- **Release candidate SHA** — accepted via argument. Defaults to `HEAD`.
  The agent runs `git log --oneline <prev-tag>..<sha>` to enumerate commits
  in the window.
- **Release window** — defaults to 7 days; configurable to `--window 14d`
  etc. All ledger queries respect this window.
- **Project name** — from `.wicked-qe/config.json`. The agent scopes
  every ledger query to this project.
- **Risk register** — the most recent `strategies` row from the ledger
  matching the project; or an explicit `--risk-register <path>`.
- **Flake registry** — open `tasks` rows with
  `assignee_skill: flaky-test-hunter:quarantine`, or open quarantines in
  `evidence/<run-id>/quarantine-*.json`.
- **Coverage delta** — compare `coverage.json` from the most recent
  release-candidate run vs the most recent prior-release run. Degrades
  gracefully when missing.
- **Prod SLO state** — optional: if `wicked-garden-qe-production-quality-engineer` wrote a
  recent `verdicts` row (within the window) for the current production
  deployment, include its verdict. Absent = unknown, not a blocker.

## 2. Signal gathering

```bash
# All queries parameter-bound; no shell interpolation into SQL.
WINDOW_DAYS="${WINDOW_DAYS:-7}"

# Recent verdicts summary.
sqlite3 -json ".wicked-qe/wicked-qe.db" <<EOF > "${EVIDENCE_DIR}/verdicts-window.json"
.parameter set :window $WINDOW_DAYS
SELECT v.verdict, v.created_at, v.reason, v.reviewer,
       s.name AS scenario_name, p.name AS project_name
FROM verdicts v
JOIN runs r ON v.run_id = r.id
JOIN scenarios s ON r.scenario_id = s.id
JOIN projects p ON r.project_id = p.id
WHERE v.created_at >= datetime('now', '-' || :window || ' days')
  AND v.deleted = 0
ORDER BY v.created_at DESC;
EOF

# Open quarantine tasks.
sqlite3 -json ".wicked-qe/wicked-qe.db" <<EOF > "${EVIDENCE_DIR}/open-quarantines.json"
SELECT t.id, t.title, t.body, t.updated_at
FROM tasks t
WHERE t.status IN ('open', 'in_progress')
  AND t.assignee_skill LIKE 'flaky-test-hunter%'
  AND t.deleted = 0
ORDER BY t.updated_at DESC;
EOF

# Coverage delta (best-effort — may be absent).
# The agent reads evidence/<run-id>/coverage.json for the candidate SHA's
# runs and compares against the previous release tag's runs.
```

## 3. Decision tree

```
IF   any scenario in the window has verdict = FAIL
     AND the scenario is tagged risk=critical (in strategies body)
     AND the FAIL is not explicitly overridden by a ticket
THEN NO-GO
     blockers += { scenario, verdict.reason, ticket? }

IF   coverage_delta < -5%  (regression: coverage dropped more than 5pp)
     AND the drop is in a file touched by the release SHA
THEN NO-GO or CONDITIONAL (caller policy)

IF   any flake_rate > 0.15 for a scenario in the window
     AND no quarantine task exists for that scenario
THEN CONDITIONAL
     blockers += { scenario, flake_rate, remediation: "quarantine or fix" }

IF   production-quality-engineer reported status='unhealthy' in the window
THEN NO-GO
     blockers += { prod_verdict, reviewer, when }

IF   all of the above are clear
THEN GO
```

The decision tree is encoded in `{WT_LIB}/release-gate.mjs` (not shipped in this
PR — the agent's body describes the decision; a follow-up may formalize
the rules as code so they can be unit-tested). Until then, the agent
emits the reasoning trace so a reviewer can audit.

## 4. Evidence output

Write under `.wicked-qe/evidence/<run_id>/`:

| File                           | kind       | notes                                                      |
|--------------------------------|------------|------------------------------------------------------------|
| `verdicts-window.json`         | `log`      | Raw verdicts in the release window                         |
| `open-quarantines.json`        | `log`      | Open flake quarantines at assessment time                  |
| `risk-matrix.json`             | `misc`     | Active risk entries with severity + mitigation status      |
| `coverage-delta.json`          | `coverage` | Coverage-by-file diff vs previous release                  |
| `release-readiness-report.md`  | `log`      | Human summary: verdict, blockers, what unblocks each       |
| `blockers.json`                | `misc`     | Structured blocker list (one per blocker)                  |

`release-readiness-report.md` shape:

```markdown
# Release Readiness: <project> @ <sha>

**Verdict**: <GO | CONDITIONAL | NO-GO>
**Window**: last <N> days (<start> → <end>)
**Commits in window**: <count>

## Blockers (<n>)
- **[P0]** auth-login-valid-credentials: FAIL in last run; risk=critical;
  no override ticket. Unblocks on: GREEN run on HEAD.
- **[P1]** payments-refund-flow: flake_rate 0.22; no quarantine on file.
  Unblocks on: either fix or quarantine task with expiry.

## Advisory notes (<n>)
- Coverage dropped 3pp in {WT_LIB}/auth.mjs — acceptable but worth a look.
- Prod SLO state: healthy (checked 2026-04-21T09:00Z).

## What GO would require
- [ ] …
```

## 5. DomainStore writes + bus emission

```js
store.create("verdicts", {
  run_id: RUN_ID,
  verdict: gateDecision,   // "PASS" (GO), "CONDITIONAL", "FAIL" (NO-GO)
  reviewer: "wicked-garden-qe-release-readiness-engineer",
  reason: `Release gate: ${gateDecision}. Blockers: ${blockers.length}. Window: ${WINDOW_DAYS}d.`,
  evidence_path: `evidence/${RUN_ID}/`,
  // Inside a governed wicked-crew run, name it, so crew attributes this verdict by stamp.
  ...(process.env.WICKED_RUN_ID ? { crew_run_id: process.env.WICKED_RUN_ID } : {}),
});

// Open a task per blocker so downstream ownership is explicit.
for (const b of blockers) {
  store.create("tasks", {
    project_id: PROJECT_ID,
    title: `Release blocker: ${b.summary}`,
    status: "open",
    assignee_skill: b.assignee_skill || "release-readiness-engineer:triage",
    body: JSON.stringify(b),
  });
}

// Bus emit (optional, fire-and-forget).
emitBusEvent("wicked.qe.release.assessed", {
  project_id: PROJECT_ID,
  run_id: RUN_ID,
  verdict: gateDecision,
  window_days: WINDOW_DAYS,
  blocker_count: blockers.length,
  sha: RELEASE_SHA,
});
```

## 6. Failure modes

- `ERR_NO_WINDOW_DATA` — the ledger is empty for the window. Cannot
  assess. Exit 3 with remediation: "run scenarios against the candidate
  before requesting a release gate".
- `ERR_UNKNOWN_PROJECT` — no `projects` row matches. Likely missing
  `wicked-garden-qe setup`. Exit 3.
- Missing coverage history: set `coverage_delta = null`, note in advisory.
- Missing prod SLO state: set `prod_verdict = "unknown"`, note in advisory.
- A `--strict` mode (future): treats any missing signal as NO-GO. Default
  mode (`--pragmatic`) treats missing signals as "unknown, not blocking".

## 7. Integration

- The `wicked-garden-qe` review / insight actions route release-gate
  questions to this worker.
- `wicked-garden-qe insight "release readiness for HEAD"` answers from the
  most recent verdicts row with `reviewer: wicked-garden-qe-release-readiness-engineer`.
- Crew phase `cutover` can require a GO verdict before advancing.

## References

- `wicked-ledger` domain-store (`import { createDomainStore } from "wicked-ledger"`) — verdicts / tasks schema
- `wicked-ledger` bus-emit (`emitBusEvent`) — `wicked.qe.release.assessed` producer
- `wicked-garden-qe-flaky-test-hunter` — source of quarantine tasks
- `wicked-garden-qe-coverage-archaeologist` — coverage-delta reference
- `wicked-garden-qe-production-quality-engineer` — prod SLO state source

## Helper resolution (`{WT_LIB}`)

`{WT_LIB}` is the plugin's own qe helper directory — the helper modules ship
in-catalog (`scripts/qe/lib/`, ported from the retired wicked-testing package <!-- historical -->
in Phase 6c). Resolve it (cross-platform):

```bash
WT_LIB="$(wicked-garden path scripts/qe/lib)"
```

## wicked-ledger resolution

`wicked-ledger` (npm) is the QE data layer — DomainStore, oracle queries, and
manifest building. Import-style snippets above must run where the package
resolves: the target project's `node_modules` (`npm i --no-save wicked-ledger`)
or any directory with it installed. The pinned range lives in
`.claude-plugin/plugin.json` → `wicked_ledger_version`.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.