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.
- testwins-0.4.0/.dockerignore +22 -0
- testwins-0.4.0/.env.example +69 -0
- testwins-0.4.0/.github/workflows/ci.yml +128 -0
- testwins-0.4.0/.github/workflows/live.yml +50 -0
- testwins-0.4.0/.gitignore +23 -0
- testwins-0.4.0/CHANGELOG.md +70 -0
- testwins-0.4.0/LICENSE +21 -0
- testwins-0.4.0/MANIFEST.in +25 -0
- testwins-0.4.0/Makefile +88 -0
- testwins-0.4.0/PKG-INFO +223 -0
- testwins-0.4.0/README.md +179 -0
- testwins-0.4.0/START.md +53 -0
- testwins-0.4.0/THIRD_PARTY.md +21 -0
- testwins-0.4.0/compose.live-novnc.yaml +22 -0
- testwins-0.4.0/compose.live.yaml +32 -0
- testwins-0.4.0/configs/audit.yaml +24 -0
- testwins-0.4.0/configs/demo.yaml +34 -0
- testwins-0.4.0/configs/live/desktop.watch.yaml +26 -0
- testwins-0.4.0/configs/live/docker.watch.yaml +53 -0
- testwins-0.4.0/configs/live/headed.audit.yaml +14 -0
- testwins-0.4.0/configs/live/landing.watch.yaml +49 -0
- testwins-0.4.0/configs/live/novnc.watch.yaml +56 -0
- testwins-0.4.0/docker/Dockerfile +42 -0
- testwins-0.4.0/docker/entrypoint.sh +23 -0
- testwins-0.4.0/docker/live-novnc-entrypoint.sh +14 -0
- testwins-0.4.0/docker/live.Dockerfile +16 -0
- testwins-0.4.0/docker/publisher.Dockerfile +11 -0
- testwins-0.4.0/docker/worker-entrypoint.sh +9 -0
- testwins-0.4.0/docker/worker.Dockerfile +19 -0
- testwins-0.4.0/docs/ARCHITECTURE.md +43 -0
- testwins-0.4.0/docs/CONFIGURATION.md +196 -0
- testwins-0.4.0/docs/OSS_REUSE.md +68 -0
- testwins-0.4.0/docs/PLANFILE.md +50 -0
- testwins-0.4.0/docs/PUBLISHING.md +40 -0
- testwins-0.4.0/docs/RELEASE-0.4.md +204 -0
- testwins-0.4.0/docs/RULES.md +33 -0
- testwins-0.4.0/docs/SECURITY.md +80 -0
- testwins-0.4.0/docs/SOURCE_REVIEW.md +22 -0
- testwins-0.4.0/docs/STANDARDS.md +40 -0
- testwins-0.4.0/docs/TASKS.md +107 -0
- testwins-0.4.0/docs/TROUBLESHOOTING.md +45 -0
- testwins-0.4.0/docs/VISION.md +71 -0
- testwins-0.4.0/docs/live/ARCHITECTURE.md +124 -0
- testwins-0.4.0/docs/live/GUI_TAXONOMY.md +162 -0
- testwins-0.4.0/docs/live/OPERATIONS.md +238 -0
- testwins-0.4.0/docs/live/RESEARCH.md +40 -0
- testwins-0.4.0/docs/migration/ANALIZA-0.3.md +141 -0
- testwins-0.4.0/example.suite.yaml +11 -0
- testwins-0.4.0/examples/buggy-app/app.py +10 -0
- testwins-0.4.0/examples/buggy-app/index.html +11 -0
- testwins-0.4.0/examples/terminal/prompt.py +2 -0
- testwins-0.4.0/integrations/clonerd/.gitignore +6 -0
- testwins-0.4.0/integrations/clonerd/Makefile +29 -0
- testwins-0.4.0/integrations/clonerd/README.md +81 -0
- testwins-0.4.0/integrations/clonerd/api/mutations.review.yaml +15 -0
- testwins-0.4.0/integrations/clonerd/api/readonly.yaml +14 -0
- testwins-0.4.0/integrations/clonerd/audit/large.yaml +60 -0
- testwins-0.4.0/integrations/clonerd/audit/mobile.yaml +54 -0
- testwins-0.4.0/integrations/clonerd/audit/performance.yaml +44 -0
- testwins-0.4.0/integrations/clonerd/inventory.json +91 -0
- testwins-0.4.0/integrations/clonerd/journeys/developer.desktop.yaml +68 -0
- testwins-0.4.0/integrations/clonerd/journeys/download.review.yaml +55 -0
- testwins-0.4.0/integrations/clonerd/journeys/personas.large.yaml +182 -0
- testwins-0.4.0/integrations/clonerd/journeys/personas.mobile.yaml +176 -0
- testwins-0.4.0/integrations/clonerd/personas.suite.yaml +12 -0
- testwins-0.4.0/integrations/clonerd/scope.json +25 -0
- testwins-0.4.0/integrations/clonerd/testwins.watch.yaml +80 -0
- testwins-0.4.0/integrations/clonerd/tools/manage.py +110 -0
- testwins-0.4.0/integrations/wup/README.md +26 -0
- testwins-0.4.0/integrations/wup/START.md +18 -0
- testwins-0.4.0/integrations/wup/install.py +64 -0
- testwins-0.4.0/integrations/wup/overlay/wup/gui_testwins.py +67 -0
- testwins-0.4.0/integrations/wup/wup-testwins.patch +86 -0
- testwins-0.4.0/landing/.dockerignore +4 -0
- testwins-0.4.0/landing/Dockerfile +6 -0
- testwins-0.4.0/landing/README.md +58 -0
- testwins-0.4.0/landing/compose.yaml +10 -0
- testwins-0.4.0/landing/nginx.conf +14 -0
- testwins-0.4.0/landing/static/app.js +36 -0
- testwins-0.4.0/landing/static/docs/index.html +6 -0
- testwins-0.4.0/landing/static/favicon.svg +1 -0
- testwins-0.4.0/landing/static/index.html +45 -0
- testwins-0.4.0/landing/static/privacy/index.html +1 -0
- testwins-0.4.0/landing/static/style.css +8 -0
- testwins-0.4.0/landing/tests/audit.yaml +45 -0
- testwins-0.4.0/landing/tests/landing.oql +12 -0
- testwins-0.4.0/landing/tests/scenario.yaml +7 -0
- testwins-0.4.0/pyproject.toml +69 -0
- testwins-0.4.0/requirements.txt +6 -0
- testwins-0.4.0/scenarios/desktop.task.yaml +11 -0
- testwins-0.4.0/scenarios/shell.oql +4 -0
- testwins-0.4.0/scenarios/shell.task.yaml +6 -0
- testwins-0.4.0/scenarios/terminal.task.yaml +11 -0
- testwins-0.4.0/scripts/make_live_inventory.py +13 -0
- testwins-0.4.0/setup.cfg +4 -0
- testwins-0.4.0/tests/conftest.py +4 -0
- testwins-0.4.0/tests/live/test_live_core.py +294 -0
- testwins-0.4.0/tests/live/test_live_io.py +108 -0
- testwins-0.4.0/tests/live/test_renderer_live.py +52 -0
- testwins-0.4.0/tests/test_baseline_vision.py +26 -0
- testwins-0.4.0/tests/test_collector_browser.py +23 -0
- testwins-0.4.0/tests/test_compose.py +29 -0
- testwins-0.4.0/tests/test_config.py +32 -0
- testwins-0.4.0/tests/test_detectors.py +39 -0
- testwins-0.4.0/tests/test_extensions.py +239 -0
- testwins-0.4.0/tests/test_fail_closed.py +22 -0
- testwins-0.4.0/tests/test_integrity.py +45 -0
- testwins-0.4.0/tests/test_proposals.py +77 -0
- testwins-0.4.0/tests/test_release_browser.py +127 -0
- testwins-0.4.0/tests/test_release_contracts.py +276 -0
- testwins-0.4.0/tests/test_reporting.py +21 -0
- testwins-0.4.0/tests/test_staging.py +23 -0
- testwins-0.4.0/testwins/__init__.py +2 -0
- testwins-0.4.0/testwins/__main__.py +2 -0
- testwins-0.4.0/testwins/api_contracts.py +145 -0
- testwins-0.4.0/testwins/baseline.py +57 -0
- testwins-0.4.0/testwins/browser.py +87 -0
- testwins-0.4.0/testwins/cli.py +149 -0
- testwins-0.4.0/testwins/collector.js +154 -0
- testwins-0.4.0/testwins/config.py +174 -0
- testwins-0.4.0/testwins/contracts.py +69 -0
- testwins-0.4.0/testwins/cv.py +138 -0
- testwins-0.4.0/testwins/detectors.py +133 -0
- testwins-0.4.0/testwins/downloads.py +46 -0
- testwins-0.4.0/testwins/drafting.py +49 -0
- testwins-0.4.0/testwins/events.py +68 -0
- testwins-0.4.0/testwins/gate.py +48 -0
- testwins-0.4.0/testwins/input.py +55 -0
- testwins-0.4.0/testwins/integrations/__init__.py +1 -0
- testwins-0.4.0/testwins/integrations/desktop.py +62 -0
- testwins-0.4.0/testwins/integrations/terminal.py +52 -0
- testwins-0.4.0/testwins/integrations/testql.py +71 -0
- testwins-0.4.0/testwins/live/__init__.py +1 -0
- testwins-0.4.0/testwins/live/augmentation.py +88 -0
- testwins-0.4.0/testwins/live/catalog.json +1271 -0
- testwins-0.4.0/testwins/live/cli.py +95 -0
- testwins-0.4.0/testwins/live/config.py +206 -0
- testwins-0.4.0/testwins/live/dashboard.html +21 -0
- testwins-0.4.0/testwins/live/diagnosis.py +99 -0
- testwins-0.4.0/testwins/live/export.py +53 -0
- testwins-0.4.0/testwins/live/native.py +74 -0
- testwins-0.4.0/testwins/live/observer.js +11 -0
- testwins-0.4.0/testwins/live/policy.py +63 -0
- testwins-0.4.0/testwins/live/provenance.py +42 -0
- testwins-0.4.0/testwins/live/runtime.py +197 -0
- testwins-0.4.0/testwins/live/scanner.py +181 -0
- testwins-0.4.0/testwins/live/server.py +68 -0
- testwins-0.4.0/testwins/live/store.py +146 -0
- testwins-0.4.0/testwins/llm.py +213 -0
- testwins-0.4.0/testwins/model.py +27 -0
- testwins-0.4.0/testwins/performance.py +20 -0
- testwins-0.4.0/testwins/proposals.py +99 -0
- testwins-0.4.0/testwins/pytest_plugin.py +38 -0
- testwins-0.4.0/testwins/reporting.py +186 -0
- testwins-0.4.0/testwins/resources/clonerd/.gitignore +6 -0
- testwins-0.4.0/testwins/resources/clonerd/Makefile +29 -0
- testwins-0.4.0/testwins/resources/clonerd/README.md +81 -0
- testwins-0.4.0/testwins/resources/clonerd/api/mutations.review.yaml +15 -0
- testwins-0.4.0/testwins/resources/clonerd/api/readonly.yaml +14 -0
- testwins-0.4.0/testwins/resources/clonerd/audit/large.yaml +60 -0
- testwins-0.4.0/testwins/resources/clonerd/audit/mobile.yaml +54 -0
- testwins-0.4.0/testwins/resources/clonerd/audit/performance.yaml +44 -0
- testwins-0.4.0/testwins/resources/clonerd/inventory.json +91 -0
- testwins-0.4.0/testwins/resources/clonerd/journeys/developer.desktop.yaml +68 -0
- testwins-0.4.0/testwins/resources/clonerd/journeys/download.review.yaml +55 -0
- testwins-0.4.0/testwins/resources/clonerd/journeys/personas.large.yaml +182 -0
- testwins-0.4.0/testwins/resources/clonerd/journeys/personas.mobile.yaml +176 -0
- testwins-0.4.0/testwins/resources/clonerd/personas.suite.yaml +12 -0
- testwins-0.4.0/testwins/resources/clonerd/scope.json +25 -0
- testwins-0.4.0/testwins/resources/clonerd/testwins.watch.yaml +80 -0
- testwins-0.4.0/testwins/resources/clonerd/tools/manage.py +110 -0
- testwins-0.4.0/testwins/resources/minimal/README.md +13 -0
- testwins-0.4.0/testwins/resources/minimal/audit.yaml +17 -0
- testwins-0.4.0/testwins/resources/minimal/shell.oql +4 -0
- testwins-0.4.0/testwins/runner.py +361 -0
- testwins-0.4.0/testwins/sessions.py +59 -0
- testwins-0.4.0/testwins/staging.py +39 -0
- testwins-0.4.0/testwins/suite.py +48 -0
- testwins-0.4.0/testwins/task_reporting.py +23 -0
- testwins-0.4.0/testwins/task_worker.py +35 -0
- testwins-0.4.0/testwins/tasks.py +134 -0
- testwins-0.4.0/testwins/util.py +81 -0
- testwins-0.4.0/testwins/verification.py +23 -0
- testwins-0.4.0/testwins.egg-info/PKG-INFO +223 -0
- testwins-0.4.0/testwins.egg-info/SOURCES.txt +205 -0
- testwins-0.4.0/testwins.egg-info/dependency_links.txt +1 -0
- testwins-0.4.0/testwins.egg-info/entry_points.txt +2 -0
- testwins-0.4.0/testwins.egg-info/requires.txt +40 -0
- testwins-0.4.0/testwins.egg-info/top_level.txt +1 -0
- testwins-0.4.0/tools/benchmark_live_scheduler.py +50 -0
- testwins-0.4.0/tools/lab.py +231 -0
- testwins-0.4.0/tools/landing.py +42 -0
- testwins-0.4.0/tools/live_manage.py +34 -0
- testwins-0.4.0/tools/manage.py +38 -0
- testwins-0.4.0/tools/release.py +94 -0
- testwins-0.4.0/tools/report_server.py +28 -0
- testwins-0.4.0/tools/smoke.py +82 -0
- testwins-0.4.0/tools/stage.py +39 -0
- testwins-0.4.0/tools/standards.py +52 -0
- testwins-0.4.0/tools/verify_landing.py +50 -0
- testwins-0.4.0/tools/verify_live_renderer.py +71 -0
- testwins-0.4.0/tools/verify_testql.py +17 -0
- testwins-0.4.0/tools/vision.py +17 -0
- testwins-0.4.0/verification/STATUS.md +92 -0
- testwins-0.4.0/verification/environment.json +39 -0
- testwins-0.4.0/verification/landing-result.json +49 -0
- 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
|
testwins-0.4.0/Makefile
ADDED
|
@@ -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 $@
|