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
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,10 @@ jobs:
export FUCKMARK_CLIPBOARD_CAPTURE="$capture"
output="$(printf 'I do not agree and I cannot stay.\n' | "$command" --stdin --copy)"
printf '%s\n' "$output"
test "$output" = "I don't agree and I can't stay."
test "$(cat "$capture")" = "I don't agree and I can't stay."
test "$output" = "I do not agree and I cannot stay."
test "$(cat "$capture")" = "I do not agree and I cannot stay."
done
test "$(printf 'I do not agree.\n' | FuckMark)" = "I don't agree."
test "$(printf 'I do not agree.\n' | FuckMark)" = "I do not agree."

calibration-readiness:
name: Frozen calibration readiness
Expand Down
56 changes: 56 additions & 0 deletions .github/workflows/cycle8-carrier-detector.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: Cycle8 Carrier Detector

on:
workflow_dispatch:
inputs:
device:
description: Torch device
required: true
default: cpu
type: string
max_attempts:
description: Deterministic retry budget for ASCII 64-token unique pairs
required: true
default: "64"
type: string
pull_request:
paths:
- ".github/workflows/cycle8-carrier-detector.yml"
- "fuckmark/cycle8/**"
- "fuckmark/cycle8_hf.py"
- "fuckmark/product/**"
- "tools/cycle8_fixture_compare.py"
- "tests/test_cycle8_fixture_compare.py"
- "requirements-smoke.txt"

permissions:
contents: read

jobs:
exploratory-890000:
runs-on: ubuntu-24.04
timeout-minutes: 180
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: pip
- name: Install FuckMark
run: python -m pip install -e .
- name: Install exact CPU Torch runtime
run: python -m pip install "torch==2.13.0" --index-url https://download.pytorch.org/whl/cpu
- name: Install maintained Transformers SynthID dependencies
run: python -m pip install -r requirements-smoke.txt
- name: Run Cycle 8 exploratory detector compare on seed 890000
run: >-
python -m fuckmark.cycle8_hf
--device "${{ inputs.device || 'cpu' }}"
--max-attempts "${{ inputs.max_attempts || '64' }}"
--detector-json artifacts/cycle8-exploratory-890000/detector-compare.json
- uses: actions/upload-artifact@v4
if: always()
with:
name: cycle8-exploratory-890000
path: artifacts/cycle8-exploratory-890000/
if-no-files-found: error
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# Changelog

## Unreleased — exact user-visible invariance

- Restored Priority Zero: product output must keep the exact user-visible projection of the input.
- Public CLI `release-cli-v4` fail-closes instead of applying contractions or other visible edits.
- `release_transform_registry()` is the empty product-visible-invariance registry. Historical contraction/lexical/syntax/spacing catalogs remain replayable under explicit historical names.
- Added `specs/fuckmark-user-visible-invariance-v1.contract.json` and Cycle 8 invisible-carrier research. No product-authorized carrier is promoted yet.
- Reclassified Cycle 6 formal `NONZERO_RESIDUAL` 7/192 and Cycle 7 visible-edit stages as scientific evidence that is product-disqualified.
- GitHub CI installed-CLI end-to-end now expects unchanged visible text, matching `release-cli-v4`.
- Cycle 8 fixture compare reports visible-projection pass `20/20` for space-carrier arms.
- Chromium `pre` screenshots: U+034F / U+FE00 pixel-equal; U+200C PNG bytes differ.
- Detector-blind GPT-2 / SynthID development scoring on seeds `890000`, `900000`, and `910000` reduced watermarked detections for U+034F space-carrier x1 without unwatermarked inflation on these tiny 4-pair corpora. This is not confirmation and is not a product promotion.
- Product contract loading uses the embedded v1 payload in installed wheels. Writers that replace pinned `specs/cycle8` tokenizer JSON refuse to run without a GPT-2 encoder; the detector harness still scores when tiktoken is absent. Chromium HTML evidence encodes less-than and greater-than as JSON unicode escapes so an ASCII script terminator cannot close the inline script.

