Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
c035749
Record Cycle 8 mix publishability gates and fail-close product promot…
cursoragent Aug 26, 2026
09aec3b
Harden Cycle 8 mix publishability software and evidence gates.
cursoragent Aug 27, 2026
0d58e3c
Record independent DeepMind 30-key mix 0/192 and DistilGPT2 n=16.
cursoragent Aug 27, 2026
b0c1fe4
Keep Unicode feasibility scans portable across Python versions.
cursoragent Aug 27, 2026
a137aec
Record H12 control-mix sanitizer research without product authorization.
cursoragent Aug 27, 2026
6033a7c
Record H12 Chromium pixels as host-dependent.
cursoragent Aug 27, 2026
715bf10
Record H13 post-sanitizer mechanism class without product authorization.
cursoragent Aug 27, 2026
191422e
Record H14 extended sanitizer classes without product authorization.
cursoragent Aug 27, 2026
2e0e13b
Trigger CI after retargeting H14 onto main.
cursoragent Aug 27, 2026
74b5192
Strip comments from H14 research tools.
cursoragent Aug 27, 2026
670209a
Classify only simple empty TrueType glyphs in the H14 scan.
cursoragent Aug 27, 2026
5b3e3e1
Record H15 sequence sanitizer classes without product authorization.
cursoragent Aug 27, 2026
1c7a97f
Add H16 threat-model audit research tools.
cursoragent Aug 27, 2026
b82b6fc
Record H16 threat-model audit of the H12-H15 sanitizer gate.
cursoragent Aug 27, 2026
e17f7a1
Record that the corrected gate is already met by evidence on record.
cursoragent Aug 27, 2026
2f950a2
Refresh uv lock for the uharfbuzz and tokenizers research extras.
cursoragent Aug 27, 2026
0a87bfb
Fold the one real deployed sanitizer into the H16 audit.
cursoragent Aug 27, 2026
fc3d647
Close the outstanding H16 measurement: mix still evades the real sani…
cursoragent Aug 27, 2026
c490d7e
Add the carrier-free control that attributes the evasion to the carrier.
cursoragent Aug 27, 2026
69cdf00
Preregister Gate v2 and correct the H16 12-context overclaim.
cursoragent Aug 27, 2026
aed11b6
Record Gate v2 confirmation 0/192 and the 12-context rescan.
cursoragent Aug 27, 2026
24c53a4
Authorize frozen letter-mix on the public CLI as 0.4.0.
cursoragent Aug 27, 2026
057fb19
Load mix from the source tree in the release-install verifier.
cursoragent Aug 27, 2026
f05a7b8
Emit UTF-8 mix on Windows stdio instead of failing on cp1252.
cursoragent Aug 27, 2026
b1407ac
Send mix to Windows clip as UTF-16 instead of locale text.
cursoragent Aug 27, 2026
6116312
Polish the public CLI and product docs for the 0.4.0 release candidate.
cursoragent Aug 27, 2026
11a9523
Make plain fuckmark a paste UI that copies instead of printing.
cursoragent Aug 27, 2026
4998810
Hide research dumps from the public product surface.
cursoragent Aug 27, 2026
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
35 changes: 32 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,16 +49,45 @@ jobs:
SH
chmod +x "$test_bin/wl-copy"
export PATH="$test_bin:$PATH"
expected_long="$(printf 'I do not agree and I cannot stay.\n' | python -c "from fuckmark.cycle8.letter_mix import apply_letter_alternating_mix; import sys; sys.stdout.write(apply_letter_alternating_mix(sys.stdin.read()))")"
expected_short="$(printf 'I do not agree.\n' | python -c "from fuckmark.cycle8.letter_mix import apply_letter_alternating_mix; import sys; sys.stdout.write(apply_letter_alternating_mix(sys.stdin.read()))")"
for command in FuckMark Fuckmark fuckmark; do
command -v "$command"
capture="$RUNNER_TEMP/${command}.clipboard"
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 do not agree and I cannot stay."
test "$(cat "$capture")" = "I do not agree and I cannot stay."
test "$output" = "$expected_long"
test "$(cat "$capture")" = "$expected_long"
done
test "$(printf 'I do not agree.\n' | FuckMark)" = "I do not agree."
test "$(printf 'I do not agree.\n' | FuckMark)" = "$expected_short"
test "$(printf 'I do not agree.\n' | FuckMark --stdin --visible)" = "I do not agree."
expected_arg="$(python -c "from fuckmark.cycle8.letter_mix import apply_letter_alternating_mix; import sys; sys.stdout.write(apply_letter_alternating_mix('I do not agree.'))")"
test "$(FuckMark 'I do not agree.')" = "$expected_arg"
FuckMark --help >/dev/null
python - <<'PY'
from io import StringIO
from fuckmark.cli import main
from fuckmark.cycle8.letter_mix import apply_letter_alternating_mix

