synapse-hub 2.4.1 → 2.4.3

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 (77) hide show
  1. package/.agents/rules/graphify.md +14 -14
  2. package/.agents/rules/mandatory-playwright-live.md +29 -29
  3. package/.agents/skills/bats-testing-patterns/resources/implementation-playbook.md +614 -614
  4. package/.agents/skills/clean-pom-crafter/examples/standard_test_case.groovy +28 -28
  5. package/.agents/skills/clean-pom-crafter/references/pom_patterns.groovy +138 -138
  6. package/.agents/skills/e2e-testing-patterns/resources/implementation-playbook.md +522 -522
  7. package/.agents/skills/failure-autopsy-and-healing/references/healing_matrix.md +64 -64
  8. package/.agents/skills/failure-autopsy-and-healing/references/qa_investigation_protocol.md +56 -56
  9. package/.agents/skills/failure-autopsy-and-healing/scripts/triage_failures.sh +98 -98
  10. package/.agents/skills/katalon-cli-runner/references/groovy-patterns.md +209 -209
  11. package/.agents/skills/katalon-cli-runner/references/katalon-api.md +155 -155
  12. package/.agents/skills/katalon-cli-runner/references/runner_commands.md +67 -67
  13. package/.agents/skills/playwright-live-interaction/references/advanced_superpowers.md +160 -160
  14. package/.agents/skills/playwright-live-interaction/references/compact_accessibility_snapshots.md +75 -75
  15. package/.agents/skills/playwright-live-interaction/references/recipes.md +388 -388
  16. package/.agents/skills/playwright-live-interaction/references/swarm_orchestration.md +134 -134
  17. package/.agents/skills/wcag-audit-patterns/resources/implementation-playbook.md +541 -541
  18. package/.agents/templates/completion_report.md +57 -57
  19. package/.agents/workflows/graphify.md +10 -10
  20. package/.cursor/rules/language.mdc +7 -7
  21. package/README.en.md +1 -1
  22. package/README.md +1 -1
  23. package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-06_api_contract_drift.json +21 -21
  24. package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-07_api_contract_drift.json +21 -21
  25. package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-08_api_contract_drift.json +21 -21
  26. package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-09_api_contract_drift.json +21 -21
  27. package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-10_api_contract_drift.json +21 -21
  28. package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-21_fake_pass_tautology.json +20 -20
  29. package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-22_fake_pass_tautology.json +20 -20
  30. package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-23_fake_pass_tautology.json +20 -20
  31. package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-24_fake_pass_tautology.json +20 -20
  32. package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-25_fake_pass_tautology.json +20 -20
  33. package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-01_locator_drift.json +22 -22
  34. package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-02_locator_drift.json +22 -22
  35. package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-03_locator_drift.json +22 -22
  36. package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-04_locator_drift.json +22 -22
  37. package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-05_locator_drift.json +22 -22
  38. package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-16_stale_and_mutation.json +21 -21
  39. package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-17_stale_and_mutation.json +21 -21
  40. package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-18_stale_and_mutation.json +21 -21
  41. package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-19_stale_and_mutation.json +21 -21
  42. package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-20_stale_and_mutation.json +22 -22
  43. package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-11_timing_and_race.json +21 -21
  44. package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-12_timing_and_race.json +21 -21
  45. package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-13_timing_and_race.json +21 -21
  46. package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-14_timing_and_race.json +21 -21
  47. package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-15_timing_and_race.json +21 -21
  48. package/bin/agent-qa.js +0 -0
  49. package/docs/ARCHITECTURE.md +12 -1
  50. package/package.json +1 -1
  51. package/scripts/install.ps1 +112 -112
  52. package/scripts/lint_skills.ps1 +57 -57
  53. package/skills_manifest.json +1 -1
  54. package/synapse.config.json +1 -1
  55. package/tools/__init__.py +1 -1
  56. package/tools/agent_canary.py +501 -501
  57. package/tools/api_fuzzer.py +11 -2
  58. package/tools/browser_helpers.js +2 -2
  59. package/tools/bump_version.py +1 -0
  60. package/tools/check_env.py +71 -13
  61. package/tools/cli.py +2 -2
  62. package/tools/dashboard_generator.py +2 -2
  63. package/tools/e2e_flow_prober.sh +0 -0
  64. package/tools/generate_allure_report.sh +0 -0
  65. package/tools/generate_test_reports.sh +0 -0
  66. package/tools/mcp_excel_server.py +3 -1
  67. package/tools/mcp_excel_server.sh +0 -0
  68. package/tools/mcp_server.py +1 -1
  69. package/tools/pinpoint_failure.py +88 -88
  70. package/tools/setup_project.py +8 -0
  71. package/tools/update_sentinel.py +10 -9
  72. package/tools/verify_all.sh +0 -0
  73. package/tools/visual_som_helper.py +14 -3
  74. package/tools/welcome_page.py +1 -1
  75. package/benchmarks/qa_eval/reports/AB_METHODOLOGY_REPORT.md +0 -83
  76. package/benchmarks/qa_eval/reports/BENCHMARK_REPORT.md +0 -69
  77. package/benchmarks/qa_eval/reports/eval_results.json +0 -105
