Pin the tail-vocabulary gate to itself and close the row: four assertions run on every check, verified by planting three mutations of the gate

This commit is contained in:
heaven 2026-08-27 15:07:41 +03:00
parent 4410b13257
commit 99a6b05480
3 changed files with 32 additions and 1 deletions

View file

@ -15,6 +15,7 @@
> ⚠ **Эррата 27.08-в (D39.158 п.1):** «движок исполняет продуктовую модель сам» сказано без ратифицированной ОГОВОРКИ — правка ОТДЕЛЬНОГО термина через дверь доступна только для mined-термов; правка СИД-терма дверью отклоняется по имени (`internal/membank/decisions.go:359`), потому что это перенос базового снапшота и пере-оплата черновой волны — другое решение (щель ратифицирована, строка бэклога 192). Ещё три места, где модель шире кода, названы строками: окно глав одним решением не правится (named-узость v1) · банк-экспорт на стопе пуст (224) · «полный останов» — это граница ПЕРЕД редакторской волной, черновая довершается (S16). Найдено вычиткой старшего при ревью D39.159.
> ⚠ **Эррата 27.08-г (D39.159 п.8):** отказ от правки `n != shape` СТОИТ, но обоснование было шире истины — «краснит семь ЗАКОННЫХ строк» неверно для двух из них. `PD-99` несла корректно markdown-экранированные черты (виноват был парсер, не строка), а `PD-197` — сырую черту в регексе, которая молча сдвигала ВЕС, потому что он читался с конца, а от конца далеко. Названный там остаточный риск ПОСТРОЕН 27.08 на эмпирике зоны (три молчаливых случая за двое суток): парсер уважает экранирование · вес регистра читается с НАЧАЛА · гейт `tail_vocab` судит словарь хвоста. Проверено подсадкой; числа не сдвинулись. Строка `PD-398` остаётся открытой на отсутствие автоматического пина у самого гейта.
> ⚠ **Эррата 27.08-д (D39.159 п.7) — норма §3 п.8 применена к СОБСТВЕННОМУ бэклогу, три строки переsуждены.** Свип грепом по путям лендинга `d1eb8a9` нашёл, что лекарство трёх строк уже в дереве. **212 ЗАКРЫТА и снята с таблицы:** голый `yaml.Unmarshal` заменён строгим `seed.DecodeFile` (`internal/membank/memseed.go:51`, код называет строку по номеру), пин двойной — `internal/seed/decode_test.go:16` и `internal/membank/seedlint_test.go:39`. **218 ЗАКРЫТА и снята:** три тест-хелпера снесены, `miner_parity_test.go:35` говорит «the old $HOME/books address is dead». **199 СУЖЕНА:** движковая половина цепи доставки правок банка ПОСТРОЕНА, открыт только платформенный конец (пункт 2в очереди) — прежняя формулировка «канал НЕ построен» отправляла бы следующий пак строить построенное. Бэклог 177 → 175. ⚠ Норма окупилась на своём авторе в тот же день, что и на чужом.
> ⚠ **Эррата 27.08-е (D39.159 п.8, финал): `PD-398` ЗАКРЫТА — у построенного гейта появился пин.** `selftest_tail_vocab()` гоняется на каждом `--check`, четыре утверждения, проверен ПОСАДКОЙ трёх мутаций самого гейта (все три пойманы, базовая линия молчит). ⚠ Первая редакция пина молчала на одной из трёх: утверждение про вес проверяло `cells()`, а мутация меняет то, чем пользуется `register()`. Пин, проверенный одним прогоном вместо посадки, — ровно тот класс, который эта строка описывает; поймано только потому, что посадку сделал. Регистр 96 → 95 открытых.
> ⚠ **Навигация (актуализация 07.08, эра D39.1xx):** append-only-дисциплина (D23.3) означает, что
> НЕВЕРНЫЙ ФАКТ внутри старой ноты не переписывается, а получает эрратау — и тогда он опасен ровно

View file

@ -208,6 +208,35 @@ def tail_vocab(rows: list, what: str) -> list:
return bad
def selftest_tail_vocab() -> list:
"""Пин гейта хвостового словаря (PD-398). Гоняется на КАЖДОМ --check: гейт, проверенный один раз
руками, это не пин, а замер, и он тихо умирает от первой же правки парсера.
Четыре утверждения, каждое куплено настоящим случаем 2527.08:
1. чистая строка молчит;
2. сырая «|» в СТАТУСНОЙ ячейке краснит три случая за двое суток проходили молча;
3. markdown-экранирование «\|» законно и НЕ считается лишней ячейкой (PD-99 была невиновна);
4. сырая «|» в СЕРЕДИНЕ не сдвигает ВЕС он читается с начала (на PD-197 сдвигала).
"""
ok = "| PD-999 | bug | major | `a.go:1` | суть | open | источник |"
bad_tail = "| PD-999 | bug | major | `a.go:1` | суть | open | сломано | источник |"
escaped = "| PD-999 | bug | major | `a.go:1` | код `x\\|y` | open | источник |"
mid_pipe = "| PD-999 | bug | major | `a.go:1` | регекс `(a|b)` | open | источник |"
fail = []
if tail_vocab([ok], "пин"):
fail.append("пин: чистая строка не должна краснить")
if not tail_vocab([bad_tail], "пин"):
fail.append("ПИН УПАЛ: «|» в статусной ячейке НЕ поймана — вернулась молчаливая потеря PD-398")
if len(cells(escaped)) != len(cells(ok)):
fail.append("ПИН УПАЛ: экранированная «\\|» посчитана лишней ячейкой — PD-99 снова «сломана»")
# ⚠ Утверждение 4 судит НАСТОЯЩИЙ путь — счётчик register(), а не cells(): первая редакция пина
# проверяла cells()[3] и МОЛЧАЛА на возврате веса к чтению с конца (поймано посадкой 27.08).
counted = register(mid_pipe)["вес открытых"]
if counted.get("major") != 1:
fail.append(f"ПИН УПАЛ: «|» в середине сдвинула ВЕС — вернулся механизм PD-197 (счёт: {counted})")
return fail
def register(text: str) -> dict:
rows = [l for l in text.splitlines() if REGISTER_ROW.match(l)]
weight, status, open_ids = Counter(), Counter(), []
@ -606,6 +635,7 @@ def main() -> int:
bad.extend(b["битая форма"])
bad.extend(r["битая форма"])
bad.extend(r["хвост вне словаря"])
bad.extend(selftest_tail_vocab())
if not h["порядок = номер"]:
bad.append(
f"внеочередной аппенд в D-логе: последняя по порядку {h['последняя по порядку файла']}, "

File diff suppressed because one or more lines are too long