class Tty(StringIO):
def isatty(self):
return True

copied = []
out = StringIO()
err = StringIO()
src = Tty("I do not agree.\n\nSecond paragraph.\n:done\n")
assert main(src, out, copied.append, error_stream=err) == 0
expected = apply_letter_alternating_mix("I do not agree.\n\nSecond paragraph.")
assert copied == [expected], copied
assert out.getvalue() == ""
ui = err.getvalue()
assert "Processing..." in ui
assert "Copied to clipboard" in ui
assert expected not in ui
print("interactive e2e ok")
PY

calibration-readiness:
name: Frozen calibration readiness
Expand Down
96 changes: 13 additions & 83 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,92 +1,22 @@
# Changelog

## v0.3.0 — Visible invariance, install and release hardening
## v0.4.0 — Product CLI

- Advanced the project version to 0.3.0 so the identity CLI is not published under the v0.2.0 contraction tag.
- 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.
- Official install docs now use the tagged GitHub Release wheel plus `SHA256SUMS.txt`. In-repo installers verify that checksum, do not start the CLI, and do not use sudo. `d.q1z.org/mark` is no longer documented as the install path.
- Release Engineering no longer auto-tags, auto-publishes, or deletes merged branches on `main` push. Publishing is `workflow_dispatch` only against an existing tag.
- GitHub Actions `workflow_dispatch` values are passed through `env:` instead of being interpolated into `run:` scripts.
- Interactive CLI copies to the clipboard only with `--copy`.
- Product contract loading requires the frozen v1 hash even when `specs/` is absent from an installed wheel.
- `source_verified_release_transform_registry` keeps verified visible-preserving rules instead of dropping them after promotion checks.
- `BayesianDetectorEvidence.confirmatory_score()` refuses UNVERIFIED status. `raw_score` stays the frozen v1 field.
- `load_bayesian_checkpoint` rejects JSON larger than 64 MiB.
- Seed `880000` is `PUBLICLY_EXPOSED` by closed unmerged PR #98 and is not eligible as unseen validation. Added `global-seed-ledger-v1` and reserved Cycle 8 scale seeds `930000` / `940000` / `950000` before scale generation.
- Cycle 8 scale exploratory seed `930000` U+034F x1: 0/16 then 0/32 raw transformed WM, then **1/64** on the 64-pair expansion (matched UW 0, visible projection pass, sanitizer matrix matches raw). Do not rewrite 1/64 as zero. Independent replication seed `940000` n=64 is **0/64** raw transformed WM (max score 0.557052 versus threshold 0.557099). Combined 64-pair corpora: **1/128**. Product registry fail-closes carrier sites that would violate frozen hard invariants.
- U+034F is still not product-authorized. Do not generate `950000`. Do not inspect `830000` / `840000` / `850000`.
- Reserved Cycle 8 density exploratory seed `960000` (`carrier density follow-up`) before generation, then scored a detector-blind U+034F space x1 versus space plus word-final letter x1 comparison. Both arms are **1/16** raw transformed WM on the same residual row. Density did not beat space x1. Not product-authorized.
- Cycle 8 letter-x1 (U+034F after ASCII letters, visible-word invariants, quote-interior carrier policy, detector-blind selected-site cap 192) diagnostically rescored seen `930000` n=64, `940000` n=64, and `960000` n=16 to **0** raw transformed WM with clean unwatermarked controls and exact visible projection. Independent reserved seed `970000` (`intra-word carrier follow-up`) is **0/16** then **0/64**. Experimental letter-x1 **0/192** = seen `930000` n=64 plus seen `940000` n=64 plus independent `970000` n=64 (**128/192 seen**, **64/192 independent**). Space-x1 1/64 and 1/16 remain frozen.
- Cycle 8 letter-x1 system benchmark reserved seeds `980000` and `990000` before generation. Fresh independent corpora: letter-x1 **0/128** raw transformed WM, space-x1 **1/128** on the same texts, letter max score 0.554066 versus threshold 0.557099. Local fixtures: visible projection 21/21, protected spans 21/21, Chromium `pre`/textarea/contenteditable pixel-equal on measured samples. Formal confirmation readiness is `NOT_READY`. Letter-x1 is not product-authorized and is not confirmation. Do not generate `950000`.
- Cycle 8 letter-space margin seeds `1000000` and `1010000` were reserved before generation. Combined fresh letter-space is **1/128** on the same residual geometry; do not rewrite that as zero.
- Cycle 8 letter-mix margin reserved seeds `1020000` and `1030000` before generation. Detector-blind U+034F/U+FE00 alternating letter mix is fresh **0/128** raw transformed WM, mix UW **0/128**, worst mix score 0.513691 versus threshold 0.557099 (gap 0.043407). Letter-x1 on those same corpora is 0/128 with max 0.527389. Chromium mix fixtures were pixel-equal on the measured `pre`/textarea/contenteditable surfaces. Mix is not product-authorized and is not confirmation. Formal confirmation readiness remains `NOT_READY`.
- Cycle 8 letter-mix scale reserved seeds `1040000` and `1050000` before generation. Combined with `1020000`+`1030000`, mix is **0/256** raw transformed WM, mix UW **0/256**, worst mix score 0.519522 (gap 0.037577). The two-corpus 0/128 scorecard is not rewritten. This 0/256 is development scale, not confirmation.
- Froze development mechanism `u034f-ufe00-letter-alt-v1` as `cycle8-mix-freeze-v1`. Public CLI remains empty.
- Cycle 8 mix freeze one-shot confirmation on preregistered seeds `830000` / `840000` / `850000`: mix **0/192** raw transformed WM, mix UW **0/192**, visible **192/192**, frozen sanitizers matching raw zeros, worst mix score 0.524300 versus threshold 0.557099 (gap 0.032798). Those seeds are spent. Do not rerun looking for zero. Mix is not product-authorized. Do not generate `950000`.
- Transforms ordinary English ASCII text. Visible words stay exactly the same.
- In a terminal, `fuckmark` opens a paste UI. Finish with `:done`. The result is copied and not printed.
- Pipes, quoted text, files, and `--stdin` write the payload to stdout. `--visible` prints the original visible text. `--copy` copies stream output.
- Unsupported Unicode is returned unchanged. Empty input and invalid UTF-8 fail with an actionable error.
- Confirmed on GPT-2 / SynthID tests: transformed text 0/192 after required sanitizers, exact visible text 192/192. This does not remove every watermark.
- Install from a clone with `python -m pip install .`. The GitHub Release wheel is published after the immutable `v0.4.0` tag.

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

