testwins 0.4.0__tar.gz

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 (207) hide show
  1. testwins-0.4.0/.dockerignore +22 -0
  2. testwins-0.4.0/.env.example +69 -0
  3. testwins-0.4.0/.github/workflows/ci.yml +128 -0
  4. testwins-0.4.0/.github/workflows/live.yml +50 -0
  5. testwins-0.4.0/.gitignore +23 -0
  6. testwins-0.4.0/CHANGELOG.md +70 -0
  7. testwins-0.4.0/LICENSE +21 -0
  8. testwins-0.4.0/MANIFEST.in +25 -0
  9. testwins-0.4.0/Makefile +88 -0
  10. testwins-0.4.0/PKG-INFO +223 -0
  11. testwins-0.4.0/README.md +179 -0
  12. testwins-0.4.0/START.md +53 -0
  13. testwins-0.4.0/THIRD_PARTY.md +21 -0
  14. testwins-0.4.0/compose.live-novnc.yaml +22 -0
  15. testwins-0.4.0/compose.live.yaml +32 -0
  16. testwins-0.4.0/configs/audit.yaml +24 -0
  17. testwins-0.4.0/configs/demo.yaml +34 -0
  18. testwins-0.4.0/configs/live/desktop.watch.yaml +26 -0
  19. testwins-0.4.0/configs/live/docker.watch.yaml +53 -0
  20. testwins-0.4.0/configs/live/headed.audit.yaml +14 -0
  21. testwins-0.4.0/configs/live/landing.watch.yaml +49 -0
  22. testwins-0.4.0/configs/live/novnc.watch.yaml +56 -0
  23. testwins-0.4.0/docker/Dockerfile +42 -0
  24. testwins-0.4.0/docker/entrypoint.sh +23 -0
  25. testwins-0.4.0/docker/live-novnc-entrypoint.sh +14 -0
  26. testwins-0.4.0/docker/live.Dockerfile +16 -0
  27. testwins-0.4.0/docker/publisher.Dockerfile +11 -0
  28. testwins-0.4.0/docker/worker-entrypoint.sh +9 -0
  29. testwins-0.4.0/docker/worker.Dockerfile +19 -0
  30. testwins-0.4.0/docs/ARCHITECTURE.md +43 -0
  31. testwins-0.4.0/docs/CONFIGURATION.md +196 -0
  32. testwins-0.4.0/docs/OSS_REUSE.md +68 -0
  33. testwins-0.4.0/docs/PLANFILE.md +50 -0
  34. testwins-0.4.0/docs/PUBLISHING.md +40 -0
  35. testwins-0.4.0/docs/RELEASE-0.4.md +204 -0
  36. testwins-0.4.0/docs/RULES.md +33 -0
  37. testwins-0.4.0/docs/SECURITY.md +80 -0
  38. testwins-0.4.0/docs/SOURCE_REVIEW.md +22 -0
  39. testwins-0.4.0/docs/STANDARDS.md +40 -0
  40. testwins-0.4.0/docs/TASKS.md +107 -0
  41. testwins-0.4.0/docs/TROUBLESHOOTING.md +45 -0
  42. testwins-0.4.0/docs/VISION.md +71 -0
  43. testwins-0.4.0/docs/live/ARCHITECTURE.md +124 -0
  44. testwins-0.4.0/docs/live/GUI_TAXONOMY.md +162 -0
  45. testwins-0.4.0/docs/live/OPERATIONS.md +238 -0
  46. testwins-0.4.0/docs/live/RESEARCH.md +40 -0
  47. testwins-0.4.0/docs/migration/ANALIZA-0.3.md +141 -0
  48. testwins-0.4.0/example.suite.yaml +11 -0
  49. testwins-0.4.0/examples/buggy-app/app.py +10 -0
  50. testwins-0.4.0/examples/buggy-app/index.html +11 -0
  51. testwins-0.4.0/examples/terminal/prompt.py +2 -0
  52. testwins-0.4.0/integrations/clonerd/.gitignore +6 -0
  53. testwins-0.4.0/integrations/clonerd/Makefile +29 -0
  54. testwins-0.4.0/integrations/clonerd/README.md +81 -0
  55. testwins-0.4.0/integrations/clonerd/api/mutations.review.yaml +15 -0
  56. testwins-0.4.0/integrations/clonerd/api/readonly.yaml +14 -0
  57. testwins-0.4.0/integrations/clonerd/audit/large.yaml +60 -0
  58. testwins-0.4.0/integrations/clonerd/audit/mobile.yaml +54 -0
  59. testwins-0.4.0/integrations/clonerd/audit/performance.yaml +44 -0
  60. testwins-0.4.0/integrations/clonerd/inventory.json +91 -0
  61. testwins-0.4.0/integrations/clonerd/journeys/developer.desktop.yaml +68 -0
  62. testwins-0.4.0/integrations/clonerd/journeys/download.review.yaml +55 -0
  63. testwins-0.4.0/integrations/clonerd/journeys/personas.large.yaml +182 -0
  64. testwins-0.4.0/integrations/clonerd/journeys/personas.mobile.yaml +176 -0
  65. testwins-0.4.0/integrations/clonerd/personas.suite.yaml +12 -0
  66. testwins-0.4.0/integrations/clonerd/scope.json +25 -0
  67. testwins-0.4.0/integrations/clonerd/testwins.watch.yaml +80 -0
  68. testwins-0.4.0/integrations/clonerd/tools/manage.py +110 -0
  69. testwins-0.4.0/integrations/wup/README.md +26 -0
  70. testwins-0.4.0/integrations/wup/START.md +18 -0
  71. testwins-0.4.0/integrations/wup/install.py +64 -0
  72. testwins-0.4.0/integrations/wup/overlay/wup/gui_testwins.py +67 -0
  73. testwins-0.4.0/integrations/wup/wup-testwins.patch +86 -0
  74. testwins-0.4.0/landing/.dockerignore +4 -0
  75. testwins-0.4.0/landing/Dockerfile +6 -0
  76. testwins-0.4.0/landing/README.md +58 -0
  77. testwins-0.4.0/landing/compose.yaml +10 -0
  78. testwins-0.4.0/landing/nginx.conf +14 -0
  79. testwins-0.4.0/landing/static/app.js +36 -0
  80. testwins-0.4.0/landing/static/docs/index.html +6 -0
  81. testwins-0.4.0/landing/static/favicon.svg +1 -0
  82. testwins-0.4.0/landing/static/index.html +45 -0
  83. testwins-0.4.0/landing/static/privacy/index.html +1 -0
  84. testwins-0.4.0/landing/static/style.css +8 -0
  85. testwins-0.4.0/landing/tests/audit.yaml +45 -0
  86. testwins-0.4.0/landing/tests/landing.oql +12 -0
  87. testwins-0.4.0/landing/tests/scenario.yaml +7 -0
  88. testwins-0.4.0/pyproject.toml +69 -0
  89. testwins-0.4.0/requirements.txt +6 -0
  90. testwins-0.4.0/scenarios/desktop.task.yaml +11 -0
  91. testwins-0.4.0/scenarios/shell.oql +4 -0
  92. testwins-0.4.0/scenarios/shell.task.yaml +6 -0
  93. testwins-0.4.0/scenarios/terminal.task.yaml +11 -0
  94. testwins-0.4.0/scripts/make_live_inventory.py +13 -0
  95. testwins-0.4.0/setup.cfg +4 -0
  96. testwins-0.4.0/tests/conftest.py +4 -0
  97. testwins-0.4.0/tests/live/test_live_core.py +294 -0
  98. testwins-0.4.0/tests/live/test_live_io.py +108 -0
  99. testwins-0.4.0/tests/live/test_renderer_live.py +52 -0
  100. testwins-0.4.0/tests/test_baseline_vision.py +26 -0
  101. testwins-0.4.0/tests/test_collector_browser.py +23 -0
  102. testwins-0.4.0/tests/test_compose.py +29 -0
  103. testwins-0.4.0/tests/test_config.py +32 -0
  104. testwins-0.4.0/tests/test_detectors.py +39 -0
  105. testwins-0.4.0/tests/test_extensions.py +239 -0
  106. testwins-0.4.0/tests/test_fail_closed.py +22 -0
  107. testwins-0.4.0/tests/test_integrity.py +45 -0
  108. testwins-0.4.0/tests/test_proposals.py +77 -0
  109. testwins-0.4.0/tests/test_release_browser.py +127 -0
  110. testwins-0.4.0/tests/test_release_contracts.py +276 -0
  111. testwins-0.4.0/tests/test_reporting.py +21 -0
  112. testwins-0.4.0/tests/test_staging.py +23 -0
  113. testwins-0.4.0/testwins/__init__.py +2 -0
  114. testwins-0.4.0/testwins/__main__.py +2 -0
  115. testwins-0.4.0/testwins/api_contracts.py +145 -0
  116. testwins-0.4.0/testwins/baseline.py +57 -0
  117. testwins-0.4.0/testwins/browser.py +87 -0
  118. testwins-0.4.0/testwins/cli.py +149 -0
  119. testwins-0.4.0/testwins/collector.js +154 -0
  120. testwins-0.4.0/testwins/config.py +174 -0
  121. testwins-0.4.0/testwins/contracts.py +69 -0
  122. testwins-0.4.0/testwins/cv.py +138 -0
  123. testwins-0.4.0/testwins/detectors.py +133 -0
  124. testwins-0.4.0/testwins/downloads.py +46 -0
  125. testwins-0.4.0/testwins/drafting.py +49 -0
  126. testwins-0.4.0/testwins/events.py +68 -0
  127. testwins-0.4.0/testwins/gate.py +48 -0
  128. testwins-0.4.0/testwins/input.py +55 -0
  129. testwins-0.4.0/testwins/integrations/__init__.py +1 -0
  130. testwins-0.4.0/testwins/integrations/desktop.py +62 -0
  131. testwins-0.4.0/testwins/integrations/terminal.py +52 -0
  132. testwins-0.4.0/testwins/integrations/testql.py +71 -0
  133. testwins-0.4.0/testwins/live/__init__.py +1 -0
  134. testwins-0.4.0/testwins/live/augmentation.py +88 -0
  135. testwins-0.4.0/testwins/live/catalog.json +1271 -0
  136. testwins-0.4.0/testwins/live/cli.py +95 -0
  137. testwins-0.4.0/testwins/live/config.py +206 -0
  138. testwins-0.4.0/testwins/live/dashboard.html +21 -0
  139. testwins-0.4.0/testwins/live/diagnosis.py +99 -0
  140. testwins-0.4.0/testwins/live/export.py +53 -0
  141. testwins-0.4.0/testwins/live/native.py +74 -0
  142. testwins-0.4.0/testwins/live/observer.js +11 -0
  143. testwins-0.4.0/testwins/live/policy.py +63 -0
  144. testwins-0.4.0/testwins/live/provenance.py +42 -0
  145. testwins-0.4.0/testwins/live/runtime.py +197 -0
  146. testwins-0.4.0/testwins/live/scanner.py +181 -0
  147. testwins-0.4.0/testwins/live/server.py +68 -0
  148. testwins-0.4.0/testwins/live/store.py +146 -0
  149. testwins-0.4.0/testwins/llm.py +213 -0
  150. testwins-0.4.0/testwins/model.py +27 -0
  151. testwins-0.4.0/testwins/performance.py +20 -0
  152. testwins-0.4.0/testwins/proposals.py +99 -0
  153. testwins-0.4.0/testwins/pytest_plugin.py +38 -0
  154. testwins-0.4.0/testwins/reporting.py +186 -0
  155. testwins-0.4.0/testwins/resources/clonerd/.gitignore +6 -0
  156. testwins-0.4.0/testwins/resources/clonerd/Makefile +29 -0
  157. testwins-0.4.0/testwins/resources/clonerd/README.md +81 -0
  158. testwins-0.4.0/testwins/resources/clonerd/api/mutations.review.yaml +15 -0
  159. testwins-0.4.0/testwins/resources/clonerd/api/readonly.yaml +14 -0
  160. testwins-0.4.0/testwins/resources/clonerd/audit/large.yaml +60 -0
  161. testwins-0.4.0/testwins/resources/clonerd/audit/mobile.yaml +54 -0
  162. testwins-0.4.0/testwins/resources/clonerd/audit/performance.yaml +44 -0
  163. testwins-0.4.0/testwins/resources/clonerd/inventory.json +91 -0
  164. testwins-0.4.0/testwins/resources/clonerd/journeys/developer.desktop.yaml +68 -0
  165. testwins-0.4.0/testwins/resources/clonerd/journeys/download.review.yaml +55 -0
  166. testwins-0.4.0/testwins/resources/clonerd/journeys/personas.large.yaml +182 -0
  167. testwins-0.4.0/testwins/resources/clonerd/journeys/personas.mobile.yaml +176 -0
  168. testwins-0.4.0/testwins/resources/clonerd/personas.suite.yaml +12 -0
  169. testwins-0.4.0/testwins/resources/clonerd/scope.json +25 -0
  170. testwins-0.4.0/testwins/resources/clonerd/testwins.watch.yaml +80 -0
  171. testwins-0.4.0/testwins/resources/clonerd/tools/manage.py +110 -0
  172. testwins-0.4.0/testwins/resources/minimal/README.md +13 -0
  173. testwins-0.4.0/testwins/resources/minimal/audit.yaml +17 -0
  174. testwins-0.4.0/testwins/resources/minimal/shell.oql +4 -0
  175. testwins-0.4.0/testwins/runner.py +361 -0
  176. testwins-0.4.0/testwins/sessions.py +59 -0
  177. testwins-0.4.0/testwins/staging.py +39 -0
  178. testwins-0.4.0/testwins/suite.py +48 -0
  179. testwins-0.4.0/testwins/task_reporting.py +23 -0
  180. testwins-0.4.0/testwins/task_worker.py +35 -0
  181. testwins-0.4.0/testwins/tasks.py +134 -0
  182. testwins-0.4.0/testwins/util.py +81 -0
  183. testwins-0.4.0/testwins/verification.py +23 -0
  184. testwins-0.4.0/testwins.egg-info/PKG-INFO +223 -0
  185. testwins-0.4.0/testwins.egg-info/SOURCES.txt +205 -0
  186. testwins-0.4.0/testwins.egg-info/dependency_links.txt +1 -0
  187. testwins-0.4.0/testwins.egg-info/entry_points.txt +2 -0
  188. testwins-0.4.0/testwins.egg-info/requires.txt +40 -0
  189. testwins-0.4.0/testwins.egg-info/top_level.txt +1 -0
  190. testwins-0.4.0/tools/benchmark_live_scheduler.py +50 -0
  191. testwins-0.4.0/tools/lab.py +231 -0
  192. testwins-0.4.0/tools/landing.py +42 -0
  193. testwins-0.4.0/tools/live_manage.py +34 -0
  194. testwins-0.4.0/tools/manage.py +38 -0
  195. testwins-0.4.0/tools/release.py +94 -0
  196. testwins-0.4.0/tools/report_server.py +28 -0
  197. testwins-0.4.0/tools/smoke.py +82 -0
  198. testwins-0.4.0/tools/stage.py +39 -0
  199. testwins-0.4.0/tools/standards.py +52 -0
  200. testwins-0.4.0/tools/verify_landing.py +50 -0
  201. testwins-0.4.0/tools/verify_live_renderer.py +71 -0
  202. testwins-0.4.0/tools/verify_testql.py +17 -0
  203. testwins-0.4.0/tools/vision.py +17 -0
  204. testwins-0.4.0/verification/STATUS.md +92 -0
  205. testwins-0.4.0/verification/environment.json +39 -0
  206. testwins-0.4.0/verification/landing-result.json +49 -0
  207. testwins-0.4.0/verification/summary.json +123 -0