## v0.2.0 — Exact-survival confirmation and release hardening

### Research
Expand Down
30 changes: 22 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,15 @@

# FuckMark

FuckMark is a deterministic, detector-blind research harness for studying how small text transformations change statistical watermark observations while preserving the source text as much as possible.
FuckMark is a deterministic, detector-blind research harness and CLI for disrupting statistical text watermarks.

**Current release: v0.2.0**
**Product contract (Priority Zero):** the user-visible text must not change. Product-safe transforms may modify only rigorously validated non-rendering Unicode representation while preserving exact visible projection. Semantic equivalence, "minor" punctuation edits, and extra visible spaces are not product success.

The public CLI currently fail-closes: no product-authorized invisible carrier has been promoted yet, so `FuckMark` returns the original text unchanged rather than applying contractions or other visible edits. That is intentional. Historical visible-edit research remains replayable through explicitly named historical registries.

See [`docs/product-contract.md`](docs/product-contract.md) and `specs/fuckmark-user-visible-invariance-v1.contract.json`.

**Current tagged release: v0.2.0**
Website: [mark.q1z.org](https://mark.q1z.org)
License: MIT

Expand All @@ -36,11 +42,11 @@ The expanded `content-region-destruction-v1` pool and pairwise-completion schedu

## Claim boundary

The 97.40% result is narrow research evidence, not a universal watermark-removal guarantee.
The 97.40% Cycle 4 result is narrow research evidence, not a universal watermark-removal guarantee, and it is not a product-contract success: those schedulers selected visible-edit candidates.

It applies to the repository's frozen open GPT-2 / Hugging Face SynthID Weighted Mean confirmation configuration, fixed threshold, exact source protocol, and measured corpus. It does not establish proprietary-detector transfer, arbitrary-model transfer, unknown future watermark transfer, perfect removal, or semantic equivalence under every input.
It applies to the repository's frozen open GPT-2 / Hugging Face SynthID Weighted Mean confirmation configuration, fixed threshold, exact source protocol, and measured corpus. It does not establish proprietary-detector transfer, arbitrary-model transfer, unknown future watermark transfer, or perfect removal.

The public CLI also remains deliberately conservative. It uses only the release transform registry. Development schedulers, detector code, experimental search, and the quarantined U+200C diagnostic registry are not automatically selected by the command-line product path.
The public CLI uses only `release_transform_registry()`, which is now the product-visible-invariance registry. That registry currently contains zero authorized carriers. Development schedulers, detector code, experimental search, historical contraction/lexical/syntax rules, Cycle 6 spacing, Cycle 7 durable visible edits, and the quarantined U+200C diagnostic registry are not automatically selected by the command-line product path.

## Install

Expand Down Expand Up @@ -99,6 +105,8 @@ Stream mode:
printf 'I do not agree.\n' | FuckMark
```

The current product CLI prints the same visible text. It does not emit `I don't agree.`

File mode:

```text
Expand Down Expand Up @@ -136,11 +144,17 @@ The U+200C mechanism is not promoted into release behavior. It can strongly pert

## Cycle 6 development status

Cycle 6 reached **0 of 16 detected** on the frozen seed-720000 development corpus with the unchanged `0.5570987654320988` threshold and the raw, NFKC, Cf-strip, and combined sanitizer arms. The timestamp-independent corpus content hash is `b114cf4d869c5a5d78ac52855a1a480b1f0e605137aee2cb269062880fcc22d3`; the stable scored-result hash is `73f44b173d7ec55ea80e7d2e9a46b7ea70d8b32682f465dc66643387d99aa8b6`.
Cycle 6 reached **0 of 16 detected** on the frozen seed-720000 development corpus with the unchanged `0.5570987654320988` threshold and the raw, NFKC, Cf-strip, and combined sanitizer arms. Formal confirmation froze **NONZERO_RESIDUAL 7/192** transformed-WM detections (2/64 + 2/64 + 3/64) with 0/192 matched transformed-UW detections.

This is detector-endpoint scientific evidence, **PRODUCT_DISQUALIFIED**. The Cycle 6 workhorse inserted repeated ordinary ASCII U+0020 spaces, which are visible spacing changes. Do not treat 7/192, 0/16, or the older 96%+ Cycle 4 figure as proof that FuckMark currently meets the product goal.

## Cycle 7 status

Cycle 7 Stage A/B/C researched collapse-resistant *visible* edits (contractions, hyphenation, punctuation, newlines). Those results remain historically valid as **INSUFFICIENT_EVIDENCE** and are **PRODUCT_DISQUALIFIED**. They must not enter `release_transform_registry()`.

This is detector-endpoint development evidence, not geometry zero and not a release claim. Surviving original observations remain in every output. The attack also relies on visible repeated ASCII spaces: NFKC and Cf stripping preserve them, but repeated-space canonicalization removes the mechanism and human fidelity review is still pending.
## Cycle 8 status

The Cycle 6 formal-confirmation harness is preregistered for three new 64-sample corpora with matched transformed-unwatermarked controls. Sealed detector scoring remains blocked until the full all-16 blind B14 fidelity packet receives independent human adjudication and its audit hash is bound into the confirmation contract.
Cycle 8 is the exact-visible-projection generation. See [`docs/cycle8/README.md`](docs/cycle8/README.md). U+200C remains a diagnostic baseline (stripped by Cf). Combining grapheme joiner U+034F is an early durable-track *hypothesis* under frozen sanitizers; it is not a release mechanism.

## Reproduce the research environment

Expand Down
18 changes: 11 additions & 7 deletions docs/cli.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
# FuckMark CLI

FuckMark v0.2.0 exposes the same command under `FuckMark`, `Fuckmark`, and `fuckmark`. All aliases use `release-cli-v3` and the same content-addressed release transform registry.
FuckMark v0.2.0 still exposes the same command under `FuckMark`, `Fuckmark`, and `fuckmark`. Current `main` uses `release-cli-v4` and the product visible-invariance registry.

The public CLI is intentionally smaller than the research harness. It does not load detector code, watermark keys, model weights, network services, the Cycle 4 search schedulers, or quarantined U+200C diagnostics.
The public CLI is intentionally smaller than the research harness. It does not load detector code, watermark keys, model weights, network services, Cycle 4/6/7 visible-edit schedulers, or quarantined U+200C diagnostics. It also does not apply contractions.

Install instructions for Windows, macOS, and Linux are in [`install.md`](install.md). The official website is [mark.q1z.org](https://mark.q1z.org).
**Priority Zero:** the CLI must not change user-visible text. Until a product-authorized invisible carrier exists, the CLI fail-closes and returns the input unchanged.

Install instructions for Windows, macOS, and Linux are in [`install.md`](install.md). The official website is [mark.q1z.org](https://mark.q1z.org). The product contract is [`product-contract.md`](product-contract.md).

## Interactive use

Expand All @@ -16,7 +18,7 @@ FuckMark

Paste the source text and finish with `:done` on its own line. The legacy `ok` terminator remains accepted.

Interactive mode reports the exact project version, processes the text deterministically, reports the number of accepted release-safe changes, and copies the result to the platform clipboard. Color is emitted only when standard output is an interactive terminal. `--no-color` and the `NO_COLOR` environment variable disable ANSI output.
Interactive mode reports the exact project version, processes the text deterministically, reports whether any product-authorized invisible transform was applied, and copies the result to the platform clipboard. Color is emitted only when standard output is an interactive terminal. `--no-color` and the `NO_COLOR` environment variable disable ANSI output.

## Stream use

Expand All @@ -26,6 +28,8 @@ Piped input automatically selects stream mode:
printf 'I do not agree.\n' | FuckMark
```

Current product output is the same visible line, not `I don't agree.`

Use `--stdin` or `--non-interactive` to request the same mode explicitly. Standard output contains only transformed text. Clipboard access is disabled unless `--copy` is provided.

## File use
Expand All @@ -47,14 +51,14 @@ Without `--output`, file-mode output is written to standard output. `--output -`
| `--version` | Print project, CLI, and release-registry identities. |
| `--stdin`, `--non-interactive` | Read all standard input in explicit stream mode. |
| `-o FILE`, `--output FILE` | Atomically write transformed UTF-8 text to a file. |
| `--copy` | Also copy transformed text to the system clipboard. |
| `--copy` | Also copy transformed text to the platform clipboard. |
| `-q`, `--quiet` | Hide interactive processing and completion messages. |
| `--no-color` | Disable ANSI terminal color. |

## Exit status

| Status | Meaning |
| ---: | --- |
| ---: | ---: |
| 0 | Transformation and requested outputs succeeded. |
| 1 | Input, transformation, or output validation failed. |
| 2 | Transformation succeeded, but clipboard transfer failed. The transformed text is still written to the requested non-clipboard destination or printed as fallback output. |
Expand All @@ -69,4 +73,4 @@ Errors are written to standard error. Empty input is rejected. Clipboard command

## Release boundary

The CLI uses only `release_transform_registry()`. The confirmed Cycle 4 exact-survival result belongs to the research/evaluation path and is not a claim that the public CLI itself produces a 97.40% evasion rate. Development profiles, detector scoring, experimental search, and the U+200C diagnostic registry remain outside automatic release behavior.
The CLI uses only `release_transform_registry()`, which means the exact visible-projection product contract, not "semantically conservative English edits." Historical contraction, Cycle 6 spacing, Cycle 7 durable visible edits, detector scoring, experimental search, and the U+200C diagnostic registry remain outside automatic release behavior.
8 changes: 5 additions & 3 deletions docs/cycle7/README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
# Cycle 7 — durable transform development
# Cycle 7 — durable visible-edit research (PRODUCT_DISQUALIFIED)

Cycle 6 is **frozen**. Formal outcome: `NONZERO_RESIDUAL` **7/192**, not 0/192.
Cycle 6 is **frozen**. Formal outcome: `NONZERO_RESIDUAL` **7/192**, not 0/192. That detector result remains historically valid and is **not** product-compliant FuckMark removal: Cycle 6 inserted visible ASCII spaces.

This directory starts Cycle 7 development. It does not retune Cycle 6 and does not authorize a new formal confirmation.
Cycle 7 researched collapse-resistant *visible* transforms. Those edits may preserve meaning. They still change user-visible text, so they are **PRODUCT_DISQUALIFIED** for the CLI/product path restored under `fuckmark-user-visible-invariance-v1`.

Cycle 8 (`docs/cycle8/`) is the exact-visible-projection generation. Do not promote Cycle 7 catalogs into `release_transform_registry()`.

## Live state (verified 2026-08-25)

Expand Down
30 changes: 30 additions & 0 deletions docs/cycle8/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Cycle 8 — exact visible projection

Cycle 7 is frozen as **visible-edit durability research**. It is **PRODUCT_DISQUALIFIED** even where detector snapshots looked interesting.

Cycle 8 is a new scientific generation. The mechanism class is hidden Unicode representation that leaves `VISIBLE(original)` identical to `VISIBLE(transformed)`.

## Priority order

0. Exact user-visible text preservation
1. Real detector evasion
2. Sanitizer durability
3. Independent replication
4. Protected machine-content safety
5. Low hidden payload
6. Mechanistic explanation
7. Proxy metrics

## Seed ledger

See `docs/cycle8/seed-ledger.md`. Seeds `890000`, `900000`, `910000`, and `920000` were assigned before Cycle 8 generation. Do not inspect `830000` / `840000` / `850000`. Do not inspect Cycle 7 reserved `880000`.

## Carrier research

See `docs/cycle8/carrier-research.md`.

U+200C is the diagnostic baseline. It is not durable under Cf-strip.

Early durable-track *hypothesis* (sanitizer and tokenizer screen, not a detector claim): U+034F COMBINING GRAPHEME JOINER and variation selectors U+FE00..U+FE0F. These are not product-authorized.

Fixture compare `specs/cycle8/fixture-compare-v1.json` reports visible-projection pass `20/20` across identity, U+200C, U+034F x1, U+034F x8, and U+FE00 arms. Quote interiors remain protected spans. Seed `890000` exploratory detector scoring is development-only (`PROMISING_DEVELOPMENT`, not confirmation). U+034F is not product-authorized.
41 changes: 41 additions & 0 deletions docs/cycle8/carrier-research.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Cycle 8 carrier research

Labels: `VERIFIED`, `HYPOTHESIS`, `REJECTED`, `PRODUCT_DISQUALIFIED`, `HISTORICAL_ONLY`, `UNKNOWN`.

## H1. Normalization-stable non-Cf carrier

`HYPOTHESIS` for product use. Sanitizer screen `VERIFIED` for U+034F and U+FE00..U+FE0F on the frozen arms:

- category Mn, default-ignorable, combining class 0;
- NFC/NFKC-stable in isolation;
- survives Cf-strip (not Cf);
- survives `whitespace-collapse-v1` when placed after an ASCII space.

GPT-2 tokenizer screen `VERIFIED` on the Cycle 8 fixture (tiktoken `gpt2`): inserting U+034F after ASCII word spaces changed token IDs (`ids_equal=false`, token-count delta +40) with suffix realignment of only one token. An 8-copy space run produced delta +208. U+200C also disrupts GPT-2 (delta +28) but remains Cf-fragile.

Not product-authorized. Fixture compare on four ASCII texts is `VERIFIED` for visible projection (`20/20`) and for U+034F / U+FE00 survival under Cf-strip, NFKC, and `whitespace-collapse-v1`. Chromium `pre` screenshots: U+034F and U+FE00 are `VERIFIED` pixel-equal to the original; U+200C is `REJECTED` (PNG bytes differ). Detector-blind GPT-2 / SynthID looks on seeds `890000`, `900000`, and `910000` are `PROMISING_DEVELOPMENT` / `HYPOTHESIS` only (four watermarked pairs per seed). Prefer U+034F x1: x8 overflowed GPT-2's 1024-token context on seed `900000`. The public CLI still authorizes zero carriers.

## H2. Carrier runs at space boundaries

`HYPOTHESIS`. Repeating an approved carrier after existing ASCII spaces increases hidden payload without splitting `[A-Za-z]+` words, so historical hard-invariant word matching still passes. This is the TransformRegistry-compatible high-density channel. Intra-word insertion is tokenizer-diagnostic only because it breaks the frozen hard-invariant word regex.

## H3-H8

Placement geometry, Cycle 6 scheduler reuse, and root-window correlation remain `HYPOTHESIS` for larger corpora. Tiny-corpus detector looks on seeds `890000`, `900000`, and `910000` are `PROMISING_DEVELOPMENT` only.

## H9. Feasibility boundary

Still `HYPOTHESIS`. If every tokenizer-disruptive invisible carrier is removed by ordinary sanitizers, Cycle 8 will freeze that boundary rather than weaken Priority Zero.

## Rejected as product mechanisms

| Mechanism | Label | Why |
| --- | --- | --- |
| Contractions / Cycle 7 durable edits | `PRODUCT_DISQUALIFIED` | visible words or punctuation change |
| Cycle 6 U+0020 runs | `PRODUCT_DISQUALIFIED` | visible spacing change |
| U+200C / other Cf | `REJECTED` as durable; diagnostic only | Cf-strip restores the original string |
| NBSP / hair spaces / dashes / homoglyphs | `REJECTED` | visible or NFKC-mapped layout/glyph change |

## Baseline

U+200C after ASCII word spaces: visibility-aligned on the v1 projection, Cf-fragile, and Chromium-pixel-`REJECTED`. Keep as the diagnostic control. Do not promote to release.
Loading
Loading