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.
Files changed (259) hide show
  1. {ragops-2.0.0 → ragops-2.1.0}/.github/ISSUE_TEMPLATE/bug.yml +1 -1
  2. {ragops-2.0.0 → ragops-2.1.0}/.github/workflows/ragops-gate.yml +1 -1
  3. {ragops-2.0.0 → ragops-2.1.0}/CHANGELOG.md +11 -0
  4. {ragops-2.0.0 → ragops-2.1.0}/PKG-INFO +9 -3
  5. {ragops-2.0.0 → ragops-2.1.0}/README.md +8 -2
  6. ragops-2.1.0/docs/architecture/adr/0018-portable-external-metric-envelope.md +43 -0
  7. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/cv-linkedin-copy.md +1 -1
  8. {ragops-2.0.0 → ragops-2.1.0}/docs/engineering/github-pr-gate.md +28 -1
  9. {ragops-2.0.0 → ragops-2.1.0}/docs/engineering/gitlab-ci-gate.md +1 -1
  10. ragops-2.1.0/docs/engineering/provider-adapters.md +75 -0
  11. {ragops-2.0.0 → ragops-2.1.0}/docs/engineering/pypi-publishing.md +3 -3
  12. ragops-2.1.0/docs/examples/github-pr-comment.yml +30 -0
  13. {ragops-2.0.0 → ragops-2.1.0}/docs/examples/gitlab-ci-ragops.yml +1 -1
  14. ragops-2.1.0/docs/product/requirements-v2.1.md +50 -0
  15. {ragops-2.0.0 → ragops-2.1.0}/docs/product/roadmap.md +8 -0
  16. {ragops-2.0.0 → ragops-2.1.0}/docs/project/program-completion-audit.md +9 -6
  17. {ragops-2.0.0 → ragops-2.1.0}/docs/project/v2.0-acceptance.md +6 -3
  18. ragops-2.1.0/docs/project/v2.1-acceptance.md +36 -0
  19. ragops-2.1.0/docs/releases/v2.1.0.md +37 -0
  20. {ragops-2.0.0 → ragops-2.1.0}/pyproject.toml +1 -1
  21. ragops-2.1.0/scenarios/japanese_troubleshooting/external-metric-policy.toml +5 -0
  22. ragops-2.1.0/scenarios/japanese_troubleshooting/external-metrics-baseline.json +8 -0
  23. ragops-2.1.0/scenarios/japanese_troubleshooting/external-metrics-candidate.json +8 -0
  24. ragops-2.1.0/schemas/external-metrics-0.1.schema.json +30 -0
  25. {ragops-2.0.0 → ragops-2.1.0}/site/index.html +1 -1
  26. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/__init__.py +1 -1
  27. ragops-2.1.0/src/ragops/adapters/__init__.py +16 -0
  28. ragops-2.1.0/src/ragops/adapters/external_metrics.py +134 -0
  29. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/cli.py +50 -7
  30. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/engine.py +15 -2
  31. {ragops-2.0.0 → ragops-2.1.0}/tests/test_adoption_recipes.py +18 -1
  32. ragops-2.1.0/tests/test_external_metrics.py +192 -0
  33. {ragops-2.0.0 → ragops-2.1.0}/tests/test_public_api.py +1 -1
  34. {ragops-2.0.0 → ragops-2.1.0}/tests/test_showcase_site.py +1 -1
  35. ragops-2.0.0/docs/engineering/provider-adapters.md +0 -32
  36. ragops-2.0.0/src/ragops/adapters/__init__.py +0 -5
  37. {ragops-2.0.0 → ragops-2.1.0}/.dockerignore +0 -0
  38. {ragops-2.0.0 → ragops-2.1.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  39. {ragops-2.0.0 → ragops-2.1.0}/.github/ISSUE_TEMPLATE/design-partner.yml +0 -0
  40. {ragops-2.0.0 → ragops-2.1.0}/.github/ISSUE_TEMPLATE/evaluator.yml +0 -0
  41. {ragops-2.0.0 → ragops-2.1.0}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
  42. {ragops-2.0.0 → ragops-2.1.0}/.github/pull_request_template.md +0 -0
  43. {ragops-2.0.0 → ragops-2.1.0}/.github/workflows/ci.yml +0 -0
  44. {ragops-2.0.0 → ragops-2.1.0}/.github/workflows/nightly.yml +0 -0
  45. {ragops-2.0.0 → ragops-2.1.0}/.github/workflows/pages.yml +0 -0
  46. {ragops-2.0.0 → ragops-2.1.0}/.github/workflows/publish-pypi.yml +0 -0
  47. {ragops-2.0.0 → ragops-2.1.0}/.github/workflows/ragops-gate-smoke.yml +0 -0
  48. {ragops-2.0.0 → ragops-2.1.0}/.github/workflows/ragops-pr-comment.yml +0 -0
  49. {ragops-2.0.0 → ragops-2.1.0}/.github/workflows/release.yml +0 -0
  50. {ragops-2.0.0 → ragops-2.1.0}/.gitignore +0 -0
  51. {ragops-2.0.0 → ragops-2.1.0}/AGENTS.md +0 -0
  52. {ragops-2.0.0 → ragops-2.1.0}/CODE_OF_CONDUCT.md +0 -0
  53. {ragops-2.0.0 → ragops-2.1.0}/CONTRIBUTING.md +0 -0
  54. {ragops-2.0.0 → ragops-2.1.0}/Dockerfile +0 -0
  55. {ragops-2.0.0 → ragops-2.1.0}/LICENSE +0 -0
  56. {ragops-2.0.0 → ragops-2.1.0}/SECURITY.md +0 -0
  57. {ragops-2.0.0 → ragops-2.1.0}/SUPPORT.md +0 -0
  58. {ragops-2.0.0 → ragops-2.1.0}/apps/__init__.py +0 -0
  59. {ragops-2.0.0 → ragops-2.1.0}/apps/api/__init__.py +0 -0
  60. {ragops-2.0.0 → ragops-2.1.0}/apps/api/main.py +0 -0
  61. {ragops-2.0.0 → ragops-2.1.0}/apps/github_pr_comment.py +0 -0
  62. {ragops-2.0.0 → ragops-2.1.0}/apps/web/index.html +0 -0
  63. {ragops-2.0.0 → ragops-2.1.0}/compose.yaml +0 -0
  64. {ragops-2.0.0 → ragops-2.1.0}/design-qa.md +0 -0
  65. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0001-local-first-core.md +0 -0
  66. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0002-baseline-regression-gates.md +0 -0
  67. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0003-reference-app-outside-core.md +0 -0
  68. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0004-open-core-boundary.md +0 -0
  69. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0005-scenario-0.2-metadata-and-citation-precision.md +0 -0
  70. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0006-response-fixture-overlays.md +0 -0
  71. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0007-offline-reference-graphrag-agent.md +0 -0
  72. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0008-local-team-review-workflow.md +0 -0
  73. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0009-adopt-mit-license.md +0 -0
  74. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0010-repair-trace-04-schema-json.md +0 -0
  75. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0011-reusable-pr-gate-is-an-adapter.md +0 -0
  76. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0012-opentelemetry-export-is-an-example-adapter.md +0 -0
  77. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0013-additive-demo-catalog-and-codepoint-budget.md +0 -0
  78. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0014-separate-pr-evaluation-from-comment-publication.md +0 -0
  79. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0015-portable-design-partner-measurement.md +0 -0
  80. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0016-first-class-evaluator-gates.md +0 -0
  81. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/adr/0017-api-authentication-and-input-bounds.md +0 -0
  82. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/component-diagram.md +0 -0
  83. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/context-diagram.md +0 -0
  84. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/control-plane-alpha.md +0 -0
  85. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/data-model.md +0 -0
  86. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/pr-comment-publishing.md +0 -0
  87. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/system-overview.md +0 -0
  88. {ragops-2.0.0 → ragops-2.1.0}/docs/architecture/threat-model.md +0 -0
  89. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/design-audit/01-current-desktop.jpg +0 -0
  90. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/design-audit/02-implementation-desktop.jpg +0 -0
  91. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/design-audit/04-implementation-mobile.jpg +0 -0
  92. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/design-audit/06-desktop-comparison.jpg +0 -0
  93. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/design-audit/09-limitations-section.jpg +0 -0
  94. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/design-audit/selected-open-source-adoption.png +0 -0
  95. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/infographics/evidence-stack.svg +0 -0
  96. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/infographics/release-gate-flow.svg +0 -0
  97. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/portfolio-case-study.md +0 -0
  98. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/portfolio-handoff.md +0 -0
  99. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/presentation-outline.md +0 -0
  100. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/screenshots/ragops-limitations-screen.jpg +0 -0
  101. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/screenshots/ragops-mobile-screen.jpg +0 -0
  102. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/screenshots/ragops-portfolio-desktop.jpg +0 -0
  103. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/screenshots/ragops-portfolio-mobile.jpg +0 -0
  104. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/screenshots/ragops-release-screen.jpg +0 -0
  105. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/screenshots/ragops-showcase-hero.jpg +0 -0
  106. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/social-preview.png +0 -0
  107. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/video-script.md +0 -0
  108. {ragops-2.0.0 → ragops-2.1.0}/docs/demo/walkthrough.md +0 -0
  109. {ragops-2.0.0 → ragops-2.1.0}/docs/design-audit/v1.9/01-start.png +0 -0
  110. {ragops-2.0.0 → ragops-2.1.0}/docs/design-audit/v1.9/02-pass-decision.png +0 -0
  111. {ragops-2.0.0 → ragops-2.1.0}/docs/design-audit/v1.9/03-invalid-json-stale-decision.png +0 -0
  112. {ragops-2.0.0 → ragops-2.1.0}/docs/design-audit/v1.9/04-fixed-pass-decision.png +0 -0
  113. {ragops-2.0.0 → ragops-2.1.0}/docs/design-audit/v1.9/05-fixed-invalid-json.png +0 -0
  114. {ragops-2.0.0 → ragops-2.1.0}/docs/design-audit/v1.9/workbench-audit.md +0 -0
  115. {ragops-2.0.0 → ragops-2.1.0}/docs/engineering/export-your-first-trace.md +0 -0
  116. {ragops-2.0.0 → ragops-2.1.0}/docs/engineering/handbook.md +0 -0
  117. {ragops-2.0.0 → ragops-2.1.0}/docs/engineering/observability.md +0 -0
  118. {ragops-2.0.0 → ragops-2.1.0}/docs/engineering/testing-strategy.md +0 -0
  119. {ragops-2.0.0 → ragops-2.1.0}/docs/evaluation/answer-length-budget.md +0 -0
  120. {ragops-2.0.0 → ragops-2.1.0}/docs/evaluation/benchmark-report-v0.2.md +0 -0
  121. {ragops-2.0.0 → ragops-2.1.0}/docs/evaluation/evaluator-gates.md +0 -0
  122. {ragops-2.0.0 → ragops-2.1.0}/docs/evaluation/red-team-plan.md +0 -0
  123. {ragops-2.0.0 → ragops-2.1.0}/docs/evaluation/scenario-taxonomy.md +0 -0
  124. {ragops-2.0.0 → ragops-2.1.0}/docs/evaluation/strategy.md +0 -0
  125. {ragops-2.0.0 → ragops-2.1.0}/docs/getting-started.md +0 -0
  126. {ragops-2.0.0 → ragops-2.1.0}/docs/gtm/design-partner-outreach.md +0 -0
  127. {ragops-2.0.0 → ragops-2.1.0}/docs/gtm/design-partner-pilot-runbook.md +0 -0
  128. {ragops-2.0.0 → ragops-2.1.0}/docs/gtm/github-launch-checklist.md +0 -0
  129. {ragops-2.0.0 → ragops-2.1.0}/docs/gtm/pilot-fixtures/synthetic-economics.json +0 -0
  130. {ragops-2.0.0 → ragops-2.1.0}/docs/gtm/pilot-fixtures/synthetic-manifest.json +0 -0
  131. {ragops-2.0.0 → ragops-2.1.0}/docs/gtm/pilot-fixtures/synthetic-observations.jsonl +0 -0
  132. {ragops-2.0.0 → ragops-2.1.0}/docs/gtm/pilot-measurement-plan.md +0 -0
  133. {ragops-2.0.0 → ragops-2.1.0}/docs/gtm/synthetic-pilot-report.md +0 -0
  134. {ragops-2.0.0 → ragops-2.1.0}/docs/product/commercialization.md +0 -0
  135. {ragops-2.0.0 → ragops-2.1.0}/docs/product/competitive-analysis.md +0 -0
  136. {ragops-2.0.0 → ragops-2.1.0}/docs/product/jobs-to-be-done.md +0 -0
  137. {ragops-2.0.0 → ragops-2.1.0}/docs/product/oss-launch-plan.md +0 -0
  138. {ragops-2.0.0 → ragops-2.1.0}/docs/product/personas.md +0 -0
  139. {ragops-2.0.0 → ragops-2.1.0}/docs/product/product_thesis.md +0 -0
  140. {ragops-2.0.0 → ragops-2.1.0}/docs/product/requirements-v0.1.md +0 -0
  141. {ragops-2.0.0 → ragops-2.1.0}/docs/product/requirements-v0.2.md +0 -0
  142. {ragops-2.0.0 → ragops-2.1.0}/docs/product/requirements-v1.5.md +0 -0
  143. {ragops-2.0.0 → ragops-2.1.0}/docs/product/requirements-v1.6.md +0 -0
  144. {ragops-2.0.0 → ragops-2.1.0}/docs/product/requirements-v1.7.md +0 -0
  145. {ragops-2.0.0 → ragops-2.1.0}/docs/product/requirements-v1.8.md +0 -0
  146. {ragops-2.0.0 → ragops-2.1.0}/docs/product/requirements-v2.0.md +0 -0
  147. {ragops-2.0.0 → ragops-2.1.0}/docs/product/success-metrics.md +0 -0
  148. {ragops-2.0.0 → ragops-2.1.0}/docs/project/backlog.md +0 -0
  149. {ragops-2.0.0 → ragops-2.1.0}/docs/project/charter.md +0 -0
  150. {ragops-2.0.0 → ragops-2.1.0}/docs/project/decision-log.md +0 -0
  151. {ragops-2.0.0 → ragops-2.1.0}/docs/project/m1-acceptance.md +0 -0
  152. {ragops-2.0.0 → ragops-2.1.0}/docs/project/m2-acceptance.md +0 -0
  153. {ragops-2.0.0 → ragops-2.1.0}/docs/project/m3-acceptance.md +0 -0
  154. {ragops-2.0.0 → ragops-2.1.0}/docs/project/m4-acceptance.md +0 -0
  155. {ragops-2.0.0 → ragops-2.1.0}/docs/project/m5-acceptance.md +0 -0
  156. {ragops-2.0.0 → ragops-2.1.0}/docs/project/milestones.md +0 -0
  157. {ragops-2.0.0 → ragops-2.1.0}/docs/project/release-plan.md +0 -0
  158. {ragops-2.0.0 → ragops-2.1.0}/docs/project/risk-register.md +0 -0
  159. {ragops-2.0.0 → ragops-2.1.0}/docs/project/v1-acceptance.md +0 -0
  160. {ragops-2.0.0 → ragops-2.1.0}/docs/project/v1.5-acceptance.md +0 -0
  161. {ragops-2.0.0 → ragops-2.1.0}/docs/project/v1.6-acceptance.md +0 -0
  162. {ragops-2.0.0 → ragops-2.1.0}/docs/project/v1.7-acceptance.md +0 -0
  163. {ragops-2.0.0 → ragops-2.1.0}/docs/project/v1.8-acceptance.md +0 -0
  164. {ragops-2.0.0 → ragops-2.1.0}/docs/project/work-breakdown.md +0 -0
  165. {ragops-2.0.0 → ragops-2.1.0}/docs/releases/v1.5.0.md +0 -0
  166. {ragops-2.0.0 → ragops-2.1.0}/docs/releases/v1.6.0.md +0 -0
  167. {ragops-2.0.0 → ragops-2.1.0}/docs/releases/v1.7.0.md +0 -0
  168. {ragops-2.0.0 → ragops-2.1.0}/docs/releases/v1.8.0.md +0 -0
  169. {ragops-2.0.0 → ragops-2.1.0}/docs/releases/v2.0.0.md +0 -0
  170. {ragops-2.0.0 → ragops-2.1.0}/examples/__init__.py +0 -0
  171. {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/README.md +0 -0
  172. {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/__init__.py +0 -0
  173. {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/agent.py +0 -0
  174. {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/architecture.md +0 -0
  175. {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/cli.py +0 -0
  176. {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/data/documents.json +0 -0
  177. {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/data/graph.json +0 -0
  178. {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/discovery.md +0 -0
  179. {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/executive-report.md +0 -0
  180. {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/results/comparison.md +0 -0
  181. {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/results/graph-traces.jsonl +0 -0
  182. {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/results/lexical-traces.jsonl +0 -0
  183. {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/rollout-plan.md +0 -0
  184. {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/scenario.json +0 -0
  185. {ragops-2.0.0 → ragops-2.1.0}/examples/japanese_troubleshooting_agent/suite.json +0 -0
  186. {ragops-2.0.0 → ragops-2.1.0}/examples/opentelemetry_trace_adapter/README.md +0 -0
  187. {ragops-2.0.0 → ragops-2.1.0}/examples/opentelemetry_trace_adapter/__init__.py +0 -0
  188. {ragops-2.0.0 → ragops-2.1.0}/examples/opentelemetry_trace_adapter/adapter.py +0 -0
  189. {ragops-2.0.0 → ragops-2.1.0}/examples/opentelemetry_trace_adapter/spans.jsonl +0 -0
  190. {ragops-2.0.0 → ragops-2.1.0}/ragops.toml +0 -0
  191. {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/attack-pack.json +0 -0
  192. {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/benchmark-adversarial.json +0 -0
  193. {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/benchmark-baseline.json +0 -0
  194. {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/benchmark-regressed.json +0 -0
  195. {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/benchmark-v0.2.json +0 -0
  196. {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/evaluation-policy.toml +0 -0
  197. {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/regressed_responses.json +0 -0
  198. {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/sample_responses.json +0 -0
  199. {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/sample_traces.jsonl +0 -0
  200. {ragops-2.0.0 → ragops-2.1.0}/scenarios/japanese_troubleshooting/scenario.json +0 -0
  201. {ragops-2.0.0 → ragops-2.1.0}/schemas/attack-pack-0.1.schema.json +0 -0
  202. {ragops-2.0.0 → ragops-2.1.0}/schemas/pilot-economics-0.1.schema.json +0 -0
  203. {ragops-2.0.0 → ragops-2.1.0}/schemas/pilot-manifest-0.1.schema.json +0 -0
  204. {ragops-2.0.0 → ragops-2.1.0}/schemas/pilot-observation-0.1.schema.json +0 -0
  205. {ragops-2.0.0 → ragops-2.1.0}/schemas/report-0.2.schema.json +0 -0
  206. {ragops-2.0.0 → ragops-2.1.0}/schemas/response-fixture-0.2.schema.json +0 -0
  207. {ragops-2.0.0 → ragops-2.1.0}/schemas/responses-0.1.schema.json +0 -0
  208. {ragops-2.0.0 → ragops-2.1.0}/schemas/scenario-0.1.schema.json +0 -0
  209. {ragops-2.0.0 → ragops-2.1.0}/schemas/scenario-0.2.schema.json +0 -0
  210. {ragops-2.0.0 → ragops-2.1.0}/schemas/trace-0.3.schema.json +0 -0
  211. {ragops-2.0.0 → ragops-2.1.0}/schemas/trace-0.4.schema.json +0 -0
  212. {ragops-2.0.0 → ragops-2.1.0}/site/apple-touch-icon.png +0 -0
  213. {ragops-2.0.0 → ragops-2.1.0}/site/favicon.png +0 -0
  214. {ragops-2.0.0 → ragops-2.1.0}/site/styles.css +0 -0
  215. {ragops-2.0.0 → ragops-2.1.0}/skills/ragops-feature/SKILL.md +0 -0
  216. {ragops-2.0.0 → ragops-2.1.0}/skills/ragops-presentation/SKILL.md +0 -0
  217. {ragops-2.0.0 → ragops-2.1.0}/skills/ragops-release/SKILL.md +0 -0
  218. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/adapters/http.py +0 -0
  219. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/benchmarks.py +0 -0
  220. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/config.py +0 -0
  221. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/control_plane.py +0 -0
  222. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/demo.py +0 -0
  223. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/evaluators.py +0 -0
  224. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/loader.py +0 -0
  225. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/models.py +0 -0
  226. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/pilot.py +0 -0
  227. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/plugins.py +0 -0
  228. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/providers/__init__.py +0 -0
  229. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/providers/openai_responses.py +0 -0
  230. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/reporters.py +0 -0
  231. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/store.py +0 -0
  232. {ragops-2.0.0 → ragops-2.1.0}/src/ragops/traces.py +0 -0
  233. {ragops-2.0.0 → ragops-2.1.0}/tests/test_answer_length_cli.py +0 -0
  234. {ragops-2.0.0 → ragops-2.1.0}/tests/test_api_contract.py +0 -0
  235. {ragops-2.0.0 → ragops-2.1.0}/tests/test_benchmarks.py +0 -0
  236. {ragops-2.0.0 → ragops-2.1.0}/tests/test_comparison.py +0 -0
  237. {ragops-2.0.0 → ragops-2.1.0}/tests/test_config.py +0 -0
  238. {ragops-2.0.0 → ragops-2.1.0}/tests/test_control_plane.py +0 -0
  239. {ragops-2.0.0 → ragops-2.1.0}/tests/test_demo.py +0 -0
  240. {ragops-2.0.0 → ragops-2.1.0}/tests/test_engine.py +0 -0
  241. {ragops-2.0.0 → ragops-2.1.0}/tests/test_evaluator_depth.py +0 -0
  242. {ragops-2.0.0 → ragops-2.1.0}/tests/test_github_workflows.py +0 -0
  243. {ragops-2.0.0 → ragops-2.1.0}/tests/test_http_adapter.py +0 -0
  244. {ragops-2.0.0 → ragops-2.1.0}/tests/test_loader.py +0 -0
  245. {ragops-2.0.0 → ragops-2.1.0}/tests/test_openai_provider.py +0 -0
  246. {ragops-2.0.0 → ragops-2.1.0}/tests/test_opentelemetry_adapter.py +0 -0
  247. {ragops-2.0.0 → ragops-2.1.0}/tests/test_pilot.py +0 -0
  248. {ragops-2.0.0 → ragops-2.1.0}/tests/test_plugins_and_traces.py +0 -0
  249. {ragops-2.0.0 → ragops-2.1.0}/tests/test_pr_comment_publisher.py +0 -0
  250. {ragops-2.0.0 → ragops-2.1.0}/tests/test_readme_visuals.py +0 -0
  251. {ragops-2.0.0 → ragops-2.1.0}/tests/test_reference_agent.py +0 -0
  252. {ragops-2.0.0 → ragops-2.1.0}/tests/test_reference_benchmark.py +0 -0
  253. {ragops-2.0.0 → ragops-2.1.0}/tests/test_release_version.py +0 -0
  254. {ragops-2.0.0 → ragops-2.1.0}/tests/test_response_fixtures.py +0 -0
  255. {ragops-2.0.0 → ragops-2.1.0}/tests/test_scenario_v02_and_attacks.py +0 -0
  256. {ragops-2.0.0 → ragops-2.1.0}/tests/test_schema_files.py +0 -0
  257. {ragops-2.0.0 → ragops-2.1.0}/tests/test_store_and_html.py +0 -0
  258. {ragops-2.0.0 → ragops-2.1.0}/tests/test_team_workflow.py +0 -0
  259. {ragops-2.0.0 → ragops-2.1.0}/tests/test_workbench.py +0 -0
@@ -10,7 +10,7 @@ body:
10
10
  id: version
11
11
  attributes:
12
12
  label: RAGOps version or commit
13
- placeholder: v2.0.0 or commit SHA
13
+ placeholder: v2.1.0 or commit SHA
14
14
  validations:
15
15
  required: true
16
16
  - type: textarea
@@ -12,7 +12,7 @@ on:
12
12
  description: RAGOps Git revision or tag to install
13
13
  required: false
14
14
  type: string
15
- default: "v2.0.0"
15
+ default: "v2.1.0"
16
16
  scenario:
17
17
  description: Caller-relative scenario JSON path
18
18
  required: true
@@ -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.0.0
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.0.0
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 126 automated tests.
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.0.0
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 126 automated tests.
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 126 automated tests.
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.0.0
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.0.0"
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: `1.8.0`
12
+ - Current verified release: `2.0.0`
13
13
  - GitHub environment: `pypi`
14
14
  - Publisher: `thangldw/ragops`, workflow `publish-pypi.yml`
15
- - Verification: 1.8.0 wheel and sdist present; clean install and
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 `v1.8.0`.
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.0.0"
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, Japanese
7
- enterprise benchmark, red-team contracts, reference GraphRAG-style deployment,
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 | Release candidate | `docs/project/v2.0-acceptance.md` |
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 benchmark, baseline/regression/adversarial candidates,
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
- - Ninety-nine automated tests at the latest acceptance run.
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 1.8.0 for FDE interviews, OSS feedback, and customer discovery.
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
- **GO for release 2.0.0. The owner authorized staged implementation and release
6
- on 2026-07-13. Public publication remains conditional on release validation and
7
- green GitHub CI.**
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.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ragops"
7
- version = "2.0.0"
7
+ version = "2.1.0"
8
8
  description = "Evaluation and red-team release gates for RAG and agent systems"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -0,0 +1,5 @@
1
+ [metrics."ragas.faithfulness"]
2
+ minimum = 0.90
3
+
4
+ [metrics."ragas.answer_relevance"]
5
+ minimum = 0.90
@@ -0,0 +1,8 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "provider": "ragas",
4
+ "records": [
5
+ {"case_id": "error-e42", "metrics": {"faithfulness": 0.96, "answer_relevance": 0.94}},
6
+ {"case_id": "escalation-e42", "metrics": {"faithfulness": 0.98, "answer_relevance": 0.95}}
7
+ ]
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "provider": "ragas",
4
+ "records": [
5
+ {"case_id": "error-e42", "metrics": {"faithfulness": 0.81, "answer_relevance": 0.92}},
6
+ {"case_id": "escalation-e42", "metrics": {"faithfulness": 0.84, "answer_relevance": 0.91}}
7
+ ]
8
+ }
@@ -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
+ }