Move the single project backlog into its own file so the journal keeps only state, and repoint the counters, the hook and every live pointer to it
This commit is contained in:
parent
ff14901ac7
commit
2564a8a7dd
17 changed files with 362 additions and 298 deletions
|
|
@ -21,7 +21,7 @@
|
|||
## 3. Карта чтения — ЗАКОН, дальше только по её ссылкам
|
||||
|
||||
1. `CLAUDE.md` — цели владельца и гардрейлы.
|
||||
2. Строки бэклога **267**, **318**, **320** (`docs/PROGRESS.md`, греп `^| N |`).
|
||||
2. Строки бэклога **267**, **318**, **320** (`docs/BACKLOG.md`, греп `^| N |`).
|
||||
3. `backend/README.md` — механика движка.
|
||||
4. `docs/architecture/03-implementation-notes.md` — через баннер.
|
||||
5. `docs/architecture/12-go-style-notes.md` — только больные места.
|
||||
|
|
|
|||
277
docs/BACKLOG.md
Normal file
277
docs/BACKLOG.md
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -38,7 +38,7 @@
|
|||
⚠ Ссылка на этот файл обязана быть в каждом платформенном промте; из семи прежних сослались пять,
|
||||
и норма дважды проскользнула. Здесь она стоит.
|
||||
3. `platform/docs/DEFECT_REGISTER.md` — ряды `PD-441`, `PD-424`, `PD-438`.
|
||||
4. Строки **282**, **325**, **326** бэклога (`docs/PROGRESS.md`, греп `^| N |`).
|
||||
4. Строки **282**, **325**, **326** бэклога (`docs/BACKLOG.md`, греп `^| N |`).
|
||||
5. `platform/README.md` + зонный журнал (шапка, не целиком — он 5029 строк, см. §4.0).
|
||||
|
||||
**Ратифицированное — в теле промта:**
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
## 3. Карта чтения — ЗАКОН
|
||||
|
||||
1. `CLAUDE.md` — цели и гардрейлы.
|
||||
2. Строка **319** бэклога (`docs/PROGRESS.md`, греп `^| 319 |`) — предмет целиком.
|
||||
2. Строка **319** бэклога (`docs/BACKLOG.md`, греп `^| 319 |`) — предмет целиком.
|
||||
3. `eval/dovodka/blind-read/PREREG-2-BLIND-READ.md` — §5 (линзы) и §8.
|
||||
4. `eval/dovodka/prereg-4axes/stand/editor-p9.md` — инструкция судимой роли.
|
||||
5. Строки **300**, **265**, **143** бэклога.
|
||||
|
|
|
|||
273
docs/PROGRESS.md
273
docs/PROGRESS.md
File diff suppressed because one or more lines are too long
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
Проект: издательский художественный перевод крупных текстов (книги, ранобэ, вебновеллы) мультиагентным пайплайном поверх LLM API; **пара языков — данные, не код**, сегодня боевая zh→ru. Go-бэкенд + веб-фронт ридер-IDE (Ф3) + платформа (SaaS control plane, `platform/`, D39.81). Цели и мерило — канон в [../CLAUDE.md](../CLAUDE.md); онбординг сессий — там же. Стартовый бриф владельца: [../START_PROMT.MD](../START_PROMT.MD) — **живой документ**, его V-идеи разобраны в реестр требований (ниже).
|
||||
|
||||
**Состояние проекта НЕ здесь** — кроме таблицы активных промтов ниже, и это осознанное исключение: она отвечает на вопрос «какой файл мой», без которого холодная сессия выбирает роль сама (проверено слепым замером входа). Всё остальное состояние — Очередь, курс, бэклог — CURRENT-STATE в шапке [PROGRESS.md](PROGRESS.md); решения — [architecture/05-decisions-log.md](architecture/05-decisions-log.md) (при конфликте с любым доком побеждает он). Эта страница — только карта «что где лежит».
|
||||
**Состояние проекта НЕ здесь** — кроме таблицы активных промтов ниже, и это осознанное исключение: она отвечает на вопрос «какой файл мой», без которого холодная сессия выбирает роль сама (проверено слепым замером входа). Всё остальное состояние — Очередь и курс — CURRENT-STATE в шапке [PROGRESS.md](PROGRESS.md), а долг — единый бэклог [BACKLOG.md](BACKLOG.md); решения — [architecture/05-decisions-log.md](architecture/05-decisions-log.md) (при конфликте с любым доком побеждает он). Эта страница — только карта «что где лежит».
|
||||
|
||||
## Карта
|
||||
|
||||
|
|
@ -15,7 +15,8 @@
|
|||
- Исторические, читать через ⚠-баннеры: [01-decisions.md](architecture/01-decisions.md) (Р1–Р10) · [02-mvp-plan.md](architecture/02-mvp-plan.md) · [03-implementation-notes.md](architecture/03-implementation-notes.md) · [04-unhappy-paths.md](architecture/04-unhappy-paths.md) · [06-memory-risk-registry.md](architecture/06-memory-risk-registry.md).
|
||||
- `experiments/` — эмпирика полигона: [00-provider-quirks.md](experiments/00-provider-quirks.md) — **читать перед любым вызовом провайдера**; [08-cost-model-v2.md](experiments/08-cost-model-v2.md) — денежная модель; [09-pilot-protocol.md](experiments/09-pilot-protocol.md) — пилот Ф2.5; остальные — отчёты экспериментов. ⚠ **У каждого отчёта статус в его ревью-шапке: читай шапку прежде тела** — она первична и говорит, ратифицированы выводы или заморожены.
|
||||
- `research/` — фактура ресёрчей; у принятых — ревью-шапки, часть тел под ⚠ superseded: **читай баннер прежде содержимого**. Ключевые для навигации: 15 голос · 16 ридер-IDE · 17 внешняя критика · 18 рычаги качества · 19 нарезка · 20 банк-майнинг · 21 обзор транспорта · 22 доменные харнессы · 23 шов движок↔платформа · 25 холодное ревью шва — **читать перед любым кодом стыка** · 24 арбитраж банка · 26 официальные практики Anthropic · 28 контракт-ревью API v0 — **носитель для исполняющих сессий, читать оригинал, не пересказ**.
|
||||
- [PROGRESS.md](PROGRESS.md) — журнал: CURRENT-STATE + **ЕДИНЫЙ БЭКЛОГ** (единственный трекер) + живой хвост хроники. НЕ источник решений.
|
||||
- [PROGRESS.md](PROGRESS.md) — журнал: CURRENT-STATE + состояние паков + живой хвост хроники и зонные секции «Бэкенд»/«Полигон». НЕ источник решений.
|
||||
- [BACKLOG.md](BACKLOG.md) — **ЕДИНЫЙ БЭКЛОГ проекта** (единственный трекер; «строка N» — стабильный ID). Вынесен из `PROGRESS.md` 06.09 (D39.218; исключение из дословности названо в шапке того файла); зонные бэклоги — свои и с другими ID (`П-N`, `Ф-N`, `PD-N`).
|
||||
- **Тулчейн на чистой машине.** Версии не здесь — их носители: `backend/Makefile` и `platform/Makefile` (`GO_MIN_VERSION`, `GOLANGCI_VERSION`), `frontend/package.json` (`engines`), `platform/docs/STACK_DECISIONS.md` §«Postgres на стенде без root», `eval/requirements.txt` + `eval/.python-version`. Здесь только то, чего нет нигде: ставим в `~/.local/opt/<инструмент>` с симлинком в `~/.local/bin` (он уже в `PATH`), берём **последний патч пинованного минора, а не следующий минор** — линтер пинован точным равенством и разъедется. Root требуют ровно два пакета: `build-essential` (без C-компилятора нет `-race`, а снять `-race` значит выдать отсутствие тулчейна за зелёный прогон — см. комментарий над целью `test` в `backend/Makefile`) и `python3-venv` (в системном питоне нет `ensurepip`, и установка полигона по `eval/README.md` обрывается на первом шаге).
|
||||
- `scripts/counts.py` — **производные числа доков считаются им, а не руками** (голова по трём носителям · счёт очереди и зон · вес открытых строк регистра платформы · полнота реестра нот); `--check` даёт ненулевой код на расхождении; `--lint` — линтер file:line-якорей живых доков (D39.126). Его же зовёт зонный хук `scripts/githooks/pre-commit`: **`--lint` якорей — при ЛЮБОМ коммите с непустым индексом, включая коммиты чистого КОДА (гейт по составу снят 21.08: цели якорей живут в коде, и двигает их кодовый коммит; шумовое следствие — строка бэклога 244); `--check` чисел и головы — только при коммите с D-логом или PROGRESS** (оба `--from-index`, предупреждает, не блокирует). ⚠ **Гейт бутстрапится ЧУЖОЙ зоной — это ДЕФЕКТ, а не порядок работы (строка бэклога 220):** судит он `CLAUDE.md` и доки трёх зон, а в `.git/hooks/` его кладёт единственный установщик `frontend/scripts/githooks/install.mjs`, то есть побочный эффект `npm install` в зоне, которая ЗАМОРОЖЕНА. На свежем клоне `.git/hooks/` пуст и гейт молчит, не проверив ничего. Пока строка открыта, бутстрап делается руками (`node frontend/scripts/githooks/install.mjs`) — и это ВРЕМЕННАЯ мера, которую строка 220 закрывает, а не способ жить дальше. ⚠ Шапка систематически отстаёт от хвоста у ЛЮБОГО автора — потому проверка механическая, а не «посмотрю внимательно».
|
||||
- **Активные хендофф-промты — какой файл ТВОЙ** (состав обновляется при каждом лендинге, D39.80; хроника, причины и статусы РАБОТ — CURRENT-STATE и D-лог):
|
||||
|
|
|
|||
|
|
@ -29,5 +29,5 @@
|
|||
⚠ И перекос слоя, вскрытый включением: корпус контраста — факт ИСХОДНОГО языка, а лежит в
|
||||
пар-агностичном конфиге пайплайна. Пара, которой в репо нет, потребует своего корпуса и своего ключа.
|
||||
- **Вахта эффорта pro:** реестр загейченных триггеров — `architecture/13-tech-debt-anchors.md` §Б-108 (статус ручки — в строке редактора выше).
|
||||
- **Цена:** ~$0.85/ранобэ (D30.4; тело — `archive/architecture/05-decisions-D1-D38.md`, карта — шапка D-лога) — ⚠ число ДО пере-пина цен 13–15.08: таблица запинена ПИКОМ, счёт шиппинга = 100% DeepSeek ⇒ ×4.2–4.4 в пике и ×2.1–2.2 в долине (D39.137). ⚠ **Пере-калибровки НЕТ:** первый платный прогон редакторской волной отработал 31.08 (D39.184; числа — `archive/reports/COLDRUN_V16_REPORT_2026-08-31.md`), пересчёта книги из него никто не сделал — фактура и статус довода «редактор не гонялся» в `PROGRESS.md` строка 16. Ставка платформы $0.03/глава (D39.123 п.2г). Цены слагов — `models.yaml` (**`2026-08-15`**: `backend/configs/models.yaml:34`=`prices_checked: "2026-08-15"`; ⚠ бампнут факт-чеком ТОЛЬКО по DeepSeek; катовер 0731 цен не менял).
|
||||
- **Цена:** ~$0.85/ранобэ (D30.4; тело — `archive/architecture/05-decisions-D1-D38.md`, карта — шапка D-лога) — ⚠ число ДО пере-пина цен 13–15.08: таблица запинена ПИКОМ, счёт шиппинга = 100% DeepSeek ⇒ ×4.2–4.4 в пике и ×2.1–2.2 в долине (D39.137). ⚠ **Пере-калибровки НЕТ:** первый платный прогон редакторской волной отработал 31.08 (D39.184; числа — `archive/reports/COLDRUN_V16_REPORT_2026-08-31.md`), пересчёта книги из него никто не сделал — фактура и статус довода «редактор не гонялся» в `BACKLOG.md` строка 16. Ставка платформы $0.03/глава (D39.123 п.2г). Цены слагов — `models.yaml` (**`2026-08-15`**: `backend/configs/models.yaml:34`=`prices_checked: "2026-08-15"`; ⚠ бампнут факт-чеком ТОЛЬКО по DeepSeek; катовер 0731 цен не менял).
|
||||
- **Ключи API:** какой ключ нужен провайдеру — поле `api_key_env` в `models.yaml`, один носитель на факт. **`.env` НЕ читать** (гардрейл CLAUDE.md), `.env.example` можно. Ключи деплоя доезжают до движка аргументом `--keys-file` (движковая половина — D39.158, платформенная — пак P9); в окружение юнита ключи НЕ кладутся, и каталог пользовательского контента их больше не несёт. Строка бэклога **211** ЗАКРЫТА — история дефекта и его разбор в D39.156/D39.162.
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@
|
|||
Контент-роутинг ([11-gap-2](../research/11-gap-2.md)):
|
||||
- Механизм роутинга **переопределён D39.25**: не чанк-классификатор «горячести» 0–3, а content-label книги/главы × `accepts_labels` провайдера (`backend/configs/models.yaml`, подписи D39.30); L3 — политика ВХОДА. Живые инварианты этой строки: жёсткий отказ только на CSAM-категории (Р8) и «ложное срабатывание не убивает многочасовую оплаченную джобу» — чанк помечается в отчёте, глава и книга продолжают обрабатываться.
|
||||
- **Эскалация channel-aware**: для чанков канала B дорогая эскалация — Grok 4.3 / Gemini (safety off) / крупные open-weights; канал A — DeepSeek V4 Pro / GLM-5.1 / Gemini 3.1 Pro; OpenAI **в канал B не включать** (политика 18+ строгая, adult mode заморожен). Инвариант «непермиссивная нога не получает помеченный контент» живёт как fail-closed `accepts_labels` (D39.26/D39.28; `failover.go` удалён).
|
||||
- Гигиена аккаунтов xAI **снята D27**: ключ единый, с data-sharing на тесты/пилот; живой остаток — отключить data-sharing перед продом (строка 67 бэклога `../PROGRESS.md`). Провайдер лёг → роль пауза→resume (D4, не сайлент-своп). Think-ON на Grok — только после reasoning-буфера в EstimateUSD (D6.2); off-switch и аддитивность reasoning — `experiments/00-provider-quirks.md`.
|
||||
- Гигиена аккаунтов xAI **снята D27**: ключ единый, с data-sharing на тесты/пилот; живой остаток — отключить data-sharing перед продом (строка 67 бэклога `../BACKLOG.md`). Провайдер лёг → роль пауза→resume (D4, не сайлент-своп). Think-ON на Grok — только после reasoning-буфера в EstimateUSD (D6.2); off-switch и аддитивность reasoning — `experiments/00-provider-quirks.md`.
|
||||
- Обязателен **детектор молчаливых вырезаний** (сверка покрытия предложений вход↔выход) — Qwen-подобные внешние фильтры молча портят перевод.
|
||||
- Внутренний refusal/excision-бенчмарк (50–100 фрагментов), прогонять при каждой смене версии модели.
|
||||
- Для политически чувствительных zh-текстов — не полагаться на китайские API (цензура в весах), фолбэк на западные/локальные.
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@ C2, cache TTL per-стадия. В models.yaml: цены (+cache write/read), п
|
|||
|
||||
Селфревью Фазы 0 (скелет `7954325` → волна 1 `e861541` → волна 2 `214e005`) и независимое внешнее ревью **приняты, блокеров ноль**; хроника волн и диспозиция находок F1–F8/D1–D3 — `../archive/PROGRESS-2026-07-04-10.md` (§«Фаза 0 принята»). Из тогдашнего техдолга ЗАКРЫТО: гонка `Runner.clients` (клиенты строятся eager-проходом ДО волн, дальше map read-only — `internal/pipeline/runner.go`, греп `the clients map is READ-ONLY in the waves`; D39.13) · F4 «finish=length с обрезанным черновиком» (флаг диспозиции `FlagLength` — `internal/pipeline/disposition.go`, греп `FlagLength FlagReason`) · F3-класс оплаченных ретраев (кап пере-биллинга: второй нечитаемый оплаченный 2xx ТЕРМИНАЛЕН, ре-биллы капятся одним — `internal/llm/httpllm.go`, греп `Cap billed-decode re-bills at ONE`) · D1/D2 (билингв-редактор ратифицирован D30.1 — требование «убрать `{{text}}`» ОТМЕНЕНО, не исполнять; per-chunk skip+flag построен диспозиция-классификатором) · D3 (изоляция канала B: `failover.go` удалён, механизм лейблов `content_labels`×`accepts_labels` — D39.26/27/28).
|
||||
|
||||
**Живой остаток (носители — бэклог-строка 146 `docs/PROGRESS.md`, греп `Два техдолга движка без строки трекера`):**
|
||||
**Живой остаток (носители — бэклог-строка 146 `docs/BACKLOG.md`, греп `Два техдолга движка без строки трекера`):**
|
||||
- **Дневной потолок — пер-книжный** (ledger в файле проекта одной книги): `day_usd` сбрасывается в UTC-полночь и ограничивает burn-rate одной книги, а не «оператора за день по всем проектам»; общий потолок потребует shared spend-файла (раскладка «файл БД на книгу» из Р3/Р6). Платформенная половина — `PD-157`.
|
||||
- **`prices_checked` (120 д) гейтит read-only `report` и $0-resume** (F6): платных вызовов они не делают, но падают на устаревших ценах. ⚠ Приёмка D39.134: этот же гейт работает ДЕТЕКТОРОМ самолечения деплоя — снимать его бездумно нельзя.
|
||||
- **`cache_ttl` ↔ `cache_write_per_m`**: цена записи в кэш в models.yaml задана под ОДИН TTL (боевой 5m). При `cache_ttl: 1h` реальная запись стоит ×2, а не ×1.25 — недоучёт; вторая цена/валидация нужны при осознанном переходе на 1h.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Реестр D-нот — карта актуальности v2 (D1–D39.217; титул — носитель головы, бампать при каждом аппенде)
|
||||
# Реестр D-нот — карта актуальности v2 (D1–D39.218; титул — носитель головы, бампать при каждом аппенде)
|
||||
|
||||
> ⚠ **Колонку «тело» `counts.py --check` НЕ сторожит по устройству:** он сверяет полноту НОМЕРОВ, а не
|
||||
> место тела, поэтому колонка держится дисциплиной лендинга. Не нашёл тело по колонке — иди в слайсы,
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
> Одна строка на КАЖДУЮ ноту журнала решений: № · дата · суть · статус · где тело · темы.
|
||||
> ⚠ **ФОРМА ДВУХ ПОСЛЕДНИХ КОЛОНОК РАЗЪЕХАЛАСЬ, замерено 30.08 (аудит доков):** из 224 строк 74 несут в колонке «статус» не статус, а ЗАМЕТКУ о живом остатке («ЖИВОЕ: …»), а собственно `жив` уехал в колонку «тело». Читать так: **колонки 4–5 у свежих нот — пара «статус ⟷ что осталось живым», порядок в паре не гарантирован; статус ноты определяй по слову `жив`/`superseded`/`частично`, где бы из двух оно ни стояло, а место тела — по слову `слайс`.** Приведение к одной форме — строка бэклога **242**; чинить руками 74 строки без гейта дороже, чем читать по этому правилу. Ведёт оркестратор при лендингах: новая нота = новая строка ТЕМ ЖЕ коммитом (полноту сторожит `docs/scripts/counts.py --check`). Суть и статус здесь — НАВИГАЦИЯ, не контракт: при конфликте побеждает ТЕЛО ноты (живой [`05-decisions-log.md`](05-decisions-log.md) → слайсы `../archive/architecture/05-decisions-*.md`). Несущие эрраты к фактам старых нот живут в шапке живого D-лога — их читать ОБЯЗАТЕЛЬНО, реестр их не дублирует. Темы (для грепа оси «какой закон по X»): деньги · шов · банк · промпт · судья · гейты · контракт · платформа · фронт · полигон · ToS · общность · процесс · нарезка · голос · инфра · модели.
|
||||
> Легенда колонки «тело»: «жив» = живой D-лог, «слайс N» = `../archive/architecture/05-decisions-N.md` (родословная реестра — D39.126 п.1(а)).
|
||||
> ⚠ **«ЖИВОЕ: строка N» — снимок НА МОМЕНТ ноты.** ID закрытой строки бэклога `../PROGRESS.md` ИСЧЕЗАЕТ (закрытая уходит в D-лог с номером решения, ID не переиспользуется), поэтому «строки N в трекере нет» читается как ЗАКРЫТА, а не как битая ссылка — замерено 02.09: так уехали ссылки 18 строк реестра.
|
||||
> ⚠ **«ЖИВОЕ: строка N» — снимок НА МОМЕНТ ноты.** ID закрытой строки бэклога `../BACKLOG.md` ИСЧЕЗАЕТ (закрытая уходит в D-лог с номером решения, ID не переиспользуется), поэтому «строки N в трекере нет» читается как ЗАКРЫТА, а не как битая ссылка — замерено 02.09: так уехали ссылки 18 строк реестра.
|
||||
|
||||
| № | дата | суть | статус | тело | темы |
|
||||
|---|---|---|---|---|---|
|
||||
|
|
@ -276,3 +276,4 @@
|
|||
| D39.215 | 06.09 | **ОТЧЁТЫ КОДЕКСА: ПОЛЕЗНЫ, НО РАТИФИЦИРУЮТСЯ ПРОВЕРЕННЫЕ УТВЕРЖДЕНИЯ, А НЕ ФОРМУЛИРОВКИ** (консилиум: 40 клеймов, 31 подтверждён, 3 опровергнуты). ⛔ Центральное обвинение п.2 ОПРОВЕРГНУТО — принять его значило снять не то основание. ⭐ Сильнейший довод в отчётах ОТСУТСТВУЕТ: прибор замера штрафует поведение, которое сам заказывает. ⛔ Постчек банка молчит ровно тогда, когда сбывается названный им страх владельца. Строки 318–320 | ✅ |
|
||||
| D39.216 | 06.09 | **МАНДАТ ЧИСТОТЫ (решение владельца)**: проектировать и рефакторить без хаков и воркэраундов, где форма не тянет — переписывать; «дешевле подпереть» доводом не является; отступление объявляется С ЦЕНОЙ. ⛔ Носителя не было ВОВСЕ (ноль вхождений); `CLAUDE.md` нёс более узкое — запрет обходить НАЙДЕННУЮ ошибку. Обязан стоять строкой в каждом паке с проектированием | ✅ |
|
||||
| D39.217 | 06.09 | **ПЕРЕДАЧА №22 → №23**: четыре потока в шапке PROGRESS · три нормы смены (дерево+популяция и ДРУГОЙ прибор · контрольная величина ПЕЧАТАЕТСЯ · мутация по ТЕКСТУ) · класс «прибор ответил на свой вопрос» — 8+ раз у всех ролей · **чем врал оркестратор** (комментарии вместо тестов, числа из писем, суд по заголовку) · датированный риск 16.10 · вопросы владельца | ✅ |
|
||||
| D39.218 | 06.09 | **ЕДИНЫЙ БЭКЛОГ ВЫНЕСЕН В `docs/BACKLOG.md`** (решение владельца): таблица и бюллетень счёта перенесены побайтно, ID строк прежние, на месте — заголовок-указатель; `counts.py` и зонный хук переведены тем же коммитом. Замер формы: из 250 коммитов PROGRESS с 25.08 «только бэклог» 48 из 148 ⇒ ловушка «уношу чужое» снимается на 32 %, с бюллетенем 58 %; остаток — зонные секции, строка **328** | жив | ЖИВОЕ: строка 328 (зонные журналы бэкенда и полигона — на владельце); мутация «снять заголовок» гейтом НЕ ловится — п.5 | доки трекер гейт процесс |
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -100,7 +100,7 @@
|
|||
|
||||
## Гейты для бэкенда перед фиксацией схемы store/глоссария v2 — ИСПОЛНЕНЫ
|
||||
|
||||
Список из пяти пунктов (F1-снапшот · поля `sense`/ось редакционного времени/`UNIQUE(src,sense,window)`/`min_key_len`/нормализация · обязательный post-check · трёхсторонний disposition + `retrieval-state` · отложенное в v1.1) закрыт стройкой и снят как план: схема — `backend/internal/store/migrate.go` (`sense`, `since_ch/until_ch`, `UNIQUE(book_id,src,sense,since_ch,until_ch)`, `allow_short` как escape-hatch к `min_key_len`), нормализация — `internal/text`, disposition CONFIRMED/AMBIGUOUS/REJECT и `retrieval-state` (`n_exact_hits, n_sticky, n_ambiguous_flagged, n_spoiler_blocked, n_evicted`) — `internal/membank` + `store/glossary.go`, **Палладий построен, Поливанова НЕТ** (⚠ испр. 02.09 — прежняя редакция засчитывала B6 целиком): Палладий — таблица-данные `backend/configs/langpacks/<пара>/palladius*.txt` через загрузчик `backend/internal/lang/langpack.go`, греп `pairFiles = []string{"palladius.txt"`, плюс алгоритм `backend/internal/miner/miner_palladius.go`, греп `buildPalladiusCyrSyllables` (D39.16); **Поливанов-валидатора в коде НЕТ** — таблицы Поливанова = данные ja-пары, которых в репо нет (улика и грепы — `docs/architecture/13-tech-debt-anchors.md`, срез строки 81, греп `Поливанов-валидатор`). Бэкап/интеграл файла книги (F4) тоже построен — `store.BackupSQLite`/`store.IntegrityCheck` + `tmctl backup` (хвост — в бэклоге `../PROGRESS.md`). Из отложенного НЕ построено (греп по `backend/` — 0 хитов): гейт фактичности резюме (D1 — резюме нет вовсе), whole-book эмбеддинг-слой (A7/D2 — горячий путь по-прежнему «no embeddings»), морфо-гейт глагольного рода (C3, Ф2).
|
||||
Список из пяти пунктов (F1-снапшот · поля `sense`/ось редакционного времени/`UNIQUE(src,sense,window)`/`min_key_len`/нормализация · обязательный post-check · трёхсторонний disposition + `retrieval-state` · отложенное в v1.1) закрыт стройкой и снят как план: схема — `backend/internal/store/migrate.go` (`sense`, `since_ch/until_ch`, `UNIQUE(book_id,src,sense,since_ch,until_ch)`, `allow_short` как escape-hatch к `min_key_len`), нормализация — `internal/text`, disposition CONFIRMED/AMBIGUOUS/REJECT и `retrieval-state` (`n_exact_hits, n_sticky, n_ambiguous_flagged, n_spoiler_blocked, n_evicted`) — `internal/membank` + `store/glossary.go`, **Палладий построен, Поливанова НЕТ** (⚠ испр. 02.09 — прежняя редакция засчитывала B6 целиком): Палладий — таблица-данные `backend/configs/langpacks/<пара>/palladius*.txt` через загрузчик `backend/internal/lang/langpack.go`, греп `pairFiles = []string{"palladius.txt"`, плюс алгоритм `backend/internal/miner/miner_palladius.go`, греп `buildPalladiusCyrSyllables` (D39.16); **Поливанов-валидатора в коде НЕТ** — таблицы Поливанова = данные ja-пары, которых в репо нет (улика и грепы — `docs/architecture/13-tech-debt-anchors.md`, срез строки 81, греп `Поливанов-валидатор`). Бэкап/интеграл файла книги (F4) тоже построен — `store.BackupSQLite`/`store.IntegrityCheck` + `tmctl backup` (хвост — в бэклоге `../BACKLOG.md`). Из отложенного НЕ построено (греп по `backend/` — 0 хитов): гейт фактичности резюме (D1 — резюме нет вовсе), whole-book эмбеддинг-слой (A7/D2 — горячий путь по-прежнему «no embeddings»), морфо-гейт глагольного рода (C3, Ф2).
|
||||
|
||||
### Ruby-seed контракт (форма подтверждена оркестратором 05.07)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Якоря техдолга — справочник к строкам бэклога (НЕ трекер)
|
||||
|
||||
> **Часть находок ниже уже ЗАКРЫТА — закрытие помечено по месту D-номером, счёт закрытий в трекер не дублируется (D39.101).**
|
||||
> **Единственный трекер — таблица «Бэклог» в `../PROGRESS.md`.** Этот файл — справочные file:line-якоря и скоуп-заметки к её строкам (вынесен из архива решением владельца — содержимое ЖИВОЕ). Актуализируется лендингами паков, которые трогают эти строки; исполненный пункт помечать ссылкой на D-номер, не удалять.
|
||||
> **Единственный трекер — таблица «Бэклог» в `../BACKLOG.md`** (переехала из `PROGRESS.md` 06.09, D39.218; ID строк прежние). Этот файл — справочные file:line-якоря и скоуп-заметки к её строкам (вынесен из архива решением владельца — содержимое ЖИВОЕ). Актуализируется лендингами паков, которые трогают эти строки; исполненный пункт помечать ссылкой на D-номер, не удалять.
|
||||
> **Снятая мёртвая половина** (историческая улика ОТСУТСТВИЯ механизмов — снимок свипа 26.07–01.08 с file:line того времени) живёт носителем: `docs/archive/architecture/05-decisions-D39-59-90.md`, греп `D39.66-пост-сверка`; исполнение среза строки 25 — там же греп `D39.78`; закрытия банк-арки — `D39.69`. Здесь оставлен только ДЕЙСТВУЮЩИЙ статус.
|
||||
> ⚠ **Второй гвоздь под якоря НЕ строить — гейт уже построен и ратифицирован (D39.126):** `docs/scripts/counts.py --lint` сверяет якорь ПО СОДЕРЖИМОМУ через опт-ин токен `` `путь:123`=`подстрока` ``, органический остаток мигрируется на ЗАТРОНУТЫХ строках (бэклог-строка 205 — ЗАКРЫТА D39.200: гейт построен, миграция корпуса на токен-форму органическая и носителя больше не требует). Этот док — концентрат якорей, и органика на нём не сработала: токен-форму несут единицы, остальные гейт не видит ПО ПОСТРОЕНИЮ. Правильное действие — пакетная миграция якорей в токен-форму, не новый механизм.
|
||||
|
||||
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
### [RESCOPE ИСПОЛНЕН] Строка 81 — ja-преп B6-ja: Поливанов-валидатор + kana-омограф POS/known-word гейтинг (D17.1) + чек-лист kana-алиасов сида (D16.4)
|
||||
|
||||
Два компонента отсутствуют (полный состав и токен-якоря — строка 81 бэклога в `../PROGRESS.md`; здесь только отрицательная улика). **(1) Поливанов-валидатор:** валидирующего кода НЕТ — grep `polivanov`/`Поливанов` по `backend/**/*.go` даёт только значения конфига в тестах/примерах, коммент `Transcription` (`backend/internal/config/book.go`) и мост ruby-чтения (`backend/internal/membank/memseed.go`, греп `Polivanov bridge`, там же «B6, Phase 2»); поля схемы `translit_policy`/`ruby_reading` помечены «Phase 2» самим кодом. **(2) kana-омограф гейтинг** отложен явно: «KANA and HAN are deliberately NOT boundary-checked … their ≥4 precision is deferred to the kana-precision measurement + the B6 tokenizer» (`backend/internal/membank/memory.go`), подтверждено D17 (тело — слайс `D1-D38`: митигация kana-омографов → «скоуп B6»). **Третий компонент — чек-лист kana-алиасов сида (D16.4) — ПОСТРОЕН** (`backend/README.md` §ja + `AttachRubyAliasesToManual`); в чек-листе остался лишь Ф2-хвост «двойные чтения (強敵→とも) полная дизамбигуация», и он тоже под B6.
|
||||
Два компонента отсутствуют (полный состав и токен-якоря — строка 81 бэклога в `../BACKLOG.md`; здесь только отрицательная улика). **(1) Поливанов-валидатор:** валидирующего кода НЕТ — grep `polivanov`/`Поливанов` по `backend/**/*.go` даёт только значения конфига в тестах/примерах, коммент `Transcription` (`backend/internal/config/book.go`) и мост ruby-чтения (`backend/internal/membank/memseed.go`, греп `Polivanov bridge`, там же «B6, Phase 2»); поля схемы `translit_policy`/`ruby_reading` помечены «Phase 2» самим кодом. **(2) kana-омограф гейтинг** отложен явно: «KANA and HAN are deliberately NOT boundary-checked … their ≥4 precision is deferred to the kana-precision measurement + the B6 tokenizer» (`backend/internal/membank/memory.go`), подтверждено D17 (тело — слайс `D1-D38`: митигация kana-омографов → «скоуп B6»). **Третий компонент — чек-лист kana-алиасов сида (D16.4) — ПОСТРОЕН** (`backend/README.md` §ja + `AttachRubyAliasesToManual`); в чек-листе остался лишь Ф2-хвост «двойные чтения (強敵→とも) полная дизамбигуация», и он тоже под B6.
|
||||
|
||||
|
||||
### [ЗАКРЫТО D39.82] Строка 83 — F4: бэкап + integrity_check SQLite перед платным прогоном (VACUUM INTO) → **ИСПОЛНЕНО D39.82: `tmctl backup` + pre-flight (`backend/cmd/tmctl/backup.go`, коммит `9f60746`; команда `backup` в `dispatchCommands`), строка 83 закрыта; остаток F4-хвоста — строка 93**
|
||||
|
|
@ -142,7 +142,7 @@ Go-гейт стоит на v1 без поглощения кавычек: backe
|
|||
|
||||
## Архео-хвосты жирных строк бэклога (выселение докс-паком строки 167, 09.08.2026)
|
||||
|
||||
> Тела ячеек «Хвост» перенесены сюда ДОСЛОВНО на момент выселения (норма D39.125 п.3: «диспозиция сверху, археология вниз»; ячейка >800 байт — не трекер). Живая диспозиция каждой строки — ТОЛЬКО таблица бэклога `../PROGRESS.md`; здесь справочная археология. Закрытия помечать по месту стрелкой «→ Dxx», не удалять.
|
||||
> Тела ячеек «Хвост» перенесены сюда ДОСЛОВНО на момент выселения (норма D39.125 п.3: «диспозиция сверху, археология вниз»; ячейка >800 байт — не трекер). Живая диспозиция каждой строки — ТОЛЬКО таблица бэклога `../BACKLOG.md`; здесь справочная археология. Закрытия помечать по месту стрелкой «→ Dxx», не удалять.
|
||||
> ⚠ **Голые `file.go:NNN` в этой секции — снимок 09.08.2026, и часть номеров с тех пор съехала (сверено 02.09).** Сверяйся ГРЕПОМ по названной функции/константе/цитате, а не по номеру строки; пере-нацеленный якорь пиши токен-формой `` `путь:123`=`подстрока` ``.
|
||||
|
||||
### Б-13б — тело строки 13б на 09.08.2026
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
- **`--ceiling-usd` — КНИЖНЫЙ потолок, не бюджет прогона.** Дословно из флага: «the book USD ceiling in force for THIS RUN ONLY — it OVERRIDES book.yaml `ceilings.book_usd` and is never written back. It caps the book's CUMULATIVE committed+reserved spend, not this run's increment…» (`backend/cmd/tmctl/invocation.go:142`=`the book USD ceiling in force for THIS RUN ONLY`; ⚠-коммент `backend/cmd/tmctl/main.go:260`=`--ceiling-usd is NOT a per-run budget`; многоточие закрывает обрыв цитаты — во флаге дальше стоит «, and must be > 0»). Ратификация — D39.122 п.2(в): пересчёт «пользовательский прирост → абсолют» — обязанность ПЛАТФОРМЫ, вторая денежная ось не заводится. День-потолок флаг НЕ перекрывает (PD-157). Проводка внутри: `Ceilings.BookUSD` в `Reserve` и именование сработавшего потолка в ошибке — `backend/internal/pipeline/stagerun.go:495`=`BookUSD: r.bookCeilingUSD()` и `backend/internal/pipeline/stagerun.go:559`=`overrides the book's ceilings.book_usd` (стоп = `errReserveCeiling`, `backend/internal/pipeline/escalation.go:49`=`var errReserveCeiling`).
|
||||
- **Потолки — wiring, не семантика:** `Ceilings` намеренно исключены из `BriefHash` («Wiring fields (paths, ceilings, db) deliberately excluded», `backend/internal/config/book.go:345`=`Wiring fields (paths, ceilings, db) deliberately excluded`; канон — `backend/internal/config/book.go:369`=`canon := struct {`) ⇒ смена ДЕНЕЖНОГО потолка не двигает ни снапшот, ни ре-билл (D39.110 п.2б). ⚠ Верно ровно про ДЕНЬГИ: потолок СЕГМЕНТАЦИИ `edit_ceiling_out` в снапшот ВХОДИТ и меняет границы чанков (`backend/internal/pipeline/snapshot.go:34`=`EditCeilingOut int`).
|
||||
- **`status --json` отдаёт фигуры платформе:** `committed_usd`, `reserved_usd`, `book_ceiling_usd`, `ceiling_pct` = 100·(committed+reserved)/book_ceiling (`backend/internal/pipeline/status.go:311`=`book_ceiling_usd,omitempty`; арифметика `ceiling_pct` — `backend/internal/pipeline/status.go:869`=`100 * (committed + reserved)`). Дневной фигуры в status нет (PD-157 — `platform/docs/DEFECT_REGISTER.md`, греп `PD-157`).
|
||||
- **Леджер = НИЖНЯЯ граница** (строка 78 бэклога, `docs/PROGRESS.md`, греп `Леджер денег = НИЖНЯЯ граница`): «2xx body decode failed (call IS billed)» — провайдер списал, попытка в `request_log` не попадает; живой замер D39.86 — 3 вызова из 14, неизвестность $0.015111 при леджере $0.114378; движок сеттлит оценку и печатает `estimated-cost rows: 3`. Канал виден, фикс — money-паком (дизайн GENERALITY_PHASE2 §5.6).
|
||||
- **Леджер = НИЖНЯЯ граница** (строка 78 бэклога, `docs/BACKLOG.md`, греп `Леджер денег = НИЖНЯЯ граница`): «2xx body decode failed (call IS billed)» — провайдер списал, попытка в `request_log` не попадает; живой замер D39.86 — 3 вызова из 14, неизвестность $0.015111 при леджере $0.114378; движок сеттлит оценку и печатает `estimated-cost rows: 3`. Канал виден, фикс — money-паком (дизайн GENERALITY_PHASE2 §5.6).
|
||||
|
||||
- **Согласие на пере-оплату — ДВИЖКОВЫЙ гейт**. Прогон, который пере-покупает уже оплаченные юниты дороже порога, ОСТАНАВЛИВАЕТСЯ и требует явного согласия. Порог по умолчанию ратифицирован D20.2-Q2: `min($0.50, 5% × ProjectedBookUSD)`. Носитель — `backend/internal/pipeline/rebill.go`, греп `rebillConsentThreshold`; единственная ручка книги — `rebill_consent_usd` (валидатор `backend/internal/config/book.go`, греп `rebill_consent_usd`; 0 = ратифицированный дефолт). ⚠ Порог считается БЕЗ контура банк-ролей (D39.182 §3), то есть срабатывает позже, чем подсказывает полная проекция.
|
||||
|
||||
|
|
@ -49,7 +49,7 @@
|
|||
|
||||
8. **Settle по фигуре движка.** `reconcile.settle` (`platform/internal/runs/reconcile.go`, греп `func (s *Service) settle(` — ⚠ номера строк в файлы живой зоны не ставим, пока её сессия работает) читает committed из status; `credits.Settle` одной транзакцией закрывает резервацию, возвращает холд и списывает spent; **spent > холда — капится холдом** с явной пометкой «capped at the hold; the engine reported …» (`platform/internal/pgstore/credits.go`, греп `capped at the hold; the engine reported`), перерасход движка счётом не абсорбируется.
|
||||
9. **SpendBound (PD-159).** Отложенный settle читает пожизненный счётчик КНИГИ и без границы оплатил бы работу прогона-преемника (замер: $2.10 за прогон ценой $0.10, и преемник платил снова). Граница = наименьший baseline попыток той же книги, стартовавших ПОЗЖЕ: `committed = min(счётчик сейчас, SpendBound)` (`platform/internal/runs/reconcile.go`, греп `bound != nil`; `platform/internal/pgstore/runs.go`, греп `func (s *Store) SpendBound(`).
|
||||
10. **Открытое — эскроу/intent (строка 136 бэклога, `docs/PROGRESS.md`, греп `Write-ahead intent`):** write-ahead intent + состояние `uncertain`-эскроу + `closing`; холд НЕ освобождается по выходу юнита (сигнал обгоняет денежные события); spend не постится без свидетельства провайдера; расход сверх холда — полной суммой, превышение явной строкой убытка. Стройка по research/25, «скоро». ⚠ **«Строка 103» — ФАНТОМ, снят 31.08:** такой строки в бэклоге нет (закрыта D39.131), а эмиттер шва ПОСТРОЕН с обеих сторон — платформа тейлит `events.jsonl` и принимает кадр `spend` (`platform/internal/ingest/events.go`, греп `TypeSpend Type`). Денежной слепоты это НЕ снимает по построению: поток событий — только свежесть. Платформа между спавном и settle слепа — защита держится холдом и потолком движка (§1).
|
||||
10. **Открытое — эскроу/intent (строка 136 бэклога, `docs/BACKLOG.md`, греп `Write-ahead intent`):** write-ahead intent + состояние `uncertain`-эскроу + `closing`; холд НЕ освобождается по выходу юнита (сигнал обгоняет денежные события); spend не постится без свидетельства провайдера; расход сверх холда — полной суммой, превышение явной строкой убытка. Стройка по research/25, «скоро». ⚠ **«Строка 103» — ФАНТОМ, снят 31.08:** такой строки в бэклоге нет (закрыта D39.131), а эмиттер шва ПОСТРОЕН с обеих сторон — платформа тейлит `events.jsonl` и принимает кадр `spend` (`platform/internal/ingest/events.go`, греп `TypeSpend Type`). Денежной слепоты это НЕ снимает по построению: поток событий — только свежесть. Платформа между спавном и settle слепа — защита держится холдом и потолком движка (§1).
|
||||
|
||||
## 4. Фронт (зона `frontend/`)
|
||||
|
||||
|
|
@ -77,7 +77,7 @@
|
|||
| Ратификации, на которых стоит этот док | ⚠ **добавлены 05.09: `D39.203`** (владелец: движку МОЖНО говорить «сколько добавить»; наружу идёт ДО-ВЫЗОВНАЯ ОЦЕНКА, не стоимость) · **`D39.204`** (отказ резервации на ретрае деградирует во ФЛАГ; решение принято, код НЕ тронут — строка 291) · **`D39.206`** (акт приёмки денежного стопа). ⚠ **И новые движковые денежные носители того же лендинга:** `backend/internal/pipeline/reservegate.go` (шлюз резерваций и `shortfallMicroUSD`) · `priceprojection.go` (проекция цены книги) · `internal/runevents/runevents.go` (`Ceiling.ShortfallMicroUSD`, `Finished.Money`, поток 1.3). · **D39.179** (пере-пин цен 16.08, ×4.47; норма «стабилен чистый ФАЙЛ» — п.4) · **D39.181** (закон раскрытия: признак объёмного стопа едет числом) · **D39.182** (пак «деньги и честность»: план банк-ролей режется до первого вызова; порог согласия без контура банк-ролей) |
|
||||
| Код денег движка | `backend/internal/store/ledger.go` · `store/store.go` · `pipeline/stagerun.go` · `pipeline/status.go` · `config/book.go` · `pipeline/rebill.go` (согласие на пере-оплату) · `pipeline/terminologist.go` (книго-широкие бюджеты банк-ролей) · `pipeline/volume.go` (объёмный потолок) |
|
||||
| Дефекты денег | `platform/docs/DEFECT_REGISTER.md` (PD-104·113·144·157·158·159) |
|
||||
| Бэклог-строки | `docs/PROGRESS.md` строки 78 · 136 · 137 (⚠ испр. 05.09: **166 отсюда СНЯТА** — движковая половина оценки построена и опубликована лендингом `81a89e9`; открыта только платформенная) (135 и 165 закрыты D39.131) |
|
||||
| Бэклог-строки | `docs/BACKLOG.md` строки 78 · 136 · 137 (⚠ испр. 05.09: **166 отсюда СНЯТА** — движковая половина оценки построена и опубликована лендингом `81a89e9`; открыта только платформенная) (135 и 165 закрыты D39.131) |
|
||||
| Контракт наружу | `14-api-contract/openapi.yaml` (⚠ **`CeilingBounds` РЕТИРОВАН лендингом формы заказа 06.09** — его место занял `RunOptions` с `chapters_left`/`affordable_chapters`/`verdict` и денежными границами; `Usage`); ПТ-35 |
|
||||
| ⚠ Запрет денег на экране — **ОТОЗВАН 05.09 (D39.196)**. Живым остаётся ПТ-35 в его четырёх пунктах: цены моделей · стоимость стадий · стоимость ВЫЗОВОВ · структура наших расходов. ⚠ И различение `D39.203`, без которого пункт про вызовы читается неверно: наружу идёт ДО-ВЫЗОВНАЯ ОЦЕНКА (резервация перед звонком), а запрет написан про СТОИМОСТЬ — что списано по факту; сеттлмент не выходит | D39.84; D39.100/К-8; ПТ-35; **D39.196**, эррата 05.09-а |
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@
|
|||
- **Харнесс** — обвязка исполнения (наш пайплайн-транспорт или конкурентные agent-обвязки; калибровка — research/21–22).
|
||||
- **⚠-баннер** — шапка «тело superseded, чему верить»; **ревью-шапка** — вердикты приёмки поверх отчёта в `archive/reports/`.
|
||||
- **Пак** — пакет работ одной сессии; **свип** — полная перепроверка обязательств (D39.66: 951 позиция); **добор идеала** — очередь качества после ре-пробы flash; **МАСШТАБ** — прогон целой книги.
|
||||
- **Строка N** — стабильный ID строки единого бэклога (PROGRESS §Бэклог; не перенумеровывается); **вес** — блокер-очереди / скоро / когда-нибудь; **носитель** — артефакт, в котором обязательство живёт; **хвост** — незакрытый остаток; **петля** — вопрос, обязанный получить диспозицию; **слот** — зарезервированное место в будущем пакете/замере.
|
||||
- **Строка N** — стабильный ID строки единого бэклога (`docs/BACKLOG.md`; не перенумеровывается); **вес** — блокер-очереди / скоро / когда-нибудь; **носитель** — артефакт, в котором обязательство живёт; **хвост** — незакрытый остаток; **петля** — вопрос, обязанный получить диспозицию; **слот** — зарезервированное место в будущем пакете/замере.
|
||||
- **Гвоздь** — регрессионный тест, прибивающий контракт (негативный гвоздь — тест на ОТСУТСТВИЕ поведения).
|
||||
- **Реестр 108 / «жилец реестра»** — строка 108 единого бэклога: реестр ЗАГЕЙЧЕННЫХ ТРИГГЕРОВ (отложенных реопенов с условием «когда вернуться»); «жилец» = такой реопен; норма «каждое отложено получает строку или жильца» — D39.66/D39.90.
|
||||
- **Контракт 14 (API v0)** — ратифицированный контракт фронт↔платформа: `architecture/14-api-contract/` — нормативная спека OpenAPI 3.1 + компаньон-README; зонная копия `frontend/docs/api-contract/` — байт-зеркало (D39.99; статус зеркала и версий — карта `README.md`, здесь не пинятся). **Провенанс ✓/◆/○** — классы утверждений компаньона: выведено из кода/ратификации · предложено (подтверждает названная зона) · открыто (К-вопросы). **spectral / openapi-typescript** — линт спеки и генерация типов фронта с дрифт-тестом (⚠ 3.1-условия генератор игнорирует — К-11).
|
||||
|
|
|
|||
|
|
@ -47,6 +47,9 @@ from pathlib import Path
|
|||
|
||||
ROOT = Path(__file__).resolve().parents[2]
|
||||
PROGRESS = "docs/PROGRESS.md"
|
||||
# ⚠ Таблица бэклога и её бюллетень живут ОТДЕЛЬНЫМ файлом с 06.09 (D39.218); в PROGRESS на
|
||||
# прежнем месте стоит заголовок-указатель, поэтому `region()` по-прежнему режет шапку по нему.
|
||||
BACKLOG = "docs/BACKLOG.md"
|
||||
DLOG = "docs/architecture/05-decisions-log.md"
|
||||
REGISTER = "platform/docs/DEFECT_REGISTER.md"
|
||||
NOTE_INDEX = "docs/architecture/05-decisions-index.md"
|
||||
|
|
@ -323,14 +326,14 @@ def head(dlog: str, prog: str, idx: str) -> dict:
|
|||
# ненайденный литерал = проверка перестала проверять, и это докладывается как расхождение.
|
||||
# region ограничивает поиск, чтобы историческая секция со старым числом не давала ложной тревоги.
|
||||
LITERALS = [
|
||||
(PROGRESS, "current-state", r"всего \*\*(\d+)\*\* строк", ("backlog", "всего")),
|
||||
(PROGRESS, "current-state", r"зона бэкенд \*\*(\d+)\*\* строго", ("backlog", "бэкенд строго")),
|
||||
(PROGRESS, "current-state", r"/ \*\*(\d+)\*\* широко", ("backlog", "бэкенд широко")),
|
||||
(PROGRESS, "current-state", r"«скоро» \*\*(\d+)\*\*", ("backlog", "скоро")),
|
||||
(BACKLOG, "current-state", r"всего \*\*(\d+)\*\* строк", ("backlog", "всего")),
|
||||
(BACKLOG, "current-state", r"зона бэкенд \*\*(\d+)\*\* строго", ("backlog", "бэкенд строго")),
|
||||
(BACKLOG, "current-state", r"/ \*\*(\d+)\*\* широко", ("backlog", "бэкенд широко")),
|
||||
(BACKLOG, "current-state", r"«скоро» \*\*(\d+)\*\*", ("backlog", "скоро")),
|
||||
# ⚠ Добавлено 23.08 (оркестратор №19): пятое число ТОЙ ЖЕ фразы очереди скрипт считал и печатал,
|
||||
# но НЕ сравнивал, и другого гарда на него в репозитории не было — «блокеров 0» могло разойтись
|
||||
# с таблицей молча. Литерал не обёрнут своими `**` — жирным помечена вся фраза целиком.
|
||||
(PROGRESS, "current-state", r"блокеров очереди (\d+)\*\*", ("backlog", "блокеров очереди")),
|
||||
(BACKLOG, "current-state", r"блокеров очереди (\d+)\*\*", ("backlog", "блокеров очереди")),
|
||||
# ⚠ Литерал веса регистра СНЯТ с проверки 08.08, и это не упрощение, а исправление ошибки
|
||||
# проектирования: единственным его носителем в зоне docs была ИСТОРИЧЕСКАЯ фраза о том, что нашла
|
||||
# приёмка, а гард требовал от неё равенства ТЕКУЩЕМУ пере-счёту регистра. Первый же фикс зоны
|
||||
|
|
@ -694,7 +697,8 @@ def main() -> int:
|
|||
return 1 if problems else 0
|
||||
|
||||
dlog, prog, reg = read(DLOG), read(PROGRESS), read(REGISTER)
|
||||
b, r, h = backlog(prog), register(reg), head(dlog, prog, read(NOTE_INDEX))
|
||||
bck = read(BACKLOG)
|
||||
b, r, h = backlog(bck), register(reg), head(dlog, prog, read(NOTE_INDEX))
|
||||
check = "--check" in sys.argv
|
||||
src = "содержимое коммита (индекс/HEAD)" if FROM_INDEX else "рабочее дерево"
|
||||
|
||||
|
|
@ -734,7 +738,7 @@ def main() -> int:
|
|||
f"максимум по номеру {h['максимум по номеру']} — голова считается по максимуму"
|
||||
)
|
||||
|
||||
texts = {PROGRESS: prog, REGISTER: reg}
|
||||
texts = {PROGRESS: prog, REGISTER: reg, BACKLOG: bck}
|
||||
for path, reg_name, pattern, (kind, key) in LITERALS:
|
||||
if kind == "backlog":
|
||||
want = b[key]
|
||||
|
|
|
|||
|
|
@ -38,6 +38,9 @@ staged=$(git diff --cached --name-only)
|
|||
|
||||
dlog='docs/architecture/05-decisions-log.md'
|
||||
prog='docs/PROGRESS.md'
|
||||
# ⚠ Третий носитель с 06.09 (D39.218): таблица бэклога и её бюллетень уехали в отдельный файл,
|
||||
# и без него `--check` не звали бы РОВНО на тех коммитах, что меняют таблицу.
|
||||
backlog='docs/BACKLOG.md'
|
||||
|
||||
# ⚠ БЫСТРОГО ВЫХОДА ПО «коммит не задевает docs/» БОЛЬШЕ НЕТ (21.08, разбор с внешним ревьюером).
|
||||
# Он ампутировал ЦЕЛЕВУЮ сторону дельта-сверки якорей: якорь протухает, когда двигается ЦЕЛЬ, а цели
|
||||
|
|
@ -71,7 +74,7 @@ fi
|
|||
# 2) Производные числа — по содержимому коммита, и ТОЛЬКО когда в коммите носители этих чисел
|
||||
# (гейтовка прежняя, D39.112). Ненайденный литерал скрипт тоже считает расхождением: проверка,
|
||||
# молча перестающая проверять, хуже отсутствующей.
|
||||
if printf '%s\n' "$staged" | grep -qE "^($dlog|$prog)$"; then
|
||||
if printf '%s\n' "$staged" | grep -qE "^($dlog|$prog|$backlog)$"; then
|
||||
if command -v python3 >/dev/null 2>&1 && [ -f docs/scripts/counts.py ]; then
|
||||
if ! out=$(python3 docs/scripts/counts.py --check --from-index 2>&1); then
|
||||
echo "pre-commit ⚠ docs: производные числа разошлись с пере-счётом:" >&2
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue