Forbidden invocations
NEVER invoke /sdd-* skills from this workflow. SDD is an optional
user-installed ceremony; this skill ships self-contained and does not chain
SDD under any condition. If you need to refactor KATA, fixtures, cli/,
scripts/, or api/schemas/ pipeline, exit this skill first and invoke
/framework-development — which itself runs Plan → Code → Verify → Archive
natively (no SDD required).
This boundary is mechanical, not advisory: scripts/lint-skills.ts rejects
any /sdd- mention outside this section. See:
.agents/skills/agentic-qa-core/references/skill-composition-strategy.md §4
(governs users who manually install SDD).
Test Documentation — QA Bridge
Take already-validated tests and formalize them in the TMS (Jira, Xray, or equivalent) with full traceability, the right priority, and a clear automation verdict.
Three phases, always in this order: Analyze -> Prioritize (ROI) -> Document. Never skip prioritization: most scenarios should end up Deferred, not automated.
One hard prerequisite: the tests being documented must describe behavior that was already validated ({{jira.status.story.qa_approved}} story, closed bug, or finished exploratory session). The TMS is a documentation and regression-protection tool, not an exploration tool.
Dependencies
Requires agentic-qa-core. Loads on demand:
agentic-qa-core/references/test-design-doctrine.md— MANDATORY before deriving TCs from acceptance criteria. Governs the 1:N TC explosion, the formal-technique triggers, and the floor-not-ceiling coverage model. EP + BVA are operationalized here against the canon.agentic-qa-core/references/defect-management-doctrine.md— MANDATORY before parenting a Test or raising an Improvement. Governs QA process-epic parenting (everyTesthangs from the QA Test Repository epic, Part 4), the mandatorycomponentsaxis (Part 3), and the Improvement bridge for under-specified ACs (Part 1). This skill files no Bugs.agentic-qa-core/references/briefing-template.md,agentic-qa-core/references/dispatch-patterns.md,agentic-qa-core/references/orchestration-doctrine.md,agentic-qa-core/references/session-management.md,agentic-qa-core/references/preflight-gate.md,agentic-qa-core/references/traceability-linking.md— cited inline by the sections that use them.
Compact Rules
Test-design doctrine (binding — full canon: agentic-qa-core/references/test-design-doctrine.md):
- Documenting an AC→TC map is the FLOOR (≥1 TC per AC is a minimum, never a target). Coverage = AC-conformance + risk-beyond-AC; the TC set must include boundary / negative / state / anomaly cases the AC is silent on.
- 1:N applies to DERIVATION (consider many cases by technique), not to the REGRESSION repository. Only regression-worthy scenarios (Candidate/Manual) are persisted there; most are Deferred. jira-native: Stage 4 CREATES
Tests for those only (Deferred = report-only). jira-xray: sprintTests already exist (Stage 1) — Stage 4 PROMOTES the regression-worthy into the Test Plan + enriches them. Document because it will be re-run, never to hit a count. - Apply techniques by trigger: EP always; BVA wherever a range/limit/length/date-window exists; State-Transition for stateful entities; Decision Table when 2+ conditions interact; Pairwise when 3+ combinable factors.
- Parametrize for artifact economy: same-behavior data variants → ONE Test (
Scenario Outline+Examplesrows) per partition, NOT N separate Tests; split only when action / outcome / status / state differs. (Canon: doctrine §"Part 2.5".) - Cross-cutting characteristics (XSS, perf, a11y) deferred to app-level suites are an EXPLICIT handoff, not a silent drop — name the receiving suite or file the gap.
Test-documentation operational rules:
- Documents already-validated behavior only — not an exploration tool (exploration belongs to
/sprint-testing). - TC identity = Precondition + Action + verifiable outcome. Naming (TC):
{US_ID}: TC#: should <expected outcome> [<connector> <condition>] [given <precondition>];Validate <feature>is reserved for the GROUPING layer (Test Set summary /describe()). Reject"Login test","Login - error","TC1: Test form". - ROI formula → one of three verdicts per TC: Candidate (feeds test-automation), Manual, Deferred. Prioritize by risk.
- Cardinality: US→TC is 1:N; AC→TC is N:1 or N:M. Resolve TMS modality (Xray vs Jira-native) in Phase 0 before documenting.
- Bug-driven (GOLDEN RULE): not every bug is a regression TC, but a regression-worthy bug MUST end with a Test — REUSE the existing failed Test if it came from one, else CREATE one (both modalities). A non-qualifying bug is treated like a failed test → Deferred, no new Test.
Read full SKILL.md when: resolving TMS modality, computing ROI, writing Gherkin, or wiring US-ATP-ATR-TC traceability links.
Mode routing
Resolve mode before the readiness preflight and Phase -1 session workflow.
repair-traceability: selected only by the legacyfix-traceabilityalias or an explicit request to repair a ticket's existing traceability. Forward$ARGUMENTSunchanged and load onlyreferences/repair-traceability.md. Preserve its sealed sequence: audit -> present plan -> explicit user approval -> apply -> verify. Do not start Analyze -> Prioritize -> Document, create unrelated test cases, or broaden the ticket scope.document(default): normal TMS documentation, ROI, and Candidate/Manual/Deferred work. Continue with the workflow below.
If the user has not supplied the ticket key required by repair-traceability, ask for it before any TMS call. Missing credentials remain a hard stop under AGENTS.md Critical Rule #10.
Subagent Dispatch Strategy
Orchestration & Session contracts: this skill follows
agentic-qa-core/references/orchestration-doctrine.md(mandatory subagent dispatch — main thread is command center) ANDagentic-qa-core/references/session-management.md(Phase 0 resume check, plan-first persistence at.session/<skill-slug>/<scope>/, archive on completion). Phase 0 (resume check) and Phase 1 (plan write) are NOT optional. The orchestrator also applies the per-stage Definition-of-Done gates inagentic-qa-core/references/stage-gates.md: verify a stage's DoD (planning stages include the Test-Design Checklist) BEFORE recording its progress checkpoint and advancing.
This skill is per-scope: <scope> = <JIRA-KEY> (ticket / bug scope), <module-slug> (module scope), or <YYYY-MM-DD>-adhoc (ad-hoc scope). Session state lives at .session/test-documentation/<scope>/{plan.md, progress.md} per agentic-qa-core/references/session-management.md §3 + §9.
Naming collision note: this skill already owns ## Phase 0 — Resolve TMS modality (the TMS gate). The session resume check is therefore named ## Phase -1 — Session resume check to avoid colliding with the existing Phase 0 anchor. Resume fires FIRST, then the TMS modality gate, then the rest of the pipeline.
This skill is compliant with the doctrine in AGENTS.md §"Orchestration Mode (Subagent Strategy)" and the session contract in .agents/skills/agentic-qa-core/references/session-management.md. Every dispatch follows the 7-component briefing format defined in .agents/skills/agentic-qa-core/references/briefing-template.md, and the pattern selected per phase matches the decision guide in .agents/skills/agentic-qa-core/references/dispatch-patterns.md. Phase 1 (Analyze) and Phase 2 (Prioritize) stay inline because planning and decisions live in the orchestrator; the only Parallel hotspot is bulk TC creation in Phase 3, which is also the only step that branches per TMS modality.
| Phase | Pattern | Subagent role |
|---|---|---|
| Phase -1 — Session resume check | inline | orchestrator only; reads .session/test-documentation/<scope>/progress.md if present, offers resume / restart / abort per agentic-qa-core/references/session-management.md §4 |
| Phase 0 — Resolve TMS modality | inline | orchestrator only; existing 4-step probe — unchanged |
| Phase 1 — Analyze scope | Single | inline — planning lives in the orchestrator (anti-pattern to delegate) |
| Phase 2 — ROI / Candidate-Manual-Deferred verdict | Single | inline — decisions live in the orchestrator |
| Phase 3 — TMS TC creation (N > 10 TCs) | Parallel | M subagents, chunks of ~5-10 TCs per agent; cap = 10 to avoid Jira/Xray rate limits; each subagent loads /xray-cli (Modality jira-xray) or /acli (Modality jira-native) |
| Phase 3 — TMS TC creation (N ≤ 10 TCs) | Single | inline — dispatch overhead is not justified for small batches |
| Phase 3 — Traceability linking (US <-> ATS/ATP/ATR <-> TCs) | Single | inline — requires aggregated state of all created entities |
| Phase 3 — Final report / coverage matrix | Single | inline — synthesis lives in the orchestrator |
- Concurrency cap = 10 subagents for Parallel TC creation. Jira and Xray APIs both rate-limit at ~10 writes/sec sustained; fanning out wider triggers 429 responses. If a module has >100 TCs, batches per subagent must be larger than 10 each (cap is on subagent count, not chunk size).
- Error protocol: On any subagent failure: STOP, report the partial success state (which TCs landed, which failed, with their issue keys / errors), present retry / skip / abort options. Do NOT auto-fix nor auto-rollback. See
.agents/skills/agentic-qa-core/references/orchestration-doctrine.md.
Readiness Preflight Gate (MANDATORY — runs before Phase -1)
Full doctrine:
agentic-qa-core/references/preflight-gate.md. Runs FIRST, before the resume check and before the TMS-modality gate. Two laws: (1) args-as-answers — the scope (module / ticket / bug / ad-hoc) and any stated modality are provided args; ask only the gaps. (2) probe, don't assume. Surface gaps + REDs as ONEAskUserQuestionchecklist; self-fix with approval + explanation; STOP on any blocking RED. This skill documents already-validated behavior in the TMS — it does NOT execute against a live system, so its gate centers on TMS write capability. Generic baseline (env resolution, test-user creds, secret/restart handling, the two laws, output contract) is inherited from the reference §3.1 — not repeated here. Below is only this skill's specific capability delta.
| Capability | Need | Why here |
|---|---|---|
Issue-tracker ([ISSUE_TRACKER_TOOL]) |
REQUIRED | TC / ATP / ATR creation, linking, transitions. Load /acli; validate via bun run jira:check. |
TMS modality + [TMS_TOOL] |
REQUIRED | The whole Phase 0 gate. jira-xray → /xray-cli loaded + XRAY_* creds set + Xray issue types present. jira-native → /acli covers it. Resolve before Phase 1; ask only if all auto-checks fail. |
| Source repos readable | OPTIONAL | Phase 1 source-code validation reads backend/frontend code, not a running env — no live-env or DB/API/browser probe needed. |
Active env, test-user creds, DBHub, OpenAPI/API_TOKEN, Playwright, resend and kata-manifest.json (an automation-only concern owned by /test-automation) are N/A — documentation never hits a live system nor writes test code. After the gate clears (all REQUIRED GREEN), continue to Phase -1 below.
Phase -1 — Session resume check (MANDATORY, inline)
Runs BEFORE Phase 0 (TMS modality gate). Compute prospective <scope> from invocation: <JIRA-KEY> for ticket/bug scope, <module-slug> for module scope, <YYYY-MM-DD>-adhoc for ad-hoc. Then:
- Check
.session/test-documentation/<scope>/progress.md. - If it does NOT exist → proceed to Phase 0 (TMS modality).
- If it DOES exist:
- Read
plan.md(chosen scope, TMS modality, TC list, ROI verdicts). - Read tail of
progress.md(last completed phase + next planned phase). - Surface to the user: scope, TMS modality, last completed phase, next phase, any pending TC creation chunks that did not finish (the most common interruption point — Phase 3 parallel bulk create capped at 10 subagents).
- Offer resume / restart / abort. On
restart, archive to.session/.archive/<YYYY-MM-DD>-test-documentation-<scope>-aborted/first.
- Read
Critical resume case: Phase 3 parallel bulk create interrupted mid-batch. The progress.md records per-chunk completion (one entry per Parallel subagent return), so resume skips already-created TCs by reading the chunks marked completed and dispatching only the missing chunks. This is why per-subagent checkpoint matters (see Phase 3 below).
Phase 0 — Resolve TMS modality (mandatory gate)
Every project runs in one of two modalities. Resolve it before Phase 1. The same ATP/ATR/TC concepts have different containers in each mode.
The question you MUST answer first
Does this project have Xray installed and licensed on Jira?
A. Yes -> Modality jira-xray
B. No -> Modality jira-native (no Xray)
How to resolve it without asking (in order)
- Check
AGENTS.mdfor{{TMS_CLI}}. Valuebun xray(or any Xray CLI) -> Modality jira-xray. Value is unset,acli-only, or{{TMS_CLI}}matches{{ISSUE_TRACKER_CLI}}-> Modality jira-native. - If
AGENTS.mdis ambiguous, look for a.context/master-test-plan.mdline such asTMS: Xray on JiraorTMS: Jira native. - If still ambiguous, list existing issue types in the project via
[ISSUE_TRACKER_TOOL] List issue types. If the project exposesTest Plan/Test Execution/Test Set/Pre-Condition, it is Modality jira-xray. Otherwise Modality jira-native. - Only if all three checks fail, ask the user the question above. Do NOT ask by default — autoresolve first.
What changes per modality
| Artifact | Modality jira-xray | Modality jira-native |
|---|---|---|
| ATP (Acceptance Test Plan) | Test Plan issue titled ATP: {STORY-KEY}: {story title}, parented to the QA Master Test Plan epic, linked to the US |
Same Test Plan issue by excellence (native Jira work type, Xray-independent); falls back to the Story {{jira.acceptance_test_plan}} field (then a ## Acceptance Test Plan (ATP) comment) only when the Test Plan work type is absent from the instance. |
| ATR (Acceptance Test Results) | Test Execution issue with Test Runs per TC, Environment, Begin/End Date, titled ATR: {STORY-KEY}: Story Testing, parented to the QA Test Artifacts epic |
Same Test Execution issue by excellence; falls back to the Story {{jira.acceptance_test_results}} field (then a ## Acceptance Test Results (ATR) comment) only when the Test Execution work type is absent from the instance. |
| TC (Test Case) | Xray Test issue (type Manual / Cucumber / Generic) |
Jira-native Test issue type (or Task with custom type), Description carries the full TC template |
| ATS (Acceptance Test Set) | Test Set issue titled ATS: {US_ID}: {story title}, mandatory per Story — holds ALL the Story's TCs (membership Xray-internal), linked to the US (is tested by — the coverage-panel link) |
Same Test Set issue when the work type is present — membership expressed as TC→ATS issue links (the "membership is never a link" rule is xray-only). Work type absent → no ATS: direct TC→Story links (cascade last resort) |
| TS / Precondition / Test Plan | First-class Xray issue types (TS: feature Set is optional grouping) |
Same native work types when present in the instance; absent → use labels + Epic grouping |
| Result sync | CI imports JUnit/Cucumber via [TMS_TOOL] Import Results -> Test Runs auto-update |
Custom script updates Test Status field on each TC + comment with build context |
| CLI tag | [TMS_TOOL] resolves to bun xray or equivalent |
[TMS_TOOL] falls through to [ISSUE_TRACKER_TOOL] (acli / Jira MCP) |
Persist the decision
Once resolved, save the modality into .session/test-documentation/<scope>/plan.md §Inputs (canonical session record) and ALSO mirror to test-session-memory.md for the ticket (if one exists, for per-ticket sub-agent context). Treat as sticky: do not re-resolve mid-session. If you detect drift (e.g. [TMS_TOOL] suddenly fails), stop and ask the user before re-resolving.
Reference implementations:
- Modality jira-xray concepts + Xray REST/GraphQL/CLI ->
references/xray-platform.md - Modality jira-native project setup (Test issue type, Screen Scheme, custom fields) ->
references/jira-setup.md - Both modes side-by-side (field mapping, workflow, Description template) ->
references/jira-test-management.md
When to use each scope
Pick the scope based on the input, not the output. All four scopes share the same Analyze -> Prioritize -> Document pipeline; only the input source and defaults differ.
| Scope | Input | Typical volume | Default labels | Notes |
|---|---|---|---|---|
| Module-driven | A module of the system explored end-to-end | 20-100+ scenarios | regression, e2e or integration |
Batch of TCs grouped under the Regression Epic. Most scenarios will be Deferred. |
| Ticket-driven | A QA Approved user story from a sprint | 3-8 scenarios | regression, plus the test type |
Output of a sprint-testing session. ATP/ATR created per US. |
| Bug-driven | A closed bug with a verified fix | 0-2 scenarios | regression, automation-candidate (usually) |
Run the Bug-driven decision (below). Not every bug qualifies; if it does, reuse the existing failed Test or create one — an important bug must end with a Test. ROI biased up: "it failed once, it can fail again." |
| Ad-hoc / Exploratory | New scenarios found in exploratory testing | 1-10 scenarios | regression |
Apply the 3 Phase-0 questions harshly; ad-hoc scenarios are often one-time validations. |
If the user gives you a story ID, use ticket-driven. If they give you a bug ID, use bug-driven. If they give you a module name or a session output, use module- or ad-hoc accordingly.
Bug-driven decision — "an important bug must have a test" (GOLDEN RULE)
Not every bug becomes a regression Test — a one-time typo in a stable area is treated like a failed test (the fix was verified in sprint-testing) and Deferred. But run the same analysis + prioritization you'd run on any scenario; if the bug IS regression-worthy, it MUST end with a Test that covers it, in BOTH modalities. Where there is an important bug, there must be a test that catches it again — this rule is worth gold.
1. Is this Bug/Defect a regression candidate? (apply Phase-0 filter + ROI; the prior-bug rule biases up)
NO -> No new Test. Treat as a failed test: fix already verified in sprint-testing -> log as Deferred. Done.
YES -> step 2.
2. Was the bug found FROM an existing, already-executed Test? (a Test that ran and failed — jira-native OR xray)
YES -> REUSE that existing Test for the bug's retest + regression. It already lives in the test set;
ensure it is linked to the bug (`tests / is tested by`) and promoted into regression. Do NOT duplicate.
NO -> CREATE + design the corresponding Test for the bug's retest.
jira-native: new `Test` issue. jira-xray: new Xray `Test` (+ plugin-appropriate Test Plan / Test Set linking).
Link to the bug via `tests / is tested by`.
This overrides sprint-testing's "the bug is the test case" — that phrase covers only the immediate in-sprint retest, NOT future regression. The retest reproduces+verifies the fix now; this rule decides whether a persistent Test must exist (reuse or create) so the bug can never silently return.
Scope handoff to /test-automation. The Candidate TCs produced here flow downstream to /test-automation, which re-scopes them into its own 3 planning scopes: module-driven → Module (Macro), ticket-driven → Ticket (Medium), bug-driven → Regression-driven (Micro). ad-hoc / exploratory Candidates have no 1:1 automation scope — they enter under whichever fits (a module batch, or regression-driven for a single TC). Manual and Deferred verdicts are terminal and never reach automation.
After scope confirmation, write .session/test-documentation/<scope>/plan.md per agentic-qa-core/references/session-management.md §6 — Goal (scope + TMS modality + expected TC count), Inputs (PBI references, ATP source, prior bugs), Approach (per-phase dispatch table above), Phase breakdown (Phase 1 Analyze → Phase 2 Prioritize → Phase 3 TC creation with chunk count → Traceability → Final report), Risks, Verification checklist (all TCs created with traceability + coverage matrix written), Cross-references (.context/PBI/epics/EPIC-<KEY>-<slug>/stories/STORY-<KEY>-<slug>/test-cases/*.md per-TC files + .context/reports/ coverage matrix). Append ## Phase -1 — Session resume check — <ts> with status: completed, next: Phase 0 — Resolve TMS modality to progress.md.
Phase 1 — Analyze
Inputs you must gather
| Source | What to read | Why |
|---|---|---|
| User Story / Epic | Description, ACs, comments, linked issues | Scenario identification, risk signals |
| Closed bugs linked to the story | Summary, root cause, fix area | Prior-bug prioritization rule |
| Exploratory session notes | Validated scenarios, observations | Reuse nomenclature already used |
| Existing ATP (if present) — modality-aware (see §Phase 0) | jira-native: Story field {{jira.acceptance_test_plan}} → synced .context/PBI/epics/EPIC-<KEY>-<slug>/stories/STORY-<KEY>-<slug>/acceptance-test-plan.md (read-only Jira cache — sync via bun run jira:sync-issues get <STORY> --include-comments). jira-xray: Test Plan issue description → bun run jira:sync-issues get <ATP_KEY> → test-plans/ATP-<KEY>-<slug>.md (acronym prefix = conforming ladder title; a non-conforming title keeps the legacy TESTPLAN- / TESTEXEC- / RETESTEXEC- prefix); per-TC run state via [TMS_TOOL] (xray-cli) |
Scenarios may already exist — do not reinvent |
| Existing ATR (if present) — modality-aware (see §Phase 0) | jira-native: Story field {{jira.acceptance_test_results}} → synced acceptance-test-results.md (same jira:sync-issues get <STORY> --include-comments). jira-xray: Test Execution issue description → bun run jira:sync-issues get <ATR_KEY> → test-executions/ATR-<KEY>-<slug>.md (sync supports these types); per-TC run results via [TMS_TOOL] (xray-cli) |
Prior run results — do not re-execute what is already recorded |
| Implementation plan / source code | Actual files, APIs, test IDs | Validate design matches implementation before documenting |
.context/business/domain-glossary.md (if present) |
Canonical entity + process names, anti-glossary banned terms | Vocabulary reference for TC names, steps, and preconditions — terms must match the glossary |
Separate real scenarios from cross-cutting characteristics
Cross-cutting traits are validated inside every test, not as separate TCs.
| Cross-cutting (NOT a TC) | Validated by |
|---|---|
| Mobile responsive | Running each test in mobile viewport |
| XSS prevention | Using special-character test data inside tests |
| Performance | Timing assertions inside tests |
| Accessibility | A11y assertions inside UI tests |
| API contract | Response schema checks inside API tests |
| Generic "error handling" | Specific negative-path scenarios |
Deferral ≠ omission. Moving a cross-cutting trait out of per-feature TC scope is an explicit handoff, not a silent drop. Each row must land somewhere: woven into a TC's data/assertions (the table above) OR owned by a named app-level suite (XSS / perf / a11y regression suite). If no such suite exists for a trait the feature genuinely exposes, file the gap (Deferred TC or a note in the ATR) — never let it evaporate.
A real scenario is a user flow: clear business objective, concrete precondition + action, verifiable outcome. The TC name uses the should form — {US_ID}: TC#: should <expected outcome> [<connector> <condition>] [given <precondition>]; reserve Validate <feature> for the GROUPING layer (Test Set summary / describe()), never for the individual case.
Source-code validation (mandatory before documenting)
The design in the ATP was written before code existed. Before creating any TC:
- Open the implementation plan (if any) and list the files it touches.
- Grep the actual code for
data-testid=, route handlers, API paths, and text formats. - Compare the ATP's assumptions against what the code does. If they diverge, correct the TC design and add a Refinement Notes section.
Common discrepancies to check for:
- An API the ATP assumed exists turns out to be SSR/direct DB.
- UI text format in the ATP ("based on N reviews") vs reality ("(N reviews)").
- Hardcoded IDs in the ATP vs variable pattern required in TMS.
Skipping this step is the single most common cause of invalid automated tests later.
TC identity rule (load-bearing)
A TC is defined by Precondition + Action. All expected results from the same (precondition, action) pair belong to the same TC, not separate TCs.
Same TC: Different TCs:
Precondition: valid credentials Precondition: valid credentials -> TC-A
Action: submit login Precondition: locked account -> TC-B
Assertions: redirect + token + welcome Precondition: invalid credentials -> TC-C
(all one TC) (all same action, but preconditions differ)
Splitting one (precondition, action) into N "check panel A / check panel B / check panel C" TCs is a textbook anti-pattern. One TC, multiple assertions.
Technique-driven TC derivation (1:N — full canon: agentic-qa-core/references/test-design-doctrine.md)
One AC yields multiple TCs by default. Derive them by the AC's shape, then let the TC-identity rule above merge only within a partition — never across partitions, boundaries, or states. Reduce an AC to a single TC only with a written trivially atomic justification.
| Trigger in the AC | Technique | TCs produced |
|---|---|---|
| Any input (always) | Equivalence Partitioning | same-output inputs → one parameterized TC (Scenario Outline + Examples); different-output inputs → separate TCs |
| A range / limit / length / date-window | Boundary Value Analysis | TCs at min-1·min·min+1 … max-1·max·max+1 + zero / empty / null / overflow (EP alone misses off-by-one) |
| A status / lifecycle field | State-Transition | one TC per valid transition + per invalid transition |
| 2+ interacting conditions | Decision Table | enumerate combos, collapse equivalents, one TC per surviving rule |
| 3+ combinable factors | Pairwise | all-pairs TC set (log the reduction) |
These are candidate scenarios derived by technique — not yet TMS work items. ROI (Phase 2) then decides which become persistent regression TCs (Candidate → automated, Manual → manual) and which stay Deferred (recorded in the prioritization report, NOT created in the TMS). Deriving widely is free; persisting is ROI-gated — most scenarios are Deferred. You document a scenario because it will be re-run, never to hit a count.
Improvement bridge (
agentic-qa-core/references/defect-management-doctrine.mdPart 1). When a test-beyond-AC exposes a gap because the AC was under-specified or absent — the system violated no defined criterion — the right artifact is an Improvement issue (filed per the doctrine, or delegated to/sprint-testing), NOT a regression TC and NOT a silent widening of the Story's ACs. Track the proposal as an Improvement; do not edit the Story's AC set after the fact.
Phase 2 — Prioritize (ROI)
Every scenario passes three gates in order. Fail any gate -> Deferred.
Phase 0: The three filter questions
- Does it protect against FUTURE regressions? If the bug was a one-time typo in a stable area, the answer is no. Defer.
- Are there PRIOR bugs in this area? Yes -> prioritize even with moderate ROI ("it failed once, it can fail again").
- Is it an APP-level concern or a FEATURE-level concern? XSS / a11y / performance / responsive are APP-level suites, not per-feature TCs. Defer from this scope.
ROI formula (load-bearing)
ROI = (Frequency x Impact x Stability) / (Effort x Dependencies)
Each factor is scored 1-5 independently:
| Factor | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| Frequency (how often run) | Yearly / rarely | Every release | Every sprint | Daily | Every PR / commit |
| Impact (if it fails) | Cosmetic | Minor inconvenience | Degrades UX | Blocks feature | Revenue / core business |
| Stability (of the flow) | Very volatile | Unstable | Moderate | Stable, minor changes | Unchanged for months |
| Effort (to automate) | Trivial | Low (hours) | Moderate (1-2 days) | High (several days) | Very high (week+) |
| Dependencies | None | 1-2 simple | 3-4 | 5+ | Complex externals |
Note: Effort and Dependencies are divisors — higher score = worse. The other three are multipliers.
Component value bonus
If a TC is reusable across multiple E2E flows:
Component Value = Base ROI x (1 + 0.2 x N)
where N = number of E2E flows that consume it. A low-ROI atomic like authenticateSuccessfully can become automate-worthy purely through reuse.
Three outcomes (load-bearing)
Every scenario ends in exactly one of these buckets. There is no fourth.
| Outcome | Triggers it | Where it goes next | TMS status flow |
|---|---|---|---|
| Candidate | ROI > 3.0, OR (ROI 1.5-3.0 AND prior bug), OR critical happy path | Feeds test-automation skill |
Draft -> In Design -> READY -> In Review -> Candidate |
| Manual | ROI 0.5-1.5 AND not automatable (human judgment, visual inspection), OR explicitly manual-only | Terminal: manual regression suite | Draft -> In Design -> READY -> MANUAL |
| Deferred | ROI < 0.5, OR failed Phase-0 filter, OR one-time validation, OR it matched neither row above (Deferred is the default bucket: ROI under 3.0 with no prior bug and no critical-path justification lands here) | Terminal: not in regression. Can be revisited if system changes | jira-native: do not create a TC in the TMS — document as Deferred in the prioritization report. jira-xray: the sprint Test (created in /sprint-testing Stage 1) is not promoted to the Regression Test Plan — it stays as a sprint execution artifact, not deleted. |
Band authority: the three outcomes above are the TMS-action collapse of the 5-band table in
references/tms-conventions.md§9 ("ROI decision thresholds (strict)"). That table is the authority on band boundaries and it resolves the middle bands explicitly —1.5-3.0is "Case by case: prior bug? critical flow? If no, defer",0.5-1.5is "Probably defer: include only if prior bug". Read it whenever a score falls between0.5and3.0.
Rule of thumb: if more than 50% of candidates end up Candidate or Manual, re-apply Phase 0 more strictly. Most scenarios should be Deferred.
Modality changes the verb in Phase 3, not the verdict here. The ROI verdicts (Candidate / Manual / Deferred) are identical in both modalities. What differs is the action: jira-native — Phase 3 creates
Testwork items for Candidate + Manual only (Deferred is report-only). jira-xray — theTestwork items already exist from/sprint-testingStage 1 (Xray'sTestis the execution unit); Phase 3 selects + promotes the Candidate/Manual ones into the Regression Test Plan (labelregression-candidate) and enriches them (rich Gherkin, parameterization, edge elaboration — the "specify much more" pass). Deferred sprint Tests are left as-is, unpromoted. Seesprint-testing/SKILL.md§"TC creation timing (modality-aware)".
Phase 3 — Document in TMS
Preflight: Regression Epic
Every documented TC must have a parent Regression Epic (single test repository for the project).
This Regression Epic IS the QA Test Repository process epic (
agentic-qa-core/references/defect-management-doctrine.mdPart 4). Resolve it found-or-created by the configured nameqa.qa_epics.test_repository_epic.name("QA Test Repository"); on absence create it once, write the test-repository strategy into its description, and cache its key into.agents/project.yamlqa.qa_epics.test_repository_epic.key. It is a QA process epic — never a product/dev epic, never unparented. Per the three-axis model this parent says only "which QA bucket tracks the Test"; the Test's product area travels oncomponents(Part 3) and its Story coverage travels on the issue link (Part 4) — never on this parent.
Prerequisite: Load
/acliskill before executing commands below.
[ISSUE_TRACKER_TOOL] Search Issues:
project: {{PROJECT_KEY}}
query: type = Epic AND summary ~ "QA Test Repository" # resolve by configured name qa.qa_epics.test_repository_epic.name
If none exists, ask the user before creating one with name QA Test Repository (the value of qa.qa_epics.test_repository_epic.name) and labels QA-Artifact, regression (QA-Artifact is the mandatory identity label on every QA process epic).
Preflight: Test Sets — ATS (mandatory per-Story) + TS (optional feature grouping)
Two Set altitudes — do not conflate:
- ATS (Acceptance Test Set) —
ATS: {US_ID}: {story title}— mandatory per Story, even when the Story has a single TC. Holds ALL the Story's TCs and anchors coverage: the ATS→Storyis tested bylink is what fills the Xray coverage panel (ATP/ATR links do NOT — live-verified 2026-08-21, see.session/artifact-ladder-refactor/scoping.md§Verificación). Parented to QA Test Artifacts;componentsinherited from the Story — mandatory (the components exemption applies to feature-levelTS:only). Phase 3 is Set-first: find-or-create the Story's ATS, add the TCs to it, THEN derive the ATP's and the Execution's test lists from the ATS membership. - TS (feature-level Test Set) —
TS: <EPIC_KEY|module>: Validate <feature>— optional grouping (smoke / regression / feature suite), 1:1 with the Epic/module.componentsoptional here — a feature Set spans modules by design. Ask the user before creating one (mirror the Regression-Epic ask-before-create rule — creation is otherwise async/manual; the AI only creates it lazily here when a promotion needs it). Only promoted, regression-worthy Tests (Candidate/Manual) are added to the feature TS — Deferred sprint Tests are NOT added.
Containers: Regression Epic = repository umbrella · ATS = per-Story coverage set · TS = optional feature grouping · Test Plan = execution/regression scope.
- Modality jira-xray: resolve/create Sets via
[TMS_TOOL]; TC∈Set membership is Xray-internal (GraphQL) — NEVER a Jira issue link. The ATS→Storyis tested byedge IS a Jira issue link and is mandatory. - Modality jira-native: instance has the Test Set work type → create the ATS item and express membership as TC→ATS issue links (explicit carve-out: the "membership is never a link" rule is xray-only) plus the ATS→Story link. Work type absent → no ATS: link each TC to the Story directly (
is tested by— the cascade's last-resort path) and keep feature grouping via the Regression Epic + a feature/Epic label (e.g.epic-<EPIC_KEY>or the feature slug).
Entity model: ATP / ATR / ATS / TC
Five entities. Traceability model: the Story links to its ATS, ATP and ATR ("is tested by"), but only one of those edges carries coverage — the ATS→Story link is what fills the Xray coverage panel; the ATP→Story and ATR→Story links are administrative traceability and contribute ZERO coverage (live-verified 2026-08-21, .session/artifact-ladder-refactor/scoping.md §Verificación). The ATP "designs" the TCs (TC "is designed by" ATP) and the ATR "executes" the TCs (TC "is executed by" ATR). A direct TC→Story link is the cascade's LAST RESORT (used when no ATS exists — e.g. jira-native without the Test Set work type), not the default: TCs normally aggregate through the ATS. The defect is a TC with NO path to its Story, not the direct link itself. Full doctrine: agentic-qa-core/references/traceability-linking.md + references/tms-architecture.md.
| Entity | Created | Naming | Main content |
|---|---|---|---|
| US (Story) | Pre-existing | {{PROJECT_KEY}}-{n} |
The requirement |
| ATP | Content pre-sprint in {{jira.acceptance_test_plan}} (shift-left); the Test Plan ITEM by /sprint-testing Stage 1 from that field — or by this phase (find-or-create) when running module-driven and no Story ATP item exists |
ATP: {STORY-KEY}: {story title} |
Test Analysis + AC-to-TC coverage |
| ATR | Stage 1 (or now, if missing) | ATR: {STORY-KEY}: Story Testing |
Test Report + execution results |
| TC | Stage 4 (this phase) | {US_ID}: TC#: should <expected outcome> [<connector> <condition>] [given <precondition>] |
Precondition + Action + Expected |
| ATS | Stage 1 (or now, find-or-create — MANDATORY per Story) | ATS: {US_ID}: {story title} |
ALL the Story's TCs (even one). Coverage anchor: ATS→Story is tested by fills the coverage panel. Components inherited from the Story (mandatory). Parent: QA Test Artifacts. |
| TS (optional) | Lazily in Stage 4 if a promotion needs it (ask first); else pre-existing (async) | TS: {EPIC-KEY|module}: Validate {feature} |
OPTIONAL feature-level grouping (1:1 Epic) of promoted regression Tests — smoke/regression suites. Components optional: a feature Set spans modules by design. Native without the work type: replaced by a feature/Epic label, no entity. |
Read references/tms-architecture.md when creating ATP/ATR/TC for a ticket, checking required links, or validating that a story is fully documented.
Linking order (always — Set-first)
1. Find-or-create the Story's ATS -> link to US (Story "is tested by" ATS — the coverage-panel link)
2. Find-or-create ATP (pre-sprint content lives in {{jira.acceptance_test_plan}}; the item usually
exists from /sprint-testing Stage 1 — create here only when module-driven and no ATP item exists)
-> link to US (Story "is tested by" ATP — administrative, no coverage)
3. Create ATR -> link to US (Story "is tested by" ATR — administrative, no coverage)
4. Update ATP -> link to ATR (bidirectional plan/results)
5. For each TC:
Create TC -> add to the ATS
…(truncated)