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.
Files changed (78) hide show
  1. evalforge_ci-0.3.1/.github/ISSUE_TEMPLATE/bug_report.yml +22 -0
  2. evalforge_ci-0.3.1/.github/ISSUE_TEMPLATE/feature_request.yml +21 -0
  3. evalforge_ci-0.3.1/.github/dependabot.yml +22 -0
  4. evalforge_ci-0.3.1/.github/workflows/ci.yml +84 -0
  5. evalforge_ci-0.3.1/.github/workflows/codeql.yml +35 -0
  6. evalforge_ci-0.3.1/.github/workflows/release.yml +93 -0
  7. evalforge_ci-0.3.1/ADOPTERS.md +16 -0
  8. evalforge_ci-0.3.1/CHANGELOG.md +67 -0
  9. evalforge_ci-0.3.1/CITATION.cff +11 -0
  10. evalforge_ci-0.3.1/CODE_OF_CONDUCT.md +15 -0
  11. evalforge_ci-0.3.1/CONTRIBUTING.md +25 -0
  12. evalforge_ci-0.3.1/GOVERNANCE.md +20 -0
  13. evalforge_ci-0.3.1/LICENSE +21 -0
  14. evalforge_ci-0.3.1/MAINTAINERS.md +15 -0
  15. evalforge_ci-0.3.1/MANIFEST.in +11 -0
  16. evalforge_ci-0.3.1/Makefile +43 -0
  17. evalforge_ci-0.3.1/PKG-INFO +418 -0
  18. evalforge_ci-0.3.1/README.md +375 -0
  19. evalforge_ci-0.3.1/SECURITY.md +15 -0
  20. evalforge_ci-0.3.1/action.yml +64 -0
  21. evalforge_ci-0.3.1/docs/ARCHITECTURE.md +99 -0
  22. evalforge_ci-0.3.1/docs/BENCHMARK.md +34 -0
  23. evalforge_ci-0.3.1/docs/CASE_STUDY.md +55 -0
  24. evalforge_ci-0.3.1/docs/ECOSYSTEM.md +46 -0
  25. evalforge_ci-0.3.1/docs/INTEROPERABILITY.md +106 -0
  26. evalforge_ci-0.3.1/docs/METRICS.md +45 -0
  27. evalforge_ci-0.3.1/docs/PORTFOLIO.md +29 -0
  28. evalforge_ci-0.3.1/docs/RELEASE_CHECKLIST.md +18 -0
  29. evalforge_ci-0.3.1/docs/images/evalforge-hero.svg +56 -0
  30. evalforge_ci-0.3.1/docs/superpowers/plans/2026-08-31-v0.3-release-and-oss-readiness.md +241 -0
  31. evalforge_ci-0.3.1/examples/baseline_summary.json +13 -0
  32. evalforge_ci-0.3.1/examples/candidate_summary.json +13 -0
  33. evalforge_ci-0.3.1/examples/demo_dataset.json +83 -0
  34. evalforge_ci-0.3.1/examples/promptfoo_policy.json +35 -0
  35. evalforge_ci-0.3.1/examples/quality_policy.json +40 -0
  36. evalforge_ci-0.3.1/pyproject.toml +87 -0
  37. evalforge_ci-0.3.1/schemas/evaluation-artifact-v1.schema.json +47 -0
  38. evalforge_ci-0.3.1/schemas/gate-policy-v1.schema.json +33 -0
  39. evalforge_ci-0.3.1/setup.cfg +4 -0
  40. evalforge_ci-0.3.1/src/evalforge/__init__.py +3 -0
  41. evalforge_ci-0.3.1/src/evalforge/adapters/__init__.py +5 -0
  42. evalforge_ci-0.3.1/src/evalforge/adapters/promptfoo.py +201 -0
  43. evalforge_ci-0.3.1/src/evalforge/api.py +219 -0
  44. evalforge_ci-0.3.1/src/evalforge/artifacts.py +126 -0
  45. evalforge_ci-0.3.1/src/evalforge/cli.py +320 -0
  46. evalforge_ci-0.3.1/src/evalforge/config.py +32 -0
  47. evalforge_ci-0.3.1/src/evalforge/database.py +64 -0
  48. evalforge_ci-0.3.1/src/evalforge/gates.py +387 -0
  49. evalforge_ci-0.3.1/src/evalforge/metrics.py +107 -0
  50. evalforge_ci-0.3.1/src/evalforge/models.py +138 -0
  51. evalforge_ci-0.3.1/src/evalforge/presentation.py +10 -0
  52. evalforge_ci-0.3.1/src/evalforge/providers.py +137 -0
  53. evalforge_ci-0.3.1/src/evalforge/py.typed +0 -0
  54. evalforge_ci-0.3.1/src/evalforge/reproducibility.py +40 -0
  55. evalforge_ci-0.3.1/src/evalforge/retrieval.py +130 -0
  56. evalforge_ci-0.3.1/src/evalforge/schemas.py +175 -0
  57. evalforge_ci-0.3.1/src/evalforge/security.py +66 -0
  58. evalforge_ci-0.3.1/src/evalforge/services.py +191 -0
  59. evalforge_ci-0.3.1/src/evalforge_ci.egg-info/PKG-INFO +418 -0
  60. evalforge_ci-0.3.1/src/evalforge_ci.egg-info/SOURCES.txt +76 -0
  61. evalforge_ci-0.3.1/src/evalforge_ci.egg-info/dependency_links.txt +1 -0
  62. evalforge_ci-0.3.1/src/evalforge_ci.egg-info/entry_points.txt +2 -0
  63. evalforge_ci-0.3.1/src/evalforge_ci.egg-info/requires.txt +27 -0
  64. evalforge_ci-0.3.1/src/evalforge_ci.egg-info/top_level.txt +1 -0
  65. evalforge_ci-0.3.1/tests/conftest.py +35 -0
  66. evalforge_ci-0.3.1/tests/fixtures/promptfoo/README.md +13 -0
  67. evalforge_ci-0.3.1/tests/fixtures/promptfoo/results-v3.json +75 -0
  68. evalforge_ci-0.3.1/tests/test_api.py +150 -0
  69. evalforge_ci-0.3.1/tests/test_artifacts_gates.py +231 -0
  70. evalforge_ci-0.3.1/tests/test_cli.py +53 -0
  71. evalforge_ci-0.3.1/tests/test_dashboard_compat.py +26 -0
  72. evalforge_ci-0.3.1/tests/test_gates.py +85 -0
  73. evalforge_ci-0.3.1/tests/test_metrics.py +61 -0
  74. evalforge_ci-0.3.1/tests/test_promptfoo_adapter.py +127 -0
  75. evalforge_ci-0.3.1/tests/test_providers_security.py +50 -0
  76. evalforge_ci-0.3.1/tests/test_release_metadata.py +31 -0
  77. evalforge_ci-0.3.1/tests/test_retrieval.py +49 -0
  78. 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