@@ -1,23 +1,23 @@
1
- {
2
- "id": "QA-CHALLENGE-01",
3
- "name": "Dynamic CSS-in-JS Hash Locator Shift",
4
- "category": "locator_drift",
5
- "difficulty": "MEDIUM",
6
- "description": "Button class changed from '.btn-submit' to dynamic hashed class '.btn-submit_a8f9x2'.",
7
- "failure_vector": {
8
- "type": "LOCATOR_DRIFT",
9
- "broken_locator": "button.btn-submit",
10
- "error_log": "ElementNotFoundException: Cannot locate element with selector 'button.btn-submit' within 5000ms",
11
- "dom_snapshot": "<button class='btn-submit_a8f9x2' data-testid='submit-order-btn' role='button' aria-label='Submit Order'>Submit Order</button>"
12
- },
13
- "expected_resolution": {
14
- "healed_locator": "[data-testid='submit-order-btn']",
15
- "fallback_locator": "button:has-text('Submit Order')",
16
- "strategy": "AOM_ROLE_OR_TESTID"
17
- },
18
- "benchmark_targets": {
19
- "max_heal_time_sec": 2.0,
20
- "max_token_cost": 350,
21
- "min_confidence_score": 0.85
22
- }
1
+ {
2
+ "id": "QA-CHALLENGE-01",
3
+ "name": "Dynamic CSS-in-JS Hash Locator Shift",
4
+ "category": "locator_drift",
5
+ "difficulty": "MEDIUM",
6
+ "description": "Button class changed from '.btn-submit' to dynamic hashed class '.btn-submit_a8f9x2'.",
7
+ "failure_vector": {
8
+ "type": "LOCATOR_DRIFT",
9
+ "broken_locator": "button.btn-submit",
10
+ "error_log": "ElementNotFoundException: Cannot locate element with selector 'button.btn-submit' within 5000ms",
11
+ "dom_snapshot": "<button class='btn-submit_a8f9x2' data-testid='submit-order-btn' role='button' aria-label='Submit Order'>Submit Order</button>"
12
+ },
13
+ "expected_resolution": {
14
+ "healed_locator": "[data-testid='submit-order-btn']",
15
+ "fallback_locator": "button:has-text('Submit Order')",
16
+ "strategy": "AOM_ROLE_OR_TESTID"
17
+ },
18
+ "benchmark_targets": {
19
+ "max_heal_time_sec": 2.0,
20
+ "max_token_cost": 350,
21
+ "min_confidence_score": 0.85
22
+ }
23
23
  }
@@ -1,23 +1,23 @@
1
- {
2
- "id": "QA-CHALLENGE-02",
3
- "name": "Nested Shadow DOM Component Piercing",
4
- "category": "locator_drift",
5
- "difficulty": "HARD",
6
- "description": "Input field moved inside Web Component with '#shadow-root (open)'.",
7
- "failure_vector": {
8
- "type": "SHADOW_DOM_ISOLATION",
9
- "broken_locator": "#customer-email",
10
- "error_log": "NoSuchElementException: Element '#customer-email' not found in document root",
11
- "dom_snapshot": "<user-profile-card><template shadowrootmode='open'><input id='customer-email' type='email' data-testid='user-email'/></template></user-profile-card>"
12
- },
13
- "expected_resolution": {
14
- "healed_locator": "user-profile-card >> internal:control=enter-shadow >> input#customer-email",
15
- "fallback_locator": "user-profile-card >> input[type='email']",
16
- "strategy": "SHADOW_DOM_PIERCING"
17
- },
18
- "benchmark_targets": {
19
- "max_heal_time_sec": 3.0,
20
- "max_token_cost": 400,
21
- "min_confidence_score": 0.88
22
- }
1
+ {
2
+ "id": "QA-CHALLENGE-02",
3
+ "name": "Nested Shadow DOM Component Piercing",
4
+ "category": "locator_drift",
5
+ "difficulty": "HARD",
6
+ "description": "Input field moved inside Web Component with '#shadow-root (open)'.",
7
+ "failure_vector": {
8
+ "type": "SHADOW_DOM_ISOLATION",
9
+ "broken_locator": "#customer-email",
10
+ "error_log": "NoSuchElementException: Element '#customer-email' not found in document root",
11
+ "dom_snapshot": "<user-profile-card><template shadowrootmode='open'><input id='customer-email' type='email' data-testid='user-email'/></template></user-profile-card>"
12
+ },
13
+ "expected_resolution": {
14
+ "healed_locator": "user-profile-card >> internal:control=enter-shadow >> input#customer-email",
15
+ "fallback_locator": "user-profile-card >> input[type='email']",
16
+ "strategy": "SHADOW_DOM_PIERCING"
17
+ },
18
+ "benchmark_targets": {
19
+ "max_heal_time_sec": 3.0,
20
+ "max_token_cost": 400,
21
+ "min_confidence_score": 0.88
22
+ }
23
23
  }
@@ -1,23 +1,23 @@
1
- {
2
- "id": "QA-CHALLENGE-03",
3
- "name": "Semantic Text Label Evolution",
4
- "category": "locator_drift",
5
- "difficulty": "EASY",
6
- "description": "CTA button label text changed from 'Submit Order' to 'Complete Purchase'.",
7
- "failure_vector": {
8
- "type": "LABEL_EVOLUTION",
9
- "broken_locator": "//button[text()='Submit Order']",
10
- "error_log": "TimeoutException: Timed out waiting for element with XPath //button[text()='Submit Order']",
11
- "dom_snapshot": "<button type='submit' class='p-button-success' id='order-cta'>Complete Purchase</button>"
12
- },
13
- "expected_resolution": {
14
- "healed_locator": "#order-cta",
15
- "fallback_locator": "button[type='submit']",
16
- "strategy": "ID_AND_SEMANTIC_INTENT"
17
- },
18
- "benchmark_targets": {
19
- "max_heal_time_sec": 1.5,
20
- "max_token_cost": 300,
21
- "min_confidence_score": 0.9
22
- }
1
+ {
2
+ "id": "QA-CHALLENGE-03",
3
+ "name": "Semantic Text Label Evolution",
4
+ "category": "locator_drift",
5
+ "difficulty": "EASY",
6
+ "description": "CTA button label text changed from 'Submit Order' to 'Complete Purchase'.",
7
+ "failure_vector": {
8
+ "type": "LABEL_EVOLUTION",
9
+ "broken_locator": "//button[text()='Submit Order']",
10
+ "error_log": "TimeoutException: Timed out waiting for element with XPath //button[text()='Submit Order']",
11
+ "dom_snapshot": "<button type='submit' class='p-button-success' id='order-cta'>Complete Purchase</button>"
12
+ },
13
+ "expected_resolution": {
14
+ "healed_locator": "#order-cta",
15
+ "fallback_locator": "button[type='submit']",
16
+ "strategy": "ID_AND_SEMANTIC_INTENT"
17
+ },
18
+ "benchmark_targets": {
19
+ "max_heal_time_sec": 1.5,
20
+ "max_token_cost": 300,
21
+ "min_confidence_score": 0.9
22
+ }
23
23
  }
@@ -1,23 +1,23 @@
1
- {
2
- "id": "QA-CHALLENGE-04",
3
- "name": "Legacy ID Removed in Favor of data-testid",
4
- "category": "locator_drift",
5
- "difficulty": "EASY",
6
- "description": "Frontend framework removed legacy 'id=customer_name' during React refactor.",
7
- "failure_vector": {
8
- "type": "ID_REMOVAL",
9
- "broken_locator": "#customer_name",
10
- "error_log": "ElementNotFoundException: Cannot locate element '#customer_name'",
11
- "dom_snapshot": "<input type='text' name='customerName' data-testid='customer-name-field' class='form-control'/>"
12
- },
13
- "expected_resolution": {
14
- "healed_locator": "[data-testid='customer-name-field']",
15
- "fallback_locator": "input[name='customerName']",
16
- "strategy": "DATA_TESTID_UPGRADE"
17
- },
18
- "benchmark_targets": {
19
- "max_heal_time_sec": 1.5,
20
- "max_token_cost": 250,
21
- "min_confidence_score": 0.92
22
- }
1
+ {
2
+ "id": "QA-CHALLENGE-04",
3
+ "name": "Legacy ID Removed in Favor of data-testid",
4
+ "category": "locator_drift",
5
+ "difficulty": "EASY",
6
+ "description": "Frontend framework removed legacy 'id=customer_name' during React refactor.",
7
+ "failure_vector": {
8
+ "type": "ID_REMOVAL",
9
+ "broken_locator": "#customer_name",
10
+ "error_log": "ElementNotFoundException: Cannot locate element '#customer_name'",
11
+ "dom_snapshot": "<input type='text' name='customerName' data-testid='customer-name-field' class='form-control'/>"
12
+ },
13
+ "expected_resolution": {
14
+ "healed_locator": "[data-testid='customer-name-field']",
15
+ "fallback_locator": "input[name='customerName']",
16
+ "strategy": "DATA_TESTID_UPGRADE"
17
+ },
18
+ "benchmark_targets": {
19
+ "max_heal_time_sec": 1.5,
20
+ "max_token_cost": 250,
21
+ "min_confidence_score": 0.92
22
+ }
23
23
  }
@@ -1,23 +1,23 @@
1
- {
2
- "id": "QA-CHALLENGE-05",
3
- "name": "HTML Tag Evolution: Anchor to ARIA Button",
4
- "category": "locator_drift",
5
- "difficulty": "MEDIUM",
6
- "description": "Navigation link <a href='#'> converted into accessible <button role='button'>.",
7
- "failure_vector": {
8
- "type": "TAG_MUTATION",
9
- "broken_locator": "a.nav-export",
10
- "error_log": "ElementNotInteractableException: Element <a class='nav-export'> is no longer attached or interactive",
11
- "dom_snapshot": "<button role='button' class='btn-export' aria-label='Export Report' data-action='export'>Export Report</button>"
12
- },
13
- "expected_resolution": {
14
- "healed_locator": "button[aria-label='Export Report']",
15
- "fallback_locator": "button:has-text('Export Report')",
16
- "strategy": "AOM_ROLE_MAPPING"
17
- },
18
- "benchmark_targets": {
19
- "max_heal_time_sec": 2.0,
20
- "max_token_cost": 300,
21
- "min_confidence_score": 0.88
22
- }
1
+ {
2
+ "id": "QA-CHALLENGE-05",
3
+ "name": "HTML Tag Evolution: Anchor to ARIA Button",
4
+ "category": "locator_drift",
5
+ "difficulty": "MEDIUM",
6
+ "description": "Navigation link <a href='#'> converted into accessible <button role='button'>.",
7
+ "failure_vector": {
8
+ "type": "TAG_MUTATION",
9
+ "broken_locator": "a.nav-export",
10
+ "error_log": "ElementNotInteractableException: Element <a class='nav-export'> is no longer attached or interactive",
11
+ "dom_snapshot": "<button role='button' class='btn-export' aria-label='Export Report' data-action='export'>Export Report</button>"
12
+ },
13
+ "expected_resolution": {
14
+ "healed_locator": "button[aria-label='Export Report']",
15
+ "fallback_locator": "button:has-text('Export Report')",
16
+ "strategy": "AOM_ROLE_MAPPING"
17
+ },
18
+ "benchmark_targets": {
19
+ "max_heal_time_sec": 2.0,
20
+ "max_token_cost": 300,
21
+ "min_confidence_score": 0.88
22
+ }
23
23
  }
@@ -1,22 +1,22 @@
1
- {
2
- "id": "QA-CHALLENGE-16",
3
- "name": "WebSocket Table Auto-Refresh Stale Reference",
4
- "category": "stale_and_mutation",
5
- "difficulty": "HARD",
6
- "description": "WebSocket pushes live quotes every 1.5s, wiping and recreating <tr> elements.",
7
- "failure_vector": {
8
- "type": "STALE_ELEMENT",
9
- "broken_code": "def row = page.locator('#stocks tr').first(); page.waitForTimeout(1600); row.click();",
10
- "error_log": "StaleElementReferenceException: Element is no longer attached to DOM",
11
- "environment_condition": "WebSocket DOM Mutation"
12
- },
13
- "expected_resolution": {
14
- "healed_code": "page.locator('#stocks tr').first().click(); // Re-queries locator at moment of dispatch",
15
- "strategy": "DYNAMIC_LOCATOR_REQUERY"
16
- },
17
- "benchmark_targets": {
18
- "max_heal_time_sec": 2.5,
19
- "max_token_cost": 340,
20
- "min_confidence_score": 0.9
21
- }
1
+ {
2
+ "id": "QA-CHALLENGE-16",
3
+ "name": "WebSocket Table Auto-Refresh Stale Reference",
4
+ "category": "stale_and_mutation",
5
+ "difficulty": "HARD",
6
+ "description": "WebSocket pushes live quotes every 1.5s, wiping and recreating <tr> elements.",
7
+ "failure_vector": {
8
+ "type": "STALE_ELEMENT",
9
+ "broken_code": "def row = page.locator('#stocks tr').first(); page.waitForTimeout(1600); row.click();",
10
+ "error_log": "StaleElementReferenceException: Element is no longer attached to DOM",
11
+ "environment_condition": "WebSocket DOM Mutation"
12
+ },
13
+ "expected_resolution": {
14
+ "healed_code": "page.locator('#stocks tr').first().click(); // Re-queries locator at moment of dispatch",
15
+ "strategy": "DYNAMIC_LOCATOR_REQUERY"
16
+ },
17
+ "benchmark_targets": {
18
+ "max_heal_time_sec": 2.5,
19
+ "max_token_cost": 340,
20
+ "min_confidence_score": 0.9
21
+ }
22
22
  }
@@ -1,22 +1,22 @@
1
- {
2
- "id": "QA-CHALLENGE-17",
3
- "name": "Tab Switch Component Unmount Detach",
4
- "category": "stale_and_mutation",
5
- "difficulty": "MEDIUM",
6
- "description": "Switching active tabs unmounts previous panel component entirely from virtual DOM.",
7
- "failure_vector": {
8
- "type": "COMPONENT_UNMOUNT",
9
- "broken_code": "page.click('#tab-billing'); page.fill('#billing-tax-id', 'TAX-999');",
10
- "error_log": "ElementNotInteractableException: Target element '#billing-tax-id' is hidden or unmounted",
11
- "environment_condition": "Tab Component View Switching"
12
- },
13
- "expected_resolution": {
14
- "healed_code": "page.click('#tab-billing'); page.waitForSelector('#billing-tab-content[aria-hidden=\"false\"]'); page.fill('#billing-tax-id', 'TAX-999');",
15
- "strategy": "TAB_MOUNT_SYNCHRONIZATION"
16
- },
17
- "benchmark_targets": {
18
- "max_heal_time_sec": 2.0,
19
- "max_token_cost": 300,
20
- "min_confidence_score": 0.91
21
- }
1
+ {
2
+ "id": "QA-CHALLENGE-17",
3
+ "name": "Tab Switch Component Unmount Detach",
4
+ "category": "stale_and_mutation",
5
+ "difficulty": "MEDIUM",
6
+ "description": "Switching active tabs unmounts previous panel component entirely from virtual DOM.",
7
+ "failure_vector": {
8
+ "type": "COMPONENT_UNMOUNT",
9
+ "broken_code": "page.click('#tab-billing'); page.fill('#billing-tax-id', 'TAX-999');",
10
+ "error_log": "ElementNotInteractableException: Target element '#billing-tax-id' is hidden or unmounted",
11
+ "environment_condition": "Tab Component View Switching"
12
+ },
13
+ "expected_resolution": {
14
+ "healed_code": "page.click('#tab-billing'); page.waitForSelector('#billing-tab-content[aria-hidden=\"false\"]'); page.fill('#billing-tax-id', 'TAX-999');",
15
+ "strategy": "TAB_MOUNT_SYNCHRONIZATION"
16
+ },
17
+ "benchmark_targets": {
18
+ "max_heal_time_sec": 2.0,
19
+ "max_token_cost": 300,
20
+ "min_confidence_score": 0.91
21
+ }
22
22
  }
@@ -1,22 +1,22 @@
1
- {
2
- "id": "QA-CHALLENGE-18",
3
- "name": "Pagination Replaces tbody (Stale Row Index)",
4
- "category": "stale_and_mutation",
5
- "difficulty": "MEDIUM",
6
- "description": "Navigating to page 2 updates table rows; old row references become detached.",
7
- "failure_vector": {
8
- "type": "PAGINATION_DETACH",
9
- "broken_code": "page.click('.p-paginator-next'); page.locator('tbody tr').nth(0).click();",
10
- "error_log": "StaleElementReferenceException: Stale element handle during click dispatch",
11
- "environment_condition": "Data Table Pagination"
12
- },
13
- "expected_resolution": {
14
- "healed_code": "page.click('.p-paginator-next'); page.waitForResponse(r => r.url().includes('page=2')); page.locator('tbody tr').first().click();",
15
- "strategy": "PAGINATION_NETWORK_SYNC"
16
- },
17
- "benchmark_targets": {
18
- "max_heal_time_sec": 2.0,
19
- "max_token_cost": 310,
20
- "min_confidence_score": 0.92
21
- }
1
+ {
2
+ "id": "QA-CHALLENGE-18",
3
+ "name": "Pagination Replaces tbody (Stale Row Index)",
4
+ "category": "stale_and_mutation",
5
+ "difficulty": "MEDIUM",
6
+ "description": "Navigating to page 2 updates table rows; old row references become detached.",
7
+ "failure_vector": {
8
+ "type": "PAGINATION_DETACH",
9
+ "broken_code": "page.click('.p-paginator-next'); page.locator('tbody tr').nth(0).click();",
10
+ "error_log": "StaleElementReferenceException: Stale element handle during click dispatch",
11
+ "environment_condition": "Data Table Pagination"
12
+ },
13
+ "expected_resolution": {
14
+ "healed_code": "page.click('.p-paginator-next'); page.waitForResponse(r => r.url().includes('page=2')); page.locator('tbody tr').first().click();",
15
+ "strategy": "PAGINATION_NETWORK_SYNC"
16
+ },
17
+ "benchmark_targets": {
18
+ "max_heal_time_sec": 2.0,
19
+ "max_token_cost": 310,
20
+ "min_confidence_score": 0.92
21
+ }
22
22
  }
@@ -1,22 +1,22 @@
1
- {
2
- "id": "QA-CHALLENGE-19",
3
- "name": "Reopened Modal Generates Fresh DOM Node",
4
- "category": "stale_and_mutation",
5
- "difficulty": "MEDIUM",
6
- "description": "Closing and reopening dialog instantiates new DOM element with same CSS selector.",
7
- "failure_vector": {
8
- "type": "FRESH_INSTANCE_STALE",
9
- "broken_code": "def modal = page.locator('#edit-dialog'); page.click('#close-btn'); page.click('#open-btn'); modal.fill('input', 'new');",
10
- "error_log": "ElementNotVisibleException: Cached element reference points to detached/hidden dialog instance",
11
- "environment_condition": "Modal Lifecycle Instantiation"
12
- },
13
- "expected_resolution": {
14
- "healed_code": "page.click('#close-btn'); page.click('#open-btn'); page.locator('#edit-dialog:visible input').fill('new');",
15
- "strategy": "VISIBLE_SELECTOR_REBIND"
16
- },
17
- "benchmark_targets": {
18
- "max_heal_time_sec": 2.0,
19
- "max_token_cost": 290,
20
- "min_confidence_score": 0.94
21
- }
1
+ {
2
+ "id": "QA-CHALLENGE-19",
3
+ "name": "Reopened Modal Generates Fresh DOM Node",
4
+ "category": "stale_and_mutation",
5
+ "difficulty": "MEDIUM",
6
+ "description": "Closing and reopening dialog instantiates new DOM element with same CSS selector.",
7
+ "failure_vector": {
8
+ "type": "FRESH_INSTANCE_STALE",
9
+ "broken_code": "def modal = page.locator('#edit-dialog'); page.click('#close-btn'); page.click('#open-btn'); modal.fill('input', 'new');",
10
+ "error_log": "ElementNotVisibleException: Cached element reference points to detached/hidden dialog instance",
11
+ "environment_condition": "Modal Lifecycle Instantiation"
12
+ },
13
+ "expected_resolution": {
14
+ "healed_code": "page.click('#close-btn'); page.click('#open-btn'); page.locator('#edit-dialog:visible input').fill('new');",
15
+ "strategy": "VISIBLE_SELECTOR_REBIND"
16
+ },
17
+ "benchmark_targets": {
18
+ "max_heal_time_sec": 2.0,
19
+ "max_token_cost": 290,
20
+ "min_confidence_score": 0.94
21
+ }
22
22
  }
@@ -1,23 +1,23 @@
1
- {
2
- "id": "QA-CHALLENGE-20",
3
- "name": "Locale Swap Invalidates Hardcoded Text Selectors",
4
- "category": "stale_and_mutation",
5
- "difficulty": "EASY",
6
- "description": "Application language changed to French ('Enregistrer'); text selector 'Save' fails.",
7
- "failure_vector": {
8
- "type": "I18N_TEXT_MUTATION",
9
- "broken_locator": "button:has-text('Save')",
10
- "error_log": "TimeoutException: No element found matching text 'Save'",
11
- "dom_snapshot": "<button type='submit' data-action='save' class='btn-primary' aria-label='save-record'>Enregistrer</button>"
12
- },
13
- "expected_resolution": {
14
- "healed_locator": "button[data-action='save']",
15
- "fallback_locator": "button[aria-label='save-record']",
16
- "strategy": "LOCALE_AGNOSTIC_DATA_ATTRIBUTES"
17
- },
18
- "benchmark_targets": {
19
- "max_heal_time_sec": 1.5,
20
- "max_token_cost": 270,
21
- "min_confidence_score": 0.95
22
- }
1
+ {
2
+ "id": "QA-CHALLENGE-20",
3
+ "name": "Locale Swap Invalidates Hardcoded Text Selectors",
4
+ "category": "stale_and_mutation",
5
+ "difficulty": "EASY",
6
+ "description": "Application language changed to French ('Enregistrer'); text selector 'Save' fails.",
7
+ "failure_vector": {
8
+ "type": "I18N_TEXT_MUTATION",
9
+ "broken_locator": "button:has-text('Save')",
10
+ "error_log": "TimeoutException: No element found matching text 'Save'",
11
+ "dom_snapshot": "<button type='submit' data-action='save' class='btn-primary' aria-label='save-record'>Enregistrer</button>"
12
+ },
13
+ "expected_resolution": {
14
+ "healed_locator": "button[data-action='save']",
15
+ "fallback_locator": "button[aria-label='save-record']",
16
+ "strategy": "LOCALE_AGNOSTIC_DATA_ATTRIBUTES"
17
+ },
18
+ "benchmark_targets": {
19
+ "max_heal_time_sec": 1.5,
20
+ "max_token_cost": 270,
21
+ "min_confidence_score": 0.95
22
+ }
23
23
  }
@@ -1,22 +1,22 @@
1
- {
2
- "id": "QA-CHALLENGE-11",
3
- "name": "Network Latency Spike (3,500ms Throttle) Breaking Static Sleep",
4
- "category": "timing_and_race",
5
- "difficulty": "MEDIUM",
6
- "description": "Microservice latency under load takes 3.5s; test had Thread.sleep(2000).",
7
- "failure_vector": {
8
- "type": "STATIC_SLEEP_TIMEOUT",
9
- "broken_code": "Thread.sleep(2000); assert WebUI.verifyElementPresent('#result')",
10
- "error_log": "ElementNotFoundException: Element '#result' not present after 2000ms delay",
11
- "environment_condition": "CDP Network Throttling 3500ms delay"
12
- },
13
- "expected_resolution": {
14
- "healed_code": "page.waitForSelector('#result', timeout: 10000); page.waitForLoadState('networkidle')",
15
- "strategy": "DYNAMIC_SMART_WAIT"
16
- },
17
- "benchmark_targets": {
18
- "max_heal_time_sec": 2.5,
19
- "max_token_cost": 320,
20
- "min_confidence_score": 0.92
21
- }
1
+ {
2
+ "id": "QA-CHALLENGE-11",
3
+ "name": "Network Latency Spike (3,500ms Throttle) Breaking Static Sleep",
4
+ "category": "timing_and_race",
5
+ "difficulty": "MEDIUM",
6
+ "description": "Microservice latency under load takes 3.5s; test had Thread.sleep(2000).",
7
+ "failure_vector": {
8
+ "type": "STATIC_SLEEP_TIMEOUT",
9
+ "broken_code": "Thread.sleep(2000); assert WebUI.verifyElementPresent('#result')",
10
+ "error_log": "ElementNotFoundException: Element '#result' not present after 2000ms delay",
11
+ "environment_condition": "CDP Network Throttling 3500ms delay"
12
+ },
13
+ "expected_resolution": {
14
+ "healed_code": "page.waitForSelector('#result', timeout: 10000); page.waitForLoadState('networkidle')",
15
+ "strategy": "DYNAMIC_SMART_WAIT"
16
+ },
17
+ "benchmark_targets": {
18
+ "max_heal_time_sec": 2.5,
19
+ "max_token_cost": 320,
20
+ "min_confidence_score": 0.92
21
+ }
22
22
  }
@@ -1,22 +1,22 @@
1
- {
2
- "id": "QA-CHALLENGE-12",
3
- "name": "PrimeNG Modal Backdrop Fading Intercept",
4
- "category": "timing_and_race",
5
- "difficulty": "HARD",
6
- "description": "Modal backdrop takes 450ms CSS transition to fade out; click immediately triggers intercept.",
7
- "failure_vector": {
8
- "type": "CLICK_INTERCEPTED",
9
- "broken_code": "page.click('#confirm-btn')",
10
- "error_log": "ElementClickInterceptedException: <div class='p-component-overlay p-component-overlay-enter'> intercepts pointer-events",
11
- "environment_condition": "PrimeNG Modal Fade Transition"
12
- },
13
- "expected_resolution": {
14
- "healed_code": "page.waitForSelector('.p-component-overlay', state: 'detached'); BasePage.clickJS('#confirm-btn')",
15
- "strategy": "OVERLAY_SAFE_DISPATCH"
16
- },
17
- "benchmark_targets": {
18
- "max_heal_time_sec": 3.0,
19
- "max_token_cost": 380,
20
- "min_confidence_score": 0.9
21
- }
1
+ {
2
+ "id": "QA-CHALLENGE-12",
3
+ "name": "PrimeNG Modal Backdrop Fading Intercept",
4
+ "category": "timing_and_race",
5
+ "difficulty": "HARD",
6
+ "description": "Modal backdrop takes 450ms CSS transition to fade out; click immediately triggers intercept.",
7
+ "failure_vector": {
8
+ "type": "CLICK_INTERCEPTED",
9
+ "broken_code": "page.click('#confirm-btn')",
10
+ "error_log": "ElementClickInterceptedException: <div class='p-component-overlay p-component-overlay-enter'> intercepts pointer-events",
11
+ "environment_condition": "PrimeNG Modal Fade Transition"
12
+ },
13
+ "expected_resolution": {
14
+ "healed_code": "page.waitForSelector('.p-component-overlay', state: 'detached'); BasePage.clickJS('#confirm-btn')",
15
+ "strategy": "OVERLAY_SAFE_DISPATCH"
16
+ },
17
+ "benchmark_targets": {
18
+ "max_heal_time_sec": 3.0,
19
+ "max_token_cost": 380,
20
+ "min_confidence_score": 0.9
21
+ }
22
22
  }
@@ -1,22 +1,22 @@
1
- {
2
- "id": "QA-CHALLENGE-13",
3
- "name": "Debounced Search Input Autocomplete Race",
4
- "category": "timing_and_race",
5
- "difficulty": "MEDIUM",
6
- "description": "Search input debounces 400ms before sending query; test clicked dropdown item before query fired.",
7
- "failure_vector": {
8
- "type": "DEBOUNCE_RACE",
9
- "broken_code": "page.fill('#search-input', 'Invoice'); page.click('.dropdown-item:first-child')",
10
- "error_log": "TimeoutException: Timed out waiting for '.dropdown-item' to appear in DOM",
11
- "environment_condition": "Debounce Timer 400ms"
12
- },
13
- "expected_resolution": {
14
- "healed_code": "page.fill('#search-input', 'Invoice'); page.waitForResponse(r => r.url().includes('/search') && r.status() == 200); page.click('.dropdown-item:first-child')",
15
- "strategy": "CDP_RESPONSE_BARRIER"
16
- },
17
- "benchmark_targets": {
18
- "max_heal_time_sec": 2.5,
19
- "max_token_cost": 350,
20
- "min_confidence_score": 0.88
21
- }
1
+ {
2
+ "id": "QA-CHALLENGE-13",
3
+ "name": "Debounced Search Input Autocomplete Race",
4
+ "category": "timing_and_race",
5
+ "difficulty": "MEDIUM",
6
+ "description": "Search input debounces 400ms before sending query; test clicked dropdown item before query fired.",
7
+ "failure_vector": {
8
+ "type": "DEBOUNCE_RACE",
9
+ "broken_code": "page.fill('#search-input', 'Invoice'); page.click('.dropdown-item:first-child')",
10
+ "error_log": "TimeoutException: Timed out waiting for '.dropdown-item' to appear in DOM",
11
+ "environment_condition": "Debounce Timer 400ms"
12
+ },
13
+ "expected_resolution": {
14
+ "healed_code": "page.fill('#search-input', 'Invoice'); page.waitForResponse(r => r.url().includes('/search') && r.status() == 200); page.click('.dropdown-item:first-child')",
15
+ "strategy": "CDP_RESPONSE_BARRIER"
16
+ },
17
+ "benchmark_targets": {
18
+ "max_heal_time_sec": 2.5,
19
+ "max_token_cost": 350,
20
+ "min_confidence_score": 0.88
21
+ }
22
22
  }