### Research
Public CLI left text unchanged (no visible edits). Install and release hardening. Not the current product.

- Confirmed the Cycle 4 exact post-retokenization scheduling objective on three independent frozen confirmation corpora.
- The preregistered aggregate outcome is `CONFIRMATORY_IMPROVEMENT`.
- Cycle-3 proxy scheduling left 8/192 transformed watermarked samples detected; exact-survival scheduling left 5/192 detected under the same inherited threshold.
- The measured evasion rate on that frozen open Hugging Face SynthID configuration therefore changed from 95.83% to 97.40%.
- Matched unwatermarked detections remained 2/192 in both aggregate arms.
- Every independent 64-source confirmation corpus improved by one residual detection: 3->2, 3->2, and 2->1.
- Added `exact-survival-greedy-key-blind-v2`, extending the frozen v1 objective with deterministic pairwise completion after single-candidate saturation.
- Added the development-only `content-region-destruction-v1` visible candidate pool without mutating the frozen Cycle-3 ruleset hash.
- Added raw, NFKC, Cf-strip, and combined sanitizer robustness reporting.
- Kept U+200C explicitly quarantined as a diagnostic upper-bound mechanism and excluded it from automatic release behavior.
- The expanded pool plus scheduler v2 reached 0/12 detected in the fresh development run, but this remains development evidence rather than a large-corpus confirmatory claim.
## v0.2.0

