# How does a text watermark work?

> A first-principles investigation of how generation-time text watermarks work, from a weighted coin to Gemma, and where the evidence stops.

- **Date:** 2026-08-18
- **Author:** Jay Shah (https://jayshah.dev)
- **Tags:** ai-safety, llm, watermarking, gen-ai, research
- **Canonical URL:** https://jayshah.dev/posts/how-text-watermarks-hide-in-plain-sight/

---

<aside class="tldr">
<h2>TL;DR</h2>
<p><strong>How watermarks hide:</strong> Plain text contains no invisible pixel slack or file metadata. A generation-time watermark instead changes which acceptable token the model is likely to choose. In the KGW-style system tested here, a secret key selects a favored vocabulary subset at each step, and the sampler raises the scores of those tokens.</p>
<p><strong>Why deployment is timely:</strong> Article 50 of the EU AI Act requires machine-readable marking where technically feasible from August 2026. Anthropic announced Claude's watermark soon after the requirement took effect and signed the corresponding Code of Practice. A matching detector can provide evidence that text carries a configured mark, but it cannot prove plagiarism or authorship.</p>
<p><strong>What Claude's disclosed mark does not encode:</strong> Claude's disclosed detector answers whether text carries evidence associated with a configured key. It does not decode an identity; Anthropic says the mark contains no user, organization, or chat identifier.</p>
<p><strong>What weakens the signal:</strong> In the KGW-style system tested here, edits change the token history used to reconstruct each keyed group. All 12 paraphrases that passed the declared automatic screens scored lower, and none crossed the configured cutoff. An assistant review rated ten pass and two uncertain. These results do not establish the removal rate for Claude's private SynthID-Text configuration.</p>
</aside>

<p>Plain text leaves nowhere obvious to hide a watermark. That is what makes the problem interesting.</p>
<p>An image has millions of pixel values that can shift without changing what a person sees. Video repeats that grid across thousands of frames. Text has no comparable slack. Every character is visible, and copy-paste discards file metadata. If a mark is going to survive, it has to live in the model's choices rather than in an invisible layer around the text.</p>
<p>I started pulling on that question after Anthropic announced that future Claude models would watermark their text output.<sup class="ref"><a href="#fn-anthropic-support" aria-label="Source 1">1</a></sup> Three days later, the company said Claude uses "a version of the SynthID-Text approach" that changes randomness among acceptable next-word choices.<sup class="ref"><a href="#fn-anthropic-news" aria-label="Source 2">2</a></sup> Anthropic plans to provide a detection API, but it has not published the algorithm, keying scheme, threshold, or production evaluation data.</p>
<p>The timing matters. Article 50 of the EU AI Act requires providers of systems that generate synthetic text to make their output machine-readable and detectable where technically feasible, starting August 2, 2026.<sup class="ref"><a href="#fn-article50" aria-label="Source 3">3</a></sup> Anthropic signed the corresponding Code of Practice on transparency.</p>
<p>Theo Browne framed the same constraint in his video about Claude's announcement: images and video carry massive numerical redundancy, while text operates under discrete constraints.<sup class="ref"><a href="#fn-theo" aria-label="Source 4">4</a></sup> Dr. Mike Pound's Computerphile explanation led me to the green-list method introduced by Kirchenbauer and colleagues. A secret key partitions the vocabulary into favored and unfavored groups at each generation step.<sup class="ref"><a href="#fn-computerphile" aria-label="Source 5">5</a></sup><sup class="ref"><a href="#fn-kgw" aria-label="Source 10">10</a></sup></p>
<p>The difference in hiding space is structural. An image can distribute a small change across a field of pixels. A video can distribute it across pixels and time. Text has one narrow place to put the mark: the sequence of choices made as it is generated.</p>
<p>That is easier to see when the three media are placed side by side:</p>

<figure class="opening-viz" id="media-slack"><div class="modality-row"><div><div class="mod-name">Video</div><div class="mod-dim">spatial + temporal</div><div class="video-strip"><div class="video-frame"><div class="frame-pixels"><i></i><i></i><i></i><i class="marked"></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i class="marked"></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></div></div><div class="video-frame"><div class="frame-pixels"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i class="marked"></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i class="marked"></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></div></div><div class="video-frame"><div class="frame-pixels"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i class="marked"></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i class="marked"></i><i></i><i></i><i></i></div></div><div class="video-frame"><div class="frame-pixels"><i></i><i></i><i></i><i></i><i></i><i class="marked"></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></div></div><div class="video-frame"><div class="frame-pixels"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i class="marked"></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></div></div><div class="video-frame"><div class="frame-pixels"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i class="marked"></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></div></div></div><div class="temporal-axis"><i class="arrow">&#9666;</i><span class="axis-line"></span><span>time</span><span class="axis-line"></span><i class="arrow">&#9656;</i></div></div><div><div class="mod-name">Image</div><div class="mod-dim">spatial</div><div class="image-grid"><div class="image-pixels"><i></i><i></i><i></i><i></i><i></i><i></i><i class="marked"></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i class="marked"></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i class="marked"></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></div></div></div><div><div class="mod-name">Text</div><div class="mod-dim">sequential</div><div class="token-stream" id="tokenStream"><div class="token-block green-token">The</div><div class="token-block">small</div><div class="token-block green-token">boat</div><div class="token-block">reached</div><div class="token-block green-token">the</div><div class="token-block green-token">quiet</div><div class="token-block">shore</div></div></div></div><div class="dim-annotations"><div class="dim-note"><b>Frames &times; pixels.</b> Each frame is a 2D grid. Time adds a third axis. Marks scatter across all three.</div><div class="dim-note"><b>Pixels.</b> One 2D grid. A few shifted values vanish among millions.</div><div class="dim-note"><b>Tokens.</b> One axis: the sequence. Each choice is visible. The mark is which token the model picked.</div></div><div class="media-answer"><b>A text watermark can't scatter marks across a pixel grid. It can only lean on which word the model chose when several words would have worked.</b></div></figure>
<p>The mark appears at generation time. A language model writes one token at a time, and at many positions several continuations are reasonable. A secret rule can give some candidates a small advantage without forcing the model to choose them every time.</p>
<p>The copied text carries no label. The signal is in the pattern of choices the model made, accumulated across many positions.</p>
<p>A detector that knows the rule can walk through the copied text, rebuild the favored group at each position, and count how often the model selected it. One position says almost nothing. Evidence accumulates over many positions, although the required length depends on the watermark profile, the tokenizer, and how many plausible choices the text offered the model.</p>
<p>At a high level, the mechanism has three steps:</p>
<div class="step-cards"><div class="step-card"><span class="step-num">1</span><b>Generate</b><p>Bias pseudorandom sampling toward keyed subsets of valid tokens.</p></div><div class="step-card"><span class="step-num">2</span><b>Check</b><p>Reconstruct those subsets from context and count observed choices.</p></div><div class="step-card"><span class="step-num">3</span><b>Judge</b><p>Test whether the green count exceeds ordinary baseline chance.</p></div></div>
<p>I worked outward from the smallest test I could inspect. Weighted coins made the statistics visible. A 20-word vocabulary made the keyed partition possible to trace by hand. From there, I moved the same idea into a local language model, reproduced it with Gemma under paired controls, tested the checker on natural-web text, and measured what editing removed.</p>


## Start with the statistical engine

### Start with two weighted coins


<p>Begin with two coins. One lands heads 25% of the time; the other lands heads 40% of the time. Flip each coin 40 times and count the heads. If I hand you one unlabeled sequence, can you tell which coin produced it?</p>
<p>The 25% coin averages 10 heads in 40 flips. The 40% coin averages 16. Forty flips are not many, though, and the ranges overlap. The 25% coin can get lucky; the 40% coin can have a cold run. That overlap is the first lesson: the expected count is useful only when we compare it with the amount of ordinary variation.</p>

<figure class="opening-viz" id="coin-lab"><div class="coin-compare"><section class="coin-panel baseline"><header><div><b>Baseline coin</b><span>No added preference</span></div><strong>p = 25%</strong></header><div class="coin-intro"><div class="coin-face">H</div><div class="ratio ratio-4"><i></i><i></i><i></i><i></i><small>About 1 head in 4</small></div></div><div class="flip-grid" id="baselineFlips" aria-label="Forty baseline coin flips"></div><output class="coin-count" id="baselineCount"></output></section><section class="coin-panel nudged"><header><div><b>Nudged coin</b><span>A persistent preference for heads</span></div><strong>p = 40%</strong></header><div class="coin-intro"><div class="coin-face">H</div><div class="ratio ratio-5"><i></i><i></i><i></i><i></i><i></i><small>About 2 heads in 5</small></div></div><div class="flip-grid" id="nudgedFlips" aria-label="Forty nudged coin flips"></div><output class="coin-count" id="nudgedCount"></output></section></div><div class="figure-actions"><button class="primary" id="flipAgain">Flip both again</button><p id="flipLesson">Watch the counts, not one particular flip.</p></div></figure>
<p>Every run produces a different sequence, but the long-run averages stay near one head in four and two heads in five. A single unlabeled batch remains difficult to identify because chance can reverse the expected order. Detection works by accumulating a small preference across many observations, not by finding a telltale individual choice.</p>


### From head count to z score


<p>Take a single observed batch: 32 heads in 80 flips.</p>
<p>The baseline coin produces an expected average of 20 heads in 80 flips (80 &times; 0.25 = 20). The batch contains 12 more heads than that expectation. A raw difference of 12 lacks meaning without a scale: 12 extra heads in 20 flips is extraordinary, while 12 extra in 20,000 is negligible.</p>
<p>Under the baseline model, 80-flip batches fluctuate by a standard deviation (&sigma;) of about 3.87 heads around their average. Here <var>T</var> is the number of flips and <var>p</var> is the baseline probability of heads:</p>
<div class="formula-block"><span class="formula">&sigma; = &radic;<span class="sqrt-content"><var>T</var> &times; <var>p</var> &times; (1 &minus; <var>p</var>)</span> = &radic;<span class="sqrt-content">80 &times; 0.25 &times; 0.75</span> &approx; 3.87 heads</span></div>
<p>Dividing the observed excess by the expected baseline movement gives the z-score:</p>
<div class="formula-block highlight"><span class="formula">z = <span class="frac"><span class="frac-num">12 extra heads</span><span class="frac-den">3.87 heads of ordinary standard deviation</span></span> = <b>3.10</b></span></div>
<p>The z-score measures how many baseline standard deviations separate the observed count from its expected value. It gives us a common scale for the excess. It does not, by itself, say that a watermark exists. That conclusion requires a background distribution, a decision rule, and controls.</p>
<p>Turning a score into an alarm requires a decision threshold chosen before the result is inspected. I set the experiment's cutoff at z &gt; 3 before collecting data, so 3.10 crosses it. Under the exact binomial model, 32 or more heads in 80 flips occur about 0.224% of the time. The familiar one-sided normal tail beyond z = 3 is about 0.135%, but this discrete 80-flip example does not match that approximation exactly. Either rate is small enough to look persuasive in one trial and common enough to produce false alarms at scale.</p>


### More flips, clearer signal


<p>The coin experiment gives us the intuition, but it also marks the boundary of the analogy. Coin flips are independent. Real text tokens are conditional on their predecessors, so the same variance calculation no longer has a guaranteed fit. Context, repeated tokens, and tokenizer behavior can inflate or suppress the green count.</p>
<p>The nudged source accumulates an expected excess of 0.15 &times; <var>T</var> heads. Baseline random fluctuations grow as &radic;<span class="sqrt-content"><var>T</var> &times; 0.25 &times; 0.75</span>. The watermark signal grows linearly with length (<i>O</i>(<var>T</var>)), while random noise grows only with the square root of length (<i>O</i>(&radic;<var>T</var>)).</p>
<p>At 40 flips, the expected excess is 6 heads and baseline noise is 2.74 (<var>z</var> = 2.19). At 400 flips, the expected excess reaches 60 heads while baseline noise reaches only 8.66 (<var>z</var> = 6.93). The length control holds both probabilities fixed while increasing <var>T</var>, making the signal separate from baseline variation.</p>

<figure class="opening-viz" id="coin-length"><div class="length-layout"><div class="length-controls"><b>Number of flips</b><div class="controls" id="lengthButtons"></div><div class="watch-box"><b>Watch excess outrun scatter as T grows.</b></div></div><div><div class="metric-grid"><div><span>Baseline average</span><strong id="lenBase">10</strong><small>heads</small></div><div><span>Nudged average</span><strong id="lenNudge">16</strong><small>heads</small></div><div><span>Persistent excess</span><strong id="lenExcess">6</strong><small>heads</small></div><div><span>Expected z</span><strong id="lenExpectedZ">2.19</strong><small>movement units</small></div></div><div class="growth-row"><b>Baseline movement</b><div><i id="noiseBar"></i></div><output id="noiseValue">2.74</output></div><div class="growth-row"><b>Persistent excess</b><div><i class="signal" id="signalBar"></i></div><output id="signalValue">6.00</output></div><p class="figure-lesson" id="lengthLesson"></p></div></div></figure>
<p>A single z-score says nothing about error rates. Simulating 2,000 batches from each coin produces two distributions. They overlap heavily at short lengths and separate as the sample grows. The cutoff control shows how each threshold trades false alarms against missed detections.</p>

<figure class="opening-viz" id="coin-distribution"><div class="dist-stacked"><svg id="distributionPlot" class="opening-plot" viewBox="0 0 820 430" role="img" aria-labelledby="distTitle distDesc"><title id="distTitle">Baseline and nudged score distributions</title><desc id="distDesc">Two score histograms and a movable cutoff.</desc></svg><div class="dist-controls-bar"><div class="dist-group"><label>Length</label><div class="controls" id="distLengths"></div></div><div class="dist-group"><label>Cutoff</label><div class="controls" id="cutoffButtons"></div></div><div class="dist-rates"><div class="rate-box baseline"><span>Baseline over line</span><strong id="distFalse">0%</strong></div><div class="rate-box nudged"><span>Nudged over line</span><strong id="distCaught">0%</strong></div></div></div><p class="overlap-note" id="distLesson"><b>The hills overlap.</b> Move the cutoff and watch both rates change.</p></div></figure>


## The same idea in code

### Coins are tokens


<p>A language model choosing its next token has the same basic counting structure, with one important qualification. Each eligible position is one flip. A token landing in the favored set counts as heads. The implementation reuses the z formula and the configured 25% null rate. Their interpretation does not transfer unchanged because token choices are dependent, which is why the later experiment measures an empirical background distribution.</p>
<p>Independence does not carry over. Coin flips do not depend on one another. Token choices depend on context, can repeat within a sentence, and pass through a tokenizer that may split a visible word into several tokens. Those dependencies can inflate or suppress the green count in ways a coin never would. This is why the later experiments need empirical background text rather than a coin formula alone.</p>

<figure class="opening-viz" id="coin-to-token"><div class="object-map"><div class="object-card"><span>Coin version</span><b>One weighted flip</b><div class="coin-face">H</div><p>Heads is a hit. Tails is not.</p></div><div class="map-mark">becomes</div><div class="object-card"><span>Text version</span><b>One next-token choice</b><p class="prompt">The small boat was...</p><div class="token-row"><i class="favored">quiet</i><i>old</i><i class="favored">blue</i><i>ready</i></div><p>The key marks <code>quiet</code> and <code>blue</code> favored for this context.</p></div></div><div class="mapping-grid"><b>Coin</b><b>Text</b><span>One flip</span><span>One eligible token position</span><span>Heads</span><span>Chosen token is in the favored set</span><span>Count and score heads</span><span>Count and score favored tokens</span></div></figure>


### The first experiment, in code


The repository is small. `src/watermark_lab/stats.py` owns the statistics. `labs/01_biased_coin.py` reads the frozen configuration, simulates both sources, scores every batch, and writes raw rows.

The scorer is six lines:

```python
def green_hit_z_score(*, hits: int, trials: int, null_probability: float) -> float:
    expected = trials * null_probability
    variance = trials * null_probability * (1.0 - null_probability)
    return (hits - expected) / math.sqrt(variance)
```

The simulator uses a local seeded generator. It never touches module-global random state:

```python
def simulate_hit_counts(
    *, trials: int, hit_probability: float, replicates: int, seed: int
) -> tuple[int, ...]:
    generator = random.Random(seed)
    return tuple(
        sum(generator.random() < hit_probability for _ in range(trials)) for _ in range(replicates)
    )
```

The lab runs every configured length under both conditions:

```python
for length in config.lengths:
    for condition in ("null", "biased"):
        probability = _probability(config, condition)
        seed = derive_group_seed(
            base_seed=config.base_seed,
            condition=condition,
            trials=length,
        )
        hit_counts = simulate_hit_counts(
            trials=length,
            hit_probability=probability,
            replicates=config.replicates,
            seed=seed,
        )
        for hits in hit_counts:
            z_score = green_hit_z_score(
                hits=hits,
                trials=length,
                null_probability=config.null_hit_probability,
            )
```

<p>That loop produced 10,000 baseline batches and 10,000 nudged batches at each of five lengths.</p>
<div class="table-wrap" role="region" aria-label="Data table" tabindex="0"><table>
<thead>
<tr>
<th style="text-align:right">Flips</th>
<th style="text-align:right">Nudged batches above cutoff</th>
<th style="text-align:right">Baseline batches above cutoff</th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="Flips" style="text-align:right">40</td>
<td data-label="Nudged batches above cutoff" style="text-align:right">21.33%</td>
<td data-label="Baseline batches above cutoff" style="text-align:right">0.16%</td>
</tr>
<tr>
<td data-label="Flips" style="text-align:right">80</td>
<td data-label="Nudged batches above cutoff" style="text-align:right">54.20%</td>
<td data-label="Baseline batches above cutoff" style="text-align:right">0.13%</td>
</tr>
<tr>
<td data-label="Flips" style="text-align:right">160</td>
<td data-label="Nudged batches above cutoff" style="text-align:right">88.62%</td>
<td data-label="Baseline batches above cutoff" style="text-align:right">0.21%</td>
</tr>
<tr>
<td data-label="Flips" style="text-align:right">200</td>
<td data-label="Nudged batches above cutoff" style="text-align:right">95.23%</td>
<td data-label="Baseline batches above cutoff" style="text-align:right">0.17%</td>
</tr>
<tr>
<td data-label="Flips" style="text-align:right">400</td>
<td data-label="Nudged batches above cutoff" style="text-align:right">100.00%</td>
<td data-label="Baseline batches above cutoff" style="text-align:right">0.20%</td>
</tr>
</tbody>
</table></div>
<p>The null rates wobble rather than falling smoothly. They are finite Monte Carlo estimates. The 100% at 400 means all 10,000 nudged batches crossed under this coin setup, not a promise about real model output. The chart shows both lines diverging:</p>

<figure class="inline-viz" id="coin-results"><div class="result-stacked"><svg id="stage1ResultPlot" class="opening-plot" viewBox="0 0 820 380" role="img" aria-labelledby="resultTitle resultDesc"><title id="resultTitle">Recorded Stage 1 detection rates by length</title><desc id="resultDesc">Nudged and baseline rates at five lengths.</desc></svg><div class="legend-bar"><span><i class="legend nudge"></i> Nudged batches above cutoff</span><span><i class="legend base"></i> Baseline batches above cutoff</span><span class="legend-note">10,000 batches per point, cutoff z &gt; 3</span></div></div></figure>
<p>The simulation shows why a fixed preference becomes easier to detect as the number of observations grows. It also makes the trade-off visible: move the cutoff and false alarms fall or missed detections rise. The coin experiment still leaves one problem unsolved. It tells us how to score heads, but not which text choices should count as heads. That requires a key tied to context.</p>


### The key mechanism


<p>The coin had no way to decide which token choices should count as heads. The text version needs a rule that looks at a position and a candidate token, then answers the same question every time: does this candidate belong to the favored group for this context?</p> I built one with 20 visible words and one sentence small enough to trace by hand:</p>
<blockquote>
<p>Early one morning Jack went up the hill.</p>
</blockquote>
<p>The four tabs trace selection, score adjustment, generation, and checking on this sentence.</p>

<figure class="opening-viz mechanism-viz" id="toy-key"><div class="mechanism-tabs" role="tablist" aria-label="Toy watermark operation"><button id="toySelect" class="active" aria-pressed="true">1. Select five words</button><button id="toySample" aria-pressed="false">2. Change the chances</button><button id="toyGenerate" aria-pressed="false">3. Move the context</button><button id="toyCheck" aria-pressed="false">4. Check the sentence</button></div><section class="toy-scene"><div class="toy-sentence" id="toySentence" aria-label="Current sentence and generation slots"></div><div class="context-rack"><span>Four words used for this choice</span><div class="toy-context" id="toyContext"></div></div><div class="toy-work"><div><header class="scene-head"><div><span class="figure-kicker" id="toySceneLabel">Selection</span><b id="toySceneTitle">The key ranks all 20 candidates.</b></div><div class="key-switch" id="toyKeyControls"><button id="toyLessonKey" class="active" aria-pressed="true">Lesson key</button><button id="toyComparisonKey" aria-pressed="false">Comparison key</button></div></header><div class="vocab sentence-vocab" id="toyVocab"></div></div><aside class="toy-inspector" id="toyInspector"></aside></div><div class="probability-stage" id="toyProbability"><div class="draw-scale"><i id="toyDrawMarker"></i><span>fixed draw <b id="toyDrawValue">0.30</b></span></div><div class="probability-rows" id="toyProbabilityRows"></div></div><div class="checker-stage" id="toyChecker"><div class="checked-words" id="toyCheckedWords"></div><div class="checker-metrics"><div><span>Green hits</span><strong id="toyHits">0</strong></div><div><span>Checked positions</span><strong id="toyTrials">0</strong></div><div><span>Expected hits</span><strong id="toyExpected">0</strong></div><div><span>z score</span><strong id="toyZ">--</strong></div></div></div><div class="toy-footer"><div class="controls"><button id="toyPrev">Previous</button><button class="primary" id="toyNext">Add the score increase</button><button id="toyReplay">Start over</button></div><p class="feedback" id="toyFeedback" aria-live="polite"></p></div></section></figure>

<p><b>Selection.</b> The program hashes the teaching key, the four context token IDs (<code>Early one morning Jack</code>), and each candidate ID. Sorting the 20 hashes gives a stable ranking. The first five become green: <code>Early</code>, <code>went</code>, <code>walked</code>, <code>snow</code>, and <code>trail</code>. Some are poor continuations because the selector reads token IDs, not grammar. The comparison key changes eight memberships while preserving the five-of-20 fraction.</p>
<p><b>Score increase.</b> The program adds <code>2</code> to the five green logits before normalization. The relative odds of each green word therefore multiply by <code>exp(2)</code>, about <code>7.39</code>. In this step, <code>went</code> rises from 22.85% to 46.51%, while the unmodified <code>ran</code> falls from 27.91% to 7.69% because all candidates share the new probability total.</p>
<p><b>Generation.</b> The saved draw of <code>0.30</code> selects <code>walked</code> from the original distribution and <code>went</code> after the increase. The program appends <code>went</code>, drops <code>Early</code> from the four-token window, and rebuilds the favored set from <code>one morning Jack went</code>. The first two generated words land in green; the last two win despite falling outside the favored set. The watermark changes the odds without dictating every token.</p>
<p><b>Checking.</b> The checker replays the selection rule through the copied sentence. It rebuilds the favored group before each of the four generated words without access to generation scores or random draws. The result is <code>G=2</code> hits across <code>T=4</code> positions, z = <code>1.155</code>. The comparison key produces zero hits.</p>
<p>The key printed here is for teaching. Anyone can read it and study how the pattern works or how edits disrupt it. A production service would keep the generation key out of prompts, browser code, and public logs. A production service would keep the generation key out of prompts, browser code, and public logs.</p>


## What happens in a real model

### One real model step


<p>The coin experiment is clean because we control every probability. The next question is whether the same score increase produces a detectable excess inside a real language model, where scores span five orders of magnitude and the sampler applies temperature, top-k, and top-p before the watermark takes effect?</p>
<p>I loaded <code>mlx-community/LFM2-350M-4bit</code> at revision <code>18dc72abf3b2337f9123cfd6eeeb58dfa7947066</code> on an Apple GPU with MLX-LM 0.31.3 and MLX 0.32.0. I then ran one autoregressive loop from the prompt "Early one morning Jack went up the hill. At the top he". The control and marked paths shared the same model state and seed. The figure compares the raw distribution with the distribution after adding <code>2</code> to green logits at the first generated position.</p>

<figure class="opening-viz real-viz" id="real-token"><div class="real-prompt"><span>Model input ends here</span><p>Early one morning Jack went up the hill. At the top he <i></i></p></div><div class="real-layout"><div><div class="controls"><button id="realOff" class="active" aria-pressed="true">Raw model scores</button><button id="realOn" aria-pressed="false">Add 2 to green scores</button></div><div class="candidate-bars" id="realCandidates"></div></div><aside class="jack-focus"><span class="figure-kicker">Follow one candidate</span><div class="jack-token">Jack <small>token 30604</small></div><div class="score-change"><div><span>Raw score</span><b>14.6875</b></div><i>+2</i><div><span>Marked score</span><b id="jackScore">14.6875</b></div></div><div class="jack-chance"><span>Chance of Jack</span><strong id="jackChance">11.642%</strong></div><div class="fixed-draw"><span>Saved random draw</span><b>same in both paths</b><p id="jackDrawResult">It selects Jack.</p></div></aside></div><div class="real-outcomes"><div><span>Control continuation</span><p id="realControlText"></p><b id="realControlScore"></b></div><div class="marked"><span>Marked continuation</span><p id="realMarkedText"></p><b id="realMarkedScore"></b></div><div><span>Marked text, comparison key</span><p>The copied text stays fixed. Only the checker key changes.</p><b id="realComparisonScore"></b></div></div><p class="feedback" id="realFeedback" aria-live="polite"></p></figure>

<p>The table makes the first-step effect concrete. The score increase does not replace the model's distribution; it reshapes it. <code>He</code> begins with the highest raw score but falls behind four green candidates after the processor runs.</p>
<div class="table-wrap" role="region" aria-label="Data table" tabindex="0"><table>
<thead>
<tr>
<th>Candidate</th>
<th style="text-align:right">Raw score</th>
<th>Green</th>
<th style="text-align:right">Score after increase</th>
<th style="text-align:right">Final marked chance</th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="Candidate"><code>As</code></td>
<td data-label="Raw score" style="text-align:right">15.1875</td>
<td data-label="Green">yes</td>
<td data-label="Score after increase" style="text-align:right">17.1875</td>
<td data-label="Final marked chance" style="text-align:right">34.715%</td>
</tr>
<tr>
<td data-label="Candidate"><code>he</code></td>
<td data-label="Raw score" style="text-align:right">14.8125</td>
<td data-label="Green">yes</td>
<td data-label="Score after increase" style="text-align:right">16.8125</td>
<td data-label="Final marked chance" style="text-align:right">21.724%</td>
</tr>
<tr>
<td data-label="Candidate"><code>Jack</code></td>
<td data-label="Raw score" style="text-align:right">14.6875</td>
<td data-label="Green">yes</td>
<td data-label="Score after increase" style="text-align:right">16.6875</td>
<td data-label="Final marked chance" style="text-align:right">18.582%</td>
</tr>
<tr>
<td data-label="Candidate"><code>The</code></td>
<td data-label="Raw score" style="text-align:right">13.5000</td>
<td data-label="Green">yes</td>
<td data-label="Score after increase" style="text-align:right">15.5000</td>
<td data-label="Final marked chance" style="text-align:right">4.211%</td>
</tr>
<tr>
<td data-label="Candidate"><code>He</code></td>
<td data-label="Raw score" style="text-align:right">15.3125</td>
<td data-label="Green">no</td>
<td data-label="Score after increase" style="text-align:right">15.3125</td>
<td data-label="Final marked chance" style="text-align:right">3.332%</td>
</tr>
</tbody>
</table></div>
<p><code>Jack</code> rose from 11.642% to 18.582%. The saved draw chose <code>Jack</code> in both paths, a non-event that matters: two distributions can return the same token. A later draw split the continuations, after which each path conditioned on its own history.</p>
<p>The marked path began, "Jack climbed slowly, his boots sinking slightly into the soft snow-covered earth." I scored the copied continuation across 39 eligible positions. The generation key produced <code>21/39</code>, z <code>4.160</code>. The comparison key on the same text produced <code>7/39</code>, z <code>-1.017</code>. The paired control with the generation key produced <code>8/39</code>, z <code>-0.647</code>.</p>
<p>All three fixed marked passages scored higher than their paired controls. That is useful as a smoke test because it shows that generation and detection are connected. It is not an accuracy study. Three passages cannot estimate detection performance or text quality.</p>


### Operation order


<p>Recording <code>delta=2</code> doesn't fully specify a watermark. My first loop applied the increase before temperature and filtering. Transformers 5.14.1 applies them differently:</p>
<div class="pipeline-row"><span class="pipe-chip">Temperature</span><span class="pipe-arrow">&rarr;</span><span class="pipe-chip">Top-K</span><span class="pipe-arrow">&rarr;</span><span class="pipe-chip">Top-P</span><span class="pipe-arrow">&rarr;</span><span class="pipe-chip highlight">Watermark Processor</span><span class="pipe-arrow">&rarr;</span><span class="pipe-chip">Softmax</span><span class="pipe-arrow">&rarr;</span><span class="pipe-chip">Sample</span></div>
<p>My earlier teaching loop used:</p>
<div class="pipeline-row"><span class="pipe-chip highlight">Watermark Bias</span><span class="pipe-arrow">&rarr;</span><span class="pipe-chip">Temperature</span><span class="pipe-arrow">&rarr;</span><span class="pipe-chip">Top-P</span><span class="pipe-arrow">&rarr;</span><span class="pipe-chip">Top-K</span><span class="pipe-arrow">&rarr;</span><span class="pipe-chip">Softmax</span><span class="pipe-arrow">&rarr;</span><span class="pipe-chip">Sample</span></div>
<p>I replayed both sequences on the same 50,257 saved GPT-2 scores. The operation control exposes the candidate count and selected-token probability after each step.</p>

<figure class="opening-viz order-viz" id="operation-order"><div class="order-controls"><div class="controls"><button id="orderReference" class="active" aria-pressed="true">Transformers route</button><button id="orderEarlier" aria-pressed="false">Earlier teaching route</button></div><div class="controls"><button id="orderBack">Previous operation</button><button class="primary" id="orderNext">Run next operation</button><button id="orderAll">Show final state</button></div></div><div class="order-rails" id="orderRails"></div><div class="order-result" id="orderReadout"></div><section class="pair-fixture"><header><span class="figure-kicker">A separate compatibility check</span><b>Does a repeated pair count once or every time it appears?</b></header><div class="pair-sequence" id="pairSequence"></div><div class="controls"><button id="pairEvery" class="active" aria-pressed="true">Count every occurrence</button><button id="pairDistinct" aria-pressed="false">Count each pair value once</button></div><div class="pair-counting" id="pairCounting"></div><p class="feedback" id="pairFeedback"></p></section></figure>

<p>The Transformers route kept 40 after top-k and 19 after top-p. My earlier route kept 11 after top-p. For token <code> was</code>, final probabilities: 8.643% vs 8.826%. Only 0.18 percentage points apart, but the structural difference matters. Temperature changes the effective increase. Filtering can remove a candidate before the watermark reaches it. The operation sequence is part of the watermark profile.</p>
<p>A six-token compatibility fixture exposed another mismatch. It alternated token IDs 373 and 21272, producing five pair occurrences but only two distinct pair values. Both <code>ignore_repeated_ngrams</code> settings in Transformers returned <code>3/5</code>, z <code>1.807</code>. My explicit distinct-value count returned <code>1/2</code>, z <code>0.816</code>. Maintained behavior must be inspected directly rather than inferred from an option name.</p>


### Gemma end-to-end


<p>The watermark core should not depend on how a specific model formats chat. The model adapter and the watermark logic should be separable so that each can be inspected on its own. I kept the shared interface small: pass a watermark profile into generation, extract copied assistant text, build the matching checker. A Gemma-specific adapter owned prompt rendering, tokenization, and generated-ID slicing.</p>
<p>I pinned <code>google/gemma-4-E2B-it</code> at revision <code>3e22461f65e89153144f8adb70e3b8c2cc9845a7</code> in BF16 on one Modal NVIDIA L4 with Transformers 5.14.1. Both the control and watermarked calls share every argument except one:</p>

<div class="code-diff">
<div class="diff-col">
<span class="diff-label control">CONTROL</span>

```python
model.generate(
    input_ids=encoded.input_ids,
    attention_mask=encoded.attention_mask,
    do_sample=True,
    temperature=0.8,
    top_k=40,
    top_p=0.95,
)
```

</div>
<div class="diff-col">
<span class="diff-label watermarked">WATERMARKED</span>

```python
model.generate(
    input_ids=encoded.input_ids,
    attention_mask=encoded.attention_mask,
    do_sample=True,
    temperature=0.8,
    top_k=40,
    top_p=0.95,
    watermarking_config=profile.to_transformers(),
)
```

</div>
</div>

<p>The component trace shows which data cross each boundary and where the private key enters.</p>

<figure class="opening-viz gemma-viz" id="gemma-path"><div class="gemma-flow"><div class="path" id="pathNodes"></div><div class="packet-line"><i id="pathPacket"></i></div><div class="controls"><button id="pathPrev">Previous boundary</button><button class="primary" id="pathNext">Advance request</button><button id="pathReset">Start over</button></div><p class="feedback" id="pathFeedback"></p></div></figure>

<p>The model loaded in 5.8 seconds. The three marked smoke outputs generated at 18.422, 18.747, and 19.259 tokens per second. Each appears beside its paired control below.</p>

<figure class="opening-viz smoke-viz" id="smoke-compare"><div class="smoke-selector"><button class="active" id="smoke0" aria-pressed="true">continuity</button><button id="smoke1" aria-pressed="false">notebook</button><button id="smoke2" aria-pressed="false">library</button></div><div class="smoke-pair"><div class="smoke-col"><span class="diff-label control">CONTROL</span><p class="smoke-text" id="smokeControlText"></p><div class="smoke-scores"><div><span>G / T</span><strong id="smokeControlGT"></strong></div><div><span>z</span><strong id="smokeControlZ"></strong></div></div></div><div class="smoke-col"><span class="diff-label watermarked">WATERMARKED</span><p class="smoke-text" id="smokeWatermarkedText"></p><div class="smoke-scores"><div><span>G / T</span><strong id="smokeWatermarkedGT"></strong></div><div><span>z</span><strong id="smokeWatermarkedZ"></strong></div></div></div></div><div class="smoke-bars"><div><span>Control z</span><div class="z-track"><i id="smokeControlBar"></i></div></div><div><span>Watermarked z</span><div class="z-track wm"><i id="smokeWatermarkedBar"></i></div></div><div class="z-cutoff-label">z = 3</div></div><p class="feedback" id="smokeFeedback">All three stayed below z &gt; 3. Too few eligible positions for the signal to outrun baseline noise.</p></figure>

<p>A later natural-length ladder produced 12 marked and 12 paired control outputs. Eight marked rows crossed <code>z &gt; 3</code>; no control did:</p>

<figure class="opening-viz ladder-viz" id="length-ladder"><svg id="ladderPlot" class="opening-plot" viewBox="0 0 900 460" role="img" aria-labelledby="ladderTitle"><title id="ladderTitle">Length ladder: 12 paired control and watermarked z scores</title></svg><div class="controls"><button id="ladderPrev">Previous pair</button><button class="primary" id="ladderPause">Pause autoplay</button><button id="ladderNext">Next pair</button></div><p class="feedback" id="ladderFeedback"></p></figure>

<p>Prompt content and length changed together, so the ladder doesn't isolate length as the cause. The committed evidence uses a public key so anyone can verify it. A private service would keep key material inside the host process and expose a version identifier, not the key itself.</p>


## Test the detector before trusting it

### Score outside text before trusting the cutoff


<p>A detector score is only useful if we know how often ordinary text produces the same score. I therefore tested the checker on text that did not receive this experiment's watermark. Before treating a crossing as evidence, I ran the same checker on text that did not receive this experiment's watermark.</p>
<p>I scanned the pinned C4 <code>realnewslike</code> validation shard in file order. A passage needed at least 500 Gemma tokens, at least 65% Unicode letters among non-whitespace characters, and no duplicate text, code dump, or obvious list structure. The selector scanned 2,479 rows, rejected 1,451 as too short and four as obvious lists, froze the first 1,000 passing rows for calibration, and reserved the next 24 for paired generation. Detector scores played no role in that split.</p>
<p>C4 is natural-web text scraped from Common Crawl. The corpus contains no verification that any passage was written by a human.</p>
<p>With the public Gemma key and all-pair counting, the 1,000 scores had a median of <code>0.029</code>, a 99th percentile of <code>2.457</code>, and a maximum of <code>3.729</code>. Four rows crossed strict <code>z &gt; 3</code>. A thousand rows can't validate one-in-100,000 behavior, but four crossings in a declared negative set are enough to distrust the cutoff in isolation.</p>
<p>The maximum row exposed the counting rule. Counting every adjacent-pair occurrence gave <code>132/399</code>, z <code>3.729</code>. Counting each pair value once on the same token sequence gave <code>114/358</code>, z <code>2.990</code>. The second rule removed 41 observations, including 18 green hits, and moved the row below the cutoff.</p>
<p>Fernandez and colleagues showed that standard asymptotic tests underestimate false positives on short or repetitive text.<sup class="ref"><a href="#fn-three-bricks" aria-label="Source 12">12</a></sup> The z formula stays useful because every term is visible, but it must travel with the empirical background and the repetition policy that produced it.</p>

<p>The sorted calibration view compares the first 100 rows with the full 1,000. The larger set reveals the background distribution and all four crossings.</p>

<figure class="opening-viz calibration-viz" id="calibration"><div class="cal-summary"><div><span>Median</span><b>0.0289</b></div><div><span>99th percentile</span><b>2.4568</b></div><div><span>Strict crossings</span><b>4 / 1,000</b></div><div><span>Maximum</span><b>3.7286</b></div></div><div class="controls"><button id="show100">First 100 rows</button><button id="show1000" class="active" aria-pressed="true">All 1,000 rows</button></div><div class="calibration-chart"><svg class="plot tall" id="calibrationPlot" role="img" aria-labelledby="calTitle calDesc"><title id="calTitle">Sorted natural-web z scores</title><desc id="calDesc">Every frozen all-pair score sorted from low to high with the strict z greater than three line.</desc></svg><aside><b>How to read it</b><p>Each mark is one frozen passage. Sorting makes the background shape visible without hiding the four crossings.</p><p>The cutoff came from the experiment profile. The four red marks are observed crossings in the declared negative cohort.</p></aside></div><section class="max-row"><header><span class="figure-kicker">Keep the text fixed</span><b>The counting rule moves the maximum row across the cutoff.</b></header><div class="controls"><button id="allPairs" class="active" aria-pressed="true">Count every pair</button><button id="distinctPairs" aria-pressed="false">Count each pair value once</button></div><div class="max-transform"><div><span>Observed green hits</span><strong id="calG">132</strong></div><div><span>Eligible pair observations</span><strong id="calT">399</strong></div><div><span>z score</span><strong id="calZ">3.7286</strong></div><div class="cal-decision"><span>Strict z &gt; 3</span><strong id="calDecision">Crosses</strong></div></div><p id="calRuleNote">Every adjacent-pair occurrence counts, including repeated values.</p></section><p class="feedback" id="calibrationFeedback"></p></figure>


<p>Distinguishing the watermark from model artifacts or domain noise requires three paired controls alongside the marked score.</p>

### One high score needs three controls


<p>I froze 24 paired prompts before generation. Each pair shared its 50-token source prefix, prompt-derived seed, model revision, sampler, and 400 generated-token safety cap. Only the marked call received the watermark configuration.</p>
<p>A high score on the marked text under the generation key still leaves three explanations open: ordinary Gemma output might score high under that key, natural text from the source domain might score high, or the marked text might score similarly under a different key. Rank <code>1000</code> gives all four checks at 160 copied tokens:</p>
<div class="table-wrap" role="region" aria-label="Data table" tabindex="0"><table>
<thead>
<tr>
<th>Checked text and key</th>
<th style="text-align:right">Green hits</th>
<th style="text-align:right">Eligible checks</th>
<th style="text-align:right">z</th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="Checked text and key">marked text, generation key</td>
<td data-label="Green hits" style="text-align:right">58</td>
<td data-label="Eligible checks" style="text-align:right">159</td>
<td data-label="z" style="text-align:right">3.3424</td>
</tr>
<tr>
<td data-label="Checked text and key">paired model control, generation key</td>
<td data-label="Green hits" style="text-align:right">47</td>
<td data-label="Eligible checks" style="text-align:right">159</td>
<td data-label="z" style="text-align:right">1.3278</td>
</tr>
<tr>
<td data-label="Checked text and key">natural-web continuation, generation key</td>
<td data-label="Green hits" style="text-align:right">43</td>
<td data-label="Eligible checks" style="text-align:right">159</td>
<td data-label="z" style="text-align:right">0.5952</td>
</tr>
<tr>
<td data-label="Checked text and key">marked text, comparison key</td>
<td data-label="Green hits" style="text-align:right">29</td>
<td data-label="Eligible checks" style="text-align:right">159</td>
<td data-label="z" style="text-align:right">-1.9688</td>
</tr>
</tbody>
</table></div>
<p>Only the marked-correct-key condition crosses, while the three controls stay below the line. Rank <code>1001</code> complicates the picture: its marked and control paths shared every token ID through the first 80 copied tokens, both scoring <code>26/79</code>, z <code>1.624</code>. The watermark changed probabilities, but these seeded draws followed the same early path.</p>
<p>The four branches hold the text, key, or source condition apart so each alternative explanation can be checked separately.</p>

<figure class="opening-viz controls-viz" id="four-controls"><div class="control-source"><span>Frozen prompt rank 1000</span><b>One source prefix, paired generation seed, and model profile</b></div><div class="control-branches" id="familyCards"></div><div class="controls" id="familyButtons"></div><p class="feedback" id="familyFeedback"></p><section class="equal-row"><span class="figure-kicker">The inconvenient row</span><b>Rank 1001 followed the same early path.</b><div><div><span>Marked, generation key</span><strong>26/79</strong><b class="equal-z">z 1.6239</b></div><i>=</i><div><span>Model control, generation key</span><strong>26/79</strong><b class="equal-z">z 1.6239</b></div></div><p>The marked and control token IDs were identical through 80 copied tokens. The watermark changed probabilities, but these seeded draws did not split yet.</p></section></figure>


<p>A single row confirms the path runs without estimating accuracy. The full 24-row cohort shows whether the separation holds across documents.</p>

### Read every paired row before the average


<p>All 24 pairs completed at 80 copied tokens. I plotted each document's difference on its own line before calculating a mean.</p>
<div class="table-wrap" role="region" aria-label="Data table" tabindex="0"><table>
<thead>
<tr>
<th>Contrast</th>
<th style="text-align:right">Mean paired z difference</th>
<th style="text-align:right">95% paired bootstrap interval</th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="Contrast">paired model control</td>
<td data-label="Mean paired z difference" style="text-align:right"><code>1.8296</code></td>
<td data-label="95% paired bootstrap interval" style="text-align:right"><code>[1.3424, 2.3276]</code></td>
</tr>
<tr>
<td data-label="Contrast">natural web</td>
<td data-label="Mean paired z difference" style="text-align:right"><code>1.7538</code></td>
<td data-label="95% paired bootstrap interval" style="text-align:right"><code>[1.3100, 2.1977]</code></td>
</tr>
<tr>
<td data-label="Contrast">comparison-key replay</td>
<td data-label="Mean paired z difference" style="text-align:right"><code>2.0461</code></td>
<td data-label="95% paired bootstrap interval" style="text-align:right"><code>[1.6131, 2.4792]</code></td>
</tr>
</tbody>
</table></div>
<p>The averages separate cleanly, but the individual rows are less tidy. That distinction matters because a detector will eventually be applied to one document at a time. Some differences are small, rank <code>1001</code> is exactly zero against its model control, and at least one row points against the mean. Three marked rows crossed <code>z &gt; 3</code>; none of the three control families did at this prefix. The intervals summarize 24 frozen documents, not a population.</p>
<p>The matched cohort shrank with prefix length. Counts at 40, 80, 160, 200, and 400 copied tokens were <code>24</code>, <code>24</code>, <code>21</code>, <code>17</code>, and <code>0</code>. A 400-token generation cap meant both the marked and control outputs terminated before reaching 400 copied tokens, so no pair completed at that length. At 200 tokens, four of 17 marked rows crossed, along with one natural-web row. Because the documents changed as the prefix grew, that sequence can't support a clean causal claim about length.</p>

<p>The contrast controls preserve row order, allowing each document to be tracked across comparisons.</p>

<figure class="opening-viz cohort-viz" id="cohort"><div class="controls" id="contrastButtons"></div><div class="cohort-chart"><svg id="cohortPlot" role="img" aria-labelledby="cohortTitle cohortDesc"><title id="cohortTitle">Twenty-four labeled paired z differences</title><desc id="cohortDesc">Each frozen selection rank on its own row, with zero, mean, and paired interval.</desc></svg><aside id="cohortSummary"></aside></div><div class="prefix-completeness"><span>Matched rows by copied-token prefix</span><div id="prefixCounts"></div></div><p class="feedback" id="cohortFeedback"></p></figure>


<p>These scores come from unedited text. Editing rewrites the checker's history.</p>

## What editing does to the signal

### Edits rebuild the checker history


<p>Rank <code>1000</code> scored <code>28/79</code>, z <code>2.144</code>, at its first 80 copied token IDs. A deterministic 10% word deletion scored <code>25/79</code>, z <code>1.364</code>. A Gemma paraphrase scored <code>26/79</code>, z <code>1.624</code>.</p>
<p>An edit does not peel a label off the text. It changes the string itself, which changes the history the checker uses to reconstruct the mark.</p>
<p>That distinction is easy to miss. The watermark is not a hidden label attached to a sentence. It is a pattern in the sequence of token choices, and editing changes that sequence. Tokenization creates a different ordered history, so the checker rebuilds different keyed groups at every later position.</p>
<p>I carried the first 12 marked outputs through eight conditions:</p>
<div class="table-wrap" role="region" aria-label="Data table" tabindex="0"><table>
<thead>
<tr>
<th>Edit</th>
<th style="text-align:right">Mean z change</th>
<th style="text-align:right">Mean copied-token length ratio</th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="Edit">normalization</td>
<td data-label="Mean z change" style="text-align:right"><code>0.0000</code></td>
<td data-label="Mean copied-token length ratio" style="text-align:right"><code>0.9986</code></td>
</tr>
<tr>
<td data-label="Edit">homoglyph 1%</td>
<td data-label="Mean z change" style="text-align:right"><code>-0.0217</code></td>
<td data-label="Mean copied-token length ratio" style="text-align:right"><code>1.0448</code></td>
</tr>
<tr>
<td data-label="Edit">homoglyph 5%</td>
<td data-label="Mean z change" style="text-align:right"><code>-0.9311</code></td>
<td data-label="Mean copied-token length ratio" style="text-align:right"><code>1.2183</code></td>
</tr>
<tr>
<td data-label="Edit">deletion 10%</td>
<td data-label="Mean z change" style="text-align:right"><code>-0.3248</code></td>
<td data-label="Mean copied-token length ratio" style="text-align:right"><code>0.8980</code></td>
</tr>
<tr>
<td data-label="Edit">deletion 30%</td>
<td data-label="Mean z change" style="text-align:right"><code>-0.9960</code></td>
<td data-label="Mean copied-token length ratio" style="text-align:right"><code>0.7021</code></td>
</tr>
<tr>
<td data-label="Edit">mixing 25%</td>
<td data-label="Mean z change" style="text-align:right"><code>-0.6712</code></td>
<td data-label="Mean copied-token length ratio" style="text-align:right"><code>1.0012</code></td>
</tr>
<tr>
<td data-label="Edit">mixing 50%</td>
<td data-label="Mean z change" style="text-align:right"><code>-1.3424</code></td>
<td data-label="Mean copied-token length ratio" style="text-align:right"><code>1.0088</code></td>
</tr>
<tr>
<td data-label="Edit">paraphrase</td>
<td data-label="Mean z change" style="text-align:right"><code>-1.7105</code></td>
<td data-label="Mean copied-token length ratio" style="text-align:right"><code>0.9636</code></td>
</tr>
</tbody>
</table></div>
<p>Homoglyph substitution swapped ASCII letters for visually identical Unicode code points. For example, replacing Latin 'a' (<code>U+0061</code>) with Cyrillic 'а' (<code>U+0430</code>) looks the same to a reader, but the tokenizer splits the word into unknown byte sequences, scrambling the context hashes for every later position.</p>
<p>Deletion and mixing can damage grammar or change claims. A lower detector score alone says nothing about whether the meaning survived, so meaning preservation has to be measured separately.</p>
<p>All 12 paraphrases passed the declared length, decimal-number, and embedding-cosine screens. A non-independent assistant review marked ten pass, two uncertain. Every passed rewrite reduced z, and no paraphrase crossed the cutoff.</p>
<p>James Padolsey's Declaude explainer reports known-key rewrite tests against open KGW and EXP implementations.<sup class="ref"><a href="#fn-declaude" aria-label="Source 13">13</a></sup> Padolsey reports that full rewrites left about 0.5% of the original windows intact and reduced detection on those implementations to roughly chance. Those measurements do not cover Claude's private SynthID configuration or replace this project's results.</p>

<p>The edit view follows rank 1000 through deletion and paraphrase. It holds the key and checker profile fixed while the visible string, token history, and keyed decisions change.</p>

<figure class="opening-viz edits-viz" id="edits"><div class="edit-tabs"><button id="editSource" class="active" aria-pressed="true">Unedited</button><button id="editDelete" aria-pressed="false">Delete 10%</button><button id="editParaphrase" aria-pressed="false">Paraphrase</button></div><div class="edit-spine"><div><span class="figure-kicker" id="editLabel">Unedited rank 1000</span><p class="spine-text" id="spineText"></p></div><aside><div><span>Green hits</span><strong id="editG">28</strong></div><div><span>Eligible checks</span><strong id="editT">79</strong></div><div><span>z score</span><strong id="editZ">2.1436</strong></div><p id="editReading">The original first 80 copied tokens.</p></aside></div><section class="attack-cohort"><header><span class="figure-kicker">All 12 frozen rows</span><b id="attackHeading">Select an edit to see every paired change.</b></header><div class="controls" id="attackButtons"></div><div class="attack-chart"><svg id="attackPlot" role="img" aria-labelledby="attackTitle attackDesc"><title id="attackTitle">Twelve labeled paired z changes after editing</title><desc id="attackDesc">Each frozen selection rank on its own row for the selected edit.</desc></svg><aside id="attackSummary"></aside></div></section><p class="feedback" id="attackFeedback"></p><p class="proxy-note">A lower z score does not prove that an edit preserved meaning. Paraphrase length, number checks, embedding cosine, and assistant review were recorded separately; two reviews remained uncertain.</p></figure>


### A stronger mark costs something


<p>The default experiment added <code>delta=2</code> to green scores. I held the eight prompts, model, key, sampler, and 400-token safety cap fixed, then changed delta. The generated continuations reached different lengths, so achieved copied length remains a separate measurement rather than a controlled constant.</p>
<div class="table-wrap" role="region" aria-label="Data table" tabindex="0"><table>
<thead>
<tr>
<th style="text-align:right">Delta</th>
<th style="text-align:right">Mean z</th>
<th style="text-align:right">Strict crossings</th>
<th style="text-align:right">Mean conditional NLL</th>
<th style="text-align:right">Mean repeated-pair fraction</th>
<th style="text-align:right">Mean copied tokens</th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="Delta" style="text-align:right">1</td>
<td data-label="Mean z" style="text-align:right"><code>0.2923</code></td>
<td data-label="Strict crossings" style="text-align:right"><code>0/8</code></td>
<td data-label="Mean conditional NLL" style="text-align:right"><code>0.5004</code></td>
<td data-label="Mean repeated-pair fraction" style="text-align:right"><code>0.0373</code></td>
<td data-label="Mean copied tokens" style="text-align:right"><code>232.50</code></td>
</tr>
<tr>
<td data-label="Delta" style="text-align:right">2</td>
<td data-label="Mean z" style="text-align:right"><code>2.1761</code></td>
<td data-label="Strict crossings" style="text-align:right"><code>1/8</code></td>
<td data-label="Mean conditional NLL" style="text-align:right"><code>0.5415</code></td>
<td data-label="Mean repeated-pair fraction" style="text-align:right"><code>0.0471</code></td>
<td data-label="Mean copied tokens" style="text-align:right"><code>265.75</code></td>
</tr>
<tr>
<td data-label="Delta" style="text-align:right">3</td>
<td data-label="Mean z" style="text-align:right"><code>2.4684</code></td>
<td data-label="Strict crossings" style="text-align:right"><code>3/8</code></td>
<td data-label="Mean conditional NLL" style="text-align:right"><code>0.5783</code></td>
<td data-label="Mean repeated-pair fraction" style="text-align:right"><code>0.0483</code></td>
<td data-label="Mean copied tokens" style="text-align:right"><code>271.75</code></td>
</tr>
</tbody>
</table></div>
<p>Mean z, conditional NLL, repeated adjacent-pair fraction, and achieved copied length all rose with delta. Higher conditional NLL means the pinned Gemma checkpoint assigned less probability to the recorded continuation. It does not show that a reader would find the text less fluent or useful. Ranks <code>1004</code> and <code>1006</code> had lower z at delta 3 than at delta 2, so individual paths don't climb monotonically.</p>
<p>NLL and repetition are model-based proxies. They cannot establish factual accuracy, reader preference, or a universal setting from eight prompts.</p>

<p>Each line in the delta sweep represents one frozen prompt. The coral paths mark ranks 1004 and 1006, whose scores fell from delta 2 to delta 3.</p>

<figure class="opening-viz delta-viz" id="delta"><div class="controls" id="deltaButtons"></div><div class="delta-layout"><svg id="deltaPlot" role="img" aria-labelledby="deltaTitle deltaDesc"><title id="deltaTitle">Eight labeled z-score paths across delta one, two, and three</title><desc id="deltaDesc">Every frozen prompt path with two non-monotonic rows labeled.</desc></svg><aside id="deltaReading"></aside></div><div class="proxy-plots" id="proxyPlots"></div><p class="feedback" id="deltaFeedback"></p><p class="proxy-note">Conditional NLL and repeated pairs are model-based proxies. They do not replace a human quality or factuality study.</p></figure>


<p>The delta sweep tested KGW-style green lists only, and Claude's production watermark belongs to a different family.</p>

## Claude, other detectors, and the law

### Claude uses a SynthID-Text variant

<p>
The experiments above implement a KGW-style green-list watermark, while Anthropic says Claude's production mark uses a version of SynthID-Text. These experiments explain the statistical idea without reproducing Claude's system.
</p>
<p>
KGW uses the key and recent context to select a vocabulary subset, raises the scores of tokens in that subset, and later counts the excess selected tokens.<sup class="ref"><a href="#fn-kgw" aria-label="Source 10">10</a></sup>
</p>
<p>
SynthID-Text uses keyed tournament sampling.<sup class="ref"><a href="#fn-synthid" aria-label="Source 11">11</a></sup>
It draws candidates from the model distribution, lets keyed scoring functions select tournament winners, and measures the resulting correlation during detection.
The paper also describes repeated-context masking and settings with different distortion guarantees.
Its live quality evaluation compared about 20 million watermarked and unwatermarked Gemini responses, using voluntary thumbs feedback as a proxy for quality rather than as a test of removal attacks or detector accuracy.
</p>
<p>
Anthropic calls Claude's watermark "a version of the SynthID-Text approach."<sup class="ref"><a href="#fn-anthropic-news" aria-label="Source 2">2</a></sup>
The company says its implementation changes the randomness used to choose among suitable words and adds no hidden characters or extra tokens. It also says factual passages, light editing, and code often provide too few choices to carry much evidence. A detection API is planned.
</p>
<p>
Anthropic reported no practical quality loss in its internal tests. It has not published Claude's tournament settings, key construction, context masking, scorer, threshold, model coverage, or evaluation data needed to verify that result independently. The KGW experiments here explain a related idea, but they do not validate Claude's production system.
</p>

<p>
Other systems answer different questions.
Ghostbuster and DNA-GPT detect machine-generated text without a generation-time key.<sup class="ref"><a href="#fn-ghostbuster" aria-label="Source 7">7</a></sup><sup class="ref"><a href="#fn-dnagpt" aria-label="Source 8">8</a></sup>
EditLens estimates how much an AI system edited a document.<sup class="ref"><a href="#fn-editlens" aria-label="Source 9">9</a></sup>
The comparison below separates these tasks from keyed watermark detection.
</p>

<figure class="opening-viz field-viz" id="field-map"><figcaption><span class="figure-kicker">Keep unlike detectors separate</span><b>Four methods answer different questions.</b><span>Select a family to compare what it changes, what it measures, and what its score can support.</span></figcaption><div class="controls" id="methodButtons"></div><div class="method-frame" id="methodMap"></div><div class="method-boundary"><b>No method shown here establishes authorship, intent, ownership, or misconduct.</b><span>The green-list experiment supports one narrower statement: consistent with this configured watermark and key.</span></div></figure>

### Article 50 requires machine-readable marking

<p>
Article 50(2) helps explain why providers are developing marking systems.<sup class="ref"><a href="#fn-article50" aria-label="Source 3">3</a></sup>
It requires providers of AI systems, including general-purpose AI systems, that generate synthetic audio, images, video, or text to mark their outputs in a machine-readable format so detectors can identify them as artificially generated or manipulated.
The duty applies as far as technically feasible and accounts for content limits, implementation costs, and the state of the art.
It also exempts standard editing and uses that do not substantially alter the supplied input or its meaning.
</p>
<p>
The law sets a transparency duty.
It does not prescribe SynthID-Text, turn a detector score into proof of authorship, or tell a school or employer how to judge a person.
</p>

### Claude's mark does not identify a user

<p>
Anthropic says Claude's watermark and key contain no information about a user, organization, or chat.<sup class="ref"><a href="#fn-anthropic-news" aria-label="Source 2">2</a></sup>
Under that design, the detector asks whether the text carries evidence associated with Claude's watermark.
It cannot recover who requested the text.
</p>
<p>
That claim concerns Claude's disclosed design.
It does not establish that every possible text watermark carries only one bit or that a provider holds no separate account records.
</p>

### Detection does not settle authorship

<p>
A positive result can indicate Claude involvement, according to Anthropic, without showing that Claude wrote every word.
Authorship asks who supplied the ideas and accepted responsibility.
A policy decides which assistance was allowed, and a disciplinary process must weigh evidence beyond one score.
</p>
<p>
A negative result is weaker still.
Short answers and exact code may offer few choices to mark.
Light editing may leave too few Claude-selected tokens, while a wrong key, an older model, or later revisions can also suppress the score.
The edit experiments above show how a rewritten token history can weaken the signal even when the meaning survives.
</p>
<p>
Passive classifiers create a related risk.
Sean Goedecke reports that students he knows rewrite their own prose or record their drafts because they fear false accusations.<sup class="ref"><a href="#fn-sean" aria-label="Source 6">6</a></sup>
His examples are anecdotal, but the policy error is clear: an uncertain detector score cannot carry the burden of proof by itself.
</p>
<p>
The evidence in this article supports one narrow statement:
</p>
<blockquote>
<p>Consistent with this configured watermark and key.</p>
</blockquote>

## What the experiment actually shows

<p>The experiment supports a narrower claim than the word "watermark" often suggests. With enough matching text and the correct profile, a detector can recover evidence of the token-selection bias used in this KGW-style experiment. That evidence gets weaker when the passage is short or when an edit changes the token history.</p>
<p>At 80 copied tokens, all 24 Gemma pairs completed generation. The marked outputs scored higher on average than the paired model controls, natural-web continuations, and comparison-key replays. The 95% paired bootstrap interval for each contrast excluded zero. The rows were not perfectly tidy: rank<code>1001</code> matched its control exactly, and at least one difference pointed against the cohort mean.</p>
<p>The cutoff was less trustworthy than a single score might imply. Four of 1,000 C4 passages crossed <code>z &gt; 3</code> when the checker counted every adjacent-pair occurrence. One crossed when it counted each pair value once. The background corpus and the repetition policy are part of the detector. They cannot be treated as implementation details.</p>
<p>Editing weakened the mark by different amounts. Normalization left the mean score unchanged, while deletion, mixing, homoglyph substitution, and paraphrasing reduced it. All 12 paraphrases passed the declared automatic screens and scored lower than their source passages. The assistant review rated ten pass and two uncertain, so the meaning-preservation result is limited to that review and its stated uncertainty.</p>
<p>Raising <code>δ</code> increased the cohort's mean detection score, conditional NLL, and repeated-pair fraction. Two of eight prompt paths still scored lower at <code>δ = 3</code> than at <code>δ = 2</code>. These are model-based proxies, not human judgments of fluency, factuality, or preference.</p>
<p>I would not use these measurements to estimate production false-alarm rates, evaluate Claude's private watermark, or judge authorship. The honest conclusion is smaller: this kind of detector can recover a statistical trace under controlled conditions. It cannot, by itself, tell us who wrote a passage, why they wrote it, or whether a policy was broken.</p>
<p>The code, frozen traces, generation scripts, and verification artifacts are available in the text-watermarking-lab repository.<sup class="ref"><a href="#fn-lab" aria-label="Source 14">14</a></sup></p>

## Sources and evidence


<ol class="footnotes">
<li id="fn-anthropic-support">
Anthropic, <a href="https://support.claude.com/en/articles/16266773-how-claude-marks-ai-generated-content">How Claude marks AI-generated content</a>, published 2026-08-11.
This support page announced model-level text watermarking before the fuller method post on August 14.
</li>
<li id="fn-anthropic-news">
Anthropic, <a href="https://www.anthropic.com/news/claude-text-watermark">How Claude's text watermark works</a>, published 2026-08-14.
Provider claims about Claude's method, quality, rollout, detection API, code, editing, and user identity come from this announcement.
</li>
<li id="fn-article50">
European Union, <a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/article-50">AI Act Article 50</a>, and European Commission, <a href="https://digital-strategy.ec.europa.eu/en/policies/code-practice-ai-generated-content">Code of Practice on Transparency of AI-generated Content</a>.
These sources establish the transparency requirement and its technical qualifications, not a legal assessment of any provider's compliance.
</li>
<li id="fn-theo">
Theo Browne, <a href="https://www.youtube.com/watch?v=Be-NqsW-wuk">Claude watermarks your code now</a>, 2026-08-14, 31:58.
</li>
<li id="fn-computerphile">
Computerphile with Dr Mike Pound, <a href="https://www.youtube.com/watch?v=XZJc1p6RE78">Ch(e)at GPT?</a>, 2023-02-16.
Used for green-list intuition.
</li>
<li id="fn-sean">
Sean Goedecke, <a href="https://www.seangoedecke.com/ai-detection/">AI detection tools cannot prove that text is AI-generated</a>, 2025-12-05.
His student examples are personal reports rather than a prevalence study.
</li>
<li id="fn-ghostbuster">
Verma et al., <a href="https://arxiv.org/abs/2305.15047">Ghostbuster: Detecting Text Ghostwritten by Large Language Models</a>, submitted 2023-05-24; NAACL 2024.
</li>
<li id="fn-dnagpt">
Yang et al., <a href="https://arxiv.org/abs/2305.17359">DNA-GPT: Divergent N-Gram Analysis for Training-Free Detection of GPT-Generated Text</a>, submitted 2023-05-27.
</li>
<li id="fn-editlens">
Thai et al., <a href="https://arxiv.org/abs/2510.03154">EditLens: Quantifying the Extent of AI Editing in Text</a>, submitted 2025-10-03.
</li>
<li id="fn-kgw">
Kirchenbauer et al., <a href="https://arxiv.org/abs/2301.10226">A Watermark for Large Language Models</a>, ICML 2023.
</li>
<li id="fn-synthid">
Dathathri et al., <a href="https://www.nature.com/articles/s41586-024-08025-4">Scalable watermarking for identifying large language model outputs</a>, Nature 634, 818-823, 2024.
</li>
<li id="fn-three-bricks">
Fernandez et al., <a href="https://arxiv.org/abs/2308.00113">Three Bricks to Consolidate Watermarks for Large Language Models</a>, version inspected 2023-11-08.
</li>
<li id="fn-declaude">
James Padolsey at NOPE, <a href="https://declaude.org/watermarking/">How AI text watermarking works</a>, inspected 2026-08-17.
Its open-model removal measurements are self-reported and do not describe Claude.
</li>
<li id="fn-github-repo">
Jay Shah, <a href="https://github.com/jayshah5696/text-watermarking-lab">text-watermarking-lab</a>.
</li>
</ol>

<script id="evidence" type="application/json">{"stage1":[{"length":40,"condition":"null","rate":0.0016,"detections":16,"mean_hits":9.949,"median_z":0.0,"q05_z":-1.4605934866804429,"q95_z":1.4605934866804429},{"length":40,"condition":"biased","rate":0.2133,"detections":2133,"mean_hits":16.0271,"median_z":2.1908902300206643,"q05_z":0.3651483716701107,"q95_z":4.016632088371218},{"length":80,"condition":"null","rate":0.0013,"detections":13,"mean_hits":19.9266,"median_z":0.0,"q05_z":-1.5491933384829668,"q95_z":1.5491933384829668},{"length":80,"condition":"biased","rate":0.542,"detections":5420,"mean_hits":32.029,"median_z":3.0983866769659336,"q05_z":1.2909944487358056,"q95_z":4.905778905196061},{"length":160,"condition":"null","rate":0.0021,"detections":21,"mean_hits":40.0104,"median_z":0.0,"q05_z":-1.6431676725154982,"q95_z":1.6431676725154982},{"length":160,"condition":"biased","rate":0.8862,"detections":8862,"mean_hits":64.0116,"median_z":4.381780460041329,"q05_z":2.556038601690775,"q95_z":6.207522318391883},{"length":200,"condition":"null","rate":0.0017,"detections":17,"mean_hits":49.9744,"median_z":0.0,"q05_z":-1.632993161855452,"q95_z":1.632993161855452},{"length":200,"condition":"biased","rate":0.9523,"detections":9523,"mean_hits":80.0084,"median_z":4.898979485566357,"q05_z":3.102687007525359,"q95_z":6.695271963607354},{"length":400,"condition":"null","rate":0.002,"detections":20,"mean_hits":100.0268,"median_z":0.0,"q05_z":-1.616580753730952,"q95_z":1.7320508075688772},{"length":400,"condition":"biased","rate":1.0,"detections":10000,"mean_hits":160.01,"median_z":6.928203230275509,"q05_z":5.080682368868707,"q95_z":8.77572409168231}],"toy":{"vocabulary":["amber","birch","cobalt","drift","ember","fern","glow","harbor","iris","juniper","kite","linen","moss","north","opal","pine","quartz","river","stone","tide"],"steps":[{"adjusted_logits":[3.9,1.7,1.5,1.3,1.1,0.9,0.7,0.5,0.3,0.1,1.9,1.7,1.5,-0.7,1.1,-1.1,-1.3,-1.5,-1.7,-1.9],"baseline_probabilities":[0.18465125258471216,0.15117965908547404,0.12377543613312271,0.10133875603782722,0.08296915604683616,0.06792939961247077,0.055615888500853354,0.04553443827540474,0.03728044494020501,0.03052264676097628,0.024989829568547332,0.02045994198194718,0.016751183706811428,0.013714709251225343,0.011228654233501289,0.009193244536646777,0.007526792022718858,0.006162416101021958,0.005045359575169589,0.004130791044527804],"baseline_token_id":0,"context":[3,7,11,15],"eligible_tokens":1,"green_hits":1,"green_token_ids":[0,10,11,12,14],"position":1,"raw_logits":[1.9,1.7,1.5,1.3,1.1,0.9,0.7,0.5,0.3,0.1,-0.1,-0.3,-0.5,-0.7,-0.9,-1.1,-1.3,-1.5,-1.7,-1.9],"sample_draw":0.03533183782698912,"sampled_token_id":0,"sampled_token_is_green":true,"watermarked_probabilities":[0.5150824927844073,0.05707276701765637,0.046727229520610016,0.038257019814656755,0.03132219864337319,0.025644447283347072,0.020995897636563354,0.017189987083531734,0.014073971070300718,0.01152279293318504,0.06970883505119828,0.05707276701765637,0.046727229520610016,0.005177524612405276,0.03132219864337319,0.003470598536538159,0.002841485753451228,0.00232641177078348,0.0019047048610630413,0.0015594404452894364],"z_score":1.7320508075688774},{"adjusted_logits":[1.9,1.7,3.5,1.3,3.1,0.9,0.7,0.5,0.3,2.1,-0.1,1.7,-0.5,-0.7,-0.9,-1.1,-1.3,0.5,-1.7,-1.9],"baseline_probabilities":[0.18465125258471216,0.15117965908547404,0.12377543613312271,0.10133875603782722,0.08296915604683616,0.06792939961247077,0.055615888500853354,0.04553443827540474,0.03728044494020501,0.03052264676097628,0.024989829568547332,0.02045994198194718,0.016751183706811428,0.013714709251225343,0.011228654233501289,0.009193244536646777,0.007526792022718858,0.006162416101021958,0.005045359575169589,0.004130791044527804],"baseline_token_id":0,"context":[7,11,15,0],"eligible_tokens":2,"green_hits":1,"green_token_ids":[2,4,9,11,17],"position":2,"raw_logits":[1.9,1.7,1.5,1.3,1.1,0.9,0.7,0.5,0.3,0.1,-0.1,-0.3,-0.5,-0.7,-0.9,-1.1,-1.3,-1.5,-1.7,-1.9],"sample_draw":0.1122842306510452,"sampled_token_id":1,"sampled_token_is_green":false,"watermarked_probabilities":[0.06874567336399426,0.05628419692415598,0.3404995492087392,0.037728425473279224,0.2282436735007165,0.025290119900100716,0.02070579891124192,0.016952474335682352,0.013879512079388371,0.08396615505836072,0.009303715176007823,0.05628419692415598,0.006236466785084041,0.005105987147497677,0.004180428702477268,0.0034226455397680274,0.002802225160293272,0.016952474335682352,0.001878387698450012,0.001537893774924395],"z_score":0.8164965809277261},{"adjusted_logits":[1.9,1.7,1.5,1.3,1.1,0.9,0.7,0.5,2.3,0.1,-0.1,-0.3,1.5,-0.7,-0.9,0.8999999999999999,0.7,-1.5,-1.7,0.10000000000000009],"baseline_probabilities":[0.18465125258471216,0.15117965908547404,0.12377543613312271,0.10133875603782722,0.08296915604683616,0.06792939961247077,0.055615888500853354,0.04553443827540474,0.03728044494020501,0.03052264676097628,0.024989829568547332,0.02045994198194718,0.016751183706811428,0.013714709251225343,0.011228654233501289,0.009193244536646777,0.007526792022718858,0.006162416101021958,0.005045359575169589,0.004130791044527804],"baseline_token_id":0,"context":[11,15,0,1],"eligible_tokens":3,"green_hits":1,"green_token_ids":[8,12,15,16,19],"position":3,"raw_logits":[1.9,1.7,1.5,1.3,1.1,0.9,0.7,0.5,0.3,0.1,-0.1,-0.3,-0.5,-0.7,-0.9,-1.1,-1.3,-1.5,-1.7,-1.9],"sample_draw":0.15657967059376254,"sampled_token_id":1,"sampled_token_is_green":false,"watermarked_probabilities":[0.12489700268131854,0.10225701706245865,0.08372096458705482,0.06854492838477444,0.05611984083614272,0.045947039550391595,0.03761825429279593,0.030799221666619837,0.18632443326135895,0.02064533568543047,0.01690297123328022,0.013838982367078981,0.08372096458705482,0.00927654729738678,0.007594994554752998,0.045947039550391595,0.03761825429279593,0.004168221387719214,0.0034126510357631017,0.02064533568543047],"z_score":0.3333333333333333},{"adjusted_logits":[1.9,1.7,3.5,1.3,1.1,2.9,2.7,0.5,0.3,0.1,1.9,1.7,-0.5,-0.7,-0.9,-1.1,-1.3,-1.5,-1.7,-1.9],"baseline_probabilities":[0.18465125258471216,0.15117965908547404,0.12377543613312271,0.10133875603782722,0.08296915604683616,0.06792939961247077,0.055615888500853354,0.04553443827540474,0.03728044494020501,0.03052264676097628,0.024989829568547332,0.02045994198194718,0.016751183706811428,0.013714709251225343,0.011228654233501289,0.009193244536646777,0.007526792022718858,0.006162416101021958,0.005045359575169589,0.004130791044527804],"baseline_token_id":1,"context":[15,0,1,1],"eligible_tokens":4,"green_hits":2,"green_token_ids":[2,5,6,10,11],"position":4,"raw_logits":[1.9,1.7,1.5,1.3,1.1,0.9,0.7,0.5,0.3,0.1,-0.1,-0.3,-0.5,-0.7,-0.9,-1.1,-1.3,-1.5,-1.7,-1.9],"sample_draw":0.30731077295889175,"sampled_token_id":2,"sampled_token_is_green":true,"watermarked_probabilities":[0.06432660091767409,0.05266616641227411,0.31861174009636434,0.03530318709399622,0.02890380495552042,0.17485783036105043,0.14316148313308485,0.01586274448698179,0.012987316739710205,0.010633115614765216,0.06432660091767409,0.05266616641227411,0.005835577577316238,0.004777766824521108,0.003911704630271164,0.0032026328777605413,0.0026220940278411913,0.002146789018055697,0.0017576421894522818,0.0014390357134118992],"z_score":1.1547005383792517}]},"toySentence":{"vocabulary":["Early","one","morning","Jack","went","up","the","hill","walked","ran","road","path","stairs","and","saw","snow","down","home",".","trail"],"lesson_key":"stage-02-public-demo-key-v1","comparison_key":"wrong-public-key","steps":[{"position":1,"context":[0,1,2,3],"context_words":["Early","one","morning","Jack"],"next_context_words":["one","morning","Jack","went"],"ranked":[{"id":0,"word":"Early","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|0","hash":"284904139241268bed9430589b75843bca1f87181917aae1e770bd51cea9f602","rank":4,"green":true},{"id":1,"word":"one","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|1","hash":"d418d79b0bf149d3571ade7ff0b323a4b59124ff6ee58c748b42bc798c4b53ba","rank":18,"green":false},{"id":2,"word":"morning","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|2","hash":"8d16da774922b916b3a4a2dba934949d89bdc115383f5cd40e8e441e0b344e11","rank":12,"green":false},{"id":3,"word":"Jack","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|3","hash":"9d716e2c11f4be290c84f405c1ffe5aad085edeb9962c209b964ff7b10b67af6","rank":13,"green":false},{"id":4,"word":"went","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|4","hash":"01d63f5375ca94a19b30e3b6f3dc123a5f5f4d0771916c9df608fe9e3aee3817","rank":1,"green":true},{"id":5,"word":"up","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|5","hash":"6bb53b0cbcf5063e7c10b25517dfd152b6c585b14b1d69bef0632b8563a206a6","rank":7,"green":false},{"id":6,"word":"the","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|6","hash":"8d04c49ed5706641707fe58e0cf13792c35fb2fea474b8c9ca23d5f7ea3be5a3","rank":11,"green":false},{"id":7,"word":"hill","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|7","hash":"a08759d56e8f156385f05af2f4eefe52865228e1459569d1082355710518dd2a","rank":14,"green":false},{"id":8,"word":"walked","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|8","hash":"3b99200c49982b78e92e72ae4c0e9a52d62d6d0a1e743c78879565a6e9f93fe4","rank":5,"green":true},{"id":9,"word":"ran","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|9","hash":"7deee2bfe92830691a2d9accca252d75cbec375e0245729c34f256bf402a6cc6","rank":10,"green":false},{"id":10,"word":"road","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|10","hash":"e05f39789fe71df78bef37f1902f093b1b37d171c3bc59a1b71e6f9073712acb","rank":19,"green":false},{"id":11,"word":"path","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|11","hash":"75563f06b55c206465986b91ec07f35849860c34f6c08f04592cbd6317fdabb8","rank":9,"green":false},{"id":12,"word":"stairs","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|12","hash":"6da43a0db717f85250d26bd4b45865cf452639f7ea49add1d7b5668a219613a1","rank":8,"green":false},{"id":13,"word":"and","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|13","hash":"d2e491abba3442c6ca7a876d9a6531d92eec5e61d804b351dcd0153e3b5d3e5e","rank":17,"green":false},{"id":14,"word":"saw","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|14","hash":"656f34d13f2be65da76171860c27187d84bbbd4a5856bb8b63e26f76ec10562b","rank":6,"green":false},{"id":15,"word":"snow","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|15","hash":"0cae4b511fa1def82485d0bf57dc0f0ccbf174ce47129be1857962d0d3e413dc","rank":3,"green":true},{"id":16,"word":"down","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|16","hash":"b57ca56cab77a207ddea520cdce8076be0acdd7e1734a1661d7c9d31f7357d9d","rank":15,"green":false},{"id":17,"word":"home","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|17","hash":"baf522673fdd664d6d3b1b1993f58b2187e2d85d34deb4353968c59a27dc78c1","rank":16,"green":false},{"id":18,"word":".","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|18","hash":"f19c18af61e9c60249464098867ad31be9bf2310252adc3b4fec58b6d68c6c88","rank":20,"green":false},{"id":19,"word":"trail","material":"lab-02|v1|stage-02-public-demo-key-v1|0,1,2,3|19","hash":"04bf05c5714e90d3be9b3a3ba237033a4ec23975b78da787b58c0287441c68d6","rank":2,"green":true}],"green_ids":[0,4,8,15,19],"green_words":["Early","went","walked","snow","trail"],"raw_scores":[-2.2,-2.2,-2.2,-2.2,1.7,-2.2,-2.2,-2.2,1.4,1.9,-2.2,-2.2,-2.2,0.5,1.2,-2.2,-2.2,0.2,-2.2,-2.2],"adjusted_scores":[-0.20000000000000018,-2.2,-2.2,-2.2,3.7,-2.2,-2.2,-2.2,3.4,1.9,-2.2,-2.2,-2.2,0.5,1.2,-0.20000000000000018,-2.2,0.2,-2.2,-0.20000000000000018],"before":[0.004625176199509479,0.004625176199509479,0.004625176199509479,0.004625176199509479,0.22849503180037645,0.004625176199509479,0.004625176199509479,0.004625176199509479,0.16927328289296742,0.2790844620668755,0.004625176199509479,0.004625176199509479,0.004625176199509479,0.06882138102896794,0.13858924237894146,0.004625176199509479,0.004625176199509479,0.05098413303873856,0.004625176199509479,0.004625176199509479],"after":[0.009414749163704291,0.0012741477446715829,0.0012741477446715829,0.0012741477446715829,0.4651116664012342,0.0012741477446715829,0.0012741477446715829,0.0012741477446715829,0.34456319712167094,0.07688244135501345,0.0012741477446715829,0.0012741477446715829,0.0012741477446715829,0.018958976618564927,0.03817869049650459,0.009414749163704291,0.0012741477446715829,0.014045155324511562,0.0012741477446715829,0.009414749163704291],"draw":0.3,"plain_id":8,"marked_id":4,"target_id":4,"target_word":"went","hit":true},{"position":2,"context":[1,2,3,4],"context_words":["one","morning","Jack","went"],"next_context_words":["morning","Jack","went","up"],"ranked":[{"id":0,"word":"Early","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|0","hash":"6f7b5355d57fff3efc545cb593f420fb04f19816407729902b4b8b05f7d5d5e4","rank":10,"green":false},{"id":1,"word":"one","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|1","hash":"a7052f9b778c543f18b8ced48f6f89ac6a345e72782450839e40f0689494d49a","rank":13,"green":false},{"id":2,"word":"morning","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|2","hash":"b4d65de5421d7c4fd46d922fc860d4a2dd1dc6701bd1e20bf5d018a755fa011f","rank":15,"green":false},{"id":3,"word":"Jack","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|3","hash":"3b584a9b669ac07f972aeb4fa551e60aca4e89c36bedc9fb761ce192dbca0ac8","rank":5,"green":true},{"id":4,"word":"went","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|4","hash":"48ea49094a56d7c37b8ab87ee26e5fc5b5685cf7c9bcf986c84a106a0ca4d6bf","rank":8,"green":false},{"id":5,"word":"up","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|5","hash":"2c0bea3855b0f098e010906481b888a8a835002ac59ed93013125040d244b9db","rank":2,"green":true},{"id":6,"word":"the","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|6","hash":"a41309876b927dec065007b0efeade224cc56df12fce5a196c3ddbfbc86e1365","rank":12,"green":false},{"id":7,"word":"hill","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|7","hash":"36542ad9146ee3a7531543a257cf72c54ebbc4f431a82032bfb5eddd76a1add0","rank":4,"green":true},{"id":8,"word":"walked","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|8","hash":"b8805a19fc0126ca93081aef15b79ae0c667edf98b9ad9592e5a64a47f613fe5","rank":16,"green":false},{"id":9,"word":"ran","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|9","hash":"3e2470b1e6764651081c4eac000c802dfcf03c98e80e46ab5f931d31fe953cb7","rank":7,"green":false},{"id":10,"word":"road","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|10","hash":"3bbe98b0f2eaa1d9af9125cac07a099ff6a8c45e0e0cfc8686d32c26815390e4","rank":6,"green":false},{"id":11,"word":"path","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|11","hash":"5bcb450d3256b66086e6fcc17b64e20c80b900606d7895247e9c576a17f97003","rank":9,"green":false},{"id":12,"word":"stairs","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|12","hash":"2e999b51b34e96572ea201e339e61311bfe8619ff99625d25e7cbe02e2673cf0","rank":3,"green":true},{"id":13,"word":"and","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|13","hash":"a9ff763e45a754f4947a1bb3b93f1fbf3d86a4ada6c5bb82336188cb8af94453","rank":14,"green":false},{"id":14,"word":"saw","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|14","hash":"090459a1b59a7aa87cd7f9ba658bed0307dc5164150dfb3d4d52ff0183a40205","rank":1,"green":true},{"id":15,"word":"snow","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|15","hash":"bd01f909d4515bcc407a6eb86f9ccfb6e6e66887fb2c07e758cf3fdd248875a1","rank":17,"green":false},{"id":16,"word":"down","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|16","hash":"d8879777abd349203e2ec86008c1a52766a1e4ebd3eb61548103b0196f30c069","rank":19,"green":false},{"id":17,"word":"home","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|17","hash":"c51d3923a2f2599dd978a432e0475a63ed3288f07cf8bc078a8b21df31392be7","rank":18,"green":false},{"id":18,"word":".","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|18","hash":"de8d1a0edcf2ddfa81d9e7b2b5ae23102ced89b5c816acbf2b75269ac923ace3","rank":20,"green":false},{"id":19,"word":"trail","material":"lab-02|v1|stage-02-public-demo-key-v1|1,2,3,4|19","hash":"7a534bc374e5a0940837a6421a006f6cb0d88635159a195a959ab161f12e188d","rank":11,"green":false}],"green_ids":[3,5,7,12,14],"green_words":["Jack","up","hill","stairs","saw"],"raw_scores":[-2.2,-2.2,-2.2,-2.2,-2.2,1.7,-2.2,-2.2,-2.2,-2.2,0.4,-2.2,-2.2,0.8,-2.2,-2.2,1.9,1.5,0.1,-2.2],"adjusted_scores":[-2.2,-2.2,-2.2,-0.20000000000000018,-2.2,3.7,-2.2,-0.20000000000000018,-2.2,-2.2,0.4,-2.2,-0.20000000000000018,0.8,-0.20000000000000018,-2.2,1.9,1.5,0.1,-2.2],"before":[0.0048143236108255105,0.0048143236108255105,0.0048143236108255105,0.0048143236108255105,0.0048143236108255105,0.23783937716135944,0.0048143236108255105,0.0048143236108255105,0.0048143236108255105,0.0048143236108255105,0.06481879191187807,0.0048143236108255105,0.0048143236108255105,0.09669827464540993,0.0048143236108255105,0.0048143236108255105,0.2904976712639813,0.19472641237491797,0.04801894209089604,0.0048143236108255105],"after":[0.00182180973155332,0.00182180973155332,0.00182180973155332,0.01346145430802527,0.00182180973155332,0.6650288113386386,0.00182180973155332,0.01346145430802527,0.00182180973155332,0.00182180973155332,0.024528368975250653,0.00182180973155332,0.01346145430802527,0.036592026630136824,0.01346145430802527,0.00182180973155332,0.10992852314960015,0.07368729269826982,0.018171062660469844,0.00182180973155332],"draw":0.35,"plain_id":11,"marked_id":5,"target_id":5,"target_word":"up","hit":true},{"position":3,"context":[2,3,4,5],"context_words":["morning","Jack","went","up"],"next_context_words":["Jack","went","up","the"],"ranked":[{"id":0,"word":"Early","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|0","hash":"6e3880c48f2c2492b83e1a0b196d62ff56e0d7414ab5102fba8c617fd28a9f67","rank":7,"green":false},{"id":1,"word":"one","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|1","hash":"2ece0638451a1e52adaefd03faebe9fc44549175dfb3a92abe005f2441190639","rank":5,"green":true},{"id":2,"word":"morning","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|2","hash":"9e86ee39a3de02994ba997135bea4213ba70fbac3d9c383c87203a95ec8216c0","rank":13,"green":false},{"id":3,"word":"Jack","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|3","hash":"c794277c234cda6fe6315f219da6eb7f0e7bafa0b831e6f0ff672e4de5667500","rank":17,"green":false},{"id":4,"word":"went","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|4","hash":"1d4ba35db3d84a523b75c95ed49095a52d85f4c2798f64028b75a09515f3f6ca","rank":2,"green":true},{"id":5,"word":"up","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|5","hash":"78a480a220d3e4c621c2c7ca989630fc54684df24876d03dafaea42088e63afd","rank":8,"green":false},{"id":6,"word":"the","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|6","hash":"a8517f0431fcc4c8e8ce283f80e370ba9bd312ff96b2d7db2e6752e3c7df6097","rank":14,"green":false},{"id":7,"word":"hill","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|7","hash":"c469526f0cee0397b253e52c7592b018824c172b32ca4b9d3af364c0eb27dbdc","rank":15,"green":false},{"id":8,"word":"walked","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|8","hash":"eb26d7dcc3ae85758d15705bdaf4009d0cc139b6d3b0ab7183349aac15b30f52","rank":19,"green":false},{"id":9,"word":"ran","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|9","hash":"8a7b601e703e68deb57dce9b576aa28e7f1d0a6920e1d137d8b41094afee8db3","rank":11,"green":false},{"id":10,"word":"road","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|10","hash":"797bc2a538a83ba3f52e520e9d3aeed2a3b51d4f4788ca59e73a6ff6c3ae7b79","rank":9,"green":false},{"id":11,"word":"path","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|11","hash":"8a3c077534fa0cd742b98837fa2a587facbb838e572c13c4e742a4a8702e6c7e","rank":10,"green":false},{"id":12,"word":"stairs","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|12","hash":"1f47497336719e37972b8475249582137b9382e49a9216a48dae9966b224e7ec","rank":3,"green":true},{"id":13,"word":"and","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|13","hash":"e9eef7d04f8f40864643bb72eec4a5395213e7c43adf6be891277f3a6032a92b","rank":18,"green":false},{"id":14,"word":"saw","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|14","hash":"8bdbda48a13efaf032a830dc077eeabfe1ea5c6583a4261a237051abe5ff133f","rank":12,"green":false},{"id":15,"word":"snow","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|15","hash":"0700d11030c8d52aae286c7e1c0928e5081576beb49310c5b127318d21126c55","rank":1,"green":true},{"id":16,"word":"down","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|16","hash":"f80770911aaeb4fcf8ca6a3317190a6771447fa7c46b7290eef3b41a359f8e5c","rank":20,"green":false},{"id":17,"word":"home","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|17","hash":"435ae30299219dfed7d53a82b7d1dc10c831e3311291362b2ffe5e33178b7285","rank":6,"green":false},{"id":18,"word":".","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|18","hash":"c5022c6b4fb9df6bbc79c046a53f452a5ad615cca30f556684bc45a30812f997","rank":16,"green":false},{"id":19,"word":"trail","material":"lab-02|v1|stage-02-public-demo-key-v1|2,3,4,5|19","hash":"2da6d2bd028c9a8ff963eba466b22238bf9d713623b25318b0e674e558431efa","rank":4,"green":true}],"green_ids":[1,4,12,15,19],"green_words":["one","went","stairs","snow","trail"],"raw_scores":[-2.2,-2.2,-2.2,-2.2,-2.2,-2.2,2.2,1.3,-2.2,-2.2,1.1,0.9,0.7,-2.2,-2.2,-2.2,-2.2,-2.2,0.2,0.5],"adjusted_scores":[-2.2,-0.20000000000000018,-2.2,-2.2,-0.20000000000000018,-2.2,2.2,1.3,-2.2,-2.2,1.1,0.9,2.7,-2.2,-2.2,-0.20000000000000018,-2.2,-2.2,0.2,2.5],"before":[0.004525829636797119,0.004525829636797119,0.004525829636797119,0.004525829636797119,0.004525829636797119,0.004525829636797119,0.3686327553467827,0.14987489391058093,0.004525829636797119,0.004525829636797119,0.12270718475889257,0.10046414578572715,0.08225308573648456,0.004525829636797119,0.004525829636797119,0.004525829636797119,0.004525829636797119,0.004525829636797119,0.049889018355149785,0.0673431308280198],"after":[0.002215800302923673,0.01637267274233055,0.002215800302923673,0.002215800302923673,0.01637267274233055,0.002215800302923673,0.18047885946123274,0.0733772284815248,0.002215800302923673,0.002215800302923673,0.060076193533453934,0.04918622717370332,0.2975593345054335,0.002215800302923673,0.002215800302923673,0.01637267274233055,0.002215800302923673,0.002215800302923673,0.02442515756340675,0.24362097802501662],"draw":0.13,"plain_id":6,"marked_id":6,"target_id":6,"target_word":"the","hit":false},{"position":4,"context":[3,4,5,6],"context_words":["Jack","went","up","the"],"next_context_words":["went","up","the","hill"],"ranked":[{"id":0,"word":"Early","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|0","hash":"8874852d9324022a494c7c913761fc20f766a782465af2a36e25307bdb247e7c","rank":11,"green":false},{"id":1,"word":"one","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|1","hash":"e5939025282e2075579259d13e55fb138fc2081f9e160dc8b4c915e3dc6c4bdf","rank":19,"green":false},{"id":2,"word":"morning","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|2","hash":"700dfd54ebede9b9c7b330c92e246f2b66035c9355d2efc67c91f737ce5423a8","rank":9,"green":false},{"id":3,"word":"Jack","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|3","hash":"c88f1f6878f1a5a527314df401b28e3489990b67621de0ea37b7549affa8a682","rank":16,"green":false},{"id":4,"word":"went","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|4","hash":"224134b6f7cccdf916019d6b85707b03360db57a486346971194d9c84c9d2acb","rank":3,"green":true},{"id":5,"word":"up","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|5","hash":"d86e60373899178aa0012f21d746ff6fdf7ecdd7cbb1ef8783cb3dc9ab65fca7","rank":18,"green":false},{"id":6,"word":"the","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|6","hash":"602666d197c5065063c6a05fb3712f556701045e795e975ce4346aa81fa8f371","rank":8,"green":false},{"id":7,"word":"hill","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|7","hash":"4cd0d16c29e2f8d2effc6da525072d09ec7fd0a9f965eb7d11af5ea5d34b7146","rank":6,"green":false},{"id":8,"word":"walked","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|8","hash":"aed6e5a4a80e6d5f4bc1d6d39cc5d78a730ab14a925fc13f661c8dba011ddbfd","rank":14,"green":false},{"id":9,"word":"ran","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|9","hash":"e978a2f290acaa95107ec90559b126c2b2e43a5ab1edb9994a0a36f355b1419b","rank":20,"green":false},{"id":10,"word":"road","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|10","hash":"4318055bab383f3550ce6c0f3360b269a9f7c87e50ded37df3a08acddd8969fb","rank":5,"green":true},{"id":11,"word":"path","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|11","hash":"d2e694ec0fcf4a58efd4033fb0e76f361b814bb55e8e3effb502f8fe917456c8","rank":17,"green":false},{"id":12,"word":"stairs","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|12","hash":"3a665785cfd779afd662c9e594ea8d04cf1b608d5019918cabaf044675c4fea0","rank":4,"green":true},{"id":13,"word":"and","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|13","hash":"5941f0db5baecd1eb6f75448f9911c8d491a71c277ee33982ad7f93300b78175","rank":7,"green":false},{"id":14,"word":"saw","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|14","hash":"2109e761b5fd621ab535fbc88efd8140de73533a4b3d5697cb99ba6a98314b0d","rank":2,"green":true},{"id":15,"word":"snow","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|15","hash":"b8940ad6886088437afefc2e9f1992cf7fb40747c4fc173264678750fa7a77ad","rank":15,"green":false},{"id":16,"word":"down","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|16","hash":"a3b47f49888d58575080726cb895682785fa77f77386070993626bb0fae1e088","rank":13,"green":false},{"id":17,"word":"home","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|17","hash":"97ce66a29f34c92e3449ae5198c28f72ed760c24cb54bccf086f9642fb882998","rank":12,"green":false},{"id":18,"word":".","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|18","hash":"7017b2b2dd797a942173072beb85b55455f1280c8422e8a519b832de79d71099","rank":10,"green":false},{"id":19,"word":"trail","material":"lab-02|v1|stage-02-public-demo-key-v1|3,4,5,6|19","hash":"0baf2ba00097e344a19430fe45b669190792a29377ab9901fb6c91b3c95736dd","rank":1,"green":true}],"green_ids":[4,10,12,14,19],"green_words":["went","road","stairs","saw","trail"],"raw_scores":[-2.2,-2.2,-2.2,-2.2,-2.2,-2.2,-2.2,2.5,-2.2,-2.2,1.8,1.6,1.4,-2.2,-2.2,-2.2,0.4,-2.2,0.2,1.2],"adjusted_scores":[-2.2,-2.2,-2.2,-2.2,-0.20000000000000018,-2.2,-2.2,2.5,-2.2,-2.2,3.8,1.6,3.4,-2.2,-0.20000000000000018,-2.2,0.4,-2.2,0.2,3.2],"before":[0.0031918721566280956,0.0031918721566280956,0.0031918721566280956,0.0031918721566280956,0.0031918721566280956,0.0031918721566280956,0.0031918721566280956,0.3509373184499206,0.0031918721566280956,0.0031918721566280956,0.17427031489419645,0.14268046615246252,0.11681688550252312,0.0031918721566280956,0.0031918721566280956,0.0031918721566280956,0.04297453055805656,0.0031918721566280956,0.0351845697669704,0.09564157663970513],"after":[0.0009089463034336312,0.0009089463034336312,0.0009089463034336312,0.0009089463034336312,0.006716255226986741,0.0009089463034336312,0.0009089463034336312,0.09993607597333763,0.0009089463034336312,0.0009089463034336312,0.36669511054391135,0.040630976404290545,0.2458030833808385,0.0009089463034336312,0.006716255226986741,0.0009089463034336312,0.012237814917313567,0.0009089463034336312,0.010019475423281101,0.20124654356528393],"draw":0.06,"plain_id":7,"marked_id":7,"target_id":7,"target_word":"hill","hit":false}],"comparison_first":[{"id":0,"word":"Early","material":"lab-02|v1|wrong-public-key|0,1,2,3|0","hash":"ac52bbc3a067f333d6df1b39678664e0857f46c81cef190c6231c3bfead4aa5f","rank":14,"green":false},{"id":1,"word":"one","material":"lab-02|v1|wrong-public-key|0,1,2,3|1","hash":"c04bb4beaaa8af8cac0148b3cb13ceb29bde3a4c3d8bd9ba70f090afb80c98e1","rank":16,"green":false},{"id":2,"word":"morning","material":"lab-02|v1|wrong-public-key|0,1,2,3|2","hash":"e8953cdefdbd40c0e8a8f8f24fb644cf58b18144b27ed36effff95152a82a7d5","rank":18,"green":false},{"id":3,"word":"Jack","material":"lab-02|v1|wrong-public-key|0,1,2,3|3","hash":"be15395cfea72d902cb9a5908521cdaf4d936347da0a90d57915eb0c892be5ed","rank":15,"green":false},{"id":4,"word":"went","material":"lab-02|v1|wrong-public-key|0,1,2,3|4","hash":"a995bc65be5b0b3a20dc2838d1508c6c563bb9fbedf71dee001e074a3810ca0d","rank":12,"green":false},{"id":5,"word":"up","material":"lab-02|v1|wrong-public-key|0,1,2,3|5","hash":"ec48ce7988392be4ddd7ce72293969d8593354a6fb1796b967f0ca0821fe9118","rank":19,"green":false},{"id":6,"word":"the","material":"lab-02|v1|wrong-public-key|0,1,2,3|6","hash":"42c831d9c48dc9f33d4e2f9f34fcc8e0d602bd17867907b8db3ca6ffcf0e5b4f","rank":4,"green":true},{"id":7,"word":"hill","material":"lab-02|v1|wrong-public-key|0,1,2,3|7","hash":"53cb52b228527d502fec68d9c11e3a43f5da8155a36c7010648cd6d5b2be16b2","rank":5,"green":true},{"id":8,"word":"walked","material":"lab-02|v1|wrong-public-key|0,1,2,3|8","hash":"aaba98cd91074c66d529fe9839316dc57955e1085fa46624d06f2ceef325d854","rank":13,"green":false},{"id":9,"word":"ran","material":"lab-02|v1|wrong-public-key|0,1,2,3|9","hash":"9199ce7bb2364046aaffe949b2f5a68e085e681b47ca5381de30a4b74371e1a2","rank":10,"green":false},{"id":10,"word":"road","material":"lab-02|v1|wrong-public-key|0,1,2,3|10","hash":"8b9b00bbf4267edce93badb594b5b852f08f0da538d35c95269e121d799f043e","rank":9,"green":false},{"id":11,"word":"path","material":"lab-02|v1|wrong-public-key|0,1,2,3|11","hash":"2a6facb154c5bd0a41b3fde705542d6b5fc2641fc0b9184997b0fa4706e5eb28","rank":2,"green":true},{"id":12,"word":"stairs","material":"lab-02|v1|wrong-public-key|0,1,2,3|12","hash":"80e314b853e53592652017cc3dc6f960d16a1e28e07600360c4cba25a503a91d","rank":8,"green":false},{"id":13,"word":"and","material":"lab-02|v1|wrong-public-key|0,1,2,3|13","hash":"7f79392265ebb441b384f774624d7d28108d238459d06943d37ec7cf954ac7eb","rank":7,"green":false},{"id":14,"word":"saw","material":"lab-02|v1|wrong-public-key|0,1,2,3|14","hash":"fd81eda4a9e36b043734fcbf73ff4a6dcdcb68cdb38e421caf7c425330826086","rank":20,"green":false},{"id":15,"word":"snow","material":"lab-02|v1|wrong-public-key|0,1,2,3|15","hash":"2a7012af868d161abf062210cc8b596e42c82b6d029d5616112d7650c0027207","rank":3,"green":true},{"id":16,"word":"down","material":"lab-02|v1|wrong-public-key|0,1,2,3|16","hash":"959d128fb881e884ff2addd31f0c93ff71f3d9da500d0974a234d7692a5753dd","rank":11,"green":false},{"id":17,"word":"home","material":"lab-02|v1|wrong-public-key|0,1,2,3|17","hash":"0434474588e6b0d3603d4b18c29f440c49bf450121b5cef88939003c71797e74","rank":1,"green":true},{"id":18,"word":".","material":"lab-02|v1|wrong-public-key|0,1,2,3|18","hash":"e24ca8807cfef8ffab157448ca77939261b2adf2f095d9d08c0f0f846c33c48e","rank":17,"green":false},{"id":19,"word":"trail","material":"lab-02|v1|wrong-public-key|0,1,2,3|19","hash":"545178a10f06545a63e2f8c6639c7f97e053ea19ffb4941ce8de41137700e918","rank":6,"green":false}],"comparison_hits":[false,false,false,false]},"candidateControl":[{"final_probability":0.2542895972728729,"in_green_group":false,"raw_score":15.3125,"score_after_increase":15.3125,"score_increase":0.0,"selected":false,"temperature_score":19.140625,"token_id":3259,"token_text":"He"},{"final_probability":0.21750541031360626,"in_green_group":true,"raw_score":15.1875,"score_after_increase":15.1875,"score_increase":0.0,"selected":false,"temperature_score":18.984375,"token_id":2777,"token_text":"As"},{"final_probability":0.13611142337322235,"in_green_group":true,"raw_score":14.8125,"score_after_increase":14.8125,"score_increase":0.0,"selected":false,"temperature_score":18.515625,"token_id":773,"token_text":"he"},{"final_probability":0.11642226576805115,"in_green_group":true,"raw_score":14.6875,"score_after_increase":14.6875,"score_increase":0.0,"selected":true,"temperature_score":18.359375,"token_id":30604,"token_text":"Jack"},{"final_probability":0.026386400684714317,"in_green_group":true,"raw_score":13.5,"score_after_increase":13.5,"score_increase":0.0,"selected":false,"temperature_score":16.875,"token_id":1098,"token_text":"The"}],"candidateMarked":[{"final_probability":0.34714987874031067,"in_green_group":true,"raw_score":15.1875,"score_after_increase":17.1875,"score_increase":2.0,"selected":false,"temperature_score":21.484375,"token_id":2777,"token_text":"As"},{"final_probability":0.2172408401966095,"in_green_group":true,"raw_score":14.8125,"score_after_increase":16.8125,"score_increase":2.0,"selected":false,"temperature_score":21.015625,"token_id":773,"token_text":"he"},{"final_probability":0.1858159452676773,"in_green_group":true,"raw_score":14.6875,"score_after_increase":16.6875,"score_increase":2.0,"selected":true,"temperature_score":20.859375,"token_id":30604,"token_text":"Jack"},{"final_probability":0.04211405664682388,"in_green_group":true,"raw_score":13.5,"score_after_increase":15.5,"score_increase":2.0,"selected":false,"temperature_score":19.375,"token_id":1098,"token_text":"The"},{"final_probability":0.033314965665340424,"in_green_group":false,"raw_score":15.3125,"score_after_increase":15.3125,"score_increase":0.0,"selected":false,"temperature_score":19.140625,"token_id":3259,"token_text":"He"}],"realStep":{"control_text":"Jack paused and looked back at the world below. The sun had just risen, casting a warm orange glow over the earth. He stood tall and resolute, determination glistening in the morning light","marked_text":"Jack climbed slowly, his boots sinking slightly into the soft snow-covered earth. The forest overhead was silent and serene, with tall trees bearing branches at least 60 feet high, creating a maj","control_score":{"eligible_tokens":39,"expected_green_hits":9.75,"green_hits":8,"key_role":"generation","z_score":-0.647150228929434},"marked_score":{"eligible_tokens":39,"expected_green_hits":9.75,"green_hits":21,"key_role":"generation","z_score":4.160251471689218},"comparison_score":{"eligible_tokens":39,"expected_green_hits":9.75,"green_hits":7,"key_role":"comparison","z_score":-1.0169503597462533}},"order":{"candidates":[{"in_green_group":true,"raw_score":-125.55415344238281,"reference_after_top_k":true,"reference_after_top_p":true,"reference_final_score":-154.94268798828125,"reference_probability":0.08642730116844177,"reference_temperature_score":-156.94268798828125,"selected_by_reference":true,"stage_03_after_top_k":true,"stage_03_after_top_p":true,"stage_03_final_score":-154.44268798828125,"stage_03_probability":0.08825517445802689,"stage_03_temperature_score":-154.44268798828125,"stage_03_watermark_score":-123.55415344238281,"token_id":373,"token_text":" was","witness_role":"selected"},{"in_green_group":true,"raw_score":-123.78811645507812,"reference_after_top_k":true,"reference_after_top_p":true,"reference_final_score":-152.73513793945312,"reference_probability":0.7859188914299011,"reference_temperature_score":-154.73513793945312,"selected_by_reference":false,"stage_03_after_top_k":true,"stage_03_after_top_p":true,"stage_03_final_score":-152.23513793945312,"stage_03_probability":0.8025405406951904,"stage_03_temperature_score":-152.23513793945312,"stage_03_watermark_score":-121.78811645507812,"token_id":2497,"token_text":" saw","witness_role":"green_survivor"},{"in_green_group":false,"raw_score":-125.46232604980469,"reference_after_top_k":true,"reference_after_top_p":true,"reference_final_score":-156.82791137695312,"reference_probability":0.013119244016706944,"reference_temperature_score":-156.82791137695312,"selected_by_reference":false,"stage_03_after_top_k":true,"stage_03_after_top_p":true,"stage_03_final_score":-156.82791137695312,"stage_03_probability":0.008125513792037964,"stage_03_temperature_score":-156.82791137695312,"stage_03_watermark_score":-125.46232604980469,"token_id":1043,"token_text":" found","witness_role":"red_survivor"},{"in_green_group":true,"raw_score":-127.74833679199219,"reference_after_top_k":true,"reference_after_top_p":false,"reference_final_score":null,"reference_probability":0.0,"reference_temperature_score":-159.6854248046875,"selected_by_reference":false,"stage_03_after_top_k":true,"stage_03_after_top_p":true,"stage_03_final_score":-157.1854248046875,"stage_03_probability":0.005683092400431633,"stage_03_temperature_score":-157.1854248046875,"stage_03_watermark_score":-125.74833679199219,"token_id":3214,"token_text":" fell","witness_role":"green_filtered"},{"in_green_group":false,"raw_score":-127.8421859741211,"reference_after_top_k":true,"reference_after_top_p":false,"reference_final_score":null,"reference_probability":0.0,"reference_temperature_score":-159.802734375,"selected_by_reference":false,"stage_03_after_top_k":false,"stage_03_after_top_p":false,"stage_03_final_score":null,"stage_03_probability":0.0,"stage_03_temperature_score":-159.802734375,"stage_03_watermark_score":-127.8421859741211,"token_id":1718,"token_text":" took","witness_role":"red_filtered"}],"generate_scores_match_probe":true,"green_token_count":12564,"previous_token_id":339,"previous_token_text":" he","reference_counts":[50257,40,19,19],"reference_order":["temperature","top_k","top_p","watermark"],"reference_selected_probability":0.08642730116844177,"selected_token_id":373,"selected_token_text":" was","stage_03_counts":[50257,50257,11,11],"stage_03_order":["watermark","temperature","top_p","top_k"],"stage_03_selected_probability":0.08825517445802689,"vocabulary_size":50257},"repetition":{"library_false":{"green_fraction":0.6,"independent_z_score":1.8073922282301278,"key_role":"generation","num_green_tokens":3,"num_tokens_scored":5,"p_value":0.062488560543625615,"prediction":false,"repetition_policy":"all","z_score":1.8073922282301278,"z_threshold":3.0},"library_true":{"green_fraction":0.6,"independent_z_score":1.8073922282301278,"key_role":"generation","num_green_tokens":3,"num_tokens_scored":5,"p_value":0.062488560543625615,"prediction":false,"repetition_policy":"unique","z_score":1.8073922282301278,"z_threshold":3.0},"explicit_distinct":{"green_fraction":0.5,"num_distinct_pairs":2,"num_green_pairs":1,"z_score":0.8164965809277261}},"smoke":[{"prompt":"stage-02-continuity","watermarked":false,"tokens":13,"z":0.17407765595569785,"g":3,"t":11},{"prompt":"stage-02-continuity","watermarked":true,"tokens":28,"z":2.038098661460272,"g":11,"t":26},{"prompt":"notebook","watermarked":false,"tokens":18,"z":0.0,"g":4,"t":16},{"prompt":"notebook","watermarked":true,"tokens":22,"z":1.0327955589886444,"g":7,"t":20},{"prompt":"library","watermarked":false,"tokens":30,"z":0.4364357804719848,"g":8,"t":28},{"prompt":"library","watermarked":true,"tokens":24,"z":1.7232808737106582,"g":9,"t":22}],"naturalScores":[-2.1677749238103,0.14451832825402,0.260132990857236,1.8787382673022601,-0.5491696473652761,-1.936545598603868,-1.127242960381356,-0.664784309968492,-1.936545598603868,-1.358472285587788,1.185050291682964,-0.896013635174924,-1.127242960381356,1.069435629079748,0.375747653460452,-1.242857622984572,0.7225916412701,-0.780398972571708,-0.317940322158844,-0.202325659555628,-1.127242960381356,0.606976978666884,0.375747653460452,0.606976978666884,1.185050291682964,0.7225916412701,-0.202325659555628,0.49136231606366804,-0.43355498476206,1.7631236046990442,0.7225916412701,2.341196917715124,-1.474086948191004,-0.5491696473652761,-0.202325659555628,0.028903665650804,-0.08671099695241201,1.7631236046990442,0.7225916412701,0.49136231606366804,-0.43355498476206,0.375747653460452,-2.052160261207084,-2.1677749238103,1.069435629079748,1.7631236046990442,-0.317940322158844,1.531894279492612,-0.08671099695241201,0.14451832825402,0.375747653460452,-0.5491696473652761,0.8382063038733161,1.185050291682964,0.8382063038733161,-0.664784309968492,0.260132990857236,-0.780398972571708,0.14451832825402,0.028903665650804,-0.664784309968492,0.49136231606366804,0.14451832825402,-0.317940322158844,0.7225916412701,0.953820966476532,-0.08671099695241201,-0.896013635174924,0.606976978666884,1.994352929905476,0.49136231606366804,-1.820930936000652,0.375747653460452,-0.43355498476206,0.028903665650804,0.49136231606366804,-0.202325659555628,-2.052160261207084,1.069435629079748,2.109967592508692,-0.43355498476206,1.416279616889396,1.185050291682964,0.49136231606366804,-2.052160261207084,1.3006649542861801,1.069435629079748,0.8382063038733161,1.3006649542861801,0.375747653460452,-0.202325659555628,-0.43355498476206,-0.43355498476206,2.341196917715124,1.416279616889396,-0.317940322158844,0.7225916412701,-1.0116282977781401,-0.5491696473652761,-0.43355498476206,1.531894279492612,1.185050291682964,-0.896013635174924,-0.664784309968492,0.375747653460452,-0.664784309968492,1.7631236046990442,-1.242857622984572,-1.820930936000652,-0.202325659555628,-1.358472285587788,0.49136231606366804,-0.5491696473652761,0.8382063038733161,0.14451832825402,-0.780398972571708,0.260132990857236,-1.5897016107942201,0.14451832825402,-0.08671099695241201,1.7631236046990442,0.953820966476532,2.5724262429215563,-0.08671099695241201,1.069435629079748,0.260132990857236,1.185050291682964,1.3006649542861801,-1.705316273397436,0.8382063038733161,0.028903665650804,-1.127242960381356,0.375747653460452,-0.43355498476206,-0.664784309968492,-0.317940322158844,-0.43355498476206,-1.0116282977781401,-1.242857622984572,-0.664784309968492,-1.242857622984572,-0.08671099695241201,-1.242857622984572,-0.317940322158844,-0.664784309968492,-1.358472285587788,-1.705316273397436,-4.2488388506681884,0.260132990857236,0.7225916412701,1.994352929905476,1.8787382673022601,-0.664784309968492,0.028903665650804,-0.43355498476206,-0.202325659555628,0.028903665650804,0.8382063038733161,-2.052160261207084,-0.5491696473652761,0.953820966476532,-2.052160261207084,-0.317940322158844,1.185050291682964,0.49136231606366804,-1.0116282977781401,-0.780398972571708,0.8382063038733161,-1.820930936000652,0.606976978666884,1.069435629079748,-0.43355498476206,-0.317940322158844,0.7225916412701,0.375747653460452,0.7225916412701,-0.43355498476206,-0.317940322158844,0.375747653460452,1.416279616889396,0.49136231606366804,1.185050291682964,1.647508942095828,0.375747653460452,-0.5491696473652761,-0.664784309968492,1.7631236046990442,-0.780398972571708,-2.3990042490167323,-0.317940322158844,-1.474086948191004,-0.664784309968492,0.953820966476532,1.647508942095828,0.49136231606366804,0.49136231606366804,0.49136231606366804,-1.242857622984572,-0.43355498476206,-0.317940322158844,0.8382063038733161,-0.780398972571708,0.7225916412701,0.49136231606366804,-2.1677749238103,-0.780398972571708,-0.202325659555628,0.953820966476532,0.260132990857236,0.260132990857236,0.606976978666884,1.3006649542861801,1.531894279492612,0.7225916412701,-1.820930936000652,-0.5491696473652761,1.185050291682964,-0.780398972571708,-1.936545598603868,0.7225916412701,0.260132990857236,0.8382063038733161,0.375747653460452,0.028903665650804,0.260132990857236,0.028903665650804,-0.202325659555628,-0.08671099695241201,-0.5491696473652761,1.185050291682964,-0.664784309968492,0.260132990857236,1.069435629079748,0.49136231606366804,-0.5491696473652761,0.953820966476532,1.994352929905476,-0.08671099695241201,0.375747653460452,-2.3990042490167323,0.49136231606366804,-0.202325659555628,-1.242857622984572,1.416279616889396,-0.317940322158844,-0.08671099695241201,2.45681158031834,-1.820930936000652,1.3006649542861801,1.8787382673022601,-0.664784309968492,1.531894279492612,-0.317940322158844,1.3006649542861801,-0.317940322158844,1.185050291682964,0.7225916412701,-1.474086948191004,-0.08671099695241201,-1.0116282977781401,-1.820930936000652,-1.705316273397436,-0.317940322158844,0.49136231606366804,-0.317940322158844,-0.5491696473652761,0.953820966476532,-0.317940322158844,-1.474086948191004,1.185050291682964,0.7225916412701,-0.664784309968492,2.45681158031834,0.49136231606366804,0.606976978666884,-0.780398972571708,-0.317940322158844,-1.820930936000652,0.7225916412701,-0.08671099695241201,-0.317940322158844,-0.43355498476206,-0.5491696473652761,0.260132990857236,1.3006649542861801,-0.43355498476206,-0.08671099695241201,-1.242857622984572,-1.127242960381356,1.416279616889396,0.8382063038733161,-1.242857622984572,1.3006649542861801,-1.242857622984572,-0.202325659555628,0.606976978666884,0.953820966476532,-0.08671099695241201,0.7225916412701,0.49136231606366804,-0.08671099695241201,0.49136231606366804,-1.127242960381356,1.531894279492612,-0.780398972571708,0.606976978666884,0.14451832825402,-0.08671099695241201,-0.664784309968492,-2.3990042490167323,-1.242857622984572,0.260132990857236,-1.358472285587788,-0.202325659555628,-0.896013635174924,-0.664784309968492,-0.896013635174924,0.260132990857236,0.260132990857236,0.028903665650804,-0.317940322158844,-0.08671099695241201,-0.317940322158844,-1.0116282977781401,-1.0116282977781401,-2.052160261207084,-2.3990042490167323,1.185050291682964,-0.08671099695241201,0.14451832825402,0.606976978666884,-1.358472285587788,0.49136231606366804,0.028903665650804,1.8787382673022601,-0.317940322158844,0.953820966476532,0.375747653460452,2.688040905524772,-1.0116282977781401,1.185050291682964,-0.664784309968492,0.7225916412701,1.994352929905476,-0.896013635174924,-1.936545598603868,-1.0116282977781401,-0.43355498476206,-0.780398972571708,0.260132990857236,0.14451832825402,1.416279616889396,-1.358472285587788,-1.474086948191004,-0.202325659555628,-0.317940322158844,-1.0116282977781401,-0.317940322158844,0.260132990857236,-1.0116282977781401,0.606976978666884,-0.202325659555628,-0.202325659555628,-0.317940322158844,-1.242857622984572,-2.1677749238103,0.028903665650804,1.185050291682964,0.260132990857236,-0.664784309968492,1.647508942095828,-0.202325659555628,1.531894279492612,-0.43355498476206,-0.5491696473652761,0.606976978666884,2.803655568127988,0.606976978666884,-1.474086948191004,1.3006649542861801,0.8382063038733161,-1.820930936000652,-0.5491696473652761,-0.5491696473652761,1.647508942095828,-0.896013635174924,0.49136231606366804,-1.5897016107942201,0.953820966476532,0.375747653460452,0.260132990857236,1.7631236046990442,-1.0116282977781401,0.7225916412701,-0.202325659555628,0.260132990857236,-2.1677749238103,0.375747653460452,-0.317940322158844,-1.936545598603868,1.185050291682964,-1.358472285587788,1.994352929905476,-0.08671099695241201,0.49136231606366804,0.953820966476532,1.416279616889396,1.7631236046990442,0.260132990857236,-0.896013635174924,-0.5491696473652761,-1.474086948191004,0.375747653460452,-1.474086948191004,0.8382063038733161,-0.896013635174924,0.953820966476532,1.7631236046990442,-1.705316273397436,0.49136231606366804,-0.5491696473652761,0.375747653460452,0.8382063038733161,1.185050291682964,-1.127242960381356,-0.08671099695241201,0.606976978666884,-1.358472285587788,0.375747653460452,0.606976978666884,-1.0116282977781401,0.028903665650804,0.8382063038733161,0.375747653460452,1.3006649542861801,1.185050291682964,-0.08671099695241201,1.3006649542861801,-0.43355498476206,-0.780398972571708,0.375747653460452,0.606976978666884,1.185050291682964,-1.474086948191004,-0.5491696473652761,0.375747653460452,-1.5897016107942201,-0.317940322158844,-1.242857622984572,-1.0116282977781401,0.028903665650804,-0.08671099695241201,-0.896013635174924,0.028903665650804,1.647508942095828,0.606976978666884,-1.705316273397436,-0.780398972571708,0.260132990857236,-1.0116282977781401,-1.358472285587788,0.606976978666884,-0.664784309968492,0.8382063038733161,2.109967592508692,-1.242857622984572,-0.896013635174924,-0.08671099695241201,0.028903665650804,0.953820966476532,-1.5897016107942201,-0.664784309968492,-0.08671099695241201,0.49136231606366804,0.028903665650804,-1.820930936000652,0.8382063038733161,0.14451832825402,0.606976978666884,-0.664784309968492,1.3006649542861801,0.14451832825402,-1.0116282977781401,-2.052160261207084,0.028903665650804,0.606976978666884,-0.08671099695241201,0.14451832825402,-1.242857622984572,-1.127242960381356,0.8382063038733161,-0.5491696473652761,1.185050291682964,-0.08671099695241201,2.225582255111908,-0.202325659555628,-0.780398972571708,-1.242857622984572,-0.664784309968492,0.49136231606366804,-0.08671099695241201,-0.202325659555628,-1.358472285587788,0.8382063038733161,0.606976978666884,-2.052160261207084,0.14451832825402,0.7225916412701,1.531894279492612,-0.780398972571708,-1.127242960381356,-1.0116282977781401,-0.202325659555628,-0.664784309968492,-1.242857622984572,0.49136231606366804,0.14451832825402,0.375747653460452,0.375747653460452,1.647508942095828,-0.896013635174924,0.49136231606366804,0.953820966476532,-0.896013635174924,-1.5897016107942201,-0.202325659555628,-2.3990042490167323,-0.896013635174924,0.260132990857236,-1.936545598603868,0.953820966476532,-0.202325659555628,-0.08671099695241201,-1.705316273397436,0.028903665650804,-0.317940322158844,2.225582255111908,-1.474086948191004,-0.896013635174924,1.647508942095828,-1.127242960381356,-0.896013635174924,-3.092692224636028,0.14451832825402,-0.08671099695241201,0.606976978666884,0.260132990857236,0.14451832825402,0.375747653460452,-0.43355498476206,2.109967592508692,-0.202325659555628,-0.896013635174924,-1.127242960381356,-1.5897016107942201,1.185050291682964,-3.092692224636028,0.260132990857236,3.7285728689537163,0.7225916412701,-0.08671099695241201,-1.936545598603868,1.416279616889396,0.375747653460452,1.069435629079748,0.14451832825402,-1.242857622984572,0.606976978666884,0.14451832825402,1.185050291682964,-1.242857622984572,-0.780398972571708,-1.474086948191004,0.14451832825402,-0.896013635174924,-0.896013635174924,1.185050291682964,-0.5491696473652761,-1.127242960381356,-0.202325659555628,0.14451832825402,-1.127242960381356,-0.317940322158844,-1.936545598603868,0.14451832825402,0.8382063038733161,-1.242857622984572,-1.127242960381356,1.416279616889396,0.028903665650804,-0.5491696473652761,-0.780398972571708,0.8382063038733161,-0.896013635174924,2.45681158031834,1.8787382673022601,-1.5897016107942201,-1.242857622984572,0.7225916412701,-0.780398972571708,-1.127242960381356,0.375747653460452,-1.474086948191004,-0.5491696473652761,-0.202325659555628,0.14451832825402,-1.474086948191004,3.1504995559376363,0.606976978666884,-0.5491696473652761,-0.664784309968492,-0.317940322158844,-0.317940322158844,-0.5491696473652761,0.375747653460452,0.7225916412701,-0.43355498476206,1.7631236046990442,0.028903665650804,-0.43355498476206,0.7225916412701,0.260132990857236,-0.43355498476206,1.069435629079748,-0.317940322158844,1.185050291682964,-0.202325659555628,0.8382063038733161,-0.5491696473652761,-0.896013635174924,1.069435629079748,-0.5491696473652761,0.953820966476532,1.531894279492612,-2.1677749238103,-0.896013635174924,0.260132990857236,-0.5491696473652761,-1.0116282977781401,1.994352929905476,0.606976978666884,1.3006649542861801,1.416279616889396,0.028903665650804,0.028903665650804,-2.052160261207084,-1.0116282977781401,1.531894279492612,0.375747653460452,0.375747653460452,-2.3990042490167323,-0.896013635174924,-0.43355498476206,-0.202325659555628,-0.317940322158844,0.375747653460452,-1.242857622984572,0.260132990857236,-1.0116282977781401,-1.5897016107942201,0.028903665650804,-0.202325659555628,0.49136231606366804,-0.08671099695241201,1.069435629079748,0.260132990857236,-0.08671099695241201,1.185050291682964,1.8787382673022601,-1.474086948191004,0.8382063038733161,-1.0116282977781401,-0.202325659555628,0.606976978666884,-0.317940322158844,1.416279616889396,-0.664784309968492,-0.317940322158844,0.606976978666884,0.028903665650804,0.8382063038733161,-0.664784309968492,0.7225916412701,-0.780398972571708,-0.08671099695241201,-0.896013635174924,-1.358472285587788,-0.5491696473652761,0.14451832825402,-2.3990042490167323,0.8382063038733161,0.606976978666884,1.416279616889396,-1.242857622984572,0.49136231606366804,-0.664784309968492,2.109967592508692,0.14451832825402,-0.664784309968492,-1.0116282977781401,1.416279616889396,1.416279616889396,-1.705316273397436,0.606976978666884,1.185050291682964,-1.5897016107942201,-0.202325659555628,1.647508942095828,0.375747653460452,-1.0116282977781401,-0.5491696473652761,1.416279616889396,-0.08671099695241201,-1.127242960381356,-1.0116282977781401,-1.474086948191004,0.49136231606366804,2.225582255111908,0.7225916412701,1.185050291682964,2.225582255111908,0.028903665650804,0.606976978666884,-0.202325659555628,-1.0116282977781401,0.8382063038733161,0.375747653460452,-0.202325659555628,1.069435629079748,0.8382063038733161,-2.052160261207084,-0.43355498476206,0.260132990857236,2.109967592508692,1.8787382673022601,-0.664784309968492,2.919270230731204,0.260132990857236,-0.202325659555628,0.14451832825402,-0.202325659555628,-0.780398972571708,-0.43355498476206,1.416279616889396,1.994352929905476,-0.202325659555628,-0.317940322158844,-0.08671099695241201,0.8382063038733161,1.416279616889396,-0.896013635174924,-1.242857622984572,2.5724262429215563,-2.1677749238103,0.375747653460452,0.375747653460452,1.647508942095828,0.606976978666884,0.49136231606366804,0.028903665650804,0.49136231606366804,0.7225916412701,0.375747653460452,-2.1677749238103,0.7225916412701,0.028903665650804,0.8382063038733161,-1.242857622984572,1.416279616889396,-0.5491696473652761,-0.317940322158844,-1.5897016107942201,-1.5897016107942201,-2.630233574223164,-1.5897016107942201,-0.664784309968492,1.069435629079748,0.028903665650804,0.606976978666884,-0.780398972571708,1.3006649542861801,0.028903665650804,1.069435629079748,-1.358472285587788,-0.43355498476206,-0.664784309968492,1.185050291682964,-0.780398972571708,-0.780398972571708,-0.317940322158844,-0.664784309968492,-1.0116282977781401,1.069435629079748,3.266114218540852,0.8382063038733161,-0.202325659555628,-1.358472285587788,-1.936545598603868,-1.127242960381356,-0.317940322158844,-1.358472285587788,1.8787382673022601,-0.08671099695241201,2.803655568127988,-0.664784309968492,-1.936545598603868,-1.936545598603868,0.260132990857236,-2.514618911619948,-0.780398972571708,-1.936545598603868,1.185050291682964,-1.705316273397436,2.225582255111908,-0.317940322158844,-1.127242960381356,1.531894279492612,0.260132990857236,-0.5491696473652761,0.953820966476532,-1.820930936000652,1.3006649542861801,0.260132990857236,0.14451832825402,0.49136231606366804,1.185050291682964,0.14451832825402,-0.08671099695241201,-1.127242960381356,-0.664784309968492,-0.317940322158844,0.606976978666884,1.3006649542861801,-0.5491696473652761,0.8382063038733161,1.185050291682964,-0.43355498476206,-1.705316273397436,0.606976978666884,1.647508942095828,1.994352929905476,0.49136231606366804,0.14451832825402,-0.664784309968492,0.375747653460452,-0.317940322158844,-1.358472285587788,0.953820966476532,1.994352929905476,1.185050291682964,1.185050291682964,1.069435629079748,-0.08671099695241201,-2.74584823682638,-2.1677749238103,-1.242857622984572,-0.317940322158844,-0.317940322158844,-0.43355498476206,0.375747653460452,0.14451832825402,-0.317940322158844,-0.664784309968492,1.185050291682964,1.416279616889396,0.953820966476532,2.225582255111908,0.7225916412701,-0.664784309968492,0.606976978666884,0.49136231606366804,1.069435629079748,0.49136231606366804,-0.08671099695241201,-1.5897016107942201,-0.896013635174924,0.375747653460452,-0.896013635174924,-0.43355498476206,0.953820966476532,1.8787382673022601,0.953820966476532,-1.0116282977781401,-0.08671099695241201,-0.08671099695241201,0.375747653460452,1.416279616889396,1.994352929905476,0.028903665650804,1.416279616889396,1.8787382673022601,-2.3990042490167323,1.994352929905476,1.531894279492612,-0.664784309968492,2.225582255111908,0.953820966476532,-1.0116282977781401,0.49136231606366804,0.028903665650804,0.260132990857236,0.260132990857236,-1.358472285587788,1.7631236046990442,1.3006649542861801,0.606976978666884,-1.0116282977781401,1.069435629079748,-2.283389586413516,-1.705316273397436,1.3006649542861801,1.647508942095828,0.375747653460452,0.7225916412701,-0.664784309968492,0.14451832825402,-0.664784309968492,0.953820966476532,-0.664784309968492,-0.43355498476206,-2.1677749238103,1.069435629079748,-0.896013635174924,2.225582255111908,1.3006649542861801,1.994352929905476,1.3006649542861801,-0.317940322158844,-1.358472285587788,2.225582255111908,-0.780398972571708,0.606976978666884,-2.3990042490167323,3.381728881144068,0.028903665650804,-0.08671099695241201,-0.317940322158844,1.647508942095828,0.260132990857236,1.994352929905476,-1.705316273397436,-0.896013635174924,-1.242857622984572,0.028903665650804,0.49136231606366804,-0.08671099695241201,0.606976978666884,-1.5897016107942201,-2.052160261207084,1.185050291682964,-1.358472285587788,1.7631236046990442,-1.474086948191004,0.028903665650804,-1.0116282977781401,-1.0116282977781401,-1.474086948191004,0.375747653460452,0.375747653460452,1.531894279492612,1.069435629079748,0.49136231606366804,0.375747653460452,1.185050291682964,-1.5897016107942201,0.14451832825402,1.069435629079748,-1.0116282977781401,-0.896013635174924,-0.780398972571708,-0.780398972571708,-1.5897016107942201,1.3006649542861801,-0.08671099695241201,0.375747653460452,0.375747653460452,0.028903665650804,1.7631236046990442,0.14451832825402,-0.43355498476206,0.028903665650804,-1.0116282977781401,-0.202325659555628,-0.43355498476206,-0.5491696473652761,-0.780398972571708,-0.08671099695241201,-1.358472285587788,1.8787382673022601,0.8382063038733161,0.028903665650804,-0.896013635174924,0.375747653460452,-0.5491696473652761,0.49136231606366804,0.7225916412701,-0.780398972571708,1.069435629079748,0.260132990857236,-1.705316273397436],"naturalSummary":{"all_pair_z_quantiles":{"median":0.028903665650804,"q05":-1.820930936000652,"q95":1.8787382673022601,"q99":2.45681158031834},"calibration_rows":1000,"distinct_pair_z_quantiles":{"median":-0.059391387091649865,"q05":-1.5701857325533193,"q95":1.6135685927792485,"q99":2.1359736919407366},"empirical_resolution":0.001,"maximum_all_pair_dataset_row_index":1383,"maximum_all_pair_selection_rank":558,"maximum_all_pair_z":3.7285728689537163,"paired_test_rows":24,"positive_all_pair_fraction":0.004,"positive_all_pair_rows":4,"positive_distinct_pair_fraction":0.001,"positive_distinct_pair_rows":1,"rejection_counts":{"code_dump":0,"duplicate_text":0,"low_letter_fraction":0,"obvious_list":4,"too_short":1451},"source_rows_scanned":2479},"families":{"watermarked_correct":{"g":58,"t":159,"z":3.3424403894180994},"control_correct":{"g":47,"t":159,"z":1.3278187848373273},"natural_correct":{"g":43,"t":159,"z":0.5952291104443191},"watermarked_comparison":{"g":29,"t":159,"z":-1.9688347499312093}},"prefixSummary":{"160":{"comparisons":{"versus_comparison_key":{"bootstrap_replicates":10000,"bootstrap_seed":11177272409065148656,"interval_high":2.9826865314572473,"interval_low":1.9884576876381648,"mean_difference":2.47685080390017,"row_differences":[5.311275139349309,2.564063860375528,4.5786854649563,2.7472112789737806,1.4651793487860163,2.74721127897378,0.91573709299126,2.3809164417772766,1.465179348786016,3.113506116170284,1.098884511589512,2.564063860375528,2.197769023179024,2.1977690231790246,0.5494422557947561,2.9303586975720326,2.0146216045807726,0.9157370929912602,3.6629483719650406,3.479800953366788,3.1135061161702846]},"versus_control":{"bootstrap_replicates":10000,"bootstrap_seed":10268297056902078385,"interval_high":2.939080003219568,"interval_low":2.1018346610561305,"mean_difference":2.5204573321378496,"row_differences":[2.014621604580772,2.9303586975720326,4.5786854649563,3.1135061161702846,2.1977690231790246,3.113506116170284,2.7472112789737806,1.4651793487860163,1.8314741859825203,2.380916441777276,1.83147418598252,3.4798009533667886,3.2966535347685366,2.3809164417772766,1.8314741859825203,2.74721127897378,2.1977690231790246,0.366294837196504,1.0988845115895123,4.395538046358048,2.9303586975720326]},"versus_natural":{"bootstrap_replicates":10000,"bootstrap_seed":12392161577569246707,"interval_high":2.869309558039282,"interval_low":1.9274085481054142,"mean_difference":2.4070803587198837,"row_differences":[2.74721127897378,2.564063860375528,3.66294837196504,2.014621604580772,1.6483267673842683,4.212390627759797,2.1977690231790246,2.1977690231790246,2.9303586975720326,4.212390627759796,2.197769023179024,1.465179348786016,3.8460957905632926,-0.183147418598252,0.9157370929912602,2.9303586975720326,2.1977690231790246,1.2820319301877643,1.6483267673842683,3.846095790563292,2.014621604580772]}},"complete_rows":21,"cutoff_counts":{"control_correct":0,"natural_correct":0,"watermarked_comparison":0,"watermarked_correct":5}},"200":{"comparisons":{"versus_comparison_key":{"bootstrap_replicates":10000,"bootstrap_seed":11495026345131566726,"interval_high":3.00454351564539,"interval_low":2.0704386405889705,"mean_difference":2.542306051699945,"row_differences":[2.128218323582151,4.09272754535029,2.1282183235821512,1.6370910181401161,2.4556365272101743,1.9645092217681395,2.7830547308381974,2.7830547308381974,1.1459637126980813,3.929018443536279,2.7830547308381974,1.9645092217681392,0.8185455090700581,3.4378911380942436,1.4733819163261046,4.09272754535029,3.6016002399082554]},"versus_control":{"bootstrap_replicates":10000,"bootstrap_seed":1387159705833617361,"interval_high":3.1297328287972808,"interval_low":1.9163594859404887,"mean_difference":2.513416210203355,"row_differences":[2.2919274253961626,5.4024003598623835,2.2919274253961626,2.946763832652209,2.6193456290241857,3.437891138094244,1.309672814512093,0.9822546108840693,2.4556365272101743,4.256436647164302,3.929018443536279,1.3096728145120928,1.6370910181401161,2.6193456290241857,0.0,1.8008001199541277,3.437891138094244]},"versus_natural":{"bootstrap_replicates":10000,"bootstrap_seed":5614332280678119984,"interval_high":3.3512216136044732,"interval_low":1.945249327437079,"mean_difference":2.6963852063484266,"row_differences":[2.455636527210174,4.747563952606337,2.2919274253961626,0.9822546108840697,3.929018443536279,3.2741820362802323,2.2919274253961626,3.9290184435362785,2.619345629024186,3.2741820362802323,5.4024003598623835,-1.4733819163261046,1.6370910181401161,2.6193456290241857,2.2919274253961626,2.2919274253961626,3.2741820362802323]}},"complete_rows":17,"cutoff_counts":{"control_correct":0,"natural_correct":1,"watermarked_comparison":0,"watermarked_correct":4}},"40":{"comparisons":{"versus_comparison_key":{"bootstrap_replicates":10000,"bootstrap_seed":1289824249520679944,"interval_high":1.4637921844832433,"interval_low":0.47765850230505835,"mean_difference":0.9707253433941508,"row_differences":[2.218800784900916,0.0,1.849000654084097,2.218800784900916,3.6980013081681937,0.0,0.7396002616336388,-0.7396002616336389,0.7396002616336388,1.4792005232672776,-0.3698001308168195,2.588600915717736,2.588600915717736,0.0,-1.8490006540840969,-0.3698001308168193,0.7396002616336388,0.7396002616336388,1.1094003924504583,0.36980013081681945,0.7396002616336388,0.7396002616336388,2.218800784900916,1.8490006540840969]},"versus_control":{"bootstrap_replicates":10000,"bootstrap_seed":1563185135505901071,"interval_high":1.633283911107619,"interval_low":0.6317418901453998,"mean_difference":1.1248087312344923,"row_differences":[1.4792005232672776,0.0,1.4792005232672776,0.3698001308168194,2.588600915717736,-0.3698001308168195,1.4792005232672776,-0.3698001308168194,0.0,2.958401046534555,0.3698001308168194,2.218800784900916,2.588600915717736,2.218800784900916,-0.7396002616336388,1.4792005232672776,1.4792005232672776,0.7396002616336388,2.2188007849009166,0.36980013081681945,-0.3698001308168195,-1.1094003924504583,2.958401046534555,2.958401046534555]},"versus_natural":{"bootstrap_replicates":10000,"bootstrap_seed":14316958801509828585,"interval_high":1.6949172662437555,"interval_low":0.49306684108909254,"mean_difference":1.0631753760983558,"row_differences":[0.0,0.0,0.7396002616336389,1.1094003924504583,5.91680209306911,0.3698001308168194,2.588600915717736,-0.3698001308168194,0.36980013081681945,1.8490006540840969,0.3698001308168194,3.6980013081681937,1.4792005232672776,1.109400392450458,-1.109400392450458,1.4792005232672776,-1.109400392450458,-0.7396002616336388,1.4792005232672776,0.36980013081681945,1.8490006540840969,1.1094003924504583,1.109400392450458,1.8490006540840969]}},"complete_rows":24,"cutoff_counts":{"control_correct":0,"natural_correct":0,"watermarked_comparison":0,"watermarked_correct":1}},"400":{"comparisons":{},"complete_rows":0,"cutoff_counts":{"control_correct":0,"natural_correct":0,"watermarked_comparison":0,"watermarked_correct":0}},"80":{"comparisons":{"versus_comparison_key":{"bootstrap_replicates":10000,"bootstrap_seed":5960860836801058849,"interval_high":2.479191412728558,"interval_low":1.6130983427797168,"mean_difference":2.0461448777541373,"row_differences":[4.41707465673909,0.5196558419693047,3.6375908937851333,3.3777629728004808,3.8974188147697855,2.3384512888618714,1.558967525907914,0.25982792098465235,1.0393116839386096,2.5982792098465235,3.1179350518158286,2.0786233678772192,2.0786233678772192,1.2991396049232617,0.5196558419693047,1.2991396049232617,1.8187954468925664,1.558967525907914,2.078623367877219,1.2991396049232617,1.0393116839386094,2.598279209846524,2.858107130831176,1.8187954468925667]},"versus_control":{"bootstrap_replicates":10000,"bootstrap_seed":6027168889947763491,"interval_high":2.327625125487511,"interval_low":1.342444258420704,"mean_difference":1.8296216102669272,"row_differences":[1.5589675259079143,0.0,3.3777629728004808,3.897418814769786,3.8974188147697855,1.0393116839386094,2.078623367877219,0.25982792098465235,0.7794837629539573,2.078623367877219,1.8187954468925667,2.3384512888618714,1.299139604923262,3.6375908937851333,0.779483762953957,2.598279209846524,1.2991396049232617,1.558967525907914,2.078623367877219,1.8187954468925667,-0.779483762953957,0.5196558419693047,3.8974188147697855,2.0786233678772192]},"versus_natural":{"bootstrap_replicates":10000,"bootstrap_seed":9625633399849496326,"interval_high":2.1977111649951846,"interval_low":1.3099657682976222,"mean_difference":1.7538384666464035,"row_differences":[1.0393116839386096,0.779483762953957,2.598279209846524,2.3384512888618714,4.41707465673909,1.0393116839386094,2.858107130831176,0.779483762953957,0.2598279209846524,2.858107130831176,3.3777629728004808,3.1179350518158286,1.299139604923262,2.5982792098465235,1.0393116839386094,2.078623367877219,0.25982792098465235,0.0,1.2991396049232617,1.8187954468925667,0.779483762953957,0.779483762953957,2.858107130831176,1.8187954468925667]}},"complete_rows":24,"cutoff_counts":{"control_correct":0,"natural_correct":0,"watermarked_comparison":0,"watermarked_correct":3}}},"selectionRanks":[1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023],"attacks":[{"rank":1000,"values":{"normalization":0.0,"homoglyph_1":0.2598279209846521,"homoglyph_5":-2.3384512888618714,"deletion_10":-0.7794837629539573,"deletion_30":-1.8187954468925667,"mixing_25":-1.299139604923262,"mixing_50":-2.3384512888618714,"paraphrase":-0.5196558419693049}},{"rank":1001,"values":{"normalization":0.0,"homoglyph_1":-0.25982792098465235,"homoglyph_5":0.25982792098465235,"deletion_10":0.5196558419693049,"deletion_30":0.0,"mixing_25":0.0,"mixing_50":-0.25982792098465235,"paraphrase":-1.2991396049232617}},{"rank":1002,"values":{"normalization":0.0,"homoglyph_1":0.0,"homoglyph_5":0.0,"deletion_10":0.2598279209846521,"deletion_30":-0.5196558419693047,"mixing_25":-0.25982792098465257,"mixing_50":-0.7794837629539573,"paraphrase":-1.299139604923262}},{"rank":1003,"values":{"normalization":0.0,"homoglyph_1":0.0,"homoglyph_5":-0.5196558419693047,"deletion_10":-0.25982792098465257,"deletion_30":-0.7794837629539573,"mixing_25":-0.5196558419693047,"mixing_50":-1.299139604923262,"paraphrase":-3.6375908937851333}},{"rank":1004,"values":{"normalization":0.0,"homoglyph_1":-0.5196558419693047,"homoglyph_5":-2.078623367877219,"deletion_10":-1.8187954468925662,"deletion_30":-3.637590893785133,"mixing_25":-1.558967525907914,"mixing_50":-1.8187954468925662,"paraphrase":-1.2991396049232615}},{"rank":1005,"values":{"normalization":0.0,"homoglyph_1":0.25982792098465235,"homoglyph_5":-0.779483762953957,"deletion_10":-1.0393116839386094,"deletion_30":-1.558967525907914,"mixing_25":-0.779483762953957,"mixing_50":-2.3384512888618714,"paraphrase":-1.8187954468925667}},{"rank":1006,"values":{"normalization":0.0,"homoglyph_1":-0.25982792098465235,"homoglyph_5":-0.779483762953957,"deletion_10":0.0,"deletion_30":0.0,"mixing_25":-0.779483762953957,"mixing_50":-1.558967525907914,"paraphrase":-0.5196558419693047}},{"rank":1007,"values":{"normalization":0.0,"homoglyph_1":0.0,"homoglyph_5":-1.0393116839386094,"deletion_10":0.25982792098465235,"deletion_30":-1.0393116839386094,"mixing_25":-1.2991396049232617,"mixing_50":-0.5196558419693047,"paraphrase":-1.2991396049232617}},{"rank":1008,"values":{"normalization":0.0,"homoglyph_1":0.25982792098465235,"homoglyph_5":-0.2598279209846524,"deletion_10":0.25982792098465235,"deletion_30":-0.2598279209846524,"mixing_25":0.5196558419693047,"mixing_50":-0.7794837629539573,"paraphrase":-0.5196558419693047}},{"rank":1009,"values":{"normalization":0.0,"homoglyph_1":0.25982792098465257,"homoglyph_5":-0.779483762953957,"deletion_10":-0.779483762953957,"deletion_30":-2.078623367877219,"mixing_25":-1.0393116839386094,"mixing_50":-0.5196558419693047,"paraphrase":-3.3777629728004808}},{"rank":1010,"values":{"normalization":0.0,"homoglyph_1":-0.5196558419693047,"homoglyph_5":-2.598279209846524,"deletion_10":-0.5196558419693047,"deletion_30":0.0,"mixing_25":-1.0393116839386094,"mixing_50":-2.598279209846524,"paraphrase":-2.078623367877219}},{"rank":1011,"values":{"normalization":0.0,"homoglyph_1":0.2598279209846521,"homoglyph_5":-0.25982792098465257,"deletion_10":0.0,"deletion_30":-0.25982792098465257,"mixing_25":0.0,"mixing_50":-1.299139604923262,"paraphrase":-2.858107130831176}}],"spineEdit":{"rank":1000,"source":"Wicomico County's government is working exactly as it was intended \u2014 the person occupying the office embodies the spirit and priorities of that specific role, whether it be the measured formality of a traditional ceremony or the more dynamic approach of a modern administrative function. In the case of the County Executive, this manifests in a careful balance. There is a deep respect for established procedures, ensuring that decisions are made with due deliberation and consideration for the long-term welfare of the community. However, this isn't a static adherence to outdated rules; rather, it is an active interpretation of those rules through the lens of contemporary challenges.\n\nFor instance, when addressing issues related to infrastructure development, the County Executive doesn't simply rubber-stamp proposals. They engage in a process that blends the historical context of the county\u2014understanding the legacy of its development\u2014with forward-looking planning, incorporating considerations for environmental sustainability and the economic vitality of the region. This dual approach allows the government to honor its roots while simultaneously steering the county toward necessary modernization. Similarly, in the realm of social services, the executive\u2019s leadership is characterized by a commitment to both compassion and fiscal responsibility. They champion programs designed to alleviate hardship, but they simultaneously insist on efficient resource allocation, ensuring that aid is targeted effectively and that taxpayer dollars are used with maximum impact.\n\nThe effectiveness of the county administration, therefore, isn't measured by the extravagance of its events or the rigidity of its structure, but by the tangible outcomes felt by the residents. When the County Executive acts with integrity, transparency, and a clear vision, the machinery of local governance functions smoothly. Citizens see that their concerns are being heard, that decisions are being made thoughtfully, and that the government is serving as a responsive steward of the community's shared resources and aspirations. This alignment between the officeholder's character and the execution of their duties is what ultimately defines the success of the Wicomico County government.","deletion":"Wicomico County's government is exactly as it was intended the person occupying the office embodies the spirit and priorities of that specific whether it be measured formality of a traditional ceremony or the more dynamic approach of a modern administrative In the case of the County Executive, this manifests in a careful There is a deep respect for established procedures, ensuring that decisions are made with due deliberation and consideration for the welfare of the community. However, this isn't a static adherence outdated rules; rather, it is an active interpretation of rules through the lens of contemporary challenges. For instance, when addressing issues related to development, the County Executive doesn't simply rubber-stamp proposals. They engage in a process that the context of the county\u2014understanding the legacy of its development\u2014with forward-looking planning, incorporating considerations for environmental sustainability and the economic vitality of the region. dual approach allows the government to honor its roots while simultaneously steering the county toward necessary modernization. Similarly, in the realm of social executive\u2019s is characterized by commitment to compassion and fiscal responsibility. champion programs designed to alleviate hardship, but they simultaneously insist on resource allocation, ensuring that aid is targeted effectively and that taxpayer dollars are used with maximum impact. The effectiveness the county administration, therefore, isn't measured by the extravagance its events the rigidity of structure, but by the tangible outcomes by the residents. When the acts with integrity, transparency, and a clear the machinery local governance functions smoothly. Citizens see that their concerns are being heard, that decisions are being made thoughtfully, and that the government is serving as a responsive steward the community's shared resources and aspirations. This alignment the officeholder's character and the execution of their duties is ultimately defines the success of Wicomico County government.","paraphrase":"The governance of Wicomico County is operating according to its original design; the individual in office reflects the essence and goals of their specific position, whether that involves the measured formality of a traditional event or the more energetic style of modern administration. For the County Executive, this involves a delicate equilibrium. There is a profound regard for established protocols, ensuring decisions are reached after thorough thought and with regard for the community's future well-being. Nevertheless, this is not a rigid sticking to old regulations; instead, it is an active interpretation of those rules through the perspective of current difficulties.\n\nFor example, when tackling infrastructure projects, the County Executive does not merely approve plans. They engage in a method that merges the county's history\u2014comprehending its development background\u2014with future planning, including factors like ecological sustainability and the region's economic strength. This combined strategy permits the government to respect its origins while simultaneously guiding the county toward essential updates. Likewise, in social services, the executive\u2019s leadership is marked by a dedication to both empathy and financial prudence. They promote initiatives intended to ease suffering while concurrently demanding efficient use of resources, ensuring assistance is precisely aimed and that taxpayer money yields the greatest benefit.\n\nConsequently, the success of the county administration is not gauged by the lavishness of its functions or the inflexibility of its structure, but by the real results residents experience. When the County Executive acts with honesty, openness, and a distinct outlook, the system of local governance operates seamlessly. Residents observe that their concerns are being acknowledged, that choices are being made thoughtfully, and that the government is acting as a responsive caretaker of the community's shared assets and hopes. This congruence between the officeholder's character and the execution of their responsibilities is what ultimately determines the success of the Wicomico County government.","scores":{"source":{"distinct_pairs":{"exact_upper_tail":0.02104053459803662,"green_fraction":0.358974358974359,"num_green_tokens":28,"num_tokens_scored":78,"prediction":false,"z_score":2.2226495315660855,"z_threshold":3.0},"exact_upper_tail":0.02499263055276505,"green_fraction":0.35443037974683544,"num_green_tokens":28,"num_tokens_scored":79,"prediction":false,"z_score":2.143580348123382,"z_threshold":3.0},"deletion":{"copied_prefix":80,"exact_upper_tail":0.11029681489925636,"green_fraction":0.31645569620253167,"num_green_tokens":25,"num_tokens_scored":79,"prediction":false,"status":"scored","z_score":1.364096585169425,"z_threshold":3.0},"paraphrase":{"copied_prefix":80,"exact_upper_tail":0.07053350984531419,"green_fraction":0.3291139240506329,"num_green_tokens":26,"num_tokens_scored":79,"prediction":false,"status":"scored","z_score":1.6239245061540772,"z_threshold":3.0}}},"attackSummary":{"deletion_10":{"automatic_preservation_passes":null,"cutoff_crossings":0,"manual_passes":null,"mean_length_ratio":0.8979950248738146,"mean_z_change":-0.32478490123081544,"meaning_preservation_passes":null,"rows":12,"scored_rows":12},"deletion_30":{"automatic_preservation_passes":null,"cutoff_crossings":1,"manual_passes":null,"mean_length_ratio":0.7021141459226383,"mean_z_change":-0.9960070304411675,"meaning_preservation_passes":null,"rows":12,"scored_rows":12},"homoglyph_1":{"automatic_preservation_passes":null,"cutoff_crossings":1,"manual_passes":null,"mean_length_ratio":1.04482028670058,"mean_z_change":-0.021652326748721046,"meaning_preservation_passes":null,"rows":12,"scored_rows":12},"homoglyph_5":{"automatic_preservation_passes":null,"cutoff_crossings":0,"manual_passes":null,"mean_length_ratio":1.2182750457027853,"mean_z_change":-0.9310500501950044,"meaning_preservation_passes":null,"rows":12,"scored_rows":12},"mixing_25":{"automatic_preservation_passes":null,"cutoff_crossings":0,"manual_passes":null,"mean_length_ratio":1.0012172571744682,"mean_z_change":-0.671222129210352,"meaning_preservation_passes":null,"rows":12,"scored_rows":12},"mixing_50":{"automatic_preservation_passes":null,"cutoff_crossings":0,"manual_passes":null,"mean_length_ratio":1.0087870850805587,"mean_z_change":-1.342444258420704,"meaning_preservation_passes":null,"rows":12,"scored_rows":12},"normalization":{"automatic_preservation_passes":null,"cutoff_crossings":2,"manual_passes":null,"mean_length_ratio":0.9986028011460459,"mean_z_change":0.0,"meaning_preservation_passes":null,"rows":12,"scored_rows":12},"paraphrase":{"automatic_preservation_passes":12,"cutoff_crossings":0,"manual_passes":10,"mean_length_ratio":0.9635609383049056,"mean_z_change":-1.7105338131489614,"meaning_preservation_passes":10,"rows":12,"scored_rows":12}},"bias":[{"rank":1000,"values":{"1":-1.2341826246770988,"2":2.143580348123382,"3":2.663236190092687}},{"rank":1001,"values":{"1":1.6239245061540772,"2":1.6239245061540772,"3":2.663236190092687}},{"rank":1002,"values":{"1":0.32478490123081544,"2":2.663236190092687,"3":3.1828920320619916}},{"rank":1003,"values":{"1":-0.714526782707794,"2":2.663236190092687,"3":3.9623757950159484}},{"rank":1004,"values":{"1":0.5846128222154678,"2":3.9623757950159484,"3":1.1042686641847725}},{"rank":1005,"values":{"1":0.32478490123081544,"2":1.1042686641847725,"3":1.8837524271387296}},{"rank":1006,"values":{"1":0.32478490123081544,"2":1.6239245061540772,"3":0.8444407432001202}},{"rank":1007,"values":{"1":1.1042686641847725,"2":1.6239245061540772,"3":3.4427199530466437}}],"biasSummary":{"1":{"cutoff_crossings":0,"mean_copied_tokens":232.5,"mean_nll":0.5004209280014038,"mean_repeated_pair_fraction":0.037293381421397764,"mean_z":0.29230641110773387,"rows":8,"scored_rows":8},"2":{"cutoff_crossings":1,"mean_copied_tokens":265.75,"mean_nll":0.5414637662470341,"mean_repeated_pair_fraction":0.047102541449407447,"mean_z":2.1760588382464636,"rows":8,"scored_rows":8},"3":{"cutoff_crossings":3,"mean_copied_tokens":271.75,"mean_nll":0.5783414840698242,"mean_repeated_pair_fraction":0.04828136706094677,"mean_z":2.4683652493541977,"rows":8,"scored_rows":8}},"smokeTexts":[{"id":"continuity","cText":"saw the entire valley bathed in a soft, ethereal glow.","wText":"saw the entire valley bathed in the soft, ethereal glow of the rising sun, a breathtaking spectacle that made him pause in his ascent."},{"id":"notebook","cText":"the process of careful recording was crucial for understanding the underlying patterns and making subsequent deductions.","wText":"the process of careful recording was crucial for understanding the underlying principles and avoiding costly errors in the subsequent calculations."},{"id":"library","cText":"quickly switched to backup generators, ensuring that patrons could still access books and use the computers for a few crucial hours until the main power was restored.","wText":"quickly switched to backup generators, ensuring that patrons could still access resources and that essential services remained operational throughout the outage."}],"ladder":[{"id":"story-map","cap":200,"cZ":-0.123,"wZ":3.479},{"id":"field-journal","cap":200,"cZ":0.532,"wZ":2.169},{"id":"repair-guide","cap":200,"cZ":0.860,"wZ":2.824},{"id":"festival-history","cap":200,"cZ":1.351,"wZ":3.315},{"id":"coastal-expedition","cap":400,"cZ":-1.012,"wZ":5.614},{"id":"city-water-system","cap":400,"cZ":-0.202,"wZ":2.688},{"id":"archive-mystery","cap":400,"cZ":1.069,"wZ":2.457},{"id":"community-radio","cap":400,"cZ":-0.202,"wZ":6.735},{"id":"generation-ship","cap":800,"cZ":-0.063,"wZ":6.230},{"id":"river-restoration","cap":800,"cZ":1.818,"wZ":8.027},{"id":"mountain-clinic","cap":800,"cZ":1.842,"wZ":7.298},{"id":"lost-language","cap":800,"cZ":0.739,"wZ":6.364}],"sourceCommits":{"lab01":"e99e9e5f9b8bc426d1cc4e13f874854f8c303475","lab02":"f7a1690d28cfb48fc825017891b5d3e82eebdd07","lab03":"2f082b7f63853811881c0f23c2d7022e8e5dbc3b","lab04":"20b4860e0d64ca116b173bc42f971d50eb0fef95","lab05":"09831ba8f960d7070b67b9b5350cdffbae9b4c4d","lab06":"0508f0e084f94a98ac88abd22245b8ec81916b60","lab07":"6b911ce4052794bfb6762859847e5cdcc197c165","lab08":"a42b1b3c65f32ff80bf82a89b6f8888c8b272125"}}</script>

<script is:inline>
(function() {
  var cleanup = null;
  var initializedEvidence = null;

  function initInteractiveSimulation() {
    const evidenceEl = document.getElementById('evidence');
    if (!evidenceEl || evidenceEl === initializedEvidence) return;
    if (cleanup) cleanup();
    initializedEvidence = evidenceEl;

    const cleanupTasks = [];
    const motionAllowed = !window.matchMedia('(prefers-reduced-motion: reduce)').matches;
    function autoplayWhenVisible(element, start, stop) {
      if (!element || !motionAllowed) {
        stop();
        return;
      }
      const update = (visible) => {
        if (visible && !document.hidden) start();
        else stop();
      };
      const observer = new IntersectionObserver((entries) => update(entries[0].isIntersecting), {
        rootMargin: '120px 0px',
      });
      const onVisibilityChange = () => update(element.getBoundingClientRect().bottom >= -120 && element.getBoundingClientRect().top <= window.innerHeight + 120);
      observer.observe(element);
      document.addEventListener('visibilitychange', onVisibilityChange);
      cleanupTasks.push(() => {
        observer.disconnect();
        document.removeEventListener('visibilitychange', onVisibilityChange);
        stop();
      });
    }

    // Token stream auto-pulse for the opening figure.
    var tokenTimer = null;
    var tokenStream = document.getElementById('tokenStream');
    if (tokenStream) {
      var tokenBlocks = tokenStream.querySelectorAll('.token-block');
      var tokenIndex = 0;
      function pulseToken() {
        tokenBlocks.forEach(function(block) { block.classList.remove('active-token'); });
        tokenBlocks[tokenIndex].classList.add('active-token');
        tokenIndex = (tokenIndex + 1) % tokenBlocks.length;
      }
      function stopTokenPulse() {
        if (tokenTimer) clearInterval(tokenTimer);
        tokenTimer = null;
      }
      function startTokenPulse() {
        if (tokenTimer) return;
        pulseToken();
        tokenTimer = setInterval(pulseToken, 900);
      }
      autoplayWhenVisible(tokenStream.closest('figure'), startTokenPulse, stopTokenPulse);
    }

    // Prevent duplicate button generation on repeat navigation
    ['lengthButtons', 'distLengths', 'cutoffButtons', 'familyButtons', 'familyCards', 'contrastButtons', 'attackButtons', 'deltaButtons', 'methodButtons', 'proxyPlots'].forEach(id => {
      const el = document.getElementById(id);
      if (el) el.replaceChildren();
    });

    try {

const DATA=JSON.parse(evidenceEl.textContent);const $=id=>document.getElementById(id),NS='http://www.w3.org/2000/svg';const svg=(tag,a={})=>{const e=document.createElementNS(NS,tag);for(const[k,v]of Object.entries(a))e.setAttribute(k,v);return e};const txt=(root,x,y,s,a={})=>{const e=svg('text',{x,y,fill:'var(--muted)','font-size':'13',...a});e.textContent=s;root.append(e)};
const lengths=[40,80,160,200,400];function rng(seed){return()=>{seed|=0;seed=seed+0x6D2B79F5|0;let t=Math.imul(seed^seed>>>15,1|seed);t=t+Math.imul(t^t>>>7,61|t)^t;return((t^t>>>14)>>>0)/4294967296}}function binomial(n,p,random){let count=0;for(let i=0;i<n;i++)count+=random()<p;return count}function zscore(g,t){return(g-t*.25)/Math.sqrt(t*.25*.75)}function makeFlips(root,n,p,random){root.replaceChildren();let hits=0;for(let i=0;i<n;i++){const hit=random()<p;hits+=hit;const d=document.createElement('i');d.className=hit?'hit':'';d.textContent=hit?'H':'T';root.append(d)}return hits}let flipRound=0;function flipCoins(){flipRound++;const a=makeFlips($('baselineFlips'),40,.25,rng(1123+flipRound*97)),b=makeFlips($('nudgedFlips'),40,.4,rng(8849+flipRound*131));$('baselineCount').innerHTML=`This run: <b>${a} heads</b><span>Long-run average: 10</span>`;$('nudgedCount').innerHTML=`This run: <b>${b} heads</b><span>Long-run average: 16</span>`;$('flipLesson').textContent=a===b?'Tied. 40 flips can hide the difference.':b<a?'Baseline higher. Chance reversed the order.':'Nudged higher this time.'}$('flipAgain').onclick=flipCoins;flipCoins();
if($('calcNext')){let calcStep=0;let calcAutoTimer=null;const calcWords=['Reveal the average','Reveal the excess','Reveal ordinary movement','Reveal the score','All four steps are visible'];function showCalc(all=false){calcStep=all?4:Math.min(4,calcStep+1);document.querySelectorAll('.calc-step').forEach((e,i)=>e.classList.toggle('visible',i<calcStep));$('calcNext').textContent=calcWords[calcStep];$('calcNext').disabled=calcStep===4}function stopCalcAuto(){if(calcAutoTimer){clearInterval(calcAutoTimer);calcAutoTimer=null}}function startCalcAuto(){stopCalcAuto();calcAutoTimer=setInterval(()=>{if(calcStep>=4){stopCalcAuto();return}showCalc()},1500)}$('calcNext').onclick=()=>{stopCalcAuto();showCalc()};$('calcAll').onclick=()=>{stopCalcAuto();showCalc(true)};$('calcReset').onclick=()=>{stopCalcAuto();calcStep=0;document.querySelectorAll('.calc-step').forEach(e=>e.classList.remove('visible'));$('calcNext').disabled=false;$('calcNext').textContent=calcWords[0]};autoplayWhenVisible($('calcNext').closest('figure'),startCalcAuto,stopCalcAuto)}
if($('batchGrid')){let batchRound=0;function drawBatches(){batchRound++;const random=rng(6001+batchRound*401);$('batchGrid').replaceChildren(...Array.from({length:20},()=>{const n=binomial(80,.25,random),e=document.createElement('div');e.innerHTML=`<b>${n}</b><i style="height:${Math.min(100,n/36*100)}%"></i>`;e.title=n+' heads';return e}))}$('batchAgain').onclick=drawBatches;drawBatches()}
let lenAutoTimer=null;let lenAutoIdx=0;for(const n of lengths){const b=document.createElement('button');b.textContent=n;b.onclick=()=>{stopLenAuto();drawLength(n)};$('lengthButtons').append(b)}function drawLength(n){document.querySelectorAll('#lengthButtons button').forEach(b=>b.classList.toggle('active',Number(b.textContent)===n));const base=n*.25,nudge=n*.4,excess=nudge-base,noise=Math.sqrt(n*.25*.75),z=excess/noise;$('lenBase').textContent=base.toFixed(0);$('lenNudge').textContent=nudge.toFixed(0);$('lenExcess').textContent=excess.toFixed(0);$('lenExpectedZ').textContent=z.toFixed(2);$('noiseValue').textContent=noise.toFixed(2);$('signalValue').textContent=excess.toFixed(2);$('noiseBar').style.width=Math.min(100,noise/60*100)+'%';$('signalBar').style.width=Math.min(100,excess/60*100)+'%';$('lengthLesson').textContent=`T = ${n}: excess ${excess.toFixed(0)}, scatter ${noise.toFixed(2)}, z = ${z.toFixed(2)}`}function stopLenAuto(){if(lenAutoTimer){clearInterval(lenAutoTimer);lenAutoTimer=null}}function startLenAuto(){if(lenAutoTimer)return;lenAutoIdx=0;drawLength(lengths[0]);lenAutoTimer=setInterval(()=>{lenAutoIdx++;if(lenAutoIdx>=lengths.length){stopLenAuto();return}drawLength(lengths[lenAutoIdx])},2000)}drawLength(40);autoplayWhenVisible($('coin-length'),startLenAuto,stopLenAuto);
let distLength=80,distCutoff=3;for(const n of [40,80,400]){const b=document.createElement('button');b.textContent=n;b.onclick=()=>{distLength=n;drawDistribution()};$('distLengths').append(b)}for(const [label,cut]of [['Eager 2',2],['Lab 3',3],['Cautious 4.5',4.5]]){const b=document.createElement('button');b.textContent=label;b.onclick=()=>{distCutoff=cut;drawDistribution()};$('cutoffButtons').append(b)}function drawDistribution(){document.querySelectorAll('#distLengths button').forEach(b=>b.classList.toggle('active',Number(b.textContent)===distLength));document.querySelectorAll('#cutoffButtons button').forEach((b,i)=>b.classList.toggle('active',[2,3,4.5][i]===distCutoff));const randomA=rng(9101+distLength),randomB=rng(19103+distLength),za=[],zb=[];for(let i=0;i<2000;i++){za.push(zscore(binomial(distLength,.25,randomA),distLength));zb.push(zscore(binomial(distLength,.4,randomB),distLength))}const bins=34,min=-4,max=11,ha=Array(bins).fill(0),hb=Array(bins).fill(0),idx=v=>Math.max(0,Math.min(bins-1,Math.floor((v-min)/(max-min)*bins)));za.forEach(v=>ha[idx(v)]++);zb.forEach(v=>hb[idx(v)]++);const r=$('distributionPlot');r.replaceChildren();const left=55,right=795,top=35,bottom=365,w=(right-left)/bins,peak=Math.max(...ha,...hb),y=v=>bottom-v/peak*270,x=v=>left+(v-min)/(max-min)*(right-left);const path=a=>{let d=`M ${left} ${bottom}`;a.forEach((v,i)=>d+=` L ${left+(i+.5)*w} ${y(v)}`);return d+` L ${right} ${bottom} Z`};r.append(svg('path',{d:path(ha),fill:'var(--blue-soft)',stroke:'var(--blue)','stroke-width':3}));r.append(svg('path',{d:path(hb),fill:'var(--orange-soft)',stroke:'var(--orange)','stroke-width':3}));r.append(svg('line',{x1:x(distCutoff),x2:x(distCutoff),y1:top,y2:bottom,stroke:'var(--red)','stroke-width':3,'stroke-dasharray':'8 5'}));txt(r,x(distCutoff)+7,top+10,'cutoff '+distCutoff,{fill:'var(--red)'});txt(r,left+15,65,'baseline batches',{fill:'var(--blue)'});txt(r,right-15,65,'nudged batches',{'text-anchor':'end',fill:'var(--orange)'});[-4,-2,0,2,4,6,8,10].forEach(v=>txt(r,x(v),400,String(v),{'text-anchor':'middle'}));const fa=za.filter(v=>v>=distCutoff).length/20,cb=zb.filter(v=>v>=distCutoff).length/20;$('distFalse').textContent=fa.toFixed(1)+'%';$('distCaught').textContent=cb.toFixed(1)+'%';$('distLesson').textContent=distLength===40?'Heavy overlap at 40 flips.':distLength===400?'Clear separation at 400.':'Partial overlap.'}$('distLengths').children[1].classList.add('active');drawDistribution();
function drawResults(){const r=$('stage1ResultPlot'),x=n=>70+lengths.indexOf(n)*175,y=v=>350-v*290;r.replaceChildren();[0,.25,.5,.75,1].forEach(v=>{r.append(svg('line',{x1:70,x2:770,y1:y(v),y2:y(v),stroke:'var(--border)'}));txt(r,55,y(v)+4,(v*100).toFixed(0)+'%',{'text-anchor':'end'})});for(const c of ['null','biased']){const rows=lengths.map(n=>DATA.stage1.find(q=>q.length===n&&q.condition===c)),color=c==='biased'?'var(--orange)':'var(--blue)';let d='';rows.forEach(q=>d+=(d?'L':'M')+x(q.length)+','+y(q.rate));r.append(svg('path',{d,fill:'none',stroke:color,'stroke-width':c==='biased'?5:3}));rows.forEach(q=>{r.append(svg('circle',{cx:x(q.length),cy:y(q.rate),r:6,fill:color}));if(c==='biased')txt(r,x(q.length),y(q.rate)-15,(q.rate*100).toFixed(q.rate===1?0:2)+'%',{'text-anchor':'middle',fill:color})})}lengths.forEach(n=>txt(r,x(n),390,String(n),{'text-anchor':'middle'}))}drawResults();
const TOY=DATA.toySentence;let toyPhase=0,toyStep=0,toyChecks=0,toyComparison=false;const toyTabs=[$('toySelect'),$('toySample'),$('toyGenerate'),$('toyCheck')];function toyZ(g,t){return t?(g-t*.25)/Math.sqrt(t*.25*.75):null}function toySentence(){const words=['Early','one','morning','Jack',...TOY.steps.slice(0,toyStep).map(q=>q.target_word)];$('toySentence').replaceChildren(...[...words,...Array.from({length:4-toyStep},()=>null)].map((word,i)=>{const e=document.createElement('span');if(word){e.textContent=word;e.className=i>=4?'generated':''}else{e.textContent='____';e.className='slot'}return e}))}function toyRows(){const s=TOY.steps[toyStep===4?3:toyStep],ranked=toyComparison&&toyStep===0?TOY.comparison_first:s.ranked;return{step:s,ranked}}function drawToyVocab(){const{step:s,ranked}=toyRows();$('toyContext').replaceChildren(...s.context_words.map((w,i)=>{const e=document.createElement('span');e.innerHTML=`${w}<small> · ${s.context[i]}</small>`;return e}));$('toyVocab').replaceChildren(...ranked.map((q,i)=>{const e=document.createElement('div'),green=q.green;e.className=(green?'green ':'')+((toyPhase>=2&&i===s.target_id)?'picked':'');const chance=toyPhase>=1?s.after[i]:s.before[i];e.innerHTML=`<b>${q.word}</b><small>token ${q.id} · rank ${q.rank}</small><em>${green?'favored':'other'} · ${(chance*100).toFixed(2)}%</em>`;return e}));$('toyLessonKey').classList.toggle('active',!toyComparison);$('toyComparisonKey').classList.toggle('active',toyComparison);$('toyLessonKey').setAttribute('aria-pressed',String(!toyComparison));$('toyComparisonKey').setAttribute('aria-pressed',String(toyComparison));const target=ranked[s.target_id],greenWords=ranked.filter(q=>q.green).map(q=>q.word);$('toyInspector').innerHTML=`<span class="figure-kicker">${toyComparison?'Comparison key':'Lesson key'}</span><div class="big-word">${s.target_word}</div><dl><dt>Candidate ID</dt><dd>${s.target_id}</dd><dt>Hash rank</dt><dd>${target.rank}</dd><dt>Membership</dt><dd>${target.green?'favored':'other'}</dd><dt>Group size</dt><dd>5 of 20</dd></dl><div><small>Favored words</small><p>${greenWords.join(', ')}</p></div>${toyStep===0?`<div><small>Input used for <code>went</code></small><code>${target.material}</code><small>SHA-256 starts ${target.hash.slice(0,8)}</small></div>`:''}`}
function drawToyProbability(){const s=TOY.steps[toyStep===4?3:toyStep],shown=[...Array(20).keys()].sort((a,b)=>s.after[b]-s.after[a]).slice(0,7);$('toyProbability').classList.toggle('visible',toyPhase===1||toyPhase===2);$('toyDrawMarker').style.left=(s.draw*100)+'%';$('toyDrawMarker').nextElementSibling.style.left=(s.draw*100)+'%';$('toyDrawValue').textContent=s.draw.toFixed(2);$('toyProbabilityRows').replaceChildren(...shown.map(id=>{const e=document.createElement('div'),value=toyPhase>=1?s.after[id]:s.before[id];e.className=`prob-row ${s.green_ids.includes(id)?'green':''} ${id===(toyPhase>=1?s.marked_id:s.plain_id)?'picked':''}`;e.innerHTML=`<span>${TOY.vocabulary[id]}</span><div class="prob-track"><i style="width:${value/Math.max(...s.after)*100}%"></i></div><output>${(value*100).toFixed(2)}%</output>`;return e}))}function drawToyChecker(){const useComparison=toyComparison,hits=TOY.steps.slice(0,toyChecks).reduce((n,s,i)=>n+(useComparison?TOY.comparison_hits[i]:s.hit),0),z=toyZ(hits,toyChecks);$('toyChecker').classList.toggle('visible',toyPhase===3);$('toyCheckedWords').replaceChildren(...['Early','one','morning','Jack',...TOY.steps.map(q=>q.target_word)].map((w,i)=>{const e=document.createElement('span');e.textContent=w;if(i<4)e.className='context';else if(i-4<toyChecks)e.className=(useComparison?TOY.comparison_hits[i-4]:TOY.steps[i-4].hit)?'hit':'miss';else if(i-4===toyChecks)e.className='current';return e}));$('toyHits').textContent=hits;$('toyTrials').textContent=toyChecks;$('toyExpected').textContent=(toyChecks*.25).toFixed(2).replace(/\.00$/,'');$('toyZ').textContent=z===null?'--':z.toFixed(3)}function drawToy(){toySentence();toyTabs.forEach((b,i)=>{b.classList.toggle('active',i===toyPhase);b.setAttribute('aria-pressed',String(i===toyPhase))});$('toyKeyControls').style.display=toyPhase===0||toyPhase===3?'flex':'none';drawToyVocab();drawToyProbability();drawToyChecker();const s=TOY.steps[toyStep===4?3:toyStep],messages=toyComparison?[`The comparison key marks ${TOY.comparison_first.filter(q=>q.green).map(q=>q.word).join(', ')}. The context and five-of-20 rule did not move.`,`Return to the lesson key to replay the saved draw.`,`The generation fixture uses the lesson key.`,`With this comparison key, the four checked words produce ${TOY.comparison_hits.filter(Boolean).length} hits. Another wrong key could match some words by chance.`]:[`The lesson key ranks went first. It marks ${s.green_words.join(', ')}.`,`The same 0.30 draw selects ${TOY.vocabulary[s.plain_id]} before the increase and ${TOY.vocabulary[s.marked_id]} after it.`,`Choice ${Math.min(toyStep+1,4)} uses ${s.context_words.join(' ')}. ${s.target_word} is ${s.hit?'a green hit':'outside the favored set'}.`,`The checker uses only the copied words and matching profile. It has counted ${toyChecks} of 4 positions.`];$('toyFeedback').textContent=messages[toyPhase];$('toySceneLabel').textContent=['Selection','Sampling','Moving context','Checker'][toyPhase];$('toySceneTitle').textContent=['The key ranks all 20 candidates.','Five score increases reshape one probability total.','The next word enters on the right.','Copied text recreates each favored set.'][toyPhase];$('toyPrev').disabled=toyPhase===0&&toyStep===0&&toyChecks===0;$('toyNext').textContent=toyPhase===0?'Add the score increase':toyPhase===1?'Choose '+s.target_word:toyPhase===2?(toyStep<3?'Move to the next choice':'Open the checker'):(toyChecks<4?'Check '+TOY.steps[toyChecks].target_word:'Use the comparison key')}function toyForward(){toyComparison=false;if(toyPhase===0)toyPhase=1;else if(toyPhase===1)toyPhase=2;else if(toyPhase===2){if(toyStep<3){toyStep++;toyPhase=0}else{toyStep=4;toyPhase=3;toyChecks=0}}else if(toyChecks<4)toyChecks++;else toyComparison=true;drawToy()}function toyBack(){toyComparison=false;if(toyPhase===3){if(toyChecks>0)toyChecks--;else{toyPhase=2;toyStep=3}}else if(toyPhase>0)toyPhase--;else if(toyStep>0){toyStep--;toyPhase=2}drawToy()}function toyReset(){toyPhase=0;toyStep=0;toyChecks=0;toyComparison=false;drawToy()}$('toyNext').onclick=toyForward;$('toyPrev').onclick=toyBack;$('toyReplay').onclick=toyReset;$('toyLessonKey').onclick=()=>{toyComparison=false;drawToy()};$('toyComparisonKey').onclick=()=>{toyComparison=true;drawToy()};toyTabs.forEach((b,i)=>b.onclick=()=>{toyComparison=false;toyPhase=i;if(i===3){toyStep=4;toyChecks=4}else if(toyStep===4)toyStep=3;drawToy()});drawToy();
function candidates(marked){const rows=marked?DATA.candidateMarked:DATA.candidateControl,root=$('realCandidates'),max=Math.max(...DATA.candidateMarked.map(q=>q.final_probability));root.replaceChildren(...rows.map(q=>{const e=document.createElement('div');e.className=`candidate-bar ${q.in_green_group?'green':''} ${q.token_id===30604?'selected':''}`;e.innerHTML=`<span>${q.token_text}<small>ID ${q.token_id} · ${q.in_green_group?'green':'other'}</small></span><div class="bar-pair"><div class="bar-track"><i style="width:${q.final_probability/max*100}%"></i></div></div><output>${(q.final_probability*100).toFixed(2)}%</output>`;return e}));const jack=rows.find(q=>q.token_id===30604);$('jackScore').textContent=jack.score_after_increase.toFixed(3);$('jackChance').textContent=(jack.final_probability*100).toFixed(3)+'%';$('realFeedback').textContent=marked?'Jack rises from 11.642% to 18.582%. The fixed draw still lands on Jack.':'These are the model probabilities before the watermark adds 2 to green scores.';$('realOff').classList.toggle('active',!marked);$('realOn').classList.toggle('active',marked);$('realOff').setAttribute('aria-pressed',String(!marked));$('realOn').setAttribute('aria-pressed',String(marked))}const rs=DATA.realStep;$('realControlText').textContent=rs.control_text;$('realMarkedText').textContent=rs.marked_text;$('realControlScore').textContent=`${rs.control_score.green_hits}/${rs.control_score.eligible_tokens}, z ${rs.control_score.z_score.toFixed(3)}`;$('realMarkedScore').textContent=`${rs.marked_score.green_hits}/${rs.marked_score.eligible_tokens}, z ${rs.marked_score.z_score.toFixed(3)}`;$('realComparisonScore').textContent=`${rs.comparison_score.green_hits}/${rs.comparison_score.eligible_tokens}, z ${rs.comparison_score.z_score.toFixed(3)}`;$('realOff').onclick=()=>candidates(false);$('realOn').onclick=()=>candidates(true);candidates(false);
const orderDefs={reference:{name:'Transformers route',steps:['Temperature ÷ 0.8','Top-k keeps 40','Top-p keeps 19','Add 2 to green survivors','Softmax and sample'],counts:['50,257','40','19','19','19'],prob:DATA.order.reference_selected_probability},earlier:{name:'Earlier teaching route',steps:['Add 2 to every green score','Temperature ÷ 0.8','Top-p keeps 11','Top-k still keeps 11','Softmax and sample'],counts:['50,257','50,257','11','11','11'],prob:DATA.order.stage_03_selected_probability}};let orderMode='reference',orderStep=0;function drawOrder(){const root=$('orderRails');root.replaceChildren(...Object.entries(orderDefs).map(([key,q])=>{const e=document.createElement('section');e.className='order-rail '+(key===orderMode?'active':'');e.innerHTML=`<header><b>${q.name}</b><span>${key===orderMode?'selected route':'comparison route'}</span></header><div class="order-steps">${q.steps.map((s,i)=>`<div class="order-step ${i<orderStep?'done':i===orderStep?'current':''}"><i>${i+1}</i><b>${s}</b><small>${i<=orderStep?q.counts[i]+' choices':''}</small></div>`).join('')}</div><div class="order-token"><span>Token <code> was</code><small> · ID 373 · green</small></span><strong>${orderStep===4?(q.prob*100).toFixed(3)+'%':'in flight'}</strong></div>`;return e}));$('orderReference').classList.toggle('active',orderMode==='reference');$('orderEarlier').classList.toggle('active',orderMode==='earlier');$('orderReference').setAttribute('aria-pressed',String(orderMode==='reference'));$('orderEarlier').setAttribute('aria-pressed',String(orderMode==='earlier'));$('orderReadout').innerHTML=`<div><span>Transformers final chance for <code> was</code></span><b>${orderStep===4?'8.643%':'run all five operations'}</b></div><div><span>Earlier-loop final chance for <code> was</code></span><b>${orderStep===4?'8.826%':'same scores, different order'}</b></div>`;$('orderBack').disabled=orderStep===0;$('orderNext').disabled=orderStep===4;$('orderNext').textContent=orderStep===4?'Final state shown':'Run '+orderDefs[orderMode].steps[orderStep]}$('orderReference').onclick=()=>{orderMode='reference';drawOrder()};$('orderEarlier').onclick=()=>{orderMode='earlier';drawOrder()};$('orderBack').onclick=()=>{orderStep=Math.max(0,orderStep-1);drawOrder()};$('orderNext').onclick=()=>{orderStep=Math.min(4,orderStep+1);drawOrder()};$('orderAll').onclick=()=>{orderStep=4;drawOrder()};drawOrder();const rep=DATA.repetition,pieces=[' was',' greeted',' was',' greeted',' was',' greeted'];$('pairSequence').replaceChildren(...pieces.flatMap((p,i)=>{const a=document.createElement('span');a.textContent=p+' · '+[373,21272][i%2];if(i===pieces.length-1)return[a];const arrow=document.createElement('i');arrow.textContent='then';return[a,arrow]}));function pairs(distinct){const names=['was + greeted','greeted + was','was + greeted','greeted + was','was + greeted'],greens=[true,false,true,false,true];$('pairCounting').replaceChildren(...names.map((n,i)=>{const e=document.createElement('div');e.className=`pair-chip ${greens[i]?'green':''} ${distinct&&i>1?'duplicate':''}`;e.textContent=n;return e}));$('pairEvery').classList.toggle('active',!distinct);$('pairDistinct').classList.toggle('active',distinct);$('pairEvery').setAttribute('aria-pressed',String(!distinct));$('pairDistinct').setAttribute('aria-pressed',String(distinct));$('pairFeedback').textContent=distinct?`Explicit distinct-value count: ${rep.explicit_distinct.num_green_pairs}/${rep.explicit_distinct.num_distinct_pairs}, z ${rep.explicit_distinct.z_score.toFixed(3)}. Three repeated occurrences drop out.`:`Pinned library result: ${rep.library_false.num_green_tokens}/${rep.library_false.num_tokens_scored}, z ${rep.library_false.z_score.toFixed(3)}. Its repeated-ngram option produced the same count in this fixture.`}$('pairEvery').onclick=()=>pairs(false);$('pairDistinct').onclick=()=>pairs(true);pairs(false);
const nodes=[['Public request','prompt, seed, sampler'],['Gemma adapter','chat rendering and tokenization'],['Generation process','model plus process-local key'],['Copied continuation','assistant text only, tokenized again'],['Matching checker','G, T, z and key version']];let path=0;function drawPath(){$('pathNodes').replaceChildren(...nodes.map(([a,b],i)=>{const e=document.createElement('div');e.className=(i<path?'done ':i===path?'active ':'')+(i===2?'key-boundary':'');e.innerHTML=`<b>${a}</b><small>${b}</small>${i===2?'<small>KEY ENTERS HERE</small>':''}`;return e}));$('pathPacket').style.left=(path*25)+'%';$('pathFeedback').textContent=['The public request has no watermark key.','The adapter owns Gemma-specific prompt and token boundaries.','The host process adds the key only to the marked generation call.','The checker receives copied assistant text, never prompt or padding tokens.','The matching key and profile rebuild the counts.'][path];$('pathPrev').disabled=path===0;$('pathNext').disabled=path===4;$('pathNext').textContent=path===4?'Request complete':'Advance to '+nodes[path+1][0]}$('pathPrev').onclick=()=>{path=Math.max(0,path-1);drawPath()};$('pathNext').onclick=()=>{path=Math.min(4,path+1);drawPath()};$('pathReset').onclick=()=>{path=0;drawPath()};drawPath();
const smokeTexts=DATA.smokeTexts||[];const smokePairs=DATA.smoke.reduce((acc,q)=>{let p=acc.find(x=>x.prompt===q.prompt);if(!p){p={prompt:q.prompt};acc.push(p)}if(q.watermarked)Object.assign(p,{wG:q.g,wT:q.t,wZ:q.z});else Object.assign(p,{cG:q.g,cT:q.t,cZ:q.z});return acc},[]);smokeTexts.forEach((t,i)=>{if(smokePairs[i]){smokePairs[i].cText=t.cText;smokePairs[i].wText=t.wText}});function showSmoke(i){const p=smokePairs[i];if(!p)return;document.querySelectorAll('#smoke-compare .smoke-selector button').forEach((b,j)=>{b.classList.toggle('active',j===i);b.setAttribute('aria-pressed',String(j===i))});$('smokeControlText').textContent=p.cText||'';$('smokeWatermarkedText').textContent=p.wText||'';$('smokeControlGT').textContent=(p.cG||0)+'/'+(p.cT||0);$('smokeControlZ').textContent=(p.cZ||0).toFixed(3);$('smokeWatermarkedGT').textContent=p.wG+'/'+p.wT;$('smokeWatermarkedZ').textContent=p.wZ.toFixed(3);$('smokeControlBar').style.width=Math.max(0,Math.min(100,(p.cZ||0)/4*100))+'%';$('smokeWatermarkedBar').style.width=Math.max(0,Math.min(100,p.wZ/4*100))+'%';$('smokeFeedback').textContent=`${p.wG}/${p.wT} green hits, z ${p.wZ.toFixed(3)}. Below z > 3.`}if($('smoke0')){$('smoke0').onclick=()=>showSmoke(0);$('smoke1').onclick=()=>showSmoke(1);$('smoke2').onclick=()=>showSmoke(2);showSmoke(0)}
const ladderData=DATA.ladder||[];let ladderIdx=0,ladderTimer=null,ladderPlaying=true;function drawLadder(){const r=$('ladderPlot');if(!r||!ladderData.length)return;r.replaceChildren();const left=200,right=820,top=30,rowH=52,cutX=left+(3-(-1.5))/(9-(-1.5))*(right-left);r.setAttribute('viewBox',`0 0 900 ${ladderData.length*rowH+60}`);r.append(svg('line',{x1:cutX,x2:cutX,y1:10,y2:ladderData.length*rowH+20,stroke:'var(--red)','stroke-width':2,'stroke-dasharray':'6 4'}));txt(r,cutX,ladderData.length*rowH+48,'z = 3',{'text-anchor':'middle',fill:'var(--red)','font-size':'11'});ladderData.forEach((p,i)=>{const y=top+i*rowH;const active=i===ladderIdx;const xScale=v=>left+Math.max(0,(v-(-1.5))/(9-(-1.5)))*(right-left);const xC=xScale(p.cZ||0);const xW=xScale(p.wZ||0);if(active){r.append(svg('rect',{x:0,y:y-8,width:900,height:rowH,fill:'var(--surface)',rx:4}))}txt(r,10,y+12,p.id,{fill:active?'var(--orange)':'var(--text)','font-weight':active?'bold':'normal','font-size':'12'});txt(r,10,y+28,'cap '+p.cap,{fill:'var(--muted)','font-size':'10'});r.append(svg('rect',{x:left,y:y+4,width:Math.max(3,xC-left),height:7,fill:'#5b8def',rx:3,opacity:active?1:.5}));r.append(svg('rect',{x:left,y:y+16,width:Math.max(3,xW-left),height:7,fill:'#4ade80',rx:3,opacity:active?1:.5}));txt(r,right+10,y+11,(p.cZ||0).toFixed(2),{fill:'#5b8def','font-size':'11'});txt(r,right+10,y+25,(p.wZ||0).toFixed(2),{fill:'#4ade80','font-size':'11'})});$('ladderFeedback').textContent=`${ladderData[ladderIdx].id}: control z ${(ladderData[ladderIdx].cZ||0).toFixed(3)}, watermarked z ${(ladderData[ladderIdx].wZ||0).toFixed(3)}. ${(ladderData[ladderIdx].wZ||0)>3?'Crosses z > 3.':'Below cutoff.'}`}function ladderAdvance(){ladderIdx=(ladderIdx+1)%ladderData.length;drawLadder()}function startLadder(){clearInterval(ladderTimer);if(ladderPlaying)ladderTimer=setInterval(ladderAdvance,2200);if($('ladderPause'))$('ladderPause').textContent=ladderPlaying?'Pause autoplay':'Resume'}if($('ladderPlot')){if($('ladderPrev'))$('ladderPrev').onclick=()=>{ladderPlaying=false;ladderIdx=(ladderIdx-1+ladderData.length)%ladderData.length;drawLadder();startLadder()};if($('ladderNext'))$('ladderNext').onclick=()=>{ladderPlaying=false;ladderAdvance();startLadder()};if($('ladderPause'))$('ladderPause').onclick=()=>{ladderPlaying=!ladderPlaying;startLadder()};drawLadder();autoplayWhenVisible($('length-ladder'),startLadder,()=>{clearInterval(ladderTimer);ladderTimer=null})}
function calibration(count=1000){const r=$('calibrationPlot'),vals=DATA.naturalScores.slice(0,count).sort((a,b)=>a-b);r.replaceChildren();r.setAttribute('viewBox','0 0 900 420');const x=i=>55+i/(count-1)*810,y=z=>370-(z+4)/8.5*330;[-2,0,2,3,4].forEach(v=>{r.append(svg('line',{x1:55,x2:865,y1:y(v),y2:y(v),stroke:v===3?'var(--yellow)':'var(--border)','stroke-width':v===3?2:1,'stroke-dasharray':v===3?'7 5':''}));txt(r,45,y(v)+4,String(v),{'text-anchor':'end'})});const radius=count===1000?1.7:3,pointPath=(items)=>items.map(({z,i})=>{const cx=x(i),cy=y(z);return`M ${cx-radius} ${cy-radius} H ${cx+radius} V ${cy+radius} H ${cx-radius} Z`}).join(' '),ordinary=[],crossings=[];vals.forEach((z,i)=>(z>3?crossings:ordinary).push({z,i}));r.append(svg('path',{d:pointPath(ordinary),fill:'var(--blue)',opacity:.72}));if(crossings.length)r.append(svg('path',{d:pointPath(crossings),fill:'var(--coral)'}));txt(r,70,y(3)-9,'strict z > 3',{fill:'var(--yellow)'});txt(r,55,405,'lowest score');txt(r,865,405,'highest score',{'text-anchor':'end'});$('show100').classList.toggle('active',count===100);$('show1000').classList.toggle('active',count===1000);$('show100').setAttribute('aria-pressed',String(count===100));$('show1000').setAttribute('aria-pressed',String(count===1000));$('calibrationFeedback').textContent=count===100?'The first 100 selected rows show local variation. Use all 1,000 before reading the background.':'All 1,000 scores are sorted here. Four passages sit above the strict cutoff; 996 do not.'}$('show100').onclick=()=>calibration(100);$('show1000').onclick=()=>calibration(1000);function calRule(distinct){$('allPairs').classList.toggle('active',!distinct);$('distinctPairs').classList.toggle('active',distinct);$('allPairs').setAttribute('aria-pressed',String(!distinct));$('distinctPairs').setAttribute('aria-pressed',String(distinct));$('calG').textContent=distinct?'114':'132';$('calT').textContent=distinct?'358':'399';$('calZ').textContent=distinct?'2.9904':'3.7286';$('calDecision').textContent=distinct?'Below cutoff':'Crosses';$('calDecision').parentElement.classList.toggle('safe',distinct);$('calRuleNote').textContent=distinct?'The exact token sequence stays fixed. Removing repeated pair values drops 41 observations, including 18 green hits.':'Every adjacent-pair occurrence counts, including repeated values.'}$('allPairs').onclick=()=>calRule(false);$('distinctPairs').onclick=()=>calRule(true);calibration();calRule(false);
const famNames={watermarked_correct:'Marked text, generation key',control_correct:'Model control, generation key',natural_correct:'Natural web, generation key',watermarked_comparison:'Marked text, comparison key'},famQuestions={watermarked_correct:'The condition under test',control_correct:'Does ordinary Gemma score high?',natural_correct:'Does the source domain score high?',watermarked_comparison:'Is the score tied to this key?'};for(const[k,n]of Object.entries(famNames)){const b=document.createElement('button');b.textContent=n;b.onclick=()=>family(k);$('familyButtons').append(b);const q=DATA.families[k],c=document.createElement('div');c.className='family-card';c.dataset.family=k;c.innerHTML=`<small>${n}</small><b>${q.z.toFixed(3)}</b><span>${q.g}/${q.t} green checks</span><p>${famQuestions[k]}</p>`;$('familyCards').append(c)}function family(k){document.querySelectorAll('#familyButtons button').forEach((b,i)=>{const on=Object.keys(famNames)[i]===k;b.classList.toggle('active',on);b.setAttribute('aria-pressed',String(on))});document.querySelectorAll('.family-card').forEach(c=>c.classList.toggle('active',c.dataset.family===k));const q=DATA.families[k];$('familyFeedback').textContent=k==='watermarked_correct'?`${q.g}/${q.t}, z ${q.z.toFixed(3)}. This one row crosses. The three controls stay below the line.`:`${famQuestions[k]} This branch scores ${q.g}/${q.t}, z ${q.z.toFixed(3)}.`}family('watermarked_correct');
const contrasts={versus_control:'Marked minus model control',versus_natural:'Marked minus natural web',versus_comparison_key:'Generation key minus comparison key'};for(const[k,n]of Object.entries(contrasts)){const b=document.createElement('button');b.textContent=n;b.onclick=()=>cohort(k);$('contrastButtons').append(b)}function cohort(k){document.querySelectorAll('#contrastButtons button').forEach((b,i)=>{const on=Object.keys(contrasts)[i]===k;b.classList.toggle('active',on);b.setAttribute('aria-pressed',String(on))});const s=DATA.prefixSummary['80'].comparisons[k],r=$('cohortPlot'),min=-3,max=6,left=105,right=855,rowH=23,x=v=>left+(v-min)/(max-min)*(right-left);r.replaceChildren();r.setAttribute('viewBox',`0 0 900 ${24*rowH+70}`);[-2,0,2,4,6].forEach(v=>{r.append(svg('line',{x1:x(v),x2:x(v),y1:20,y2:24*rowH+20,stroke:v===0?'var(--coral)':'var(--border)','stroke-width':v===0?2:1}));txt(r,x(v),24*rowH+53,(v>0?'+':'')+v,{'text-anchor':'middle'})});s.row_differences.forEach((v,i)=>{const y=28+i*rowH;txt(r,12,y+4,String(DATA.selectionRanks[i]),{fill:'var(--muted)'});r.append(svg('line',{x1:x(0),x2:x(v),y1:y,y2:y,stroke:v>=0?'var(--green)':'var(--coral)','stroke-width':3,opacity:.7}));r.append(svg('circle',{cx:x(v),cy:y,r:i===0||i===1?6:4.5,fill:i===0?'var(--orange)':i===1?'var(--yellow)':v>=0?'var(--green)':'var(--coral)'}));txt(r,870,y+4,(v>=0?'+':'')+v.toFixed(2),{'text-anchor':'end',fill:'var(--text)'})});$('cohortSummary').innerHTML=`<span>Mean paired difference</span><strong>${s.mean_difference.toFixed(3)}</strong><span>95% paired bootstrap interval</span><div class="interval-line"></div><b>[${s.interval_low.toFixed(3)}, ${s.interval_high.toFixed(3)}]</b><p>Positive values favor the marked correct-key score. Rank 1000 is orange; rank 1001 is yellow.</p>`;$('cohortFeedback').textContent=`Every frozen row appears on its own line. The interval summarizes these 24 documents, not a larger population.`}const prefixOrder=['40','80','160','200','400'];$('prefixCounts').replaceChildren(...prefixOrder.map(p=>{const e=document.createElement('div'),n=DATA.prefixSummary[p].complete_rows;e.className='prefix-chip '+(n===0?'zero':'');e.innerHTML=`<span>${p} tokens</span><strong>${n}</strong><small>matched rows</small>`;return e}));cohort('versus_control');
const attackNames={normalization:'Normalize',homoglyph_1:'Homoglyph 1%',homoglyph_5:'Homoglyph 5%',deletion_10:'Delete 10%',deletion_30:'Delete 30%',mixing_25:'Mix 25%',mixing_50:'Mix 50%',paraphrase:'Paraphrase'};for(const[k,n]of Object.entries(attackNames)){const b=document.createElement('button');b.textContent=n;b.onclick=()=>attack(k);$('attackButtons').append(b)}function attack(k){document.querySelectorAll('#attackButtons button').forEach((b,i)=>{const on=Object.keys(attackNames)[i]===k;b.classList.toggle('active',on);b.setAttribute('aria-pressed',String(on))});const vals=DATA.attacks.map(q=>q.values[k]),r=$('attackPlot'),min=-5,max=2,left=105,right=840,rowH=28,x=v=>left+(v-min)/(max-min)*(right-left);r.replaceChildren();r.setAttribute('viewBox',`0 0 900 ${12*rowH+70}`);[-4,-2,0,2].forEach(v=>{r.append(svg('line',{x1:x(v),x2:x(v),y1:20,y2:12*rowH+20,stroke:v===0?'var(--yellow)':'var(--border)','stroke-width':v===0?2:1}));txt(r,x(v),12*rowH+54,v+' z',{'text-anchor':'middle'})});vals.forEach((v,i)=>{const y=30+i*rowH;txt(r,10,y+4,String(DATA.attacks[i].rank));r.append(svg('line',{x1:x(0),x2:x(v),y1:y,y2:y,stroke:v<=0?'var(--coral)':'var(--green)','stroke-width':4,opacity:.75}));r.append(svg('circle',{cx:x(v),cy:y,r:i===0?6:4.5,fill:i===0?'var(--orange)':v<=0?'var(--coral)':'var(--green)'}));txt(r,875,y+4,(v>=0?'+':'')+v.toFixed(2),{'text-anchor':'end',fill:'var(--text)'})});const s=DATA.attackSummary[k];$('attackHeading').textContent=attackNames[k]+' across every row';$('attackSummary').innerHTML=`<span>Mean z change</span><strong>${s.mean_z_change.toFixed(3)}</strong><span>Mean copied-token length ratio</span><strong>${s.mean_length_ratio.toFixed(3)}</strong>${k==='paraphrase'?'<p>Automatic screen: 12/12 pass<br>Assistant review: 10 pass, 2 uncertain</p>':''}`;$('attackFeedback').textContent=k==='normalization'?'Normalization barely moves the detector in this fixture.':`${attackNames[k]} moves each endpoint shown here. Rank 1000 is orange.`}function spine(which){const q=DATA.spineEdit,s=q.scores[which],labels={source:'Unedited rank 1000',deletion:'Deterministic 10% deletion',paraphrase:'Gemma paraphrase'},readings={source:'The original first 80 copied tokens.',deletion:'The visible deletion changes token positions and every later keyed context.',paraphrase:'A new sentence history produces a new checker path. Meaning preservation was screened separately.'};$('spineText').textContent=q[which];$('editLabel').textContent=labels[which];$('editG').textContent=s.num_green_tokens;$('editT').textContent=s.num_tokens_scored;$('editZ').textContent=s.z_score.toFixed(3);$('editReading').textContent=readings[which];for(const[id,key]of[['editSource','source'],['editDelete','deletion'],['editParaphrase','paraphrase']]){const on=key===which;$(id).classList.toggle('active',on);$(id).setAttribute('aria-pressed',String(on))}if(which==='deletion')attack('deletion_10');else if(which==='paraphrase')attack('paraphrase')}$('editSource').onclick=()=>spine('source');$('editDelete').onclick=()=>spine('deletion');$('editParaphrase').onclick=()=>spine('paraphrase');attack('deletion_10');spine('source');
for(const d of ['1','2','3']){const b=document.createElement('button');b.textContent='Delta '+d;b.onclick=()=>delta(d);$('deltaButtons').append(b)}function delta(active){document.querySelectorAll('#deltaButtons button').forEach((b,i)=>{const on=String(i+1)===active;b.classList.toggle('active',on);b.setAttribute('aria-pressed',String(on))});const r=$('deltaPlot'),x=d=>120+(Number(d)-1)*300,y=z=>35+(5-z)/7*300;r.replaceChildren();r.setAttribute('viewBox','0 0 820 410');r.append(svg('line',{x1:70,x2:750,y1:y(3),y2:y(3),stroke:'var(--yellow)','stroke-dasharray':'7 5'}));txt(r,75,y(3)-8,'strict z > 3',{fill:'var(--yellow)'});DATA.bias.forEach((q,i)=>{const rank=q.rank,focus=[1000,1001,1004,1006].includes(rank);let p='';for(const d of ['1','2','3'])p+=(p?'L':'M')+x(d)+','+y(q.values[d]);r.append(svg('path',{d:p,fill:'none',stroke:rank===1000?'var(--green)':rank===1001?'var(--orange)':rank===1004||rank===1006?'var(--coral)':'var(--muted)','stroke-width':focus?3:1.4,opacity:focus?1:.55}));for(const d of ['1','2','3'])r.append(svg('circle',{cx:x(d),cy:y(q.values[d]),r:d===active?5:3.5,fill:rank===1000?'var(--green)':rank===1001?'var(--orange)':rank===1004||rank===1006?'var(--coral)':'var(--blue)'}));txt(r,760,y(q.values['3'])+4,String(rank),{fill:focus?'var(--text)':'var(--muted)'})});for(const d of ['1','2','3'])txt(r,x(d),385,'delta '+d,{'text-anchor':'middle'});const s=DATA.biasSummary[active];$('deltaReading').innerHTML=`<span>Selected setting</span><strong>delta ${active}</strong><span>Mean z</span><strong>${s.mean_z.toFixed(3)}</strong><span>Strict crossings</span><strong>${s.cutoff_crossings}/8</strong><p>Coral paths mark ranks 1004 and 1006, whose z scores fell from delta 2 to delta 3.</p>`;$('deltaFeedback').textContent=`The cohort mean rises with delta. Individual seeded paths need not rise at every step.`}const proxyDefs=[['Mean z','mean_z'],['Mean conditional NLL','mean_nll'],['Repeated-pair fraction','mean_repeated_pair_fraction']];$('proxyPlots').replaceChildren(...proxyDefs.map(([name,key],ci)=>{const e=document.createElement('div'),vals=['1','2','3'].map(d=>DATA.biasSummary[d][key]),max=Math.max(...vals);e.className='proxy-card';e.innerHTML=`<b>${name}</b>${vals.map((v,i)=>`<div class="proxy-row"><span>delta ${i+1}</span><i style="width:${v/max*100}%"></i><output>${v.toFixed(3)}</output></div>`).join('')}`;return e}));delta('2');
const methods={kgw:{name:'KGW-style green list',generation:'The key and recent context choose a vocabulary subset. The sampler raises scores in that subset.',checking:'The checker rebuilds each subset and counts excess green tokens.',claim:'Consistent with this configured watermark and key.',className:''},synthid:{name:'SynthID-Text',generation:'Keyed scoring functions run candidate tournaments during sampling.',checking:'The detector measures correlation between observed tokens and the keyed functions.',claim:'Evidence for the matching SynthID configuration. This project did not implement it.',className:''},claude:{name:'Claude watermark',generation:'Anthropic says Claude uses a version of SynthID-Text.',checking:'Anthropic says a detector API is forthcoming.',claim:'The exact production settings and evaluation data remain undisclosed.',className:'unknown'},passive:{name:'Passive classifier',generation:'No deliberate generation-time mark is required.',checking:'A learned model estimates whether style or other features resemble a source class.',claim:'A classifier score is uncertain evidence, not proof of origin or authorship.',className:''}};for(const[k,q]of Object.entries(methods)){const b=document.createElement('button');b.textContent=q.name;b.onclick=()=>method(k);$('methodButtons').append(b)}function method(k){document.querySelectorAll('#methodButtons button').forEach((b,i)=>{const on=Object.keys(methods)[i]===k;b.classList.toggle('active',on);b.setAttribute('aria-pressed',String(on))});const q=methods[k];$('methodMap').innerHTML=`<div class="${q.className}"><span>During generation</span><h3>${q.name}</h3><p>${q.generation}</p></div><div><span>During checking</span><h3>What the checker computes</h3><p>${q.checking}</p></div><div><span>Permitted conclusion</span><h3>Keep the wording narrow</h3><p><b>${q.claim}</b></p></div>`}method('kgw');

    } catch (err) {
      console.error("Vav interactive simulation error:", err);
    }

    cleanup = function() {
      cleanupTasks.forEach(function(task) { task(); });
      initializedEvidence = null;
      cleanup = null;
    };
  }

  document.addEventListener('astro:page-load', initInteractiveSimulation);
  document.addEventListener('astro:before-swap', function() {
    if (cleanup) cleanup();
  });
  initInteractiveSimulation();
})();
</script>