@@ -0,0 +1,22 @@
1
+ .git
2
+ .env
3
+ .env.*
4
+ .testwins
5
+ artifacts
6
+ verification
7
+ baselines
8
+ **/__pycache__
9
+ **/.pytest_cache
10
+
11
+ .testwins
12
+ .testwins-live-secret
13
+ .testwins-integration-backup
14
+
15
+ **/.auth/
16
+ **/.testwins-auth/
17
+ **/*.storage-state.json
18
+
19
+ .venv
20
+ build
21
+ dist
22
+ *.egg-info
@@ -0,0 +1,69 @@
1
+ # Shared controller configuration. Never pass this file into SUT/browser workers.
2
+ INSTANCE=lab
3
+ MATRIX=cdp
4
+ VNC_PORT=6080
5
+ REPORT_PORT=8088
6
+ APP_ALLOW_NETWORK=0
7
+ # APP=/absolute/project
8
+ # APP_IMAGE=node:22-bookworm-slim
9
+ # APP_INSTALL=npm ci
10
+ # APP_COMMAND=npm run dev -- --host 0.0.0.0 --port 8080
11
+ # APP_PORT=8080
12
+ # CONFIG=configs/audit.yaml
13
+ # SUT_ENV_FILE=/absolute/synthetic-test-secrets.env
14
+
15
+ # One selected provider; all credentials remain on the controller.
16
+ LLM_PROVIDER=openrouter
17
+ # LLM_PROVIDER=zai
18
+ # LLM_PROVIDER=zai-coding
19
+ # LLM_PROVIDER=deepseek
20
+ # LLM_PROVIDER=ollama
21
+ # LLM_PROVIDER=custom
22
+ OPENROUTER_API_KEY=
23
+ OPENROUTER_MODEL=
24
+ OPENROUTER_VISION_MODEL=
25
+ # ZAI_API_KEY=
26
+ # ZAI_MODEL=
27
+ # ZAI_VISION_MODEL=
28
+ # ZAI_CODING_MODEL=
29
+ # ZAI_CODING_VISION_MODEL=
30
+ # DEEPSEEK_API_KEY=
31
+ # DEEPSEEK_MODEL=
32
+ # DEEPSEEK_VISION_MODEL=
33
+ # OLLAMA_MODEL=
34
+ # OLLAMA_VISION_MODEL=
35
+ # OLLAMA_BASE_URL=http://127.0.0.1:11434
36
+ # CUSTOM_API_KEY=
37
+ # CUSTOM_BASE_URL=https://your-reviewed-provider.example/v1
38
+ # CUSTOM_MODEL=
39
+ # CUSTOM_VISION_MODEL=
40
+ # Generic overrides take precedence over the selected provider profile:
41
+ # LLM_MODEL=
42
+ # LLM_VISION_MODEL=
43
+ # LLM_API_KEY=
44
+ # LLM_BASE_URL=
45
+ # Model identifiers are intentionally not guessed. Set an existing image-capable
46
+ # model at your provider; a coding/text model is not automatically vision-capable.
47
+ LLM_ALLOW_REMOTE=0
48
+ LLM_VISION_CAPABLE=0
49
+ LLM_MAX_CALLS=3
50
+ LLM_MAX_TOKENS=2200
51
+ LLM_TIMEOUT=60
52
+
53
+ # Local reviewed model only. No bundled weights / automatic download.
54
+ # YOLO_WEIGHTS=/absolute/models/gui.pt
55
+ # YOLO_SHA256=
56
+
57
+ # Source fallback for the public TestQL verification contract.
58
+ # Replace main with a reviewed full commit SHA for a release build.
59
+ TESTQL_REF=main
60
+ PLANFILE_REF=main
61
+ # PLANFILE_PROJECT=/absolute/project-with-.planfile
62
+ APPLY=0
63
+ READY=0
64
+ TICKET_LIMIT=25
65
+ TICKET_OFFSET=0
66
+
67
+ # Optional read-only browser state mount; keep synthetic accounts only.
68
+ # AUTH_DIR=/absolute/private/.auth
69
+ # Config sessions must use /auth/user.json and match the actual SUT origin.
@@ -0,0 +1,128 @@
1
+ name: testwins-verification
2
+ on:
3
+ push:
4
+ pull_request:
5
+ workflow_dispatch:
6
+ inputs:
7
+ docker_matrix:
8
+ description: Build and run both complete 9-cell Docker matrices
9
+ type: boolean
10
+ default: false
11
+ permissions:
12
+ contents: read
13
+ jobs:
14
+ unit:
15
+ runs-on: ubuntu-24.04
16
+ steps:
17
+ - uses: actions/checkout@v7
18
+ with:
19
+ persist-credentials: false
20
+ - uses: actions/setup-python@v7
21
+ with:
22
+ python-version: '3.12'
23
+ - run: make install
24
+ - run: make install-testql-source TESTQL_REF=main
25
+ - run: python -m pytest -q -m 'not browser' --junitxml=verification/ci-unit-tests.xml
26
+ - name: Real installed TestQL public SDK, not a mocked contract
27
+ run: python tools/verify_testql.py
28
+ - name: Build distribution and check metadata
29
+ run: python -m build && python -m twine check dist/*.whl dist/*.tar.gz
30
+ - run: python -m compileall -q testwins tools && node --check testwins/collector.js && sh -n docker/entrypoint.sh
31
+ - uses: actions/upload-artifact@v7
32
+ if: always()
33
+ with:
34
+ name: unit-evidence
35
+ path: |
36
+ verification/ci-unit-tests.xml
37
+ verification/testql-runs/
38
+ dist/
39
+ retention-days: 14
40
+ browser:
41
+ needs: unit
42
+ runs-on: ubuntu-24.04
43
+ timeout-minutes: 20
44
+ steps:
45
+ - uses: actions/checkout@v7
46
+ with:
47
+ persist-credentials: false
48
+ - uses: actions/setup-python@v7
49
+ with:
50
+ python-version: '3.12'
51
+ - run: make install
52
+ - run: python -m playwright install --with-deps chromium
53
+ - name: Full browser regressions including localStorage and download
54
+ run: |
55
+ export CHROMIUM_EXECUTABLE=$(python -c 'from playwright.sync_api import sync_playwright; p=sync_playwright().start(); print(p.chromium.executable_path); p.stop()')
56
+ python -m pytest -q -m browser --junitxml=verification/ci-browser-tests.xml
57
+ - uses: actions/upload-artifact@v7
58
+ if: always()
59
+ with:
60
+ name: browser-evidence
61
+ path: verification/ci-browser-tests.xml
62
+ retention-days: 14
63
+ docker:
64
+ if: github.event_name == 'workflow_dispatch' && inputs.docker_matrix
65
+ needs: unit
66
+ runs-on: ubuntu-24.04
67
+ timeout-minutes: 50
68
+ strategy:
69
+ fail-fast: false
70
+ matrix:
71
+ transport: [cdp, engines]
72
+ env:
73
+ MATRIX: ${{ matrix.transport }}
74
+ LAB_MEMORY: 5g
75
+ steps:
76
+ - uses: actions/checkout@v7
77
+ with:
78
+ persist-credentials: false
79
+ - name: Seeded demo, real HTTP and required axe
80
+ run: make demo
81
+ - name: Assert real matrix coverage and functional controls
82
+ run: |
83
+ python3 - <<'PY'
84
+ import json
85
+ from pathlib import Path
86
+ root=Path('artifacts/lab')
87
+ pointer=json.loads((root/'latest.json').read_text())
88
+ report=json.loads((root/pointer['directory']/'report.json').read_text())
89
+ assert report['coverage']['expected_cells']==9, report['coverage']
90
+ assert report['coverage']['state']=='complete', report['coverage']
91
+ assert report['summary']['confirmed']>0
92
+ dialog=[c for c in report['checks'] if c['scene']=='dialog']
93
+ cart=[c for c in report['checks'] if c['scene']=='cart']
94
+ assert len(dialog)==18 and all(c['status']=='passed' for c in dialog)
95
+ assert len(cart)==18 and all(c['status']=='failed' for c in cart)
96
+ assert report['environment']['fixture_mode']=='none'
97
+ PY
98
+ - name: Stop the seeded application before using the same ports
99
+ run: make down
100
+ - name: Landing Docker + Testwins matrix + actual TestQL browser scenario
101
+ run: make landing-check
102
+ - name: Require complete nine-cell landing coverage and an executed TestQL result
103
+ run: |
104
+ python3 - <<'PYCODE'
105
+ import json
106
+ from pathlib import Path
107
+ root=Path('artifacts/landing')
108
+ pointer=json.loads((root/'latest.json').read_text())
109
+ report=json.loads((root/pointer['directory']/'report.json').read_text())
110
+ assert report['coverage']['expected_cells']==9
111
+ assert report['coverage']['state']=='complete'
112
+ assert all(c['status']=='passed' for c in report['checks'])
113
+ assert report['environment']['fixture_mode']=='none'
114
+ runs=list((root/'testql').glob('*/result.json'))
115
+ assert runs, 'No TestQL result'
116
+ result=json.loads(sorted(runs)[-1].read_text())
117
+ assert result['backend']=='testql' and result['status']=='passed'
118
+ PYCODE
119
+ - run: make logs INSTANCE=landing
120
+ if: always()
121
+ - uses: actions/upload-artifact@v7
122
+ if: always()
123
+ with:
124
+ name: docker-${{ matrix.transport }}-evidence
125
+ path: artifacts/
126
+ retention-days: 14
127
+ - run: make landing-down; make down
128
+ if: always()
@@ -0,0 +1,50 @@
1
+ name: testwins-live-opt-in-integration
2
+ on:
3
+ workflow_dispatch:
4
+ permissions:
5
+ contents: read
6
+ jobs:
7
+ live-docker:
8
+ runs-on: ubuntu-24.04
9
+ timeout-minutes: 30
10
+ steps:
11
+ - uses: actions/checkout@v7
12
+ with:
13
+ persist-credentials: false
14
+ - name: Validate merged Compose and build real HTTP monitor
15
+ run: |
16
+ docker compose -f compose.live.yaml config --quiet
17
+ make live-docker
18
+ - name: Require all nine configured cells to be observed completely
19
+ run: |
20
+ python3 - <<'PY'
21
+ import json,time,urllib.request
22
+ deadline=time.monotonic()+240
23
+ while time.monotonic()<deadline:
24
+ try:
25
+ with urllib.request.urlopen('http://127.0.0.1:9067/api/status',timeout=5) as r:
26
+ data=json.load(r)
27
+ if len(data['targets'])==9 and all(t['status']=='complete' for t in data['targets']):
28
+ print(json.dumps(data,indent=2));break
29
+ except Exception:
30
+ pass
31
+ time.sleep(3)
32
+ else:
33
+ raise SystemExit('Live matrix incomplete; not PASS')
34
+ PY
35
+ - name: Persist local monitor diagnostics
36
+ if: always()
37
+ run: |
38
+ mkdir -p verification/live-ci
39
+ docker compose -f compose.live.yaml logs --no-color > verification/live-ci/compose.log
40
+ curl --fail http://127.0.0.1:9067/api/status > verification/live-ci/status.json || true
41
+ CID=$(docker compose -f compose.live.yaml ps -q monitor)
42
+ if [ -n "$CID" ]; then docker cp "$CID:/artifacts/." verification/live-ci/data || true; fi
43
+ - uses: actions/upload-artifact@v7
44
+ if: always()
45
+ with:
46
+ name: live-http-evidence
47
+ path: verification/live-ci/
48
+ retention-days: 7
49
+ - run: make live-docker-down
50
+ if: always()
@@ -0,0 +1,23 @@
1
+ .env
2
+ .env.*
3
+ !.env.example
4
+ .testwins/
5
+ artifacts/
6
+ baselines/
7
+ analysis/
8
+ .venv/
9
+ __pycache__/
10
+ .pytest_cache/
11
+ *.egg-info/
12
+
13
+ .testwins/
14
+ .testwins-live-secret/
15
+ .testwins-integration-backup/
16
+
17
+ **/.auth/
18
+ **/.testwins-auth/
19
+ **/*.storage-state.json
20
+ dist/
21
+ build/
22
+ .idea/
23
+ *.py[cod]
@@ -0,0 +1,70 @@
1
+ # Changelog
2
+
3
+ ## [Unreleased]
4
+
5
+ ## [0.4.0] - 2026-09-22
6
+
7
+ ### Docs
8
+ - Update CHANGELOG.md
9
+ - Update README.md
10
+ - Update START.md
11
+ - Update THIRD_PARTY.md
12
+ - Update docs/ARCHITECTURE.md
13
+ - Update docs/CONFIGURATION.md
14
+ - Update docs/OSS_REUSE.md
15
+ - Update docs/PLANFILE.md
16
+ - Update docs/PUBLISHING.md
17
+ - Update docs/RELEASE-0.4.md
18
+ - ... and 22 more files
19
+
20
+ ### Test
21
+ - Update tests/conftest.py
22
+ - Update tests/live/test_live_core.py
23
+ - Update tests/live/test_live_io.py
24
+ - Update tests/live/test_renderer_live.py
25
+ - Update tests/test_baseline_vision.py
26
+ - Update tests/test_collector_browser.py
27
+ - Update tests/test_compose.py
28
+ - Update tests/test_config.py
29
+ - Update tests/test_detectors.py
30
+ - Update tests/test_extensions.py
31
+ - ... and 78 more files
32
+
33
+ ### Other
34
+ - Update .dockerignore
35
+ - Update .env.example
36
+ - Update .gitignore
37
+ - Update LICENSE
38
+ - Update MANIFEST.in
39
+ - Update Makefile
40
+ - Update RELEASE-MANIFEST.json
41
+ - Update VERSION
42
+ - Update compose.live-novnc.yaml
43
+ - Update compose.live.yaml
44
+ - ... and 82 more files
45
+
46
+
47
+ ## 0.4.0 — 2026-09-22
48
+
49
+ - Consolidated source ZIP, wheel/sdist, offline build fallback and release manifest.
50
+ - Required-check plan and strict shared CLI/report/JUnit/suite gate. Single failure cannot become a pass.
51
+ - Explicit private authentication state, setup navigation, before-step evidence.
52
+ - Download event contract, safe metadata/payload policy, additional UI expectations.
53
+ - Independent bounded HTTP API runner with two-part approval for mutations.
54
+ - Optional CDP performance budgets and explicit pytest bridge.
55
+ - Packaged six-persona Clonerd profile, read-only scan/live and separated API/download/performance.
56
+ - New renderer/unit/HTTP tests; full Docker, upstream SDKs and actual Clonerd remain external validation gates.
57
+
58
+ ## Historical notes
59
+
60
+
61
+
62
+ ## 0.3.0 — 2026-09-22
63
+
64
+ Added continuous GUI monitoring, 92-class taxonomy, evidence-backed cause hypotheses,
65
+ read-only CSS provenance, resource-aware scheduler, bounded hot contexts, persistent
66
+ incidents/SSE dashboard, opt-in native region observation, local CV and budgeted
67
+ LiteLLM slow lane, immutable Planfile export, additive WUP integration, dedicated
68
+ Docker/noVNC live profiles and renderer/contract tests. Docker Playwright pin corrected
69
+ to the verified documentation pair 1.61.0. Existing batch, TestQL and terminal workflows
70
+ retained. This alpha does not claim complete GUI coverage or production validation.
testwins-0.4.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Testwins contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,25 @@
1
+ include README.md START.md LICENSE THIRD_PARTY.md Makefile requirements.txt .env.example
2
+ include CHANGELOG.md .dockerignore .gitignore example.suite.yaml compose.live.yaml compose.live-novnc.yaml
3
+ recursive-include testwins *.py *.js *.json *.yaml *.oql *.md *.html Makefile .gitignore
4
+ recursive-include tools *.py
5
+ recursive-include docker *
6
+ recursive-include docs *.md
7
+ recursive-include configs *.yaml
8
+ recursive-include scenarios *.yaml *.oql
9
+ recursive-include examples *.py *.html
10
+ recursive-include landing *.html *.css *.js *.svg *.yaml *.oql *.conf *.md Dockerfile .dockerignore
11
+ recursive-include tests *.py
12
+ recursive-include .github *.yml *.yaml
13
+ recursive-include integrations *.py *.md *.patch *.yaml *.json *.oql Makefile .gitignore
14
+ recursive-include scripts *.py
15
+ prune artifacts
16
+ prune .testwins
17
+ prune verification
18
+ include verification/STATUS.md
19
+ include verification/environment.json
20
+ include verification/summary.json
21
+ include verification/landing-result.json
22
+ prune .venv
23
+ prune build
24
+ prune dist
25
+ global-exclude __pycache__ *.py[cod] .env *.storage-state.json
@@ -0,0 +1,88 @@
1
+ PYTHON ?= python3
2
+ # Variables are passed as environment data, never interpolated into a host shell command.
3
+ export AUTH_DIR
4
+ export APP APP_IMAGE APP_INSTALL APP_COMMAND APP_PORT CONFIG MATRIX INSTANCE
5
+ export VNC_PORT REPORT_PORT APP_ALLOW_NETWORK SUT_ENV_FILE STARTUP_TIMEOUT COMPOSE_OVERRIDE
6
+ export LAB_UID LAB_GID LAB_MEMORY APP_MEMORY LAB_CPUS APP_CPUS
7
+ export PLANFILE_PROJECT PLANFILE_REF APPLY READY INCLUDE_CANDIDATES TICKET_LIMIT TICKET_OFFSET
8
+ .DEFAULT_GOAL := help
9
+ .PHONY: help demo up check audit down logs status report doctor prepare publish vnc-password install test smoke smoke-offline conformance vision
10
+ help:
11
+ @echo 'make bootstrap | test | test-browser | clonerd-init | clonerd-check | package-final'
12
+ @echo 'make live-novnc | live-docker — continuous GUI monitoring + local dashboard'
13
+ @echo 'make live-watch WATCH_CONFIG=/path PROJECT_ROOT=/repo | wup-integrate WUP_ROOT=/repo [APPLY=1]'
14
+ @echo 'make landing-check — standalone landing Docker + Testwins CDP matrix + TestQL scenarios'
15
+ @echo 'make scenario-demo | terminal-demo | desktop-demo — disposable worker'
16
+ @echo 'make install [EXTRAS=llm,cv,terminal,dev] | build-dist | release-check'
17
+ @echo 'make demo [MATRIX=cdp|engines|chromium] — build isolated seeded demo and audit it'
18
+ @echo 'make up APP=/path APP_IMAGE=node:22-bookworm-slim APP_INSTALL="npm ci" APP_COMMAND="__VITE_ADDITIONAL_SERVER_ALLOWED_HOSTS=sut npm run dev -- --host 0.0.0.0 --port 8080"'
19
+ @echo 'make check APP=/path APP_COMMAND=... — build, start and audit your own application'
20
+ @echo 'make audit | report | logs | status | vnc-password | down'
21
+ @echo 'make publish PLANFILE_PROJECT=/path [APPLY=1] [PLANFILE_REF=reviewed_commit]'
22
+ @echo 'make install | test | smoke | conformance LOGS_ROOT=/path RUN=/path'
23
+ demo up check audit down logs status report doctor prepare publish vnc-password:
24
+ $(PYTHON) tools/lab.py $@
25
+ install:
26
+ $(PYTHON) tools/manage.py install
27
+ test:
28
+ $(PYTHON) -m pytest -q -m 'not browser'
29
+ smoke:
30
+ $(PYTHON) tools/smoke.py
31
+ smoke-offline:
32
+ $(PYTHON) tools/smoke.py --offline-fixture
33
+ # RUN and LOGS_ROOT are read from the environment, not shell-expanded.
34
+ export RUN LOGS_ROOT
35
+ conformance:
36
+ $(PYTHON) tools/standards.py
37
+ vision:
38
+ $(PYTHON) tools/vision.py
39
+
40
+ # Testwins 0.2 workflow. Python CLI extras install into the active virtualenv.
41
+ export TESTQL_REF
42
+ EXTRAS ?= live,terminal,dev
43
+ export EXTRAS
44
+ .PHONY: landing-up landing-down landing-check worker-build scenario-demo terminal-demo desktop-demo install-testql-source build-dist release-check
45
+ landing-up:
46
+ $(PYTHON) tools/landing.py up
47
+ landing-check:
48
+ $(PYTHON) tools/landing.py check
49
+ landing-down:
50
+ $(PYTHON) tools/landing.py down
51
+ worker-build:
52
+ $(PYTHON) tools/manage.py worker-build
53
+ scenario-demo: worker-build
54
+ $(PYTHON) -m testwins task --file scenarios/shell.task.yaml --project .
55
+ terminal-demo: worker-build
56
+ $(PYTHON) -m testwins task --file scenarios/terminal.task.yaml --project .
57
+ desktop-demo: worker-build
58
+ $(PYTHON) -m testwins task --file scenarios/desktop.task.yaml --project .
59
+ install-testql-source:
60
+ $(PYTHON) tools/manage.py install-testql-source
61
+ build-dist:
62
+ $(PYTHON) tools/manage.py build
63
+ release-check:
64
+ $(PYTHON) -m twine check dist/*.whl dist/*.tar.gz
65
+
66
+ # Testwins 0.3 live GUI monitoring. No external model enabled by default.
67
+ export WATCH_CONFIG PROJECT_ROOT LIVE_OUTPUT WUP_ROOT
68
+ .PHONY: live-install live-watch live-once live-landing live-docker live-docker-down wup-integrate live-test
69
+ live-install live-watch live-once live-landing live-docker live-docker-down wup-integrate:
70
+ $(PYTHON) tools/live_manage.py $@
71
+ live-test:
72
+ $(PYTHON) -m pytest -q tests/live
73
+
74
+ .PHONY: live-novnc live-novnc-down
75
+ live-novnc live-novnc-down:
76
+ $(PYTHON) tools/live_manage.py $@
77
+
78
+ # Consolidated 0.4 release and Clonerd profile. Values are argv/env data, not shell code.
79
+ export WORKSPACE CLONERD_URL
80
+ .PHONY: bootstrap test-browser test-final clonerd-init clonerd-check package-final
81
+ bootstrap:
82
+ $(PYTHON) tools/release.py bootstrap
83
+ test-browser:
84
+ $(PYTHON) -m pytest -q -m browser
85
+ test-final:
86
+ $(PYTHON) tools/release.py check
87
+ clonerd-init clonerd-check package-final:
88
+ $(PYTHON) tools/release.py $@