Raise the skill's CLI floor to cover its 0.39.0 references

commands.md names liblib_pill and the auto pipeline routing OpenAI
provenance to qwen-zimage, both of which only exist since CLI 0.39.0,
while probe.py kept MIN_CLI_VERSION at 0.38.0: a 0.38.0 install would
pass the probe's currency check and then reject the very mark key and
routing the skill hands it. The references now carry the established
(since CLI X.Y.Z) annotations and the floor rises to 0.39.0, per
docs/agent-skill.md.

The floor was hand-synced against prose only a person could read, so it
drifted exactly the way its own comment warns about, twice before. A new
guard derives the floor's lower bound from every (since CLI X.Y.Z)
annotation in the skill tree and fails when the floor lags the newest
one; combined with the existing package-version ceiling, the floor is
now pinned from both sides. Skill version 1.0.6 in SKILL.md, plugin.json,
and marketplace.json.

pre-commit: 1) maintain.sh - exit 2 (uv-secure on the documented
lightning/accelerate blocks, unchanged lock; core checks separately:
C2PA sync current, Ruff 1 fix + 1 reformat folded into this commit,
Pyright src/ 0 errors, 2361 passed 3 skipped); 2) /simplify -
single-pass four angles, clean; 3) docs sync - grepped MIN_CLI_VERSION
and since CLI over docs/ and rules/: both mentions stay accurate;
4) CLAUDE.md - improver grade A earlier this session, revise: no
additions
This commit is contained in:
Victor Kuznetsov committed 2026-09-08 21:31:25 -07:00
1 parent de03748849
commit 00d9771c6a
6 files changed
+44 -13

No files matched your search

+1 -1
View File
@@ -6,7 +6,7 @@
},
"metadata": {
"description": "Agent skill and Claude Code plugin for the remove-ai-watermarks CLI.",
"version": "1.0.5"
"version": "1.0.6"
},
"plugins": [
{
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "remove-ai-watermarks",
"displayName": "Remove AI Watermarks",
"version": "1.0.5",
"version": "1.0.6",
"description": "Identify and remove AI provenance marks from images and video the user generated or edited, using the remove-ai-watermarks CLI.",
"author": {
"name": "wiltodelta",
+1 -1
View File
@@ -5,7 +5,7 @@ license: Apache-2.0
compatibility: Python 3.11-3.14. Invisible image removal needs NVIDIA CUDA. Some video writes need ffmpeg. Installer may be uv, pipx, or pip.
metadata:
author: wiltodelta
version: "1.0.5"
version: "1.0.6"
homepage: https://raiw.cc
repository: https://github.com/wiltodelta/remove-ai-watermarks
---
@@ -26,7 +26,8 @@ Image mark keys: `gemini`, `doubao`, `jimeng`, `qwen`, `kling`, `yuanbao`,
`--mark auto` removes every selected match. `microsoft` is the top-right AI
badge, separate from the invisible InvisMark watermark on the same vendor's
images. `jimeng_pill` is a weak detector and needs corroboration. The compact
`liblib_pill` likewise requires LiblibAI metadata or the bottom-center wordmark.
`liblib_pill` likewise requires LiblibAI metadata or the bottom-center wordmark
(since CLI 0.39.0).
```bash
remove-ai-watermarks erase image.png --region 1640,1930,400,100 -o clean.png
@@ -88,8 +89,8 @@ run on.
Pipeline profiles: `qwen-zimage` (the default), `sdxl-zimage`, `chroma-zimage`,
`auto`. All are CUDA-only and all install from the same `qwen-zimage` extra.
`auto` picks the engine from the file's own provenance -- chroma-zimage for
Microsoft, qwen-zimage for OpenAI, Google, Meta and unknown -- so prefer it
over naming an engine when the user has no reason to care. `sdxl-zimage` is the
Microsoft, qwen-zimage for OpenAI (since CLI 0.39.0), Google, Meta and unknown
-- so prefer it over naming an engine when the user has no reason to care. `sdxl-zimage` is the
heavier alternative and `chroma-zimage` is the Apache-2.0 global stage.
```bash
+8 -7
View File
@@ -24,13 +24,14 @@ from typing import Any
_GPU_MARKERS = ("GPU ", "gpu:")
# Below this, the CLI predates flags and behavior this skill documents. Raise it in
# the same change as any reference that names a flag the previous release lacked:
# 0.37.0 is here because `classify` arrived with it (`--pipeline auto` needed
# 0.36.0; chroma-zimage and the doubao video mark 0.35.0;
# the `microsoft` mark 0.34.0; `--vendor` 0.32.0), and a stale floor told an agent
# its CLI was current right before it typed a value that build rejects.
# tests/test_agent_skill.py pins it against the package version, so it can never
# advertise a release that does not exist.
MIN_CLI_VERSION = (0, 38, 0)
# 0.39.0 is here because the `liblib_pill` mark and `auto` routing OpenAI
# provenance to qwen-zimage arrived with it; 0.38.0 added the receipt gate;
# `classify` needed 0.37.0 (`--pipeline auto` 0.36.0; chroma-zimage and the
# doubao video mark 0.35.0; the `microsoft` mark 0.34.0; `--vendor` 0.32.0),
# and a stale floor told an agent its CLI was current right before it typed a
# value that build rejects. tests/test_agent_skill.py pins it against the
# package version and against every "(since CLI X.Y.Z)" annotation in the skill.
MIN_CLI_VERSION = (0, 39, 0)
# Markers a build without the pixel stack prints. The first is the current CLI's own
# install hint; the rest are what older builds emit before the guard existed, and the
# Homebrew formula ships exactly such a build.
+29
View File
@@ -104,6 +104,35 @@ def test_probe_min_cli_version_never_exceeds_the_package_version() -> None:
sys.modules.pop("probe", None)
def test_probe_floor_covers_every_since_annotation() -> None:
"""MIN_CLI_VERSION must be at least the newest named "(since CLI X.Y.Z)" value.
A reference that names a value the previous release lacked has to raise the
floor in the same change; this reads the annotations back out of the skill
tree so a stale floor fails the suite instead of an agent's CLI.
"""
sys.path.insert(0, str(ROOT / "skills" / "remove-ai-watermarks" / "scripts"))
try:
import probe
annotated = []
for path in (ROOT / "skills" / "remove-ai-watermarks").rglob("*"):
if path.suffix not in {".md", ".py"} or not path.is_file():
continue
for match in re.finditer(r"\(since CLI (\d+)\.(\d+)\.(\d+)\)", path.read_text(encoding="utf-8")):
annotated.append(tuple(int(part) for part in match.groups()))
assert annotated, "no (since CLI X.Y.Z) annotations found; the floor guard lost its source"
highest = max(annotated)
assert highest <= probe.MIN_CLI_VERSION, (
f"probe.py MIN_CLI_VERSION {probe.MIN_CLI_VERSION} is below {highest}, the newest "
"(since CLI X.Y.Z) annotation in the skill; a build that old rejects a named value"
)
finally:
sys.path.remove(str(ROOT / "skills" / "remove-ai-watermarks" / "scripts"))
sys.modules.pop("probe", None)
@pytest.mark.parametrize(
"relative",
[