diff --git a/CLAUDE.md b/CLAUDE.md index 948304d0..0d3dc04a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,6 @@ # TextMachine — контекст для Claude-сессий -Go-бэкенд издательского художественного перевода крупных текстов (ранобэ/вебновеллы, zh/ja/en→ru) через мультиагентный LLM-пайплайн: черновик deepseek-v4-flash → **БИЛИНГВАЛЬНЫЙ редактор deepseek-v4-pro ИНТЕРИМ (D30.1/D39.22; glm-5 резерв)** → судья Gemini (Ф2). Цели: победить translationese; низкий COGS (~$0.85/ранобэ после флипа D1 — D30.4); детерминированный банк памяти книги; 18+ с учётом цензуры; телеметрия денег с первого дня. +Go-бэкенд издательского художественного перевода крупных текстов (ранобэ/вебновеллы, zh/ja/en→ru) через мультиагентный LLM-пайплайн: дешёвый черновик → редактор → детерминированные $0-гейты → судья (Ф2). Цели: победить translationese; низкий COGS; детерминированный банк памяти книги; обработка чувствительного контента с учётом цензуры провайдеров; телеметрия денег с первого дня. ## Роли сессий и зоны (НЕ править чужую зону) @@ -10,11 +10,11 @@ Go-бэкенд издательского художественного пер | **Полигон (eval)** | `eval/` + `docs/experiments/` | то же | | **Оркестратор** | `docs/` (architecture/research/PROGRESS), ревью чужого кода read-only | ратифицирует решения, пишет хендофф-промты | -Координация — журнал `docs/PROGRESS.md` (секции «Бэкенд»/«Полигон»/«Память»/«Голос и состояние»/«Ридер-IDE»; сверху CURRENT-STATE). Записывай туда краткие итоги своей сессии. Закрытые хроники вынесены в `docs/archive/PROGRESS-*.md` (три слайса: 04–10 · 10–13 · 13–25.07) — НЕ читать при онбординге, только по конкретной ссылке. +Координация — журнал `docs/PROGRESS.md` (секции «Бэкенд»/«Полигон»/«Память»/«Голос и состояние»/«Ридер-IDE»; сверху CURRENT-STATE). Записывай туда краткие итоги своей сессии. Закрытые хроники вынесены в слайсы `docs/archive/PROGRESS-*.md` — НЕ читать при онбординге, только по конкретной ссылке. Параллельные сессии — норма: чужие незакоммиченные файлы в дереве не трогать; сессия считается ЖИВОЙ, пока владелец не сказал обратное. ## Источники истины (по убыванию) -1. **`docs/architecture/05-decisions-log.md` (D1–D39.64)** — ратифицированный контракт; при конфликте с любым другим доком побеждает он; сверху файла — карта актуальности (что чем superseded). **Правило чтения (онбординг-диета 25.07): карта + живая голова (эра D39.x); корпус D1–D38 = справочник — по ссылкам/grep по D-номеру, целиком НЕ читать.** +1. **`docs/architecture/05-decisions-log.md`** — ратифицированный контракт; при конфликте с любым другим доком побеждает он; сверху файла — карта актуальности (что чем superseded), свежая голова — С ХВОСТА файла. **Правило чтения (онбординг-диета 25.07): карта + живая голова (эра D39.x); корпус D1–D38 = справочник — по ссылкам/grep по D-номеру, целиком НЕ читать.** 2. `docs/experiments/00-provider-quirks.md` — wire-квирки провайдеров (читать ПЕРЕД правкой адаптеров/вызовами провайдеров). 3. `docs/architecture/09-target-architecture.md` (7 слоёв; статус стройки — шапка-таблица) · `12-go-style-notes.md` (норматив общности §0) · `10-prompt-architecture.md` (промпт-тема). 4. `docs/architecture/01-decisions.md` (Р1–Р10), `02-mvp-plan.md`, `04-unhappy-paths.md`, `06-memory-risk-registry.md` — тела исторические, читать через ⚠-баннеры 25.07. @@ -24,7 +24,6 @@ Go-бэкенд издательского художественного пер ## Гардрейлы (жёсткие) - **НИКОГДА не читать `.env`** (`backend/.env`, `eval/.env`) — там ключи. `.env.example` можно. -- **18+ уровень 3** (несовершеннолетние в сексуальном контексте) — не обрабатывать/не анализировать; `eval/data/refusal_corpus/*` не открывать без прямой задачи владельца. - **PUML не рендерить в svg/png** — владелец смотрит PlantUML-расширением VS Code. - **Коммиты**: английский, одно предложение ≤30 слов, без Co-Authored-By. `.claude/settings.local.json` НЕ коммитить (ломает пермишены). - Провайдерские ловушки: **DeepSeek — НИКОГДА не отключать thinking** (эхо-мина; гейт `echoMineViolation` это принуждает); grok-4.3 reasoning off — только ЯВНЫЙ `reasoning_effort:"none"` (дефолт low; wire-квирк в силе, но из РЕДАКТОРСКИХ ролей reasoning-off снят — no-op, D30.1); слаги моделей не менять без live-фактчека `/models`; ⚠ «слаг живой» ≠ «модель та же» — DeepSeek 31.07 сменил веса под слагом (D39.61), при аномалиях сверять поведение и вендор-лог обновлений. **Пробы/запросы падают или ведут себя странно (флейки, 404 живой модели, новый finish_reason, игнор параметров) → идём в официальную доку вендора (deprecations/changelog/status) и гуглим, НЕ гадаем** — интерпретацию аномалии без вендор-сверки в доки/промты не абсорбировать (решение владельца 10.07; правило двух направлений — `00-provider-quirks.md` шапка). @@ -38,13 +37,3 @@ Go-бэкенд издательского художественного пер 1. Этот файл → `docs/README.md` (карта) → CURRENT-STATE в `docs/PROGRESS.md`. 2. `docs/architecture/05-decisions-log.md`: карта актуальности (шапка) + живая голова (D39.x). Целиком НЕ читать — корпус D1–D38 по ссылкам/grep по мере надобности. 3. По роли: Бэкенд — `backend/README.md` + `03-implementation-notes.md` (через баннер) + `12-go-style-notes.md`; Полигон — `eval/README.md` + `experiments/00` + `09-pilot-protocol.md`; всем — шапка-таблица `09-target-architecture.md` (статус слоёв). - -## Текущее состояние (2026-08-01, голова D39.64 — эра «общность → автономность банка») - -- **Сделано:** Ф0 ✅ · Ф1-инфра ✅ · арх-ресет D39 (7 слоёв, паки 11–16) ✅ · паки 17–20 ✅ (канал B · долги контракта · голос/состояние · банк+терминолог; D39.26–56) · мини-прогон (D39.37) и ХОЛОДНЫЙ прогон (D39.58: recall банка майнер∪банкнота 0.918/0.980, банк приходит переведённым) приняты · **карта языковой привязки движка (D39.60): долг 149 сайтов/45 файлов, книго-ось чиста (4 сайта), ja→ru безопасно без правки Go, en→ru — нет** · Р1–Р4 закрыты (D39.63: Р2 = детекторы единиц судят ЗНАЧЕНИЕ; Р4 = потолок recall в контракт правила) · пак-21 растворён (D39.62) · **фаза 2 общности ✅ (D39.64: П0 эмбед-хеш · П1 цель-шов по данным · П2 скрипт-шов, ko-баг закрыт · П3 нарезка · П4 манифест-по-каналам; голден вердикт-нейтрален, 9 флагов §5 у владельца)** · жанровый словарь ОТМЕНЁН КАК КЛАСС (D39.47) · петля ремонта построена и НЕ включается (D39.38). -- **Сейчас:** полигон-ветка параллели D39.62 — $0-сырьё арки автономности банка отработано, отчёт в дереве, **приёмка по релею владельца** (промт `docs/POLYGON_BANK_RAWMATERIAL_SESSION_PROMPT.md` активен до приёмки). Перекупок на этой фазе нет — стендовый корпус одноразовый (D39.63). -- ⚠ **DeepSeek-V4-Flash-0731 (31.07): веса сменились ПОД ТЕМ ЖЕ СЛАГОМ — боевая черновая форма покупает пустые ответы; платные прогоны СТОП до ре-пробы** (бэклог-строка 74, оперативно «ждём»; v4-pro/редактор не тронут). -- **Очередь дальше (D39.62):** приёмка полигон-сырья → дизайн арки АВТОНОМНОСТИ банка (подпись владельца опциональна — банк обязан приходить качественным автономно, D39.59) → ре-проба flash → свежий мини-прогон на новом стеке (оси голоса · авто-режим · итерация №2 редакторов) → свип гипотез → добор идеала → вторая пара живьём (ja→ru) → МАСШТАБ → пилот Ф2.5 → Ф3 ридер-IDE. -- **Стек:** draft deepseek-v4-flash thinking-ON (+банкнота) ⚠0731 → терминолог (та же дешёвая модель, батчи) → editor deepseek-v4-pro БИЛИНГВ ИНТЕРИМ (glm-5 резерв) → судья gemini-preview + grok-фолбэк 18+ (Ф2, только полигон). ~$0.85/ранобэ (D30.4) — пере-калибровка после развилки 74; терминолог — центы на выборках, ≈$1.10 полный банк. -- **Висит на владельце + открытые петли:** ЕДИНЫЙ БЭКЛОГ — таблица в `docs/PROGRESS.md` (единственное место). Стоячие: ToS-триггер 25.10 · Ш-2 трипваер до go1.27. -- **Стенд:** WSL2, GTX 1070 8GB (localhost из-под прокси = 403 — no-proxy транспорт для local). Книга `/home/ubuntu/books/gu-zhenren/` (GB18030; текст и производные ВНЕ git). diff --git a/backend/README.md b/backend/README.md index 7f70dea6..8ad655d6 100644 --- a/backend/README.md +++ b/backend/README.md @@ -1,33 +1,35 @@ # backend/ — Go-бэкенд TextMachine -Зона сессии «Бэкенд». Контракт — `docs/architecture/05-decisions-log.md` (D1–D39.16); целевая архитектура арх-ресета (7 слоёв, инвариант общности §0.1 — любая книга/пара/структура) — `docs/architecture/09-target-architecture.md`; **план реализации пере-прогонного стека — `docs/architecture/11-implementation-plan.md` (D39.12, ратифицирован); активный промт стройки — `docs/BACKEND_PLAN11_SESSION_PROMPT.md` (R1 драйвер-свитч)**; контракты Фазы 0 — `03-implementation-notes.md`; квирки провайдеров — `docs/experiments/00-provider-quirks.md`. **Язык-данные майнера — вне пайплайна: `internal/lang`+`configs/langpacks/` (D39.16); пар-калибровки — `configs/pairs/<пара>.yaml`, промпты — `prompts/<пара>/<роль>.md` по конвенции (D39.23).** **Подсистемы (`chunk`/`miner`/`checks`/`membank`) не импортируют друг друга и не импортируют `pipeline` — драйвер является композит-корнем (D39.23; проверяется `go list -deps`).** **`.env` не читать.** +Зона сессии «Бэкенд». Контракт — `docs/architecture/05-decisions-log.md` (свежая голова — с хвоста файла); целевая архитектура (7 слоёв, инвариант общности §0.1 — любая книга/пара/структура; статус стройки — шапка-таблица) — `docs/architecture/09-target-architecture.md`; норматив общности — `12-go-style-notes.md`; **актуальный сессионный промт — список «Активные хендофф-промты» в `docs/README.md`**; контракты Фазы 0 — `03-implementation-notes.md` (через баннер); квирки провайдеров — `docs/experiments/00-provider-quirks.md` (читать ПЕРЕД правкой адаптеров/вызовами). **Язык-данные майнера — вне пайплайна: `internal/lang`+`configs/langpacks/` (D39.16); пар-калибровки — `configs/pairs/<пара>.yaml`, промпты — `prompts/<пара>/<роль>.md` по конвенции (D39.23).** **Подсистемы (`chunk`/`miner`/`checks`/`membank`) не импортируют друг друга и не импортируют `pipeline` — драйвер является композит-корнем (D39.23; проверяется `go list -deps`).** **`.env` не читать.** -*(Актуализировано оркестратором 17.07 по мандату владельца, факты сверены по коду; предыдущая ревизия была эры D23.)* +*(Актуализировано оркестратором 01.08 по мандату владельца, факты сверены по коду; предыдущая ревизия 17.07 — эры D39.16, до паков 16–20 и фазы 2 общности D39.64.)* ## Карта пакетов | Пакет | Что делает | Ключевые файлы | |---|---|---| | `cmd/tmctl` | CLI: `translate` / `status` (read-only N/M+паспорта глав+деньги, `--json`; работает ПРИ живом прогоне — store без flock) / `report` (request-log+леджер книги **+ per-run quality-report**: структурный KPI предл./нарратив-абзац, тире, cosmetic-strip/echo-rates, глоссарий-промахи, trust-gated — наблюдаемость, НЕ гейт; D39.2-T4) / `export` (**экспорт-поверхность для полигона**: final_hash→checkpoint→checks.ExportNormalize, manifest-join c pending/ghost-учётом, ConfigDrift-поле, `--plaintext`; D39.5) / `redrive` (переатака флагнутых: `--chapter/--chunk/--reason/--dry-run`, D15.3). main — тонкая обвязка: разбор/exit-коды/.env/рендеры в тестируемых функциях | `main.go`, `invocation.go`, `render.go`, `dotenv.go` | -| `internal/llm` | OpenAI-совместимый транспорт + retry/backoff, **capability-слой** (budget_field/temperature/reasoning per-модель), failover (написан, НЕ подключён — D4: только local-роли), нативный Anthropic = DEPRECATED-референс | `httpllm.go`, `capability.go`, `failover.go` | +| `internal/llm` | OpenAI-совместимый транспорт + retry/backoff, **capability-слой** (budget_field/temperature/reasoning per-модель), провайдеры openai/local (no-proxy)/anthropic (DEPRECATED-референс); `failover.go` удалён паком-17 — маршрутизация лейблами живёт в config/pipeline (канал B, один хоп `chain[0]`, fail-closed) | `httpllm.go`, `capability.go`, `provider_*.go` | | `internal/ledger` | Цены по usage (вкл. reasoning/cache-поля), `PriceForResponse` по фактической модели | `pricing.go` | -| `internal/store` | SQLite (modernc, CGO-free), идемпотентные миграции **v1–v8** (v8 = trust-gate поля retrieval_state, D39.2-T1), reserve/settle+checkpoint, chunk_status, глоссарий, ruby, retrieval_state (стиль-флаги v7 + `n_trust_gated_suppress`/detail v8), request_log; `OpenReadOnly` — без flock/миграций/recovery для status/report/export | `ledger.go`, `migrate.go`, `glossary.go`, `store.go` | +| `internal/store` | SQLite (modernc, CGO-free), цепочка миграций `schema_version` (⚠ ALTER-шаги v8+ не идемпотентны вопреки шапке — бэклог-строка 49а), reserve/settle+checkpoint, chunk_status, глоссарий (+подписной цикл терминолога), ruby, retrieval_state, request_log; `OpenReadOnly` — без flock/миграций/recovery для status/report/export | `ledger.go`, `migrate.go`, `glossary.go`, `store.go` | | `internal/config` | fail-fast загрузка models/pipeline/book; **эхо-мина-гейт** `echoMineViolation`; `CheckRunnable` блокирует неисполнимое (C2/fanout/judge); **пар-слой** (D39.23): `configs/pairs/<пара>.yaml` — калибровка нарезки + коридор длины пары; **промпт-резолв КОНВЕНЦИЕЙ** `prompts/<пара>/<роль>.md` из `Book.LangPair()`+роли, **fail-loud на пару без пакета** (ja-книга не едет молча через zh-промпт), осознанное исключение — `prompt_override` на стадии | `models.go`, `pipeline.go`, `pair.go` | -| `internal/text` | Нормализация и рун-примитивы, общие для банка/майнера/чекеров: `NormalizeSourceKey`/`NormalizeTargetForm` (версионированный артефакт `NormVersion()`, фолдится в снапшот), `NormalizeSource`, `RunesEqual`, `TokenizeCyrillic` | `norm.go`, `runes.go`, `source.go` | +| `internal/text` | Нормализация и рун-примитивы, общие для банка/майнера/чекеров (script-agnostic слой, `lang` НЕ импортирует): `NormalizeSourceKey`/`NormalizeTargetForm` (версионированный артефакт `NormVersion()`, фолдится в снапшот), `NormalizeSource`, `TokenizeScript` (алфавит цели из данных, Mn-фолд U+0301; `TokenizeCyrillic` = ru-дефолт-обёртка), `DenseScript` — единый дом sizing-таксономии (D39.64) | `norm.go`, `runes.go`, `source.go` | | `internal/seed` | Схема сид-YAML книги (`File`/`Term`/`Decl`/`Alias`) — общий артефакт: майнер её ПИШЕТ (mined-дельта), банк ЧИТАЕТ (`LoadGlossarySeed`); тип общий, поэтому эмиссия не может разъехаться с загрузчиком | `seed.go` | +| `internal/lang` | Языковые ДАННЫЕ и пак-механизм: эмбед-плоскость `data/*.txt` (хешируется в `EmbeddedVersion()` → снапшот, D39.64) · langpack `Load`/книго-overlay (аллоулист файлов, fail-loud) · **манифест-по-каналам** (`manifest.txt` источника объявляет `source-morphology`/`transliteration`; манифест-less пак = все каналы, байт-идентичен) · единый реестр письменностей `script.go` (`LangScripts`/`IsCJKScriptLang` из `lang-script.txt`) · реестр целей из `data/target-.txt` | `langpack.go`, `embedded.go`, `script.go` | +| `internal/terminology` | Роль терминолога (пак-20): смердженный банк + KWIC-контексты → батчи консолидации dst той же дешёвой моделью; языковой экран `target_script`; durable-деньги подписного цикла | `terminology.go`, `script.go` | | `internal/chunk` | Ингест (txt/epub, кодировки, ruby) + чанкер: `Ingest`/`IngestEncoded` → `Document`, `SplitChunks` → `[]Chunk` по `SegBudget`; структура источника (главы, CJK-числительные, heading-правило) — ДАННЫЕ из `lang` | `ingest.go`, `chunker.go`, `chunktest/` | | `internal/membank` | Банк памяти v2, memmatch-v4: Aho-Corasick, спойлер-окна, disposition, **trust-gated longest-match** (draft-длиннее НЕ съедает вложенный approved; отказ = громкая телеметрия — терм-дрейф закрыт в КОДЕ, D39.2-T1), post-check, рендереры инъекции, загрузка/валидация сида (`SeedLint`) | `memory.go`, `memseed.go`, `mempostcheck.go` | | `internal/miner` | Детерминированный оффлайн-майнер банка (WS3, $0): `MineBank` над нормализованными чанками + контраст-корпус → `[]Term`, `DeltaYAML` — сид-дельта на подпись владельца; все пар-данные приходят `*lang.Pack` | `miner.go`, `miner_*.go` | -| `internal/checks` | Детерминированные $0-вердикты над текстом чанка: **санитайзер v6** (fold-first детекция всех 6 классов, D39.5-F1 + CJK-глосс-whitelist, D39.5-F2) + `ExportNormalize` (**export-contract слой 6**), cheap-гейты и DC-чекеры (пар-данные из пака), coverage-гейт эксцизии, regression-guard. Флаг-вокабуляр НЕ импортирует: возвращает факт, диспозицию назначает драйвер | `sanitizer.go`, `cheapgates.go`, `checkers.go`, `coverage.go` | +| `internal/checks` | Детерминированные $0-вердикты над текстом чанка, **target-aware ПО ДАННЫМ (D39.64): `Checkers` компилируется из цель-данных, `TargetActive()`/`TargetScriptNonLatin()` гейтят всё — цель без данных инертна, Go-веток по паре нет**: санитайзер v7 (fold-first, CJK/Hangul-leak, CJK-глосс-whitelist) + `ExportNormalize` (**export-contract слой 6**, no-op без цель-данных), cheap-гейты и DC-чекеры (пар-данные из пака), coverage-гейт эксцизии, regression-guard. Флаг-вокабуляр НЕ импортирует: возвращает факт, диспозицию назначает драйвер | `sanitizer.go`, `cheapgates.go`, `checkers.go`, `coverage.go` | | `internal/pipeline` | Композит-корень (драйвер): сетап `runner.go` → снапшот `snapshot.go` → сид `seeding.go` → цикл книги `bookrun.go` → волны `waverun.go` → петля чанка `chunkrun.go` → стадия `stagerun.go` → эскалация с ре-гейтом `escalation.go` → resume `resume.go`; classify/disposition; **реестр `roleInjectionRenderers`** (новая роль = данные+рендерер, не правка switch); `export.go`/`quality.go`/`status.go` — read-only проекции (общая derivation member-drop = `memberDrops`) | `bookrun.go`, `waverun.go`, `stagerun.go`, `export.go`, `disposition.go` | | `internal/obs` | trace_id, структурные логи (contextHandler несёт book/chapter/chunk/stage/role из ctx), safego | | ## Инварианты — ЛОМАТЬ НЕЛЬЗЯ (каждый закреплён тестами) 1. **Деньги:** reserve → call → **settle+checkpoint одной транзакцией**; `committed == SUM(checkpoints)` переживает kill -9 (`kill9_test.go`); цена — по фактически ответившей модели; потолки книга/день считают committed+reserved. **Одно исключение — явный `tmctl redrive`** (D15.3): после него `committed ≥ SUM(checkpoints)` — безопасное направление. -2. **Snapshot-дисциплина:** всё, что влияет на wire-байты ИЛИ вердикты (capability, память content-hash + `memoryMatchVersion`, context-assembly, версии classify/coverage/chunker/maxtok/**sanitizer (только при enabled)**, эскалационные оверрайды, **биндинг пара→промпт** через BriefHash+PromptSHA256), свёрнуто в `snapshotID`; правка = громкий `--resnapshot` = переоплата книги (D15). +2. **Snapshot-дисциплина:** всё, что влияет на wire-байты ИЛИ вердикты (capability, память content-hash + `memoryMatchVersion`, context-assembly, версии classify/coverage/chunker/maxtok/**sanitizer (только при enabled)**, **эмбед-данные `lang.EmbeddedVersion()` (D39.64)**, эскалационные оверрайды, **биндинг пара→промпт** через BriefHash+PromptSHA256), свёрнуто в `snapshotID`; правка = громкий `--resnapshot` = переоплата книги (D15). Новый фолд обязан быть УСЛОВНЫМ по присутствию данных (правило §6.2, D39.60). 3. **Эхо-мина DeepSeek:** thinking НИКОГДА не отключать — `reasoning:"off"` там осознанный no-op; `echoes_when_thinking_off` + рекурсивный скан extra_body валят конфиг fail-fast. У grok off = ЯВНЫЙ `reasoning_effort:"none"`. -4. **Порядок classify:** refusal-blacklist / CJK-echo — ДО length/empty; retry-flagged только {length, empty} на той же модели; loop-чек ПЕРЕД удвоением max_tokens. Санитайзер — ТОЛЬКО на финальной стадии (isFinal) и только при ru-target. +4. **Порядок classify:** refusal-blacklist / эхо источника (`sourceScriptShare` по ОБЪЯВЛЕННОМУ письму, D39.64) — ДО length/empty; retry-flagged только {length, empty} на той же модели; loop-чек ПЕРЕД удвоением max_tokens. Санитайзер — ТОЛЬКО на финальной стадии (isFinal) и только при активной цели (`TargetActive`). 5. **Эскалация:** ровно 1 хоп, результат РЕ-гейтится, retry-бюджет не сбрасывается, editor pinned, канал adult — только permissive (fail-closed). 6. **Детерминизм:** рендер — чистая функция snapshot; сортировки перед записью; никакого map-order в выводе; length-prefixed хэши; сорс-чанкер lossless (fuzz). 7. **Нейтральность адаптера:** `internal/llm` не знает про перевод — контент-вердикты в раннере (disposition-слой, post-settle). @@ -42,6 +44,8 @@ ## Как гонять +Стенд: WSL2 (localhost из-под прокси = 403 — для local-вызовов no-proxy транспорт). Книга-стенд: `/home/ubuntu/books/gu-zhenren/` (GB18030; тексты и производные ВНЕ git; парити-тесты майнера читают отсюда под `TM_MINER_PARITY=1`). + ```bash go build ./... && go vet ./... && go test ./... -race # всё зелёное = норма go run ./cmd/tmctl translate --config example/book.yaml # реальные вызовы — ключи в .env (пример: zh→ru) @@ -56,11 +60,11 @@ set -a; . ./.env; set +a; TM_LIVE=1 go test -tags live -run TestLive -v ./intern Финал каждой вехи — агентское адверсариальное селфревью (мандат CLAUDE.md 12.07); внешнее ревью — оркестратор. -## Известный техдолг (не трогать молча — см. D-лог / ledger `08-sync-audit-ledger.md`) +## Известный техдолг (не трогать молча; ЕДИНЫЙ трекер — таблица «Бэклог» в `docs/PROGRESS.md`, номера строк = она) -- **Слой 1 (нарезка) НЕ построен:** `targetChunkTokens=1500` — const в единице оценки исходника; логическая граница/декаплинг edit-единицы/когезия — гейтятся exp15 (research/19 §D). **`STMDepth`/`OverlapTokens` — мёртвые заглушки** (в конфиге+снапшоте, исполнение их НЕ читает) — оживают со слоем 1, не удалять и не «подключать» мимоходом. -- **D15.2:** READ-половина `tmctl export` ПОСТРОЕНА (D39.5, минимальная форма); annotation/override-половина и content-addressed resume — отложены (v3.1-спека = дизайн-оф-рекорд, `docs/D15.2-…spec.md`). -- **Retries.RegenerateBeforeEscalate НЕ в снапшоте** (pre-existing, D39.4-LOW): в крэш-окне пониженный ретрай-бюджет молча бросает оплаченные OK-чекпоинты. Дизайн-фикс при следующем заходе в stagerun. -- F3 at-most-once (после D15.2); Escal.Chains — валидируемый мёртвый конфиг (раннер читает только `escalate_to`); флоры min_max_tokens = схема (D24.3). -- `prompts/zh-ru/editor-mono.md` — референс-вариант D13.1 (не боевой, тестом закреплён); боевой = `prompts/zh-ru/editor.md` v3-discourse (БИЛИНГВ) (промпты pair-keyed под `prompts/zh-ru/`, pair-14 §9). Глосс-капы санитайзера (6 CJK / 24 лат-токен) — tunable-эвристики (D39.5), ревизия по чтению пере-прогона. -- Хвост LOW/NOTE-находок адверсариала D39.4 — в ledger-очереди (golden-ячейка глосса, escalated+stripped тест, trustGateEvent первый-отказ и пр.). +- **D15.2:** READ-половина `tmctl export` построена (D39.5); annotation/override-половина и content-addressed resume отложены (строка 49). F3 at-most-once — после D15.2 (строка 50). +- **`Retries` НЕ фолдится в снапшот** (pre-existing, D39.4-LOW; сознательно так же для ручки `RegenerateEchoBeforeEscalate`, D39.64 — дефолт 0 = текущее поведение): в крэш-окне пониженный ретрай-бюджет молча бросает оплаченные OK-чекпоинты. +- ⚠ ALTER-шаги миграций v8+ НЕ идемпотентны вопреки шапке `migrate.go` — полу-применённая БД не сходится (строка 49а). +- Остаточные Cyrillic-хардкоды пар-гейтед DC-чекеров (`checks/repair.go:131`, `checks/checkers.go:457,474`) — инертны без dc-данных пары; кандидат на `c.wordScript` (строка 79). +- `prompts/zh-ru/editor-mono.md` — DORMANT-референс D13.1 (не боевой, тестом закреплён); боевой = `prompts/zh-ru/editor.md` v3-discourse (БИЛИНГВ). Глосс-капы санитайзера (6 CJK / 24 лат-токен) — tunable-эвристики (D39.5). Флоры min_max_tokens = схема (D24.3). +- Хвост LOW/NOTE-находок адверсариала D39.4 — в ledger-очереди (строка 53). diff --git a/docs/ORCHESTRATOR_SESSION_PROMPT.md b/docs/ORCHESTRATOR_SESSION_PROMPT.md index 9d72177f..378f28d7 100644 --- a/docs/ORCHESTRATOR_SESSION_PROMPT.md +++ b/docs/ORCHESTRATOR_SESSION_PROMPT.md @@ -12,6 +12,8 @@ **Норма приёмки и усилий (владелец 30.07, ужесточает пропорциональность 25.07):** тяжёлый агентный аппарат (воркфлоу-верификаторы, панели) — ТОЛЬКО поверх серьёзных перестроек и дизайнов; в остальном сессиям доверяем. Значительные изменения → промт сессии несёт цикл «план → синк по вопросам → чтение доков полигона/оркестратора → исполнение → самоверификация ТОЙ ЖЕ сессией». Оркестратор: КОРОТКАЯ приёмка чтением отчёта · общее планирование над репо · досинхронизация команды (полигону — инструкции смотреть на бэкенд, бэкенду — на полигон-экспы) · правка недосинхронизированных мест. Токены беречь: болтливость сессий подрезать промтами, свои усилия — тоже. **Норма самопроверки сессий (владелец 01.08, «ВСЕГДА. НА ВАЖНЫХ»):** промт ЛЮБОЙ важной сессии (бэкенд-паки, ресёрчи, платные полигон-пакеты) ОБЯЗАН нести явный мандат самопроверки исполнением; на мелких задачах — самопроверка меньше, без тяжёлого аппарата. В мандат включать урок D39.61: «вывод на агрегате до вскрытия единиц запрещён — перед сравнительным выводом открыть хотя бы одну единицу с каждой стороны»; для денег — два независимых пути счёта; помнить «леджер = нижняя граница» (строка 78). +**Живость параллельных сессий (урок 01.08 №2):** наличие файлов отчёта в дереве ≠ «сессия закончила» — сессия считается ЖИВОЙ, пока владелец не сказал обратное; не заявлять «параллельных сессий нет» по артефактам, окно правок чужой зоны держать минимальным. + **Git при параллельных сессиях (урок 01.08):** коммитить ТОЛЬКО явными путями — НИКОГДА `git add -A`/`git add .` в общем дереве: чужие незакоммиченные правки (фаза-2 бэкенда) чуть не уехали в док-коммит; поймано самопроверкой `git status` после коммита, исправлено soft-reset + пере-коммитом явных путей (рабочее дерево сессии не тронуто). diff --git a/docs/experiments/README.md b/docs/experiments/README.md index 534a825e..7923ce1e 100644 --- a/docs/experiments/README.md +++ b/docs/experiments/README.md @@ -1,6 +1,6 @@ # Эксперименты полигона — карта -Один эксперимент = один отчёт `NN-*.md` (методика + цифры + честные ограничения). Здесь — **индекс**: что установил → чем ратифицирован → статус. Каждая строка сверена по шапке самого дока + D-логу (**досведено 25.07, голова D39.28**: добавлены exp15/exp16, прежний срез стоял на 12.07/D38.2). Карта **скриптов** (какой `.py` какому эксперименту) — в [`eval/README.md`](../../eval/README.md) §Карта; здесь — про **выводы**. +Один эксперимент = один отчёт `NN-*.md` (методика + цифры + честные ограничения). Здесь — **индекс**: что установил → чем ратифицирован → статус. Каждая строка сверена по шапке самого дока + D-логу (**досведено 25.07, голова D39.28**: добавлены exp15/exp16; **ре-сверка 01.08, голова D39.64**: новых экспериментов нет, `00-provider-quirks` синхронизирован с катовером DeepSeek-0731 по D39.61). Карта **скриптов** (какой `.py` какому эксперименту) — в [`eval/README.md`](../../eval/README.md) §Карта; здесь — про **выводы**. **Легенда статуса:** ⭐ЖИВОЙ-reference (читать при работе) · ЖИВОЙ (открытый инструмент/протокол) · закрыт (есть review-header/⚠-баннер; вывод ратифицирован, тело не редактируем — D23.3) · settled (одноразовый бенч, вопрос закрыт). diff --git a/eval/README.md b/eval/README.md index a6b247f6..deed7720 100644 --- a/eval/README.md +++ b/eval/README.md @@ -1,12 +1,14 @@ # eval/ — полигон TextMachine -Зона сессии «Полигон»: эмпирическая валидация допущений архитектуры (мерить, а не верить). Отчёты — `docs/experiments/NN-*.md` (методика + цифры + честные ограничения). `backend/` только читать; расхождения с architecture/research — пингом оркестратору в `docs/PROGRESS.md`. **`.env` не читать; `data/refusal_corpus/*` не открывать без прямой задачи владельца.** +Зона сессии «Полигон»: эмпирическая валидация допущений архитектуры (мерить, а не верить). Отчёты — `docs/experiments/NN-*.md` (методика + цифры + честные ограничения). `backend/` только читать; расхождения с architecture/research — пингом оркестратору в `docs/PROGRESS.md`. **`.env` не читать; `data/refusal_corpus/*` не открывать без прямой задачи владельца; 18+ уровень 3 (несовершеннолетние в сексуальном контексте) — не обрабатывать и не анализировать ни в каком виде** (гардрейл владельца; вынесен сюда из CLAUDE.md 01.08 — специфика зоны 18+-корпусов). -> **Очередь полигона (пост-D39.22, освежено пакетом-5 25.07.2026):** исследовательская программа ЗАВЕРШЕНА — exp15 (сегментация/когезия, D39.7–9, `eval/exp15/`), Q4a (слабое звено = редактор), exp16 (банк-майнинг W1.5, D39.10, `eval/exp16/`) залендены. **Пере-прогон rerun2 тоже ИСПОЛНЕН, прочитан (D39.20) и ЗАКРЫТ решением владельца (D39.22)** — прежняя строка «следующая задача = пере-прогон» была ДО него и снята. Итог: операционка отработала живьём ($0-резюм черновика ×3 арма, **$6.63 из $15**, echo 0, майнинг-стоп → подпись), но **планка «≤2 претензии» НЕ пройдена — пилот Ф2.5 не открыт**; `mistral` **ИСКЛЮЧЁН** как несущий редактор (анти-корреляция гладкость↔верность, воспроизведена ×3); редактор = **deepseek-v4-pro ИНТЕРИМ** (glm-5 резерв); dspro-vs-glm НЕ ратифицирован (зазор ≈ шум) → **итерация №2 ОТЛОЖЕНА** довеском к следующему платному прогону. **Курс проекта — разработка бэкенда; своих прогонов полигон сейчас не заказывает.** +> **Очередь полигона (освежено оркестратором 01.08, пост-D39.64):** исследовательская программа дуги качества ЗАВЕРШЕНА (exp12–16 закрыты; rerun2 закрыт D39.22); полигон-пакеты 5–8, ToS-речек (D39.57, следующий триггер 25.10) и Р6+P4 «язык промптов/анти-эхо» (D39.61, харнесс `eval/promptlang/`) ЗАКРЫТЫ. **Курс проекта — бэкенд (общность закрыта D39.64 → арка автономности банка); полигон работает ТОЛЬКО по выданным промтам** (актуальный — список в `docs/README.md`), платные пробы — по слову владельца. Редактор = **deepseek-v4-pro ИНТЕРИМ** (D39.22; glm-5 резерв; `mistral` ИСКЛЮЧЁН как несущий — анти-корреляция гладкость↔верность ×3); итерация №2 редакторов — довеском к следующему платному прогону. +> +> ⚠ **DeepSeek-V4-Flash-0731 (31.07): веса сменились ПОД ТЕМ ЖЕ СЛАГОМ — боевая черновая форма покупает пустые ответы; эхо стохастично по вызову. Платные прогоны/докупки СТОП до ре-пробы (бэклог-строка 74); детали и развилка — `00-provider-quirks.md` секция катовера + D39.61.** > > **Инварианты полигона (соблюдать всегда):** судейский **риг-стандарт D39.7** (per-vote, полно-evidence, floor-гейт) · генерации — только `finish=stop` · **авто-QA ключуется СЛЕПЫМИ метками** (директива D39.20) · экстракция прод-выходов — **ТОЛЬКО `tmctl export`** (D39.5, инвариант №8, см. правило 7 ниже) · стайл-каноны **D39.21** как эталон верности (时辰 = 2 часа · generic-«гу» средний род · стихи смыслом · 资质 = «талант»). > -> **Закрыто пакетом-5 (25.07):** ⚠ ре-чек прайса DeepSeek 24.07 — **сделан**: катовер прошёл, `deepseek-chat`/`deepseek-reasoner` → 404 в реестре, цены не изменились (детали и команды — `docs/experiments/00-provider-quirks.md`, строка DeepSeek + календарь). **В работе:** факты ToS/AUP под `accepts_labels` (блок A пакета-5) — вердикты пер-лейблу, применение строк требует подписи владельца. Тачпойнты владельца — сайдкары `books/gu-zhenren/exp16/`. Residual-трекер пилота/18+/echo — `docs/POLYGON_PACKAGE4_SESSION_PROMPT.md` (отложен). +> **ToS/AUP-трек:** факты под `accepts_labels` сняты пакетом-5, ре-чек исполнен 31.07 (D39.57: дельт вердиктов нет, Google-мониторинг перевешен на цепочку договора; применение строк — только подписью владельца). Тачпойнты владельца — сайдкары `books/gu-zhenren/exp16/`. Residual-трекер пилота/18+/echo — `docs/POLYGON_PACKAGE4_SESSION_PROMPT.md` (отложен; P4-хвост из него закрыт D39.61). ## Карта @@ -14,7 +16,7 @@ |---|---|---| | `refusal_bench.py` | exp02; его `split_sentences`/`classify_output` = **приёмочный оракул** coverage-гейта Go (паритет закреплён Go-тестом; любое изменение — Python-first, лок-степ) | `run_refusal.sh` — однокоманда | | `token_calc.py` | exp01 токен-калибровка (r-множители) | токенизаторы в `tokenizers/` | -| `editor_bench.py` + `build_editor_artifact.py` | exp04 бейк-офф редакторов | ✅ слепота починена (D13.5): рандомизация меток ПО ФРАГМЕНТУ (соль), ключ+цена в отдельном `--key` файле. ⚠ Выбор grok-4.3 SUPERSEDED D30.1: боевой редактор = БИЛИНГВ glm-5, grok reasoning-off из редакторских ролей снят (no-op); exp04-ранг был на дефолт-reasoning | +| `editor_bench.py` + `build_editor_artifact.py` | exp04 бейк-офф редакторов | ✅ слепота починена (D13.5): рандомизация меток ПО ФРАГМЕНТУ (соль), ключ+цена в отдельном `--key` файле. ⚠ Выбор grok-4.3 SUPERSEDED дважды: D30.1 (билингв-флип) → D39.22 (боевой редактор = deepseek-v4-pro БИЛИНГВ ИНТЕРИМ, glm-5 резерв); grok reasoning-off из редакторских ролей снят (no-op); exp04-ранг был на дефолт-reasoning | | `coverage_precision.py`, `content_filter_probe.py` | exp07 precision гейта (0 FP/57) | | | `cost_model_v2.py` | exp08 COGS (~$0.69/ранобэ — ДО-флиповый; после флипа D1 билингв ≈$0.85, D30.4) | цены датировать и перепроверять | | `extract_bench.py` | exp06 экстракция терминов (спот=локаль/рендер=облако) | health-верификация каждого ответа — образец. ⚠ recall 0.98–1.0 мерен на PD-классике; вебновелл-ре-замер = research/20 §D-A6 (полигон-стадия банк-майнинга) | @@ -24,6 +26,7 @@ | `adaptive_*.py` | research/14 пробы (гибрид отклонён) | индикативные, не решения | | `memory_hotpath.py` | УСТАРЕЛ (контракт до cc57c7b) — не переиспользовать | актуальное зеркало — `pilot/memory_eval.py` | | `providers.json` | базовые URL/слаги для зондов | квирки — `docs/experiments/00-provider-quirks.md`, читать ПЕРЕД любым вызовом | +| `promptlang/` | Р6+P4 (закрыт D39.61): язык промптов · анти-эхо wiring · верность митигаций; действующая редакция выводов = §12 отчёта `docs/archive/reports/POLYGON_PROMPTLANG_ANTIECHO_2026-07-31.md` | `slugcheck.py`, `wire_probe.py` (сырой провод), `run_arms.py`, `spend.py` (два пути счёта денег — прогонять оба), `judge_*.py` | ### 18+ / корпус-билдеры | Скрипт | Эксперимент | Заметки | @@ -58,6 +61,8 @@ 6. `data/` в .gitignore (коммитится только код) — критичные результаты дублируй цифрами в `docs/experiments/`. 7. **Экстракция прод-выходов — ТОЛЬКО через `tmctl export` (D39.5, инвариант №8 backend/README):** сырое чтение чекпоинтов store (records.json-стиль) отдаёт НЕнормализованные байты (без export-contract слоя) и молча-неполную книгу (без manifest-join/drift-гарда). `--plaintext` для глаз, дефолтный JSON для скриптов. Прежний путь `final_hash→response_text` — только для форензики сырья, не для оценки качества. 8. **Аномалия провайдера ≠ повод гадать:** странный отказ (интермиттентный 404/5xx, новый `finish_reason`, молча игнорируемые параметры) → сначала официальная дока вендора (deprecations/changelog/status) + свежий /models живьём, потом диагноз; в отчёт оба слоя — наблюдение И вендор-факт с датой/URL. Урок: 404-флейки gemini-2.5-flash оказались предвестником EOL всей 2.5-серии 16.10.2026 (research/15 → фактчек 10.07; правило — шапка `00-provider-quirks.md`). +9. **Персист, не scratch (владелец 01.08; ударило дважды):** код харнессов → `eval/<папка>` (git), сырые платные выходы → durable `~/books/...`; эфемерный scratchpad/tmp теряется вместе с сессией — так утрачен харнесс замера дефектов чекеров (labels/ уцелел, скрипты нет), и его придётся пересобирать. +10. **Вывод на агрегате до вскрытия единиц ЗАПРЕЩЁН (D39.61):** перед любым сравнительным выводом открыть глазами хотя бы одну единицу с каждой стороны; каждый агрегат — вторым независимым путём счёта; пре-регистрация порогов до вскрытия данных. ## Доступные ключи от моделей DEEPSEEK_API_KEY, ZAI_API_KEY, KIMI_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, XAI_API_KEY, MISTRAL_API_KEY \ No newline at end of file