File size: 9,866 Bytes
1e251f3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
"""WIN2-R3 seeded A/A pilot recipe: two starts, PASS on identical B1 streams, measured diff CV and the A/A band input."""
from __future__ import annotations

import hashlib
import json
from pathlib import Path
from typing import cast

import pytest

from offload.gb10_budget import window_cells as wc
from offload.gb10_budget.test_window_cells_seeded import SeededFake, plan, register_fake_texts, texts
from offload.launch.windows import aa_pilot as ap
from offload.launch.windows import decision_v2 as d
from offload.launch.windows import dist_gate as dg
from offload.launch.windows.tests.test_dist_gate import FakeDist, materials
from offload.prefill_maxlen.evidence import Json, number, record

CELLS = ('seeded-short-b1', 'seeded-32k-b1', 'seeded-32k-b3')


BRIDGE = {'bench2-legal-short': ('PUBLIC bench2 legal instruction', 124),
          'bench2-summary-32k': ('PUBLIC bench2 summary record', 32000)}
TOKENIZER = Path('/opt/dsv41/data/d2/tokenizer/tokenizer.json')
BENCH_DATA = Path('/opt/dsv41/data/bench-data')


@pytest.fixture(autouse=True)
def _registered(monkeypatch: pytest.MonkeyPatch) -> None:
    register_fake_texts(monkeypatch)
    monkeypatch.setattr(wc, 'PROMPT_SHA256', {**wc.PROMPT_SHA256, **{k: hashlib.sha256(t.encode()).hexdigest()
                                                                       for k, (t, _) in BRIDGE.items()}})


class BridgeFake(SeededFake):
    @staticmethod
    def _tokens(body: dict[str, Json]) -> int:
        messages = body['messages']
        assert isinstance(messages, list)
        return {t[0]: t[1] for t in [*texts().values(), *BRIDGE.values()]}[str(record(messages[0])['content'])]


@pytest.fixture(scope='module')
def setup() -> tuple[str, dict[str, Json]]:
    text = materials()
    prompts = dg.selected(['short'])[:3]
    return text, record(dg.cuts(FakeDist(), text, {'x': 'y'}, prompts)['prompts'])


def _start(tmp_path: Path, setup: tuple[str, dict[str, Json]], seeded: SeededFake, dist: FakeDist,
           start: str = 'B') -> dict[str, Json]:
    text, rows = setup
    return ap.run(seeded, dist, texts(), plan(tmp_path), text, rows, cells=CELLS, start=start,
                  bridge_texts=BRIDGE if start == 'A' else None)


def test_identical_starts_pass_and_give_the_band_input(tmp_path: Path, setup: tuple[str, dict[str, Json]]) -> None:
    a = _start(tmp_path, setup, SeededFake(), FakeDist())
    b = _start(tmp_path, setup, SeededFake(speed=1.01), FakeDist(shift=0.001))
    r = ap.compare(a, b)
    assert r['verdict'] == 'PASS'
    cells = record(r['cells'])
    short = record(cells['seeded-short-b1'])
    assert short['identical'] is True and short['pairs_same_rounds'] == 6 and short['pairs_same_output'] == 6
    tps = record(record(short['metrics'])['decode_tps'])
    assert number(tps['mean_diff']) == pytest.approx(0.01) and number(tps['diff_cv']) < 1e-9
    band = dg.register_band([record(r['dist'])])
    assert band['positions'] == 3 * dg.POSITIONS and band['aa_comparisons'] == 1


def test_b1_divergence_fails_but_multi_divergence_is_reported(tmp_path: Path, setup: tuple[str, dict[str, Json]]) -> None:
    a = _start(tmp_path, setup, SeededFake(), FakeDist())
    b = _start(tmp_path, setup, SeededFake(shift=1), FakeDist())
    r = ap.compare(a, b)
    assert r['verdict'] == 'FAIL' and 'B1 seeded cell differs' in str(r['reason'])
    multi_only = {**a, 'cells': {k: v for k, v in record(a['cells']).items() if k == 'seeded-32k-b3'}}
    multi_b = {**b, 'cells': {k: v for k, v in record(b['cells']).items() if k == 'seeded-32k-b3'}}
    assert ap.compare(multi_only, multi_b)['verdict'] == 'FAIL'                 # no B1 cell ran: cannot PASS
    with pytest.raises(ValueError, match='different pilot cells'):
        ap.compare(a, multi_b)


def test_cli_dry_plan_compare_and_coordinator_gate(tmp_path: Path, setup: tuple[str, dict[str, Json]],
                                                   monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]) -> None:
    common = ['--url', wc.URL, '--cuts', 'c', '--dist-cuts', 'd', '--salt', 's', '--deadline-utc', '1', '--out',
              str(tmp_path / 'x.json'), '--start', 'A']
    assert ap.main(['run', *common]) == 0 and 'DRY RUN' in capsys.readouterr().out
    monkeypatch.delenv('WINDOW_COORDINATOR', raising=False)
    assert ap.main(['run', '--execute', *common]) == 2
    a, b = tmp_path / 'a.json', tmp_path / 'b.json'
    a.write_text(json.dumps(_start(tmp_path, setup, SeededFake(), FakeDist())))
    b.write_text(json.dumps(_start(tmp_path, setup, SeededFake(), FakeDist())))
    assert ap.main(['compare', str(a), str(b), '--out', str(tmp_path / 'cmp.json')]) == 0
    assert json.loads((tmp_path / 'cmp.json').read_text())['verdict'] == 'PASS'


# ---------------------------------------------------------------- DP-2 bridging cell (start A only, report only)

