From 6e619a26d19b7beae83616ac94bfce9810314f21 Mon Sep 17 00:00:00 2001 From: Thang Luu <76550342+thangldw@users.noreply.github.com> Date: Sun, 23 Aug 2026 16:03:14 +0900 Subject: [PATCH] release: prepare RagOps 2.0.1 --- .claude-plugin/plugin.json | 2 +- .codex-plugin/plugin.json | 2 +- .kimi-plugin/plugin.json | 2 +- CHANGELOG.md | 18 ++++++++++++++++++ README.md | 2 +- docs/examples/github-actions-ragops.yml | 2 +- docs/examples/gitlab-ci-ragops.yml | 2 +- docs/releases/v2.0.1.md | 15 +++++++++++++++ docs/submission/DIRECTORY_SUBMISSION.md | 4 ++-- pyproject.toml | 2 +- src/ragops/__init__.py | 2 +- tests/test_adoption_recipes.py | 4 ++-- tests/test_github_workflows.py | 2 +- tests/test_local_release.py | 2 +- tests/test_plugin_release.py | 10 +++++----- tests/test_public_api.py | 2 +- tests/test_release_version.py | 6 +++--- 17 files changed, 56 insertions(+), 23 deletions(-) create mode 100644 docs/releases/v2.0.1.md diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 39161fa..f77b335 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "ragops", - "version": "2.0.0", + "version": "2.0.1", "description": "Explainable regression tests and release gates for RAG systems and AI agents.", "author": { "name": "Thang Luu", diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index a65ceb9..130d4f0 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "ragops", - "version": "2.0.0", + "version": "2.0.1", "description": "Offline, explainable release gates and evidence bundles for RAG systems and AI agents.", "author": { "name": "Thang Luu", diff --git a/.kimi-plugin/plugin.json b/.kimi-plugin/plugin.json index 6430c6b..43e6c41 100644 --- a/.kimi-plugin/plugin.json +++ b/.kimi-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "ragops", - "version": "2.0.0", + "version": "2.0.1", "description": "Explainable regression tests and release gates for RAG systems and AI agents.", "author": { "name": "Thang Luu", diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f77b62..0c36a61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,23 @@ - No unreleased changes. +## [2.0.1] - 2026-08-23 + +### English + +- Republished the unchanged RAGOps 2.0 feature set under a new patch version because PyPI permanently reserves filenames from deleted releases. +- Corrected the Trusted Publishing action reference so GitHub Actions uses the published v1.14.2 container with Core Metadata 2.5 support. + +### Tiếng Việt + +- Phát hành lại toàn bộ tính năng RAGOps 2.0 dưới patch version mới vì PyPI khóa vĩnh viễn filename của release đã bị xóa. +- Sửa tham chiếu Trusted Publishing để GitHub Actions dùng container v1.14.2 đã phát hành và hỗ trợ Core Metadata 2.5. + +### 日本語 + +- 削除済みリリースのファイル名を PyPI が恒久的に予約するため、RAGOps 2.0 の機能を新しいパッチ版で再公開しました。 +- Trusted Publishing の参照を修正し、Core Metadata 2.5 対応の公開済み v1.14.2 コンテナを使用します。 + ## [2.0.0] - 2026-08-23 ### English @@ -67,6 +84,7 @@ - リポジトリ所有の GitHub Actions をすべて削除し、リリースゲートはローカル CLI と API で引き続き利用できます。 - 公開タグとパッケージ版を `v1.0.0` に統一しました。 +[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 [1.0.0]: https://github.com/thangldw/ragops/releases/tag/v1.0.0 diff --git a/README.md b/README.md index c98733f..35b71f7 100644 --- a/README.md +++ b/README.md @@ -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.0 release notes](docs/releases/v2.0.0.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.1 release notes](docs/releases/v2.0.1.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). diff --git a/docs/examples/github-actions-ragops.yml b/docs/examples/github-actions-ragops.yml index 6720845..23a1e99 100644 --- a/docs/examples/github-actions-ragops.yml +++ b/docs/examples/github-actions-ragops.yml @@ -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.0" + - run: python -m pip install --disable-pip-version-check "ragops==2.0.1" - name: Evaluate release candidate run: ragops demo --profile engineer --output ragops-output - name: Verify evidence bundle diff --git a/docs/examples/gitlab-ci-ragops.yml b/docs/examples/gitlab-ci-ragops.yml index c31f73d..bf331aa 100644 --- a/docs/examples/gitlab-ci-ragops.yml +++ b/docs/examples/gitlab-ci-ragops.yml @@ -2,7 +2,7 @@ ragops_release_gate: stage: test image: python:3.12-slim variables: - RAGOPS_VERSION: "2.0.0" + RAGOPS_VERSION: "2.0.1" 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" diff --git a/docs/releases/v2.0.1.md b/docs/releases/v2.0.1.md new file mode 100644 index 0000000..57a1949 --- /dev/null +++ b/docs/releases/v2.0.1.md @@ -0,0 +1,15 @@ +# RAGOps v2.0.1 + +RAGOps 2.0.1 republishes the complete 2.0 feature set under a usable PyPI version. PyPI permanently reserved the deleted `2.0.0` distribution filenames, so `2.0.1` is the first installable PyPI release of the 2.0 line. + +The release preserves the offline, provider-independent evaluation contract, content-addressed evidence bundles, slice and distribution gates, calibration, trace graphs, dataset leakage controls, CI-native outputs, portable adapters, blind review governance, optional API/workbench, and deterministic ChatGPT skills-only plugin bundle introduced in 2.0.0. + +The credential-free flagship demo 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. +- Existing scenario 0.1/0.2 and trace 0.3 readers remain supported. +- FastAPI/Uvicorn remain optional through `ragops[api]`. +- No hosted MCP connector is included. diff --git a/docs/submission/DIRECTORY_SUBMISSION.md b/docs/submission/DIRECTORY_SUBMISSION.md index 680a431..afeaee1 100644 --- a/docs/submission/DIRECTORY_SUBMISSION.md +++ b/docs/submission/DIRECTORY_SUBMISSION.md @@ -4,9 +4,9 @@ Prepared: 2026-08-23 Published on the OpenAI Plugin Directory: https://chatgpt.com/plugins/plugins_6a6ed9e25c60819194c48f4233ae507e -PyPI release target: https://pypi.org/project/ragops/2.0.0/ +PyPI release target: https://pypi.org/project/ragops/2.0.1/ -Submission artifact: `dist/ragops-chatgpt-plugin-2.0.0.zip` +Submission artifact: `dist/ragops-chatgpt-plugin-2.0.1.zip` ## Submission choice diff --git a/pyproject.toml b/pyproject.toml index 4f01a44..ebea22e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "ragops" -version = "2.0.0" +version = "2.0.1" description = "Regression tests and explainable release gates for RAG and AI agents" readme = "README.md" requires-python = ">=3.11" diff --git a/src/ragops/__init__.py b/src/ragops/__init__.py index 369a22b..4f40e15 100644 --- a/src/ragops/__init__.py +++ b/src/ragops/__init__.py @@ -12,7 +12,7 @@ replay_bundle_from_dict, ) -__version__ = "2.0.0" +__version__ = "2.0.1" __all__ = [ "compare", diff --git a/tests/test_adoption_recipes.py b/tests/test_adoption_recipes.py index c9400b5..2c9a57f 100644 --- a/tests/test_adoption_recipes.py +++ b/tests/test_adoption_recipes.py @@ -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.0"' in recipe + assert 'RAGOPS_VERSION: "2.0.1"' in recipe assert 'if: \'$CI_PIPELINE_SOURCE == "merge_request_event"\'' in recipe assert "gate_exit=$?" in recipe assert 'exit "$gate_exit"' in recipe @@ -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.0"' in recipe + assert '"ragops==2.0.1"' in recipe assert "ragops evidence verify" in recipe assert '>> "$GITHUB_STEP_SUMMARY"' in recipe diff --git a/tests/test_github_workflows.py b/tests/test_github_workflows.py index 7aaa2f1..120e924 100644 --- a/tests/test_github_workflows.py +++ b/tests/test_github_workflows.py @@ -26,7 +26,7 @@ def test_current_operations_are_linked() -> None: for guide in ( "docs/ARCHITECTURE.md", "docs/OPERATIONS.md", - "docs/releases/v2.0.0.md", + "docs/releases/v2.0.1.md", ): assert Path(guide).is_file() assert guide in readme diff --git a/tests/test_local_release.py b/tests/test_local_release.py index 879ba27..94bff2d 100644 --- a/tests/test_local_release.py +++ b/tests/test_local_release.py @@ -8,7 +8,7 @@ def test_tag_must_match_package_version() -> None: - assert local_release.assert_tag(local_release.milestone_tag()) == "v2.0.0" + assert local_release.assert_tag(local_release.milestone_tag()) == "v2.0.1" def test_checksum_manifest_is_deterministic(tmp_path, monkeypatch) -> None: diff --git a/tests/test_plugin_release.py b/tests/test_plugin_release.py index d66edd5..ef3f195 100644 --- a/tests/test_plugin_release.py +++ b/tests/test_plugin_release.py @@ -16,15 +16,15 @@ def test_chatgpt_plugin_bundle_is_deterministic_and_self_contained(tmp_path, monkeypatch): monkeypatch.setattr(local_release, "DIST", tmp_path) - first = local_release.build_plugin_bundle("2.0.0") + first = local_release.build_plugin_bundle("2.0.1") first_bytes = first.read_bytes() - second = local_release.build_plugin_bundle("2.0.0") + second = local_release.build_plugin_bundle("2.0.1") assert second.read_bytes() == first_bytes with zipfile.ZipFile(first) as archive: names = archive.namelist() manifest = json.loads(archive.read(".codex-plugin/plugin.json")) - assert manifest["version"] == "2.0.0" + assert manifest["version"] == "2.0.1" assert "skills/evaluate-ai-release/SKILL.md" in names assert "skills/evaluate-ai-release/scripts/run_ragops.py" in names assert "skills/evaluate-ai-release/scripts/vendor/ragops/cli.py" in names @@ -35,7 +35,7 @@ def test_chatgpt_plugin_bundle_is_deterministic_and_self_contained(tmp_path, mon def test_extracted_chatgpt_bundle_runs_without_install(tmp_path, monkeypatch): monkeypatch.setattr(local_release, "DIST", tmp_path) - bundle = local_release.build_plugin_bundle("2.0.0") + bundle = local_release.build_plugin_bundle("2.0.1") extracted = tmp_path / "plugin" with zipfile.ZipFile(bundle) as archive: archive.extractall(extracted) @@ -49,4 +49,4 @@ def test_extracted_chatgpt_bundle_runs_without_install(tmp_path, monkeypatch): text=True, ) - assert result.stdout.strip() == "ragops 2.0.0" + assert result.stdout.strip() == "ragops 2.0.1" diff --git a/tests/test_public_api.py b/tests/test_public_api.py index 5c1d8ea..aabfc0b 100644 --- a/tests/test_public_api.py +++ b/tests/test_public_api.py @@ -3,7 +3,7 @@ def test_stable_version() -> None: - assert __version__ == "2.0.0" + assert __version__ == "2.0.1" def test_cli_exposes_version(capsys) -> None: diff --git a/tests/test_release_version.py b/tests/test_release_version.py index 7403292..2dd087b 100644 --- a/tests/test_release_version.py +++ b/tests/test_release_version.py @@ -10,9 +10,9 @@ def test_package_and_release_metadata_versions_match() -> None: version = metadata["project"]["version"] changelog = Path("CHANGELOG.md").read_text(encoding="utf-8") - assert version == __version__ == "2.0.0" + assert version == __version__ == "2.0.1" assert f"## [{version}]" in changelog - assert Path("docs/releases/v2.0.0.md").is_file() + assert Path("docs/releases/v2.0.1.md").is_file() def test_plugin_manifests_match_package_version() -> None: @@ -25,4 +25,4 @@ def test_plugin_manifests_match_package_version() -> None: ) } - assert versions == {"2.0.0"} + assert versions == {"2.0.1"}