Commit Graph
716 Commits
Author SHA1 Message Date
Victor KuznetsovandClaude Opus 5.5 7e167c3c76 Fail closed on unreadable inputs, empty batches and failed strips
The metadata scanners read raw bytes, so random bytes, an empty file or a
truncated PNG or MP4 printed the same "No AI metadata found" or "AI metadata
stripped" a real file gets, with exit 0. `metadata.unreadable_reason` is now
the one readability probe: `identify`, `metadata` and every `video` command
exit 1 on such input, and `batch` and `video batch` fail its row.
`strip_and_verify` refuses it before writing anything.

A `batch` or `video batch` directory with no supported file exits 2 and
creates no output directory. `visible` and `erase` strip and verify on a
staged sibling and publish nothing when a marker survives, as the library
`remove_visible` now does; the diffusion writer raises on a surviving
marker. An invisible engine that cannot start exits 1 without a traceback,
and the MCP server reports a child that could not start.

NotebookLM and Gemini slide-deck templates are recorded as not planned.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 11:23:59 -07:00
Victor KuznetsovandClaude Opus 5.5 33a0e6c987 CLAUDE.md: document the C2PA soft-binding snapshot check in the gate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 17:12:51 -07:00
Victor KuznetsovandClaude Opus 5.5 521831b972 Scope out plan-removable branding and LLM text watermarks
A visible mark is in scope when its vendor describes it as identifying
AI-generated content, whichever plan turns it off: the Gemini sparkle,
or the visible watermark Gemini Notebook (formerly NotebookLM) adds to
generated images and videos. Product branding that a paid plan of the
same product removes, such as "Made with Gamma", is out of scope.

Watermarks in LLM-generated text are out of scope: the Claude and
OpenAI marks live in word choice with no hidden characters, only a
substantial rewrite removes them, and their detectors are not public.

The skill states both boundaries, including the vendor-declared
exception so the Gemini sparkle is never refused, and moves to 1.0.13.
The Codex plugin version is now pinned to the Claude plugin's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 22:33:51 -07:00
Victor KuznetsovandClaude Opus 5.5 66d793d1a6 State why no aggregate oracle pass rate is published
Tier D of the verification plan now says the project publishes no
pass rate per model or resolution: a sample that large needs bulk
automated checks, which OpenAI's API terms and the SynthID Detector's
additional terms (synthid.com/terms, read 2026-10-17) both forbid.
Removal claims rest on the method and on individual hash-bound rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 20:49:16 -07:00
Victor KuznetsovandClaude Opus 5.5 f0b2c2406e Publish to the MCP registry from CI with GitHub OIDC
publish-mcp-registry.yml lists server.json in the official MCP registry
on every published release, and on dispatch for a version already on
PyPI. GitHub OIDC proves the io.github.wiltodelta namespace, so no login
or stored secret is involved. It skips a version the registry already
lists, checks out only server.json at the release tag, requires both of
its versions to equal the release, waits for PyPI to serve it, runs a
pinned, checksum-verified mcp-publisher, and reads the entry back.

Tests run the lookup and manifest steps against stubbed replies; every
targeted mutation fails them. docs/development.md records a stale
worktree venv that mixes OpenCV 4.x and 5.x into one cv2 package.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 20:14:55 -07:00
Victor KuznetsovandClaude Opus 5.5 5677c22a6b Release 0.46.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.46.0
2026-10-17 14:31:59 -07:00
Victor KuznetsovandClaude Opus 5.5 a4eb16ad77 Build the expected MCP output path with the platform separator
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 14:27:35 -07:00
Victor KuznetsovandClaude Opus 5.5 06c0cb1bbe Add Codex plugin manifest, stdlib MCP server, SHA-pinned Actions
- .codex-plugin/plugin.json and assets/icon.svg package the existing skill
  tree for Codex plugin catalogs; skill version 1.0.12 across all manifests
- `remove-ai-watermarks mcp` serves identify, remove and batch over stdio,
  one CLI command per tool call, standard library only; server.json and
  glama.json for the MCP registry and Glama
