14 KiB
ПАК-17, ДЕЛЬТА ПОСЛЕ ПРИЁМКИ: третье значение action под ратифицированную ПАРУ лейблов
Ревью-шапка оркестратора №8 (25.07, приёмка execute-first, инлайн; ПРИНЯТА и залендена —
D39.28; пак-17 закрыт целиком). 0 блокеров. Ре-ранил сам: build/vet чисты ·gofmtчист (единственная жалобаinternal/llm/llm.goвоспроизводится на HEAD — сессия файл не трогала, оговорка честная) ·-race12/12 ok · goldenf7641993…4f0020f8= HEAD байт-в-байт,testdata/чист · парити EXACTn=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. Третье значение action — allow (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 лейблом грузится без цепочки и без бюджета, каждая стадия сохраняет свой конфиговый маршрут) и негативный (неспособный эндпойнт → громко; инвариант — единственное, что делает эта политика).TestAllowActionRejectsRoutingKnobs—chainпри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. Открытые петли (после дельты)
accepts_labels— ждут ФАКТОВ по первоисточникам, пер-провайдер И ПЕР-ЛЕЙБЛ (violence≠sexually-explicitу одного вендора). Зона полигона (experiments/00-provider-quirks.md). До фактов любая лейблованная книга падает громко, называя модель, провайдера и недостающий лейбл — верное состояние.- Q2 (редактор под лейблом) — отложен с записью при приёмке; связывает только explicit-книги, которых нет.
- D22.7 паком не снят: пер-чанковый L3-скрин остаётся предусловием первой erotica-книги в проде;
action: terminal— book-level отказ входа по объявленным данным, механизм слабее, значение под него не заведено. - Хвосты общности (Detail-строки чекеров · множитель ×2) — «отложено-с-записью», причина в отчёте фазы 2 §3.3 (двинули бы снапшот стендовых книг).
--accept-rebill(D20.2-Q2) — по-прежнему отсутствует в коде; петля не пака-17.