@keber/qa-framework 1.5.2 → 1.6.2

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.
@@ -8,21 +8,30 @@
8
8
  *
9
9
  * What this command does (safe by design):
10
10
  * ALWAYS updates (framework-owned):
11
- * - .github/skills/ ← New skills architecture; always current
12
- * - .github/copilot-instructions.md ← Pipeline sequencer; framework-owned
13
- * - qa/QA-STRUCTURE-GUIDE.md ← Folder reference; framework-owned
11
+ * - .github/skills/ <- New skills architecture; always current
12
+ * - .github/copilot-instructions.md <- Pipeline sequencer; framework-owned
13
+ * - qa/QA-STRUCTURE-GUIDE.md <- Folder reference; framework-owned
14
14
  *
15
+ * MIGRATES (v1.5.x -> v1.6.0, non-destructive):
16
+ * - qa/07-automation/playwright.config.ts -> qa/07-automation/e2e/
17
+ * - qa/07-automation/global-setup.ts -> qa/07-automation/e2e/
18
+ * - qa/07-automation/package.json -> qa/07-automation/e2e/
19
+ * - qa/07-automation/.env.example -> qa/07-automation/e2e/
20
+ * - qa/07-automation/fixtures/ -> qa/07-automation/e2e/fixtures/
21
+ * - qa/07-automation/e2e/{module}/ -> qa/07-automation/e2e/tests/{module}/
22
+ * - Creates integration/ and load/ placeholders * - Patches playwright.config.ts: testDir '.' -> './tests', adds testIgnore
23
+ * - Creates tests/helpers/debug/ and tests/seeds/ if absent *
15
24
  * NEVER touches (project-owned):
16
- * - qa/01-specifications/ ← Your specs
17
- * - qa/02-test-plans/ ← Your test plans
18
- * - qa/03-test-cases/ ← Your TCs
19
- * - qa/07-automation/ ← Your Playwright code
20
- * - qa/memory/ ← Your learnings
21
- * - qa/README.md ← Your living index
22
- * - qa/AGENT-NEXT-STEPS.md ← Your sprint queue
25
+ * - qa/01-specifications/ <- Your specs
26
+ * - qa/02-test-plans/ <- Your test plans
27
+ * - qa/03-test-cases/ <- Your TCs
28
+ * - qa/07-automation/e2e/tests/ <- Your Playwright tests (only moves, never overwrites)
29
+ * - qa/memory/ <- Your learnings
30
+ * - qa/README.md <- Your living index
31
+ * - qa/AGENT-NEXT-STEPS.md <- Your sprint queue
23
32
  *
24
33
  * REPORTS but does not delete:
25
- * - qa/00-guides/ ← Old location (can be deleted manually)
34
+ * - qa/00-guides/ <- Old location (can be deleted manually)
26
35
  */
27
36
 
28
37
  'use strict';
@@ -98,6 +107,125 @@ if (fs.existsSync(oldGuidesDir)) {
98
107
  );
99
108
  }
100
109
 
