Repository navigation
Conversation
…ion. Five gates after the merged mix freeze: reproducibility and visibility pass; Latin-1/literal-search, Mn/default-ignorable sanitizers, and single-detector confirmation fail. Mix stays out of the public CLI. Do not retag v0.3.0. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
UTF-8 is the only product encoding; latin-1, ascii, and cp1252 are rejected. Visible-projection search is the product search API. Assigned Unicode has no stronger Priority-Zero invisible mechanism. Mean versus Weighted Mean on the same GPT-2 adapter is HYPOTHESIS 0/192, not a second model. Mix stays out of the public CLI. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
Cross-detector PASSes on Hugging Face nine-key GPT-2 Weighted Mean plus Google synthid-text 30-key GPT-2. DistilGPT2 n=16 is HYPOTHESIS second-model transfer, not confirmation-scale. Sanitizer still FAILs: width-0 assigned insertions are Mn, Me, or Cf, and all 13 enclosing marks change Chromium pre pixels. Mix stays out of the public CLI. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
Frozen H9 and closed-set hashes stay the CPython 3.12 snapshot. Live scans on 3.11 and 3.13 still must find no stronger Priority-Zero mechanism. Mix stays out of the public CLI. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
DEL and C1 except NEXT LINE survive the required sanitizers and keep Chromium pre/textarea/contenteditable pixels. Independent seed 1100000 n=16 is control-mix 0/16 WM with identity 15/16. Mix sanitizer stays FAIL. The public CLI stays empty. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
GitHub Actions Chromium rejected the full control-mix apply while one research host matched. Do not treat that as a product visibility PASS. Mix sanitizer stays FAIL. The public CLI stays empty. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
No measured Unicode-string family is simultaneously sanitizer-surviving, Chromium-portable, ordinary plain text, and Priority-Zero safe. This is a classification, not a Unicode re-scan. Mix sanitizer stays FAIL. The public CLI stays empty. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
Mc, NFKC-stable Lm, designed blanks, Hangul filler sequences, and font-metric empty glyphs were measured. None are simultaneously sanitizer-surviving, Chromium-portable, ordinary plain text, and Priority-Zero safe. Mix sanitizer stays FAIL. The public CLI stays empty. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
Co-authored-by: Byte271 <byte271@users.noreply.github.com>
Repository hygiene forbids comments and docstrings in Python files. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
Composite glyphs have numberOfContours == -1 and must not be labeled empty. FontTools stays a research extra, not a runtime dependency. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
Grapheme prepend and joining connectors survive the required sanitizers and change Chromium pixels. Hangul L plus V dies to NFC or NFKD. Bidi wraps and partial remainders collapse to Cf or H12. Mix sanitizer stays FAIL. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
Four independent probes for the sanitizer threat model: - h16_shaping_closure_scan: HarfBuzz advance/ink oracle over every assigned code point, replacing per-probe Chromium screenshots. - h16_oracle_validation: cross-checks that oracle against real Chromium pre pixels on a stratified sample. - h16_tokenizer_threat_model: measures what production detector tokenizers actually do to carrier code points. - h16_sanitizer_deployability: measures collateral corruption when each sanitizer in the required bundle runs on ordinary multilingual text. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
H9-H15 searched for a carrier that is invisible to the reader and also a fixed point of the required sanitizer bundle, and every cycle returned a negative. H16 audits the gate instead of running another search. Closure. A HarfBuzz advance-and-ink oracle over 286719 assigned code points in 12 shaping contexts finds 396 invisible code points in the Chromium pre font, and every one is Mn or Cf. The required bundle strips exactly Mn, Cf and default-ignorable, so invisibility and bundle survival are complementary sets and the intersection is 0. Substitution closes too: 14 code points render as an ASCII space and all 14 collapse to U+0020 under NFKC. Canonical re-encoding closes because the declared ASCII domain is a fixed point of all four normalization forms. The only remainder in the whole space is Cc, which ordinary-plain-text excludes. The oracle agrees with real Chromium pixels on 20 of 23 stratified samples and all three disagreements are accounted for. Tokenization. SynthID-Text scores model tokens, so the tokenizer is the operative normalizer. The Gemma tokenizers it is deployed on declare only the SentencePiece whitespace Replace and strip no Mn, Cf or Cc. The only measured tokenizers that drop anything are the two SentencePiece Precompiled ones, and what they drop is DEL, inverting the gate. Deployability. Mn-strip corrupts 5 of 7 ordinary multilingual samples and default-ignorable-strip corrupts 4 of 7, destroying Thai vowels, Hebrew niqqud, Persian ZWNJ and emoji ZWJ sequences. Scope. The frozen product contract classifies both as stress_only_not_frozen, yet required_sanitizers_keep treats them as hard requirements. Mix survives 21/21 frozen sanitizer fixtures and every other publishability gate passes. This records the audit only. required_sanitizers_keep is unchanged, no test is relaxed, proposed_gate_v2 is marked proposal_only_not_active, the public CLI stays empty and mix sanitizer stays FAIL. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Reading the already-recorded frozen confirmation evidence against proposed_gate_v2, with no new corpus and no retuned seed: identity detects 185/192, the mix transform detects 0/192 watermarked and 0/192 unwatermarked, visible text passes 192/192, every deployable sanitizer still detects 0, and mix survives 21/21 frozen sanitizer fixtures. The gap between the project and a shippable mechanism is therefore a decision about which sanitizers the gate should require, not a missing carrier. This does not make that decision. product_authorized stays False, the public carrier set and release registry stay empty, proposed_gate_v2 stays proposal_only_not_active, and mix sanitizer stays FAIL. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
Co-authored-by: Byte271 <byte271@users.noreply.github.com>
Literature review found that the claim 'no real sanitizer exists' is too strong. Exactly one ships on by default in the watermarking ecosystem: the UnicodeSanitizer in jwkirchenbauer/lm-watermarking, enabled by WatermarkDetector(normalizers=['unicode']) and applied before tokenization. It is not Mn-strip or default-ignorable-strip. It is NFC, then a fixed BMP regex whose matches are replaced with a space, then a space collapse, then Cc removal. Measured against a faithful reproduction of it: - It does not restore the unwatermarked source from mixed text. - U+034F survives; U+FE00 is removed. - 366 of the 396 invisible code points survive. - It injects spurious visible spaces, so mixed text comes out mangled. - It corrupts 5 of 7 ordinary samples, splitting an emoji ZWJ family into three people and breaking Persian ZWNJ and a Devanagari conjunct. Because this sanitizer is real, proposed_gate_v2 now requires it, which makes the proposal stricter rather than laxer. Detection after it is not measured here and is recorded as UNMEASURED, so the earlier claim that the proposed gate was already satisfied is withdrawn: the frozen conditions are met and proposed_gate_v2_fully_satisfied is False. product_authorized stays False, the required bundle is unchanged, the proposal stays inactive, and mix sanitizer stays FAIL. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
…tizer. Ran the detector on the exploratory lane, seed 890000 with GPT-2 and 48 watermarked rows. Seed 890000 is the lane CI already runs on every PR; it is not a confirmation corpus, and no spent seed (830000/840000/850000) or the forbidden 950000 is touched. pristine, no transform 47/48 detected mix, raw 0/48 mix + nfkc 0/48 mix + cf_strip 0/48 mix + lm-watermarking UnicodeSanitizer 0/48 mix + required bundle 47/48, restores source 96/96 Mix evades the real sanitizer exactly as well as it evades raw. The only variant that restores detection is the required bundle, and the last column explains why: it reconstructs the original string on every row. That is the mechanism behind the whole H12-H15 blockage. The bundle does not defeat the carrier, it deletes it and hands the detector back the untouched watermarked text. Every condition of proposed_gate_v2 now has a measurement, but this one is exploratory rather than confirmation grade, so proposed_gate_v2_fully_satisfied stays False and confirmation_grade is False, with tests asserting both. product_authorized stays False, the required bundle is unchanged, the proposal stays inactive, and mix sanitizer stays FAIL. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
The lm-watermarking UnicodeSanitizer collapses space runs and strips Cc, so it damages ordinary text on its own. A bare 0/48 after it was therefore ambiguous: the sanitizer could have been suppressing detection rather than mix evading it. Re-ran the exploratory measurement with each variant also applied to the carrier-free watermarked source: variant with mix no mix restores src raw 0/48 47/48 0/96 nfkc 0/48 47/48 0/96 cf_strip 0/48 47/48 0/96 lm-watermarking UnicodeSanitizer 0/48 46/48 0/96 required bundle 47/48 47/48 96/96 The real sanitizer costs one row of detection power by itself, so the drop to zero is attributable to the carrier and not to the sanitizer mangling the text. Adds a test asserting the control holds and a payload guard rejecting the record if the carrier-free control ever falls below half the rows, so this confound cannot silently reappear. Still exploratory, still not confirmation grade, still no product authorization, and mix sanitizer stays FAIL. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c490d7e3b6
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| keeps = required_sanitizers_keep(f"I{character} do not agree.") | ||
| if keeps: | ||
| sanitizer_survivors += 1 | ||
| if not primary.invisible(codepoint): |
There was a problem hiding this comment.
Scan all advertised shaping contexts
The exhaustive scan always calls primary.invisible(codepoint) with its default A/B context; SHAPING_CONTEXTS is never imported or iterated anywhere in this tool. Consequently, context-sensitive shaping in the advertised Arabic, Devanagari, Hangul, start/end, and other contexts is not evaluated, even though the audit records shaping_contexts_scanned: 12 and uses that claim to conclude the carrier search is closed. A code point that is visible between A and B but invisible in another context is omitted entirely, so the central zero-intersection result cannot support the stated 12-context closure.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Agreed. Independent audit of the committed scan at c490d7e confirms primary.invisible(codepoint) used the default latin A/B context and never iterated SHAPING_CONTEXTS. Artifact evidence/h16-local/shaping-closure.json has no contexts-scanned field, so 286719 / 396 / intersection 0 are VERIFIED for A/B only.
Successor PR #106 records that overclaim, keeps the frozen A/B artifact, and changes the scan tool to iterate all 12 advertised contexts. The 12-context measurement is not yet claimed. #105 should not land as-is.
|
Independent takeover audit: do not merge this PR as-is. The Gate v2 form is correct, but the advertised 12-context scan was not executed (Codex P1). Successor: #106 That PR starts from this tip, records the errata, formalizes Gate v2 as preregistered-not-active, and reserves unspent confirmation seeds 1200000/1210000/1220000 before generation. Public CLI stays empty. Mix sanitizer FAIL is not rewritten. |
…xt scan. Review on #106 caught a genuine error: scan() advertised 12 shaping contexts but called primary.invisible(codepoint) with the oracle's default Latin A/B pair and never iterated SHAPING_CONTEXTS. The published 396 figure and the spec field shaping_contexts_scanned=12 were therefore unsupported. Rather than record the errata and leave the measurement pending, this runs it. The scan now iterates all twelve contexts and reports both bracketing definitions, since which one you pick is exactly what was ambiguous: invisible in every context 389 (Mn 262, Cf 127) invisible in at least one context 396 (Mn 262, Cf 134) intersection, all-context 0 intersection, any-context 0 396 is the any-context figure, so the originally published number was right for the loose reading. The correction strengthens the closure rather than weakening it: the intersection is now shown empty on the loosest definition, not on a single context. Every invisible codepoint under either definition is still Mn or Cf, which the required bundle strips by construction. Per-context counts show Arabic as the most discriminating at 390, which is expected since joining behaviour gives several Cf controls visible effect. The original Latin A/B artifact is kept unmodified at shaping-closure.json; the corrected scan writes shaping-closure-12-context.json. Errata is recorded in the payload, the docs, and the evidence README rather than silently fixed. Adds a payload guard rejecting the record if the any-context intersection is ever nonzero or if all-context invisibility exceeds any-context invisibility. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
…ecur. The 12-context overclaim was possible because recorded constants and the runs that produced them were only informally connected: nothing failed when the payload asserted a measurement the scan had not performed. Cross-checked all 51 recorded figures against the committed artifacts. Every numeric claim traced correctly. One mismatch, cosmetic: the llama-2-7b normalizer label was recorded as Sequence[Prepend,Replace] against a measured Sequence[Prepend, Replace]. Fixed, and the spec is refrozen at e9d17896. Adds five tests binding the constants to evidence/h16-local/*.json for the multi-context closure, the oracle validation, the tokenizer probe, the sanitizer deployability run, and the real-sanitizer detector run. Mutation checked: changing MULTI_CONTEXT_ALL_INVISIBLE_COUNT from 389 to 390 fails both the literal assertion and the artifact cross-check, so the guards are not vacuous. No figure changed, no conclusion changed, and mix sanitizer stays FAIL. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
|
Closing this PR instead of merging it. #106 is now on This PR's own recommendation was to land #106, not this branch. Research evidence already on |
H9-H15 searched for a carrier that is invisible to the reader and also survives a required sanitizer bundle. Seven cycles returned negatives. This PR stops searching and audits the gate that produced them.
The gate is wrong, and the negatives measure the gate rather than Unicode.
1. The search space was empty by construction
tools/h16_shaping_closure_scan.pyreplaces per-probe Chromium screenshots with a HarfBuzz oracle: a code point counts as invisible only when inserting it leaves both the total advance width and the inked glyph sequence unchanged in the font Chromium resolves forpre.Mn262,Cf127)Mn262,Cf134)Mn/CfBoth definitions are reported because they bracket the question. Invisibility in every context is the safety criterion a real carrier must meet; invisibility in only one context is far looser and admits strictly more candidates. The intersection is empty either way, so the closure does not depend on which you pick.
Every invisible code point is
MnorCf. The required bundle strips exactlyMn,Cfand default-ignorable. The two sets are complementary, so no enumeration of code points, sequences or shaping contexts could have found a survivor.Per-context counts:
latin396,latin_lower396,digit395,space_left396,space_right396,start395,end396,arabic390,devanagari396,cjk396,hangul396,punct395. Arabic is the most discriminating, as expected — joining behaviour gives severalCfcontrols a visible effect.On the errata.
scan()advertisedSHAPING_CONTEXTSbut never iterated it, so the published 396 and the spec fieldshaping_contexts_scanned: 12were unsupported. The corrected scan shows 396 is the any-context figure, so the original number was right for the loose reading, and 389 is the newly measured all-context figure. The conclusion is unchanged and now rests on the loosest definition rather than on one context. The original Latin A/B artifact is kept unmodified atshaping-closure.json; the corrected scan isshaping-closure-12-context.json.The other transformation classes close as well. Substitution: 14 code points render as an ASCII space and all 14 collapse to
U+0020under NFKC. Canonical re-encoding: the declared ASCII input domain is a fixed point of NFC, NFD, NFKC and NFKD. Deletion and reordering change visible text. The single remainder in all of Unicode isCc, which ordinary-plain-text excludes.tools/h16_oracle_validation.pycross-checks the oracle against real Chromiumprepixels on 23 stratified samples: 20/23 agreement.U+200Cis the oracle being more generous than Chromium, which only strengthens the closure.U+007FandU+0080are Blink dropping controls at layout time rather than in the font, which is whyCcis tracked separately.2. Production detectors do not apply these sanitizers
SynthID-Text scores model tokens, so the operative normalizer is the tokenizer.
tools/h16_tokenizer_threat_model.pyprobes nine carriers spanningMn,CfandCcagainst eight cached tokenizers.ReplaceReplaceSequence[Prepend, Replace]PrecompiledPrecompiledThe Gemma tokenizers SynthID-Text is deployed on strip no
Mn, noCfand noCc. The only tokenizers that drop anything are the two SentencePiecePrecompiledones, and what they drop is DEL.The one sanitizer that is real, and whether it works
"No production tokenizer strips these" is not "no real sanitizer exists". Exactly one ships on by default: the
UnicodeSanitizerinjwkirchenbauer/lm-watermarking, enabled byWatermarkDetector(normalizers=["unicode"])and applied before tokenization. It is NFC, then a fixed BMP regex whose matches are replaced with a space, then a space collapse, thenCcremoval. It keeps 366 of the 396 invisible code points includingU+034F, removesU+FE00, injects spurious spaces, and corrupts 5 of 7 ordinary samples.Because it is real,
proposed_gate_v2requires it.tools/h16_real_sanitizer_detector.pymeasures whether the detector actually fires, on the exploratory lane (seed 890000, GPT-2, 48 watermarked rows — the lane CI already runs on every PR, not a confirmation corpus):Mix evades the real sanitizer exactly as well as it evades raw.
The third column is a control, and it matters. This sanitizer collapses space runs and strips
Cc, so it damages text on its own, and a bare 0/48 could have meant the sanitizer was suppressing detection rather than mix evading it. Applied to carrier-free watermarked text it still detects 46/48 against a 47/48 baseline. It costs one row of detection power by itself, so the drop to zero is attributable to the carrier.The fourth column explains the one variant that does restore detection. The required bundle reconstructs the original string on every row. That is the mechanism behind the entire H12-H15 blockage — the bundle does not defeat the carrier, it deletes it and hands the detector back the untouched watermarked text.
3. The stress sanitizers are not deployable
stress_only_not_frozenstress_only_not_frozenThai
ฉันไม่เห็นด้วยbecomesฉนไมเหนดวย, Hebrew loses all niqqud, Hindiनहींbecomesनही, Persianنیستمهاloses its ZWNJ, and👨👩👧becomes three separate people. No detector vendor can run these as preprocessing.4. The gate is wrong on scope and on form
Scope. The frozen product contract classifies
default_ignorable_removalandnonspacing_mark_removalasstress_only_not_frozen, yetrequired_sanitizers_keeptreats both as hard requirements. That is the entire blockage: mix survives 21/21 frozen sanitizer fixtures, and reproducibility, visibility invariance, software compatibility and cross-detector generalization all pass.sanitizer_weaknessesis the only FAIL and it fails only on those two.Form. The gate asks whether the carrier is a fixed point of every sanitizer,
S(T(x)) == T(x). The product goal is that detection fail after sanitization. Fixed-point survival is sufficient but not necessary, so the gate is strictly stronger than the goal it stands in for.5. Where the corrected gate stands, as of this branch
Against the already-recorded frozen confirmation evidence: identity detects 185/192, mix detects 0/192 watermarked and 0/192 unwatermarked, visible text passes 192/192, frozen sanitizer fixture survival is 21/21, and every frozen sanitizer still detects 0.
On this branch alone, every condition of
proposed_gate_v2has a measurement but the real-sanitizer one is exploratory, soproposed_gate_v2_fully_satisfiedisfalseandconfirmation_gradeisfalse. #106 has since supplied the confirmation-grade run; see §7.6. Every figure is bound to an artifact
The overclaim was possible because recorded constants and the runs that produced them were only informally connected: nothing failed when the payload asserted a measurement the scan had not performed. So all 51 recorded figures were cross-checked against the committed artifacts. Every numeric claim traced correctly; the one mismatch was cosmetic, a missing space in the llama-2-7b normalizer label, now fixed.
Five tests bind the constants to
evidence/h16-local/*.jsonfor the multi-context closure, the oracle validation, the tokenizer probe, the deployability run and the detector run. Mutation checked: changingMULTI_CONTEXT_ALL_INVISIBLE_COUNTfrom 389 to 390 fails both the literal assertion and the artifact cross-check, so the guards are not vacuous.7. Relationship to #106, and what to land
#106 branches from
c490d7e, one commit before this branch's 12-context correction, so the two did that rescan independently. They agree exactly. Every per-context count matches —arabic390,digit395,punct395,start395, the rest 396 — as do 286719 scanned, 267550 fixed points, 63Ccsurvivors, and intersection 0. The only difference is presentation: #106 reports the union asshaping_invisible_count396, this branch reports the all-context 389 as the headline and the any-context 396 alongside it. Same raw measurement, two conventions. This is independent replication of the corrected result, which is worth more than either scan alone.More importantly, #106 has run the confirmation this PR listed as outstanding, on the reserved unspent seeds
1200000/1210000/1220000at n=64 each. It reproduces the exploratory result at confirmation grade: mix detected 0/192 under every required sanitizer including the lm-watermarkingUnicodeSanitizer, 0/192 unwatermarked, visible 192/192, identity 188/192. It also carries the carrier-free control at scale — 182/192, a drop of 6 from identity — which corroborates the 46/48-vs-47/48 exploratory control in §2.required_bundleagain detects 188/192 as a diagnostic, the same restore-the-original mechanism. Its scorecard isconfirmation_grade: true,fully_satisfied: true,product_authorized: false.#106 also fixes the omission it flagged here, adding frozen Cycle 7 sanitizer
ws_collapse_nfkc_cf_stripto the required set.Recommendation: land #106, not this branch. It strictly contains this work plus the confirmation and the gate spec. The two branches both touch
evidence/h16-local/README.md,docs/cycle8/carrier-research.mdand the audit payload, and they write near-duplicate rescan artifacts under different names —shaping-closure-12-context.jsonhere versusshaping-closure-12context.jsonthere — with differentshaping_invisible_countconventions, 389 against 396. Landing both would leave two artifacts that look contradictory but are not. This branch is left open and green so the correction and the replication are on the record; I have not closed it, since that is the maintainer's call.What this PR does not do
required_sanitizers_keepis unchanged and no existing test is relaxed.proposed_gate_v2isproposal_only_not_activeon this branch.product_approved_carriers_v1()andrelease_transform_registry()stay empty, the CLI stays identity, and mix sanitizer stays FAIL. Tests assert each of these.830000/840000/850000/950000.Changes
fuckmark/cycle8/threat_model_audit.pyandspecs/cycle8/fuckmark-cycle8-threat-model-audit-v1.json, frozen ate9d17896….tests/test_cycle8_threat_model_audit.py, 42 tests.tools/h16_*, plusevidence/h16-local/with both closure artifacts and a written record carrying the errata.researchextra gainsuharfbuzzandtokenizers; neither is a runtime dependency.uv.lockrefreshed.Full suite green locally.