qaas-python 0.1.0__tar.gz → 0.1.1__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.
- {qaas_python-0.1.0 → qaas_python-0.1.1}/.gitignore +6 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/PKG-INFO +2 -33
- {qaas_python-0.1.0 → qaas_python-0.1.1}/README.md +1 -32
- {qaas_python-0.1.0 → qaas_python-0.1.1}/pyproject.toml +1 -1
- qaas_python-0.1.0/target-app/cross-tenant-order-detail-leak.png +0 -0
- qaas_python-0.1.0/target-app/new-order-validation-wipes-form.png +0 -0
- qaas_python-0.1.0/target-app/order-placed-banner-but-draft-status.png +0 -0
- qaas_python-0.1.0/target-app/place-order-noop-single-item.png +0 -0
- qaas_python-0.1.0/target-app/signout-secondary-button-contrast.png +0 -0
- qaas_python-0.1.0/target-app/web/dist/assets/index-Cdavr0Eg.css +0 -1
- qaas_python-0.1.0/target-app/web/dist/assets/index-zpKS18v-.js +0 -67
- qaas_python-0.1.0/target-app/web/dist/index.html +0 -13
- {qaas_python-0.1.0 → qaas_python-0.1.1}/ARCHITECTURE.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/BUILD_PLAN.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/CLAUDE.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/LICENSE +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/config/targets/corvid.yaml +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/adapters/__init__.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/adapters/tracker.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/adapters/vcs.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/cli.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/conductor.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/config.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/defaults/config/agents/arbiter.yaml +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/defaults/config/agents/cartographer.yaml +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/defaults/config/agents/clerk.yaml +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/defaults/config/agents/conduit.yaml +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/defaults/config/agents/forge.yaml +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/defaults/config/agents/mender.yaml +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/defaults/config/agents/proof.yaml +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/defaults/config/agents/surface.yaml +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/defaults/config/system.yaml +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/discover.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/envelope.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/guardrails.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/mcp/__init__.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/mcp/context.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/mcp/contract_diff.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/mcp/defect_memory.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/mcp/env_control.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/mcp/envelope_server.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/mcp/test_runner.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/mcp/tracker.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/mcp/vcs.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/paths.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/.claude-plugin/plugin.json +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/a11y-audit/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/adversarial-review/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/api-surface-extraction/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/authz-matrix-check/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/console-error-triage/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/contract-test-generation/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/dedupe-strategy/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/environment-pinning/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/error-taxonomy/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/exploratory-ui-walk/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/failing-test-authoring/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/flake-detection/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/form-state-probe/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/minimal-diff-discipline/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/openapi-diff/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/ownership-resolution/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/product-task-graph/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/regression-risk-scoring/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/regression-suite-selection/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/repo-cartography/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/repro-minimisation/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/rollback-plan-authoring/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/root-cause-vs-symptom/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/routing-rules/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/severity-rubric/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/test-first-fix/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/test-quality-audit/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/ticket-writer/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/verdict-reporting/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/plugin/skills/verification-protocol/SKILL.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/prompts/ARBITER.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/prompts/CARTOGRAPHER.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/prompts/CLERK.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/prompts/CONDUIT.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/prompts/FORGE.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/prompts/MENDER.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/prompts/PROOF.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/prompts/SURFACE.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/prompts/_shared.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/registry.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/runner.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/scorecard.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/sdk_compat.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/store.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/target.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/tasks.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/src/qaas/trace.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/CODEOWNERS +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/Dockerfile +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/app/__init__.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/app/auth.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/app/config.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/app/db.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/app/errors.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/app/main.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/app/models.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/app/routes/__init__.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/app/routes/auth.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/app/routes/invoices.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/app/routes/orders.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/app/routes/stream.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/app/schemas.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/migrations/001_init.sql +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/pyproject.toml +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/api/seed/fixtures.sql +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/defects.yaml +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/docker-compose.yml +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/openapi.yaml +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/.gitignore +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/Dockerfile +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/index.html +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/package-lock.json +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/package.json +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/src/api.ts +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/src/components/Button.tsx +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/src/components/Layout.tsx +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/src/components/SearchInput.tsx +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/src/main.tsx +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/src/routes/CheckoutReview.tsx +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/src/routes/Login.tsx +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/src/routes/NewOrder.tsx +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/src/routes/OrderDetail.tsx +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/src/routes/OrdersList.tsx +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/src/styles.css +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/tsconfig.json +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/target-app/web/vite.config.ts +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/adapters/test_github_vcs.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/adapters/test_jira_tracker.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/conftest.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/mcp/conftest.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/mcp/test_contract_diff.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/mcp/test_defect_memory.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/mcp/test_env_control.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/mcp/test_test_runner.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/mcp/test_tracker.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/mcp/test_vcs.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/support.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/target_app/test_seeded_defects.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/test_cli.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/test_conductor.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/test_config.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/test_discover.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/test_envelope.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/test_guardrails.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/test_hooks_and_skills.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/test_paths.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/test_prompt_overrides.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/test_registry.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/test_scorecard.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/test_skills_actually_load.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/test_store.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/test_target_profile_is_honoured.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/test_trace.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tests/test_user_mcp_servers.py +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tutorial/01-code-structure.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tutorial/02-how-agents-communicate.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tutorial/03-skills-and-hooks.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tutorial/04-mcp-servers.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tutorial/05-prompt-configuration.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tutorial/06-jira-integration.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tutorial/07-github-actions.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tutorial/08-packaging-and-publishing.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tutorial/09-guardrails-and-safety.md +0 -0
- {qaas_python-0.1.0 → qaas_python-0.1.1}/tutorial/README.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: qaas-python
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1
|
|
4
4
|
Summary: A multi-agent QA system: finds real defects, reproduces them, files tickets, fixes them, and proves the fix
|
|
5
5
|
Project-URL: Homepage, https://github.com/allaabdella2-us/qa-multi-agent-system
|
|
6
6
|
Project-URL: Repository, https://github.com/allaabdella2-us/qa-multi-agent-system
|
|
@@ -43,7 +43,7 @@ Description-Content-Type: text/markdown
|
|
|
43
43
|
[](#-contributing)
|
|
44
44
|
[](https://docs.claude.com/en/api/agent-sdk/overview)
|
|
45
45
|
|
|
46
|
-
[Quickstart](#-quickstart-in-60-seconds) · [
|
|
46
|
+
[Quickstart](#-quickstart-in-60-seconds) · [Your repo](#-point-it-at-your-repository) · [Jira](#-file-into-jira) · [Architecture](ARCHITECTURE.md)
|
|
47
47
|
|
|
48
48
|
</div>
|
|
49
49
|
|
|
@@ -111,37 +111,6 @@ qaas run --repo https://github.com/you/your-app --dry-run
|
|
|
111
111
|
|
|
112
112
|
---
|
|
113
113
|
|
|
114
|
-
## 💰 What it costs
|
|
115
|
-
|
|
116
|
-
> [!IMPORTANT]
|
|
117
|
-
> **Real runs spend real money.** Read this before your first one.
|
|
118
|
-
|
|
119
|
-
Median cost per dispatch, **measured** across real runs — not estimated:
|
|
120
|
-
|
|
121
|
-
| agent | median | what you get |
|
|
122
|
-
|---|--:|---|
|
|
123
|
-
| 🖱️ `SURFACE` | **$3.34** | broken flows, console errors, a11y, forms |
|
|
124
|
-
| 🔧 `MENDER` | **$2.03** | the minimal fix, on a branch |
|
|
125
|
-
| 🔌 `CONDUIT` | **$1.97** | API contract, authz and error-shape defects |
|
|
126
|
-
| 🔨 `FORGE` | **$1.61** | a minimal repro + failing test — **per finding** |
|
|
127
|
-
| ✅ `PROOF` / ⚖️ `ARBITER` | ~$1.00 | verification and adversarial review |
|
|
128
|
-
| 📝 `CLERK` / 🗺️ `CARTOGRAPHER` | ~$0.70 | filing, and the map everything reads |
|
|
129
|
-
|
|
130
|
-
A full discovery run over the demo app found **13 of 16** seeded defects for
|
|
131
|
-
about **$15**. A `fix-cycle` pass costs **$5–7**.
|
|
132
|
-
|
|
133
|
-
> `FORGE` runs **once per finding** in a fresh context, so cost scales with what
|
|
134
|
-
> was found, not with how many agents exist.
|
|
135
|
-
|
|
136
|
-
**The controls are real, not advisory:**
|
|
137
|
-
|
|
138
|
-
- `max_budget_usd` per agent *and* per run mode; the governor checks before every dispatch and **stops the run** rather than overspending.
|
|
139
|
-
- The cap survives a resume — `qaas run --run-id <existing>` carries forward what that run already spent.
|
|
140
|
-
- `qaas validate` refuses a run mode whose agents could outspend its cap.
|
|
141
|
-
- `--dry-run` on everything.
|
|
142
|
-
|
|
143
|
-
---
|
|
144
|
-
|
|
145
114
|
## 🎯 Point it at your repository
|
|
146
115
|
|
|
147
116
|
```bash
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
[](#-contributing)
|
|
14
14
|
[](https://docs.claude.com/en/api/agent-sdk/overview)
|
|
15
15
|
|
|
16
|
-
[Quickstart](#-quickstart-in-60-seconds) · [
|
|
16
|
+
[Quickstart](#-quickstart-in-60-seconds) · [Your repo](#-point-it-at-your-repository) · [Jira](#-file-into-jira) · [Architecture](ARCHITECTURE.md)
|
|
17
17
|
|
|
18
18
|
</div>
|
|
19
19
|
|
|
@@ -81,37 +81,6 @@ qaas run --repo https://github.com/you/your-app --dry-run
|
|
|
81
81
|
|
|
82
82
|
---
|
|
83
83
|
|
|
84
|
-
## 💰 What it costs
|
|
85
|
-
|
|
86
|
-
> [!IMPORTANT]
|
|
87
|
-
> **Real runs spend real money.** Read this before your first one.
|
|
88
|
-
|
|
89
|
-
Median cost per dispatch, **measured** across real runs — not estimated:
|
|
90
|
-
|
|
91
|
-
| agent | median | what you get |
|
|
92
|
-
|---|--:|---|
|
|
93
|
-
| 🖱️ `SURFACE` | **$3.34** | broken flows, console errors, a11y, forms |
|
|
94
|
-
| 🔧 `MENDER` | **$2.03** | the minimal fix, on a branch |
|
|
95
|
-
| 🔌 `CONDUIT` | **$1.97** | API contract, authz and error-shape defects |
|
|
96
|
-
| 🔨 `FORGE` | **$1.61** | a minimal repro + failing test — **per finding** |
|
|
97
|
-
| ✅ `PROOF` / ⚖️ `ARBITER` | ~$1.00 | verification and adversarial review |
|
|
98
|
-
| 📝 `CLERK` / 🗺️ `CARTOGRAPHER` | ~$0.70 | filing, and the map everything reads |
|
|
99
|
-
|
|
100
|
-
A full discovery run over the demo app found **13 of 16** seeded defects for
|
|
101
|
-
about **$15**. A `fix-cycle` pass costs **$5–7**.
|
|
102
|
-
|
|
103
|
-
> `FORGE` runs **once per finding** in a fresh context, so cost scales with what
|
|
104
|
-
> was found, not with how many agents exist.
|
|
105
|
-
|
|
106
|
-
**The controls are real, not advisory:**
|
|
107
|
-
|
|
108
|
-
- `max_budget_usd` per agent *and* per run mode; the governor checks before every dispatch and **stops the run** rather than overspending.
|
|
109
|
-
- The cap survives a resume — `qaas run --run-id <existing>` carries forward what that run already spent.
|
|
110
|
-
- `qaas validate` refuses a run mode whose agents could outspend its cap.
|
|
111
|
-
- `--dry-run` on everything.
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
84
|
## 🎯 Point it at your repository
|
|
116
85
|
|
|
117
86
|
```bash
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# Distribution name is `qaas-python` (`qaas` was taken); the import package and
|
|
3
3
|
# the CLI are both `qaas`.
|
|
4
4
|
name = "qaas-python"
|
|
5
|
-
version = "0.1.
|
|
5
|
+
version = "0.1.1"
|
|
6
6
|
description = "A multi-agent QA system: finds real defects, reproduces them, files tickets, fixes them, and proves the fix"
|
|
7
7
|
readme = "README.md"
|
|
8
8
|
license = "MIT"
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root{--ink: #202124;--ink-muted: #5f6368;--surface: #ffffff;--canvas: #f8f9fa;--line: #dadce0;--accent: #1a56b0;--accent-dark: #14428a;--danger: #b3261e;--radius: 6px;--font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif}*{box-sizing:border-box}html,body{margin:0;padding:0}body{background:var(--canvas);color:var(--ink);font-family:var(--font);font-size:15px;line-height:1.5}#root{min-height:100vh}h1,h2{margin:0;font-weight:600}.app-shell{min-height:100vh;display:flex;flex-direction:column}.app-header{background:var(--surface);border-bottom:1px solid var(--line)}.app-header-inner{max-width:1040px;margin:0 auto;padding:12px 20px;display:flex;align-items:center;gap:24px}.app-brand{font-weight:700;font-size:16px;color:var(--ink)}.app-nav{display:flex;gap:16px;flex:1}.nav-link{color:var(--accent);text-decoration:none;padding:4px 2px;border-bottom:2px solid transparent}.nav-link:hover{text-decoration:underline}.nav-link-active{color:var(--ink);border-bottom-color:var(--accent)}.app-account{display:flex;align-items:center;gap:12px}.app-account-email{color:var(--ink-muted);font-size:13px}.app-account-role{margin-left:8px;padding:1px 6px;border:1px solid var(--line);border-radius:10px;text-transform:uppercase;font-size:11px;letter-spacing:.04em}.app-main{flex:1;width:100%;max-width:1040px;margin:0 auto;padding:24px 20px 48px}.page{display:flex;flex-direction:column;gap:16px}.page-header{display:flex;align-items:center;gap:12px}.page-title{font-size:22px}.section-title{font-size:15px;margin-top:8px}.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:20px;display:flex;flex-direction:column;gap:16px}.muted{color:var(--ink-muted)}.link{color:#15c}.empty-state{align-items:flex-start;gap:8px}.toolbar{display:flex;align-items:flex-end;gap:16px;flex-wrap:wrap}.field{display:flex;flex-direction:column;gap:4px}.field-inline{min-width:180px}.field-grow{flex:1;min-width:180px}.field-narrow{width:110px}.field-label{font-size:13px;font-weight:600;color:var(--ink)}.field-input,.search-input{font:inherit;color:var(--ink);background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:8px 10px;width:100%}.search-input{min-width:260px}.field-input:focus-visible,.search-input:focus-visible,.btn:focus-visible,.table-row-clickable:focus-visible,.nav-link:focus-visible,.link:focus-visible{outline:2px solid var(--accent);outline-offset:2px}::placeholder{color:var(--ink-muted);opacity:1}.item-row{display:flex;align-items:flex-end;gap:12px;flex-wrap:wrap;padding-bottom:12px;border-bottom:1px solid var(--line)}.form-actions{display:flex;gap:12px;align-items:center}.btn{font:inherit;font-weight:600;border-radius:var(--radius);border:1px solid transparent;padding:8px 16px;cursor:pointer;text-decoration:none;display:inline-block}.btn:disabled{cursor:not-allowed;opacity:.6}.btn-primary{background:var(--accent);color:#fff;border-color:var(--accent)}.btn-primary:hover:not(:disabled){background:var(--accent-dark);border-color:var(--accent-dark)}.btn-secondary{background:#f1f3f4;color:#9aa0a6;border-color:var(--line)}.btn-secondary:hover:not(:disabled){background:#e8eaed}.btn-danger{background:var(--danger);color:#fff;border-color:var(--danger)}.table{width:100%;border-collapse:collapse;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius)}.table th,.table td{text-align:left;padding:10px 12px;border-bottom:1px solid var(--line)}.table th{background:var(--canvas);font-size:13px;letter-spacing:.02em}.table tbody tr:last-child td{border-bottom:none}.table-row-clickable{cursor:pointer}.table-row-clickable:hover{background:#f1f6ff}.badge{display:inline-block;padding:2px 8px;border-radius:10px;font-size:12px;font-weight:600;text-transform:capitalize;color:var(--ink);background:#f1f3f4}.badge-draft{background:#eceff1}.badge-placed{background:#e8f0fe}.badge-paid{background:#e6f4ea}.badge-refunded{background:#fef7e0}.badge-cancelled{background:#fce8e6}.alert{margin:0;padding:10px 12px;border-radius:var(--radius);font-size:14px}.alert-error{background:#fce8e6;color:var(--danger);border:1px solid #f3c9c5}.alert-success{background:#e6f4ea;color:#0b6b34;border:1px solid #b7e0c4}.summary{margin:0;display:flex;flex-direction:column;gap:8px}.summary-row{display:flex;gap:12px}.summary-row dt{width:120px;color:var(--ink-muted);font-size:13px}.summary-row dd{margin:0}.total-line{margin:0;text-align:right;font-size:15px}.login-page{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px}.login-card{width:100%;max-width:380px}.login-title{font-size:20px}.login-subtitle{margin:0;color:var(--ink-muted);font-size:14px}
|