ragops 2.0.0__tar.gz → 2.2.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.2.0}/.github/ISSUE_TEMPLATE/bug.yml +1 -1
- {ragops-2.0.0 → ragops-2.2.0}/.github/workflows/ragops-gate.yml +1 -1
- {ragops-2.0.0 → ragops-2.2.0}/CHANGELOG.md +19 -0
- ragops-2.2.0/NEXT_SESSION.md +195 -0
- {ragops-2.0.0 → ragops-2.2.0}/PKG-INFO +9 -3
- {ragops-2.0.0 → ragops-2.2.0}/README.md +8 -2
- ragops-2.2.0/docs/architecture/adr/0018-portable-external-metric-envelope.md +43 -0
- ragops-2.2.0/docs/architecture/adr/0019-local-release-fallback.md +22 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/cv-linkedin-copy.md +1 -1
- {ragops-2.0.0 → ragops-2.2.0}/docs/engineering/github-pr-gate.md +28 -1
- {ragops-2.0.0 → ragops-2.2.0}/docs/engineering/gitlab-ci-gate.md +1 -1
- ragops-2.2.0/docs/engineering/local-release.md +32 -0
- ragops-2.2.0/docs/engineering/provider-adapters.md +75 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/engineering/pypi-publishing.md +3 -3
- ragops-2.2.0/docs/examples/github-pr-comment.yml +30 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/examples/gitlab-ci-ragops.yml +1 -1
- ragops-2.2.0/docs/product/requirements-v2.1.md +50 -0
- ragops-2.2.0/docs/product/requirements-v2.2.md +24 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/product/roadmap.md +8 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/program-completion-audit.md +9 -6
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/v2.0-acceptance.md +6 -3
- ragops-2.2.0/docs/project/v2.1-acceptance.md +38 -0
- ragops-2.2.0/docs/project/v2.2-acceptance.md +29 -0
- ragops-2.2.0/docs/releases/v2.1.0.md +37 -0
- ragops-2.2.0/docs/releases/v2.2.0.md +27 -0
- {ragops-2.0.0 → ragops-2.2.0}/pyproject.toml +1 -1
- ragops-2.2.0/scenarios/japanese_troubleshooting/external-metric-policy.toml +5 -0
- ragops-2.2.0/scenarios/japanese_troubleshooting/external-metrics-baseline.json +8 -0
- ragops-2.2.0/scenarios/japanese_troubleshooting/external-metrics-candidate.json +8 -0
- ragops-2.2.0/schemas/external-metrics-0.1.schema.json +30 -0
- ragops-2.2.0/scripts/local_release.py +153 -0
- {ragops-2.0.0 → ragops-2.2.0}/site/index.html +1 -1
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/__init__.py +1 -1
- ragops-2.2.0/src/ragops/adapters/__init__.py +16 -0
- ragops-2.2.0/src/ragops/adapters/external_metrics.py +134 -0
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/cli.py +50 -7
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/engine.py +15 -2
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_adoption_recipes.py +18 -1
- ragops-2.2.0/tests/test_external_metrics.py +192 -0
- ragops-2.2.0/tests/test_local_release.py +31 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_public_api.py +1 -1
- {ragops-2.0.0 → ragops-2.2.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.2.0}/.dockerignore +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/.github/ISSUE_TEMPLATE/design-partner.yml +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/.github/ISSUE_TEMPLATE/evaluator.yml +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/.github/pull_request_template.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/.github/workflows/ci.yml +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/.github/workflows/nightly.yml +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/.github/workflows/pages.yml +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/.github/workflows/publish-pypi.yml +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/.github/workflows/ragops-gate-smoke.yml +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/.github/workflows/ragops-pr-comment.yml +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/.github/workflows/release.yml +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/.gitignore +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/AGENTS.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/CODE_OF_CONDUCT.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/CONTRIBUTING.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/Dockerfile +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/LICENSE +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/SECURITY.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/SUPPORT.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/apps/__init__.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/apps/api/__init__.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/apps/api/main.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/apps/github_pr_comment.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/apps/web/index.html +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/compose.yaml +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/design-qa.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0001-local-first-core.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0002-baseline-regression-gates.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0003-reference-app-outside-core.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0004-open-core-boundary.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0005-scenario-0.2-metadata-and-citation-precision.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0006-response-fixture-overlays.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0007-offline-reference-graphrag-agent.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0008-local-team-review-workflow.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0009-adopt-mit-license.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0010-repair-trace-04-schema-json.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0011-reusable-pr-gate-is-an-adapter.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0012-opentelemetry-export-is-an-example-adapter.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0013-additive-demo-catalog-and-codepoint-budget.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0014-separate-pr-evaluation-from-comment-publication.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0015-portable-design-partner-measurement.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0016-first-class-evaluator-gates.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/adr/0017-api-authentication-and-input-bounds.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/component-diagram.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/context-diagram.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/control-plane-alpha.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/data-model.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/pr-comment-publishing.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/system-overview.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/architecture/threat-model.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/design-audit/01-current-desktop.jpg +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/design-audit/02-implementation-desktop.jpg +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/design-audit/04-implementation-mobile.jpg +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/design-audit/06-desktop-comparison.jpg +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/design-audit/09-limitations-section.jpg +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/design-audit/selected-open-source-adoption.png +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/infographics/evidence-stack.svg +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/infographics/release-gate-flow.svg +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/portfolio-case-study.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/portfolio-handoff.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/presentation-outline.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/screenshots/ragops-limitations-screen.jpg +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/screenshots/ragops-mobile-screen.jpg +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/screenshots/ragops-portfolio-desktop.jpg +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/screenshots/ragops-portfolio-mobile.jpg +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/screenshots/ragops-release-screen.jpg +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/screenshots/ragops-showcase-hero.jpg +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/social-preview.png +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/video-script.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/demo/walkthrough.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/design-audit/v1.9/01-start.png +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/design-audit/v1.9/02-pass-decision.png +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/design-audit/v1.9/03-invalid-json-stale-decision.png +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/design-audit/v1.9/04-fixed-pass-decision.png +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/design-audit/v1.9/05-fixed-invalid-json.png +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/design-audit/v1.9/workbench-audit.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/engineering/export-your-first-trace.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/engineering/handbook.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/engineering/observability.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/engineering/testing-strategy.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/evaluation/answer-length-budget.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/evaluation/benchmark-report-v0.2.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/evaluation/evaluator-gates.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/evaluation/red-team-plan.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/evaluation/scenario-taxonomy.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/evaluation/strategy.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/getting-started.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/gtm/design-partner-outreach.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/gtm/design-partner-pilot-runbook.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/gtm/github-launch-checklist.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/gtm/pilot-fixtures/synthetic-economics.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/gtm/pilot-fixtures/synthetic-manifest.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/gtm/pilot-fixtures/synthetic-observations.jsonl +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/gtm/pilot-measurement-plan.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/gtm/synthetic-pilot-report.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/product/commercialization.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/product/competitive-analysis.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/product/jobs-to-be-done.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/product/oss-launch-plan.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/product/personas.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/product/product_thesis.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/product/requirements-v0.1.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/product/requirements-v0.2.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/product/requirements-v1.5.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/product/requirements-v1.6.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/product/requirements-v1.7.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/product/requirements-v1.8.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/product/requirements-v2.0.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/product/success-metrics.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/backlog.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/charter.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/decision-log.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/m1-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/m2-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/m3-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/m4-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/m5-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/milestones.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/release-plan.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/risk-register.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/v1-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/v1.5-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/v1.6-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/v1.7-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/v1.8-acceptance.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/project/work-breakdown.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/releases/v1.5.0.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/releases/v1.6.0.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/releases/v1.7.0.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/releases/v1.8.0.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/docs/releases/v2.0.0.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/__init__.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/japanese_troubleshooting_agent/README.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/japanese_troubleshooting_agent/__init__.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/japanese_troubleshooting_agent/agent.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/japanese_troubleshooting_agent/architecture.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/japanese_troubleshooting_agent/cli.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/japanese_troubleshooting_agent/data/documents.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/japanese_troubleshooting_agent/data/graph.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/japanese_troubleshooting_agent/discovery.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/japanese_troubleshooting_agent/executive-report.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/japanese_troubleshooting_agent/results/comparison.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/japanese_troubleshooting_agent/results/graph-traces.jsonl +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/japanese_troubleshooting_agent/results/lexical-traces.jsonl +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/japanese_troubleshooting_agent/rollout-plan.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/japanese_troubleshooting_agent/scenario.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/japanese_troubleshooting_agent/suite.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/opentelemetry_trace_adapter/README.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/opentelemetry_trace_adapter/__init__.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/opentelemetry_trace_adapter/adapter.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/examples/opentelemetry_trace_adapter/spans.jsonl +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/ragops.toml +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/scenarios/japanese_troubleshooting/attack-pack.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/scenarios/japanese_troubleshooting/benchmark-adversarial.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/scenarios/japanese_troubleshooting/benchmark-baseline.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/scenarios/japanese_troubleshooting/benchmark-regressed.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/scenarios/japanese_troubleshooting/benchmark-v0.2.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/scenarios/japanese_troubleshooting/evaluation-policy.toml +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/scenarios/japanese_troubleshooting/regressed_responses.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/scenarios/japanese_troubleshooting/sample_responses.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/scenarios/japanese_troubleshooting/sample_traces.jsonl +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/scenarios/japanese_troubleshooting/scenario.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/schemas/attack-pack-0.1.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/schemas/pilot-economics-0.1.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/schemas/pilot-manifest-0.1.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/schemas/pilot-observation-0.1.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/schemas/report-0.2.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/schemas/response-fixture-0.2.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/schemas/responses-0.1.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/schemas/scenario-0.1.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/schemas/scenario-0.2.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/schemas/trace-0.3.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/schemas/trace-0.4.schema.json +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/site/apple-touch-icon.png +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/site/favicon.png +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/site/styles.css +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/skills/ragops-feature/SKILL.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/skills/ragops-presentation/SKILL.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/skills/ragops-release/SKILL.md +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/adapters/http.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/benchmarks.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/config.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/control_plane.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/demo.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/evaluators.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/loader.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/models.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/pilot.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/plugins.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/providers/__init__.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/providers/openai_responses.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/reporters.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/store.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/src/ragops/traces.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_answer_length_cli.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_api_contract.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_benchmarks.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_comparison.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_config.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_control_plane.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_demo.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_engine.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_evaluator_depth.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_github_workflows.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_http_adapter.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_loader.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_openai_provider.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_opentelemetry_adapter.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_pilot.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_plugins_and_traces.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_pr_comment_publisher.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_readme_visuals.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_reference_agent.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_reference_benchmark.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_release_version.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_response_fixtures.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_scenario_v02_and_attacks.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_schema_files.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_store_and_html.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_team_workflow.py +0 -0
- {ragops-2.0.0 → ragops-2.2.0}/tests/test_workbench.py +0 -0
|
@@ -4,6 +4,25 @@ All notable changes follow Keep a Changelog. This project uses Semantic Versioni
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [2.2.0] - 2026-07-13
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Quota-independent local release fallback with full offline validation,
|
|
12
|
+
build-once artifacts, reproducible SBOM, checksums, GitHub CLI publication,
|
|
13
|
+
and fail-closed optional PyPI token promotion.
|
|
14
|
+
|
|
15
|
+
## [2.1.0] - 2026-07-13
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- Portable external metric envelope and dependency-free evaluator bridge for
|
|
20
|
+
per-case scores exported by Ragas, DeepEval, Langfuse, or internal judges.
|
|
21
|
+
- CLI support for external metrics in both absolute evaluation and baseline
|
|
22
|
+
comparison, with exact coverage/provider/metric compatibility checks.
|
|
23
|
+
- Copyable downstream GitHub PR-comment publisher recipe with a commit-pinned
|
|
24
|
+
trusted publisher checkout and explicit workflow-name allowlist.
|
|
25
|
+
|
|
7
26
|
## [2.0.0] - 2026-07-13
|
|
8
27
|
|
|
9
28
|
### Added
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# RAGOps — handoff for 2026-07-14
|
|
2
|
+
|
|
3
|
+
> Superseded on 2026-07-13 by the staged completion run. RAGOps v1.8.0 and
|
|
4
|
+
> v2.0.0 and v2.1.0 were released and verified on GitHub and PyPI. The live BLOCK
|
|
5
|
+
> publisher path was proven through PR #7, including an idempotent update of the
|
|
6
|
+
> same comment. v2.0.0 adds first-class evaluator gates, unified compare
|
|
7
|
+
> semantics, strict numeric validation, fail-closed API authentication and
|
|
8
|
+
> bounds, synthetic benchmark positioning, Product Design remediation,
|
|
9
|
+
> Python 3.13 CI, build-once promotion, CycloneDX SBOM, checksums, provenance,
|
|
10
|
+
> and complete package metadata. v2.1.0 adds portable Ragas/DeepEval/Langfuse/
|
|
11
|
+
> custom metric evidence plus a downstream publisher recipe. Canonical evidence
|
|
12
|
+
> is in `docs/project/v2.1-acceptance.md`.
|
|
13
|
+
>
|
|
14
|
+
> Remaining items below that require real design partners, account-owner
|
|
15
|
+
> settings, credential rotation, hosted infrastructure, or an independent
|
|
16
|
+
> security assessment remain external owner work. They are not incomplete core
|
|
17
|
+
> implementation. Security testing stays deferred by explicit owner request.
|
|
18
|
+
|
|
19
|
+
This is a local-only working note. Do not treat unchecked items as shipped or
|
|
20
|
+
as customer evidence.
|
|
21
|
+
|
|
22
|
+
## Current verified state
|
|
23
|
+
|
|
24
|
+
- Branch: `main`
|
|
25
|
+
- Latest pushed commit: `deeaf7e` (`docs: record live publisher and partner outreach`)
|
|
26
|
+
- Latest public release: `v1.7.0` on GitHub and PyPI
|
|
27
|
+
- v1.8 scope: complete on `main`, not versioned or released
|
|
28
|
+
- Local quality gate: Ruff clean, 99 tests passing, 10 JSON schemas parsing
|
|
29
|
+
- PR publisher live proof: [PR #4](https://github.com/thangldw/ragops/pull/4)
|
|
30
|
+
created one PASS comment and updated the same comment for a second head SHA;
|
|
31
|
+
the PR was closed without merge and the temporary branch was deleted.
|
|
32
|
+
- Design-partner recruitment: [Discussion #5](https://github.com/thangldw/ragops/discussions/5)
|
|
33
|
+
is public. No reviewed real-partner observations or ROI evidence exist yet.
|
|
34
|
+
- Acceptance record: `docs/project/v1.8-acceptance.md`
|
|
35
|
+
|
|
36
|
+
## P0 — do before a v1.8 release
|
|
37
|
+
|
|
38
|
+
### 1. Verify the live BLOCK path
|
|
39
|
+
|
|
40
|
+
- [ ] Create a temporary PR that changes the reusable smoke candidate from the
|
|
41
|
+
passing baseline to `benchmark-regressed.json`.
|
|
42
|
+
- [ ] Confirm the release-gate workflow fails with exit `2`.
|
|
43
|
+
- [ ] Confirm the publisher still creates a `BLOCK` comment containing the
|
|
44
|
+
canonical workflow link and correct head SHA.
|
|
45
|
+
- [ ] Push a second commit and confirm the same bot comment is updated rather
|
|
46
|
+
than duplicated.
|
|
47
|
+
- [ ] Close without merge and delete the temporary branch.
|
|
48
|
+
- [ ] Record the PR/run/comment links in `docs/project/v1.8-acceptance.md`.
|
|
49
|
+
|
|
50
|
+
Why: PASS creation/update is proven live; BLOCK publication is covered by unit
|
|
51
|
+
tests but has not yet been exercised end to end on GitHub.
|
|
52
|
+
|
|
53
|
+
### 2. Decide whether to release v1.8.0
|
|
54
|
+
|
|
55
|
+
- [ ] Owner explicitly selects or rejects the v1.8.0 release boundary.
|
|
56
|
+
- [ ] If GO, use `skills/ragops-release/SKILL.md`.
|
|
57
|
+
- [ ] Bump `pyproject.toml`, `src/ragops/__init__.py`, workflow examples, tests,
|
|
58
|
+
README install command, and issue template from 1.7.0 to 1.8.0.
|
|
59
|
+
- [ ] Move Unreleased changelog entries into `1.8.0` and write
|
|
60
|
+
`docs/releases/v1.8.0.md`.
|
|
61
|
+
- [ ] Run Ruff, full tests on available Python versions, PASS/BLOCK fixtures,
|
|
62
|
+
pilot CLI, API health/evaluate, all schemas, build, wheel/sdist clean install,
|
|
63
|
+
and version-consistency checks.
|
|
64
|
+
- [ ] Tag and publish GitHub Release only after owner GO.
|
|
65
|
+
- [ ] Trigger PyPI Trusted Publishing for `v1.8.0`, then verify public wheel,
|
|
66
|
+
source distribution, clean install, and pilot command.
|
|
67
|
+
- [ ] Update v1.8 acceptance and launch checklist with public artifact evidence.
|
|
68
|
+
|
|
69
|
+
Important: the package metadata on `main` still says `1.7.0`; do not publish a
|
|
70
|
+
build from `main` until the release version is intentionally bumped.
|
|
71
|
+
|
|
72
|
+
## P0 — real design-partner work
|
|
73
|
+
|
|
74
|
+
### 3. Qualify the first design partner
|
|
75
|
+
|
|
76
|
+
- [ ] Review replies to Discussion #5; do not infer interest from views or stars.
|
|
77
|
+
- [ ] Select a team with an existing RAG/agent pilot, recurring regression pain,
|
|
78
|
+
a technical owner, and a workflow/business owner.
|
|
79
|
+
- [ ] Hold the 60-minute discovery using
|
|
80
|
+
`docs/gtm/design-partner-outreach.md`.
|
|
81
|
+
- [ ] Agree on one workflow, eligible cohort, baseline/pilot periods, exclusions,
|
|
82
|
+
primary targets, critical stop conditions, and decision owner.
|
|
83
|
+
- [ ] Obtain explicit consent for pseudonymous workflow measurement.
|
|
84
|
+
- [ ] Start with synthetic/redacted traces. Do not collect raw customer
|
|
85
|
+
documents, prompts, names, email addresses, credentials, or secrets.
|
|
86
|
+
|
|
87
|
+
### 4. Freeze and run the pilot contract
|
|
88
|
+
|
|
89
|
+
- [ ] Copy the synthetic manifest/observations/economics fixtures into a private,
|
|
90
|
+
partner-reviewed workspace; do not commit partner data to the public repo.
|
|
91
|
+
- [ ] Replace synthetic identifiers with pseudonymous IDs.
|
|
92
|
+
- [ ] Collect at least two weeks or 50 eligible baseline tasks when feasible.
|
|
93
|
+
- [ ] Freeze targets before pilot exposure.
|
|
94
|
+
- [ ] Collect pilot observations using the same task definition and exclusions.
|
|
95
|
+
- [ ] Run `ragops pilot-report` without economics first.
|
|
96
|
+
- [ ] Add economics only after the partner reviews hourly cost and pilot
|
|
97
|
+
investment assumptions.
|
|
98
|
+
- [ ] Review SCALE/HOLD/REDESIGN jointly and document owner sign-off.
|
|
99
|
+
- [ ] Publish no adoption or ROI percentage until cohort, period, denominator,
|
|
100
|
+
exclusions, assumptions, consent, and partner approval are documented.
|
|
101
|
+
|
|
102
|
+
Runbook: `docs/gtm/design-partner-pilot-runbook.md`
|
|
103
|
+
|
|
104
|
+
## P1 — repository and adoption cleanup
|
|
105
|
+
|
|
106
|
+
### 5. Documentation consistency
|
|
107
|
+
|
|
108
|
+
- [ ] Update `docs/demo/cv-linkedin-copy.md`, which still says 50 automated
|
|
109
|
+
tests; use 99 only if the statement is meant to describe current `main`.
|
|
110
|
+
- [ ] Review historical v1.7 wording that says PR comments are design-only.
|
|
111
|
+
Preserve release history, but link readers to the v1.8 implementation where
|
|
112
|
+
current-state wording could be ambiguous.
|
|
113
|
+
- [ ] Update `docs/project/program-completion-audit.md` after v1.8 is released or
|
|
114
|
+
a real pilot produces evidence.
|
|
115
|
+
- [ ] Recheck README, Pages, portfolio, screenshots, and social preview after
|
|
116
|
+
the next version number/test count changes.
|
|
117
|
+
|
|
118
|
+
### 6. GitHub owner settings
|
|
119
|
+
|
|
120
|
+
- [ ] Upload `docs/demo/social-preview.png` as the repository social preview if
|
|
121
|
+
it is still not configured.
|
|
122
|
+
- [ ] Configure branch protection and required checks for `main` under the
|
|
123
|
+
owner's collaboration policy.
|
|
124
|
+
- [ ] Decide whether the PR comment publisher should be required, optional, or
|
|
125
|
+
limited to selected paths.
|
|
126
|
+
- [ ] Confirm workflow retention is long enough for audit evidence and short
|
|
127
|
+
enough for the intended data-retention policy.
|
|
128
|
+
|
|
129
|
+
### 7. Publisher adopter experience
|
|
130
|
+
|
|
131
|
+
- [ ] Add a copyable downstream-repository publisher recipe; the current
|
|
132
|
+
workflow is configured for `RAGOps reusable gate smoke` in this repository.
|
|
133
|
+
- [ ] Document the exact workflow-name allowlist change required by adopters.
|
|
134
|
+
- [ ] Exercise a fork PR. Expected behavior is safe publication when GitHub
|
|
135
|
+
supplies exactly one PR association, otherwise fail closed without a comment.
|
|
136
|
+
- [ ] Add live or fixture coverage for expired artifacts, more than 100
|
|
137
|
+
artifacts, more than 1,000 comments, and GitHub API rate-limit responses.
|
|
138
|
+
- [ ] Decide whether artifact/comment retention and deletion need an ADR.
|
|
139
|
+
|
|
140
|
+
## P1 — pilot measurement improvements after first feedback
|
|
141
|
+
|
|
142
|
+
- [ ] Confirm whether repeat usage across two ISO weeks is meaningful for the
|
|
143
|
+
partner's workflow cadence.
|
|
144
|
+
- [ ] Decide whether incomplete tasks belong in success and duration
|
|
145
|
+
denominators; current success/duration metrics use completed tasks.
|
|
146
|
+
- [ ] Add explicit exclusion reasons if a real pilot needs auditable exclusions.
|
|
147
|
+
- [ ] Consider paired-task or comparison-cohort analysis before making causal
|
|
148
|
+
claims. Current before/after reporting is observational.
|
|
149
|
+
- [ ] Add uncertainty intervals only when sample size and study design justify
|
|
150
|
+
them; do not create statistical decoration for a tiny pilot.
|
|
151
|
+
- [ ] Validate willingness-to-pay separately from estimated labor savings.
|
|
152
|
+
|
|
153
|
+
## P2 — not immediate source-code work
|
|
154
|
+
|
|
155
|
+
- [ ] Hosted 2.0 requires cloud, SSO/RBAC, encryption, tenant isolation,
|
|
156
|
+
billing, support, incident response, legal, and operations decisions.
|
|
157
|
+
- [ ] Independent security review is required before processing customer-
|
|
158
|
+
sensitive traces. The previously requested Codex Security scan was explicitly
|
|
159
|
+
skipped and should remain deferred unless the owner reauthorizes it.
|
|
160
|
+
- [ ] Provider-backed judges, plugin sandboxing, signed baselines, and production
|
|
161
|
+
data controls remain future architecture work, not v1.8 release blockers.
|
|
162
|
+
|
|
163
|
+
## Account hygiene
|
|
164
|
+
|
|
165
|
+
- [ ] Rotate the PyPI password because it was shared in conversation history.
|
|
166
|
+
- [ ] Regenerate PyPI recovery codes because they were also exposed in the
|
|
167
|
+
working context; store the replacement set only in a password manager.
|
|
168
|
+
- [ ] Confirm 2FA and the `thangldw/ragops` Trusted Publisher still work after
|
|
169
|
+
rotation. Do not add a long-lived PyPI token to GitHub secrets.
|
|
170
|
+
|
|
171
|
+
## Fast start commands
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
cd /Users/thang/Documents/ragops
|
|
175
|
+
git status --short
|
|
176
|
+
git pull --ff-only
|
|
177
|
+
ruff check .
|
|
178
|
+
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 pytest -q
|
|
179
|
+
|
|
180
|
+
PYTHONPATH=src python -m ragops.cli pilot-report \
|
|
181
|
+
--manifest docs/gtm/pilot-fixtures/synthetic-manifest.json \
|
|
182
|
+
--observations docs/gtm/pilot-fixtures/synthetic-observations.jsonl \
|
|
183
|
+
--economics docs/gtm/pilot-fixtures/synthetic-economics.json \
|
|
184
|
+
--output /tmp/ragops-pilot-report.md
|
|
185
|
+
|
|
186
|
+
diff -u docs/gtm/synthetic-pilot-report.md /tmp/ragops-pilot-report.md
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Recommended order tomorrow
|
|
190
|
+
|
|
191
|
+
1. Live BLOCK PR publisher test.
|
|
192
|
+
2. Review Discussion #5 and qualify any real respondent.
|
|
193
|
+
3. Decide v1.8.0 release GO/HOLD.
|
|
194
|
+
4. If GO, run the full release workflow.
|
|
195
|
+
5. Finish documentation/settings cleanup while waiting for partner baseline data.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ragops
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.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.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# ADR 0019: Local release fallback
|
|
2
|
+
|
|
3
|
+
Status: Accepted for owner review
|
|
4
|
+
|
|
5
|
+
## Decision
|
|
6
|
+
|
|
7
|
+
Provide `scripts/local_release.py` with three explicit phases: `verify`,
|
|
8
|
+
`publish-github`, and `publish-pypi`. Verification produces immutable package
|
|
9
|
+
artifacts, an SBOM, checksums, and local evidence. GitHub publication requires
|
|
10
|
+
`--yes`; PyPI additionally requires a project-scoped token supplied only via an
|
|
11
|
+
environment variable and promotes the artifacts downloaded back from GitHub.
|
|
12
|
+
|
|
13
|
+
Workflows may be disabled through the GitHub UI or `gh workflow disable` while
|
|
14
|
+
quota is exhausted. They remain versioned so the owner can restore the preferred
|
|
15
|
+
OIDC/provenance path later.
|
|
16
|
+
|
|
17
|
+
## Consequences
|
|
18
|
+
|
|
19
|
+
The fallback avoids Actions minutes and keeps release gates observable. Local
|
|
20
|
+
PyPI uploads do not receive GitHub Trusted Publisher identity or GitHub build
|
|
21
|
+
provenance, so `LOCAL_RELEASE_EVIDENCE.json` records `trusted_publishing: false`.
|
|
22
|
+
The owner must protect and rotate the temporary project token.
|
|
@@ -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,32 @@
|
|
|
1
|
+
# Release without GitHub Actions
|
|
2
|
+
|
|
3
|
+
Use this only while GitHub Actions is unavailable. Run from a clean release
|
|
4
|
+
commit with Python 3.11+ and `gh` authenticated.
|
|
5
|
+
|
|
6
|
+
```bash
|
|
7
|
+
python -m pip install -e '.[dev]' build cyclonedx-bom==7.3.0 twine
|
|
8
|
+
python scripts/local_release.py verify --tag vX.Y.Z
|
|
9
|
+
python scripts/local_release.py publish-github --tag vX.Y.Z --yes
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
The first command runs all required local gates and writes `dist/` artifacts,
|
|
13
|
+
`SHA256SUMS`, an SBOM, and `LOCAL_RELEASE_EVIDENCE.json`. The second creates and
|
|
14
|
+
pushes the annotated tag, then creates the GitHub Release directly with `gh`.
|
|
15
|
+
|
|
16
|
+
PyPI cannot use the repository's GitHub OIDC Trusted Publisher from a local
|
|
17
|
+
machine. If PyPI publication cannot wait, create a project-scoped token, expose
|
|
18
|
+
it only for this command, and rotate/revoke it afterwards:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
read -s PYPI_API_TOKEN && export PYPI_API_TOKEN
|
|
22
|
+
python scripts/local_release.py publish-pypi --tag vX.Y.Z --yes
|
|
23
|
+
unset PYPI_API_TOKEN
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The PyPI phase downloads and verifies the GitHub Release artifacts before
|
|
27
|
+
uploading them; it never rebuilds. Do not paste tokens into chat, shell history,
|
|
28
|
+
configuration files, or repository secrets.
|
|
29
|
+
|
|
30
|
+
Pause quota-consuming workflows with `gh workflow disable <workflow-file>` and
|
|
31
|
+
restore them later with `gh workflow enable <workflow-file>`. Keep manual notes
|
|
32
|
+
of every disabled workflow.
|
|
@@ -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: `1.
|
|
12
|
+
- Current verified release: `2.1.0`
|
|
13
13
|
- GitHub environment: `pypi`
|
|
14
14
|
- Publisher: `thangldw/ragops`, workflow `publish-pypi.yml`
|
|
15
|
-
- Verification: 1.
|
|
15
|
+
- Verification: 2.1.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.1.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"
|