def test_start_a_runs_the_dp2_bridge_and_compare_ignores_it(tmp_path: Path, setup: tuple[str, dict[str, Json]]) -> None:
    api = BridgeFake()
    a = _start(tmp_path, setup, api, FakeDist(), start='A')
    b = _start(tmp_path, setup, SeededFake(), FakeDist())
    assert a['start'] == 'A' and 'bridge' not in b and ap.compare(a, b)['verdict'] == 'PASS'
    bridge = record(a['bridge'])
    assert list(bridge) == [c.name for c in ap.BRIDGE_CELLS]
    for cell in ap.BRIDGE_CELLS:
        r = record(bridge[cell.name])
        assert r['report_only'] is True and r['max_tokens'] == cell.max_tokens and len(cast(list[Json], r['pairs'])) == 3
        assert r['prompt_sha256'] == wc.PROMPT_SHA256[cell.prompts[0]]
    measured = [b for b in api.bodies if b['max_tokens'] in (512, 1500)]
    assert len(measured) == 6 * 3 and all(b['temperature'] == 1.0 and b['priority'] == 10 for b in measured)
    assert sorted({int(str(b['max_tokens'])) for b in measured}) == [512, 1500]
    report = record(a['bridge_report'])
    assert set(record(report['length_vs_date'])) == {'short', '32k-0'}
    assert 'consistent with prompt identity' in str(report['h4'])
    with pytest.raises(ValueError, match='start A only'):
        ap.run(SeededFake(), FakeDist(), texts(), plan(tmp_path), setup[0], setup[1], cells=CELLS, start='A')
    with pytest.raises(ValueError, match='start A only'):
        ap.run(SeededFake(), FakeDist(), texts(), plan(tmp_path), setup[0], setup[1], cells=CELLS, start='B',
               bridge_texts=BRIDGE)


def test_bridge_cells_are_report_only_and_never_decide(tmp_path: Path) -> None:
    r = wc.run_seeded_cell(BridgeFake(), ap.BRIDGE_CELLS[0], {**texts(), **BRIDGE}, plan(tmp_path), sleep=lambda s: None)
    with pytest.raises(ValueError, match='report-only'):
        d.seeded_series('accepted_per_round', True, r, r)
    assert sum(c.estimate_s for c in ap.BRIDGE_CELLS) / 60 < 10                       # DP-2: about 8-10 minutes


def _bridge_results(summary: float) -> dict[str, Json]:
    out: dict[str, Json] = {}
    for cell in ap.BRIDGE_CELLS:
        value = summary if cell.name == 'bridge-bench2-summary32k-1500' else ap.DP2_REFERENCE[cell.name][0]
        out[cell.name] = {'pairs': [{'accepted_per_round': value} for _ in range(3)]}
    return out


@pytest.mark.parametrize('summary,flag', [(1.06, 'H4 FLAG'), (1.30, 'H4 FLAG'), (1.35, 'consistent'), (1.59, 'consistent')])
def test_bridge_report_flags_a_production_change(summary: float, flag: str) -> None:
    """DP-2 §5: a summary-32K reading near 1.06 instead of 1.589 would mean a production change, not prompt identity."""
    report = ap.bridge_report(_bridge_results(summary))
    assert flag in str(report['h4'])
    cells = record(report['cells'])
    assert record(cells['bridge-bench2-legal-1500'])['within_dp2_ci'] is True
    short = record(record(report['length_vs_date'])['short'])
    assert short['same_day_512_minus_1500'] == pytest.approx(1.294 - 1.146)


def test_bench2_texts_refuses_a_different_prompt(tmp_path: Path) -> None:
    class Words:
        def tokens(self, text: str) -> int:
            return len(text.split()) + 30

        def raw_tokens(self, text: str) -> int:
            return len(text.split())
    data = tmp_path / 'bench-data'
    data.mkdir()
    for name in ('opinions_cl.jsonl', 'filings_recap.jsonl'):
        (data / name).write_text('\n'.join(json.dumps({'title': f't{i}', 'court': 'c', 'date': 'd',
                                                        'text': 'word ' * 4000}) for i in range(12)) + '\n')
    with pytest.raises(ValueError, match='registered'):
        ap.bench2_texts(Words(), data)


def test_bench2_workloads_are_read_from_bench2_and_hash_to_dp2s_legal_prompt() -> None:
    legal = ap.bench2_workloads()['legal']
    assert legal.startswith('Draft a memorandum') and hashlib.sha256(legal.encode()).hexdigest().startswith('dbc88a4f5274')


@pytest.mark.skipif(not (TOKENIZER.is_file() and BENCH_DATA.is_dir()), reason='Controller tokenizer and bench data only')
def test_bench2_port_rebuilds_dp2s_summary_32k_prompt(monkeypatch: pytest.MonkeyPatch) -> None:
    """Offline proof (local DeepSeek tokenizer stands in for /tokenize; the chat-template overhead is pinned by DP-2's
    124-token legal-short count): the port of bench2 build_real/make_prompt gives DP-2's registered summary-32K prompt."""
    monkeypatch.undo()                                                     # the real registry
    from tokenizers import Tokenizer
    tok = Tokenizer.from_file(str(TOKENIZER))

    def n(text: str) -> int:
        return len(tok.encode(text, add_special_tokens=False).ids)
    overhead = 124 - n(ap.bench2_workloads()['legal'])

    class Local:
        def tokens(self, text: str) -> int:
            return n(text) + overhead

        def raw_tokens(self, text: str) -> int:
            return n(text)
    out = ap.bench2_texts(Local(), BENCH_DATA)
    assert out['bench2-summary-32k'][1] == 32000 and out['bench2-legal-short'][1] == 124