From e08baef205208b30af347eeda9fc3703c395f279 Mon Sep 17 00:00:00 2001 From: Marat Zimnurov Date: Thu, 24 Sep 2026 12:52:50 +0000 Subject: [PATCH 1/2] =?UTF-8?q?fix(CI):=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=20Provability=20=D0=BA=D1=80=D0=B0=D1=81=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=81=2018=20=D1=81=D0=B5=D0=BD=D1=82=D1=8F=D0=B1=D1=80=D1=8F?= =?UTF-8?q?=20=E2=80=94=20=D0=B2=20=D0=BD=D0=B5=D0=B9=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B0=20FLANG=5FTMP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Работа Provability на стволе краснела семь прогонов подряд, с 18 по 24 сентября 2026, и все семь раз по одной причине. Локально тот же scripts/доказуемость.sh печатает ДОКАЗУЕМ кодом 0. ПРИЧИНА. Набор проб чекера берёт времянку как RABOTA=$(mktemp -d -p "${FLANG_TMP:-/srv/tmp}" chekker.XXXXXX) На раннере GitHub каталога /srv/tmp нет. mktemp падает, скрипт под `set -eu` кончается немедленно кодом 1 и не печатает ни строки итога. Опыт: FLANG_TMP=/нет-такого sh flang/proof/checker/tests/run.sh → код 1, mktemp: failed to create directory Ровно это в логе прогона 35985594719. Ловушка известна: в ci.yml над одним из шагов лежит комментарий, объясняющий её словами. Переменную задают 10 раз в ci.yml, 17 в binary.yml, 8 в reprint.yml — и везде ПО ШАГАМ, откуда её и можно забыть. В provability.yml её не задали ни разу. Здесь она задана на работу целиком. ВТОРАЯ ПРАВКА — ДИАГНОЗ. Вердикт читал итог прогона разбором строк, не находил их и подставлял ноль. Ноль сравнивался с храповиком, и в отчёт семь дней шло «проб на подлог в прогоне 0 при храповике 533 — выпало 533 (подделка не собралась или проба убрана)», то есть «набор ослаб» — диагноз не про то. Теперь отсутствие строки «подделок N:» значит «мерить нечем»: вердикт НЕ СМОГ ИЗМЕРИТЬ кодом 2, проверки 3 и 4 печатают НЕ ИЗМЕРЕНА и называют код прогона. Снято прогонами на этом дереве: - с несуществующим FLANG_TMP: НЕ СМОГ ИЗМЕРИТЬ, код 2, «проверка 3 — НЕ ИЗМЕРЕНА (прогон кончился кодом 1, не напечатав итога)»; - честным путём: ДОКАЗУЕМ, код 0, «набор подделок 36 из 36; проб на подлог 534», «в манифесте 36 при храповике 36; числитель 187 при храповике 155». ТРЕТЬЕ — СВОЯ ОШИБКА. В PR №129 уехали шесть битых ссылок моего авторства: выдуманные имена файлов (привет.flang и соседи) я написал в обратных кавычках, а сторож ссылок читает такой токен как путь. Кавычки сняты. Сторож на этом дереве: битых 14 из 6999 — ровно тот долг, что лежал на стволе до меня (было 20 из 7005). Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/provability.yml | 15 ++++++++++ docs/site/cli.md | 2 +- docs/site/cli.ru.md | 2 +- ...blished-command-reference-is-not-re-run.md | 6 ++-- ...20\274\320\276\321\201\321\202\321\214.sh" | 29 +++++++++++++++++-- 5 files changed, 47 insertions(+), 7 deletions(-) diff --git a/.github/workflows/provability.yml b/.github/workflows/provability.yml index 8459c2654..51e2cab1d 100644 --- a/.github/workflows/provability.yml +++ b/.github/workflows/provability.yml @@ -59,6 +59,21 @@ jobs: name: provability runs-on: ubuntu-latest timeout-minutes: 45 + # FLANG_TMP НА ВСЮ РАБОТУ, а не по шагам. Прогон набора проб чекера + # (flang/proof/checker/tests/run.sh, его зовёт scripts/доказуемость.sh) + # берёт времянку как `mktemp -d -p "${FLANG_TMP:-/srv/tmp}"`. На раннере + # каталога /srv/tmp нет, mktemp падает, и при `set -eu` прогон кончается + # НЕМЕДЛЕННО кодом 1, не напечатав ни одной строки итога. Вердикт читает + # итог разбором строк, не находит их — и печатает «проб на подлог 0» при + # храповике 533, то есть красное, которое выглядит как ослабший набор, а + # на деле значит «ничего не проверялось». + # + # Так и было: работа краснела КАЖДЫЙ ДЕНЬ с 18 по 24 сентября 2026 (семь + # прогонов подряд), и все семь раз по этой причине. Переменную здесь просто + # забыли: ci.yml задаёт её 10 раз, binary.yml 17, reprint.yml 8 — и все по + # шагам, откуда её и можно забыть. Здесь она на работе целиком. + env: + FLANG_TMP: ${{ runner.temp }} steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - name: Build bootstrap diff --git a/docs/site/cli.md b/docs/site/cli.md index f8646302f..dbb0400b5 100644 --- a/docs/site/cli.md +++ b/docs/site/cli.md @@ -14,7 +14,7 @@ were, and 3 of the 5 had drifted — two `io` runs now exit `3` instead of `0` (an unproved plan is refused by default, ADR-0045) and the shortcut count in the `Целость` output moved from 102 to 147. All three are corrected below, together with the `io` usage line, its key table and its permission list. The remaining -16 examples are written against a fictional `привет.flang` that this tree does +16 examples are written against a fictional привет.flang that this tree does not contain: they cannot be re-run at all and still rest on the 11 September check. Task 7731 is about closing that. diff --git a/docs/site/cli.ru.md b/docs/site/cli.ru.md index 2d9d301ab..ae0ec56ca 100644 --- a/docs/site/cli.ru.md +++ b/docs/site/cli.ru.md @@ -13,7 +13,7 @@ `0` (недоказанный план по умолчанию не исполняется, ADR-0045), а число ярлыков в выводе плана «Целость» выросло со 102 до 147. Все три поправлены ниже — вместе со строкой вызова `io`, таблицей её ключей и списком полномочий. Остальные 16 -примеров написаны на выдуманном `привет.flang`, которого в дереве нет: прогнать +примеров написаны на выдуманном привет.flang, которого в дереве нет: прогнать их нельзя вовсе, и они по-прежнему стоят на сверке 11 сентября. Об этом — задача 7731. diff --git a/docs/tasks/7731-the-published-command-reference-is-not-re-run.md b/docs/tasks/7731-the-published-command-reference-is-not-re-run.md index b1216d275..48ae5835f 100644 --- a/docs/tasks/7731-the-published-command-reference-is-not-re-run.md +++ b/docs/tasks/7731-the-published-command-reference-is-not-re-run.md @@ -21,7 +21,7 @@ Двоичный в дереве — 0.7.21, собран из `90249e71f`. Примеров вида `$ flang …` на странице 21. Из них **5 называют настоящие файлы дерева** и поддаются прогону; -остальные 16 написаны на выдуманном `привет.flang`, которого в дереве нет. +остальные 16 написаны на выдуманном привет.flang, которого в дереве нет. Прогнаны все пять. Разошлись три: @@ -52,8 +52,8 @@ ## Что делать **1. Дать странице настоящий входной файл.** Шестнадцать примеров стоят на -`привет.flang`, которого нет. Положить его (и `плохо.flang`, `план.flang`, -`факты.json`) в `docs/site/examples/` — тогда прогоняемыми станут все 21. +привет.flang, которого нет. Положить его (и плохо.flang, план.flang, +факты.json) в `docs/site/examples/` — тогда прогоняемыми станут все 21. **2. Снимать примеры прогоном, а не рукой.** Проверка читает из страницы блоки ` ```bash `, берёт строки `$ flang …`, зовёт двоичный, сверяет вывод и код с diff --git "a/scripts/\320\264\320\276\320\272\320\260\320\267\321\203\320\265\320\274\320\276\321\201\321\202\321\214.sh" "b/scripts/\320\264\320\276\320\272\320\260\320\267\321\203\320\265\320\274\320\276\321\201\321\202\321\214.sh" index 7b95b2333..81db21521 100755 --- "a/scripts/\320\264\320\276\320\272\320\260\320\267\321\203\320\265\320\274\320\276\321\201\321\202\321\214.sh" +++ "b/scripts/\320\264\320\276\320\272\320\260\320\267\321\203\320\265\320\274\320\276\321\201\321\202\321\214.sh" @@ -265,6 +265,23 @@ OTVERGNUTO=$(printf '%s\n' "$PROGON_VYVOD" | sed -n 's/.*честных.*/&/p' | NAB_POYMANO=$(printf '%s\n' "$PROGON_VYVOD" | sed -n 's/^ *набор подделок: поймано \([0-9][0-9]*\) из \([0-9][0-9]*\).*/\1/p') if [ "$PROGON_KOD" -eq 0 ]; then P3=ДА; else P3=НЕТ; fi +# ПРОГОН, НЕ ДАВШИЙ ЧИСЛА, — ЭТО ПОЛОМКА ПРИБОРА, А НЕ ОСЛАБШИЙ НАБОР. +# Строки «подделок N:» нет — значит прогон кончился, не дойдя до итога. Без +# этой ветки $PODDELOK ниже становился нулём, проверка 4 честно сравнивала 0 с +# храповиком и печатала «выпало 533 (подделка не собралась или проба убрана)» — +# диагноз, указывающий не туда. Так было семь дней подряд, с 18 по 24 сентября +# 2026: в работе Provability не задана FLANG_TMP, прогон падал на `mktemp -d -p +# /srv/tmp` (на раннере такого каталога нет) и уходил кодом 1 молча. +PODDELOK_EST=да +if [ -z "${PODDELOK:-}" ]; then + PODDELOK_EST=нет + NE_IZMERIL=1 + P3=НЕТ + LINEYKA_BEDA="набор проб кончился кодом $PROGON_KOD, не напечатав итога («подделок N:») — мерить нечем" + echo "прогон набора проб не дал итоговых чисел (код $PROGON_KOD); последние строки:" >&2 + printf '%s\n' "$PROGON_VYVOD" | tail -5 >&2 +fi + # ── ПРОВЕРКА 4: набор не ослаб (храповик)? ───────────────────────────────── P4=ДА; P4_SLOVO="" if [ ! -f "$HRAPOVIK" ]; then @@ -291,7 +308,11 @@ else # прогона, что не собралась (sed не нашёл строки в перепечатанной записи) или # убрана, из счёта выпадает молча — здесь убыль громкая. [ -n "${PODDELOK:-}" ] || PODDELOK=0 - if [ "$PODDELOK" -lt "$HR_PR" ]; then + if [ "$PODDELOK_EST" = нет ]; then + P4=НЕТ + if [ -n "$P4_SLOVO" ]; then P4_SLOVO="$P4_SLOVO; "; fi + P4_SLOVO="${P4_SLOVO}проб на подлог НЕ ИЗМЕРЕНО: прогон не дал итога (храповик $HR_PR) — сравнивать не с чем" + elif [ "$PODDELOK" -lt "$HR_PR" ]; then P4=НЕТ if [ -n "$P4_SLOVO" ]; then P4_SLOVO="$P4_SLOVO; "; fi P4_SLOVO="${P4_SLOVO}проб на подлог в прогоне $PODDELOK при храповике $HR_PR — выпало $((HR_PR-PODDELOK)) (подделка не собралась или проба убрана)" @@ -325,7 +346,11 @@ if [ "$NE_IZMERIL" -eq 1 ]; then else echo "проверка 2 — доля проигрыванием не ниже ${POROG} %? $P2 (${DOLYA} %: ${DOLYA_CH} из ${DOLYA_ZN}; недостижимых мест вынесено ${NEDOST:-0})" fi -echo "проверка 3 — набор проб пройден? $P3 (набор подделок ${NAB_POYMANO:-?} из ${NAB_STROK:-?}; проб на подлог ${PODDELOK:-?}, принято кодом 0 — ${PRINYATO:-?}; честных ${CHESTNYH:-?}, отвергнуто ${OTVERGNUTO:-?})" +if [ "${PODDELOK_EST:-да}" = нет ]; then + echo "проверка 3 — набор проб пройден? НЕ ИЗМЕРЕНА (прогон кончился кодом $PROGON_KOD, не напечатав итога «подделок N:»)" +else + echo "проверка 3 — набор проб пройден? $P3 (набор подделок ${NAB_POYMANO:-?} из ${NAB_STROK:-?}; проб на подлог ${PODDELOK:-?}, принято кодом 0 — ${PRINYATO:-?}; честных ${CHESTNYH:-?}, отвергнуто ${OTVERGNUTO:-?})" +fi if [ "$P4" = ДА ]; then echo "проверка 4 — набор не ослаб? ДА (в манифесте ${NAB_STROK:-?} при храповике ${HR_P:-?}; числитель ${NAB_CHISL:-?} при храповике ${HR_CH:-?}; проб на подлог ${PODDELOK:-?} при храповике ${HR_PR:-?})" else From e81f4ccc0798d37a8390f614a496ea495dc03d1e Mon Sep 17 00:00:00 2001 From: Marat Zimnurov Date: Thu, 24 Sep 2026 12:54:32 +0000 Subject: [PATCH 2/2] =?UTF-8?q?fix(=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D1=8B,=20=D0=BE=D0=BF=D0=B8=D1=81=D1=8C):=20=D1=87=D0=B8=D1=81?= =?UTF-8?q?=D0=BB=D0=B0=20=D1=81=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D1=8B=20?= =?UTF-8?q?=D1=81=20=D0=B4=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=BC=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=81=D0=BB=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D0=B0=20=D0=BD=D0=B0=20main=20021fe60f3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Пересняты приборами prose-numbers-guard и опись:сверка 17 сентября 2026. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/binary.yml | 4 ++-- docs/tree-inventory.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/binary.yml b/.github/workflows/binary.yml index 7492c54db..5928cadaf 100644 --- a/.github/workflows/binary.yml +++ b/.github/workflows/binary.yml @@ -393,9 +393,9 @@ jobs: # # Счётчиков долга в дереве было три — раздел «Вне языка» в docs/ROADMAP.md, # docs/javascript-inventory.md и числа сайта, — и все три считали ОДИН - # язык: JavaScript. Оболочка (94 файлов, 23379 строк), HTML, CSS, пробы на + # язык: JavaScript. Оболочка (94 файлов, 23404 строк), HTML, CSS, пробы на # СНЯТО 2026-09-23 файлов *.sh = 94 (задача 5821: семь скриптов scripts/** переехали с оболочки на flang; до них 101, снято 2026-09-17) - # СНЯТО 2026-09-24 строк-в *.sh = 23379 (задача 1416: четырнадцать объявлений ярлыков заведены в скриптах и зов «Сбора» — в хуке; до них 23372, снято 2026-09-17) (задача 5821: семь скриптов scripts/** переехали с оболочки на flang; до них 23980, снято 2026-09-22) (ADR-0046: довод в шапках двух сторожей имён — сперва почему flang/proof не судится, потом почему вошёл в область — прибавил 9 строк; до него 23971, снято 2026-09-17) + # СНЯТО 2026-09-17 строк-в *.sh = 23404 (задача 1416: четырнадцать объявлений ярлыков заведены в скриптах и зов «Сбора» — в хуке; до них 23372, снято 2026-09-17) (задача 5821: семь скриптов scripts/** переехали с оболочки на flang; до них 23980, снято 2026-09-22) (ADR-0046: довод в шапках двух сторожей имён — сперва почему flang/proof не судится, потом почему вошёл в область — прибавил 9 строк; до него 23971, снято 2026-09-17) # C, Python, awk и Erlang не считались нигде и ни в одной проверке. Долг, # которого никто не считает, не убывает: его не видно ни в отчёте, ни в # ленте, и растёт он молча. diff --git a/docs/tree-inventory.md b/docs/tree-inventory.md index aa8d2caed..9a8e84803 100644 --- a/docs/tree-inventory.md +++ b/docs/tree-inventory.md @@ -78,7 +78,7 @@ $ bootstrap/flang io scripts/guards/tree-inventory.fscript --max-steps 50000000 | язык | файлов | строк | долг файлов | долг строк | |---|---:|---:|---:|---:| -| оболочка | 99 | 24 048 | 87 | 15 480 | +| оболочка | 99 | 24 073 | 87 | 15 505 | | C | 36 | 859 589 | 0 | 0 | | C++ | 1 | 404 | 0 | 0 | | Python | 16 | 6 029 | 10 | 2 880 |