110
+ // ---------------------------------------------------------------------------
111
+ // 5. Migration v1.5.x -> v1.6.0: restructure qa/07-automation/
112
+ // Safe: only moves files when source exists and destination does NOT.
113
+ // ---------------------------------------------------------------------------
114
+ const automationDir = path.join(qaRoot, '07-automation');
115
+ const e2eDir = path.join(automationDir, 'e2e');
116
+
117
+ // 5a. Scaffold files: 07-automation/*.* -> 07-automation/e2e/*.*
118
+ const scaffoldFiles = ['playwright.config.ts', 'global-setup.ts', 'package.json', '.env.example', 'package-lock.json'];
119
+ for (const file of scaffoldFiles) {
120
+ const oldPath = path.join(automationDir, file);
121
+ const newPath = path.join(e2eDir, file);
122
+ if (fs.existsSync(oldPath) && !fs.existsSync(newPath)) {
123
+ if (!dryRun) {
124
+ fs.mkdirSync(e2eDir, { recursive: true });
125
+ fs.renameSync(oldPath, newPath);
126
+ }
127
+ updated.push(newPath);
128
+ console.log(` [migrated] ${path.relative(cwd, oldPath)} -> e2e/${file}`);
129
+ }
130
+ }
131
+
132
+ // 5b. fixtures/: 07-automation/fixtures/ -> 07-automation/e2e/fixtures/
133
+ const oldFixturesDir = path.join(automationDir, 'fixtures');
134
+ const newFixturesDir = path.join(e2eDir, 'fixtures');
135
+ if (fs.existsSync(oldFixturesDir) && !fs.existsSync(newFixturesDir)) {
136
+ if (!dryRun) {
137
+ fs.mkdirSync(e2eDir, { recursive: true });
138
+ fs.renameSync(oldFixturesDir, newFixturesDir);
139
+ }
140
+ updated.push(newFixturesDir);
141
+ console.log(` [migrated] ${path.relative(cwd, oldFixturesDir)}/ -> e2e/fixtures/`);
142
+ }
143
+
144
+ // 5c. Spec stubs: e2e/{module}/*.spec.ts -> e2e/tests/{module}/
145
+ // Moves any directory directly under e2e/ that is not a known non-module dir.
146
+ const testsDir = path.join(e2eDir, 'tests');
147
+ const knownE2eDirs = new Set(['tests', 'page-objects', 'fixtures', 'diagnosis', 'scripts', 'seeds', 'helpers']);
148
+ if (fs.existsSync(e2eDir)) {
149
+ for (const entry of fs.readdirSync(e2eDir, { withFileTypes: true })) {
150
+ if (!entry.isDirectory() || knownE2eDirs.has(entry.name)) continue;
151
+ const oldModDir = path.join(e2eDir, entry.name);
152
+ const newModDir = path.join(testsDir, entry.name);
153
+ if (!fs.existsSync(newModDir)) {
154
+ if (!dryRun) {
155
+ fs.mkdirSync(testsDir, { recursive: true });
156
+ fs.renameSync(oldModDir, newModDir);
157
+ }
158
+ updated.push(newModDir);
159
+ console.log(` [migrated] e2e/${entry.name}/ -> e2e/tests/${entry.name}/`);
160
+ } else {
161
+ warnings.push(
162
+ `Cannot migrate e2e/${entry.name}/ — target e2e/tests/${entry.name}/ already exists. Merge manually.`
163
+ );
164
+ }
165
+ }
166
+ }
167
+
168
+ // 5d. Create integration/ and load/ placeholders if missing.
169
+ const integrationReadme = path.join(automationDir, 'integration', 'README.md');
170
+ const loadReadme = path.join(automationDir, 'load', 'README.md');
171
+ if (!fs.existsSync(integrationReadme)) {
172
+ if (!dryRun) {
173
+ fs.mkdirSync(path.dirname(integrationReadme), { recursive: true });
174
+ fs.writeFileSync(integrationReadme,
175
+ '# Integration Tests\n\n> Placeholder for API/integration tests (k6, JMeter, Azure Load Testing, etc.).\n> Each tool gets its own subdirectory.\n', 'utf8');
176
+ }
177
+ updated.push(integrationReadme);
178
+ console.log(` [created] ${path.relative(cwd, integrationReadme)}`);
179
+ }
180
+ if (!fs.existsSync(loadReadme)) {
181
+ if (!dryRun) {
182
+ fs.mkdirSync(path.dirname(loadReadme), { recursive: true });
183
+ fs.writeFileSync(loadReadme,
184
+ '# Load Tests\n\n> Placeholder for load and performance tests.\n> Each tool gets its own subdirectory (e.g. k6/, jmeter/).\n', 'utf8');
185
+ }
186
+ updated.push(loadReadme);
187
+ console.log(` [created] ${path.relative(cwd, loadReadme)}`);
188
+ }
189
+
190
+ // 5e. Patch playwright.config.ts in e2e/:
191
+ const playwrightConfigPath = path.join(e2eDir, 'playwright.config.ts');
192
+ if (fs.existsSync(playwrightConfigPath)) {
193
+ let cfg = fs.readFileSync(playwrightConfigPath, 'utf8');
194
+ let cfgChanged = false;
195
+
196
+ // Fix testDir: '.' -> './tests'
197
+ if (/testDir\s*:\s*['"]\.['"]/.test(cfg)) {
198
+ cfg = cfg.replace(/testDir\s*:\s*['"]\.['"]/g, "testDir: './tests'");
199
+ cfgChanged = true;
200
+ console.log(` [patched] e2e/playwright.config.ts — testDir: '.' -> './tests'`);
201
+ }
202
+
203
+ // Inject testIgnore after testDir line if not present
204
+ if (!cfg.includes('testIgnore')) {
205
+ cfg = cfg.replace(
206
+ /(testDir\s*:.*\n)/,
207
+ "$1 testIgnore: ['**/helpers/debug/**', '**/seeds/**'],\n"
208
+ );
209
+ cfgChanged = true;
210
+ console.log(` [patched] e2e/playwright.config.ts — added testIgnore`);
211
+ }
212
+
213
+ if (cfgChanged) {
214
+ if (!dryRun) fs.writeFileSync(playwrightConfigPath, cfg, 'utf8');
215
+ updated.push(playwrightConfigPath);
216
+ }
217
+ }
218
+
219
+ // Create tests/helpers/debug and tests/seeds if missing
220
+ for (const subdir of ['tests/helpers/debug', 'tests/seeds']) {
221
+ const subdirPath = path.join(e2eDir, subdir);
222
+ if (!fs.existsSync(subdirPath)) {
223
+ if (!dryRun) fs.mkdirSync(subdirPath, { recursive: true });
224
+ updated.push(subdirPath);
225
+ console.log(` [created] ${path.relative(cwd, subdirPath)}/`);
226
+ }
227
+ }
228
+
101
229
  // ---------------------------------------------------------------------------
102
230
  // Summary
103
231
  // ---------------------------------------------------------------------------
@@ -63,7 +63,7 @@ After sync, each TC file must have `adoId: <NNN>` in its YAML frontmatter block.
63
63
 
64
64
  ### Step 4 — Configure Playwright ADO reporter
65
65
 
66
- See `references/scripts-and-config.md` for the reporter config block to add to `qa/07-automation/playwright.config.ts`.
66
+ See `references/scripts-and-config.md` for the reporter config block to add to `qa/07-automation/e2e/playwright.config.ts`.
67
67
 
68
68
  Required fields:
69
69
  - `orgUrl`, `projectName`, `planId`, `runName`
@@ -100,4 +100,4 @@ Update `qa/08-azure-integration/module-registry.json` with:
100
100
  - ADO Test Plan populated with test cases
101
101
  - `qa/03-test-cases/automated/TC-*.md` — ADO IDs injected
102
102
  - `qa/08-azure-integration/module-registry.json` updated
103
- - `qa/07-automation/playwright.config.ts` updated with reporter config
103
+ - `qa/07-automation/e2e/playwright.config.ts` updated with reporter config
@@ -14,7 +14,7 @@ description: >
14
14
 
15
15
  **Stage**: 5 — Automation
16
16
  **Prerequisite**: All specs for the target submodule are complete and contain no `PENDING-CODE` sections
17
- **Output**: `qa/07-automation/e2e/{module}/{submodule}.spec.ts` + supporting files
17
+ **Output**: `qa/07-automation/e2e/tests/{module}/{submodule}.spec.ts` + supporting files
18
18
  **Next stage**: Stage 6 — Maintenance (`qa-maintenance`) or Stage 5b — Stabilization (`qa-test-stabilization`) if tests fail
19
19
 
20
20
  > **Pipeline rule**: Never automate a TC whose spec contains `PENDING-CODE`. Resolve spec gaps first.
@@ -24,8 +24,8 @@ description: >
24
24
  ## Inputs Required
25
25
 
26
26
  1. `qa/01-specifications/{module}/` — full spec set for target submodule
27
- 2. `qa/07-automation/playwright.config.ts` — confirm project name maps to submodule tag
28
- 3. `qa/07-automation/fixtures/auth.ts` — identify available auth fixtures
27
+ 2. `qa/07-automation/e2e/playwright.config.ts` — confirm project name maps to submodule tag
28
+ 3. `qa/07-automation/e2e/fixtures/auth.ts` — identify available auth fixtures
29
29
  4. TC list (from test plan or Stage 4) — defines which TCs to automate in this session
30
30
  5. `qa/qa-framework.config.json` → screenshotPath, automationRoot
31
31
 
@@ -38,7 +38,7 @@ description: >
38
38
  For every new submodule, run a dedicated inspection script before writing tests.
39
39
  **Template**: `references/dom-inspection-template.js` — copy, set the 4 constants at the top, run.
40
40
 
41
- 1. Copy `references/dom-inspection-template.js` → `qa/07-automation/_inspect-{submodule}.js`
41
+ 1. Copy `references/dom-inspection-template.js` → `qa/07-automation/e2e/_inspect-{submodule}.js`
42
42
  2. Set the 4 constants at the top of the script:
43
43
  - `MODULE_ROUTE` — the submodule's URL path (e.g. `'/Users'`, `'/Products/list'`)
44
44
  - `APP_SHELL_SEL` — a selector that confirms the SPA has loaded (nav, sidebar, app shell)
@@ -150,7 +150,7 @@ See `references/patterns.md` for full TypeScript implementations.
150
150
 
151
151
  ## Outputs
152
152
 
153
- - `qa/07-automation/e2e/{module}/{submodule}.spec.ts`
153
+ - `qa/07-automation/e2e/tests/{module}/{submodule}.spec.ts`
154
154
  - `qa/07-automation/e2e/page-objects/{SubmoduleName}Page.ts` (when POM criteria met)
155
- - `qa/07-automation/playwright.config.ts` (updated or confirmed)
155
+ - `qa/07-automation/e2e/playwright.config.ts` (updated or confirmed)
156
156
  - `qa/README.md` automation status updated
@@ -24,7 +24,7 @@ description: >
24
24
 
25
25
  1. Description of the change — which submodule, what changed, and why
26
26
  2. `qa/01-specifications/{module}/` — specs affected by the change
27
- 3. `qa/07-automation/e2e/{module}/` — automation affected by the change
27
+ 3. `qa/07-automation/e2e/tests/{module}/` — automation affected by the change
28
28
  4. Optionally: ADO work item or defect report describing the change
29
29
 
30
30
  ---
@@ -105,6 +105,6 @@ change-summary: {one-line description of what changed}
105
105
 
106
106
  - Updated `qa/01-specifications/{module}/*.md` files
107
107
  - Updated `qa/03-test-cases/automated/TC-*.md` files
108
- - Updated `qa/07-automation/e2e/{module}/*.spec.ts`
108
+ - Updated `qa/07-automation/e2e/tests/{module}/*.spec.ts`
109
109
  - Updated `qa/README.md`
110
110
  - Updated `AGENT-NEXT-STEPS.md` (or sprint moved to history if complete)
@@ -38,7 +38,9 @@ for (const key of required) {
38
38
 
39
39
  export default defineConfig({
40
40
  // ------ Test discovery ------
41
- testDir: '.',
41
+ testDir: './tests',
42
+ // Exclude non-suite directories from test runs
43
+ testIgnore: ['**/helpers/debug/**', '**/seeds/**'],
42
44
  // Use any subdir pattern your project standardizes on, e.g.:
43
45
  // testMatch: ['**/*.spec.ts'],
44
46
 
@@ -1,266 +0,0 @@
1
- # Agent Instructions: Module Analysis
2
-
3
- > ⚠️ **DEPRECATED**: This file is superseded by `.github/skills/qa-module-analysis/SKILL.md`.
4
- > Kept as reference during the transition period. Do not update this file.
5
-
6
- **File**: `agent-instructions/00-module-analysis.md`
7
- **Purpose**: Instructions for an AI agent to perform complete functional analysis of an application module and produce the 6-file specification set.
8
-
9
- ---
10
-
11
- ## When to use these instructions
12
-
13
- Use this instruction set when:
14
- - Analyzing a new module for the first time
15
- - A module has been updated and its spec needs to be refreshed
16
- - Building the initial `01-specifications/` tree for a project
17
-
18
- ---
19
-
20
- ## Prerequisites (Agent must verify before starting)
21
-
22
- 1. Confirm that `qa-framework.config.json` exists and contains `project.qaBaseUrl`
23
- 2. Confirm that `qa/00-standards/naming-conventions.md` is available
24
- 3. Confirm that the Playwright CLI (playwright-mcp or equivalent) is available for browser interaction
25
- 4. Ask the user for:
26
- - The module name and URL (or route prefix) to analyze
27
- - The submodules to analyze (if known; otherwise discover from the UI)
28
- - QA user credentials (handle via env vars — never store in markdown)
29
-
30
- **⚠️ SECURITY**: Never write real credentials to any file. If credentials appear in any output, replace immediately with `<PLACEHOLDER>`.
31
-
32
- ---
33
-
34
- ## Phase 1 — Preparation
35
-
36
- ### 1.1 Review existing specs
37
-
38
- Check if a `qa/01-specifications/module-{name}/` directory already exists.
39
-
40
- - If it does: read all existing files to understand what is already documented. Only re-analyze what has changed.
41
- - If it does not: create the directory structure.
42
-
43
- ### 1.2 Generate module code
44
-
45
- If no module code exists yet, allocate a unique 2–6 uppercase letter code for the module.
46
- Check `qa/00-standards/naming-conventions.md` for existing codes to avoid conflicts.
47
-
48
- Example: module "Operación" → code `OPER`; submodule "Catálogos" → code `CAT`
49
-
50
- ### 1.3 Plan the session
51
-
52
- Identify all submodules in scope. A submodule typically corresponds to:
53
- - A distinct menu item or section in the application
54
- - A distinct CRUD entity (users, products, orders, etc.)
55
- - A distinct workflow (approval, registration, reporting)
56
-
57
- Document the planned submodules in `qa/01-specifications/module-{name}/README.md` before analysis begins.
58
-
59
- ---
60
-
61
- ## Phase 2 — Exploration
62
-
63
- For each submodule, perform the following exploration using browser automation (Playwright CLI):
64
-
65
- ### 2.1 Navigation and route mapping
66
-
67
- ```
68
- Navigate to {{QA_BASE_URL}} and log in with the appropriate role
69
- Navigate to the submodule URL
70
- Record:
71
- - Full URL of each page/view
72
- - Page title
73
- - Navigation breadcrumb
74
- ```
75
-
76
- ### 2.2 UI inventory
77
-
78
- For each screen in the submodule:
79
-
80
- ```
81
- Record all:
82
- - Input fields (name, type, required/optional, validation rules visible in UI)
83
- - Dropdowns (static or dynamic/AJAX, options if static)
84
- - Buttons (action, what they trigger)
85
- - Tables/grids (columns, default sorting, pagination)
86
- - Modals (trigger condition, fields, confirmation behavior)
87
- - Status indicators / badges / alerts
88
- - File upload / download controls
89
- ```
90
-
91
- ### 2.3 API endpoint discovery
92
-
93
- ```
94
- Observe network requests during key interactions (create, read, update, delete)
95
- Record:
96
- - Endpoint path (e.g., /api/GetUsers, api/CreateUser)
97
- - HTTP method
98
- - Request payload shape (field names)
99
- - Response shape (key fields)
100
- ```
101
-
102
- ### 2.4 Role-based access testing
103
-
104
- ```
105
- For each configured test user role:
106
- Log in as that role
107
- Navigate to the submodule
108
- Record: can access? (YES / NO / PERMISSION_ERROR)
109
- Record: which actions are available vs hidden
110
- ```
111
-
112
- ### 2.5 Workflow discovery
113
-
114
- ```
115
- Execute the primary happy path with appropriate test data
116
- Record each step
117
- Identify branch points (e.g., approve vs reject)
118
- Record state transitions
119
- ```
120
-
121
- ### 2.6 Business rule discovery
122
-
123
- ```
124
- Attempt invalid inputs for each validation
125
- Record: validation message text, field that shows the error
126
- Attempt boundary conditions (empty, max length, duplicate, etc.)
127
- Record: system behavior
128
- ```
129
-
130
- ---
131
-
132
- ## Phase 3 — Documentation (6-file output)
133
-
134
- Produce the following files for each submodule. Use the templates in `qa/00-standards/` and `templates/specification/`.
135
-
136
- ### File 00: `00-inventory.md`
137
-
138
- Contents:
139
- - Module header (name, code, URL, deployment date if known)
140
- - Submodule header (name, code, routes)
141
- - UI element inventory table
142
- - Element name | Type | Required | Notes
143
- - API endpoint table
144
- - Method | Path | Purpose
145
- - Key identifiers and selectors observed in the UI
146
-
147
- ### File 01: `01-business-rules.md`
148
-
149
- Contents:
150
- - Each rule as `RN-{MODULE}-{NNN}`: Description
151
- - Rule type: Validation / Access Control / State Machine / Calculation / Integration
152
- - Trigger: what user action triggers this rule
153
- - Error message: exact text shown when rule is violated (if applicable)
154
-
155
- Aim for 5–15 business rules per submodule.
156
-
157
- ### File 02: `02-workflows.md`
158
-
159
- Contents:
160
- - Each major workflow as `FL-{MODULE}-{NNN}`: Title
161
- - Use ASCII flowchart or Mermaid block diagram
162
- - Cover: happy path + main alternative paths + error paths
163
-
164
- ### File 03: `03-roles-permissions.md`
165
-
166
- Contents:
167
- - Role × Feature matrix table
168
- - Row: test user role
169
- - Column: feature/action (view, create, edit, delete, approve, export, etc.)
170
- - Cell: ✅ / ❌ / ⚠️ (limited)
171
- - Notes on role inheritance or conditional access
172
-
173
- ### File 04: `04-test-data.md`
174
-
175
- Contents:
176
- - Prerequisites: what data must exist before tests run
177
- - Data shapes: for each key test scenario, what data is needed
178
- - DO NOT include real user credentials
179
- - Use env var references for any credential: `process.env.QA_USER_EMAIL`
180
- - Data dependencies between submodules (if any)
181
-
182
- ### File 05: `05-test-scenarios.md`
183
-
184
- Contents:
185
- - Summary table at top: total TCs, by priority, by type
186
- - For each TC:
187
- - ID: `TC-{MODULE}-{SUBMODULE}-{NNN}`
188
- - Title: brief action description
189
- - Priority: P0 / P1 / P2 / P3
190
- - Type: Functional / Regression / Security / Negative / Integration
191
- - Origin: `UI-OBSERVED` / `PENDING-CODE` / `BLOCKED-PERMISSIONS`
192
- - Preconditions
193
- - Steps (numbered)
194
- - Expected result
195
- - Automation feasibility: Yes / Partial / No
196
-
197
- Target: **50–85 TCs per submodule** is a well-analyzed submodule.
198
-
199
- #### TC coverage must include:
200
- - ✅ Access control (each role: can access / cannot access)
201
- - ✅ Happy path (primary workflow end-to-end)
202
- - ✅ Negative scenarios (required field empty, invalid format, duplicate, etc.)
203
- - ✅ State transitions (create → edit → delete; pending → approved → rejected)
204
- - ✅ Cross-module dependencies (if any)
205
- - ✅ Export/download (if feature exists)
206
- - ✅ Pagination/search (if feature exists)
207
-
208
- TC origin rules:
209
- - Only write `UI-OBSERVED` if you directly observed the behavior in the QA environment
210
- - If a feature is documented but not visible in the QA environment: `PENDING-CODE`
211
- - If you couldn't test it due to permission restrictions: `BLOCKED-PERMISSIONS`
212
-
213
- ---
214
-
215
- ## Phase 4 — Review and Session Summary
216
-
217
- ### 4.1 Completeness checklist
218
-
219
- After completing all submodule files, verify:
220
-
221
- - [ ] All menu items in the module have a corresponding submodule folder
222
- - [ ] All TCs marked `UI-OBSERVED` were actually observed in this session
223
- - [ ] `01-business-rules.md` covers all visible validation behaviors
224
- - [ ] `03-roles-permissions.md` reflects the access observed for each role
225
- - [ ] No credentials appear in any file
226
- - [ ] All TC IDs are unique across the module
227
- - [ ] Module README lists all submodules with their codes and TC counts
228
-
229
- ### 4.2 Write session summary
230
-
231
- Create `qa/SESSION-SUMMARY-{YYYY-MM-DD}.md` with:
232
-
233
- ```markdown
234
- # Session Summary — {YYYY-MM-DD}
235
-
236
- ## Module analyzed
237
- {module-name} ({module-code})
238
-
239
- ## Submodules documented
240
- | Submodule | Code | TC count | Notes |
241
- |-----------|------|----------|-------|
242
- | {name} | {code} | {N} | {any notable blocking issues} |
243
-
244
- ## Files created
245
- - {list of all files created with their paths}
246
-
247
- ## Blockers
248
- - {any features that couldn't be analyzed and why}
249
-
250
- ## Observations for next session
251
- - {what to tackle next}
252
- ```
253
-
254
- ---
255
-
256
- ## Quality Standards
257
-
258
- A well-executed module analysis session:
259
-
260
- 1. Takes between 2-6 hours depending on module complexity
261
- 2. Produces 6 files per submodule (not more, not less)
262
- 3. Has no hardcoded credentials in any file
263
- 4. Has TC IDs that follow the `TC-{MODULE}-{SUBMODULE}-{NNN}` pattern
264
- 5. Has business rules that are verifiable in automated tests
265
- 6. Has at least 1 P0 TC per submodule (the primary happy path)
266
- 7. Does not invent TCs for behavior that wasn't observed in the QA environment