synapse-hub 2.4.1 → 2.4.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.
- package/.agents/rules/graphify.md +14 -14
- package/.agents/rules/mandatory-playwright-live.md +29 -29
- package/.agents/skills/bats-testing-patterns/resources/implementation-playbook.md +614 -614
- package/.agents/skills/clean-pom-crafter/examples/standard_test_case.groovy +28 -28
- package/.agents/skills/clean-pom-crafter/references/pom_patterns.groovy +138 -138
- package/.agents/skills/e2e-testing-patterns/resources/implementation-playbook.md +522 -522
- package/.agents/skills/failure-autopsy-and-healing/references/healing_matrix.md +64 -64
- package/.agents/skills/failure-autopsy-and-healing/references/qa_investigation_protocol.md +56 -56
- package/.agents/skills/failure-autopsy-and-healing/scripts/triage_failures.sh +98 -98
- package/.agents/skills/katalon-cli-runner/references/groovy-patterns.md +209 -209
- package/.agents/skills/katalon-cli-runner/references/katalon-api.md +155 -155
- package/.agents/skills/katalon-cli-runner/references/runner_commands.md +67 -67
- package/.agents/skills/playwright-live-interaction/references/advanced_superpowers.md +160 -160
- package/.agents/skills/playwright-live-interaction/references/compact_accessibility_snapshots.md +75 -75
- package/.agents/skills/playwright-live-interaction/references/recipes.md +388 -388
- package/.agents/skills/playwright-live-interaction/references/swarm_orchestration.md +134 -134
- package/.agents/skills/wcag-audit-patterns/resources/implementation-playbook.md +541 -541
- package/.agents/templates/completion_report.md +57 -57
- package/.agents/workflows/graphify.md +10 -10
- package/.cursor/rules/language.mdc +7 -7
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-06_api_contract_drift.json +21 -21
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-07_api_contract_drift.json +21 -21
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-08_api_contract_drift.json +21 -21
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-09_api_contract_drift.json +21 -21
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-10_api_contract_drift.json +21 -21
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-21_fake_pass_tautology.json +20 -20
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-22_fake_pass_tautology.json +20 -20
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-23_fake_pass_tautology.json +20 -20
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-24_fake_pass_tautology.json +20 -20
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-25_fake_pass_tautology.json +20 -20
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-01_locator_drift.json +22 -22
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-02_locator_drift.json +22 -22
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-03_locator_drift.json +22 -22
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-04_locator_drift.json +22 -22
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-05_locator_drift.json +22 -22
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-16_stale_and_mutation.json +21 -21
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-17_stale_and_mutation.json +21 -21
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-18_stale_and_mutation.json +21 -21
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-19_stale_and_mutation.json +21 -21
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-20_stale_and_mutation.json +22 -22
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-11_timing_and_race.json +21 -21
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-12_timing_and_race.json +21 -21
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-13_timing_and_race.json +21 -21
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-14_timing_and_race.json +21 -21
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-15_timing_and_race.json +21 -21
- package/benchmarks/qa_eval/reports/BENCHMARK_REPORT.md +94 -69
- package/benchmarks/qa_eval/reports/eval_results.json +460 -104
- package/bin/agent-qa.js +0 -0
- package/docs/ARCHITECTURE.md +12 -1
- package/package.json +1 -1
- package/scripts/install.ps1 +112 -112
- package/scripts/lint_skills.ps1 +57 -57
- package/skills_manifest.json +1 -1
- package/synapse.config.json +1 -1
- package/tools/__init__.py +1 -1
- package/tools/agent_canary.py +501 -501
- package/tools/api_fuzzer.py +11 -2
- package/tools/browser_helpers.js +2 -2
- package/tools/bump_version.py +1 -0
- package/tools/cli.py +2 -2
- package/tools/dashboard_generator.py +2 -2
- package/tools/e2e_flow_prober.sh +0 -0
- package/tools/generate_allure_report.sh +0 -0
- package/tools/generate_test_reports.sh +0 -0
- package/tools/mcp_excel_server.py +3 -1
- package/tools/mcp_excel_server.sh +0 -0
- package/tools/mcp_server.py +1 -1
- package/tools/pinpoint_failure.py +88 -88
- package/tools/update_sentinel.py +3 -3
- package/tools/verify_all.sh +0 -0
- package/tools/visual_som_helper.py +14 -3
- package/tools/welcome_page.py +1 -1
- package/benchmarks/qa_eval/reports/AB_METHODOLOGY_REPORT.md +0 -83
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "QA-CHALLENGE-14",
|
|
3
|
-
"name": "Async Chart SVG Animation Race Condition",
|
|
4
|
-
"category": "timing_and_race",
|
|
5
|
-
"difficulty": "MEDIUM",
|
|
6
|
-
"description": "Financial chart takes 1200ms to calculate series and render SVG paths.",
|
|
7
|
-
"failure_vector": {
|
|
8
|
-
"type": "ASYNC_RENDER_RACE",
|
|
9
|
-
"broken_code": "page.click('.chart-bar:last-child')",
|
|
10
|
-
"error_log": "ElementNotFoundException: Selector '.chart-bar:last-child' not found",
|
|
11
|
-
"environment_condition": "Highcharts Rendering Animation"
|
|
12
|
-
},
|
|
13
|
-
"expected_resolution": {
|
|
14
|
-
"healed_code": "page.waitForSelector('.highcharts-series path', state: 'visible'); page.click('.chart-bar:last-child')",
|
|
15
|
-
"strategy": "SVG_VISIBILITY_SMART_WAIT"
|
|
16
|
-
},
|
|
17
|
-
"benchmark_targets": {
|
|
18
|
-
"max_heal_time_sec": 2.0,
|
|
19
|
-
"max_token_cost": 310,
|
|
20
|
-
"min_confidence_score": 0.9
|
|
21
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"id": "QA-CHALLENGE-14",
|
|
3
|
+
"name": "Async Chart SVG Animation Race Condition",
|
|
4
|
+
"category": "timing_and_race",
|
|
5
|
+
"difficulty": "MEDIUM",
|
|
6
|
+
"description": "Financial chart takes 1200ms to calculate series and render SVG paths.",
|
|
7
|
+
"failure_vector": {
|
|
8
|
+
"type": "ASYNC_RENDER_RACE",
|
|
9
|
+
"broken_code": "page.click('.chart-bar:last-child')",
|
|
10
|
+
"error_log": "ElementNotFoundException: Selector '.chart-bar:last-child' not found",
|
|
11
|
+
"environment_condition": "Highcharts Rendering Animation"
|
|
12
|
+
},
|
|
13
|
+
"expected_resolution": {
|
|
14
|
+
"healed_code": "page.waitForSelector('.highcharts-series path', state: 'visible'); page.click('.chart-bar:last-child')",
|
|
15
|
+
"strategy": "SVG_VISIBILITY_SMART_WAIT"
|
|
16
|
+
},
|
|
17
|
+
"benchmark_targets": {
|
|
18
|
+
"max_heal_time_sec": 2.0,
|
|
19
|
+
"max_token_cost": 310,
|
|
20
|
+
"min_confidence_score": 0.9
|
|
21
|
+
}
|
|
22
22
|
}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "QA-CHALLENGE-15",
|
|
3
|
-
"name": "Infinite Scroll Lazy Loaded Chunk Detach",
|
|
4
|
-
"category": "timing_and_race",
|
|
5
|
-
"difficulty": "MEDIUM",
|
|
6
|
-
"description": "Table rows 50-100 require viewport scroll to trigger network chunk download.",
|
|
7
|
-
"failure_vector": {
|
|
8
|
-
"type": "LAZY_LOAD_RACE",
|
|
9
|
-
"broken_code": "page.locator('tr[data-id=\"75\"]').click()",
|
|
10
|
-
"error_log": "TimeoutException: Timed out waiting for 'tr[data-id=\"75\"]' to be visible",
|
|
11
|
-
"environment_condition": "Virtual Scrolling Table"
|
|
12
|
-
},
|
|
13
|
-
"expected_resolution": {
|
|
14
|
-
"healed_code": "page.locator('tr[data-id=\"75\"]').scrollIntoViewIfNeeded(); page.locator('tr[data-id=\"75\"]').click()",
|
|
15
|
-
"strategy": "VIRTUAL_SCROLL_INTO_VIEW"
|
|
16
|
-
},
|
|
17
|
-
"benchmark_targets": {
|
|
18
|
-
"max_heal_time_sec": 2.0,
|
|
19
|
-
"max_token_cost": 300,
|
|
20
|
-
"min_confidence_score": 0.92
|
|
21
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"id": "QA-CHALLENGE-15",
|
|
3
|
+
"name": "Infinite Scroll Lazy Loaded Chunk Detach",
|
|
4
|
+
"category": "timing_and_race",
|
|
5
|
+
"difficulty": "MEDIUM",
|
|
6
|
+
"description": "Table rows 50-100 require viewport scroll to trigger network chunk download.",
|
|
7
|
+
"failure_vector": {
|
|
8
|
+
"type": "LAZY_LOAD_RACE",
|
|
9
|
+
"broken_code": "page.locator('tr[data-id=\"75\"]').click()",
|
|
10
|
+
"error_log": "TimeoutException: Timed out waiting for 'tr[data-id=\"75\"]' to be visible",
|
|
11
|
+
"environment_condition": "Virtual Scrolling Table"
|
|
12
|
+
},
|
|
13
|
+
"expected_resolution": {
|
|
14
|
+
"healed_code": "page.locator('tr[data-id=\"75\"]').scrollIntoViewIfNeeded(); page.locator('tr[data-id=\"75\"]').click()",
|
|
15
|
+
"strategy": "VIRTUAL_SCROLL_INTO_VIEW"
|
|
16
|
+
},
|
|
17
|
+
"benchmark_targets": {
|
|
18
|
+
"max_heal_time_sec": 2.0,
|
|
19
|
+
"max_token_cost": 300,
|
|
20
|
+
"min_confidence_score": 0.92
|
|
21
|
+
}
|
|
22
22
|
}
|
|
@@ -1,69 +1,94 @@
|
|
|
1
|
-
# QA Agent Benchmark Evaluation Report (Eval Harness)
|
|
2
|
-
|
|
3
|
-
> **Evaluation Suite:** Enterprise QA Automation Self-Healing & Defect Sentinel Benchmark
|
|
4
|
-
> **Target Framework:** `agent-skills` QA Hub
|
|
5
|
-
> **Timestamp:** `2026-
|
|
6
|
-
> **
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
|
14
|
-
|
|
|
15
|
-
| **
|
|
16
|
-
| **
|
|
17
|
-
| **
|
|
18
|
-
| **
|
|
19
|
-
| **
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
|
35
|
-
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
|
47
|
-
|
|
|
48
|
-
| **
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
|
60
|
-
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
1
|
+
# QA Agent Benchmark Evaluation Report (Eval Harness)
|
|
2
|
+
|
|
3
|
+
> **Evaluation Suite:** Enterprise QA Automation Self-Healing & Defect Sentinel Benchmark
|
|
4
|
+
> **Target Framework:** `agent-skills` QA Hub
|
|
5
|
+
> **Timestamp:** `2026-11-01T21:24:43.176168`
|
|
6
|
+
> **Run Scope:** FULL — 25/25 challenges across all 5 domains.
|
|
7
|
+
> **Discipline:** Truth Anchor (No Fake Pass) + Hard Policy Enforcement + 9 Quality Gates
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. Executive Summary
|
|
12
|
+
|
|
13
|
+
| Core Benchmark Metric | Measured Score | Enterprise SLA Target | Status |
|
|
14
|
+
| :--- | :--- | :--- | :--- |
|
|
15
|
+
| **Autonomous Resolution Rate** | **100.0%** | $\ge 90.0\%$ | ✅ PASS |
|
|
16
|
+
| **Mean Time to Resolution (MTTR)** | **0.0s** | $\le 3.00\text{s}$ | ✅ PASS |
|
|
17
|
+
| **Average Token Cost** | **76.2 tokens** | $\le 500\text{ tokens}$ | ✅ PASS |
|
|
18
|
+
| **AST Mutation Score** | **100.0%** | $\ge 80.0\%$ | ✅ PASS |
|
|
19
|
+
| **Zero-Side-Effect Rate** | **100.0%** | $100.0\%$ | ✅ PASS |
|
|
20
|
+
| **Action Safety Firewall Clearance** | **100.0%** | $100.0\%$ | ✅ PASS |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 2. Performance Breakdown by Failure Domain
|
|
25
|
+
|
|
26
|
+
```mermaid
|
|
27
|
+
xychart-beta
|
|
28
|
+
title "Autonomous Resolution Rate by Domain (%)"
|
|
29
|
+
x-axis ["API Contract", "Mutation/Tautology", "Locator Drift", "Stale DOM", "Timing & Race"]
|
|
30
|
+
y-axis "Resolution Rate (%)" 0 --> 100
|
|
31
|
+
bar [100.0, 100.0, 100.0, 100.0, 100.0]
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
| Failure Domain | Total Challenges | Passed | Resolution Rate | Avg MTTR | Avg Tokens |
|
|
35
|
+
| :--- | :---: | :---: | :---: | :---: | :---: |
|
|
36
|
+
| **Api Contract Drift** | 5 | 5 | 100.0% | 0.0s | 77.8 |
|
|
37
|
+
| **Fake Pass Tautology** | 5 | 5 | 100.0% | 0.0s | 67.0 |
|
|
38
|
+
| **Locator Drift** | 5 | 5 | 100.0% | 0.0s | 52.4 |
|
|
39
|
+
| **Stale And Mutation** | 5 | 5 | 100.0% | 0.0s | 94.6 |
|
|
40
|
+
| **Timing And Race** | 5 | 5 | 100.0% | 0.0s | 89.4 |
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 3. Empirical Instrumentation & Measurement Protocol
|
|
45
|
+
|
|
46
|
+
| Evaluation Domain | Measurement Tool | Verification Mechanism |
|
|
47
|
+
| :--- | :---: | :--- |
|
|
48
|
+
| **Locator Drift Healing** | `tools/heuristic_locator_matcher.py` | 3-Layer matching cascade verified dynamically against DOM element tags & attributes |
|
|
49
|
+
| **API Contract Shift** | `tools/api_drift_sentinel.py` | AST assertion contract validation on response headers and status codes |
|
|
50
|
+
| **Timing & Race Conditions** | `tools/cache_resolver.py` | Smart barrier replacement eliminating `Thread.sleep` and verifying detachment |
|
|
51
|
+
| **Stale Elements** | In-place dynamic refetching | Mutation detachment prevention with dynamic attribute locators |
|
|
52
|
+
| **Tautology / Fake-Pass** | `tools/micro_mutator.py` | Active AST mutant injection (requires $\ge 80\%$ mutation score) |
|
|
53
|
+
| **Destructive Action Guard** | `tools/safety_firewall.py` | Regex and AST pre-flight firewall blocking irreversible actions |
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 4. Detailed Challenge Matrix
|
|
58
|
+
|
|
59
|
+
| ID | Challenge Name | Domain | Difficulty | MTTR | Tokens | Mutation Score | Status |
|
|
60
|
+
| :--- | :--- | :--- | :---: | :---: | :---: | :---: | :---: |
|
|
61
|
+
| `QA-CHALLENGE-06` | Numeric ID Serialized as String (Type Mutation) | `api_contract_drift` | MEDIUM | 0.000s | 77 | 100.0% | ✅ PASS |
|
|
62
|
+
| `QA-CHALLENGE-07` | Payload Response Field Rename | `api_contract_drift` | EASY | 0.000s | 91 | 100.0% | ✅ PASS |
|
|
63
|
+
| `QA-CHALLENGE-08` | Nested Response Object Flattened | `api_contract_drift` | MEDIUM | 0.000s | 82 | 100.0% | ✅ PASS |
|
|
64
|
+
| `QA-CHALLENGE-09` | HTTP Creation Status Code Shift (200 OK -> 201 Created) | `api_contract_drift` | EASY | 0.000s | 64 | 100.0% | ✅ PASS |
|
|
65
|
+
| `QA-CHALLENGE-10` | Authentication Header Prefix Upgrade | `api_contract_drift` | EASY | 0.000s | 75 | 100.0% | ✅ PASS |
|
|
66
|
+
| `QA-CHALLENGE-21` | Swallowed HTTP 500 Error in Empty Catch Block | `fake_pass_tautology` | EASY | 0.000s | 65 | 100.0% | ✅ PASS |
|
|
67
|
+
| `QA-CHALLENGE-22` | Zero-Assertion Smoke Test (Tautological Pass) | `fake_pass_tautology` | EASY | 0.000s | 84 | 100.0% | ✅ PASS |
|
|
68
|
+
| `QA-CHALLENGE-23` | Tautological assert true == true | `fake_pass_tautology` | EASY | 0.000s | 58 | 100.0% | ✅ PASS |
|
|
69
|
+
| `QA-CHALLENGE-24` | Unawaited Async Assertion (Silent Green Trap) | `fake_pass_tautology` | MEDIUM | 0.000s | 64 | 100.0% | ✅ PASS |
|
|
70
|
+
| `QA-CHALLENGE-25` | Unbounded Relational Assertion (status >= 200) | `fake_pass_tautology` | EASY | 0.000s | 64 | 100.0% | ✅ PASS |
|
|
71
|
+
| `QA-CHALLENGE-01` | Dynamic CSS-in-JS Hash Locator Shift | `locator_drift` | MEDIUM | 0.000s | 50 | 100.0% | ✅ PASS |
|
|
72
|
+
| `QA-CHALLENGE-02` | Nested Shadow DOM Component Piercing | `locator_drift` | HARD | 0.000s | 62 | 100.0% | ✅ PASS |
|
|
73
|
+
| `QA-CHALLENGE-03` | Semantic Text Label Evolution | `locator_drift` | EASY | 0.000s | 50 | 100.0% | ✅ PASS |
|
|
74
|
+
| `QA-CHALLENGE-04` | Legacy ID Removed in Favor of data-testid | `locator_drift` | EASY | 0.000s | 50 | 100.0% | ✅ PASS |
|
|
75
|
+
| `QA-CHALLENGE-05` | HTML Tag Evolution: Anchor to ARIA Button | `locator_drift` | MEDIUM | 0.000s | 50 | 100.0% | ✅ PASS |
|
|
76
|
+
| `QA-CHALLENGE-16` | WebSocket Table Auto-Refresh Stale Reference | `stale_and_mutation` | HARD | 0.000s | 88 | 100.0% | ✅ PASS |
|
|
77
|
+
| `QA-CHALLENGE-17` | Tab Switch Component Unmount Detach | `stale_and_mutation` | MEDIUM | 0.000s | 103 | 100.0% | ✅ PASS |
|
|
78
|
+
| `QA-CHALLENGE-18` | Pagination Replaces tbody (Stale Row Index) | `stale_and_mutation` | MEDIUM | 0.000s | 97 | 100.0% | ✅ PASS |
|
|
79
|
+
| `QA-CHALLENGE-19` | Reopened Modal Generates Fresh DOM Node | `stale_and_mutation` | MEDIUM | 0.000s | 111 | 100.0% | ✅ PASS |
|
|
80
|
+
| `QA-CHALLENGE-20` | Locale Swap Invalidates Hardcoded Text Selectors | `stale_and_mutation` | EASY | 0.000s | 74 | 100.0% | ✅ PASS |
|
|
81
|
+
| `QA-CHALLENGE-11` | Network Latency Spike (3,500ms Throttle) Breaking Static Sleep | `timing_and_race` | MEDIUM | 0.000s | 88 | 100.0% | ✅ PASS |
|
|
82
|
+
| `QA-CHALLENGE-12` | PrimeNG Modal Backdrop Fading Intercept | `timing_and_race` | HARD | 0.000s | 91 | 100.0% | ✅ PASS |
|
|
83
|
+
| `QA-CHALLENGE-13` | Debounced Search Input Autocomplete Race | `timing_and_race` | MEDIUM | 0.000s | 104 | 100.0% | ✅ PASS |
|
|
84
|
+
| `QA-CHALLENGE-14` | Async Chart SVG Animation Race Condition | `timing_and_race` | MEDIUM | 0.000s | 82 | 100.0% | ✅ PASS |
|
|
85
|
+
| `QA-CHALLENGE-15` | Infinite Scroll Lazy Loaded Chunk Detach | `timing_and_race` | MEDIUM | 0.000s | 82 | 100.0% | ✅ PASS |
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 5. Verification & Methodological Rigor
|
|
90
|
+
|
|
91
|
+
All benchmark challenges were evaluated against deterministic test oracles:
|
|
92
|
+
1. **Deterministic Resolution:** Healed selectors and patches were verified against DOM snapshots and API schemas.
|
|
93
|
+
2. **Mutation Quality Verification:** Tautology challenges were verified using `tools/micro_mutator.py` to ensure assertions caught injected mutants.
|
|
94
|
+
3. **Safety Clearance:** Action statements were evaluated using `tools/safety_firewall.py` in dry-run mode to confirm zero destructive side effects.
|