- Pin every GitHub Action to a commit SHA
- Call module.train(False) instead of module.eval(), which plugin scanners
  read as dynamic code execution

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 14:13:04 -07:00
Victor Kuznetsov db006f034f Merge pull request #123 from wiltodelta/docs/readme-first-screen
Move the before/after demo and install lines to the README first screen
2026-10-17 12:55:01 -07:00
Victor KuznetsovandClaude Opus 5.5 604a8a8f52 Move the before/after demo and install lines to the README first screen
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 12:30:46 -07:00
Victor KuznetsovandClaude Opus 5.5 19ae5d1b0a Strip app-export and Kling SEI provenance from MP4, refresh watermark docs
video metadata --remove now blanks app-export JSON in keyed and keyless
metadata items (Dreamina writes it twice), which it previously left in
place while exiting 1.

Kling writes an H.264 user_data_unregistered SEI message (a fixed UUID
plus "kling-ai") into the first video sample. get_ai_metadata reports
it as kling_sei, identify_video names Kling from it when no TC260 label
does, and the streaming stripper blanks every copy inside mdat during
its existing copy pass. Lengths stay, the SEI stays well-formed, and
ffmpeg framemd5 hashes of every frame match before and after on both
tracked Kling fixtures. Across 255 local files only the seven Kling
videos changed verdict.

invisible now exits 1 on an undecodable source instead of reporting the
no-signal code for a file it never read.

