Ratify the finished seam inbound door: the bank stop is now a flag the engine honours itself, and the bank ontology is written down

This commit is contained in:
heaven 2026-08-27 14:00:03 +03:00
parent d1eb8a9f4b
commit d24342c73f
5 changed files with 327 additions and 8 deletions

File diff suppressed because one or more lines are too long

View file

@ -11,7 +11,7 @@
- `architecture/` — синтез и контракты:
- [05-decisions-log.md](architecture/05-decisions-log.md) — **источник истины по решениям**: ратифицированный контракт, при конфликте побеждает он. Дисциплина чтения (грепать номер, не читать целиком, баннер прежде тела) — в каноне `../CLAUDE.md`, здесь не дублируется. Статус и тело ЛЮБОГО номера одним хопом — реестр [05-decisions-index.md](architecture/05-decisions-index.md) (все ноты, колонка тем для грепа «какой закон по X»).
- [09-target-architecture.md](architecture/09-target-architecture.md) — целевая 7-слойная архитектура (статус стройки — шапка-таблица; §3 — карта находок H/L) · [10-prompt-architecture.md](architecture/10-prompt-architecture.md) — промпт-слой · [12-go-style-notes.md](architecture/12-go-style-notes.md) — норматив общности §0 · [13-tech-debt-anchors.md](architecture/13-tech-debt-anchors.md) — якоря техдолга + археология выселенных строк бэклога §Б-* (справочник к бэклогу, НЕ трекер) · [14-api-contract/](architecture/14-api-contract/) — **контракт API v0 фронт↔платформа (D39.99)**: нормативная спека OpenAPI 3.1 (типы фронта генерятся из неё) + компаньон-README с провенансом каждой строки (легенда — в нём самом; зонная копия `frontend/docs/api-contract/` — байт-зеркало, сверять при лендинге).
- Топикальные входы (D39.126; НЕ источники истины, при конфликте побеждает D-лог): [15-money-path.md](architecture/15-money-path.md) — деньги от гранта до settle одним маршрутом · [16-events-emitter.md](architecture/16-events-emitter.md) — сборка-норматив эмиттера шва — обязательное пре-чтение перед кодом эмиттера · **[17-seam-inbound-law.md](architecture/17-seam-inbound-law.md) — закон ВХОДНОЙ двери шва движок↔платформа — РАТИФИЦИРОВАН D39.156: семь пунктов дисциплины, двери встают паками без нового решения владельца** · [STACK.md](STACK.md) — карта «роль → модель → конфиг → квирки».
- Топикальные входы (D39.126; НЕ источники истины, при конфликте побеждает D-лог): [15-money-path.md](architecture/15-money-path.md) — деньги от гранта до settle одним маршрутом · [16-events-emitter.md](architecture/16-events-emitter.md) — сборка-норматив эмиттера шва — обязательное пре-чтение перед кодом эмиттера · **[17-seam-inbound-law.md](architecture/17-seam-inbound-law.md) — закон ВХОДНОЙ двери шва движок↔платформа — РАТИФИЦИРОВАН D39.156: семь пунктов дисциплины, двери встают паками без нового решения владельца** · **[18-bank-ontology.md](architecture/18-bank-ontology.md) — онтология банка памяти (РАТИФИЦИРОВАНА D39.158): три роли носителей, единственные писатели, дисциплина проекции — обязательное пре-чтение перед кодом, трогающим банк или его артефакты** · [STACK.md](STACK.md) — карта «роль → модель → конфиг → квирки».
- Исторические, читать через ⚠-баннеры: [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 — **носитель для исполняющих сессий, читать оригинал, не пересказ**.
@ -22,7 +22,7 @@
| Роль | Активный промт | Статус |
|---|---|---|
| Оркестратор | [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) | роль и нормы; счётчик роли — CURRENT-STATE |
| Бэкенд | [BACKEND_SEAM_FIX3_SESSION_PROMPT.md](BACKEND_SEAM_FIX3_SESSION_PROMPT.md) | фикс-лист приёмки дофикса-2 (пак ПРИНЯТ): четыре пина, снос мёртвой машинной таблицы стопа, зачистка двух контрактов в одном дереве; новых механизмов ноль; дерево трёх паков НЕ закоммичено и продолжается; запуск по слову владельца |
| Бэкенд | активного НЕТ | входная дверь шва ЗАКОНЧЕНА и заленджена (D39.158): четыре пака приняты; свободные работы зоны — ЕДИНЫЙ БЭКЛОГ в `PROGRESS.md` |
| Платформа | [PLATFORM_P8_REVIEW_SESSION_PROMPT.md](../platform/docs/PLATFORM_P8_REVIEW_SESSION_PROMPT.md) | read-only ревью четырёх осей; запуск по слову владельца |
| Полигон | [POLYGON_EXP2223_REDO_SESSION_PROMPT.md](POLYGON_EXP2223_REDO_SESSION_PROMPT.md) (отложенный — [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md), строка 85) | фаза Д ИДЁТ; ⚠ живой носитель курса — в `eval/dovodka/`, какой именно называет зона (⚠ [POLYGON_PHASE_D_HANDOFF.md](POLYGON_PHASE_D_HANDOFF.md) — перекрытый снимок, читать не как курс) |
| Фронт | активного НЕТ | **ЗОНА ЗАМОРОЖЕНА** (D39.136 п.2 + D39.147: разморозка отдельным словом владельца, не привязана к P7); перечень первого касания — в зонном журнале |

View file

@ -1,4 +1,4 @@
# Реестр D-нот — карта актуальности v2 (D1D39.157;
# Реестр D-нот — карта актуальности v2 (D1D39.158;
> ⚠ **СЛАБОЕ МЕСТО, КОТОРОЕ БЫЛО ЗДЕСЬ (вписано 22.08, ЗАКРЫТО 24.08 — D39.157 п.6).** Колонка ТЕЛА
> у нот D39.107…D39.123 говорила «жив», хотя тела уехали в слайс подрезкой D39.139; семнадцать строк
@ -218,3 +218,4 @@
| D39.155 | 22.08 | Сквозная актуализация доков по многоагентному аудиту (14 линз + опровергатель на каждую находку, 180 агентов; 132 находки, 30 опровергнуто) + **передача роли №18 → №19**. Срезано: `PROGRESS.md` 471→291, зонный журнал платформы 897→239 (слайсы `PROGRESS-2026-08-17`, `-08-10-15`, `platform-PROGRESS-P8`); перед срезом вынесены носители — инвентарь каналов шва в `STACK_DECISIONS` (и там ПОЛНЕЕ: дописан канал текста `tmctl export --pairs`). Ложь, которую читала каждая сессия: `12-go-style-notes` §0 п.4 предписывал снятый ключ `prompts:`, на котором движок НЕ поднимется; таблица §3 компаньона объявляла не построенными шесть работающих поверхностей. Новые строки 206210; **210 — род не производится авто-путём вовсе** (доставка построена, данных нет: терминолог возвращает три поля без рода, майнер берёт `gender` только из сида) + `gates.voice` нет ни в одном шиппинг-конфиге. ⚠ **СНЯТА ратификация 203(з)/191(б):** гейт движка проверяет полноту ФАЙЛА решений, а не подписей, один файл его снимает — конфликта с моделью «один ОК» нет, обход был костылём под отсутствующую доставку; единственный блокер темы — владение `book.yaml` (199а). Контрактный батч разделён по БЛОКЕРАМ: 0.5.0 гигиена сейчас, 0.6.0 ручка+прогресс после ратификаций. sqlc: гейт SQL съел бо́льшую часть ценности (162 оператора против 41), остаток — арность `Scan` на двух запросах. Названы пять собственных ошибок №18, все в ПРОЗЕ О ФАКТАХ | ЖИВОЕ: строки 199а · 206 · 208 · 210 · 172-г — на владельце; читающий пак платформы выдан и не запускался | жив | доки приёмка банк контракт передача-роли |
| D39.156 | 23.08 | **Ратифицирован закон входной двери шва движок↔платформа** — дисциплина из семи пунктов (`17-seam-inbound-law.md`), не каталог команд: двери встают паками без нового решения владельца. Развилка 199(а) РАСТВОРЕНА (конвенционные дефолты путей + движковый глагол-писатель), три выноса по требованию ревьюера (форма Б · фикс-имена шва · отказ лока ровно классом 12), эррата к `research/25`. Заведены строки 211213, закрыта слепота гейта якорей | жив | живой файл |
| D39.157 | 24.08 | Переезд на новую машину: стенд пересобран без root (обе батареи EXIT=0 под `-race`, сквозняк живьём), носитель подъёма — карта `README.md` (отдельный док `dev-stand.md` заведён и снесён тем же днём по возражению владельца, аудит одного носителя его подтвердил); корень книг переопределён на `<репозиторий>/books` со своим git, якорь `/books/` в игноре починен; цена переезда измерена (движок — 3 хелпера, строка 218; полигон — 173 файла по корню книг и 121 по корню репо, два РАЗНЫХ слома, строка 217); решения владельца: легаси выкидывать, а не чинить (санкция паку на удаление эксп-1216), GPU на машине нет; маршрут холодного входа починен по СЛЕПОМУ замеру трёх ролей; класс «line-якорь в D-лог» закрыт (51 из 55 съехал), реестр перестал врать про 17 тел, гейт вооружён структурной сверкой и доказан мутацией; транспортный коммит `temp` снят по слову владельца | ЖИВОЕ: строки 217/218; очередь — CURRENT-STATE | жив | инфра процесс доки полигон бэкенд |
| D39.158 | 27.08 | Входная дверь шва закончена: стоп банка — ФЛАЖОК в движке (память предъявленного, схема v16); полоса — два яруса + гардрейл «разрушительное на классе»; класс `write_incomplete`/exit 15; отчёт двери v2; пути решений только конвенцией; эрраты 191(б)/203(з) | жив | живой файл | шов · банк · полоса отказов |

View file

@ -1,4 +1,4 @@
# Журнал решений оркестратора — контракт D1D39.157 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`)
# Журнал решений оркестратора — контракт D1D39.158 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`)
> **КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Работая с контрактом (греп номера: живой файл → слайсы, целиком НЕ читать — D39.125), держи под рукой, что чем перекрыто:
> ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 живёт ниже в этом файле (голова D39.106+).
@ -10,6 +10,8 @@
> ⚠ **Эррата 16.08-д (D39.144 п.3):** клейм «`bank_decisions_incomplete` в файле 0» проверял ТОКЕН, а не ПРАВИЛО — четыре места канона/компаньона продолжали нести снятый гейт полноты прозой (`BankDecisionsResult.complete` «stop clears ONLY on a complete set» · `BankPage.complete` «can be cleared» · компаньон §2.14 и А-2); дочищены 16.08 при пересборке промта P7 (нашёл опровергатель промта). Плюс факт, который D39.144 не назвала: гейт полноты УЖЕ ОТЛИТ в коде платформы (`internal/runs/reconcile.go:934-938`) — его ДЕМОНТАЖ заказан P7 явным пунктом.
> ⚠ **Эррата 16.08-г (D39.138 п.2а, часть «TermStatus снять с провода»):** ОПРОКИНУТА пост-ревью АВТОРА отчёта research/28 (по заказу владельца, речек оркестратора уликами): обоснование Б-0 «ни один экран их не рисует» подменяло «экрана подписи ещё НЕТ» — ось статуса ПРОДУКТОВАЯ (спека `:1070-1072`: «главный фильтр работы» S5; шов клиента уже потребляет — `frontend/src/api/vocabulary.ts:159-163`). Читать так: ось `TermStatus` ОСТАВИТЬ, движковые слова значений переименовать в продуктовые; «`TermOrigin` снять/переименовать» (`ruby` — паро-специфика) — В СИЛЕ. Контекст метода: Б-0/Б-11а/Б-23 добавлены в отчёт ПОСЛЕ раунда адверсариального судейства сессии — их основания проверять строже (помечено в ревью-шапке отчёта).
> ⚠ **Эррата 20.08 (D39.153 п.7б):** D39.144 п.2 атрибутирует пер-термный гейт полноты банка «изобретению КОНТРАКТНОЙ линии (Ф-14 → спека → 0.3.0)» — верно про ГЕЙТ и **неверно про ФОРМУЛУ**. Формула «стоп очищается, когда каждый терм промоутнут ИЛИ отклонён» родилась 19.07 В ДВИЖКЕ как лечение ливлока R1-FL-B (отклонённый терм переспрашивался каждый прогон — тело D39.19, слайс `../archive/architecture/05-decisions-D39-arch-reset.md:22`) и живёт там до сих пор (`backend/internal/pipeline/mining.go:80-82,243`); контрактная линия 04.08 переписала её дословно и вывела из неё ЭКРАННЫЙ гейт — счётчик «решено N из M» и запрет продолжить (коммит `16e20e5`, `frontend/docs/API_CONTRACT_INPUT.md:258-264`). **Следствие, из-за которого эррата несущая:** снимая гейт, D39.144 адресовала только контракт, поэтому движковая половина осталась БЕЗ явной отмены — она сегодня ОБОЙДЕНА платформой (флаг не передаётся на resume), а не устранена; носитель — строка 191(б), развилка — строка 203(з).
> ⚠ **Эррата 27.08 (D39.158 п.7):** D39.153 п.7б объявляет «ОСТАТКА-РАТИФИКАЦИИ НЕТ… гейт проверяет полноту ФАЙЛА решений, а не подписей, и ОДИН файл со всем банком его снимает — конфликта с моделью владельца нет». Читать так: диспозиция отвечала на вопрос «снимает ли гейт один файл» (снимает) и верифицировала СОСТАВНОЕ поведение — платформа снимает флаг, движок уходит по авто-ветке. Вопрос «работает ли флажок БЕЗ обхода» ею не закрывался, и заказанное той же строкой 191(б) «ослабить границу самой паузы» исполнено не было. Исполнено D39.158: движковая половина УСТРАНЕНА, не обойдена.
> ⚠ **Навигация (актуализация 07.08, эра D39.1xx):** append-only-дисциплина (D23.3) означает, что
> НЕВЕРНЫЙ ФАКТ внутри старой ноты не переписывается, а получает эрратау — и тогда он опасен ровно
> тем, что грепающий его найдёт ПЕРВЫМ, а эрратау ниже может не дочитать. Поэтому поправки к фактам
@ -664,3 +666,25 @@
**6. Класс «line-якорь в D-лог» закрыт, гейт вооружён (строка 219 ЗАКРЫТА).** Замер по git-blame (для каждого якоря — версия лога на коммит, которым он написан): из 55 якорей живого корпуса съехал **51** — подрезки D39.125/D39.139 сдвинули нумерацию. Починены поштучно 24 якоря двух живых нормативных доков (`16-events-emitter` — обязательное пре-чтение перед кодом эмиттера — и `13-tech-debt-anchors`); тела `research/17` и `research/20` НЕ правились (D23.3, внешняя улика) — они получили пометку в шапке. Реестр нот врал про место тела у 17 нот подряд (D39.107123 — «жив» при теле в слайсе); исправлено, пере-проверено скриптом: лжи 0. **Гейт `counts.py --lint` научен структурной сверке без токена** — владелец целевой строки обязан совпасть с номером, названным рядом. ⚠ **Первая редакция правила была молчащим no-op** (голые имена без `/` отсеивались до неё) и это поймала ПОСАДКА МУТАЦИИ, а не перечтение: урок ровно тот же, что D39.155 п.11.
**7. Транспортный коммит снят.** `temp` (`2f17752`), которым владелец перевозил дерево, снят по его слову `reset --mixed`: он уносил `START_PROMT.MD`, который канон коммитить запрещает. Дерево не тронуто — сверено побайтно по каждому из 20 файлов; страховка — бандл вне репо и reflog. Работа полигона снова НЕЗАКОММИЧЕНА, приёмка фазы за параллельным оркестратором. (24.08.2026, оркестратор №19) ✅
## D39.158 — ВХОДНАЯ ДВЕРЬ ШВА ЗАКОНЧЕНА: стоп банка — ФЛАЖОК в самом движке; полоса отказов получает два яруса и класс 15; отчёт двери v2; пути решений — только конвенцией (27.08, оркестратор №19). ✅
Четыре пака зоны бэкенда приняты и заленджены одним деревом. Механика и доказательная база — `backend/docs/SEAM_PACK_FINDINGS.md` (вход §26 и §43), решения зоны с доводами — там же §37; здесь только ратифицированное.
**1. Стоп банка — флажок, и его исполняет ДВИЖОК.** Флаг опущен — прогон не останавливается, неподписанные строки едут редактору с пометкой. Поднят — полный останов на кластере, которого ни один прежний стоп не предъявлял. «ОК» — возобновление БЕЗ решений, прогон идёт дальше. Носитель — персистентная память «предъявленного стопом» (схема хранилища v16), предикат новизны по пересечению кластеров на итоговой карте ПОСЛЕ потолков. ⚠ Это исполнение отложенной половины строки бэклога **191(б)** — её пункт заказывал «проверить/ослабить границу самой паузы», исполнено было только «проверить», а верифицировалось СОСТАВНОЕ поведение с обходом. Обход платформы (снятие флага на возобновлении) теперь лишний и умирает её паком, но ТОЛЬКО после этого лендинга.
**2. Полоса отказов — два яруса.** Пол полосы (минимум для читателя, не знающего номера) — «нет работы, которую надо откатывать; повтор безопасен»; «безопасен» значит «не навредит», не «поможет». Каждый класс поверх пола объявляет свой, более сильный инвариант: конфиг, источник, лок и отвергнутые решения сохраняют «ничего не произошло» как клаузу КЛАССА. **Гардрейл:** разрушительное действие ключуется только на КЛАССЕ, никогда на принадлежности полосе — истинно де-факто в обеих зонах, становится буквой без миграции.
**3. Класс `write_incomplete` = exit 15** — и для «не легло ничего», и для «легла половина»: потребитель ветвится одинаково (условие хоста, не книги; повтор безопасен), различие несёт пофайловая правда отчёта. Второй номер не заводится. Это единственный класс, который не может обещать «ничего не произошло», — и ради него пол полосы и переформулирован.
**4. Отчёт двери — `tm-bank-decisions-report-v2`**: шесть явных исходов, единый конструктор, исходные поля выводятся из ПЕРЕЧИТАННОГО состояния после записи, вердиктные — из решений против состояния ДО.
**5. Ключи `mined_delta`/`mined_rejects` сняты**: пути решений — только конвенцией каталога книги, объявляемый ключ отвечает retired-отказом. Это исполнение D39.156 п.3 до конца: объявляемый путь и делал межкнижную гонку записи достижимой.
**6. Порядок деплоя, обязательный:** движок первым → `tmctl migrate` по каждой книге до прогонов → и только потом платформа снимает свой обход. Миграционная нота: пустая память даёт один доброкачественный стоп на книгу.
**7. Эрраты, ставятся этой нотой.** Диспозиция D39.153 п.7б «остатка-ратификации нет, конфликта с моделью владельца нет» отвечала на ДРУГОЙ вопрос — «снимает ли гейт один файл со всем банком» (снимает) — и верифицировала составное поведение с обходом; вопрос «работает ли флажок без обхода» ею не закрывался. Строки бэклога **191(б)** и **203(з)** пере-диспозиционированы: движковая половина УСТРАНЕНА, не обойдена.
**8. Онтология банка записана** — `docs/architecture/18-bank-ontology.md`. Форма была строгой и до этого пака (источники → вид → проекции, у каждого источника единственный писатель, вид пересобирается полностью на каждой границе), но не записана нигде, из-за чего девять носителей читались как девять заплаток. Проекция без названного читателя и без якоря свежести — класс дефекта, а не стиль: по нему снесена мёртвая машинная таблица стопа и заведён конверт свежести банк-экспорта.
**9. Заведено строками бэклога:** **221** джойн «предложено × решено × нерешено» живёт только в движке и при разморозке фронта заставит платформу пере-реализовать закон · **222** межкнижный остаток оси арбитра (второй конфиг ТОЙ ЖЕ книги с другим `project_db`) · **223** майнерский хвост за потолком структурно недостижим · **224** банк-экспорт на стопе пуст. (27.08.2026, оркестратор №19) ✅

View file

@ -0,0 +1,69 @@
# 18 — Онтология банка памяти: роли носителей, писатели, свежесть
> **СТАТУС: РАТИФИЦИРОВАНО D39.158 (27.08.2026).** Топикальный вход (D39.126): НЕ источник истины,
> при конфликте побеждает журнал решений. Собрано оркестратором №19 по консилиуму со сторонним
> архитектором при приёмке четырёх паков входной двери шва.
>
> **Зачем страница.** Вокруг одного понятия — «состояние банка этой книги» — живут девять носителей,
> выросших пак за паком. Форма при этом СТРОГАЯ: поток однонаправленный, у каждого источника
> единственный писатель, вид пересобирается полностью на каждой границе прогона. Но эта строгость не
> была записана нигде — каждый файл документировал свою роль, ни одно место не документировало поток.
> Из-за этого приёмка сначала прочитала девять носителей как девять заплаток и едва не заказала
> рефактор ради стройности. Страница дешевле рефактора и снимает причину, а не симптом.
## Три роли, и они не смешиваются
| Роль | Носители | Писатель | Момент фиксации |
|---|---|---|---|
| **ИСТОЧНИКИ** — то, из чего банк собирается | `glossary_seed` · `<book_id>.mined-delta.yaml` · `<book_id>.mined-rejects.yaml` (слово ВЛАДЕЛЬЦА, рядом с `book.yaml`, едут с книгой в бэкапе и экспорте) · `<project_db>.auto-bank.yaml` (слово ДВИЖКА, сидит при базе) · ruby-чтения в хранилище | у каждого РОВНО один; у трёх первых — `tmctl bank-apply` и рука владельца, у авто-банка — прогон | запись под эксклюзивным флоком проекта |
| **ВИД** — банк, каким его видят роли | строки глоссария в хранилище | только `seedGlossary`, и только полным пересбором | каждая граница прогона; один загрузчик, все гарды |
| **ПРОЕКЦИИ** — то, что банк рассказывает наружу | `<project_db>.bank.json` (единственный канал банка наружу) · карта подписи `<project_db>.mined-signature.yaml` · человеческая таблица стопа `.bank-stop.txt` | прогон, на границе | после смены вида |
| **ПАМЯТЬ ФЛАЖКА** — что стоп уже предъявлял | таблица `bank_stop_presented` | стоп | ПОСЛЕ карты, никогда до |
**Поток однонаправленный: источники → вид → проекции.** Отсюда главное свойство, из-за которого
рефактор не нужен: **расхождение источников с видом структурно невозможно дольше одной границы
прогона**, потому что вид не патчится, а пересобирается целиком.
## Почему слово владельца и слово движка не сливаются
Соблазн понятный: одобрения владельца и авто-строки движка — одинаковые по форме строки банка. Но
слитые, они делают неразличимым то, ради чего банк существует: **какие переводы человек действительно
одобрил.** Поэтому источники разнесены и по писателю, и по каталогу — решения владельца едут с книгой,
состояние движка сидит при базе.
## Дисциплина проекции — норма, а не стиль
Три правила, каждое куплено дефектом:
1. **У проекции обязан быть НАЗВАННЫЙ читатель.** Машинная таблица стопа `.bank-stop.json` была
написана для пер-термного экрана подписи; экран упразднён D39.144, читателя не осталось ни в одной
зоне — снесена D39.158. Свип наследия отменённой модели шёл по коду, гейтам и текстам, а её
АРТЕФАКТ пережил его, потому что никто не смотрел на множество публикаций.
2. **У проекции обязан быть якорь свежести ВНУТРИ документа.** Отказ записи банк-экспорта — «громко,
но не фатально» (деньги дороже проекции), и это верно; но «может быть устаревшим» жило только в
ЛОГЕ. Потребитель не мог отличить проекцию этой границы от прошлой. Закрыто конвертом с меткой
границы и идентификатором прогона.
3. **Порядок между носителями — инвариант, а не деталь.** Память флажка пишется ПОСЛЕ карты: падение
между ними даёт лишний доброкачественный стоп, обратный порядок — запомненную поверхность, чьей
карты не существует, то есть молчаливую потерю навсегда. Инвариант, живущий в комментарии, не
держится ничем — держит его пин.
⚠ **Класс дефекта, названный этой страницей: проекция без контракта потребителя и без якоря свежести
в самой себе.** Три известных члена: снесённая таблица стопа · банк-экспорт до конверта · порядок
«карта → память» до пина. Четвёртый живёт строкой бэклога: банк-экспорт на стопе ПУСТ — проекция,
наиболее пустая ровно в тот момент, когда её читает экран подписи.
## Чего эта форма НЕ несёт
Джойн «предложено × решено × нерешено» существует только внутри движка. Читаемый банк несёт итоги без
предложений, карта — предложения без решений. Экран подписи при разморозке фронта заставит платформу
пере-реализовать движковый закон у себя, что запрещено п.6 закона шва. Лечение — публиковать
нерешённость движком, когда экран закажут; сейчас это ноль кода и строка бэклога, а не рефактор под
несуществующий экран.
## Если проектировать с нуля
То же самое, с одним отличием: дельта и список отказов — **один документ с двумя секциями**. Это
правильнее с нуля (одна запись, одна точка фиксации, невозможность указать двумя ключами на один
файл), но не стоит миграции схемы в полёте: снятие объявляемых ключей D39.158 уже закрыло тот дефект,
ради которого слияние в первую очередь понадобилось бы.