valent-pipeline 0.2.19 → 0.2.21
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.
- package/README.md +438 -0
- package/package.json +1 -1
- package/pipeline/agents-manifest.yaml +61 -1
- package/pipeline/docs/agent-reference.md +82 -23
- package/pipeline/docs/design/refactor-checklist.md +111 -0
- package/pipeline/docs/index.md +60 -0
- package/pipeline/docs/lead-lifecycle.md +1 -1
- package/pipeline/docs/pipeline-overview.md +4 -0
- package/pipeline/prompts/bend.md +5 -11
- package/pipeline/prompts/critic.md +9 -0
- package/pipeline/prompts/data.md +59 -0
- package/pipeline/prompts/docgen.md +61 -0
- package/pipeline/prompts/fend.md +3 -10
- package/pipeline/prompts/iac.md +70 -0
- package/pipeline/prompts/knowledge.md +2 -0
- package/pipeline/prompts/lead.md +97 -6
- package/pipeline/prompts/libdev.md +61 -0
- package/pipeline/prompts/mcp-dev.md +59 -0
- package/pipeline/prompts/mobile.md +92 -0
- package/pipeline/prompts/qa-a.md +1 -1
- package/pipeline/prompts/qa-b.md +1 -1
- package/pipeline/prompts/reqs.md +5 -1
- package/pipeline/scripts/db-bootstrap.ts +1 -1
- package/pipeline/scripts/embed-sqlite.ts +5 -0
- package/pipeline/steps/common/quality-standards.md +19 -0
- package/pipeline/steps/critic/data-pipeline.md +28 -0
- package/pipeline/steps/critic/document-generation.md +21 -0
- package/pipeline/steps/critic/iac.md +29 -0
- package/pipeline/steps/critic/library.md +24 -0
- package/pipeline/steps/critic/mcp-server.md +24 -0
- package/pipeline/steps/critic/mobile-app.md +29 -0
- package/pipeline/steps/data/estimate.md +51 -0
- package/pipeline/steps/data/handoff.md +9 -0
- package/pipeline/steps/data/implement.md +16 -0
- package/pipeline/steps/data/read-inputs.md +13 -0
- package/pipeline/steps/data/write-tests.md +13 -0
- package/pipeline/steps/docgen/estimate.md +49 -0
- package/pipeline/steps/docgen/handoff.md +9 -0
- package/pipeline/steps/docgen/implement.md +19 -0
- package/pipeline/steps/docgen/read-inputs.md +13 -0
- package/pipeline/steps/docgen/write-tests.md +15 -0
- package/pipeline/steps/iac/estimate.md +50 -0
- package/pipeline/steps/iac/handoff.md +9 -0
- package/pipeline/steps/iac/implement.md +19 -0
- package/pipeline/steps/iac/read-inputs.md +13 -0
- package/pipeline/steps/iac/write-tests.md +20 -0
- package/pipeline/steps/judge/ship-decision.md +14 -1
- package/pipeline/steps/libdev/estimate.md +49 -0
- package/pipeline/steps/libdev/handoff.md +9 -0
- package/pipeline/steps/libdev/implement.md +19 -0
- package/pipeline/steps/libdev/read-inputs.md +13 -0
- package/pipeline/steps/libdev/write-tests.md +16 -0
- package/pipeline/steps/mcp-dev/estimate.md +49 -0
- package/pipeline/steps/mcp-dev/handoff.md +9 -0
- package/pipeline/steps/mcp-dev/implement.md +29 -0
- package/pipeline/steps/mcp-dev/read-inputs.md +13 -0
- package/pipeline/steps/mcp-dev/write-tests.md +19 -0
- package/pipeline/steps/mobile/emulator-lifecycle.md +67 -0
- package/pipeline/steps/mobile/estimate.md +51 -0
- package/pipeline/steps/mobile/flutter.md +30 -0
- package/pipeline/steps/mobile/handoff.md +18 -0
- package/pipeline/steps/mobile/implement.md +20 -0
- package/pipeline/steps/mobile/react-native.md +32 -0
- package/pipeline/steps/mobile/read-inputs.md +10 -0
- package/pipeline/steps/mobile/write-tests.md +59 -0
- package/pipeline/steps/orchestration/adopt-lead-and-create-team.md +1 -1
- package/pipeline/steps/orchestration/sprint-execute.md +3 -2
- package/pipeline/steps/orchestration/sprint-groom.md +4 -0
- package/pipeline/steps/orchestration/sprint-size.md +26 -16
- package/pipeline/steps/orchestration/validate-story-inputs.md +9 -0
- package/pipeline/steps/qa-a/data-pipeline.md +32 -0
- package/pipeline/steps/qa-a/document-generation.md +52 -0
- package/pipeline/steps/qa-a/iac.md +30 -0
- package/pipeline/steps/qa-a/library.md +42 -0
- package/pipeline/steps/qa-a/mcp-server.md +31 -0
- package/pipeline/steps/qa-a/mobile-app.md +59 -0
- package/pipeline/steps/qa-b/data-pipeline.md +48 -0
- package/pipeline/steps/qa-b/document-generation.md +47 -0
- package/pipeline/steps/qa-b/iac.md +44 -0
- package/pipeline/steps/qa-b/library.md +61 -0
- package/pipeline/steps/qa-b/mcp-server.md +40 -0
- package/pipeline/steps/qa-b/mobile-app.md +71 -0
- package/pipeline/steps/readiness/standalone-review.md +7 -2
- package/pipeline/steps/reqs/data-pipeline.md +56 -0
- package/pipeline/steps/reqs/document-generation.md +55 -0
- package/pipeline/steps/reqs/draft-brief.md +10 -0
- package/pipeline/steps/reqs/iac.md +63 -0
- package/pipeline/steps/reqs/library.md +56 -0
- package/pipeline/steps/reqs/mcp-server.md +48 -0
- package/pipeline/steps/reqs/mobile-app.md +54 -0
- package/pipeline/steps/reqs/self-review.md +5 -3
- package/pipeline/task-graphs/backend-api.yaml +19 -2
- package/pipeline/task-graphs/data-pipeline.yaml +29 -12
- package/pipeline/task-graphs/document-generation.yaml +29 -12
- package/pipeline/task-graphs/frontend-only.yaml +19 -2
- package/pipeline/task-graphs/fullstack-web.yaml +19 -2
- package/pipeline/task-graphs/library.yaml +29 -12
- package/pipeline/task-graphs/mcp-server.yaml +29 -12
- package/pipeline/task-graphs/mobile-app.yaml +171 -0
- package/pipeline/templates/bugs.template.md +1 -1
- package/pipeline/templates/critic-review.template.md +1 -1
- package/pipeline/templates/data-handoff.template.md +96 -0
- package/pipeline/templates/docgen-handoff.template.md +83 -0
- package/pipeline/templates/iac-handoff.template.md +83 -0
- package/pipeline/templates/judge-decision.template.md +11 -1
- package/pipeline/templates/libdev-handoff.template.md +82 -0
- package/pipeline/templates/mcp-dev-handoff.template.md +87 -0
- package/pipeline/templates/mobile-handoff.template.md +122 -0
- package/pipeline/templates/reqs-brief.template.md +60 -4
- package/skills/valent-run-deferred-tests/SKILL.md +109 -0
- package/skills/valent-run-epic/SKILL.md +1 -1
- package/skills/valent-run-project/SKILL.md +1 -1
- package/src/commands/db-rebuild.js +5 -0
- package/src/lib/config-schema.js +1 -1
- package/src/lib/db.js +1 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# QA-A Step: MCP Server Testing
|
|
2
|
+
|
|
3
|
+
## Protocol Smoke Test Specification
|
|
4
|
+
|
|
5
|
+
For every MCP tool in this story, write a **Protocol Smoke Test** table:
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
## Protocol Smoke Tests
|
|
9
|
+
|
|
10
|
+
| ID | JSON-RPC Method | Params | Expected Result Shape | Expected Error Code |
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Rules:
|
|
14
|
+
- Initialize handshake first: `initialize` request must be the first row, verifying server info and capabilities
|
|
15
|
+
- `tools/list` must follow, verifying all tools are registered with correct inputSchema
|
|
16
|
+
- One `tools/call` row per tool with valid params (happy path)
|
|
17
|
+
- One `tools/call` row per tool with invalid params (schema violation, expecting `-32602`)
|
|
18
|
+
- Two-tier error model coverage: at least one row triggering `isError: true` (tool failure) and at least one row triggering a JSON-RPC error code (protocol failure)
|
|
19
|
+
- One row for unknown tool name (expecting `-32601` Method not found or `-32602` Invalid params)
|
|
20
|
+
- One row for malformed JSON-RPC (expecting `-32700` or `-32600`)
|
|
21
|
+
- Expected result shape: key fields and content types QA-B must verify
|
|
22
|
+
- Params: exact JSON payload for the JSON-RPC params field
|
|
23
|
+
|
|
24
|
+
## Quality Gate Additions
|
|
25
|
+
|
|
26
|
+
- [ ] Protocol smoke test table covers initialize handshake
|
|
27
|
+
- [ ] Protocol smoke test table covers tools/list
|
|
28
|
+
- [ ] Protocol smoke test table covers tools/call for every tool (happy path + error paths)
|
|
29
|
+
- [ ] Two-tier error model tested: at least one JSON-RPC error code and one isError:true
|
|
30
|
+
- [ ] Invalid args test included for every tool
|
|
31
|
+
- [ ] Unknown tool / unknown method test included
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# QA-A Step: Mobile App Testing
|
|
2
|
+
|
|
3
|
+
## Maestro Flow Specification
|
|
4
|
+
|
|
5
|
+
For every mobile screen/flow in this story, write a **Maestro Flow Specification** table:
|
|
6
|
+
|
|
7
|
+
### Maestro Flow Specifications
|
|
8
|
+
|
|
9
|
+
| ID | Flow Name | App State Setup | Steps | Expected Result | Platform |
|
|
10
|
+
|----|-----------|-----------------|-------|-----------------|----------|
|
|
11
|
+
|
|
12
|
+
Column rules:
|
|
13
|
+
- **ID:** Sequential flow identifier (MF-001, MF-002, ...)
|
|
14
|
+
- **Flow Name:** Descriptive name matching the AC being tested
|
|
15
|
+
- **App State Setup:** How to reach the required starting state. Every flow starts with `clearState` + `launchApp`. If seed data is needed, specify the API call or fixture.
|
|
16
|
+
- **Steps:** Sequence of Maestro actions (`launchApp`, `tapOn`, `assertVisible`, `inputText`, `scroll`, `back`, `swipe`, `openLink`, `takeScreenshot`)
|
|
17
|
+
- **Expected Result:** What the user should see after the flow completes (assert conditions)
|
|
18
|
+
- **Platform:** `both` (default) | `android-only` | `ios-only`
|
|
19
|
+
|
|
20
|
+
### Flow Writing Rules
|
|
21
|
+
|
|
22
|
+
1. Every flow MUST start with `clearState` or `launchApp` with `clearState: true` — no state carryover from previous flows
|
|
23
|
+
2. Every flow MUST be independent — no ordering dependency between flows
|
|
24
|
+
3. Use `assertVisible` and `assertNotVisible` for assertions, not fixed-time waits
|
|
25
|
+
4. Use `waitForAnimationToEnd` for animation settling, not `extendedWaitUntil` with hardcoded durations
|
|
26
|
+
5. For deep link tests, use `openLink` command with the URI pattern from reqs-brief
|
|
27
|
+
6. Include `takeScreenshot` at key assertion points for evidence capture
|
|
28
|
+
|
|
29
|
+
## Platform-Conditional Test Requirements
|
|
30
|
+
|
|
31
|
+
For each AC, specify:
|
|
32
|
+
- **Both platforms** (default): tests that verify identical behavior on Android and iOS
|
|
33
|
+
- **Android-specific:** tests for Android-only behavior (hardware back button, specific permissions, Android notification channels)
|
|
34
|
+
- **iOS-specific:** tests for iOS-only behavior (swipe-to-go-back, Face ID/Touch ID, iOS notification categories)
|
|
35
|
+
|
|
36
|
+
Mark iOS-specific tests with `[DEFER-IOS]` if the pipeline host may be Windows/Linux. The MOBILE agent will move these to the deferred queue.
|
|
37
|
+
|
|
38
|
+
## State Isolation Requirements
|
|
39
|
+
|
|
40
|
+
- Every Maestro flow must be independent (no ordering dependency)
|
|
41
|
+
- App state cleared between flows via `adb shell pm clear {package}` / simulator equivalent
|
|
42
|
+
- If a flow requires seed data, specify the exact API call or fixture to set it up before the flow
|
|
43
|
+
- If a flow requires specific permissions, specify which permissions must be pre-granted
|
|
44
|
+
|
|
45
|
+
## API Integration for Mobile
|
|
46
|
+
|
|
47
|
+
When a story's mobile app calls backend APIs, the spec MUST include:
|
|
48
|
+
- At least one Maestro flow per API-calling AC that exercises the real API round-trip (app → API → database → response → UI update)
|
|
49
|
+
- No mocked API responses in Maestro flows (Maestro does not support API interception — this is enforced by design)
|
|
50
|
+
- Infrastructure prerequisite: "API server must be running before Maestro flow execution"
|
|
51
|
+
|
|
52
|
+
## Quality Gate Additions
|
|
53
|
+
|
|
54
|
+
- [ ] Every AC has at least one Maestro flow specification
|
|
55
|
+
- [ ] State isolation documented for every flow (clearState + seed data if needed)
|
|
56
|
+
- [ ] Platform-specific tests explicitly tagged (both / android-only / ios-only)
|
|
57
|
+
- [ ] No flow depends on another flow's output state
|
|
58
|
+
- [ ] Deep link tests included for screens with URI patterns
|
|
59
|
+
- [ ] Infrastructure prerequisites documented (API server, emulator, permissions)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# QA-B Step: Data Pipeline Testing
|
|
2
|
+
|
|
3
|
+
## Pipeline Execution Tests
|
|
4
|
+
|
|
5
|
+
Mandatory for all stories with data pipeline stages. Run the real pipeline against real data and real data stores.
|
|
6
|
+
|
|
7
|
+
**Procedure:**
|
|
8
|
+
|
|
9
|
+
1. **Seed sample data.** Per smoke test table in qa-test-spec.md. Use fixture files, seed scripts, or direct data store insertion. Include happy-path data, null/malformed records, and edge cases.
|
|
10
|
+
2. **Run pipeline.** Execute the full pipeline from ingest to output. Capture all logs.
|
|
11
|
+
3. **Validate row counts.** At each stage boundary, verify row counts match expected values from the smoke test table. Record actual vs expected.
|
|
12
|
+
4. **Spot-check values.** For each transform stage, verify a sample of output records against expected values. Check data types, formats, null handling, and edge cases.
|
|
13
|
+
5. **Re-run pipeline (idempotency).** Run the same pipeline again with the same input. Assert that the output is identical -- no duplicate rows, no changed values, no side effects from the second run.
|
|
14
|
+
6. **Kill and restart (checkpoint/resume).** If the pipeline supports checkpointing: run the pipeline, kill it mid-execution (after at least one checkpoint), restart, and verify that the final output matches a clean full run.
|
|
15
|
+
7. **Record results** in `## Pipeline Execution Results` of execution-report.md.
|
|
16
|
+
|
|
17
|
+
**Pipeline Execution Results table:**
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
| ID | Stage | Input Rows | Expected Output Rows | Actual Output Rows | Spot-Check Values | Idempotency | Result |
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Row Count Reconciliation:**
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
| Stage | Input | Output | Dropped | Drop Reason | Expected Delta | Actual Delta | Match |
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Include full pipeline logs and commands for reproducibility.
|
|
30
|
+
|
|
31
|
+
**Failure handling:**
|
|
32
|
+
- Pipeline fails to start: file P1 bug, record error, continue.
|
|
33
|
+
- Stage produces wrong row count: file bug at appropriate priority, continue remaining stages.
|
|
34
|
+
- Idempotency fails (duplicates on re-run): file P1 bug, record both run outputs.
|
|
35
|
+
- Checkpoint/resume produces different output than clean run: file P1 bug, record both outputs.
|
|
36
|
+
- Pipeline crashes mid-run: file P1 bug, record crash output, attempt restart.
|
|
37
|
+
|
|
38
|
+
**This step cannot be skipped.** If qa-test-spec.md lacks a Pipeline Smoke Tests section, construct the table from pipeline stages in reqs-brief.md and execute.
|
|
39
|
+
|
|
40
|
+
## Execution Report Additions
|
|
41
|
+
|
|
42
|
+
The execution report MUST include:
|
|
43
|
+
- `## Pipeline Execution Results` table with actual vs expected for every stage
|
|
44
|
+
- `## Row Count Reconciliation` table showing data flow through the pipeline
|
|
45
|
+
- Full pipeline execution logs
|
|
46
|
+
- Pipeline start command and configuration
|
|
47
|
+
- Idempotency verification results (both runs compared)
|
|
48
|
+
- Checkpoint/resume verification results (if applicable)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# QA-B Step: Document Generation Testing
|
|
2
|
+
|
|
3
|
+
## Render Validation Tests
|
|
4
|
+
|
|
5
|
+
Mandatory for all stories with document generation. Invoke the real render pipeline and validate actual output.
|
|
6
|
+
|
|
7
|
+
**Procedure:**
|
|
8
|
+
|
|
9
|
+
1. **Seed template and input data.** Per render smoke test table in qa-test-spec.md. Load templates and prepare input data fixtures (JSON, database records, or programmatic setup).
|
|
10
|
+
2. **Invoke document generation.** Call the render pipeline with the seeded template and input data. Capture the generated output (file, buffer, or stream).
|
|
11
|
+
3. **Verify output format and MIME type.** Confirm the output matches the expected format (PDF, HTML, Markdown) and has the correct MIME type.
|
|
12
|
+
4. **Parse output structure.** For HTML: parse the DOM. For PDF: extract text and metadata. For Markdown: parse structure. Verify the output is well-formed and parseable.
|
|
13
|
+
5. **Check variable substitution.** Verify all expected variable values appear in the output at correct positions. Verify no unsubstituted template markers (`{{varName}}`, `${varName}`, `{% raw %}`, etc.) remain.
|
|
14
|
+
6. **Verify encoding.** Confirm UTF-8 encoding. Test with unicode data (CJK, emoji, RTL) and verify output preserves characters correctly -- no mojibake, no replacement characters.
|
|
15
|
+
7. **Execute edge-case data tests.** Per render smoke test table: null variables, missing optional fields, empty collections, extremely long strings, special characters. Verify graceful handling.
|
|
16
|
+
8. **Record results** in `## Render Validation Results` of execution-report.md.
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
## Render Validation Results
|
|
20
|
+
|
|
21
|
+
| ID | Template | Input Data | Expected Format | Actual Format | Substitution Check | Encoding Check | Result |
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Include raw generation commands and output excerpts for reproducibility.
|
|
25
|
+
|
|
26
|
+
### Variable Substitution Audit
|
|
27
|
+
|
|
28
|
+
After all render tests execute, build a substitution audit:
|
|
29
|
+
|
|
30
|
+
| Template | Total Variables | Substituted Correctly | Null Handled | Missing Handled | Unsubstituted Markers Found |
|
|
31
|
+
|----------|----------------|----------------------|--------------|-----------------|---------------------------|
|
|
32
|
+
|
|
33
|
+
**Failure handling:**
|
|
34
|
+
- Render pipeline fails to start: file P1 bug, record error, continue.
|
|
35
|
+
- Render test fails: file bug at appropriate priority, continue remaining tests.
|
|
36
|
+
- Output contains unsubstituted markers: file P1 bug -- this is a data leak / presentation defect.
|
|
37
|
+
- Encoding errors (mojibake, replacement characters): file P2 bug.
|
|
38
|
+
|
|
39
|
+
**This step cannot be skipped.** If qa-test-spec.md lacks a Render Smoke Tests section, construct the table from template definitions in reqs-brief.md and execute.
|
|
40
|
+
|
|
41
|
+
## Execution Report Additions
|
|
42
|
+
|
|
43
|
+
The execution report MUST include:
|
|
44
|
+
- `## Render Validation Results` table with actual vs expected for every row
|
|
45
|
+
- Variable substitution audit table
|
|
46
|
+
- Raw generation commands and output excerpts
|
|
47
|
+
- Encoding verification details (input data with unicode, output confirmation)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# QA-B Step: Infrastructure Testing
|
|
2
|
+
|
|
3
|
+
## Infrastructure Validation Tests
|
|
4
|
+
|
|
5
|
+
Mandatory for all stories with infrastructure resources. Validate infrastructure definitions against real plan output and live state.
|
|
6
|
+
|
|
7
|
+
**Procedure:**
|
|
8
|
+
|
|
9
|
+
1. **Initialize.** Run `terraform init` (or equivalent) to initialize providers and modules. Verify initialization succeeds without errors.
|
|
10
|
+
2. **Plan validation.** Run `terraform plan` (or equivalent). Verify no errors. Capture plan output for review.
|
|
11
|
+
3. **Apply (if test environment available).** Run `terraform apply` against the test environment. Capture apply output.
|
|
12
|
+
4. **Verify resources exist.** For each resource in the smoke test table, verify it exists in the target environment using CLI or API queries.
|
|
13
|
+
5. **Verify tags.** For each resource, verify all standard tags are present (environment, project, owner, managed-by).
|
|
14
|
+
6. **Verify IAM policies.** For each IAM role/policy, verify least-privilege: no wildcard actions, no overly broad resource scopes.
|
|
15
|
+
7. **Idempotency check.** Run `terraform plan` again after apply. Expect no changes (zero diff). Any unexpected diff is a bug.
|
|
16
|
+
8. **Record results** in `## Infrastructure Validation Results` of execution-report.md.
|
|
17
|
+
|
|
18
|
+
**Infrastructure Validation Results table:**
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
| ID | Resource | Operation | Expected State | Actual State | Tags Valid | IAM Valid | Result |
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Include full command output for reproducibility.
|
|
25
|
+
|
|
26
|
+
**Failure handling:**
|
|
27
|
+
- Init fails: file P1 bug, record error, continue.
|
|
28
|
+
- Plan fails: file P1 bug, record plan output, continue.
|
|
29
|
+
- Apply fails: file P1 bug, record apply output, continue.
|
|
30
|
+
- Missing resource after apply: file P1 bug, continue remaining checks.
|
|
31
|
+
- Missing tags: file P2 bug, continue.
|
|
32
|
+
- Overly permissive IAM: file P1 bug, continue.
|
|
33
|
+
- Idempotency fails (diff after apply): file P1 bug, record both plan outputs.
|
|
34
|
+
|
|
35
|
+
**This step cannot be skipped.** If qa-test-spec.md lacks an Infrastructure Smoke Tests section, construct the table from infrastructure resources in reqs-brief.md and execute.
|
|
36
|
+
|
|
37
|
+
## Execution Report Additions
|
|
38
|
+
|
|
39
|
+
The execution report MUST include:
|
|
40
|
+
- `## Infrastructure Validation Results` table with actual vs expected for every resource
|
|
41
|
+
- Full terraform init/plan/apply output
|
|
42
|
+
- Tag verification results per resource
|
|
43
|
+
- IAM policy verification results
|
|
44
|
+
- Idempotency verification (second plan output showing no changes)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# QA-B Step: Library Testing
|
|
2
|
+
|
|
3
|
+
## Library Consumer Tests
|
|
4
|
+
|
|
5
|
+
Mandatory for all stories with library/package exports. Install the library in an isolated environment and test it as a real consumer would.
|
|
6
|
+
|
|
7
|
+
**Procedure:**
|
|
8
|
+
|
|
9
|
+
1. **Create isolated temp directory.** Initialize a fresh project with the appropriate package manager. This must be outside the library source tree.
|
|
10
|
+
2. **Install the library.** Use a local path install (`npm install ../path-to-lib`, `pip install -e ../path-to-lib`, etc.) to simulate a real consumer installation.
|
|
11
|
+
3. **Execute CJS import tests.** For each export in the Export Smoke Test table, `require()` the module path and verify the expected export is present and has the correct type/signature. Record PASS/FAIL.
|
|
12
|
+
4. **Execute ESM import tests.** For each export in the Export Smoke Test table, `import` the module path and verify the expected export is present and has the correct type/signature. Record PASS/FAIL.
|
|
13
|
+
5. **Execute API contract tests.** Call each exported function/class with the documented usage example. Verify return values match declared types and documented behavior.
|
|
14
|
+
6. **Measure bundle size.** If applicable, bundle the library with a standard bundler (esbuild, webpack, rollup) and record the output size. Flag if significantly larger than expected.
|
|
15
|
+
7. **Verify tree-shaking.** If `sideEffects: false` is declared, bundle a selective import and verify unused exports are excluded from the output.
|
|
16
|
+
8. **Clean up temp directory.**
|
|
17
|
+
|
|
18
|
+
**Record results** in `## Library Consumer Test Results` of execution-report.md:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
## Export Audit Results
|
|
22
|
+
|
|
23
|
+
| Export Name | CJS require() | ESM import | Type Declaration | Contract Test | Result |
|
|
24
|
+
|-------------|---------------|------------|-----------------|---------------|--------|
|
|
25
|
+
| {name} | {PASS/FAIL} | {PASS/FAIL} | {PASS/FAIL} | {PASS/FAIL} | {overall} |
|
|
26
|
+
|
|
27
|
+
## CJS/ESM Interop
|
|
28
|
+
|
|
29
|
+
| Test | Result | Notes |
|
|
30
|
+
|------|--------|-------|
|
|
31
|
+
| CJS require() resolves | {PASS/FAIL} | {details} |
|
|
32
|
+
| ESM import resolves | {PASS/FAIL} | {details} |
|
|
33
|
+
| Named exports match | {PASS/FAIL} | {details} |
|
|
34
|
+
| Default export consistent | {PASS/FAIL} | {details} |
|
|
35
|
+
| No dual-instance corruption | {PASS/FAIL} | {details} |
|
|
36
|
+
|
|
37
|
+
## Bundle Size
|
|
38
|
+
|
|
39
|
+
| Entry Point | Raw Size | Minified | Gzipped | Notes |
|
|
40
|
+
|-------------|----------|----------|---------|-------|
|
|
41
|
+
| {entry} | {bytes} | {bytes} | {bytes} | {flags if oversized} |
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Include raw commands and full output for reproducibility.
|
|
45
|
+
|
|
46
|
+
**Failure handling:**
|
|
47
|
+
- Install fails: file P1 bug, record error, continue.
|
|
48
|
+
- CJS/ESM import fails: file bug at appropriate priority, continue remaining tests.
|
|
49
|
+
- Type declarations missing: file P2 bug, continue.
|
|
50
|
+
- Bundle size exceeds threshold: file P3 bug as advisory.
|
|
51
|
+
|
|
52
|
+
**This step cannot be skipped.** If qa-test-spec.md lacks an Export Smoke Tests section, construct the table from exports in reqs-brief.md and execute.
|
|
53
|
+
|
|
54
|
+
## Execution Report Additions
|
|
55
|
+
|
|
56
|
+
The execution report MUST include:
|
|
57
|
+
- `## Export Audit Results` table with PASS/FAIL for each export and import method
|
|
58
|
+
- `## CJS/ESM Interop` table with detailed interop verification
|
|
59
|
+
- `## Bundle Size` table with measured sizes
|
|
60
|
+
- Raw install, import, and bundle commands with full output
|
|
61
|
+
- Isolated temp directory path and cleanup confirmation
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# QA-B Step: MCP Server Testing
|
|
2
|
+
|
|
3
|
+
## Protocol Compliance Tests
|
|
4
|
+
|
|
5
|
+
Mandatory for all stories with MCP server tools. Spawn a real server and communicate over the actual transport.
|
|
6
|
+
|
|
7
|
+
**Procedure:**
|
|
8
|
+
|
|
9
|
+
1. **Spawn server.** Start the MCP server process with the configured transport (stdio/SSE/HTTP). For stdio, connect to stdin/stdout pipes. For SSE/HTTP, poll the endpoint (max 10 retries, 1s apart) until the server accepts connections.
|
|
10
|
+
2. **JSON-RPC initialize.** Send `initialize` request. Verify server info (name, version) and capability declarations match expected values from qa-test-spec.md.
|
|
11
|
+
3. **tools/list.** Send `tools/list` request. Verify all expected tools are present with correct names, descriptions, and inputSchema.
|
|
12
|
+
4. **tools/call per tool.** For each tool in the protocol smoke test table, send `tools/call` with the specified params. Capture the result. Compare content types, result shape, and values against expected.
|
|
13
|
+
5. **Error paths.** Execute error path rows from the smoke test table:
|
|
14
|
+
- Unknown tool: send `tools/call` with a non-existent tool name. Verify JSON-RPC error response.
|
|
15
|
+
- Bad params: send `tools/call` with params violating the declared inputSchema. Verify `-32602` error code.
|
|
16
|
+
- Tool failure: trigger a tool-level error. Verify `isError: true` in the result.
|
|
17
|
+
- Malformed JSON: send raw invalid JSON over the transport. Verify `-32700` error code.
|
|
18
|
+
6. **Stop server.**
|
|
19
|
+
7. **Record results** in `## Protocol Compliance Results` of execution-report.md:
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
| ID | JSON-RPC Method | Params | Expected Result | Actual Result | Expected Error Code | Actual Error Code | Result |
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Include raw JSON-RPC request/response pairs for reproducibility.
|
|
26
|
+
|
|
27
|
+
**Failure handling:**
|
|
28
|
+
- Server fails to start: file P1 bug, record error, continue.
|
|
29
|
+
- Protocol test fails: file bug at appropriate priority, continue remaining tests.
|
|
30
|
+
- Server crashes mid-test: file P1 bug, record crash output, attempt restart.
|
|
31
|
+
|
|
32
|
+
**This step cannot be skipped.** If qa-test-spec.md lacks a Protocol Smoke Tests section, construct the table from tools in reqs-brief.md and execute.
|
|
33
|
+
|
|
34
|
+
## Execution Report Additions
|
|
35
|
+
|
|
36
|
+
The execution report MUST include:
|
|
37
|
+
- `## Protocol Compliance Results` table with actual vs expected for every row
|
|
38
|
+
- Raw JSON-RPC request/response pairs
|
|
39
|
+
- Server startup command and output
|
|
40
|
+
- Transport type and connection confirmation
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# QA-B Step: Mobile App Testing
|
|
2
|
+
|
|
3
|
+
## Pre-Execution: Verify Mobile Infrastructure
|
|
4
|
+
|
|
5
|
+
Before running Maestro flows:
|
|
6
|
+
|
|
7
|
+
1. **Emulator check:** Verify `adb devices` shows at least one connected emulator/device in `device` state (not `offline` or `unauthorized`)
|
|
8
|
+
2. **If no emulator:** Follow boot procedure from MOBILE's emulator-lifecycle step. If boot fails after retries, file P1 bug: "Android emulator failed to boot. Cannot execute Maestro flows."
|
|
9
|
+
3. **App installed check:** `adb shell pm list packages | grep {app_package}`. If app not listed, build and install per MOBILE procedure. If install fails, file P1 bug.
|
|
10
|
+
4. **iOS check (Mac only):** Verify `xcrun simctl list devices | grep Booted` shows at least one booted simulator. If iOS flows exist but no simulator is booted, boot one. If not on Mac, iOS flows are deferred (not a bug).
|
|
11
|
+
5. **API server check (if story calls APIs):** Send health check to API server. If unreachable, start via `docker compose up -d db api` or project-equivalent. If still unreachable, file P1 bug.
|
|
12
|
+
|
|
13
|
+
## Maestro Flow Execution
|
|
14
|
+
|
|
15
|
+
For each Maestro flow from qa-test-spec.md:
|
|
16
|
+
1. **State isolation:** `adb shell pm clear {app_package}` (Android) / `xcrun simctl terminate + privacy reset` (iOS)
|
|
17
|
+
2. **Pre-grant permissions:** per flow's permission requirements
|
|
18
|
+
3. **Execute:** `maestro test {flow_file}` (Android) or `maestro test {flow_file} --device {simulator}` (iOS)
|
|
19
|
+
4. **Capture evidence:** Maestro test output + any `takeScreenshot` captures
|
|
20
|
+
5. **Record result:** pass/fail with output details
|
|
21
|
+
|
|
22
|
+
## Post-Execution: Platform Coverage Audit
|
|
23
|
+
|
|
24
|
+
After all Maestro flows execute, audit platform coverage:
|
|
25
|
+
|
|
26
|
+
### Step 1: Scan Flow Results by Platform
|
|
27
|
+
|
|
28
|
+
| Flow File | Android Result | iOS Result | Both Required |
|
|
29
|
+
|-----------|---------------|------------|---------------|
|
|
30
|
+
| {flow} | {PASS \| FAIL} | {PASS \| FAIL \| DEFERRED} | {yes \| no} |
|
|
31
|
+
|
|
32
|
+
### Step 2: Check for Deferred iOS Tests
|
|
33
|
+
|
|
34
|
+
If host is not Mac:
|
|
35
|
+
- All iOS-only and `both` flows that could not run on iOS are deferred
|
|
36
|
+
- This is expected — NOT a bug
|
|
37
|
+
- Record in execution report as "iOS deferred — host OS limitation"
|
|
38
|
+
|
|
39
|
+
### Step 3: File Bugs
|
|
40
|
+
|
|
41
|
+
- **Android failures are always bugs** — Android emulator is always available
|
|
42
|
+
- **iOS failures on Mac are bugs** — if the simulator was available and a flow failed, that is a real failure
|
|
43
|
+
- **iOS inability on Windows/Linux is deferred, not a bug** — record as deferred with platform reason
|
|
44
|
+
|
|
45
|
+
### Step 4: Mock Coverage (N/A for Maestro)
|
|
46
|
+
|
|
47
|
+
Maestro flows inherently hit the real app and real API server — there is no API interception mechanism. Unlike Playwright `route.fulfill()`, Maestro cannot mock API responses. This means mock coverage audit is not applicable for Maestro E2E flows. However, verify:
|
|
48
|
+
- The app is configured to hit the real API server (check base URL in build config / environment)
|
|
49
|
+
- Actual network traffic is flowing (check `adb shell dumpsys netstats uid {app_uid}` for non-zero bytes)
|
|
50
|
+
- If all API calls show zero bytes, file P1 bug: "App appears to use hardcoded/cached data — no real API traffic detected"
|
|
51
|
+
|
|
52
|
+
## Execution Report Additions
|
|
53
|
+
|
|
54
|
+
The execution report MUST include:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
## Mobile Platform Coverage Audit
|
|
58
|
+
|
|
59
|
+
- Host platform: {Mac | Windows | Linux}
|
|
60
|
+
- Android emulator: {PASS — booted | FAIL — details}
|
|
61
|
+
- iOS simulator: {PASS — booted | N/A — not Mac | FAIL — details}
|
|
62
|
+
- Total Maestro flows: {count}
|
|
63
|
+
- Android flows executed: {count} / passed: {count} / failed: {count}
|
|
64
|
+
- iOS flows executed: {count} / passed: {count} / deferred: {count}
|
|
65
|
+
- Platform coverage: {FULL | PARTIAL-IOS-DEFERRED}
|
|
66
|
+
- API traffic verified: {yes | no | N/A — no API calls}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Quality Gate: This Step Cannot Be Skipped
|
|
70
|
+
|
|
71
|
+
If `testing_profiles` includes `mobile-app`, this audit is mandatory. The mobile platform coverage audit must appear in the execution report.
|
|
@@ -10,6 +10,10 @@ Read the story's ACs and scope. Independently assess which `testing_profiles` sh
|
|
|
10
10
|
- `api` — story has API endpoints, backend logic, or database changes
|
|
11
11
|
- `ui` — story has UI components, pages, or visual elements
|
|
12
12
|
- `data-pipeline` — story has ETL, data transformation, or batch processing
|
|
13
|
+
- `mcp-server` — story has MCP server tools, handlers, or protocol work
|
|
14
|
+
- `library` — story is shared library/package (exports, packaging, versioning)
|
|
15
|
+
- `document-generation` — story has document/report template or generation pipeline work
|
|
16
|
+
- `iac` — story has infrastructure work (Terraform, CloudFormation, Kubernetes, CI/CD)
|
|
13
17
|
|
|
14
18
|
Compare your assessment against the `testing_profiles` tagged on the backlog entry:
|
|
15
19
|
- **Missing profile that should be present** → reject to Lead: `[READINESS-REJECTION] Story {story_id}: testing_profiles missing '{profile}'. Re-tag and re-groom.` **STOP.**
|
|
@@ -42,8 +46,9 @@ Read `{story_output_dir}/reqs-brief.md`. Record in `inputsRead`.
|
|
|
42
46
|
| Pre-mortem addressed | Findings folded-in or accepted-risk with justification |
|
|
43
47
|
| Required sections populated | All template sections present and non-empty (or N/A with rationale) |
|
|
44
48
|
| Business rules complete | Cover all ACs with edge case notes |
|
|
45
|
-
| Database changes specified | Present or explicitly "none" with rationale |
|
|
46
|
-
| API endpoints specified | Present or explicitly "none" with rationale |
|
|
49
|
+
| Database changes specified | Present or explicitly "none" with rationale (only check if api or data-pipeline in testing_profiles) |
|
|
50
|
+
| API endpoints specified | Present or explicitly "none" with rationale (only check if api in testing_profiles) |
|
|
51
|
+
| Domain-specific sections | Conditional sections populated per active testing_profiles (e.g., Tool Definitions for mcp-server, Public API Surface for library) |
|
|
47
52
|
| Cross-cutting concerns | Error handling, validation, auth defined |
|
|
48
53
|
|
|
49
54
|
**If ANY fails:** Reject to `readiness-review.md#reqs-rejection-reasons`. Send `[READINESS-REJECTION]` to **REQS** AND to Lead: `[READINESS-REJECTION] Story {story_id}: ACs need rework. See readiness-review.md#reqs-rejection-reasons.` **STOP**.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# REQS Step: Data Pipeline Requirements
|
|
2
|
+
|
|
3
|
+
## Step 4b: Data-Pipeline-Specific Requirement Extraction
|
|
4
|
+
|
|
5
|
+
For stories with `data-pipeline` in `testing_profiles`, extract additional requirements:
|
|
6
|
+
|
|
7
|
+
### Source and Destination Definitions
|
|
8
|
+
- Data format per source/destination (CSV, JSON, Parquet, database table, API response)
|
|
9
|
+
- Schema definition (column names, types, nullable, constraints)
|
|
10
|
+
- Location and access method (file path, connection string, API endpoint, bucket)
|
|
11
|
+
- Volume expectations (row counts, file sizes, batch frequency)
|
|
12
|
+
|
|
13
|
+
### Transform Specifications
|
|
14
|
+
- Business rules per transform stage (filtering criteria, aggregation logic, joins)
|
|
15
|
+
- Computation definitions (derived fields, formulas, lookups)
|
|
16
|
+
- Stage ordering and dependencies (which transforms must precede others)
|
|
17
|
+
- Data type coercions and casting rules
|
|
18
|
+
|
|
19
|
+
### Data Quality Rules
|
|
20
|
+
- Null handling per field (reject, default, propagate, coalesce)
|
|
21
|
+
- Deduplication strategy (natural keys, window, first/last wins)
|
|
22
|
+
- Referential integrity checks (foreign key validation, orphan handling)
|
|
23
|
+
- Row count expectations per stage (exact, range, ratio)
|
|
24
|
+
- Value range and format validation (regex, min/max, enum membership)
|
|
25
|
+
|
|
26
|
+
### Idempotency Strategy
|
|
27
|
+
- Natural keys or surrogate keys for upsert behavior
|
|
28
|
+
- Upsert vs insert-only vs replace semantics per destination
|
|
29
|
+
- Rerun safety guarantees (running the same input twice produces identical output)
|
|
30
|
+
- Timestamp or version column handling on reruns
|
|
31
|
+
|
|
32
|
+
### Checkpoint and Resume Design
|
|
33
|
+
- State persistence mechanism (file marker, database row, offset tracking)
|
|
34
|
+
- Checkpoint granularity (per-batch, per-file, per-row, per-stage)
|
|
35
|
+
- Recovery behavior on restart (replay from last checkpoint, skip completed)
|
|
36
|
+
- Partial output cleanup on failure (rollback, leave partial, quarantine)
|
|
37
|
+
|
|
38
|
+
### Error Handling per Stage
|
|
39
|
+
- Per-stage error strategy: skip row, fail batch, quarantine row, log and continue
|
|
40
|
+
- Quarantine destination and format (dead-letter table, error file, log)
|
|
41
|
+
- Error threshold before batch abort (count or percentage)
|
|
42
|
+
- Alerting and notification requirements on failure
|
|
43
|
+
|
|
44
|
+
### Schema Evolution Strategy
|
|
45
|
+
- How added columns are handled (ignore, default, fail)
|
|
46
|
+
- How removed columns are handled (ignore, fail, null-fill)
|
|
47
|
+
- How type changes are handled (coerce, fail, flag)
|
|
48
|
+
- Schema version tracking and compatibility policy
|
|
49
|
+
|
|
50
|
+
## Quality Gate Additions
|
|
51
|
+
|
|
52
|
+
- [ ] Every AC involving data movement has malformed-input behavior defined
|
|
53
|
+
- [ ] Every source and destination has format, schema, and location specified
|
|
54
|
+
- [ ] Idempotency strategy defined for every write stage
|
|
55
|
+
- [ ] Error handling strategy specified per pipeline stage
|
|
56
|
+
- [ ] Null handling defined for every nullable field
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# REQS Step: Document Generation Requirements
|
|
2
|
+
|
|
3
|
+
## Step 4b: Document-Generation-Specific Requirement Extraction
|
|
4
|
+
|
|
5
|
+
For stories with `document-generation` in `testing_profiles`, extract additional requirements:
|
|
6
|
+
|
|
7
|
+
### Template Definitions
|
|
8
|
+
- Which templates exist and what each produces
|
|
9
|
+
- Template format and engine (Handlebars, Jinja, EJS, custom)
|
|
10
|
+
- Template inheritance or composition (partials, layouts, includes)
|
|
11
|
+
- Template versioning and selection logic
|
|
12
|
+
|
|
13
|
+
### Variable Schema per Template
|
|
14
|
+
- Required variables with types and validation rules
|
|
15
|
+
- Optional variables with default values
|
|
16
|
+
- Null/missing variable behavior per field (blank, placeholder text, omit section, error)
|
|
17
|
+
- Variable nesting (objects, arrays, conditionals within variable data)
|
|
18
|
+
|
|
19
|
+
### Output Format Requirements
|
|
20
|
+
- Output format(s): PDF, HTML, Markdown, DOCX, other
|
|
21
|
+
- MIME type for each output format
|
|
22
|
+
- Page layout specifications (margins, orientation, page size) for paginated formats
|
|
23
|
+
- Styling requirements (CSS, embedded styles, theme)
|
|
24
|
+
|
|
25
|
+
### Conditional Section Rules
|
|
26
|
+
- Include/exclude logic per section (which variables or conditions control visibility)
|
|
27
|
+
- Empty collection handling (show "no items" message vs hide section entirely)
|
|
28
|
+
- Mutual exclusion rules (sections that cannot appear together)
|
|
29
|
+
- Ordering rules for dynamic sections
|
|
30
|
+
|
|
31
|
+
### Encoding Requirements
|
|
32
|
+
- Character encoding: UTF-8 handling and validation
|
|
33
|
+
- Unicode support (emoji, CJK, diacritics)
|
|
34
|
+
- RTL language support (if applicable)
|
|
35
|
+
- Special character escaping per output format (HTML entities, PDF text encoding)
|
|
36
|
+
|
|
37
|
+
### Asset Dependencies
|
|
38
|
+
- Fonts: which fonts, embedded or referenced, fallback chain
|
|
39
|
+
- Images and logos: source location, embedded or referenced, format (PNG, SVG, base64)
|
|
40
|
+
- Stylesheets: external or inline, caching behavior
|
|
41
|
+
- Asset resolution strategy (relative paths, CDN, bundled)
|
|
42
|
+
|
|
43
|
+
### Large Document Handling
|
|
44
|
+
- Streaming or chunked generation for large outputs
|
|
45
|
+
- Maximum document size or page count limits
|
|
46
|
+
- Memory constraints and timeout behavior
|
|
47
|
+
- Progress reporting for long-running generation
|
|
48
|
+
|
|
49
|
+
## Quality Gate Additions
|
|
50
|
+
|
|
51
|
+
- [ ] Every template variable has defined null/missing behavior
|
|
52
|
+
- [ ] Every template has output format and MIME type specified
|
|
53
|
+
- [ ] Conditional section logic documented with include/exclude rules
|
|
54
|
+
- [ ] Asset dependencies listed with embedding vs reference strategy
|
|
55
|
+
- [ ] Encoding requirements specified for non-ASCII content
|
|
@@ -25,3 +25,13 @@ Assign priority based on business impact, complexity, and novelty:
|
|
|
25
25
|
| P1 | Feature broken, degraded UX | Medium | Moderate | CRUD operations with business rules, form validation |
|
|
26
26
|
| P2 | Minor inconvenience | Low | Familiar | Display formatting, sort order, pagination |
|
|
27
27
|
| P3 | Cosmetic, nice-to-have | Trivial | Standard | Label text, tooltip content, logging |
|
|
28
|
+
|
|
29
|
+
### Profile-Aware Section Selection
|
|
30
|
+
|
|
31
|
+
Populate template sections based on active `{testing_profiles}`:
|
|
32
|
+
- **Database Changes**: include if `api` or `data-pipeline` in profiles. Skip entirely for other profiles.
|
|
33
|
+
- **API Endpoints**: include if `api` in profiles. Skip entirely for other profiles.
|
|
34
|
+
- **Authentication and Authorization**: include if `api` or `ui` in profiles. Skip entirely for other profiles.
|
|
35
|
+
- **Domain-specific sections**: include the conditional sections from `reqs-brief.template.md` that match active profiles (Data Pipeline Specification, Tool Definitions, Public API Surface, Template Specifications, Infrastructure Resources).
|
|
36
|
+
|
|
37
|
+
For multi-profile stories (e.g., `[api, iac]`), include ALL applicable sections.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# REQS Step: Infrastructure Requirements
|
|
2
|
+
|
|
3
|
+
## Step 4b: IaC-Specific Requirement Extraction
|
|
4
|
+
|
|
5
|
+
For stories with `iac` in `testing_profiles`, extract additional requirements:
|
|
6
|
+
|
|
7
|
+
### Resource Inventory
|
|
8
|
+
- What resources are created, modified, or destroyed (with provider and resource type)
|
|
9
|
+
- Purpose of each resource (why it exists, what depends on it)
|
|
10
|
+
- Resource dependencies and creation order
|
|
11
|
+
- Naming convention per resource (prefix, environment, region, random suffix)
|
|
12
|
+
|
|
13
|
+
### Tagging Policy
|
|
14
|
+
- Required tags per resource (environment, project, owner, cost-center, managed-by)
|
|
15
|
+
- Tag naming conventions and allowed values
|
|
16
|
+
- Tags that must propagate to child resources
|
|
17
|
+
- Tag enforcement mechanism (policy, validation, linting)
|
|
18
|
+
|
|
19
|
+
### IAM Requirements
|
|
20
|
+
- Roles and policies per resource (what identity, what permissions, on what scope)
|
|
21
|
+
- Least-privilege justification (why each permission is needed)
|
|
22
|
+
- Service account or managed identity requirements
|
|
23
|
+
- Cross-account or cross-subscription access (if applicable)
|
|
24
|
+
- Temporary credential strategy (assume role, workload identity federation)
|
|
25
|
+
|
|
26
|
+
### State Management
|
|
27
|
+
- Remote backend configuration (storage account, bucket, table)
|
|
28
|
+
- State locking mechanism and timeout
|
|
29
|
+
- State access control (who can read/write state)
|
|
30
|
+
- State file segmentation (per-environment, per-module, monolith)
|
|
31
|
+
|
|
32
|
+
### Environment Topology
|
|
33
|
+
- Environments: dev, staging, prod (and any others)
|
|
34
|
+
- Differences between environments (instance sizes, replica counts, feature flags)
|
|
35
|
+
- Environment promotion strategy (apply same config with different vars)
|
|
36
|
+
- Shared vs isolated resources across environments
|
|
37
|
+
|
|
38
|
+
### Compliance Constraints
|
|
39
|
+
- Encryption requirements: at rest (which resources, key management) and in transit (TLS version)
|
|
40
|
+
- Network isolation: VPC/VNet, subnets, security groups, private endpoints
|
|
41
|
+
- Audit logging: which resources, log destination, retention period
|
|
42
|
+
- Data residency: region constraints, data sovereignty requirements
|
|
43
|
+
- Regulatory framework alignment (SOC2, HIPAA, GDPR -- if applicable)
|
|
44
|
+
|
|
45
|
+
### Destroy Protection
|
|
46
|
+
- Which resources must never be accidentally destroyed (databases, storage, DNS)
|
|
47
|
+
- Safeguards per protected resource (lifecycle prevent_destroy, deletion locks, backups)
|
|
48
|
+
- Manual approval gates before destructive changes
|
|
49
|
+
- Backup and recovery requirements before destroy is permitted
|
|
50
|
+
|
|
51
|
+
### Drift Detection
|
|
52
|
+
- Detection method: scheduled plan, continuous monitoring, cloud-native service
|
|
53
|
+
- Alerting on drift detection (who is notified, channel, severity)
|
|
54
|
+
- Auto-remediation policy (auto-apply, alert-only, manual review)
|
|
55
|
+
- Expected drift sources (manual console changes, other automation)
|
|
56
|
+
|
|
57
|
+
## Quality Gate Additions
|
|
58
|
+
|
|
59
|
+
- [ ] Every resource has tagging and destroy-protection policy defined
|
|
60
|
+
- [ ] IAM permissions follow least-privilege with justification
|
|
61
|
+
- [ ] State management backend and locking strategy specified
|
|
62
|
+
- [ ] Environment topology differences documented
|
|
63
|
+
- [ ] Encryption and network isolation requirements specified per resource
|