bmad-method-test-architecture-enterprise 1.21.6 → 1.21.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/.claude-plugin/marketplace.json +21 -2
  2. package/CHANGELOG.md +17 -3
  3. package/README.md +23 -20
  4. package/cli/lib/build-prompt.js +24 -1
  5. package/cli/lib/changed-tests.js +79 -16
  6. package/cli/lib/parse-report.js +1 -1
  7. package/cli/test-review.js +10 -2
  8. package/docs/explanation/tea-overview.md +4 -0
  9. package/docs/explanation/testing-as-engineering.md +1 -1
  10. package/docs/explanation/verification-architecture.md +129 -0
  11. package/docs/index.md +6 -1
  12. package/docs/reference/configuration.md +14 -10
  13. package/docs/reference/execution-targets.md +105 -0
  14. package/docs/reference/knowledge-base.md +15 -0
  15. package/package.json +13 -2
  16. package/src/agents/bmad-tea/resources/knowledge/maestro-flows.md +257 -0
  17. package/src/agents/bmad-tea/resources/knowledge/mobile-test-strategy.md +115 -0
  18. package/src/agents/bmad-tea/resources/tea-index.csv +2 -0
  19. package/src/module.yaml +11 -3
  20. package/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/maestro-flows.md +257 -0
  21. package/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/mobile-test-strategy.md +115 -0
  22. package/src/workflows/testarch/bmad-testarch-atdd/resources/tea-index.csv +2 -0
  23. package/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-01-preflight-and-context.md +5 -2
  24. package/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/maestro-flows.md +257 -0
  25. package/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/mobile-test-strategy.md +115 -0
  26. package/src/workflows/testarch/bmad-testarch-automate/resources/tea-index.csv +2 -0
  27. package/src/workflows/testarch/bmad-testarch-automate/steps-c/step-01-preflight-and-context.md +18 -4
  28. package/src/workflows/testarch/bmad-testarch-automate/steps-c/step-02-identify-targets.md +13 -0
  29. package/src/workflows/testarch/bmad-testarch-automate/steps-c/step-03-generate-tests.md +45 -6
  30. package/src/workflows/testarch/bmad-testarch-automate/steps-c/step-03b-subagent-mobile.md +161 -0
  31. package/src/workflows/testarch/bmad-testarch-automate/steps-c/step-03c-aggregate.md +13 -0
  32. package/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/maestro-flows.md +257 -0
  33. package/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/mobile-test-strategy.md +115 -0
  34. package/src/workflows/testarch/bmad-testarch-ci/resources/tea-index.csv +2 -0
  35. package/src/workflows/testarch/bmad-testarch-ci/steps-c/step-01-preflight.md +4 -1
  36. package/src/workflows/testarch/bmad-testarch-ci/steps-c/step-02-generate-pipeline.md +8 -0
  37. package/src/workflows/testarch/bmad-testarch-ci/steps-c/step-03-configure-quality-gates.md +1 -0
  38. package/src/workflows/testarch/bmad-testarch-ci/workflow.yaml +1 -1
  39. package/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/maestro-flows.md +257 -0
  40. package/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/mobile-test-strategy.md +115 -0
  41. package/src/workflows/testarch/bmad-testarch-framework/resources/tea-index.csv +2 -0
  42. package/src/workflows/testarch/bmad-testarch-framework/steps-c/step-01-preflight.md +15 -2
  43. package/src/workflows/testarch/bmad-testarch-framework/steps-c/step-02-select-framework.md +14 -0
  44. package/src/workflows/testarch/bmad-testarch-framework/steps-c/step-03-scaffold-framework.md +56 -7
  45. package/src/workflows/testarch/bmad-testarch-framework/steps-c/step-04-docs-and-scripts.md +11 -0
  46. package/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/maestro-flows.md +257 -0
  47. package/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/mobile-test-strategy.md +115 -0
  48. package/src/workflows/testarch/bmad-testarch-nfr/resources/tea-index.csv +2 -0
  49. package/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/maestro-flows.md +257 -0
  50. package/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/mobile-test-strategy.md +115 -0
  51. package/src/workflows/testarch/bmad-testarch-test-design/resources/tea-index.csv +2 -0
  52. package/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-02-load-context.md +3 -1
  53. package/src/workflows/testarch/bmad-testarch-test-design/workflow.yaml +1 -1
  54. package/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/maestro-flows.md +257 -0
  55. package/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/mobile-test-strategy.md +115 -0
  56. package/src/workflows/testarch/bmad-testarch-test-review/resources/tea-index.csv +2 -0
  57. package/src/workflows/testarch/bmad-testarch-test-review/steps-c/criteria-registry.md +31 -20
  58. package/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-01-load-context.md +11 -2
  59. package/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-02-discover-tests.md +1 -1
  60. package/src/workflows/testarch/bmad-testarch-test-review/workflow.yaml +1 -1
  61. package/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/maestro-flows.md +257 -0
  62. package/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/mobile-test-strategy.md +115 -0
  63. package/src/workflows/testarch/bmad-testarch-trace/resources/tea-index.csv +2 -0
  64. package/test/fixtures/test-review-cli/stub-agent.js +15 -1
  65. package/test/test-test-review-cli.js +107 -7
  66. package/website/astro.config.mjs +2 -0
@@ -6,13 +6,32 @@
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/bmad-code-org/bmad-method-test-architecture-enterprise",
8
8
  "repository": "https://github.com/bmad-code-org/bmad-method-test-architecture-enterprise",
