Add expectation tokens to the anchors the pre-commit gate named, making their content verifiable instead of merely resolvable
This commit is contained in:
parent
31e889d446
commit
4fa7e70d65
2 changed files with 15 additions and 15 deletions
|
|
@ -30,7 +30,7 @@ zip/OPF-строителя развело бы две копии. **Начина
|
|||
|
||||
1. `backend/internal/pipeline/export.go` — **прежде всего блок CAVEATS над `Export`**: три состояния
|
||||
КНИГИ, о которых файл обязан не соврать. ⚠ Ещё два состояния — ПОЮНИТНЫЕ, в CAVEATS их нет; они в §3.2.
|
||||
2. `backend/cmd/tmctl/render.go:562-630` — существующий рендер: чем `--plaintext` НЕ годится в качестве
|
||||
2. `backend/cmd/tmctl/render.go:562-630`=`func renderExport` — существующий рендер: чем `--plaintext` НЕ годится в качестве
|
||||
книги (аудит-баннеры, флаги в скобках) и арифметика `withheld`/`incomplete` (`:573-587`), которую
|
||||
твой файл обязан повторить.
|
||||
3. `backend/internal/chunk/ingest.go` — как книга РАЗБИРАЕТСЯ из epub: писатель обязан быть обратим к
|
||||
|
|
@ -49,12 +49,12 @@ zip/OPF-строителя развело бы две копии. **Начина
|
|||
читателю не годится). ⚠ Это запрет на ОПЕРАТОРСКИЙ словарь, не на честность: как показать читателю
|
||||
неполноту — решение §3.2. Существующий `--plaintext` не трогать и не переименовывать — это его
|
||||
ВЫВОД, запинённый `export_cli_test.go`/`exportgap_cli_test.go`; вынос арифметики withheld/incomplete в
|
||||
общий хелпер допустим. JSON — машинная поверхность двух потребителей: полигон (`eval/README.md:80` —
|
||||
«`--plaintext` для глаз, дефолтный JSON для скриптов») и платформа (`platform/internal/runner/engine.go:148`
|
||||
`ExportArgs` → `:191` `ingest.DecodeExport`); менять форму `tm-export-v1` — значит менять платформу из
|
||||
общий хелпер допустим. JSON — машинная поверхность двух потребителей: полигон (`eval/README.md:80`=`для глаз` —
|
||||
«`--plaintext` для глаз, дефолтный JSON для скриптов») и платформа
|
||||
(`platform/internal/runner/engine.go:148`=`func ExportArgs` → `:191` `ingest.DecodeExport`); менять форму `tm-export-v1` — значит менять платформу из
|
||||
чужой зоны.
|
||||
|
||||
⛔ **ОДИН файл на книгу на формат** — так требует контракт (`docs/architecture/14-api-contract/openapi.yaml:2489-2492`:
|
||||
⛔ **ОДИН файл на книгу на формат** — так требует контракт (`docs/architecture/14-api-contract/openapi.yaml:2489-2492`=`A built copy of the book`:
|
||||
`Export` = «A built copy of the book, behind a link»); деление на главы живёт ВНУТРИ файла (spine EPUB,
|
||||
разделители в txt), а не набором файлов.
|
||||
|
||||
|
|
@ -99,7 +99,7 @@ EPUB — это zip. У `archive/zip` из stdlib таймметки запис
|
|||
худший исход этого пака.
|
||||
|
||||
**Рамка ратифицирована ДО этого пака и бьёт «решаешь сам»:**
|
||||
- Контракт 14 (D39.99; `docs/architecture/14-api-contract/openapi.yaml:836-853`, `createExport`): неполная
|
||||
- Контракт 14 (D39.99; `docs/architecture/14-api-contract/openapi.yaml:836-853`=`finished or not`, `createExport`): неполная
|
||||
книга экспортируется — «may be exported, finished or not», а ЧТО содержит файл неполной книги — «not
|
||||
fixed here», то есть решается ЗДЕСЬ. Следствие: «только отказ» как единственное поведение НЕДОПУСТИМО —
|
||||
дверь платформы обязана уметь выдать неполную книгу.
|
||||
|
|
@ -119,8 +119,8 @@ EPUB — это zip. У `archive/zip` из stdlib таймметки запис
|
|||
данные пары, не литерал в Go (§3.5). Для ghost и drift контракт ничего не фиксирует — отказ или пометка
|
||||
на твой довод. Три ограничения на форму:
|
||||
- ⛔ **Не в снапшот.** Загрузчик пака складывает байты КАЖДОГО присутствующего опционального файла в
|
||||
`pack.Version()` (`backend/internal/lang/langpack.go:289-298`), а она входит в snapshot-id стадий
|
||||
(`pipeline/snapshot.go:381`): новый файл-данные по этому контракту = resnapshot = перекупка каждой книги
|
||||
`pack.Version()` (`backend/internal/lang/langpack.go:289-298`=`h.Write`), а она входит в snapshot-id стадий
|
||||
(`backend/internal/pipeline/snapshot.go:381`=`LangpackVersion`): новый файл-данные по этому контракту = resnapshot = перекупка каждой книги
|
||||
с `langpack_root`. Читательские слова — факт РЕНДЕРА, не перевода: канал для них НЕ складывается в
|
||||
`Version()` (отдельный не-фолдимый файл рядом с паком или вне пака) — форму решаешь и аргументируешь.
|
||||
Доказательство командой: `current_snapshot` экспорта копии minirun до и после добавления твоего
|
||||
|
|
@ -130,7 +130,7 @@ EPUB — это zip. У `archive/zip` из stdlib таймметки запис
|
|||
несловесные (номер главы/юнита, символ) либо отказ; что именно — реши и аргументируй. Словесный
|
||||
fallback в Go запрещён, `langpack_root` в копию — запрещён (§3.3).
|
||||
- ⚠ Маркер дыры — НЕ в `FinalText` и не в `export.go`: провод платформы судит `translated`/`withheld`
|
||||
предикатом «текст непуст» (`platform/internal/ingest/export.go:104`).
|
||||
предикатом «текст непуст» (`platform/internal/ingest/export.go:104`=`func unitState`).
|
||||
|
||||
### 3.3 Синтетический заголовок — НЕ твоя развилка (делай РОВНО так)
|
||||
|
||||
|
|
@ -199,23 +199,23 @@ nav-документ (`properties="nav"` в manifest). Фикстура `chunkte
|
|||
**Автора в проекте нет вовсе** — источника для `dc:creator` не существует, и выдумывать его не надо.
|
||||
⛔ `dc:language` берётся из `TargetLang`, а не литералом: пары — данные. **Решаешь сам:** расширять ли
|
||||
`BookExport`/`ChunkExport` (⚠ добавление поля безопасно: `DecodeExport` платформы — `json.Unmarshal` без
|
||||
`DisallowUnknownFields`, `platform/internal/ingest/export.go:78-80`; полигон формы не проверяет; ПЕРЕНОС
|
||||
`DisallowUnknownFields`, `platform/internal/ingest/export.go:78-80`=`func DecodeExport`; полигон формы не проверяет; ПЕРЕНОС
|
||||
существующего поля — нет) или брать метаданные мимо него.
|
||||
|
||||
### 3.4 Куда пишется файл — размечено, не додумывай
|
||||
|
||||
`cmd/tmctl` сам файлов не пишет (греп `os.Create|os.WriteFile` по `cmd/tmctl/*.go` минус тесты пуст), но
|
||||
движок пишет их слоем ниже, и у них есть конвенция: сайдкары через `pipeline.writeFileAtomic`
|
||||
(`internal/pipeline/artifact.go:26`; используют `manifest.go:401`, `bankexport.go:152`, `mining.go`) — место
|
||||
(`backend/internal/pipeline/artifact.go:26`=`func writeFileAtomic`; используют `manifest.go:401`, `bankexport.go:152`, `mining.go`) — место
|
||||
рядом с `ProjectDB`, запись атомарная, путь ПУБЛИКУЕТСЯ в конверте `StatusArtifacts` (`status.go:115-145`),
|
||||
и платформа берёт пути ТОЛЬКО оттуда (`platform/internal/runner/artifacts.go:39`; закон шва
|
||||
и платформа берёт пути ТОЛЬКО оттуда (`platform/internal/runner/artifacts.go:39`=`no bank read-out path`; закон шва
|
||||
`docs/architecture/17-seam-inbound-law.md` §1 — движок владеет путями своей схемы, платформа путь не
|
||||
выводит сама). Приор (опровергается аргументом): файл книги — такой же движковый артефакт:
|
||||
детерминированное место рядом с `ProjectDB`, атомарная запись, строка в `StatusArtifacts`; флаг явного
|
||||
пути — сверх этого, не вместо. **Реши и аргументируй:** форма вызова — новый глагол `tmctl` или флаг у
|
||||
`export` (глаголы — замороженный список `main.go:182`; форму потом читает дверь платформы) · флаг пути
|
||||
или конвенция · поведение при существующем файле (перезапись или отказ — у бэкапа отказ,
|
||||
`store/backup.go`) · публикуешь ли путь в конверте уже в этом паке. Коды выхода — замороженный словарь (`backend/cmd/tmctl/main.go:51-145`, запинен
|
||||
`store/backup.go`) · публикуешь ли путь в конверте уже в этом паке. Коды выхода — замороженный словарь (`backend/cmd/tmctl/main.go:51-145`=`refusal band`, запинен
|
||||
`exitcontract_test.go`): отказ §3.2 — новый `pipeline.RefusalClass` (`refusal.go`) с константой в полосе
|
||||
10–19, с доводом; чисел вне 0–5/10–19 не заводить. Молча выбранная форма здесь дороже неверной: её потом
|
||||
читает платформенная дверь выдачи.
|
||||
|
|
@ -262,7 +262,7 @@ nav-документ (`properties="nav"` в manifest). Фикстура `chunkte
|
|||
песочнице — но `cp -r` каталога КОПИЕЙ НЕ ЯВЛЯЕТСЯ.** `book.yaml`, `pipeline*.yaml` и `pairs/*.yaml`
|
||||
всех трёх книг несут АБСОЛЮТНЫЕ пути, и на этой машине они РЕЗОЛВЯТСЯ: `/home/ubuntu/books` — симлинк на
|
||||
оригинальный books-репозиторий, `/home/ubuntu/projects/textmachine/…` — ЧУЖОЙ ворктри (ветка polygon,
|
||||
живая сессия). `LoadBook` абсолютный путь не пере-рутит (`config/book.go:173`), `tmctl migrate`
|
||||
живая сессия). `LoadBook` абсолютный путь не пере-рутит (`backend/internal/config/book.go:173`=`filepath.IsAbs`), `tmctl migrate`
|
||||
мигрирует `book.ProjectDB` на месте и кладёт `backups/` рядом (`migrate.go:83-84`); даже read-only
|
||||
`export`/`status` открывают WAL и создают `.lock`/`-wal`/`-shm` рядом с оригиналом. Порядок: `go build
|
||||
-o <песочница>/tmctl ./cmd/tmctl` из `backend/` → скопировать каталог книги + `gu-zhenren/langpack-extend`
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
Loading…
Add table
Reference in a new issue