ragops 2.0.0__tar.gz → 2.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.
- {ragops-2.0.0 → ragops-2.1.0}/.github/ISSUE_TEMPLATE/bug.yml +1 -1
- {ragops-2.0.0 → ragops-2.1.0}/.github/workflows/ragops-gate.yml +1 -1
- {ragops-2.0.0 → ragops-2.1.0}/CHANGELOG.md +11 -0
- {ragops-2.0.0 → ragops-2.1.0}/PKG-INFO +9 -3
- {ragops-2.0.0 → ragops-2.1.0}/README.md +8 -2
- ragops-2.1.0/docs/architecture/adr/0018-portable-external-metric-envelope.md +43 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/cv-linkedin-copy.md +1 -1
- {ragops-2.0.0 → ragops-2.1.0}/docs/engineering/github-pr-gate.md +28 -1
- {ragops-2.0.0 → ragops-2.1.0}/docs/engineering/gitlab-ci-gate.md +1 -1
- ragops-2.1.0/docs/engineering/provider-adapters.md +75 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/engineering/pypi-publishing.md +3 -3
- ragops-2.1.0/docs/examples/github-pr-comment.yml +30 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/examples/gitlab-ci-ragops.yml +1 -1
- ragops-2.1.0/docs/product/requirements-v2.1.md +50 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/product/roadmap.md +8 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/program-completion-audit.md +9 -6
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/v2.0-acceptance.md +6 -3
- ragops-2.1.0/docs/project/v2.1-acceptance.md +36 -0
- ragops-2.1.0/docs/releases/v2.1.0.md +37 -0
- {ragops-2.0.0 → ragops-2.1.0}/pyproject.toml +1 -1
- ragops-2.1.0/scenarios/japanese_troubleshooting/external-metric-policy.toml +5 -0
- ragops-2.1.0/scenarios/japanese_troubleshooting/external-metrics-baseline.json +8 -0
- ragops-2.1.0/scenarios/japanese_troubleshooting/external-metrics-candidate.json +8 -0
- ragops-2.1.0/schemas/external-metrics-0.1.schema.json +30 -0
- {ragops-2.0.0 → ragops-2.1.0}/site/index.html +1 -1
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/__init__.py +1 -1
- ragops-2.1.0/src/ragops/adapters/__init__.py +16 -0
- ragops-2.1.0/src/ragops/adapters/external_metrics.py +134 -0
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/cli.py +50 -7
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/engine.py +15 -2
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_adoption_recipes.py +18 -1
- ragops-2.1.0/tests/test_external_metrics.py +192 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_public_api.py +1 -1
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_showcase_site.py +1 -1
- ragops-2.0.0/docs/engineering/provider-adapters.md +0 -32
- ragops-2.0.0/src/ragops/adapters/__init__.py +0 -5
- {ragops-2.0.0 → ragops-2.1.0}/.dockerignore +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/.github/ISSUE_TEMPLATE/design-partner.yml +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/.github/ISSUE_TEMPLATE/evaluator.yml +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/.github/pull_request_template.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/.github/workflows/ci.yml +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/.github/workflows/nightly.yml +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/.github/workflows/pages.yml +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/.github/workflows/publish-pypi.yml +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/.github/workflows/ragops-gate-smoke.yml +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/.github/workflows/ragops-pr-comment.yml +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/.github/workflows/release.yml +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/.gitignore +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/AGENTS.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/CODE_OF_CONDUCT.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/CONTRIBUTING.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/Dockerfile +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/LICENSE +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/SECURITY.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/SUPPORT.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/apps/__init__.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/apps/api/__init__.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/apps/api/main.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/apps/github_pr_comment.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/apps/web/index.html +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/compose.yaml +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/design-qa.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0001-local-first-core.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0002-baseline-regression-gates.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0003-reference-app-outside-core.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0004-open-core-boundary.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0005-scenario-0.2-metadata-and-citation-precision.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0006-response-fixture-overlays.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0007-offline-reference-graphrag-agent.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0008-local-team-review-workflow.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0009-adopt-mit-license.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0010-repair-trace-04-schema-json.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0011-reusable-pr-gate-is-an-adapter.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0012-opentelemetry-export-is-an-example-adapter.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0013-additive-demo-catalog-and-codepoint-budget.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0014-separate-pr-evaluation-from-comment-publication.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0015-portable-design-partner-measurement.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0016-first-class-evaluator-gates.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0017-api-authentication-and-input-bounds.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/component-diagram.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/context-diagram.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/control-plane-alpha.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/data-model.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/pr-comment-publishing.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/system-overview.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/threat-model.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/design-audit/01-current-desktop.jpg +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/design-audit/02-implementation-desktop.jpg +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/design-audit/04-implementation-mobile.jpg +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/design-audit/06-desktop-comparison.jpg +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/design-audit/09-limitations-section.jpg +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/design-audit/selected-open-source-adoption.png +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/infographics/evidence-stack.svg +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/infographics/release-gate-flow.svg +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/portfolio-case-study.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/portfolio-handoff.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/presentation-outline.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/screenshots/ragops-limitations-screen.jpg +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/screenshots/ragops-mobile-screen.jpg +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/screenshots/ragops-portfolio-desktop.jpg +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/screenshots/ragops-portfolio-mobile.jpg +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/screenshots/ragops-release-screen.jpg +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/screenshots/ragops-showcase-hero.jpg +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/social-preview.png +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/video-script.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/demo/walkthrough.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/design-audit/v1.9/01-start.png +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/design-audit/v1.9/02-pass-decision.png +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/design-audit/v1.9/03-invalid-json-stale-decision.png +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/design-audit/v1.9/04-fixed-pass-decision.png +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/design-audit/v1.9/05-fixed-invalid-json.png +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/design-audit/v1.9/workbench-audit.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/engineering/export-your-first-trace.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/engineering/handbook.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/engineering/observability.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/engineering/testing-strategy.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/evaluation/answer-length-budget.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/evaluation/benchmark-report-v0.2.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/evaluation/evaluator-gates.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/evaluation/red-team-plan.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/evaluation/scenario-taxonomy.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/evaluation/strategy.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/getting-started.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/gtm/design-partner-outreach.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/gtm/design-partner-pilot-runbook.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/gtm/github-launch-checklist.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/gtm/pilot-fixtures/synthetic-economics.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/gtm/pilot-fixtures/synthetic-manifest.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/gtm/pilot-fixtures/synthetic-observations.jsonl +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/gtm/pilot-measurement-plan.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/gtm/synthetic-pilot-report.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/product/commercialization.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/product/competitive-analysis.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/product/jobs-to-be-done.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/product/oss-launch-plan.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/product/personas.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/product/product_thesis.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/product/requirements-v0.1.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/product/requirements-v0.2.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/product/requirements-v1.5.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/product/requirements-v1.6.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/product/requirements-v1.7.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/product/requirements-v1.8.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/product/requirements-v2.0.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/product/success-metrics.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/backlog.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/charter.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/decision-log.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/m1-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/m2-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/m3-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/m4-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/m5-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/milestones.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/release-plan.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/risk-register.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/v1-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/v1.5-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/v1.6-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/v1.7-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/v1.8-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/project/work-breakdown.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/releases/v1.5.0.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/releases/v1.6.0.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/releases/v1.7.0.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/releases/v1.8.0.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/docs/releases/v2.0.0.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/__init__.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/README.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/__init__.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/agent.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/architecture.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/cli.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/data/documents.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/data/graph.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/discovery.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/executive-report.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/results/comparison.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/results/graph-traces.jsonl +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/results/lexical-traces.jsonl +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/rollout-plan.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/scenario.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/suite.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/opentelemetry_trace_adapter/README.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/opentelemetry_trace_adapter/__init__.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/opentelemetry_trace_adapter/adapter.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/examples/opentelemetry_trace_adapter/spans.jsonl +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/ragops.toml +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/attack-pack.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/benchmark-adversarial.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/benchmark-baseline.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/benchmark-regressed.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/benchmark-v0.2.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/evaluation-policy.toml +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/regressed_responses.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/sample_responses.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/sample_traces.jsonl +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/scenario.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/schemas/attack-pack-0.1.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/schemas/pilot-economics-0.1.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/schemas/pilot-manifest-0.1.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/schemas/pilot-observation-0.1.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/schemas/report-0.2.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/schemas/response-fixture-0.2.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/schemas/responses-0.1.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/schemas/scenario-0.1.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/schemas/scenario-0.2.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/schemas/trace-0.3.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/schemas/trace-0.4.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/site/apple-touch-icon.png +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/site/favicon.png +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/site/styles.css +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/skills/ragops-feature/SKILL.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/skills/ragops-presentation/SKILL.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/skills/ragops-release/SKILL.md +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/adapters/http.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/benchmarks.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/config.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/control_plane.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/demo.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/evaluators.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/loader.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/models.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/pilot.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/plugins.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/providers/__init__.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/providers/openai_responses.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/reporters.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/store.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/src/ragops/traces.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_answer_length_cli.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_api_contract.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_benchmarks.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_comparison.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_config.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_control_plane.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_demo.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_engine.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_evaluator_depth.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_github_workflows.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_http_adapter.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_loader.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_openai_provider.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_opentelemetry_adapter.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_pilot.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_plugins_and_traces.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_pr_comment_publisher.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_readme_visuals.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_reference_agent.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_reference_benchmark.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_release_version.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_response_fixtures.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_scenario_v02_and_attacks.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_schema_files.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_store_and_html.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_team_workflow.py +0 -0
- {ragops-2.0.0 → ragops-2.1.0}/tests/test_workbench.py +0 -0
|
@@ -4,6 +4,17 @@ All notable changes follow Keep a Changelog. This project uses Semantic Versioni
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [2.1.0] - 2026-07-13
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Portable external metric envelope and dependency-free evaluator bridge for
|
|
12
|
+
per-case scores exported by Ragas, DeepEval, Langfuse, or internal judges.
|
|
13
|
+
- CLI support for external metrics in both absolute evaluation and baseline
|
|
14
|
+
comparison, with exact coverage/provider/metric compatibility checks.
|
|
15
|
+
- Copyable downstream GitHub PR-comment publisher recipe with a commit-pinned
|
|
16
|
+
trusted publisher checkout and explicit workflow-name allowlist.
|
|
17
|
+
|
|
7
18
|
## [2.0.0] - 2026-07-13
|
|
8
19
|
|
|
9
20
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ragops
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.1.0
|
|
4
4
|
Summary: Evaluation and red-team release gates for RAG and agent systems
|
|
5
5
|
Project-URL: Homepage, https://github.com/thangldw/ragops
|
|
6
6
|
Project-URL: Documentation, https://github.com/thangldw/ragops#readme
|
|
@@ -65,6 +65,8 @@ optional.
|
|
|
65
65
|
- Exports JSON, Markdown, and standalone HTML evidence for review and CI.
|
|
66
66
|
- Supports Python, CLI, an optional FastAPI adapter, and portable JSONL traces.
|
|
67
67
|
- Keeps scenarios, policies, and reports versioned and provider-independent.
|
|
68
|
+
- Gates portable per-case metrics exported by Ragas, DeepEval, Langfuse, or
|
|
69
|
+
internal judges without adding those frameworks to the core.
|
|
68
70
|
|
|
69
71
|
## How the release gate works
|
|
70
72
|
|
|
@@ -92,7 +94,7 @@ ragops demo --output ragops-demo
|
|
|
92
94
|
For the latest published stable CLI without cloning the repository:
|
|
93
95
|
|
|
94
96
|
```bash
|
|
95
|
-
pip install ragops==2.
|
|
97
|
+
pip install ragops==2.1.0
|
|
96
98
|
ragops demo --output ragops-demo
|
|
97
99
|
```
|
|
98
100
|
|
|
@@ -134,7 +136,7 @@ validate the harness and architecture comparison; they do not establish
|
|
|
134
136
|
Japanese semantic quality, customer adoption, or production ROI.
|
|
135
137
|
|
|
136
138
|
The repository currently validates its core, adapters, reference deployment,
|
|
137
|
-
showcase, and demo paths with
|
|
139
|
+
showcase, and demo paths with 138 automated tests.
|
|
138
140
|
|
|
139
141
|
<p align="center">
|
|
140
142
|
<img src="docs/demo/infographics/evidence-stack.svg" alt="RAGOps evidence stack combining quality, safety, operational budgets, and regression comparison into a release decision" width="100%">
|
|
@@ -173,6 +175,10 @@ Promote selected evaluator metrics or finding severities into release gates
|
|
|
173
175
|
with an explicit [evaluation policy](docs/evaluation/evaluator-gates.md). The
|
|
174
176
|
same evaluator and gate options are available on `evaluate` and `compare`.
|
|
175
177
|
|
|
178
|
+
Already use another evaluator stack? Export per-case results through the
|
|
179
|
+
[portable external metric envelope](docs/engineering/provider-adapters.md#external-evaluator-metrics)
|
|
180
|
+
and gate namespaced scores without installing that framework into RAGOps.
|
|
181
|
+
|
|
176
182
|
Add a deterministic Unicode code-point budget when response length matters:
|
|
177
183
|
|
|
178
184
|
```bash
|
|
@@ -34,6 +34,8 @@ optional.
|
|
|
34
34
|
- Exports JSON, Markdown, and standalone HTML evidence for review and CI.
|
|
35
35
|
- Supports Python, CLI, an optional FastAPI adapter, and portable JSONL traces.
|
|
36
36
|
- Keeps scenarios, policies, and reports versioned and provider-independent.
|
|
37
|
+
- Gates portable per-case metrics exported by Ragas, DeepEval, Langfuse, or
|
|
38
|
+
internal judges without adding those frameworks to the core.
|
|
37
39
|
|
|
38
40
|
## How the release gate works
|
|
39
41
|
|
|
@@ -61,7 +63,7 @@ ragops demo --output ragops-demo
|
|
|
61
63
|
For the latest published stable CLI without cloning the repository:
|
|
62
64
|
|
|
63
65
|
```bash
|
|
64
|
-
pip install ragops==2.
|
|
66
|
+
pip install ragops==2.1.0
|
|
65
67
|
ragops demo --output ragops-demo
|
|
66
68
|
```
|
|
67
69
|
|
|
@@ -103,7 +105,7 @@ validate the harness and architecture comparison; they do not establish
|
|
|
103
105
|
Japanese semantic quality, customer adoption, or production ROI.
|
|
104
106
|
|
|
105
107
|
The repository currently validates its core, adapters, reference deployment,
|
|
106
|
-
showcase, and demo paths with
|
|
108
|
+
showcase, and demo paths with 138 automated tests.
|
|
107
109
|
|
|
108
110
|
<p align="center">
|
|
109
111
|
<img src="docs/demo/infographics/evidence-stack.svg" alt="RAGOps evidence stack combining quality, safety, operational budgets, and regression comparison into a release decision" width="100%">
|
|
@@ -142,6 +144,10 @@ Promote selected evaluator metrics or finding severities into release gates
|
|
|
142
144
|
with an explicit [evaluation policy](docs/evaluation/evaluator-gates.md). The
|
|
143
145
|
same evaluator and gate options are available on `evaluate` and `compare`.
|
|
144
146
|
|
|
147
|
+
Already use another evaluator stack? Export per-case results through the
|
|
148
|
+
[portable external metric envelope](docs/engineering/provider-adapters.md#external-evaluator-metrics)
|
|
149
|
+
and gate namespaced scores without installing that framework into RAGOps.
|
|
150
|
+
|
|
145
151
|
Add a deterministic Unicode code-point budget when response length matters:
|
|
146
152
|
|
|
147
153
|
```bash
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# ADR 0018: Portable external metric envelope
|
|
2
|
+
|
|
3
|
+
- Status: Accepted for implementation
|
|
4
|
+
- Date: 2026-07-13
|
|
5
|
+
- Owner authorization: continued staged implementation and release requested by
|
|
6
|
+
Thang on 2026-07-13
|
|
7
|
+
|
|
8
|
+
## Context
|
|
9
|
+
|
|
10
|
+
RAGOps should compete as a portable release-policy and evidence layer rather
|
|
11
|
+
than by recreating every evaluator in Ragas, DeepEval, Langfuse, or private
|
|
12
|
+
model-quality stacks. Native export formats are dependency-specific and change
|
|
13
|
+
outside RAGOps release control.
|
|
14
|
+
|
|
15
|
+
## Decision
|
|
16
|
+
|
|
17
|
+
Define one versioned JSON envelope containing a provider identifier and one
|
|
18
|
+
finite numeric metric map per scenario case. A dependency-free adapter exposes
|
|
19
|
+
that envelope through the existing `CaseEvaluator` protocol. Aggregate metric
|
|
20
|
+
keys are namespaced as `<provider>.<metric>` and therefore work with the v2.0
|
|
21
|
+
evaluation policy without special gate logic.
|
|
22
|
+
|
|
23
|
+
Evaluate requires exact scenario coverage. Compare uses distinct baseline and
|
|
24
|
+
candidate envelopes, requires the same provider and per-case metric sets, and
|
|
25
|
+
then reports ordinary aggregate deltas. RAGOps never changes metric direction,
|
|
26
|
+
scale, calibration, or meaning; the policy author owns those decisions.
|
|
27
|
+
|
|
28
|
+
Framework integrations should export into this stable envelope outside the
|
|
29
|
+
core. Native format parsers may be optional adapters in the future, but cannot
|
|
30
|
+
silently redefine the canonical envelope.
|
|
31
|
+
|
|
32
|
+
## Compatibility impact
|
|
33
|
+
|
|
34
|
+
The envelope, adapter, and CLI options are additive. Omitted external metrics
|
|
35
|
+
preserve existing reports and decisions. Report schema already permits numeric
|
|
36
|
+
metric and delta keys.
|
|
37
|
+
|
|
38
|
+
## Consequences
|
|
39
|
+
|
|
40
|
+
- Teams can reuse existing evaluator investments while centralizing release
|
|
41
|
+
governance in RAGOps.
|
|
42
|
+
- Framework upgrades do not force changes to the dependency-free core.
|
|
43
|
+
- Metric comparability and calibration remain explicit owner responsibilities.
|
|
@@ -15,7 +15,7 @@ not customer production adoption.
|
|
|
15
15
|
candidate with 25-point citation coverage/precision regressions. The fixture
|
|
16
16
|
validates harness behavior, not Japanese semantic quality.
|
|
17
17
|
- Published architecture decisions, threat model, rollout plan, executive
|
|
18
|
-
go/no-go recommendation, reproducible reports, and
|
|
18
|
+
go/no-go recommendation, reproducible reports, and 138 automated tests.
|
|
19
19
|
|
|
20
20
|
## LinkedIn project description
|
|
21
21
|
|
|
@@ -22,7 +22,7 @@ jobs:
|
|
|
22
22
|
release-gate:
|
|
23
23
|
uses: thangldw/ragops/.github/workflows/ragops-gate.yml@main
|
|
24
24
|
with:
|
|
25
|
-
ragops-version: v2.
|
|
25
|
+
ragops-version: v2.1.0
|
|
26
26
|
scenario: evals/scenario.json
|
|
27
27
|
baseline: evals/baseline.json
|
|
28
28
|
candidate: evals/candidate.json
|
|
@@ -82,3 +82,30 @@ The publisher has `actions: read`, `contents: read`, and
|
|
|
82
82
|
Copying the publisher to another repository requires changing
|
|
83
83
|
`RAGOPS_SOURCE_WORKFLOW` and the `workflow_run.workflows` allowlist to the exact
|
|
84
84
|
caller workflow name.
|
|
85
|
+
|
|
86
|
+
For a downstream repository, copy
|
|
87
|
+
[`docs/examples/github-pr-comment.yml`](../examples/github-pr-comment.yml) to
|
|
88
|
+
`.github/workflows/ragops-pr-comment.yml`. The example assumes the read-only
|
|
89
|
+
caller workflow has the exact top-level name `RAGOps`, matching the caller
|
|
90
|
+
recipe above. If it has another name, change both of these values to the same
|
|
91
|
+
exact string:
|
|
92
|
+
|
|
93
|
+
```yaml
|
|
94
|
+
on:
|
|
95
|
+
workflow_run:
|
|
96
|
+
workflows: ["Your exact caller workflow name"]
|
|
97
|
+
|
|
98
|
+
env:
|
|
99
|
+
RAGOPS_SOURCE_WORKFLOW: Your exact caller workflow name
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
The recipe checks out publisher code from a reviewed RAGOps commit into a
|
|
103
|
+
separate path. It does not checkout the pull-request head, restore its cache,
|
|
104
|
+
execute its artifacts, or use `pull_request_target`. Keep that commit pin under
|
|
105
|
+
dependency review when upgrading.
|
|
106
|
+
|
|
107
|
+
GitHub must associate the source run with exactly one pull request. A fork PR
|
|
108
|
+
is publishable when GitHub supplies that single association; otherwise the
|
|
109
|
+
publisher fails closed without writing a comment. The source workflow remains
|
|
110
|
+
the required branch-protection check. The publisher only improves visibility
|
|
111
|
+
and never converts a blocked gate into a passing check.
|
|
@@ -19,7 +19,7 @@ Set these repository-relative variables:
|
|
|
19
19
|
|
|
20
20
|
```yaml
|
|
21
21
|
variables:
|
|
22
|
-
RAGOPS_VERSION: "2.
|
|
22
|
+
RAGOPS_VERSION: "2.1.0"
|
|
23
23
|
RAGOPS_SCENARIO: "evaluation/scenario.json"
|
|
24
24
|
RAGOPS_BASELINE: "evaluation/baseline.json"
|
|
25
25
|
RAGOPS_CANDIDATE: "evaluation/candidate.json"
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Provider adapters
|
|
2
|
+
|
|
3
|
+
RAGOps core remains provider-neutral and dependency-free. Optional adapters may
|
|
4
|
+
generate application outputs, but evaluation consumes the same portable trace
|
|
5
|
+
contract regardless of provider.
|
|
6
|
+
|
|
7
|
+
## OpenAI Responses API
|
|
8
|
+
|
|
9
|
+
`OpenAIResponsesAdapter` sends an explicit model and input to
|
|
10
|
+
`POST /v1/responses`, extracts text output, and records response/model/token
|
|
11
|
+
metadata. The model has no default: production evaluations should pin a chosen
|
|
12
|
+
model or snapshot rather than silently following an alias.
|
|
13
|
+
|
|
14
|
+
The adapter follows the official Responses API/model guidance:
|
|
15
|
+
https://developers.openai.com/api/docs/models
|
|
16
|
+
|
|
17
|
+
```python
|
|
18
|
+
from ragops.providers import OpenAIResponsesAdapter
|
|
19
|
+
|
|
20
|
+
adapter = OpenAIResponsesAdapter(
|
|
21
|
+
api_key=os.environ["OPENAI_API_KEY"],
|
|
22
|
+
model=os.environ["RAGOPS_OPENAI_MODEL"],
|
|
23
|
+
)
|
|
24
|
+
result = adapter.generate(
|
|
25
|
+
instructions="Answer only from approved evidence and cite sources.",
|
|
26
|
+
input_text=question,
|
|
27
|
+
)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
No live provider test runs in public CI. Tests inject a recorded transport so
|
|
31
|
+
contributors do not need credentials and secrets never enter fixtures.
|
|
32
|
+
|
|
33
|
+
## External evaluator metrics
|
|
34
|
+
|
|
35
|
+
RAGOps does not require teams to replace Ragas, DeepEval, Langfuse, or an
|
|
36
|
+
internal judge. Export their per-case numeric results into the versioned
|
|
37
|
+
`external-metrics-0.1` envelope:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"schema_version": "0.1",
|
|
42
|
+
"provider": "ragas",
|
|
43
|
+
"records": [
|
|
44
|
+
{
|
|
45
|
+
"case_id": "error-e42",
|
|
46
|
+
"metrics": {"faithfulness": 0.96, "answer_relevance": 0.94}
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
RAGOps preserves the supplied scale and meaning. It only validates coverage and
|
|
53
|
+
finite numeric values, namespaces the metrics, aggregates them, and applies the
|
|
54
|
+
reviewed release policy.
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
ragops evaluate \
|
|
58
|
+
--scenario scenarios/japanese_troubleshooting/scenario.json \
|
|
59
|
+
--responses scenarios/japanese_troubleshooting/sample_responses.json \
|
|
60
|
+
--external-metrics scenarios/japanese_troubleshooting/external-metrics-baseline.json \
|
|
61
|
+
--evaluation-policy scenarios/japanese_troubleshooting/external-metric-policy.toml
|
|
62
|
+
|
|
63
|
+
ragops compare \
|
|
64
|
+
--scenario scenarios/japanese_troubleshooting/scenario.json \
|
|
65
|
+
--baseline scenarios/japanese_troubleshooting/sample_responses.json \
|
|
66
|
+
--candidate scenarios/japanese_troubleshooting/sample_responses.json \
|
|
67
|
+
--baseline-external-metrics scenarios/japanese_troubleshooting/external-metrics-baseline.json \
|
|
68
|
+
--candidate-external-metrics scenarios/japanese_troubleshooting/external-metrics-candidate.json \
|
|
69
|
+
--evaluation-policy scenarios/japanese_troubleshooting/external-metric-policy.toml
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
The second command intentionally returns exit code 2 because candidate
|
|
73
|
+
faithfulness is below policy. Native framework export parsing stays outside the
|
|
74
|
+
dependency-free core so vendor upgrades cannot silently change the RAGOps
|
|
75
|
+
contract.
|
|
@@ -9,10 +9,10 @@ PyPI API token and publishes only an existing tag whose `vX.Y.Z` value matches
|
|
|
9
9
|
|
|
10
10
|
- Project: [ragops on PyPI](https://pypi.org/project/ragops/)
|
|
11
11
|
- First Trusted Publishing release: `1.6.0`
|
|
12
|
-
- Current verified release: `
|
|
12
|
+
- Current verified release: `2.0.0`
|
|
13
13
|
- GitHub environment: `pypi`
|
|
14
14
|
- Publisher: `thangldw/ragops`, workflow `publish-pypi.yml`
|
|
15
|
-
- Verification:
|
|
15
|
+
- Verification: 2.0.0 wheel and sdist present; clean install and
|
|
16
16
|
credential-free proposal-review demo pass
|
|
17
17
|
|
|
18
18
|
## One-time owner setup
|
|
@@ -32,7 +32,7 @@ GitHub's current OIDC guidance is linked from the
|
|
|
32
32
|
## Publish an accepted tag
|
|
33
33
|
|
|
34
34
|
1. Open **Actions → Publish package to PyPI → Run workflow**.
|
|
35
|
-
2. Enter an existing tag such as `
|
|
35
|
+
2. Enter an existing tag such as `v2.0.0`.
|
|
36
36
|
3. Approve the `pypi` environment when protection rules require it.
|
|
37
37
|
4. After success, install in a clean environment and compare the installed
|
|
38
38
|
version and wheel hash with the GitHub Release asset.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: RAGOps PR comment publisher
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_run:
|
|
5
|
+
# Must exactly match the top-level name of the read-only caller workflow.
|
|
6
|
+
workflows: ["RAGOps"]
|
|
7
|
+
types: [completed]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
actions: read
|
|
11
|
+
contents: read
|
|
12
|
+
pull-requests: write
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
publish:
|
|
16
|
+
if: github.event.workflow_run.event == 'pull_request'
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
steps:
|
|
19
|
+
- name: Checkout reviewed RAGOps publisher code
|
|
20
|
+
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
21
|
+
with:
|
|
22
|
+
repository: thangldw/ragops
|
|
23
|
+
ref: e3139cc03ffcf522803e2e3e4ef141f37ee4fbf8 # v2.0.0
|
|
24
|
+
path: .ragops-publisher
|
|
25
|
+
persist-credentials: false
|
|
26
|
+
- name: Validate evidence and publish one idempotent comment
|
|
27
|
+
env:
|
|
28
|
+
GITHUB_TOKEN: ${{ github.token }}
|
|
29
|
+
RAGOPS_SOURCE_WORKFLOW: RAGOps
|
|
30
|
+
run: python .ragops-publisher/apps/github_pr_comment.py
|
|
@@ -2,7 +2,7 @@ ragops_release_gate:
|
|
|
2
2
|
stage: test
|
|
3
3
|
image: python:3.12-slim
|
|
4
4
|
variables:
|
|
5
|
-
RAGOPS_VERSION: "2.
|
|
5
|
+
RAGOPS_VERSION: "2.1.0"
|
|
6
6
|
RAGOPS_SCENARIO: "scenarios/japanese_troubleshooting/benchmark-v0.2.json"
|
|
7
7
|
RAGOPS_BASELINE: "scenarios/japanese_troubleshooting/benchmark-baseline.json"
|
|
8
8
|
RAGOPS_CANDIDATE: "scenarios/japanese_troubleshooting/benchmark-regressed.json"
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Requirements v2.1 — portable external metric evidence
|
|
2
|
+
|
|
3
|
+
## User stories
|
|
4
|
+
|
|
5
|
+
1. As a release owner already using Ragas, DeepEval, Langfuse, or an internal
|
|
6
|
+
judge, I want to import per-case scores without replacing my evaluator stack.
|
|
7
|
+
2. As a CI owner, I want imported scores to pass through the same deterministic
|
|
8
|
+
policy and comparison engine as built-in metrics.
|
|
9
|
+
3. As a reviewer, I want provider identity and canonical metric names visible in
|
|
10
|
+
reports so that the source of a release gate is auditable.
|
|
11
|
+
4. As an adopter, I want a copyable PR publisher recipe whose workflow-name
|
|
12
|
+
allowlist and trust boundary are explicit.
|
|
13
|
+
|
|
14
|
+
## Public contract impact
|
|
15
|
+
|
|
16
|
+
- Add external metric envelope schema 0.1 with provider, per-case metric maps,
|
|
17
|
+
and exact scenario coverage.
|
|
18
|
+
- Add `--external-metrics` to `evaluate` and repeatable baseline/candidate-shared
|
|
19
|
+
external metric inputs to `compare`.
|
|
20
|
+
- Aggregate imported metrics under `<provider>.<metric>` and expose them to the
|
|
21
|
+
existing evaluation policy without changing their meaning.
|
|
22
|
+
- Add a downstream-repository publisher recipe and setup guide. The privileged
|
|
23
|
+
publisher remains isolated from untrusted PR execution.
|
|
24
|
+
|
|
25
|
+
## Acceptance criteria
|
|
26
|
+
|
|
27
|
+
1. Envelope provider is one of `ragas`, `deepeval`, `langfuse`, or `custom` and
|
|
28
|
+
all case IDs are unique.
|
|
29
|
+
2. Imported metric names are non-empty, values are finite numbers, booleans are
|
|
30
|
+
rejected, and every scenario case has exactly one metric record.
|
|
31
|
+
3. Evaluate can gate an imported metric using the existing minimum/maximum
|
|
32
|
+
evaluation policy.
|
|
33
|
+
4. Compare accepts distinct baseline and candidate envelopes from the same
|
|
34
|
+
provider with identical metric names and reports their deltas.
|
|
35
|
+
5. Provider, coverage, missing cases, extra cases, and metric-set mismatch fail
|
|
36
|
+
closed with actionable contract errors.
|
|
37
|
+
6. Existing CLI and Python behavior is unchanged when no external metrics are
|
|
38
|
+
supplied.
|
|
39
|
+
7. The downstream publisher recipe documents the exact source workflow name,
|
|
40
|
+
permissions, artifact contract, marker behavior, and fork limitation.
|
|
41
|
+
8. Ruff, unit/negative/CLI/workflow tests, and the full Python matrix pass.
|
|
42
|
+
|
|
43
|
+
## Non-goals
|
|
44
|
+
|
|
45
|
+
- Importing unstable native vendor export formats directly into the core.
|
|
46
|
+
- Installing Ragas, DeepEval, Langfuse, model SDKs, or network clients.
|
|
47
|
+
- Reinterpreting, normalizing, calibrating, or comparing semantically different
|
|
48
|
+
third-party metrics.
|
|
49
|
+
- Running provider-backed judges inside the release gate.
|
|
50
|
+
- Claiming external framework endorsement or production adoption.
|
|
@@ -76,6 +76,14 @@ PR comment integration and notifications remain hosted/integration work.
|
|
|
76
76
|
- Fail-closed API authentication, bounded input, and explicit local dev mode.
|
|
77
77
|
- Synthetic benchmark positioning and evidence-safe workbench error states.
|
|
78
78
|
|
|
79
|
+
## 2.1 — portable external evaluator evidence
|
|
80
|
+
|
|
81
|
+
- Versioned per-case external metric envelope for Ragas, DeepEval, Langfuse,
|
|
82
|
+
and internal judges.
|
|
83
|
+
- Shared absolute gate semantics and baseline/candidate deltas without provider
|
|
84
|
+
dependencies in the core.
|
|
85
|
+
- Copyable downstream PR-comment publisher recipe with explicit trust boundary.
|
|
86
|
+
|
|
79
87
|
## 3.0 — hosted control plane (local alpha boundary implemented)
|
|
80
88
|
|
|
81
89
|
- Workspace isolation, SSO/RBAC, audit retention, managed ingestion, and
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
## Outcome
|
|
4
4
|
|
|
5
5
|
The repository now implements the complete locally executable program defined
|
|
6
|
-
in the FDE blueprint: product strategy, open-source evaluation core,
|
|
7
|
-
|
|
6
|
+
in the FDE blueprint: product strategy, open-source evaluation core, synthetic
|
|
7
|
+
Japanese-question release-gate fixture, red-team contracts, reference GraphRAG-style deployment,
|
|
8
8
|
portable observability evidence, team review workflow, control-plane alpha, and
|
|
9
9
|
public presentation assets.
|
|
10
10
|
|
|
@@ -22,13 +22,14 @@ public presentation assets.
|
|
|
22
22
|
| v1.6 pull-request adoption path | Released | `docs/project/v1.6-acceptance.md` |
|
|
23
23
|
| v1.7 broader adoption proof | Released | `docs/project/v1.7-acceptance.md` |
|
|
24
24
|
| v1.8 review visibility and measured adoption | Released | `docs/project/v1.8-acceptance.md` |
|
|
25
|
-
| v2.0 trustworthy extensible release gates |
|
|
25
|
+
| v2.0 trustworthy extensible release gates | Released | `docs/project/v2.0-acceptance.md` |
|
|
26
|
+
| v2.1 portable external evaluator evidence | Release candidate | `docs/project/v2.1-acceptance.md` |
|
|
26
27
|
|
|
27
28
|
## FDE competency coverage
|
|
28
29
|
|
|
29
30
|
- **Discover:** ambiguous request, users, constraints, KPI hypothesis, scope.
|
|
30
31
|
- **Build:** ACL-first lexical+graph retrieval and controlled workflow agent.
|
|
31
|
-
- **Evaluate:** 30-case
|
|
32
|
+
- **Evaluate:** 30-case synthetic fixture, baseline/regression/adversarial candidates,
|
|
32
33
|
citations, claim support, latency, cost, and critical policy gates.
|
|
33
34
|
- **Deploy:** Docker/API/CLI, CI/nightly workflows, portable traces, rollout plan.
|
|
34
35
|
- **Measure:** experiment history, trends, review decisions, release evidence.
|
|
@@ -41,7 +42,9 @@ public presentation assets.
|
|
|
41
42
|
## Verification baseline
|
|
42
43
|
|
|
43
44
|
- Python 3.11+ dependency-free core.
|
|
44
|
-
-
|
|
45
|
+
- 126 automated tests on Python 3.11, 3.12, and 3.13 at the latest acceptance run.
|
|
46
|
+
- GitHub/PyPI distributions are byte-identical; GitHub Release includes a
|
|
47
|
+
reproducible CycloneDX SBOM, SHA-256 manifest, and provenance attestation.
|
|
45
48
|
- Ruff and diff checks pass.
|
|
46
49
|
- Baseline and reference deployment pass; regressed/adversarial builds return
|
|
47
50
|
expected release-blocking exit codes.
|
|
@@ -60,6 +63,6 @@ therefore launch activities rather than missing repository implementation:
|
|
|
60
63
|
|
|
61
64
|
## Final recommendation
|
|
62
65
|
|
|
63
|
-
Use release
|
|
66
|
+
Use release 2.0.0 for FDE interviews, OSS feedback, and customer discovery.
|
|
64
67
|
Proceed to a real offline design-partner pilot; do not market the control-plane
|
|
65
68
|
alpha as production SaaS or claim measured ROI until external evidence exists.
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
## Decision
|
|
4
4
|
|
|
5
|
-
**
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
**RELEASED as 2.0.0. The owner authorized staged implementation and release on
|
|
6
|
+
2026-07-13; release validation, GitHub CI, GitHub publication, and PyPI
|
|
7
|
+
promotion all passed.**
|
|
8
8
|
|
|
9
9
|
## Contract impact
|
|
10
10
|
|
|
@@ -37,6 +37,9 @@ this incompatible correction establishes the 2.0 major boundary.
|
|
|
37
37
|
| Package discovery | Pass | Project URLs, classifiers, and keywords added to package metadata |
|
|
38
38
|
| Core quality | Pass | Actionlint and Ruff clean; 126 tests pass locally in clean Python 3.12 and 3.13 dev/API environments |
|
|
39
39
|
| Reusable release gate | Pass | [Run 29220368893](https://github.com/thangldw/ragops/actions/runs/29220368893) passes against the release PR head revision |
|
|
40
|
+
| GitHub publication | Pass | [v2.0.0](https://github.com/thangldw/ragops/releases/tag/v2.0.0) includes wheel, source, CycloneDX SBOM, and SHA-256 manifest; [run 29220431136](https://github.com/thangldw/ragops/actions/runs/29220431136) attested them |
|
|
41
|
+
| PyPI promotion | Pass | [Run 29220474540](https://github.com/thangldw/ragops/actions/runs/29220474540) verified release checksums and published the exact wheel/sdist; public hashes match GitHub byte-for-byte |
|
|
42
|
+
| Public install | Pass | Clean Python 3.12 install of `ragops[api]==2.0.0` reports 2.0.0 and runs the proposal-review demo |
|
|
40
43
|
|
|
41
44
|
## Limitations
|
|
42
45
|
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# v2.1 portable external evaluator evidence acceptance
|
|
2
|
+
|
|
3
|
+
## Decision
|
|
4
|
+
|
|
5
|
+
**GO for release 2.1.0. The owner authorized continued staged implementation
|
|
6
|
+
and release on 2026-07-13. Public publication remains conditional on release
|
|
7
|
+
validation and green GitHub CI.**
|
|
8
|
+
|
|
9
|
+
## Contract impact
|
|
10
|
+
|
|
11
|
+
The external metric envelope, adapter, evaluator-set comparison options, CLI
|
|
12
|
+
flags, schema, and downstream publisher recipe are additive. Existing defaults
|
|
13
|
+
and metric meanings remain unchanged. Imported metric semantics remain owned by
|
|
14
|
+
the producing framework and reviewed policy.
|
|
15
|
+
|
|
16
|
+
## Acceptance evidence
|
|
17
|
+
|
|
18
|
+
| Gate | Result | Evidence |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| Requirement and ADR | Pass | Requirements v2.1 and ADR 0018 define portable evidence without vendor dependencies |
|
|
21
|
+
| External envelope | Pass | Provider enum, unique case IDs, exact coverage, consistent metric names, and finite numbers enforced |
|
|
22
|
+
| Evaluation gate | Pass | Passing baseline scores aggregate under `ragas.*`; configured minimums remain satisfied and exit 0 |
|
|
23
|
+
| Comparison gate | Pass | Candidate faithfulness 0.825 fails minimum 0.90; compare exits 2 and reports delta -0.145 |
|
|
24
|
+
| Fail-closed negatives | Pass | Missing/extra cases, provider mismatch, metric mismatch, booleans, NaN, infinity, strings, and unknown fields rejected |
|
|
25
|
+
| Core boundary | Pass | No Ragas, DeepEval, Langfuse, model SDK, or runtime dependency added |
|
|
26
|
+
| Downstream publisher | Pass | Actionlint clean; commit-pinned trusted checkout, exact allowlist, least privileges, and no PR-code execution |
|
|
27
|
+
| Core quality | Pass | Ruff clean and 138 tests pass locally; feature PR passed Python 3.11, 3.12, and 3.13 |
|
|
28
|
+
| Release supply chain | Pending | v2.1 tag must prove build-once, SBOM, checksums, provenance, and byte-identical PyPI promotion |
|
|
29
|
+
|
|
30
|
+
## Limitations
|
|
31
|
+
|
|
32
|
+
- Native framework export conversion remains an upstream adapter responsibility.
|
|
33
|
+
- RAGOps does not establish cross-provider metric equivalence or calibration.
|
|
34
|
+
- No design-partner response or external adoption evidence exists yet.
|
|
35
|
+
- Repository branch protection remains an explicit owner setting.
|
|
36
|
+
- Security assessment remains deferred by owner instruction.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# RAGOps v2.1.0 — portable external evaluator evidence
|
|
2
|
+
|
|
3
|
+
RAGOps v2.1.0 lets teams keep Ragas, DeepEval, Langfuse, or internal judges as
|
|
4
|
+
metric producers while using RAGOps as the provider-independent release-policy
|
|
5
|
+
and evidence layer.
|
|
6
|
+
|
|
7
|
+
## Highlights
|
|
8
|
+
|
|
9
|
+
- Import a versioned per-case external metric envelope from `ragas`, `deepeval`,
|
|
10
|
+
`langfuse`, or `custom` sources without adding their SDKs to RAGOps.
|
|
11
|
+
- Validate exact scenario coverage, unique case IDs, consistent metric sets,
|
|
12
|
+
finite numeric values, and provider identity before evaluation.
|
|
13
|
+
- Gate imported aggregate metrics with the same evaluation-policy minimum and
|
|
14
|
+
maximum thresholds introduced in v2.0.
|
|
15
|
+
- Compare distinct baseline and candidate envelopes and report namespaced
|
|
16
|
+
external metric deltas alongside built-in evidence.
|
|
17
|
+
- Copy a downstream PR-comment publisher recipe that checks out reviewed
|
|
18
|
+
publisher code, uses an exact workflow-name allowlist, and preserves the
|
|
19
|
+
isolated least-privilege trust boundary.
|
|
20
|
+
|
|
21
|
+
## Compatibility
|
|
22
|
+
|
|
23
|
+
This is an additive minor release. Existing scenarios, response fixtures,
|
|
24
|
+
traces, evaluator plugins, API behavior, and omitted-external-metric decisions
|
|
25
|
+
remain unchanged. The external metric schema is new at version 0.1.
|
|
26
|
+
|
|
27
|
+
RAGOps does not reinterpret imported metric meaning, direction, scale, or
|
|
28
|
+
calibration. Policy owners must confirm that baseline and candidate scores are
|
|
29
|
+
comparable and choose appropriate thresholds.
|
|
30
|
+
|
|
31
|
+
## Known limits
|
|
32
|
+
|
|
33
|
+
Native vendor export formats are not parsed in the core. Each framework or
|
|
34
|
+
internal pipeline must map its output to the stable RAGOps envelope. Provider
|
|
35
|
+
SDKs, live judges, calibration, privacy controls, and network availability stay
|
|
36
|
+
outside the dependency-free core. No external adoption is claimed, and security
|
|
37
|
+
assessment remains deferred.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://ragops.dev/schemas/external-metrics-0.1.schema.json",
|
|
4
|
+
"title": "RAGOps external metric envelope 0.1",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schema_version", "provider", "records"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schema_version": {"const": "0.1"},
|
|
10
|
+
"provider": {"enum": ["ragas", "deepeval", "langfuse", "custom"]},
|
|
11
|
+
"records": {
|
|
12
|
+
"type": "array",
|
|
13
|
+
"minItems": 1,
|
|
14
|
+
"items": {
|
|
15
|
+
"type": "object",
|
|
16
|
+
"additionalProperties": false,
|
|
17
|
+
"required": ["case_id", "metrics"],
|
|
18
|
+
"properties": {
|
|
19
|
+
"case_id": {"type": "string", "minLength": 1},
|
|
20
|
+
"metrics": {
|
|
21
|
+
"type": "object",
|
|
22
|
+
"minProperties": 1,
|
|
23
|
+
"propertyNames": {"minLength": 1},
|
|
24
|
+
"additionalProperties": {"type": "number"}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|