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