Docs: a per-command "what each path leaves behind" table, the October
literature sweep, Suno's announced audio watermark, Anthropic's
SynthID-Text-based Claude watermark, and an independent TrustMark
false-positive benchmark.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 12:30:01 -07:00
Victor Kuznetsov 21f4621eb7 Add SynthID Detector surface, drop extra web confirmation 2026-10-17 11:47:53 -07:00
Victor Kuznetsov f1d4d4afba Merge pull request #121 from dukagjina/fix/preserve-invisible-transparency
Preserve alpha in invisible image processing
2026-10-16 18:06:56 -07:00
Victor Kuznetsov 2430689f96 Merge branch 'main' into fix/preserve-invisible-transparency 2026-10-16 12:36:43 -07:00
Victor KuznetsovandClaude Opus 5.5 cf695de57f Refresh the C2PA soft-binding snapshot and fix Ruff ICN001
The upstream registry gained be.immostory.videoseal.1 at revision d5960248,
so `sync_c2pa_soft_bindings.py --check` failed lint on main and on every pull
request. That step runs ahead of Ruff, which hid an ICN001 error in
scripts/_corpus_scan.py; import `date` directly, as the sibling scripts do.
Document the check's live-upstream behavior next to the refresh command.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 12:15:03 -07:00
dukagjina a054185fa5 Preserve source transparency during invisible image processing 2026-10-16 02:04:54 -04:00
Victor Kuznetsov 3e20bb0b92 Merge pull request #120 from wiltodelta/dependabot/uv/minor-and-patch-7fed723961 2026-10-14 22:27:16 -07:00
dependabot[bot] 0b4170ae98 Bump the minor-and-patch group with 6 updates
Bumps the minor-and-patch group with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [pillow-heif](https://github.com/bigcat88/pillow_heif) | `1.8.0` | `1.8.1` |
| [diffusers](https://github.com/huggingface/diffusers) | `0.40.0` | `0.41.0` |
| [diffsynth](https://github.com/modelscope/DiffSynth-Studio) | `2.1.8` | `2.1.9` |
| [onnxruntime](https://github.com/microsoft/onnxruntime) | `1.30.0` | `1.31.0` |
| [openai](https://github.com/openai/openai-python) | `3.24.0` | `3.29.0` |
| [ruff](https://github.com/astral-sh/ruff) | `0.16.10` | `0.17.0` |


Updates `pillow-heif` from 1.8.0 to 1.8.1
- [Release notes](https://github.com/bigcat88/pillow_heif/releases)
- [Changelog](https://github.com/bigcat88/pillow_heif/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bigcat88/pillow_heif/compare/v1.8.0...v1.8.1)

Updates `diffusers` from 0.40.0 to 0.41.0
- [Release notes](https://github.com/huggingface/diffusers/releases)
- [Commits](https://github.com/huggingface/diffusers/compare/v0.40.0...v0.41.0)

Updates `diffsynth` from 2.1.8 to 2.1.9
- [Release notes](https://github.com/modelscope/DiffSynth-Studio/releases)
- [Commits](https://github.com/modelscope/DiffSynth-Studio/commits)

Updates `onnxruntime` from 1.30.0 to 1.31.0
- [Release notes](https://github.com/microsoft/onnxruntime/releases)
- [Changelog](https://github.com/microsoft/onnxruntime/blob/main/docs/ReleaseNotesWorkflow.md)
- [Commits](https://github.com/microsoft/onnxruntime/compare/v1.30.0...v1.31.0)

Updates `openai` from 3.24.0 to 3.29.0
- [Release notes](https://github.com/openai/openai-python/releases)
- [Changelog](https://github.com/openai/openai-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/openai/openai-python/compare/v3.24.0...v3.29.0)

Updates `ruff` from 0.16.10 to 0.17.0
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.16.10...0.17.0)

---
updated-dependencies:
- dependency-name: pillow-heif
  dependency-version: 1.8.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: diffusers
  dependency-version: 0.41.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: diffsynth
  dependency-version: 2.1.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: onnxruntime
  dependency-version: 1.31.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: openai
  dependency-version: 3.29.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: ruff
  dependency-version: 0.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-14 20:05:51 +00:00
Victor Kuznetsov 4241a01659 Release 0.45.1 v0.45.1 2026-10-08 16:42:57 -07:00
Victor Kuznetsov c37378b347 Merge pull request #117 from dichiara19/fix/sdxl-zimage-global-offload
Stream the sdxl-zimage global stack on cards below 12 GiB
2026-10-08 16:34:43 -07:00
Victor Kuznetsov 8cb99b73b2 Fix SDXL offload placement on the current CUDA device 2026-10-08 16:17:11 -07:00
Giuseppe G. Di Chiara c45e6db3e4 Stream the sdxl-zimage global stack on cards below 12 GiB
The SDXL global stack (fp16 UNet, Canny ControlNet, both text encoders, VAE)
is ~8.8 GiB and was always moved to CUDA with .to(device), so it could not
fit an 8 GiB card and --cpu-offload never reached it. Under the Windows
display driver, WSL2 included, the overflow spilled into shared system
memory and the four-step pass ran for over ten minutes instead of failing.

Residency now follows the same rule as the Qwen stack: an explicit request
wins, otherwise the card's total VRAM decides against
RESIDENT_SDXL_GLOBAL_MIN_VRAM_GIB. Below it the Lightning LoRA is fused on
the CPU and the stack is streamed with enable_sequential_cpu_offload, the
fastest placement that completed on every run of an 8 GiB card with 16 GiB
of system RAM. sdxl-zimage joins GLOBAL_OFFLOAD_PROFILES, so the
--cpu-offload warning now fires for chroma-zimage only.
2026-10-08 23:27:55 +02:00
Victor Kuznetsov 37fb080c74 Merge pull request #116 from wiltodelta/dependabot/uv/minor-and-patch-931ef6a6bd 2026-10-08 10:30:09 -07:00
dependabot[bot] 954298aa14 Bump the minor-and-patch group with 3 updates
Bumps the minor-and-patch group with 3 updates: [python-dotenv](https://github.com/theskumar/python-dotenv), [openai](https://github.com/openai/openai-python) and [ruff](https://github.com/astral-sh/ruff).


Updates `python-dotenv` from 1.2.3 to 1.2.4
- [Release notes](https://github.com/theskumar/python-dotenv/releases)
- [Changelog](https://github.com/theskumar/python-dotenv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/theskumar/python-dotenv/compare/v1.2.3...v1.2.4)

Updates `openai` from 3.22.1 to 3.24.0
- [Release notes](https://github.com/openai/openai-python/releases)
- [Changelog](https://github.com/openai/openai-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/openai/openai-python/compare/v3.22.1...v3.24.0)

Updates `ruff` from 0.16.9 to 0.16.10
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.16.9...0.16.10)

---
updated-dependencies:
- dependency-name: python-dotenv
  dependency-version: 1.2.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: openai
  dependency-version: 3.24.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: ruff
  dependency-version: 0.16.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-07 08:48:45 +00:00
Victor KuznetsovandClaude Opus 5.5 10c7775990 Hide maintainer skills from public skill discovery
The skills CLI discovers every SKILL.md under .claude/skills, so
provider-oracles and signal-discovery were offered by `npx skills add`
and listed on skills.sh beside the published skill. Mark both
metadata.internal, the CLI's documented hide flag, and fail the suite
on any project skill that lacks it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:04:18 -07:00
Victor KuznetsovandClaude Opus 5.5 3f6447b23d Record how to run the gate from an agent session
The full gate outlasts the agent's 10-minute foreground shell cap, so it must
run detached with its exit code written to a file. A stray run is stopped by
its own PID, because a pattern kill also ends other sessions' suites.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 18:25:14 -07:00
Victor KuznetsovandClaude Opus 5.5 cc63bfd7bf Release 0.45.0
Bump the package to 0.45.0 and the agent skill to 1.0.11. The skill now names
the dola and workbuddy image mark keys, which 0.44.0 rejects, so the probe's
MIN_CLI_VERSION rises to 0.45.0 and both keys carry a "since CLI" note that
the floor test reads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.45.0
2026-10-05 17:45:18 -07:00
Victor Kuznetsov 898f8be789 Add AI disclosure layouts, tighten detection and provenance warnings 2026-10-04 11:03:37 -07:00
Victor KuznetsovandClaude Opus 5.5 72752feb33 Scan uv.lock in CI and add a security policy
Add a CI job running the maintain.sh uv-secure scan, pinned to the gate by
a parity test, and a SECURITY.md with private reporting and dependency
remediation. Refresh the security-gate block record for accelerate 1.15.0.

Closes #114

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 10:33:50 -07:00
Victor KuznetsovandClaude Opus 5.5 70adddf960 Record why Qwen-Image-2.1 is not a regeneration profile
Open weights remove the hosted-only objection to the 2.x line, but the
Diffusers pipeline has no strength or latent noise-mask input and the Qwen
Research License is non-commercial (issue #111).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 10:33:49 -07:00
Victor Kuznetsov 01a2665181 Reconcile research follow-up status 2026-10-01 22:10:00 -07:00
Victor Kuznetsov 0c3e0fa415 Release 0.44.0 v0.44.0 2026-10-01 14:24:27 -07:00
Victor Kuznetsov b3b868153f Record Google Photos checks and continue across provider accounts 2026-10-01 13:42:21 -07:00
Victor Kuznetsov 304bd071c0 Unify TC260 producers and strengthen provenance regression coverage
Share producer identities across mark routing, attribution, and pinned signers.
Preserve nested Honor TC260 fields and report unsupported RSA signatures.
Document the Google Photos checks and public sample search.

Use an SDK-signed synthetic carrier for negative EKU checks after the original
Microsoft certificates expired. Skip boundary regex scans when no C2PA
soft-binding identifier is present.
2026-10-01 11:30:32 -07:00
Victor Kuznetsov 2e26df1f21 Restore C2PA certificate validation and refresh compatible dependencies 2026-09-30 16:58:43 -07:00
Victor KuznetsovandClaude Opus 5.5 d800ec9455 Verify TC260 SecurityData label signatures against a pinned MiniMax key
MiniMax signs its TC260 label with SM3withSM2 per TC260-PG-202511A. A
verification-only SM3/SM2 (no dependency provides the SM2 curve) checks the
appendix A.1 label message; a signature under the pinned MiniMax key is a
high-confidence aigc_signature signal, a failing one is a caveat, and every
result is the aigc_signature metadata marker. Pinned by the GB/T 32905 SM3
vectors, OpenSSL's SM2 verify vectors and real MiniMax files. Over 411 local
files the only verdict-record change is the marker on nine MiniMax videos.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 15:36:08 -07:00
Victor KuznetsovandClaude Opus 5.5 ef7b972ed1 Sync the C2PA soft-binding snapshot to d36d1c1
The upstream list widened com.museblossom.contentsdefence.1 from image to
audio, image and video. Verdicts over 411 local files are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 15:36:08 -07:00
Victor KuznetsovandClaude Opus 5.5 b96ede6f44 Record the verified MiniMax TC260 SecurityData signatures
MiniMax writes a TC260-PG-202511A SecurityData object with SM3withSM2
signatures. The label signature verifies on all four local MiniMax videos
against the guide's appendix A.1 message, and the Binding signature over the
compact Bindings entry; the SM3 content hash does not match a naive selection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 22:16:42 -07:00
Victor KuznetsovandClaude Opus 5.5 ca59c032a1 Release 0.43.0
Bump the package to 0.43.0 and the agent skill to 1.0.10. The skill now names
the wan image and vidu video mark keys, which 0.42.0 rejects, so the probe's
MIN_CLI_VERSION rises to 0.43.0 and both keys carry a "since CLI" note that
the floor test reads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.43.0
2026-09-29 21:39:08 -07:00
Victor Kuznetsov c5e138357e Record Z-Image-Turbo global-stage rejection 2026-09-29 20:55:59 -07:00
Victor Kuznetsov 21661bea35 Reproduce re-watermarking and verify SynthID coexistence 2026-09-29 13:50:52 -07:00
Victor Kuznetsov 5cb4f2f808 Add Perth and PixelSeal benchmark oracles 2026-09-28 11:14:28 -07:00
Victor Kuznetsov 33f748b32a Record VACE and ROSE video inpainting results 2026-09-28 10:54:19 -07:00
Victor KuznetsovandClaude Opus 5.5 742a0dccab Align the remaining klein and color-restoration wording with the results
module-internals still called FLUX.2 klein pending; the sweep still counted
three inconclusive Gemini rows where only one was an explicit tool verdict,
and the removal page stated a Google chroma leak the data only warns of.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 21:24:59 -07:00
Victor KuznetsovandClaude Opus 5.5 b5fc3ef9a6 Add face and text fidelity to the FLUX.2 klein comparison
fidelity_metrics.py at each engine's clean strengths: klein keeps Latin and
Cyrillic sign lettering better on two Google carriers, but loses every face
comparison and the verified CJK text, which the 512-pixel LPIPS had hidden.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:59:06 -07:00
Victor KuznetsovandClaude Opus 5.5 6eb1a94799 Close the FLUX.2 klein Google measurement
The fourth Google carrier clears at 0.25, so the klein operating point with
the usual cross-source margin is 0.40, where the limiting carrier is at
LPIPS 0.270 against qwen-zimage's 0.183. klein is not a replacement global
stage for either vendor. Also record that Gemini's image-check allowance is
per account and the new "checks on similar images" quota wording.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 16:02:33 -07:00
Victor KuznetsovandClaude Opus 5.5 32791ee832 Record the FLUX.2 klein Google brackets from four Gemini accounts
Three of four Google carriers clear with klein at or below 0.20, where it
matches qwen-zimage's PSNR at 0.35, beats its LPIPS, and keeps the objects
qwen-zimage redraws. The fourth is detected at 0.10 and inconclusive at 0.20,
so there is no Google operating point yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 15:49:57 -07:00
Victor KuznetsovandClaude Opus 5.5 a103b4ec15 Record the FLUX.2 klein global-stage measurement
Stock Flux2KleinInpaintPipeline feeds the clean source back as reference
tokens, so it copies the source and OpenAI SynthID survives strength 0.30.
Without those tokens klein clears OpenAI between 0.05 and 0.20, at lower
fidelity than qwen-zimage at its floor. Google is unmeasured: the Gemini
Verify AI tool answered with a tool error or quota limit, which also casts
doubt on two of the earlier color-restoration "inconclusive" rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 15:17:26 -07:00
Victor KuznetsovandClaude Opus 5.5 7341e1a648 Record the CIELAB color-restoration measurement after regeneration
Transplanting the source's a,b channels onto qwen-zimage outputs at the vendor
floors cut CIEDE2000 on all seven tracked originals, kept every OpenAI API
verdict not_detected, but left three of four Gemini checks inconclusive and
painted old object colors onto redrawn ones. Not shipped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 14:49:22 -07:00
Victor Kuznetsov dfbaa018c6 Merge pull request #112 from wiltodelta/docs/library-research-landscape
Research sweep, provider captures, and provenance attribution fixes
2026-09-27 11:39:15 -07:00