26 KiB
⚠ АКТУАЛИЗИРОВАН ПОД R1-ПРОДОЛЖЕНИЕ (19.07, пост-D39.14; предыдущие версии — в git-истории). Сессия №1 сдала Block A (
85f5b9e, D39.13); сессия №2 сдала R2–R5 + R1-аддитив (D39.14). Осталось: R1 драйвер-свитч + 3-пунктовый фикс-лист рубежа-2 (ниже). Дизайны —docs/archive/reports/PACK11_CONT_REPORT_2026-07-19.md §R1+docs/archive/reports/PACK11_REPORT_2026-07-19.md §Резидуал(авторитет наравне с планом). Сданное — под тестами, НЕ пере-строить.ФИКС-ЛИСТ рубежа-2 (FL-1/2/3) — УЖЕ ЗАЛЕНДЕНЫ (D39.14/D39.16), здесь как КОНТЕКСТ; НЕ переделывать, если тронешь смежное — не регрессировать: FL-1
bankMaxLines/bankTokenBudgetсвёрнут вbanknoteSnap· FL-2resumeFromChunkStatusрепопулируетBankFlags(банкнота-телеметрия не обнуляется на резюме) · FL-3emitRankCap=200перед emission-фильтрами (miner_emit.go, зеркалоa3[:200]).Ш-1/Ш-2 (D39.16-записка, ратифицированы → ДЕЛАТЬ В ЭТОМ R1-заходе, снапшот-двигающие):
- Ш-2 (несущее): вплести
unicode.VersionвmemoryNormVersion(memnorm.go:56) + classifier/style-версии — сейчас NFKC/unicode.Han/Cyrillicпривязаны к Unicode-версии тулчейна, но не фолдятся → бамп go1.27 сменил бы их ТИХО. Фолдить в ТОТ ЖЕ единый resnapshot, чтоpack.Version()(один заход). ТРИПВАЕР: обязательно до любого go1.27-бампа (мы на 1.26.4 — не горит, но не бампать тулчейн, пока Ш-2 не в снапшоте).- Ш-1 (низкая срочность): хелпер masked-diff при golden re-capture (
TM_UPDATE_GOLDEN=1→ маскировать хеш/версия-поля + печатать «N вердикт-изменений / M version-only» ДО записи). Делает re-capture безопасным по построению; можно в этом заходе или отдельной гигиеной.
Промт: сессия БЭКЕНД — единый пак по плану 11 (волновой раннер · чанкер/единицы · банк W1.5 · банкнота · чекеры · армы), 2026-07-19
Место в очереди (пост-D39.12): исследовательская программа арх-ресета (D39–D39.10) и дизайн-синтез (D39.11) ЗАВЕРШЕНЫ. План
docs/architecture/11-implementation-plan.mdРАТИФИЦИРОВАН (D39.12) после трёх рубежей верификации ($0-симуляции с числами — исполнены и воспроизводимы). Эта сессия — СТРОЙКА строго по нему. Решение владельца: весь объём — ОДНОЙ сессией, четырьмя блоками с чекпойнт-ревью между.
Кто ты и что сдаёшь
Бэкенд-сессия TextMachine. Зона записи: backend/ (вкл. configs/, prompts/); всё остальное читать
можно, править нельзя (расхождения — пингом через отчёт/владельца). НЕ коммитить — лендит оркестратор
после приёмки (git-гардрейл CLAUDE.md: никаких reset --hard/rebase/checkout поверх грязного дерева). Сдаёшь:
- Код резидуала R1 + Ш-1/Ш-2 + тесты из (д)-секций плана (пины/golden/race/kill-9).
- Отчёт — в финальном сообщении сессии (per-буллет чек-лист ✓/девиация+причина, тест-логи, golden-диффы,
«багфиксы вне плана», residual). НЕ заводить
backend/*_REPORT.md(процесс-правка владельца 19.07: код-зона чистая; постоянный record = D-блоки+PROGRESS; если оркестратору нужен детальный артефакт — пиши вdocs/archive/reports/<имя>_<дата>.md, НЕ вbackend/).
Онбординг-добавка: приёмочные детали прошлых заходов (Block A / continuation / арх-проход) — в
docs/archive/reports/ + D-блоки D39.13/14/16; §Резидуал R1 — там же в отчётах и в плане §1.
Онбординг (порядок чтения, ~45 мин)
CLAUDE.md(гардрейлы:.envНЕ читать · 18+ уровень 3 · PUML не рендерить · книга и производные ВНЕ git) →backend/README.md(инварианты 1–8 — ломать нельзя, каждый закреплён тестами) →docs/architecture/03-implementation-notes.md.docs/architecture/11-implementation-plan.mdЦЕЛИКОМ — это твоя спека. Структура: WS1–WS6, каждый (а) что менять / (б) алгоритм / (в) конфиг+снапшот / (г) исполненная $0-верификация с числами / (д) тест-спека ПОСЛЕ стройки / (е) открытое; §7 порядок · §8 манифест resnapshot · §9 диспозиции · §10 развилки владельца · §11 гейтнутые армы. План верифицирован трижды — не пере-решай его решения; несогласие или найденная дыра = эскалация запиской, не тихая девиация.docs/architecture/05-decisions-log.md: карта актуальности в шапке + D39–D39.12 подробно;09-target-architecture.md§0.1 (инвариант общности — НЕСУЩИЙ: никакой захардкоженной структуры книги/пары; пара = ось данных).docs/experiments/00-provider-quirks.md— ПЕРЕД любым кодом около адаптеров/конфигов моделей (вкл. свежую запись «mistral rate-limiter» в §Транспорт).- Референсы по мере работы:
eval/exp16/*.py(frozen miner-v1 — эталон порта WS3, SHA в exp16 §1.10),eval/design11/(симуляции/фикстуры плана — твои golden-входы; python —eval/.venv),research/20§B3 (банкнота),research/19§B (контекст чанкера). Авто-память сессий — point-in-time, верь коду/докам.
Порядок работы (по §7 плана; единый пак, 4 блока, гейты между)
- R1 = волновой ИСПОЛНИТЕЛЬ (отчёт §R1, 7 шагов):
snapshotIDForWave(W1 = draft-стадии +BaseVersion(), W2 = edit +Version()— механика версий уже сдана), партиция стадий по роли, W0 sticky-precompute (golden: инъекц-байты ≡ последовательному раннеру), W1/W2-dispatch (W2:prev= конкатенация draft-чекпоинтов единицы поfinal_hash, СВЕЖИЙSelectпо тексту единицы над enriched-банком; W2 НИКОГДА не пере-рендерит draft — несущий инвариант), W1.5-стоп + mined-write-путь (пустая дельта → авто-продолжение), kill-9 с N живыми резервами, golden-рерайт под волновую модель + обновление ~10 последовательно-модельных тестов (список — отчёт §0). - R2 = WS3 Go-майнер (отчёт §R2: порт по frozen exp16, дефолт-лемматизатор B с пере-пином 古月→22,
инвариантные фикстуры EXACT, mined-write,
tmctl seed-lint). - R3 = WS4 12 интеграционных точек (отчёт §R3: срез ДО classify, derived-checkpoint с NULL-байтами,
re-point ПОСЛЕ резолва эскалации,
banknoteSnap, инструкция в файл промпта, телеметрия). - R4 = WS5 чекеры + omission-бэкстоп + данные пакета zh-ru +
tmctl export --pairs(отчёт §R4). - R5 = WS6 арм-пайплайн-конфиги +
echo_mine_testпод варианты + атрибуция арма (отчёт §R5).
После R1, после R2+R3 и после R4 — чекпойнт-ревью (см. §Верификация). Единый --resnapshot по §8 в сессии
НЕ исполнять (плановое событие после приёмки, одна переоплата); но golden re-capture под
ратифицированную смену поведения — исполнять по мере: маскированный структурный дифф обязан быть объясним
(только хеши/версии/новые поля) и прикладывается в отчёт каждый раз.
Чек-лист исполнения (буллеты; ТОЧНАЯ спека — план + отчёт §Резидуал; при расхождении побеждает ПЛАН)
Статус после Block A (D39.13): WS2 — ✅ сдан целиком (кроме «инъекция W2-единицы» — часть исполнителя R1); WS1 — ✅ сданы WS1a/b/c-инфра (eager-clients, rate-guard, base/enriched split), остался волновой ИСПОЛНИТЕЛЬ (R1); WS4 — ✅ сдано ядро
banknote.go, остались 12 точек (R3); WS6 — ✅ rate_limit-конфиг, остались арм-конфиги (R5); WS3/WS5 — резидуал целиком (R2/R4). Сданные буллеты ниже читай как КОНТЕКСТ и контракт (не пере-строить — под тестами); строишь только резидуальные.
WS1 (план §1):
- Eager-build ВСЕХ клиентов в W0 (
Stages[].Model ∪ EscalateTo);client()в волнах read-only + громкий отказ на miss (закрывает гонкуrunner.go:171-181; трипваер на будущую 3-ю модель-ось). - W0-precompute sticky-цепочки (
Select— чистая src-производная функция). Golden: инъекц-байты precompute ≡ байтам последовательного раннера над НОВЫМ чанк-сетом WS2, fresh↔resume. - Пер-волновой снапшот:
snapshot_W1(draft-стадии + base-bank = хеш approvedSource∈{seed,ruby}),snapshot_W2(edit-стадии + enriched-bank = все approved вкл. mined). Механика для ОБОИХ состоянийPostcheckGate— по §1(в). - Инвариант секвенирования (НЕСУЩИЙ): W2 НИКОГДА не пере-рендерит/пере-хеширует draft-стадию — редактор
читает черновик по
final_hash-чекпоинту. Пин: draftrequest_hashбайт-стабилен под обогащённым банком. - W1.5-стоп-механика: стоп после W1 → карта подписи → подпись владельца → персист дельты ОТДЕЛЬНЫМ
mined-write-путём (штамп
Source:mined; НЕ черезloadGlossarySeed— тот хардкодитSource:seed,memseed.go:131) → resume в W2. Подпись mid-run трогает ТОЛЬКО mined-строки; правка seed/ruby-строки после W1 = громкий resnapshot-стоп, не тихий re-bill (пин-тест). - Деньги под ∥: Reserve/settle из N горутин через single-writer; kill-9-тест с N живыми резервами
(
committed==SUM, каждый потерянный вызов пере-оплачен один раз); overshoot-тестcost>estimate. - Scheduler-aware ценовые окна (конфиг провайдера, не хардкод; DeepSeek ×2 = риск-пин до ре-чека 24.07) +
пер-модельный rate-guard: семафор конкуренции
models.yaml max_concurrency(+опц. пейсинг); транспорт-ось, НЕ снапшот.waves.workersконфиг (НЕFanout— тот занят C2). - Grep legacy DeepSeek-слагов в
backend/configs/(прод не задет по плану — подтверди; eval-долг только отметь в отчёте, eval/ не правь — чужая зона).
WS2 (план §2):
- Бюджет draft-чанков в ВЫХОДНЫХ токенах:
est_out = 1.1978·cjk + 0.3852·other(конфиг per-pair, снапшот-foldedsegmentationSnap); классы символов — РЕАЛЬНЫЕunicode.RangeTableизEstimateTokens(НЕ ord-диапазоны скрипта — общность §0.1). Пин:target_out=1797→ 56 чанков на 25 главах. - Edit-единица = глава;
EditCeilingOut=3200(ратифицированный дефолт); глава >3200 → абзацный сплит (never-split-paragraph, lossless tiling). Пин: 25 глав → 37 единиц (фикстураws2_chunk_sim.py). 8000-арм НЕ открывать (гейтнут Q2a). Chunkаддитивно:EstOut,OversizedSentence(мега-предложение = passthrough + флаг, БЕЗ клауза-сплита),EditUnitID. Контракт Chapter/ChunkIdx/Text цел.- Снос мёртвых
STMDepth/OverlapTokens(config/pipeline.go:47-48) — carryover не строим. - src→dst-формат
renderEditorConstraintBlock(CONFIRMED-only дисциплина ЦЕЛА) + выделенныйrender-format-versionснапшот-компонент (НЕmemoryMatchVersion). - Сайзинг max_tokens редактора: существующий механизм от
prev-черновика (stagerun.go:87-90) — НОВОЙ формулы НЕ вводить (пост-верифай F8); проверить достаточность под единицу-главу тестом. - Инъекция W2-единицы = СВЕЖИЙ
Selectпо тексту ВСЕЙ единицы над enriched-банком (sticky на уровне глав вырожден); НЕ реюзить per-чанк memSel из W0 (тот над base-банком). Глоссарий-бюджет Select для главы-единицы — открытый пункт §2(е): реши инженерно, при сомнении эскалируй.
WS3 (план §3):
miner*.go: порт V-A→V-C строго по frozen exp16arms.py(точные пороги §3(б); детерминизм-контракт: сорт-ключи, целые, версии, tie-break). Лемматизатор: дефолт B — Палладий-подканал в Go-дефолте дропается, зависимые фикстуры пере-пинятся (古月 21→22); Палладий-ИНВАРИАНТНЫЕ гарантии — EXACT: 13618-кандидат-СЕТ (членство), recall 0.9649/0.9318, катастроф-скрин 方源/蛊/蛊师 ранги 0/1/2 ∈top-50.- Алиас-ярус-1 (R4-блоки ПЕРВЫМИ; юнит-фикстуры: 族长≠四代族长, компози-гард 古月+族长, кап-лемма-гейт
«найти»), консолидация §C2 (канон по ВСЕМ вхождениям; майнер по построению НЕ пишет approved), эмиссия
сид-дельты (схема
seedTermБЕЗ новых полей; эмиттер реюзит subsumption+fragment-фильтры, не сырой дамп). Source:"mined"(аддитивная миграция store) + mined-write-путь +tmctl seed-lint(сухой прогон фейл-лаудов реальногоloadGlossarySeedпо дельте).- Паритет Go↔Python: Python = референс; при расхождении чинить Go; доказанный баг референса → эскалация.
WS4 (план §4):
- Все 12 интеграционных точек с пин-тестами (список §4(д)). Несущие: срез
⟦TM-BANK-v1⟧ДОclassifyOutput; derived-checkpoint ТОЧНАЯ формула с NULL-байтами ("tm-banknote-v1\x00"+reqHash+"\x00"+stripped); re-pointfinal_hashOK-пути draft на derived — ПОСЛЕ резолва эскалации (stagerun.go:163, потреблятьlast.stripped— эскалированный черновик тоже очищен);banknoteSnap{enabled, parser_version}вsnapshotID(); инструкция сноски — В ФАЙЛ промпта переводчика (PromptSHA256 двигается); генерации finish=stop-only; телеметрияn_banknote_lines/banknote_parse_fail/banknote_truncatedлауд. - Пин: пере-парс 95 строк exp16 = 0 fail (фикстура
ws4_banknote_verify.py); толерантный обрез — синтетика.
WS5 (план §5):
- Чекеры DC1 (时辰/единицы) / DC2 (масштабы чисел) / DC6 (регистр-негатив-лист) / DC7 (editor-инверсии grade/role) — cheapgates-класс, target-gated, наблюдаемость НЕ гейт (landing гейтнут FP-замером §5(д) на свежем прогоне).
- DC3: инъекция пола — ВСЕ ТРИ состояния, вкл. hidden-мандат (безродовые конструкции / surface-«он» до
until_ch— фикс класса Бай Нинбин D19.3); детерм. чекер — ТОЛЬКО male/female, паратекст-чанки исключены; hidden-чекер НЕ строить (Ф2-кореференция). - DC5-детекцию НЕ строить (74%/42% FP) — пак-локусы (данные) + слот сноски; рендер-политика за владельцем.
- Omission-бэкстоп: substring-матч
{dst, decl.forms, aliases}+ лёгкий детерминированный ru-стеммер (Go-либа; БЕЗ pymorphy3); verdict-каскад иinflection_gap-флаг по плану. - Данные пакета пары zh-ru (таблицы единиц, негатив-лист, verse-локусы) — версионируемый снапшот-folded пакет.
tmctl export --pairs(source-join в Export уже есть) — пред-условие FP-замера DC1/DC2.
WS6 (план §6):
- Армы редактора = КОНФИГ (yaml/models: glm-5 / mistral-large-latest / deepseek-v4-pro), снапшот per-арм,
атрибуция арма в export/report;
echo_mine_testобновить под варианты; editor pinned (эскалации нет — D12). - mistral-арм разблокируется rate-guard'ом из WS1 — проверь связку тестом (семафор реально ограничивает).
Свободы и рамки (решения владельца, 19.07)
- Рефакторинг/перенос кода по папкам — РАЗРЕШЁН и приветствуется: архитектурная чистота важнее минимальности диффа. Границы: инварианты 1–8, контракты плана и поведение вне скоупа не менять молча; крупные структурные переносы — отдельным разделом отчёта (ревью-абельность лендинга).
- Без велосипедов: реюз stdlib и существующих механизмов репо (эталоны:
coverageSnap-фолд, derived-checkpoint, role-registry,baseRequestLog,config→stage-list). Новая внешняя зависимость — только с обоснованием в отчёте (канон Go: минимум зависимостей). - Временные тесты/харнесы — можно и нужно:
_test.goрядом с кодом; одноразовые скрипты — в scratchpad, НЕ в репо; временное помечай. - Баги по пути — чинить разрешено, каждый в раздел «багфиксы вне плана» (лендинг скоуп-раздельный).
- Не костылить: честная реализация (б)-алгоритмов; хак «чтобы тест прошёл» запрещён; недоделка = явная строка residual, не тихий пропуск.
- Go-каноны:
gofmt/go vet/-raceчисто; идиоматика (обёртка ошибок%w, контексты, без глобального мутабельного стейта, table-driven тесты); комментарии — в стиле окружающего кода (констрейнты, не пересказ). - Неконсистентность (план↔код↔доки↔вендор): НЕ гадать — даблчек всеми тулзами (grep по репо, git log, доки, официальная вендор-дока/вебсёрч — правило двух направлений CLAUDE.md); реальное расхождение → СТОП по этому куску + эскалация. Провайдер-аномалия → сначала вендор-дока, интерпретацию без сверки не вшивать.
- $0 к провайдерам: LLM-вызовы НЕ делать (ни облако, ни локаль) — вся верификация build/test/golden/ фикстуры. Wire-корректность доказывается голденом и байт-диффами, не живыми вызовами.
Верификация (мандат самопроверки владельца 12.07 — ОБЯЗАТЕЛЕН; + чекпойнт-ревью)
- Ревью исполнением непрерывно:
go build ./... && go vet ./... && go test -race ./...после каждого куска; «зелёное» подтверждай ЛОГОМ, не словом (урок D37: «0 ошибок» ≠ 0 ошибок). - Фикстуры плана — прогонять: sticky-байты ≡ sequential · 56 чанков @1797 · 37 единиц @3200 · miner-паритет (инвариантные EXACT; зависимые — пере-пин B) · банкнота 95/0 · kill-9 с N резервами · seed-lint 0 фейл-лаудов · draft request_hash стабилен под обогащённым банком.
- Чекпойнт-ревью после блоков A/B/C (адверсариальный воркфлоу, author≠reviewer, refute-by-default), три линзы: (i) алгоритм-vs-план — реализация против (б)-секций построчно, детерминизм (сорты/целые/версии); (ii) сеньорское код-ревью — Go-идиоматика, конкуренция, границы ошибок, чистота сеамов; (iii) функциональное — деньги/resume/снапшот/гейты end-to-end на фикстурах. Находки чинить ДО следующего блока; сводку каждого чекпойнта — в отчёт.
- Финал: полный многоосевой адверсариал по паку (деньги/resume · снапшот/волны · детерминизм ·
банк/банкнота · чекеры · экспорт · код-качество) + отчёт в финальном сообщении (НЕ
backend/*_REPORT.md). - Golden re-capture — только под ратифицированную смену поведения; маскированный дифф прикладывать всегда.
Что НЕ строить (гейтнуто/анти-скоуп — план §0/§11; в код не тащить)
Крупно-главный арм >3200 out (Q2a-гейт; потолок остаётся конфигом) · наполнение logical-стратегии чанкера
(сеам без контента) · carryover/lookahead · diff-редактор · reflow-отдельным-пассом · W2.5-швейный пасс ·
LLM-сегментация/ML-сцены/эмбеддинг-границы/RAG-оверлап · DC5-детерм-гейт · DC3-hidden-чекер · локальный
9B-споттер · жанр-паки · платные вызовы. Единый resnapshot — НЕ в этой сессии.
Эскалации и отчёт
Настоящие развилки (конфликт плана с кодом, нереализуемость (б)-алгоритма, скоуп/деньги, дыры плана) — эскалируй БЫСТРО короткой запиской через владельца (развилка + варианты + твоя рекомендация); это норма и поощряется (образцы эры №6 — в D-логе), тихие девиации запрещены. Приёмка оркестратора после сдачи: верификация исполнением (build/race/пины/golden-репликация) + адверсариальный рубеж-2 по сырью → лендинг → единый resnapshot → пере-прогон 3–10 глав → чтение владельца (планка 2 претензии).