9
- "keywords": ["bmad", "test-architect", "testing", "quality", "automation", "playwright", "test-engineering"],
9
+ "keywords": [
10
+ "bmad",
11
+ "test-architect",
12
+ "test-engineering",
13
+ "testing",
14
+ "quality",
15
+ "quality-gates",
16
+ "risk-based-testing",
17
+ "verification-and-validation",
18
+ "traceability",
19
+ "nfr",
20
+ "test-automation",
21
+ "automation",
22
+ "contract-testing",
23
+ "pact",
24
+ "playwright",
25
+ "cypress",
26
+ "mobile",
27
+ "maestro"
28
+ ],
10
29
  "plugins": [
11
30
  {
12
31
  "name": "bmad-method-test-architecture-enterprise",
13
32
  "source": "./",
14
33
  "description": "Master Test Architect module for quality strategy, test automation, CI/CD quality gates, and structured testing education. Part of the BMad Method ecosystem.",
15
- "version": "1.21.6",
34
+ "version": "1.21.7",
16
35
  "author": {
17
36
  "name": "Murat K Ozcan (TEA Creator) & Brian (BMad) Madison"
18
37
  },
package/CHANGELOG.md CHANGED
@@ -7,7 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- ### Added
10
+ ### Fixed
11
+
12
+ - Aligned forced-unscorable candidate handling in `cli/lib/build-prompt.js` and `cli/lib/parse-report.js`: candidates without matching criteria rows are removed from `## Reviewed Files` when excluded in `## Excluded From Review Set`. Added end-to-end stub-agent coverage in `test/test-test-review-cli.js`.
13
+ - Corrected shared-account guidance in `mobile-test-strategy.md` to recommend per-run accounts/data or explicit backend reset when server state changes.
14
+ - Added `clearKeychain` between `clearState` and `launchApp` in `maestro-flows.md` login setup across all workflow copies.
15
+ - Fixed mobile preflight HALT condition in `bmad-testarch-automate` so missing `maestro` on PATH records run as non-executable without halting.
16
+ - Aligned mobile worker success contract across automation subagent, generation, and aggregate steps by adding required `success` boolean to mobile schema and validating it before aggregation.
17
+ - Updated generated mobile flow guidance to require `clearState` only for device-flow entries, keeping subflows from resetting or relaunching mid-journey.
18
+ - Resolved Maestro root directory (`maestro/` or `.maestro/`) and propagated it across generation, scaffolding, and CI pipeline steps.
19
+ - Added Mobile framework verification branch to CI preflight step.
20
+ - Replaced unpinned Maestro curl installer in CI pipeline generation with release-pinned or checksum-verified immutable artifact.
21
+ - Added Mobile prerequisite and context loading branches to framework preflight step, and updated mobile+backend surface handling across framework and test-design workflows.
22
+ - Reordered framework scaffold knowledge loading so mobile projects skip Playwright browser fragments, and aligned Maestro config and flow paths.
23
+ - Updated Flutter detection in `pubspec.yaml` to require Flutter SDK dependency or platform project directory before classifying as mobile, recognized `*.flow.yml` in Maestro review triggers, and skipped DOM `selector-resilience` for mobile reviews.
24
+ - Added `mobile` and `maestro` keywords to `package.json` and `.claude-plugin/marketplace.json`.
25
+ - Updated `src/module.yaml`, `docs/explanation/tea-overview.md`, `docs/index.md`, `docs/reference/execution-targets.md`, and `docs/reference/knowledge-base.md` to align mobile native (Maestro) execution targets, tier dimensions, and knowledge fragment loading contracts.
26
+ - Normalized the `test-review` checklist's Recommendation vocabulary to the canonical four-value enum (`checklist.md`).
11
27
 
12
28
  - New `tea-test-review` CLI (`bin` entry) — headless runner for the `bmad-testarch-test-review` skill: changed-test scoping from the PR diff (`--base`, or an explicit `--files` list), prompt-only mode (`--agent none`), JSON verdict (`--json`), and CI exit codes (`--fail-on request-changes|block`). Hardened for required-gate use: stdin-delivered prompt, filesystem isolation (`--isolate`, on by default in CI, `--no-isolate` to opt out), extra test-file matchers (`--test-glob`), a quality-score floor (`--min-score`), non-pass on skips (`--fail-on-skip`) and deletions-only diffs, and strict report validation (dual-section Recommendation, bounded score, violations line, frontmatter, and a `## Reviewed Files` manifest). Ships with `cli/examples/pr-test-review.yml`, a two-job (review + comment) starting template for a required test-review gate, plus `cli/examples/README.md` covering two real adaptations: a central reusable-workflows repo, and a repo already running a third-party review bot.
13
29
  - `tea-test-review` is no longer Claude-only: `--agent` resolves against a per-vendor adapter table (`cli/lib/agent-adapters.js`) instead of hardcoding `claude -p`'s argv at every call site `--agent-cmd` could override. `--agent codex` spawns `codex exec --sandbox workspace-write`, live-verified with a real review against a real Playwright spec (`codex-cli` 0.146.0) whose report `parseReport()` accepted; that run wrote Key Strengths/Weaknesses as plain bullets instead of the `✅`/`❌`-prefixed form claude reliably produces, which the existing best-effort extraction already tolerates by design (`plain-bullets-key-strengths.md` fixture). A drafted `--agent gemini` adapter was not shipped: this account's `gemini` CLI OAuth login is on a deprecated Code Assist tier with no fallback API key configured, so it was never verified end-to-end.
@@ -42,8 +58,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
42
58
  - Publish releases now use `[Unreleased]` changelog notes before falling back to generated GitHub release notes when an exact version section is missing.
43
59
  - Documented workflow-local knowledge resources as intentional self-contained skill packaging and added validation for workflow-local knowledge indexes.
44
60
 
45
- ### Fixed
46
-
47
61
  - Normalized the `test-review` checklist's Recommendation vocabulary to the canonical four-value enum (`checklist.md`).
48
62
  - `test-review` score aggregation now emits a CRITICAL severity tier (`step-03f`), mapped to the report's `Critical Issues (Must Fix)` section, matching the template's four-tier violations line; `generate_inline_comments` is now a defined workflow input (default `false`) instead of an unresolved reference in the checklist.
49
63
  - `test-review` reports now carry a machine-readable `## Reviewed Files` manifest section in `test-review-template.md`, and every step's first-save frontmatter snippet declares `workflowType: 'testarch-test-review'`. A report produced from the template alone now satisfies the headless verdict schema, so a clean review can no longer be reported as a parse failure when the agent follows the template rather than prompt prose.
package/README.md CHANGED
@@ -1,18 +1,21 @@
1
1
  # Test Architect (TEA)
2
2
 
3
- [![Python Version](https://img.shields.io/badge/python-%3E%3D3.10-blue?logo=python&logoColor=white)](https://www.python.org)
4
- [![uv](https://img.shields.io/badge/uv-package%20manager-blueviolet?logo=uv)](https://docs.astral.sh/uv/)
3
+ [![Node Version](https://img.shields.io/badge/node-%3E%3D20-brightgreen?logo=node.js&logoColor=white)](https://nodejs.org)
4
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue)](./LICENSE)
5
5
 
6
6
  TEA (Test Engineering Architect) is a standalone BMAD module that delivers risk-based test strategy, test automation guidance, and release gate decisions. It provides a single expert agent (Murat, Master Test Architect and Quality Advisor) and nine workflows spanning Teach Me Testing (TEA Academy), test design, framework setup, CI guidance, ATDD, automation, test review, NFR Evidence Audit, and traceability.
7
7
 
8
+ TEA is two layers. **TEA Core** decides what must be verified, at what depth, with what evidence, and whether that evidence is sufficient to release; it assumes nothing about your language, framework, or platform. **Execution targets** turn those decisions into runnable tests on a specific stack, and that layer is swappable. See [Verification Architecture](./docs/explanation/verification-architecture.md) for the split, and [Execution Targets](./docs/reference/execution-targets.md) for exactly which stacks are covered at which depth.
9
+
8
10
  Docs: <https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/>
9
11
 
10
12
  ## Why TEA
11
13
 
12
- - Risk-based testing with measurable quality gates
13
- - Consistent, knowledge-base driven outputs
14
- - Clear prioritization (P0-P3) and traceability
15
- - Optional Playwright Utils, CLI, and MCP browser automation
14
+ - Risk-based prioritization (P0-P3) from probability × impact, with measurable quality gates
15
+ - Requirements traced to evidence, and PASS / CONCERNS / FAIL / WAIVED release decisions that survive an audit
16
+ - NFR thresholds set at design time and audited against real evidence, defaulting to CONCERNS when evidence is missing
17
+ - Consistent, knowledge-base driven outputs instead of whatever the model felt like producing
18
+ - Stack-aware execution: Playwright and Cypress for browsers, Maestro for mobile native, Pact for contracts, pytest / JUnit / Go test / xUnit / RSpec for backend services, k6 and scanners as NFR evidence
16
19
 
17
20
  ## How BMad Works
18
21
 
@@ -80,7 +83,7 @@ BMad workflows and Claude Code Skills solve different problems at different scal
80
83
  | ----------------- | --------------------------- | ---------------------------------------------------------------------------- |
81
84
  | **Execution** | Single prompt, one shot | 5-9 sequential steps with explicit handoffs |
82
85
  | **State** | Stateless | YAML frontmatter tracking (`stepsCompleted`, `lastStep`) with resume |
83
- | **Knowledge** | Whatever fits in one prompt | Tiered index (40 fragments), conditional loading by config + stack detection |
86
+ | **Knowledge** | Whatever fits in one prompt | Tiered index (54 fragments), conditional loading by config + stack detection |
84
87
  | **Context mgmt** | Everything in one shot | Just-in-time step loading, subagent isolation (separate contexts) |
85
88
  | **Output** | Freeform | Templates with `{PLACEHOLDER}` vars filled by specific steps |
86
89
  | **Validation** | None | Dedicated mode (`steps-v/`) evaluating against checklists |
@@ -137,17 +140,17 @@ npx bmad-method install
137
140
 
138
141
  ## Workflows
139
142
 
140
- | Trigger | Slash Command | Codex Skill | Purpose |
141
- | ------- | ---------------------------- | -------------------------------- | --------------------------------------------------------- |
142
- | TMT | `/bmad:tea:teach-me-testing` | `$bmad-tea-teach-me-testing` | Teach Me Testing (TEA Academy) |
143
- | TD | `/bmad:tea:test-design` | `$bmad-tea-testarch-test-design` | System-level or epic-level test design and NFR planning |
144
- | TF | `/bmad:tea:framework` | `$bmad-tea-testarch-framework` | Scaffold test framework (frontend, backend, or fullstack) |
145
- | CI | `/bmad:tea:ci` | `$bmad-tea-testarch-ci` | Set up CI/CD quality pipeline (multi-platform) |
146
- | AT | `/bmad:tea:atdd` | `$bmad-tea-testarch-atdd` | Generate failing acceptance tests + checklist |
147
- | TA | `/bmad:tea:automate` | `$bmad-tea-testarch-automate` | Expand test automation coverage |
148
- | RV | `/bmad:tea:test-review` | `$bmad-tea-testarch-test-review` | Review test quality and score |
149
- | NR | `/bmad:tea:nfr-assess` | `$bmad-tea-testarch-nfr` | Audit implemented NFR evidence |
150
- | TR | `/bmad:tea:trace` | `$bmad-tea-testarch-trace` | Trace requirements to tests + gate decision |
143
+ | Trigger | Slash Command | Codex Skill | Purpose |
144
+ | ------- | ---------------------------- | -------------------------------- | ----------------------------------------------------------------- |
145
+ | TMT | `/bmad:tea:teach-me-testing` | `$bmad-tea-teach-me-testing` | Teach Me Testing (TEA Academy) |
146
+ | TD | `/bmad:tea:test-design` | `$bmad-tea-testarch-test-design` | System-level or epic-level test design and NFR planning |
147
+ | TF | `/bmad:tea:framework` | `$bmad-tea-testarch-framework` | Scaffold test framework (frontend, backend, fullstack, or mobile) |
148
+ | CI | `/bmad:tea:ci` | `$bmad-tea-testarch-ci` | Set up CI/CD quality pipeline (multi-platform) |
149
+ | AT | `/bmad:tea:atdd` | `$bmad-tea-testarch-atdd` | Generate failing acceptance tests + checklist |
150
+ | TA | `/bmad:tea:automate` | `$bmad-tea-testarch-automate` | Expand test automation coverage |
151
+ | RV | `/bmad:tea:test-review` | `$bmad-tea-testarch-test-review` | Review test quality and score |
152
+ | NR | `/bmad:tea:nfr-assess` | `$bmad-tea-testarch-nfr` | Audit implemented NFR evidence |
153
+ | TR | `/bmad:tea:trace` | `$bmad-tea-testarch-trace` | Trace requirements to tests + gate decision |
151
154
 
152
155
  ## Configuration
153
156
 
@@ -158,8 +161,8 @@ TEA variables are defined in `src/module.yaml` and prompted during install:
158
161
  - `tea_use_pactjs_utils` — enable Pact.js Utils integration for contract testing when your project explicitly uses Pact (boolean)
159
162
  - `tea_pact_mcp` — SmartBear MCP for PactFlow/Broker interaction when broker integration is needed: mcp, none (string)
160
163
  - `tea_browser_automation` — browser automation mode: auto, cli, mcp, none (string)
161
- - `test_framework` — detected or configured test framework (Playwright, Cypress, Jest, Vitest, pytest, JUnit, Go test, dotnet test, RSpec)
162
- - `test_stack_type` — detected or configured stack type (frontend, backend, fullstack)
164
+ - `test_framework` — detected or configured test framework (Playwright, Cypress, Jest, Vitest, pytest, JUnit, Go test, dotnet test, RSpec, Maestro)
165
+ - `test_stack_type` — detected or configured stack type (frontend, backend, fullstack, mobile)
163
166
  - `ci_platform` — CI platform (auto, github-actions, gitlab-ci, jenkins, azure-devops, harness, circle-ci)
164
167
  - `risk_threshold` — risk cutoff for mandatory testing (future)
165
168
  - `test_design_output`, `test_review_output`, `trace_output` — subfolders under `test_artifacts`
@@ -51,9 +51,13 @@ const { MODULE_DEFAULTS } = require('./resolve-tea-config');
51
51
  * waive. When supplied, the report must quote it so a reader knows what
52
52
  * steered the review.
53
53
  * @param {string[]} [options.unscorableTestArtifacts] - Changed test artifacts in
54
- * a format the ledger has no criteria for (Maestro flows, Gherkin features,
54
+ * a format the ledger has no criteria for (Gherkin features, Robot suites,
55
55
  * .http collections). The CLI computes these; the report discloses them so a
56
56
  * manifest that omits them never reads as "the diff held nothing else".
57
+ * @param {string[]} [options.forcedUnscorableCandidates] - Review-set files that
58
+ * only --test-glob put there and that no built-in rule recognizes. The CLI
59
+ * cannot know whether a registry row attached, so it names them and the agent
60
+ * applies criteria-registry rule 4 rather than publishing 100 - 0 = 100.
57
61
  * @returns {string}
58
62
  */
59
63
  function buildPrompt({
@@ -67,6 +71,7 @@ function buildPrompt({
67
71
  contextBasis = 'none',
68
72
  focus = '',
69
73
  unscorableTestArtifacts = [],
74
+ forcedUnscorableCandidates = [],
70
75
  }) {
71
76
  const absoluteSkillRoot = path.resolve(skillRoot);
72
77
  const absoluteOutputPath = path.resolve(outputPath);
@@ -152,6 +157,24 @@ function buildPrompt({
152
157
  '',
153
158
  ]
154
159
  : []),
160
+ ...(forcedUnscorableCandidates.length > 0
161
+ ? [
162
+ 'The paths listed below are in the review set only because --test-glob put them there, and no built-in rule',
163
+ 'recognizes their format. Apply criteria-registry rule 4 to each one: read it, and determine whether any',
164
+ 'registry row can attach to its syntax at all.',
165
+ '- If rows attach, review and score it normally. Nothing further is required.',
166
+ '- If NO row can attach, the file is unscorable. Do not score it, do not let it contribute to the total,',
167
+ ' remove it from "## Reviewed Files", and name it in "## Excluded From Review Set" with the reason',
168
+ ' "format not scorable by the ledger". Say plainly in the Executive Summary that --test-glob forced it in',
169
+ ' and the ledger has no criteria for its format.',
170
+ 'A gate closed because the registry lacks a rule is not the same as a gate that opened and found nothing.',
171
+ 'Publishing 100/Approve over a file no criterion could read is a defect in the review, not a clean result.',
172
+ '---BEGIN FORCED-UNSCORABLE-CANDIDATES---',
173
+ JSON.stringify(forcedUnscorableCandidates, null, 2),
174
+ '---END FORCED-UNSCORABLE-CANDIDATES---',
175
+ '',
176
+ ]
177
+ : []),
155
178
  ...(focus
156
179
  ? [
157
180
  'The requester left a focus note for this run, inside the delimiters below. It is their stated priority for',
@@ -27,6 +27,14 @@ const TEST_DIR_SEGMENTS = new Set(['test', 'tests', '__tests__', 'e2e', 'spec',
27
27
  // so fixtures like tests/data.json or e2e/docker-compose.yaml stay out.
28
28
  const CODE_EXTENSION_PATTERN = /\.(ts|tsx|js|jsx|mjs|cjs|py|go|rb|php|cs|java|kt|swift|rs|dart|exs|ex|vue|svelte)$/;
29
29
 
30
+ // Maestro flows are declarative YAML, not code, but the criteria registry carries
31
+ // mobile rows for them, so they are a scorable format and belong in the review set.
32
+ const MAESTRO_DIR_SEGMENTS = new Set(['maestro', '.maestro']);
33
+ const YAML_EXTENSION_PATTERN = /\.ya?ml$/i;
34
+ const MAESTRO_FLOW_FILENAME_PATTERN = /\.flow\.ya?ml$/i;
35
+ // .maestro/config.yaml is the workspace config, not a flow.
36
+ const MAESTRO_NON_FLOW_FILENAMES = new Set(['config.yaml', 'config.yml']);
37
+
30
38
  const TEST_FILENAME_PATTERNS = [
31
39
  /^test_.*\.py$/, // pytest: test_checkout.py
32
40
  /_test\.py$/, // pytest: checkout_test.py
@@ -83,23 +91,32 @@ function resetExtraTestPatterns() {
83
91
  }
84
92
 
85
93
  /**
86
- * Match a repo-relative path that looks like a test/spec file. Directory
87
- * segments match case-insensitively but only on exact segment equality (so
88
- * src/latest/run.ts and src/test-utils/helpers.ts stay out). Every built-in
89
- * rule requires a code extension, so docs/example.spec.md is documentation,
90
- * not a test. Registered --test-glob matchers bypass the extension gate by
91
- * explicit user intent.
94
+ * Match a repo-relative path that looks like a test/spec file using the built-in
95
+ * rules only, ignoring the --test-glob registry. Directory segments match
96
+ * case-insensitively but only on exact segment equality (so src/latest/run.ts and
97
+ * src/test-utils/helpers.ts stay out).
98
+ *
99
+ * Code extensions are the general gate, so docs/example.spec.md is documentation,
100
+ * not a test. Maestro is the one deliberate exception: the criteria registry
101
+ * carries mobile rows (C4, H1, H3, H4, H9, M8, L8), so a declarative YAML flow is
102
+ * a format the ledger CAN score and it is recognized natively rather than needing
103
+ * --test-glob. The exception is scoped to YAML under a Maestro directory (or a
104
+ * *.flow.yaml anywhere) and excludes Maestro's own workspace config, which is
105
+ * configuration rather than a flow.
92
106
  *
93
107
  * @param {string} filePath - Repo-relative file path.
94
108
  * @returns {boolean}
95
109
  */
96
- function isTestFile(filePath) {
110
+ function isNativeTestFile(filePath) {
97
111
  const segments = filePath.replaceAll('\\', '/').split('/');
98
112
  const filename = segments.at(-1);
99
113
  const directories = segments.slice(0, -1);
100
114
 
101
- for (const matches of extraTestPatterns) {
102
- if (matches(filePath)) {
115
+ if (YAML_EXTENSION_PATTERN.test(filename) && !MAESTRO_NON_FLOW_FILENAMES.has(filename.toLowerCase())) {
116
+ if (directories.some((segment) => MAESTRO_DIR_SEGMENTS.has(segment.toLowerCase()))) {
117
+ return true;
118
+ }
119
+ if (MAESTRO_FLOW_FILENAME_PATTERN.test(filename)) {
103
120
  return true;
104
121
  }
105
122
  }
@@ -115,6 +132,47 @@ function isTestFile(filePath) {
115
132
  return TEST_FILENAME_PATTERNS.some((pattern) => pattern.test(filename));
116
133
  }
117
134
 
135
+ /**
136
+ * Match a repo-relative path that belongs in the review set. Registered
137
+ * --test-glob matchers bypass every gate by explicit user intent; everything
138
+ * else goes through the built-in rules.
139
+ *
140
+ * @param {string} filePath - Repo-relative file path.
141
+ * @returns {boolean}
142
+ */
143
+ function isTestFile(filePath) {
144
+ for (const matches of extraTestPatterns) {
145
+ if (matches(filePath)) {
146
+ return true;
147
+ }
148
+ }
149
+
150
+ return isNativeTestFile(filePath);
151
+ }
152
+
153
+ /**
154
+ * Review-set files that are present ONLY because --test-glob forced them in and
155
+ * that no built-in rule recognizes as a scorable format.
156
+ *
157
+ * This is the gap that used to produce a silent perfect score. A --test-glob
158
+ * match short-circuits isTestFile, which removes the file from the unscorable
159
+ * manifest, and if the registry then has no row that can attach to its syntax the
160
+ * arithmetic runs 100 - 0 and publishes 100/Approve with no findings and no
161
+ * disclosure. The CLI cannot know which criteria attached, so it does not guess:
162
+ * it names these files to the agent, which applies criteria-registry rule 4 and
163
+ * declines to score a file no row could match.
164
+ *
165
+ * @param {string[]} reviewFiles - The computed review set.
166
+ * @returns {string[]}
167
+ */
168
+ function getForcedUnscorableCandidates(reviewFiles) {
169
+ return (Array.isArray(reviewFiles) ? reviewFiles : []).filter((file) => {
170
+ if (typeof file !== 'string' || file.length === 0) return false;
171
+ if (isNativeTestFile(file)) return false;
172
+ return extraTestPatterns.some((matches) => matches(file));
173
+ });
174
+ }
175
+
118
176
  /**
119
177
  * Split NUL-delimited `git diff -z` stdout into paths. Git paths are passed
120
178
  * through untouched (no trimming): leading/trailing whitespace can be part of
@@ -185,15 +243,18 @@ function isContextNoise(filePath) {
185
243
  return segments.slice(0, -1).some((segment) => CONTEXT_NOISE_DIR_SEGMENTS.has(segment.toLowerCase()));
186
244
  }
187
245
 
188
- // Test artifacts written in a format isTestFile deliberately will not match,
189
- // because every built-in rule requires a code extension. A Maestro flow, a
190
- // Gherkin feature, a Robot suite or an .http collection is a test the reviewer
191
- // cannot score, and staying silent about it reads as "there was nothing else to
192
- // review". These only ever produce a disclosure line and a --test-glob hint;
193
- // they never enter the review set on their own, since scoring a format the
246
+ // Test artifacts written in a format the built-in rules deliberately will not
247
+ // match. A Gherkin feature, a Robot suite or an .http collection is a test the
248
+ // reviewer cannot score, and staying silent about it reads as "there was nothing
249
+ // else to review". These only ever produce a disclosure line and a --test-glob
250
+ // hint; they never enter the review set on their own, since scoring a format the
194
251
  // ledger has no criteria for would be worse than declining it.
252
+ //
253
+ // Maestro is deliberately absent from this set: the criteria registry now carries
254
+ // mobile rows, so a Maestro flow is scorable and isNativeTestFile claims it before
255
+ // it can reach here. Only Maestro's workspace config stays out, and it is
256
+ // configuration rather than a test artifact, so it should not be disclosed either.
195
257
  const NON_CODE_TEST_DIR_SEGMENTS = new Set([
196
- 'maestro',
197
258
  'cypress',
198
259
  'playwright',
199
260
  'features',
@@ -401,10 +462,12 @@ module.exports = {
401
462
  getChangedTestFiles,
402
463
  getContextFiles,
403
464
  getUnscorableTestArtifacts,
465
+ getForcedUnscorableCandidates,
404
466
  getDeletedFiles,
405
467
  getDeletedTestFiles,
406
468
  contextBasisFor,
407
469
  isTestFile,
470
+ isNativeTestFile,
408
471
  isContextNoise,
409
472
  splitGitPathList,
410
473
  assertSafePaths,
@@ -456,7 +456,7 @@ function verifyRunContract({ reviewedFiles, contextBasis, contextFiles, excluded
456
456
 
457
457
  if (has('reviewedFiles')) {
458
458
  const suppliedReviewed = canonicalizeManifest(runContract.reviewedFiles, 'supplied reviewed files');
459
- const missing = manifestDifference(suppliedReviewed, reviewedFiles);
459
+ const missing = manifestDifference(suppliedReviewed, reviewedFiles).filter((file) => !excludedFiles.includes(file));
460
460
  const foreign = manifestDifference(reviewedFiles, suppliedReviewed);
461
461
  if (missing.length > 0 || foreign.length > 0) {
462
462
  unparseable(
@@ -37,6 +37,7 @@ const {
37
37
  getChangedTestFiles,
38
38
  getContextFiles,
39
39
  getUnscorableTestArtifacts,
40
+ getForcedUnscorableCandidates,
40
41
  getDeletedTestFiles,
41
42
  contextBasisFor,
42
43
  isTestFile,
@@ -462,8 +463,8 @@ function main() {
462
463
  let changedTestFiles;
463
464
  let contextFiles = [];
464
465
  let contextTruncated = false;
465
- // Changed test artifacts the ledger has no criteria for (Maestro flows,
466
- // Gherkin features, .http collections). They stay out of the review set, but
466
+ // Changed test artifacts the ledger has no criteria for (Gherkin features,
467
+ // Robot suites, .http collections). They stay out of the review set, but
467
468
  // a reviewed-files manifest that simply omits them reads as though the diff
468
469
  // held nothing else, so they are disclosed and carry the --test-glob remedy.
469
470
  let unscorableTestArtifacts = [];
@@ -484,6 +485,11 @@ function main() {
484
485
  }
485
486
  const contextBasis = contextBasisFor({ files: contextFiles, truncated: contextTruncated });
486
487
 
488
+ // Files --test-glob forced in that no built-in rule recognizes. The CLI cannot
489
+ // tell whether a registry row attached, so it names them to the agent rather
490
+ // than letting a zero-violation run publish 100/Approve over an unread format.
491
+ const forcedUnscorableCandidates = getForcedUnscorableCandidates(changedTestFiles);
492
+
487
493
  // Fail closed on hostile paths before they reach the prompt (or anywhere
488
494
  // else). Context paths travel in their own delimited block and get the same
489
495
  // treatment as the review set.
@@ -559,6 +565,7 @@ function main() {
559
565
  contextBasis,
560
566
  focus: options.focus,
561
567
  unscorableTestArtifacts,
568
+ forcedUnscorableCandidates,
562
569
  });
563
570
  console.log(prompt);
564
571
  if (jsonPath) {
@@ -665,6 +672,7 @@ function main() {
665
672
  contextBasis,
666
673
  focus: options.focus,
667
674
  unscorableTestArtifacts,
675
+ forcedUnscorableCandidates,
668
676
  });
669
677
 
670
678
  const executeAgent = ({ agentCwd, spawnPrefix }) => {
@@ -9,6 +9,10 @@ The Test Architect (TEA) is a specialized agent focused on quality strategy, tes
9
9
  TEA was built to solve AI-generated tests that rot in review. For the problem statement and design principles, see [Testing as Engineering](/docs/explanation/testing-as-engineering.md). For setup, see [Setup Test Framework](/docs/how-to/workflows/setup-test-framework.md).
10
10
  :::
11
11
 
12
+ :::note[Scope]
13
+ TEA's risk, design, NFR, traceability, and gate workflows are stack-neutral and apply to any system under test. Its execution depth is not uniform: browsers, HTTP services, contracts, and mobile native (Maestro) are covered end to end, while other stacks are covered at shallower tiers. [Verification Architecture](/docs/explanation/verification-architecture.md) explains the split; [Execution Targets](/docs/reference/execution-targets.md) publishes the per-target matrix and the known gaps.
14
+ :::
15
+
12
16
  ## Overview
13
17
 
14
18
  - **Persona:** Murat, Master Test Architect and Quality Advisor focused on risk-based testing, fixture architecture, ATDD, and CI/CD governance.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: 'AI-Generated Testing: Why Most Approaches Fail'
3
- description: How Playwright-Utils, pactjs-utils, TEA workflows, Playwright CLI, and MCPs solve AI test quality problems
3
+ description: Why prompt-driven test generation produces unreliable suites, and how standardized utilities, structured workflows, and deterministic interfaces fix it (worked through a JavaScript stack)
4
4
  ---
5
5
 
6
6
  AI-generated tests frequently fail in production because they lack systematic quality standards. This document explains the problem and presents a solution combining utility standards, TEA workflows, and automation interfaces across both UI, API and contract testing.
@@ -0,0 +1,129 @@
1
+ ---
2
+ title: 'Verification Architecture'
3
+ description: How TEA separates stack-neutral verification reasoning from stack-specific execution, which execution targets are covered today, and how to extend it
4
+ ---
5
+
6
+ # Verification Architecture
7
+
8
+ TEA is two layers, and they have different lifespans.
9
+
10
+ **TEA Core** decides what must be verified, at what depth, with what evidence, and whether that evidence is sufficient to release. It holds no assumption about language, framework, or platform.
11
+
12
+ **Execution targets** turn those decisions into runnable tests on one specific stack. This layer is technology-specific by design and is meant to be swapped as your stack changes.
13
+
14
+ Read the second layer on its own and TEA looks like a browser-testing tool, because that is where its deepest coverage happens to sit today. The verification reasoning is the durable part. This page states what is in each layer, publishes TEA's actual coverage including the gaps, and describes how to extend it.
15
+
16
+ ```mermaid
17
+ flowchart TB
18
+ subgraph CORE["TEA Core: stack-neutral"]
19
+ R[Risk model<br/>probability x impact, P0-P3]
20
+ L[Test level selection<br/>+ duplicate coverage guard]
21
+ N[NFR criteria<br/>+ gate decision matrix]
22
+ T[Requirements to evidence<br/>traceability]
23
+ G[Gate decision<br/>PASS / CONCERNS / FAIL / WAIVED]
24
+ end
25
+ CORE --> X{Execution target}
26
+ X --> W[Web browser<br/>Playwright, Cypress]
27
+ X --> A[HTTP service and contract<br/>Pact, API suites]
28
+ X --> M[Mobile native<br/>Maestro]
29
+ X --> B[Backend unit and integration<br/>pytest, JUnit, Go test, xUnit, RSpec]
30
+ X --> O[Your target<br/>desktop, embedded, data]
31
+ W --> E[Evidence]
32
+ A --> E
33
+ M --> E
34
+ B --> E
35
+ O --> E
36
+ E --> G
37
+ ```
38
+
39
+ ## The two layers
40
+
41
+ | | TEA Core | Execution target |
42
+ | ------------------- | -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
43
+ | Question it answers | What must be verified, and is the evidence sufficient to ship? | How is it verified on this stack? |
44
+ | Changes when | Risk appetite, compliance regime, or release policy changes | Language, framework, or platform changes |
45
+ | Stability | Durable across a rewrite | Replaced by a rewrite |
46
+ | Owned by | TEA | TEA for supported targets; you for the rest |
47
+ | Examples | Risk scoring, P0-P3, level selection, NFR criteria, traceability, gate decisions | Playwright, Cypress, Maestro, pytest, JUnit, Go test, xUnit, RSpec, Pact, k6 |
48
+
49
+ ## What TEA Core contains
50
+
51
+ Core is the part an enterprise is actually buying, and it is stack-neutral in construction rather than by assertion:
52
+
53
+ - **Risk model.** Probability × impact on a 1-9 scale, with scores ≥6 requiring documented mitigation and 9 mandating gate failure. See [Risk-Based Testing](/docs/explanation/risk-based-testing.md).
54
+ - **Priority assignment.** P0-P3 with coverage targets and execution ordering per band.
55
+ - **Test level selection.** Unit, integration, and end-to-end chosen by what the risk actually demands, with a duplicate-coverage guard that pushes verification to the cheapest level that can carry it.
56
+ - **NFR criteria and gate matrix.** Security, performance, reliability, and maintainability scored PASS / CONCERNS / FAIL, defaulting to CONCERNS when targets or evidence are undefined.
57
+ - **Requirements-to-evidence traceability.** Every acceptance criterion maps to evidence; gaps require an explicit waiver with an owner and an expiry date.
58
+ - **Release gate decision.** PASS / CONCERNS / FAIL / WAIVED, derived from the traceability matrix rather than from a person's confidence.
59
+ - **Architecture testability review.** An 8-category, 29-criteria audit applied at design time, before any test exists.
60
+ - **Confidence gate.** A stop rule for the agent itself: below a confidence threshold it declines to generate rather than inventing plausible output.
61
+
62
+ Two of TEA's nine workflows, `nfr-assess` and `trace`, contain no stack-conditional logic at any step. They run identically whether the system under test is a React app, a Go service, or a payment terminal. The risk and priority knowledge fragments reference no test framework at all.
63
+
64
+ ## What an execution target supplies
65
+
66
+ An execution target is the set of technology-specific answers TEA needs before it can produce runnable tests. Six things:
67
+
68
+ 1. **Detection.** The manifest or file signature that identifies the stack.
69
+ 2. **Project layout.** Where tests live, and the idiomatic directory structure.
70
+ 3. **Runner configuration.** The config file, its timeouts, reporters, and artifact paths.
71
+ 4. **Commands.** Install, test, coverage, and the shard or filter syntax CI needs.
72
+ 5. **CI wiring.** Runtime setup, caching, and whether burn-in applies.
73
+ 6. **Review criteria.** Rows the test-review ledger can attach to that format.
74
+
75
+ Item six is the one that decides whether a target is genuinely supported. `test-review` scores against a criteria registry, and a format with no matching rows is one TEA cannot honestly score. When TEA encounters a test artifact it has no criteria for, the correct behavior is to name it as unscorable rather than to return a passing grade over a file it could not read.
76
+
77
+ ## Coverage today
78
+
79
+ TEA's execution coverage is uneven, and the uneven part is deliberate to state rather than to imply. Full detail is in [Execution Targets](/docs/reference/execution-targets.md). The summary:
80
+
81
+ | Tier | What it means | Targets |
82
+ | -------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
83
+ | **Full** | Workflow branching, scaffolding, knowledge fragments, and review criteria | Web browser (Playwright, Cypress), mobile native (Maestro), HTTP and service tests, contract testing (Pact), component tests |
84
+ | **Generation** | Detection, scaffolding, and test generation, with no dedicated knowledge fragments or review criteria | pytest, JUnit 5 / TestNG, Go test, xUnit / NUnit / MSTest, RSpec / Minitest |
85
+ | **Evidence** | TEA plans, requires, and audits the evidence; execution is your tooling | Performance (k6, JMeter, Gatling), security scanning (ZAP, Burp, Snyk), message contracts |
86
+ | **Core only** | Risk, design, NFR, and traceability apply; execution is unassisted | Desktop, embedded, data pipelines, mainframe |
87
+
88
+ ### The self-audit
89
+
90
+ Of TEA's 54 knowledge fragments, 38 name Playwright or Cypress. Two cover mobile. None covers a backend test framework, and the knowledge index has no row tagged for pytest, JUnit, Go test, xUnit, or RSpec.
91
+
92
+ That is the real shape of the gap, and it is uneven in a specific way. Web and mobile are knowledge-backed: TEA carries curated patterns for both, so what it generates follows a pattern library rather than the model's improvisation. Backend languages are not. TEA can decide to scaffold pytest, and does, but it works from the conventions named inline in the workflow step and from the project it can see. The reasoning that selects pytest is as rigorous for a Python service as for a React Native app. The execution guidance behind it is not yet equivalent.
93
+
94
+ ## What this means for your project
95
+
96
+ **JavaScript or TypeScript web and API.** Every layer applies. This is the deepest path and the one the tutorials use.
97
+
98
+ **Backend services in Python, Java, Go, .NET, or Ruby.** Planning, risk, design, NFR, traceability, and gating apply in full. Framework scaffolding and test generation work and are stack-aware. Review scoring is partial, because most registry criteria are written against JavaScript and browser constructs. Expect strong plans and generated tests that follow your project's conventions rather than a curated TEA pattern library.
99
+
100
+ **Mobile native (iOS, Android, React Native, Expo, Flutter).** Every layer applies. `mobile` is a first-class stack type: TEA detects it, scaffolds a Maestro suite alongside the app's own unit and component framework, generates flows through a dedicated worker, produces a two-tier device pipeline, and scores flows against mobile criteria rows in the review ledger.
101
+
102
+ **Desktop, embedded, data pipelines, and anything else.** Core applies without modification, and this is not a technicality: risk scoring, level selection, NFR thresholds, traceability, and the gate decision are the majority of what a test architect does, and none of it depends on the runner. Execution is unassisted. TEA will not scaffold the framework, and `test-review` will decline to score test formats it has no criteria for rather than passing them.
103
+
104
+ The honest boundary is this: TEA's reasoning transfers to any stack today. TEA's execution depth does not, and the tiers above say exactly where it stops.
105
+
106
+ ## Extending TEA to a new execution target
107
+
108
+ There is no plugin API for execution targets today. Extension happens through the surfaces TEA already exposes:
109
+
110
+ - **Configuration.** Set `test_framework` and `test_stack_type` explicitly rather than letting detection run. See [Configuration](/docs/reference/configuration.md).
111
+ - **Knowledge fragments.** Add fragments for your stack and register them in the knowledge index so workflows load them by tier and tag. See [Knowledge Base System](/docs/explanation/knowledge-base-system.md).
112
+ - **Custom workflows.** Add stack-specific steps alongside the shipped ones. See [Extend TEA with Custom Workflows](/docs/how-to/customization/extend-tea-with-custom-workflows.md).
113
+
114
+ Core requires no extension. Risk scoring, NFR criteria, traceability, and gate decisions apply to a new target on day one, which is why a stack TEA has never seen still produces a usable test plan.
115
+
116
+ ## Why the split matters under audit
117
+
118
+ Regulated verification and validation asks a narrow question: was the evidence sufficient, and can you show the reasoning that decided it was. The answer has to survive a framework migration, because the systems being audited outlive their test tooling.
119
+
120
+ Separating the layers makes that answerable. The risk score, the priority, the required evidence, the traceability matrix, and the gate decision are all recorded independently of the tool that produced the evidence. Replacing Cypress with Playwright, or Playwright with a device farm, changes which artifacts satisfy a requirement. It does not change the requirement, its risk score, or the standard the gate holds it to.
121
+
122
+ An organization adopting TEA is standardizing the first layer. The second layer stays whatever each team already runs.
123
+
124
+ ## Related
125
+
126
+ - [Execution Targets](/docs/reference/execution-targets.md) - per-target support detail
127
+ - [TEA Overview](/docs/explanation/tea-overview.md) - the full workflow map
128
+ - [Risk-Based Testing](/docs/explanation/risk-based-testing.md) - the scoring model in Core
129
+ - [Use TEA for Enterprise](/docs/how-to/brownfield/use-tea-for-enterprise.md) - compliance evidence and audit trails
package/docs/index.md CHANGED
@@ -9,10 +9,15 @@ description: Test Architect (TEA) - Risk-based testing workflows, automation gui
9
9
 
10
10
  TEA (Test Engineering Architect) is a BMAD module for testing strategy and automation. It provides nine workflows covering learning, setup, design, automation, review, and release gates.
11
11
 
12
- - **Workflow‑Driven**: Multiple workflows covering covering day to day activities of a test architect.
12
+ - **Workflow‑Driven**: Multiple workflows covering day-to-day activities of a test architect.
13
13
  - **Consistent Outputs**: Knowledge-base guidance keeps standards consistent, no matter the agent being used.
14
14
  - **Risk‑Based**: P0–P3 prioritization from probability × impact.
15
15
  - **Release Gates**: Evidence‑backed go/no‑go decisions with traceability.
16
+ - **Two Layers**: Stack-neutral verification reasoning, plus swappable execution targets. See [Verification Architecture](/explanation/verification-architecture).
17
+
18
+ ## What TEA Works On
19
+
20
+ Risk assessment, test design, NFR planning, traceability, and release gates apply to any stack. Execution depth varies: browsers, HTTP services, and contracts are covered end to end; Python, Java, Go, .NET, and Ruby backends get detection, scaffolding, and generation; performance and security are planned and audited rather than executed. [Execution Targets](/reference/execution-targets) publishes the full matrix, including the gaps.
16
21
 
17
22
  ## Quick Install
18
23
 
@@ -469,21 +469,25 @@ Detected or configured project stack type. Controls CI pipeline generation and f
469
469
 
470
470
  **Default:** `"auto"`
471
471
 
472
- **Options:** `"auto"` | `"frontend"` | `"backend"` | `"fullstack"`
472
+ **Options:** `"auto"` | `"frontend"` | `"backend"` | `"fullstack"` | `"mobile"`
473
473
 
474
474
  **Purpose:** Determines stack-specific behavior:
475
475
 
476
- | Stack Type | Behavior |
477
- | ----------- | ---------------------------------------------------------------------------------------------------------- |
478
- | `auto` | Auto-detect from project manifests (playwright.config, jest.config, etc.) |
479
- | `frontend` | Browser-based tests (Playwright/Cypress), browser install in CI, burn-in enabled |
480
- | `backend` | API/unit tests (pytest, JUnit, Go test, Jest/Vitest, etc.), no browser install, burn-in skipped by default |
481
- | `fullstack` | Both frontend and backend tests, full CI pipeline |
476
+ | Stack Type | Behavior |
477
+ | ----------- | ------------------------------------------------------------------------------------------------------------------------------------- |
478
+ | `auto` | Auto-detect from project manifests (playwright.config, jest.config, etc.) |
479
+ | `frontend` | Browser-based tests (Playwright/Cypress), browser install in CI, burn-in enabled |
480
+ | `backend` | API/unit tests (pytest, JUnit, Go test, Jest/Vitest, etc.), no browser install, burn-in skipped by default |
481
+ | `fullstack` | Both frontend and backend tests, full CI pipeline |
482
+ | `mobile` | Native app: Maestro device flows plus the app's unit/component suite, no browser install, burn-in enabled and scoped to changed flows |
482
483
 
483
484
  **Affects Workflows:**
484
485
 
485
- - `ci` - Stack-conditional pipeline stages (browser install, burn-in)
486
+ - `ci` - Stack-conditional pipeline stages (browser install, burn-in, device/emulator legs)
486
487
  - `framework` - Framework scaffold adapts to stack type
488
+ - `automate` - Selects which generation workers launch (`mobile` runs the API worker plus the mobile worker)
489
+
490
+ Detection checks mobile first: a React Native or Expo project carries `package.json` with react and would otherwise misdetect as `frontend`.
487
491
 
488
492
  **Example:**
489
493
 
@@ -535,9 +539,9 @@ Detected or configured test framework preference.
535
539
 
536
540
  **Default:** `"auto"`
537
541
 
538
- **Options:** `"auto"` | `"playwright"` | `"cypress"` | `"jest"` | `"vitest"` | `"pytest"` | `"junit"` | `"go-test"` | `"dotnet-test"` | `"rspec"` | `"other"`
542
+ **Options:** `"auto"` | `"playwright"` | `"cypress"` | `"jest"` | `"vitest"` | `"pytest"` | `"junit"` | `"go-test"` | `"dotnet-test"` | `"rspec"` | `"maestro"` | `"other"`
539
543
 
540
- **Purpose:** Controls which test framework patterns TEA uses for code generation. When set to `"auto"`, TEA detects from project configuration files and manifests. Supports both frontend (Playwright, Cypress, Jest, Vitest) and backend (pytest, JUnit, Go test, dotnet test, RSpec) frameworks.
544
+ **Purpose:** Controls which test framework patterns TEA uses for code generation. When set to `"auto"`, TEA detects from project configuration files and manifests. Supports frontend (Playwright, Cypress, Jest, Vitest), backend (pytest, JUnit, Go test, dotnet test, RSpec), and mobile native (Maestro) frameworks.
541
545
 
542
546
  **Affects Workflows:**
543
547