argus-testing 0.3.0__tar.gz → 0.5.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.
- argus_testing-0.5.0/.github/workflows/ci.yml +35 -0
- argus_testing-0.5.0/.github/workflows/release.yml +124 -0
- {argus_testing-0.3.0 → argus_testing-0.5.0}/.gitignore +5 -0
- argus_testing-0.5.0/AGENTS.md +192 -0
- argus_testing-0.5.0/CHANGELOG.md +32 -0
- argus_testing-0.5.0/Dockerfile +9 -0
- argus_testing-0.5.0/PKG-INFO +298 -0
- argus_testing-0.5.0/README.md +263 -0
- argus_testing-0.5.0/argus/__init__.py +33 -0
- argus_testing-0.5.0/argus/bench/__init__.py +0 -0
- argus_testing-0.5.0/argus/bench/__main__.py +241 -0
- argus_testing-0.5.0/argus/bench/agent_runner.py +256 -0
- argus_testing-0.5.0/argus/bench/runner.py +317 -0
- argus_testing-0.5.0/argus/bench/scenarios_buggytasks.py +629 -0
- argus_testing-0.5.0/argus/bench/scenarios_darkshop.py +407 -0
- argus_testing-0.5.0/argus/browser.py +2152 -0
- argus_testing-0.5.0/argus/cli.py +288 -0
- argus_testing-0.5.0/argus/detector.py +159 -0
- argus_testing-0.5.0/argus/differ.py +103 -0
- {argus_testing-0.3.0 → argus_testing-0.5.0}/argus/explorer.py +34 -33
- argus_testing-0.5.0/argus/mcp_server.py +5288 -0
- argus_testing-0.5.0/argus/models.py +197 -0
- argus_testing-0.5.0/argus/reporter.py +569 -0
- argus_testing-0.5.0/argus/resolver.py +700 -0
- argus_testing-0.5.0/argus/screen/__init__.py +0 -0
- argus_testing-0.5.0/argus/screen/backend.py +963 -0
- argus_testing-0.5.0/argus/screen/permissions.py +222 -0
- argus_testing-0.5.0/argus/screen/safety.py +199 -0
- argus_testing-0.5.0/argus/screen/validate.py +197 -0
- argus_testing-0.5.0/bench-results/buggytasks.json +188 -0
- argus_testing-0.5.0/bench-results/buggytasks.md +30 -0
- argus_testing-0.5.0/bench-results/darkshop.json +108 -0
- argus_testing-0.5.0/bench-results/darkshop.md +20 -0
- argus_testing-0.5.0/bench-results/matrix.json +305 -0
- argus_testing-0.5.0/bench-results/matrix.md +54 -0
- argus_testing-0.5.0/bench-results/screen_validation.json +139 -0
- argus_testing-0.5.0/human-eye-fixture/app.py +561 -0
- {argus_testing-0.3.0 → argus_testing-0.5.0}/pyproject.toml +24 -1
- argus_testing-0.5.0/server.json +23 -0
- {argus_testing-0.3.0 → argus_testing-0.5.0}/test-site/app.py +68 -0
- argus_testing-0.5.0/tests/__init__.py +0 -0
- argus_testing-0.5.0/tests/conftest.py +89 -0
- argus_testing-0.5.0/tests/test_action_targeting.py +117 -0
- argus_testing-0.5.0/tests/test_bench_report.py +78 -0
- argus_testing-0.5.0/tests/test_browser_shadow.py +130 -0
- argus_testing-0.5.0/tests/test_cross_stack.py +109 -0
- argus_testing-0.5.0/tests/test_detector_console.py +58 -0
- argus_testing-0.5.0/tests/test_detector_network.py +45 -0
- argus_testing-0.5.0/tests/test_expectation_oracle.py +124 -0
- argus_testing-0.5.0/tests/test_final_hardening.py +487 -0
- argus_testing-0.5.0/tests/test_journal_regression.py +102 -0
- argus_testing-0.5.0/tests/test_mcp_contract.py +85 -0
- argus_testing-0.5.0/tests/test_regression_cli.py +64 -0
- argus_testing-0.5.0/tests/test_release_metadata.py +23 -0
- argus_testing-0.5.0/tests/test_replay_minimize.py +107 -0
- argus_testing-0.5.0/tests/test_replay_receipt.py +124 -0
- argus_testing-0.5.0/tests/test_replay_trace.py +69 -0
- argus_testing-0.5.0/tests/test_reporter_badge.py +135 -0
- argus_testing-0.5.0/tests/test_reproduction_receipt.py +1075 -0
- argus_testing-0.5.0/tests/test_resolver.py +571 -0
- argus_testing-0.5.0/tests/test_screen_permissions.py +71 -0
- argus_testing-0.5.0/tests/test_screen_safety.py +123 -0
- argus_testing-0.5.0/tests/test_session_lifecycle.py +132 -0
- argus_testing-0.5.0/tests/test_state_capsules.py +107 -0
- argus_testing-0.5.0/tests/test_substrate.py +82 -0
- argus_testing-0.5.0/tests/test_visual_inspection.py +45 -0
- argus_testing-0.3.0/CLAUDE.md +0 -73
- argus_testing-0.3.0/PKG-INFO +0 -136
- argus_testing-0.3.0/README.md +0 -110
- argus_testing-0.3.0/argus/__init__.py +0 -3
- argus_testing-0.3.0/argus/browser.py +0 -434
- argus_testing-0.3.0/argus/cli.py +0 -58
- argus_testing-0.3.0/argus/detector.py +0 -563
- argus_testing-0.3.0/argus/mcp_server.py +0 -719
- argus_testing-0.3.0/argus/models.py +0 -125
- argus_testing-0.3.0/argus/reporter.py +0 -192
- argus_testing-0.3.0/docs/ROADMAP.md +0 -52
- argus_testing-0.3.0/docs/STATUS.md +0 -54
- argus_testing-0.3.0/docs/TODO.md +0 -14
- {argus_testing-0.3.0 → argus_testing-0.5.0}/LICENSE +0 -0
- {argus_testing-0.3.0 → argus_testing-0.5.0}/argus/config.py +0 -0
- {argus_testing-0.3.0 → argus_testing-0.5.0}/argus/planner.py +0 -0
- {argus_testing-0.3.0 → argus_testing-0.5.0}/examples/focus.yaml +0 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
concurrency:
|
|
13
|
+
group: ci-${{ github.ref }}
|
|
14
|
+
cancel-in-progress: true
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
test:
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
strategy:
|
|
20
|
+
fail-fast: false
|
|
21
|
+
matrix:
|
|
22
|
+
python-version: ["3.10", "3.12"]
|
|
23
|
+
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v7
|
|
26
|
+
- uses: actions/setup-python@v6
|
|
27
|
+
with:
|
|
28
|
+
python-version: ${{ matrix.python-version }}
|
|
29
|
+
cache: pip
|
|
30
|
+
- name: Install package
|
|
31
|
+
run: python -m pip install --upgrade pip && python -m pip install -e '.[dev]'
|
|
32
|
+
- name: Install Chromium
|
|
33
|
+
run: python -m playwright install --with-deps chromium
|
|
34
|
+
- name: Run tests
|
|
35
|
+
run: python -m pytest
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v7
|
|
16
|
+
with:
|
|
17
|
+
ref: ${{ github.event.release.tag_name }}
|
|
18
|
+
- uses: actions/setup-python@v6
|
|
19
|
+
with:
|
|
20
|
+
python-version: "3.12"
|
|
21
|
+
cache: pip
|
|
22
|
+
- name: Install build and test dependencies
|
|
23
|
+
run: python -m pip install --upgrade pip && python -m pip install build twine -e '.[dev]'
|
|
24
|
+
- name: Install Chromium
|
|
25
|
+
run: python -m playwright install --with-deps chromium
|
|
26
|
+
- name: Verify release metadata
|
|
27
|
+
env:
|
|
28
|
+
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
|
29
|
+
run: |
|
|
30
|
+
python - <<'PY'
|
|
31
|
+
import json
|
|
32
|
+
import os
|
|
33
|
+
import tomllib
|
|
34
|
+
from pathlib import Path
|
|
35
|
+
|
|
36
|
+
version = tomllib.loads(Path("pyproject.toml").read_text())["project"]["version"]
|
|
37
|
+
server = json.loads(Path("server.json").read_text())
|
|
38
|
+
assert os.environ["RELEASE_TAG"] == f"v{version}"
|
|
39
|
+
assert server["version"] == version
|
|
40
|
+
assert server["packages"][0]["version"] == version
|
|
41
|
+
PY
|
|
42
|
+
- name: Run tests
|
|
43
|
+
run: python -m pytest
|
|
44
|
+
- name: Build distributions
|
|
45
|
+
run: python -m build
|
|
46
|
+
- name: Check distributions
|
|
47
|
+
run: python -m twine check dist/*
|
|
48
|
+
- name: Smoke-test wheel
|
|
49
|
+
run: |
|
|
50
|
+
python -m venv /tmp/argus-wheel
|
|
51
|
+
/tmp/argus-wheel/bin/python -m pip install --upgrade pip
|
|
52
|
+
/tmp/argus-wheel/bin/python -m pip install dist/*.whl
|
|
53
|
+
/tmp/argus-wheel/bin/argus-testing --version
|
|
54
|
+
/tmp/argus-wheel/bin/argus-testing --list-tools
|
|
55
|
+
- uses: actions/upload-artifact@v7
|
|
56
|
+
with:
|
|
57
|
+
name: python-package-distributions
|
|
58
|
+
path: dist/
|
|
59
|
+
if-no-files-found: error
|
|
60
|
+
|
|
61
|
+
github-assets:
|
|
62
|
+
needs: build
|
|
63
|
+
runs-on: ubuntu-latest
|
|
64
|
+
permissions:
|
|
65
|
+
contents: write
|
|
66
|
+
|
|
67
|
+
steps:
|
|
68
|
+
- uses: actions/download-artifact@v8
|
|
69
|
+
with:
|
|
70
|
+
name: python-package-distributions
|
|
71
|
+
path: dist
|
|
72
|
+
- name: Attach distributions to the GitHub release
|
|
73
|
+
env:
|
|
74
|
+
GH_TOKEN: ${{ github.token }}
|
|
75
|
+
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
|
76
|
+
run: gh release upload "$RELEASE_TAG" dist/* --repo "$GITHUB_REPOSITORY" --clobber
|
|
77
|
+
|
|
78
|
+
pypi:
|
|
79
|
+
needs: build
|
|
80
|
+
runs-on: ubuntu-latest
|
|
81
|
+
environment:
|
|
82
|
+
name: pypi
|
|
83
|
+
url: https://pypi.org/project/argus-testing/
|
|
84
|
+
permissions:
|
|
85
|
+
id-token: write
|
|
86
|
+
|
|
87
|
+
steps:
|
|
88
|
+
- uses: actions/download-artifact@v8
|
|
89
|
+
with:
|
|
90
|
+
name: python-package-distributions
|
|
91
|
+
path: dist
|
|
92
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
93
|
+
|
|
94
|
+
mcp-registry:
|
|
95
|
+
needs: pypi
|
|
96
|
+
runs-on: ubuntu-latest
|
|
97
|
+
permissions:
|
|
98
|
+
contents: read
|
|
99
|
+
id-token: write
|
|
100
|
+
|
|
101
|
+
steps:
|
|
102
|
+
- uses: actions/checkout@v7
|
|
103
|
+
with:
|
|
104
|
+
ref: ${{ github.event.release.tag_name }}
|
|
105
|
+
- name: Wait for PyPI indexing
|
|
106
|
+
env:
|
|
107
|
+
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
|
108
|
+
run: |
|
|
109
|
+
VERSION="${RELEASE_TAG#v}"
|
|
110
|
+
for attempt in {1..20}; do
|
|
111
|
+
if curl --fail --silent "https://pypi.org/pypi/argus-testing/$VERSION/json" >/dev/null; then
|
|
112
|
+
exit 0
|
|
113
|
+
fi
|
|
114
|
+
echo "Waiting for PyPI to index $VERSION ($attempt/20)"
|
|
115
|
+
sleep 15
|
|
116
|
+
done
|
|
117
|
+
exit 1
|
|
118
|
+
- name: Install MCP publisher
|
|
119
|
+
run: |
|
|
120
|
+
curl --fail --location "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
|
|
121
|
+
- name: Publish MCP metadata
|
|
122
|
+
run: |
|
|
123
|
+
./mcp-publisher login github-oidc
|
|
124
|
+
./mcp-publisher publish
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# Argus — Agent Guide
|
|
2
|
+
|
|
3
|
+
This file is the short version of the README, aimed at an agent using
|
|
4
|
+
Argus through MCP. Argus is a QA capability inside the host's current
|
|
5
|
+
task; it does not replace the host agent's identity or authority.
|
|
6
|
+
|
|
7
|
+
## Setup
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Web mode (works everywhere)
|
|
11
|
+
pip install argus-testing
|
|
12
|
+
playwright install chromium
|
|
13
|
+
|
|
14
|
+
# Screen mode (macOS only — to test native apps + browser chrome)
|
|
15
|
+
pip install 'argus-testing[mac]'
|
|
16
|
+
brew install cliclick
|
|
17
|
+
|
|
18
|
+
# Wire it into the MCP host
|
|
19
|
+
claude mcp add argus -- argus-mcp
|
|
20
|
+
argus-mcp --version # confirm host loaded the version you expect
|
|
21
|
+
argus-mcp --list-tools # show the selected profile and public tools
|
|
22
|
+
argus-mcp --doctor # macOS Screen Recording + Accessibility check
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The default profile is `core`. Use `--tool-profile screen` for native
|
|
26
|
+
macOS review and `--tool-profile full` only when the broader network,
|
|
27
|
+
storage, tabs, crawl, and coordinate surface is needed. The
|
|
28
|
+
`ARGUS_TOOL_PROFILE` environment variable provides the same setting.
|
|
29
|
+
|
|
30
|
+
After `pip install -U argus-testing`, restart your MCP host so it picks
|
|
31
|
+
up the new tool table.
|
|
32
|
+
|
|
33
|
+
## Using Argus within the host task
|
|
34
|
+
|
|
35
|
+
Use an evidence-first QA mindset while reviewing, but continue to follow
|
|
36
|
+
the user's broader task. The short version:
|
|
37
|
+
|
|
38
|
+
- **GOAL**: Find bugs the dev team would be embarrassed to ship. Tight
|
|
39
|
+
five-bug reports beat noisy fifty-bug ones.
|
|
40
|
+
- **BOUNDARY**: Do not infer permission for purchases, publication, or
|
|
41
|
+
other irreversible external effects. Argus does not prevent in-scope
|
|
42
|
+
diagnosis or implementation work the user requested.
|
|
43
|
+
- **THE RITUAL** (return to it on every tool call):
|
|
44
|
+
Map → **Use it** (walk each goal end-to-end, carrying real state) →
|
|
45
|
+
Hypothesize → Act → Observe → Verify → Record → Cover.
|
|
46
|
+
|
|
47
|
+
## Tools you'll use most
|
|
48
|
+
|
|
49
|
+
### Web mode
|
|
50
|
+
|
|
51
|
+
| Tool | Purpose |
|
|
52
|
+
|------|---------|
|
|
53
|
+
| `start_session(url, review_mode=...)` | Launch Playwright in `exploratory`, `visual`, or `regression` mode and return the initial observation. |
|
|
54
|
+
| `observe()` | URL + interactive elements (description-keyed) + visible feedback + counts + ARIA + viewport state. Read this first, after every action. |
|
|
55
|
+
| `click_what(description)` | Click the element matching `description`. Returns the top candidates if ambiguous — rephrase rather than guess. |
|
|
56
|
+
| `type_into(description, text)` / `select_into(description, value)` | Inputs and dropdowns by description. |
|
|
57
|
+
| `test_action(target, expect=...)` | Click + before/after diff in one call. Pass `expect` to PREDICT the outcome ({"count":{"label":"tasks","delta":1}}, {"gains":"Buy milk"}, {"removes":...}, {"text_present":...}, {"toast":...}, {"url_changed":true}) and Argus reports MATCH / SURPRISE — a surprise is a bug lead. Also shows CROSS-STACK: which requests the click fired (methods/statuses) and a CHECK nudge when a message appeared without a matching write. |
|
|
58
|
+
| `verify_persistence(expect, target_text, after_url)` | Forces a fresh GET; reports whether `target_text` is `present` / `absent`. The "Saved!" toast is not proof — this is. |
|
|
59
|
+
| `capsule_save(name, liveness_marker)` / `capsule_restore(name)` | Snapshot the logged-in/seeded state (cookies+storage) after minting it through the UI, then restore it later (with a mandatory live/stale re-check). Restore is a CLEAN replace, so save→branch A→restore→branch B runs two journeys from a byte-identical state for differential testing. |
|
|
60
|
+
| `regression_check()` | Re-test the findings journaled in prior runs against the CURRENT build: STILL-PRESENT / NO-LONGER-REPRODUCES / INCONCLUSIVE. "Did my fix land, did anything come back?" |
|
|
61
|
+
| `inspect_element(description)` | Computed styles + ARIA + outerHTML + truncation flag for interactive or visible non-interactive content. |
|
|
62
|
+
| `check_layout()` | Bounded viewport signals for horizontal overflow, clipped text, small targets, and fixed/sticky overlays. |
|
|
63
|
+
| `screenshot(name, element="", full_page=False)` | Full viewport, full page, or a tight crop; waits for finite CSS transitions, then returns the image plus its absolute evidence path. |
|
|
64
|
+
| `screenshot_diff(before, after)` | Pillow diff with red-tint overlay; returns the image plus its absolute evidence path. |
|
|
65
|
+
| `eval_js(code)` | Arbitrary JS in the page context. Off by default (`argus-mcp --unsafe` to enable). |
|
|
66
|
+
| `record_bug(title, severity, evidence, verify=...)` | Call this once you've **confirmed** a real bug. Verify text with (`expect`, `target_text`, `at_url`), or an HTTP failure with (`expect_status`, `at_url`); `absent` checks need the URL where the item should be. For a MULTI-STEP text bug add `"replay": true` to re-drive the recorded journey from a cold start. Severity: `critical / high / medium / low / info`. |
|
|
67
|
+
| `record_observation(title, evidence, category)` | Preserve qualitative visual, usability, content, responsive, or accessibility evidence without inflating it into a bug. |
|
|
68
|
+
| `get_errors()` | Drain captured console + network events. Events retain the page where they occurred; matching console/network symptoms attach to an existing root cause, while new causes are tagged "auto-captured / not independently verified". |
|
|
69
|
+
| `check_links()` / `check_performance()` | Probe-style helpers — return raw data, no auto-bug. |
|
|
70
|
+
| `crawl_site()` | Page discovery: crawls internal links, auto-capturing only console/network events (tagged). Walk the surfaced pages and record_bug what you confirm. |
|
|
71
|
+
| `end_session()` | Close session; write HTML, JSON, JUnit, and SARIF reports with separate tool-call and recorded-step counts. |
|
|
72
|
+
|
|
73
|
+
### Screen mode (macOS)
|
|
74
|
+
|
|
75
|
+
| Tool | Purpose |
|
|
76
|
+
|------|---------|
|
|
77
|
+
| `start_screen_session(target_app="")` | Bind to the foreground app or a named running app. Refuses cleanly if Screen Recording / Accessibility grants are missing. |
|
|
78
|
+
| `screen_observe()` | App + window title + AX-tree elements with screen coordinates + screenshot. |
|
|
79
|
+
| `screen_click_what(description)` | AX `kAXPressAction` first; falls back to coordinate click via `cliclick`. |
|
|
80
|
+
| `screen_type_into(description, text)` | AX `kAXValue` set first; falls back to focus + cliclick keystrokes. |
|
|
81
|
+
| `screen_press_key(key)` | `cliclick kp:<key>` for `return`, `esc`, `cmd-s`, etc. |
|
|
82
|
+
| `screen_session_status()` | Elapsed / cap / abort-file state / last 30 trail entries. |
|
|
83
|
+
|
|
84
|
+
### Recommended flow
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
start_session(url)
|
|
88
|
+
# initial result already MAPS the page
|
|
89
|
+
# USE IT — pick a real goal, walk it
|
|
90
|
+
# end-to-end, carrying state across pages
|
|
91
|
+
# HYPOTHESIZE — what could go wrong
|
|
92
|
+
click_what(...) / type_into(...) / # ACT — one probe per call
|
|
93
|
+
test_form({...})
|
|
94
|
+
observe() # OBSERVE — what changed?
|
|
95
|
+
verify_persistence(...) # VERIFY (delete / save / submit / toggle)
|
|
96
|
+
record_bug(..., verify={...}) # RECORD — verify clause attaches a receipt
|
|
97
|
+
... repeat ...
|
|
98
|
+
end_session() # writes the HTML report
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Reports preserve original screenshot evidence and normally reference
|
|
102
|
+
compact WebP previews under `report-assets/`. Set
|
|
103
|
+
`ARGUS_PORTABLE_REPORT=1` only when a single base64-embedded HTML file is
|
|
104
|
+
needed. Machine-readable JSON also contains complete reproduction receipts,
|
|
105
|
+
review mode, observations, tool-call counts, step counts, and screenshot metadata.
|
|
106
|
+
|
|
107
|
+
## When `record_bug` is appropriate
|
|
108
|
+
|
|
109
|
+
The bug bar:
|
|
110
|
+
|
|
111
|
+
- **Reproducible** — someone following your steps will see it too.
|
|
112
|
+
- **User-affecting** — data loss, security, blocked flow, real
|
|
113
|
+
confusion, or trust damage.
|
|
114
|
+
- **Persistent** — not a one-off page-load race unless you can
|
|
115
|
+
re-trigger.
|
|
116
|
+
|
|
117
|
+
Don't record speculation, polish nits, or static a11y / SEO that
|
|
118
|
+
`axe-core` / Lighthouse already cover.
|
|
119
|
+
|
|
120
|
+
## Things humans notice that machines miss — your hunting ground
|
|
121
|
+
|
|
122
|
+
- The success toast is a lie — the action didn't actually persist.
|
|
123
|
+
- Same datum displayed differently across pages (cart-count badge vs
|
|
124
|
+
cart contents; profile name in form vs nav greeting).
|
|
125
|
+
- Empty states aren't designed (says "Loading..." forever, or blank).
|
|
126
|
+
- Long values silently truncated with no indicator.
|
|
127
|
+
- Validation messages in engineer-speak (`Field 'foo' invalid`).
|
|
128
|
+
- A workflow has no back / cancel / recover path.
|
|
129
|
+
- Visual hierarchy inverted — the destructive button is the prominent
|
|
130
|
+
one; the primary CTA is dim.
|
|
131
|
+
- Dark patterns: fake urgency, hidden costs, hard-to-cancel,
|
|
132
|
+
pre-checked consent.
|
|
133
|
+
- After auth, navigation/UI doesn't reflect logged-in state.
|
|
134
|
+
- Form errors clear the user's input.
|
|
135
|
+
- Inputs accept what should be rejected (auth bypass, validation
|
|
136
|
+
bypassed server-side, accepted out-of-range numbers, accepted
|
|
137
|
+
whitespace where content is required).
|
|
138
|
+
|
|
139
|
+
## Severity calibration
|
|
140
|
+
|
|
141
|
+
- **HIGH** data loss, security, payment, blocked primary flow.
|
|
142
|
+
- **MEDIUM** workflow friction, confusing UX, deceptive feedback,
|
|
143
|
+
cross-page inconsistency.
|
|
144
|
+
- **LOW** polish, copy, suggestion-grade.
|
|
145
|
+
|
|
146
|
+
## Diagnostics
|
|
147
|
+
|
|
148
|
+
- `argus-mcp --version` — what version your MCP host actually loaded.
|
|
149
|
+
- `argus-mcp --doctor` — macOS permission probes for screen mode.
|
|
150
|
+
- `argus-mcp --list-tools` — selected tool profile and exported names.
|
|
151
|
+
- `argus-mcp --tool-profile core|screen|full` — control discovery size.
|
|
152
|
+
- `argus-mcp --unsafe` — turn on `eval_js` (off by default).
|
|
153
|
+
- `python -m argus.bench --target all` — reproduce the 34 / 34 matrix.
|
|
154
|
+
- `python -m argus.screen.validate <app names...>` — read-only AX walk
|
|
155
|
+
over running apps, JSON output.
|
|
156
|
+
|
|
157
|
+
## Safety (screen mode)
|
|
158
|
+
|
|
159
|
+
- Per-call timeout: 15 s default
|
|
160
|
+
(`ARGUS_SCREEN_PER_CALL_TIMEOUT_S` to override).
|
|
161
|
+
- Session cap: 30 min default
|
|
162
|
+
(`ARGUS_SCREEN_SESSION_MAX_SECONDS`).
|
|
163
|
+
- Panic button: `touch ~/.argus/abort` blocks every subsequent screen
|
|
164
|
+
action in the current session
|
|
165
|
+
(`ARGUS_SCREEN_ABORT_FILE` to relocate).
|
|
166
|
+
- Every `screen_click_what` / `screen_type_into` writes a
|
|
167
|
+
before-and-after screenshot pair to the action trail.
|
|
168
|
+
|
|
169
|
+
## What changed in 0.5 (if you knew 0.4)
|
|
170
|
+
|
|
171
|
+
- `get_page_state` → `observe` (no integer indices).
|
|
172
|
+
- `click(index)` / `type_text(index, text)` / `select_option(index, value)`
|
|
173
|
+
removed → `click_what(desc)` / `type_into(desc, text)` /
|
|
174
|
+
`select_into(desc, value)`.
|
|
175
|
+
- `verify_action(action_type, target_text, ...)` →
|
|
176
|
+
`verify_persistence(expect, target_text, after_url)` —
|
|
177
|
+
semantic argument (`present`/`absent`) instead of action-typed
|
|
178
|
+
(`delete`/`edit`/`toggle`).
|
|
179
|
+
- `test_action(element_index, ...)` →
|
|
180
|
+
`test_action(target, expectation)` — description-keyed.
|
|
181
|
+
- `test_form(form_fields, expected_result, ...)` →
|
|
182
|
+
`test_form(form_fields, submit)` — no auto-judgement; the agent
|
|
183
|
+
reads the result and decides.
|
|
184
|
+
- `test_crud(...)` removed — compose it from observe / click_what /
|
|
185
|
+
test_form / verify_persistence yourself.
|
|
186
|
+
- `record_bug(title, severity, evidence)` is new and required.
|
|
187
|
+
Argus does not auto-promote outcomes to Bug objects; the agent
|
|
188
|
+
decides what's a bug and records it explicitly.
|
|
189
|
+
- Detector layer stripped to event capture only (console + network).
|
|
190
|
+
Everything else — content quality, count consistency, visual
|
|
191
|
+
hierarchy, validation behaviour — is the agent's call from
|
|
192
|
+
`observe()`.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.5.0 - 2026-07-14
|
|
4
|
+
|
|
5
|
+
Argus 0.5 replaces the index-keyed MCP interface with a smaller,
|
|
6
|
+
description-keyed workflow and makes evidence preservation part of the
|
|
7
|
+
public contract.
|
|
8
|
+
|
|
9
|
+
- Add focused `core`, `screen`, and `full` MCP tool profiles.
|
|
10
|
+
- Replace integer-index actions with `observe`, `click_what`, `type_into`,
|
|
11
|
+
`select_into`, and description-keyed inspection tools.
|
|
12
|
+
- Add independently verified reproduction receipts for text and HTTP-status
|
|
13
|
+
findings, including cold replay for multi-step journeys.
|
|
14
|
+
- Preserve complete evidence in JSON, HTML, JUnit, and SARIF reports while
|
|
15
|
+
keeping HTML screenshot previews compact.
|
|
16
|
+
- Correlate console and network symptoms without duplicating root causes.
|
|
17
|
+
- Add native macOS screen-mode permission checks, action limits, abort control,
|
|
18
|
+
and before/after evidence capture.
|
|
19
|
+
- Improve visual inspection with element crops, screenshot diffs, bounded
|
|
20
|
+
layout checks, and finite CSS-transition waits.
|
|
21
|
+
- Add packaging, CI, PyPI Trusted Publishing, and official MCP Registry
|
|
22
|
+
metadata for repeatable releases.
|
|
23
|
+
|
|
24
|
+
### Breaking changes from 0.4
|
|
25
|
+
|
|
26
|
+
- `get_page_state` is now `observe`.
|
|
27
|
+
- `click`, `type_text`, and `select_option` are replaced by description-keyed
|
|
28
|
+
actions.
|
|
29
|
+
- `verify_action` is now `verify_persistence`.
|
|
30
|
+
- `test_crud` is removed; compose journeys from the focused tools instead.
|
|
31
|
+
- Findings must be explicitly recorded with `record_bug` or
|
|
32
|
+
`record_observation`.
|