evalforge-ci 0.3.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.
- evalforge_ci-0.3.1/.github/ISSUE_TEMPLATE/bug_report.yml +22 -0
- evalforge_ci-0.3.1/.github/ISSUE_TEMPLATE/feature_request.yml +21 -0
- evalforge_ci-0.3.1/.github/dependabot.yml +22 -0
- evalforge_ci-0.3.1/.github/workflows/ci.yml +84 -0
- evalforge_ci-0.3.1/.github/workflows/codeql.yml +35 -0
- evalforge_ci-0.3.1/.github/workflows/release.yml +93 -0
- evalforge_ci-0.3.1/ADOPTERS.md +16 -0
- evalforge_ci-0.3.1/CHANGELOG.md +67 -0
- evalforge_ci-0.3.1/CITATION.cff +11 -0
- evalforge_ci-0.3.1/CODE_OF_CONDUCT.md +15 -0
- evalforge_ci-0.3.1/CONTRIBUTING.md +25 -0
- evalforge_ci-0.3.1/GOVERNANCE.md +20 -0
- evalforge_ci-0.3.1/LICENSE +21 -0
- evalforge_ci-0.3.1/MAINTAINERS.md +15 -0
- evalforge_ci-0.3.1/MANIFEST.in +11 -0
- evalforge_ci-0.3.1/Makefile +43 -0
- evalforge_ci-0.3.1/PKG-INFO +418 -0
- evalforge_ci-0.3.1/README.md +375 -0
- evalforge_ci-0.3.1/SECURITY.md +15 -0
- evalforge_ci-0.3.1/action.yml +64 -0
- evalforge_ci-0.3.1/docs/ARCHITECTURE.md +99 -0
- evalforge_ci-0.3.1/docs/BENCHMARK.md +34 -0
- evalforge_ci-0.3.1/docs/CASE_STUDY.md +55 -0
- evalforge_ci-0.3.1/docs/ECOSYSTEM.md +46 -0
- evalforge_ci-0.3.1/docs/INTEROPERABILITY.md +106 -0
- evalforge_ci-0.3.1/docs/METRICS.md +45 -0
- evalforge_ci-0.3.1/docs/PORTFOLIO.md +29 -0
- evalforge_ci-0.3.1/docs/RELEASE_CHECKLIST.md +18 -0
- evalforge_ci-0.3.1/docs/images/evalforge-hero.svg +56 -0
- evalforge_ci-0.3.1/docs/superpowers/plans/2026-08-31-v0.3-release-and-oss-readiness.md +241 -0
- evalforge_ci-0.3.1/examples/baseline_summary.json +13 -0
- evalforge_ci-0.3.1/examples/candidate_summary.json +13 -0
- evalforge_ci-0.3.1/examples/demo_dataset.json +83 -0
- evalforge_ci-0.3.1/examples/promptfoo_policy.json +35 -0
- evalforge_ci-0.3.1/examples/quality_policy.json +40 -0
- evalforge_ci-0.3.1/pyproject.toml +87 -0
- evalforge_ci-0.3.1/schemas/evaluation-artifact-v1.schema.json +47 -0
- evalforge_ci-0.3.1/schemas/gate-policy-v1.schema.json +33 -0
- evalforge_ci-0.3.1/setup.cfg +4 -0
- evalforge_ci-0.3.1/src/evalforge/__init__.py +3 -0
- evalforge_ci-0.3.1/src/evalforge/adapters/__init__.py +5 -0
- evalforge_ci-0.3.1/src/evalforge/adapters/promptfoo.py +201 -0
- evalforge_ci-0.3.1/src/evalforge/api.py +219 -0
- evalforge_ci-0.3.1/src/evalforge/artifacts.py +126 -0
- evalforge_ci-0.3.1/src/evalforge/cli.py +320 -0
- evalforge_ci-0.3.1/src/evalforge/config.py +32 -0
- evalforge_ci-0.3.1/src/evalforge/database.py +64 -0
- evalforge_ci-0.3.1/src/evalforge/gates.py +387 -0
- evalforge_ci-0.3.1/src/evalforge/metrics.py +107 -0
- evalforge_ci-0.3.1/src/evalforge/models.py +138 -0
- evalforge_ci-0.3.1/src/evalforge/presentation.py +10 -0
- evalforge_ci-0.3.1/src/evalforge/providers.py +137 -0
- evalforge_ci-0.3.1/src/evalforge/py.typed +0 -0
- evalforge_ci-0.3.1/src/evalforge/reproducibility.py +40 -0
- evalforge_ci-0.3.1/src/evalforge/retrieval.py +130 -0
- evalforge_ci-0.3.1/src/evalforge/schemas.py +175 -0
- evalforge_ci-0.3.1/src/evalforge/security.py +66 -0
- evalforge_ci-0.3.1/src/evalforge/services.py +191 -0
- evalforge_ci-0.3.1/src/evalforge_ci.egg-info/PKG-INFO +418 -0
- evalforge_ci-0.3.1/src/evalforge_ci.egg-info/SOURCES.txt +76 -0
- evalforge_ci-0.3.1/src/evalforge_ci.egg-info/dependency_links.txt +1 -0
- evalforge_ci-0.3.1/src/evalforge_ci.egg-info/entry_points.txt +2 -0
- evalforge_ci-0.3.1/src/evalforge_ci.egg-info/requires.txt +27 -0
- evalforge_ci-0.3.1/src/evalforge_ci.egg-info/top_level.txt +1 -0
- evalforge_ci-0.3.1/tests/conftest.py +35 -0
- evalforge_ci-0.3.1/tests/fixtures/promptfoo/README.md +13 -0
- evalforge_ci-0.3.1/tests/fixtures/promptfoo/results-v3.json +75 -0
- evalforge_ci-0.3.1/tests/test_api.py +150 -0
- evalforge_ci-0.3.1/tests/test_artifacts_gates.py +231 -0
- evalforge_ci-0.3.1/tests/test_cli.py +53 -0
- evalforge_ci-0.3.1/tests/test_dashboard_compat.py +26 -0
- evalforge_ci-0.3.1/tests/test_gates.py +85 -0
- evalforge_ci-0.3.1/tests/test_metrics.py +61 -0
- evalforge_ci-0.3.1/tests/test_promptfoo_adapter.py +127 -0
- evalforge_ci-0.3.1/tests/test_providers_security.py +50 -0
- evalforge_ci-0.3.1/tests/test_release_metadata.py +31 -0
- evalforge_ci-0.3.1/tests/test_retrieval.py +49 -0
- evalforge_ci-0.3.1/tests/test_workflows.py +42 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Report a reproducible EvalForge problem
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: [bug]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
attributes:
|
|
8
|
+
label: What happened?
|
|
9
|
+
description: Include expected and actual behavior.
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
attributes:
|
|
14
|
+
label: Reproduction
|
|
15
|
+
description: Provide the smallest dataset, config, and command that reproduce the issue.
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: input
|
|
19
|
+
attributes:
|
|
20
|
+
label: EvalForge version
|
|
21
|
+
validations:
|
|
22
|
+
required: true
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Propose an evidence-backed EvalForge improvement
|
|
3
|
+
title: "[Feature]: "
|
|
4
|
+
labels: [enhancement]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
attributes:
|
|
8
|
+
label: Maintainer or user problem
|
|
9
|
+
description: Describe the workflow that is currently difficult or impossible.
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
attributes:
|
|
14
|
+
label: Proposed behavior
|
|
15
|
+
description: Include example inputs, outputs, or policy where useful.
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: textarea
|
|
19
|
+
attributes:
|
|
20
|
+
label: Compatibility impact
|
|
21
|
+
description: Note any artifact, policy, metric, API, or CLI behavior that could change.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: pip
|
|
4
|
+
directory: /
|
|
5
|
+
schedule:
|
|
6
|
+
interval: weekly
|
|
7
|
+
groups:
|
|
8
|
+
python-runtime:
|
|
9
|
+
dependency-type: production
|
|
10
|
+
python-development:
|
|
11
|
+
dependency-type: development
|
|
12
|
+
# mypy 2.x and Twine 7.x require Python >=3.10. Keep development tooling
|
|
13
|
+
# installable in the maintained Python 3.9 CI job.
|
|
14
|
+
ignore:
|
|
15
|
+
- dependency-name: mypy
|
|
16
|
+
update-types: [version-update:semver-major]
|
|
17
|
+
- dependency-name: twine
|
|
18
|
+
update-types: [version-update:semver-major]
|
|
19
|
+
- package-ecosystem: github-actions
|
|
20
|
+
directory: /
|
|
21
|
+
schedule:
|
|
22
|
+
interval: weekly
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
concurrency:
|
|
12
|
+
group: ci-${{ github.workflow }}-${{ github.ref }}
|
|
13
|
+
cancel-in-progress: true
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
test:
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
strategy:
|
|
19
|
+
fail-fast: false
|
|
20
|
+
matrix:
|
|
21
|
+
python-version: ["3.9", "3.12"]
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
24
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
|
|
25
|
+
with:
|
|
26
|
+
python-version: ${{ matrix.python-version }}
|
|
27
|
+
cache: pip
|
|
28
|
+
- run: python -m pip install -e ".[rag,dashboard,dev]"
|
|
29
|
+
- run: ruff check .
|
|
30
|
+
- run: mypy src/evalforge
|
|
31
|
+
- run: pytest --cov=evalforge --cov-report=term-missing --cov-fail-under=85
|
|
32
|
+
- if: matrix.python-version == '3.12'
|
|
33
|
+
run: make gate-demo
|
|
34
|
+
- name: Run the reproducible RAG release gate
|
|
35
|
+
if: matrix.python-version == '3.12'
|
|
36
|
+
run: |
|
|
37
|
+
EVALFORGE_DATABASE_URL=sqlite:///./ci_evalforge.db evalforge seed
|
|
38
|
+
EVALFORGE_DATABASE_URL=sqlite:///./ci_evalforge.db evalforge check hybrid_top3 --report-dir artifacts
|
|
39
|
+
- name: Run the promptfoo interoperability gate
|
|
40
|
+
if: matrix.python-version == '3.12'
|
|
41
|
+
run: |
|
|
42
|
+
evalforge import promptfoo tests/fixtures/promptfoo/results-v3.json \
|
|
43
|
+
--output artifacts/promptfoo-artifact.json \
|
|
44
|
+
--source-revision "$GITHUB_SHA"
|
|
45
|
+
evalforge gate artifacts/promptfoo-artifact.json \
|
|
46
|
+
--policy examples/promptfoo_policy.json \
|
|
47
|
+
--json artifacts/promptfoo-report.json \
|
|
48
|
+
--junit artifacts/promptfoo-junit.xml \
|
|
49
|
+
--sarif artifacts/promptfoo.sarif
|
|
50
|
+
- name: Validate release-gate reports
|
|
51
|
+
if: matrix.python-version == '3.12'
|
|
52
|
+
run: |
|
|
53
|
+
python -m json.tool artifacts/evalforge-report.json >/dev/null
|
|
54
|
+
python -m json.tool artifacts/evalforge.sarif >/dev/null
|
|
55
|
+
python -m json.tool artifacts/promptfoo-artifact.json >/dev/null
|
|
56
|
+
python -m json.tool artifacts/promptfoo-report.json >/dev/null
|
|
57
|
+
python -m json.tool artifacts/promptfoo.sarif >/dev/null
|
|
58
|
+
python -c "from xml.etree import ElementTree; ElementTree.parse('artifacts/evalforge-junit.xml')"
|
|
59
|
+
python -c "from xml.etree import ElementTree; ElementTree.parse('artifacts/promptfoo-junit.xml')"
|
|
60
|
+
- name: Build and check distributions
|
|
61
|
+
if: matrix.python-version == '3.12'
|
|
62
|
+
run: make release-check
|
|
63
|
+
- name: Test the built wheel in a fresh environment
|
|
64
|
+
if: matrix.python-version == '3.12'
|
|
65
|
+
run: |
|
|
66
|
+
python -m venv "$RUNNER_TEMP/evalforge-wheel"
|
|
67
|
+
"$RUNNER_TEMP/evalforge-wheel/bin/python" -m pip install dist/*.whl
|
|
68
|
+
"$RUNNER_TEMP/evalforge-wheel/bin/evalforge" gate examples/candidate_summary.json \
|
|
69
|
+
--policy examples/quality_policy.json \
|
|
70
|
+
--baseline examples/baseline_summary.json \
|
|
71
|
+
--json "$RUNNER_TEMP/evalforge-wheel/report.json" \
|
|
72
|
+
--junit "$RUNNER_TEMP/evalforge-wheel/junit.xml" \
|
|
73
|
+
--sarif "$RUNNER_TEMP/evalforge-wheel/report.sarif"
|
|
74
|
+
|
|
75
|
+
docker:
|
|
76
|
+
runs-on: ubuntu-latest
|
|
77
|
+
steps:
|
|
78
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
79
|
+
- uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4
|
|
80
|
+
- uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7
|
|
81
|
+
with:
|
|
82
|
+
context: .
|
|
83
|
+
push: false
|
|
84
|
+
tags: evalforge:ci
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: CodeQL
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
schedule:
|
|
9
|
+
- cron: "17 4 * * 1"
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
group: codeql-${{ github.workflow }}-${{ github.ref }}
|
|
16
|
+
cancel-in-progress: true
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
analyze:
|
|
20
|
+
name: Analyze (python)
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
permissions:
|
|
23
|
+
contents: read
|
|
24
|
+
security-events: write
|
|
25
|
+
steps:
|
|
26
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
27
|
+
- name: Initialize CodeQL
|
|
28
|
+
uses: github/codeql-action/init@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
|
|
29
|
+
with:
|
|
30
|
+
languages: python
|
|
31
|
+
build-mode: none
|
|
32
|
+
- name: Analyze
|
|
33
|
+
uses: github/codeql-action/analyze@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
|
|
34
|
+
with:
|
|
35
|
+
category: /language:python
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
name: Release assets
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
permissions: {}
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
build:
|
|
11
|
+
if: startsWith(github.event.release.tag_name, 'v') && github.event.release.prerelease == false
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
permissions:
|
|
14
|
+
contents: read
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
17
|
+
with:
|
|
18
|
+
ref: ${{ github.event.release.tag_name }}
|
|
19
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
|
|
20
|
+
with:
|
|
21
|
+
python-version: "3.12"
|
|
22
|
+
cache: pip
|
|
23
|
+
- name: Verify checked-out tag target
|
|
24
|
+
env:
|
|
25
|
+
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
|
26
|
+
run: |
|
|
27
|
+
release_tag_commit=$(git rev-list -n 1 "$RELEASE_TAG")
|
|
28
|
+
checked_out_commit=$(git rev-parse HEAD)
|
|
29
|
+
test "$release_tag_commit" = "$checked_out_commit"
|
|
30
|
+
package_version=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])")
|
|
31
|
+
test "$RELEASE_TAG" = "v$package_version"
|
|
32
|
+
- run: python -m pip install ".[dev]"
|
|
33
|
+
- run: make release-check
|
|
34
|
+
- name: Assemble verified release files
|
|
35
|
+
run: |
|
|
36
|
+
mkdir -p release-files/packages
|
|
37
|
+
cp dist/*.whl dist/*.tar.gz release-files/packages/
|
|
38
|
+
sha256sum release-files/packages/* | sed 's#release-files/packages/##' > release-files/SHA256SUMS
|
|
39
|
+
cd release-files/packages
|
|
40
|
+
sha256sum --check ../SHA256SUMS
|
|
41
|
+
- name: Store verified distributions
|
|
42
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
43
|
+
with:
|
|
44
|
+
name: verified-release-files
|
|
45
|
+
path: release-files/
|
|
46
|
+
if-no-files-found: error
|
|
47
|
+
retention-days: 7
|
|
48
|
+
|
|
49
|
+
github-release:
|
|
50
|
+
needs: build
|
|
51
|
+
runs-on: ubuntu-latest
|
|
52
|
+
permissions:
|
|
53
|
+
actions: read
|
|
54
|
+
contents: write
|
|
55
|
+
steps:
|
|
56
|
+
- name: Retrieve verified release files
|
|
57
|
+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
58
|
+
with:
|
|
59
|
+
name: verified-release-files
|
|
60
|
+
path: release-files
|
|
61
|
+
- name: Verify downloaded distributions
|
|
62
|
+
working-directory: release-files/packages
|
|
63
|
+
run: sha256sum --check ../SHA256SUMS
|
|
64
|
+
- name: Attach distributions and checksums
|
|
65
|
+
env:
|
|
66
|
+
GH_TOKEN: ${{ github.token }}
|
|
67
|
+
run: |
|
|
68
|
+
gh release upload "${{ github.event.release.tag_name }}" \
|
|
69
|
+
release-files/packages/* release-files/SHA256SUMS --clobber \
|
|
70
|
+
--repo "${{ github.repository }}"
|
|
71
|
+
|
|
72
|
+
pypi-publish:
|
|
73
|
+
needs: build
|
|
74
|
+
runs-on: ubuntu-latest
|
|
75
|
+
environment:
|
|
76
|
+
name: pypi
|
|
77
|
+
url: https://pypi.org/p/evalforge-ci
|
|
78
|
+
permissions:
|
|
79
|
+
actions: read
|
|
80
|
+
id-token: write
|
|
81
|
+
steps:
|
|
82
|
+
- name: Retrieve verified distributions
|
|
83
|
+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
84
|
+
with:
|
|
85
|
+
name: verified-release-files
|
|
86
|
+
path: release-files
|
|
87
|
+
- name: Verify downloaded distributions
|
|
88
|
+
working-directory: release-files/packages
|
|
89
|
+
run: sha256sum --check ../SHA256SUMS
|
|
90
|
+
- name: Publish distributions with OIDC
|
|
91
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
92
|
+
with:
|
|
93
|
+
packages-dir: release-files/packages/
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Adopters
|
|
2
|
+
|
|
3
|
+
EvalForge records downstream use only when it can be verified publicly and the project's maintainer has agreed to be listed.
|
|
4
|
+
|
|
5
|
+
There are no confirmed downstream adopters yet. GitHub stars and automated trend indexes show early interest, but they are not evidence of an integration or production use.
|
|
6
|
+
|
|
7
|
+
## Add your project
|
|
8
|
+
|
|
9
|
+
Open an issue or pull request with:
|
|
10
|
+
|
|
11
|
+
- the public repository and a link to the EvalForge Action or artifact-schema integration;
|
|
12
|
+
- the EvalForge version or commit in use;
|
|
13
|
+
- a short description of what the quality gate protects; and
|
|
14
|
+
- confirmation that the project may be named here.
|
|
15
|
+
|
|
16
|
+
The maintainers verify the link before adding an entry. Private users may share feedback without being listed.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes are documented here. The project follows semantic versioning while the artifact and policy formats carry independent schema versions.
|
|
4
|
+
|
|
5
|
+
## [0.3.1] - 2026-08-31
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- An explicit promptfoo JSON results-schema-v3 adapter that emits sanitized aggregate evidence and preserves producer provenance.
|
|
10
|
+
- Upstream-format synthetic promptfoo fixtures and compatibility tests covering unknown fields, missing provenance, non-finite evidence, inconsistent counts, and the CLI import path.
|
|
11
|
+
- CodeQL analysis for Python pull requests, main-branch pushes, and scheduled scans with minimal permissions.
|
|
12
|
+
- PyPI Trusted Publishing through GitHub OIDC, with the official publish Action pinned to a reviewed commit.
|
|
13
|
+
- Workflow invariants that reject floating third-party Action references and keep the OIDC permission scoped to the publish job.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- Build release distributions once, verify them with Twine and SHA-256, then reuse the same workflow artifact for GitHub Release assets and PyPI publication.
|
|
18
|
+
- Document the promptfoo metric mapping, source-version boundary, privacy exclusions, and first-release Trusted Publisher checklist.
|
|
19
|
+
- Keep Dependabot from proposing mypy 2.x or Twine 7.x while the project maintains Python 3.9 compatibility.
|
|
20
|
+
- Include conformance fixtures, examples, workflow definitions, and release metadata in the source distribution so its bundled test suite is self-contained.
|
|
21
|
+
|
|
22
|
+
## [0.3.0] - 2026-08-31
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- Baseline-versus-candidate comparisons with direction-aware metric verdicts.
|
|
27
|
+
- Dataset fingerprints, complete configuration snapshots, and metric-version metadata.
|
|
28
|
+
- Stored-experiment release gates in the API and Streamlit dashboard.
|
|
29
|
+
- An end-to-end `evalforge check` command that runs the built-in RAG evaluator and emits portable JSON, JUnit, and SARIF evidence.
|
|
30
|
+
- A seeded RAG release gate in GitHub Actions.
|
|
31
|
+
- An engineering case study and resume-ready project narrative.
|
|
32
|
+
- An expanded test suite with an enforced 85% branch-coverage floor.
|
|
33
|
+
|
|
34
|
+
## [0.2.1] - 2026-08-30
|
|
35
|
+
|
|
36
|
+
### Fixed
|
|
37
|
+
|
|
38
|
+
- Reject non-finite metric values and policy thresholds before they can enter JSON, JUnit, or SARIF evidence.
|
|
39
|
+
- Fail baseline-delta checks when candidate and baseline units or metric directions do not match.
|
|
40
|
+
- Reject duplicate policy check IDs so report identifiers remain unambiguous.
|
|
41
|
+
- Isolate SQLite databases per pytest session so concurrent test runs cannot corrupt each other.
|
|
42
|
+
|
|
43
|
+
### Changed
|
|
44
|
+
|
|
45
|
+
- Update maintained GitHub Actions and development dependency ranges after successful Dependabot CI runs; pin Actions to full commit SHAs.
|
|
46
|
+
- Cancel superseded CI runs on the same ref.
|
|
47
|
+
- Build and attach checked Python distributions plus SHA-256 checksums when a GitHub Release is published.
|
|
48
|
+
- Mark the installed Python package as typed for PEP 561-aware consumers.
|
|
49
|
+
|
|
50
|
+
## [0.2.0] - 2026-08-24
|
|
51
|
+
|
|
52
|
+
### Added
|
|
53
|
+
|
|
54
|
+
- Evaluator-neutral evaluation artifact schema 1.0.
|
|
55
|
+
- Policy schema 1 with absolute and baseline-delta checks.
|
|
56
|
+
- JSON, JUnit XML, and SARIF 2.1.0 gate reports.
|
|
57
|
+
- CI-safe gate exit codes and a reusable GitHub composite Action.
|
|
58
|
+
- Public governance, maintainer responsibilities, and ecosystem success measures.
|
|
59
|
+
|
|
60
|
+
### Changed
|
|
61
|
+
|
|
62
|
+
- The unique Python distribution name is now `evalforge-ci`; the import package and CLI remain `evalforge`.
|
|
63
|
+
- `evalforge run` can write a portable artifact with `--output`.
|
|
64
|
+
|
|
65
|
+
## [0.1.0] - 2026-08-24
|
|
66
|
+
|
|
67
|
+
- Initial RAG quality and security evaluation MVP.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: If EvalForge supports your research or engineering work, please cite the software.
|
|
3
|
+
title: EvalForge
|
|
4
|
+
type: software
|
|
5
|
+
version: 0.3.1
|
|
6
|
+
date-released: 2026-08-31
|
|
7
|
+
license: MIT
|
|
8
|
+
repository-code: https://github.com/jsdhwfmax/EvalForge
|
|
9
|
+
url: https://github.com/jsdhwfmax/EvalForge
|
|
10
|
+
authors:
|
|
11
|
+
- alias: jsdhwfmax
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Contributor Covenant Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our pledge
|
|
4
|
+
|
|
5
|
+
We pledge to make participation in this project a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, experience level, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.
|
|
6
|
+
|
|
7
|
+
## Our standards
|
|
8
|
+
|
|
9
|
+
Positive behavior includes empathy, constructive feedback, respect for differing viewpoints, and responsibility for mistakes. Unacceptable behavior includes harassment, discriminatory language, personal attacks, publishing private information without permission, or conduct inappropriate in a professional setting.
|
|
10
|
+
|
|
11
|
+
## Enforcement
|
|
12
|
+
|
|
13
|
+
Project maintainers may remove, edit, or reject contributions and interactions that violate this Code of Conduct. Reports may be made through the repository's private security/reporting channels. Maintainers will respect the privacy and safety of reporters.
|
|
14
|
+
|
|
15
|
+
This text is adapted from Contributor Covenant 2.1.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thanks for helping make RAG quality measurable.
|
|
4
|
+
|
|
5
|
+
1. Open an issue for substantial behavior or architecture changes.
|
|
6
|
+
2. Create a focused branch and add tests for new behavior.
|
|
7
|
+
3. Run `make lint` and `make test` locally.
|
|
8
|
+
4. Keep metrics deterministic or document nondeterminism and confidence intervals.
|
|
9
|
+
5. Never include customer data, real credentials, or private prompts in fixtures.
|
|
10
|
+
|
|
11
|
+
Pull requests should explain the user problem, implementation, verification evidence, and any metric-compatibility impact. Changes to a metric definition should update `docs/METRICS.md` and include before/after fixtures.
|
|
12
|
+
|
|
13
|
+
Changes to the portable artifact or gate policy must also update the matching JSON Schema, `docs/INTEROPERABILITY.md`, and compatibility tests. New evaluator integrations should be backed by a sanitized upstream fixture rather than an invented output shape.
|
|
14
|
+
|
|
15
|
+
## Development setup
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
python3 -m venv .venv
|
|
19
|
+
source .venv/bin/activate
|
|
20
|
+
pip install -e ".[rag,dashboard,dev]"
|
|
21
|
+
evalforge seed
|
|
22
|
+
pytest
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The project targets Python 3.9 and 3.12. Please keep new code compatible with both.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Governance
|
|
2
|
+
|
|
3
|
+
EvalForge uses a maintainer-led, contribution-driven model while the community is small.
|
|
4
|
+
|
|
5
|
+
## Decisions
|
|
6
|
+
|
|
7
|
+
- Routine fixes are decided through pull-request review.
|
|
8
|
+
- Behavior, metric, artifact, policy, or compatibility changes require an issue and documented migration impact.
|
|
9
|
+
- Security fixes may be developed privately and disclosed after a patch is available.
|
|
10
|
+
- The primary maintainer has final responsibility for releases, security response, and resolving deadlock.
|
|
11
|
+
|
|
12
|
+
Material decisions should be recorded in public issues or pull requests. Compatibility and user safety take priority over release speed.
|
|
13
|
+
|
|
14
|
+
## Becoming a maintainer
|
|
15
|
+
|
|
16
|
+
Contributors may be invited as reviewers after sustained, constructive work across code, documentation, issue triage, or integrations. Commit access follows demonstrated responsibility rather than a fixed contribution count. Maintainer additions and departures are recorded in `MAINTAINERS.md`.
|
|
17
|
+
|
|
18
|
+
## Project assets
|
|
19
|
+
|
|
20
|
+
Repository, package, and release credentials must use least privilege and multi-factor authentication where supported. No single contributor should copy user datasets, provider keys, or private vulnerability details into public project systems.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 EvalForge 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,15 @@
|
|
|
1
|
+
# Maintainers
|
|
2
|
+
|
|
3
|
+
## Primary maintainer
|
|
4
|
+
|
|
5
|
+
- [`@jsdhwfmax`](https://github.com/jsdhwfmax) — architecture, issue and pull-request triage, releases, security response, and compatibility policy.
|
|
6
|
+
|
|
7
|
+
The primary maintainer is currently the only person with release authority. This file will be updated when responsibility is shared; contributors are not presented as maintainers without their consent.
|
|
8
|
+
|
|
9
|
+
## Maintenance expectations
|
|
10
|
+
|
|
11
|
+
- Triage reproducible bugs and security reports.
|
|
12
|
+
- Review dependency and CI updates.
|
|
13
|
+
- Keep artifact and policy schemas backward compatible within a schema version.
|
|
14
|
+
- Publish release notes and migration guidance for behavior changes.
|
|
15
|
+
- Keep public adoption and ecosystem claims tied to verifiable evidence.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
include LICENSE
|
|
2
|
+
include README.md
|
|
3
|
+
include *.md
|
|
4
|
+
include CITATION.cff
|
|
5
|
+
include Makefile
|
|
6
|
+
include action.yml
|
|
7
|
+
recursive-include .github *.yml
|
|
8
|
+
recursive-include docs *.md *.svg
|
|
9
|
+
recursive-include examples *.json
|
|
10
|
+
recursive-include schemas *.json
|
|
11
|
+
recursive-include tests *.py *.json *.md
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
.PHONY: install test lint gate-demo package release-check run dashboard demo docker
|
|
2
|
+
|
|
3
|
+
PYTHON ?= python3
|
|
4
|
+
|
|
5
|
+
install:
|
|
6
|
+
$(PYTHON) -m pip install -e ".[rag,dashboard,dev]"
|
|
7
|
+
|
|
8
|
+
test:
|
|
9
|
+
pytest --cov=evalforge --cov-report=term-missing --cov-fail-under=85
|
|
10
|
+
|
|
11
|
+
lint:
|
|
12
|
+
ruff check .
|
|
13
|
+
mypy src/evalforge
|
|
14
|
+
|
|
15
|
+
gate-demo:
|
|
16
|
+
mkdir -p build
|
|
17
|
+
$(PYTHON) -m evalforge.cli gate examples/candidate_summary.json \
|
|
18
|
+
--policy examples/quality_policy.json \
|
|
19
|
+
--baseline examples/baseline_summary.json \
|
|
20
|
+
--json build/evalforge-report.json \
|
|
21
|
+
--junit build/evalforge-junit.xml \
|
|
22
|
+
--sarif build/evalforge.sarif
|
|
23
|
+
|
|
24
|
+
package:
|
|
25
|
+
$(PYTHON) -m build
|
|
26
|
+
|
|
27
|
+
release-check: package
|
|
28
|
+
$(PYTHON) -m twine check dist/*.whl dist/*.tar.gz
|
|
29
|
+
|
|
30
|
+
run:
|
|
31
|
+
uvicorn evalforge.api:app --reload
|
|
32
|
+
|
|
33
|
+
dashboard:
|
|
34
|
+
streamlit run dashboard/app.py
|
|
35
|
+
|
|
36
|
+
demo:
|
|
37
|
+
evalforge seed
|
|
38
|
+
evalforge run baseline_top1 --name "Baseline"
|
|
39
|
+
evalforge run hybrid_top3 --name "Candidate"
|
|
40
|
+
evalforge check hybrid_top3 --name "Release candidate" --report-dir artifacts
|
|
41
|
+
|
|
42
|
+
docker:
|
|
43
|
+
docker compose up --build
|