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.0",
"version": "2.0.1",
"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.0",
"version": "2.0.1",
"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.0",
"version": "2.0.1",
"description": "Explainable regression tests and release gates for RAG systems and AI agents.",
"author": {
"name": "Thang Luu",
Expand Down
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
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.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).

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.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
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.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"
Expand Down
15 changes: 15 additions & 0 deletions docs/releases/v2.0.1.md
Original file line number Diff line number Diff line change
@@ -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.
4 changes: 2 additions & 2 deletions docs/submission/DIRECTORY_SUBMISSION.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
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.0"
version = "2.0.1"
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.0"
__version__ = "2.0.1"

__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.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
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.0"' in recipe
assert '"ragops==2.0.1"' 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 @@ -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
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.0"
assert local_release.assert_tag(local_release.milestone_tag()) == "v2.0.1"


def test_checksum_manifest_is_deterministic(tmp_path, monkeypatch) -> None:
Expand Down
10 changes: 5 additions & 5 deletions tests/test_plugin_release.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
Expand All @@ -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"
2 changes: 1 addition & 1 deletion tests/test_public_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
6 changes: 3 additions & 3 deletions tests/test_release_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -25,4 +25,4 @@ def test_plugin_manifests_match_package_version() -> None:
)
}

assert versions == {"2.0.0"}
assert versions == {"2.0.1"}