Portable QA skill pack for AI coding agents: FE/API test-case prep (AC/EC + Swagger coverage review), Playwright ticket testing, defect filing, and Jira retest. Works in Claude Code, Cursor, Codex, GitHub Copilot, Gemini CLI, Windsurf, Cline, and Agent Skills–compatible tools.
SaferSkills independently audited helix (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Show the menu and route to the correct workflow skill. The command commands/helix.md loads this skill; the rules live here only.
Respond in the user's language (see user-communication.md) — menus, questions, and replies follow the language the user writes in; keep technical terms, file names, and ticket keys as written. Be concise.
Decide what to show in this order — the first step that applies wins:
/helix {ISSUE_KEY}). Infer the workflow only when the same message also contains a phrase from intent-shortcuts.md (e.g. {ISSUE_KEY} API test cases from Swagger → 2). A bare key or URL alone never picks a workflow: show the menu and ask which option applies to that key.🔴 STOP — wait for the user's choice before starting a workflow.
Follow shared-preamble.md.
This skill only routes — it does not run tests or post to Jira (see MUST / NEVER). When the goal is already clear, the menu is skipped (Opening step 1) because an extra menu round wastes time.
Refuse, say why in one line, and route instead when:
| Request to the router | Do |
|---|---|
Post a Jira comment, transition a ticket, or create an issue directly from /helix | Refuse the action here; route to the workflow that owns it (create-bug, retest-bug, testing-ticket) via Routing — that workflow keeps its own approval gate. |
Run tests or Playwright directly from /helix | Refuse; route to testing-ticket or retest-bug via Routing. |
| A request that is not QA work (no row in skill-routing.md or intent-shortcuts.md matches) | Say it is outside Helix's scope; show the menu once, then treat it as 12 (Other). |
Apply the trigger table in proactive-qa-triggers.md to the session context (git branch, linked Jira ticket, defects mentioned in chat):
HELIX_PROACTIVE=0 is set, or no trigger row matches, make no suggestion — show the menu.Route by the single table in skill-routing.md § Primary menu: the user's number, option name, or intent-shortcuts phrase picks one row. Do not keep a routing table anywhere else.
The first routed response does these three things in this order, once each:
Routing to 3 · Retest Bug → retest-bug-workflow (/retest-bug) for {ISSUE_KEY}. No workflow starts without this line. This is the router's own line; it does not replace the shared announce in step 3.skills/{name}/SKILL.md completely, opening with the shared announce Using **{skill}** to {purpose}. once (shared-must-never.md, skill-invocation-discipline.md), and passing on what the row says (issue key, URL, TC document, audit target).When routing cannot proceed:
| Situation | Do |
|---|---|
| Reply is not 1–12, an option name, or an intent-shortcuts phrase | Re-show the menu once; if still unclear, treat it as 12 (Other). |
| User ignores or declines a proactive suggestion (replies about something else, or says no) | Do not start that workflow. Show the menu once; do not repeat the same suggestion in this session. |
| Row 8–11 chosen outside the ols-qa workspace | Say it is not shipped in helix, then offer only that row's named fallback. |
The routed SKILL.md is missing or cannot be loaded | Say which file is missing, do not imitate the workflow from memory, and show the menu again. |
| One message names workflow A, then workflow B only if A's result calls for it (e.g. retest, then file a bug if still broken) | Route to A; record B as the handoff per skill-routing.md § Handoffs; do not ask a clarifying question. Two workflows both matching one goal is a different case — ask one question per intent-shortcuts.md. |
| Ticket lookup is unavailable (no Atlassian MCP or token) | Route anyway and ask the user to paste the ticket text or link; the child workflow handles its own intake. |
Handoffs after a workflow ends: skill-routing.md § Handoffs.
Follow qa-closing-shared.md + router-specific:
If routing only, hint the command from the Command column of skill-routing.md § Primary menu for the chosen row.
Shared rules: shared-must-never.md. Router-specific:
| Rule | Because |
|---|---|
| MUST show the menu from references/menu-text.md in the user's language | Same numbers and option names at every entry point; user-communication.md |
| MUST state the workflow it routes to before loading it | The user can correct a wrong route before any work starts |
| MUST NOT start a workflow without user picking 1–12 or naming one | Avoid wrong scope |
| MUST NOT post to Jira or create issues from this router | Side effects belong in child workflows |
The router itself reads only the first group. The second group is required by the shared rules this skill follows (shared-preamble.md, qa-closing-shared.md, shared-must-never.md); the router never reaches those steps — the routed workflow reads each one at the point its line names. Both groups stay one hop from here so no required rule is two links away.
Read while routing:
Read only when the routed workflow reaches that step:
Check these before routing — check commands and install hints are in dependencies.md:
## Dependencies section and re-checks them when it startsIf a check fails, do not stop routing: name the failed dependency in one line, give its install hint or fallback from the dependencies.md row, and still show the menu (or route a named workflow). The routed skill re-checks its own dependencies and stops there if a missing one is required.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.