Bring the core docs up to today's tree: the glossary knew ten verbs of eleven, the requirements register had no row for handing a book to the user, and three owner questions were still listed as open
This commit is contained in:
parent
40dfe851f4
commit
d7ccc503eb
9 changed files with 23 additions and 20 deletions
|
|
@ -30,7 +30,7 @@ Go-бэкенд издательского художественного пер
|
|||
| **Полигон (eval)** | `eval/` + `docs/experiments/` | только пре-рег фризы — коммит замороженного плана замера ДО платных вызовов | то же |
|
||||
| **Оркестратор** | `docs/` (architecture/research/PROGRESS) + корневые онбординг-доки, ревью чужого кода read-only | да | ратифицирует решения, пишет хендофф-промты |
|
||||
| **Фронт** | `frontend/` | нет — лендит оркестратор | читать можно; пинги, итоги и вопросы — ЗОННЫЙ журнал `frontend/docs/frontend-PROGRESS.md` (решение владельца; в `docs/PROGRESS.md` фронт НЕ пишет), туда же пишет и оркестратор; продуктовые требования — `docs/product-requirements.md` |
|
||||
| **Платформа** | `platform/` (SaaS control plane: пользователи/квоты/очередь/HTTP; движок дёргает процессами, D39.81) | нет — лендит оркестратор | читать можно; пинги и итоги — ЗОННЫЙ журнал `platform/docs/platform-PROGRESS.md` (решение владельца), в `docs/PROGRESS.md` не пишет |
|
||||
| **Платформа** | `platform/` (SaaS control plane: пользователи/кредитный баланс и ставка за главу/очередь/HTTP; движок дёргает процессами, D39.81; ⚠ продуктовых КВОТ и фри-тир-лимитов нет и не проектируется — D39.176 п.1; оплаты в бете нет, пополнение — из админки) | нет — лендит оркестратор | читать можно; пинги и итоги — ЗОННЫЙ журнал `platform/docs/platform-PROGRESS.md` (решение владельца), в `docs/PROGRESS.md` не пишет |
|
||||
|
||||
Координация — журнал `docs/PROGRESS.md` (секции «Бэкенд»/«Полигон»; сверху CURRENT-STATE). Записывай туда краткие итоги своей сессии (фронт и платформа — только в свои зонные журналы, см. таблицу выше). ⚠ Это ЕДИНСТВЕННОЕ исключение из «`docs/` — зона оркестратора»: бэкенд и полигон пишут в СВОИ секции этого журнала (полигон — ещё и в `docs/experiments/`), всё прочее в `docs/` правит только оркестратор. Закрытые хроники вынесены в слайсы `docs/archive/PROGRESS-*.md` — НЕ читать при онбординге, только по конкретной ссылке. Параллельные сессии — норма: чужие незакоммиченные файлы в дереве не трогать; сессия считается ЖИВОЙ, пока владелец не сказал обратное.
|
||||
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ D-нотами → синхронизация доков → ответы вла
|
|||
|
||||
### Пишешь промт сессии?
|
||||
|
||||
**Обязательные блоки — все 11; перед выдачей два рубежа: механическая сверка промта против этого
|
||||
**Обязательные блоки — все 12 (счёт держать равным нумерации ниже); перед выдачей два рубежа: механическая сверка промта против этого
|
||||
списка (таблицей/грепом) + опровергатель-субагент к самому промту (получает промт, список, листы
|
||||
владельца; мандат «найди отсутствующее и противоречащее»). Перечтение автором рубежом НЕ считается.**
|
||||
|
||||
|
|
@ -154,7 +154,7 @@ D-ссылка грепается по D-логу · mid-flight аддендум
|
|||
глазами · отчёт с пошаговым планом сверяется ПО ПУНКТАМ плана · каждое «отложено/вернуться» получает
|
||||
строку бэклога или жильца реестра загейченных триггеров (`13-tech-debt-anchors.md` §Б-108) ТЕМ ЖЕ
|
||||
лендингом · при закрытии строки её тело грепается на
|
||||
«остаток/реопен/гейт», гейты в ДРУГИХ строках пере-диспозиционируются · глаз владельца — рабочий
|
||||
«остаток/реопен/гейт», гейты в ДРУГИХ строках пере-диспозиционируются · **КАЖДОЕ утверждение акта о ЧУЖОМ ряде сверяется его СТАТУСОМ в тот же заход** — включая ряды вне `docs/` (регистр дефектов платформы, зонные бэклоги): «закрыто» в акте при `open` у носителя — тот же дефект, что «остаток несёт X» при уже исполненном X, и гейт чисел его не видит (D39.167 п.1: четыре ряда разошлись с актами лендинга, один `major`; следующий пак собрался бы ПО РЕГИСТРУ). Расхождение в ЧУЖОЙ зоне переводит ЗОНА — твоё действие пинг в её журнал, не своя правка её реестра. ⚠ Пункт уходит из промта, когда ляжет машинная половина — строка бэклога 225 · глаз владельца — рабочий
|
||||
рубеж: прайми его артефактами, не пересказом.
|
||||
|
||||
### Лендишь?
|
||||
|
|
|
|||
|
|
@ -145,14 +145,13 @@ migrate` по каждой стендовой книге зоны → сними
|
|||
⚠ **Той же работой закрывается строка бэклога 240 (находка Д3 ревью P9, двое суток без носителя): оплаченный стоп подписи исчезает МОЛЧА** — рестарт проходит границу банка насквозь, а гард `LiftBankStop` писан против движка ДО памяти v16 и этот путь не держит. Реши ОДНОЙ работой: снять гард вместе с обходом ЛИБО доказать живой пробой, что память `bank_stop_presented` (схема v16) делает его недостижимым; молчаливо оставить как есть — нельзя.
|
||||
|
||||
**Состав снятия — по пингу №21, он ШИРЕ спавна:** (а) особый случай в спавне —
|
||||
`platform/internal/runs/spawn.go:170`=`!l.BankReleased` — снять РОВНО; (б) писатель `LiftBankStop`
|
||||
(`internal/runs/reconcile.go:1304`=`LiftBankStop`, `pgstore/runs.go:1180`=`bank_released`) и (в) колонка `bank_released` с читателями
|
||||
полосы (`pgstore/readmodel.go:393,498,961`=`bank_released`) — реши сам, этим ли паком: снос = НОВАЯ миграция (00016 не
|
||||
`platform/internal/runs/spawn.go`, греп `BankReleased` (⚠ номера строк здесь НЕ ставим: файл правит эта же сессия) — снять РОВНО; (б) писатель `LiftBankStop`
|
||||
(греп `LiftBankStop` по `internal/runs/reconcile.go` и `internal/pgstore/runs.go` — номера строк двигаются под твоей же правкой) и (в) колонка `bank_released` с читателями
|
||||
полосы (греп `bank_released` по `internal/pgstore/readmodel.go` — номера строк двигаются под твоей же правкой) — реши сам, этим ли паком: снос = НОВАЯ миграция (00016 не
|
||||
править) + пере-вывод сегмента полосы; (б)/(в) сцеплены — снять писателя, оставив колонку, значит
|
||||
заморозить `bank_released=false` и врать полосой (ось §5); не этим паком — диспозиция строкой, как у
|
||||
`PD-411`. ⚠ **Снимаемое поведение ЗАПИНЕНО:** `TestAResumedRunIsSpawnedWithoutTheSigningStop`
|
||||
(`platform/internal/runs/reconcile_test.go:707`=`WithoutTheSigningStop`; `:706` — «Mutation caught: passing
|
||||
l.VerifyBank unconditionally», т.е. ровно заказанная правка). **Пере-подпись этого пина заказана этим
|
||||
(греп `TestAResumedRunIsSpawnedWithoutTheSigningStop` по `platform/internal/runs/reconcile_test.go`; его же комментарий — «Mutation caught: passing l.VerifyBank unconditionally», т.е. ровно заказанная правка). **Пере-подпись этого пина заказана этим
|
||||
промтом** — как в §3.8: заказанная смена контракта, не подгонка под зелень (D39.121); пере-подписанные
|
||||
пины перечисли поимённо. Той же работой уходят обоснования сброса флага из фикс-раунда 28.08 (строка F10,
|
||||
`platform-PROGRESS.md:1467`): комментарий `spawn.go:159-169` («the owner's model») и док-коммент теста —
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -946,7 +946,7 @@ the original request was never applied». Каждый `POST /books` созда
|
|||
| ~~`POST /bank/decisions`~~ | стоп-механика майнера | ⚠ **НЕ «не построено», а ОТМЕНЕНО**: было построено P7 и СНЯТО 22.08 вместе с пер-термной моделью подписи (D39.144, слово владельца). **0.5.0 снёс и канон-половину — `PD-370` закрыт этим минором**; преемник — строка `POST …/bank/corrections` ниже | отменено D39.144; снесено 0.5.0 |
|
||||
| `POST /books/{bookId}/bank/corrections` | `tmctl bank-apply` — движковая половина ПОСТРОЕНА (D39.158, лендинг `d1eb8a9`) | **ПОСТРОЕНО пакетом P9**: перевод словаря (`platform/internal/ingest/bankdecisions.go`), спавн глагола (`runner/bankapply.go`), раскладка отказов и пер-книжная сериализация (`runs/bank.go`), дверь синхронная. Флаг `bank_corrections_enabled` следует включённости прогонов (`cmd/tmplatformd/runner.go:195`) — дверь спавнит тот же глагол | закрыто D39.162 |
|
||||
| `GET /books/{id}/events` (SSE) | эмиттер шва построен (D39.131) | **ПОСТРОЕНО P7** — `httpapi/stream.go`, поток регистрируется ВНЕ слоя сжатия (сжатие буферизует поток — единственное, что канон запрещает этому маршруту) | закрыто D39.153 |
|
||||
| `POST`/`GET /exports` | у движка только stdout-JSON и `--plaintext` (`cmd/tmctl/invocation.go:107`) | НЕ ПОСТРОЕНО с обеих сторон | строка 49 / D29.1 «tmctl export-контракт» |
|
||||
| `POST`/`GET /exports` | движок: `tmctl build [--format epub,txt] [--out path] [--partial]` — EPUB 3 + чистый txt (`backend/internal/bookfile`), конверт `tm-build-v1`, пути в `StatusArtifacts.book_files`, отказ exit 16 `book_incomplete` | ⚠ пере-снято 30.08: ДВИЖКОВАЯ ПОЛОВИНА ПОСТРОЕНА (D39.175, `8adcb86`); открыта только дверь платформы — она обязана СТРОИТЬ через `tmctl build` (не читать файл у БД: там копия прежней сборки) и сверять `BuildReport` (`config_drift`/`stale_unknown`). ⚠ Это про ФАЙЛ КНИГИ; редакторский `tmctl export`/annot-v1 (D29.1а) — ОТДЕЛЬНАЯ, не закрытая работа | движковая половина — D39.175; дверь — пинг зоне платформы (её журнал, греп `Движок отдаёт книгу файлом`); annot-v1 — строка 49 / D29.1 |
|
||||
| Условные чтения (`ETag`/304), сжатие | — | **ПОСТРОЕНО P7** — `httpapi/conditional.go`; валидатор считается от БАЙТ ответа. Остаток строки 186 — шаги 3–5 (скоуп кадра, дельта-чтение, `staleTime`) | шаги 1–2 закрыты D39.153 |
|
||||
| `Idempotency-Key` | — | **ПОСТРОЕНО P7** — `httpapi/idempotency.go` + `pgstore/idempotency.go`, на двух создающих вызовах; ⚠ живой дефект под конкуренцией — `PD-369` | закрыто D39.153 |
|
||||
| `bearerToken` — чем ВЫДАЁТСЯ токен | вход только ставит HttpOnly-куку (`login.go:338`) | сервер токен ПРИНИМАЕТ, выдать его нечем | носитель: research/28 §2 (Б-15); строки нет |
|
||||
|
|
@ -955,7 +955,7 @@ the original request was never applied». Каждый `POST /books` созда
|
|||
| Настоящие названия глав (`Chapter.heading` ≠ null) | парсер структуры | НЕ ПОСТРОЕНО | строка 160 (Этап 0) |
|
||||
| `title_raw` / `kind` (глава ↔ фрагмент) | дизайн-пак структуры глав | передано паку, аддитивно | строка 161 |
|
||||
| `ErrorCode.content_refused` (400) **и** `RejectReason.content_refused` | прескрин злоупотреблений | НЕ ПОСТРОЕН ни на одной стороне: в платформе только объявление константы (`httpapi/problem.go:42,94`), `ContractRejectReason` (`ingest/vocabulary.go:59-69`) его не отображает; в движке отказ провайдера живёт как ПРИЧИНА ЗАМЕЧАНИЯ (`disposition.go:60-63` → `Note.code: content_withheld`) и в exit-контракт не выходит — мостá между двумя словарями нет | **строка 94 (ПТ-16)**; там же ограничение числа попыток аккаунта — обязанность падает ВМЕСТЕ с производителем, не раньше |
|
||||
| `decline` в подписи банка доезжает до работы | ⚠ пере-снято 0.5.0: старый носитель («таблица `bank_decisions`, движок её не читает») умер вместе с моделью — таблица снесена 22.08, предупреждение на `BankDecision.action` снесено вместе со схемой | дверь смонтирована (D39.162), и decline доезжает до следующего прогона ПО ПОСТРОЕНИЮ. ⚠ **Остаток ДВИЖКОВЫЙ, две штуки, обе найдены воркфлоу-ревью P9:** decline не энтити-широк на обратном пути (отклонённая сущность возвращается через свой АЛИАС, `mining.go:548`), и повтор ТОГО ЖЕ документа на одном пути не сходится (`membank/decisions.go:374`) — второе ломает обещание сходимости, на котором стоит синхронная дверь | заказано бэкенд-паку «тихая порча», `docs/BACKEND_SILENT_HARM_SESSION_PROMPT.md` §3.3 |
|
||||
| `decline` в подписи банка доезжает до работы | ⚠ пере-снято 0.5.0: старый носитель («таблица `bank_decisions`, движок её не читает») умер вместе с моделью — таблица снесена 22.08, предупреждение на `BankDecision.action` снесено вместе со схемой | дверь смонтирована (D39.162), и decline доезжает до следующего прогона ПО ПОСТРОЕНИЮ. ⚠ **Остаток ДВИЖКОВЫЙ, две штуки, обе найдены воркфлоу-ревью P9:** decline не энтити-широк на обратном пути (отклонённая сущность возвращается через свой АЛИАС, `mining.go:548`), и повтор ТОГО ЖЕ документа на одном пути не сходится (`membank/decisions.go:374`) — второе ломает обещание сходимости, на котором стоит синхронная дверь | заказано бэкенд-паку «тихая порча», `docs/BACKEND_SILENT_HARM_SESSION_PROMPT.md` §3.3 | ⚠ пере-снято 30.08: из двух движковых остатков ВТОРОЙ ЗАКРЫТ — порядок записи документов решений сменён на rejects-first, повтор принятого документа СХОДИТСЯ (D39.164 §3.3). Живым остаётся ОДИН: `decline` не энтити-широк на обратном пути — отклонённая сущность возвращается через свой АЛИАС, тогда как канон обещает «declining a surface removes EVERY window of that surface». Носитель — строка 228 единого бэклога.
|
||||
| Снятие замечания (переход «флаг снят») | движок | **НЕДОСТИЖИМО сегодня, проверено чтением движка** — п. H §6в | **PD-298** регистра платформы (`platform/docs/DEFECT_REGISTER.md`) — там строка и живёт; механизма не строим |
|
||||
| Счёт «сделанного» на деплое без второго прохода | платформа | канон 0.4.0 определил «сделано» = последний проход ЭТОГО деплоя; проекция платформы считает жёстко второй проход | **вход P7** (PD-202) |
|
||||
|
||||
|
|
@ -1623,7 +1623,7 @@ heartbeat · форма `id` кадра. Сжатие как ТРЕБОВАНИ
|
|||
потеря текста, хотя «the chunk is NOT lost», `disposition.go:99`).
|
||||
2. **Класс 2 схлопывается в ОДИН код** (§8а, нормативно): четыре причины ранга 0 — модельный отказ —
|
||||
на проводе неразличимы, потому что каждый различимый код здесь бит обратной связи подбирающему.
|
||||
3. Слова — владельца (ПТ-33, В-3, строка 148). **Коды ниже — ◆ ПРЕДЛОЖЕНИЕ**, ратифицируются вместе с
|
||||
3. Слова — ЗА ПРОЕКТОМ (D39.176 п.4, 30.08): владелец делегировал фразы В-3 · К-6 · Приложение А, подписи его больше НЕ ждём. ⚠ Требование владельца — ИНТЕРНАЦИОНАЛЬНОСТЬ: фраза не литерал ни в Go платформы, ни в TSX фронта, а ДАННЫЕ по машинному коду причины и локали; словарь — один на продукт. Карта «причина движка → КОД контракта» НЕ загейчена и поручена контрактной сессии (строка бэклога 203); гейт доставки словаря данными — строка 204, вместе со словарём закрывается `PD-246`. ⚠ Прежний указатель «строка 148» мёртв: строку удалил `a023e39` решением владельца. **Коды ниже — ◆ ПРЕДЛОЖЕНИЕ**, ратифицируются вместе с
|
||||
фразами; до тех пор `Note.code` в спеке НЕ enum, чтобы схема не стала второй копией незаписанной
|
||||
карты.
|
||||
4. Последняя строка — не формальность: контракт обязан иметь фразу для причины, которой ещё не
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@
|
|||
*Почему жёстко:* движок пере-читает сид ПОСРЕДИ прогона (`mining.go:221`), запись в живой прогон
|
||||
въехала бы в снапшот недетерминированно. Потолок посреди прогона менять НЕЛЬЗЯ — он едет со
|
||||
стартом и после не меняется, лекарство — новый прогон
|
||||
(`platform/internal/runs/reconcile.go:1437`=`answering 202 with the run in the state`). Дверь «менять потолок файлом» закрыта;
|
||||
(`platform/internal/runs/reconcile.go` (греп `202` в обработчике возобновления; ⚠ номер строки снят 30.08 — файл правит живая сессия P12)). Дверь «менять потолок файлом» закрыта;
|
||||
не выдумывать её заново из `research/25`.
|
||||
|
||||
3. **Каждый JSON-выход глагола несёт версию документа.** Сегодня асимметрия: `tm-bank-v1`
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
- **Хендофф(-промт)** — передача роли новой сессии файлом-промтом; аддендумы к бегущей сессии доезжают только релеем владельца.
|
||||
- **Владелец** — человек; ратифицирует деньги, скоуп-сдвиги, продукт, 18+; связной между сессиями.
|
||||
- **Ф0–Ф3** — фазы: Ф0 скелет · Ф1 инфраструктура · Ф2 качество (судья/гейты) · Ф2.5 пилот · Ф3 продукт (веб-фронт, ридер-IDE).
|
||||
- **S0–S7 / P0–P8** — нумерация кодовых сессий зон: S-этапы фронта (S0–S4 приняты, S4 — путь «файл→прогресс», D39.135; зона ЗАМОРОЖЕНА, и лендинг P7 её НЕ разморозил — D39.147: P7 её не размораживает, S5 не выдаётся, разморозка отдельным словом владельца) · P-этапы платформы (P0 бутстрап D39.100 … P6 потребительская половина шва D39.132 · **P7 читающая поверхность — ПРИНЯТ С ФИКС-ЛИСТОМ и ЗАЛЕНДЕН 20.08, D39.153** · **P8-FIX — фикс-лист P7 плюс блокер свипа, ПРИНЯТ и ЗАЛЕНДЕН 22.08, D39.154**; P8-REVIEW — читающий пак четырёх осей, принят D39.159; **P9** — дверь правок банка, ключи и сквозная полоса, принят D39.162; **P10** — мина под правкой банка и покупка пере-прохода, принят D39.166); не путать с фазами Ф0–Ф3.
|
||||
- **S-этапы (S0…) / P-этапы (P0…)** — нумерация кодовых сессий зон: S-этапы фронта (S0–S4 приняты, S4 — путь «файл→прогресс», D39.135; зона ЗАМОРОЖЕНА, и лендинг P7 её НЕ разморозил — D39.147: P7 её не размораживает, S5 не выдаётся, разморозка отдельным словом владельца) · P-этапы платформы (P0 бутстрап D39.100 … P6 потребительская половина шва D39.132 · **P7 читающая поверхность — ПРИНЯТ С ФИКС-ЛИСТОМ и ЗАЛЕНДЕН 20.08, D39.153** · **P8-FIX — фикс-лист P7 плюс блокер свипа, ПРИНЯТ и ЗАЛЕНДЕН 22.08, D39.154**; P8-REVIEW — читающий пак четырёх осей, принят D39.159; **P9** — дверь правок банка, ключи и сквозная полоса, принят D39.162; **P10** — мина под правкой банка и покупка пере-прохода, принят D39.166); не путать с фазами Ф0–Ф3. **P11** — отзыв сессии гасит открытый поток кадром `session_ended` + денежная группа (D39.169, минор 0.8.0); пак `sqlc` P-номера НЕ носит (D39.172); **P12** «долги под ногами» — семь открытых major + снятие обхода `--verify-bank`, ВЫДАН 30.08, на приёмке. ⚠ Живой перечень принятых паков — реестр `architecture/05-decisions-index.md` (греп «пак P»); здесь только расшифровка обозначения. ⚠ P-номер этапа платформы не путать с P-номером ПРОБЫ в отчётах полигона (там контекст локален).
|
||||
- **Зонный журнал / зонный бэклог** — `frontend/docs/frontend-PROGRESS.md` · `platform/docs/platform-PROGRESS.md` и BACKLOG зоны: прогресс/пинги фронта и платформы живут ТОЛЬКО там (D39.100); их строки единый бэклог не принимает (D39.84).
|
||||
- **D-номер с подпунктом** (`D20.4`, `D22.7`, `D39.153 п.9б`) — ПОДПУНКТ внутри тела родительской ноты. Реестр `architecture/05-decisions-index.md` несёт ноты ВЕРХНЕГО уровня, своей строки у подпункта там нет и не должно быть. ⚠ Практическое следствие: греп `^## D20.4` даёт ЛОЖНЫЙ фантом — не нашёл номер, грепни родителя до точки. (Поймано 23.08 на живом случае: ссылка из комментария движка выглядела фантомной, а D20.4 — живой подпункт D20.)
|
||||
- **Шиппинг-конфиг** — конфиг пайплайна, по которому идёт БОЕВОЙ прогон, в отличие от тестового и от ран-локального. ⚠ Нормативного определения у термина ДО 23.08 не было, и это уже стоило путаницы: клейм «гейт голоса не включён ни в одном шиппинг-конфиге» верен про шаблоны репозитория (`backend/configs/`), но конфиг РЕАЛЬНОГО прогона живёт РЯДОМ С КНИГОЙ, вне git, и там гейт был включён. Читать так: «шиппинг-конфиг» = шаблон в `backend/configs/`; конфиг конкретного прогона — «ран-локальный», и утверждения о нём проверяются в каталоге книги, а не грепом по репозиторию.
|
||||
|
|
@ -33,6 +33,9 @@
|
|||
|
||||
## Пайплайн и код
|
||||
|
||||
- **`tmctl build`** — $0-глагол ПИСАТЕЛЯ книги: собирает EPUB 3 и чистый txt из `BookExport` (прод-пакет `backend/internal/bookfile`, только stdlib), ОДИН файл на книгу на формат рядом с `ProjectDB`; пути — `StatusArtifacts.book_files` (канал, который читает будущая дверь выдачи платформы), stdout — конверт `tm-build-v1`, отказ — `book_incomplete` (exit 16). D39.175.
|
||||
- **Состояния честности файла** (писатель книги) — pending · withheld (текст удержан) · incomplete (юнит отгружен с дырой) · **ghost** (остаток источника после укрупнения нарезки: без него книга выглядит «молча полной») · **stale** (финал сделан под исчезнувший исходник; под дрейфом честное `stale_unknown`, никогда не «нет») — все пять ДЫРЫ: по умолчанию отказ с перечнем «глава/юнит/причина», `--partial` — файл с пометкой на титуле и маркером на месте КАЖДОЙ дыры. Шестое, **drift**, — НЕ дыра: носитель `BuildReport`/WARN для оператора, байты файла = байты прогона (слово владельца 30.08, D39.175 п.2). Читательские слова — данные `configs/langpacks/<цель>/reader.txt`, вне `Pack.Version()`; без пака цели — несловесная форма.
|
||||
|
||||
- **Волны** — waveDraft (черновик) → терминолог → waveEdit (редактура); имена только полные, аббревиатуры W0/W1 запрещены (решение владельца 19.07).
|
||||
- **Чанк** — единица нарезки книги; **edit-unit (юнит редактуры)** — member-чанки, схлопнутые редактором в один финальный текст: гранулярность финала и экспорта пар (~1.9 юнита/главу; якорь синхронизации фронта — D39.84; draft-only-пайплайн шипит по чанкам).
|
||||
- **Банк (памяти)** — термины/имена/голоса книги на весь прогон; **сид** — стартовый банк книги (YAML; подпись владельца — только вкусовые поля, D39.77); **бриф** — книжные вводные; **банкнота** — канал выноса кандидатов из ответа переводчика; **майнер** — $0-извлечение кандидатов из исходника; **KWIC** — конкорданс-контекст кандидата; **терминолог** — роль перевода/подписи терминов батчами.
|
||||
|
|
@ -43,7 +46,7 @@
|
|||
- **Эхо-мина** — DeepSeek без thinking эхоит вход вместо перевода; гейт `echoMineViolation` принуждает thinking-ON.
|
||||
- **Langpack / пар-файл** — данные языковой пары (`backend/configs/langpacks/`); книжное в пар-слое = утечка; **общность** — ревью-вопрос «заработает ли пара/вторая книга без правки Go».
|
||||
- **Ведро B/D** — корзины триажа карты общности D39.60 (B «пар-модуль без гейта» · D «удалить»).
|
||||
- **tmctl** — CLI бэкенда. Полный список глаголов — ОДИН в коде (`backend/cmd/tmctl/main.go`, `dispatchCommands`), и он же печатается в usage: `translate · report · status · export · redrive · manifest · backup · migrate · seed-lint · **bank-apply** ($0-глагол приёма правок банка, D39.158; ⚠ дописан 28.08 аудитом доков — строка ВТОРОЙ раз подряд отстала от кода)` (⚠ прежняя редакция строки не знала `manifest` и `migrate` — ради каждого заводился отдельный пак; испр. 22.08).
|
||||
- **tmctl** — CLI бэкенда. Полный список глаголов — ОДИН в коде (`backend/cmd/tmctl/main.go`, `dispatchCommands`), и он же печатается в usage (паритет «список ↔ usage ↔ switch» прибит тестом `cmd/tmctl/invocation_test.go`): `translate · report · status · export · **build** · redrive · manifest · backup · migrate · seed-lint · bank-apply`. Порядок здесь = порядок `dispatchCommands`; сверка одной командой: `grep -n -A3 "dispatchCommands = " backend/cmd/tmctl/main.go`. **build** — сборка переведённой книги в файл (EPUB 3 / чистый txt, `internal/bookfile`, D39.175); **bank-apply** — $0-глагол приёма правок банка (D39.158). ⚠ Строка отставала от кода ТРИЖДЫ подряд (`manifest`/`migrate` — испр. 22.08; `bank-apply` — 28.08; `build` — 30.08): добавляешь глагол — правишь ЗДЕСЬ же.
|
||||
- **COGS** — себестоимость перевода; **ре-проба** — дешёвый повторный замер провайдера после аномалии (носитель события — строка 188; исходная 74 закрыта D39.91).
|
||||
|
||||
### Неймспейсы номеров (полная легенда — испр. D39.125 по докс-аудиту)
|
||||
|
|
|
|||
|
|
@ -47,19 +47,20 @@
|
|||
| ПТ-17 | Лимит размера входа настройкой (V2-п.3, H7) | ⭕ | строка 94 |
|
||||
| ПТ-18 | Стоп и продолжение пайплайна; абьюзивный прогон НЕ продолжать (V2-п.2, H10) | 🔶 | graceful stop по сигналу (`cmd/tmctl/main.go` NotifyContext) + чекпойнты/redrive; продукт-кнопки и связка с прескрином = строка 94; API-форма в контракте 14 (D39.99: stop/resume; отказ прескрина — К-9 закрыт D39.138 п.2б) |
|
||||
| ПТ-19 | Скорость: «очень быстрый перевод книги — киллерфича» (V4-п.1, H9); видимый прогресс/ETA — из Ф3-видения ридер-IDE (цветная полоса статуса), не из V4 | 🔶 | волны параллельны по чанкам; замер скорости и ETA на целой книге = строка 54 (МАСШТАБ); пофазные счётчики draft/edit НА ГЛАВУ построены движком (D39.122 — строка 99 ЗАКРЫТА); ETA ПОКАЗЫВАТЬ — решение владельца 04.08 (D39.100/К-5), `eta_seconds` в спеке (0.2.0+, D39.115); оценка $/глава движком = строка 166 |
|
||||
| ПТ-44 | **Готовый перевод отдаётся ПОЛЬЗОВАТЕЛЮ файлом** — читаемая книга (EPUB 3 + чистый txt), а не JSON-выхлоп; неполная книга выдаётся ВСЕГДА, с пометкой на титуле и маркером на месте каждой дыры (слово владельца 30.08: «дверь ВСЕГДА строит файл — отказ юзеру не отдаётся»; отказ по умолчанию остаётся операторской ручкой CLI) | 🔶 | **Движковая половина ПОСТРОЕНА** (D39.175, `8adcb86`): `tmctl build [--format epub,txt] [--out path] [--partial]`, пакет `backend/internal/bookfile` (только stdlib), шесть состояний честности (pending·withheld·incomplete·ghost·stale; **drift — отчётом, НЕ дырой файла**), отказ `book_incomplete` = exit 16, пути в `StatusArtifacts.book_files`, `tm-export-v1` расширен аддитивно, читательские слова — данные `configs/langpacks/<цель>/reader.txt`. **НЕ построена дверь платформы** (`createExport`/`getExport`) — очередь №20 п.4, гейт: живой прогон п.3. Открытое на владельце: лестница D25.1 (какая ступень даёт копию БЕЗ пометки, что печатать на титуле) |
|
||||
|
||||
## Фронт (Ф3)
|
||||
|
||||
| ID | Требование (источник) | Статус | Носитель / доказательство |
|
||||
|---|---|---|---|
|
||||
| ПТ-20 | Ридер-IDE: VS Code-подобный фронт агентного перевода (V0-п.20/23) | ⭕ | research/16 принят (D29); строки 69–71; F3-brief — D29 п.3. Ф3 ОТКРЫТА 02.08 (D39.81): фронт-сессия живёт на моках; контракт API ратифицирован (D39.99; ⚠ версии в этой ячейке протухали ТРИЖДЫ — испр. 28.08 аудитом доков: **канон стоит на 0.7.0**, и три минора прошли за двое суток — **0.5.0** (D39.161: снос отменённой пер-термной модели + дверь приёма правок банка, строка 206 закрыта), **0.6.0** (D39.162/D39.163: сквозная полоса прогресса, строка 200 закрыта, `Progress.stage` вторым исключением границы), **0.7.0** (D39.166: покупка пере-прохода). Открытым по контракту остаётся хвост строки **203**. Зеркало ФРОНТА ратифицированно отстаёт на 0.2.3 — D39.135, синк при разморозке. ⚠ Урок ячейки: версия здесь живёт хуже всего — при следующем миноре правится ПЕРВОЙ); платформа построена до потребительской половины шва: вход/кредиты/квоты (P0–P3) + раннер P4 (D39.123) + интейк `POST /books` со стоп/резюмом (D39.130) + exit-словарь/фолд юнитов/дев-стенд (P6, D39.132); фронт — S3.5–S4 приняты (оболочка · слой данных · i18n · путь «файл→прогресс», D39.127/129/135), **зона ЗАМОРОЖЕНА, и с 17.08 морозится ДАЛЬШЕ лендинга P7** (D39.136 п.2 + D39.147: сначала движок и платформа до «работает и отдаёт результат», фронт накручивается на готовую функциональность) |
|
||||
| ПТ-20 | Ридер-IDE: VS Code-подобный фронт агентного перевода (V0-п.20/23) | ⭕ | research/16 принят (D29); строки 69–71; F3-brief — D29 п.3. Ф3 ОТКРЫТА 02.08 (D39.81): фронт-сессия живёт на моках; контракт API ратифицирован (D39.99; ⚠ версии в этой ячейке протухали ЧЕТЫРЕЖДЫ — испр. 30.08 аудитом доков: **канон стоит на 0.8.0** (`docs/architecture/14-api-contract/openapi.yaml:5`=`version: 0.8.0`), и четыре минора прошли за трое суток — **0.5.0** (D39.161: снос отменённой пер-термной модели + дверь приёма правок банка, строка 206 закрыта), **0.6.0** (D39.162/D39.163: сквозная полоса прогресса, строка 200 закрыта, `Progress.stage` вторым исключением границы), **0.7.0** (D39.166: покупка пере-прохода), **0.8.0** (D39.169: кадр `session_ended` — отзыв сессии гасит открытый поток и НАЗЫВАЕТ причину). ⚠ 30.08 РАТИФИЦИРОВАН минор **0.9.0** (вторая граница пересчёта `chapters_done` + непрозрачный `shape_epoch` в проекции `Book`) — он придёт с лендингом пака P12, до него канон 0.8.0. Открытыми по контракту остаются хвост строки **203** и строка **241** (самопротиворечие канона на дочитанной книге). Зеркало ФРОНТА ратифицированно отстаёт на 0.2.3 — D39.135, синк при разморозке. ⚠ Урок ячейки: версия здесь живёт хуже всего — при следующем миноре правится ПЕРВОЙ); платформа построена до читающей поверхности и денежной двери: вход/кредиты (⚠ КВОТ нет ни строки кода, и по D39.176 п.1 не будет — продуктовых квот нет, фри-тир-лимиты не проектируются; ретеншен/свип остаются инженерной гигиеной) (P0–P3) + раннер P4 (D39.123) + интейк `POST /books` со стоп/резюмом (D39.130) + exit-словарь/фолд юнитов/дев-стенд (P6, D39.132); фронт — S3.5–S4 приняты (оболочка · слой данных · i18n · путь «файл→прогресс», D39.127/129/135), **зона ЗАМОРОЖЕНА, и с 17.08 морозится ДАЛЬШЕ лендинга P7** (D39.136 п.2 + D39.147: сначала движок и платформа до «работает и отдаёт результат», фронт накручивается на готовую функциональность) |
|
||||
| ПТ-21 | Параллельное чтение двух текстов с выравниванием по смыслам (V0-п.21); выравнивание грубое, по единицам экспорта — принято владельцем 02.08, спаны внутри текста не строятся | 🔶 | механизм готов: `tmctl export --pairs` выравнивает пары побайтно по единицам редактуры (`internal/pipeline/export.go:89-93`); якорь = **edit-unit**, НЕ чанк (переформулировано D39.84 — финальный текст существует только на уровне юнита, ~1.9 юнита/главу, местами глава = один блок; читалка обязана это выдерживать); UI-читалка = Ф3 (этап S6) |
|
||||
| ПТ-22 | Настройки от человека: 18+, жанр и т.п. (V0-п.22) | 🔶 | `book.yaml` (labels) данными; UI = Ф3. ⚠ ЖАНР из продукта ВЫКИНУТ словом владельца 16.08 (D39.138 п.2в, строка 184: ни на чём не ветвится, влияние не измерено; снимается из промптов/брифа/контракта/формы) |
|
||||
| ПТ-23 | Веб-ПЕРВЫЙ фронт; SEO/ранжирование Google — куки, страницы-сироты, актуальные алгоритмы (V5-п.2); продукт = **SaaS**, не локальное приложение (решение владельца 02.08, D39.81 — натив-прицел V0-п.26 СНЯТ этим решением, вернуть только новым словом владельца); SEO только под Google, Яндекс снят; рынок глобальный; десктоп = PWA первым шагом, Tauri по явным триггерам (решения владельца 02.08, D39.84) | ⭕ | строка 71 (Ф3-бриф); SEO вошёл в стек-дизайн ДО выбора (D39.84, требование исполнено): двухконтурный деплой — SPA `app.<домен>` целиком под noindex + статический публичный контур ≤3 кликов от главной (лечение страниц-сирот), `frontend/docs/STACK_DECISIONS.md` §4; SSR-вопрос закрыт этим решением |
|
||||
| ПТ-24 | Цикл согласования глоссария с профпереводчиком/редактором (V0-п.23) | 🔶 | подписной цикл терминолога в бэкенде есть; UI = Ф3. Модель цикла записана словом владельца 16.08 (D39.144 + строка 192): черновой перевод и черновой банк появляются вместе → ОДИН ОК всему банку (не пер-термная масс-подпись) → доработка → пост-ридинговые точечные правки с пере-генерацией по вхождениям (механика — после полигона) |
|
||||
| ПТ-33 | Интерфейс НЕ раскрывает конвейер: ни моделей, ни стадий, ни внутренней терминологии (решение владельца 02.08; граница пере-читана 15.08 — охранять АЛГОРИТМЫ, не минорную механику, D39.136 п.4а). ⚠ «Лестница» фаз «загрузка → … → финал → готово» — устная фраза владельца, НЕ норма продукта (его слово 16.08, D39.138: `finalizing` сворачивается) | 🔶 | инвариант D39.81; словарь статусов принят (D39.100/К-1); карта «вердикт → фраза» — приложение А компаньона (В-3), после D39.138 пишется по словарю машинных кодов Б-1. ⚠ Ревью 28 (Б-0) ОПРОВЕРГЛО исполнением ответ §5 компаньона «сменится стадия — фронт не правится»: волны draft/edit утекали в `Progress` до React-компонента; снято ИСПОЛНЕННЫМ батчем 0.3.0 (D39.142/143: Progress — один счётчик в каноне, анти-утечка-греп чист); машинный ГЕЙТ на утечку — фронту при разморозке (пинг 16.08). ⚠ **ОСТАТОК, названный владельцем 20.08 (D39.153, строка 200), — ИСПОЛНЕН 28.08 (D39.162/D39.163), строка 200 закрыта.** Было: доля считалась по отрезкам и обнулялась при снятии стопа — пользователь видел 100% после черновика и старт заново. Стало: ОДНА монотонная доля на всю работу прогона через обе волны, считает СЕРВЕР, плюс подпись «что делается сейчас» (`Progress.stage`, ВТОРОЕ и последнее исключение границы — D39.163, словарь ОТКРЫТ, клиент рисует незнакомое нейтрально). ⚠ **Остаток, который НЕ закрылся и назван честно:** платформа продаёт ГЛАВЫ, а движку передаёт только денежный потолок — единица продажи не равна единице остановки (`PD-410`, архитектурный стоп; направление лечения — D39.165 §1). И полоса ПЕРЕ-ПРОХОДА гранулярности не имеет вовсе: движок анонсирует работу один раз за жизнь книги, поэтому она объявлена «одной неделимой единицей работы» (D39.166), а не выведена |
|
||||
| ПТ-34 | Пользовательский перевод НИКОГДА не попадает на публично индексируемый URL — ни витрин примеров, ни «поделиться главой», ни публичных ссылок чтения (жёсткий продуктовый запрет, решение владельца 02.08; авторское право на исходники + политика Google по масштабируемому машин-контенту действуют на весь домен) | ⭕ | инвариант D39.84; носители: двухконтурный деплой `frontend/docs/STACK_DECISIONS.md` §4 (SPA под `X-Robots-Tag: noindex` на каждом HTML-ответе; публичный контур без контента переводов) + контракт 14 (`architecture/14-api-contract/`, D39.99) + платформенный бэклог П-1; правило доступа к экспорт-ссылке (срок/подпись) — батч 183 (research/28 Б-4) |
|
||||
| ПТ-35 | Лимиты «как в Claude Code» (решение владельца 04.08, D39.100): страница лимитов/использования в настройках (статус, НЕ суммы — запрет денег на экране в силе); стоп по потолку = статус `paused` + оповещение «перевод остановлен: лимиты исчерпаны» | 🔶 | контракт К-8 закрыт, спека несёт `paused`/`paused_reason` (0.2.0+, D39.115); ручки /v0 — платформа-раннер P4 (D39.123); статус `paused` по потолку ЧЕСТЕН с P6 (D39.132: exit 4/событие → `paused`, не `failed`; дневной потолок оператора различим и из платформенного шаблона убран — решение владельца 15.08); остаток: страница лимитов и оповещение на фронте (после P7) · точное продуктовое слово — В-3 на владельце · ~~К-13~~ ЗАКРЫТ (D39.132 п.2а: `null` на проводе; пере-суждён ревью 28 §4 №9 и НЕ опрокинут — с уходом дневной оси различие перестало быть продуктовым) |
|
||||
| ПТ-35 | Лимиты «как в Claude Code» (решение владельца 04.08, D39.100): страница лимитов/использования в настройках (статус, НЕ суммы — запрет денег на экране в силе); стоп по потолку = статус `paused` + оповещение «перевод остановлен: лимиты исчерпаны» | 🔶 | контракт К-8 закрыт, спека несёт `paused`/`paused_reason` (0.2.0+, D39.115); ручки /v0 — платформа-раннер P4 (D39.123); статус `paused` по потолку ЧЕСТЕН с P6 (D39.132: exit 4/событие → `paused`, не `failed`; дневной потолок оператора различим и из платформенного шаблона убран — решение владельца 15.08); остаток: страница лимитов и оповещение на фронте (после P7) · ⚠ фразы (В-3 · К-6 · Приложение А) ДЕЛЕГИРОВАНЫ проекту словом владельца 30.08 (D39.176 п.4): подписи владельца НЕ ждём, требование ИНЖЕНЕРНОЕ — фраза не литерал ни в Go, ни в TSX, а ДАННЫЕ по машинному коду причины и локали; вместе со словарём закрывается `PD-246`, гейт — строка бэклога 204 · ~~К-13~~ ЗАКРЫТ (D39.132 п.2а: `null` на проводе; пере-суждён ревью 28 §4 №9 и НЕ опрокинут — с уходом дневной оси различие перестало быть продуктовым) |
|
||||
| ПТ-36 | Интерфейс МУЛЬТИЯЗЫЧНЫЙ, русский не хардкодится в разметке (слово владельца 10.08; язык интерфейса — отдельная ось от языков перевода). ⚠ До 10.08 требование в реестре отсутствовало — пропуск поймал владелец (D39.127 п.2г) | 🔶 | ПОСТРОЕНО S3.7 (принят D39.129): каталог `frontend/src/i18n/ru.ts` (⚠ число ключей здесь НЕ держим — оно росло каждым касанием зоны и уже разошлось: было «157», в дереве 202; счёт снимается командой `grep -cE "^\s+'[a-z][a-zA-Z0-9.]*':" frontend/src/i18n/ru.ts`; испр. 22.08) · механизм `@internationalized/string` · ESLint-гейт «текст местом» · стор языка с персистом · `<html lang>` следует выбору; содержимое — только ru; продуктовый список языков — 🔒 владелец (В-9 зоны фронта) |
|
||||
|
||||
## Качество процесса и самоулучшение
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
> Отчёт относит этот механизм к носителям решения D39.106 — в теле D39.106 его НЕТ вовсе (проверено грепом по слайсу
|
||||
> живого тела ноты **D39.106** («ШОВ: прогон переживает деплой платформы») в `../architecture/05-decisions-log.md` — адресуем НОМЕРОМ, а не строкой: line-якорь в журнал решений не переживает вставку эрраты, и он уже съезжал дважды (гейт якорей, 28.08); первый хит темы — только в D39.110. ⚠ Испр. 23.08: прежняя редакция ссылалась на слайс `archive/architecture/05-decisions-D39-106-123.md`, где тела D39.106 НЕТ — греп по нему подтвердил бы эррату вакуумно). Строка была КАНДИДАТОМ панели,
|
||||
> а живой канон решил ось иначе: **потолок едет со стартом прогона и после не меняется**, лекарство при упоре — НОВЫЙ прогон
|
||||
> (`platform/internal/runs/reconcile.go:1437`=`answering 202 with the run in the state`). ⚠ Испр. 23.08: прежняя редакция звала «строку 69», но вставка самого баннера сдвинула нумерацию — 69-я строка теперь несёт ЖИВОЙ денежный механизм («холд не освобождается по выходу юнита»), и исполнение прежней инструкции пометило бы отвергнутым НЕ ТО. Номера строк здесь больше не называем, только подстроку. Читать НАЗВАННЫЙ ВЫШЕ пункт как отвергнутого
|
||||
> (`platform/internal/runs/reconcile.go` (греп `202` в обработчике возобновления; номер снят 30.08 — файл правит живая сессия зоны)). ⚠ Испр. 23.08: прежняя редакция звала «строку 69», но вставка самого баннера сдвинула нумерацию — 69-я строка теперь несёт ЖИВОЙ денежный механизм («холд не освобождается по выходу юнита»), и исполнение прежней инструкции пометило бы отвергнутым НЕ ТО. Номера строк здесь больше не называем, только подстроку. Читать НАЗВАННЫЙ ВЫШЕ пункт как отвергнутого
|
||||
> кандидата, а не как обязательный механизм; закон входной двери шва (`../architecture/17-seam-inbound-law.md` п.2) это фиксирует:
|
||||
> посреди прогона внутрь идёт ТОЛЬКО сигнал.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue