fix(generator): правки по линии ревью Кодекса — зёрна, словарь, сторожа
- Зачем:
- третья линия ревью (Кодекс, другое семейство моделей) нашла дыру в
стороже неизменности когорты, отставший словарь и тест, который
сторожил не тот адрес дерева зёрен.
- Что:
- когорта отдаётся видом на замороженный массив: флаг только для
чтения вызывающий мог снять и испортить память, которой пользуются
все дни окна. Граница защиты названа в докстроке — от случайности,
не от умысла.
- CONTEXT.md и комментарий `RETURN_TAIL_DAYS`: окно активности — от
первого визита человека, общее на обе куки (спека это уже говорила,
словарь отстал).
- сторож предыстории сверял день −N с днём N, а сталкиваются −N и
N−1; тем же классом слепоты страдали сторожа независимости состава
и дня и различия компонентов — все три переписаны на сверку со всем
куском адресов, куда подпоток мог бы попасть.
- Проверка:
- make test (297), make lint, make typecheck;
- батарея из 17 мутантов по plan/world/seeds — выживших нет; гоняется
с PYTHONDONTWRITEBYTECODE=1: цикл правки и отката внутри одной
секунды оставлял устаревший .pyc, и тесты шли по старому байт-коду.
- Отклонено с доводом:
- перепроверка настаивала, что сторож неизменности не закрыт: через
`.base` вида владелец данных размораживается. Верно фактически, но
закрывающего состояния у находки нет — владелец памяти в numpy
размораживается всегда, а копия когорты на каждый вызов меняет 2 мс
на 16 МиБ копирования и убивает смысл запоминания.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -56,6 +56,15 @@ def test_counters_are_a_pure_function_of_the_seed():
|
||||
assert first == plan.counters(CANONICAL_SEED, SNAPSHOT_DAYS)
|
||||
|
||||
|
||||
def test_a_remembered_cohort_cannot_be_spoiled_from_outside():
|
||||
"""Когорту помнят и раздают всем дням окна: править её нельзя никак."""
|
||||
cohort = plan.cohort(CANONICAL_SEED, 0)
|
||||
with pytest.raises(ValueError):
|
||||
cohort.client_id[0] = 42
|
||||
with pytest.raises(ValueError):
|
||||
cohort.client_id.flags.writeable = True
|
||||
|
||||
|
||||
def test_another_seed_is_another_world():
|
||||
ours = plan.cohort(CANONICAL_SEED, 3)
|
||||
theirs = plan.cohort(CANONICAL_SEED + 1, 3)
|
||||
|
||||
Reference in New Issue
Block a user