ragops 1.6.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 (203) hide show
  1. ragops-1.6.0/.dockerignore +9 -0
  2. ragops-1.6.0/.github/ISSUE_TEMPLATE/bug.yml +41 -0
  3. ragops-1.6.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
  4. ragops-1.6.0/.github/ISSUE_TEMPLATE/design-partner.yml +48 -0
  5. ragops-1.6.0/.github/ISSUE_TEMPLATE/evaluator.yml +40 -0
  6. ragops-1.6.0/.github/ISSUE_TEMPLATE/feature.yml +38 -0
  7. ragops-1.6.0/.github/pull_request_template.md +26 -0
  8. ragops-1.6.0/.github/workflows/ci.yml +73 -0
  9. ragops-1.6.0/.github/workflows/nightly.yml +39 -0
  10. ragops-1.6.0/.github/workflows/pages.yml +31 -0
  11. ragops-1.6.0/.github/workflows/publish-pypi.yml +43 -0
  12. ragops-1.6.0/.github/workflows/ragops-gate-smoke.yml +24 -0
  13. ragops-1.6.0/.github/workflows/ragops-gate.yml +104 -0
  14. ragops-1.6.0/.github/workflows/release.yml +38 -0
  15. ragops-1.6.0/.gitignore +13 -0
  16. ragops-1.6.0/AGENTS.md +36 -0
  17. ragops-1.6.0/CHANGELOG.md +110 -0
  18. ragops-1.6.0/CODE_OF_CONDUCT.md +32 -0
  19. ragops-1.6.0/CONTRIBUTING.md +71 -0
  20. ragops-1.6.0/Dockerfile +10 -0
  21. ragops-1.6.0/LICENSE +21 -0
  22. ragops-1.6.0/PKG-INFO +220 -0
  23. ragops-1.6.0/README.md +204 -0
  24. ragops-1.6.0/SECURITY.md +32 -0
  25. ragops-1.6.0/SUPPORT.md +20 -0
  26. ragops-1.6.0/apps/__init__.py +2 -0
  27. ragops-1.6.0/apps/api/__init__.py +2 -0
  28. ragops-1.6.0/apps/api/main.py +149 -0
  29. ragops-1.6.0/apps/web/index.html +26 -0
  30. ragops-1.6.0/compose.yaml +9 -0
  31. ragops-1.6.0/design-qa.md +74 -0
  32. ragops-1.6.0/docs/architecture/adr/0001-local-first-core.md +19 -0
  33. ragops-1.6.0/docs/architecture/adr/0002-baseline-regression-gates.md +23 -0
  34. ragops-1.6.0/docs/architecture/adr/0003-reference-app-outside-core.md +21 -0
  35. ragops-1.6.0/docs/architecture/adr/0004-open-core-boundary.md +22 -0
  36. ragops-1.6.0/docs/architecture/adr/0005-scenario-0.2-metadata-and-citation-precision.md +23 -0
  37. ragops-1.6.0/docs/architecture/adr/0006-response-fixture-overlays.md +22 -0
  38. ragops-1.6.0/docs/architecture/adr/0007-offline-reference-graphrag-agent.md +23 -0
  39. ragops-1.6.0/docs/architecture/adr/0008-local-team-review-workflow.md +22 -0
  40. ragops-1.6.0/docs/architecture/adr/0009-adopt-mit-license.md +38 -0
  41. ragops-1.6.0/docs/architecture/adr/0010-repair-trace-04-schema-json.md +32 -0
  42. ragops-1.6.0/docs/architecture/adr/0011-reusable-pr-gate-is-an-adapter.md +35 -0
  43. ragops-1.6.0/docs/architecture/adr/0012-opentelemetry-export-is-an-example-adapter.md +34 -0
  44. ragops-1.6.0/docs/architecture/component-diagram.md +22 -0
  45. ragops-1.6.0/docs/architecture/context-diagram.md +18 -0
  46. ragops-1.6.0/docs/architecture/control-plane-alpha.md +34 -0
  47. ragops-1.6.0/docs/architecture/data-model.md +33 -0
  48. ragops-1.6.0/docs/architecture/system-overview.md +23 -0
  49. ragops-1.6.0/docs/architecture/threat-model.md +36 -0
  50. ragops-1.6.0/docs/demo/cv-linkedin-copy.md +28 -0
  51. ragops-1.6.0/docs/demo/design-audit/01-current-desktop.jpg +0 -0
  52. ragops-1.6.0/docs/demo/design-audit/02-implementation-desktop.jpg +0 -0
  53. ragops-1.6.0/docs/demo/design-audit/04-implementation-mobile.jpg +0 -0
  54. ragops-1.6.0/docs/demo/design-audit/06-desktop-comparison.jpg +0 -0
  55. ragops-1.6.0/docs/demo/design-audit/09-limitations-section.jpg +0 -0
  56. ragops-1.6.0/docs/demo/design-audit/selected-open-source-adoption.png +0 -0
  57. ragops-1.6.0/docs/demo/infographics/evidence-stack.svg +54 -0
  58. ragops-1.6.0/docs/demo/infographics/release-gate-flow.svg +54 -0
  59. ragops-1.6.0/docs/demo/portfolio-case-study.md +28 -0
  60. ragops-1.6.0/docs/demo/portfolio-handoff.md +30 -0
  61. ragops-1.6.0/docs/demo/presentation-outline.md +36 -0
  62. ragops-1.6.0/docs/demo/screenshots/ragops-limitations-screen.jpg +0 -0
  63. ragops-1.6.0/docs/demo/screenshots/ragops-mobile-screen.jpg +0 -0
  64. ragops-1.6.0/docs/demo/screenshots/ragops-portfolio-desktop.jpg +0 -0
  65. ragops-1.6.0/docs/demo/screenshots/ragops-portfolio-mobile.jpg +0 -0
  66. ragops-1.6.0/docs/demo/screenshots/ragops-release-screen.jpg +0 -0
  67. ragops-1.6.0/docs/demo/screenshots/ragops-showcase-hero.jpg +0 -0
  68. ragops-1.6.0/docs/demo/social-preview.png +0 -0
  69. ragops-1.6.0/docs/demo/video-script.md +32 -0
  70. ragops-1.6.0/docs/demo/walkthrough.md +45 -0
  71. ragops-1.6.0/docs/engineering/export-your-first-trace.md +56 -0
  72. ragops-1.6.0/docs/engineering/github-pr-gate.md +69 -0
  73. ragops-1.6.0/docs/engineering/handbook.md +31 -0
  74. ragops-1.6.0/docs/engineering/observability.md +28 -0
  75. ragops-1.6.0/docs/engineering/provider-adapters.md +32 -0
  76. ragops-1.6.0/docs/engineering/pypi-publishing.md +39 -0
  77. ragops-1.6.0/docs/engineering/testing-strategy.md +24 -0
  78. ragops-1.6.0/docs/evaluation/benchmark-report-v0.2.md +69 -0
  79. ragops-1.6.0/docs/evaluation/red-team-plan.md +28 -0
  80. ragops-1.6.0/docs/evaluation/scenario-taxonomy.md +26 -0
  81. ragops-1.6.0/docs/evaluation/strategy.md +37 -0
  82. ragops-1.6.0/docs/getting-started.md +61 -0
  83. ragops-1.6.0/docs/gtm/design-partner-outreach.md +37 -0
  84. ragops-1.6.0/docs/gtm/github-launch-checklist.md +54 -0
  85. ragops-1.6.0/docs/gtm/pilot-measurement-plan.md +32 -0
  86. ragops-1.6.0/docs/product/commercialization.md +36 -0
  87. ragops-1.6.0/docs/product/competitive-analysis.md +25 -0
  88. ragops-1.6.0/docs/product/jobs-to-be-done.md +28 -0
  89. ragops-1.6.0/docs/product/oss-launch-plan.md +58 -0
  90. ragops-1.6.0/docs/product/personas.md +29 -0
  91. ragops-1.6.0/docs/product/product_thesis.md +41 -0
  92. ragops-1.6.0/docs/product/requirements-v0.1.md +40 -0
  93. ragops-1.6.0/docs/product/requirements-v0.2.md +38 -0
  94. ragops-1.6.0/docs/product/requirements-v1.5.md +45 -0
  95. ragops-1.6.0/docs/product/requirements-v1.6.md +39 -0
  96. ragops-1.6.0/docs/product/roadmap.md +63 -0
  97. ragops-1.6.0/docs/product/success-metrics.md +35 -0
  98. ragops-1.6.0/docs/project/backlog.md +61 -0
  99. ragops-1.6.0/docs/project/charter.md +32 -0
  100. ragops-1.6.0/docs/project/decision-log.md +16 -0
  101. ragops-1.6.0/docs/project/m1-acceptance.md +40 -0
  102. ragops-1.6.0/docs/project/m2-acceptance.md +24 -0
  103. ragops-1.6.0/docs/project/m3-acceptance.md +24 -0
  104. ragops-1.6.0/docs/project/m4-acceptance.md +22 -0
  105. ragops-1.6.0/docs/project/m5-acceptance.md +26 -0
  106. ragops-1.6.0/docs/project/milestones.md +14 -0
  107. ragops-1.6.0/docs/project/program-completion-audit.md +61 -0
  108. ragops-1.6.0/docs/project/release-plan.md +23 -0
  109. ragops-1.6.0/docs/project/risk-register.md +16 -0
  110. ragops-1.6.0/docs/project/v1-acceptance.md +29 -0
  111. ragops-1.6.0/docs/project/v1.5-acceptance.md +60 -0
  112. ragops-1.6.0/docs/project/v1.6-acceptance.md +39 -0
  113. ragops-1.6.0/docs/project/work-breakdown.md +34 -0
  114. ragops-1.6.0/docs/releases/v1.5.0.md +36 -0
  115. ragops-1.6.0/docs/releases/v1.6.0.md +32 -0
  116. ragops-1.6.0/examples/__init__.py +1 -0
  117. ragops-1.6.0/examples/japanese_troubleshooting_agent/README.md +57 -0
  118. ragops-1.6.0/examples/japanese_troubleshooting_agent/__init__.py +5 -0
  119. ragops-1.6.0/examples/japanese_troubleshooting_agent/agent.py +200 -0
  120. ragops-1.6.0/examples/japanese_troubleshooting_agent/architecture.md +26 -0
  121. ragops-1.6.0/examples/japanese_troubleshooting_agent/cli.py +39 -0
  122. ragops-1.6.0/examples/japanese_troubleshooting_agent/data/documents.json +10 -0
  123. ragops-1.6.0/examples/japanese_troubleshooting_agent/data/graph.json +11 -0
  124. ragops-1.6.0/examples/japanese_troubleshooting_agent/discovery.md +30 -0
  125. ragops-1.6.0/examples/japanese_troubleshooting_agent/executive-report.md +26 -0
  126. ragops-1.6.0/examples/japanese_troubleshooting_agent/results/comparison.md +19 -0
  127. ragops-1.6.0/examples/japanese_troubleshooting_agent/results/graph-traces.jsonl +4 -0
  128. ragops-1.6.0/examples/japanese_troubleshooting_agent/results/lexical-traces.jsonl +4 -0
  129. ragops-1.6.0/examples/japanese_troubleshooting_agent/rollout-plan.md +31 -0
  130. ragops-1.6.0/examples/japanese_troubleshooting_agent/scenario.json +13 -0
  131. ragops-1.6.0/examples/japanese_troubleshooting_agent/suite.json +6 -0
  132. ragops-1.6.0/examples/opentelemetry_trace_adapter/README.md +43 -0
  133. ragops-1.6.0/examples/opentelemetry_trace_adapter/__init__.py +1 -0
  134. ragops-1.6.0/examples/opentelemetry_trace_adapter/adapter.py +153 -0
  135. ragops-1.6.0/examples/opentelemetry_trace_adapter/spans.jsonl +2 -0
  136. ragops-1.6.0/pyproject.toml +32 -0
  137. ragops-1.6.0/ragops.toml +6 -0
  138. ragops-1.6.0/scenarios/japanese_troubleshooting/attack-pack.json +13 -0
  139. ragops-1.6.0/scenarios/japanese_troubleshooting/benchmark-adversarial.json +13 -0
  140. ragops-1.6.0/scenarios/japanese_troubleshooting/benchmark-baseline.json +32 -0
  141. ragops-1.6.0/scenarios/japanese_troubleshooting/benchmark-regressed.json +11 -0
  142. ragops-1.6.0/scenarios/japanese_troubleshooting/benchmark-v0.2.json +39 -0
  143. ragops-1.6.0/scenarios/japanese_troubleshooting/regressed_responses.json +16 -0
  144. ragops-1.6.0/scenarios/japanese_troubleshooting/sample_responses.json +17 -0
  145. ragops-1.6.0/scenarios/japanese_troubleshooting/sample_traces.jsonl +2 -0
  146. ragops-1.6.0/scenarios/japanese_troubleshooting/scenario.json +43 -0
  147. ragops-1.6.0/schemas/attack-pack-0.1.schema.json +30 -0
  148. ragops-1.6.0/schemas/report-0.2.schema.json +19 -0
  149. ragops-1.6.0/schemas/response-fixture-0.2.schema.json +30 -0
  150. ragops-1.6.0/schemas/scenario-0.1.schema.json +48 -0
  151. ragops-1.6.0/schemas/scenario-0.2.schema.json +54 -0
  152. ragops-1.6.0/schemas/trace-0.3.schema.json +31 -0
  153. ragops-1.6.0/schemas/trace-0.4.schema.json +50 -0
  154. ragops-1.6.0/site/apple-touch-icon.png +0 -0
  155. ragops-1.6.0/site/favicon.png +0 -0
  156. ragops-1.6.0/site/index.html +216 -0
  157. ragops-1.6.0/site/styles.css +1 -0
  158. ragops-1.6.0/skills/ragops-feature/SKILL.md +18 -0
  159. ragops-1.6.0/skills/ragops-presentation/SKILL.md +19 -0
  160. ragops-1.6.0/skills/ragops-release/SKILL.md +18 -0
  161. ragops-1.6.0/src/ragops/__init__.py +16 -0
  162. ragops-1.6.0/src/ragops/adapters/__init__.py +5 -0
  163. ragops-1.6.0/src/ragops/adapters/http.py +34 -0
  164. ragops-1.6.0/src/ragops/benchmarks.py +25 -0
  165. ragops-1.6.0/src/ragops/cli.py +207 -0
  166. ragops-1.6.0/src/ragops/config.py +14 -0
  167. ragops-1.6.0/src/ragops/control_plane.py +125 -0
  168. ragops-1.6.0/src/ragops/demo.py +162 -0
  169. ragops-1.6.0/src/ragops/engine.py +149 -0
  170. ragops-1.6.0/src/ragops/evaluators.py +70 -0
  171. ragops-1.6.0/src/ragops/loader.py +196 -0
  172. ragops-1.6.0/src/ragops/models.py +131 -0
  173. ragops-1.6.0/src/ragops/plugins.py +117 -0
  174. ragops-1.6.0/src/ragops/providers/__init__.py +5 -0
  175. ragops-1.6.0/src/ragops/providers/openai_responses.py +84 -0
  176. ragops-1.6.0/src/ragops/reporters.py +124 -0
  177. ragops-1.6.0/src/ragops/store.py +170 -0
  178. ragops-1.6.0/src/ragops/traces.py +52 -0
  179. ragops-1.6.0/tests/test_benchmarks.py +33 -0
  180. ragops-1.6.0/tests/test_comparison.py +42 -0
  181. ragops-1.6.0/tests/test_config.py +19 -0
  182. ragops-1.6.0/tests/test_control_plane.py +43 -0
  183. ragops-1.6.0/tests/test_demo.py +76 -0
  184. ragops-1.6.0/tests/test_engine.py +40 -0
  185. ragops-1.6.0/tests/test_evaluator_depth.py +64 -0
  186. ragops-1.6.0/tests/test_github_workflows.py +47 -0
  187. ragops-1.6.0/tests/test_http_adapter.py +35 -0
  188. ragops-1.6.0/tests/test_loader.py +30 -0
  189. ragops-1.6.0/tests/test_openai_provider.py +62 -0
  190. ragops-1.6.0/tests/test_opentelemetry_adapter.py +78 -0
  191. ragops-1.6.0/tests/test_plugins_and_traces.py +36 -0
  192. ragops-1.6.0/tests/test_public_api.py +30 -0
  193. ragops-1.6.0/tests/test_readme_visuals.py +32 -0
  194. ragops-1.6.0/tests/test_reference_agent.py +77 -0
  195. ragops-1.6.0/tests/test_reference_benchmark.py +25 -0
  196. ragops-1.6.0/tests/test_release_version.py +15 -0
  197. ragops-1.6.0/tests/test_response_fixtures.py +73 -0
  198. ragops-1.6.0/tests/test_scenario_v02_and_attacks.py +92 -0
  199. ragops-1.6.0/tests/test_schema_files.py +12 -0
  200. ragops-1.6.0/tests/test_showcase_site.py +72 -0
  201. ragops-1.6.0/tests/test_store_and_html.py +39 -0
  202. ragops-1.6.0/tests/test_team_workflow.py +74 -0
  203. ragops-1.6.0/tests/test_workbench.py +12 -0
