From e9479593b5994b7df5d90a53d241a669c8575c2b Mon Sep 17 00:00:00 2001 From: heaven Date: Wed, 2 Sep 2026 18:42:17 +0300 Subject: [PATCH] Anchor the token-minimum exemptions to the anchor itself: keying them by line number broke the same day an errata shifted the file --- docs/scripts/counts.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/scripts/counts.py b/docs/scripts/counts.py index 2d819ed9..283af9df 100644 --- a/docs/scripts/counts.py +++ b/docs/scripts/counts.py @@ -420,9 +420,11 @@ TOKEN_MIN = 12 # Два якоря короче минимума ТРОГАТЬ НЕЛЬЗЯ, и это не долг, а норма: один лежит в ТЕЛЕ ноты D39.176 # (append-only, D23.3), второй — в теле эксперимента (улика, D23.3). Гейт обязан молчать на них, # иначе он вечно красный на местах, которые сам же запрещает править. +# ⚠ Привязка по ЯКОРЮ, а не по номеру строки: первая редакция ссылалась на номера и сломалась в тот +# же день от вставки эрраты выше по файлу. Гейт, который сам гниёт от правки соседней строки, — не гейт. TOKEN_MIN_EXEMPT = { - ("docs/architecture/05-decisions-log.md", 1617), - ("docs/experiments/23-editor-tier.md", 2244), + ("docs/architecture/05-decisions-log.md", "backend/cmd/tmctl/invocation.go:145"), + ("docs/experiments/23-editor-tier.md", "docs/archive/PROGRESS-2026-08-10-15.md:23"), } LINT_SKIP_DOCS = { @@ -592,7 +594,7 @@ def lint_anchors() -> tuple[list[tuple[int, str]], dict[str, int]]: f"D{'/D'.join(sorted(named))} — адресуй ноту НОМЕРОМ, строка D-лога не переживает подрезку")) continue if (token is not None and len(token.strip()) < TOKEN_MIN - and (doc_rel, n) not in TOKEN_MIN_EXEMPT): + and (doc_rel, rel + ":" + str(lineno)) not in TOKEN_MIN_EXEMPT): # ⚠ Токен короче TOKEN_MIN не доказывает НИЧЕГО: «`x`» найдётся в любой строке, # и якорь считался бы «сверенным по содержимому», не будучи им. Дыра найдена # при заведении храповика 02.09: доля сверяемых накручивается пустышкой.