### Release engineering
Historical contraction CLI. Not the current product.

- Advanced the project version to 0.2.0 across package metadata, package identity, lock metadata, CLI regressions, and clean-install verification.
- Removed the hard-coded `v0.1.0` publication fallback from `Release Engineering`.
- GitHub Release publication now occurs only from an immutable `v*` tag.
- Added a publication guard that requires the Git tag to exactly match the version in `pyproject.toml`.
- Made `tools/verify_release_install.py` derive the expected version from project metadata instead of embedding a release-specific literal.
- Upgraded the core CI and release workflows to current Node 24 GitHub Actions.
- Retained cross-platform wheel/sdist build, `twine check`, clean-install verification, console-command verification, and SHA-256 generation.
## v0.1.0

### Documentation

- Rewrote the README for the v0.2.0 release and current Cycle 4 evidence.
- Updated all current documentation under `docs/`: CLI, installation, and release process.
- Separated the confirmed 97.40% open-detector research result from the conservative public CLI behavior.
- Preserved frozen historical evidence and v0.1.0 release-readiness artifacts rather than rewriting old contracts to match the new release.

### Claim boundary

The 97.40% figure is specific to the frozen open GPT-2 / Hugging Face SynthID Weighted Mean confirmation configuration and its fixed threshold. v0.2.0 does not claim perfect watermark removal, arbitrary-model transfer, proprietary-detector transfer, future-watermark transfer, or formal confirmation of scheduler v2.

## v0.1.0 — Foundation hardening

v0.1.0 established the deterministic research and release foundation used by Cycle 4. Major work included:

- deterministic source/run identities, hashing, canonical serialization, and replayable evidence;
- token alignment and exact n-gram observation geometry;
- pinned DeepMind and Hugging Face SynthID observation adapters;
- source-conformant Mean and Weighted Mean detector primitives;
- conservative fixed-FPR calibration and pristine-baseline evidence;
- content-addressed corpora, prompt provenance, generation boundaries, and matched watermarked/control validation;
- immutable protected-span extraction and hard semantic invariants;
- deterministic transform registries, candidate enumeration, conflict graphs, traces, and replay;
- TinyDev and MidDev experiment infrastructure with separate planning and scoring paths;
- release-safe CLI behavior for interactive, stream, file, clipboard, and atomic-output use;
- wheel and source-distribution verification on Linux, macOS, and Windows;
- MIT licensing, package metadata, project URLs, and tagged GitHub Release support;
- explicit rejection records for experiments that failed preregistered effectiveness gates;
- quarantining of invisible-format-character experiments that failed sanitizer durability.

The detailed v0.1.0 research chronology remains preserved in the repository history and frozen artifacts under `specs/`. Those historical contracts are not rewritten by later releases.
First tagged release.
Loading
Loading