textmachine/docs/archive/reports/PACK17_DELTA_2026-07-25.md

14 KiB
Raw Permalink Blame History

ПАК-17, ДЕЛЬТА ПОСЛЕ ПРИЁМКИ: третье значение action под ратифицированную ПАРУ лейблов

Ревью-шапка оркестратора №8 (25.07, приёмка execute-first, инлайн; ПРИНЯТА и залендена — D39.28; пак-17 закрыт целиком). 0 блокеров. Ре-ранил сам: build/vet чисты · gofmt чист (единственная жалоба internal/llm/llm.go воспроизводится на HEAD — сессия файл не трогала, оговорка честная) · -race 12/12 ok · golden f7641993…4f0020f8 = HEAD байт-в-байт, testdata/ чист · парити EXACT n=13618 … 0.9655 (56/58) · ценз диффом ИМЁН: 451→455, удалено 0 — ровно четыре названных теста. Моя независимая мутация: инвариант проверяет только ПЕРВЫЙ лейбл вместо объединения → красный TestRatifiedLabelPairIsDataOnly, то есть союзная семантика ратифицированной ПАРЫ запинена именно тем тестом, который кодирует форму ответа владельца. Сквозняк TestAssertOnlyLabelRunsWithoutMovingAnything прочитан — не вакуумный: число вызовов + КАЖДОЕ тело запроса + стоимость + ОБА волновых снапшота, и всё при budget_usd = 0. Ратифицировано: имя allow · «все три действия несут один инвариант, различаются остальным» · запрет chain/label_models при allow как громкая ошибка · две объявленные правки фикстур (новая корректная семантика) · пустые accepts_labels как ВЕРНОЕ fail-closed состояние (проверил диффы данных: ни одного ToS-утверждения от сессии, вокабуляр в шиппинг не прибит). Фикс-лист D39.27 закрыт.

Статус: ИСПОЛНЕНО, СДАНО НА ПРИЁМКУ. Сессия НЕ коммитила. База: D39.27 (приёмка фазы 2) + §«ДЕЛЬТА ПОСЛЕ ПРИЁМКИ» промта пака-17. Дельта закрывает единственную открытую работу пака: владелец выбрал ПАРУ violence / sexually-explicit, а чистого capability-ассерта в enum действий не было — то есть ратифицированный вокабуляр был НЕВЫРАЗИМ данными. git mv не применялся, удалений нет.

§1. Что сделано (три пункта дельты)

1. Третье значение actionallow (internal/config/pipeline.go). Имя выбрал приорное: route | allow | terminal читается как естественная тройка, а альтернативы отверг — assert ничего не говорит оператору, require-capability многословен для ключа данных. Семантика вынесена в док-комментарий enum'а: все три действия несут ОДИН инвариант (каждая достижимая модель обязана принимать все лейблы книги) и различаются только остальным:

action инвариант маршрут требует
route да пере-маршрутизирует заявленные стадии + один хоп chain[0] chain (ровно 1 член) · budget_usd > 0 · ≥1 стадия с label_models
allow да — это ВЕСЬ смысл политики не меняет ничего ничего; chain/label_models ЗАПРЕЩЕНЫ как бессмысленные
terminal н/д (ни одного вызова) ничего

Дельта в коде вышла ровно такой, как предсказал промт: значение enum + ветка валидации (chain при allow — громко) + ветка в проверке label_models (запись для не-route лейбла — громко, с указанием, что менять) + примеры. checkContentRouting править не пришлось — он уже был action-агностичен (кроме terminal), и это подтверждено мутацией (см. §3).

2. accepts_labels НЕ заполнял — оставил fail-closed, это ратифицированное верное состояние. Комментарий в configs/models.yaml переписан под решённый вокабуляр и под то, ЧЕГО не хватает: значения — это ФАКТЫ ToS/AUP, они (а) берутся только по первоисточникам (правило двух направлений), (б) даются пер-лейблу, а не пер-провайдеру целиком — violence и sexually-explicit у одного вендора разные ответы (ровно на этом стоит D14 п.1), (в) фиксируются полигоном в experiments/00-provider-quirks.md, не бэкенд-сессией. Ни одного ToS-утверждения от себя в репо не внёс — по памяти нельзя, а чужую зону занимать не стал.

3. Фикс-лист: коммент Stage.ReasoningMaxTokens — вторая половина («ignored … reasoning-off») была неверна после ратифицированной формы 2. Переписан: буфер обязателен для ЛЮБОЙ стадии, чья резолвнутая модель на аддитивном провайдере, включая reasoning:"off" (off гасит thinking только там, где у модели есть выключатель, поэтому исключение было тихим выходом); подавленный вызов лишь пере-резервирует — потолок ужимается, слепым не становится.

Данные (шиппинг): configs/pipeline-c1.yaml — закомментированный пример реестра дополнен формой allow и таблицей «что требует каждое действие»; значения в примере СИНТЕТИЧЕСКИЕ, вокабуляр в шиппинг не прибит.

§2. Тесты (+4, все обязательные из дельты и сверх)

  • TestAllowActionAssertsWithoutRoutingпозитивный (книга с assert-only лейблом грузится без цепочки и без бюджета, каждая стадия сохраняет свой конфиговый маршрут) и негативный (неспособный эндпойнт → громко; инвариант — единственное, что делает эта политика).
  • TestAllowActionRejectsRoutingKnobschain при allow и label_models для allow-лейбла отвергаются, а не игнорируются: автор, написавший их, имел в виду то, чего движок не сделает.
  • TestRatifiedLabelPairIsDataOnly — форма ратифицированного ответа владельца: ДВА лейбла, один только ассертит, второй пере-маршрутизирует; инвариант применяется к ОБЪЕДИНЕНИЮ (модель, принимающая лишь один из двух, отвергается по имени). Значения синтетические — доказывается ФОРМА, поэтому любой вокабуляр ляжет данными.
  • TestAssertOnlyLabelRunsWithoutMovingAnything — сквозняк через настоящий драйвер: allow-лейблованный прогон байт-в-байт совпадает с нелейблованным (тела запросов сравнены поштучно, стоимость равна, оба волновых снапшота НЕ двинулись), и та же книга без capability отказывается запускаться. Это прямое доказательство, что ассерт не имеет wire-эффекта и не может ничего пере-оплатить.

§3. Ревью исполнением (мутации — каждая новая ветка обязана краснеть)

мутация красные тесты
инвариант перестаёт применяться к не-route действию (allow становится декоративным) TestAllowActionAssertsWithoutRouting · TestRatifiedLabelPairIsDataOnly · TestAssertOnlyLabelRunsWithoutMovingAnything
chain при allow молча игнорируется TestAllowActionRejectsRoutingKnobs
label_models для не-route лейбла молча игнорируется TestAllowActionRejectsRoutingKnobs

Две правки фикстур были неизбежны и отражают НОВУЮ (корректную) семантику, объявляю их явно: (а) кейс terminal теперь снимает и label_models (они стали громкой ошибкой при не-route действии — что само проверяется тестом выше); (б) ожидаемая подстрока сообщения об неизвестном действии стала route|allow|terminal.

§4. Манифест «заявление = команда»

# Заявление Команда Результат
D1 сборка/vet чисты, формат чист go build ./... && go vet ./... · gofmt -l internal/ cmd/ без вывода (кроме internal/llm/llm.go — состояние HEAD, не моё)
D2 вся сьюта зелёная под -race go test -race -count=1 ./... 12 пакетов ok, 0 FAIL
D3 golden байт-идентичен, пере-капчера нет sha256sum internal/pipeline/testdata/golden/capture.golden · git status --porcelain backend/internal/pipeline/testdata/ f7641993e37f7ec619dfc5d2914a342d796a7cecd92080e33704f3974f0020f8 · пусто
D4 парити EXACT TM_MINER_PARITY=1 go test ./internal/miner/ -run Parity -count=1 -v PARITY: n=13618 catastrophe{方源:0 蛊:1 蛊师:2 古月:22} recall@proposed=0.9655 (56/58 GT)
D5 ценз ИСПОЛНЕНИЕМ: 451 → 455 (+4, 0) grep -rn "^func Test" backend | wc -l · git grep -c "^func Test" HEAD -- 'backend/**/*_test.go' (сумма) · diff списков имён 455 / 451; добавлены ровно 4 названных выше
D6 каждая новая ветка краснеет от мутации копия дерева в /tmp, 3 мутации, go test ./internal/config/ ./internal/pipeline/ таблица §3
D7 вокабуляр в шиппинг НЕ прибит, ToS-факты не выдуманы grep -rnE "^\s*(accepts_labels|content_policy)" backend/configs/ ни одной раскомментированной строки
D8 движок не знает ни одного значения лейбла go test ./internal/config/ -run TestNoPrivilegedLabelValue ok (книга с «adult» против реестра синтетических лейблов отвергается как любая другая)
D9 сессия не коммитила git status --porcelain | wc -l 6 записей, HEAD не двигался

§5. Открытые петли (после дельты)

  1. accepts_labels — ждут ФАКТОВ по первоисточникам, пер-провайдер И ПЕР-ЛЕЙБЛ (violencesexually-explicit у одного вендора). Зона полигона (experiments/00-provider-quirks.md). До фактов любая лейблованная книга падает громко, называя модель, провайдера и недостающий лейбл — верное состояние.
  2. Q2 (редактор под лейблом) — отложен с записью при приёмке; связывает только explicit-книги, которых нет.
  3. D22.7 паком не снят: пер-чанковый L3-скрин остаётся предусловием первой erotica-книги в проде; action: terminal — book-level отказ входа по объявленным данным, механизм слабее, значение под него не заведено.
  4. Хвосты общности (Detail-строки чекеров · множитель ×2) — «отложено-с-записью», причина в отчёте фазы 2 §3.3 (двинули бы снапшот стендовых книг).
  5. --accept-rebill (D20.2-Q2) — по-прежнему отсутствует в коде; петля не пака-17.