Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ragops",
"version": "2.0.1",
"version": "2.0.2",
"description": "Explainable regression tests and release gates for RAG systems and AI agents.",
"author": {
"name": "Thang Luu",
Expand Down
2 changes: 1 addition & 1 deletion .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ragops",
"version": "2.0.1",
"version": "2.0.2",
"description": "Offline, explainable release gates and evidence bundles for RAG systems and AI agents.",
"author": {
"name": "Thang Luu",
Expand Down
2 changes: 1 addition & 1 deletion .kimi-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ragops",
"version": "2.0.1",
"version": "2.0.2",
"description": "Explainable regression tests and release gates for RAG systems and AI agents.",
"author": {
"name": "Thang Luu",
Expand Down
19 changes: 18 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,25 @@

## Unreleased

## [2.0.2] - 2026-08-24

### English

- Added a synthetic retrieval-poisoning Failure Zoo specimen, a published-package Windows smoke test, CodeQL scanning, and explicit local-only usage evidence.
- Added a deterministic synthetic retrieval-poisoning Failure Zoo specimen with explicit unsupported-citation, unsupported-claim, and forbidden-output findings.
- Added checkout-free Windows verification of the published package, least-privilege CodeQL scanning, and protected-branch release gates.
- Added disabled-by-default local usage evidence that records only command, exit code, version, and UTC timestamp without arguments or paths.

### Tiếng Việt

- Bổ sung mẫu synthetic retrieval poisoning xác định với các finding rõ ràng về citation không được hỗ trợ, claim không có căn cứ và output bị cấm.
- Bổ sung kiểm tra Windows không checkout từ package đã public, CodeQL theo least privilege và release gate bảo vệ nhánh chính.
- Bổ sung bằng chứng sử dụng local mặc định tắt, chỉ ghi command, exit code, version và UTC timestamp, không ghi arguments hoặc paths.

### 日本語

- unsupported citation、unsupported claim、forbidden output を明示する決定的な synthetic retrieval-poisoning Failure Zoo specimen を追加しました。
- 公開 package の checkout-free Windows 検証、least-privilege CodeQL、保護 branch release gate を追加しました。
- デフォルト無効で、引数や path を記録せず command、exit code、version、UTC timestamp のみを残す local usage evidence を追加しました。

## [2.0.1] - 2026-08-23

Expand Down Expand Up @@ -84,6 +100,7 @@
- リポジトリ所有の GitHub Actions をすべて削除し、リリースゲートはローカル CLI と API で引き続き利用できます。
- 公開タグとパッケージ版を `v1.0.0` に統一しました。

[2.0.2]: https://github.com/thangldw/ragops/releases/tag/v2.0.2
[2.0.1]: https://github.com/thangldw/ragops/releases/tag/v2.0.1
[2.0.0]: https://github.com/thangldw/ragops/releases/tag/v2.0.0
[1.2.0]: https://github.com/thangldw/ragops/releases/tag/v1.2.0
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ RAGOps compares recorded candidate behavior with an accepted baseline, applies a

Requirements: Python 3.11+.

Current technical references: [architecture](docs/ARCHITECTURE.md), [contracts](docs/CONTRACTS.md), [governance](docs/governance.md), [operations](docs/OPERATIONS.md), [security](SECURITY.md), and [v2.0.1 release notes](docs/releases/v2.0.1.md).
Current technical references: [architecture](docs/ARCHITECTURE.md), [contracts](docs/CONTRACTS.md), [governance](docs/governance.md), [operations](docs/OPERATIONS.md), [security](SECURITY.md), and [v2.0.2 release notes](docs/releases/v2.0.2.md).

The repository is also a skills-only plugin for ChatGPT, Codex, Claude Code and Cowork. It does not include a hosted MCP connector. See the [directory submission package](docs/submission/DIRECTORY_SUBMISSION.md), [privacy policy](PRIVACY.md), [terms](TERMS.md), and [support guidance](SUPPORT.md).

Expand Down
2 changes: 1 addition & 1 deletion docs/examples/github-actions-ragops.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.12"
- run: python -m pip install --disable-pip-version-check "ragops==2.0.1"
- run: python -m pip install --disable-pip-version-check "ragops==2.0.2"
- name: Evaluate release candidate
run: ragops demo --profile engineer --output ragops-output
- name: Verify evidence bundle
Expand Down
2 changes: 1 addition & 1 deletion docs/examples/gitlab-ci-ragops.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ ragops_release_gate:
stage: test
image: python:3.12-slim
variables:
RAGOPS_VERSION: "2.0.1"
RAGOPS_VERSION: "2.0.2"
RAGOPS_SCENARIO: "scenarios/japanese_troubleshooting/benchmark-v0.2.json"
RAGOPS_BASELINE: "scenarios/japanese_troubleshooting/benchmark-baseline.json"
RAGOPS_CANDIDATE: "scenarios/japanese_troubleshooting/benchmark-regressed.json"
Expand Down
19 changes: 19 additions & 0 deletions docs/releases/v2.0.2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# RAGOps v2.0.2

RAGOps 2.0.2 hardens the public 2.0 release path without changing the offline evaluation contract or supported readers.

- Adds a deterministic synthetic retrieval-poisoning Failure Zoo specimen that blocks on `unsupported_citation`, `unsupported_claim`, and `forbidden_output_term`.
- Verifies the published package on checkout-free Windows and preserves the same synthetic `BLOCK` decision and evidence verification.
- Adds least-privilege CodeQL scanning and protected-main release gates for Python 3.11, 3.12, 3.13, Windows, and CodeQL.
- Adds disabled-by-default local usage evidence containing only UTC timestamp, RAGOps version, top-level command, and exit code. Arguments and paths are not recorded, and no event is sent over the network.

The credential-free flagship demo still intentionally blocks a synthetic regression: citation coverage `1.0 -> 0.5`, citation precision `1.0 -> 0.5`, and lexical groundedness `1.0 -> 0.6`. This is reproducible synthetic evidence, not production adoption evidence.

## Compatibility

- Python 3.11 or newer.
- Dependency-free core remains offline with zero required runtime dependencies.
- Existing scenario 0.1/0.2 and trace 0.3/0.4 readers remain supported.
- Existing CLI commands, exit codes, and canonical `PASS`, `WARN`, and `BLOCK` decisions are unchanged.
- FastAPI/Uvicorn remain optional through `ragops[api]`.
- No hosted MCP connector is included; the ChatGPT package remains a skills-only plugin.
10 changes: 5 additions & 5 deletions docs/submission/DIRECTORY_SUBMISSION.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# RAGOps directory submission

Prepared: 2026-08-23
Prepared: 2026-08-24

Published on the OpenAI Plugin Directory: https://chatgpt.com/plugins/plugins_6a6ed9e25c60819194c48f4233ae507e

PyPI release target: https://pypi.org/project/ragops/2.0.1/
PyPI release target: https://pypi.org/project/ragops/2.0.2/

Submission artifact: `dist/ragops-chatgpt-plugin-2.0.1.zip`
Submission artifact: `dist/ragops-chatgpt-plugin-2.0.2.zip`

## Submission choice

Expand Down Expand Up @@ -61,9 +61,9 @@ Submission artifact: `dist/ragops-chatgpt-plugin-2.0.1.zip`

No account or credential is required. Use Python 3.11+ and run the bundled wrapper at `skills/evaluate-ai-release/scripts/run_ragops.py`. The OpenAI ZIP stores review fixtures under `skills/evaluate-ai-release/references/fixtures/japanese_troubleshooting`; the GitHub plugin uses the canonical copies under `scenarios/japanese_troubleshooting`. A gate block may return exit code 2; this is an expected evaluated outcome.

## v2.0 update notes
## v2.0.2 update notes

RAGOps 2.0 adds content-addressed evidence bundles, slice-aware policy, calibration, trace graphs, dataset leakage checks, CI-native output, portable import profiles, and audited blind review. The plugin remains skills-only and does not include a hosted MCP connector. The optional local API/workbench is distributed through the Python package, not as a remote ChatGPT connector.
RAGOps 2.0.2 adds a synthetic retrieval-poisoning regression specimen, verified checkout-free Windows use of the published package, CodeQL and protected-branch gates, and explicit opt-in local usage evidence. It retains the 2.0 content-addressed evidence, slice-aware policy, calibration, trace-graph, dataset leakage, CI output, portable import, and blind-review contracts. The plugin remains skills-only and does not include a hosted MCP connector. The optional local API/workbench is distributed through the Python package, not as a remote ChatGPT connector.

## Final portal checks

Expand Down
212 changes: 212 additions & 0 deletions docs/superpowers/plans/2026-08-24-ragops-2.0.2-release.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
# RAGOps 2.0.2 Release Implementation Plan

> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** Publish the verified post-2.0.1 hardening changes as RAGOps 2.0.2 on GitHub and PyPI, then prepare the ChatGPT Plugin 2.0.2 draft for owner attestations.

**Architecture:** Treat package metadata, plugin manifests, release notes, and copyable CI recipes as one versioned release contract. Build every promoted artifact from the protected-branch commit, publish the exact GitHub assets through tag-bound PyPI Trusted Publishing, and keep the currently published package in the checkout-free Windows smoke until 2.0.2 is available from PyPI.

**Tech Stack:** Python 3.11-3.13, pytest, Ruff, PyPA build, CycloneDX, GitHub Actions, PyPI Trusted Publishing, ChatGPT Plugin Directory.

**Spec:** `docs/superpowers/specs/2026-08-23-ragops-production-flagship-adoption-design.md`

## Global Constraints

- Python remains `>=3.11` with zero required runtime dependencies.
- The dependency-free core performs no network calls.
- Synthetic evidence is never described as production adoption evidence.
- Existing CLI commands, schemas, decisions, and exit codes remain compatible.
- GitHub Release, PyPI publication, ChatGPT submission, approval, and publication are independently verified states.
- Do not attest or submit on behalf of DUC THANG LUU without action-time confirmation.
- Do not perform final ChatGPT Publish without a separate action-time confirmation.
- Preserve workflow run `30749103590` as audit history if GitHub still rejects cancellation; do not delete it.

---

### Task 1: Versioned release contract

**Files:**
- Create: `docs/releases/v2.0.2.md`
- Modify: `pyproject.toml`
- Modify: `src/ragops/__init__.py`
- Modify: `.codex-plugin/plugin.json`
- Modify: `.claude-plugin/plugin.json`
- Modify: `.kimi-plugin/plugin.json`
- Modify: `CHANGELOG.md`
- Modify: `README.md`
- Modify: `docs/submission/DIRECTORY_SUBMISSION.md`
- Modify: `docs/examples/github-actions-ragops.yml`
- Modify: `docs/examples/gitlab-ci-ragops.yml`
- Modify: `tests/test_release_version.py`
- Modify: `tests/test_plugin_release.py`
- Modify: `tests/test_local_release.py`
- Modify: `tests/test_public_api.py`
- Modify: `tests/test_usage.py`
- Modify: `tests/test_adoption_recipes.py`
- Modify: `tests/test_github_workflows.py`
- Test: `tests/test_release_version.py`
- Test: `tests/test_plugin_release.py`
- Test: `tests/test_local_release.py`
- Test: `tests/test_public_api.py`
- Test: `tests/test_usage.py`
- Test: `tests/test_adoption_recipes.py`
- Test: `tests/test_github_workflows.py`

**Interfaces:**
- Consumes: merged post-release hardening commit `2596bc42a4218a06b4806eabe7bbb4608ff84c84` and published 2.0.1 compatibility contract.
- Produces: package/plugin version `2.0.2`, release notes dated 2026-08-24, and copyable consumer recipes pinned to `ragops==2.0.2`.

- [x] **Step 1: Change release-contract expectations to 2.0.2**

Update literal current-version assertions in the six test files. Keep historical local-usage event fixtures at 2.0.1, and keep the live checkout-free Windows workflow pinned to the last published package 2.0.1 until Task 4.

- [x] **Step 2: Run focused tests and verify RED**

Run:

```bash
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 .venv/bin/python -m pytest -q \
tests/test_release_version.py tests/test_plugin_release.py \
tests/test_local_release.py tests/test_public_api.py \
tests/test_usage.py tests/test_adoption_recipes.py \
tests/test_github_workflows.py
```

Expected: failures identify package/plugin/docs/recipe version 2.0.1 where 2.0.2 is required.

- [x] **Step 3: Apply the minimal version and documentation update**

Set package and all plugin manifests to 2.0.2. Move the Unreleased hardening note into a multilingual `2.0.2` changelog section dated 2026-08-24, add the tag link, write release notes that enumerate retrieval-poisoning coverage, checkout-free Windows verification, CodeQL/repository governance, and opt-in local usage evidence, and preserve the synthetic-only limitation. Update current README, submission artifact/PyPI target, and consumer recipes.

- [x] **Step 4: Run focused tests and verify GREEN**

Run the Step 2 command. Expected: all focused tests pass.

- [x] **Step 5: Commit the release contract**

```bash
git add pyproject.toml src/ragops/__init__.py .codex-plugin/plugin.json \
.claude-plugin/plugin.json .kimi-plugin/plugin.json CHANGELOG.md README.md \
docs/releases/v2.0.2.md docs/submission/DIRECTORY_SUBMISSION.md \
docs/examples/github-actions-ragops.yml docs/examples/gitlab-ci-ragops.yml \
tests/test_release_version.py tests/test_plugin_release.py \
tests/test_local_release.py tests/test_public_api.py tests/test_usage.py \
tests/test_adoption_recipes.py tests/test_github_workflows.py \
docs/superpowers/plans/2026-08-24-ragops-2.0.2-release.md
git commit -m "chore: prepare RAGOps 2.0.2 release"
```

### Task 2: Local owner-acceptance evidence

**Files:**
- Generate, do not commit: `dist/*`

**Interfaces:**
- Consumes: clean 2.0.2 release-contract commit.
- Produces: wheel, sdist, deterministic ChatGPT plugin ZIP, CycloneDX SBOM, SHA-256 manifest, and local release evidence bound to the commit.

- [ ] **Step 1: Run complete source verification**

```bash
.venv/bin/ruff check .
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 .venv/bin/python -m pytest -q
git diff --check
```

Expected: Ruff clean, all tests pass, and no whitespace errors.

- [ ] **Step 2: Run the release verifier**

```bash
.venv/bin/python scripts/local_release.py verify --tag v2.0.2
```

Expected: evaluate passes, regression comparison exits with the expected evaluated BLOCK, the wheel clean-installs and runs the demo/evidence verifier, and all six release artifacts are created.

- [ ] **Step 3: Validate artifacts independently**

```bash
(cd dist && shasum -a 256 -c SHA256SUMS)
.venv/bin/python -m twine check dist/ragops-2.0.2.tar.gz dist/ragops-2.0.2-py3-none-any.whl
.venv/bin/python -m zipfile --list dist/ragops-chatgpt-plugin-2.0.2.zip
```

Expected: every digest and distribution validates, and the plugin ZIP contains only the manifest, asset, skill, vendored dependency-free core, schemas, and synthetic review fixtures.

### Task 3: Protected-branch integration

**Files:**
- All committed Task 1 files.

**Interfaces:**
- Consumes: verified release branch and GitHub ruleset `Protect main`.
- Produces: merged `main` commit after required Python 3.11/3.12/3.13, Windows, and CodeQL checks.

- [ ] **Step 1: Push and open the release PR**

```bash
git push -u origin codex/release-2.0.2
gh pr create --repo thangldw/ragops --base main --head codex/release-2.0.2 \
--title "Release RAGOps 2.0.2" \
--body-file docs/releases/v2.0.2.md
```

- [ ] **Step 2: Wait for and inspect every required check**

Run `gh pr checks --watch` and verify the required contexts are successful with no unresolved review threads.

- [ ] **Step 3: Merge through the ruleset and verify main**

Merge the PR without bypass or force-push, fetch `origin/main`, and verify the merged commit contains the exact release contract.

### Task 4: GitHub and PyPI publication

**Files:**
- Promote: exact `dist/*` rebuilt from the merged `main` commit.
- Post-publish modify: `.github/workflows/ci.yml`
- Post-publish modify: `tests/test_github_workflows.py`

**Interfaces:**
- Consumes: protected merged 2.0.2 commit and tag-bound Trusted Publishing workflow.
- Produces: annotated `v2.0.2`, GitHub Release assets, PyPI 2.0.2, and a checkout-free Windows smoke pinned to the newly public package.

- [ ] **Step 1: Rebuild from the exact merged commit**

Create a clean release worktree at the merged commit, run `scripts/local_release.py verify --tag v2.0.2`, and compare the artifact manifest with Task 2. If the merge commit differs only by Git history, record the new commit-bound evidence and promote only this rebuild.

- [ ] **Step 2: Tag and create the GitHub Release**

Run `scripts/local_release.py publish-github --tag v2.0.2 --yes`; verify tag target, release state, asset count, and every checksum downloaded from GitHub.

- [ ] **Step 3: Publish with PyPI Trusted Publishing**

Dispatch `.github/workflows/publish-pypi.yml` with input `tag=v2.0.2`, wait for success, verify the PyPI JSON API reports 2.0.2, and clean-install `ragops==2.0.2` from PyPI in a temporary environment.

- [ ] **Step 4: Advance the Windows public-package smoke**

In a follow-up protected PR, change both the Windows workflow and its test from 2.0.1 to 2.0.2, run focused/full verification, merge after all required checks, and confirm the checkout-free Windows job succeeds against PyPI.

### Task 5: ChatGPT Plugin 2.0.2 draft

**Files:**
- Upload: verified GitHub Release asset `ragops-chatgpt-plugin-2.0.2.zip`

**Interfaces:**
- Consumes: publicly verified PyPI/GitHub 2.0.2 and authenticated plugin `plugins_6a6ed9e25c60819194c48f4233ae507e`.
- Produces: one 2.0.2 update draft with passed automated checks and verified metadata; no duplicate submission.

- [ ] **Step 1: Create one version-update draft**

Open the existing plugin, start its update flow, upload the checksum-verified 2.0.2 plugin ZIP, and record the draft ID.

- [ ] **Step 2: Monitor automated checks**

If checks fail, inspect the visible error and official OpenAI documentation, make only safe in-scope corrections, rebuild/re-upload to the same draft, and never create a duplicate submission.

- [ ] **Step 3: Verify draft metadata**

Confirm version 2.0.2, name RAGOps, developer DUC THANG LUU, category, descriptions, legal/support/source URLs, permissions, starter prompts, and update notes match the repository evidence.

- [ ] **Step 4: Stop before legal attestations and submission**

Do not check the four policy attestations or click Confirm and submit. Request action-time confirmation from the user to attest and submit on behalf of DUC THANG LUU. After confirmation, submit and monitor review. Request a separate action-time confirmation before final Publish.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "hatchling.build"

[project]
name = "ragops"
version = "2.0.1"
version = "2.0.2"
description = "Regression tests and explainable release gates for RAG and AI agents"
readme = "README.md"
requires-python = ">=3.11"
Expand Down
2 changes: 1 addition & 1 deletion src/ragops/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
replay_bundle_from_dict,
)

__version__ = "2.0.1"
__version__ = "2.0.2"

__all__ = [
"compare",
Expand Down
4 changes: 2 additions & 2 deletions tests/test_adoption_recipes.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
def test_gitlab_recipe_preserves_evidence_and_exit_code() -> None:
recipe = Path("docs/examples/gitlab-ci-ragops.yml").read_text(encoding="utf-8")

assert 'RAGOPS_VERSION: "2.0.1"' in recipe
assert 'RAGOPS_VERSION: "2.0.2"' in recipe
assert 'if: \'$CI_PIPELINE_SOURCE == "merge_request_event"\'' in recipe
assert "gate_exit=$?" in recipe
assert 'exit "$gate_exit"' in recipe
Expand Down Expand Up @@ -40,6 +40,6 @@ def test_github_caller_is_read_only_and_verifies_evidence() -> None:
assert "id-token: write" not in recipe
assert "persist-credentials: false" in recipe
assert re.search(r"actions/checkout@[0-9a-f]{40}", recipe)
assert '"ragops==2.0.1"' in recipe
assert '"ragops==2.0.2"' in recipe
assert "ragops evidence verify" in recipe
assert '>> "$GITHUB_STEP_SUMMARY"' in recipe
2 changes: 1 addition & 1 deletion tests/test_github_workflows.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ def test_current_operations_are_linked() -> None:
for guide in (
"docs/ARCHITECTURE.md",
"docs/OPERATIONS.md",
"docs/releases/v2.0.1.md",
"docs/releases/v2.0.2.md",
):
assert Path(guide).is_file()
assert guide in readme
2 changes: 1 addition & 1 deletion tests/test_local_release.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@


def test_tag_must_match_package_version() -> None:
assert local_release.assert_tag(local_release.milestone_tag()) == "v2.0.1"
assert local_release.assert_tag(local_release.milestone_tag()) == "v2.0.2"


def test_checksum_manifest_is_deterministic(tmp_path, monkeypatch) -> None:
Expand Down
Loading