agent-regress-cli 0.1.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 (97) hide show
  1. agent_regress_cli-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +30 -0
  2. agent_regress_cli-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +17 -0
  3. agent_regress_cli-0.1.0/.github/dependabot.yml +16 -0
  4. agent_regress_cli-0.1.0/.github/pull_request_template.md +22 -0
  5. agent_regress_cli-0.1.0/.github/workflows/benchmark.yml +33 -0
  6. agent_regress_cli-0.1.0/.github/workflows/ci.yml +116 -0
  7. agent_regress_cli-0.1.0/.github/workflows/release.yml +39 -0
  8. agent_regress_cli-0.1.0/.github/workflows/scorecard.yml +29 -0
  9. agent_regress_cli-0.1.0/.gitignore +39 -0
  10. agent_regress_cli-0.1.0/.pre-commit-config.yaml +20 -0
  11. agent_regress_cli-0.1.0/CHANGELOG.md +60 -0
  12. agent_regress_cli-0.1.0/CLAUDE.md +71 -0
  13. agent_regress_cli-0.1.0/CONTRIBUTING.md +56 -0
  14. agent_regress_cli-0.1.0/LICENSE +178 -0
  15. agent_regress_cli-0.1.0/PKG-INFO +405 -0
  16. agent_regress_cli-0.1.0/README.md +361 -0
  17. agent_regress_cli-0.1.0/SECURITY.md +40 -0
  18. agent_regress_cli-0.1.0/benchmarks/README.md +104 -0
  19. agent_regress_cli-0.1.0/benchmarks/results/baseline.json +2187 -0
  20. agent_regress_cli-0.1.0/benchmarks/test_gaia.py +57 -0
  21. agent_regress_cli-0.1.0/benchmarks/test_stat_overhead.py +69 -0
  22. agent_regress_cli-0.1.0/benchmarks/test_swebench.py +40 -0
  23. agent_regress_cli-0.1.0/benchmarks/test_tau_bench.py +52 -0
  24. agent_regress_cli-0.1.0/docker-compose.yml +25 -0
  25. agent_regress_cli-0.1.0/docs/arxiv-preprint-draft.md +287 -0
  26. agent_regress_cli-0.1.0/docs/benchmarks.md +20 -0
  27. agent_regress_cli-0.1.0/docs/concepts.md +50 -0
  28. agent_regress_cli-0.1.0/docs/cross-version-comparison.md +137 -0
  29. agent_regress_cli-0.1.0/docs/getting-started.md +185 -0
  30. agent_regress_cli-0.1.0/docs/good-first-issues.md +216 -0
  31. agent_regress_cli-0.1.0/docs/integrations/crewai.md +113 -0
  32. agent_regress_cli-0.1.0/docs/integrations/langchain.md +30 -0
  33. agent_regress_cli-0.1.0/docs/integrations/langgraph.md +324 -0
  34. agent_regress_cli-0.1.0/docs/integrations/openai-agents.md +138 -0
  35. agent_regress_cli-0.1.0/docs/lessons.md +53 -0
  36. agent_regress_cli-0.1.0/docs/statistical-methods.md +183 -0
  37. agent_regress_cli-0.1.0/examples/01-basic-comparison/example.py +44 -0
  38. agent_regress_cli-0.1.0/examples/02-ci-regression-gate/test_regression.py +41 -0
  39. agent_regress_cli-0.1.0/examples/03-tau-bench-harness/example.py +33 -0
  40. agent_regress_cli-0.1.0/examples/04-model-upgrade-audit/example.py +43 -0
  41. agent_regress_cli-0.1.0/leaderboard/README.md +31 -0
  42. agent_regress_cli-0.1.0/leaderboard/results/.gitkeep +0 -0
  43. agent_regress_cli-0.1.0/leaderboard/results/mock-baseline-agent-2026-06-19.json +25 -0
  44. agent_regress_cli-0.1.0/leaderboard/schema.json +41 -0
  45. agent_regress_cli-0.1.0/pyproject.toml +118 -0
  46. agent_regress_cli-0.1.0/src/agent_regress/__init__.py +63 -0
  47. agent_regress_cli-0.1.0/src/agent_regress/benchmarks/__init__.py +15 -0
  48. agent_regress_cli-0.1.0/src/agent_regress/benchmarks/gaia.py +80 -0
  49. agent_regress_cli-0.1.0/src/agent_regress/benchmarks/swebench.py +65 -0
  50. agent_regress_cli-0.1.0/src/agent_regress/benchmarks/tau_bench.py +86 -0
  51. agent_regress_cli-0.1.0/src/agent_regress/ci/__init__.py +5 -0
  52. agent_regress_cli-0.1.0/src/agent_regress/ci/gate.py +62 -0
  53. agent_regress_cli-0.1.0/src/agent_regress/cli.py +298 -0
  54. agent_regress_cli-0.1.0/src/agent_regress/core/__init__.py +17 -0
  55. agent_regress_cli-0.1.0/src/agent_regress/core/compare.py +239 -0
  56. agent_regress_cli-0.1.0/src/agent_regress/core/report.py +81 -0
  57. agent_regress_cli-0.1.0/src/agent_regress/core/runner.py +487 -0
  58. agent_regress_cli-0.1.0/src/agent_regress/core/scorer.py +254 -0
  59. agent_regress_cli-0.1.0/src/agent_regress/core/state_diff.py +48 -0
  60. agent_regress_cli-0.1.0/src/agent_regress/integrations/__init__.py +1 -0
  61. agent_regress_cli-0.1.0/src/agent_regress/integrations/crewai.py +121 -0
  62. agent_regress_cli-0.1.0/src/agent_regress/integrations/langchain.py +39 -0
  63. agent_regress_cli-0.1.0/src/agent_regress/integrations/langgraph.py +453 -0
  64. agent_regress_cli-0.1.0/src/agent_regress/integrations/openai_agents.py +471 -0
  65. agent_regress_cli-0.1.0/src/agent_regress/py.typed +0 -0
  66. agent_regress_cli-0.1.0/src/agent_regress/stats/__init__.py +14 -0
  67. agent_regress_cli-0.1.0/src/agent_regress/stats/bootstrap.py +59 -0
  68. agent_regress_cli-0.1.0/src/agent_regress/stats/effect_size.py +87 -0
  69. agent_regress_cli-0.1.0/src/agent_regress/stats/mann_whitney.py +69 -0
  70. agent_regress_cli-0.1.0/tests/__init__.py +0 -0
  71. agent_regress_cli-0.1.0/tests/conftest.py +51 -0
  72. agent_regress_cli-0.1.0/tests/integration/__init__.py +0 -0
  73. agent_regress_cli-0.1.0/tests/integration/test_crewai.py +70 -0
  74. agent_regress_cli-0.1.0/tests/integration/test_langgraph.py +35 -0
  75. agent_regress_cli-0.1.0/tests/integration/test_openai_agents.py +598 -0
  76. agent_regress_cli-0.1.0/tests/unit/__init__.py +0 -0
  77. agent_regress_cli-0.1.0/tests/unit/benchmarks/__init__.py +0 -0
  78. agent_regress_cli-0.1.0/tests/unit/benchmarks/test_harnesses.py +233 -0
  79. agent_regress_cli-0.1.0/tests/unit/ci/__init__.py +0 -0
  80. agent_regress_cli-0.1.0/tests/unit/ci/test_gate.py +135 -0
  81. agent_regress_cli-0.1.0/tests/unit/core/__init__.py +0 -0
  82. agent_regress_cli-0.1.0/tests/unit/core/test_compare.py +337 -0
  83. agent_regress_cli-0.1.0/tests/unit/core/test_report.py +101 -0
  84. agent_regress_cli-0.1.0/tests/unit/core/test_runner.py +622 -0
  85. agent_regress_cli-0.1.0/tests/unit/core/test_scorer.py +369 -0
  86. agent_regress_cli-0.1.0/tests/unit/core/test_state_diff.py +68 -0
  87. agent_regress_cli-0.1.0/tests/unit/integrations/__init__.py +0 -0
  88. agent_regress_cli-0.1.0/tests/unit/integrations/test_crewai_unit.py +165 -0
  89. agent_regress_cli-0.1.0/tests/unit/integrations/test_langgraph_unit.py +807 -0
  90. agent_regress_cli-0.1.0/tests/unit/stats/__init__.py +0 -0
  91. agent_regress_cli-0.1.0/tests/unit/stats/test_bootstrap.py +71 -0
  92. agent_regress_cli-0.1.0/tests/unit/stats/test_effect_size.py +114 -0
  93. agent_regress_cli-0.1.0/tests/unit/stats/test_mann_whitney.py +79 -0
  94. agent_regress_cli-0.1.0/tests/unit/stats/test_stat_timing.py +36 -0
  95. agent_regress_cli-0.1.0/tests/unit/test_cli.py +344 -0
  96. agent_regress_cli-0.1.0/uv.lock +5635 -0
  97. agent_regress_cli-0.1.0/web/serve.py +147 -0
