Signal discovery
Work from the remove-ai-watermarks repository root. This skill discovers and
closes library coverage gaps. Implementation, tests, fixtures, and
documentation changes belong in this library; do not patch a downstream
consumer to compensate for a detector or cleaner gap.
Treat retained inputs as sensitive and read-only. Keep reports, contact sheets,
sidecars, and derived samples under the library's gitignored .local-eval/.
Never commit a retained input or an artifact derived from one.
Use only publication-cleared or synthetic files for tracked fixtures.
Before acting, read:
CLAUDE.md and .claude/rules/development.md;
docs/verification-plan.md;
docs/supported-signals.md and docs/watermarking-landscape.md;
- references/coverage-and-cadence.md.
Choose the run
Do not call corpus_gap_scan.py a complete signal audit. Select every mode the
question requires:
- Fresh discovery finds new providers, serializations, labels, and formats
in objects added since the preceding review.
- Historical replay reruns current code on the complete retained history.
Use it after detection-path or format-support changes and on the periodic
backstop defined in the reference.
- Removal parity proves that every detected removable signal is cleared
without violating the signal family's fidelity invariant.
- Calibration or provider oracle is required where the corpus has no
self-evident answer key. Never treat a local negative as proof that a
proprietary watermark is absent.
Start by inventorying the current code, not a remembered list. Enumerate image
and video visible-mark registries, metadata readers and strippers, local
invisible decoders, explicit invisible vendor routes, supported containers, and
the stable signal families emitted by identify. Reconcile that inventory with
the coverage matrix before interpreting any green result. A hand-written marker
list or report family map that omits a current registry member is itself a
finding.
Run protocol
- Record the library commit, version, enabled extras, corpus date range, and
exact commands in an untracked run directory. Preserve the pre-run Git
status so unrelated work is not attributed to the audit.
- Refresh the local retained corpus through its owning, external collection
process when the task calls for fresh data. Use an explicit gitignored
destination, do not delete local objects, and finish with a zero-delta pass.
Fetch paired outputs only for a removal or complaint investigation.
- Run the applicable fresh and historical discovery modes from the reference.
Use
corpus_gap_scan.py --since YYYY-MM-DD for the overlapping fresh window
and omit --since for the complete history. Report counts per input shape
and per outcome; an example does not establish coverage. Give every code and
corpus snapshot a distinct --report path. The adjacent
.progress.jsonl checkpoint is the live progress source and makes the same
command resumable; use --restart only when intentionally discarding it.
- Triage every candidate into one of: parser/serialization gap, missing vendor
attribution, new visible mark, possible invisible signal, format/read error,
expected non-AI provenance, or false candidate. Preserve unresolved items as
unresolved.
- Reproduce an actionable gap with a failing test before changing code. Derive
the smallest publication-safe fixture from a controlled source or construct
it synthetically; do not move the retained file into a tracked path.
- Implement the fix in the library subsystem that owns it. Update the library
registry, parser, remover, public docs, and published agent skill when their
contracts move. Updating a downstream consumer to take a released version is
a later, separately scoped task.
- Rerun the affected focused audit and the complete historical regression
mode. A detection change must name the files expected to move before the
after-run; classify lost signals separately from intended new detections.
- Run removal parity for every newly detected removable signal. A quiet
post-removal detector is necessary but not always sufficient: check
pixel/stream invariants and visually inspect residual-prone visible marks.
- Run
bash maintain.sh. Report evidence limits, incomplete rows, crashes,
unsupported formats, and oracle-unavailable cohorts explicitly.
External oracle uploads are separate mutations. Use the provider-oracles
skill only for a bounded, already-selected candidate, and obtain the required
action-time upload approval. Do not adapt candidates against an oracle, retry
automatically, or substitute one provider's verdict for another's.
1---2name: signal-discovery3description: Discover missing AI provenance and watermark coverage in the remove-ai-watermarks library from fresh or historical corpora, then validate detection and removal parity. Use for corpus gap mining, periodic signal audits, new-provider discovery, or deciding whether old retained data must be replayed. Do not use for ordinary per-file identification or removal.4---56# Signal discovery78Work from the `remove-ai-watermarks` repository root. This skill discovers and9closes library coverage gaps. Implementation, tests, fixtures, and10documentation changes belong in this library; do not patch a downstream11consumer to compensate for a detector or cleaner gap.1213Treat retained inputs as sensitive and read-only. Keep reports, contact sheets,14sidecars, and derived samples under the library's gitignored `.local-eval/`.15Never commit a retained input or an artifact derived from one.16Use only publication-cleared or synthetic files for tracked fixtures.1718Before acting, read:1920- `CLAUDE.md` and `.claude/rules/development.md`;21- `docs/verification-plan.md`;22- `docs/supported-signals.md` and `docs/watermarking-landscape.md`;23- [references/coverage-and-cadence.md](references/coverage-and-cadence.md).2425## Choose the run2627Do not call `corpus_gap_scan.py` a complete signal audit. Select every mode the28question requires:29301. **Fresh discovery** finds new providers, serializations, labels, and formats31 in objects added since the preceding review.322. **Historical replay** reruns current code on the complete retained history.33 Use it after detection-path or format-support changes and on the periodic34 backstop defined in the reference.353. **Removal parity** proves that every detected removable signal is cleared36 without violating the signal family's fidelity invariant.374. **Calibration or provider oracle** is required where the corpus has no38 self-evident answer key. Never treat a local negative as proof that a39 proprietary watermark is absent.4041Start by inventorying the current code, not a remembered list. Enumerate image42and video visible-mark registries, metadata readers and strippers, local43invisible decoders, explicit invisible vendor routes, supported containers, and44the stable signal families emitted by `identify`. Reconcile that inventory with45the coverage matrix before interpreting any green result. A hand-written marker46list or report family map that omits a current registry member is itself a47finding.4849## Run protocol50511. Record the library commit, version, enabled extras, corpus date range, and52 exact commands in an untracked run directory. Preserve the pre-run Git53 status so unrelated work is not attributed to the audit.542. Refresh the local retained corpus through its owning, external collection55 process when the task calls for fresh data. Use an explicit gitignored56 destination, do not delete local objects, and finish with a zero-delta pass.57 Fetch paired outputs only for a removal or complaint investigation.583. Run the applicable fresh and historical discovery modes from the reference.59 Use `corpus_gap_scan.py --since YYYY-MM-DD` for the overlapping fresh window60 and omit `--since` for the complete history. Report counts per input shape61 and per outcome; an example does not establish coverage. Give every code and62 corpus snapshot a distinct `--report` path. The adjacent63 `.progress.jsonl` checkpoint is the live progress source and makes the same64 command resumable; use `--restart` only when intentionally discarding it.654. Triage every candidate into one of: parser/serialization gap, missing vendor66 attribution, new visible mark, possible invisible signal, format/read error,67 expected non-AI provenance, or false candidate. Preserve unresolved items as68 unresolved.695. Reproduce an actionable gap with a failing test before changing code. Derive70 the smallest publication-safe fixture from a controlled source or construct71 it synthetically; do not move the retained file into a tracked path.726. Implement the fix in the library subsystem that owns it. Update the library73 registry, parser, remover, public docs, and published agent skill when their74 contracts move. Updating a downstream consumer to take a released version is75 a later, separately scoped task.767. Rerun the affected focused audit and the complete historical regression77 mode. A detection change must name the files expected to move before the78 after-run; classify lost signals separately from intended new detections.798. Run removal parity for every newly detected removable signal. A quiet80 post-removal detector is necessary but not always sufficient: check81 pixel/stream invariants and visually inspect residual-prone visible marks.829. Run `bash maintain.sh`. Report evidence limits, incomplete rows, crashes,83 unsupported formats, and oracle-unavailable cohorts explicitly.8485External oracle uploads are separate mutations. Use the `provider-oracles`86skill only for a bounded, already-selected candidate, and obtain the required87action-time upload approval. Do not adapt candidates against an oracle, retry88automatically, or substitute one provider's verdict for another's.