@@ -0,0 +1,9 @@
1
+ .git
2
+ .github
3
+ .venv
4
+ __pycache__
5
+ .pytest_cache
6
+ .ruff_cache
7
+ reports
8
+ tests
9
+ scenarios
@@ -0,0 +1,41 @@
1
+ name: Bug report
2
+ description: Report a reproducible defect without private data
3
+ title: "[Bug]: "
4
+ labels: [bug]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: Never include secrets, customer-confidential data, or private traces.
9
+ - type: input
10
+ id: version
11
+ attributes:
12
+ label: RAGOps version or commit
13
+ placeholder: v1.6.0 or commit SHA
14
+ validations:
15
+ required: true
16
+ - type: textarea
17
+ id: reproduction
18
+ attributes:
19
+ label: Minimal reproduction
20
+ description: Include the command and a synthetic or redacted fixture.
21
+ validations:
22
+ required: true
23
+ - type: textarea
24
+ id: expected
25
+ attributes:
26
+ label: Expected behavior
27
+ validations:
28
+ required: true
29
+ - type: textarea
30
+ id: actual
31
+ attributes:
32
+ label: Actual behavior
33
+ validations:
34
+ required: true
35
+ - type: input
36
+ id: environment
37
+ attributes:
38
+ label: Environment
39
+ placeholder: Python 3.12, macOS 15
40
+ validations:
41
+ required: true
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Security vulnerability
4
+ url: https://github.com/thangldw/ragops/security/policy
5
+ about: Report vulnerabilities privately through the security policy.
6
+ - name: Support guidance
7
+ url: https://github.com/thangldw/ragops/blob/main/SUPPORT.md
8
+ about: Read what to include before opening an issue.
@@ -0,0 +1,48 @@
1
+ name: Design-partner interest
2
+ description: Explore an offline RAGOps evaluation pilot using synthetic or redacted data.
3
+ title: "[Design partner]: "
4
+ labels: [design-partner]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Do not include production secrets, personal data, customer-confidential
10
+ content, API keys, or proprietary traces in this public issue.
11
+ - type: textarea
12
+ id: workflow
13
+ attributes:
14
+ label: AI workflow
15
+ description: What RAG or agent workflow are you evaluating?
16
+ validations:
17
+ required: true
18
+ - type: textarea
19
+ id: decision
20
+ attributes:
21
+ label: Release decision today
22
+ description: How do you currently decide whether a candidate is safe and useful enough to release?
23
+ validations:
24
+ required: true
25
+ - type: textarea
26
+ id: failure
27
+ attributes:
28
+ label: Representative synthetic failure
29
+ description: Describe a redacted or synthetic regression without sharing sensitive data.
30
+ validations:
31
+ required: true
32
+ - type: dropdown
33
+ id: data
34
+ attributes:
35
+ label: Safe fixture availability
36
+ options:
37
+ - Synthetic fixtures available
38
+ - Redacted fixtures available
39
+ - Need help creating safe fixtures
40
+ validations:
41
+ required: true
42
+ - type: checkboxes
43
+ id: consent
44
+ attributes:
45
+ label: Public issue safety
46
+ options:
47
+ - label: I confirm this issue contains no secrets, personal data, or customer-confidential content.
48
+ required: true
@@ -0,0 +1,40 @@
1
+ name: Evaluator proposal
2
+ description: Propose a measurable evaluator with calibration and failure modes.
3
+ title: "[Evaluator]: "
4
+ labels: [evaluation]
5
+ body:
6
+ - type: textarea
7
+ id: construct
8
+ attributes:
9
+ label: Construct being measured
10
+ description: Define precisely what the score means and does not mean.
11
+ validations:
12
+ required: true
13
+ - type: textarea
14
+ id: method
15
+ attributes:
16
+ label: Method and inputs
17
+ description: Explain deterministic/provider behavior, required evidence, and output range.
18
+ validations:
19
+ required: true
20
+ - type: textarea
21
+ id: calibration
22
+ attributes:
23
+ label: Calibration plan
24
+ description: Labeled cases, human rubric, agreement analysis, and thresholds.
25
+ validations:
26
+ required: true
27
+ - type: textarea
28
+ id: failures
29
+ attributes:
30
+ label: Known failure modes
31
+ validations:
32
+ required: true
33
+ - type: checkboxes
34
+ id: boundary
35
+ attributes:
36
+ label: Product boundary
37
+ options:
38
+ - label: The core remains useful offline or this is an explicitly optional plugin.
39
+ required: true
40
+
@@ -0,0 +1,38 @@
1
+ name: Product feature
2
+ description: Propose a capability tied to a user outcome and release contract.
3
+ title: "[Feature]: "
4
+ labels: [enhancement]
5
+ body:
6
+ - type: textarea
7
+ id: problem
8
+ attributes:
9
+ label: User problem
10
+ description: Who has the problem, in what workflow, and why does it matter?
11
+ validations:
12
+ required: true
13
+ - type: textarea
14
+ id: outcome
15
+ attributes:
16
+ label: Desired outcome
17
+ description: Describe observable success without prescribing implementation.
18
+ validations:
19
+ required: true
20
+ - type: textarea
21
+ id: contract
22
+ attributes:
23
+ label: Contract and acceptance criteria
24
+ description: Include input, output, release behavior, compatibility, and tests.
25
+ validations:
26
+ required: true
27
+ - type: textarea
28
+ id: non_goals
29
+ attributes:
30
+ label: Non-goals and boundaries
31
+ validations:
32
+ required: true
33
+ - type: textarea
34
+ id: evidence
35
+ attributes:
36
+ label: Supporting evidence
37
+ description: Customer observation, benchmark case, incident, or design-partner request.
38
+
@@ -0,0 +1,26 @@
1
+ ## Product contract
2
+
3
+ - Requirement / issue:
4
+ - User outcome:
5
+ - Explicit non-goals:
6
+
7
+ ## Change
8
+
9
+ - Public API or schema impact:
10
+ - Metric or release-decision impact:
11
+ - Architecture / ADR impact:
12
+
13
+ ## Verification
14
+
15
+ - [ ] Tests added or updated
16
+ - [ ] `ruff check .`
17
+ - [ ] `PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 pytest -q`
18
+ - [ ] Affected CLI/API workflow exercised
19
+ - [ ] Documentation and changelog updated
20
+
21
+ ## Owner acceptance
22
+
23
+ - Evidence or demo:
24
+ - Known limitations:
25
+ - Decision requested from product owner:
26
+
@@ -0,0 +1,73 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ jobs:
8
+ test:
9
+ runs-on: ubuntu-latest
10
+ strategy:
11
+ matrix:
12
+ python-version: ["3.11", "3.12"]
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - uses: actions/setup-python@v5
16
+ with:
17
+ python-version: ${{ matrix.python-version }}
18
+ - run: pip install -e '.[dev]'
19
+ - run: ruff check .
20
+ - run: pytest
21
+ - run: ragops evaluate --scenario scenarios/japanese_troubleshooting/scenario.json --responses scenarios/japanese_troubleshooting/sample_responses.json
22
+ - name: Validate reference benchmark coverage
23
+ run: ragops inspect --scenario scenarios/japanese_troubleshooting/benchmark-v0.2.json
24
+ - name: Evaluate reference benchmark baseline
25
+ run: >-
26
+ ragops evaluate
27
+ --scenario scenarios/japanese_troubleshooting/benchmark-v0.2.json
28
+ --responses scenarios/japanese_troubleshooting/benchmark-baseline.json
29
+ --evaluator citation_correctness
30
+ --evaluator claim_support
31
+ - name: Confirm regressed benchmark is blocked
32
+ shell: bash
33
+ run: |
34
+ set +e
35
+ ragops compare \
36
+ --scenario scenarios/japanese_troubleshooting/benchmark-v0.2.json \
37
+ --baseline scenarios/japanese_troubleshooting/benchmark-baseline.json \
38
+ --candidate scenarios/japanese_troubleshooting/benchmark-regressed.json \
39
+ --format markdown
40
+ code=$?
41
+ set -e
42
+ test "$code" -eq 2
43
+ - name: Confirm adversarial benchmark is blocked
44
+ shell: bash
45
+ run: |
46
+ set +e
47
+ ragops evaluate \
48
+ --scenario scenarios/japanese_troubleshooting/benchmark-v0.2.json \
49
+ --responses scenarios/japanese_troubleshooting/benchmark-adversarial.json
50
+ code=$?
51
+ set -e
52
+ test "$code" -eq 2
53
+ - name: Render regression report
54
+ run: >-
55
+ ragops compare
56
+ --scenario scenarios/japanese_troubleshooting/scenario.json
57
+ --baseline scenarios/japanese_troubleshooting/sample_responses.json
58
+ --candidate scenarios/japanese_troubleshooting/sample_responses.json
59
+ --format markdown
60
+ --output reports/regression.md
61
+ - name: Run reference GraphRAG agent
62
+ run: >-
63
+ python -m examples.japanese_troubleshooting_agent.cli
64
+ --suite examples/japanese_troubleshooting_agent/suite.json
65
+ --retriever graph
66
+ --output /tmp/reference-traces.jsonl
67
+ - name: Evaluate reference deployment traces
68
+ run: >-
69
+ ragops evaluate
70
+ --scenario examples/japanese_troubleshooting_agent/scenario.json
71
+ --traces /tmp/reference-traces.jsonl
72
+ --evaluator citation_correctness
73
+ --evaluator claim_support
@@ -0,0 +1,39 @@
1
+ name: Nightly benchmark
2
+
3
+ on:
4
+ schedule:
5
+ - cron: "17 18 * * *"
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ benchmark:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ - uses: actions/setup-python@v5
17
+ with:
18
+ python-version: "3.12"
19
+ - run: pip install -e '.[dev]'
20
+ - name: Evaluate 30-case benchmark
21
+ run: >-
22
+ ragops evaluate
23
+ --scenario scenarios/japanese_troubleshooting/benchmark-v0.2.json
24
+ --responses scenarios/japanese_troubleshooting/benchmark-baseline.json
25
+ --evaluator citation_correctness
26
+ --evaluator claim_support
27
+ - name: Run reference deployment
28
+ run: >-
29
+ python -m examples.japanese_troubleshooting_agent.cli
30
+ --suite examples/japanese_troubleshooting_agent/suite.json
31
+ --retriever graph
32
+ --output /tmp/reference-traces.jsonl
33
+ - name: Gate reference traces
34
+ run: >-
35
+ ragops evaluate
36
+ --scenario examples/japanese_troubleshooting_agent/scenario.json
37
+ --traces /tmp/reference-traces.jsonl
38
+ --evaluator citation_correctness
39
+ --evaluator claim_support
@@ -0,0 +1,31 @@
1
+ name: Pages
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths: ["site/**", ".github/workflows/pages.yml"]
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+ pages: write
12
+ id-token: write
13
+
14
+ concurrency:
15
+ group: pages
16
+ cancel-in-progress: true
17
+
18
+ jobs:
19
+ deploy:
20
+ environment:
21
+ name: github-pages
22
+ url: ${{ steps.deployment.outputs.page_url }}
23
+ runs-on: ubuntu-latest
24
+ steps:
25
+ - uses: actions/checkout@v4
26
+ - uses: actions/configure-pages@v5
27
+ - uses: actions/upload-pages-artifact@v3
28
+ with:
29
+ path: site
30
+ - id: deployment
31
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,43 @@
1
+ name: Publish package to PyPI
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ tag:
7
+ description: Existing RAGOps release tag to publish
8
+ required: true
9
+ type: string
10
+
11
+ jobs:
12
+ publish:
13
+ runs-on: ubuntu-latest
14
+ environment: pypi
15
+ permissions:
16
+ contents: read
17
+ id-token: write
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+ with:
21
+ ref: ${{ inputs.tag }}
22
+ - uses: actions/setup-python@v5
23
+ with:
24
+ python-version: "3.12"
25
+ - name: Verify tag and package version
26
+ env:
27
+ RELEASE_TAG: ${{ inputs.tag }}
28
+ run: |
29
+ python - "$RELEASE_TAG" <<'PY'
30
+ import sys
31
+ import tomllib
32
+ from pathlib import Path
33
+
34
+ tag = sys.argv[1]
35
+ version = tomllib.loads(Path("pyproject.toml").read_text())["project"]["version"]
36
+ if tag != f"v{version}":
37
+ raise SystemExit(f"tag {tag!r} does not match package version v{version}")
38
+ print(f"publishing ragops {version}")
39
+ PY
40
+ - run: python -m pip install --upgrade build
41
+ - run: python -m build
42
+ - name: Publish distributions with Trusted Publishing
43
+ uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
@@ -0,0 +1,24 @@
1
+ name: RAGOps reusable gate smoke
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths:
7
+ - ".github/workflows/ragops-gate.yml"
8
+ - ".github/workflows/ragops-gate-smoke.yml"
9
+ - "tests/test_github_workflows.py"
10
+ pull_request:
11
+ paths:
12
+ - ".github/workflows/ragops-gate.yml"
13
+ - ".github/workflows/ragops-gate-smoke.yml"
14
+ - "tests/test_github_workflows.py"
15
+ workflow_dispatch:
16
+
17
+ jobs:
18
+ passing-reference:
19
+ uses: ./.github/workflows/ragops-gate.yml
20
+ with:
21
+ ragops-version: v1.6.0
22
+ scenario: scenarios/japanese_troubleshooting/benchmark-v0.2.json
23
+ baseline: scenarios/japanese_troubleshooting/benchmark-baseline.json
24
+ candidate: scenarios/japanese_troubleshooting/benchmark-baseline.json
@@ -0,0 +1,104 @@
1
+ name: RAGOps reusable release gate
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ python-version:
7
+ description: Python version used to run RAGOps
8
+ required: false
9
+ type: string
10
+ default: "3.12"
11
+ ragops-version:
12
+ description: RAGOps Git revision or tag to install
13
+ required: false
14
+ type: string
15
+ default: "v1.6.0"
16
+ scenario:
17
+ description: Caller-relative scenario JSON path
18
+ required: true
19
+ type: string
20
+ baseline:
21
+ description: Caller-relative accepted baseline response path
22
+ required: true
23
+ type: string
24
+ candidate:
25
+ description: Caller-relative candidate response path
26
+ required: true
27
+ type: string
28
+ policy:
29
+ description: Optional caller-relative regression policy path
30
+ required: false
31
+ type: string
32
+ default: ""
33
+
34
+ jobs:
35
+ release-gate:
36
+ runs-on: ubuntu-latest
37
+ permissions:
38
+ contents: read
39
+ steps:
40
+ - uses: actions/checkout@v4
41
+ - uses: actions/setup-python@v5
42
+ with:
43
+ python-version: ${{ inputs.python-version }}
44
+ - name: Install RAGOps
45
+ env:
46
+ RAGOPS_VERSION: ${{ inputs.ragops-version }}
47
+ run: >-
48
+ python -m pip install
49
+ "ragops @ git+https://github.com/thangldw/ragops.git@${RAGOPS_VERSION}"
50
+ - id: gate
51
+ name: Compare candidate with accepted baseline
52
+ shell: bash
53
+ env:
54
+ RAGOPS_SCENARIO: ${{ inputs.scenario }}
55
+ RAGOPS_BASELINE: ${{ inputs.baseline }}
56
+ RAGOPS_CANDIDATE: ${{ inputs.candidate }}
57
+ RAGOPS_POLICY: ${{ inputs.policy }}
58
+ run: |
59
+ set +e
60
+ command=(
61
+ ragops compare
62
+ --scenario "$RAGOPS_SCENARIO"
63
+ --baseline "$RAGOPS_BASELINE"
64
+ --candidate "$RAGOPS_CANDIDATE"
65
+ --format markdown
66
+ --output ragops-report.md
67
+ )
68
+ if [[ -n "$RAGOPS_POLICY" ]]; then
69
+ command+=(--policy "$RAGOPS_POLICY")
70
+ fi
71
+ "${command[@]}" >ragops-command.log 2>&1
72
+ gate_exit=$?
73
+ set -e
74
+ if [[ ! -f ragops-report.md ]]; then
75
+ {
76
+ echo "# RAGOps release gate error"
77
+ echo
78
+ echo '```text'
79
+ cat ragops-command.log
80
+ echo '```'
81
+ } >ragops-report.md
82
+ fi
83
+ echo "exit_code=$gate_exit" >>"$GITHUB_OUTPUT"
84
+ - name: Publish evidence to job summary
85
+ if: always()
86
+ run: cat ragops-report.md >>"$GITHUB_STEP_SUMMARY"
87
+ - name: Upload release evidence
88
+ if: always()
89
+ uses: actions/upload-artifact@v4
90
+ with:
91
+ name: ragops-release-evidence
92
+ path: |
93
+ ragops-report.md
94
+ ragops-command.log
95
+ - name: Enforce release decision
96
+ if: always()
97
+ env:
98
+ RAGOPS_GATE_EXIT: ${{ steps.gate.outputs.exit_code }}
99
+ run: |
100
+ if [[ -z "$RAGOPS_GATE_EXIT" ]]; then
101
+ echo "RAGOps gate did not produce an exit code." >&2
102
+ exit 1
103
+ fi
104
+ exit "$RAGOPS_GATE_EXIT"
@@ -0,0 +1,38 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions:
8
+ contents: write
9
+
10
+ jobs:
11
+ build:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - uses: actions/setup-python@v5
16
+ with:
17
+ python-version: "3.12"
18
+ - run: python -m pip install --upgrade build
19
+ - run: pip install -e '.[dev]'
20
+ - run: pytest
21
+ - run: ruff check .
22
+ - run: python -m build
23
+ - uses: actions/upload-artifact@v4
24
+ with:
25
+ name: python-package
26
+ path: dist/
27
+ - name: Publish GitHub Release
28
+ env:
29
+ GH_TOKEN: ${{ github.token }}
30
+ run: |
31
+ if gh release view "$GITHUB_REF_NAME" >/dev/null 2>&1; then
32
+ gh release upload "$GITHUB_REF_NAME" dist/* --clobber
33
+ else
34
+ gh release create "$GITHUB_REF_NAME" dist/* \
35
+ --verify-tag \
36
+ --title "RAGOps $GITHUB_REF_NAME" \
37
+ --notes-file "docs/releases/$GITHUB_REF_NAME.md"
38
+ fi
@@ -0,0 +1,13 @@
1
+ .venv/
2
+ .release-venv/
3
+ .release-check-venv/
4
+ __pycache__/
5
+ *.py[cod]
6
+ .pytest_cache/
7
+ .ruff_cache/
8
+ dist/
9
+ build/
10
+ *.egg-info/
11
+ reports/
12
+ .env
13
+ .DS_Store
ragops-1.6.0/AGENTS.md ADDED
@@ -0,0 +1,36 @@
1
+ # RAGOps collaboration contract
2
+
3
+ This repository is product-first. Product intent, contracts, and acceptance
4
+ criteria are authoritative; implementation must not silently redefine them.
5
+
6
+ ## Ownership
7
+
8
+ - Thang owns product vision, architecture acceptance, review, and release.
9
+ - Codex and Claude Code may implement, test, refactor, and propose ADRs.
10
+ - Any change to a public schema, release gate, metric meaning, or open-core
11
+ boundary requires an ADR and explicit owner review.
12
+
13
+ ## Required workflow
14
+
15
+ 1. Read the relevant product requirement and architecture decision.
16
+ 2. State the contract being changed and its compatibility impact.
17
+ 3. Implement the smallest vertical slice, including tests and documentation.
18
+ 4. Run `ruff check .` and `PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 pytest -q`.
19
+ 5. Update the changelog for user-visible behavior.
20
+ 6. Leave the work ready for owner acceptance; do not publish or release unless
21
+ explicitly requested.
22
+
23
+ ## Architectural boundaries
24
+
25
+ - `src/ragops/` is the dependency-free evaluation core.
26
+ - `apps/` contains adapters and user interfaces, not evaluation semantics.
27
+ - `scenarios/` contains portable fixtures, policies, and expected evidence.
28
+ - Provider integrations are optional adapters or plugins.
29
+ - The open-source core must remain valuable without a hosted service.
30
+
31
+ ## Repository skills
32
+
33
+ - Use `skills/ragops-feature/SKILL.md` for feature implementation.
34
+ - Use `skills/ragops-release/SKILL.md` for validation and release readiness.
35
+ - Use `skills/ragops-presentation/SKILL.md` for demos and presentation assets.
36
+