@@ -0,0 +1,30 @@
1
+ name: Bug Report
2
+ description: File a bug report
3
+ title: "[Bug]: "
4
+ labels: ["bug", "needs-triage"]
5
+ body:
6
+ - type: textarea
7
+ id: what-happened
8
+ attributes:
9
+ label: What happened?
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: to-reproduce
14
+ attributes:
15
+ label: Minimal reproduction
16
+ render: python
17
+ validations:
18
+ required: true
19
+ - type: input
20
+ id: version
21
+ attributes:
22
+ label: agent-regress version
23
+ validations:
24
+ required: true
25
+ - type: input
26
+ id: python
27
+ attributes:
28
+ label: Python version
29
+ validations:
30
+ required: true
@@ -0,0 +1,17 @@
1
+ name: Feature Request
2
+ description: Request a new feature
3
+ title: "[Feature]: "
4
+ labels: ["enhancement"]
5
+ body:
6
+ - type: textarea
7
+ id: problem
8
+ attributes:
9
+ label: What problem does this solve?
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: solution
14
+ attributes:
15
+ label: Proposed solution
16
+ validations:
17
+ required: true
@@ -0,0 +1,16 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: pip
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ day: monday
8
+ groups:
9
+ patch-updates:
10
+ update-types:
11
+ - patch
12
+
13
+ - package-ecosystem: github-actions
14
+ directory: /
15
+ schedule:
16
+ interval: monthly
@@ -0,0 +1,22 @@
1
+ ## Description
2
+
3
+ What does this PR do? (one sentence)
4
+
5
+ ## Type of change
6
+
7
+ - [ ] Bug fix
8
+ - [ ] New feature
9
+ - [ ] Performance improvement
10
+ - [ ] Documentation update
11
+
12
+ ## Checklist
13
+
14
+ - [ ] Tests pass locally
15
+ - [ ] Added tests for new behavior
16
+ - [ ] CHANGELOG entry added for user-facing changes
17
+ - [ ] Benchmark output included below if performance-sensitive code changed
18
+ - [ ] AI-assisted code has been reviewed and validated line by line
19
+
20
+ ## Benchmark output (if applicable)
21
+
22
+ paste output here
@@ -0,0 +1,33 @@
1
+ name: Benchmark
2
+
3
+ on:
4
+ push:
5
+ branches: ["main"]
6
+
7
+ jobs:
8
+ benchmark:
9
+ name: Statistical overhead
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v7
13
+ - uses: astral-sh/setup-uv@v7
14
+ with:
15
+ enable-cache: true
16
+ - run: uv sync --extra dev
17
+ - name: Run benchmarks
18
+ run: |
19
+ uv run pytest benchmarks/test_stat_overhead.py \
20
+ --benchmark-json=output.json \
21
+ --benchmark-only \
22
+ -v
23
+ - uses: benchmark-action/github-action-benchmark@4de1bed97a47d2e7a675c37e04bcf5f29cb28bdb # v1.20.4
24
+ with:
25
+ tool: pytest
26
+ output-file-path: output.json
27
+ github-token: ${{ secrets.GITHUB_TOKEN }}
28
+ auto-push: true
29
+ alert-threshold: "120%"
30
+ comment-on-alert: true
31
+ fail-on-alert: true
32
+ gh-pages-branch: gh-pages
33
+ benchmark-data-dir-path: dev/bench
@@ -0,0 +1,116 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: ["main", "dev"]
6
+ pull_request:
7
+ branches: ["main"]
8
+
9
+ concurrency:
10
+ group: ${{ github.workflow }}-${{ github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ jobs:
14
+ quality:
15
+ name: Quality (Python ${{ matrix.python-version }})
16
+ runs-on: ubuntu-latest
17
+ permissions:
18
+ contents: read
19
+ security-events: write
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
24
+ steps:
25
+ - uses: actions/checkout@v7
26
+
27
+ - uses: astral-sh/setup-uv@v7
28
+ with:
29
+ python-version: ${{ matrix.python-version }}
30
+ enable-cache: true
31
+
32
+ - name: Install dependencies
33
+ run: uv sync --extra dev
34
+
35
+ - name: Lint
36
+ run: uv run ruff check src/ tests/ benchmarks/
37
+
38
+ - name: Format check
39
+ run: uv run ruff format --check src/ tests/ benchmarks/
40
+
41
+ - name: Type check
42
+ run: uv run mypy src/ --strict
43
+
44
+ - name: Unit tests with coverage
45
+ run: |
46
+ uv run pytest tests/unit/ \
47
+ --cov=src/ \
48
+ --cov-report=xml \
49
+ --cov-report=term-missing \
50
+ --cov-fail-under=80 \
51
+ -v
52
+
53
+ - name: Stats module coverage gate (95%)
54
+ run: |
55
+ uv run pytest tests/unit/stats/ \
56
+ --cov=src/agent_regress/stats/ \
57
+ --cov-fail-under=95 \
58
+ -q
59
+
60
+ - name: Security scan
61
+ uses: aquasecurity/trivy-action@v0.36.0
62
+ with:
63
+ scan-type: fs
64
+ format: sarif
65
+ output: trivy-results.sarif
66
+ severity: HIGH,CRITICAL
67
+ exit-code: "1"
68
+ ignore-unfixed: true
69
+
70
+ - name: Upload Trivy SARIF
71
+ uses: github/codeql-action/upload-sarif@v4
72
+ if: always()
73
+ with:
74
+ sarif_file: trivy-results.sarif
75
+
76
+ leaderboard-schema:
77
+ name: Validate leaderboard schema
78
+ runs-on: ubuntu-latest
79
+ steps:
80
+ - uses: actions/checkout@v7
81
+ - uses: astral-sh/setup-uv@v7
82
+ - run: uv sync --extra dev
83
+ - name: Validate submissions
84
+ run: |
85
+ python -c "
86
+ import json, jsonschema, pathlib, sys
87
+ schema_path = pathlib.Path('leaderboard/schema.json')
88
+ if not schema_path.exists():
89
+ sys.exit(0)
90
+ schema = json.loads(schema_path.read_text())
91
+ results_dir = pathlib.Path('leaderboard/results')
92
+ json_files = [f for f in results_dir.glob('*.json') if f.name != '.gitkeep']
93
+ if not json_files:
94
+ print('No leaderboard results to validate')
95
+ sys.exit(0)
96
+ for f in json_files:
97
+ jsonschema.validate(json.loads(f.read_text()), schema)
98
+ print(f'OK: {f.name}')
99
+ "
100
+
101
+ codeql:
102
+ name: CodeQL Security Analysis
103
+ runs-on: ubuntu-latest
104
+ permissions:
105
+ actions: read
106
+ contents: read
107
+ security-events: write
108
+ steps:
109
+ - uses: actions/checkout@v7
110
+ - uses: github/codeql-action/init@v4
111
+ with:
112
+ languages: python
113
+ - uses: github/codeql-action/autobuild@v4
114
+ - uses: github/codeql-action/analyze@v4
115
+ with:
116
+ category: "/language:python"
@@ -0,0 +1,39 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ release:
10
+ name: Build and publish
11
+ runs-on: ubuntu-latest
12
+ permissions:
13
+ id-token: write
14
+ contents: write
15
+ steps:
16
+ - uses: actions/checkout@v7
17
+ - uses: astral-sh/setup-uv@v7
18
+ - name: Build
19
+ run: uv build
20
+ - name: Publish to PyPI
21
+ run: uv publish
22
+ env:
23
+ UV_PUBLISH_TOKEN: ${{ secrets.PYPI_TOKEN }}
24
+ - name: Generate SBOM
25
+ run: |
26
+ pip install cyclonedx-bom
27
+ uv export --no-dev --format requirements-txt -o /tmp/prod-requirements.txt
28
+ cyclonedx-py requirements --output-format json -o sbom.json /tmp/prod-requirements.txt
29
+ - name: Sign with Sigstore
30
+ uses: sigstore/gh-action-sigstore-python@f514d46b907ebcd5bedc05145c03b69c1edd8b46 # v3.0.0
31
+ with:
32
+ inputs: dist/*.whl dist/*.tar.gz
33
+ - name: Create GitHub Release
34
+ uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3.0.1
35
+ with:
36
+ files: |
37
+ sbom.json
38
+ dist/*.whl
39
+ dist/*.tar.gz
@@ -0,0 +1,29 @@
1
+ name: OpenSSF Scorecard
2
+
3
+ on:
4
+ push:
5
+ branches: ["main"]
6
+ schedule:
7
+ - cron: "30 1 * * 6"
8
+
9
+ jobs:
10
+ analysis:
11
+ name: Scorecard analysis
12
+ runs-on: ubuntu-latest
13
+ permissions:
14
+ security-events: write
15
+ id-token: write
16
+ contents: read
17
+ actions: read
18
+ steps:
19
+ - uses: actions/checkout@v7
20
+ with:
21
+ persist-credentials: false
22
+ - uses: ossf/scorecard-action@v2.4.3
23
+ with:
24
+ results_file: results.sarif
25
+ results_format: sarif
26
+ publish_results: true
27
+ - uses: github/codeql-action/upload-sarif@v4
28
+ with:
29
+ sarif_file: results.sarif
@@ -0,0 +1,39 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.so
5
+ *.egg
6
+ *.egg-info/
7
+ dist/
8
+ build/
9
+ .eggs/
10
+ .venv/
11
+ venv/
12
+ env/
13
+ .env
14
+
15
+ # Testing
16
+ .pytest_cache/
17
+ .coverage
18
+ coverage.xml
19
+ htmlcov/
20
+
21
+ # Type checking
22
+ .mypy_cache/
23
+
24
+ # Ruff
25
+ .ruff_cache/
26
+
27
+ # Claude Code settings
28
+ .claude/
29
+
30
+ # IDE
31
+ .vscode/
32
+ .idea/
33
+
34
+ # OS
35
+ .DS_Store
36
+ Thumbs.db
37
+
38
+ # Benchmark output
39
+ output.json
@@ -0,0 +1,20 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.9.0
4
+ hooks:
5
+ - id: ruff
6
+ args: [--fix]
7
+ - id: ruff-format
8
+
9
+ - repo: https://github.com/pre-commit/pre-commit-hooks
10
+ rev: v5.0.0
11
+ hooks:
12
+ - id: check-yaml
13
+ - id: check-toml
14
+ - id: check-json
15
+ - id: check-merge-conflict
16
+ - id: detect-private-key
17
+ - id: no-commit-to-branch
18
+ args: [--branch, main]
19
+ - id: end-of-file-fixer
20
+ - id: trailing-whitespace
@@ -0,0 +1,60 @@
1
+ # Changelog
2
+
3
+ All notable changes documented here.
4
+
5
+ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
+ Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Added
11
+
12
+ - PyPI distribution renamed to `agent-regress-cli` (import path is unchanged: `import agent_regress`) -- `agent-regress` on PyPI was blocked as too similar to an existing unrelated project
13
+ - `agent-regress` CLI (`src/agent_regress/cli.py`), wired up via `[project.scripts]`
14
+ - `agent-regress compare --version-a-results <path.json> --version-b-results <path.json>` -- file-based entry point that runs two JSON arrays of pre-computed per-run scores through the same Mann-Whitney U / bootstrap CI / Cohen's d pipeline `compare()` uses
15
+ - `--json` flag on `compare` for clean, machine-readable `Report` output (warnings routed to stderr)
16
+ - `--fail-on-regression` flag on `compare` for CI use (exit 1 on a `REGRESSED` verdict)
17
+ - `agent-regress --version`
18
+
19
+ ### Fixed
20
+
21
+ - `mann_whitney_u`: raise `ValueError` on NaN input instead of silently returning `p=1.0`
22
+ - `rank_biserial_r`: propagate `nan` instead of silently returning `-1.0` on NaN input
23
+ - `run_suite`: warn threshold raised from n<10 to n<30 to match recommendation message
24
+ - `_get_expected`: fix `KeyError` when `expected` key is present but set to `None`
25
+ - `f1_scorer`: use `Counter` multiset intersection instead of set intersection — fixes wrong F1 when tokens repeat
26
+ - `compare`: align `_MIN_N_WARN` threshold (was 30, now 50) with warning message and `n_runs` default
27
+ - `compare` / `Report`: store `p_threshold` and `min_effect` on `Report` so `assert_stable()` uses the right defaults
28
+ - `gaia.py`: fix false-positive accuracy when agent raises and `expected_answer` is `'none'`
29
+ - `tau_bench.py`: raise clear `ValueError` on empty `k_values` instead of opaque `max()` error
30
+ - `langchain` / `langgraph` integrations: fix fallback adapters that were wrapping `test_case` in a nested dict
31
+ - `openai_agents_runner`: narrow `RuntimeError` catch to avoid masking real errors and double-invoking the agent
32
+ - `benchmarks/__init__`: export `GAIALevelResult`, `SWEBenchResult`, `TauBenchResult`
33
+ - `core/__init__` / top-level `__init__`: export `AgentCallable` and `ScorerCallable` type aliases
34
+
35
+ ## [0.1.0] - 2026-06-19
36
+
37
+ ### Added
38
+
39
+ - `compare(version_a, version_b, test_suite, n_runs=50)` -- primary public API
40
+ - `run_suite(agent, test_suite, n_runs)` -- run agent N times on a test suite
41
+ - `Report` dataclass with `verdict`, `p_value`, `effect_size`, `ci_lower`, `ci_upper`
42
+ - `Verdict` enum: `REGRESSED`, `STABLE`, `IMPROVED`, `INSUFFICIENT_DATA`
43
+ - Mann-Whitney U test with continuity correction (`stats.mann_whitney_u`)
44
+ - Bootstrap confidence intervals at 95%, N=1000 resamples (`stats.bootstrap_mean_ci`)
45
+ - Cohen's d and rank-biserial r effect size (`stats.compute_effect_sizes`)
46
+ - `RegressionGate` and `assert_no_regression` for pytest CI integration
47
+ - `exact_match_scorer` and `f1_scorer` built-in scorers
48
+ - LangGraph integration (`integrations.langgraph_runner`)
49
+ - LangChain LCEL integration (`integrations.langchain_runner`)
50
+ - OpenAI Agents SDK integration (`integrations.openai_agents_runner`)
51
+ - CrewAI integration (`integrations.crewai_runner`)
52
+ - Tau-bench pass^k harness (`benchmarks.TauBenchHarness`)
53
+ - GAIA Level 1-3 split harness (`benchmarks.GAIAHarness`)
54
+ - SWE-bench Verified scaffold score harness (`benchmarks.SWEBenchHarness`)
55
+ - Docker Compose self-host setup
56
+ - Sample size warnings: warns (not fails) when n < 30 per version
57
+ - Apache 2.0 license
58
+ - OpenSSF Scorecard CI workflow
59
+ - SLSA Level 2 release signing via Sigstore
60
+ - SBOM generation on release (CycloneDX JSON format)
@@ -0,0 +1,71 @@
1
+ # CLAUDE.md -- agent-eval
2
+
3
+ ## Git Workflow
4
+
5
+ When asked to commit, push, or "update GitHub" -- just do it. No questions.
6
+
7
+ - git add relevant files -> git commit -> git push origin main
8
+ - "commit" means commit AND push -- always both
9
+ - Never ask "should I push?"
10
+
11
+ Every commit message must end with:
12
+
13
+ Built by Rudrendu Paul and Sourav Nandy, developed with Claude Code
14
+
15
+ Never use Co-Authored-By: lines.
16
+
17
+ ## Project Overview
18
+
19
+ agent-eval: Python statistical regression testing framework for LLM agents.
20
+
21
+ Core angle: run agent N times at version A, N times at version B, apply
22
+ Mann-Whitney U + bootstrap CI, report p-value and Cohen's d.
23
+
24
+ A/B testing for agent quality. Not DeepEval (threshold-based). Not single-run
25
+ benchmarks. Statistical comparison of two version distributions.
26
+
27
+ License: Apache 2.0 core.
28
+ Primary integrations: LangGraph (P0), OpenAI Agents SDK (P0).
29
+
30
+ ## Repo Layout
31
+
32
+ src/agent_regress/
33
+ - core/: runner.py, scorer.py, report.py, compare.py
34
+ - stats/: mann_whitney.py, bootstrap.py, effect_size.py (pure Python + scipy ONLY)
35
+ - integrations/: lazy-imported optional deps
36
+ - ci/: gate.py (AssertionError when p < threshold AND d > min_effect)
37
+ - benchmarks/: tau_bench.py, gaia.py, swebench.py
38
+ tests/unit/: no LLM calls
39
+ tests/integration/: real APIs, tagged @pytest.mark.integration
40
+ benchmarks/: standalone scripts
41
+ leaderboard/: git-committed JSON results
42
+
43
+ ## Engineering Standards
44
+
45
+ uv run ruff check src/ tests/ benchmarks/
46
+ uv run ruff format --check src/ tests/ benchmarks/
47
+ uv run mypy src/ --strict
48
+ uv run pytest tests/unit/ --cov=src/ --cov-fail-under=80
49
+
50
+ ## Key Invariants
51
+
52
+ - stats/ has ZERO LLM calls. Pure Python + scipy on lists of floats.
53
+ - runner.py: any callable dict->float. No framework coupling.
54
+ - gate.py: AssertionError when p < threshold AND d > min_effect.
55
+ - gate.py: WARN (not fail) when n < 30.
56
+ - All public API in __init__.py.
57
+ - mypy --strict must pass.
58
+ - leaderboard/results/ schema-validated in CI.
59
+
60
+ ## Session Start
61
+
62
+ 1. git status && git log --oneline -5
63
+ 2. uv run pytest tests/unit/ -q
64
+ 3. Read docs/lessons.md
65
+
66
+ ## Anti-Sycophancy
67
+
68
+ - No performance claims without benchmark output
69
+ - stats/ is a scipy one-liner -- not the moat
70
+ - The moat is leaderboard governance and hosted regression history
71
+ - Braintrust closes the p-value gap in one sprint -- say this proactively
@@ -0,0 +1,56 @@
1
+ # Contributing to agent-eval
2
+
3
+ Thanks for your interest. This covers everything to go from zero to a merged PR.
4
+
5
+ ## Fastest path
6
+
7
+ 1. Clone and run dev setup below
8
+ 2. Pick an issue labeled `good first issue`
9
+ 3. Open a draft PR early -- we can save you wasted work
10
+ 4. Mark ready for review when tests pass
11
+
12
+ We aim to review PRs within 72 hours (weekdays).
13
+
14
+ ## Dev setup
15
+
16
+ ```bash
17
+ git clone https://github.com/RudrenduPaul/agent-eval
18
+ cd agent-eval
19
+ pip install uv
20
+ uv sync --extra dev
21
+ pre-commit install
22
+ uv run pytest tests/unit/ -q # should pass 100% on a clean clone
23
+ ```
24
+
25
+ ## Engineering standards
26
+
27
+ Before submitting:
28
+
29
+ ```bash
30
+ uv run ruff check src/ tests/ benchmarks/
31
+ uv run ruff format --check src/ tests/ benchmarks/
32
+ uv run mypy src/ --strict
33
+ uv run pytest tests/unit/ --cov=src/ --cov-fail-under=80
34
+ ```
35
+
36
+ ## What makes a PR merge quickly
37
+
38
+ - Tests added for every behavior change
39
+ - CHANGELOG entry for any user-facing change
40
+ - One focused change per PR
41
+
42
+ ## What we will not merge
43
+
44
+ - PRs that break existing tests without a documented reason
45
+ - AI-generated code submitted without running and validating the output
46
+
47
+ ## Maintainer SLAs
48
+
49
+ - Bug reports: acknowledged within 24 hours (weekdays)
50
+ - Feature requests: triage label within 72 hours
51
+ - PRs: first review within 72 hours
52
+ - Security: acknowledged within 48 hours
53
+
54
+ ## Community
55
+
56
+ Discord: discord.gg/agent-eval (#contributing channel)