Say in the canon what the platform now does: an operator mints the bearer token out of band, and the character count is exact only for UTF-8 text

This commit is contained in:
heaven 2026-09-05 10:03:39 +03:00
parent 3e8471683e
commit 3ab23a9136
3 changed files with 22 additions and 4 deletions

File diff suppressed because one or more lines are too long

View file

@ -1628,7 +1628,7 @@ head-1 это семнадцать бюджетируемых операций,
3. **После пополнения баланса прогон возобновляется ЯВНЫМ действием пользователя, а не сам.** Пункт «авто-резюм `paused`» висел в листе владельца с 08.08 в форме, умершей вместе с оконной моделью; зона записала вывод сама (`PLATFORM_DIRECTION.md`), владелец его подтвердил — **пункт снят с листа**, вывод зоны становится ратифицированным.
4. **Фразы, которые видит пользователь (В-3 · К-6 · Приложение А), ДЕЛЕГИРОВАНЫ проекту** — слово: «оставляю проектирование фраз на вас, главное чтоб это было интернациональным». ⚠ Это не «свобода формулировки», а **инженерное требование**: фраза не может быть литералом ни в Go платформы, ни в TSX фронта — только данными, ключуемыми машинным кодом причины и локалью (механизм языков интерфейса уже построен, `ПТ-36`/`В-9`). Следствия: словарь фраз — носитель ДАННЫХ, один на продукт; `PD-246` (граница `attention`/`glance` — сегодня ДОГАДКА платформы по 15 причинам движка) закрывается вместе с ним, а не отдельно; строка **204** (движок не публикует причины флагов данными) становится его гейтом. Проектирование — оркестратор + зоны, подпись владельца больше не ожидается.
5. **Осталось на владельце из платформенного листа — ОДИН пункт, и он переформулирован** (`PD-421`): держит ли ОТКРЫТЫЙ поток событий сессию живой. Владелец ответа не дал, попросив раскрыть предмет; вопрос переформулирован в терминах продукта и вынесен заново.
6. ⚠ **Ключи провайдеров — развилка снята фактом, а не решением:** движок берёт их ДВУМЯ путями (`--keys-file` деплоя ПОБЕЖДАЕТ конвенционный `.env` рядом с `book.yaml``backend/cmd/tmctl/invocation.go:145`=`keys-file`), формат обоих — `KEY=VALUE`. Владелец 30.08 сообщил, что чинил ключи движка; **из этого следует, что холодный прогон движка (очередь №20 п.2) разблокирован, а живой прогон через API (п.3) — нет**: платформа читает СВОЙ путь (`TM_PLATFORM_ENGINE_KEYS_PATH`, `platform/internal/config/config.go:530`=`ENGINE_KEYS_PATH`), и по записи P9 живых ключей в нём не было. Лечение — операционное и $0: направить переменную платформы на уже заполненный файл (формат совпадает), проверять — прогоном, не чтением (гардрейл `.env` в силе, оркестратор файлов ключей не открывал).
6. ⚠ **Ключи провайдеров — развилка снята фактом, а не решением:** движок берёт их ДВУМЯ путями (`--keys-file` деплоя ПОБЕЖДАЕТ конвенционный `.env` рядом с `book.yaml``backend/cmd/tmctl/invocation.go:145`=`keys-file`), формат обоих — `KEY=VALUE`. Владелец 30.08 сообщил, что чинил ключи движка; **из этого следует, что холодный прогон движка (очередь №20 п.2) разблокирован, а живой прогон через API (п.3) — нет**: платформа читает СВОЙ путь (`TM_PLATFORM_ENGINE_KEYS_PATH`, `platform/internal/config/config.go:531`=`ENGINE_KEYS_PATH`), и по записи P9 живых ключей в нём не было. Лечение — операционное и $0: направить переменную платформы на уже заполненный файл (формат совпадает), проверять — прогоном, не чтением (гардрейл `.env` в силе, оркестратор файлов ключей не открывал).
## D39.177 — ПЕРЕДАЧА РОЛИ ОРКЕСТРАТОРА №20 → №21: что смена приняла и построила, четыре моих ошибки (две поймал владелец) и очередь, сверенная деревом (31.08). ✅

View file

@ -985,8 +985,13 @@ components:
A server-side session as an opaque token, for a client that is not a browser. The principal
is established in middleware only; no endpoint may assume a cookie.
⚠ **Nothing issues such a token today** — the server accepts one, but no call here or in the
session mechanics hands one out. The companion carries who owes that and when.
⚠ **A token IS issued now, and NOT by an endpoint** (corrected 05.09; the earlier text said
"nothing issues such a token today" and stopped being true when the operator command landed).
It is minted OUT OF BAND by the operator — `tmplatformctl token issue --user … --client …` —
and the session it creates is an ordinary one: it appears in the account's login journal under
the operator provider, and `POST /auth/logout` revokes it like any other. No call in this
document hands one out, and that is deliberate: a door that issues its own credentials over
HTTP is a different threat model and would be ratified separately, not added here.
headers:
RequestId:
@ -1647,6 +1652,19 @@ components:
minimum: 0
description: |
Size of the source in characters, or `null` while the book is still arriving.
⚠ **THE NUMBER IS EXACT ONLY FOR UTF-8 TEXT, and today nothing on the wire says which
case you are in** (measured 04.09; ratified as a defect 05.09). It counts runes of the
WRITE STREAM: for a UTF-8 `.txt` upload those are the source's own characters, but for an
EPUB they are runes of the ZIP CONTAINER, and for GB18030 or UTF-16 the engine decodes
what this side could not. A reader shown "9 972 characters" for an EPUB is shown the size
of an archive.
**The chosen cure is a PRECISION SIGNAL BESIDE the number, not a change to what `null`
means** — `null` already says "still arriving", a live client renders it as `0`, and
overloading it would break a reader that is deployed. The field lands with the
order-form pack, which is the one that makes this number a PRICE; until it does, this
description is the only place that says the number can be wrong.
added_at: { type: string, format: date-time }
note_count:
type: integer