diff --git a/.ai/AGENTS.md b/.ai/AGENTS.md index 32fea10ba..6cc868084 100644 --- a/.ai/AGENTS.md +++ b/.ai/AGENTS.md @@ -286,7 +286,7 @@ git fetch /srv/flang-priyom.git main && git checkout -B main FETCH_HEAD копии, где сошлись ДВЕ невлитые ветки: ключ `--предел-шагов` (`dd5fe0fd`) и быстрое сравнение имён `fl_name_same` (`b7f3bd5e`). Сплошной перебор 5418 коммитов такого дерева не нашёл; ловит это теперь - `sh scripts/seed/binary-origin.sh` — по именам функций в двоичном, а не по размеру. + `bootstrap/flang io scripts/seed/binary-origin.fscript --plan Check --timeout 300000` — по именам функций в двоичном, а не по размеру. Ближайший коммит с тем же семенем, `58596087`, даёт 14 068 168 байт (`090ef472`) — на 80 байт меньше: `.rodata` совпадает байт в байт, расходятся `.text` (384) и `.eh_frame` (2880). Значит не воспроизводится ДЕРЕВО, а не @@ -437,7 +437,7 @@ flang check <файл> --proof ведомость: чем несётся ка | стек | пишет | НЕ пишет | |---|---|---| -| **А — печать и семя** | `scripts/bootstrap-reprint.sh`, `scripts/seed/print-progress.fscript`, `scripts/seed/two-prints-identical.sh`, `bootstrap/**`, `.github/workflows/reprint.yml`, `docs/reprint-*.md` | всё `flang/**` | +| **А — печать и семя** | `scripts/bootstrap-reprint.sh`, `scripts/seed/print-progress.fscript`, `scripts/seed/two-prints-identical.fscript`, `bootstrap/**`, `.github/workflows/reprint.yml`, `docs/reprint-*.md` | всё `flang/**` | | **Б — язык и доказательства** | `flang/**`, `.claude/skills/**`, `docs/zettel/**` | всё, что в стеке А | **Спорные файлы — у каждого ОДИН хозяин, записано здесь:** diff --git a/.githooks/pre-push.fscript b/.githooks/pre-push.fscript index a43c8dd5b..190dd231e 100644 --- a/.githooks/pre-push.fscript +++ b/.githooks/pre-push.fscript @@ -18,7 +18,7 @@ возвращает список «Check» обеспечивает «there are exactly eighteen checks» (длина результат) равен 18 [запись «Check» с «name» равным "prose-numbers-guard" и «command» равным "sh scripts/guards/prose-numbers-guard.sh", - запись «Check» с «name» равным "seed-runtime-is-source" и «command» равным "sh scripts/seed/seed-runtime-is-source.sh", + запись «Check» с «name» равным "seed-runtime-is-source" и «command» равным "bootstrap/flang io scripts/seed/seed-runtime-is-source.fscript --plan Check", запись «Check» с «name» равным "seed-refresh" и «command» равным "sh scripts/seed/seed-refresh.sh --check", запись «Check» с «name» равным "version-derivations-guard" и «command» равным "sh scripts/guards/version-derivations-guard.sh", запись «Check» с «name» равным "who-calls-the-guards" и «command» равным "sh scripts/guards/who-calls-the-guards.sh --check", diff --git a/.github/workflows/binary.yml b/.github/workflows/binary.yml index 37f4da885..e2dff687c 100644 --- a/.github/workflows/binary.yml +++ b/.github/workflows/binary.yml @@ -280,10 +280,10 @@ jobs: # зеленеет. Второй шаг подкладывает ему программу с заведомо чужим именем # и требует отказа; без него первый шаг ничего не доказывает. - name: Check binary origin - run: sh scripts/seed/binary-origin.sh --чем "работа «Binary»" + run: bootstrap/flang io scripts/seed/binary-origin.fscript --plan Check --timeout 300000 -- --what "работа «Binary»" - name: Probe binary origin - run: sh scripts/seed/binary-origin.sh --подлог + run: bootstrap/flang io scripts/seed/binary-origin.fscript --plan Forgery --timeout 300000 # Собралось — ещё не значит работает. Проверяется то, что человек наберёт # первым, и настоящий файл дерева, а не выдуманный. @@ -393,9 +393,9 @@ jobs: # # Счётчиков долга в дереве было три — раздел «Вне языка» в docs/ROADMAP.md, # docs/javascript-inventory.md и числа сайта, — и все три считали ОДИН - # язык: JavaScript. Оболочка (89 файлов, 22907 строк), HTML, CSS, пробы на - # СНЯТО 2026-09-17 файлов *.sh = 89 (задача 5821: семь скриптов scripts/** переехали с оболочки на flang; до них 101, снято 2026-09-17) - # СНЯТО 2026-09-17 строк-в *.sh = 22907 (задача 1400: девять проб на подлог и две честные под правила Н6 и О9 прибавили 42 строки в flang/proof/checker/tests/run.sh) (задача 1416: четырнадцать объявлений ярлыков заведены в скриптах и зов «Сбора» — в хуке; до них 23372, снято 2026-09-17) (задача 5821: семь скриптов scripts/** переехали с оболочки на flang; до них 23980, снято 2026-09-22) (ADR-0046: довод в шапках двух сторожей имён — сперва почему flang/proof не судится, потом почему вошёл в область — прибавил 9 строк; до него 23971, снято 2026-09-17) + # язык: JavaScript. Оболочка (79 файлов, 21020 строк), HTML, CSS, пробы на + # СНЯТО 2026-09-17 файлов *.sh = 79 (задача 5821: семь скриптов scripts/** переехали с оболочки на flang; до них 101, снято 2026-09-17) + # СНЯТО 2026-09-17 строк-в *.sh = 21020 (задача 1400: девять проб на подлог и две честные под правила Н6 и О9 прибавили 42 строки в flang/proof/checker/tests/run.sh) (задача 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 не считались нигде и ни в одной проверке. Долг, # которого никто не считает, не убывает: его не видно ни в отчёте, ни в # ленте, и растёт он молча. @@ -940,7 +940,7 @@ jobs: # # ПЕРВАЯ ПОЛОВИНА ДОКАЗАНА 6 сентября 2026: пара печатей с дерева `d3b121b5` # (клоны одного коммита), 16 404 с и 16 929 с, обе кодом 0; - # `scripts/seed/two-prints-identical.sh` — код 0, «печати совпали побайтово: + # `scripts/seed/two-prints-identical.fscript` — код 0, «печати совпали побайтово: # файлов 4, байт 1 229 825». ВТОРАЯ осталась открытой: сверку позвала рука. # # ТОЙ ЖЕ ПАРОЙ ВТОРУЮ ПОЛОВИНУ НЕ ЗАКРЫТЬ. 2 x 4,6 ч машины на пуш не ставят. @@ -955,8 +955,8 @@ jobs: # процессов), и сверка байт в байт. # # ЦЕНА, ЗАМЕР 6 сентября 2026 на машине отряда, `bootstrap/flang` 0.7.11: - # sh scripts/seed/print-is-repeatable.sh 24,4 с (две печати по 12,2 с) - # sh scripts/seed/print-is-repeatable.sh --подлог 12,3 с (одна печать) + # bootstrap/flang io scripts/seed/print-is-repeatable.fscript --plan Check --timeout 600000 24,4 с (две печати по 12,2 с) + # bootstrap/flang io scripts/seed/print-is-repeatable.fscript --plan Forgery --timeout 600000 12,3 с (одна печать) # Для сравнения, тем же прогоном и тем же двоичным: # sh scripts/bootstrap-reprint.sh --telo 0,15 с # sh scripts/bootstrap-reprint.sh --bystro 1,50 с @@ -1026,11 +1026,11 @@ jobs: # прибором). Проба подкладывает сверщику изменённый байт и пропавший # файл и требует красноты, а от дословной копии — молчания. - name: Probe print determinism - run: sh scripts/seed/print-is-repeatable.sh --подлог + run: bootstrap/flang io scripts/seed/print-is-repeatable.fscript --plan Forgery --timeout 600000 env: FLANG_TMP: ${{ runner.temp }} - name: Check print determinism - run: sh scripts/seed/print-is-repeatable.sh + run: bootstrap/flang io scripts/seed/print-is-repeatable.fscript --plan Check --timeout 600000 env: FLANG_TMP: ${{ runner.temp }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index acdf211c8..71cd11983 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -206,8 +206,8 @@ jobs: # 31 августа 2026 в дереве нашлось 31 место в 14 файлах, где записанное рукой # число разошлось с тем, что лежит рядом: `docs/tree-inventory.md` считала # `seed-parses-sources-guard.sh` в 83 строки при 195, оболочку — в 66 файлов - # при 71 тогдашних — сегодня их 89; - # СНЯТО 2026-09-17 файлов *.sh = 89 (задача 5821: семь скриптов scripts/** переехали с оболочки на flang; до них 101, снято 2026-09-21) `flang/cat/SPEC.md` обещала восемнадцать поручений при 22; + # при 71 тогдашних — сегодня их 79; + # СНЯТО 2026-09-17 файлов *.sh = 79 (задача 5821: семь скриптов scripts/** переехали с оболочки на flang; до них 101, снято 2026-09-21) `flang/cat/SPEC.md` обещала восемнадцать поручений при 22; # `flang/PLAN.md` — пять вариантов «Поручение» при 22. Каждое из этих чисел # было ВЕРНО В ДЕНЬ ЗАПИСИ и солгало назавтра, и сторожа не было ни на одном. # @@ -1684,7 +1684,7 @@ jobs: # отпечаток семени снят с чистого дерева. На стволе 15 сентября 2026 он снят # с правленого («ОТПЕЧАТОК СНЯТ С ПРАВЛЕНОГО ДЕРЕВА»): оба отвечают кодом 3, # «судить нельзя», и пробы при них честно красны — отказ судить не краснота - # сторожа. Сверх того `доказанное` при `SEMYA_OTSTALO_ZNAYU=1` на том же + # сторожа. Сверх того `доказанное` при `FLANG_SEED_LAG_KNOWN=1` на том же # стволе говорит «numbers.flang — было доказано 5, стало 0»: это суд старым # семенем, и перемерять его до перепечатки нечем. # diff --git a/.github/workflows/provability.yml b/.github/workflows/provability.yml index 84dea0f43..032f07ac5 100644 --- a/.github/workflows/provability.yml +++ b/.github/workflows/provability.yml @@ -3,9 +3,9 @@ name: Provability # ВЕРДИКТ «ДОКАЗУЕМ / НЕ ДОКАЗУЕМ» СНИМАЕТСЯ ПРИБОРОМ ПО РАСПИСАНИЮ, А НЕ # ВПИСЫВАЕТСЯ РУКОЙ. # -# Работа зовёт `sh scripts/доказуемость.sh`: четыре проверки, у каждой число, +# Работа зовёт `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000`: четыре проверки, у каждой число, # слово выводится из чисел (шапка скрипта). Код возврата несёт вердикт: -# 0 — ДОКАЗУЕМ, 1 — НЕ ДОКАЗУЕМ, 2 — не смог измерить. Работа отвечает тем же +# 0 — ДОКАЗУЕМ, 1 — НЕ ДОКАЗУЕМ, 3 — не смог измерить. Работа отвечает тем же # кодом, поэтому её цвет — это вердикт, а не «прошла ли сборка». # # ── Когда работа красна, и почему это законно ─────────────────────────────── @@ -18,7 +18,7 @@ name: Provability # рукой или опустить порог, чтобы работа позеленела, — подлог. # # ── ЧТО ЭТА РАБОТА МЕРИТ, А ЧЕГО НЕ МЕРИТ (пункт 11 внешнего аудита) ──────── -# Замер 19 сентября 2026 на дереве 404c4ec0a: `sh scripts/доказуемость.sh` +# Замер 19 сентября 2026 на дереве 404c4ec0a: `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` # печатает ДОКАЗУЕМ и отвечает кодом 0 ДАЖЕ ТОГДА, когда `bootstrap/flang` из # дерева убран. Все четыре его проверки читают записи корпуса, манифест # подделок и сверщика — и ни одна не зовёт собранный двоичный. Шаг @@ -40,7 +40,7 @@ name: Provability # расписаний: reprint.yml — воскресенье 02:00 UTC, target-twins.yml — понедельник # 04:00 UTC, install-path.yml — ежедневно 04:17 UTC. # -# ── Что нужно прибору (шапка scripts/доказуемость.sh) ─────────────────────── +# ── Что нужно прибору (шапка scripts/provability.fscript) ─────────────────────── # Дерево под учётом git (линейка берёт ведомость из `git archive HEAD`, глубины # 1 довольно); исходник сверщика flang/proof/checker/checker.c — скрипт соберёт # его сам, если двоичного нет, но здесь он собирается заранее тем же Makefile, @@ -60,7 +60,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 45 # FLANG_TMP НА ВСЮ РАБОТУ, а не по шагам. Прогон набора проб чекера - # (flang/proof/checker/tests/run.sh, его зовёт scripts/доказуемость.sh) + # (flang/proof/checker/tests/run.sh, его зовёт scripts/provability.fscript) # берёт времянку как `mktemp -d -p "${FLANG_TMP:-/srv/tmp}"`. На раннере # каталога /srv/tmp нет, mktemp падает, и при `set -eu` прогон кончается # НЕМЕДЛЕННО кодом 1, не напечатав ни одной строки итога. Вердикт читает @@ -123,16 +123,19 @@ jobs: echo "проба сошлась: без двоичного шаг отвечает кодом $kod" # Четыре покрытия публикуются ПОРОЗНЬ — доля корпуса, формализация, - # известные нарушения состоятельности, трансляция. Код 2 значит «Lean на + # известные нарушения состоятельности, трансляция. Код 3 значит «Lean на # раннере нет, блоки вне приёмки здесь не сняты» и работу не роняет: # прибор МЕРИТ, а не судит. - name: Measure four coverages run: | set +e export LC_ALL=C.UTF-8 - log="$RUNNER_TEMP/покрытия.log" - sh scripts/four-coverages.sh > "$log" 2>&1 + raw="$RUNNER_TEMP/coverages.raw" + log="$RUNNER_TEMP/coverages.log" + bootstrap/flang io scripts/four-coverages.fscript --plan Measure --timeout 900000 > "$raw" 2>&1 kod=$? + grep '^{' "$raw" | jq -r '.result // .error' > "$log" + [ -s "$log" ] || cp "$raw" "$log" cat "$log" { echo "## Четыре покрытия — порознь (код $kod)" @@ -141,15 +144,18 @@ jobs: cat "$log" echo '```' } >> "$GITHUB_STEP_SUMMARY" - [ "$kod" -le 2 ] || exit 1 + [ "$kod" -eq 0 ] || [ "$kod" -eq 3 ] || exit 1 - name: Report verdict run: | set +e export LC_ALL=C.UTF-8 - log="$RUNNER_TEMP/доказуемость.log" - sh scripts/доказуемость.sh > "$log" 2>&1 + raw="$RUNNER_TEMP/provability.raw" + log="$RUNNER_TEMP/provability.log" + bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 > "$raw" 2>&1 kod=$? + grep '^{' "$raw" | jq -r '.result // .error' > "$log" + [ -s "$log" ] || cp "$raw" "$log" cat "$log" { echo "## Доказуемость — вердикт прибора, код $kod" diff --git a/.github/workflows/reprint.yml b/.github/workflows/reprint.yml index 3006bb311..9ae3aea5c 100644 --- a/.github/workflows/reprint.yml +++ b/.github/workflows/reprint.yml @@ -123,7 +123,7 @@ jobs: if [ "${MASHINA:-}" = "da" ]; then echo "Работа **«Две печати одного дерева совпадают побайтово» запускалась этим" echo "прогоном** — её приговор стоит отдельной строкой в этой же ленте, вместе" - echo "с кодом прибора \`scripts/seed/two-prints-identical.sh\`." + echo "с кодом прибора \`scripts/seed/two-prints-identical.fscript\`." echo echo "Если её строки в ленте всё же нет, значит её не пустила работа" echo "«Постоянные под пределом C99», которую она ждёт. Тогда вопрос гейта Г6" @@ -136,7 +136,7 @@ jobs: echo "Её отсутствие не значит «печать воспроизводима». Оно значит, что вопрос" echo "гейта Г6 на ПОЛНОМ замыкании компилятора — даёт ли одно дерево при двух" echo "заходах побайтово одно и то же — **никем не задан**. Прибор" - echo "\`scripts/seed/two-prints-identical.sh\` в дереве лежит, но пока эта работа не" + echo "\`scripts/seed/two-prints-identical.fscript\` в дереве лежит, но пока эта работа не" echo "идёт, он зовётся только руками, а Г6 требует дословно «проверяется" echo "автоматически, а не разово руками»: разовая сверка руками гейта не берёт," echo "даже когда сошлась." @@ -275,11 +275,11 @@ jobs: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - run: make -C bootstrap -j"$(nproc)" - name: Probe print determinism - run: sh scripts/seed/print-is-repeatable.sh --подлог + run: bootstrap/flang io scripts/seed/print-is-repeatable.fscript --plan Forgery --timeout 600000 env: FLANG_TMP: ${{ runner.temp }} - name: Check print determinism - run: sh scripts/seed/print-is-repeatable.sh --вход flang/self/emit-c.flang + run: bootstrap/flang io scripts/seed/print-is-repeatable.fscript --plan Check --timeout 1800000 -- flang/self/emit-c.flang env: FLANG_TMP: ${{ runner.temp }} @@ -360,13 +360,13 @@ jobs: # ПОЧЕМУ РАБОТОЙ В CI, А НЕ ПРОГОНОМ РУКАМИ. Г6 требует дословно # «проверяется автоматически, а не разово руками». Разовая сверка руками, # даже сошедшаяся, гейт не берёт: её нельзя повторить и никто не знает, что - # именно сверяли. Прибор `scripts/seed/two-prints-identical.sh` лежал в дереве с + # именно сверяли. Прибор `scripts/seed/two-prints-identical.fscript` лежал в дереве с # 1 сентября 2026 и звался только руками — то есть гейта не брал. # # ── ЗАЧЕМ РАБОТА САМА ПИШЕТ «ПЕЧАТЬ КОД=» ─────────────────────────────── # # Прибор считает печать законченной ТОЛЬКО по строке `ПЕЧАТЬ КОД=<код>` в - # журнале рядом с деревом (two-prints-identical.sh, `gotova()`), и это + # журнале рядом с деревом (two-prints-identical.fscript, `gotova()`), и это # правильно: спрашивать «есть ли файл bootstrap/**» нельзя — эти файлы лежат # в дереве закоммиченными и до всякой печати, и прибор ответил бы «готово» # там, где печать не начиналась. @@ -393,14 +393,14 @@ jobs: # # Прибор это чинит у себя (два журнала рядом — код 3; один журнал на две # печати — код 3; гадать он больше не берётся), а работа чинит у себя: она - # НАЗЫВАЕТ журналы через `ZHURNAL_1=` и `ZHURNAL_2=`. Раскладка по разным + # НАЗЫВАЕТ журналы через `FLANG_PRINT_LOG_1=` и `FLANG_PRINT_LOG_2=`. Раскладка по разным # родительским каталогам оставлена, но она теперь запасная: договор — это # названный журнал, а не удачное расположение папок. Раскладку легко # нечаянно сломать правкой, и она молчит; названный журнал сломать молча # нельзя — прибор скажет «названный журнал не файл». # - # <база>/pervaya/derevo/ и <база>/pervaya/pechat.log → ZHURNAL_1 - # <база>/vtoraya/derevo/ и <база>/vtoraya/pechat.log → ZHURNAL_2 + # <база>/pervaya/derevo/ и <база>/pervaya/pechat.log → FLANG_PRINT_LOG_1 + # <база>/vtoraya/derevo/ и <база>/vtoraya/pechat.log → FLANG_PRINT_LOG_2 dve-pechati: name: reprint-reproducibility needs: postoyannye @@ -533,7 +533,7 @@ jobs: set -u VYVOD="$BAZA/prigovor.txt" # Те же два пути, что писали шаги печати. Названы здесь ещё раз и - # переданы прибору как ZHURNAL_1/ZHURNAL_2: пусть он берёт ИМЕННО их, + # переданы прибору как FLANG_PRINT_LOG_1/FLANG_PRINT_LOG_2: пусть он берёт ИМЕННО их, # а не то, что подвернулось рядом с деревом. ZH1="$BAZA/pervaya/pechat.log" ZH2="$BAZA/vtoraya/pechat.log" @@ -545,8 +545,10 @@ jobs: echo "журнал второй печати: $ZH2" # Опять В ФАЙЛ и `kod=$?` СЛЕДУЮЩЕЙ СТРОКОЙ. Прибор различает 0/1/2/3, # и весь смысл работы в том, чтобы этот код дошёл до приговора целым. - ZHURNAL_1="$ZH1" ZHURNAL_2="$ZH2" timeout 1800 sh scripts/seed/two-prints-identical.sh "$BAZA/pervaya/derevo" "$BAZA/vtoraya/derevo" > "$VYVOD" 2>&1 + FLANG_PRINT_LOG_1="$ZH1" FLANG_PRINT_LOG_2="$ZH2" timeout 1800 bootstrap/flang io scripts/seed/two-prints-identical.fscript --plan Check --timeout 1800000 -- "$BAZA/pervaya/derevo" "$BAZA/vtoraya/derevo" > "$VYVOD.raw" 2>&1 kod=$? + grep '^{' "$VYVOD.raw" | jq -r '.result // .error' > "$VYVOD" + [ -s "$VYVOD" ] || cp "$VYVOD.raw" "$VYVOD" cat "$VYVOD" echo "DVE_PECHATI_KOD=$kod" >> "$GITHUB_ENV" exit "$kod" @@ -588,7 +590,7 @@ jobs: skazat "воспроизводимость печати, а про разницу деревьев." skazat "" skazat "Код первой печати: \`$kod1\`. Код второй печати: \`$kod2\`." - skazat "Код прибора \`scripts/seed/two-prints-identical.sh\`: \`$kod\`." + skazat "Код прибора \`scripts/seed/two-prints-identical.fscript\`: \`$kod\`." skazat "" skazat '```' if [ -f "$BAZA/prigovor.txt" ]; then diff --git a/CHANGELOG.md b/CHANGELOG.md index d724c3f5a..7fb166eed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -651,7 +651,7 @@ Заодно: FLANG_VERSION в семени отставала на три релиза; задача 9983 заведена, чтобы это не повторялось. Проверено живым REPL через настоящий псевдотерминал. -main получил дневную работу dev целиком — задачи 9960 (12 ячеек Node→flang), 9982 (SIG9 у спаунутого check), первая сошедшаяся пара two-prints-identical.sh, находка и починка второй дыры в независимом чекере (Г2). +main получил дневную работу dev целиком — задачи 9960 (12 ячеек Node→flang), 9982 (SIG9 у спаунутого check), первая сошедшаяся пара two-prints-identical.fscript, находка и починка второй дыры в независимом чекере (Г2). - release(0.7.10): реальный sha256 (сухой прогон), release-notes, честная история формулы (`35f4c9d`) - release(0.7.10): версия 0.7.10, формула — плейсхолдер до сухого прогона (`799ece3`) @@ -682,7 +682,7 @@ v0.7.4 и v0.7.5 не дошли до публикации: конвейер в Заодно: FLANG_VERSION в семени отставала на три релиза; задача 9983 заведена, чтобы это не повторялось. Проверено живым REPL через настоящий псевдотерминал. -main получил дневную работу dev целиком — задачи 9960 (12 ячеек Node→flang), 9982 (SIG9 у спаунутого check), первая сошедшаяся пара two-prints-identical.sh, находка и починка второй дыры в независимом чекере (Г2). +main получил дневную работу dev целиком — задачи 9960 (12 ячеек Node→flang), 9982 (SIG9 у спаунутого check), первая сошедшаяся пара two-prints-identical.fscript, находка и починка второй дыры в независимом чекере (Г2). - release(0.7.6): версия, формула и release-notes — v0.7.5 тоже не дошла (`db509ac`) @@ -694,7 +694,7 @@ v0.7.4 не дошла до публикации: sha256 в Homebrew-форму Заодно: FLANG_VERSION в семени отставала на три релиза; задача 9983 заведена, чтобы это не повторялось. Проверено живым REPL через настоящий псевдотерминал. -main получил дневную работу dev целиком — задачи 9960 (12 ячеек Node→flang), 9982 (SIG9 у спаунутого check), первая сошедшаяся пара two-prints-identical.sh, находка и починка второй дыры в независимом чекере (Г2). +main получил дневную работу dev целиком — задачи 9960 (12 ячеек Node→flang), 9982 (SIG9 у спаунутого check), первая сошедшаяся пара two-prints-identical.fscript, находка и починка второй дыры в независимом чекере (Г2). - release(0.7.5): версия и sha256 формулы — v0.7.4 остановлена конвейером до публикации (`81145de`) @@ -706,7 +706,7 @@ main получил дневную работу dev целиком — зада Заодно: FLANG_VERSION в семени была "0.7.0"/"0.6.2" — три релиза позади (та же болезнь, что чинил хотфикс 9959; заведена задача 9983, чтобы не повторялось). Проверено живым REPL через настоящий псевдотерминал. -main получил дневную работу dev целиком (164 коммита) — задачи 9960 (12 ячеек Node→flang), 9982 (диагностика SIG9 у спаунутого check), реальный шаг к Г6 (первая сошедшаяся пара two-prints-identical.sh), находка и починка второй дыры в независимом чекере (Г2). +main получил дневную работу dev целиком (164 коммита) — задачи 9960 (12 ячеек Node→flang), 9982 (диагностика SIG9 у спаунутого check), реальный шаг к Г6 (первая сошедшаяся пара two-prints-identical.fscript), находка и починка второй дыры в независимом чекере (Г2). - Homebrew: версия/URL 0.7.4; sha256 заведомо старый (0.7.3), правится после публикации (`0675837`) - flang 0.7.4: FLANG_VERSION бампнута (была 0.7.0/0.6.2 в семени, три релиза позади) (`6e8512b`) diff --git a/README.md b/README.md index 10abbb250..77db75c63 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ There is no single number that says "the language is proved", and this page does Four different coverages are measured separately, by one instrument: ```bash -sh scripts/four-coverages.sh +bootstrap/flang io scripts/four-coverages.fscript --plan Measure --timeout 900000 ``` It prints the date, the commit of the tree, the seed fingerprint, the version and sha256 of the @@ -146,7 +146,7 @@ binary 0.7.20): The full page, with what each coverage does and does not license you to say, is [`docs/four-coverages.md`](docs/four-coverages.md). -`sh scripts/доказуемость.sh` reduces the first coverage and three guards on the checker to one +`bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` reduces the first coverage and three guards on the checker to one word, **ДОКАЗУЕМ** or **НЕ ДОКАЗУЕМ**, against a 100 % gate. That word is about the first coverage and the probe set — not about the language. Measured on 19 September 2026: the same command prints ДОКАЗУЕМ and exits 0 **even with `bootstrap/flang` removed from the tree**, because @@ -303,7 +303,7 @@ result is compared with what is committed: `sh scripts/bootstrap-reprint.sh --ch last print are recorded in `scripts/seed-fingerprint`, one hashed line each — 48 lines in the input half; with the second half, the seed body, the file is 65 lines. -The seed lags the sources: `sh scripts/seed/what-lags-the-seed.sh` lists which files and functions +The seed lags the sources: `bootstrap/flang io scripts/seed/what-lags-the-seed.fscript --plan Report --timeout 300000` lists which files and functions are newer than the seed, and a reprint (`sh scripts/bootstrap-reprint.sh`, hours on one core) is how edits to `flang/self/` reach the binary. **An edit to the sources is not in the binary until that reprint** — which is why the checks above distinguish source from binary. diff --git a/changelog.json b/changelog.json index db28001a7..df3aaeee4 100644 --- a/changelog.json +++ b/changelog.json @@ -2203,7 +2203,7 @@ "Шесть тегов подряд (v0.7.4-v0.7.9) не дошли до публикации, гоняясь за sha256 Homebrew-формулы вручную, каждый раз ловя её несовпадение с тем, что собрал сам конвейер выпуска. Настоящая причина нашлась только на седьмой попытке: у release.yml workflow_dispatch никуда не делся — снят был только у СТАРОГО publish-npm.yml (задача 8649 про npm его не трогала). Сухой прогон на main даёт настоящий хеш архива БЕЗ метки — шаг сверки тега с версией гейтится refs/tags/v и на ручном пуске не звучит. Ни разу за все шесть попыток ничего битого не вышло: конвейер сам останавливался до публикации. Ни один тег не удалён, все просто пропущены.", "Хотфикс: REPL падал на КАЖДОМ вводе живой оболочки (FLANG_UNKNOWN_NAME: запись не содержит поле «планировщик заголовок») — ручной список полей в flang_repl.c отстал от таблицы EMIT_FIELDS_C на два поля. Фикс landed на dev 3 сентября (Ч390, 8e02c37e), но после тега v0.7.3.", "Заодно: FLANG_VERSION в семени отставала на три релиза; задача 9983 заведена, чтобы это не повторялось. Проверено живым REPL через настоящий псевдотерминал.", - "main получил дневную работу dev целиком — задачи 9960 (12 ячеек Node→flang), 9982 (SIG9 у спаунутого check), первая сошедшаяся пара two-prints-identical.sh, находка и починка второй дыры в независимом чекере (Г2)." + "main получил дневную работу dev целиком — задачи 9960 (12 ячеек Node→flang), 9982 (SIG9 у спаунутого check), первая сошедшаяся пара two-prints-identical.fscript, находка и починка второй дыры в независимом чекере (Г2)." ], "entries": [ { @@ -2276,7 +2276,7 @@ "v0.7.4 и v0.7.5 не дошли до публикации: конвейер выпуска сверяет sha256 Homebrew-формулы с архивом, который сам собрал на теге, и оба раза остановился ДО публикации на несовпадении (0.7.4 — формула ещё несла хеш 0.7.3; 0.7.5 — локально пересчитанный хеш всё равно не совпал побайтово, причина не разобрана). Оба сработали как задумано: ничего битого не вышло, оба тега не удалены, просто пропущены — как v0.7.1 и v0.7.2 раньше. Хеш для 0.7.6 взят прямо из текста ошибки конвейера.", "Хотфикс: REPL падал на КАЖДОМ вводе живой оболочки (FLANG_UNKNOWN_NAME: запись не содержит поле «планировщик заголовок») — ручной список полей в flang_repl.c отстал от таблицы EMIT_FIELDS_C на два поля. Фикс landed на dev 3 сентября (Ч390, 8e02c37e), но после тега v0.7.3.", "Заодно: FLANG_VERSION в семени отставала на три релиза; задача 9983 заведена, чтобы это не повторялось. Проверено живым REPL через настоящий псевдотерминал.", - "main получил дневную работу dev целиком — задачи 9960 (12 ячеек Node→flang), 9982 (SIG9 у спаунутого check), первая сошедшаяся пара two-prints-identical.sh, находка и починка второй дыры в независимом чекере (Г2)." + "main получил дневную работу dev целиком — задачи 9960 (12 ячеек Node→flang), 9982 (SIG9 у спаунутого check), первая сошедшаяся пара two-prints-identical.fscript, находка и починка второй дыры в независимом чекере (Г2)." ], "entries": [ { @@ -2297,7 +2297,7 @@ "v0.7.4 не дошла до публикации: sha256 в Homebrew-формуле стоял от 0.7.3, конвейер выпуска сверил его с архивом, который сам собрал на теге, и остановился ДО публикации — сработал как задуман, ничего битого не вышло (workflow_dispatch dry-run для сверки заранее больше не существует с 3 сентября, задача 8649). Тег v0.7.4 не удалён, просто пропущен.", "Хотфикс: REPL падал на КАЖДОМ вводе живой оболочки (FLANG_UNKNOWN_NAME: запись не содержит поле «планировщик заголовок») — ручной список полей в flang_repl.c отстал от таблицы EMIT_FIELDS_C на два поля. Фикс landed на dev 3 сентября (Ч390, 8e02c37e), но после тега v0.7.3.", "Заодно: FLANG_VERSION в семени отставала на три релиза; задача 9983 заведена, чтобы это не повторялось. Проверено живым REPL через настоящий псевдотерминал.", - "main получил дневную работу dev целиком — задачи 9960 (12 ячеек Node→flang), 9982 (SIG9 у спаунутого check), первая сошедшаяся пара two-prints-identical.sh, находка и починка второй дыры в независимом чекере (Г2)." + "main получил дневную работу dev целиком — задачи 9960 (12 ячеек Node→flang), 9982 (SIG9 у спаунутого check), первая сошедшаяся пара two-prints-identical.fscript, находка и починка второй дыры в независимом чекере (Г2)." ], "entries": [ { @@ -2317,7 +2317,7 @@ "note": [ "Хотфикс: REPL падал на КАЖДОМ вводе живой оболочки (FLANG_UNKNOWN_NAME: запись не содержит поле «планировщик заголовок») — ручной список полей в flang_repl.c отстал от таблицы EMIT_FIELDS_C на два поля. Фикс существовал на dev с 3 сентября (Ч390, 8e02c37e), но приземлился ПОСЛЕ тега v0.7.3.", "Заодно: FLANG_VERSION в семени была \"0.7.0\"/\"0.6.2\" — три релиза позади (та же болезнь, что чинил хотфикс 9959; заведена задача 9983, чтобы не повторялось). Проверено живым REPL через настоящий псевдотерминал.", - "main получил дневную работу dev целиком (164 коммита) — задачи 9960 (12 ячеек Node→flang), 9982 (диагностика SIG9 у спаунутого check), реальный шаг к Г6 (первая сошедшаяся пара two-prints-identical.sh), находка и починка второй дыры в независимом чекере (Г2)." + "main получил дневную работу dev целиком (164 коммита) — задачи 9960 (12 ячеек Node→flang), 9982 (диагностика SIG9 у спаунутого check), реальный шаг к Г6 (первая сошедшаяся пара two-prints-identical.fscript), находка и починка второй дыры в независимом чекере (Г2)." ], "entries": [ { diff --git a/docs/DESCRIPTION.md b/docs/DESCRIPTION.md index 0582b638a..3b865cdba 100644 --- a/docs/DESCRIPTION.md +++ b/docs/DESCRIPTION.md @@ -755,7 +755,7 @@ B`, `разделить X по Y`, `соединить X по Y` (список один прибор: ``` -sh scripts/four-coverages.sh +bootstrap/flang io scripts/four-coverages.fscript --plan Measure --timeout 900000 ``` Он печатает дату, коммит дерева и чистоту рабочей копии, отпечаток семени, @@ -781,7 +781,7 @@ sh scripts/four-coverages.sh из знаменателя выпадала бы всякая испорченная запись, по одному лишь объявлению долю растила бы правка манифеста. Баланс печатается рядом с числом и обязан сойтись. -`sh scripts/доказуемость.sh` сводит первое покрытие и три проверки самого +`bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` сводит первое покрытие и три проверки самого проверяющего к одному слову — ДОКАЗУЕМ или НЕ ДОКАЗУЕМ — при пороге 100 %. Слово это о первом покрытии и наборе проб, а не о языке. Замер 19 сентября 2026: та же команда печатает ДОКАЗУЕМ и отвечает кодом 0 ДАЖЕ ТОГДА, когда `bootstrap/flang` diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 1dfd4b8f5..63cdc1453 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -1,6 +1,6 @@ # Передача: состояние flang на 16 августа 2026 -> **Снято 16 августа 2026 (последняя правка — коммит `861870105`, 9 сентября). Сегодня не так:** выпуск 0.7.17, реализация на JavaScript снята 20 августа, семя перепечатано 11 сентября (`0ce948bfd`), `sh scripts/доказуемость.sh` печатает ДОКАЗУЕМ; целей печати десять, не «семь из восьми». Состояние проекта сегодня — `README.md`, `docs/ROADMAP.md`, `docs/what-provability-gives-today.ru.md`; передача учётке — `docs/HANDOVER.md`. Файл остаётся здесь: на его путь завязаны `docs/jargon.json` и навыки в `.ai/`. Ниже — запись о том дне. +> **Снято 16 августа 2026 (последняя правка — коммит `861870105`, 9 сентября). Сегодня не так:** выпуск 0.7.17, реализация на JavaScript снята 20 августа, семя перепечатано 11 сентября (`0ce948bfd`), `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` печатает ДОКАЗУЕМ; целей печати десять, не «семь из восьми». Состояние проекта сегодня — `README.md`, `docs/ROADMAP.md`, `docs/what-provability-gives-today.ru.md`; передача учётке — `docs/HANDOVER.md`. Файл остаётся здесь: на его путь завязаны `docs/jargon.json` и навыки в `.ai/`. Ниже — запись о том дне. Этот файл написан для того, чтобы работу можно было продолжить **с другой учётной записи и без доступа к переписке, в которой она велась**. Здесь состояние, пути, diff --git a/docs/README.md b/docs/README.md index c5eb6cc50..9686f2dea 100644 --- a/docs/README.md +++ b/docs/README.md @@ -22,7 +22,7 @@ доказательства компилятора, формализация правил вывода в Lean, известные нарушения состоятельности и перевод в C — стоят рядом с пояснением, что каждое значит и чего не значит, в [`four-coverages.md`](four-coverages.md); все четыре -снимает один прибор `sh scripts/four-coverages.sh`. +снимает один прибор `bootstrap/flang io scripts/four-coverages.fscript --plan Measure --timeout 900000`. Рядом лежит [`README.ru.md`](README.ru.md) — русская редакция **корневого** `README.md`, а не этой страницы: суффикс `.ru.md` там про корень, и путать их не diff --git a/docs/README.ru.md b/docs/README.ru.md index 5a10c7445..19227efa4 100644 --- a/docs/README.ru.md +++ b/docs/README.ru.md @@ -128,7 +128,7 @@ $ flang run привет.flang --function «Удвоить» --args '{"н": 21}' меряются четыре разных покрытия, одним прибором: ```bash -sh scripts/four-coverages.sh +bootstrap/flang io scripts/four-coverages.fscript --plan Measure --timeout 900000 ``` Он печатает дату, коммит дерева, отпечаток семени, версию и sha256 собранного двоичного, sha256 @@ -144,7 +144,7 @@ sh scripts/four-coverages.sh Полная страница — что каждое покрытие даёт сказать и чего не даёт — [`docs/four-coverages.md`](four-coverages.md). -`sh scripts/доказуемость.sh` сводит первое покрытие и три проверки самого проверяющего к одному +`bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` сводит первое покрытие и три проверки самого проверяющего к одному слову, **ДОКАЗУЕМ** или **НЕ ДОКАЗУЕМ**, при пороге 100 %. Это слово — о первом покрытии и наборе проб, а не о языке. Замер 19 сентября 2026: та же команда печатает ДОКАЗУЕМ и отвечает кодом 0 **даже когда `bootstrap/flang` из дерева убран**, — ни одна из её четырёх проверок собранный @@ -300,7 +300,7 @@ docs/tasks/ открытая и закрытая работа дерева, `scripts/seed-fingerprint`, по хешированной строке на файл — 48 строк во входной половине; вместе со второй половиной, телом семени, в файле 65 строк. -Семя отстаёт от исходников: `sh scripts/seed/what-lags-the-seed.sh` перечисляет, какие файлы и +Семя отстаёт от исходников: `bootstrap/flang io scripts/seed/what-lags-the-seed.fscript --plan Report --timeout 300000` перечисляет, какие файлы и функции новее семени, а перепечатка (`sh scripts/bootstrap-reprint.sh`, часы на одном ядре) — единственный путь, которым правки `flang/self/` доезжают до двоичного. **Правка исходника не попадает в двоичный до этой перепечатки** — потому проверки выше и различают исходник и двоичный. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 00ca6b521..cfa3a471c 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -60,7 +60,7 @@ Haskell. flang целится в одно: язык, на котором и до **Снято 18 сентября 2026** (ветка `a/5190-seed-reprint-0-7-20` над `main` `d366fc8f2`, сверщик собран заново из исходника): `sh flang/proof/corpus-share.sh --набор корпус ---проигрыванием` → **650 из 650 = 100,00 %**; `sh scripts/доказуемость.sh` → **ДОКАЗУЕМ**, +--проигрыванием` → **650 из 650 = 100,00 %**; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` → **ДОКАЗУЕМ**, код 0. Разбивка числителя печатается прибором: на слово ядра — посылок и утверждений 0, шагов 0; снято калькулятором, а не игрой, — 0. Знаменатель 650 — это все 672 обязательства набора за вычетом 22 мест четырёх записей, которые сверщик отверг целиком и которые манифест @@ -71,7 +71,7 @@ Haskell. flang целится в одно: язык, на котором и до СОБСТВЕННЫХ записях доказательства компилятора, и только в них. Про ваши программы она не говорит ничего, про напечатанный код — тоже (этап 2). Рядом с ней стоят три других покрытия, и они ниже: формализация правил вывода в Lean, известные нарушения -состоятельности и перевод в C. Все четыре печатает `sh scripts/four-coverages.sh`, и что +состоятельности и перевод в C. Все четыре печатает `bootstrap/flang io scripts/four-coverages.fscript --plan Measure --timeout 900000`, и что каждое значит — [`docs/four-coverages.md`](four-coverages.md). Закрыла остаток перепечатка семени 0.7.20 (задача 5190): доля шла 629 → 633 → 639 → 650. @@ -102,7 +102,7 @@ Haskell. flang целится в одно: язык, на котором и до **Чем проверяется.** `corpus-share.sh --проигрыванием` печатает «на слово ядра: посылок и утверждений 0; шагов 0; снято калькулятором 0», а -`sh scripts/доказуемость.sh` по-прежнему ДОКАЗУЕМ. +`bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` по-прежнему ДОКАЗУЕМ. ### Этап 2. Доказанный перевод в C @@ -279,7 +279,7 @@ ADR-0034 §5 п. 2: число обработчиков со `случай лю `make -C bootstrap`. Семя перепечатано 10–11 сентября 2026 (`0ce948bfd`): 7 файлов, 41 564 839 байт, 7 ч 28 мин на одном ядре. Отставание семени от исходников сегодня — 3 файла, 77 функций (`functor`, `monoid`, `svoystva`; -`sh scripts/seed/what-lags-the-seed.sh`), все три вне ядра доказательств. +`bootstrap/flang io scripts/seed/what-lags-the-seed.fscript --plan Report --timeout 300000`), все три вне ядра доказательств. **Библиотека** — `flang/stdlib/`, 50 модулей (`ls flang/stdlib/*.flang | wc -l`): списки, строки, JSON, UTF-8, даты, два драйвера баз (PostgreSQL по проводу, @@ -292,8 +292,8 @@ SHA-256, HMAC, X.509, RSA, ECDSA), регулярные выражения бе горячая замена; планировщик на flang и на C. Объявления `процесс` и `надзор` двоичный разбирает, но постусловий при них нет — см. этап 3. -**Приборы честности.** `sh scripts/four-coverages.sh` — четыре покрытия порознь с датой и -SHA; `sh scripts/доказуемость.sh` — одно слово по четырём числам; +**Приборы честности.** `bootstrap/flang io scripts/four-coverages.fscript --plan Measure --timeout 900000` — четыре покрытия порознь с датой и +SHA; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — одно слово по четырём числам; `../ярлык чекер:проверка` — пробы на подлог у независимого проверяющего (19 сентября 2026: 533 отвергнуты, кодом 0 не принята ни одна); `flang/proof/lean/` — лемма Lean 4 у каждой из 109 строк перечня правил; `../ярлык аксиомы:проверка` — аксиом ноль. @@ -308,7 +308,7 @@ SHA; `sh scripts/доказуемость.sh` — одно слово по че версией Lean: ``` -sh scripts/four-coverages.sh (19 сентября 2026, main 404c4ec0a, двоичный 0.7.20) +bootstrap/flang io scripts/four-coverages.fscript --plan Measure --timeout 900000 (19 сентября 2026, main 404c4ec0a, двоичный 0.7.20) 1. собственные записи доказательства: 650 из 650 = 100,00 %; записей 91; мест вынесено 27; из них ВПУСТУЮ (код 0, доказанным не числится ничего) 16 2. формализация: 109 из 109 строк перечня правил имеют лемму; приёмка Lean — 76 правил из 97, @@ -318,7 +318,7 @@ sh scripts/four-coverages.sh (19 сентября 2026, m переигрываются вовсе ``` -`sh scripts/доказуемость.sh` сводит ПЕРВОЕ из них и три проверки самого проверяющего к +`bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` сводит ПЕРВОЕ из них и три проверки самого проверяющего к одному слову — ДОКАЗУЕМ или НЕ ДОКАЗУЕМ — при пороге 100 % (слово владельца, задача 3348). Слово это о первом покрытии и наборе проб, а не о языке, и работа CI «Доказуемость» (`.github/workflows/provability.yml`, раз в сутки и по запуску рукой) гоняет прибор и красна @@ -328,7 +328,7 @@ sh scripts/four-coverages.sh (19 сентября 2026, m доказательства компилятора (набор `flang/proof/checker/tests/records/corpus/`), где независимая программа переиграла ход ядра. Это **не** «100 % программ доказаны» и **не** «100 % утверждений дерева доказаны». О собранном коде оно не говорит ничего (этап 2), и о -собранном ДВОИЧНОМ тоже: замер 19 сентября 2026 — `sh scripts/доказуемость.sh` печатает +собранном ДВОИЧНОМ тоже: замер 19 сентября 2026 — `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` печатает ДОКАЗУЕМ и кодом 0 даже тогда, когда `bootstrap/flang` из дерева убран. Двоичный судит отдельная проверка `sh flang/proof/corpus-share.sh --вложенность`, и она заведена в ту же работу CI. Полный разбор четырёх покрытий — [`docs/four-coverages.md`](four-coverages.md). @@ -399,7 +399,7 @@ sh scripts/four-coverages.sh (19 сентября 2026, m | размер семени | 7 файлов, 41 564 839 байт | тот же коммит | | память | пик этого захода в коммит не записан; предыдущие заходы 31 августа — 24,3 / 35,4 / 34,7 ГиБ | `docs/reprint-ledger.tsv`, задача 1310 | | потолок шагов | `FL_MAX_STEPS 1400000000000` | `bootstrap/flang_runtime.h` | -| отставание после захода | 3 файла, 77 функций, вне ядра доказательств | `sh scripts/seed/what-lags-the-seed.sh` | +| отставание после захода | 3 файла, 77 функций, вне ядра доказательств | `bootstrap/flang io scripts/seed/what-lags-the-seed.fscript --plan Report --timeout 300000` | Держит длина, а не память: заход идёт на одном ядре, а у раннера GitHub потолок шесть часов. Правка в `flang/self/` доезжает до двоичного только перепечаткой, @@ -459,7 +459,7 @@ sh scripts/four-coverages.sh (19 сентября 2026, m ## Известный дефект: проверка подделок красная, а «аксиом ноль» зелёная Два прибора над одним каталогом `flang/test/fixtures/poddelka-*.flang` -(`ls flang/test/fixtures/poddelka-*.flang | wc -l` отвечает **36**), 11 сентября 2026, `SEMYA_OTSTALO_ZNAYU=1` (семя отстаёт на три +(`ls flang/test/fixtures/poddelka-*.flang | wc -l` отвечает **36**), 11 сентября 2026, `FLANG_SEED_LAG_KNOWN=1` (семя отстаёт на три файла вне ядра, и прибор без этой оговорки судить отказывается): ``` @@ -513,8 +513,8 @@ sh scripts/four-coverages.sh (19 сентября 2026, m ``` make -C bootstrap -j8 собрать компилятор (≈1–5 мин) ./bootstrap/flang --version версия собранного двоичного -sh scripts/four-coverages.sh четыре покрытия порознь, с датой и SHA -sh scripts/доказуемость.sh ДОКАЗУЕМ / НЕ ДОКАЗУЕМ по четырём числам, ≈18 с +bootstrap/flang io scripts/four-coverages.fscript --plan Measure --timeout 900000 четыре покрытия порознь, с датой и SHA +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 ДОКАЗУЕМ / НЕ ДОКАЗУЕМ по четырём числам, ≈18 с sh flang/proof/corpus-share.sh --проигрыванием из чего сложена доля первого покрытия sh flang/proof/corpus-share.sh --вложенность записи — то, что печатает СОБРАННЫЙ двоичный ../ярлык чекер:проверка пробы на подлог у независимого проверяющего @@ -522,9 +522,9 @@ sh flang/proof/corpus-share.sh --вложенность записи ./bootstrap/flang check --proof ФАЙЛ --записать З запись доказательства make -C flang/proof/checker && flang/proof/checker/сверщик ФАЙЛ З независимая проверка записи ./bootstrap/flang io docs/benchmarks/proof-cost/count-20.flang цена доказательства -SEMYA_OTSTALO_ZNAYU=1 ../ярлык подделки:проверка ядро не берёт ложь (сегодня красная, см. выше) +FLANG_SEED_LAG_KNOWN=1 ../ярлык подделки:проверка ядро не берёт ложь (сегодня красная, см. выше) ../ярлык аксиомы:проверка аксиом ноль -sh scripts/seed/what-lags-the-seed.sh что отстало от семени +bootstrap/flang io scripts/seed/what-lags-the-seed.fscript --plan Report --timeout 300000 что отстало от семени sh scripts/bootstrap-reprint.sh --check самосборка (часы) ``` diff --git a/docs/adr/0020-the-root-separates-the-language-from-the-tooling.md b/docs/adr/0020-the-root-separates-the-language-from-the-tooling.md index eaec0235a..1afa9289a 100644 --- a/docs/adr/0020-the-root-separates-the-language-from-the-tooling.md +++ b/docs/adr/0020-the-root-separates-the-language-from-the-tooling.md @@ -184,7 +184,7 @@ node docs/site/build.mjs --check # сайт собирае - `flang/src/emit/c/flang_runtime.h:465` — комментарий «Замер (Chrome 151, `web/wasm/`, …)». Файл дословно копируется в `bootstrap/flang_runtime.h` при печати; править его вне печати значит увеличить отставание семени от источника - на строку (сторож `seed-runtime-is-source.sh` это терпит, но + на строку (сторож `seed-runtime-is-source.fscript` это терпит, но `--после-печати` — нет). **Оставить как есть до следующей перепечатки**, там поправить вместе с остальным. - Волна 2 (`scripts/` → `tools/`): строки справки в `flang/self/cli.flang:200` @@ -223,7 +223,7 @@ plan-8235-layout.md): клон ветки, готовый двоичный то | `sh .githooks/pre-push` | 0 | 0 | переезд хук не красит | | `scripts/guards/prose-numbers-guard.sh` | 0 | 0 | ни одна примета `СНЯТО` не называет `benchmarks/` или `web/` | | `scripts/guards/proved-share-vs-tree.sh` | 0 | 0 | пути ведомости правятся заменой заодно | -| `scripts/seed/seed-runtime-is-source.sh` | 0 | 0 | семя не тронуто | +| `scripts/seed/seed-runtime-is-source.fscript` | 0 | 0 | семя не тронуто | | `sh scripts/bootstrap-reprint.sh --telo` | 0 | 0 | тело семени цело | | `sh scripts/bootstrap-reprint.sh --bystro` | 1 | 1 | **красен и до, и после по своей причине** («отпечаток снят с правленого дерева» — состояние ствола), переезд его не меняет | | `scripts/guards/who-calls-the-guards.sh --check` | 0 | 0 | — | diff --git a/docs/adr/0023-forgeries-live-in-a-set-not-in-the-metric-corpus.md b/docs/adr/0023-forgeries-live-in-a-set-not-in-the-metric-corpus.md index 1fbda3d92..b4dce8513 100644 --- a/docs/adr/0023-forgeries-live-in-a-set-not-in-the-metric-corpus.md +++ b/docs/adr/0023-forgeries-live-in-a-set-not-in-the-metric-corpus.md @@ -16,7 +16,7 @@ — она уже отвечала на этот вопрос «оставить как есть», и §8 отвечает ей.** **Проверяется:** `sh flang/proof/corpus-share.sh --набор корпус --проигрыванием`, `sh flang/proof/corpus-share.sh --самопроверка`, -`sh flang/proof/checker/tests/run.sh`, `sh scripts/доказуемость.sh`, +`sh flang/proof/checker/tests/run.sh`, `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000`, `sh .githooks/pre-push`. --- @@ -328,7 +328,7 @@ flang/proof/forgeries/ratchet.txt — два числа, ниже котор Прежнее требование «≥25 подделочных мест обязаны конвертироваться» исчезает в обоих вариантах. Работа не становится меньше — она становится **обозримой**. -### 5.5. Что писать в `scripts/доказуемость.sh` +### 5.5. Что писать в `scripts/provability.fscript` Три правки, и все три — в сторону строгости. @@ -370,7 +370,7 @@ flang/proof/forgeries/ratchet.txt — два числа, ниже котор манифеста. 2. **Счётчик стоит рядом с долей.** Строка «поймано подделок N из N» печатается - там же, где доля, и в выводе `доказуемость.sh`. Доля без этой строки не + там же, где доля, и в выводе `provability.fscript`. Доля без этой строки не печатается никогда. 3. **Храповик по числу подделок.** «ratchet.txt» держит число, ниже которого @@ -416,7 +416,7 @@ flang/proof/forgeries/ratchet.txt — два числа, ниже котор Для (3): `364 + 143 = 507` и `464 + 201 = 665`. Не сошлось — откат шага. -**Ш4. `доказуемость.sh` берёт числа прогоном** (§5.5). +**Ш4. `provability.fscript` берёт числа прогоном** (§5.5). *Проверка:* вердикт по-прежнему **НЕ ДОКАЗУЕМ** (проверка 1 красна — калькулятор `перепиской` на месте), но печать называет числами все четыре проверки. @@ -533,6 +533,6 @@ flang/proof/forgeries/ratchet.txt — два числа, ниже котор подделок 201 → 200, честных 135 → 136. Жёсткое условие цело: подделок принято кодом 0 — ноль. -**Вердикт `доказуемость.sh`** — по-прежнему НЕ ДОКАЗУЕМ (калькулятор на месте), +**Вердикт `provability.fscript`** — по-прежнему НЕ ДОКАЗУЕМ (калькулятор на месте), но все четыре проверки названы числами, и проверка 3 гоняется даже при красной проверке 1. diff --git a/docs/adr/0024-the-settings-file-and-the-language-of-output.md b/docs/adr/0024-the-settings-file-and-the-language-of-output.md index 81786d53f..623958f0d 100644 --- a/docs/adr/0024-the-settings-file-and-the-language-of-output.md +++ b/docs/adr/0024-the-settings-file-and-the-language-of-output.md @@ -142,7 +142,7 @@ $ bootstrap/flang check смесь.flang Якоря строгого круга — это фразы `"проверено — замечаний нет"`, `"постусловие «"`, `"доказано ПРИ УСЛОВИИ"`, `"объявлено, не доказано"`, `"утверждений "`, `"непонятный ключ"`, `"нарушено свойство «утверждение»"`. -Живут они в `scripts/bootstrap-reprint.sh`, `scripts/seed/new-binary-acceptance.sh`, +Живут они в `scripts/bootstrap-reprint.sh`, `scripts/seed/new-binary-acceptance.fscript`, `scripts/targets/target-census.sh`, `scripts/guards/seed-parses-sources-guard.sh`, `flang/scripts/proven-guard.fscript`, `flang/scripts/word-guard.fscript`, `flang/scripts/ledger-summary.fscript`, `flang/scripts/emptiness-guard.fscript` и ещё diff --git a/docs/adr/0025-the-ceiling-leaves-the-type-and-becomes-an-obligation.md b/docs/adr/0025-the-ceiling-leaves-the-type-and-becomes-an-obligation.md index 832618170..65223148b 100644 --- a/docs/adr/0025-the-ceiling-leaves-the-type-and-becomes-an-obligation.md +++ b/docs/adr/0025-the-ceiling-leaves-the-type-and-becomes-an-obligation.md @@ -313,7 +313,7 @@ 3. Программа, объявляющая `принимает н: неотрицательное` и возвращающая `н плюс н`, проверяется без оговорки о потолке, а место, где результат уходит в исполнение, несёт обязательство и его доказательство. -4. `sh scripts/доказуемость.sh` печатает долю не ниже 87,10 % — то есть новые +4. `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` печатает долю не ниже 87,10 % — то есть новые правила вернули потерянные 72 места. 5. Подмена из 3.2 повторена: замена имени правила в копии проверяющей программы больше не меняет долю, потому что имени такого нет. diff --git a/docs/adr/0026-quantifiers-over-any-type-are-a-kernel-change.md b/docs/adr/0026-quantifiers-over-any-type-are-a-kernel-change.md index f2c8436e0..425f3a318 100644 --- a/docs/adr/0026-quantifiers-over-any-type-are-a-kernel-change.md +++ b/docs/adr/0026-quantifiers-over-any-type-are-a-kernel-change.md @@ -56,11 +56,11 @@ ### 2.2. Ловушка проверки построена на ∀-целях — прогон подтвердил -Главная проверка дерева, `scripts/доказуемость.sh`, проверка 1, стоит на двух +Главная проверка дерева, `scripts/provability.fscript`, проверка 1, стоит на двух целях, доказуемых только переписыванием тела: ``` -$ sh scripts/доказуемость.sh +$ bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 проверка 1 — калькулятор снят? ДА (ловушка: обе ∀-цели на слове ядра, тождество знак в знак цело) ``` @@ -304,7 +304,7 @@ ADR-0022, раздел 4.1: все 13 файлов дают код 2 «пров 3. `SVERSCHIK=… sh flang/proof/checker/tests/run.sh` печатает «сошлось всё», и в наборе подделок есть новая: квантор над типом, у которого принципа нет, обязан быть отвергнут. -4. `sh scripts/доказуемость.sh` печатает «проверка 1 — калькулятор снят? ДА», +4. `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` печатает «проверка 1 — калькулятор снят? ДА», и ловушка достроена целью нового вида. Шаг 2: diff --git a/docs/adr/0027-case-analysis-prints-as-a-derivation-and-is-replayed.md b/docs/adr/0027-case-analysis-prints-as-a-derivation-and-is-replayed.md index aea5fc876..fa50e8d22 100644 --- a/docs/adr/0027-case-analysis-prints-as-a-derivation-and-is-replayed.md +++ b/docs/adr/0027-case-analysis-prints-as-a-derivation-and-is-replayed.md @@ -282,7 +282,7 @@ причиной у каждой; «принято кодом 0» в наборе подделок — 0. 3. `sh flang/proof/checker/tests/run.sh` — «сошлось всё». 4. После перепечатки и пересъёмки записей: `corpus-share.sh --проигрыванием` — **≥ 580 / 651** - (Е-2 + Е-3 + Е-4; Е-1 добавит 4 после печати семейств С/О); `scripts/доказуемость.sh` — + (Е-2 + Е-3 + Е-4; Е-1 добавит 4 после печати семейств С/О); `scripts/provability.fscript` — проверки 1, 3, 4 не покраснели. 5. Таблица правил: Р1–Р6 «в ADR», Р7 «механизм», строки ГипО/ГипД/Выч/Или1/Или2 есть, `scripts/tables-guard.sh` зелёный; `flang/proof/checker/ratchet.txt` считает строки diff --git a/docs/adr/0028-fmath-is-a-proof-library-for-programs-not-a-mathlib.md b/docs/adr/0028-fmath-is-a-proof-library-for-programs-not-a-mathlib.md index 91c593d48..fd316eb7b 100644 --- a/docs/adr/0028-fmath-is-a-proof-library-for-programs-not-a-mathlib.md +++ b/docs/adr/0028-fmath-is-a-proof-library-for-programs-not-a-mathlib.md @@ -149,7 +149,7 @@ mathlib — библиотека про МАТЕМАТИЧЕСКИЕ ОБЪЕК ## 11. Решения при принятии (10 сентября 2026) 1. **Подтверждённое вторым судьёй не входит в решающую долю.** Доля, по которой - `scripts/доказуемость.sh` выносит вердикт, — это места, переигранные НАШЕЙ + `scripts/provability.fscript` выносит вердикт, — это места, переигранные НАШЕЙ проверяющей программой; место, которое подтвердил только Lean, печатается отдельной строкой («подтверждено вторым судьёй N») и в числитель не идёт. Довод: иначе вердикт «доказуем» стал бы зависеть от того, установлен ли Lean diff --git a/docs/adr/0030-the-printer-proves-each-run-not-itself.md b/docs/adr/0030-the-printer-proves-each-run-not-itself.md index fcc69880d..e57fecbd1 100644 --- a/docs/adr/0030-the-printer-proves-each-run-not-itself.md +++ b/docs/adr/0030-the-printer-proves-each-run-not-itself.md @@ -7,7 +7,7 @@ ## 1. Дыра, названная числом -11 сентября прибор `sh scripts/доказуемость.sh` впервые напечатал **ДОКАЗУЕМ**: +11 сентября прибор `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` впервые напечатал **ДОКАЗУЕМ**: 625 из 651 обязательств набора переиграны независимой программой, 401 подделка не принята. diff --git a/docs/adr/0032-one-missing-rule-and-three-other-logics.md b/docs/adr/0032-one-missing-rule-and-three-other-logics.md index 63f8e4681..5d79d97ac 100644 --- a/docs/adr/0032-one-missing-rule-and-three-other-logics.md +++ b/docs/adr/0032-one-missing-rule-and-three-other-logics.md @@ -354,7 +354,7 @@ DO-178C уровня A). ## 9. Как проверить, что решение исполнено -1. `sh scripts/доказуемость.sh` печатает **ДОКАЗУЕМ** — этим документом ничего не +1. `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` печатает **ДОКАЗУЕМ** — этим документом ничего не сломано. 2. После работы 1403: пять проб §2.1 дают код 0 вместо трёх «объявлено, не доказано»; проба на подлог (разность без предусловия) остаётся отвергнутой. diff --git a/docs/adr/0033-termination-is-not-a-bound-on-steps.md b/docs/adr/0033-termination-is-not-a-bound-on-steps.md index ff6efdec8..418795787 100644 --- a/docs/adr/0033-termination-is-not-a-bound-on-steps.md +++ b/docs/adr/0033-termination-is-not-a-bound-on-steps.md @@ -270,7 +270,7 @@ ADR-0026 §11.3 на эту работу не ложится. ## 8. Как проверить, что решение исполнено -1. `sh scripts/доказуемость.sh` печатает **ДОКАЗУЕМ** — этим документом ничего +1. `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` печатает **ДОКАЗУЕМ** — этим документом ничего не сломано (прогон 11 сентября: ДОКАЗУЕМ, 625 из 651, 96,01 %; набор проб — «сошлось всё», честных 197, проб на подлог 401, принято 0). 2. После 1408: запись пробы «Сумма до» из §2.1 содержит строку с многочленом; diff --git a/docs/adr/0034-hardware-failure-is-described-not-proved.md b/docs/adr/0034-hardware-failure-is-described-not-proved.md index fd6664672..3920b7584 100644 --- a/docs/adr/0034-hardware-failure-is-described-not-proved.md +++ b/docs/adr/0034-hardware-failure-is-described-not-proved.md @@ -249,7 +249,7 @@ ## 8. Как проверить, что решение исполнено -1. `sh scripts/доказуемость.sh` печатает **ДОКАЗУЕМ** — этим документом ничего +1. `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` печатает **ДОКАЗУЕМ** — этим документом ничего не сломано (прогон 11 сентября: ДОКАЗУЕМ, 625 из 651, 96,01 %). 2. После 1410: страница описания существует, каждое число в ней стоит с приметой «СНЯТО», и проверка чисел в прозе зелена на ней. diff --git a/docs/adr/0036-an-exact-integer-is-a-new-kind-of-value-not-a-new-name.md b/docs/adr/0036-an-exact-integer-is-a-new-kind-of-value-not-a-new-name.md index 1717ea1e1..a3ed3f94f 100644 --- a/docs/adr/0036-an-exact-integer-is-a-new-kind-of-value-not-a-new-name.md +++ b/docs/adr/0036-an-exact-integer-is-a-new-kind-of-value-not-a-new-name.md @@ -468,7 +468,7 @@ NaN, бесконечности и минус нуля у нового типа `Rules.lean`. 5. `sh flang/proof/corpus-share.sh --проигрыванием` не ниже прежнего: старые записи не сломаны. -6. `sh scripts/доказуемость.sh` печатает ДОКАЗУЕМ. +6. `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` печатает ДОКАЗУЕМ. 7. Строка бюджета этого решения стоит в `flang/proof/checker/ratchet.txt`, и потолок 7188 не пробит. diff --git a/docs/adr/0037-second-order-is-a-finite-conjunction-over-function-tags.md b/docs/adr/0037-second-order-is-a-finite-conjunction-over-function-tags.md index 47178ca76..7a9ab61c5 100644 --- a/docs/adr/0037-second-order-is-a-finite-conjunction-over-function-tags.md +++ b/docs/adr/0037-second-order-is-a-finite-conjunction-over-function-tags.md @@ -314,7 +314,7 @@ Lean: две леммы (Э5, Э6) и третья при Яр1; на кажду 5. `flang/proof/lean/run.sh` принял Э5, Э6 (и Яр1) и отверг их ловушки. 6. `sh flang/proof/tables-guard.sh` не хуже ствола (на `87fbd112` красны две опоры — «Инд2» и «Инд3», строки `proof-kernel.flang:9251` и `:9284` разъехались; это чужой долг); строк кода сверщика прибавилось не больше 60; примитивов 15. -7. `sh scripts/доказуемость.sh` — ДОКАЗУЕМ; ведомость `flang/stdlib` не потеряла +7. `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ; ведомость `flang/stdlib` не потеряла ни одного «доказано». 8. После перепечатки: то же самое двоичным, без зонда. diff --git a/docs/adr/0038-a-precondition-is-discharged-by-a-printed-derivation.md b/docs/adr/0038-a-precondition-is-discharged-by-a-printed-derivation.md index d853f9745..328c2592d 100644 --- a/docs/adr/0038-a-precondition-is-discharged-by-a-printed-derivation.md +++ b/docs/adr/0038-a-precondition-is-discharged-by-a-printed-derivation.md @@ -151,7 +151,7 @@ выводом; сверщик — код 0; подмена посылки в блоке — код 1 с причиной. 2. Программа с неснятым местом — по-прежнему `FLANG_PRECONDITION_CALL`, записи нет. 3. `sh flang/proof/corpus-share.sh` печатает обе доли; новая — не ниже 95 % после - печати корпуса; `sh scripts/доказуемость.sh` — ДОКАЗУЕМ. + печати корпуса; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ. 4. Строк кода сверщика прибавилось не больше 80; `run.sh` — «сошлось всё». 5. Задача 1729 получает раздел «Отменено ADR-0038 в части обязательства»; числа `README.md`, `DESCRIPTION.md`, `ROADMAP.md` пересняты прибором. diff --git a/docs/adr/0039-a-law-of-the-category-surface-is-a-statement-about-the-carrier.md b/docs/adr/0039-a-law-of-the-category-surface-is-a-statement-about-the-carrier.md index 8ef0b64a8..3ddbf884b 100644 --- a/docs/adr/0039-a-law-of-the-category-surface-is-a-statement-about-the-carrier.md +++ b/docs/adr/0039-a-law-of-the-category-surface-is-a-statement-about-the-carrier.md @@ -171,7 +171,7 @@ ADR-0022 §4.1 без единого нового слова. 4. Таблица Ш0 по всем 18 файлам лежит в задаче с числами; следующий ADR об упрощателе ссылается на неё. 5. Строк кода сверщика прибавилось не больше 30; `run.sh` — «сошлось всё»; - `доказуемость.sh` — ДОКАЗУЕМ; `docs/ct/spec.md` переписан там, где обещал сетку. + `provability.fscript` — ДОКАЗУЕМ; `docs/ct/spec.md` переписан там, где обещал сетку. ## 7. Где не уверен diff --git a/docs/adr/0040-a-simplifier-rewrites-by-proved-equalities-and-prints-every-step.md b/docs/adr/0040-a-simplifier-rewrites-by-proved-equalities-and-prints-every-step.md index 0e31a4f1f..2a02c6066 100644 --- a/docs/adr/0040-a-simplifier-rewrites-by-proved-equalities-and-prints-every-step.md +++ b/docs/adr/0040-a-simplifier-rewrites-by-proved-equalities-and-prints-every-step.md @@ -149,7 +149,7 @@ ADR-0036 §11 определил, чем оно является; задача 1 2. Запись несёт шаги `Переп1` с позициями; сверщик — код 0; порча позиции, подстановки или ссылка на недоказанное утверждение — код 1 с причиной. 3. Lean принял лемму замены и отверг ловушку; `run.sh` — «сошлось всё». -4. Строк кода сверщика прибавилось не больше 60; `доказуемость.sh` — ДОКАЗУЕМ. +4. Строк кода сверщика прибавилось не больше 60; `provability.fscript` — ДОКАЗУЕМ. 5. Цена прохода `check --proof` по `flang/stdlib` до/после — числом, рост не больше десятой. diff --git a/docs/adr/0042-the-last-twelve-places-get-rules-not-exceptions.md b/docs/adr/0042-the-last-twelve-places-get-rules-not-exceptions.md index c68a6f083..3523a49a7 100644 --- a/docs/adr/0042-the-last-twelve-places-get-rules-not-exceptions.md +++ b/docs/adr/0042-the-last-twelve-places-get-rules-not-exceptions.md @@ -98,7 +98,7 @@ 1. После перепечатки `sh flang/proof/corpus-share.sh --проигрыванием` — **650 / 650** (651 → 650: задача 1794 сняла функцию «Все неотрицательны»); - `sh scripts/доказуемость.sh` — ДОКАЗУЕМ. + `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ. 2. `sh flang/proof/checker/tests/run.sh` — «сошлось всё»; на каждое новое правило — порча записи с кодом 1; ловушка «калькулятор снят» зелена. 3. `sh flang/proof/lean/run.sh` — леммы приняты, ловушки отвергнуты, сверка diff --git a/docs/adr/0044-time-effects-and-processes-are-counted-before-they-get-rules.md b/docs/adr/0044-time-effects-and-processes-are-counted-before-they-get-rules.md index 2f51d9dc8..a8a752a2c 100644 --- a/docs/adr/0044-time-effects-and-processes-are-counted-before-they-get-rules.md +++ b/docs/adr/0044-time-effects-and-processes-are-counted-before-they-get-rules.md @@ -298,7 +298,7 @@ ADR-0044 | индукция по прогону в сверщике (1404 Ш2) Вл1 в ведомости, лемма и ловушка в Lean, `sh flang/proof/tables-guard.sh` — шесть сторожей зелены; `--строки-кода` — не больше +35 сверх съеденного A. 3. После C: `flang check flang/self/lexer.flang parser.flang zapis.flang` — замечаний нет; - `sh scripts/доказуемость.sh` — ДОКАЗУЕМ; строк C сверщика не прибавилось. + `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ; строк C сверщика не прибавилось. 4. После перепечатки семенем №2: `letters-in-turn.flang` — код 0; подлоги 13, 14 — код 1; `temp-directory.flang` с `разрешает` — код 0, а с обработчиком, выдающим «Запустить процесс», — код 1 с именем. diff --git a/docs/adr/0046-the-proof-directory-is-named-in-english.md b/docs/adr/0046-the-proof-directory-is-named-in-english.md index aea78fbb7..474f8bfcc 100644 --- a/docs/adr/0046-the-proof-directory-is-named-in-english.md +++ b/docs/adr/0046-the-proof-directory-is-named-in-english.md @@ -10,7 +10,7 @@ по-прежнему ничего не решает, решает манифест. **Основание:** задача 6421, замер 22 сентября 2026 на `main` `5a6f2698e` (ниже). **Проверяется:** `sh scripts/guards/cyrillic-file-names-guard.sh --check`, -`sh scripts/guards/translit-file-names-guard.sh --check`, `sh scripts/доказуемость.sh`, +`sh scripts/guards/translit-file-names-guard.sh --check`, `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000`, `sh flang/proof/checker/tests/run.sh`. --- @@ -141,7 +141,7 @@ markdown-ссылках и в `Makefile` — и ни одна из этих сс ``` make -C bootstrap -j4 && sh flang/proof/checker/tests/run.sh # «сошлось всё» -sh scripts/доказуемость.sh # ДОКАЗУЕМ, 4 из 4 +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 # ДОКАЗУЕМ, 4 из 4 sh .githooks/pre-push node docs/site/build.mjs --check ``` diff --git a/docs/archive/open-work.md b/docs/archive/open-work.md index e027e657a..d2a36bf32 100644 --- a/docs/archive/open-work.md +++ b/docs/archive/open-work.md @@ -1,4 +1,4 @@ -> **Снято 30 августа 2026 (счёт задач — 1 сентября), состояние на коммит `24b94f62d`. Сегодня не так:** ствол ушёл вперёд на сотни коммитов, семя перепечатано (`0ce948bfd`), выпуск 0.7.17, `sh scripts/доказуемость.sh` печатает ДОКАЗУЕМ; открытые работы сегодня — `docs/tasks/` (задачник) и пять этапов `docs/ROADMAP.md`. Ниже — запись о том дне, не документация. +> **Снято 30 августа 2026 (счёт задач — 1 сентября), состояние на коммит `24b94f62d`. Сегодня не так:** ствол ушёл вперёд на сотни коммитов, семя перепечатано (`0ce948bfd`), выпуск 0.7.17, `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` печатает ДОКАЗУЕМ; открытые работы сегодня — `docs/tasks/` (задачник) и пять этапов `docs/ROADMAP.md`. Ниже — запись о том дне, не документация. # Оглавление открытых работ — 30 августа 2026, счёт задач перемерен 1 сентября @@ -144,7 +144,7 @@ | **8721** | свободна | — | мера задачи снимается **не здесь**: в этой копии `git status -- bootstrap/` пуст, а речь про `m-reprint-2` | заход пускается из чистой копии ствола | | 5563 | в работе | m | **ветка `m/kernel-runs-narrowed` влита** (`91b7312a`, `1a5f81a5`) — статус в шапке не снят | ядро получает прогоны только там, где на них ссылаются | | 1093 | в работе | u | обходов 334, кадр берут 199 | обходы переведены на свёртку | -| 6411 | в работе | b | шапка починена; шесть строк первого списка сняты, четыре новые не доехали — `seed-freshness.sh` код 1, семя отстало на 5 файлов | что ждёт перепечатки — один список | +| 6411 | в работе | b | шапка починена; шесть строк первого списка сняты, четыре новые не доехали — `seed-freshness.fscript` код 1, семя отстало на 5 файлов | что ждёт перепечатки — один список | --- @@ -279,7 +279,7 @@ им. 2. **`--bystro` сверяет со своим отпечатком, а не с семенем — неправда.** - Ключа `--bystro` в `scripts/binary-origin.sh` нет вовсе: быстрая сверка — + Ключа `--bystro` в `scripts/binary-origin.fscript` нет вовсе: быстрая сверка — умолчание. Она вынимает `readelf -sW` определённые имена из `.symtab` и сличает их с именами из **шести файлов семени** (`:474–512`). Отпечаток скрипта участвует только в ключе памяти ответа (`remember_key()`, `:322–329`) diff --git a/docs/archive/roadmap-2026-08-30.md b/docs/archive/roadmap-2026-08-30.md index 77c435686..30f42e3d1 100644 --- a/docs/archive/roadmap-2026-08-30.md +++ b/docs/archive/roadmap-2026-08-30.md @@ -1,4 +1,4 @@ -> **Снято 30 августа 2026, состояние на коммит `aecee907` (двоичный 0.6.2). Сегодня не так:** семя перепечатано 11 сентября (`0ce948bfd`, отставание 3 файла / 77 функций, а не 46), версия 0.7.17, `sh scripts/доказуемость.sh` печатает ДОКАЗУЕМ — 625 / 651 = 96,01 % переиграно независимым сверщиком, 401 подделка отвергнута; реализации на JavaScript в дереве нет с 20 августа (`fe8e8a37`). Живая карта — [`docs/ROADMAP.md`](../ROADMAP.md) в корне. Числа ниже — запись о том дне, не документация. +> **Снято 30 августа 2026, состояние на коммит `aecee907` (двоичный 0.6.2). Сегодня не так:** семя перепечатано 11 сентября (`0ce948bfd`, отставание 3 файла / 77 функций, а не 46), версия 0.7.17, `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` печатает ДОКАЗУЕМ — 625 / 651 = 96,01 % переиграно независимым сверщиком, 401 подделка отвергнута; реализации на JavaScript в дереве нет с 20 августа (`fe8e8a37`). Живая карта — [`docs/ROADMAP.md`](../ROADMAP.md) в корне. Числа ниже — запись о том дне, не документация. # Дорожная карта flang: что уже есть, чего нет и куда язык идёт @@ -270,7 +270,7 @@ python3 flang/scripts/per-file-proof-share.py . КАТАЛОГ-ОТЧЁТОВ/ прочерков не осталось ни одного. *Снято 30 августа 2026 на стволе `24fbe5a9`. Двоичный собран -`sh scripts/build-ledger-binary.sh` из этого же дерева, md5 +`sh scripts/build-ledger-binary.fscript` из этого же дерева, md5 `897ce840a98c9b2ad75575db2ef3e719`, и положен ВНУТРЬ дерева — см. ловушку в конце пункта. Ключ `--предел-шагов 400000000000`, прогоны через ворота.* @@ -416,7 +416,7 @@ CI. ##### Ловушка: двоичный берёт библиотеку от СВОЕГО места, и это даёт ложные отказы -`scripts/build-ledger-binary.sh` по умолчанию кладёт двоичный **рядом** с +`scripts/build-ledger-binary.fscript` по умолчанию кладёт двоичный **рядом** с деревом (`<дерево>-ledger-binary`), чтобы не сорить в `git status`. Для сборки это правильно, **для снятия ведомости — нет**: модуль, названный без пути, ищется в том числе в `<каталог двоичного>/../flang/stdlib`, и у соседнего @@ -1426,7 +1426,7 @@ make -C bootstrap -j4 Перемерено 29 августа 2026 на стволе `5f1078e1`: ``` -SEMYA_OTSTALO_ZNAYU=1 VETVEY=2 PAMYAT=40G /srv/flang-rabota/vorota/flang-vorota \ +FLANG_SEED_LAG_KNOWN=1 VETVEY=2 PAMYAT=40G /srv/flang-rabota/vorota/flang-vorota \ -- ./bootstrap/flang io flang/scripts/kernel-forgeries.flang \ --plan 'Подделки остаются недоказанными' --timeout 900000 ``` @@ -1633,7 +1633,7 @@ JavaScript, которых не видит ни один счётчик по и **Сейчас — дни** 0. **Перепечатать семя.** Стоит нулевым, потому что держит всё остальное: - `sh scripts/seed-freshness.sh` отвечает отказом: семя отстало на 46 файлов + `sh scripts/seed-freshness.fscript` отвечает отказом: семя отстало на 46 файлов (замер 30 августа 2026 на стволе `aecee907`), и пока их не ноль, ни одна правка компилятора до собранной программы не доходит, а выпуска нет вовсе. Среди разошедшихся — `proof-kernel`, `proof`, `obligations`, `totality`, `types`, то есть ровно @@ -1690,7 +1690,7 @@ JavaScript, которых не видит ни один счётчик по и мире, кроме файлов дерева (их большинство), потом обходчики, потом оснастка замеров. Три файла из этой кучи переводить НЕЛЬЗЯ и это записано доводом, а не забывчивостью: `bootstrap-reprint.sh`, `bootstrap-c.sh` и - `new-binary-acceptance.sh` печатают и принимают сам двоичный, а судья не + `new-binary-acceptance.fscript` печатают и принимают сам двоичный, а судья не может исполняться подсудимым. Два первых перевода сделаны 29 августа и сверены с прежними слово в слово: `scripts/adr-numbers-guard.flang` и `scripts/kernel-abilities-guard.flang`. diff --git a/docs/audit-2026-09-11.md b/docs/audit-2026-09-11.md index 126e419e9..e68129937 100644 --- a/docs/audit-2026-09-11.md +++ b/docs/audit-2026-09-11.md @@ -8,11 +8,11 @@ ``` ./bootstrap/flang --version → flang 0.7.17 -sh scripts/доказуемость.sh → ДОКАЗУЕМ: 625 / 651 = 96,01 %; подделок 33/33; проб на подлог 401, принято 0; честных 197, отвергнуто 0 +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 → ДОКАЗУЕМ: 625 / 651 = 96,01 %; подделок 33/33; проб на подлог 401, принято 0; честных 197, отвергнуто 0 sh flang/proof/corpus-share.sh --проигрыванием → на слово ядра 16 + 4, калькулятором 6; записей 88 ls flang/self/emit-*.flang | wc -l → 10 целей печати ls flang/self/*.flang | wc -l; ls flang/stdlib/*.flang | wc -l; find examples -name '*.flang' | wc -l → 59; 50; 185 -sh scripts/seed/what-lags-the-seed.sh → 3 файла, 77 функций +bootstrap/flang io scripts/seed/what-lags-the-seed.fscript --plan Report --timeout 300000 → 3 файла, 77 функций git ls-files '*.mjs' '*.js' | wc -l → 52 sh scripts/guards/published-vs-tree.sh --числа → десять дешёвых ключей numbers.json пересняты (версия 0.7.14 → 0.7.17) ``` diff --git a/docs/ci-inventory.md b/docs/ci-inventory.md index 894b03167..b377b357d 100644 --- a/docs/ci-inventory.md +++ b/docs/ci-inventory.md @@ -24,7 +24,7 @@ «предел-шагов 1000000000», стало «предел-шагов 4000000000». Двадцать целей из восьмидесяти двух объявлены в `ярлыки.flang` как «Ярлыки о -доказательствах». Перед ними стоит заслон `scripts/seed/seed-freshness.sh`: пока +доказательствах». Перед ними стоит заслон `scripts/seed/seed-freshness.fscript`: пока семя отстало, они **отказываются судить** и отвечают кодом 1, не запуская проверки вовсе. Это не поломка, а заслон, поставленный нарочно, — иначе они печатали бы зелёное про дерево, которого нет. @@ -32,7 +32,7 @@ Поэтому каждая из этих двадцати снималась **дважды**: * как её увидит человек и CI — с заслоном; -* с ключом обхода `SEMYA_OTSTALO_ZNAYU=1` — чтобы узнать, красна ли она **сама +* с ключом обхода `FLANG_SEED_LAG_KNOWN=1` — чтобы узнать, красна ли она **сама по себе** или только из-за семени. Второй прогон — единственное, что отделяет «чинить руками» от «ждать @@ -60,7 +60,7 @@ Столбец «код» — что вернул `./ярлык <имя>`. Столбец «с ключом» заполнен только у тех двадцати целей, перед которыми стоит заслон свежести семени: это их код -при `SEMYA_OTSTALO_ZNAYU=1`, то есть их настоящее состояние. «обрыв» — прогон +при `FLANG_SEED_LAG_KNOWN=1`, то есть их настоящее состояние. «обрыв» — прогон не уложился в отведённый ему срок и снят; в столбце времени назван сам срок. Время — стенные секунды одного прогона, замок ворот в них входит. diff --git a/docs/design/6203-nositel-indukcii-iz-obyavleniya.md b/docs/design/6203-nositel-indukcii-iz-obyavleniya.md index e5d9c454c..7698cd154 100644 --- a/docs/design/6203-nositel-indukcii-iz-obyavleniya.md +++ b/docs/design/6203-nositel-indukcii-iz-obyavleniya.md @@ -224,7 +224,7 @@ ADR-0026 §2.4 называет три функции ядра и одно ме ### 2.5. Гейт «как есть» на этом двоичном ``` -$ sh scripts/доказуемость.sh +$ bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 проверка 1 — калькулятор снят? ДА (ловушка: обе ∀-цели на слове ядра, тождество знак в знак цело) проверка 2 — доля проигрыванием не ниже 95 %? НЕТ (87.10 %: 567 из 651; недостижимых мест вынесено 14) проверка 3 — набор проб пройден? ДА (набор подделок 31 из 31; проб на подлог 237, принято кодом 0 — 0; честных 141, отвергнуто 0) @@ -465,7 +465,7 @@ ADR-0026 (свободные утверждения) или с первым пс Каждый инкремент — отдельная ветка от `gh/dev`, свой коммит, свой гейт. Гейт общий: `sh flang/proof/checker/tests/run.sh` печатает «сошлось всё»; -`sh scripts/доказуемость.sh` — проверки 1, 3, 4 «ДА» и 567/651 не ниже; +`bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — проверки 1, 3, 4 «ДА» и 567/651 не ниже; `sh flang/proof/tables-guard.sh` и `rules-match.sh` — код 0. ### Ш0 — только сверщик, без ядра и без семени (можно начинать сразу) @@ -602,7 +602,7 @@ HACKS/заметки волны. функциях), Ш1 — в **тот же батч перепечатки**, что 6202, Ш2 — после. Тогда печать одна. -Общий гейт после слияния: `run.sh` «сошлось всё», `доказуемость.sh` 1/3/4 +Общий гейт после слияния: `run.sh` «сошлось всё», `provability.fscript` 1/3/4 «ДА», доля ≥ 567/651, `tables-guard.sh` код 0 (с С-5 — уже зелёным). --- @@ -656,7 +656,7 @@ LC_ALL=C.UTF-8 bootstrap/flang check <файл> --proof --записать <фа for f in flang/proof/examples/*.flang flang/test/fixtures/*.flang flang/proof/map/*.flang; do LC_ALL=C.UTF-8 bootstrap/flang check "$f" --proof; done 2>&1 | grep -c FLANG_PROOF_INDUCTION_TYPE # 0 grep -h '^ *принцип тип ' flang/proof/checker/tests/records/corpus/*.record | sed -n 's/.*носитель \([a-z]*\).*/\1/p' | sort | uniq -c -sh scripts/доказуемость.sh +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 ``` Подделки П1/П1б/П2/П3: шапка (9 строк) — из честной записи ядра для того же diff --git a/docs/design/fmath-first-ten-statements.md b/docs/design/fmath-first-ten-statements.md index 7294cd749..0dc65e513 100644 --- a/docs/design/fmath-first-ten-statements.md +++ b/docs/design/fmath-first-ten-statements.md @@ -356,7 +356,7 @@ ADR-0028 §11 п.1: место, подтверждённое только Lean, вида `подтверждено вторым судьёй (Lean), в числитель не идёт N`. Эти N мест — подмножество «не проверено у поручённых записей»: знаменатель не меняется, числитель тоже. -- **Показывает** — [`scripts/доказуемость.sh`](../../scripts/доказуемость.sh) (вердикт), +- **Показывает** — [`scripts/provability.fscript`](../../scripts/provability.fscript) (вердикт), справочной строкой под «проверка 2». Долю он берёт только из строки `доля-проигрыванием = …` (якоря `sed` в строках 220–222), поэтому отдельная строка в числитель не просочится, и ни одна из четырёх проверок от неё не зависит. diff --git a/docs/design/proof-object-corpus-migration.md b/docs/design/proof-object-corpus-migration.md index c2dfbc503..89c5010f3 100644 --- a/docs/design/proof-object-corpus-migration.md +++ b/docs/design/proof-object-corpus-migration.md @@ -458,7 +458,7 @@ svoystvu-stdlib.md §4` подтверждает: «53 из 53 — явный ш | `flang/self/zapis.flang` (1713 строк на `r/4128`, БЕЗ печати 4125) | печать записи; после `2eb5633e` (647 добавлений, 1 удаление) — 2359 | | `flang/proof/checker/tests/records/corpus/*.record` | 86 записей (55 честных + 31 подделка) | | `flang/proof/corpus-share.sh` | линейка Г4 по разрядам помех Р0–Р5 (не доля-проигрыванием) | -| `scripts/доказуемость.sh` | `перепиской`=10 сегодня → НЕ ДОКАЗУЕМ | +| `scripts/provability.fscript` | `перепиской`=10 сегодня → НЕ ДОКАЗУЕМ | | `/srv/tmp/dokazuemyy/pechat-4125/клон` (ветка `печать-4125`, коммит `2eb5633e`) | код перепечатки, осмотрен ЧТЕНИЕМ (`git show`), не выполнен и не тронут | | `docs/design/proof-object-roadmap.md` | связка гейтов и шагов [Ш1]–[Ш6] | | пять разведок + лемма-S2 | `-migration.md`, `-po-primeru.md`, `-po-sluchayam.md`, `-razbor-celi.md`, `-lemma-po-svoystvu.md`, `-po-svoystvu.md`, `-po-svoystvu-stdlib.md` | diff --git a/docs/design/proof-object-roadmap.md b/docs/design/proof-object-roadmap.md index e71b7975d..505e38d12 100644 --- a/docs/design/proof-object-roadmap.md +++ b/docs/design/proof-object-roadmap.md @@ -54,7 +54,7 @@ S2), `docs/DESCRIPTION.md`, `/srv/tmp/dokazuemyy/КРИТЕРИЙ.md` (гейт ### 0.2. Прибор, который скажет «готово»: ярлык `доказуемость` -`./ярлык доказуемость` (`scripts/доказуемость.sh`) печатает ОДНО слово — +`./ярлык доказуемость` (`scripts/provability.fscript`) печатает ОДНО слово — ДОКАЗУЕМ / НЕ ДОКАЗУЕМ — по ТРЁМ числам, и слово выводится из чисел, а не вписывается рукой. Сегодня — НЕ ДОКАЗУЕМ. Зазеленеет ровно тогда, когда сойдутся все три (и это же — три гейта, которые карта закрывает): @@ -374,7 +374,7 @@ S2**, перепроверкой (г) «закрыть по свойству / `docs/DESCRIPTION.md §7`; но `by:"declaration"` = «цель сведена с телом» = доказательство вычислением, `/srv/tmp/dokazuemyy/КРИТЕРИЙ.md:2862`). Закрывает **[Ш6]** — снятие `перепиской`: пока калькулятор в чекере, доля держится ВЫЧИСЛЕНИЕМ, а не проигрыванием записанного — -это и есть открытая дыра Г7 (`scripts/доказуемость.sh`, проверка 1). Снят калькулятор +это и есть открытая дыра Г7 (`scripts/provability.fscript`, проверка 1). Снят калькулятор (`git grep -c перепиской` = 0) → на слово ядра не остаётся ничего вычислительного; `оценить_терм` остаётся честно названным примитивом P8, не пере-выводом. @@ -473,10 +473,10 @@ S2**, перепроверкой (г) «закрыть по свойству / | [Ш2] приём S2 (лемма) | `checker.c` | Г2 (ловит 4114) | `-lemma-po-svoystvu.md` | | [Ш3] печать следа всех семей | `zapis.flang` (+1 правка печати ядра) | Г2, Г4 | `-migration.md §5`, `-po-primeru.md §3` | | [Ш4] ОДНА батч-перепечатка + перегенерация записей | семя, `.record` | точка замера Г6; питание Г4 | `docs/DESCRIPTION.md §3`, `/srv/tmp/dokazuemyy/КРИТЕРИЙ.md:1117` | -| [Ш5] прибор доли-проигрыванием + замер | новый прибор | измеримость Г4, прогон Г2 | `scripts/доказуемость.sh` | +| [Ш5] прибор доли-проигрыванием + замер | новый прибор | измеримость Г4, прогон Г2 | `scripts/provability.fscript` | | [Ш6] снять калькулятор | `checker.c` | Г7 (перепиской=0), итог Г3 (−1800) | `proof-object.md §6.3,§7` | -Прибор готовности: `./ярлык доказуемость` (`scripts/доказуемость.sh`) — ДОКАЗУЕМ +Прибор готовности: `./ярлык доказуемость` (`scripts/provability.fscript`) — ДОКАЗУЕМ только когда `перепиской`=0 И доля-проигрыванием ≥ 95 % И набор проб цел; код возврата 0 = ДОКАЗУЕМ. Сегодня — НЕ ДОКАЗУЕМ (калькулятор на месте). diff --git a/docs/flang/proof/checker/tests/trap/README.md b/docs/flang/proof/checker/tests/trap/README.md index cbde3596c..72d7a054b 100644 --- a/docs/flang/proof/checker/tests/trap/README.md +++ b/docs/flang/proof/checker/tests/trap/README.md @@ -1,6 +1,6 @@ # Ловушка проверки 1 «калькулятор снят?» — по одной цели на каждый вид обязательства -Читает её `scripts/доказуемость.sh` (проверка 1). Основание — задача 3781 (ловушка +Читает её `scripts/provability.fscript` (проверка 1). Основание — задача 3781 (ловушка вместо грепа по имени функции) и ячейка К11 кластера 6202/6203 (9 сентября 2026, ветка `r/k11-lovushka-po-vidam` от `gh/dev e12837854`). @@ -71,4 +71,4 @@ входа, закрытое зовущим»: код 3, ждали 0; цель … названа чекером — не переиграна; в сводке чекера нет признака». -Гонять копию таблицы, не трогая дерево: `LOVUSHKA_TSV=/путь/копия.tsv sh scripts/доказуемость.sh`. +Гонять копию таблицы, не трогая дерево: `FLANG_TRAP_TABLE=/путь/копия.tsv bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000`. diff --git a/docs/four-coverages.md b/docs/four-coverages.md index 8cba09844..8d5ef351a 100644 --- a/docs/four-coverages.md +++ b/docs/four-coverages.md @@ -7,7 +7,7 @@ Все числа снимает один прибор: ```bash -sh scripts/four-coverages.sh +bootstrap/flang io scripts/four-coverages.fscript --plan Measure --timeout 900000 ``` Он печатает дату, коммит дерева и чистоту рабочей копии, отпечаток семени, версию и sha256 diff --git a/docs/guide/bootstrap-circle.md b/docs/guide/bootstrap-circle.md index 2a146dbdd..d1fb3ad7f 100644 --- a/docs/guide/bootstrap-circle.md +++ b/docs/guide/bootstrap-circle.md @@ -39,7 +39,7 @@ The seed was reprinted on 10–11 September 2026, commit `0ce948bfd`: `sh scripts/bootstrap-reprint.sh` answered «РЕПРИНТ КОД=0, семя годное» — 7 files, 41 564 839 bytes, 7 h 28 min (start 02:08:53Z, end 09:36:56Z; all of it is in the commit message). The sources have moved on since: on 11 September -`sh scripts/seed/what-lags-the-seed.sh` names 3 files and 77 functions (`functor`, +`bootstrap/flang io scripts/seed/what-lags-the-seed.fscript --plan Report --timeout 300000` names 3 files and 77 functions (`functor`, `monoid`, `svoystva`) that the binary built from the seed does not know. `sh scripts/bootstrap-reprint.sh --bystro` on the same day answers «ОТПЕЧАТОК СНЯТ С ПРАВЛЕНОГО ДЕРЕВА»: the emission inputs in the reprint tree differed from its @@ -151,7 +151,7 @@ on 11 September 2026 did not reach an answer in 8 minutes (run ceiling 500 s): i was still at «Связать исходники», 19 billion steps, 6.6 GiB. The answer that used to stand here ("не проверено — замечаний 29", exit 1) was taken from the seed before the reprint. What the seed binary does not know is reported not by `check` -but by `sh scripts/seed/what-lags-the-seed.sh` — 3 files, 77 functions. +but by `bootstrap/flang io scripts/seed/what-lags-the-seed.fscript --plan Report --timeout 300000` — 3 files, 77 functions. **Rebuilding needs the tree, not the seed directory.** Emission reads the C runtime sources from disk (`flang/src/emit/c/`), and there are no copies of them diff --git a/docs/guide/bootstrap-circle.ru.md b/docs/guide/bootstrap-circle.ru.md index 3dd3db1ad..c0c8d2d1f 100644 --- a/docs/guide/bootstrap-circle.ru.md +++ b/docs/guide/bootstrap-circle.ru.md @@ -39,7 +39,7 @@ flowchart LR Семя перепечатано 10–11 сентября 2026, коммит `0ce948bfd`: `sh scripts/bootstrap-reprint.sh` ответил «РЕПРИНТ КОД=0, семя годное» — 7 файлов, 41 564 839 байт, 7 ч 28 мин (старт 02:08:53Z, конец 09:36:56Z; всё это — в сообщении коммита). С тех пор -исходники ушли вперёд: `sh scripts/seed/what-lags-the-seed.sh` 11 сентября +исходники ушли вперёд: `bootstrap/flang io scripts/seed/what-lags-the-seed.fscript --plan Report --timeout 300000` 11 сентября называет 3 файла и 77 функций (`functor`, `monoid`, `svoystva`), которых собранный из семени двоичный не знает. `sh scripts/bootstrap-reprint.sh --bystro` в тот же день отвечает «ОТПЕЧАТОК СНЯТ С ПРАВЛЕНОГО ДЕРЕВА»: входы печати в дереве @@ -141,7 +141,7 @@ sh scripts/bootstrap-reprint.sh --check # сверить семя с тем, ч «Связать исходники», 19 млрд шагов, 6,6 ГиБ. Ответ, который здесь стоял («не проверено — замечаний 29», код 1), снят с семени до перепечатки. Чего двоичный из семени не знает, говорит не `check`, а -`sh scripts/seed/what-lags-the-seed.sh` — 3 файла, 77 функций. +`bootstrap/flang io scripts/seed/what-lags-the-seed.fscript --plan Report --timeout 300000` — 3 файла, 77 функций. **Пересборке нужно дерево, а не каталог семени.** Печать читает исходники рантайма C с диска (`flang/src/emit/c/`), и копий их в `bootstrap/` нет. diff --git a/docs/guide/business-requirements.ru.md b/docs/guide/business-requirements.ru.md index 7ebc6d345..710112219 100644 --- a/docs/guide/business-requirements.ru.md +++ b/docs/guide/business-requirements.ru.md @@ -220,12 +220,12 @@ FLANG_PRECONDITION_CALL … вызов «Цена со скидкой» в фу ## 7. Где кончается доказательство -Вердикт прибора `sh scripts/доказуемость.sh` (с 17 сентября 2026 порог доли — 100 %, +Вердикт прибора `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` (с 17 сентября 2026 порог доли — 100 %, и слово честно **НЕ ДОКАЗУЕМ**: 633 из 650) привязан к команде `flang check` — и только к ней. ``` -$ sh scripts/доказуемость.sh +$ bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 НЕ ДОКАЗУЕМ проверка 2 — доля проигрыванием не ниже 100 %? НЕТ (97.38 %: 633 из 650; …) проверка 3 — набор проб пройден? ДА (… проб на подлог 401, принято кодом 0 — 0; …) diff --git a/docs/guide/limits.md b/docs/guide/limits.md index cc0c74873..b78e077ba 100644 --- a/docs/guide/limits.md +++ b/docs/guide/limits.md @@ -12,7 +12,7 @@ is drawn in [`docs/overview.ru.md`](../../docs/overview.ru.md); the full lists a (`тотальная`), types and exhaustiveness of `разбор`, composition and chain wiring, the three functor laws — and `обеспечивает` postconditions the kernel derived from the declarations and the body (109 inference rules; every proof is replayed by an independent C program, - `flang/proof/checker/checker.c`, and `sh scripts/доказуемость.sh` on 19 September 2026 answers + `flang/proof/checker/checker.c`, and `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` on 19 September 2026 answers «ДОКАЗУЕМ»: 650 obligations out of 650 replayed, 100.00 %); - *grid N* (`сетка N`) — computed on a **finite** set of the author's own values: utility properties, declared examples, concurrency runs, and the agreement between the interpreter and diff --git a/docs/guide/limits.ru.md b/docs/guide/limits.ru.md index e0a4e219d..88f95c356 100644 --- a/docs/guide/limits.ru.md +++ b/docs/guide/limits.ru.md @@ -12,7 +12,7 @@ (`тотальная`), типы и исчерпывающность `разбора`, стыковка композиции и цепочки, три закона функтора — и постусловия `обеспечивает`, которые ядро свело из объявлений и тела (правил вывода 109; каждое доказательство переигрывает независимая программа на C - `flang/proof/checker/checker.c`, и `sh scripts/доказуемость.sh` 19 сентября 2026 отвечает + `flang/proof/checker/checker.c`, и `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` 19 сентября 2026 отвечает «ДОКАЗУЕМ»: переиграно 650 обязательств из 650, 100,00 %); - *сетка N* — посчитано на **конечном** множестве значений автора: свойства утилит, объявленные примеры, прогоны конкурентности и согласие интерпретатора с десятью бэкендами. Про остальные diff --git a/docs/javascript-inventory.md b/docs/javascript-inventory.md index 8a90909e7..3fa0b112f 100644 --- a/docs/javascript-inventory.md +++ b/docs/javascript-inventory.md @@ -67,8 +67,8 @@ JavaScript стало 55, строк 29 733; в трёх каталогах о Эта опись считает ОДИН язык. Остальные шестнадцать — оболочка, C, C++, Python, HTML, CSS, awk, Erlang, Java, C#, Elixir, Go, Rust, Lua, vimscript, Ruby — -считает [`tree-inventory.md`](tree-inventory.md) (26 сентября 2026: 242 файлов вне flang, - +считает [`tree-inventory.md`](tree-inventory.md) (26 сентября 2026: 232 файлов вне flang, + долг вне JavaScript — **97 файлов, 18 427 строк при потолке 63**: храповик красен, разбор — задачи 4838 и 7405). Там же названы 569 строк JavaScript, лежащих ВНУТРИ файлов `.html`: счёт по именам файлов их не видит, и diff --git a/docs/kernel-ledger.md b/docs/kernel-ledger.md index 82f9adedb..23a658dad 100644 --- a/docs/kernel-ledger.md +++ b/docs/kernel-ledger.md @@ -10,14 +10,14 @@ воспроизводится побайтово одной строкой**: ```sh -KOMMIT=4a26cf05 sh scripts/seed/build-ledger-binary.sh /путь/куда # 66,64 с +KOMMIT=4a26cf05 bootstrap/flang io scripts/seed/build-ledger-binary.fscript --plan Build --timeout 900000 -- /путь/куда # 66,64 с PREDEL_SHAGOV=400000000000 DVOICHNYY=/путь/куда/flang \ sh scripts/ledgers/take-proof-ledger.sh flang/stdlib/aes.flang # 399,17 с ``` ## Часть 1. Двоичный: компилятор из семени, рантайм из дерева -`scripts/seed/build-ledger-binary.sh` кладёт в соседний дереву каталог семь файлов и +`scripts/seed/build-ledger-binary.fscript` кладёт в соседний дереву каталог семь файлов и зовёт `make`: | файл | откуда | @@ -119,7 +119,7 @@ PIK=1G PAMYAT=45G PREDEL_SHAGOV=400000000000 \ ### Двоичный описи воспроизведён ПОБАЙТОВО ``` -$ PIK=2G PAMYAT=6G <ворота> -- env KOMMIT=4a26cf05 sh scripts/seed/build-ledger-binary.sh … +$ PIK=2G PAMYAT=6G <ворота> -- env KOMMIT=4a26cf05 bootstrap/flang io scripts/seed/build-ledger-binary.fscript --plan Build --timeout 900000 -- … семя и рантайм взяты из коммита 4a26cf05ee6c8f18190ecc3e429c926e193caa21 рантайм flang_cli.c дерево обгоняет семя на 6 строк рантайм flang_repl.c дерево обгоняет семя на 1102 строк @@ -187,7 +187,7 @@ flang/stdlib/aes.flang: написано 218 …; доказано 143, сетк ### Собранное по рабочей копии — третье число, и оно тоже проверено ``` -$ PIK=2G PAMYAT=6G <ворота> -- sh scripts/seed/build-ledger-binary.sh +$ PIK=2G PAMYAT=6G <ворота> -- bootstrap/flang io scripts/seed/build-ledger-binary.fscript --plan Build --timeout 900000 -- рантайм flang_cli.c дерево обгоняет семя на 0 строк рантайм flang_repl.c дерево обгоняет семя на 0 строк рантайм flang_runtime.c дерево обгоняет семя на 0 строк diff --git a/docs/lean-checks-the-inference-rules.md b/docs/lean-checks-the-inference-rules.md index feb07e5eb..7173bceba 100644 --- a/docs/lean-checks-the-inference-rules.md +++ b/docs/lean-checks-the-inference-rules.md @@ -7,7 +7,7 @@ **Зачем.** Честность доказательств flang сегодня держится одной программой — `flang/proof/checker/checker.c` — и набором подделок (227 на день отчёта; 401 проба -на подлог на 11 сентября 2026 по `sh scripts/доказуемость.sh`, коммит `2c40752d0`), +на подлог на 11 сентября 2026 по `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000`, коммит `2c40752d0`), ни одна из которых не принята. Это много, но проверяющий один, и написан он нами. Ядро Lean — маленькая программа проверки термов, устроенная иначе и написанная не нами. Если те же правила проходят и через неё, у утверждения появляется вторая, @@ -358,5 +358,5 @@ Lean в дерево не кладётся и в проверки на пуш н **Ветка:** `r/lean-sverka` от `gh/dev` `562530116`. Проверки дерева после работы зелены: набор проб проверяющей программы — «сошлось всё»; -`scripts/доказуемость.sh` — «проверка 1 — калькулятор снят? ДА»; +`scripts/provability.fscript` — «проверка 1 — калькулятор снят? ДА»; `.githooks/pre-push` — код 0. diff --git a/docs/release-notes.json b/docs/release-notes.json index 2e2d3a629..56dc3406e 100644 --- a/docs/release-notes.json +++ b/docs/release-notes.json @@ -71,7 +71,7 @@ "ru": { "заголовок": "Компилятор доказан сам себе целиком: 650 мест из 650 переиграны независимой программой", "появилось": [ - "Впервые вердикт `sh scripts/доказуемость.sh` говорит ДОКАЗУЕМ при пороге 100 %: каждое из 650 обязательств в записях собственного доказательства компилятора независимая программа на C переиграла сама, не приняв от компилятора ни одного шага на слово. Раньше часть мест она брала на веру, и порог был ниже.", + "Впервые вердикт `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` говорит ДОКАЗУЕМ при пороге 100 %: каждое из 650 обязательств в записях собственного доказательства компилятора независимая программа на C переиграла сама, не приняв от компилятора ни одного шага на слово. Раньше часть мест она брала на веру, и порог был ниже.", "Снятие предусловия (`требует`) на месте вызова теперь печатается в запись и переигрывается: вторая доля, которая считает и предусловия, тоже 652 из 652.", "Перепечатка семени привезла в собранный компилятор правки ядра: предусловие вызова не снимается объявленным типом довода; в `требует` можно писать квантор по элементам списка; у выписанного списка, `отобразить` и применённого ярлыка появились права; ядро печатает в запись обоснование, которое раньше выбрасывало." ], @@ -90,7 +90,7 @@ "en": { "заголовок": "The compiler's own proof is fully replayed: 650 places of 650", "появилось": [ - "For the first time `sh scripts/доказуемость.sh` prints ДОКАЗУЕМ against a 100 % gate: every one of the 650 obligations in the compiler's own proof records was replayed by an independent C program, with nothing taken on the compiler's word. Before this some places were accepted on trust and the gate stood lower.", + "For the first time `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` prints ДОКАЗУЕМ against a 100 % gate: every one of the 650 obligations in the compiler's own proof records was replayed by an independent C program, with nothing taken on the compiler's word. Before this some places were accepted on trust and the gate stood lower.", "Discharging a precondition (`требует`) at a call site is now printed into the record and replayed as well: the second share, the one that counts preconditions, is 652 of 652.", "The seed reprint carried kernel fixes into the built compiler: a call's precondition is no longer discharged by the declared type of its argument; `требует` accepts a quantifier over list elements; a written-out list, `отобразить` and an applied function label gained the rights they lacked; the kernel now prints the justification it used to compute and drop." ], @@ -257,7 +257,7 @@ "появилось": [ "ГЕЙТ Г7 ЗАКРЫТ. Из чекера убран ход, который ДОКАЗЫВАЛ утверждение, вычисляя его, вместо того чтобы проигрывать записанные шаги. Убран в обеих точках: сняв его в одной, работу немедленно подхватывала вторая (дверь `половина_закрыта`, `тождественны` на глубине 6), и проверка грепом по имени печатала при этом ноль. Сторож подлога отделён от вычислителя и остался на месте. Тождество знак в знак и замкнутый счёт сохранены.", "Проверка гейта на калькулятор больше НЕ ГРЕП ПО ИМЕНИ, а прогон по живой паре исходник+запись (`flang/proof/checker/tests/records/identity-after-rewrite/p1-goal-not-an-equality`). Две ∀-цели там доказуемы только переписыванием тела законами, ходов в записи нет ни одного — честный чекер обязан оставить их на слове ядра и назвать поимённо. Ловушка ДВУСТОРОННЯЯ: третья цель закрывается тождеством знак в знак и обязана остаться закрытой, иначе проверку брал бы и чекер, сломанный до состояния «ничего не доказываю». Переименование функции обойти проверку больше не может.", - "Прибор доказуемости `sh scripts/доказуемость.sh` гоняет ЧЕТЫРЕ проверки и печатает все четыре числами, каким бы ни был исход предыдущих. Прежде он замыкался накоротко: провалилась первая — остальные не гонялись вовсе. Сторож, который не гоняется, не сторож.", + "Прибор доказуемости `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` гоняет ЧЕТЫРЕ проверки и печатает все четыре числами, каким бы ни был исход предыдущих. Прежде он замыкался накоротко: провалилась первая — остальные не гонялись вовсе. Сторож, который не гоняется, не сторож.", "Манифест набора подделок `flang/proof/forgeries/manifest.tsv` — 31 строка, класс каждой подтверждён чтением шапки исходника. Храповик `ratchet.txt` держит два числа: сколько подделок объявлено и сколько мест их честных половин проиграно. Проверка 4 краснеет, если набор ослаб. Одна подделка при сверке оказалась не того класса, каким числилась.", "Ведомость правил вывода `flang/proof/tables/inference-rules.tsv` — 71 строка в ДВУХ нотациях, логической и категорной, сверенная с кодом ядра построчно. Согласие нотаций проверяемо, а не декларативно: каждая посылка пронумерована, и категорная запись обязана назвать её место. Четыре сторожа с восемью пробами на подлог. Решение ADR-0022: факт о типе едет в записи выводом, а не именем правила и не аксиомой.", "Файл настроек `.flangrc` и выбор языка вывода (решение ADR-0024). Пары «ключ = значение», не JSON и не программа: файл читается до того, как язык готов говорить. Старшинство: довод, среда, файл проекта, файл дома, локаль, умолчание. Подъём обрывается на первой примете, поэтому дальний файл не перекрывает ближний.", @@ -284,7 +284,7 @@ "появилось": [ "GATE G7 IS CLOSED. The step that PROVED a claim by computing it, instead of replaying the recorded moves, is gone from the checker. Gone from both places: removing it from one, the work was immediately picked up by the second (the `половина_закрыта` door, `тождественны` at depth 6), while a grep-by-name check printed zero. The forgery sentinel has been separated from the prover and stays. Sign-for-sign identity and closed arithmetic are kept.", "The gate's calculator check is NO LONGER A GREP BY NAME but a run against a live source+record pair. Two of its goals are provable only by rewriting the body through laws, and the record holds no moves at all, so an honest checker must leave them on the kernel's word and name them. The trap is TWO-SIDED: a third goal closes by sign-for-sign identity and must stay closed, otherwise a checker broken down to «I prove nothing» would pass too. Renaming a function can no longer evade the check.", - "`sh scripts/доказуемость.sh` now runs FOUR checks and prints all four with numbers, whatever the earlier ones answered. It used to short-circuit. A sentinel that does not run is not a sentinel.", + "`bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` now runs FOUR checks and prints all four with numbers, whatever the earlier ones answered. It used to short-circuit. A sentinel that does not run is not a sentinel.", "A manifest of the forgery set, 31 rows, each class confirmed by reading the source header. A ratchet holds two numbers: how many forgeries are declared, and how many places of their honest halves are replayed. Check 4 goes red if the set weakens.", "A ledger of derivation rules, 71 rows in TWO notations, logical and categorical, checked against the kernel code row by row. Notation agreement is verifiable, not declared: each premise is numbered and the categorical form must name its position. Four sentinels with eight forgery probes. Decision ADR-0022: a type fact travels in the record as a DERIVATION, not as a rule name and not as an axiom.", "A settings file `.flangrc` and a choice of output language (ADR-0024). Key = value pairs, not JSON and not a program: the file is read before the language is ready to speak. Precedence: argument, environment, project file, home file, locale, default. The walk up stops at the first marker, so a distant file cannot override a near one.", @@ -1150,7 +1150,7 @@ "появилось": [ "**Переменные окружения и доводы командной строки в планах.** Поручения были в словаре языка, а рантайм отвечал на них `FLANG_IO_UNKNOWN`.\n\n```flang\nвариант «Сделать» с поручение равным (вариант «Прочитать переменную среды» с имя равным \"HOME\")\n```\n\nОтвет — `«Значение среды»` с полем `значение`, либо `«Переменной среды нет»` отдельным вариантом, а не пустой строкой. Доводы плана — всё, что стоит после `--`:\n\n```\n$ flang io script.fscript -- build --verbose\n```\n\nЗапретить: `--no-env`, `--no-args`.", "**Вывод на терминал.** `«Показать»` кладёт кадр, `«Ждать событие»` ждёт клавишу:\n\n```flang\nвариант «Сделать» с поручение равным (вариант «Показать» с место равным \"экран\" и текст равным кадр)\nвариант «Сделать» с поручение равным (вариант «Ждать событие» с срок равным 5000)\n```\n\nКлавиша приходит как `«Случилось»` с полями `откуда` и `значение`; по сроку — `«Срок вышел»`. Имена клавиш: `ввод`, `пробел`, `таб`, `возврат`, `выход`, `вверх`, `вниз`, `влево`, `вправо`; печатный знак приходит собой.\n\nРабочий пример — `docs/examples/io/progress-bar-on-screen.flang`. Кадр идёт на `/dev/tty`, а не в stdout: там итог плана в JSON. Нет терминала (труба, файл, CI) — ответ прежний, `FLANG_IO_NO_SCREEN`. Ctrl-C по-прежнему убивает программу. Запретить: `--no-screen`.", - "**`sh scripts/four-coverages.sh`** печатает четыре покрытия порознь, у каждого своя строка «чего это не значит», и рядом с числом стоят дата и коммит." + "**`bootstrap/flang io scripts/four-coverages.fscript --plan Measure --timeout 900000`** печатает четыре покрытия порознь, у каждого своя строка «чего это не значит», и рядом с числом стоят дата и коммит." ], "изменилось": [ "**Независимый сверщик перестал принимать ложное доказательство.** Две дыры: подстановка доводов шла последовательно вместо одновременной, подстановка тела не спрашивала захват имени. Ни 529 мутационных проб, ни четыре проверки дерева их не ловили.", @@ -1166,7 +1166,7 @@ "появилось": [ "**Environment variables and command-line arguments in plans.** The orders were in the language's vocabulary, but the runtime answered `FLANG_IO_UNKNOWN`.\n\n```flang\nвариант «Сделать» с поручение равным (вариант «Прочитать переменную среды» с имя равным \"HOME\")\n```\n\nThe reply is `«Значение среды»` with field `значение`, or `«Переменной среды нет»` as its own variant — not an empty string. A plan's arguments are whatever follows `--`:\n\n```\n$ flang io script.fscript -- build --verbose\n```\n\nDeny with `--no-env`, `--no-args`.", "**Terminal output.** `«Показать»` draws a frame, `«Ждать событие»` waits for a key:\n\n```flang\nвариант «Сделать» с поручение равным (вариант «Показать» с место равным \"экран\" и текст равным кадр)\nвариант «Сделать» с поручение равным (вариант «Ждать событие» с срок равным 5000)\n```\n\nA key arrives as `«Случилось»` with fields `откуда` and `значение`; a timeout as `«Срок вышел»`. Key names: `ввод`, `пробел`, `таб`, `возврат`, `выход`, `вверх`, `вниз`, `влево`, `вправо`; a printable character arrives as itself.\n\nWorking example: `docs/examples/io/progress-bar-on-screen.flang`. The frame goes to `/dev/tty`, not stdout — stdout carries the plan's JSON result. With no terminal (pipe, file, CI) the answer is the same `FLANG_IO_NO_SCREEN` as before. Ctrl-C still kills the program. Deny with `--no-screen`.", - "**`sh scripts/four-coverages.sh`** prints four coverages separately, each with its own line saying what it is not, and every number carries a date and a commit." + "**`bootstrap/flang io scripts/four-coverages.fscript --plan Measure --timeout 900000`** prints four coverages separately, each with its own line saying what it is not, and every number carries a date and a commit." ], "изменилось": [ "**The independent checker no longer accepts a false proof.** Two holes: arguments were substituted sequentially rather than simultaneously, and body substitution did not check for name capture. Neither 529 mutation probes nor four tree gates had caught them.", diff --git a/docs/releases/0.7.13.md b/docs/releases/0.7.13.md index 46e164973..9ffbfc5b3 100644 --- a/docs/releases/0.7.13.md +++ b/docs/releases/0.7.13.md @@ -65,7 +65,7 @@ `-po-sluchayam.md`, `-razbor-celi.md`, `-lemma-po-svoystvu.md`) и приём S2 в один порядок работ с зависимостями и числом того, что каждый шаг закрывает. Коммит `20c0ef2e`. -- **Ярлык `доказуемость`.** `./ярлык доказуемость` (`scripts/доказуемость.sh`) +- **Ярлык `доказуемость`.** `./ярлык доказуемость` (`scripts/provability.fscript`) печатает ОДНО слово — ДОКАЗУЕМ / НЕ ДОКАЗУЕМ — по трём числам, а не по вписанному в прозу суждению. Коммит `7b03ee3a`. @@ -145,7 +145,7 @@ $ ./ярлык доказуемость - **Прибора «доля-проигрыванием» нет.** `flang/proof/corpus-share.sh` меряет разряды помех (крипто-привязка, места «на слово ядра»), а не долю записей, реально проверенных переигрывателем — вторая проверка ярлыка `доказуемость` - сегодня заведомо 0, а не измерена. `scripts/доказуемость.sh`. + сегодня заведомо 0, а не измерена. `scripts/provability.fscript`. --- @@ -155,6 +155,6 @@ $ ./ярлык доказуемость `-po-svoystvu.md`, `-po-sluchayam.md`, `-razbor-celi.md`, `-lemma-po-svoystvu.md`, `-roadmap.md` - `docs/DESCRIPTION.md §6–8` -- `scripts/доказуемость.sh` +- `scripts/provability.fscript` - `docs/examples/frameworks/README.md` - `git log v0.7.12..gh/dev` (108 коммитов, снято 6 сентября 2026) diff --git a/docs/reprint-ledger.tsv b/docs/reprint-ledger.tsv index 6e1e121af..ff0ce1bc4 100644 --- a/docs/reprint-ledger.tsv +++ b/docs/reprint-ledger.tsv @@ -1,4 +1,4 @@ -# ЧТО: ведомость заходов побайтовой сверки и перепечатки семени — строка на заход: дата, что (сверка|печать), итог, секунд, пик-ГиБ, байт-вывода, потолок-шагов, откуда; заполняется руками после захода. ЗАЧЕМ: сверка стоит 8 ч 34 мин одного ядра и на каждый пуш в CI не зовётся; без записи следующий не узнает, что она была, и свежесть сверки останется красной при сделанной работе. КТО ЧИТАЕТ: scripts/seed/reprint-freshness.flang (дата последней строки «сверка … дошла»; строки без табуляции, как эта, пропускает); .github/workflows/reprint.yml, scripts/bootstrap-reprint.sh и scripts/seed/seed-freshness.sh называют файл человеку в подсказках. +# ЧТО: ведомость заходов побайтовой сверки и перепечатки семени — строка на заход: дата, что (сверка|печать), итог, секунд, пик-ГиБ, байт-вывода, потолок-шагов, откуда; заполняется руками после захода. ЗАЧЕМ: сверка стоит 8 ч 34 мин одного ядра и на каждый пуш в CI не зовётся; без записи следующий не узнает, что она была, и свежесть сверки останется красной при сделанной работе. КТО ЧИТАЕТ: scripts/seed/reprint-freshness.flang (дата последней строки «сверка … дошла»; строки без табуляции, как эта, пропускает); .github/workflows/reprint.yml, scripts/bootstrap-reprint.sh и scripts/seed/seed-freshness.fscript называют файл человеку в подсказках. дата что итог секунд пик-ГиБ байт-вывода потолок-шагов откуда 2026-08-22 сверка дошла 1198 25.1 26180580 1000000000 коммит 6c5d805c 2026-08-23 печать оборвана-шаги 1456 34.3 0 1000000000 /srv/work/raskrutka-polnaya.log diff --git a/docs/reprint-runs-start-from-a-clean-tree.md b/docs/reprint-runs-start-from-a-clean-tree.md index fd284358b..9c3b4d925 100644 --- a/docs/reprint-runs-start-from-a-clean-tree.md +++ b/docs/reprint-runs-start-from-a-clean-tree.md @@ -195,6 +195,6 @@ $ for f in bootstrap/compiler_flang.c bootstrap/compiler_flang.h bootstrap/flang Она не про цену перепечатки — цена в [`reprint-cost.md`](reprint-cost.md) и в [`reprint-ledger.tsv`](reprint-ledger.tsv). Не про свежесть семени — это -`scripts/seed/seed-freshness.sh` и `sh scripts/bootstrap-reprint.sh --bystro`, и они отвечают +`scripts/seed/seed-freshness.fscript` и `sh scripts/bootstrap-reprint.sh --bystro`, и они отвечают на другой вопрос: «те ли входы у печати», а не «чиста ли копия, из которой печатают». diff --git a/docs/road-to-1-0.md b/docs/road-to-1-0.md index 749d84f10..c8f317a9b 100644 --- a/docs/road-to-1-0.md +++ b/docs/road-to-1-0.md @@ -21,13 +21,13 @@ Homebrew с тем, что собрал сам конвейер выпуска; **Что значит.** Дерево печатает само себя, две печати из одного дерева дают побайтово одинаковое семя, и это проверяется прибором, а не руками. -**Что уже есть.** Прибор сверки двух печатей — `scripts/seed/two-prints-identical.sh`, +**Что уже есть.** Прибор сверки двух печатей — `scripts/seed/two-prints-identical.fscript`, написан ДО того, как увиден результат, все дороги пройдены пробой порчей. Прибор хода печати — `scripts/seed/print-progress.fscript`. **3 сентября вечером: `pechat-dev` дошла до конца — код 0, 12ч20м41с** (коммит `4312a476`, семя прошло самопроверку до того, как легло в -`bootstrap/` — «семя годное»). Пара для `two-prints-identical.sh` из этого +`bootstrap/` — «семя годное»). Пара для `two-prints-identical.fscript` из этого НЕ вышла: печать Ч352-ствола, законченная раньше тем же вечером, шла с ДРУГОГО коммита (`85c8691`) — обе печати настоящие и обе код 0, но не одна ревизия. Свежее семя (`compiler_flang.c/h`, `flang_cli.c`, `flang_runtime.c/h` @@ -37,7 +37,7 @@ Homebrew с тем, что собрал сам конвейер выпуска; (`--version`, `flang/self/parser.flang` — 846 функций, чисто). **Чего нет.** Пары «одна ревизия — две печати» по-прежнему нет нигде в -дереве — `two-prints-identical.sh` даёт код 3 «НЕ ПРОВЕРЕНО» на любой +дереве — `two-prints-identical.fscript` даёт код 3 «НЕ ПРОВЕРЕНО» на любой известной сегодня паре. И даже влитое семя не полное: печать шла с `4312a476`, а `dev` с тех пор ушёл на 66+ коммитов дальше (кеш приговоров, починка Г2/Г4, категориальный хелпер) — `bootstrap/` отражает срез @@ -48,20 +48,20 @@ Homebrew с тем, что собрал сам конвейер выпуска; (новый компилятор+рантайм, старый `flang_repl.c`) собрался и заработал, но это заплата, не чистая перепечатка. -**Как узнаем, что взято.** `two-prints-identical.sh` даёт код 0 на паре с одного +**Как узнаем, что взято.** `two-prints-identical.fscript` даёт код 0 на паре с одного коммита, и это зовётся из CI, а не руками. **4 сентября: первая настоящая пара получена.** Две независимые печати одного и того же коммита (`22d54485`), запущенные параллельно на этой же машине (`pechat-dev-2`, `pechat-dev-3`), обе дошли кодом 0. -`two-prints-identical.sh` на паре: **совпали побайтово, файлов 4, байт +`two-prints-identical.fscript` на паре: **совпали побайтово, файлов 4, байт 1 216 932.** Прибор сам называет предел находки: пара с ОДНОГО дерева (здесь — два отдельных клона, а не два прогона одного) и звана руками, не из CI — до «взято» ещё не хватает автоматического вызова из CI и, в идеале, пары внутри одного дерева. Но это первый вечер, когда пара вообще существует и сошлась, а не разошлась и не осталась недостижимой. -**11 сент:** семя перепечатано из `b6f3a4b0f` (коммит `0ce948bfd`, `sh scripts/bootstrap-reprint.sh` — код 0, «семя годное», 7 файлов, 41 564 839 байт, 7 ч 28 мин). Отставание семени после этого: `sh scripts/seed/what-lags-the-seed.sh` → 3 файла, 77 функций. +**11 сент:** семя перепечатано из `b6f3a4b0f` (коммит `0ce948bfd`, `sh scripts/bootstrap-reprint.sh` — код 0, «семя годное», 7 файлов, 41 564 839 байт, 7 ч 28 мин). Отставание семени после этого: `bootstrap/flang io scripts/seed/what-lags-the-seed.fscript --plan Report --timeout 300000` → 3 файла, 77 функций. --- @@ -102,7 +102,7 @@ Homebrew с тем, что собрал сам конвейер выпуска; (четыре). Проверяющий на C — 1724 строки кода. Отношение 2,63×. Набор из 349 проб подделками: 166 подделок, принято кодом 0 — ноль; 183 честных, отвергнуто — ноль. -**11 сент** (`sh scripts/доказуемость.sh`, коммит `2c40752d0`): вердикт **ДОКАЗУЕМ**; проб на подлог **401**, принято кодом 0 — ноль; честных **197**, отвергнуто — ноль; доля проигрыванием независимым сверщиком **625 из 651 = 96,01 %** (порог 95 %). Правил вывода в `flang/proof/tables/inference-rules.tsv` — 88, лемм к ним в `flang/proof/lean/Rules.lean` — 85 (`grep -c theorem`; `docs/lean-checks-the-inference-rules.md`). +**11 сент** (`bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000`, коммит `2c40752d0`): вердикт **ДОКАЗУЕМ**; проб на подлог **401**, принято кодом 0 — ноль; честных **197**, отвергнуто — ноль; доля проигрыванием независимым сверщиком **625 из 651 = 96,01 %** (порог 95 %). Правил вывода в `flang/proof/tables/inference-rules.tsv` — 88, лемм к ним в `flang/proof/lean/Rules.lean` — 85 (`grep -c theorem`; `docs/lean-checks-the-inference-rules.md`). **14 сент** (задача 2907, ADR-0041; `sh flang/proof/lean/run.sh`): **теорема о состоятельности есть для 29 правил из 70** приёмов `шаг_вывода` сверщика (из 13 именованных — для 11, без Цел1 и Цел2). Теорема `Принят u → Судим (окружение u) (цель u)`: принятый блок «вывод» выводит цель из допущений в модели значений `Model.lean`. Аксиомы — `propext`, `Classical.choice`, `Quot.sound`; `sorry` — ноль. Сверка вердиктов C ↔ Lean на всём наборе проб сверщика (216 честных, 459 подделок, 1291 блок «вывод»): оба приняли 275 блоков, оба отвергли 61 и ещё 11 на чтении, **расхождений 0**; 944 блока упираются в правило, которого в приёмке Lean ещё нет (задача 1130). diff --git a/docs/road-to-one-hundred-measured.md b/docs/road-to-one-hundred-measured.md index 80ed37026..108263011 100644 --- a/docs/road-to-one-hundred-measured.md +++ b/docs/road-to-one-hundred-measured.md @@ -9,7 +9,7 @@ > **Сверка 18 сентября 2026 — сто процентов взяты** (ветка `a/5190-seed-reprint-0-7-20` > над `main` `d366fc8f2`, свой сверщик собран заново `make -C flang/proof/checker`): > `sh flang/proof/corpus-share.sh --набор корпус --проигрыванием` → **650 / 650 = 100,00 %**, -> вторая доля, с предусловиями, — **652 / 652 = 100,00 %**; `sh scripts/доказуемость.sh` → +> вторая доля, с предусловиями, — **652 / 652 = 100,00 %**; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` → > **ДОКАЗУЕМ**, код 0. На слово ядра не взято ничего: «на слово ядра: посылок и утверждений 0, > шагов 0», «снято калькулятором 0». Баланс знаменателя печатается и сходится: 650 + 22 = 672, > где 22 — места четырёх записей, объявленных манифестом классом «лжёт-запись» и отвергнутых @@ -23,11 +23,11 @@ > всё» (подделок 529, принято кодом 0 — 0), манифест ловит 34 из 34, `--вложенность` — 0. > > **Сверка 17 сентября 2026** (ветка `a/3348-provability-threshold-100` над `main` -> `cbfaf3899`): порог проверки 2 в `scripts/доказуемость.sh` поднят до **100 %** — слово +> `cbfaf3899`): порог проверки 2 в `scripts/provability.fscript` поднят до **100 %** — слово > владельца (задача 3348); все сверки ниже сняты при прежнем, более низком пороге, и > «порог взят» в них читать как «взят прежний порог». Тот же прибор на том же дереве: > `sh flang/proof/corpus-share.sh --проигрыванием` → **633 / 650 = 97,38 %**, -> `sh scripts/доказуемость.sh` → **НЕ ДОКАЗУЕМ**, код 1: «проверка 2 — доля проигрыванием +> `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` → **НЕ ДОКАЗУЕМ**, код 1: «проверка 2 — доля проигрыванием > не ниже 100 %? НЕТ (97.38 %: 633 из 650; недостижимых мест вынесено 22)». Недостающие > 17 мест — те же, что в сверке 15 сентября; по ней их закрывает перепечатка 0.7.20 > (650 / 650 на дереве с печатью ядра). Лестница §4 при пороге 100 % читается так: потолок @@ -45,7 +45,7 @@ > > **Сверка 14 сентября 2026** (ветка `a/9616-share-to-one-hundred` на `main` `4a438c14`): > `sh flang/proof/corpus-share.sh --проигрыванием` → **629 / 651 = 96,62 %**, -> `sh scripts/доказуемость.sh` → **ДОКАЗУЕМ**. Не проверено 22: на слово ядра +> `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` → **ДОКАЗУЕМ**. Не проверено 22: на слово ядра > посылок и утверждений 12, шагов 4; вычислением, а не игрой, 6. Тот же прибор > на дереве, где в набор записей подложена печать ядра задачи 9616 (она ляжет > в набор перепечаткой семени), — **639 / 651 = 98,16 %**; остаток 12 = 5 + 4 + 3, @@ -61,7 +61,7 @@ > > **Сверка 11 сентября 2026** (ветка `r/sayt` от `gh/dev` `2c40752d0`): > `sh flang/proof/corpus-share.sh --проигрыванием` → числитель **625**, знаменатель -> 651, доля **96,01 %**, порог 95 % взят; `sh scripts/доказуемость.sh` → **ДОКАЗУЕМ**. +> 651, доля **96,01 %**, порог 95 % взят; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` → **ДОКАЗУЕМ**. > Не проверено 26 (на слово ядра: посылок и утверждений 16, шагов 4). Разбор > 134 мест ниже и таблица потолка в §4 — состояние 9 сентября; с тех пор закрыто > 108 из 134. diff --git a/docs/shell-to-flang-census.md b/docs/shell-to-flang-census.md index f89064b24..e1ffd74bc 100644 --- a/docs/shell-to-flang-census.md +++ b/docs/shell-to-flang-census.md @@ -23,8 +23,8 @@ CI на английский, и обычное перебазирование `*.sh` стало на один больше (93 → 94): прибавка вне `scripts/`. Между двумя замерами в `scripts/` ПРИБАВИЛОСЬ два скрипта, которых в первой -переписи нет вовсе: `scripts/four-coverages.sh` (165 строк) и -`scripts/report-provenance.sh` (133 строки). Долг оболочки растёт, пока его +переписи нет вовсе: `scripts/four-coverages.fscript` (165 строк) и +`scripts/report-provenance.fscript` (133 строки). Долг оболочки растёт, пока его переписывают, и перепись, снятая один раз, устаревает за двое суток. ## Что хозяин умеет теперь — замер прогоном, а не память @@ -117,7 +117,7 @@ done ### Шестая граница — цена, а не умение -`scripts/seed/what-lags-the-seed.sh` (112 строк) переносится по умению и не +`scripts/seed/what-lags-the-seed.fscript` (112 строк) переносится по умению и не переносится по цене, и цена ЗАМЕРЕНА, а не прикинута: | что | число | @@ -159,7 +159,7 @@ done |---|---:|---| | `scripts/guards/guards-without-forgery-probe.sh` | 323 | разборщик YAML (`pyyaml`); подстрочный счёт уже давал ложные записи | | `scripts/guards/who-calls-the-guards.sh` | 269 | то же: ключ `run:` берётся разбором YAML, подстрочный счёт давал 115 ярлыков вместо 111 | -| `scripts/seed/seed-runtime-is-source.sh` | 80 | `diff` считает по наибольшей общей подпоследовательности; построчное сличение даст ДРУГОЕ число | +| `scripts/seed/seed-runtime-is-source.fscript` | 80 | `diff` считает по наибольшей общей подпоследовательности; построчное сличение даст ДРУГОЕ число | | `scripts/guards/seed-knows-type-words-guard.sh` | 311 | ПОРОЖДАЕТ программу на awk и гоняет её лексером по сотням файлов; mawk против gawk дал 30 ложных находок — это мера, а не счёт | | `scripts/targets/target-collisions.sh` | 248 | `jq` и awk-программа построения дерева | | `scripts/targets/identical-declarations.sh` | 82 | `jq` с `walk`/`del(.span)` и ввоз замыкания из node-библиотеки | @@ -187,13 +187,13 @@ done | файл | строк | что судит | |---|---:|---| -| `scripts/seed/binary-origin.sh` | 334 | происхождение двоичного, пересборка (cc) | +| `scripts/seed/binary-origin.fscript` | 334 | происхождение двоичного, пересборка (cc) | | `scripts/guards/overlong-string-guard.sh` | 327 | печать принимает то, что печатает | -| `scripts/seed/print-is-repeatable.sh` | 193 | две печати одного дерева совпадают | -| `scripts/seed/new-binary-acceptance.sh` | 152 | приёмка нового двоичного | -| `scripts/seed/two-prints-identical.sh` | 148 | две печати побайтово | +| `scripts/seed/print-is-repeatable.fscript` | 193 | две печати одного дерева совпадают | +| `scripts/seed/new-binary-acceptance.fscript` | 152 | приёмка нового двоичного | +| `scripts/seed/two-prints-identical.fscript` | 148 | две печати побайтово | | `scripts/seed/seed-freshness.sh` | 115 | не отстало ли семя; зовётся из `ярлык` ДО всякого плана | -| `scripts/report-provenance.sh` | 133 | шапка провенанса: обязана печатать «двоичного НЕТ В ДЕРЕВЕ» — прибор, которому для этого нужен двоичный, теряет ровно тот случай, ради которого заведён | +| `scripts/report-provenance.fscript` | 133 | шапка провенанса: обязана печатать «двоичного НЕТ В ДЕРЕВЕ» — прибор, которому для этого нужен двоичный, теряет ровно тот случай, ради которого заведён | ### Собирает сам двоичный (cc, make) — 5 @@ -203,7 +203,7 @@ done | `scripts/seed/seed-refresh.sh` | 228 | | `scripts/guards/seed-parses-sources-guard.sh` | 220 | | `scripts/bootstrap-c.sh` | 206 | -| `scripts/seed/build-ledger-binary.sh` | 102 | +| `scripts/seed/build-ledger-binary.fscript` | 102 | Вопрос владельца — «с хера ли предыдущие версии flang не могут выполнить скрипт для сборки новой версии flang» — бьёт сюда. Ответ честный: МОГУТ по языку и НЕ @@ -246,14 +246,14 @@ done | файл | строк | почему | |---|---:|---| -| `scripts/четыре-покрытия` → `scripts/four-coverages.sh` | 165 | зовёт четыре чужих скрипта через `$(… 2>&1)`, 7 awk-программ; и обязан отвечать кодом 2 «нет двоичного» | -| `scripts/доказуемость.sh` | 342 | гейт: пять `2>&1`, семь awk, `cc`, `exit "$kod"` | +| `scripts/четыре-покрытия` → `scripts/four-coverages.fscript` | 165 | зовёт четыре чужих скрипта через `$(… 2>&1)`, 7 awk-программ; и обязан отвечать кодом 2 «нет двоичного» | +| `scripts/provability.fscript` | 342 | гейт: пять `2>&1`, семь awk, `cc`, `exit "$kod"` | ### Переносится по умению, но не по цене — 1 | файл | строк | цена | |---|---:|---| -| `scripts/seed/what-lags-the-seed.sh` | 112 | 0,6 с на python против десятков секунд только на сбор имён семени; замер выше | +| `scripts/seed/what-lags-the-seed.fscript` | 112 | 0,6 с на python против десятков секунд только на сбор имён семени; замер выше | ### Прочее — 3 @@ -296,7 +296,7 @@ done 4. **Решение звать в хуке и в CI прежний выпущенный `flang`** — 5 файлов; это не правка скриптов, а одна строка в хуке и одна в работах CI. 5. **Набор с постоянным временем поиска в библиотеке языка** — 1 файл - (`what-lags-the-seed.sh`), и он же снимает цену со всякого будущего прибора, + (`what-lags-the-seed.fscript`), и он же снимает цену со всякого будущего прибора, который сличает два больших списка имён. Двух поручений у хозяина мало: их хватило на 4 файла из 43, а не на 19. diff --git a/docs/site/index.md b/docs/site/index.md index 1e55d1895..a65d27e04 100644 --- a/docs/site/index.md +++ b/docs/site/index.md @@ -89,7 +89,7 @@ are on the [Install](install.html) page. ## What backs that up -`sh scripts/доказуемость.sh` on trunk, 19 September 2026 (commit `a5609e322`), +`bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` on trunk, 19 September 2026 (commit `a5609e322`), about three minutes: ``` @@ -106,7 +106,7 @@ checker itself; 533 forged proofs were rejected, 245 honest ones accepted. share of places in the compiler's **own** proof records, and it says nothing about the emitted code. There are four coverages in all, and the other three are lower: inference rules formalised in Lean, an open list of known soundness -violations, and the translation check for C. `sh scripts/four-coverages.sh` +violations, and the translation check for C. `bootstrap/flang io scripts/four-coverages.fscript --plan Measure --timeout 900000` prints all four side by side with a date and a commit; what each one is *not* is spelled out on [what is proved and what is not](what-is-proved.html). diff --git a/docs/site/index.ru.md b/docs/site/index.ru.md index cba82a9b7..bc6d0839a 100644 --- a/docs/site/index.ru.md +++ b/docs/site/index.ru.md @@ -88,7 +88,7 @@ flang --version ## Чем это подтверждено -Прогон `sh scripts/доказуемость.sh` на стволе 19 сентября 2026 (коммит +Прогон `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` на стволе 19 сентября 2026 (коммит `a5609e322`), около трёх минут: ``` @@ -108,7 +108,7 @@ flang --version говорит ничего. Покрытий всего четыре, и три остальных ниже: правила вывода, формализованные в Lean; открытый список известных нарушений состоятельности; сверка перевода в C. Все четыре печатает рядом, с датой и коммитом, -`sh scripts/four-coverages.sh`; чего не значит каждое — на странице +`bootstrap/flang io scripts/four-coverages.fscript --plan Measure --timeout 900000`; чего не значит каждое — на странице [Что доказано, а что нет](what-is-proved.html). По дереву языка: {{корпус.тотальных}} функций из {{корпус.функций}} завершаются diff --git a/docs/site/proofs.md b/docs/site/proofs.md index 72602eae1..439e02aa9 100644 --- a/docs/site/proofs.md +++ b/docs/site/proofs.md @@ -101,7 +101,7 @@ expects a different code and counts the forgery as unchecked. What is confirmed by another instrument: the proof the compiler prints (`flang check --proof --записать`) is replayed by an independent C program — -`flang/proof/checker/checker.c`. `sh scripts/доказуемость.sh` on 19 September 2026 +`flang/proof/checker/checker.c`. `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` on 19 September 2026 on trunk (commit `a5609e322`): PROVABLE, 650 obligations out of 650 replayed (100.00 %), 533 forgery probes rejected, 245 honest records accepted; all 109 inference rules accepted by the Lean 4 kernel, 0 verdict divergences. The hundred diff --git a/docs/site/proofs.ru.md b/docs/site/proofs.ru.md index 966783698..10becbf83 100644 --- a/docs/site/proofs.ru.md +++ b/docs/site/proofs.ru.md @@ -102,7 +102,7 @@ flang io flang/scripts/kernel-forgeries.fscript --plan 'Аксиом ноль' Что подтверждено другим прибором: само доказательство, которое печатает компилятор (`flang check --proof --записать`), переигрывает независимая программа -на C — `flang/proof/checker/checker.c`. `sh scripts/доказуемость.sh` 19 сентября +на C — `flang/proof/checker/checker.c`. `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` 19 сентября 2026 на стволе (коммит `a5609e322`): ДОКАЗУЕМ, переиграно 650 обязательств из 650 (100,00 %), 533 пробы на подлог отвергнуты, 245 честных приняты; все 109 правил вывода приняты ядром Lean 4, расхождений вердиктов 0. Сто процентов diff --git a/docs/site/releases.md b/docs/site/releases.md index 6e2336d6b..1bdfb1f24 100644 --- a/docs/site/releases.md +++ b/docs/site/releases.md @@ -118,7 +118,7 @@ The entries below are about the language, not about the work on it. What has lan - GATE G7 IS CLOSED. The step that PROVED a claim by computing it, instead of replaying the recorded moves, is gone from the checker. Gone from both places: removing it from one, the work was immediately picked up by the second (the `половина_закрыта` door, `тождественны` at depth 6), while a grep-by-name check printed zero. The forgery sentinel has been separated from the prover and stays. Sign-for-sign identity and closed arithmetic are kept. - The gate's calculator check is NO LONGER A GREP BY NAME but a run against a live source+record pair. Two of its goals are provable only by rewriting the body through laws, and the record holds no moves at all, so an honest checker must leave them on the kernel's word and name them. The trap is TWO-SIDED: a third goal closes by sign-for-sign identity and must stay closed, otherwise a checker broken down to «I prove nothing» would pass too. Renaming a function can no longer evade the check. -- `sh scripts/доказуемость.sh` now runs FOUR checks and prints all four with numbers, whatever the earlier ones answered. It used to short-circuit. A sentinel that does not run is not a sentinel. +- `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` now runs FOUR checks and prints all four with numbers, whatever the earlier ones answered. It used to short-circuit. A sentinel that does not run is not a sentinel. - A manifest of the forgery set, 31 rows, each class confirmed by reading the source header. A ratchet holds two numbers: how many forgeries are declared, and how many places of their honest halves are replayed. Check 4 goes red if the set weakens. - A ledger of derivation rules, 71 rows in TWO notations, logical and categorical, checked against the kernel code row by row. Notation agreement is verifiable, not declared: each premise is numbered and the categorical form must name its position. Four sentinels with eight forgery probes. Decision ADR-0022: a type fact travels in the record as a DERIVATION, not as a rule name and not as an axiom. - A settings file `.flangrc` and a choice of output language (ADR-0024). Key = value pairs, not JSON and not a program: the file is read before the language is ready to speak. Precedence: argument, environment, project file, home file, locale, default. The walk up stops at the first marker, so a distant file cannot override a near one. diff --git a/docs/site/releases.ru.md b/docs/site/releases.ru.md index a66709c9d..e7d191650 100644 --- a/docs/site/releases.ru.md +++ b/docs/site/releases.ru.md @@ -118,7 +118,7 @@ - ГЕЙТ Г7 ЗАКРЫТ. Из чекера убран ход, который ДОКАЗЫВАЛ утверждение, вычисляя его, вместо того чтобы проигрывать записанные шаги. Убран в обеих точках: сняв его в одной, работу немедленно подхватывала вторая (дверь `половина_закрыта`, `тождественны` на глубине 6), и проверка грепом по имени печатала при этом ноль. Сторож подлога отделён от вычислителя и остался на месте. Тождество знак в знак и замкнутый счёт сохранены. - Проверка гейта на калькулятор больше НЕ ГРЕП ПО ИМЕНИ, а прогон по живой паре исходник+запись (`flang/proof/checker/tests/records/identity-after-rewrite/p1-goal-not-an-equality`). Две ∀-цели там доказуемы только переписыванием тела законами, ходов в записи нет ни одного — честный чекер обязан оставить их на слове ядра и назвать поимённо. Ловушка ДВУСТОРОННЯЯ: третья цель закрывается тождеством знак в знак и обязана остаться закрытой, иначе проверку брал бы и чекер, сломанный до состояния «ничего не доказываю». Переименование функции обойти проверку больше не может. -- Прибор доказуемости `sh scripts/доказуемость.sh` гоняет ЧЕТЫРЕ проверки и печатает все четыре числами, каким бы ни был исход предыдущих. Прежде он замыкался накоротко: провалилась первая — остальные не гонялись вовсе. Сторож, который не гоняется, не сторож. +- Прибор доказуемости `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` гоняет ЧЕТЫРЕ проверки и печатает все четыре числами, каким бы ни был исход предыдущих. Прежде он замыкался накоротко: провалилась первая — остальные не гонялись вовсе. Сторож, который не гоняется, не сторож. - Манифест набора подделок `flang/proof/forgeries/manifest.tsv` — 31 строка, класс каждой подтверждён чтением шапки исходника. Храповик `ratchet.txt` держит два числа: сколько подделок объявлено и сколько мест их честных половин проиграно. Проверка 4 краснеет, если набор ослаб. Одна подделка при сверке оказалась не того класса, каким числилась. - Ведомость правил вывода `flang/proof/tables/inference-rules.tsv` — 71 строка в ДВУХ нотациях, логической и категорной, сверенная с кодом ядра построчно. Согласие нотаций проверяемо, а не декларативно: каждая посылка пронумерована, и категорная запись обязана назвать её место. Четыре сторожа с восемью пробами на подлог. Решение ADR-0022: факт о типе едет в записи выводом, а не именем правила и не аксиомой. - Файл настроек `.flangrc` и выбор языка вывода (решение ADR-0024). Пары «ключ = значение», не JSON и не программа: файл читается до того, как язык готов говорить. Старшинство: довод, среда, файл проекта, файл дома, локаль, умолчание. Подъём обрывается на первой примете, поэтому дальний файл не перекрывает ближний. diff --git a/docs/site/roadmap.md b/docs/site/roadmap.md index 99efab190..62975d705 100644 --- a/docs/site/roadmap.md +++ b/docs/site/roadmap.md @@ -29,9 +29,9 @@ that had fallen behind the sources. What was checked on the tree of 11 September 2026 (0.7.17, commit `2c40752d0`): - the bootstrap seed was reprinted on 10–11 September (commit `0ce948bfd`); - `sh scripts/seed/what-lags-the-seed.sh` names 3 files, 77 functions, still + `bootstrap/flang io scripts/seed/what-lags-the-seed.fscript --plan Report --timeout 300000` names 3 files, 77 functions, still behind; -- `sh scripts/доказуемость.sh` answers **PROVABLE**: the independent checker +- `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` answers **PROVABLE**: the independent checker (`flang/proof/checker/checker.c`) replayed 650 obligations of the compiler's own proof out of 650 — 100.00 %; 533 forgeries rejected, 245 honest records accepted (19 September 2026, commit `a5609e322`); diff --git a/docs/site/roadmap.ru.md b/docs/site/roadmap.ru.md index 05957a4fe..c76b9f396 100644 --- a/docs/site/roadmap.ru.md +++ b/docs/site/roadmap.ru.md @@ -27,8 +27,8 @@ дереве 11 сентября 2026 (0.7.17, коммит `2c40752d0`): - семя точки раскрутки перепечатано 10–11 сентября (коммит `0ce948bfd`); - `sh scripts/seed/what-lags-the-seed.sh` называет 3 отставших файла, 77 функций; -- `sh scripts/доказуемость.sh` отвечает **ДОКАЗУЕМ**: независимый сверщик + `bootstrap/flang io scripts/seed/what-lags-the-seed.fscript --plan Report --timeout 300000` называет 3 отставших файла, 77 функций; +- `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` отвечает **ДОКАЗУЕМ**: независимый сверщик (`flang/proof/checker/checker.c`) переиграл 650 обязательств собственного доказательства компилятора из 650 — 100,00 %; 533 подделки отвергнуты, 245 честных записей приняты (19 сентября 2026, коммит `a5609e322`); diff --git a/docs/site/site-numbers.mjs b/docs/site/site-numbers.mjs index 5914b5b97..94e7e234b 100644 --- a/docs/site/site-numbers.mjs +++ b/docs/site/site-numbers.mjs @@ -252,7 +252,7 @@ function происхождениеЗамера() { " законы.наВеру, носители.*, сторож.*, словарь.*", "чем ограничены дорогие": "Сняты двоичным, собранным из семени. Пока семя отстало от исходников компилятора" + - " (sh scripts/seed/seed-freshness.sh), приговоры относятся к правилам, которых в дереве уже нет." + + " (bootstrap/flang io scripts/seed/seed-freshness.fscript --plan Check --timeout 300000), приговоры относятся к правилам, которых в дереве уже нет." + " Возраст этих ключей меряется числом: sh scripts/guards/published-vs-tree.sh --числа печатает," + " сколько файлов .flang сдвинулось с записанного здесь коммита.", } diff --git a/docs/site/what-is-proved.md b/docs/site/what-is-proved.md index 6c1750e6f..de0bc7df0 100644 --- a/docs/site/what-is-proved.md +++ b/docs/site/what-is-proved.md @@ -20,7 +20,7 @@ flang check --proof --json > > On the day of measurement the compiler was built from a seed that had fallen > behind the sources; the seed has since been reprinted (10–11 September 2026, -> commit `0ce948bfd`; `sh scripts/seed/what-lags-the-seed.sh` on 11 September +> commit `0ce948bfd`; `bootstrap/flang io scripts/seed/what-lags-the-seed.fscript --plan Report --timeout 300000` on 11 September > names 3 files, 77 functions, still behind). The expensive numbers have not been > re-measured yet; the same `published-vs-tree.sh --числа` prints how many > `.flang` files have moved since `252606e8`. @@ -130,7 +130,7 @@ The word "proved" in the compiler's report need not be taken on trust. `flang check --proof --записать ` writes the proof itself to a file, and a separate C program — `flang/proof/checker/checker.c`, which has never seen the compiler — takes the source and the record and replays every step anew. The run -`sh scripts/доказуемость.sh` on 19 September 2026 on trunk (commit +`bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` on 19 September 2026 on trunk (commit `a5609e322`, about three minutes) answers **PROVABLE** and prints four checks as numbers: **650 obligations out of 650 replayed (100.00 %)**, with 27 unreachable places carved out; forgery set 36 of 36; 533 forgery probes, none accepted with diff --git a/docs/site/what-is-proved.ru.md b/docs/site/what-is-proved.ru.md index 8c713cec7..ccf1616ba 100644 --- a/docs/site/what-is-proved.ru.md +++ b/docs/site/what-is-proved.ru.md @@ -20,7 +20,7 @@ flang check <файл> --proof --json > > На день съёмки компилятор был собран из семени, отставшего от исходников; семя > с тех пор перепечатано (10–11 сентября 2026, коммит `0ce948bfd`; `sh -> scripts/seed/what-lags-the-seed.sh` 11 сентября называет 3 отставших файла, 77 +> scripts/seed/what-lags-the-seed.fscript` 11 сентября называет 3 отставших файла, 77 > функций). Пересъёмка дорогих чисел ещё не сделана; та же команда > `published-vs-tree.sh --числа` печатает, сколько файлов `.flang` сдвинулось с > `252606e8`. @@ -128,7 +128,7 @@ flang io flang/scripts/kernel-forgeries.fscript --plan 'Аксиом ноль' --proof --записать <файл>` кладёт само доказательство в файл, а отдельная программа на C — `flang/proof/checker/checker.c`, — которая компилятора не видела, берёт исходник и запись и переигрывает каждый ход заново. Прогон -`sh scripts/доказуемость.sh` 19 сентября 2026 на стволе (коммит +`bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` 19 сентября 2026 на стволе (коммит `a5609e322`, около трёх минут) отвечает **ДОКАЗУЕМ** и печатает четыре проверки числами: переиграно **650 обязательств из 650 (100,00 %)**, недостижимых мест вынесено 27; набор подделок 36 из 36; проб на подлог 533, ни одна не принята diff --git a/docs/tasks/0049-the-last-javascript-leaves-the-tree.md b/docs/tasks/0049-the-last-javascript-leaves-the-tree.md index ecfdbd513..afdbe666a 100644 --- a/docs/tasks/0049-the-last-javascript-leaves-the-tree.md +++ b/docs/tasks/0049-the-last-javascript-leaves-the-tree.md @@ -395,7 +395,7 @@ Node за 0,4 с: «правило видимости не знает путей | 8б | журнал изменений печатает и сверяет flang: ярлыки `журнал` и `журнал:проверка` зовут `scripts/site/build-changelog.fscript`; шапка журнала называет эту команду; `pages.yml` следит за `.flang`-файлами журнала; комментарии `ci.yml`/`release.yml` названы заново | печать двойника — код 0, 324 с, 0,7 ГиБ; сверка «Журнал не отстал» — код 0, 345 с, 1,0 ГиБ. `node scripts/site/build-changelog.mjs` на том же дереве печатает то же, кроме четырёх строк шапки (старая команда) и поля `unclassified` в `changelog.json` — Node не знает корней `.flangrc` и `flangtutor`, и его `--check` поэтому код 1. Прежний `--self-test` — `flang test` обоих файлов: 160 из 160 (4,2 с) и 172 из 172 (3,6 с); `flang io` примеров плана не гоняет (проба: план с ложным примером — код 0), поэтому тесты стоят в ярлыке `журнал:проверка` отдельной командой. Фальсификатор: из `CHANGELOG.md` вынута строка последнего коммита — сверка двойника код 1, `FLANG_ZHURNAL_OTSTAL` «журнал разошёлся с историей репозитория» (360 с, 1,5 ГиБ), `--check` у Node код 1 с той же причиной; журнал откачен байт в байт. `build-changelog.mjs` остаётся: его `решение` и `словоПравок` ввозит `build-changelog-page.mjs` | | 11 | снят `flang/scripts/target-words.mjs` (383): ярлык `слова:проверка` зовёт двойник `flang/scripts/target-words.fscript` (ячейка T, 1017 строк); `kernel-forgeries.fscript` (правило и пример, постусловие длины 107 → 109), шапка фикстуры `poddelka-slova-celey.flang`, `docs/why-javascript-remains.md` и ведомость перечней (`target-words.mjs:252` → `target-words.fscript:34`) названы заново | работник T на `4b8dbf338`: `.mjs` и двойник — код 1, одна находка «подделка: cpp — НАПЕЧАТАННОЕ НЕ СОБИРАЕТСЯ», 51 строка против 51, расходится 0; 56 с/0,27 ГиБ против 100 с/1,6 ГиБ; программы по спискам занятых слов девяти целей совпали байт в байт. Фальсификатор T: обёртка двоичного через `FLANG_BINARY` снимает экранирование `func` у печати Go — оба код 1, те же три находки (cpp + две по go), 62 строки против 62; дерево и двоичный после отката те же по sha256. На дереве ветки после сноса: `./ярлык слова:проверка` — код 1, та же находка cpp, 103 с, 1,5 ГиБ; `flang check kernel-forgeries.fscript` — замечаний нет, 103 функции с доказанным завершением; примеров 106 из 106; `ярлыки.flang` 34 из 34, «Целость» — код 0; перепись перечней: новых 24 → 23, мёртвых 19 → 19. Не перенесены режимы `--cel=` и `--tolko-poddelka`: доводов у `flang io` нет, и их не зовёт ни ярлык, ни CI, ни скрипт (греп) | | 12 | снят `flang/scripts/claim-guard.mjs` (444): ярлык `утверждения:проверка` зовёт двойник `flang/scripts/claim-guard.fscript` (ячейка K, 1806 строк, 136 функций, у всех завершение доказано); запись «Место» в `scripts/guards/file-extensions.fscript` смотрит в двойник (в нём тот же список расширений); мёртвая строка ведомости перечней `claim-guard.mjs:39` снята; `docs/why-javascript-remains.md` назван заново | работник K на `4b8dbf338`: `.mjs` и двойник — код 1, те же 3 устаревших утверждения («символ по коду»: `docs/ct/spec.md:1073`, `flang/self/parser.flang:6342`, `docs/tasks/completed/1389-…:202`), текст отказа совпал знак в знак (1628 знаков); 1,26 с/113 МиБ против 485 с/1,74 ГиБ; кандидаты до вопроса лексеру — 38 строк у обоих; 4462 фразы против регулярок JavaScript — расхождений 0. Фальсификатор: в `docs/guide/limits.ru.md` подложена ложь «Формы «код символа» в языке нет.» — оба код 1, 4 находки, вывод совпал (1752 знака); правда «Формы «мурзилка» в языке нет.» не поймана ни одним; страница откачена (sha256 `32ca8001…`). Замена `\p{L}` таблицей диапазонов: буквы тайской и деванагари после «нет» читаются иначе — в дереве таких мест 0. На дереве ветки после сноса: `./ярлык утверждения:проверка` — код 1, те же 3 находки, 489 с, 1,7 ГиБ; `file-extensions` — код 0 (26 мест отбора); `ярлыки.flang` 34 из 34, «Целость» 0; перепись перечней новых 23, мёртвых 19 | -| — | ссылки после ячеек 11–12: снятые имена в описи 0049, в задачах 1722 и 6858, в `docs/ROADMAP.md` и двух страницах дорожной карты сайта внесены в `link-guard-known-not-a-path.tsv` как история (так же, как в волне 1); строка-исключение `CHANGELOG.md → flang/test/changelog.test.mjs` снята — её цель ушла из шапки журнала с ячейкой 8б | проверка ссылок до правки: код 1, битых 14 из 6115 (11 — эти снятые имена), устаревших исключений 1; после: код 1, битых 2 из 6119, устаревших 0 (448 с). Остались две битые, которых этот стек не заводил: `docs/design/proof-object-blok-vyvoda.md` (была на dev) и ссылка задачи 1000 на скрипт сверки записи с источником, которого в дереве нет (пришла коммитом `3901cd805`). Проверка подделок ядра (`подделки:проверка`) на ветке отказывает кодом 3 «семя сверить не удалось» — так же на gh/dev `6d1f919c1`; с `SEMYA_OTSTALO_ZNAYU=1` на `ac723eaf1`, `652ea3dc3` и `5359922e2` — одни и те же 20 нарушений строка в строку, то есть ячейки 10–12 её не сдвигают | +| — | ссылки после ячеек 11–12: снятые имена в описи 0049, в задачах 1722 и 6858, в `docs/ROADMAP.md` и двух страницах дорожной карты сайта внесены в `link-guard-known-not-a-path.tsv` как история (так же, как в волне 1); строка-исключение `CHANGELOG.md → flang/test/changelog.test.mjs` снята — её цель ушла из шапки журнала с ячейкой 8б | проверка ссылок до правки: код 1, битых 14 из 6115 (11 — эти снятые имена), устаревших исключений 1; после: код 1, битых 2 из 6119, устаревших 0 (448 с). Остались две битые, которых этот стек не заводил: `docs/design/proof-object-blok-vyvoda.md` (была на dev) и ссылка задачи 1000 на скрипт сверки записи с источником, которого в дереве нет (пришла коммитом `3901cd805`). Проверка подделок ядра (`подделки:проверка`) на ветке отказывает кодом 3 «семя сверить не удалось» — так же на gh/dev `6d1f919c1`; с `FLANG_SEED_LAG_KNOWN=1` на `ac723eaf1`, `652ea3dc3` и `5359922e2` — одни и те же 20 нарушений строка в строку, то есть ячейки 10–12 её не сдвигают | | 13 | ярлыки `слово:проверка`, `слово:подлог` и шаги `binary.yml` (работы `build` и `guards-selftest`) зовут двойник `flang/scripts/word-guard.fscript` (ячейка W: полный ответ, планы «Подлог слов» и шести порч); `word-guard.mjs` НЕ снят — его `СЛОВАРЬ`, `говоритДоказано`, `пустота`, `словоСтроки` ввозит `proof-ledger.mjs` | работник W на `4b8dbf338`: текст ответа двойника совпал с `.mjs` байт в байт во всех восьми режимах (проверка: код 0/0, 0,82 с против 117 с, 2,2 ГиБ; подлог: код 0/0, 4,5 с против 210 с, 3,3 ГиБ; шесть порч — текст тот же, код у `.mjs` 2 «поймана», у двойника 0: план не может вернуть 2, по контракту `flang io` это «кривой вызов»; отдельные порчи никто не зовёт). Фальсификатор: в фикстуре цель ослаблена «равен 4» → «не меньше 0» — оба код 1, те же две находки; откат по sha256 `518d7b87…`. Изъян `.mjs` повторён нарочно и закреплён примером: `\b` в `/доказан[оы]\b/u` не видит границы после кириллицы — правило о «доказано» у сетки мёртвое. `--perepis` не перенесён: его образцы живут только в `count-guard.mjs`, и его никто не зовёт. Ярлыки из корня отвечают кодом 3 «семя сверить не удалось» — тот же отказ, что у `подделки:проверка` и на gh/dev; шаги CI зовут двоичный напрямую, мимо этой заслонки. Команды шагов CI из корня дерева ветки: «Сторож слов» — код 0, «нарушений 0; проверено файлов 1, утверждений 4», 113 с, 2,2 ГиБ; «Подлог слов» — код 0, «чисто молчит, 6 порч(и) пойманы», 209 с, 3,3 ГиБ — обе под пятиминутной границей пуша, память в пределе раннера (16 ГиБ, хранилище публичное) | | 14 | снят `flang/scripts/discriminating-search.mjs` (583): ярлык `поиск:различающий` и шаг работы `corpus-examples` в `binary.yml` (только тег и кнопка, предел 180 мин) зовут двойник `flang/scripts/discriminating-search.fscript` (ячейка D: все восемь семейств утверждений, пробы заглушкой, планы подробный и с подлогом); комментарий шага переписан замером | работник D на `90b02a615`: `.mjs` и двойник — код 0, те же 454 утверждения, 8156 входов, 2146 прогонов, 108 доказано, расхождений 0; 108 из 108 доказанных совпали поимённо, 79 строк итогов и 313 отказов — тоже; 455 порождённых программ побайтно те же. Прежний двойник печатал «проб запущено 0»: счётчик под этим именем складывал метки, а не запуски, и шёл по 57 утверждениям из 454. Фальсификатор: обёртка двоичного отвечает «доказано» ровно на «Тождество» + «результат не меньше 0» — оба код 1 с одной и той же строкой «ДЫРА: … нарушено на: минус единица, не число, минус бесконечность»; двоичный после отката тот же по sha256. Цена: 53 с у `.mjs` (16 потоков) против 16–17 мин у двойника (пробы по одной), 1,0–1,3 ГиБ. Временный каталог двойник заводит вне дерева (`mktemp -d`) — беда задачи 1722 у него не повторяется. Попутно измерено D: хозяин `flang io` не освобождает память между шагами плана — каждый шаг стоит примерно размер состояния плана (в состоянии 454 случая — прогоны до 37,6 ГиБ; только текущий случай и итоги — 1,0–1,3 ГиБ). На дереве ветки после сноса командой шага CI: код 0, те же 454 / 8156 / 2146 / 108 / расхождений 0 и та же таблица вердиктов, 950 с, 1,07 ГиБ; ссылки — битых 8 → 2 из 6127 (шесть упоминаний снятого имени в задачах 0049, 1722, 6858, 7203, 9614 внесены историей), устаревших 0; `ярлыки.flang` 34 из 34, «Целость» 0 | diff --git a/docs/tasks/1186-a-module-gets-its-english-name-from-the-author.md b/docs/tasks/1186-a-module-gets-its-english-name-from-the-author.md index 4e17e1655..ff64b6d9d 100644 --- a/docs/tasks/1186-a-module-gets-its-english-name-from-the-author.md +++ b/docs/tasks/1186-a-module-gets-its-english-name-from-the-author.md @@ -30,7 +30,7 @@ ## Ограничение, которое нельзя нарушить до конца перепечатки **Цель `c` не трогать.** Примета 1 приёмки нового двоичного вкопала в себя -нынешний вид имени — `scripts/seed/new-binary-acceptance.sh:110`, снято 29 августа +нынешний вид имени — `scripts/seed/new-binary-acceptance.fscript:110`, снято 29 августа 2026: ```sh @@ -121,7 +121,7 @@ IMENA=$(nm -a "$DVOICHNYY" 2>/dev/null | grep -o 'compiler_flang_[a-z_]*konkuren ## Ограничение, которое нельзя нарушить до конца перепечатки **Цель `c` не трогать.** Примета 1 приёмки нового двоичного вкопала в себя -нынешний вид имени — `scripts/seed/new-binary-acceptance.sh:110`, проверено +нынешний вид имени — `scripts/seed/new-binary-acceptance.fscript:110`, проверено 29 августа, строка на месте: ```sh diff --git a/docs/tasks/1219-comments-in-shell-scripts-fall-below-a-fifth.md b/docs/tasks/1219-comments-in-shell-scripts-fall-below-a-fifth.md index 9410982db..23186ea47 100644 --- a/docs/tasks/1219-comments-in-shell-scripts-fall-below-a-fifth.md +++ b/docs/tasks/1219-comments-in-shell-scripts-fall-below-a-fifth.md @@ -69,7 +69,7 @@ for f in <12 файлов>; do cat "$f"; done | awk '/^[[:space:]]*#/{c++} {t++} Пересняты числа строк в `docs/tree-inventory.md` (пять примет «строк <файл>», строка оболочки 23 803 / долг 15 440, суммы 3 973 и 661) и примета `строк-в *.sh = 23161` в `.github/workflows/binary.yml`; в `scripts/ledgers/hand-written-lists-ledger.tsv` -сдвинуты четыре номера строк и снята одна отжившая запись (`two-prints-identical.sh:76`). +сдвинуты четыре номера строк и снята одна отжившая запись (`two-prints-identical.fscript:76`). Шестнадцать новых заметок подняли число файлов `docs/zettel/*.md` с 678 до 694, поэтому примета в `docs/course/README.md:172` переснята вместе с числом в прозе: @@ -126,7 +126,7 @@ make -C bootstrap | `./ярлык сколько-верим` (потолок Г3) | минуты, нужен `--max-steps 2e9` | | сборка `bootstrap/flang` | 2 минуты на этой машине, 5–6 на раннере | | десять проверок дороже 200 с | перечень — `scripts/guards/who-calls-the-guards.sh` | -| `scripts/seed/what-lags-the-seed.sh` | краснеть не умеет, это отчёт, а не проверка | +| `scripts/seed/what-lags-the-seed.fscript` | краснеть не умеет, это отчёт, а не проверка | | план «Целость» из `./ярлык ярлыки` | 23 с; её предмет зелен с 15 сентября | ### Когда обход `git push --no-verify` законен @@ -145,7 +145,7 @@ make -C bootstrap | № | имя в отчёте | прежнее имя | вызов | на чём написана | |---:|---|---|---|---| | 1 | `prose-numbers-guard` | proza | `sh scripts/guards/prose-numbers-guard.sh` | оболочка | -| 2 | `seed-runtime-is-source` | semya | `sh scripts/seed/seed-runtime-is-source.sh` | оболочка | +| 2 | `seed-runtime-is-source` | semya | `bootstrap/flang io scripts/seed/seed-runtime-is-source.fscript --plan Check` | оболочка | | 3 | `seed-refresh` | semyaosv | `sh scripts/seed/seed-refresh.sh --check` | оболочка | | 4 | `version-derivations-guard` | versii-vezde | `sh scripts/guards/version-derivations-guard.sh` | оболочка | | 5 | `who-calls-the-guards` | zov | `sh scripts/guards/who-calls-the-guards.sh --check` | оболочка | diff --git a/docs/tasks/1408-the-step-bound-is-printed-into-the-proof-record.md b/docs/tasks/1408-the-step-bound-is-printed-into-the-proof-record.md index 85b02793b..8b9c50661 100644 --- a/docs/tasks/1408-the-step-bound-is-printed-into-the-proof-record.md +++ b/docs/tasks/1408-the-step-bound-is-printed-into-the-proof-record.md @@ -71,4 +71,4 @@ Запись пробы «Сумма до» содержит строку с многочленом; `сверщик` даёт код 0 и называет узел переигранным; подделка с заниженной оценкой — код 1; набор проб — -«сошлось всё»; `sh scripts/доказуемость.sh` — ДОКАЗУЕМ, доля не ниже 96,01 %. +«сошлось всё»; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ, доля не ниже 96,01 %. diff --git a/docs/tasks/1412-ring-rules-only-for-the-exact-integer.md b/docs/tasks/1412-ring-rules-only-for-the-exact-integer.md index 15ffa9e2a..2c4f34c5b 100644 --- a/docs/tasks/1412-ring-rules-only-for-the-exact-integer.md +++ b/docs/tasks/1412-ring-rules-only-for-the-exact-integer.md @@ -196,7 +196,7 @@ `«Тожд-запрет»`, `«Тожд-запрет2»`, `«Тожд-запрет3»` в `flang/proof/lean/Rules.lean`; три искажения (запрет, переписанный правилом) — 58, 59, 60 в `flang/proof/lean/Trap.lean`. `sh flang/proof/lean/run.sh` при -`LEAN=~/.elan/bin/lean` (в PATH его нет, и `scripts/доказуемость.sh` честно +`LEAN=~/.elan/bin/lean` (в PATH его нет, и `scripts/provability.fscript` честно пишет «здесь не гонялся») — **код 0, «сошлось всё»**: * сборка восьми файлов — без единого сообщения; @@ -231,7 +231,7 @@ причиной отказа). Пояснение к ним — этот раздел; в скрипте строки стоят голыми, чтобы их можно было перенести на fscript, не разбирая прозу. -Вердикт `sh scripts/доказуемость.sh` — **ДОКАЗУЕМ, код 0** и до правки, и после +Вердикт `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — **ДОКАЗУЕМ, код 0** и до правки, и после переноса, все четыре проверки «ДА»: | проверка | число | @@ -289,7 +289,7 @@ | прогон | код | что сказал | |---|---:|---| -| `sh scripts/доказуемость.sh` | 0 | ДОКАЗУЕМ, все четыре проверки ДА (таблица выше) | +| `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` | 0 | ДОКАЗУЕМ, все четыре проверки ДА (таблица выше) | | `sh flang/proof/checker/tests/run.sh` | 0 | «сошлось всё»: подделок 546, честных 252 | | `sh flang/proof/tables-guard.sh` | 0 | «сошлось всё: 112 строк ведомости, шесть сторожей зелены» | | `sh scripts/guards/prose-numbers-guard.sh` | 0 | примет 231, сошлось 231, разошлось 0 | diff --git a/docs/tasks/1416-the-shortcut-list-is-computed-from-the-scripts.md b/docs/tasks/1416-the-shortcut-list-is-computed-from-the-scripts.md index 204f7c202..1f4778ea9 100644 --- a/docs/tasks/1416-the-shortcut-list-is-computed-from-the-scripts.md +++ b/docs/tasks/1416-the-shortcut-list-is-computed-from-the-scripts.md @@ -467,7 +467,7 @@ scripts/guards/hand-written-lists.sh --check` — «новых 59, мёртвы | `без-пакета:проверка` | `scripts/guards/no-package-json-guard.fscript` | | `раскрутка`, `раскрутка:проверка`, `семя:быстро`, `строки:проверка` | `scripts/bootstrap-reprint.sh` | | `семя:освежить`, `семя:можно-быстро` | `scripts/seed/seed-refresh.sh` | -| `двоичный:приёмка` | `scripts/seed/new-binary-acceptance.sh` | +| `двоичный:приёмка` | `scripts/seed/new-binary-acceptance.fscript` | | `точка:проверка` | `scripts/seed/bootstrap-point-by-binary.fscript` | | `доказательства:ведомость` | `flang/scripts/proof-ledger.fscript` | | `доказательства:пустота` | `flang/scripts/proof-ledger.mjs` | diff --git a/docs/tasks/1419-cyrillic-file-names-outside-proof-become-english.md b/docs/tasks/1419-cyrillic-file-names-outside-proof-become-english.md index fecd23525..eb6e2ad40 100644 --- a/docs/tasks/1419-cyrillic-file-names-outside-proof-become-english.md +++ b/docs/tasks/1419-cyrillic-file-names-outside-proof-become-english.md @@ -176,7 +176,7 @@ find . -path ./.git -prune -o -type f -print | grep -P '[А-Яа-яЁё][^/]*$' | 47 | `flang/test/обход.sh` | walk.sh | 20 | пример из самой задачи | | 48 | `flang/test/прогонщик-корпуса.flang` | corpus-runner.fscript | 3 | близнец scripts/guards/corpus-runner.fscript | | 49 | `scripts/guards/сторож-дарвина.fscript` | darwin-guard.flang | 4 | | -| 50 | `scripts/доказуемость.sh` | provability.sh | 70 | | +| 50 | `scripts/provability.fscript` | provability.sh | 70 | | | 51 | `ярлык` | run | 263 | входная точка всех целей: ./ярлык зовут хук, CI, задачи, README — самая дорогая правка | | 52 | `ярлыки.flang` | shortcuts.flang | 68 | модуль «Ярлыки» | diff --git a/docs/tasks/1423-node-leaves-the-concurrency-directory.md b/docs/tasks/1423-node-leaves-the-concurrency-directory.md index 9fd1f259c..8c652677b 100644 --- a/docs/tasks/1423-node-leaves-the-concurrency-directory.md +++ b/docs/tasks/1423-node-leaves-the-concurrency-directory.md @@ -290,7 +290,7 @@ flang/concurrency/<модуль>.flang --target js` (link 2 с, scheduler 10 с, | прибор | до `0e4ab1da8` | свидетели `950f74319` | сверщик `78aed7a24` | −scheduler `a3c5cdc9f` | −link `28d677699` | −wire `b6aaf3399` | |---|---|---|---|---|---|---| | `corpus-share.sh --проигрыванием` | 629 / 651 = 96,62 % | 629 / 651 = 96,62 % | 629 / 651 = 96,62 % | 629 / 651 = 96,62 % | 629 / 651 = 96,62 % | 629 / 651 = 96,62 % | -| `scripts/доказуемость.sh` | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | +| `scripts/provability.fscript` | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | | `./ярлык расширения:проверка` | код 0 | код 0 | код 0 | код 0 | код 0 | код 0 | | `task-numbers-guard.sh` | код 0 | код 0 | код 0 | код 0 | код 0 | код 0 | | `./ярлык задачник:проверка` | код 0 | код 0 | код 0 | код 0 | код 0 | код 0 | @@ -362,7 +362,7 @@ flang/concurrency/<модуль>.flang --target js` (link 2 с, scheduler 10 с, | прибор | ствол `7a9181334` | вершина `713197386` | |---|---|---| | `corpus-share.sh --проигрыванием` | 630 / 651 = 96,77 % | 630 / 651 = 96,77 % | -| `scripts/доказуемость.sh` | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | +| `scripts/provability.fscript` | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | | `./ярлык расширения:проверка` | код 0 | код 0 | | `task-numbers-guard.sh` | код 0 | код 0 | | `./ярлык задачник:проверка` | код 0 | код 0 | diff --git a/docs/tasks/1426-the-seed-is-reprinted-from-a-clean-copy.md b/docs/tasks/1426-the-seed-is-reprinted-from-a-clean-copy.md index 00554defd..55ffcb99b 100644 --- a/docs/tasks/1426-the-seed-is-reprinted-from-a-clean-copy.md +++ b/docs/tasks/1426-the-seed-is-reprinted-from-a-clean-copy.md @@ -18,7 +18,7 @@ чьи входы уже отличались от коммита. Прибор законный, дерево было грязным. 2. Последнее настоящее происхождение — `0ce948bfd` (11 сентября), семя из `b6f3a4b0f`. Ствол ушёл на **250 коммитов**, из них **42 трогают flang/self**. -3. `sh scripts/seed/seed-freshness.sh` отвечает «ОТКАЗЫВАЮСЬ СУДИТЬ О +3. `bootstrap/flang io scripts/seed/seed-freshness.fscript --plan Check --timeout 300000` отвечает «ОТКАЗЫВАЮСЬ СУДИТЬ О ДОКАЗАТЕЛЬСТВАХ… из чего напечатано семя — неизвестно». ## ⛔ Чего НЕ делать @@ -47,7 +47,7 @@ ## Как понять, что сделано -`sh scripts/seed/seed-freshness.sh` больше не отказывается судить, а отпечаток +`bootstrap/flang io scripts/seed/seed-freshness.fscript --plan Check --timeout 300000` больше не отказывается судить, а отпечаток называет коммит, который и правда есть в стволе. Проверять прогоном. ## Что уже сохранено diff --git a/docs/tasks/1428-translit-file-names-become-english.md b/docs/tasks/1428-translit-file-names-become-english.md index f7febf091..68008a69a 100644 --- a/docs/tasks/1428-translit-file-names-become-english.md +++ b/docs/tasks/1428-translit-file-names-become-english.md @@ -7,7 +7,7 @@ команда: первая карта: Куда идём рядом: 1427, 5821 -нужность: 2 — имена вроде raskrutka.sh и доказуемость.sh читаются только своими; язык при этом умеет всё, что этим скриптам нужно +нужность: 2 — имена вроде raskrutka.sh и provability.fscript читаются только своими; язык при этом умеет всё, что этим скриптам нужно --- ## Часть 1. Почему скрипты не на flang — измерено, и прежний ответ был неверен @@ -33,23 +33,23 @@ ## Часть 2. Таблица переименований -Имена латиницей, по образцу уже принятому в дереве (`seed-freshness.sh`, -`binary-origin.sh`, `two-prints-identical.sh`, `*-guard.flang`): +Имена латиницей, по образцу уже принятому в дереве (`seed-freshness.fscript`, +`binary-origin.fscript`, `two-prints-identical.fscript`, `*-guard.flang`): | сейчас | предлагается | живых файлов | |---|---|---:| | `scripts/raskrutka.sh` | `scripts/bootstrap-reprint.sh` | 126 | -| `scripts/доказуемость.sh` | `scripts/provability-gate.sh` | 63 | -| `scripts/seed/chto-otstalo-ot-semeni.sh` | `scripts/seed/what-lags-the-seed.sh` | 15 | +| `scripts/provability.fscript` | `scripts/provability-gate.sh` | 63 | +| `scripts/seed/chto-otstalo-ot-semeni.sh` | `scripts/seed/what-lags-the-seed.fscript` | 15 | | `scripts/guards/storozha-bez-podloga.sh` | `scripts/guards/guards-without-forgery-probe.sh` | 11 | | `scripts/guards/kto-zovet-storozhey.sh` | `scripts/guards/who-calls-the-guards.sh` | 8 | | `scripts/guards/pol-dokazannogo-sverka.sh` | `scripts/guards/proved-share-vs-tree.sh` | 5 | -| `scripts/seed/semya-rantayma-eto-istochnik.sh` | `scripts/seed/seed-runtime-is-source.sh` | 5 | +| `scripts/seed/semya-rantayma-eto-istochnik.sh` | `scripts/seed/seed-runtime-is-source.fscript` | 5 | | `scripts/repl-proba.sh` | `scripts/repl-probe.sh` | 5 | | `scripts/flangtutor-proba.sh` | `scripts/tutor-probe.sh` | 5 | | `scripts/guards/сторож-дарвина.fscript` | `scripts/guards/darwin-guard.flang` | 4 | | `scripts/seed/semya-osvezhit.sh` | `scripts/seed/seed-refresh.sh` | 4 | -| `scripts/seed/pechat-povtorima.sh` | `scripts/seed/print-is-repeatable.sh` | 3 | +| `scripts/seed/pechat-povtorima.sh` | `scripts/seed/print-is-repeatable.fscript` | 3 | ## Цена, померена поимённо @@ -60,7 +60,7 @@ Машинно-важные места, которые обязаны переименоваться вместе с файлами: · `.githooks/pre-push` — 9 строк; · `.github/workflows/*.yml` — 35 строк; - · `ХРАПОВИК` — 3 (все у `доказуемость.sh`); + · `ХРАПОВИК` — 3 (все у `provability.fscript`); · `ярлыки.flang` — 9; · реестры сторожей — запись «Ждущее» про `raskrutka.sh` в `file-extensions.fscript` и упоминания в шапках четырёх сторожей; @@ -101,9 +101,9 @@ | `scripts/guards/storozha-bez-podloga.sh` | `scripts/guards/guards-without-forgery-probe.sh` | `--check` | 0 | 0 | | `scripts/guards/pol-dokazannogo-sverka.sh` | `scripts/guards/proved-share-vs-tree.sh` | `--числа` | 0 | 0 | | `scripts/seed/semya-osvezhit.sh` | `scripts/seed/seed-refresh.sh` | `--help` | 0 | 0 | -| `scripts/seed/pechat-povtorima.sh` | `scripts/seed/print-is-repeatable.sh` | `--help` (незнакомый ключ) | 2 | 2 | -| `scripts/seed/chto-otstalo-ot-semeni.sh` | `scripts/seed/what-lags-the-seed.sh` | без ключа | 0 | 0 | -| `scripts/seed/semya-rantayma-eto-istochnik.sh` | `scripts/seed/seed-runtime-is-source.sh` | `--help` (незнакомый ключ) | 2 | 2 | +| `scripts/seed/pechat-povtorima.sh` | `scripts/seed/print-is-repeatable.fscript` | `--help` (незнакомый ключ) | 2 | 2 | +| `scripts/seed/chto-otstalo-ot-semeni.sh` | `scripts/seed/what-lags-the-seed.fscript` | без ключа | 0 | 0 | +| `scripts/seed/semya-rantayma-eto-istochnik.sh` | `scripts/seed/seed-runtime-is-source.fscript` | `--help` (незнакомый ключ) | 2 | 2 | | `scripts/repl-proba.sh` | `scripts/repl-probe.sh` | `--отпечаток` | 0 | 0 | | `scripts/flangtutor-proba.sh` | `scripts/tutor-probe.sh` | `<двоичный>` | 0 | 0 | @@ -190,10 +190,10 @@ | `scripts/ledgers/storozha-bez-podloga.json` | `scripts/ledgers/guards-without-forgery-probe.json` | | `scripts/ledgers/storozha-bez-zova.json` | `scripts/ledgers/uncalled-guards.json` | | `scripts/repl-proba.sh` | `scripts/repl-probe.sh` | -| `scripts/seed/pechat-povtorima.sh` | `scripts/seed/print-is-repeatable.sh` | +| `scripts/seed/pechat-povtorima.sh` | `scripts/seed/print-is-repeatable.fscript` | | `scripts/seed/semya-osvezhit.sh` | `scripts/seed/seed-refresh.sh` | -| `scripts/seed/semya-rantayma-eto-istochnik.sh` | `scripts/seed/seed-runtime-is-source.sh` | -| `scripts/seed/chto-otstalo-ot-semeni.sh` | `scripts/seed/what-lags-the-seed.sh` | +| `scripts/seed/semya-rantayma-eto-istochnik.sh` | `scripts/seed/seed-runtime-is-source.fscript` | +| `scripts/seed/chto-otstalo-ot-semeni.sh` | `scripts/seed/what-lags-the-seed.fscript` | | `scripts/targets/lico-celi-cpp.flang` | `scripts/targets/cpp-target-face.flang` | | `scripts/flangtutor-proba.sh` | `scripts/tutor-probe.sh` | @@ -208,7 +208,7 @@ переименовал оба файла, свёл 132 живых читателя, пересобрал двоичный и спросил приборы. Ответ другой, и он решает дело: - sh scripts/seed/seed-freshness.sh + bootstrap/flang io scripts/seed/seed-freshness.fscript --plan Check --timeout 300000 ОТКАЗЫВАЮСЬ СУДИТЬ: семя отстало от исходников на 3 файла • flang/self/bootstrap/compiler.flang: изменён после перепечатки sh scripts/seed/seed-refresh.sh --check diff --git a/docs/tasks/1745-the-tree-is-reorganized-by-the-owners-words-of-11-september.md b/docs/tasks/1745-the-tree-is-reorganized-by-the-owners-words-of-11-september.md index 6cf18f2af..a9902d685 100644 --- a/docs/tasks/1745-the-tree-is-reorganized-by-the-owners-words-of-11-september.md +++ b/docs/tasks/1745-the-tree-is-reorganized-by-the-owners-words-of-11-september.md @@ -24,7 +24,7 @@ понятная структура папок». Имена файлов не меняются — только каталоги. Каждый пункт — отдельные коммиты с числами до → после. После каждого: -`sh .githooks/pre-push` зелен, `sh scripts/доказуемость.sh` → ДОКАЗУЕМ, +`sh .githooks/pre-push` зелен, `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` → ДОКАЗУЕМ, опись доказанного сходится (`proved-share-vs-tree.sh` 0), сайт собирается (`node docs/site/build.mjs --check`) без битых ссылок. diff --git a/docs/tasks/2159-the-checker-is-measured-before-it-is-shrunk.md b/docs/tasks/2159-the-checker-is-measured-before-it-is-shrunk.md index 167532174..d0243fc66 100644 --- a/docs/tasks/2159-the-checker-is-measured-before-it-is-shrunk.md +++ b/docs/tasks/2159-the-checker-is-measured-before-it-is-shrunk.md @@ -7,7 +7,7 @@ команда: любая карта: Что мешает больше всего рядом: 8121, 9790, 1183, 1307, 1311 -нужность: 1 — 27 сентября 2026: строк кода в checker.c 7602 при потолке 7603, приёмка ждёт меньше 7531 (`sh flang/proof/tables-guard.sh --строки-кода`); `sh scripts/доказуемость.sh` — ДОКАЗУЕМ, 650 из 650, код 0 +нужность: 1 — 27 сентября 2026: строк кода в checker.c 7602 при потолке 7603, приёмка ждёт меньше 7531 (`sh flang/proof/tables-guard.sh --строки-кода`); `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ, 650 из 650, код 0 --- # 2159. Сверщик измерен прежде, чем его сокращать @@ -72,18 +72,18 @@ ## Как поймём, что сделано `--строки-кода` меньше, чем 7531; `flang/proof/checker/tests/run.sh` — «сошлось -всё»; `sh scripts/доказуемость.sh` — ДОКАЗУЕМ; храповик не поднят. +всё»; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ; храповик не поднят. ## Чем кончилось Приём задачи — «`--строки-кода` меньше, чем 7531; `flang/proof/checker/tests/run.sh` — -«сошлось всё»; `sh scripts/доказуемость.sh` — ДОКАЗУЕМ; храповик не поднят». +«сошлось всё»; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ; храповик не поднят». Прогон 22 сентября 2026 на стволе `d0763e8b6`: ``` sh flang/proof/tables-guard.sh --строки-кода → 7593 (приём ждёт < 7531) sh flang/proof/checker/tests/run.sh → сошлось всё -sh scripts/доказуемость.sh → ДОКАЗУЕМ, 4 из 4 +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 → ДОКАЗУЕМ, 4 из 4 ``` Ш1 своё сделал (7531 → 7433), но за десять дней работы над сверщиком файл вырос обратно diff --git a/docs/tasks/2200-the-print-batch-is-gathered-in-one-inventory.md b/docs/tasks/2200-the-print-batch-is-gathered-in-one-inventory.md index 00e69a39c..2f3c4e365 100644 --- a/docs/tasks/2200-the-print-batch-is-gathered-in-one-inventory.md +++ b/docs/tasks/2200-the-print-batch-is-gathered-in-one-inventory.md @@ -160,7 +160,7 @@ | 3811 | своё дерево платит за свой вердикт — у каждого инструмента, который его не проходит, вызов называет согласие поимённо, и список этот только убывает | flang/scripts/run-verdict-debt.tsv и сторож | | 4046 | Примеры сторожа спек прогоняются, а не упираются в предел шагов | fspec/guard.flang + ярлык | | 4107 | У записи «Ярлык» есть поле срока, и каждый ярлык называет своё время работы | ярлыки.flang в корне | -| 4318 | Перепечатка называет числом, сколько батутов и циклов потеряло семя, и краснеет на убыли | scripts/seed/new-binary-acceptance.sh — счёт по тексту bootstrap/compiler_flang.c | +| 4318 | Перепечатка называет числом, сколько батутов и циклов потеряло семя, и краснеет на убыли | scripts/seed/new-binary-acceptance.fscript — счёт по тексту bootstrap/compiler_flang.c | | 4412 | Сборка сайта и стенд узла — на flang: последние потребители оснастки на Node | docs/site/**, снос .mjs | | 4413 | Свод ведомости доказательств — последний сводитель на Node: у двойника нет веера и сужения | flang/scripts/proof-ledger.* | | 4472 | Релизный архив не совпадает побайтно между местной сборкой и конвейером | scripts/release/**, CI | @@ -170,7 +170,7 @@ | 5502 | Строгий режим не различает четыре исхода — «сетка» и «проверено впустую» дают код 0 у обоих приборов, и успех выдаётся без проверки обязательств | сама задача: «правка строгого режима не требует перепечатки семени» | | 5555 | План ввода-вывода пишется формой «в монаде», а не рукописной машиной продолжений | examples/io/** и объявление монады | | 5709 | Стадия, съедающая печать, имеет кеш, и он выключен — порядок работ назван по замеру | шаги 1–2 — flang/src/emit/c/flang_repl.c (копируемая часть); шаги 4–7 — scripts и замеры | -| 5963 | Приёмка нового двоичного снимает все шесть примет и отличает «нечем проверять» от «забракован» | scripts/seed/new-binary-acceptance.sh | +| 5963 | Приёмка нового двоичного снимает все шесть примет и отличает «нечем проверять» от «забракован» | scripts/seed/new-binary-acceptance.fscript | | 6094 | Курс собирается сайтом, а не отдельно — и потому его версия не может протухнуть молча | docs/site/** | | 6130 | Ведомость правил вывода в двух нотациях и четыре сторожа между ними | flang/proof/tables/inference-rules.tsv и четыре сторожа | | 6131 | Сверщик проигрывает блок «вывод» — приём на 38 правил вывода | flang/proof/checker/checker.c и flang/proof/checker.flang | @@ -341,7 +341,7 @@ * **Печать не запускалась** — ни `scripts/bootstrap-reprint.sh`, ни `scripts/bootstrap-reprint.sh`. Решение о ней за владельцем. -* **`sh scripts/доказуемость.sh` и доля корпуса не гонялись.** Правка лежит в +* **`bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` и доля корпуса не гонялись.** Правка лежит в печатаемой части, двоичный её не видит, поэтому вердикт прибора сегодня говорил бы о прежнем семени, а не о правке. Числа не снимались и здесь не названы; «не снято» — не ноль. @@ -447,7 +447,7 @@ записи останется без хвоста ` правило «…»`; * **машинный вид `--json` полей `stepRules` и `rule` у обязательства с теоремой не покажет**; -* **доля корпуса не сдвинется ни на место**, и `sh scripts/доказуемость.sh` +* **доля корпуса не сдвинется ни на место**, и `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` ответит ровно то же, что отвечал: правка лежит в печатаемой части, и прибор судит семя, а не дерево. @@ -666,7 +666,7 @@ sh scripts/seed/seed-refresh.sh --check # обязан стать код 0 же, и ответ обязан стать «печатаемая часть семени отвечает flang/self и пределам». **8. Доля и вердикт — только ПОСЛЕ правки сверщика.** -`sh scripts/доказуемость.sh` и `flang/proof/corpus-share.sh` гонять имеет смысл +`bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` и `flang/proof/corpus-share.sh` гонять имеет смысл лишь когда в `checker.c` появится `без_правила_ядра` (долг выше). До этого новый хвост даст ложное расхождение на честных записях, и просадка доли будет не находкой, а следствием незакрытого долга. diff --git a/docs/tasks/3127-a-stray-file-above-the-tree-can-replace-a-language-module.md b/docs/tasks/3127-a-stray-file-above-the-tree-can-replace-a-language-module.md index 89bc982fb..a7d9d0da4 100644 --- a/docs/tasks/3127-a-stray-file-above-the-tree-can-replace-a-language-module.md +++ b/docs/tasks/3127-a-stray-file-above-the-tree-can-replace-a-language-module.md @@ -246,7 +246,7 @@ stderr, код возврата 0. ### Чем проверено Двоичный собран ВНЕ дерева приёмом из шапки -`scripts/seed/seed-runtime-is-source.sh` (шапка 9 строк + источник, `make -j8`). +`scripts/seed/seed-runtime-is-source.fscript` (шапка 9 строк + источник, `make -j8`). Игрушечное дерево той же породы, что у `--подлог`, но с двоичным ВНУТРИ него (иначе библиотека ищется не там): `дерево/flang/stdlib/lists.flang` даёт 2, `над/чужой-черновик.flang` — 99, ввозит `дерево/scripts/proba.flang`. @@ -387,7 +387,7 @@ flang», «Печать в C», «Compiler flang», «Планировщик к Дерево от правки не краснеет: пересчёт нового правила обходом каталогов по 335 ввозам по имени дал 0 имён, объявленных больше чем в одном месте, и 0 ввозов, которым нечем разрешиться. -`sh scripts/доказуемость.sh` на двоичном с правкой — ДОКАЗУЕМ, код 0. +`bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` на двоичном с правкой — ДОКАЗУЕМ, код 0. ### Проба diff --git a/docs/tasks/3401-flang-package-builds-no-package.md b/docs/tasks/3401-flang-package-builds-no-package.md index 96e18f2b8..9e24f7297 100644 --- a/docs/tasks/3401-flang-package-builds-no-package.md +++ b/docs/tasks/3401-flang-package-builds-no-package.md @@ -87,7 +87,7 @@ $ pochinka/flang package проба.flang `bootstrap/*.c` не трогать — отпечаток прочтёт это как подлог). 2. Доставить быстрым пересевом `sh scripts/seed/seed-refresh.sh`: `flang_repl.c` не печатается из `flang/self`, а копируется в семя дословно (заслон - `scripts/seed/seed-runtime-is-source.sh`; `diff` источника и семени — ровно + `scripts/seed/seed-runtime-is-source.fscript`; `diff` источника и семени — ровно 9 строк шапки). Полная перепечатка **не нужна**. 3. Завести сторожа, которого нет: `flang new` во временном каталоге → `flang package` → код 0 → ввоз получившегося пакета чужой программой. Место — @@ -114,7 +114,7 @@ args[1] = obligations;` и `repl_call("Прогоны для ядра", args, 2, (`flang/src/emit/c/flang_repl.c`, `repl_call_within("Прогоны для ядра", pair, 2, …)`). **Проверено прогоном, а не рассуждением.** Двоичный собран ВНЕ дерева приёмом из -шапки `scripts/seed/seed-runtime-is-source.sh` (шапка 9 строк + источник → +шапки `scripts/seed/seed-runtime-is-source.fscript` (шапка 9 строк + источник → копия `bootstrap/`, `make -j8`); дерево не тронуто. | прогон | до | после | diff --git a/docs/tasks/3464-theorem-steps-name-a-ledger-rule-and-its-premises.md b/docs/tasks/3464-theorem-steps-name-a-ledger-rule-and-its-premises.md index febaa7829..57af0d73d 100644 --- a/docs/tasks/3464-theorem-steps-name-a-ledger-rule-and-its-premises.md +++ b/docs/tasks/3464-theorem-steps-name-a-ledger-rule-and-its-premises.md @@ -48,7 +48,7 @@ ищет по правилу ограниченности и не находит транзитивности через названную середину). У сверщика при этом есть О10 (два звена, середина знак в знак). -Прибор до: `sh scripts/доказуемость.sh` — ДОКАЗУЕМ; 1 ДА (видов 34/34, на слове +Прибор до: `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ; 1 ДА (видов 34/34, на слове 3/3); 2 ДА 625/651 = 96,01 %; 3 ДА (подделок 34/34; проб на подлог 425, принято 0; честных 203, отвергнуто 0); 4 ДА. Lean: `lean` в PATH нет — не снято. @@ -123,7 +123,7 @@ - Ш2 — приёмка: три теоремы с явными шагами (одна — код 3 без шагов, код 0 с шагами); честные записи — сверщик 0; подделки (чужая посылка, пропущенный шаг, правило не по форме) — ядро и сверщик код 1 с причиной; семья проб `families/ledger-steps`; - `доказуемость.sh` ДОКАЗУЕМ, доля ≥ 625/651, «сошлось всё». + `provability.fscript` ДОКАЗУЕМ, доля ≥ 625/651, «сошлось всё». - Ш3 (не здесь) — шаги ведомости внутри случаев индукции; остальные правила ведомости в ядре. ## Чего не делает @@ -183,7 +183,7 @@ 3. подделки (чужая посылка, пропущенный шаг, правило не по форме) — ядро и сверщик код 1 с названной причиной; 4. семья проб `flang/proof/checker/tests/families/ledger-steps` заведена; -5. `sh scripts/доказуемость.sh` — ДОКАЗУЕМ, доля ≥ 625/651, «сошлось всё». +5. `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ, доля ≥ 625/651, «сошлось всё». Прогон 23 сентября 2026, рабочая копия `wPriyom` на main `38105062f`, сверщик собран здесь же (`make -s -C flang/proof/checker`, 6,0 с): @@ -193,12 +193,12 @@ | 4 (семья заведена) | `ls flang/proof/checker/tests/families/ledger-steps` | `README.md`, `steps.flang`, `steps.record` — **есть** | | 2 (честная запись) | `./flang/proof/checker/сверщик flang/proof/checker/tests/families/ledger-steps/steps.flang …/steps.record` | код **0**, «ПРОВЕРЕНО … утверждений 3, шагов сверено с исходником **10**, НА СЛОВО ЯДРА: посылок и утверждений 0, шагов 0; Выводов факта о типе проиграно заново 3 (снято со слова ядра мест 10)» — число шагов сходится со строкой «сверщик на честной записи … шагов сверено 10» из таблицы автора | | 5 (доля) | `sh flang/proof/corpus-share.sh --проигрыванием` | доля-проигрыванием **650 / 650 = 100,00 %** — выше порога Ш2 (625/651); «на слово ядра: посылок и утверждений 0, шагов 0» | -| 5 (вердикт) и 1, 3 | `sh scripts/доказуемость.sh` и прогон подделок | **не гонялись**: машина под печатью семени, а эти две мерки идут через набор проб сверщика. Цена по шапке самого прибора — около 3 с на пробы и около 5 с на линейку доли, то есть дело не в цене, а в запрете | +| 5 (вердикт) и 1, 3 | `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` и прогон подделок | **не гонялись**: машина под печатью семени, а эти две мерки идут через набор проб сверщика. Цена по шапке самого прибора — около 3 с на пробы и около 5 с на линейку доли, то есть дело не в цене, а в запрете | Итог: из пяти мерок Ш2 три сняты сегодня и зелены, две не гонялись по запрету. Ш3 задача с себя снимает сама («Ш3 (не здесь)»), поэтому долгом задачи он не является. Статус не менялся: чтобы закрыть, остаётся прогнать -`sh scripts/доказуемость.sh` и подделки семьи `ledger-steps` на машине, где +`bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` и подделки семьи `ledger-steps` на машине, где набор проб сверщика гонять можно. ## Ведомость называет правило и основания У КАЖДОГО ШАГА (26 сентября 2026, ветка `a/3464-chitaemyy-sertifikat`) @@ -355,7 +355,7 @@ на свежем клоне `make -C bootstrap` даст ПРЕЖНЕЕ поведение, пока зеркало не положат (`sh scripts/bootstrap-c.sh`) — это шаг, который обязан сделать ведущий вместе с перепечаткой. -* `sh scripts/доказуемость.sh` и доля корпуса — НЕ ГОНЯЛИСЬ. Машина в этот заход +* `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` и доля корпуса — НЕ ГОНЯЛИСЬ. Машина в этот заход несла среднюю нагрузку от 26 до 41 при 38 сессиях, и один замер по 131 программе шёл вместо двух с половиной минут больше сорока; за такую цену число прибора было бы снято не про дерево, а про нагрузку. Правка ни ядра, ни разбора diff --git a/docs/tasks/3811-the-tree-pays-for-its-own-verdict.md b/docs/tasks/3811-the-tree-pays-for-its-own-verdict.md index 3c7d245e4..580fa9a3b 100644 --- a/docs/tasks/3811-the-tree-pays-for-its-own-verdict.md +++ b/docs/tasks/3811-the-tree-pays-for-its-own-verdict.md @@ -378,7 +378,7 @@ sh scripts/guards/run-verdict-debt-guard.sh ### Прогоны на дереве этой ветки ``` -sh scripts/доказуемость.sh ДОКАЗУЕМ код 0 +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 ДОКАЗУЕМ код 0 sh scripts/guards/prose-numbers-guard.sh все 231 примет сошлись код 0 ./ярлык задачник:проверка код 0 sh scripts/guards/run-verdict-debt-guard.sh СОШЛОСЬ код 0 diff --git a/docs/tasks/4318-the-reprint-names-how-many-trampolines-it-lost.md b/docs/tasks/4318-the-reprint-names-how-many-trampolines-it-lost.md index 107273dbc..e6d2e13ec 100644 --- a/docs/tasks/4318-the-reprint-names-how-many-trampolines-it-lost.md +++ b/docs/tasks/4318-the-reprint-names-how-many-trampolines-it-lost.md @@ -1,13 +1,13 @@ --- номер: 4318 заголовок: Перепечатка называет числом, сколько батутов и циклов потеряло семя, и краснеет на убыли -статус: свободна (сторожа нет: `scripts/seed/new-binary-acceptance.sh` батутов и циклов не считает на 8 сентября 2026) +статус: свободна (сторожа нет: `scripts/seed/new-binary-acceptance.fscript` батутов и циклов не считает на 8 сентября 2026) исполнитель: — ветка: — команда: вторая карта: Цена доказательства рядом: 1600, 2469, 7837 -нужность: 2 — прогон 27 сентября 2026: scripts/seed/new-binary-acceptance.sh батутов и циклов не считает (grep — 0); в семени 0.7.22 fl_trampoline 125, for (;;) 228, fl_post 3311 против 146 и 259 у 52996005^ — убыль не названа +нужность: 2 — прогон 27 сентября 2026: scripts/seed/new-binary-acceptance.fscript батутов и циклов не считает (grep — 0); в семени 0.7.22 fl_trampoline 125, for (;;) 228, fl_post 3311 против 146 и 259 у 52996005^ — убыль не названа --- # 4318. Перепечатка называет, сколько плоских стеков она потеряла diff --git a/docs/tasks/4416-the-checker-rejects-an-honest-instantiation-proof.md b/docs/tasks/4416-the-checker-rejects-an-honest-instantiation-proof.md index ac1eb9447..6b51102a9 100644 --- a/docs/tasks/4416-the-checker-rejects-an-honest-instantiation-proof.md +++ b/docs/tasks/4416-the-checker-rejects-an-honest-instantiation-proof.md @@ -189,7 +189,7 @@ $ сверщик honest.flang honest.record |---|---|---:| | `sh flang/proof/checker/tests/run.sh` | сошлось всё; подделок 546: отвергнуто 460, третий исход 86, принято 0; честных 251, отвергнуто 0 | 0 | | тот же набор прежним сверщиком (`SVERSCHIK=…`) | ПРОВАЛ на двух новых пробах: честная — вышло 1, спрятанная теорема — вышло 3 | 1 | -| `sh scripts/доказуемость.sh` | ДОКАЗУЕМ; доля 650 из 650; проб на подлог 546 | 0 | +| `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` | ДОКАЗУЕМ; доля 650 из 650; проб на подлог 546 | 0 | Храповик `flang/proof/forgeries/ratchet.txt`: проб на подлог 543 → 546. diff --git a/docs/tasks/4573-checker-verdicts-on-the-standard-library.md b/docs/tasks/4573-checker-verdicts-on-the-standard-library.md index 1fbdd269c..28253d920 100644 --- a/docs/tasks/4573-checker-verdicts-on-the-standard-library.md +++ b/docs/tasks/4573-checker-verdicts-on-the-standard-library.md @@ -382,7 +382,7 @@ overagent. обычной нульместной функции модуля, проходит кодом 0 (с набором — 1). Нужно: при `использует` без поданного набора голое имя, не объявленное в файле, — «не взялся» (3), а не молчаливое «не вызов». -- **Д. Прогон доли с набором.** `scripts/доказуемость.sh` и замер библиотеки +- **Д. Прогон доли с набором.** `scripts/provability.fscript` и замер библиотеки подают набор по транзитивному замыканию `использует`. ## Обходной путь diff --git a/docs/tasks/5147-the-c-target-declares-one-byte-too-few-for-a-character-outside-the-bmp.md b/docs/tasks/5147-the-c-target-declares-one-byte-too-few-for-a-character-outside-the-bmp.md index e8efd80ba..dab26dd4d 100644 --- a/docs/tasks/5147-the-c-target-declares-one-byte-too-few-for-a-character-outside-the-bmp.md +++ b/docs/tasks/5147-the-c-target-declares-one-byte-too-few-for-a-character-outside-the-bmp.md @@ -103,7 +103,7 @@ printf 'код символа "👍"\n.выход\n' | flang repl 128077 ``` Плюс общий приём партии: `sh flang/proof/checker/tests/run.sh` — «сошлось -всё», `sh scripts/доказуемость.sh` — ДОКАЗУЕМ 4 из 4. +всё», `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ 4 из 4. ## Чего эта задача НЕ закрывает diff --git a/docs/tasks/5502-strict-mode-tells-four-verdicts-apart.md b/docs/tasks/5502-strict-mode-tells-four-verdicts-apart.md index 242e80c99..69299c33f 100644 --- a/docs/tasks/5502-strict-mode-tells-four-verdicts-apart.md +++ b/docs/tasks/5502-strict-mode-tells-four-verdicts-apart.md @@ -573,11 +573,11 @@ ADR-0010 §2 обещает четыре кода и запрещает пере | --- | --- | --- | | четыре исхода, `check --proof --строго` | 0 / 3 / 3 / 3 | слова — в таблице «Замер ПОСЛЕ» | | `sh flang/proof/probes/strict/run.sh` | 0 | проб 23, разошлось 0 | -| `sh scripts/доказуемость.sh` | 0 | ДОКАЗУЕМ: доля 650 из 650, набор подделок 36 из 36, проб на подлог 543, честных 250 | +| `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` | 0 | ДОКАЗУЕМ: доля 650 из 650, набор подделок 36 из 36, проб на подлог 543, честных 250 | | `sh scripts/guards/prose-numbers-guard.sh` | 0 | примет 231, разошлось 0 | | `./ярлык задачник:проверка` | 0 | всего задач 166: свободно 142, в работе 17, сделано 7 | | `./ярлык опись:сверка` | 0 | таблица описи сошлась с деревом | -| `sh scripts/seed/seed-runtime-is-source.sh` | 0 | семя совпадает с источником | +| `bootstrap/flang io scripts/seed/seed-runtime-is-source.fscript --plan Check` | 0 | семя совпадает с источником | | `sh scripts/seed/seed-refresh.sh --check` | 0 | быстрый пересев достаточен | | `bootstrap/flang io scripts/guards/no-comments-guard.fscript --plan Проверка --на-веру` | 0 | комментариев в `.flang` не прибавилось | diff --git a/docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md b/docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md index 8ef151086..7fdd5d634 100644 --- a/docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md +++ b/docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md @@ -85,7 +85,7 @@ | # | файл | строк | вердикт | почему | кто зовёт (по коду и CI; упоминания в прозе не считаны) | |---:|---|---:|---|---|---| -| 1 | `scripts/bootstrap-c.sh` | 206 | остаётся | собирает двоичный (cc, вторая печать) | scripts/bootstrap-reprint.sh, scripts/seed/build-ledger-binary.sh | +| 1 | `scripts/bootstrap-c.sh` | 206 | остаётся | собирает двоичный (cc, вторая печать) | scripts/bootstrap-reprint.sh, scripts/seed/build-ledger-binary.fscript | | 2 | `scripts/cell-work-preserved.sh` | 97 | остаётся | нужна среда: FLANG_CELLS — «Прочитать переменную среды» хозяин не знает (прогон №2); на этой машине код 3 (клонов ячеек нет) | никто (0) | | 3 | `scripts/flangrc.sh` | 241 | остаётся | нужны доводы (ключ, --от DIR, --дом DIR) и среда HOME — записано в шапке | ярлыки.flang, flangrc-guard.sh, version-derivations-guard.sh, bump-version.sh, flang/bin/flangtutor | | 4 | `scripts/flangtutor-proba.sh` | 241 | остаётся | зона 1428 (переименование в tutor-probe.sh) | никто (0) | @@ -114,22 +114,22 @@ | 27 | `scripts/bootstrap-reprint.sh` | 3513 | остаётся | собирает двоичный (точка раскрутки); вне задачи | ярлык, хук, все работы CI (54 файла) | | 28 | `scripts/release/bump-version.sh` | 173 | остаётся | нужен довод — новая версия | ярлыки.flang (версия) | | 29 | `scripts/repl-proba.sh` | 303 | остаётся | зона 1428; проба REPL через терминал (экран) | никто (0; flang_repl.c упоминает) | -| 30 | `scripts/seed/binary-origin.sh` | 549 | остаётся | судит двоичный: сверка происхождения и пересборка (cc); доводы -- команда | binary.yml, seed-freshness.sh | -| 31 | `scripts/seed/build-ledger-binary.sh` | 171 | остаётся | собирает двоичный (cc) для ведомостей; довод каталог | take-proof-ledger.sh | +| 30 | `scripts/seed/binary-origin.fscript` | 549 | остаётся | судит двоичный: сверка происхождения и пересборка (cc); доводы -- команда | binary.yml, seed-freshness.fscript | +| 31 | `scripts/seed/build-ledger-binary.fscript` | 171 | остаётся | собирает двоичный (cc) для ведомостей; довод каталог | take-proof-ledger.sh | | 32 | `scripts/seed/chto-otstalo-ot-semeni.sh` | 177 | остаётся | зона 1428; отчёт об отставании семени | никто (хук упоминает как «не сторож») | -| 33 | `scripts/seed/new-binary-acceptance.sh` | 232 | остаётся | приёмка нового двоичного (судит двоичный); довод путь к дереву | ярлыки.flang, binary-origin.sh | +| 33 | `scripts/seed/new-binary-acceptance.fscript` | 232 | остаётся | приёмка нового двоичного (судит двоичный); довод путь к дереву | ярлыки.flang, binary-origin.fscript | | 34 | `scripts/seed/pechat-povtorima.sh` | 314 | остаётся | зона 1428; судит печать (две печати) | binary.yml, reprint.yml | -| 35 | `scripts/seed/print-progress.sh` | 158 | остаётся | идёт во время печати семени, до двоичного (reprint.yml) | reprint.yml, two-prints-identical.sh | -| 36 | `scripts/seed/seed-freshness.sh` | 197 | остаётся | судит семя (свежесть) — зовётся из `ярлык` до всякого плана; доводы --chto, -- команда | ярлык, bootstrap-reprint.sh, binary-origin.sh, published-vs-tree.sh | +| 35 | `scripts/seed/print-progress.sh` | 158 | остаётся | идёт во время печати семени, до двоичного (reprint.yml) | reprint.yml, two-prints-identical.fscript | +| 36 | `scripts/seed/seed-freshness.fscript` | 197 | остаётся | судит семя (свежесть) — зовётся из `ярлык` до всякого плана; доводы --chto, -- команда | ярлык, bootstrap-reprint.sh, binary-origin.fscript, published-vs-tree.sh | | 37 | `scripts/seed/semya-osvezhit.sh` | 273 | остаётся | собирает двоичный (пересев); хук до сборки; зона 1428 | .githooks/pre-push, ярлыки.flang | | 38 | `scripts/seed/semya-rantayma-eto-istochnik.sh` | 108 | остаётся | зовётся до сборки (хук); зона 1428 | .githooks/pre-push, semya-osvezhit.sh | -| 39 | `scripts/seed/two-prints-identical.sh` | 226 | остаётся | судит печать; доводы — два каталога | binary.yml, reprint.yml, pechat-povtorima.sh | +| 39 | `scripts/seed/two-prints-identical.fscript` | 226 | остаётся | судит печать; доводы — два каталога | binary.yml, reprint.yml, pechat-povtorima.sh | | 40 | `scripts/targets/identical-declarations.sh` | 118 | остаётся | зовёт node-библиотеку (link-collision-guard.mjs, «замыкание») и jq; среда FLANG; сегодня не сходится: за 300 с не кончился, jq: parse error | никто (0) | | 41 | `scripts/targets/target-census.sh` | 214 | остаётся | py-разбор JSON дерева (python3, json); довод каталог; зовёт memory-limit.sh | никто (0) | | 42 | `scripts/targets/target-collisions.sh` | 337 | остаётся | среда FLANG и KARTA; зовёт names-in-c.awk (awk-программа дерева) и jq | никто (0) | | 43 | `scripts/targets/targets-inventory.sh` | 79 | остаётся | доводы (имена целей); среда VOROTA/PAMYAT/VYVOD; зовёт ворота | никто (0) | | 44 | `scripts/test-remote.sh` | 149 | остаётся | доводы (--info/--shell/--sync), среда FLANG_REMOTE, ssh и терминал | ярлыки.flang (тесты:по-ssh) | -| 45 | `scripts/доказуемость.sh` | 321 | остаётся | зона 1428 (переименование в provability-gate.sh); гейт доказуемости — судит чекер и сверщика | ярлыки.flang (доказуемость), ХРАПОВИК, proverka-dereva.sh | +| 45 | `scripts/provability.fscript` | 321 | остаётся | зона 1428 (переименование в provability-gate.sh); гейт доказуемости — судит чекер и сверщика | ярлыки.flang (доказуемость), ХРАПОВИК, proverka-dereva.sh | | 46 | `docs/benchmarks/proof-cost/postcondition-pairs.sh` | 57 | остаётся | доводы (двоичные A/B, файл); зовёт memory-limit.sh | никто (0) | | 47 | `docs/benchmarks/speed/arena.sh` | 37 | остаётся | довод (каталог сборки); замер памяти | flang/scripts/memory-guard.flang | | 48 | `docs/benchmarks/speed/assemble.sh` | 110 | остаётся | доводы; python3 для правки напечатанного C | .gitignore, docs/benchmarks/speed/memory.flang, docs/benchmarks/speed/work.mjs | @@ -232,7 +232,7 @@ | строк всего | 14062 | 27229 | 41291 | **Порог N = 2** — столько «ПЕРЕНОСИМ» среди `scripts/**/*.sh` вне списка 1428 (девять -транслитных имён и `доказуемость.sh` в перенос не берутся — их переименовывает 1428). +транслитных имён и `provability.fscript` в перенос не берутся — их переименовывает 1428). Порядок переноса — от меньшего с одним зовущим: 1. `scripts/guards/no-comments-guard.sh` — 123 строки, зовущих 0; @@ -337,3 +337,148 @@ grep -hc "name:.*[А-Яа-я]" .github/workflows/*.yml 0 в каждой из них не в усердии: у плана нет кода возврата 2 и нет проброса ЧУЖОГО кода возврата наружу; слить `вывод` и `ошибки` потомка, как делает `2>&1`, нечем; журнал поручений `flang io` не сузить ключом. Порог задачи (N = 2) взят. + +## Что сделано 27 сентября 2026: скрипты семени, отчёты и вердикт + +Ветка `a/5821-seed-and-target-scripts-are-plans` над `gh/dev` `7b3a73873`. Сверка +«старый `.sh` против нового плана» гонялась на двух деревьях одного коммита: старое — +чистая копия ствола, новое — ветка; строка «SHA дерева» из сличения исключена, всё +остальное сличалось `diff`-ом. Код плана — 0 «конец работы», 1 «провал», 3 «не +проверено»; прежняя двойка стала тройкой. Вывод плана — JSON, текст отчёта — поле +`result` (или `error` при отказе). + +### Перенесено: `.sh` снят, зовущие переведены + +| было | стало | срок до → после, мс | код до → после | текст | +|---|---|---:|---|---| +| `scripts/provability.fscript` | `scripts/provability.fscript`, план `Verdict` | 17 499 → 48 268 | 0 → 0 | совпал знак в знак | +| то же, подлог таблицы ловушки (код вида снятой цели 0 → 1) | `FLANG_TRAP_TABLE=…` | 18 005 → 44 782 | 1 → 1 | совпал знак в знак | +| `scripts/report-provenance.fscript` | `scripts/report-provenance.fscript`, план `Report` | 342 → 3 063 | 0 → 0 | совпал; у плана нет пустой строки в конце | +| `scripts/four-coverages.fscript` | `scripts/four-coverages.fscript`, план `Measure` | 14 832 → 26 501 | 2 → 3 | совпал знак в знак | +| `scripts/seed/seed-runtime-is-source.fscript` | план `Check` / `After print` | 92 → 3 441 / 96 → 3 779 | 0 → 0 | совпал | +| `scripts/seed/two-prints-identical.fscript` | план `Check` | 78 → 5 141 | 0/1/3 → 0/1/3, 2 → 3 | совпал, кроме строки «как звать» | +| `scripts/seed/print-is-repeatable.fscript` | план `Check` / `Forgery` | 20 979 → 25 565 / 12 303 → 15 816 | 0 → 0 | совпал | +| `scripts/seed/what-lags-the-seed.fscript` | план `Report` | 632 → 8 080 | 0 → 0 | совпал, кроме последней строки-ссылки | +| `scripts/seed/binary-origin.fscript` | план `Check` / `Exact` / `Forgery` | 1 257 → 37 580 / 124 613 → 128 578 / 1 522 → 20 527 | 0 → 0; подлог 1 → 1 | план при успехе пишет строку «двоичный сверен с семенем поименно» — старый молчал | +| `scripts/seed/new-binary-acceptance.fscript` | план `Accept` | — | 2 → 3 | старый на стволе сломан: `PROBE` заведена, читается `$PROBA` при `set -u` | +| `scripts/seed/build-ledger-binary.fscript` | план `Build` | 137 413 → 131 389 | 0 → 0 | — | +| `scripts/seed/seed-freshness.fscript` | план `Check`; `.sh` оставлен трёхстрочным переходником | 2 078 → 40 400 | 3 → 3 | совпал, кроме имени ключа обхода | + +Покраснение показано: вердикт — подлогом таблицы ловушки и таблицей без строки +(«ловушка ослабла: видов 37 при храповике 38»), отсутствием таблицы — код 3; сверка +семени и рантайма — песочницами с отставшим и испорченным источником (код 1); две +печати — изменённым байтом, лишним файлом (1) и семью видами негодного журнала (3); +повторимость печати — подставным двоичным, дописывающим часовой пояс (1); +происхождение двоичного — подложной программой (1) и снятой таблицей имён (3). + +Прибавка 3–5 с у каждого плана — постоянная цена запуска `flang io`: столько же +стоит план, которому делать нечего. У вердикта прибавка 30 с: сверщик зовётся 42 +раза процессом, по разу на вид ловушки. + +Общие части: `scripts/inquiry.fscript` (вопрос хозяину — процесс, файл, среда, +доводы — и разбор ответа по имени вопроса), `scripts/reading.fscript` (строки, +слова, числа из вывода), `scripts/rules.fscript` (выбор по списку правил вместо +лестницы «если … иначе если»). Все планы проходят `flang check --proof` с +«ПРОВЕРЕНО САМОСТОЯТЕЛЬНО», сетки и «объявлено, не доказано» ноль — ключ +`--на-веру` им не нужен. + +### Переименованные переменные среды и ключи + +| было | стало | +|---|---| +| `LOVUSHKA_TSV`, `LOVUSHKA_HRAP` | `FLANG_TRAP_TABLE`, `FLANG_TRAP_RATCHET` | +| `SEMYA_OTSTALO_ZNAYU` | `FLANG_SEED_LAG_KNOWN` | +| `ZHURNAL_1`, `ZHURNAL_2` | `FLANG_PRINT_LOG_1`, `FLANG_PRINT_LOG_2` | +| `KOMMIT` (сборка двоичного ведомости) | `FLANG_SEED_COMMIT` | +| `--после-печати`, `--подлог`, `--точно`, `--вход`, `--чем`, `--chto` | планы `After print`, `Forgery`, `Exact`, довод после `--`, `-- --what` | + +### Три скрипта, про которые решение, а не перенос + +Вопрос: нужен ли скрипту уже собранный двоичный. Отвечено прогоном: двоичный +уносился из дерева, скрипт гонялся с ним и без него. + +**`scripts/bootstrap-c.sh` — переносим.** Двоичный он не собирает: печатает +`flang/self/bootstrap/compiler.flang` командой `$FLANG emit` и сличает с +`bootstrap/`. Подставной «двоичный», копирующий `bootstrap/` в каталог вывода, +дал `--check` код 0 за 218 мс, он же с испорченным байтом — код 1 и +«bootstrap/flang_cli.c: в дереве 61906 байт, печать даёт 61920». Без двоичного — +код 2 «не найден двоичный»; единственное, что скрипт «собирает», — `make -C +bootstrap` перед печатью, и это та же минута, что у `./ярлык сборка`. Сверку +`--check` уже делает `scripts/seed/bootstrap-point-by-binary.fscript`, но рецепт +печати (`FLANG_OUT`) он читает из самого `bootstrap-c.sh`. В этой работе не +перенесён: `bootstrap-reprint.sh` держит его вторым путём печати +(`SECOND_PRINT`) и сверяет с ним пределы, а перепечатка идёт — трогать её вход +нельзя. Перенос — после печати: пределы и вход переезжают в план, а +`bootstrap-reprint.sh` читает их оттуда. + +**`scripts/seed/seed-refresh.sh` — переносим.** `--check` двоичного не зовёт: +с двоичным и без — вывод один, код 0 оба раза (303 и 292 мс). Режим пересева +пересобирает двоичный `make -C bootstrap`; проверено, что план может пересобрать +собственного исполнителя: план, запущенный двоичным дерева, снёс `flang_cli.o`, +позвал `make` (код 0, 121 с) — файл двоичного новый (другой inode), `--version` +отвечает, план дошёл до конца кодом 0. Зовёт его хук-план +`.githooks/pre-push.fscript`, то есть двоичный уже есть. Не перенесён в этой +работе по объёму, а не по границе. + +**`scripts/bootstrap-reprint.sh` — делится надвое, и граница проходит внутри.** +Дешёвые сверки двоичного не зовут: `--telo`, `--stroki`, `--imena`, `--тела`, +`--bystro` дали с двоичным и без него одинаковый вывод и код (210, 711, 410, +3314, 710 мс). `--telo` зовётся из `ярлык` ДО сборки, чтобы не собрать двоичный из +подменённого семени, — эту проверку на плане исполнить нечем. Целью в +`bootstrap/Makefile` она тоже не станет: Makefile напечатан, и дописанная руками +цель валит ту же проверку (`--telo` → код 1 «bootstrap/Makefile: изменён после +перепечатки»); нужна цель, которую печатает сам компилятор, — правка в +`flang/self/emit-c.flang`, место, где печатается Makefile, — а `flang/self/**` +сейчас не вливается. Печать (без ключа), `--check`, `--otpechatok`, `--build`, +`--замкнутость` зовут двоичный — они переносимы. + +Состав (строки файла, код / комментарии / пустые): + +| строки | что | код | комм. | пуст. | +|---|---|---:|---:|---:| +| 1–664 | шапка, пределы, настройки | 18 | 635 | 11 | +| 665–1358 | общие функции: отличия, литералы, пределы двух печатей, сборка и опрос, замыкание, отпечаток | 411 | 251 | 32 | +| 1359–2648 | имена и тела ядра против семени | 905 | 320 | 65 | +| 2649–2711 | разбор доводов | 36 | 25 | 2 | +| 2712–3130 | режимы `--telo`, `--imena`, `--тела`, `--замкнутость`, `--build`, `--stroki` | 305 | 95 | 19 | +| 3131–3415 | `--otpechatok`, `--bystro` | 194 | 76 | 15 | +| 3416–3599 | печать и `--check` | 126 | 44 | 14 | +| всего 3 598 | | 1 995 | 1 446 | 157 | + +Предлагаемый разрез, по порядку: +1. `--telo` — отдельный файл, до сборки; после печати — цель напечатанного Makefile. +2. Отпечаток (`--otpechatok`, `--bystro`, `--stroki`) — план `scripts/seed/fingerprint.fscript`. +3. Сверка имён и тел ядра (`--imena`, `--тела`) — план; это 905 строк кода, самая большая часть. +4. Печать, `--check`, `--build`, `--замкнутость` — план `scripts/seed/reprint.fscript`, вместе с `bootstrap-c.sh`: пределы печати станут одним числом в одном файле. + +### Чего в этой работе не перенесено и почему + +| файл | почему | +|---|---| +| `scripts/memory-headroom.sh` | `--следить` стоит в `binary.yml` до шага «Build bootstrap», `--отчёт` — шагом `if: always()`, то есть и тогда, когда сборку сняли по памяти и двоичного нет | +| `scripts/memory-limit.sh` | обёртка: ответ прибора — ЧУЖОЙ код (137 при снятии по памяти, 7 от потомка); план отдаёт 1. Черновик плана сверен на 12 парах (счёт сошёлся, коды 137 и 7 стали 1) и в ветку не взят: его зовут `target-census.sh` и `docs/benchmarks/proof-cost/postcondition-pairs.sh` | +| `scripts/targets/target-census.sh` | его путь назван местом отбора в `scripts/guards/file-extensions.fscript:197`; снятие файла красит этого сторожа (код 1, «место отбора пропало из дерева»), а `scripts/guards/**` в этой работе не правится | +| `scripts/targets/identical-declarations.sh`, `target-collisions.sh`, `targets-inventory.sh` | не начаты: зовущих нет, прежняя перепись называет `jq`, awk-программу и `2>&1`; работа оборвалась на пределе сессии | +| `scripts/repl-probe.sh`, `scripts/tutor-probe.sh` | красны до переноса: код 1 за 80,5 и 49,6 с; переносить красный прибор без разбора его красноты нельзя | +| `scripts/test-remote.sh` | режим `--shell` отдаёт человеку живую оболочку по ssh — у плана нет ни ввода потомку, ни терминала | + +### Что осталось называть старые имена и почему + +`git grep` по снятым именам находит только места, которые эта работа не правит: +`scripts/guards/tree-inventory.fscript`, `adr-numbers-guard.fscript`, +`file-extensions.fscript`, `published-vs-tree.sh` (он же зовёт +`scripts/seed/seed-freshness.fscript` — оттого файл и оставлен переходником), +`scripts/bootstrap-reprint.sh` (идёт печать), `bootstrap/flang_repl.c` и его +источник `flang/src/emit/c/flang_repl.c` (комментарий о `scripts/binary-origin.fscript`, +путь устарел и до этой работы). + +Объявления ярлыков «доказуемость» и «двоичный:приёмка» жили строкой-комментарием +в снятых `.sh`; план «Сбор» теперь относит оба к «только в таблице» — это не +красное, но объявление надо завести заново, когда у «Сбора» будет английское имя +функции-объявления. + +Два дефекта, найденные переносом, заведены отдельно и закрыты планами: +[5822](completed/5822-two-prints-check-skips-the-printed-compiler.md) — сверка двух +печатей не видела `compiler_flang.c`, `compiler_flang.h` и `Makefile`; +[5823](completed/5823-new-binary-acceptance-stops-at-the-kernel-rules-sign.md) — +приёмка нового двоичного обрывалась на четвёртой примете. diff --git a/docs/tasks/5963-the-binary-acceptance-takes-all-six-marks-or-says-it-cannot.md b/docs/tasks/5963-the-binary-acceptance-takes-all-six-marks-or-says-it-cannot.md index 4ab12c93e..b6e15bcdf 100644 --- a/docs/tasks/5963-the-binary-acceptance-takes-all-six-marks-or-says-it-cannot.md +++ b/docs/tasks/5963-the-binary-acceptance-takes-all-six-marks-or-says-it-cannot.md @@ -7,7 +7,7 @@ команда: вторая карта: Цена доказательства рядом: 0003, 0043, 4025 -нужность: 2 — 27 сентября 2026: `sh scripts/seed/new-binary-acceptance.sh /nonexistent/tree` — код 2, снаружи разведено; внутри один счётчик BED (`bad()` строка 26, «проверить НЕЧЕМ» строка 116 кладёт туда же), итог «примет не сошлось: $BED» и exit 1 (строки 151–152) +нужность: 2 — 27 сентября 2026: `bootstrap/flang io scripts/seed/new-binary-acceptance.fscript --plan Accept --timeout 3600000 -- /nonexistent/tree` — код 2, снаружи разведено; внутри один счётчик BED (`bad()` строка 26, «проверить НЕЧЕМ» строка 116 кладёт туда же), итог «примет не сошлось: $BED» и exit 1 (строки 151–152) --- # 5963. Приёмка двоичного не снимает ни одной приметы из шести @@ -16,8 +16,8 @@ Снято 30 августа 2026 на стволе `f9e67fa6`. -Ярлык `двоичный:приёмка` → `sh scripts/seed/new-binary-acceptance.sh`. -**Примет ровно шесть**, `scripts/seed/new-binary-acceptance.sh`, строки 106, 114/118, +Ярлык `двоичный:приёмка` → `bootstrap/flang io scripts/seed/new-binary-acceptance.fscript --plan Accept --timeout 3600000 --`. +**Примет ровно шесть**, `scripts/seed/new-binary-acceptance.fscript`, строки 106, 114/118, 126/127, 136/138, 161/178, 203/206: 1. печать конкурентности в C; @@ -60,9 +60,9 @@ ## Как понять, что сделано ```sh -sh scripts/seed/new-binary-acceptance.sh /несуществующее/дерево # код «нечем проверять», НЕ 1 -sh scripts/seed/new-binary-acceptance.sh <дерево с целым двоичным> # код 0, шесть примет сняты -sh scripts/seed/new-binary-acceptance.sh <дерево с порченым> # код 1, названа примета +bootstrap/flang io scripts/seed/new-binary-acceptance.fscript --plan Accept --timeout 3600000 -- /несуществующее/дерево # код «нечем проверять», НЕ 1 +bootstrap/flang io scripts/seed/new-binary-acceptance.fscript --plan Accept --timeout 3600000 -- <дерево с целым двоичным> # код 0, шесть примет сняты +bootstrap/flang io scripts/seed/new-binary-acceptance.fscript --plan Accept --timeout 3600000 -- <дерево с порченым> # код 1, названа примета ``` Три разных ответа на три разных случая. Сегодня все три дают один и тот же @@ -77,7 +77,7 @@ sh scripts/seed/new-binary-acceptance.sh <дерево с порченым> ## Замер 1 сентября 2026: половина сделана, беда наряда цела -**Снаружи разведено.** `sh scripts/seed/new-binary-acceptance.sh /несуществующее/дерево` +**Снаружи разведено.** `bootstrap/flang io scripts/seed/new-binary-acceptance.fscript --plan Accept --timeout 3600000 -- /несуществующее/дерево` отвечает **кодом 2**, а не 1 (коммиты `0786a2a9`, поверх — `b932319c`). **Утверждение наряда «ни одна из шести сегодня не снимается» больше не верно:** @@ -90,7 +90,7 @@ sh scripts/seed/new-binary-acceptance.sh <дерево с порченым> ИТОГ: примет не сошлось: 4. Двоичный НЕ ПРИНЯТ. **ЧЕГО НЕТ, и это ровно то, ради чего задача заведена: ВНУТРИ прогона разведения -нет.** Функция `bad()` (`scripts/seed/new-binary-acceptance.sh:52`) одинаково +нет.** Функция `bad()` (`scripts/seed/new-binary-acceptance.fscript:52`) одинаково прибавляет к одному счётчику `BED` и «примета не снята», и «падает — принимать НЕЛЬЗЯ», и «отказ ворот». Итог у всех трёх один — «примет не сошлось: N. Двоичный НЕ ПРИНЯТ». В прогоне выше из четырёх «не сошлось» настоящий провал @@ -102,6 +102,6 @@ sh scripts/seed/new-binary-acceptance.sh <дерево с порченым> НЕ подтверждено. Перепроверено 8 сентября 2026: файл не менялся с `b932319c`; `sh -scripts/seed/new-binary-acceptance.sh /несуществующее` — код 2; `bad()` (строка 52) +scripts/seed/new-binary-acceptance.fscript /несуществующее` — код 2; `bad()` (строка 52) один на все исходы, итог «примет не сошлось: $BED» и `exit 1`. Остаётся пункт 1 раздела «Что сделать». diff --git a/docs/tasks/6127-goal-split-places-are-replayed-by-local-moves.md b/docs/tasks/6127-goal-split-places-are-replayed-by-local-moves.md index 3919eddfc..21099338f 100644 --- a/docs/tasks/6127-goal-split-places-are-replayed-by-local-moves.md +++ b/docs/tasks/6127-goal-split-places-are-replayed-by-local-moves.md @@ -20,7 +20,7 @@ 18 — `перепиской` (переписка законами до тождества), 33 — `половина_закрыта` (деление цели по условию и замыкание половин). Ни под одним из 51 в записях корпуса нет ни одного хода: сверщик ВЫЧИСЛЯЕТ, что ядро должно было напечатать, -а не проигрывает написанное. Гейт Г7 (`scripts/доказуемость.sh`, проверка 1) +а не проигрывает написанное. Гейт Г7 (`scripts/provability.fscript`, проверка 1) поэтому красен. Из 33 мест `половина_закрыта` для 14 переигрыватель уже готов (ходы @@ -69,7 +69,7 @@ приёма» 0 → N, мест 0). 33 рукотворные цепочки: прежний код, «сведений» +1, «разбор цели» −1 каждая. Набор проб «сошлось всё» (подделок 195, принято 0; честных 126, отвергнуто 0). Доля 409/617 = 66,29 % (292/83/34), булевой - веткой 0. Гейт `доказуемость.sh` — НЕ ДОКАЗУЕМ (как и до работы: доля растёт + веткой 0. Гейт `provability.fscript` — НЕ ДОКАЗУЕМ (как и до работы: доля растёт только после печатника и перепечатки). - Статус: сверщик готов; ждёт печатника «разбор цели» в `zapis.flang` (другой стек) и решения владельца о примитиве `вычислить`. diff --git a/docs/tasks/6267-the-bootstrap-point-guard-is-red-when-it-cannot-check.md b/docs/tasks/6267-the-bootstrap-point-guard-is-red-when-it-cannot-check.md index 021e6096a..57cdab781 100644 --- a/docs/tasks/6267-the-bootstrap-point-guard-is-red-when-it-cannot-check.md +++ b/docs/tasks/6267-the-bootstrap-point-guard-is-red-when-it-cannot-check.md @@ -49,8 +49,8 @@ Код 0 — проверено и сошлось, 1 — проверено и разошлось, 3 — проверить нечем. Так уже отвечает `flang io` на `вариант «Не проверено»` (`flang/src/emit/c/flang_repl.c`, «ЧЕТВЁРТЫЙ ИСХОД»), так же отвечают вердикт -доказанности и планы семени (`scripts/seed/print-is-repeatable.sh`, -`scripts/seed/two-prints-identical.sh`). +доказанности и планы семени (`scripts/seed/print-is-repeatable.fscript`, +`scripts/seed/two-prints-identical.fscript`). ## Обходной путь diff --git a/docs/tasks/6752-a-law-of-the-category-surface-is-a-statement-about-the-carrier.md b/docs/tasks/6752-a-law-of-the-category-surface-is-a-statement-about-the-carrier.md index 85f3513d6..c32eb8482 100644 --- a/docs/tasks/6752-a-law-of-the-category-surface-is-a-statement-about-the-carrier.md +++ b/docs/tasks/6752-a-law-of-the-category-surface-is-a-statement-about-the-carrier.md @@ -67,7 +67,7 @@ Пробы из ADR-0039 §6 п.1–3 дают названные коды; таблица Ш0 лежит в задаче; `flang/ct/*.flang` — коды 0/1/3 по существу законов, код 2 только за устройство преобразований; сверщик — код 0 на доказанных законах, подделки — код 1; -`run.sh` — «сошлось всё»; `доказуемость.sh` — ДОКАЗУЕМ; строк кода сверщика +`run.sh` — «сошлось всё»; `provability.fscript` — ДОКАЗУЕМ; строк кода сверщика прибавилось не больше 30. ## Ш0 — таблица законов дерева, 15 сентября 2026, исполнитель a diff --git a/docs/tasks/7182-the-generated-makefile-does-not-know-about-headers.md b/docs/tasks/7182-the-generated-makefile-does-not-know-about-headers.md index 3d7690190..832270af6 100644 --- a/docs/tasks/7182-the-generated-makefile-does-not-know-about-headers.md +++ b/docs/tasks/7182-the-generated-makefile-does-not-know-about-headers.md @@ -77,7 +77,7 @@ wC: compiler_flang.o 18 сентября 18:22 3. Проба на подлог: тронуть `compiler_flang.h`, собрать без `-B` и показать, что до правки объект не пересобирается, а после — пересобирается. 4. Подумать о заслоне «двоичный собран из этих исходников»: сегодня - `scripts/seed/binary-origin.sh` сверяет происхождение, но объектные файлы в + `scripts/seed/binary-origin.fscript` сверяет происхождение, но объектные файлы в его поле зрения не входят. ## Фальсификатор diff --git a/docs/tasks/7203-guards-anchor-on-the-russian-prose-of-the-output.md b/docs/tasks/7203-guards-anchor-on-the-russian-prose-of-the-output.md index 02c12fee0..37d4df02e 100644 --- a/docs/tasks/7203-guards-anchor-on-the-russian-prose-of-the-output.md +++ b/docs/tasks/7203-guards-anchor-on-the-russian-prose-of-the-output.md @@ -31,9 +31,9 @@ `"доказано ПРИ УСЛОВИИ"`, `"объявлено, не доказано"`, `"утверждений "`, `"непонятный ключ"`, `"нарушено свойство «утверждение»"`. -Файлы строгого круга: `scripts/bootstrap-reprint.sh`, `scripts/seed/new-binary-acceptance.sh`, +Файлы строгого круга: `scripts/bootstrap-reprint.sh`, `scripts/seed/new-binary-acceptance.fscript`, `scripts/targets/target-census.sh`, `scripts/guards/seed-parses-sources-guard.sh`, -`scripts/доказуемость.sh`, `flang/scripts/proven-guard.fscript`, +`scripts/provability.fscript`, `flang/scripts/proven-guard.fscript`, `flang/scripts/word-guard.fscript`, `flang/scripts/word-guard.mjs`, `flang/scripts/ledger-summary.fscript`, `flang/scripts/emptiness-guard.fscript`, `flang/scripts/per-file-proof-share.py`, diff --git a/docs/tasks/9337-the-checker-calls-an-honest-stdlib-file-a-lie.md b/docs/tasks/9337-the-checker-calls-an-honest-stdlib-file-a-lie.md index 687abacdf..47d2885fe 100644 --- a/docs/tasks/9337-the-checker-calls-an-honest-stdlib-file-a-lie.md +++ b/docs/tasks/9337-the-checker-calls-an-honest-stdlib-file-a-lie.md @@ -147,7 +147,7 @@ overagent'а; строка в `flang/proof/checker/ratchet.txt` («9337»). * `sh flang/proof/checker/tests/run.sh` — «сошлось всё»: подделок 551, принято кодом 0 — 0; честных 253, отвергнуто 0; дыр в долге 3. Прежний сверщик на том же наборе — «провалов: 6». -* `sh scripts/доказуемость.sh` — ДОКАЗУЕМ, 650 из 650; проб на подлог 551 при +* `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ, 650 из 650; проб на подлог 551 при храповике 551. * `LEAN=~/.elan/bin/lean sh flang/proof/lean/run.sh` (Lean 4.34.0) — «сошлось всё», сверка вердиктов C ↔ Lean: расхождений 0. Парного правила Lean правка не diff --git a/docs/tasks/9408-emptiness-census-misses-eight-new-library-files.md b/docs/tasks/9408-emptiness-census-misses-eight-new-library-files.md index 281e551c4..e7f477149 100644 --- a/docs/tasks/9408-emptiness-census-misses-eight-new-library-files.md +++ b/docs/tasks/9408-emptiness-census-misses-eight-new-library-files.md @@ -7,7 +7,7 @@ команда: вторая карта: Сколько доказано на самом деле рядом: 9283, 6234 -нужность: 2 — 27 сентября 2026: `SEMYA_OTSTALO_ZNAYU=1 ./ярлык пустота:проверка` код 1, не названы уже ДЕВЯТЬ файлов: к восьми прибавился bignum.flang; в flang/stdlib/ 51 файл +нужность: 2 — 27 сентября 2026: `FLANG_SEED_LAG_KNOWN=1 ./ярлык пустота:проверка` код 1, не названы уже ДЕВЯТЬ файлов: к восьми прибавился bignum.flang; в flang/stdlib/ 51 файл --- # 9408. Перепись пустоты снова красна — восемь новых файлов библиотеки @@ -17,7 +17,7 @@ ## Что видно ```sh -SEMYA_OTSTALO_ZNAYU=1 ./ярлык пустота:проверка +FLANG_SEED_LAG_KNOWN=1 ./ярлык пустота:проверка # FLANG_PUSTOTA_KORPUS: файл библиотеки не назван ни в «Наших», ни в «Отложенных»: # cli.flang dns.flang number-format.flang protobuf.flang stats.flang # toml.flang uuid.flang websocket.flang @@ -38,6 +38,6 @@ cli eae241bd7, toml 735043361, uuid e389bc6de, websocket 760717ff0). В ## Как понять, что сделано ```sh -SEMYA_OTSTALO_ZNAYU=1 ./ярлык пустота:проверка # код 0 +FLANG_SEED_LAG_KNOWN=1 ./ярлык пустота:проверка # код 0 sh scripts/guards/hand-written-lists.sh # перечень не вырос ``` diff --git a/docs/tasks/9614-the-five-code-vocabulary-never-reaches-the-tape.md b/docs/tasks/9614-the-five-code-vocabulary-never-reaches-the-tape.md index f8daf4270..13cc88d64 100644 --- a/docs/tasks/9614-the-five-code-vocabulary-never-reaches-the-tape.md +++ b/docs/tasks/9614-the-five-code-vocabulary-never-reaches-the-tape.md @@ -25,7 +25,7 @@ > 0/4/3/1 общим для дерева. Это неверно, и ошибка моя: я взял карту из > `bootstrap-reprint.sh` и распространил её на всех. На деле единого словаря НЕТ. > У `bootstrap-reprint.sh` **4** — это «СЕМЯ НЕГОДНО», а «не проверено» — **5**; -> у `binary-origin.sh` — **3**; у `cli-keys-guard.mjs` — **2**; +> у `binary-origin.fscript` — **3**; у `cli-keys-guard.mjs` — **2**; > у `seed-knows-type-words-guard.sh` — **2** (три разных пути). > Разбирать надо по шапке КАЖДОГО прибора, а не по общей памяти. Указала Ч328. > @@ -61,7 +61,7 @@ Ни одного. Ч327 насчитала 126 и 28 — тем же порядком, разница от способа счёта. -И это касается не только сторожей на flang. `scripts/seed/binary-origin.sh` умеет +И это касается не только сторожей на flang. `scripts/seed/binary-origin.fscript` умеет код 3, `scripts/cli-keys-guard.mjs` умеет код 2 — **CI зовёт их голыми**, и обе тонкости пропадают на границе. @@ -79,7 +79,7 @@ 2. **Читать код отдельной строкой в шагах CI и различать хотя бы 1 / 3 / невердикт.** Приём уже написан в дереве — `reprint.yml:66–135`, его можно повторить, а не изобретать. -3. Начать с тех шагов, что зовут `binary-origin.sh` и `cli-keys-guard.mjs`: +3. Начать с тех шагов, что зовут `binary-origin.fscript` и `cli-keys-guard.mjs`: там различие уже есть в приборе и теряется только на ленте. ## Найдено @@ -90,7 +90,7 @@ ## Ещё оттуда же, отдельной бедой -`scripts/seed/build-ledger-binary.sh:155–171` по умолчанию собирает двоичный вне +`scripts/seed/build-ledger-binary.fscript:155–171` по умолчанию собирает двоичный вне дерева, который отвечает `FLANG_NOT_TOTAL` на ЗДОРОВОМ файле — то есть выдаёт беду раскладки за долг автора. Файл сам это описывает и приводит замер (код 1 за 6,0 с против кода 0 за 30,7 с) — и всё равно выходит нулём. @@ -132,7 +132,7 @@ fi ## Сделано 2 сентября (Ч328) Ветка `a/kody-dohodyat-do-lenty`, три коммита (`3404da19`, `22cc2bd4`, -`01ece149`). Переписаны оба вызова `binary-origin.sh`, вызов +`01ece149`). Переписаны оба вызова `binary-origin.fscript`, вызов `cli-keys-guard.mjs` и обе пробы подлогом. Код читается `kod=$?` отдельной строкой, разбирается `case`: 0 — зелено; 1 — беда; 2/3 — не проверено, отдельной заметкой; прочее — «не вердикт, а неудача запуска». Показ повторяет приём работы diff --git a/docs/tasks/9616-the-kernel-computes-the-evidence-and-the-record-drops-it.md b/docs/tasks/9616-the-kernel-computes-the-evidence-and-the-record-drops-it.md index 02dd9ca4c..7a4874002 100644 --- a/docs/tasks/9616-the-kernel-computes-the-evidence-and-the-record-drops-it.md +++ b/docs/tasks/9616-the-kernel-computes-the-evidence-and-the-record-drops-it.md @@ -381,7 +381,7 @@ | на слово ядра: посылок и утверждений | 12 | **10** | | на слово ядра: шагов | 4 | 4 | | снято калькулятором, не игрой | 6 | 6 | -| `sh scripts/доказуемость.sh` | ДОКАЗУЕМ | ДОКАЗУЕМ | +| `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` | ДОКАЗУЕМ | ДОКАЗУЕМ | | `sh flang/proof/checker/tests/run.sh` | сошлось всё: подделок 459, честных 216 | сошлось всё: подделок 464 (кодом 0 — 0), честных 218 (отвергнуто 0) | | `sверка-ведомости.sh --строки-кода` | 6982 (до потолка 206) | **7091** (до потолка 97) | | `LEAN=~/.elan/bin/lean sh flang/proof/lean/run.sh` | ловушек 14 из 14 | ловушек 15 из 15, лемм 110 | @@ -486,7 +486,7 @@ overagent'а) либо остаётся пределом. Решение — з | то же на дереве «после перепечатки»: worktree HEAD, в корпусе четыре записи зонда | — | **635 / 651 = 97,54 %** (6 / 4 / 6) | | `sh flang/proof/corpus-share.sh --вложенность` | напечатало другое 2 | напечатало другое **0** (совпало 86, законно 3) | | `sh flang/proof/checker/tests/run.sh` | подделок 464, честных 218 | сошлось всё: подделок 469 (кодом 0 — 0), честных 220 (отвергнуто 0) | -| `sh scripts/доказуемость.sh` | ДОКАЗУЕМ, 96,93 % | ДОКАЗУЕМ, 96,62 % | +| `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` | ДОКАЗУЕМ, 96,93 % | ДОКАЗУЕМ, 96,62 % | | `sh flang/proof/tables-guard.sh --строки-кода` | 7091 | 7091 (сверщик не тронут) | 635 — прибор на подложенном корпусе, сама перепечатка не делалась: что @@ -534,7 +534,7 @@ b». Нового правила не нужно: нужны посылки из | `corpus-share.sh --проигрыванием` на ветке | 629 / 651 | 629 / 651 (корпус — печать семени) | | то же «после перепечатки» (worktree, в корпусе пять записей зонда) | 635 / 651 = 97,54 % (6 / 4 / 6) | **639 / 651 = 98,16 %** (5 / 4 / 3) | | `run.sh` | подделок 469, честных 220 | сошлось всё: подделок 475 (кодом 0 — 0), честных 221 (отвергнуто 0) | -| `доказуемость.sh` | ДОКАЗУЕМ | ДОКАЗУЕМ (96,62 %) | +| `provability.fscript` | ДОКАЗУЕМ | ДОКАЗУЕМ (96,62 %) | | `tables-guard.sh --строки-кода` | 7091 | 7104 (потолок 7188 не пробит) | | `tables-guard.sh` | красных 2 (С-1: опоры Инд2/Инд3, со ствола) | те же 2 | | `LEAN=~/.elan/bin/lean sh flang/proof/lean/run.sh` | ловушек 15 из 15, лемм 110 | ловушек 16 из 16, лемм 113 | @@ -646,7 +646,7 @@ poddelka-order-arithmetic`, `по-объявлению/order → order`, | `sh flang/proof/corpus-share.sh --проигрыванием` | 633 / 650 = 97,38 %; 12 / 0 / 5; поручился 85 из 89, вынесено недостижимых 22 | **650 / 650 = 100,00 %**; **0 / 0 / 0**; поручился 85 из 89, вынесено 22, баланс 650 + 22 = 672 сошёлся | | те же 11 записей, сверщик порознь | коды 3 ×9 (на слове ядра) и 0 ×2 (`order`, `poddelka-protivorechie` — калькулятором) | коды **0 ×11**, на слово 0, калькулятором 0 у каждой | | `sh flang/proof/checker/tests/run.sh` | сошлось всё: подделок 529 (кодом 0 — 0), честных 244 (отвергнуто 0) | **сошлось всё: подделок 529 (кодом 0 — 0), честных 244 (отвергнуто 0)** | -| `sh scripts/доказуемость.sh` | ДОКАЗУЕМ, 97,38 % при пороге 95 % | **ДОКАЗУЕМ, 100,00 %** (650 из 650); все четыре проверки ДА; числитель набора 187 при храповике 155 | +| `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` | ДОКАЗУЕМ, 97,38 % при пороге 95 % | **ДОКАЗУЕМ, 100,00 %** (650 из 650); все четыре проверки ДА; числитель набора 187 при храповике 155 | | `sh flang/proof/corpus-share.sh --вложенность` на черновике | — | не мерил: скопированный двоичный без отпечатка семени, линейка отвечает кодом 2 «ядро отстало». По построению черновик и не может быть печатью 0.7.19 — одиннадцать записей отличаются от корпуса телом | Фальсификатор не сработал: **X = 650 ≥ 645**, утверждение PR #41 на нынешнем main @@ -677,7 +677,7 @@ poddelka-order-arithmetic`, `по-объявлению/order → order`, ### Сверка 17 сентября с `docs/road-to-one-hundred-measured.md` (стек T, на main `63a48f925`) Документ стека T ведёт свои сверки доли; сверены с таблицей 17 строк выше -(дерево wK2, ветка перебазирована на `63a48f925` — порог `scripts/доказуемость.sh` +(дерево wK2, ветка перебазирована на `63a48f925` — порог `scripts/provability.fscript` там уже 100 %, и до вливания перепечатанного семени прибор на main честно даёт «НЕ ДОКАЗУЕМ», код 1, при 633 / 650; это ожидаемо, не регрессия). diff --git a/docs/tasks/9790-the-base-that-must-be-trusted-is-measured-whole-not-only-the-kernel.md b/docs/tasks/9790-the-base-that-must-be-trusted-is-measured-whole-not-only-the-kernel.md index 854446dbb..cf0bc05b3 100644 --- a/docs/tasks/9790-the-base-that-must-be-trusted-is-measured-whole-not-only-the-kernel.md +++ b/docs/tasks/9790-the-base-that-must-be-trusted-is-measured-whole-not-only-the-kernel.md @@ -108,7 +108,7 @@ bootstrap/flang io flang/scripts/kernel-lines-to-trust.fscript \ бы таким же у прежнего плана. Судить всё равно — как велит сам отказ: ```sh -SEMYA_OTSTALO_ZNAYU=1 ./ярлык сколько-верим # код 0 +FLANG_SEED_LAG_KNOWN=1 ./ярлык сколько-верим # код 0 ``` Прямой вызов прибора (тот, что зовёт CI) обёртки не касается и работает без diff --git a/docs/tasks/9895-the-ledger-binary-default-place-hides-the-library.md b/docs/tasks/9895-the-ledger-binary-default-place-hides-the-library.md index 441cdb5cd..125d86c54 100644 --- a/docs/tasks/9895-the-ledger-binary-default-place-hides-the-library.md +++ b/docs/tasks/9895-the-ledger-binary-default-place-hides-the-library.md @@ -7,12 +7,12 @@ команда: вторая карта: Сколько доказано на самом деле рядом: 0002, 6128, 7205 -нужность: 2 — 27 сентября 2026: `sh scripts/seed/build-ledger-binary.sh` без довода (умолчание <дерево>-ledger-binary) код 0 и предупреждение; этим двоичным `check scripts/guards/tab-host-guard.fscript --proof --json` → FLANG_NOT_TOTAL «…неизвестную функцию «Печать значения»», код 1 +нужность: 2 — 27 сентября 2026: `bootstrap/flang io scripts/seed/build-ledger-binary.fscript --plan Build --timeout 900000 --` без довода (умолчание <дерево>-ledger-binary) код 0 и предупреждение; этим двоичным `check scripts/guards/tab-host-guard.fscript --proof --json` → FLANG_NOT_TOTAL «…неизвестную функцию «Печать значения»», код 1 --- # Умолчание сборщика двоичного прячет библиотеку, и отказ выглядит долгом автора -`scripts/seed/build-ledger-binary.sh` по умолчанию кладёт двоичный в +`scripts/seed/build-ledger-binary.fscript` по умолчанию кладёт двоичный в `<дерево>-ledger-binary` — РЯДОМ с деревом. Для сборки это верно: артефакты в дереве исходников не держат. **Для того, ради чего скрипт написан — снять ведомость, — это неверно**, и ошибка не видна глазами. diff --git a/docs/tasks/9902-emit-has-no-key-for-its-own-step-ceiling.md b/docs/tasks/9902-emit-has-no-key-for-its-own-step-ceiling.md index 124ce2f76..8130d1e3e 100644 --- a/docs/tasks/9902-emit-has-no-key-for-its-own-step-ceiling.md +++ b/docs/tasks/9902-emit-has-no-key-for-its-own-step-ceiling.md @@ -74,7 +74,7 @@ $ flang --предел-шагов 1 emit <проба> … неизвестна * Доводы `emit` разбирает не напечатанный код, а рукописный C — `flang/src/emit/c/flang_repl.c`. В семя он попадает КОПИЕЙ («шапка + - источник», `scripts/seed/seed-runtime-is-source.sh`), а не печатью. + источник», `scripts/seed/seed-runtime-is-source.fscript`), а не печатью. * Значит семя обновляется быстрым пересевом (`scripts/seed/seed-refresh.sh`, задача 3388). Оговорка его же шапки: пересев законен, «пока замыкание и пределы не тронуты относительно diff --git a/docs/tasks/completed/0001-ci-targets-inventory.md b/docs/tasks/completed/0001-ci-targets-inventory.md index cd02534d1..ae1e2ba83 100644 --- a/docs/tasks/completed/0001-ci-targets-inventory.md +++ b/docs/tasks/completed/0001-ci-targets-inventory.md @@ -43,7 +43,7 @@ Опись снята прогоном 25 августа 2026 на коммите `a3a18a3f` и лежит в [`docs/ci-inventory.md`](../docs/ci-inventory.md): таблица на все 82 цели — имя, код возврата, время, причина у красного, и у двадцати «ярлыков о -доказательствах» ещё столбец «с ключом» (`SEMYA_OTSTALO_ZNAYU=1`). +доказательствах» ещё столбец «с ключом» (`FLANG_SEED_LAG_KNOWN=1`). Числа, снятые прогоном, а не переписанные: diff --git a/docs/tasks/completed/0003-seed-reprint-finishes.md b/docs/tasks/completed/0003-seed-reprint-finishes.md index 58514c31e..a0ddb03be 100644 --- a/docs/tasks/completed/0003-seed-reprint-finishes.md +++ b/docs/tasks/completed/0003-seed-reprint-finishes.md @@ -272,7 +272,7 @@ left.as.list.items == right.as.list.items печатник:0 дерево:0 ### Пока заход идёт: приёмку прогнали и нашли в ней ложное зелёное -Приёмка (`scripts/new-binary-acceptance.sh`, задача 0043) — единственная дверь +Приёмка (`scripts/new-binary-acceptance.fscript`, задача 0043) — единственная дверь между «печать кончилась» и «двоичный принят», и ждать её конца, ничего не проверив, значит проверять её в тот час, когда времени уже нет. @@ -326,7 +326,7 @@ left.as.list.items == right.as.list.items печатник:0 дерево:0 === ПРИМЕТА 2 — вердикт «доказано ПРИ УСЛОВИИ» вхождений: 0 0 (было 0) -scripts/new-binary-acceptance.sh: 63: [: Illegal number: 0 +scripts/new-binary-acceptance.fscript: 63: [: Illegal number: 0 0 ``` @@ -404,7 +404,7 @@ scripts/new-binary-acceptance.sh: 63: [: Illegal number: 0 ### Чего в приёмке всё ещё нет, и почему это не дописано сегодня Примета 1 в тексте задачи 0043 состоит из ДВУХ половин, а в -`scripts/new-binary-acceptance.sh` живёт одна: +`scripts/new-binary-acceptance.fscript` живёт одна: ``` есть: nm -a bootstrap/flang | grep 'compiler_flang_…konkurentnost…' @@ -478,7 +478,7 @@ until ! pgrep -f 'bootstrap-pechatnyy/flang emit' >/dev/null; do sleep 60; done ```sh tail -30 /srv/work/semya5.log # чем кончилось make -C /srv/flang-rabota/u-semya5/bootstrap -j8 # собрать семя, ~62 с, 1,05 ГиБ -sh scripts/new-binary-acceptance.sh /srv/flang-rabota/u-semya5 +sh scripts/new-binary-acceptance.fscript /srv/flang-rabota/u-semya5 ``` Приёмка сама скажет, если перепечатка ещё идёт, и сама назовёт команду сборки, @@ -574,7 +574,7 @@ sh scripts/new-binary-acceptance.sh /srv/flang-rabota/u-semya5 Единственный открытый вопрос прежний — хватит ли глубины 80 000 там, где не хватило 20 000, и ответ будет не раньше 20:39 UTC. -**Приёмка готова и проверена**: `sh scripts/new-binary-acceptance.sh /srv/flang-rabota/u-semya5`. +**Приёмка готова и проверена**: `sh scripts/new-binary-acceptance.fscript /srv/flang-rabota/u-semya5`. Вхолостую отвечает «двоичного нет», называет команду сборки семени и предупреждает, что перепечатка ещё идёт. @@ -894,4 +894,4 @@ Makefile 2 893 → 2 893 единственный с - `52996005` — перепечатка семени 30 августа 2026 дошла до конца (заход 8 ч 34 мин), семя в `bootstrap/` перепечатано; - `262509ea`, `ee3b0121` — перепечатка 6 сентября 2026 (ступень Б под «хеш256»), семя синхронизировано с исходником. -Проверено 8 сентября 2026: `sh scripts/seed-freshness.sh` — код 0; `sh scripts/semya-rantayma-eto-istochnik.sh` в хуке зелен. Все три условия раздела «Как понять, что сделано» выполнены: печать доходит до конца, обе сверки зелены, двоичный в `bootstrap/` перепечатан. +Проверено 8 сентября 2026: `sh scripts/seed-freshness.fscript` — код 0; `sh scripts/semya-rantayma-eto-istochnik.sh` в хуке зелен. Все три условия раздела «Как понять, что сделано» выполнены: печать доходит до конца, обе сверки зелены, двоичный в `bootstrap/` перепечатан. diff --git a/docs/tasks/completed/0043-the-new-binary-is-accepted-by-four-marks.md b/docs/tasks/completed/0043-the-new-binary-is-accepted-by-four-marks.md index 3c23a53ee..4a3dd167b 100644 --- a/docs/tasks/completed/0043-the-new-binary-is-accepted-by-four-marks.md +++ b/docs/tasks/completed/0043-the-new-binary-is-accepted-by-four-marks.md @@ -91,7 +91,7 @@ flang check flang/stdlib/hashmap.flang --proof ## Чем закрыта -`scripts/new-binary-acceptance.sh` — приёмка из **шести** примет, и ярлык +`scripts/new-binary-acceptance.fscript` — приёмка из **шести** примет, и ярлык `двоичный:приёмка`. Код 0 — все сошлись; 1 — хоть одна нет, и каждая названа своим значком. diff --git a/docs/tasks/completed/1261-a-call-precondition-is-not-discharged-by-a-proved-callee-postcondition.md b/docs/tasks/completed/1261-a-call-precondition-is-not-discharged-by-a-proved-callee-postcondition.md index d3125e553..166b1a51b 100644 --- a/docs/tasks/completed/1261-a-call-precondition-is-not-discharged-by-a-proved-callee-postcondition.md +++ b/docs/tasks/completed/1261-a-call-precondition-is-not-discharged-by-a-proved-callee-postcondition.md @@ -94,7 +94,7 @@ Строки 3–5 таблицы — код 0; строка 6 и подделка с неоплаченным `требует` — отказ; перестановка функций в пробе вердикта не меняет; -`flang test flang/self/proofterm.flang` зелёный; `sh scripts/доказуемость.sh` — +`flang test flang/self/proofterm.flang` зелёный; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ; ведомость по `flang/stdlib` не потеряла ни одного «доказано», а цена прохода по `flang/self` названа числом до и после. @@ -160,7 +160,7 @@ C» без «Печать значения» в списке. Порядок в | неоплаченное `требует` у вызванной (две программы) | `FLANG_PRECONDITION_CALL` у обоих мест, «у неё есть место с неснятым «требует»»; файл-подделка дерева — три отказа, как ждали | | цена, та же проба до/после | 10 мин 11 с, 12,3 ГиБ → 10 мин 33 с, 11,5 ГиБ (машина общая, рядом три прогона); литерал: 10 мин 02 с → 9 мин 53 с — в пределах шума, витки не ограничивались | | `bootstrap/flang check flang/self/proofterm.flang` | код 1 и до, и после: 48 замечаний, побайтно те же, что у `main` (`totality.flang`: «Компонента», «Меньшее», «Добавить уникальное» — видимость при самостоятельном связывании), ни одного в `proofterm.flang`; примеры файла двоичный не запускает по той же причине | -| `sh scripts/доказуемость.sh` | ДОКАЗУЕМ (доля 639 из 662 = 96,53 %, набор 34, проб на подлог 459, честных 216) | +| `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` | ДОКАЗУЕМ (доля 639 из 662 = 96,53 %, набор 34, проб на подлог 459, честных 216) | | `sh flang/proof/checker/tests/run.sh` | «сошлось всё» | | ведомость `flang/stdlib` толкованием | НЕ СНЯТА ни до, ни после: `math-classics-lists.flang` — `FLANG_MEMORY` на 150 ГиБ через 2 ч 40 мин; `math-classics.flang` — `FLANG_PROPERTY` печати записи (как и у двоичного); исходы одинаковы в обоих деревьях. Двоичным до правки: automaton 122 доказано, math-classics-lists 19, json 102 | diff --git a/docs/tasks/completed/1308-nomera-zadach-stalkivayutsya.md b/docs/tasks/completed/1308-nomera-zadach-stalkivayutsya.md index e188aa2b5..976717dc1 100644 --- a/docs/tasks/completed/1308-nomera-zadach-stalkivayutsya.md +++ b/docs/tasks/completed/1308-nomera-zadach-stalkivayutsya.md @@ -110,7 +110,7 @@ ./ярлык задачник:проверка # код 1 и 52 замечания по делу, потом код 0 Тем же отпечатком заперты ещё двадцать ярлыков — все, что «судят о -доказательствах»: `sh scripts/seed-freshness.sh` отвечает «ОТКАЗЫВАЮСЬ СУДИТЬ, +доказательствах»: `sh scripts/seed-freshness.fscript` отвечает «ОТКАЗЫВАЮСЬ СУДИТЬ, дело не в отставании: разошлось ТЕЛО СЕМЕНИ», код 1, и ключа обхода тут нет нарочно. Снимается это одной командой — `sh scripts/bootstrap-reprint.sh --otpechatok`, — но она печатает, и потому не моя. diff --git a/docs/tasks/completed/1312-storozh-perechney-krasnyy-na-stvole.md b/docs/tasks/completed/1312-storozh-perechney-krasnyy-na-stvole.md index ee1b17113..78a1ef7df 100644 --- a/docs/tasks/completed/1312-storozh-perechney-krasnyy-na-stvole.md +++ b/docs/tasks/completed/1312-storozh-perechney-krasnyy-na-stvole.md @@ -91,7 +91,7 @@ sorted order`; под `C.UTF-8` и `C` — ни одной. `sort` и `comm` в правилам локали, и под `ru_RU.UTF-8` они расходились молча. Пункт 3 (пройтись той же меркой по остальным сторожам) тем же коммитом сделан -для трёх соседей — `target-census.sh`, `new-binary-acceptance.sh`, +для трёх соседей — `target-census.sh`, `new-binary-acceptance.fscript`, `target-collisions.sh`. Порода шире трёх, и остаток лежит в задаче 1389 «у каждого сторожа показано, что он краснеет на нарочной поломке». diff --git a/docs/tasks/completed/1389-every-guard-is-shown-to-redden-on-a-deliberate-break.md b/docs/tasks/completed/1389-every-guard-is-shown-to-redden-on-a-deliberate-break.md index a81f7bb9f..8901064d2 100644 --- a/docs/tasks/completed/1389-every-guard-is-shown-to-redden-on-a-deliberate-break.md +++ b/docs/tasks/completed/1389-every-guard-is-shown-to-redden-on-a-deliberate-break.md @@ -299,7 +299,7 @@ | 34 `семя:быстро`, 89 `раскрутка` | перепечатка занята: `sh scripts/bootstrap-reprint.sh` идёт с 15:49 | | 36 `столкновения:пересчёт` | 30 минут и 37,8 ГБ по собственной шапке — при пороге сторожа памяти в 45 ГиБ | | 64 `браузер:собрать`, 66 `браузер:проба` | нужен поднятый стенд и настоящий браузер | -| 11, 12, 25—27, 38—52 (двадцать ярлыков) | заслон отставшего семени: `ярлык` отказывается судить о доказательствах, пока семя не перепечатано. Мерил их с ключом `SEMYA_OTSTALO_ZNAYU=1`, и это надо помнить: ответ такого прогона — про дерево, собранное из СТАРОГО семени. | +| 11, 12, 25—27, 38—52 (двадцать ярлыков) | заслон отставшего семени: `ярлык` отказывается судить о доказательствах, пока семя не перепечатано. Мерил их с ключом `FLANG_SEED_LAG_KNOWN=1`, и это надо помнить: ответ такого прогона — про дерево, собранное из СТАРОГО семени. | ### Ещё одна порода грязи: временный каталог в КОРНЕ дерева diff --git a/docs/tasks/completed/1401-slichitel-perevoda-v-c.md b/docs/tasks/completed/1401-slichitel-perevoda-v-c.md index 2001d89f1..9f740d8e8 100644 --- a/docs/tasks/completed/1401-slichitel-perevoda-v-c.md +++ b/docs/tasks/completed/1401-slichitel-perevoda-v-c.md @@ -464,7 +464,7 @@ fl_nothing();` стоит в блоке функции `poddelka_usloviya_bez_sp СОВПАЛ со старым — ни одного нового отказа. * `sh flang/proof/checker/tests/run.sh` — «сошлось всё» (подделок 529, принято кодом 0 — 0; честных 244, отвергнуто 0). -* `sh scripts/доказуемость.sh` — **ДОКАЗУЕМ**, все четыре проверки сошлись. +* `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — **ДОКАЗУЕМ**, все четыре проверки сошлись. * `sh scripts/guards/prose-numbers-guard.sh` — 228 примет, сошлось 228: приметы строк в `*.sh` и `*.c,*.h` пересняты под этот прирост. diff --git a/docs/tasks/completed/1403-vychitanie-pod-predusloviem.md b/docs/tasks/completed/1403-vychitanie-pod-predusloviem.md index e10da0d55..e219dc05e 100644 --- a/docs/tasks/completed/1403-vychitanie-pod-predusloviem.md +++ b/docs/tasks/completed/1403-vychitanie-pod-predusloviem.md @@ -83,7 +83,7 @@ ## Как поймём, что сделано Четыре пробы из таблицы выше дают код 0; пятая (потолок) как была; проба на -подлог отвергнута; `sh scripts/доказуемость.sh` печатает ДОКАЗУЕМ; строк кода в +подлог отвергнута; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` печатает ДОКАЗУЕМ; строк кода в `checker.c` прибавилось не больше 20. ## Ход работы @@ -140,7 +140,7 @@ | подделка толкованием ядра дерева (595 с, пик 21 ГиБ) | «сетка» ×3, доказано 0 — ни одна из трёх лжи не стала доказанной; сверщик на записи ядра: «ПРОВЕРЕНО ВПУСТУЮ», код 0 | | `run.sh` | «сошлось всё»: подделок 409, принято кодом 0 — 0; честных 198, отвергнуто 0 | | `corpus-share.sh --проигрыванием` | 625 / 651 = 96,01 %, снято калькулятором 6 — как и обещано в ADR-0032 §2.3: доля не двинулась | -| `scripts/доказуемость.sh` | ДОКАЗУЕМ | +| `scripts/provability.fscript` | ДОКАЗУЕМ | Чего не сделал: пять проб §2.1 ADR-0032 кодом 0 на ДВОИЧНОМ — это после перепечатки партии (ядро ждёт её; толкованием — доказано). diff --git a/docs/tasks/completed/1404-utverzhdenie-o-posledovatelnosti-shagov.md b/docs/tasks/completed/1404-utverzhdenie-o-posledovatelnosti-shagov.md index 406ccd017..d938f8cbe 100644 --- a/docs/tasks/completed/1404-utverzhdenie-o-posledovatelnosti-shagov.md +++ b/docs/tasks/completed/1404-utverzhdenie-o-posledovatelnosti-shagov.md @@ -208,7 +208,7 @@ FLANG_PARSE: не разобрана конструкция: в процессе | `sh flang/proof/tables-guard.sh` | сошлось всё, 97 строк | **сошлось всё, 99 строк**, шесть сторожей зелены | | `LEAN=… sh flang/proof/lean/run.sh` | строк 97, лемм 105 | **строк 99, лемм 110**, ловушка 14/14, сошлось всё | | `sh flang/proof/checker/tests/run.sh` | сошлось всё | **сошлось всё** (167/135/366; подделок 453 — принято 0, честных 215 — отвергнуто 0) | -| `sh scripts/доказуемость.sh` | ДОКАЗУЕМ | **ДОКАЗУЕМ** (доля 96.62 %) | +| `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` | ДОКАЗУЕМ | **ДОКАЗУЕМ** (доля 96.62 %) | | `flang check flang/self/zapis.flang` | замечаний нет | **замечаний нет** | | `flang check flang/self/proof-kernel.flang` | замечаний нет | **замечаний нет** | diff --git a/docs/tasks/completed/1406-process-nichego-ne-obeshchaet.md b/docs/tasks/completed/1406-process-nichego-ne-obeshchaet.md index d5174da23..453327cca 100644 --- a/docs/tasks/completed/1406-process-nichego-ne-obeshchaet.md +++ b/docs/tasks/completed/1406-process-nichego-ne-obeshchaet.md @@ -130,7 +130,7 @@ - `bootstrap/flang check flang/self/processes.flang` — «проверено … замечаний нет» (17 с); - `bootstrap/flang check flang/test/владение-состоянием.flang` — то же (36 с); - `bootstrap/flang check flang/self/conc.flang` — то же (116 с), файл не менялся; -- `sh scripts/доказуемость.sh` — **ДОКАЗУЕМ** (до правки и после); +- `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — **ДОКАЗУЕМ** (до правки и после); - `sh flang/proof/checker/tests/run.sh` — **сошлось всё**; - `sh flang/test/обход.sh` — чисто, проверок 211 (было 205, прибыло 6 моих). diff --git a/docs/tasks/completed/1418-three-directories-get-english-names.md b/docs/tasks/completed/1418-three-directories-get-english-names.md index 2daecd61c..4a25ac854 100644 --- a/docs/tasks/completed/1418-three-directories-get-english-names.md +++ b/docs/tasks/completed/1418-three-directories-get-english-names.md @@ -123,7 +123,7 @@ ## Проверка после переезда (всё прогоном) sh .githooks/pre-push — зелен - sh scripts/доказуемость.sh — ДОКАЗУЕМ + bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 — ДОКАЗУЕМ sh scripts/guards/pol-dokazannogo-sverka.sh — опись сходится sh scripts/guards/prose-numbers-guard.sh — приметы сошлись sh scripts/guards/published-vs-tree.sh --проза — сходится @@ -153,7 +153,7 @@ | прибор | ответ | |---|---| | `sh flang/proof/corpus-share.sh --проигрыванием` | **629 / 651 = 96,62 %**, исключено мест 22 (без ключа `--проигрыванием` прибор отвечает кодом 2: «назвать набор») | -| `sh scripts/доказуемость.sh` | ДОКАЗУЕМ, код 0 | +| `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` | ДОКАЗУЕМ, код 0 | | `./ярлык расширения:проверка` | код 0, мест отбора 30 | | `sh scripts/guards/task-numbers-guard.sh` | код 0, двойных номеров 0 | | `./ярлык задачник:проверка` | код 0 | @@ -231,7 +231,7 @@ | `sh scripts/guards/pol-dokazannogo-sverka.sh` | опись сходится, код 0 (протухло 121 из 913 — md5 правленных файлов) | — | | `sh scripts/guards/prose-numbers-guard.sh` | 216 из 216, код 0 | — | | `./ярлык опись:сверка` | сходится, 17 языков, код 0 | — | -| `sh scripts/доказуемость.sh` | ДОКАЗУЕМ; **доля 629 / 651 = 96,62 %** | 629 / 651 | +| `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` | ДОКАЗУЕМ; **доля 629 / 651 = 96,62 %** | 629 / 651 | | `./ярлык задачник:проверка`, `task-numbers-guard.sh` | код 0 / код 0 | — | | `bootstrap/flang check` шести правленных `.flang` (corpus-runner, file-extensions, tree-inventory, name-splicing-guard, region-in-c-target, changelog) | у всех «замечаний нет» | — | | `node docs/site/build.mjs --check` | страниц 778, битых ссылок 0 | — | @@ -341,7 +341,7 @@ JavaScript, `./ярлык опись:сверка` покраснела), а н | прибор | ствол `4a438c14` | после Ш1 | после Ш2 | после Ш3 | |---|---|---|---|---| | `corpus-share.sh --проигрыванием` | 629 / 651 = 96,62 % | 629 / 651 = 96,62 % | 629 / 651 = 96,62 % | 629 / 651 = 96,62 % | -| `scripts/доказуемость.sh` | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | +| `scripts/provability.fscript` | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | | `./ярлык расширения:проверка` | код 0 | код 0 | код 0 | код 0 | | `task-numbers-guard.sh` | код 0 | код 0 | код 0 | код 0 | | `./ярлык задачник:проверка` | код 0 | код 0 | код 0 | код 0 | @@ -384,7 +384,7 @@ JavaScript, `./ярлык опись:сверка` покраснела), а н | прибор | ствол `341ee1ec` | вершина ветки | |---|---|---| | `corpus-share.sh --проигрыванием` | 629 / 651 = 96,62 % | 629 / 651 = 96,62 % | -| `scripts/доказуемость.sh` | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | +| `scripts/provability.fscript` | ДОКАЗУЕМ, код 0 | ДОКАЗУЕМ, код 0 | | `./ярлык расширения:проверка` | код 0 | код 0 | | `task-numbers-guard.sh` | код 0 | код 0 | | `./ярлык задачник:проверка` | код 0 | код 0 | @@ -407,7 +407,7 @@ PR #26. Опись доказанного у обоих — «бед 4: нет у обоих, списки те же с точностью до переименованных путей; прибавка комментариев — та же. -**Про сверщика.** На перебазированной вершине `scripts/доказуемость.sh` сначала +**Про сверщика.** На перебазированной вершине `scripts/provability.fscript` сначала ответил «НЕ ДОКАЗУЕМ»: пять честных проб на правила Кон2, Ч5, Разв1, О5 и О6 отвергнуты. Причина не в переездах: собранный в клоне `flang/proof/checker/сверщик` (не отслеживается) был собран 13 сентября, а `checker.c` ствол обновил PR #21, @@ -421,7 +421,7 @@ PR #26. Опись доказанного у обоих — «бед 4: нет набор не повторялся: мои правки те же, а в принесённом нет ни одной ссылки на старые пути (поиск по новым строкам ствола — 0). Быстрый набор совпал со стволом `3b3c89f5`: красное `pre-push` строка в строку то же (`licenzii`, `opis`, `podlog`, -`zov`), доля 629 / 651 = 96,62 % у обоих, `scripts/доказуемость.sh` — ДОКАЗУЕМ у +`zov`), доля 629 / 651 = 96,62 % у обоих, `scripts/provability.fscript` — ДОКАЗУЕМ у обоих, задачник и номера задач — код 0. **Четвёртое перебазирование — на `6fa73f56`.** Конфликт тот же — строка оболочки, @@ -430,7 +430,7 @@ PR #26. Опись доказанного у обоих — «бед 4: нет (`licenzii`, `opis`, `podlog`, `proza`, `zov`; проза красна девятью приметами ствола, которых эта ветка не касается: число `*.flang` 974 → 976, примеры и строки `flang/self`, строки `checker.c`, файлы `flang/proof`), доля 629 / 651 у обоих, -раздел чисел сайта — 0 расхождений у обоих. `scripts/доказуемость.sh` сначала +раздел чисел сайта — 0 расхождений у обоих. `scripts/provability.fscript` сначала ответил «НЕ ДОКАЗУЕМ» и на стволе, и на ветке: ствол снова обновил `checker.c` (`d9dd94b6`); после пересборки сверщика — ДОКАЗУЕМ у обоих. diff --git a/docs/tasks/completed/1435-two-inference-rules-are-replayed-by-the-independent-checker.md b/docs/tasks/completed/1435-two-inference-rules-are-replayed-by-the-independent-checker.md index 4b0356bc3..8cc66ce16 100644 --- a/docs/tasks/completed/1435-two-inference-rules-are-replayed-by-the-independent-checker.md +++ b/docs/tasks/completed/1435-two-inference-rules-are-replayed-by-the-independent-checker.md @@ -34,7 +34,7 @@ **6** (все шесть — объявленные подделки манифеста), код 3 — **0**. Строк «НЕ ВЗЯЛСЯ» — **0**; мест на слове ядра по всем 91 записи — **0**; шагов, отвергнутых из-за Н6/Н7/П6/О8/О9, — **0**. То есть в сегодняшнем корпусе этими пятью правилами терять - нечего: доля и без них 100 % (`scripts/доказуемость.sh`, проверка 2 — 650 из 650). + нечего: доля и без них 100 % (`scripts/provability.fscript`, проверка 2 — 650 из 650). Числа записки (88 записей, 21 запись кодом 3, 17 открытых мест) на этом дереве не воспроизводятся — корпус и сверщик с 10 сентября ушли вперёд. - **26 сентября 2026, приём написан.** В `checker.c`: @@ -66,11 +66,11 @@ | честных записей на эти правила: 1 → 0 обе (`n6-choice`, `o9-derivation`) | `flang/proof/checker/сверщик` прежней сборки (`c3f124c70c1c…`) против новой | | проб на подлог 534 → 543, честных 248 → 250 | `sh flang/proof/checker/tests/run.sh` на `2363d95d3` и на ветке | | строк кода `checker.c` 7593 → 7602 при потолке 7603 | `sh flang/proof/tables-guard.sh --строки-кода` | -| доля проигрыванием 100.00 % (650 из 650), вердикт ДОКАЗУЕМ | `sh scripts/доказуемость.sh` | +| доля проигрыванием 100.00 % (650 из 650), вердикт ДОКАЗУЕМ | `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` | ## Чем закрыта -- `sh scripts/доказуемость.sh` — **ДОКАЗУЕМ**, код 0; четыре проверки: калькулятор снят, +- `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — **ДОКАЗУЕМ**, код 0; четыре проверки: калькулятор снят, доля 100.00 % (650 из 650), набор проб пройден (подделок 543, принято кодом 0 — 0; честных 250, отвергнуто 0), набор не ослаб. - `sh flang/proof/checker/tests/run.sh` — «сошлось всё», код 0. diff --git a/docs/tasks/completed/2416-forgeries-move-out-of-the-metric-corpus.md b/docs/tasks/completed/2416-forgeries-move-out-of-the-metric-corpus.md index be50f217d..ef19dec22 100644 --- a/docs/tasks/completed/2416-forgeries-move-out-of-the-metric-corpus.md +++ b/docs/tasks/completed/2416-forgeries-move-out-of-the-metric-corpus.md @@ -95,7 +95,7 @@ ### Ш4 — вердикт берёт числа прогоном -В `scripts/доказуемость.sh`: +В `scripts/provability.fscript`: * проверка 2 перестаёт быть `DOLYA_PROIGRYVANIEM=0`, вписанным руками, и берёт число из `corpus-share.sh --набор корпус --проигрыванием`; `POROG=95` не @@ -105,7 +105,7 @@ * заводится проверка 4: число строк манифеста и числитель набора не ниже «ratchet.txt». -*Приёмка:* `sh scripts/доказуемость.sh` печатает **НЕ ДОКАЗУЕМ** (проверка 1 +*Приёмка:* `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` печатает **НЕ ДОКАЗУЕМ** (проверка 1 красна: `перепиской(` в чекере), называет числами все четыре проверки, код 1. ### Ш5 — старые правила снять @@ -123,7 +123,7 @@ sh flang/proof/corpus-share.sh --набор корпус --проигрыванием # доля + строка набора sh flang/proof/corpus-share.sh --самопроверка # код 0 sh flang/proof/checker/tests/run.sh # код 0, «сошлось всё» -sh scripts/доказуемость.sh # четыре проверки числами +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 # четыре проверки числами sh .githooks/pre-push # код 0 ``` diff --git a/docs/tasks/completed/2844-checker-razv2-and-razv3-ask-freshness-of-substituted-names.md b/docs/tasks/completed/2844-checker-razv2-and-razv3-ask-freshness-of-substituted-names.md index be07a5365..061883644 100644 --- a/docs/tasks/completed/2844-checker-razv2-and-razv3-ask-freshness-of-substituted-names.md +++ b/docs/tasks/completed/2844-checker-razv2-and-razv3-ask-freshness-of-substituted-names.md @@ -62,7 +62,7 @@ | `corpus-share.sh --проигрыванием` | 650 / 650 | 650 / 650 (обе лжи вынесены из знаменателя по ADR-0023, честных потерь 0) | | строк кода `checker.c` | 7433 | 7467 (+34; потолок 7603 не тронут, до него 136) | | ловушек Lean | 49, отвергнуто 49 | 52, отвергнуто 52 (53 — Разв2 без захвата, 54 — Разв3 по одному, 57 — цепь «по одному» вместо одновременной) | -| `scripts/доказуемость.sh` | ДОКАЗУЕМ | ДОКАЗУЕМ, 4 из 4 | +| `scripts/provability.fscript` | ДОКАЗУЕМ | ДОКАЗУЕМ, 4 из 4 | ## Приёмка Lean догнала сверщика (19 сентября 2026, ветка a/wl1-audit) @@ -117,7 +117,7 @@ | ловушек Lean | 51, отвергнуто 51 | 52, отвергнуто 52 | | аксиом сверх трёх стандартных | 0 | 0 | | перечень правил | 109 из 109 с леммой | 109 из 109 с леммой | -| `scripts/доказуемость.sh` | ДОКАЗУЕМ, 4 из 4 | ДОКАЗУЕМ, 4 из 4 | +| `scripts/provability.fscript` | ДОКАЗУЕМ, 4 из 4 | ДОКАЗУЕМ, 4 из 4 | Сверщик не тронут: `checker.c` не менялся, набор проб тот же (подделок 533, принято кодом 0 — 0; честных 245, отвергнуто 0). diff --git a/docs/tasks/completed/3123-a-precondition-cannot-quantify-over-list-elements.md b/docs/tasks/completed/3123-a-precondition-cannot-quantify-over-list-elements.md index 3d8c9c20f..56b32362a 100644 --- a/docs/tasks/completed/3123-a-precondition-cannot-quantify-over-list-elements.md +++ b/docs/tasks/completed/3123-a-precondition-cannot-quantify-over-list-elements.md @@ -86,7 +86,7 @@ Первая строка таблицы разбирается; проба-тождество — «доказано», запись проиграна сверщиком кодом 0; подделки — код 1 с названной причиной; `flang test flang/self/parser.flang` и `types.flang` зелёные; строк кода -сверщика прибавилось не больше 15; `sh scripts/доказуемость.sh` — ДОКАЗУЕМ. +сверщика прибавилось не больше 15; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ. ## Ход работы @@ -141,7 +141,7 @@ Прибор: `bootstrap/flang test` — parser 495/495, types 354/354, zapis 750/750; `check parser.flang` — замечаний нет; `tables-guard.sh` — красных 2, как на стволе (опоры -Инд2/Инд3 — чужой долг); `доказуемость.sh` — ДОКАЗУЕМ (639 из 662, 96,53 %); Lean 4.33.1 — +Инд2/Инд3 — чужой долг); `provability.fscript` — ДОКАЗУЕМ (639 из 662, 96,53 %); Lean 4.33.1 — «сошлось всё» (правил ведомости не прибавлялось: Т2 в ней с 2026-09-08). До двоичного правка доедет только перепечаткой семени. diff --git a/docs/tasks/completed/3348-the-provability-threshold-is-one-hundred-percent.md b/docs/tasks/completed/3348-the-provability-threshold-is-one-hundred-percent.md index 6249d6ad3..9a5c312a6 100644 --- a/docs/tasks/completed/3348-the-provability-threshold-is-one-hundred-percent.md +++ b/docs/tasks/completed/3348-the-provability-threshold-is-one-hundred-percent.md @@ -18,13 +18,13 @@ Дерево `main` `cbfaf3899`, 17 сентября 2026. -`scripts/доказуемость.sh`: `POROG=95` (строка 131); комментарии строк 97–107 объясняют +`scripts/provability.fscript`: `POROG=95` (строка 131); комментарии строк 97–107 объясняют 95 %. Вердикт при 95 % — «ДОКАЗУЕМ» (`README.md:44`). Доля проигрыванием на `main` — 633 из 650 (`sh /srv/tmp/dokazuemyy/ПЕРЕДАЧА/proverka-dereva.sh`, 17.09); при пороге 100 % вердикт станет «НЕ ДОКАЗУЕМ … 633 из 650» — это честно, а не поломка. Скрипт зовёт только `ярлыки.flang` (`./ярлык доказуемость`); в `.github/workflows/*.yml` -и `.githooks/pre-push` его нет (`git grep доказуемость.sh -- .github .githooks` — 0 строк). +и `.githooks/pre-push` его нет (`git grep provability.fscript -- .github .githooks` — 0 строк). Прогон стоит около 3 минут (ПЕРЕДАЧА, 17.09) — на каждый пуш не ставить. Упоминаний «95 %» как порога вне `flang/proof` и `flang/self`: @@ -35,12 +35,12 @@ docs/benchmark-speed.md:364 (99,95 % пика — не порог). ## Как поймём, что сделано -- `sh scripts/доказуемость.sh` на `main` печатает «НЕ ДОКАЗУЕМ» и +- `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` на `main` печатает «НЕ ДОКАЗУЕМ» и «проверка 2 — доля проигрыванием не ниже 100 %? НЕТ (…: 633 из 650 …)»; - упоминаний «95 %» как ПОРОГА в README.md, docs/README.ru.md, docs/DESCRIPTION.md, docs/ROADMAP.md, docs/site/** и в шапке скрипта — 0; ADR и docs/design — история, не правятся; - работа `.github/workflows/provability.yml` («Доказуемость», `workflow_dispatch` + - `schedule`) существует, зовёт `sh scripts/доказуемость.sh`, красна на «НЕ ДОКАЗУЕМ» + `schedule`) существует, зовёт `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000`, красна на «НЕ ДОКАЗУЕМ» честно — то есть форма работы верна, а её цвет сегодня красный по замеру; - `sh scripts/guards/prose-numbers-guard.sh` — 216 из 216. diff --git a/docs/tasks/completed/3388-bystryj-peresev-semeni-bez-perepechatki.md b/docs/tasks/completed/3388-bystryj-peresev-semeni-bez-perepechatki.md index 444411455..dc3ec1f4b 100644 --- a/docs/tasks/completed/3388-bystryj-peresev-semeni-bez-perepechatki.md +++ b/docs/tasks/completed/3388-bystryj-peresev-semeni-bez-perepechatki.md @@ -51,7 +51,7 @@ Ни один дешёвый заслон приёмки печать не воспроизводит: `--telo` хеширует тело, `--после-печати` сверяет рантайм семени с источником, `--bystro` сверяет входы отпечатка с архивом коммита. Всё это — рехеш и `git archive`, секунды. Печать -воспроизводят только гейт Г6 (`two-prints-identical.sh`, `bootstrap-reprint.sh --check`) +воспроизводят только гейт Г6 (`two-prints-identical.fscript`, `bootstrap-reprint.sh --check`) — их в приёмке быстрого пути нет. Замер быстрого пересева (worktree, отдельный прогон): diff --git a/docs/tasks/completed/3448-the-example-evaluator-of-the-checker-reads-nul-strings-and-filter.md b/docs/tasks/completed/3448-the-example-evaluator-of-the-checker-reads-nul-strings-and-filter.md index 312620953..9d854ba16 100644 --- a/docs/tasks/completed/3448-the-example-evaluator-of-the-checker-reads-nul-strings-and-filter.md +++ b/docs/tasks/completed/3448-the-example-evaluator-of-the-checker-reads-nul-strings-and-filter.md @@ -1,7 +1,7 @@ --- номер: 3448 заголовок: Вычислитель «по примеру» сверщика не знает строки с нулевым знаком и «отфильтровать» — четыре шага корпуса остаются на слове ядра -статус: сделана (приём заведён и прогнан 23 сентября 2026: оба места задачи — код 0, «на слово ядра: шагов 0»; третья мерка — `доказуемость.sh` — не гонялась под печатью семени; перенос в completed/ — за ведущим) +статус: сделана (приём заведён и прогнан 23 сентября 2026: оба места задачи — код 0, «на слово ядра: шагов 0»; третья мерка — `provability.fscript` — не гонялась под печатью семени; перенос в completed/ — за ведущим) исполнитель: a ветка: a/6432-6812-3448-last-places команда: первая @@ -43,7 +43,7 @@ UTF-8 не встречается никогда, и спутать его со | `sh flang/proof/corpus-share.sh --проигрыванием` | 629 / 651, шагов на слове ядра 4 | **630 / 651**, шагов 3 | | corpus-bytes | код 3, шаг «по примеру» не проверен (нулевой знак) | код 0, шагов по существу 3 | | corpus-cforms | 3 шага: «встретился отбор» | 3 шага: «встретился разбор списка по звену» | -| `sh scripts/доказуемость.sh` | ДОКАЗУЕМ | ДОКАЗУЕМ; «калькулятор снят» — ДА (∀-целей на слове ядра 3 из 3) | +| `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` | ДОКАЗУЕМ | ДОКАЗУЕМ; «калькулятор снят» — ДА (∀-целей на слове ядра 3 из 3) | | пробы Ч7104 «нулевой знак» | подделка 3, честная 3 | подделка **1** (отвергнута значением), честная **0** | **Приёмка Lean — не место для этих умений.** Нулевой знак и отбор — умения @@ -91,7 +91,7 @@ UTF-8 не встречается никогда, и спутать его со flang/proof/checker/tests/records/corpus/corpus-bytes.record` → код **0**, и то же для `corpus-cforms`; в обоих ответах «НА СЛОВО ЯДРА … шагов 0». 3. Ловушка «калькулятор снят» осталась зелёной и пробы Ч7104 сошлись: - `sh scripts/доказуемость.sh` → ДОКАЗУЕМ. + `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` → ДОКАЗУЕМ. ### Прогон 23 сентября 2026 diff --git a/docs/tasks/completed/3449-the-example-evaluator-reads-a-list-by-link-and-a-variant-with-fields.md b/docs/tasks/completed/3449-the-example-evaluator-reads-a-list-by-link-and-a-variant-with-fields.md index 81c3010e3..c44b3c68b 100644 --- a/docs/tasks/completed/3449-the-example-evaluator-reads-a-list-by-link-and-a-variant-with-fields.md +++ b/docs/tasks/completed/3449-the-example-evaluator-reads-a-list-by-link-and-a-variant-with-fields.md @@ -63,7 +63,7 @@ | `corpus-cforms` | код 3, «встретился разбор списка по звену» | код 0, шагов на слове ядра 0 | | три согласованные подделки `corpus-cforms` | код 3 — не берусь | код 1, «… НЕ держится» | | `tests/run.sh` | — | подделок 514, кодом 0 — 0; честных 236, отвергнуто 0 | -| `scripts/доказуемость.sh` | ДОКАЗУЕМ | ДОКАЗУЕМ; «калькулятор снят» — ДА | +| `scripts/provability.fscript` | ДОКАЗУЕМ | ДОКАЗУЕМ; «калькулятор снят» — ДА | | строк кода `checker.c` | 7401, потолок 7481 | 7475, потолок 7555 | | `lean/run.sh` (Lean 4.34.0) | ловушек 32; без леммы Т2, ГипО, ГипД, Выч | ловушек 35, отвергнуто 35; без леммы Т2, ГипО, ГипД; сверка вердиктов — 244 пары, расхождений 0 | diff --git a/docs/tasks/completed/3630-seed-lag-has-no-per-function-answer.md b/docs/tasks/completed/3630-seed-lag-has-no-per-function-answer.md index 580cfd375..472da005e 100644 --- a/docs/tasks/completed/3630-seed-lag-has-no-per-function-answer.md +++ b/docs/tasks/completed/3630-seed-lag-has-no-per-function-answer.md @@ -31,8 +31,8 @@ ``` sh scripts/bootstrap-reprint.sh --bystro → код 1 -sh scripts/seed-freshness.sh → код 3 («сверить не удалось», не «прошло») -sh scripts/binary-origin.sh → код 3 +sh scripts/seed-freshness.fscript → код 3 («сверить не удалось», не «прошло») +sh scripts/binary-origin.fscript → код 3 ./ярлык доказанное:проверка → код 3, сборка НЕ НАЧАТА ``` diff --git a/docs/tasks/completed/3781-snyat-kalkulyator-storozh-ne-pruver.md b/docs/tasks/completed/3781-snyat-kalkulyator-storozh-ne-pruver.md index 9dd45ccb6..80d34d36b 100644 --- a/docs/tasks/completed/3781-snyat-kalkulyator-storozh-ne-pruver.md +++ b/docs/tasks/completed/3781-snyat-kalkulyator-storozh-ne-pruver.md @@ -11,7 +11,7 @@ # 3781 — снять калькулятор: сторож остаётся, прувер уходит -Гейт `scripts/доказуемость.sh` держит проверку 1 «калькулятор снят», и держит её +Гейт `scripts/provability.fscript` держит проверку 1 «калькулятор снят», и держит её ГРЕПОМ: `git grep -c -F 'перепиской(' -- checker.c` обязан быть 0. Сегодня он 2, и вердикт печатается НЕ ДОКАЗУЕМ, не доходя до проверок 2 и 3. @@ -127,4 +127,4 @@ ## Чем закрыта -- `db14e818a` — сторож ложной переписки в `checker.c` (коммит помечен номером 9982: задача перенумерована `52bf074a2`); `доказуемость.sh` проверка 1 — ловушка вместо грепа (`9f49c2cfa`). Проверено ревизией задачника 11 сентября 2026: «перепиской(» в сверщике 0 вхождений. +- `db14e818a` — сторож ложной переписки в `checker.c` (коммит помечен номером 9982: задача перенумерована `52bf074a2`); `provability.fscript` проверка 1 — ловушка вместо грепа (`9f49c2cfa`). Проверено ревизией задачника 11 сентября 2026: «перепиской(» в сверщике 0 вхождений. diff --git a/docs/tasks/completed/4025-the-seed-stopped-dropping-processes-and-the-network.md b/docs/tasks/completed/4025-the-seed-stopped-dropping-processes-and-the-network.md index 95a2af7de..508cea053 100644 --- a/docs/tasks/completed/4025-the-seed-stopped-dropping-processes-and-the-network.md +++ b/docs/tasks/completed/4025-the-seed-stopped-dropping-processes-and-the-network.md @@ -89,7 +89,7 @@ compiler_flang_pechat_konkurentnosti_c: 0 Оба файла связки на месте: `scripts/conc-link-emit.flang` (389 строк) и `flang/scripts/conc-link-emitted.flang` (331 строка, `модуль «Печать связи»`). -Примета 1 приёмки жива — `scripts/new-binary-acceptance.sh:106–112`, проверяет +Примета 1 приёмки жива — `scripts/new-binary-acceptance.fscript:106–112`, проверяет ровно `grep -q '_c$'`. Правки задача не требует — требует перепечатки (0003). @@ -108,7 +108,7 @@ grep -ac fl_conc_process bootstrap/compiler_flang.c # н Задача 0041 (слой конкурентности, до которого никто не может дотянуться), 1853, 5855. И примета 1 приёмки нового двоичного -(`scripts/new-binary-acceptance.sh:110`) проверяет именно это. +(`scripts/new-binary-acceptance.fscript:110`) проверяет именно это. ## Переснято 30 августа 2026 на стволе `747fe6ee`: половина задачи закрыта перепечаткой diff --git a/docs/tasks/completed/4058-a-listed-list-a-map-and-an-applied-tag-have-no-all-elements-rule.md b/docs/tasks/completed/4058-a-listed-list-a-map-and-an-applied-tag-have-no-all-elements-rule.md index 346cbd6a1..62bc2a3fb 100644 --- a/docs/tasks/completed/4058-a-listed-list-a-map-and-an-applied-tag-have-no-all-elements-rule.md +++ b/docs/tasks/completed/4058-a-listed-list-a-map-and-an-applied-tag-have-no-all-elements-rule.md @@ -91,7 +91,7 @@ ADR-0026 §11 неизменно). `--строго`, и с ним; каждая подделка — код 1 с названной причиной; Lean принял Э5/Э6 (и Яр1, если заведён) и отверг ловушки; `sh flang/proof/tables-guard.sh` не хуже ствола (сегодня на стволе 2 красных: опоры правил «Инд2» и «Инд3» разъехались со строками `proof-kernel.flang:9251` и `:9284` — чужой долг, не этой задачи); строк кода -сверщика прибавилось не больше 45; `sh scripts/доказуемость.sh` — ДОКАЗУЕМ. +сверщика прибавилось не больше 45; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ. ## Ход работы @@ -166,7 +166,7 @@ ADR-0037 §4.3 и §4.5) и этот файл — следующий комми сторожей зелены (опоры Инд2 и Инд3, красные на стволе, переставлены здесь); - строк кода сверщика: 4058 — 38 из 45, всё ADR-0037 — 52 из 60 (7231 при храповике 7315; на стволе `a2015b08` — 7179 при 7263, прирост ветки тот же +52); -- `sh scripts/доказуемость.sh` — ДОКАЗУЕМ (доля проигрыванием 96.62 %, 629 из 651). +- `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ (доля проигрыванием 96.62 %, 629 из 651). Не сделано здесь, и почему. Запись сквозной переигрывается кодом 3, а не 0: одно место «по объявлению» у «Квадрат» сверщик не повторяет и после влития PR #21 diff --git a/docs/tasks/completed/4838-the-debt-outside-flang-crossed-its-ceiling.md b/docs/tasks/completed/4838-the-debt-outside-flang-crossed-its-ceiling.md index de8339475..c87452d01 100644 --- a/docs/tasks/completed/4838-the-debt-outside-flang-crossed-its-ceiling.md +++ b/docs/tasks/completed/4838-the-debt-outside-flang-crossed-its-ceiling.md @@ -20,8 +20,8 @@ файла своя страница, ссылка из дерева или незакрытая задача. Три вычеркнуты из долга разбором, по единственному дозволенному основанию — -кругу («судья не может исполняться подсудимым»): `build-ledger-binary.sh` (он -СОБИРАЕТ компилятор), `binary-origin.sh` (спрашивает у двоичного о нём самом), +кругу («судья не может исполняться подсудимым»): `build-ledger-binary.fscript` (он +СОБИРАЕТ компилятор), `binary-origin.fscript` (спрашивает у двоичного о нём самом), `overlong-string-guard.sh` (обязан отвечать, когда семя не собирается вовсе). Довод у каждого записан в трёх местах: в шапке файла, в функции «Довод не-долга» и на странице описи. diff --git a/docs/tasks/completed/5144-a-free-statement-with-a-pure-goal-is-proved-by-kernel-rules-and-replayed-by-the-checker.md b/docs/tasks/completed/5144-a-free-statement-with-a-pure-goal-is-proved-by-kernel-rules-and-replayed-by-the-checker.md index e0398f20a..590799aa4 100644 --- a/docs/tasks/completed/5144-a-free-statement-with-a-pure-goal-is-proved-by-kernel-rules-and-replayed-by-the-checker.md +++ b/docs/tasks/completed/5144-a-free-statement-with-a-pure-goal-is-proved-by-kernel-rules-and-replayed-by-the-checker.md @@ -63,7 +63,7 @@ `(н плюс 1) равен н`, подмена типа связывания, пропущенная посылка «таких что», запись без ходов («не бери»). Ловушка проверки 1: три новых вида «снята», цель «на слове» заменена (храповик «на слове» не опущен, «видов» 34 → 37). -- **Ш8 прибор.** `sh scripts/доказуемость.sh` ДОКАЗУЕМ, доля не ниже 625/651, «сошлось всё»; +- **Ш8 прибор.** `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` ДОКАЗУЕМ, доля не ниже 625/651, «сошлось всё»; Lean «сошлось всё»; сторожа ведомости С-1…С-6. ## Чего эта задача НЕ делает @@ -114,7 +114,7 @@ Worktree `/srv/tmp/dokazuemyy/mat-svobodnye`, ветка `r/mat-svobodnye` от | подмена типа и имени связывания, чужое значение в ходе | порча печати ядра | сверщик 1, причина названа | | та же печать с вынутым блоком сведения | порча | сверщик 3, место на слове ядра — цель ловушки «не бери» | | `sh flang/proof/checker/tests/run.sh` | прогон | «сошлось всё»: подделок 431 (принято 0), честных 206 (отвергнуто 0) | -| `sh scripts/доказуемость.sh` | прогон | ДОКАЗУЕМ: 1 ДА (видов 37 из 37, на слове 3 из 3), 2 ДА (625/651 = 96,01 %, снято калькулятором 6), 3 ДА, 4 ДА | +| `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` | прогон | ДОКАЗУЕМ: 1 ДА (видов 37 из 37, на слове 3 из 3), 2 ДА (625/651 = 96,01 %, снято калькулятором 6), 3 ДА, 4 ДА | | Lean 4.33.1 | `flang/proof/lean/run.sh` | «сошлось всё»: строк ведомости 91, лемм 94, искажений 11 — отвергнуты все 11 | | `sh flang/proof/tables-guard.sh` | прогон | «сошлось всё», шесть сторожей зелены | diff --git a/docs/tasks/completed/5190-the-seed-is-reprinted-once-for-the-proof-batch.md b/docs/tasks/completed/5190-the-seed-is-reprinted-once-for-the-proof-batch.md index 7445c514a..4e7986e3d 100644 --- a/docs/tasks/completed/5190-the-seed-is-reprinted-once-for-the-proof-batch.md +++ b/docs/tasks/completed/5190-the-seed-is-reprinted-once-for-the-proof-batch.md @@ -30,9 +30,9 @@ | прибор | до семени | после | |---|---|---| | `sh scripts/bootstrap-reprint.sh --bystro` | «дерево-правлено», происхождения нет | код 0: семя отвечает коммиту `68ff03b34`, и он предок HEAD | -| `sh scripts/seed/seed-freshness.sh` | отказывался судить | код 0 | -| `sh scripts/доказуемость.sh` — доля | 633 / 650 = 97,38 % | **650 / 650 = 100,00 %** | -| `sh scripts/доказуемость.sh` — вердикт | НЕ ДОКАЗУЕМ, код 1 | **ДОКАЗУЕМ, код 0** | +| `bootstrap/flang io scripts/seed/seed-freshness.fscript --plan Check --timeout 300000` | отказывался судить | код 0 | +| `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — доля | 633 / 650 = 97,38 % | **650 / 650 = 100,00 %** | +| `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — вердикт | НЕ ДОКАЗУЕМ, код 1 | **ДОКАЗУЕМ, код 0** | | `sh flang/proof/corpus-share.sh --вложенность` | совпало 73 из 89, честных расхождений 6 | совпало 79, честных расхождений **0** (расходятся только 10 подделок) | | `sh flang/proof/checker/tests/run.sh` | сошлось всё | сошлось всё: подделок 529 (принято 0), честных 244 (отвергнуто 0) | | `sh scripts/guards/pol-dokazannogo-sverka.sh` / `tables-guard.sh` / `pre-push` | 0 / 0 / 0 | 0 / 0 / 0 | @@ -45,7 +45,7 @@ 3 («не берусь») → 0 («проверено»), проигранных выводов 1 → 2. Причина — ядро печатает в запись блок вывода из пяти шагов (Выч, К↑, Разв3 ×3), которого раньше не печатало. -Приёмка нового двоичного (`scripts/seed/new-binary-acceptance.sh`): 4 приметы из 5 сошлись; пятая — +Приёмка нового двоичного (`scripts/seed/new-binary-acceptance.fscript`): 4 приметы из 5 сошлись; пятая — «строка хода» — была нулевой и до печати (давний долг печати хода доказательства), это не регресс. ## Последние одиннадцать мест: где они были и чем закрылись @@ -72,6 +72,6 @@ `flang/proof/checker/checker.c`, который компилятора в себе не несёт: перепечатка даёт ему читаемый текст, а не согласие. -Итог задачи: доля дошла до 650 / 650, вердикт `scripts/доказуемость.sh` — **ДОКАЗУЕМ**, код 0, +Итог задачи: доля дошла до 650 / 650, вердикт `scripts/provability.fscript` — **ДОКАЗУЕМ**, код 0, все четыре проверки зелёные (калькулятор снят; доля 100,00 %; набор проб пройден; набор не ослаб — числитель набора 187 при храповике 155). diff --git a/docs/tasks/completed/5332-the-discharge-of-a-precondition-is-printed-as-a-derivation.md b/docs/tasks/completed/5332-the-discharge-of-a-precondition-is-printed-as-a-derivation.md index 9285df750..cc9c2234d 100644 --- a/docs/tasks/completed/5332-the-discharge-of-a-precondition-is-printed-as-a-derivation.md +++ b/docs/tasks/completed/5332-the-discharge-of-a-precondition-is-printed-as-a-derivation.md @@ -54,7 +54,7 @@ Запись программы с вызовами под `требует` несёт блок снятия на каждое место с именем, местом и выводом; программы без `требует` печатаются байт в байт как -прежде; `flang test` на тронутых файлах зелёный; `sh scripts/доказуемость.sh` — +прежде; `flang test` на тронутых файлах зелёный; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ. ## Ход работы @@ -107,7 +107,7 @@ flang/proof/checker/сверщик tests/families/precondition-discharge/three-f МЕСТ ВЫЗОВА БЕЗ БЛОКА СНЯТИЯ 0. Привязка к программе: SHA-256 сошёлся код 0 sh flang/proof/checker/tests/run.sh → сошлось всё; подделка `unpaid-callee` отвергается -sh scripts/доказуемость.sh → ДОКАЗУЕМ, 4 проверки из 4 +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 → ДОКАЗУЕМ, 4 проверки из 4 ``` Блока снятия в записи «не существовало вовсе» на день замера — сегодня он есть и diff --git a/docs/tasks/completed/5498-the-installed-binary-and-a-fresh-one-report-the-same-version.md b/docs/tasks/completed/5498-the-installed-binary-and-a-fresh-one-report-the-same-version.md index b056ab1f7..913880b29 100644 --- a/docs/tasks/completed/5498-the-installed-binary-and-a-fresh-one-report-the-same-version.md +++ b/docs/tasks/completed/5498-the-installed-binary-and-a-fresh-one-report-the-same-version.md @@ -27,7 +27,7 @@ ## Почему не дата сборки -Она напрашивается первой и её нельзя. `scripts/binary-origin.sh` пересобирает +Она напрашивается первой и её нельзя. `scripts/binary-origin.fscript` пересобирает двоичный из семени этого дерева и сверяет с лежащим ПОБАЙТОВО (`cmp`) — это та самая проверка, которой 23 августа 2026 не было, и шесть суток язык судил двоичный с кодом двух невлитых веток. `__DATE__`/`__TIME__` сделали бы две diff --git a/docs/tasks/completed/5503-nine-tsv-files-carry-a-header.md b/docs/tasks/completed/5503-nine-tsv-files-carry-a-header.md index 44deb42d6..f14a33b7d 100644 --- a/docs/tasks/completed/5503-nine-tsv-files-carry-a-header.md +++ b/docs/tasks/completed/5503-nine-tsv-files-carry-a-header.md @@ -20,7 +20,7 @@ |---|---:|---| | docs/eight-targets-renames.tsv | 1058 | никто (только запись в hand-written-lists-ledger.tsv) | | docs/javascript-checks-breakdown.tsv | 893 | никто (только запись в hand-written-lists-ledger.tsv) | -| docs/reprint-ledger.tsv | 12 | reprint.yml, bootstrap-reprint.sh, seed/reprint-freshness.fscript, seed/seed-freshness.sh | +| docs/reprint-ledger.tsv | 12 | reprint.yml, bootstrap-reprint.sh, seed/reprint-freshness.fscript, seed/seed-freshness.fscript | | flang/translation/PRINT-RULES.tsv | 72 | flang/translation/matcher.c, run.sh | | scripts/ledgers/hand-written-lists-ledger.tsv | 142 | scripts/guards/hand-written-lists.sh, flang/proof/tables/inference-rules.tsv | | scripts/ledgers/link-guard-known-not-a-path.tsv | 248 | ci.yml, guards/file-extensions.fscript, guards/link-guard.fscript | @@ -38,7 +38,7 @@ target-function-drift-known) первая строка — `#`-примечан ссылается на файл в своей шапке, либо файл снесён с доводом здесь; - каждый читатель после правки зелен тем же кодом, что до (число: код до/после у каждого); - `docs/reprint-ledger.tsv` читает `scripts/bootstrap-reprint.sh` — шапку ставить так, чтобы его - разбор не сломался (проверить `sh scripts/seed/seed-freshness.sh` до/после); сам + разбор не сломался (проверить `bootstrap/flang io scripts/seed/seed-freshness.fscript --plan Check --timeout 300000` до/после); сам `bootstrap-reprint.sh` не править. ## Сделано (17 сентября 2026, ветка `a/5503-nine-tsv-files-carry-a-header`) @@ -57,7 +57,7 @@ target-function-drift-known) первая строка — `#`-примечан | файл | кто читает (код) | как пропускает шапку | код до / после | |---|---|---|---| | docs/eight-targets-renames.tsv | никто из приборов; человек — по ссылке из `docs/eight-targets-collision-map.md`; перепись перечней лишь считает в ней имена целей | строка без имён целей | перечни 1 / 1 (новых 59, мёртвых 29 — те же; строка перечня 2 → 3) | -| docs/reprint-ledger.tsv | `scripts/seed/reprint-freshness.fscript`; `reprint.yml`, `bootstrap-reprint.sh`, `seed-freshness.sh` только называют файл | «Поле» за краем строки без табуляции даёт «» | reprint-freshness 1 / 1 (тот же текст: сверка 2026-09-08 устарела); seed-freshness 3 / 3 (тот же текст) | +| docs/reprint-ledger.tsv | `scripts/seed/reprint-freshness.fscript`; `reprint.yml`, `bootstrap-reprint.sh`, `seed-freshness.fscript` только называют файл | «Поле» за краем строки без табуляции даёт «» | reprint-freshness 1 / 1 (тот же текст: сверка 2026-09-08 устарела); seed-freshness 3 / 3 (тот же текст) | | flang/translation/PRINT-RULES.tsv | `flang/translation/run.sh` (`перевод:проверка`); `matcher.c` держит список литералом | `awk '!/^#/ && $1 != "имя"'` | 0 / 0 (41 правило, 21 опыт — тот же текст) | | scripts/ledgers/hand-written-lists-ledger.tsv | `scripts/guards/hand-written-lists.sh --check` (`перечни:проверка`) | `grep -v '^#'` | 1 / 1 (новых 59, мёртвых 29) | | scripts/ledgers/link-guard-known-not-a-path.tsv | `scripts/guards/link-guard.fscript` (`ссылки:проверка`); `file-extensions.fscript` вынимает файл из переписи | первая строка отброшена как заголовок | ссылки 1 / 1 (битых 36 из 7051, список тот же, устаревших исключений 1); расширения 0 / 0 (тот же текст) | diff --git a/docs/tasks/completed/5578-the-proved-share-is-one-number-with-its-warning-attached.md b/docs/tasks/completed/5578-the-proved-share-is-one-number-with-its-warning-attached.md index 83f8bb353..eaa1ae6ba 100644 --- a/docs/tasks/completed/5578-the-proved-share-is-one-number-with-its-warning-attached.md +++ b/docs/tasks/completed/5578-the-proved-share-is-one-number-with-its-warning-attached.md @@ -238,7 +238,7 @@ sh scripts/published-vs-tree.sh --доля ### Что осталось красным и почему это не недоделка -`sh scripts/seed-freshness.sh` отвечает отказом: семя отстало от исходников на +`sh scripts/seed-freshness.fscript` отвечает отказом: семя отстало от исходников на 5 файлов (`flang/self/bootstrap/compiler.flang`, `emit-js.flang`, `io.flang`, `parser.flang`, `proof-initial.flang`). Пока семя не перепечатано, раздел `--доля` красен по построению, и **код 0 недостижим никаким пушем** — это работа diff --git a/docs/tasks/completed/5822-two-prints-check-skips-the-printed-compiler.md b/docs/tasks/completed/5822-two-prints-check-skips-the-printed-compiler.md new file mode 100644 index 000000000..bcf74e81e --- /dev/null +++ b/docs/tasks/completed/5822-two-prints-check-skips-the-printed-compiler.md @@ -0,0 +1,68 @@ +--- +номер: 5822 +заголовок: Сверка двух печатей не сверяет напечатанный компилятор — сличаются только четыре файла рантайма +статус: сделана +приоритет: P0 +исполнитель: a +ветка: a/5821-seed-and-target-scripts-are-plans +команда: вторая +карта: Что мешает больше всего +рядом: 5821 +нужность: 27 сентября 2026 — байт, дописанный в bootstrap/compiler_flang.c второй печати, и пропавший bootstrap/Makefile прибор принял кодом 0; по этой сверке принимается печать семени +--- + +# 5822. Сверка двух печатей не сверяет напечатанный компилятор + +## Шаги воспроизведения + +1. Два дерева-близнеца: `bootstrap/*.c`, `*.h`, `Makefile`, `flang/src/emit/c`, + `scripts/seed-fingerprint` и журнал `print.log` со строкой `ПЕЧАТЬ КОД=0` рядом с + каждым деревом. +2. Во втором дереве дописать байт: `printf x >> second/tree/bootstrap/compiler_flang.c`. +3. `sh scripts/seed/two-prints-identical.sh first/tree second/tree` (ствол `7b3a73873`). + +## Что происходит + +``` +$ sh scripts/seed/two-prints-identical.sh first/tree second/tree +печати совпали побайтово: файлов 4, байт 1414862 код 0 +``` + +То же при удалённом `second/tree/bootstrap/Makefile` — код 0, «файлов 4». + +Версия: flang 0.7.22. Прогон 27 сентября 2026. + +Причина: список сверяемых имён берётся `ls -A <дерево>/flang/src/emit/c` — это +копируемый рантайм, четыре файла. Напечатанная часть — `compiler_flang.c`, +`compiler_flang.h`, `Makefile` — в список не попадает никогда. Так с первого +коммита прибора (`365d0af1e`). + +## Что должно быть + +Две печати одного дерева совпадают во ВСЕХ файлах, из которых соберётся двоичный. +Их перечень задаёт сама печать: раздел «тело семени» в `scripts/seed-fingerprint`. + +## Обходной путь + +`cmp` каждого файла `bootstrap/` руками. + +## Когда задача сделана + +- `bootstrap/flang io scripts/seed/two-prints-identical.fscript --plan Check --timeout 1800000 -- first/tree second/tree` + сверяет объединение рантайма и тела семени из отпечатка каждого дерева и называет + сверенные файлы строкой «сверены: …». Отпечатка без тела нет — «НЕ ПРОВЕРЕНО», код 3. +- План `Forgery` того же файла строит близнецов из дерева и требует трёх ответов: + +| опыт | ждём | план с правкой | план без правки (список только из рантайма) | +|---|---|---|---| +| два одинаковых дерева | код 0, «файлов 7», «сверены: …, Makefile, compiler_flang.c, compiler_flang.h» | код 0 | код 0, но сверены 4 файла — опыт красен | +| байт в `compiler_flang.c` | код 1, «РАЗОШЁЛСЯ: bootstrap/compiler_flang.c» | код 1 | код 0 | +| нет `Makefile` | код 1, «РАЗОШЁЛСЯ: bootstrap/Makefile» | код 1 | код 0 | + +`bootstrap/flang io scripts/seed/two-prints-identical.fscript --plan Forgery --timeout 600000` — +код 0 за 27,9 с; с правкой, снятой обратно, — код 1 и все три опыта названы. + +## Где живёт правка + +`scripts/seed/two-prints-identical.fscript` (функции «Body names», «Side names», +план `Forgery`). Двоичного не касается: ни пересева, ни перепечатки не требует. diff --git a/docs/tasks/completed/5823-new-binary-acceptance-stops-at-the-kernel-rules-sign.md b/docs/tasks/completed/5823-new-binary-acceptance-stops-at-the-kernel-rules-sign.md new file mode 100644 index 000000000..1013261d0 --- /dev/null +++ b/docs/tasks/completed/5823-new-binary-acceptance-stops-at-the-kernel-rules-sign.md @@ -0,0 +1,51 @@ +--- +номер: 5823 +заголовок: Приёмка нового двоичного обрывается на четвёртой примете — переменная пробы названа двумя именами +статус: сделана +приоритет: P1 +исполнитель: a +ветка: a/5821-seed-and-target-scripts-are-plans +команда: вторая +карта: Что мешает больше всего +рядом: 5821 +нужность: 27 сентября 2026 — приёмка на стволе падает кодом 2 на каждом дереве, приметы 4–6 не снимаются ни разу +--- + +# 5823. Приёмка нового двоичного обрывается на четвёртой примете + +## Шаги воспроизведения + +1. Дерево с собранным `bootstrap/flang` (ствол `7b3a73873`). +2. `sh scripts/seed/new-binary-acceptance.sh <дерево>`. + +## Что происходит + +``` +=== ПРИМЕТА 4 — правила ядра работают (прогон, а не таблица имён) +scripts/seed/new-binary-acceptance.sh: 92: PROBA: parameter not set код 2 +``` + +Строка 19 заводит `PROBE=…/new-binary-acceptance-probe.flang`, строка 92 читает +`"$PROBA"`; при `set -u` скрипт обрывается. Имя переменной сменили при переводе имён +на английский в одном месте из двух. + +Версия: flang 0.7.22. Прогон 27 сентября 2026. + +## Что должно быть + +Все шесть примет сняты, итог — «принят» или «примет не сошлось: N». + +## Обходной путь + +Нет: приметы 4–6 руками. + +## Когда задача сделана + +`bootstrap/flang io scripts/seed/new-binary-acceptance.fscript --plan Accept --timeout 3600000 -- /srv/tmp/dokazuemyy/wScripts` +прошёл все шесть примет за 212 с: примета 4 — «правил ядра доехало 3 из 4», итог — +«примет не сошлось: 1» (строки хода в двоичном нет), код 1. Путь пробы в плане +строится одной функцией, второго имени у него нет. + +## Где живёт правка + +`scripts/seed/new-binary-acceptance.fscript`; скрипт оболочки снят (задача 5821). diff --git a/docs/tasks/completed/5930-the-tenth-flangrc-key-is-read-by-the-binary-and-hidden-by-the-script.md b/docs/tasks/completed/5930-the-tenth-flangrc-key-is-read-by-the-binary-and-hidden-by-the-script.md index d99172a41..e9e209812 100644 --- a/docs/tasks/completed/5930-the-tenth-flangrc-key-is-read-by-the-binary-and-hidden-by-the-script.md +++ b/docs/tasks/completed/5930-the-tenth-flangrc-key-is-read-by-the-binary-and-hidden-by-the-script.md @@ -190,7 +190,7 @@ $ sh .githooks/pre-push Если правка в этом месте всё же понадобится, её цена названа точно: `flang/src/emit/c/flang_repl.c` — **копируемая** часть семени -(`scripts/seed/seed-runtime-is-source.sh`: семя рантайма = шапка + источник), +(`scripts/seed/seed-runtime-is-source.fscript`: семя рантайма = шапка + источник), поэтому доставка — **быстрый пересев, минуты**, а не 21 час печати. Печать 21 час стоит только `bootstrap/compiler_flang.c`, печатаемый из `flang/self`, и к ключам `.flangrc` он отношения не имеет. diff --git a/docs/tasks/completed/5957-nested-quantifiers-over-elements-are-not-sayable.md b/docs/tasks/completed/5957-nested-quantifiers-over-elements-are-not-sayable.md index e52482046..38328a3b4 100644 --- a/docs/tasks/completed/5957-nested-quantifiers-over-elements-are-not-sayable.md +++ b/docs/tasks/completed/5957-nested-quantifiers-over-elements-are-not-sayable.md @@ -82,7 +82,7 @@ - `sh flang/proof/checker/tests/run.sh` — «сошлось всё»; - `LEAN=… sh flang/proof/lean/run.sh` — «сошлось всё», искажений 12; - `sh flang/proof/tables-guard.sh` — шесть сторожей зелены; -- `sh scripts/доказуемость.sh` — ДОКАЗУЕМ, доля не ниже 625/651. +- `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ, доля не ниже 625/651. ## Ход работы @@ -143,7 +143,7 @@ sh flang/proof/checker/tests/run.sh → сошлось всё (подде честных 248, отвергнуто 0) sh flang/proof/lean/run.sh → сошлось всё, расхождений 0 sh flang/proof/tables-guard.sh → код 0 -sh scripts/доказуемость.sh → ДОКАЗУЕМ, доля 650 / 650 = 100,00 % +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 → ДОКАЗУЕМ, доля 650 / 650 = 100,00 % ``` Обе честные программы семьи «вложенный-квантор» доказываются, порчи семьи (они в наборе diff --git a/docs/tasks/completed/6047-moving-the-s1-printer-changes-the-class-of-the-fold-over-empty-forgery.md b/docs/tasks/completed/6047-moving-the-s1-printer-changes-the-class-of-the-fold-over-empty-forgery.md index 377aaf466..72f85bc36 100644 --- a/docs/tasks/completed/6047-moving-the-s1-printer-changes-the-class-of-the-fold-over-empty-forgery.md +++ b/docs/tasks/completed/6047-moving-the-s1-printer-changes-the-class-of-the-fold-over-empty-forgery.md @@ -41,7 +41,7 @@ md5, а не смысл). |---|---|---| | `сверщик poddelka-svyortka-nad-pustym.{flang,запись}` | **код 1**, «НЕ СОШЛОСЬ … у цели … стороны равенства разные; ход конец стоит без «ход цель»» | **код 3**, «НЕ ПРОВЕРЕНО — запись не противоречит исходнику» | | `run.sh` | сошлось всё; подделок 200 — отвергнуто 151, третий исход 49; «класс «лжёт-запись»: отвергнуто **1 из 1**» | сошлось всё; отвергнуто 150, третий исход 50; «класс «лжёт-запись»: отвергнуто **0 из 1**» | -| `scripts/доказуемость.sh` | доля **79.42 %** (517 из 651), недостижимых вынесено **14**; проверка 4: числитель 143 при храповике 143 | доля **79.15 %** (524 из 662), недостижимых вынесено **0**; проверка 4: числитель 150 при храповике 143 | +| `scripts/provability.fscript` | доля **79.42 %** (517 из 651), недостижимых вынесено **14**; проверка 4: числитель 143 при храповике 143 | доля **79.15 %** (524 из 662), недостижимых вынесено **0**; проверка 4: числитель 150 при храповике 143 | Проверки 1, 3 и 4 остаются «ДА» в обоих случаях, и `run.sh` в обоих говорит «сошлось всё»: провалом он считает только приём подделки кодом 0, а переход diff --git a/docs/tasks/completed/6128-the-way-to-take-a-ledger-nothing-could-take-is-written-down.md b/docs/tasks/completed/6128-the-way-to-take-a-ledger-nothing-could-take-is-written-down.md index 8194cbe6f..fec01c63b 100644 --- a/docs/tasks/completed/6128-the-way-to-take-a-ledger-nothing-could-take-is-written-down.md +++ b/docs/tasks/completed/6128-the-way-to-take-a-ledger-nothing-could-take-is-written-down.md @@ -109,7 +109,7 @@ env PAMYAT=45G /srv/flang-rabota/vorota/flang-vorota -- … ## Чем закрыта Коммит `f680fc19`, ветка `b/6128-priyom-vedomosti`, 30 августа 2026, ствол -`747fe6ee`. В дереве: `scripts/build-ledger-binary.sh` (двоичный), +`747fe6ee`. В дереве: `scripts/build-ledger-binary.fscript` (двоичный), `scripts/take-proof-ledger.sh` (ведомость одного файла и доля самого файла), `docs/kernel-ledger.md` (страница с приёмом, ловушками и границами). `flang/self/**` и `bootstrap/**` не тронуты. @@ -117,7 +117,7 @@ env PAMYAT=45G /srv/flang-rabota/vorota/flang-vorota -- … **Приём проверен прогоном, а не чтением.** Двоичный `f32d89f599dd6b9f740f42a752dff1ff` — тот самый, которым снята ведомость ядра и которым 7205 снимает срезы сегодня, — воспроизведён ПОБАЙТОВО одной строкой -`KOMMIT=4a26cf05 sh scripts/build-ledger-binary.sh` (66,64 с, пик 1 087 412 КиБ, +`KOMMIT=4a26cf05 sh scripts/build-ledger-binary.fscript` (66,64 с, пик 1 087 412 КиБ, `cmp` с чужой копией — код 0). Все семь его файлов взяты из одного коммита `4a26cf05`; догадка о двух коммитах опровергнута замером (`614858cd` даёт 14 046 520 байт вместо 14 065 960). Этим воспроизведённым двоичным снята diff --git a/docs/tasks/completed/6190-node-replay-covers-fold-and-non-negative-goals.md b/docs/tasks/completed/6190-node-replay-covers-fold-and-non-negative-goals.md index 24b528b8d..b1a40961c 100644 --- a/docs/tasks/completed/6190-node-replay-covers-fold-and-non-negative-goals.md +++ b/docs/tasks/completed/6190-node-replay-covers-fold-and-non-negative-goals.md @@ -82,7 +82,7 @@ знаменателе 651; баланс знаменателя сходится и печатается. 2. `sh flang/proof/checker/tests/run.sh` — код 0: ни одна подделка не принята, ни одна честная запись не отвергнута. -3. `sh scripts/доказуемость.sh` — проверка 1 (ловушка калькулятора) остаётся +3. `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — проверка 1 (ловушка калькулятора) остаётся зелёной в обе стороны: обе всеобщие цели на слове ядра, тождество знак в знак цело. 4. На каждый новый домен цели заведена проба на подлог: ложная цель того же вида diff --git a/docs/tasks/completed/6202-the-ceiling-is-a-type-property-not-a-proved-obligation.md b/docs/tasks/completed/6202-the-ceiling-is-a-type-property-not-a-proved-obligation.md index 143e3fc57..514a6a243 100644 --- a/docs/tasks/completed/6202-the-ceiling-is-a-type-property-not-a-proved-obligation.md +++ b/docs/tasks/completed/6202-the-ceiling-is-a-type-property-not-a-proved-obligation.md @@ -78,7 +78,7 @@ Worktree `/srv/tmp/dokazuemyy/wA`, ветка `r/6202-6203-cheker` от `gh/dev` |---|---| | `sh flang/proof/corpus-share.sh --набор корпус --проигрыванием` | **567 / 651 = 87,10 %**; числитель набора 155 (храповик 155) | | `sh flang/proof/checker/tests/run.sh` | «сошлось всё»: подделок 265 (принято кодом 0 — 0), честных 142 (отвергнуто 0), набор подделок 31 из 31 | -| `sh scripts/доказуемость.sh` | 1 ДА, 2 НЕТ (87,10 %), 3 ДА, 4 ДА | +| `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` | 1 ДА, 2 НЕТ (87,10 %), 3 ДА, 4 ДА | Ожидание постановки «237 / 141» снято на голове `4d13d5a88` (проект 6203 §2.5); на `2a97c8204` набор проб больше — 265 / 142, те же числа стоят в таблице §1.2 проекта @@ -102,7 +102,7 @@ Worktree `/srv/tmp/dokazuemyy/wA`, ветка `r/6202-6203-cheker` от `gh/dev` | (2) abilities / poddelka-dlina / sources / boundaries / corpus-natural-ceiling | коды 3/0/0/3/0 как в базлайне | 3/0/0/3/0, вывод сверщика на всех пяти побайтно тот же, что у бинаря `2a97c8204` | | (3) подделка «П3 с основанием `строка N` без посылки» (`corrupt/p3-without-premise.record` = прежняя `inference.record`) | код 1 | **красная до правки**: бинарь `2a97c8204` — код 0; после — код 1, причина «П3 — посылки нет: объявление типа (строка 36) посылкой не является» | | (4) `run.sh` | «сошлось всё» | «сошлось всё»: подделок 274 (принято 0), честных 144 (отвергнуто 0) | -| `доказуемость.sh` | 1/3/4 ДА | 1 ДА, 2 НЕТ (87,10 %), 3 ДА, 4 ДА | +| `provability.fscript` | 1/3/4 ДА | 1 ДА, 2 НЕТ (87,10 %), 3 ДА, 4 ДА | Честная `inference.record` переснята на форму §2.4 (строка обязательства + Пред1 → П3 `из 1` → Разв2): код 0, «выводов факта о типе проиграно заново 8». На бинаре `2a97c8204` она даёт код 1 @@ -137,7 +137,7 @@ ADR-0022 §3); `flang/proof/tables-guard.sh:243` — «Пред» в закры | `tables-guard.sh` после — зелёный | код 0: «сошлось всё: 79 строк ведомости, четыре сторожа зелены»; правил 67 (по ADR §3 — 55), запретов 12 (5); входов у всех стрелок 61 | | `tables-guard.sh --подлоги` | код 0, «сошлось» | | `lean/run.sh` | **НЕ ПРОВЕРЕНО**: Lean в дереве и в PATH нет (код 2); лемм в файле 85 при 79 строках (как и прежде 84 при 78 — у части строк по две леммы) | -| гейт A-v после c2 | `run.sh` «сошлось всё» (274/0, 144/0); доля **567 / 651**, числитель набора 155; `доказуемость.sh` 1 ДА, 3 ДА, 4 ДА | +| гейт A-v после c2 | `run.sh` «сошлось всё» (274/0, 144/0); доля **567 / 651**, числитель набора 155; `provability.fscript` 1 ДА, 3 ДА, 4 ДА | ### 11 сентября 2026 — И3 сверен на семени, ведомость и Lean договорены; задача закрыта @@ -155,7 +155,7 @@ Worktree `/srv/tmp/dokazuemyy/kvantory`, ветка `r/kvantory` от `gh/dev` ` | строка П3 ведомости | «сверено» код-шире → **код**; «побочные» — описание печати ядра вместо «до И3»; комментарий семейства Пред — то же; `tables/inference-rules.digest` переснят (`43a4c1bd…` → `cf1b0ea5…`); `tables-guard.sh` код 0, `--подлоги` «сошлось» | | `lean/Rules.lean` | копия строки П3 в комментарии леммы обновлена дословно; лемма не менялась; `lean/run.sh` (Lean 4.33.1): леммы приняты все (85), ловушка 8 из 8, «сошлось всё» | | `corpus-share.sh --набор корпус --проигрыванием` | **625 / 651 = 96,01 %** (было 567 / 651 на базлайне 9 сентября; порог задачи «не ниже 567 / 651» — держится), на слово ядра 16 + 4 шага, калькулятором 6 | -| `доказуемость.sh` | 1 ДА (34 из 34), 2 ДА (96,01 %), 3 ДА (401/0, 198/0), 4 ДА | +| `provability.fscript` | 1 ДА (34 из 34), 2 ДА (96,01 %), 3 ДА (401/0, 198/0), 4 ДА | Не сделано (по границам задачи): П1, П2, П4–П6 посылки не получили — ADR-0025 §8 п.2 говорит обо всём семействе, задача — об одном П3; случай 2 `из_объявленного` (потолок по типу результата) diff --git a/docs/tasks/completed/6203-the-carrier-of-induction-is-a-closed-list-of-three-in-two-places.md b/docs/tasks/completed/6203-the-carrier-of-induction-is-a-closed-list-of-three-in-two-places.md index 5f2f570f9..74bcf6269 100644 --- a/docs/tasks/completed/6203-the-carrier-of-induction-is-a-closed-list-of-three-in-two-places.md +++ b/docs/tasks/completed/6203-the-carrier-of-induction-is-a-closed-list-of-three-in-two-places.md @@ -73,7 +73,7 @@ - `grep -n 'algebra\|segment\|fold' flang/proof/checker/checker.c` не показывает закрытого перечисления на 6641–6644; - новая подделка отвергнута, и причина названа поимённо; -- `sh scripts/доказуемость.sh` печатает «проверка 1 — калькулятор снят? ДА». +- `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` печатает «проверка 1 — калькулятор снят? ДА». ## Ход работы @@ -111,7 +111,7 @@ Worktree `/srv/tmp/dokazuemyy/wA`, ветка `r/6202-6203-cheker` от `gh/dev` | `tables-guard.sh` с С-5 | код 0: «79 строк ведомости, пять сторожей зелены»; имён 6/6/6; `--подлоги` код 0; копия сверщика без «натуральное» — С-5 **КРАСНО** («таблица разошлась с НАТУРАЛЬНОЕ[]»), код 1 | | исходники семьи ядром (`bootstrap/flang` из worktree `r4135`, только чтение) | все три — код 0, «сетка 1», `вердикт нет вердикта`; шапки, посчитанные помощником, равны шапкам ядра знак в знак | | доверенная база (К9) | `checker.c` 8753 → 9079 строк (+326 при мандате +600, потолок 9353); `ПРИМИТИВЫ[]` = 15 | -| гейт A-v после Ш0 | `run.sh` «сошлось всё»: подделок 281 (принято кодом 0 — 0), честных 146 (отвергнуто 0); доля **567 / 651 = 87,10 %** (недостижимых вынесено 14 → 16: две новые записи набора по одному месту), числитель набора 155; `доказуемость.sh` 1 ДА, 2 НЕТ, 3 ДА (набор 33 из 33), 4 ДА (33 при храповике 33; 155 при 155) | +| гейт A-v после Ш0 | `run.sh` «сошлось всё»: подделок 281 (принято кодом 0 — 0), честных 146 (отвергнуто 0); доля **567 / 651 = 87,10 %** (недостижимых вынесено 14 → 16: две новые записи набора по одному месту), числитель набора 155; `provability.fscript` 1 ДА, 2 НЕТ, 3 ДА (набор 33 из 33), 4 ДА (33 при храповике 33; 155 при 155) | Не сделано (по границам Ш0): `checker.flang` (третий читатель, 874–901) — не тронут, блока `вывод` и объявлений он не знает и сегодня; строка `объявление …` в записи — Ш2; ядро — Ш1; @@ -143,7 +143,7 @@ Worktree `/srv/tmp/dokazuemyy/wA3`, ветка `r/a-sh2` от `gh/dev` `71af9d67 | 327 записей дерева, dev против нового | расхождений 0 среди прежних 308; 19 — ровно новые записи семьи | | строки кода (С-6) | 5737 → 5782 (+45), в счёт ADR-0026 +600; строка расхода в `ratchet.txt` | | `run.sh` | «сошлось всё»: подделок 299 (принято кодом 0 — 0), честных 153 (отвергнуто 0) | -| доля / вердикт | 567 / 651 = 87,10 % (поручился 85 из 88); `доказуемость.sh` 1 ДА, 2 НЕТ, 3 ДА (299/0, 153/0), 4 ДА | +| доля / вердикт | 567 / 651 = 87,10 % (поручился 85 из 88); `provability.fscript` 1 ДА, 2 НЕТ, 3 ДА (299/0, 153/0), 4 ДА | Не сделано: честной записи с `запись «Т»` (объект) нет — ядро по объекту принципа не даёт (матрица ADR-0026, ф02), строка для него только грамматикой; встроенная `строка` под algebra — варианты взяты @@ -173,7 +173,7 @@ Worktree `/srv/tmp/dokazuemyy/kvantory`, ветка `r/kvantory` от `gh/dev` ` | К7 существование со свидетелем | разбор `c0f5c5213`, `5634975ad`; ядро `f914dea72` (`proofterm.flang:3666`); печать `ff380a97d`, `f2472bde4` (`zapis.flang:5299`) | `5f46157f2`, `796abf27c` | да | **все четыре исходника семьи «существование» — `FLANG_TYPE: неизвестный вид выражения «exists»`**: «Тип узла» (`types.flang:3429`) вида `exists` не знает; `ф10б` — `FLANG_UNKNOWN_NAME`. Записи семьи рукотворные (README семьи), ядро их не печатает | | К8 индукция по функции — именованный отказ | `a5f082fb0` | — | да | не гонялось (входа в семьях нет) | | К9 бюджет сверщика | — | `b8e12a3dd`, `1b50ad85f` | — | С-6 зелен (`tables-guard.sh`) | -| К11 ловушка по видам | — | `9f49c2cfa`, `1b50ad85f` | — | `доказуемость.sh` проверка 1: видов 34 из 34 | +| К11 ловушка по видам | — | `9f49c2cfa`, `1b50ad85f` | — | `provability.fscript` проверка 1: видов 34 из 34 | | К12 словарь | `147b3e0fc` | — | да | слова `есть такой`/`а именно`/`таких что` разбираются (К5/К7 доходят до типов) | Вывод: из порядка ADR-0026 §11 в ствол не доехали два места. (1) П.7 — существование: разбор, @@ -183,7 +183,7 @@ Worktree `/srv/tmp/dokazuemyy/kvantory`, ветка `r/kvantory` от `gh/dev` ` `FLANG_PROOF_STEP` при ожидании 0 в README семьи) в этой задаче не разбирается — записано здесь, чтобы не потерялось. -Прибор на `2c40752d0` (семя и сверщик собраны здесь): `доказуемость.sh` — 1 ДА (видов 34 из 34), +Прибор на `2c40752d0` (семя и сверщик собраны здесь): `provability.fscript` — 1 ДА (видов 34 из 34), 2 ДА (96,01 %: 625 из 651, вынесено 16), 3 ДА (подделок 401, принято 0; честных 197, отвергнуто 0), 4 ДА; `corpus-share.sh --набор корпус --проигрыванием` — 625 / 651, на слово ядра 16 + шагов 4, снято калькулятором 6, знаменатель 651 + 16 = 667 сошёлся; `run.sh` — «сошлось всё»; @@ -199,12 +199,12 @@ Lean 4.33.1 — леммы приняты все (85 в файле, 88 стро | `для всех л обеспечивает …` при `л: список числа` | новая проба `families/carrier/list-of-numbers.flang`: семя — код 0, «доказано 1 (из них индукцией 1)»; запись: `принцип тип «список» по «л» носитель algebra база 1 шаг 1` + `объявление встроенный «список» варианты «пусто» 0 «голова и хвост» 1`; сверщик — код 0, «всё доказанное проиграно заново» | | `grep -n 'algebra\|segment\|fold' checker.c` | закрытый список трёх слов остался (`сверить_покрытие`, слова записи — не носители по типу); носитель ВЫВОДИТСЯ из объявления довода (`объявление_типа`), прочее — «принципа индукции по нему нет», код 1 | | подделка отвергнута поимённо | `poddelka-nositel-chislo-segment`, `poddelka-nositel-psevdonim-ne-otrezok`: «довод «н» объявлен типом «число»/«Мера» — принципа индукции по нему нет: объявление не сумма, не запись, не отрезок» | -| `доказуемость.sh` проверка 1 | ДА (видов 34 из 34) | +| `provability.fscript` проверка 1 | ДА (видов 34 из 34) | Ш3 (тексты): `docs/flang/proof/SPEC.md` §3г-бис (носитель с объявления, пример печати семени), легенда `flang/self/proof.flang` у объекта «Индукция» (какой из трёх — решает объявление), `docs/flang/proof/checker/README.md` (строка про семьи 6202/6203/ADR-0026), ADR-0026 §11 «Исполнение». -Проба вплетена в `run.sh`: честных 197 → 198, «сошлось всё»; `доказуемость.sh` — 4 ДА, +Проба вплетена в `run.sh`: честных 197 → 198, «сошлось всё»; `provability.fscript` — 4 ДА, доля 625 / 651 (не менялась: семьи в корпус не входят). Правка легенды в `proof.flang` — комментарий, в семя не едет и поведения не меняет. diff --git a/docs/tasks/completed/6205-existence-is-parsed-and-proved-but-not-typed.md b/docs/tasks/completed/6205-existence-is-parsed-and-proved-but-not-typed.md index a30a61271..7d0201814 100644 --- a/docs/tasks/completed/6205-existence-is-parsed-and-proved-but-not-typed.md +++ b/docs/tasks/completed/6205-existence-is-parsed-and-proved-but-not-typed.md @@ -89,7 +89,7 @@ Worktree `/srv/tmp/dokazuemyy/kvantory`, ветка `r/kvantory` от `gh/dev` ` | `bootstrap/flang check flang/self/types.flang` / `interpret.flang` | код 0, «проверено — разбор, типы, завершаемость, ядро и примеры; замечаний нет» | | записи семьи | `ф10к` заменена печатью ядра (толкованием); `fact-with-a-witness.record` оставлена рукотворной (см. выше), печать ядра — отдельным файлом и отдельной пробой в `run.sh`; «сошлось всё», честных 198 → 199 | -Прибор до и после (семя не менялось, корпус не трогался): `доказуемость.sh` ДОКАЗУЕМ — 1 ДА (видов +Прибор до и после (семя не менялось, корпус не трогался): `provability.fscript` ДОКАЗУЕМ — 1 ДА (видов 34 из 34), 2 ДА (625 из 651 = 96,01 %, вынесено 16), 3 ДА (подделок 401, принято 0; честных 198 → 199, отвергнуто 0), 4 ДА; Lean 4.33.1 — 85 лемм, 88 строк ведомости, «сошлось всё». Новых правил вывода нет (типизация — не правило ядра), `tables/inference-rules.tsv` не тронут. diff --git a/docs/tasks/completed/6206-forall-over-list-elements-is-not-sayable.md b/docs/tasks/completed/6206-forall-over-list-elements-is-not-sayable.md index 4a565e34b..5ee7e6a7c 100644 --- a/docs/tasks/completed/6206-forall-over-list-elements-is-not-sayable.md +++ b/docs/tasks/completed/6206-forall-over-list-elements-is-not-sayable.md @@ -93,7 +93,7 @@ ensures "all positive" for all p from result: p greater than 0 - зонд над правленым `flang/self`: честная программа с `для всех п из результат: …` — «доказано», правило «все элементы по построению», запись с блоком `вывод` Э-шагов; - сверщик: честная запись — код 0, «проиграно выводом»; порчи — код 1 с названной причиной; -- `sh flang/proof/checker/tests/run.sh` — «сошлось всё»; `sh scripts/доказуемость.sh` — +- `sh flang/proof/checker/tests/run.sh` — «сошлось всё»; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ, доля не ниже 625/651, «снято калькулятором» не выше 6; - `LEAN=… sh flang/proof/lean/run.sh` — «сошлось всё», лемм 85 → 89, искажений 10 → 11; - `sh flang/proof/tables-guard.sh` — шесть сторожей зелены, С-6 в потолке. @@ -141,7 +141,7 @@ Worktree `/srv/tmp/dokazuemyy/kvantor-spiska`, ветка `r/kvantor-spiska` о | | до | после | |---|---|---| -| `доказуемость.sh` | ДОКАЗУЕМ | ДОКАЗУЕМ | +| `provability.fscript` | ДОКАЗУЕМ | ДОКАЗУЕМ | | доля проигрыванием | 625 из 651 (96,01 %) | 625 из 651 (96,01 %) — пробы вне корпуса | | видов ловушки | 34 | 35 (строка «вывод по семейству Э»; храповик поднят с доводом) | | проб на подлог | 425 | 437 (храповик поднят) | @@ -168,7 +168,7 @@ flang check .../all-elements/вызов-с-выписанным.flang --proof sh flang/proof/checker/tests/run.sh → сошлось всё sh flang/proof/lean/run.sh → сошлось всё; лемм 169, искажений 52, отвергнуто 52 sh flang/proof/tables-guard.sh → код 0 -sh scripts/доказуемость.sh → ДОКАЗУЕМ, доля 650 / 650 = 100,00 %, +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 → ДОКАЗУЕМ, доля 650 / 650 = 100,00 %, «снято калькулятором» 0 ``` diff --git a/docs/tasks/completed/6411-what-waits-for-the-reprint.md b/docs/tasks/completed/6411-what-waits-for-the-reprint.md index ce46d6408..f05334bb6 100644 --- a/docs/tasks/completed/6411-what-waits-for-the-reprint.md +++ b/docs/tasks/completed/6411-what-waits-for-the-reprint.md @@ -285,7 +285,7 @@ FLANG_RECURSION_LIMIT: функция «Искать» превысила пре Шести строк первого списка ждать больше нечему: пять сняты своими же прогонами, шестая была не ожиданием, а предупреждением — и предупреждение сбылось. -⚠ **А списку в целом — есть чего ждать.** `sh scripts/seed-freshness.sh` отвечает +⚠ **А списку в целом — есть чего ждать.** `sh scripts/seed-freshness.fscript` отвечает кодом 1: семя отстало от исходников на пять файлов, и четыре строки, которых в первом списке не было, сняты прогонами как несбывшиеся. Они ниже. @@ -385,7 +385,7 @@ grep -an 'ДВА ПРОХОДА: сперва одни указатели' boots ## Четыре строки, которые НЕ доехали — список не пуст ```sh -sh scripts/seed-freshness.sh +sh scripts/seed-freshness.fscript ``` **Код 1**: `семя отстало от исходников на 5 файлов` — `flang/self/bootstrap/compiler.flang`, `emit-js.flang`, `io.flang` (вошёл в @@ -516,7 +516,7 @@ grep -an 'compiler_flang_progon\b\|compiler_flang_vitok\b\|compiler_flang_dalshe ## Почему задача снова открыта Её собственная мера — «пустой список и есть признак того, что семя догнало -исходники». Список не пуст: `sh scripts/seed-freshness.sh` отвечает **кодом 1** и +исходники». Список не пуст: `sh scripts/seed-freshness.fscript` отвечает **кодом 1** и называет пять файлов, а четыре строки выше сняты прогонами как несбывшиеся. Закрывать её можно, когда этот сторож ответит кодом 0. @@ -548,4 +548,4 @@ grep -ral 'доедет\|до перепечатки\|после перепеч - `1384f65e` — девятая цель печати C++ (строка списка о ней); - `262509ea`, `ee3b0121` — перепечатка семени 6 сентября 2026 (ступень Б, «хеш256»), после которой список пуст. -Проверено 8 сентября 2026: `sh scripts/seed-freshness.sh` — код 0 (расхождений между семенем и исходниками не названо). Пустой список и есть признак «сделано» по разделу «Как понять, что сделано». +Проверено 8 сентября 2026: `sh scripts/seed-freshness.fscript` — код 0 (расхождений между семенем и исходниками не названо). Пустой список и есть признак «сделано» по разделу «Как понять, что сделано». diff --git a/docs/tasks/completed/6421-the-proof-directory-needs-a-layout-and-a-naming-rule.md b/docs/tasks/completed/6421-the-proof-directory-needs-a-layout-and-a-naming-rule.md index 8727ba6ad..b3a8ff871 100644 --- a/docs/tasks/completed/6421-the-proof-directory-needs-a-layout-and-a-naming-rule.md +++ b/docs/tasks/completed/6421-the-proof-directory-needs-a-layout-and-a-naming-rule.md @@ -96,7 +96,7 @@ lean-toolchain run.sh * после каждой порции — `sh .githooks/pre-push` код 0 и `node docs/site/build.mjs --check` (битые ссылки на переименованные файлы ловятся именно там); -* `sh scripts/доказуемость.sh` — ДОКАЗУЕМ, четыре проверки из четырёх; +* `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ, четыре проверки из четырёх; * `sh flang/proof/checker/tests/run.sh` — «сошлось всё»; * ссылки из работ CI (`.github/workflows/*.yml`) и из `ярлыки.flang` проверяются отдельно: они не markdown, и сторож ссылок их не читает. @@ -207,7 +207,7 @@ flang/proof/ SPEC.md kernel.flang checker.flang small-reducer.flang **Приём порции**, кодом 0 и числами, совпавшими с теми, что были до неё: `run.sh` — подделок 534, отвергнуто 448, третий исход 86, честных 248 принято -248 отвергнуто 0; `доказуемость.sh` — ДОКАЗУЕМ, 4 из 4, доля 650/650; +248 отвергнуто 0; `provability.fscript` — ДОКАЗУЕМ, 4 из 4, доля 650/650; `tables-guard.sh` — шесть сторожей зелены; пробы `run`/`strict`/`unproven` — 13/20/22 (сверено со значащими строками `expected.tsv`: 14/21/23 = заголовок + проба); `pre-push` — 14 из 14; `site build --check` — битых ссылок 0. @@ -271,7 +271,7 @@ flang/proof/ SPEC.md kernel.flang checker.flang small-reducer.flang ``` flang/proof/checker/tests/run.sh сошлось всё; подделок 534, отвергнуто 448, третий исход 86; честных 248, отвергнуто 0 -scripts/доказуемость.sh ДОКАЗУЕМ, 4 из 4; доля 650 / 650 +scripts/provability.fscript ДОКАЗУЕМ, 4 из 4; доля 650 / 650 probes/{run,strict,unproven} сошлось всё: проб 13, 20, 22 tables-guard.sh 109 строк ведомости, шесть сторожей зелены cyrillic-file-names-guard.sh кириллица в именах: 62, все в ведомости; --подлог код 1 diff --git a/docs/tasks/completed/6438-preconditions-enter-the-replayed-share.md b/docs/tasks/completed/6438-preconditions-enter-the-replayed-share.md index 81f90891a..6a39468a3 100644 --- a/docs/tasks/completed/6438-preconditions-enter-the-replayed-share.md +++ b/docs/tasks/completed/6438-preconditions-enter-the-replayed-share.md @@ -52,7 +52,7 @@ Честная запись — код 0, подделки — код 1; `sh flang/proof/checker/tests/run.sh` — «сошлось всё»; новая доля напечатана и не ниже 95 % после пересъёмки; -`sh scripts/доказуемость.sh` — ДОКАЗУЕМ; строк кода сверщика на обе задачи +`bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ; строк кода сверщика на обе задачи прибавилось не больше 80; `ratchet.txt` поднят ровно на съеденное. ## Ход работы @@ -101,7 +101,7 @@ ## Чем кончилось Приём задачи — «честная запись — код 0, подделки — код 1; `run.sh` — «сошлось всё»; -новая доля напечатана и не ниже 95 %; `доказуемость.sh` — ДОКАЗУЕМ». Прогоны +новая доля напечатана и не ниже 95 %; `provability.fscript` — ДОКАЗУЕМ». Прогоны 22 сентября 2026, ствол `d0763e8b6`: ``` @@ -112,7 +112,7 @@ sh flang/proof/corpus-share.sh --проигрыванием → доля-проигрыванием = 650 / 650 = 100,00 % → ДОЛЯ С ПРЕДУСЛОВИЯМИ = 652 / 652 = 100,00 % (снятий в знаменателе 2, ПЕРЕИГРАНО 2, вынесено недостижимых 0) -sh scripts/доказуемость.sh → ДОКАЗУЕМ, порог Г4 = 95 %, добрала: ДА +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 → ДОКАЗУЕМ, порог Г4 = 95 %, добрала: ДА ``` Предусловия вошли в проигранную долю — ровно то, чего задача просила: снятия стоят в diff --git a/docs/tasks/completed/6715-the-shared-binary-cannot-be-rebuilt-from-the-tree.md b/docs/tasks/completed/6715-the-shared-binary-cannot-be-rebuilt-from-the-tree.md index 325b78f77..93f63cc68 100644 --- a/docs/tasks/completed/6715-the-shared-binary-cannot-be-rebuilt-from-the-tree.md +++ b/docs/tasks/completed/6715-the-shared-binary-cannot-be-rebuilt-from-the-tree.md @@ -81,7 +81,7 @@ md5sum bootstrap/flang Ветка `b/6715-binary-reproduces`, 30 августа 2026, ствол `4233c18c`. Половину работы закрыл сосед задачей 6128 (`f680fc19`) и заходом -`scripts/binary-origin.sh` (29 августа); здесь она перемерена своим прогоном и +`scripts/binary-origin.fscript` (29 августа); здесь она перемерена своим прогоном и названа тем, чем оказалась. ### 1. Общий двоичный воспроизводится побайтово — тремя семенами из трёх @@ -106,7 +106,7 @@ md5sum bootstrap/flang Замеры: 64,91 с / 1 086 464 КиБ, 106,77 с / 1 814 732 КиБ, 66,27 с / 1 087 724 КиБ. Второй двоичный собран ДВУМЯ путями — `make` из семени и -`sh scripts/build-ledger-binary.sh`, — и оба дали один и тот же файл (`cmp` код +`sh scripts/build-ledger-binary.fscript`, — и оба дали один и тот же файл (`cmp` код 0); скрипт при этом сказал «рантайм дерева и рантайм семени СОВПАЛИ». Ствольное семя между `58b037c2` (23 августа 00:20) и `52996005^` (30 августа @@ -145,7 +145,7 @@ md5sum bootstrap/flang * в ствол этот ключ семенем НЕ доехал: слияние `08b0cb8b` (15:53) легло с `bootstrap/`, побайтово равным `58b037c2`. Так и должно быть — `bootstrap/**` печатается перепечаткой, руками его не правят; -* остаток объяснён заходом 29 августа (`scripts/binary-origin.sh`, шапка): +* остаток объяснён заходом 29 августа (`scripts/binary-origin.fscript`, шапка): двоичный собран из рабочей копии, где к ключу `--предел-шагов` добавлена вторая невлитая ветка — `fl_name_same` из `b7f3bd5e` (15:42). Такого дерева нет ни в одном из 5418 коммитов. @@ -158,7 +158,7 @@ md5sum bootstrap/flang `b-zaslon/bootstrap/flang` весит ровно 14 068 112 байт, как `82f9ac40`, а отпечаток у него `56186a39`: `.text` меньше на 512, `.eh_frame` на 32, `.rodata` совпадает. Зазоры выравнивания съедают разницу целиком, поэтому родословную -устанавливают именами функций (`sh scripts/binary-origin.sh`) или побайтовой +устанавливают именами функций (`sh scripts/binary-origin.fscript`) или побайтовой пересборкой, а не размером. ### 4. Чем проверялось, что задачник цел @@ -185,4 +185,4 @@ $ /srv/flang-rabota/b-dvoichnyy-vosproizvoditsya-ledger-binary/flang \ `2e640f12` побайтово не пересобирается и сегодня — его вход не коммит, а исчезнувшая рабочая копия. Это не долг сборки: судить им дерево запрещает -`sh scripts/binary-origin.sh`, а числа, снятые им прежде, помечены оговоркой. +`sh scripts/binary-origin.fscript`, а числа, снятые им прежде, помечены оговоркой. diff --git a/docs/tasks/completed/7205-the-hundred-files-without-a-ledger-are-taken-file-by-file.md b/docs/tasks/completed/7205-the-hundred-files-without-a-ledger-are-taken-file-by-file.md index 03b82f6ae..75b746c22 100644 --- a/docs/tasks/completed/7205-the-hundred-files-without-a-ledger-are-taken-file-by-file.md +++ b/docs/tasks/completed/7205-the-hundred-files-without-a-ledger-are-taken-file-by-file.md @@ -163,7 +163,7 @@ s–z — 383 из 650. Сверка описи после правок: «до Зато сам двоичный **воспроизведён побайтово**: `cmp` код 0, md5 `f32d89f599dd6b9f740f42a752dff1ff`, 14 065 960 байт; дерево его найдено — коммит `4a26cf05`, все семь файлов из одного коммита. Рецепт лёг в -`scripts/build-ledger-binary.sh`, снятие — в `scripts/take-proof-ledger.sh`. +`scripts/build-ledger-binary.fscript`, снятие — в `scripts/take-proof-ledger.sh`. ### 4. Память: 45 ГиБ не нужны, и просьба на них стоит очереди diff --git a/docs/tasks/completed/7405-dolg-vne-flang-razobran-po-razryadam-i-pravilo-scheta-pochineno.md b/docs/tasks/completed/7405-dolg-vne-flang-razobran-po-razryadam-i-pravilo-scheta-pochineno.md index 39f1f3a87..9fca75a1e 100644 --- a/docs/tasks/completed/7405-dolg-vne-flang-razobran-po-razryadam-i-pravilo-scheta-pochineno.md +++ b/docs/tasks/completed/7405-dolg-vne-flang-razobran-po-razryadam-i-pravilo-scheta-pochineno.md @@ -164,7 +164,7 @@ benchmarks/model-authoring/queue-fix-arm.sh 8 то же * **`ярлык` в долге, а рядом в документе написано «круг».** Это правда: ярлык собирает двоичный, когда двоичного ещё нет, — ровно основание, по - которому вычеркнуты `bootstrap-reprint.sh` и `binary-origin.sh`. Довода ему не + которому вычеркнуты `bootstrap-reprint.sh` и `binary-origin.fscript`. Довода ему не выписано намеренно: выписать — значит опустить долг на единицу и на ту же единицу ослабить храповик. Решение за владельцем. * **33 файла долга в `scripts`** — главная часть. Список 29 августа в документе diff --git a/docs/tasks/completed/7563-kernel-renaming-lets-a-free-name-be-captured.md b/docs/tasks/completed/7563-kernel-renaming-lets-a-free-name-be-captured.md index 0a30a05ab..80bb2abe7 100644 --- a/docs/tasks/completed/7563-kernel-renaming-lets-a-free-name-be-captured.md +++ b/docs/tasks/completed/7563-kernel-renaming-lets-a-free-name-be-captured.md @@ -182,7 +182,7 @@ Проба «Больше м» без примера — «объявлено, не доказано» (или отказ), двоичным после перепечатки; каждая проба аудита — так же; сверщик на записях ядра — без новых отказов -на честном корпусе; `sh scripts/доказуемость.sh` — ДОКАЗУЕМ. +на честном корпусе; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ. ## Подделки для сверщика: Разв2 и Разв3 (15 сентября 2026) @@ -381,7 +381,7 @@ Lean (`VerdictCheck.lean`, приёмка с PR #42): на Разв3 — ОТВ Приём задачи — «проба «Больше м» без примера — «объявлено, не доказано» (или отказ), двоичным после перепечатки; каждая проба аудита — так же; сверщик на записях ядра — без -новых отказов на честном корпусе; `sh scripts/доказуемость.sh` — ДОКАЗУЕМ». +новых отказов на честном корпусе; `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ». Прогон 22 сентября 2026, ствол `d0763e8b6`, двоичный `bootstrap/flang` 0.7.21 из семени этого дерева: @@ -401,6 +401,6 @@ flang check <проба «Больше м» без примера> --proof ``` sh flang/proof/checker/tests/run.sh → сошлось всё подделок 534: принято кодом 0 — 0; честных 248: отвергнуто 0 -sh scripts/доказуемость.sh → ДОКАЗУЕМ, 4 проверки из 4 +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 → ДОКАЗУЕМ, 4 проверки из 4 доля проигрыванием 650 / 650 = 100,00 % ``` diff --git a/docs/tasks/completed/8721-reprint-run-three-starts-from-a-clean-tree.md b/docs/tasks/completed/8721-reprint-run-three-starts-from-a-clean-tree.md index 572a4fe00..ea8747706 100644 --- a/docs/tasks/completed/8721-reprint-run-three-starts-from-a-clean-tree.md +++ b/docs/tasks/completed/8721-reprint-run-three-starts-from-a-clean-tree.md @@ -56,7 +56,7 @@ git fetch /srv/flang-priyom.git main && git checkout -B main FETCH_HEAD ```sh git status --short -- bootstrap/ # пусто -sh scripts/seed-freshness.sh # честный ответ о свежести семени +sh scripts/seed-freshness.fscript # честный ответ о свежести семени ``` Заход пущен из дерева, в котором `git status -- bootstrap/` молчит, и ветка diff --git a/docs/tasks/completed/9526-own-sum-types-cannot-be-reasoned-about-by-induction-in-a-free-statement.md b/docs/tasks/completed/9526-own-sum-types-cannot-be-reasoned-about-by-induction-in-a-free-statement.md index ef6aa1dbf..2cea8562b 100644 --- a/docs/tasks/completed/9526-own-sum-types-cannot-be-reasoned-about-by-induction-in-a-free-statement.md +++ b/docs/tasks/completed/9526-own-sum-types-cannot-be-reasoned-about-by-induction-in-a-free-statement.md @@ -94,7 +94,7 @@ - пять подделок семьи — код 1 каждая, причина названа; ни одна не принята кодом 0; - `sh flang/proof/tables-guard.sh` зелен с новой строкой и новым семейством; - Lean принимает лемму `«Инд1»` и отвергает ловушку 11; -- `sh scripts/доказуемость.sh` — ДОКАЗУЕМ, доля не ниже 625/651. +- `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ, доля не ниже 625/651. ## Чем кончилось @@ -116,5 +116,5 @@ flang/proof/checker/сверщик tests/families/own-type/нат.flang tests/fa sh flang/proof/checker/tests/run.sh → сошлось всё; подделок 534, ПРИНЯТО кодом 0 — 0 sh flang/proof/tables-guard.sh → код 0 sh flang/proof/lean/run.sh → сошлось всё; искажений 52, отвергнуто 52 -sh scripts/доказуемость.sh → ДОКАЗУЕМ, доля 650 / 650 = 100,00 % +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 → ДОКАЗУЕМ, доля 650 / 650 = 100,00 % ``` diff --git a/docs/tasks/completed/9611-taking-the-fingerprint-again-certifies-a-seed-nobody-reprinted.md b/docs/tasks/completed/9611-taking-the-fingerprint-again-certifies-a-seed-nobody-reprinted.md index e172481c3..9456082f3 100644 --- a/docs/tasks/completed/9611-taking-the-fingerprint-again-certifies-a-seed-nobody-reprinted.md +++ b/docs/tasks/completed/9611-taking-the-fingerprint-again-certifies-a-seed-nobody-reprinted.md @@ -113,4 +113,4 @@ stamp_now "$ROOT" "$KOMMIT" > "$ROOT/$SEED_STAMP" - `95fa7f25` — семя объявлено напечатанным из `22d54485`, а не из коммита, где отпечаток сняли заново; - `1ec11e72` — отказ «нет тела семени» больше не советует `--otpechatok`; в `scripts/bootstrap-reprint.sh:2644–2651` сказано, почему пересъёмка отпечатка красит красное зелёным. -Г6 после этого держится на `scripts/seed-freshness.sh` (код 0 на 8 сентября 2026) и `semya-osvezhit.sh --check` в хуке. +Г6 после этого держится на `scripts/seed-freshness.fscript` (код 0 на 8 сентября 2026) и `semya-osvezhit.sh --check` в хуке. diff --git a/docs/tasks/completed/9615-the-instruments-that-measure-the-gates-were-not-in-the-repository.md b/docs/tasks/completed/9615-the-instruments-that-measure-the-gates-were-not-in-the-repository.md index 0edacca44..0ee9f01c6 100644 --- a/docs/tasks/completed/9615-the-instruments-that-measure-the-gates-were-not-in-the-repository.md +++ b/docs/tasks/completed/9615-the-instruments-that-measure-the-gates-were-not-in-the-repository.md @@ -71,7 +71,7 @@ a valid object name». чтобы померить Г4, надо знать, из какой ссылки его достать. Пока это так, у Г4 на стволе нет прибора. 3. То же и с моими: `scripts/criterion-score-guard.sh` (считает сами гейты) и - `scripts/two-prints-identical.sh` (прибор Г6) лежат в невлитой ветке + `scripts/two-prints-identical.fscript` (прибор Г6) лежат в невлитой ветке `a/vremennoe-v-dereve`, а на стволе их нет. ## Правило diff --git a/docs/tasks/completed/9965-gate-g4-checker-coverage-95-percent.md b/docs/tasks/completed/9965-gate-g4-checker-coverage-95-percent.md index 8fd405607..aff111896 100644 --- a/docs/tasks/completed/9965-gate-g4-checker-coverage-95-percent.md +++ b/docs/tasks/completed/9965-gate-g4-checker-coverage-95-percent.md @@ -29,7 +29,7 @@ недостижимо в принципе (недостижимые места лежали в знаменателе), теперь достижимо. Порог 95 % не менялся — изменился знаменатель, а не требование. -Защита от накрутки переехала из знаменателя в условие вердикта: `доказуемость.sh` +Защита от накрутки переехала из знаменателя в условие вердикта: `provability.fscript` не печатает ДОКАЗУЕМ, если набор подделок не пройден целиком (проверка 3) либо если он ослаб против храповика (проверка 4). Проверки гоняются всегда, а не только когда предыдущие зелены. diff --git a/docs/tasks/completed/9966-gates-g5-g6-honest-fresh-numbers.md b/docs/tasks/completed/9966-gates-g5-g6-honest-fresh-numbers.md index 6ad00108e..0b1926b1e 100644 --- a/docs/tasks/completed/9966-gates-g5-g6-honest-fresh-numbers.md +++ b/docs/tasks/completed/9966-gates-g5-g6-honest-fresh-numbers.md @@ -50,7 +50,7 @@ прямо сейчас» — были начаты РАЗНЫМИ коммитами (проверено координатором, родство не установлено). Значит буквальной пары «одна и та же ревизия, две независимые печати» сегодня, возможно, НЕТ — и `Г6` своего числа от -`scripts/two-prints-identical.sh` ждать неоткуда, пока такая пара не +`scripts/two-prints-identical.fscript` ждать неоткуда, пока такая пара не случится по-настоящему. **Задача**: diff --git a/docs/tasks/completed/9994-g6-para-s-odnogo-dereva-beryotsya-rukami.md b/docs/tasks/completed/9994-g6-para-s-odnogo-dereva-beryotsya-rukami.md index 5403a53c2..600b16dd8 100644 --- a/docs/tasks/completed/9994-g6-para-s-odnogo-dereva-beryotsya-rukami.md +++ b/docs/tasks/completed/9994-g6-para-s-odnogo-dereva-beryotsya-rukami.md @@ -21,7 +21,7 @@ ## Находка 1: прибор «одно дерево» от «двух клонов НЕ ОТЛИЧАЕТ» -`scripts/two-prints-identical.sh` (226 строк) прочитан целиком. Он берёт +`scripts/two-prints-identical.fscript` (226 строк) прочитан целиком. Он берёт **два каталога** и сверяет их `bootstrap/**` побайтово. Проверок родства деревьев в нём НЕТ НИ ОДНОЙ: ни сверки коммитов, ни inode, ни origin. Требование «одного дерева» живёт только в его последней строке — @@ -126,7 +126,7 @@ sh "$БАЗА/исходное/scripts/print-launch.sh" "$БАЗА/вторая" # 5. Сверить, назвав журналы прямо (прибор просит именно этого). ZHURNAL_1="$БАЗА/первая/печать.log" ZHURNAL_2="$БАЗА/вторая/печать.log" \ - sh "$БАЗА/исходное/scripts/two-prints-identical.sh" \ + sh "$БАЗА/исходное/scripts/two-prints-identical.fscript" \ "$БАЗА/первая/клон" "$БАЗА/вторая/клон" ``` diff --git a/docs/tasks/rejected/1420-cyrillic-file-names-under-proof-become-english.md b/docs/tasks/rejected/1420-cyrillic-file-names-under-proof-become-english.md index 0cf9139a5..1b8a672b5 100644 --- a/docs/tasks/rejected/1420-cyrillic-file-names-under-proof-become-english.md +++ b/docs/tasks/rejected/1420-cyrillic-file-names-under-proof-become-english.md @@ -116,7 +116,7 @@ git -c core.quotepath=false ls-files | grep -P '[А-Яа-яЁё][^/]*$' | grep -c '^flang/proof/' → 1 flang io scripts/guards/cyrillic-file-names-guard.fscript --plan Проверка --на-веру → «кириллица в именах файлов: 62, все в ведомости — новых нет», код 0 -sh scripts/доказуемость.sh → ДОКАЗУЕМ, доля 100.00 % (650 из 650), код 0 +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 → ДОКАЗУЕМ, доля 100.00 % (650 из 650), код 0 ``` Оставшийся один файл — `flang/proof/checker/tests/families/run-induction/letters.фп`: diff --git a/docs/tasks/rejected/1421-the-txt-extension-becomes-ftext.md b/docs/tasks/rejected/1421-the-txt-extension-becomes-ftext.md index 4ebe5ce48..9151e786e 100644 --- a/docs/tasks/rejected/1421-the-txt-extension-becomes-ftext.md +++ b/docs/tasks/rejected/1421-the-txt-extension-becomes-ftext.md @@ -125,7 +125,7 @@ HTTP-обменом — `.ftext` сделал бы пробу ложной. Ш3 делался: зона задачи 1420, и до неё туда не ходят. Сторожа на этом же дереве до и после решения: `./ярлык расширения:проверка` — -код 0 («мест отбора 30 … ждут своей работы 2»); `sh scripts/доказуемость.sh` — +код 0 («мест отбора 30 … ждут своей работы 2»); `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` — ДОКАЗУЕМ, доля 96,62 % (629 из 651); `sh .githooks/pre-push` — зелен за 36 с. Файлы дерева не переименовывались, поэтому и шелохнуться было нечему. diff --git a/docs/tasks/rejected/1427-named-axioms-of-type-laws.md b/docs/tasks/rejected/1427-named-axioms-of-type-laws.md index bbc28ad8d..0581e45f5 100644 --- a/docs/tasks/rejected/1427-named-axioms-of-type-laws.md +++ b/docs/tasks/rejected/1427-named-axioms-of-type-laws.md @@ -78,7 +78,7 @@ ``` grep -c 'AKSIOMY' flang/proof/checker/checker.c → 0 git ls-files | grep -c -i porog5 → 0 -sh scripts/доказуемость.sh → ДОКАЗУЕМ, код 0: доля 100.00 % (650 из 650), +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 → ДОКАЗУЕМ, код 0: доля 100.00 % (650 из 650), подделок 543, принято кодом 0 — 0 flang io flang/scripts/kernel-forgeries.fscript --plan 'Аксиом ноль' --на-веру → «аксиом ноль, нарушений 0», код 0 diff --git a/docs/tree-inventory.md b/docs/tree-inventory.md index 9c55ef620..dcad0e849 100644 --- a/docs/tree-inventory.md +++ b/docs/tree-inventory.md @@ -1,5 +1,5 @@ -# Опись дерева по языкам: 242 файлов вне flang, долг вне JavaScript — 93 при потолке 63 - +# Опись дерева по языкам: 232 файлов вне flang, долг вне JavaScript — 93 при потолке 63 + ⚠ **ХРАПОВИК ДОЛГА КРАСЕН, и заголовок это теперь говорит.** Прогон `./ярлык опись:языки` **5 сентября 2026** отвечает кодом 1: «ДОЛГ ВНЕ @@ -78,7 +78,7 @@ $ bootstrap/flang io scripts/guards/tree-inventory.fscript --max-steps 50000000 | язык | файлов | строк | долг файлов | долг строк | |---|---:|---:|---:|---:| -| оболочка | 95 | 23 418 | 83 | 14 684 | +| оболочка | 85 | 21 535 | 76 | 13 384 | | C | 36 | 868 191 | 0 | 0 | | C++ | 1 | 404 | 0 | 0 | | Python | 16 | 6 031 | 10 | 2 880 | @@ -172,8 +172,8 @@ flang в C. | код на стороне цели | `flang/concurrency/bin/node.{c,cs,ex,go,java,py,rs}` — семь хозяев узлов на семи языках, и `peer.py` — конец связи на цели python | 8 | 8 227 | | разметка и оформление | четыре `.html` и `docs/site/style.css` — цели HTML у языка нет и не заявлено | 5 | 1 785 | | чужая среда: установщик | `packaging/homebrew/flang.rb` и три файла `packaging/asdf/bin/` — homebrew понимает Ruby, asdf зовёт свои три раньше, чем flang в системе есть | 4 | 470 | -| точка раскрутки и приёмка | `scripts/bootstrap-reprint.sh`, `scripts/bootstrap-c.sh`, `scripts/seed/new-binary-acceptance.sh`, `scripts/seed/build-ledger-binary.sh` — разобраны отдельно ниже | 4 | 4 080 | -| сверка двоичного и его печати | `scripts/seed/binary-origin.sh` и `scripts/guards/overlong-string-guard.sh` — заведены 29 августа, разобраны 30-го, см. ниже | 2 | 876 | +| точка раскрутки и приёмка | `scripts/bootstrap-reprint.sh`, `scripts/bootstrap-c.sh`, `scripts/seed/new-binary-acceptance.fscript`, `scripts/seed/build-ledger-binary.fscript` — разобраны отдельно ниже | 4 | 4 080 | +| сверка двоичного и его печати | `scripts/seed/binary-origin.fscript` и `scripts/guards/overlong-string-guard.sh` — заведены 29 августа, разобраны 30-го, см. ниже | 2 | 876 | | чужой хозяин примера | `docs/examples/host-boundary/host.c` — этим примером и показывают границу с чужим кодом | 1 | 227 | | независимый чекер записи | `flang/proof/checker/**` — сверщик записи доказательства на C, прогон его проб и одна проба-подделка на оболочке; заведён 31 августа, разобран ниже | 3 | 4 417 | @@ -192,7 +192,7 @@ flang в C. ответ переставал бы что-либо значить: сломанный двоичный одинаково способен и напечатать не то, и сказать, что напечатал то. То же у `scripts/bootstrap-c.sh` (второй путь печати) и у -`scripts/seed/new-binary-acceptance.sh` (приёмка нового двоичного после перепечатки). +`scripts/seed/new-binary-acceptance.fscript` (приёмка нового двоичного после перепечатки). Оболочка при этом ничего нового на путь сборки не приносит: `sh`, `make`, `cc` и `cmp` там нужны и так, а Node не нужен ни на одном шаге. @@ -225,7 +225,7 @@ Python 16, awk 1. Столбец «чем это держится» у `ярлык` говорит «круг», и это правда: чтобы прочитать `ярлыки.flang`, нужен двоичный, а ярлык умеет собирать его сам, когда двоичного ещё нет. Ровно по этому основанию из долга вычеркнуты -`scripts/bootstrap-reprint.sh` и `scripts/seed/binary-origin.sh`. +`scripts/bootstrap-reprint.sh` и `scripts/seed/binary-origin.fscript`. **Довода `ярлык` всё-таки не выписано, и это решение, а не забывчивость.** Выписать его — значит опустить долг на единицу и на ту же единицу ослабить @@ -243,7 +243,7 @@ Python 16, awk 1. | `prose-numbers-guard.sh` | 416 | числа, набранные в прозе рукой, сходятся с деревом сегодня | | `memory-limit.sh` | 259 | предел памяти прогона | | `target-census.sh` | 164 | перепись целей | -| `seed-freshness.sh` | 115 | отказ судить о доказательствах при отставшем семени | +| `seed-freshness.sh` | 3 | отказ судить о доказательствах при отставшем семени | | `test-remote.sh` | 149 | прогон на чужой машине | | `one-string-measure-guard.sh` | 119 | подаёт сырые октеты в `string-measure.flang` | | `identical-declarations.sh` | 82 | что можно ввезти вместо переименования | @@ -251,7 +251,7 @@ Python 16, awk 1. | `targets-inventory.sh` | 50 | опись целей: имя, код, время, причина | | `names-in-c.awk` | 79 | «идентификатор C → русское объявление» из напечатанного заголовка | -Три из них — `seed-knows-type-words-guard.sh`, `seed-freshness.sh`, +Три из них — `seed-knows-type-words-guard.sh`, `seed-freshness.fscript`, `seed-parses-sources-guard.sh` — стоят рядом с точкой раскрутки, но НЕ под тем же доводом: они не судят напечатанное, а спрашивают, читает ли семя исходники. Ответ на такой вопрос от правил семени не зависит, и переводить их можно — @@ -415,8 +415,8 @@ benchmarks/model-authoring/queue-fix-arm.sh 8 то же | файл | строк | заведён | решение | |---|---:|---|---| -| `scripts/seed/build-ledger-binary.sh` | 130 | 30 авг, `42c641be` | **не долг**: третий путь сборки компилятора | -| `scripts/seed/binary-origin.sh` | 549 | 29 авг, `b10bff9a` | **не долг**: спрашивает у двоичного о нём самом | +| `scripts/seed/build-ledger-binary.fscript` | 130 | 30 авг, `42c641be` | **не долг**: третий путь сборки компилятора | +| `scripts/seed/binary-origin.fscript` | 549 | 29 авг, `b10bff9a` | **не долг**: спрашивает у двоичного о нём самом | | `scripts/guards/overlong-string-guard.sh` | 327 | 29 авг, `f36239c0` | **не долг**: обязан отвечать, когда семя не собирается | | `scripts/resource-plan.py` | 975 | 30 авг, `7544e149` | **вынесен из дерева 30 авг**: живёт в `/srv/work/resource-plan.py` — прибор машины и смены, а не языка | | `scripts/guards/published-vs-tree.sh` | 796 | 31 авг, `03fb4060`+Ч72 | **долг**: переводим; работа `published` в CI нарочно идёт без собранного двоичного | @@ -435,10 +435,10 @@ benchmarks/model-authoring/queue-fix-arm.sh 8 то же Основание дозволено ровно одно, и оно записано в самой описи: **круг**. Файл не долг, если он судит или собирает то, чем его самого пришлось бы исполнять. -* `build-ledger-binary.sh` собирает компилятор (семя дословно + рантайм дерева). +* `build-ledger-binary.fscript` собирает компилятор (семя дословно + рантайм дерева). Написать сборку компилятора программой, которую исполняет компилятор, нельзя: на этом шаге его ещё нет. -* `binary-origin.sh` спрашивает у ДВОИЧНОГО, из этого ли он семени. Двоичный, +* `binary-origin.fscript` спрашивает у ДВОИЧНОГО, из этого ли он семени. Двоичный, несущий чужой код, одинаково способен и нести его, и сказать, что не несёт. * `overlong-string-guard.sh` спрашивает, собирается ли напечатанное семя своим же напечатанным Makefile. Он обязан отвечать ИМЕННО ТОГДА, когда семя не diff --git a/docs/tree-layout-audit.md b/docs/tree-layout-audit.md index 9eeba1cfd..1f71d034b 100644 --- a/docs/tree-layout-audit.md +++ b/docs/tree-layout-audit.md @@ -86,7 +86,7 @@ sh scripts/guards/no-package-json-guard.sh --check # код 0 * **`scripts/` (150 файлов, 9 подкаталогов, глубина 3).** Самый аккуратный крупный каталог: подкаталоги названы по роду (`guards/`, `ledgers/`, `release/`, `seed/`, `site/`, `targets/`, `editors/`, `registry-example/`), кириллических имён два - (`доказуемость.sh` и `guards/сторож-дарвина.fscript`), оба в ведомости долга с + (`provability.fscript` и `guards/сторож-дарвина.fscript`), оба в ведомости долга с причиной. **Беспорядка здесь нет.** * **`fspec/` (75 файлов, 3 подкаталога, глубина 3).** Мелкая ровная раскладка. Одно замечание: `experience/` и `experiments/` — соседи, чьи имена различаются двумя @@ -205,7 +205,7 @@ OBLAST="scripts flang/test flang/scripts docs/site docs/zettel .github" # ст Схем на самом деле **три**, а не две, и третья — самая неудобная: 1. русская кириллицей — `Record.lean`, `expected.tsv`, `run.sh`; -2. английская латиницей — `RecordReader.lean`, `binary-origin.sh`; +2. английская латиницей — `RecordReader.lean`, `binary-origin.fscript`; 3. **русская латиницей (транслит)** — `totality.flang`, `otkazy-totalnosti.flang`, `lie-difference-pure.flang`. Она не читается ни русским, ни английским глазом. diff --git a/docs/what-blocks-1-0.md b/docs/what-blocks-1-0.md index 977e0f3d7..ea722bdfc 100644 --- a/docs/what-blocks-1-0.md +++ b/docs/what-blocks-1-0.md @@ -1,6 +1,6 @@ # Что мешает 1.0 -> **Снято 23–31 августа 2026 на двоичном 0.6.2 (последняя правка — коммит `77c521ace`, 8 сентября). Сегодня не так:** выпуск 0.7.20, семя перепечатано 17 сентября 2026 (`68ff03b34`, задача 5190), `sh scripts/доказуемость.sh` печатает **ДОКАЗУЕМ** при пороге 100 % — доля, переигранная независимым сверщиком, **650 / 650**, на слово ядра не взято ничего. Живая карта — пять этапов `docs/ROADMAP.md`; этап 1 (набор до 100 %) закрыт 18 сентября 2026, этапы 2–5 открыты: доказанный перевод в C, доказанный сверщик, правила о времени и эффектах, программы пользователя. Файл остаётся здесь, а не в `docs/archive/`, потому что на его путь завязаны `scripts/guards/what-blocks-inventory-guard.fscript` и проба кодов в CI (`flang/scripts/code-forgery.flang`). Ниже — запись о том дне. +> **Снято 23–31 августа 2026 на двоичном 0.6.2 (последняя правка — коммит `77c521ace`, 8 сентября). Сегодня не так:** выпуск 0.7.20, семя перепечатано 17 сентября 2026 (`68ff03b34`, задача 5190), `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` печатает **ДОКАЗУЕМ** при пороге 100 % — доля, переигранная независимым сверщиком, **650 / 650**, на слово ядра не взято ничего. Живая карта — пять этапов `docs/ROADMAP.md`; этап 1 (набор до 100 %) закрыт 18 сентября 2026, этапы 2–5 открыты: доказанный перевод в C, доказанный сверщик, правила о времени и эффектах, программы пользователя. Файл остаётся здесь, а не в `docs/archive/`, потому что на его путь завязаны `scripts/guards/what-blocks-inventory-guard.fscript` и проба кодов в CI (`flang/scripts/code-forgery.flang`). Ниже — запись о том дне. Список того, что обязано быть сделано до номера 1.0, и того, что до него делать не обязано. Под каждым числом стоит команда, которая его печатает; ни одно число @@ -223,7 +223,7 @@ Node. Всё, что старая редакция мерила по JS-исхо который отказывается судить: ```sh -sh scripts/seed/seed-freshness.sh +bootstrap/flang io scripts/seed/seed-freshness.fscript --plan Check --timeout 300000 ``` ``` @@ -265,7 +265,7 @@ grep -c 'предел-шагов' bootstrap/*.c # → 9 (было 0) #### Перемерено 31 августа: отставание — 29 функций ядра, и это гонка -Сторож `seed-freshness.sh` считает ФАЙЛЫ входов и отвечает на вопрос «те ли +Сторож `seed-freshness.fscript` считает ФАЙЛЫ входов и отвечает на вопрос «те ли входы я печатал». На вопрос «то ли ЯДРО в моём двоичном» он не отвечает вовсе. С 31 августа есть сверка, которая на него отвечает: имена функций трёх файлов ядра решений (`proofterm.flang`, `proof-kernel.flang`, `proof-initial.flang`) @@ -290,7 +290,7 @@ sh scripts/bootstrap-reprint.sh --imena # 0,35 с, 8 МиБ ствола `main` `03fb4060`: ```sh -FLANG_BINARY_UNKNOWN_OK=1 sh scripts/seed/seed-freshness.sh # → код 0, молча +FLANG_BINARY_UNKNOWN_OK=1 bootstrap/flang io scripts/seed/seed-freshness.fscript --plan Check --timeout 300000 # → код 0, молча ``` Ни одного расхождения; ключ выставлен только потому, что в свежем клоне ещё нет diff --git a/docs/what-provability-gives-today.md b/docs/what-provability-gives-today.md index 8c8ba393e..fe3d4fa66 100644 --- a/docs/what-provability-gives-today.md +++ b/docs/what-provability-gives-today.md @@ -127,7 +127,7 @@ Not expressible — there is no place to write it: ## What «100 %» means ``` -sh scripts/доказуемость.sh → ДОКАЗУЕМ (18 September 2026) +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 → ДОКАЗУЕМ (18 September 2026) sh flang/proof/corpus-share.sh --проигрыванием → доля-проигрыванием = 650 / 650 = 100.00 % на слово ядра: посылок и утверждений 0; шагов 0; снято калькулятором 0 diff --git a/docs/what-provability-gives-today.ru.md b/docs/what-provability-gives-today.ru.md index c1ea68ce4..018eba73a 100644 --- a/docs/what-provability-gives-today.ru.md +++ b/docs/what-provability-gives-today.ru.md @@ -181,7 +181,7 @@ $ make -C flang/proof/checker && flang/proof/checker/сверщик заказ.f ## Что значит «100 %» ``` -sh scripts/доказуемость.sh → ДОКАЗУЕМ (18 сентября 2026, ≈13 с) +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 → ДОКАЗУЕМ (18 сентября 2026, ≈13 с) sh flang/proof/corpus-share.sh --проигрыванием → доля-проигрыванием = 650 / 650 = 100.00 % на слово ядра: посылок и утверждений 0; шагов 0; снято калькулятором 0 @@ -227,7 +227,7 @@ make -C bootstrap -j8 ./bootstrap/flang check --proof скидка.flang # код 3 ./bootstrap/flang check --proof заказ.flang --записать заказ.record make -C flang/proof/checker && flang/proof/checker/сверщик заказ.flang заказ.record # код 3, место названо -sh scripts/доказуемость.sh # ДОКАЗУЕМ +bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000 # ДОКАЗУЕМ ``` Тексты двух функций — выше, целиком; сохраните их как `заказ.flang` и diff --git a/docs/what-the-prover-lacks.md b/docs/what-the-prover-lacks.md index 0ab749c3c..9372b8196 100644 --- a/docs/what-the-prover-lacks.md +++ b/docs/what-the-prover-lacks.md @@ -7,7 +7,7 @@ > **Сверка 11 сентября 2026** (коммит `2c40752d0`, выпуск 0.7.17): семя, об > отставании которого говорит оговорка ниже, перепечатано 10–11 сентября > (`0ce948bfd`); правил вывода в ядре 88, лемм Lean к ним 85 -> (`docs/lean-checks-the-inference-rules.md`); `sh scripts/доказуемость.sh` → +> (`docs/lean-checks-the-inference-rules.md`); `bootstrap/flang io scripts/provability.fscript --plan Verdict --timeout 900000` → > ДОКАЗУЕМ, 625 / 651 = 96,01 %. Перечень ниже — состояние 23–30 августа; что > из нехваток закрыто, а что нет, перепроверялось не построчно: живой остаток > — `docs/road-to-one-hundred-measured.md` и ADR-0032. diff --git a/docs/zettel/a-ledger-binary-beside-the-tree-cannot-see-the-library-and-blames-the-author.md b/docs/zettel/a-ledger-binary-beside-the-tree-cannot-see-the-library-and-blames-the-author.md index 74df458d7..4d78a72ae 100644 --- a/docs/zettel/a-ledger-binary-beside-the-tree-cannot-see-the-library-and-blames-the-author.md +++ b/docs/zettel/a-ledger-binary-beside-the-tree-cannot-see-the-library-and-blames-the-author.md @@ -1,6 +1,6 @@ # Двоичный для ведомости, собранный рядом с деревом, не видит его библиотеку и подаёт это как долг автора -`scripts/seed/build-ledger-binary.sh` собирает компилятор третьим путём, рядом с +`scripts/seed/build-ledger-binary.fscript` собирает компилятор третьим путём, рядом с `scripts/bootstrap-reprint.sh` и `scripts/bootstrap-c.sh`: напечатанное семя дословно плюс рантайм дерева. Напечатанный компилятор берётся из семени (`compiler_flang.c`, `compiler_flang.h`, `Makefile`) и не трогается ничем — это diff --git a/docs/zettel/a-limit-flag-sets-the-limit-and-a-smaller-number-lowers-it.md b/docs/zettel/a-limit-flag-sets-the-limit-and-a-smaller-number-lowers-it.md index 2f3df983c..788405542 100644 --- a/docs/zettel/a-limit-flag-sets-the-limit-and-a-smaller-number-lowers-it.md +++ b/docs/zettel/a-limit-flag-sets-the-limit-and-a-smaller-number-lowers-it.md @@ -19,7 +19,7 @@ Умолчание читается из шапки того семени, из которого собран этот двоичный, — она лежит рядом с ним в каталоге сборки (`flang_runtime.h` у -`scripts/seed/build-ledger-binary.sh`), — а не из нынешнего `bootstrap/`: у +`scripts/seed/build-ledger-binary.fscript`), — а не из нынешнего `bootstrap/`: у двоичного недельной давности пределы свои, и сверять его с сегодняшним семенем — врать. diff --git a/docs/zettel/a-proof-ledger-taken-with-a-stale-seed-shows-a-tree-that-does-not-exist.md b/docs/zettel/a-proof-ledger-taken-with-a-stale-seed-shows-a-tree-that-does-not-exist.md index 7829f7beb..19ea473f4 100644 --- a/docs/zettel/a-proof-ledger-taken-with-a-stale-seed-shows-a-tree-that-does-not-exist.md +++ b/docs/zettel/a-proof-ledger-taken-with-a-stale-seed-shows-a-tree-that-does-not-exist.md @@ -6,7 +6,7 @@ было, двоичный судит по старым правилам и об этом не знает. Для проверки разбора, типов и примеров это не беда: она судит о программе, которую ей дали. Для проверки, судящей о доказательствах, это ложь: ведомость показывает -состояние дерева, которого нет. `scripts/seed/seed-freshness.sh` стоит перед +состояние дерева, которого нет. `scripts/seed/seed-freshness.fscript` стоит перед каждым ярлыком о доказательствах и отказывает. **Чем подтверждено.** 21–22 августа 2026 трижды за сутки пролежали в стволе @@ -21,12 +21,12 @@ Первая — «те ли входы у печати»: семя против исходников (`--bystro`). Вторая — «тот ли двоичный»: двоичный против семени, она живёт в -`scripts/seed/binary-origin.sh` и зовётся отсюда первой. Одна другую не +`scripts/seed/binary-origin.fscript` и зовётся отсюда первой. Одна другую не заменяет: 23 августа 2026 семя было в порядке, а двоичный собран из двух невлитых веток и шесть суток судил язык с доказательствами. Ключей обхода -поэтому два: `SEMYA_OTSTALO_ZNAYU` снимает сверку семени с исходниками, +поэтому два: `FLANG_SEED_LAG_KNOWN` снимает сверку семени с исходниками, `FLANG_BINARY_UNKNOWN_OK` — сверку двоичного с семенем; одним заглушить обе -нельзя, и это нарочно. Сверка двоичного стоит до ключа `SEMYA_OTSTALO_ZNAYU`. +нельзя, и это нарочно. Сверка двоичного стоит до ключа `FLANG_SEED_LAG_KNOWN`. Ключ обхода обязателен: без него перепечатку нечем проверить самой собой — тот, кто перепечатывает семя, обязан уметь прогнать ведомость на дереве, где семя @@ -35,11 +35,11 @@ ## Тело семени спрашивается до всех ключей -Ключ `SEMYA_OTSTALO_ZNAYU` — про отставание: исходники ушли вперёд семени, и +Ключ `FLANG_SEED_LAG_KNOWN` — про отставание: исходники ушли вперёд семени, и это бывает законно (перепечатка идёт восемь часов). Про подмену семени он не говорит ничего, а глушил её вместе с отставанием: 31 августа 2026 проверено — закладка в `bootstrap/flang_repl.c`, проводящая подделку через ядро, проходила -эти ворота с кодом 0 по `SEMYA_OTSTALO_ZNAYU=1`. Поэтому тело семени +эти ворота с кодом 0 по `FLANG_SEED_LAG_KNOWN=1`. Поэтому тело семени (`sh scripts/bootstrap-reprint.sh --telo`, 0,2 с, git не нужен) спрашивается отдельным прогоном раньше всех ключей, и ключа обхода у него нет вовсе: тело семени меняет только перепечатка, а она снимает отпечаток тем же прогоном. diff --git a/docs/zettel/a-published-number-is-stale-or-wrong-and-only-a-recount-at-the-snapshot-tells-which.md b/docs/zettel/a-published-number-is-stale-or-wrong-and-only-a-recount-at-the-snapshot-tells-which.md index 46c82a4b6..6133308b3 100644 --- a/docs/zettel/a-published-number-is-stale-or-wrong-and-only-a-recount-at-the-snapshot-tells-which.md +++ b/docs/zettel/a-published-number-is-stale-or-wrong-and-only-a-recount-at-the-snapshot-tells-which.md @@ -67,7 +67,7 @@ ru_RU.UTF-8 строка находится, под C — нет). Команд **Чем подтверждено.** Замеры 29, 30 и 31 августа 2026 (Ч68), названные выше. **Чем ограничено.** Дорогие ключи не пересчитываются; семя сверяется -`scripts/seed/seed-freshness.sh`; отпечаток семени считается только до метки +`scripts/seed/seed-freshness.fscript`; отпечаток семени считается только до метки «тело семени». Связано: [[a-deliberate-forgery-and-a-stale-record-look-identical-to-a-byte-comparison]], diff --git a/docs/zettel/an-acceptance-sign-without-material-must-say-not-taken-not-passed.md b/docs/zettel/an-acceptance-sign-without-material-must-say-not-taken-not-passed.md index 298078a84..5a05437ae 100644 --- a/docs/zettel/an-acceptance-sign-without-material-must-say-not-taken-not-passed.md +++ b/docs/zettel/an-acceptance-sign-without-material-must-say-not-taken-not-passed.md @@ -1,6 +1,6 @@ # Примета приёмки, которой не досталось материала, обязана сказать «не снята», а не «сошлась» -`scripts/seed/new-binary-acceptance.sh` — приёмка нового двоичного после +`scripts/seed/new-binary-acceptance.fscript` — приёмка нового двоичного после перепечатки семени (задача 0043). За сутки 24–25 августа 2026 перепечатка гибла четыре раза, а один раз дошла и дала двоичный, который падал на первом же файле. «Печать кончилась кодом 0» само по себе не значит ничего, и решать diff --git a/docs/zettel/lag-behind-the-seed-is-told-by-the-import-graph-not-by-a-share-of-missing-names.md b/docs/zettel/lag-behind-the-seed-is-told-by-the-import-graph-not-by-a-share-of-missing-names.md index 2b6c1cce9..6de75ace5 100644 --- a/docs/zettel/lag-behind-the-seed-is-told-by-the-import-graph-not-by-a-share-of-missing-names.md +++ b/docs/zettel/lag-behind-the-seed-is-told-by-the-import-graph-not-by-a-share-of-missing-names.md @@ -2,7 +2,7 @@ `scripts/seed/chto-otstalo-ot-semeni.sh` называет поимённо, по функциям, что именно есть в исходнике и ещё нет в семени. Это не сторож свежести семени: тот -уже есть и вшит в `ярлык` (`scripts/seed/seed-freshness.sh`, коды 3 и 1, и +уже есть и вшит в `ярлык` (`scripts/seed/seed-freshness.fscript`, коды 3 и 1, и `./ярлык доказанное:проверка` через него не проходит). Этот прибор кода не даёт вовсе (всегда 0) и ничего не блокирует. Он отвечает на другой вопрос: сторож говорит «семя отстало» — да или нет; здесь — «отстало чем, назови diff --git a/docs/zettel/one-module-printed-in-two-environments-is-a-necessary-condition-of-gate-six-not-the-gate.md b/docs/zettel/one-module-printed-in-two-environments-is-a-necessary-condition-of-gate-six-not-the-gate.md index 2db6c1621..ce8f71991 100644 --- a/docs/zettel/one-module-printed-in-two-environments-is-a-necessary-condition-of-gate-six-not-the-gate.md +++ b/docs/zettel/one-module-printed-in-two-environments-is-a-necessary-condition-of-gate-six-not-the-gate.md @@ -3,7 +3,7 @@ Гейт Г6 просит две вещи разом: (а) две перепечатки одного дерева дают побайтово одно и то же; (б) это проверяется автоматически, а не разово руками. (а) доказано 6 сентября 2026 на паре печатей с дерева d3b121b5 (16 404 с и -16 929 с, обе кодом 0): `scripts/seed/two-prints-identical.sh` дал код 0 и +16 929 с, обе кодом 0): `scripts/seed/two-prints-identical.fscript` дал код 0 и «печати совпали побайтово: файлов 4, байт 1 229 825». Сверку позвали рукой, и потому (б) осталось открытым. Закрыть (б) той же парой нельзя: 2 × 4,6 ч машины на шаг CI не ставят. `scripts/seed/pechat-povtorima.sh` берёт от (а) ту часть, diff --git a/docs/zettel/provability-verdict-measures-by-a-trap-and-runs-all-four-checks-always.md b/docs/zettel/provability-verdict-measures-by-a-trap-and-runs-all-four-checks-always.md index 6cc77723f..16f738e38 100644 --- a/docs/zettel/provability-verdict-measures-by-a-trap-and-runs-all-four-checks-always.md +++ b/docs/zettel/provability-verdict-measures-by-a-trap-and-runs-all-four-checks-always.md @@ -1,6 +1,6 @@ # Вердикт «доказуем» снимается ловушкой, а не grep-ом по имени, и все четыре проверки гоняются всегда -`scripts/доказуемость.sh` печатает ДОКАЗУЕМ или НЕ ДОКАЗУЕМ. Слово это ходило по +`scripts/provability.fscript` печатает ДОКАЗУЕМ или НЕ ДОКАЗУЕМ. Слово это ходило по документам разовым суждением («язык формально-доказуем», «взято N из 7 гейтов»), и суждение устаревало молча. Прибор снимает его четырьмя числами, и у каждого числа есть причина быть снятым именно так. diff --git a/docs/zettel/recount-the-shared-binary-has-no-reproducible-pedigree.md b/docs/zettel/recount-the-shared-binary-has-no-reproducible-pedigree.md index 9939a5665..95776cad5 100644 --- a/docs/zettel/recount-the-shared-binary-has-no-reproducible-pedigree.md +++ b/docs/zettel/recount-the-shared-binary-has-no-reproducible-pedigree.md @@ -89,7 +89,7 @@ flang/self/interpret.flang` отвечает `FLANG_TYPE_ARGS` — «тип „ ## Что установлено потом: дерева нет ни в одном коммите, а сборка воспроизводима Заметка написана 26 августа и на своём вопросе остановилась. Ответ нашёлся -29 августа сплошным перебором 5418 коммитов (`scripts/seed/binary-origin.sh`, шапка) и +29 августа сплошным перебором 5418 коммитов (`scripts/seed/binary-origin.fscript`, шапка) и перемерен 30 августа заново, задача 6715. Обе половины важны, и путать их нельзя. **Дерева нет.** Двоичный собран из рабочей копии, где сошлись ДВЕ невлитые @@ -113,7 +113,7 @@ w-predely 14 068 248 байт md5 2e640f12 | семя | размер | md5 | чем сверено | |---|---|---|---| | ствол `db12d317` | 14 068 112 | `82f9ac40` | `cmp` код 0 с `stvol`, `m-reprint-from-trunk`, `m-kernel-ledger` | -| семя перепечатки `52996005` (откачена `43bf2f25`) | 23 122 912 | `4e32f9f7` | `cmp` код 0 с чужим `bootstrap/flang`; двумя путями — `make` из семени и `scripts/seed/build-ledger-binary.sh` | +| семя перепечатки `52996005` (откачена `43bf2f25`) | 23 122 912 | `4e32f9f7` | `cmp` код 0 с чужим `bootstrap/flang`; двумя путями — `make` из семени и `scripts/seed/build-ledger-binary.fscript` | | `4a26cf05` (двоичный описи) | 14 065 960 | `f32d89f5` | `cmp` код 0 с `m-kernel-ledger/build-kernel/flang` | Ствольное семя между `58b037c2` (23 августа 00:20) и `52996005^` (30 августа diff --git a/docs/zettel/the-binary-is-judged-by-its-symbol-names-not-by-its-size-or-strings.md b/docs/zettel/the-binary-is-judged-by-its-symbol-names-not-by-its-size-or-strings.md index 3c0bb9ae6..bcb540a59 100644 --- a/docs/zettel/the-binary-is-judged-by-its-symbol-names-not-by-its-size-or-strings.md +++ b/docs/zettel/the-binary-is-judged-by-its-symbol-names-not-by-its-size-or-strings.md @@ -1,7 +1,7 @@ # Двоичный судится по именам из его таблицы символов, а не по размеру и строкам: 80 байт разницы прятали код двух невлитых веток Двоичный компилятор, лежащий в дереве, обязан собираться из `bootstrap/` этого -же дерева. Сторож `scripts/seed/binary-origin.sh` отказывается судить о +же дерева. Сторож `scripts/seed/binary-origin.fscript` отказывается судить о доказательствах двоичным, для которого это не так. Смотрит он на таблицу имён, и это единственное место, где разница была видна. @@ -92,7 +92,7 @@ b/predel и `fl_name_same` из b/bystro-sravnenie-imyon. Такого дере ## Где стоит и как обходится -1. `scripts/seed/seed-freshness.sh` — перед каждым ярлыком о доказательствах; +1. `scripts/seed/seed-freshness.fscript` — перед каждым ярлыком о доказательствах; 2. работа CI «Двоичный» (`.github/workflows/binary.yml`) — сразу после сборки, ради самой себя: сторож, который нигде не запускается, ломается тихо. @@ -105,7 +105,7 @@ b/predel и `fl_name_same` из b/bystro-sravnenie-imyon. Такого дере Почему файл на оболочке, а не на flang: спрашиваемое здесь — сам двоичный, и программа на flang исполнялась бы им же; подсудимый отвечал бы о себе. Тот же -довод у `scripts/bootstrap-reprint.sh` и `scripts/seed/new-binary-acceptance.sh`. +довод у `scripts/bootstrap-reprint.sh` и `scripts/seed/new-binary-acceptance.fscript`. `LC_ALL=C` — условие правильности `comm`: `sort` под русской раскладкой раскладывает по правилам языка, `comm` сравнивает байтами, и при расхождении `comm` тихо теряет строки. diff --git a/docs/zettel/the-release-number-cannot-say-what-is-inside-the-binary.md b/docs/zettel/the-release-number-cannot-say-what-is-inside-the-binary.md index 48ffaaf17..98819ac60 100644 --- a/docs/zettel/the-release-number-cannot-say-what-is-inside-the-binary.md +++ b/docs/zettel/the-release-number-cannot-say-what-is-inside-the-binary.md @@ -12,7 +12,7 @@ не решается никогда, и переписка на него уходит целиком. **Дата сборки — первое, что напрашивается, и её нельзя.** -`scripts/seed/binary-origin.sh` пересобирает двоичный из семени дерева и сверяет с +`scripts/seed/binary-origin.fscript` пересобирает двоичный из семени дерева и сверяет с лежащим ПОБАЙТОВО (`cmp`). Это та самая проверка, которой 23 августа 2026 не было, и шесть суток язык судил двоичный, несущий код двух невлитых веток. `__DATE__`/`__TIME__` сделали бы две сборки одного дерева разными и погасили бы diff --git a/docs/zettel/the-seed-cannot-be-patched-by-hand-it-will-not-link.md b/docs/zettel/the-seed-cannot-be-patched-by-hand-it-will-not-link.md index 83b727bee..82e1ebea8 100644 --- a/docs/zettel/the-seed-cannot-be-patched-by-hand-it-will-not-link.md +++ b/docs/zettel/the-seed-cannot-be-patched-by-hand-it-will-not-link.md @@ -49,5 +49,5 @@ (`bootstrap/flang_runtime.c:619` → `fl_max_steps_default()` → `FL_MAX_STEPS` в `bootstrap/flang_runtime.h:11`). Отсюда же следствие: двоичный несёт тот предел, какой стоял в заголовке в день его сборки, и меняется он только пересборкой. -* `scripts/seed/binary-origin.sh` ловит двоичный, собранный не из этого семени: на двоичном от +* `scripts/seed/binary-origin.fscript` ловит двоичный, собранный не из этого семени: на двоичном от 23 августа — код 1 и 61 незнакомое имя, на свежесобранном — код 0 за 0,21 с. diff --git a/docs/zettel/the-shell-read-the-line-with-fgets-and-the-terminal-printed-the-arrow.md b/docs/zettel/the-shell-read-the-line-with-fgets-and-the-terminal-printed-the-arrow.md index 442c4685a..e73ae617c 100644 --- a/docs/zettel/the-shell-read-the-line-with-fgets-and-the-terminal-printed-the-arrow.md +++ b/docs/zettel/the-shell-read-the-line-with-fgets-and-the-terminal-printed-the-arrow.md @@ -9,7 +9,7 @@ печать из `flang/self/**`. Бэкенд C увозит его в семя дословно и приписывает сверху шапку: `diff flang/src/emit/c/flang_repl.c bootstrap/flang_repl.c` — ровно девять строк, все в шапке (заслон -`scripts/seed/seed-runtime-is-source.sh`, задача 4088). Отсюда следствие, +`scripts/seed/seed-runtime-is-source.fscript`, задача 4088). Отсюда следствие, которое стоит помнить: правка оболочки доезжает до двоичного **быстрым пересевом** `sh scripts/seed/seed-refresh.sh` (задача 3388), а не перепечаткой в четыре с половиной часа. Пересев 8 сентября занял 71 с, потому diff --git a/docs/zettel/two-logs-beside-a-print-tree-mean-unknown-not-take-the-newer.md b/docs/zettel/two-logs-beside-a-print-tree-mean-unknown-not-take-the-newer.md index 364afcbed..541b0d94f 100644 --- a/docs/zettel/two-logs-beside-a-print-tree-mean-unknown-not-take-the-newer.md +++ b/docs/zettel/two-logs-beside-a-print-tree-mean-unknown-not-take-the-newer.md @@ -3,7 +3,7 @@ Гейт Г6 требует не «мы однажды сверили руками», а «проверяется автоматически». Разовая сверка руками не берёт гейт, даже если сошлась: её нельзя повторить, и никто не знает, что именно сверяли. Отсюда отдельный прибор -`scripts/seed/two-prints-identical.sh`, написанный ДО результата: прибор, +`scripts/seed/two-prints-identical.fscript`, написанный ДО результата: прибор, написанный после того, как результат увиден, всегда подгоняется под него — не злым умыслом, а тем, что взгляд уже знает ответ. Этот написан, когда обе печати ещё шли. diff --git a/flang/proof/checker/tests/run.sh b/flang/proof/checker/tests/run.sh index 7efc454a9..f2cc976a2 100755 --- a/flang/proof/checker/tests/run.sh +++ b/flang/proof/checker/tests/run.sh @@ -48,9 +48,15 @@ cd "$KOREN" # Провенанс — первой строкой вывода. Набор проб судит ПРОВЕРЯЮЩЕГО, и числа # «подделок 533, принято кодом 0 — 0» ничего не стоят без sha256 того самого # сверщика, на котором они сняты (пункт 11 внешнего аудита). Печать не мешает -# разбору: и scripts/доказуемость.sh, и flang/proof/lean/run.sh читают этот +# разбору: и scripts/provability.fscript, и flang/proof/lean/run.sh читают этот # вывод по якорям «подделок N:» и «честных N:», а не по номеру строки. -sh "$KOREN/scripts/report-provenance.sh" || true +provenance=$("$KOREN/bootstrap/flang" io "$KOREN/scripts/report-provenance.fscript" --plan Report 2>/dev/null \ + | sed -n 's/^{"plan":"Report","result":"\(.*\)","orders":[0-9]*,"log":.*$/\1/p') +if [ -n "$provenance" ]; then + printf '%b\n\n' "$provenance" +else + printf '%s\n%s\n\n' "── чем и на чём снято ──" "шапка не снята: план scripts/report-provenance.fscript исполнить нечем — нет bootstrap/flang" +fi BAD=0 diff --git a/flang/proof/checker/tests/trap/kinds.tsv b/flang/proof/checker/tests/trap/kinds.tsv index 2a5c00c80..81c6446cd 100644 --- a/flang/proof/checker/tests/trap/kinds.tsv +++ b/flang/proof/checker/tests/trap/kinds.tsv @@ -1,6 +1,6 @@ # ЛОВУШКА ПРОВЕРКИ 1 «КАЛЬКУЛЯТОР СНЯТ?» — по одной цели на каждый вид обязательства. # -# Читает: scripts/доказуемость.sh, проверка 1. Основание: задача 3781 (ловушка +# Читает: scripts/provability.fscript, проверка 1. Основание: задача 3781 (ловушка # вместо грепа), ячейка К11 кластера 6202/6203 (9 сентября 2026). # # ЗАЧЕМ ТАБЛИЦА, А НЕ ДВЕ ЦЕЛИ. До К11 ловушка держала две ∀-цели («на слове» — diff --git a/flang/proof/checker/tests/trap/ratchet.txt b/flang/proof/checker/tests/trap/ratchet.txt index f4f686b5d..dbe1fceaf 100644 --- a/flang/proof/checker/tests/trap/ratchet.txt +++ b/flang/proof/checker/tests/trap/ratchet.txt @@ -1,6 +1,6 @@ # ХРАПОВИК ЛОВУШКИ ПРОВЕРКИ 1 — два числа, ниже которых ловушка опускаться не вправе. # -# Ловушка (kinds.tsv рядом) стережёт проверку 1 `scripts/доказуемость.sh` с двух +# Ловушка (kinds.tsv рядом) стережёт проверку 1 `scripts/provability.fscript` с двух # сторон: цели «на слове» сверщик обязан НЕ снимать (снял — в дереве калькулятор), # цели «снята» — обязан переиграть, по одной на каждый вид обязательства, который # он умеет (иначе проверку 1 брал бы сверщик, сломанный до «ничего не доказываю»). diff --git a/flang/proof/corpus-share.sh b/flang/proof/corpus-share.sh index 3ed3d8af5..835b4fb4f 100755 --- a/flang/proof/corpus-share.sh +++ b/flang/proof/corpus-share.sh @@ -230,7 +230,7 @@ trap 'rm -rf "$tmp"' 0 2 3 15 # Разряды выше меряют «сошлась ли запись кодом 0». Но код 0 чекер даёт и там, где # узел вердикта СПОСЧИТАН калькулятором (`перепиской`/`разбором_цели`), а не # проигран записанными ходами (дыра Г7). Гейт Г4/Г7 спрашивает другое: сколько -# РЕАЛЬНО проиграно заново. Этого прибора в дереве не было — и `доказуемость.sh`, +# РЕАЛЬНО проиграно заново. Этого прибора в дереве не было — и `provability.fscript`, # проверка 2, честно держала долю за 0: «нечем мерить». Здесь — то, чем мерить. # # ЧЕСТНЫЙ ЧИСЛИТЕЛЬ. Чекер печатает НЕСКОЛЬКО разных счетов одного корпуса: @@ -335,7 +335,7 @@ trap 'rm -rf "$tmp"' 0 2 3 15 # Разошлись — значит чекер отверг запись, которой в манифесте нет: печатается # РАСХОЖДЕНИЕ и линейка падает кодом 1. Молча вынести чужое сужение не может. # -# ПОРОГ Г4 = 95 % — печатается для чтения; сам гейт держит `доказуемость.sh`. +# ПОРОГ Г4 = 95 % — печатается для чтения; сам гейт держит `provability.fscript`. # # МАНИФЕСТ НАБОРА: путь и как читается. Столбцы TSV — имя, исходник, запись, # что стережёт, ожидаемый исход, класс, заведена (шапка файла их называет). @@ -554,7 +554,13 @@ if [ "$proigr" -eq 1 ]; then fi # Провенанс печатается ПЕРЕД числами: доля, снятая на правленом дереве или # отставшим двоичным, — другое число, и по одному проценту этого не видно. - sh "$root/scripts/report-provenance.sh" || true + provenance=$("$root/bootstrap/flang" io "$root/scripts/report-provenance.fscript" --plan Report 2>/dev/null \ + | sed -n 's/^{"plan":"Report","result":"\(.*\)","orders":[0-9]*,"log":.*$/\1/p') + if [ -n "$provenance" ]; then + printf '%b\n\n' "$provenance" + else + printf '%s\n%s\n\n' "── чем и на чём снято ──" "шапка не снята: план scripts/report-provenance.fscript исполнить нечем — нет bootstrap/flang" + fi echo "═══ ДОЛЯ-ПРОИГРЫВАНИЕМ по корпусу ═══" echo "каталог записей $korpus_pr" echo "записей в наборе $ZAPISEY (чекер поручился $PORUCH, отверг либо не позвал $OTVERG)" diff --git a/flang/proof/forgeries/manifest.tsv b/flang/proof/forgeries/manifest.tsv index 2cfbb5af6..94373843b 100644 --- a/flang/proof/forgeries/manifest.tsv +++ b/flang/proof/forgeries/manifest.tsv @@ -9,7 +9,7 @@ # КТО ЧИТАЕТ ЭТОТ ФАЙЛ: # flang/proof/checker/tests/run.sh — класс и ожидаемый исход каждой пробы; # flang/proof/corpus-share.sh — какие места вынести из знаменателя; -# scripts/доказуемость.sh — проверки 3 и 4 (набор и храповик). +# scripts/provability.fscript — проверки 3 и 4 (набор и храповик). # # СТОЛБЦЫ (разделитель — ОДИН знак табуляции, семь полей): # 1 имя — имя подделки, оно же основа имён исходника и записи; diff --git a/flang/proof/forgeries/ratchet.txt b/flang/proof/forgeries/ratchet.txt index dea49f098..209816a7f 100644 --- a/flang/proof/forgeries/ratchet.txt +++ b/flang/proof/forgeries/ratchet.txt @@ -35,7 +35,7 @@ # # Решение ADR-0023 §6, сторожа 3 и 4. Набор, вынесенный из знаменателя доли, # перестаёт быть виден в проценте, а невидимое ветшает. Здесь стоит то, что -# делает убыль набора ГРОМКОЙ: scripts/доказуемость.sh, проверка 4, сличает эти +# делает убыль набора ГРОМКОЙ: scripts/provability.fscript, проверка 4, сличает эти # два числа с сегодняшним замером и при недоборе печатает НЕ ДОКАЗУЕМ, назвав, # на сколько просело. # @@ -102,7 +102,7 @@ # 0d85887dc). Три пробы К3c на шаг «по примеру» в свободном утверждении: пример # чужой функции и пример своей функции о другом доводе — дважды (у второй # «ожидается» совпадает с ветвью тела, её держит только сверка довода). Замер — -# scripts/доказуемость.sh, «проб на подлог 404, принято кодом 0 — 0». +# scripts/provability.fscript, «проб на подлог 404, принято кодом 0 — 0». # ПРОБ НА ПОДЛОГ ПОДНЯТО 401 → 409, замер 11 сентября 2026, ветка r/ostatok-26. # Заведена семья «остаток-26»: восемь новых проб на подлог (семь порч честной # записи по одной на правило и одна подделка ИСХОДНИКОМ — охрана выбора, которой diff --git a/flang/proof/tables/consistency-violations.tsv b/flang/proof/tables/consistency-violations.tsv index d84bb7e5d..3384b3a23 100644 --- a/flang/proof/tables/consistency-violations.tsv +++ b/flang/proof/tables/consistency-violations.tsv @@ -1,6 +1,6 @@ # ИЗВЕСТНЫЕ НАРУШЕНИЯ СОСТОЯТЕЛЬНОСТИ — открытый список, один файл. # Основание: пункт 11 внешнего аудита — «отдельно публикуй … известные нарушения -# состоятельности». Читает: scripts/four-coverages.sh (третье из четырёх покрытий). +# состоятельности». Читает: scripts/four-coverages.fscript (третье из четырёх покрытий). # # ЗАЧЕМ ФАЙЛ, А НЕ ПРОЗА. Нарушение, названное в прозе одной страницы, живёт ровно # до следующей правки этой страницы. Здесь строка на нарушение, и прибор печатает diff --git a/flang/scripts/count-guard.mjs b/flang/scripts/count-guard.mjs index fb9c8b1b2..72e034509 100644 --- a/flang/scripts/count-guard.mjs +++ b/flang/scripts/count-guard.mjs @@ -628,7 +628,7 @@ export const ПРИСВОЕНИЯ = [ { образец: /\b(?:FLANG_)?(?:MEASURED_COST|POL_IZMERENNYY)\s*=\s*'?(\d[\d\s ]*)'?/u, поле: "MEASURED_COST", что: "измеренная цена шага печати" }, { образец: /\b(?:FLANG_)?MAX_DEPTH\s*=\s*'?(\d[\d\s ]*)'?/u, поле: "MAX_DEPTH", что: "MAX_DEPTH" }, /* `#define FL_MAX_STEPS` пишут не только про НАШЕ семя: им показывают клеймо - чужого двоичного (`scripts/seed/binary-origin.sh`) и печать с потолком в единицу + чужого двоичного (`scripts/seed/binary-origin.fscript`) и печать с потолком в единицу (`docs/reprint-cost.md`, показ бага). Поэтому число засчитывается за утверждение о семени дерева, только если рядом назван сам файл семени. */ { образец: /#define\s+FL_MAX_STEPS\s+(\d[\d\s ]*)/u, поле: "FL_MAX_STEPS", что: "#define FL_MAX_STEPS", при: /bootstrap\/flang_runtime\.h/u }, diff --git a/scripts/four-coverages.fscript b/scripts/four-coverages.fscript new file mode 100644 index 000000000..1c56f4a16 --- /dev/null +++ b/scripts/four-coverages.fscript @@ -0,0 +1,359 @@ +модуль «Four coverages» + использует «Rules» из "rules.fscript" + использует «Inquiry» из "inquiry.fscript" + использует «Reading» из "reading.fscript" + использует «Report provenance» из "report-provenance.fscript" + использует «Lists» только «Соединить списки» + +тотальная функция «Tree» + возвращает строка + ".." + +тотальная функция «Rules table» + возвращает строка + "flang/proof/tables/inference-rules.tsv" + +тотальная функция «Violations table» + возвращает строка + "flang/proof/tables/consistency-violations.tsv" + +тотальная функция «Print rules» + возвращает строка + "flang/translation/PRINT-RULES.tsv" + +тотальная функция «Translation suite» + возвращает строка + "flang/translation/run.sh" + +тотальная функция «Measurements» + возвращает список «Question» + «Соединить списки» от («Provenance questions» от («Tree»)) и [(«Run from» от "share" и («Tree») и "sh" и ["flang/proof/corpus-share.sh", "--проигрыванием"]), + («Run from» от "corpus" и («Tree») и "sh" и ["flang/proof/corpus-share.sh", "--набор", "корпус"]), + («Run from» от "lemmas" и («Tree») и "grep" и ["-h", "-a", "^theorem «", "flang/proof/lean/Rules.lean", "flang/proof/lean/Term.lean"]), + («Run from» от "accepted" и («Tree») и "sed" и ["-n", "/^def «правила» : List/,/\\]$/p", "flang/proof/lean/Acceptance.lean"]), + («Read from» от "rules" и («Tree») и («Rules table»)), + («Read from» от "violations" и («Tree») и («Violations table»)), + («Read from» от "print rules" и («Tree») и («Print rules»)), + («Read from» от "translation suite" и («Tree») и («Translation suite»)), + («Run from» от "translation" и («Tree») и "sh" и [(«Translation suite»)])] + +тотальная функция «Quoted» + принимает text: строка + возвращает список строки + пример «Names stand between the angle quotes» + дано text равно "[.«Т1», .«Кон1»]" + ожидается ["Т1", "Кон1"] + пример «A text without quotes has no names» + дано text равно "theorem" + ожидается пустой список + отобразить (отфильтровать (разделить text по "«") где part → part содержит "»") как part → «First line» от (соединить (разделить part по "»") по "\n") + +тотальная функция «Lemmas» + принимает answers: список «Answer» + возвращает список строки + отобразить («Lines» от («Output of» от "lemmas" и answers)) как line → «First line» от (соединить («Quoted» от line) по "\n") + +тотальная функция «Rows» + принимает least: число, text: строка + возвращает список список строки + пример «Comments and short rows are not rows» + дано least равно 2 + дано text равно "# имя\tузел\nТ1\tтождество\nодин\n" + ожидается [["Т1", "тождество"]] + отфильтровать (отобразить (отфильтровать («Lines» от text) где line → не (line начинается с "#")) как line → разделить line по "\t") где cells → (длина cells) не меньше least + +тотальная функция «Cell» + принимает position: число, cells: список строки + возвращает строка + пример «The second cell of two» + дано position равно 2 + дано cells равно ["Т1", "тождество"] + ожидается "тождество" + пример «A cell past the end is empty» + дано position равно 3 + дано cells равно ["Т1", "тождество"] + ожидается "" + если (position меньше 1) или (position больше (длина cells)) + то "" + иначе элемент position в cells + +тотальная функция «Rules» + принимает answers: список «Answer» + возвращает список строки + отобразить («Rows» от 12 и («Output of» от "rules" и answers)) как cells → «Cell» от 1 и cells + +тотальная функция «Ban lemma» + принимает title: строка + возвращает строка + пример «A triple ban» + дано title равно "Н1✗✗✗" + ожидается "Н1-запрет3" + пример «A double ban» + дано title равно "Н1✗✗" + ожидается "Н1-запрет2" + пример «A single ban» + дано title равно "Н1✗" + ожидается "Н1-запрет" + пусть parts равно (разделить title по "✗") + соединить [(«First line» от (соединить parts по "\n")), («Chosen» от [(«When» от ((длина parts) равен 4) и "-запрет3"), («When» от ((длина parts) равен 3) и "-запрет2")] и "-запрет")] по "" + +тотальная функция «Without first» + принимает parts: список строки + возвращает список строки + пример «The rest after the first part» + дано parts равно ["Н1", "", ""] + ожидается ["", ""] + разбор parts + случай пусто + то пустой список + случай голова и хвост + то хвост + +тотальная функция «Has lemma» + принимает title: строка, lemmas: список строки + возвращает признак + пример «A title has a lemma of its own name» + дано title равно "Т1" + дано lemmas равно ["Т1", "Кон1-слева"] + ожидается да + пример «A title has a lemma that continues its name with a dash» + дано title равно "Кон1" + дано lemmas равно ["Т1", "Кон1-слева"] + ожидается да + пример «A ban has a lemma of the ban» + дано title равно "Н1✗" + дано lemmas равно ["Н1-запрет"] + ожидается да + пример «A title without a lemma» + дано title равно "Кон" + дано lemmas равно ["Т1", "Кон1-слева"] + ожидается нет + если title содержит "✗" + то (длина (отфильтровать lemmas где lemma → lemma равен («Ban lemma» от title))) больше 0 + иначе (длина (отфильтровать lemmas где lemma → (lemma равен title) или (lemma начинается с (соединить [title, "-"] по "")))) больше 0 + +тотальная функция «Formalization lines» + принимает rules: список строки, lemmas: список строки + возвращает список строки + пример «Every title is counted and the bare one is named» + дано rules равно ["Т1", "Н1✗", "Кон"] + дано lemmas равно ["Т1", "Н1-запрет"] + ожидается [" строк перечня правил 3 (из них запретов 1 — ими не выводится ничего)", " имеют лемму в Lean 2 из 3 — без леммы: Кон"] + пусть bare равно (отфильтровать rules где title → не («Has lemma» от title и lemmas)) + [(соединить [" строк перечня правил ", (к строке (длина rules)), " (из них запретов ", (к строке (длина (отфильтровать rules где title → title содержит "✗"))), " — ими не выводится ничего)"] по ""), + (соединить [" имеют лемму в Lean ", (к строке ((длина rules) минус (длина bare))), " из ", (к строке (длина rules)), (если (длина bare) больше 0 то (соединить [" — без леммы: ", (соединить bare по ", ")] по "") иначе "")] по "")] + +тотальная функция «Distinct» + принимает names: список строки + возвращает список строки + пример «A repeated name is kept once» + дано names равно ["Т1", "Кон1", "Т1"] + ожидается ["Т1", "Кон1"] + свёртка names начиная с (пустой список) как kept и name → если (длина (отфильтровать kept где known → known равен name)) больше 0 то kept иначе (добавить name к kept) + +тотальная функция «Accepted» + принимает answers: список «Answer» + возвращает список строки + «Distinct» от (отобразить (отфильтровать («Without first» от (разделить («Output of» от "accepted" и answers) по ".«")) где part → part содержит "»") как part → «First line» от (соединить (разделить part по "»") по "\n")) + +тотальная функция «Inference rules» + принимает answers: список «Answer» + возвращает список строки + «Distinct» от (отфильтровать («Rules» от answers) где title → не (title содержит "✗")) + +тотальная функция «Outside» + принимает answers: список «Answer» + возвращает список строки + пусть accepted равно («Accepted» от answers) + отфильтровать («Inference rules» от answers) где title → (длина (отфильтровать accepted где known → known равен title)) равен 0 + +тотальная функция «Sorting» + принимает answers: список «Answer» + возвращает список «Question» + [(«Run» от "outside" и "sh" и (приписать "-c" к (приписать "printf '%s\\n' \"$@\" | LC_ALL=C sort -u" к (приписать "sh" к («Outside» от answers)))))] + +тотальная функция «Said by» + принимает name: строка, answers: список «Answer» + возвращает список строки + «Соединить списки» от («Lines» от («Output of» от name и answers)) и («Lines» от («Errors of» от name и answers)) + +тотальная функция «Share words» + принимает line: строка + возвращает строка + пример «The share is retold with its parts» + дано line равно "доля-проигрыванием = 650 / 650 = 100.00 % (порог 95)" + ожидается "650 из 650 = 100.00 %" + пример «A line of another shape gives nothing» + дано line равно "доля-проигрыванием = много" + ожидается "" + если ((«Digits» от («Word» от 3 и line)) и притом («Digits» от («Word» от 5 и line))) и притом ((«Word» от 8 и line) равен "%") + то соединить [(«Word» от 3 и line), " из ", («Word» от 5 и line), " = ", («Word» от 7 и line), " %"] по "" + иначе "" + +тотальная функция «Idle» + принимает answers: список «Answer» + возвращает строка + пусть line равно («First line» от (соединить (отфильтровать («Lines» от («Output of» от "corpus" и answers)) где line → (соединить («Words» от line) по " ") начинается с "из них ВПУСТУЮ") по "\n")) + «Leading digits» от («Cell» от 2 и (разделить line по "\t")) + +тотальная функция «Share lines» + принимает answers: список «Answer» + возвращает список строки + пусть said равно («Said by» от "share" и answers) + пусть share равно («Share words» от («Beginning with» от "доля-проигрыванием = " и said)) + пусть records равно («Beginning with» от "записей в наборе " и said) + если пусто share + то [" НЕ СНЯТО: линейка доли не дала числа"] + иначе [(соединить [" переиграно независимо ", share] по ""), + (соединить [" записей в наборе ", («Or unknown» от («Leading digits» от («Word» от 4 и records))), " (проверяющий поручился за ", («Or unknown» от («Number after» от "чекер поручился " и records)), ")"] по ""), + (соединить [" мест вынесено из знаменателя ", (к строке («Count» от («Leading digits» от («Word» от 3 и («Beginning with» от "исключено мест " и said))))), " — записи, отвергнутые ЦЕЛИКОМ как заведомо ложные"] по "")] + +тотальная функция «Share section» + принимает answers: список «Answer» + возвращает список строки + «Gathered words» от [["1. ПОКРЫТИЕ СОБСТВЕННЫХ ЗАПИСЕЙ ДОКАЗАТЕЛЬСТВА — доля их мест, переигранных независимым проверяющим"], + («Share lines» от answers), + [(соединить [" из них ВПУСТУЮ (код 0, доказанным не числится ничего) ", («Or unknown» от («Idle» от answers))] по ""), + " ЧЕГО НЕ ЗНАЧИТ: ни одной строки о ваших программах и ни одной о собранном двоичном.", + ""]] + +тотальная функция «Formalization is readable» + принимает answers: список «Answer» + возвращает признак + ((длина («Lemmas» от answers)) больше 0) и притом ((«Exit code of» от "rules" и answers) равен 0) + +тотальная функция «Acceptance lines» + принимает answers: список «Answer» + возвращает список строки + пусть outside равно («Lines» от («Output of» от "outside" и answers)) + [(соединить [" в приёмке Lean (Acceptance.lean) ", (к строке (длина («Accepted» от answers))), " правил из ", (к строке (длина («Inference rules» от answers))), " правил вывода"] по ""), + (соединить [" ВНЕ приёмки Lean ", (к строке (длина outside)), ": ", (соединить (отобразить outside как title → соединить [title, " "] по "") по "")] по ""), + " блоков записи, ушедших «вне приёмки», — НЕ СНЯТО ЗДЕСЬ: нужен прогон Lean", + " (sh flang/proof/lean/run.sh, Lean по flang/proof/lean/lean-toolchain)"] + +тотальная функция «Formalization section» + принимает answers: список «Answer» + возвращает список строки + «Gathered words» от [["2. ПОКРЫТИЕ ФОРМАЛИЗАЦИИ — сколько правил вывода судит второй, чужой судья (Lean 4)"], + (если «Formalization is readable» от answers то («Соединить списки» от («Formalization lines» от («Rules» от answers) и («Lemmas» от answers)) и («Acceptance lines» от answers)) иначе [" НЕ СНЯТО: нет ведомости правил либо файлов Lean"]), + [" ЧЕГО НЕ ЗНАЧИТ: лемма на правило — не проверка ваших программ этим правилом.", ""]] + +тотальная функция «Violation lines» + принимает cells: список строки + возвращает список строки + пример «An open violation is told in three lines» + дано cells равно ["ключ-1", "что случилось", "где лежит", "чем снять", "16", "—", "открыто"] + ожидается [" · ключ-1 — что случилось", " где: где лежит", " число: 16; чем снять: чем снять; задача: —"] + пример «A closed violation is not told» + дано cells равно ["ключ-1", "что случилось", "где лежит", "чем снять", "16", "—", "закрыто"] + ожидается пустой список + если («Cell» от 7 и cells) равен "открыто" + то [(соединить [" · ", («Cell» от 1 и cells), " — ", («Cell» от 2 и cells)] по ""), + (соединить [" где: ", («Cell» от 3 и cells)] по ""), + (соединить [" число: ", («Cell» от 5 и cells), "; чем снять: ", («Cell» от 4 и cells), "; задача: ", («Cell» от 6 и cells)] по "")] + иначе пустой список + +тотальная функция «Violations» + принимает answers: список «Answer» + возвращает список список строки + отфильтровать («Rows» от 7 и («Output of» от "violations" и answers)) где cells → не ((«Cell» от 1 и cells) равен "ключ") + +тотальная функция «Violations section» + принимает answers: список «Answer» + возвращает список строки + пусть told равно («Gathered words» от (отобразить («Violations» от answers) как cells → «Violation lines» от cells)) + «Gathered words» от [["3. ИЗВЕСТНЫЕ НАРУШЕНИЯ СОСТОЯТЕЛЬНОСТИ — открыто, поимённо"], + (если («Exit code of» от "violations" и answers) равен 0 то («Соединить списки» от told и [(соединить [" открытых нарушений: ", (к строке ((длина told) делить на 3)), " (ведомость ", («Violations table»), ")"] по "")]) иначе [(соединить [" НЕ СНЯТО: нет ", («Violations table»)] по "")]), + [" ЧЕГО НЕ ЗНАЧИТ: список открытый — «других нет» он не утверждает.", ""]] + +тотальная функция «Print rows» + принимает answers: список «Answer» + возвращает список список строки + отфильтровать («Rows» от 1 и («Output of» от "print rules" и answers)) где cells → не ((«Cell» от 1 и cells) равен "имя") + +тотальная функция «Translation result» + принимает answers: список «Answer» + возвращает строка + «After» от "ИТОГ: " и («Beginning with» от "ИТОГ: " и («Said by» от "translation" и answers)) + +тотальная функция «Translation is readable» + принимает answers: список «Answer» + возвращает признак + ((«Exit code of» от "print rules" и answers) равен 0) и притом ((«Exit code of» от "translation suite" и answers) равен 0) + +тотальная функция «Translation lines» + принимает answers: список «Answer» + возвращает список строки + пусть rows равно («Print rows» от answers) + пусть total равно (к строке (длина rows)) + [(соединить [" опытов в run.sh ", (к строке (длина (отфильтровать («Lines» от («Output of» от "translation suite" и answers)) где line → line начинается с "opyt ")))] по ""), + (соединить [" правил печати в списке ", total] по ""), + (соединить [" сверяются с ИСХОДНИКОМ ", (к строке (длина (отфильтровать rows где cells → не ((«Cell» от 5 и cells) равен "—")))), " из ", total, " (у остальных якоря в исходнике нет: сверка идёт C против протокола)"] по ""), + (соединить [" не переигрываются вовсе ", (к строке (длина (отфильтровать rows где cells → («Cell» от 6 и cells) начинается с "НЕ переигрывается"))), " из ", total, " (сличается только текст в составе файла)"] по ""), + (соединить [" прогон сличителя ", (если пусто («Translation result» от answers) то "НЕ СНЯТ" иначе («Translation result» от answers))] по "")] + +тотальная функция «Translation section» + принимает answers: список «Answer» + возвращает список строки + «Gathered words» от [["4. ПОКРЫТИЕ ТРАНСЛЯЦИИ — сверка перевода flang → C по протоколу печати (flang/translation)"], + (если «Translation is readable» от answers то («Translation lines» от answers) иначе [(соединить [" НЕ СНЯТО: нет ", («Print rules»), " либо ", («Translation suite»)] по "")]), + [" ЧЕГО НЕ ЗНАЧИТ: сличитель судит ОДИН запуск печати, а не генератор кода целиком.", ""]] + +тотальная функция «Lean is present» + принимает answers: список «Answer» + возвращает признак + не ((«Exit code of» от "lean version" и answers) равен 127) + +тотальная функция «All measured» + принимает answers: список «Answer» + возвращает признак + ((((длина («Share lines» от answers)) больше 1) и притом ((«Formalization is readable» от answers) и притом («Lean is present» от answers))) и притом ((«Exit code of» от "violations" и answers) равен 0)) и притом ((«Translation is readable» от answers) и притом (не (пусто («Translation result» от answers)))) + +тотальная функция «Coverages» + принимает answers: список «Answer» + возвращает строка + соединить («Gathered words» от [[(«Provenance» от answers), ""], + («Share section» от answers), + («Formalization section» от answers), + («Violations section» от answers), + («Translation section» от answers), + [(если «All measured» от answers то "все четыре покрытия сняты" иначе "СНЯТЫ НЕ ВСЕ ЧЕТЫРЕ — что и почему, названо выше строкой «НЕ СНЯТО»")]]) по "\n" + +тотальная функция «Outcome» + принимает answers: список «Answer» + возвращает «Продолжение» + если «All measured» от answers + то вариант «Конец работы» с значение равным («Coverages» от answers) + иначе вариант «Не проверено» с код равным "FLANG_COVERAGES_NOT_ALL_MEASURED" и сообщение равным («Coverages» от answers) + +тотальная функция «Stage» + принимает stages: число, answers: список «Answer» + возвращает список «Question» + если stages равен 1 + то «Measurements» + иначе «Соединить списки» от («Lean question» от answers) и («Sorting» от answers) + +тотальная функция «Proceed» + принимает queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + разбор queue + случай голова и хвост + то «Ask» от (голова) и (хвост) и stages и answers + случай пусто + то если stages не больше 0 + то «Outcome» от answers + иначе «Proceed» от («Stage» от (stages минус 1) и answers) и (stages минус 1) и answers + +тотальная функция «Begin» + возвращает «Inquiry» + «Begin with» от 2 + +тотальная функция «Next» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает «Продолжение» + «Proceed» от (inquiry.«queue») и (inquiry.«stages») и («Heard» от inquiry и reply) + +план «Measure» + состояние «Inquiry» + начинает с «Begin» + обрабатывает «Next» diff --git a/scripts/four-coverages.sh b/scripts/four-coverages.sh deleted file mode 100644 index d1cce2c57..000000000 --- a/scripts/four-coverages.sh +++ /dev/null @@ -1,165 +0,0 @@ -#!/bin/sh -# SPDX-FileCopyrightText: 2026 Digitable (Marat Zimnurov) -# SPDX-License-Identifier: BSD-2-Clause -# -# ЧЕТЫРЕ ПОКРЫТИЯ РАЗОМ — одним прибором, с датой и SHA. -# -# sh scripts/four-coverages.sh -# -# ── Зачем ─────────────────────────────────────────────────────────────────── -# В прозе жило ОДНО число — «650 из 650 = 100 %», — и его читали как «язык -# доказан». Оно не об этом. Пункт 11 внешнего аудита требует различать четыре -# разных покрытия и публиковать их ОТДЕЛЬНО: -# -# 1 покрытие собственных доля мест в собственных записях доказательства -# записей компилятора компилятора, переигранных независимым проверяющим; -# 2 покрытие формализации сколько правил вывода имеют лемму в Lean и -# сколько правил приёмка Lean не судит вовсе; -# 3 нарушения состоятельности места, где две независимые проверки говорят -# разное, либо успех проверяющего не значит того, -# что читатель прочтёт; -# 4 покрытие трансляции сколько опытов у сличителя перевода в C и сколько -# правил печати он сверяет с ИСХОДНИКОМ, а не только -# с протоколом. -# -# Врозь эти четыре смотрятся как одно, и высокое первое закрывает низкое -# четвёртое. Поэтому прибор печатает их ВМЕСТЕ и на одном экране. -# -# КОД ВОЗВРАТА: 0 — все четыре сняты; 2 — хоть одно снять не удалось (нет -# двоичного, нет Lean, отказал прогон). Код 1 здесь не бывает: прибор МЕРИТ, а -# не судит; порог и вердикт — дело scripts/доказуемость.sh. -# -# Имена переменных латиницей: ни dash, ни bash не принимают кириллицу в именах. -set -u - -KOREN=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -cd "$KOREN" || exit 2 - -NE_SNYATO=0 -TMP=$(mktemp -d "${FLANG_TMP:-${TMPDIR:-/tmp}}/four-coverages.XXXXXX") || exit 2 -trap 'rm -rf "$TMP"' EXIT INT TERM - -sh "$KOREN/scripts/report-provenance.sh" || true - -# ── 1. ПОКРЫТИЕ КОРПУСА ───────────────────────────────────────────────────── -# Числитель и знаменатель берутся у линейки прогоном, а не переписываются сюда. -echo "1. ПОКРЫТИЕ СОБСТВЕННЫХ ЗАПИСЕЙ ДОКАЗАТЕЛЬСТВА — доля их мест, переигранных независимым проверяющим" -LIN=$(sh flang/proof/corpus-share.sh --проигрыванием 2>&1) -DOLYA=$(printf '%s\n' "$LIN" | sed -n 's/^доля-проигрыванием = \([0-9]*\) \/ \([0-9]*\) = \([0-9.]*\) %.*/\1 из \2 = \3 %/p') -ZAPISEY=$(printf '%s\n' "$LIN" | sed -n 's/^записей в наборе *\([0-9][0-9]*\).*/\1/p') -PORUCH=$(printf '%s\n' "$LIN" | sed -n 's/^записей в наборе.*чекер поручился \([0-9][0-9]*\),.*/\1/p') -NEDOST=$(printf '%s\n' "$LIN" | sed -n 's/^исключено мест *\([0-9][0-9]*\).*/\1/p') -if [ -z "$DOLYA" ]; then - echo " НЕ СНЯТО: линейка доли не дала числа"; NE_SNYATO=1 -else - echo " переиграно независимо $DOLYA" - echo " записей в наборе ${ZAPISEY:-?} (проверяющий поручился за ${PORUCH:-?})" - echo " мест вынесено из знаменателя ${NEDOST:-0} — записи, отвергнутые ЦЕЛИКОМ как заведомо ложные" -fi -# «ПРОВЕРЕНО ВПУСТУЮ»: код 0 при нуле доказанного. Число снимается тем же -# прибором, что и доля, но другим его разрезом, — поэтому отдельным прогоном. -PUSTO=$(sh flang/proof/corpus-share.sh --набор корпус 2>/dev/null \ - | sed -n 's/^ *из них ВПУСТУЮ[^ ]* \([0-9][0-9]*\).*/\1/p' | head -1) -echo " из них ВПУСТУЮ (код 0, доказанным не числится ничего) ${PUSTO:-?}" -echo " ЧЕГО НЕ ЗНАЧИТ: ни одной строки о ваших программах и ни одной о собранном двоичном." -echo - -# ── 2. ПОКРЫТИЕ ФОРМАЛИЗАЦИИ ──────────────────────────────────────────────── -# Пары «строка ведомости ↔ лемма» считаются тем же правилом, что в -# flang/proof/lean/run.sh (шаг 4): имя правила, имя с приставкой через дефис, -# у запрета — встречный пример «-запрет». Lean для этого не нужен: считается -# текст, а не доказательство. Блоки «вне приёмки» — нужен, и об этом сказано. -echo "2. ПОКРЫТИЕ ФОРМАЛИЗАЦИИ — сколько правил вывода судит второй, чужой судья (Lean 4)" -VED=flang/proof/tables/inference-rules.tsv -cat flang/proof/lean/Rules.lean flang/proof/lean/Term.lean > "$TMP/леммы.lean" 2>/dev/null -if [ ! -s "$TMP/леммы.lean" ] || [ ! -f "$VED" ]; then - echo " НЕ СНЯТО: нет ведомости правил либо файлов Lean"; NE_SNYATO=1 -else - awk -F'\t' ' - FNR == NR { if ($0 ~ /^theorem «/) { split($0, a, "«"); split(a[2], b, "»"); L[b[1]] = 1 } next } - NF > 11 && $1 !~ /^#/ { - r = $1; s++; if (index(r, "✗")) zap++; ok = 0 - if (index(r, "✗")) { - k = r; if (!sub(/✗✗✗$/, "-запрет3", k)) if (!sub(/✗✗$/, "-запрет2", k)) sub(/✗/, "-запрет", k) - ok = (k in L) - } else if (r in L) ok = 1 - else for (x in L) if (index(x, r "-") == 1) { ok = 1; break } - if (ok) e++; else net = net (net != "" ? ", " : "") r - } - END { - printf " строк перечня правил %d (из них запретов %d — ими не выводится ничего)\n", s, zap - printf " имеют лемму в Lean %d из %d%s\n", e, s, (net != "" ? " — без леммы: " net : "") - }' "$TMP/леммы.lean" "$VED" - - # Приёмка Lean — закрытый список «правила» в Acceptance.lean. Правило вне него - # Lean не судит: блок записи с таким шагом уходит «вне приёмки» целиком. - awk '/^def «правила» : List/{f=1} f{buf = buf $0} f && /\]$/{print buf; exit}' \ - flang/proof/lean/Acceptance.lean | grep -o '\.«[^»]*»' | sed 's/\.«//; s/»//' \ - | LC_ALL=C sort -u > "$TMP/приёмка" - awk -F'\t' 'NF > 11 && $1 !~ /^#/ && $1 !~ /✗/ {print $1}' "$VED" | LC_ALL=C sort -u > "$TMP/вывода" - V_PRIEM=$(wc -l < "$TMP/приёмка" | tr -d ' ') - V_VYVODA=$(wc -l < "$TMP/вывода" | tr -d ' ') - VNE=$(LC_ALL=C comm -23 "$TMP/вывода" "$TMP/приёмка") - V_VNE=$(printf '%s\n' "$VNE" | sed '/^$/d' | wc -l | tr -d ' ') - echo " в приёмке Lean (Acceptance.lean) $V_PRIEM правил из $V_VYVODA правил вывода" - echo " ВНЕ приёмки Lean $V_VNE: $(printf '%s\n' "$VNE" | sed '/^$/d' | tr '\n' ' ')" - echo " блоков записи, ушедших «вне приёмки», — НЕ СНЯТО ЗДЕСЬ: нужен прогон Lean" - echo " (sh flang/proof/lean/run.sh, Lean по flang/proof/lean/lean-toolchain)" - command -v "${LEAN:-lean}" >/dev/null 2>&1 || NE_SNYATO=1 -fi -echo " ЧЕГО НЕ ЗНАЧИТ: лемма на правило — не проверка ваших программ этим правилом." -echo - -# ── 3. ИЗВЕСТНЫЕ НАРУШЕНИЯ СОСТОЯТЕЛЬНОСТИ ────────────────────────────────── -echo "3. ИЗВЕСТНЫЕ НАРУШЕНИЯ СОСТОЯТЕЛЬНОСТИ — открыто, поимённо" -NAR=flang/proof/tables/consistency-violations.tsv -if [ ! -f "$NAR" ]; then - echo " НЕ СНЯТО: нет $NAR"; NE_SNYATO=1 -else - awk -F'\t' ' - /^#/ { next } $1 == "ключ" { next } NF < 7 { next } - { - otkryto += ($7 == "открыто") - if ($7 != "открыто") next - printf " · %s — %s\n", $1, $2 - printf " где: %s\n", $3 - printf " число: %s; чем снять: %s; задача: %s\n", $5, $4, $6 - } - END { printf " открытых нарушений: %d (ведомость %s)\n", otkryto+0, FILENAME }' "$NAR" -fi -echo " ЧЕГО НЕ ЗНАЧИТ: список открытый — «других нет» он не утверждает." -echo - -# ── 4. ПОКРЫТИЕ ТРАНСЛЯЦИИ ────────────────────────────────────────────────── -# Сличитель перевода (ADR-0030) переигрывает протокол печатника против -# напечатанного C. Вопрос покрытия здесь двойной: сколько ОПЫТОВ у прогона и -# сколько правил печати сверяются с ИСХОДНИКОМ, а не только с протоколом. -# Правило без якоря в исходнике сличитель проверяет «C против протокола» — -# согласованная пара может при этом расходиться с программой, которую написали. -echo "4. ПОКРЫТИЕ ТРАНСЛЯЦИИ — сверка перевода flang → C по протоколу печати (flang/translation)" -PR=flang/translation/PRINT-RULES.tsv -RUN=flang/translation/run.sh -if [ ! -f "$PR" ] || [ ! -f "$RUN" ]; then - echo " НЕ СНЯТО: нет $PR либо $RUN"; NE_SNYATO=1 -else - OPYTOV=$(grep -c '^opyt ' "$RUN" | tr -d ' ') - VSEGO_PR=$(awk -F'\t' '!/^#/ && $1 != "имя" && NF {n++} END{print n+0}' "$PR") - S_YAKOREM=$(awk -F'\t' '!/^#/ && $1 != "имя" && NF && $5 != "—" {n++} END{print n+0}' "$PR") - BEZ_SLICH=$(awk -F'\t' '!/^#/ && $1 != "имя" && NF && $6 ~ /^НЕ переигрывается/ {n++} END{print n+0}' "$PR") - echo " опытов в run.sh $OPYTOV" - echo " правил печати в списке $VSEGO_PR" - echo " сверяются с ИСХОДНИКОМ $S_YAKOREM из $VSEGO_PR (у остальных якоря в исходнике нет: сверка идёт C против протокола)" - echo " не переигрываются вовсе $BEZ_SLICH из $VSEGO_PR (сличается только текст в составе файла)" - ITOG=$(sh "$RUN" 2>&1 | sed -n 's/^ИТОГ: //p') - if [ -n "$ITOG" ]; then echo " прогон сличителя $ITOG" - else echo " прогон сличителя НЕ СНЯТ"; NE_SNYATO=1; fi -fi -echo " ЧЕГО НЕ ЗНАЧИТ: сличитель судит ОДИН запуск печати, а не генератор кода целиком." -echo - -if [ "$NE_SNYATO" -eq 0 ]; then - echo "все четыре покрытия сняты" - exit 0 -fi -echo "СНЯТЫ НЕ ВСЕ ЧЕТЫРЕ — что и почему, названо выше строкой «НЕ СНЯТО»" -exit 2 diff --git a/scripts/inquiry.fscript b/scripts/inquiry.fscript new file mode 100644 index 000000000..50886f6a0 --- /dev/null +++ b/scripts/inquiry.fscript @@ -0,0 +1,331 @@ +модуль «Inquiry» + использует «Lists» только «Соединить списки» + +объект «Question» + «name»: строка + «order»: «Поручение» + +объект «Answer» + «name»: строка + «reply»: «Отклик» + +объект «Inquiry» + «asked»: строка + «queue»: список «Question» + «stages»: число + «answers»: список «Answer» + +тотальная функция «Begin with» + принимает stages: число + возвращает «Inquiry» + пример «Nothing is asked and nothing is known at the start» + дано stages равно 2 + ожидается запись «Inquiry» с «asked» равным "" и «queue» равным пустой список и «stages» равным 2 и «answers» равным пустой список + запись «Inquiry» с «asked» равным "" и «queue» равным пустой список и «stages» равным stages и «answers» равным пустой список + +тотальная функция «Run» + принимает name: строка, program: строка, arguments: список строки + возвращает «Question» + пример «A process question carries the program and its arguments» + дано name равно "head" + дано program равно "git" + дано arguments равно ["rev-parse", "HEAD"] + ожидается запись «Question» с «name» равным "head" и «order» равным (вариант «Запустить процесс» с программа равным "git" и аргументы равным ["rev-parse", "HEAD"]) + запись «Question» с «name» равным name и «order» равным (вариант «Запустить процесс» с программа равным program и аргументы равным arguments) + +тотальная функция «Run from» + принимает name: строка, directory: строка, program: строка, arguments: список строки + возвращает «Question» + пример «The shell only changes the directory and gives way to the program» + дано name равно "head" + дано directory равно ".." + дано program равно "git" + дано arguments равно ["rev-parse", "HEAD"] + ожидается запись «Question» с «name» равным "head" и «order» равным (вариант «Запустить процесс» с программа равным "sh" и аргументы равным ["-c", "cd \"$0\" && exec \"$@\"", "..", "git", "rev-parse", "HEAD"]) + «Run» от name и "sh" и (приписать "-c" к (приписать "cd \"$0\" && exec \"$@\"" к (приписать directory к (приписать program к arguments)))) + +тотальная функция «Read from» + принимает name: строка, directory: строка, path: строка + возвращает «Question» + пример «A path from the root is read through the root» + дано name равно "ledger" + дано directory равно ".." + дано path равно "docs/ledger.tsv" + ожидается запись «Question» с «name» равным "ledger" и «order» равным (вариант «Прочитать файл» с путь равным "../docs/ledger.tsv") + пример «An absolute path is read as it is» + дано name равно "ledger" + дано directory равно ".." + дано path равно "/srv/ledger.tsv" + ожидается запись «Question» с «name» равным "ledger" и «order» равным (вариант «Прочитать файл» с путь равным "/srv/ledger.tsv") + если path начинается с "/" + то «Read» от name и path + иначе «Read» от name и (соединить [directory, "/", path] по "") + +тотальная функция «Read» + принимает name: строка, path: строка + возвращает «Question» + пример «A file question carries the path» + дано name равно "ledger" + дано path равно "../docs/ledger.tsv" + ожидается запись «Question» с «name» равным "ledger" и «order» равным (вариант «Прочитать файл» с путь равным "../docs/ledger.tsv") + запись «Question» с «name» равным name и «order» равным (вариант «Прочитать файл» с путь равным path) + +тотальная функция «Environment» + принимает name: строка, variable: строка + возвращает «Question» + пример «An environment question carries the variable name» + дано name равно "lean" + дано variable равно "LEAN" + ожидается запись «Question» с «name» равным "lean" и «order» равным (вариант «Прочитать переменную среды» с имя равным "LEAN") + запись «Question» с «name» равным name и «order» равным (вариант «Прочитать переменную среды» с имя равным variable) + +тотальная функция «Arguments» + принимает name: строка + возвращает «Question» + пример «An arguments question carries nothing but its name» + дано name равно "arguments" + ожидается запись «Question» с «name» равным "arguments" и «order» равным (вариант «Прочитать доводы») + запись «Question» с «name» равным name и «order» равным (вариант «Прочитать доводы») + +тотальная функция «Heard» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает список «Answer» + пример «The first turn brings no answer» + дано inquiry равно запись «Inquiry» с «asked» равным "" и «queue» равным пустой список и «stages» равным 1 и «answers» равным пустой список + дано reply равно вариант «Пока ничего» + ожидается пустой список + пример «A reply is filed under the name of its question» + дано inquiry равно запись «Inquiry» с «asked» равным "day" и «queue» равным пустой список и «stages» равным 0 и «answers» равным пустой список + дано reply равно вариант «Процесс завершён» с код равным 0 и вывод равным "2026-09-27\n" и ошибки равным "" + ожидается [запись «Answer» с «name» равным "day" и «reply» равным (вариант «Процесс завершён» с код равным 0 и вывод равным "2026-09-27\n" и ошибки равным "")] + если пусто (inquiry.«asked») + то inquiry.«answers» + иначе добавить (запись «Answer» с «name» равным (inquiry.«asked») и «reply» равным reply) к (inquiry.«answers») + +тотальная функция «Answered» + принимает name: строка, answers: список «Answer» + возвращает признак + пример «An unknown name has no answer» + дано name равно "day" + дано answers равно пустой список + ожидается нет + (длина (отфильтровать answers где answer → (answer.«name») равен name)) больше 0 + +тотальная функция «Gathered» + принимает parts: список список «Question» + возвращает список «Question» + пример «Parts follow one another in their order» + дано parts равно [[запись «Question» с «name» равным "arguments" и «order» равным (вариант «Прочитать доводы»)], пустой список, [запись «Question» с «name» равным "ledger" и «order» равным (вариант «Прочитать файл» с путь равным "ledger.tsv")]] + ожидается [запись «Question» с «name» равным "arguments" и «order» равным (вариант «Прочитать доводы»), запись «Question» с «name» равным "ledger" и «order» равным (вариант «Прочитать файл» с путь равным "ledger.tsv")] + свёртка parts начиная с (пустой список) как gathered и part → «Соединить списки» от gathered и part + +тотальная функция «Ask» + принимает question: «Question», queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + пример «The order goes out and the rest of the queue waits» + дано question равно запись «Question» с «name» равным "arguments" и «order» равным (вариант «Прочитать доводы») + дано queue равно пустой список + дано stages равно 1 + дано answers равно пустой список + ожидается вариант «Сделать» с поручение равным (вариант «Прочитать доводы») и потом равным (запись «Inquiry» с «asked» равным "arguments" и «queue» равным пустой список и «stages» равным 1 и «answers» равным пустой список) + вариант «Сделать» с поручение равным (question.«order») и потом равным (запись «Inquiry» с «asked» равным (question.«name») и «queue» равным queue и «stages» равным stages и «answers» равным answers) + +тотальная функция «Reply to» + принимает name: строка, answers: список «Answer» + возвращает «Отклик» + пример «An unknown name is answered with nothing» + дано name равно "day" + дано answers равно пустой список + ожидается вариант «Пока ничего» + свёртка answers начиная с (вариант «Пока ничего») как found и answer → если (answer.«name») равен name то (answer.«reply») иначе found + +тотальная функция «Output» + принимает reply: «Отклик» + возвращает строка + пример «A finished process gives its output» + дано reply равно вариант «Процесс завершён» с код равным 0 и вывод равным "text\n" и ошибки равным "" + ожидается "text\n" + пример «A read file gives its content» + дано reply равно вариант «Прочитано» с содержимое равным "content" + ожидается "content" + пример «A failure gives nothing» + дано reply равно вариант «Сбой» с код равным "FLANG_IO_NOT_FOUND" и сообщение равным "no file" + ожидается "" + разбор reply + случай вариант «Процесс завершён» с код как code и вывод как output и ошибки как errors + то output + случай вариант «Прочитано» с содержимое как content + то content + случай любое + то "" + +тотальная функция «Errors» + принимает reply: «Отклик» + возвращает строка + разбор reply + случай вариант «Процесс завершён» с код как code и вывод как output и ошибки как errors + то errors + случай вариант «Процесс убит» с сигнал как signal и вывод как output и ошибки как errors + то errors + случай вариант «Сбой» с код как code и сообщение как message + то message + случай любое + то "" + +тотальная функция «Exit code» + принимает reply: «Отклик» + возвращает число + пример «A finished process gives its code» + дано reply равно вариант «Процесс завершён» с код равным 7 и вывод равным "" и ошибки равным "" + ожидается 7 + пример «A read file counts as success» + дано reply равно вариант «Прочитано» с содержимое равным "content" + ожидается 0 + пример «Anything else counts as not started» + дано reply равно вариант «Сбой» с код равным "FLANG_IO_NOT_FOUND" и сообщение равным "no file" + ожидается 127 + разбор reply + случай вариант «Процесс завершён» с код как code и вывод как output и ошибки как errors + то code + случай вариант «Прочитано» с содержимое как content + то 0 + случай любое + то 127 + +тотальная функция «Output of» + принимает name: строка, answers: список «Answer» + возвращает строка + «Output» от («Reply to» от name и answers) + +тотальная функция «Errors of» + принимает name: строка, answers: список «Answer» + возвращает строка + «Errors» от («Reply to» от name и answers) + +тотальная функция «Exit code of» + принимает name: строка, answers: список «Answer» + возвращает число + «Exit code» от («Reply to» от name и answers) + +тотальная функция «Setting» + принимает reply: «Отклик», fallback: строка + возвращает строка + пример «A set variable gives its value» + дано reply равно вариант «Значение среды» с значение равным "lean4" + дано fallback равно "lean" + ожидается "lean4" + пример «An empty variable falls back» + дано reply равно вариант «Значение среды» с значение равным "" + дано fallback равно "lean" + ожидается "lean" + пример «An unset variable falls back» + дано reply равно вариант «Переменной среды нет» + дано fallback равно "lean" + ожидается "lean" + разбор reply + случай вариант «Значение среды» с значение как value + то если пусто value то fallback иначе value + случай любое + то fallback + +тотальная функция «Setting of» + принимает name: строка, fallback: строка, answers: список «Answer» + возвращает строка + «Setting» от («Reply to» от name и answers) и fallback + +тотальная функция «Given» + принимает reply: «Отклик» + возвращает список строки + пример «Arguments come as they were given» + дано reply равно вариант «Доводы» с доводы равным ["--forgery"] + ожидается ["--forgery"] + пример «No reply means no arguments» + дано reply равно вариант «Пока ничего» + ожидается пустой список + разбор reply + случай вариант «Доводы» с доводы как passed + то passed + случай любое + то пустой список + +тотальная функция «Given of» + принимает name: строка, answers: список «Answer» + возвращает список строки + «Given» от («Reply to» от name и answers) + +тотальная функция «Write» + принимает name: строка, path: строка, content: строка + возвращает «Question» + пример «A write question carries the path and the content» + дано name равно "record" + дано path равно "/srv/tmp/memory.tsv" + дано content равно "1\t2\n" + ожидается запись «Question» с «name» равным "record" и «order» равным (вариант «Записать файл» с путь равным "/srv/tmp/memory.tsv" и содержимое равным "1\t2\n") + запись «Question» с «name» равным name и «order» равным (вариант «Записать файл» с путь равным path и содержимое равным content) + +тотальная функция «Remove» + принимает name: строка, path: строка + возвращает «Question» + пример «A remove question carries the path» + дано name равно "cleanup" + дано path равно "/srv/tmp/work" + ожидается запись «Question» с «name» равным "cleanup" и «order» равным (вариант «Удалить файл» с путь равным "/srv/tmp/work") + запись «Question» с «name» равным name и «order» равным (вариант «Удалить файл» с путь равным path) + +тотальная функция «List» + принимает name: строка, path: строка + возвращает «Question» + пример «A list question carries the directory» + дано name равно "printed" + дано path равно "../bootstrap" + ожидается запись «Question» с «name» равным "printed" и «order» равным (вариант «Перечислить каталог» с путь равным "../bootstrap") + запись «Question» с «name» равным name и «order» равным (вариант «Перечислить каталог» с путь равным path) + +тотальная функция «Temporary directory» + принимает name: строка, pattern: строка + возвращает «Question» + пример «A temporary directory question carries the pattern» + дано name равно "work" + дано pattern равно "provability" + ожидается запись «Question» с «name» равным "work" и «order» равным (вариант «Завести временный каталог» с образец равным "provability") + запись «Question» с «name» равным name и «order» равным (вариант «Завести временный каталог» с образец равным pattern) + +тотальная функция «Made» + принимает reply: «Отклик» + возвращает строка + пример «A made directory gives its path» + дано reply равно вариант «Заведено» с путь равным "/tmp/work-1" + ожидается "/tmp/work-1" + пример «Anything else gives no path» + дано reply равно вариант «Пока ничего» + ожидается "" + разбор reply + случай вариант «Заведено» с путь как path + то path + случай любое + то "" + +тотальная функция «Made of» + принимает name: строка, answers: список «Answer» + возвращает строка + «Made» от («Reply to» от name и answers) + +тотальная функция «Listed» + принимает reply: «Отклик» + возвращает список строки + пример «A listed directory gives its names» + дано reply равно вариант «Перечислено» с имена равным ["a.c", "b.h"] + ожидается ["a.c", "b.h"] + пример «Anything else gives no names» + дано reply равно вариант «Пока ничего» + ожидается пустой список + разбор reply + случай вариант «Перечислено» с имена как names + то names + случай любое + то пустой список + +тотальная функция «Listed of» + принимает name: строка, answers: список «Answer» + возвращает список строки + «Listed» от («Reply to» от name и answers) diff --git a/scripts/ledgers/cyrillic-file-names-debt.txt b/scripts/ledgers/cyrillic-file-names-debt.txt index f36955f0c..7b6752a38 100644 --- a/scripts/ledgers/cyrillic-file-names-debt.txt +++ b/scripts/ledgers/cyrillic-file-names-debt.txt @@ -62,7 +62,6 @@ flang/test/обход-примеров.sh flang/test/обход.sh flang/test/прогонщик-корпуса.flang scripts/guards/сторож-дарвина.fscript -scripts/доказуемость.sh ярлык ярлыки.flang # ОБРАЗЕЦ РАСШИРЕНИЯ «.фп» (ADR-0046, задача 6421). Основа имени переведена; само diff --git a/scripts/ledgers/file-name-words.txt b/scripts/ledgers/file-name-words.txt index 8dabdae07..9b2a5cfd6 100644 --- a/scripts/ledgers/file-name-words.txt +++ b/scripts/ledgers/file-name-words.txt @@ -777,6 +777,7 @@ injective inline inner input +inquiry inside install installed diff --git a/scripts/ledgers/hand-written-lists-ledger.tsv b/scripts/ledgers/hand-written-lists-ledger.tsv index b6845bd5f..286ea3399 100644 --- a/scripts/ledgers/hand-written-lists-ledger.tsv +++ b/scripts/ledgers/hand-written-lists-ledger.tsv @@ -143,4 +143,3 @@ ПУТИ scripts/release/emit-package.flang 17 задача 8649 переехала в docs/tasks/completed; имя стоит в комментарии как ссылка на разбор, а не как живой файл ПУТИ scripts/guards/homebrew-formula-guard.fscript 484 содержимое сабмодуля packaging/homebrew-tap: в git ls-files лежит одно имя сабмодуля, а не Formula/flang.rb ПУТИ scripts/release/release-in-c.fscript 158 «куда» ПРИМЕРА — каталог, который складывает прогон выпуска (output/release-c/…); в дереве его нет по устройству -ПУТИ scripts/seed/two-prints-identical.sh 76 ложное срабатывание переписи: точка предложения приклеилась к имени (scripts/seed/print-progress.sh.), сам файл в дереве есть diff --git a/scripts/ledgers/link-guard-known-not-a-path.tsv b/scripts/ledgers/link-guard-known-not-a-path.tsv index b7dcf5511..ef3392063 100644 --- a/scripts/ledgers/link-guard-known-not-a-path.tsv +++ b/scripts/ledgers/link-guard-known-not-a-path.tsv @@ -266,10 +266,10 @@ docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md scr docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md scripts/guards/pol-dokazannogo-sverka.sh история: перепись оболочки снята 17 сентября 2026 на дереве cbfaf3899 («строки — wc -l на этом дереве»), имя того дня; 1428 переименовала файл в scripts/guards/proved-share-vs-tree.sh (a82dbad8d) docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md scripts/guards/storozha-bez-podloga.sh история: перепись оболочки снята 17 сентября 2026 на дереве cbfaf3899 («строки — wc -l на этом дереве»), имя того дня; 1428 переименовала файл в scripts/guards/guards-without-forgery-probe.sh (a82dbad8d) docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md scripts/repl-proba.sh история: перепись оболочки снята 17 сентября 2026 на дереве cbfaf3899 («строки — wc -l на этом дереве»), имя того дня; 1428 переименовала файл в scripts/repl-probe.sh (a82dbad8d) -docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md scripts/seed/chto-otstalo-ot-semeni.sh история: перепись оболочки снята 17 сентября 2026 на дереве cbfaf3899 («строки — wc -l на этом дереве»), имя того дня; 1428 переименовала файл в scripts/seed/what-lags-the-seed.sh (a82dbad8d) -docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md scripts/seed/pechat-povtorima.sh история: перепись оболочки снята 17 сентября 2026 на дереве cbfaf3899 («строки — wc -l на этом дереве»), имя того дня; 1428 переименовала файл в scripts/seed/print-is-repeatable.sh (a82dbad8d) +docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md scripts/seed/chto-otstalo-ot-semeni.sh история: перепись оболочки снята 17 сентября 2026 на дереве cbfaf3899 («строки — wc -l на этом дереве»), имя того дня; 1428 переименовала файл в scripts/seed/what-lags-the-seed.fscript (a82dbad8d) +docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md scripts/seed/pechat-povtorima.sh история: перепись оболочки снята 17 сентября 2026 на дереве cbfaf3899 («строки — wc -l на этом дереве»), имя того дня; 1428 переименовала файл в scripts/seed/print-is-repeatable.fscript (a82dbad8d) docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md scripts/seed/semya-osvezhit.sh история: перепись оболочки снята 17 сентября 2026 на дереве cbfaf3899 («строки — wc -l на этом дереве»), имя того дня; 1428 переименовала файл в scripts/seed/seed-refresh.sh (a82dbad8d) -docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md scripts/seed/semya-rantayma-eto-istochnik.sh история: перепись оболочки снята 17 сентября 2026 на дереве cbfaf3899 («строки — wc -l на этом дереве»), имя того дня; 1428 переименовала файл в scripts/seed/seed-runtime-is-source.sh (a82dbad8d) +docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md scripts/seed/semya-rantayma-eto-istochnik.sh история: перепись оболочки снята 17 сентября 2026 на дереве cbfaf3899 («строки — wc -l на этом дереве»), имя того дня; 1428 переименовала файл в scripts/seed/seed-runtime-is-source.fscript (a82dbad8d) docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md docs/site/podsvetka.mjs история: перепись оболочки снята 17 сентября 2026 на дереве cbfaf3899 («строки — wc -l на этом дереве»), имя того дня; 1428 переименовала файл в docs/site/highlighting.mjs (a82dbad8d) docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md docs/site/poisk-proverka.mjs история: перепись оболочки снята 17 сентября 2026 на дереве cbfaf3899 («строки — wc -l на этом дереве»), имя того дня; 1428 переименовала файл в docs/site/search-check.mjs (a82dbad8d) docs/tasks/5821-shell-scripts-that-can-become-flang-are-counted-and-moved.md docs/site/poisk.mjs история: перепись оболочки снята 17 сентября 2026 на дереве cbfaf3899 («строки — wc -l на этом дереве»), имя того дня; 1428 переименовала файл в docs/site/search.mjs (a82dbad8d) diff --git a/scripts/ledgers/proved-share-ledger.txt b/scripts/ledgers/proved-share-ledger.txt index 591bbb1c9..a7049be87 100644 --- a/scripts/ledgers/proved-share-ledger.txt +++ b/scripts/ledgers/proved-share-ledger.txt @@ -1671,3 +1671,5 @@ ecc5ed8448df3a3993a812d47148f231|2|2|0|0|0|docs/examples/guide/promise.flang 6bc07f762b1b76d0d42e1154769eb4c1|1|1|0|0|0|docs/examples/guide/lookup-table.flang e6bf33ae3ed941fbc45e17df841f5948|2|2|0|0|1|docs/examples/guide/precondition.flang 2e3cfb02fc4453a999bf41a5bde721e8|4|4|0|0|0|.githooks/pre-push.fscript +e17e5edd32f45d6e7ce814dcaa869e85|1|1|0|0|0|scripts/seed/what-lags-the-seed.fscript +8057f5d8cfae4775e50af322ca880304|2|2|0|0|0|scripts/reading.fscript diff --git a/scripts/ledgers/proved-share.json b/scripts/ledgers/proved-share.json index 3acb68c19..3c14767b8 100644 --- a/scripts/ledgers/proved-share.json +++ b/scripts/ledgers/proved-share.json @@ -46,7 +46,7 @@ "завышение сложением — перемерено на этих же файлах": "У 17 переснятых файлов приговоров СВОИХ 361, ввезённых 64: сложение строк «итог:» дало бы 425 вместо 361 — завышение в 1,2 раза. Это сторожа и мелкая оснастка, они ввозят мало; по всему дереву завышение измерено в 2,47 раза, а на flang/self/proof-kernel.flang — в 34,2 (замер 29 августа 2026). Направление подтверждено прогоном, величина взята из описи." }, "знаменатель чем считается": "Строки исходников, где обязательство объявлено, во всех *.flang дерева (git -c core.quotePath=false ls-files -z): «обеспечивает» 13484, «требует» 88, «закон» 9 — итого 13581 в 510 файлах. Кванторную форму «для всех н обеспечивает …» считать ОБЯЗАТЕЛЬНО: счёт по ПЕРВОМУ СЛОВУ строки её не видит и теряет 140 обязательств. Замерено 30 августа 2026 двумя независимыми прогонами: прежним правилом 13441, нынешним 13581 — разница ровно 140. Тем же правилом считает sh scripts/guards/published-vs-tree.sh --доля: правила сверки и описи обязаны совпадать, иначе знаменатели расходятся молча. Прежняя запись «13610» верна для 30 августа, ствол f9e67fa6; за день дерево дало 13581. Утверждение «git ls-files без -z теряет 451 файл из 1154» ОПРОВЕРГНУТО: ни одно место в дереве так не зовёт — везде core.quotePath=false (задача 5578).", - "чем ограничено": "Семя перепечатано 30 августа, но исходники ушли вперёд: sh scripts/seed/seed-freshness.sh отвечает отказом — разошлись flang/self/bootstrap/compiler.flang, emit-js.flang, io.flang, parser.flang и proof-initial.flang. Пока семя не перепечатано снова, приговоры про эти пять файлов описывают дерево, которого нет, и код 0 у раздела «--доля» недостижим никаким пушем.", + "чем ограничено": "Семя перепечатано 30 августа, но исходники ушли вперёд: bootstrap/flang io scripts/seed/seed-freshness.fscript --plan Check --timeout 300000 отвечает отказом — разошлись flang/self/bootstrap/compiler.flang, emit-js.flang, io.flang, parser.flang и proof-initial.flang. Пока семя не перепечатано снова, приговоры про эти пять файлов описывают дерево, которого нет, и код 0 у раздела «--доля» недостижим никаким пушем.", "97 без приговора: две кучи, и они разные": { "снято": "2026-08-30", "ствол": "5c0d35c9", diff --git a/scripts/ledgers/take-proof-ledger.sh b/scripts/ledgers/take-proof-ledger.sh index 435a6cc1f..f1ce29604 100755 --- a/scripts/ledgers/take-proof-ledger.sh +++ b/scripts/ledgers/take-proof-ledger.sh @@ -6,7 +6,7 @@ # рядом кладутся <имя>.json (ведомость), .err, .time (часы, пик памяти), .kod. # # Звать: sh scripts/ledgers/take-proof-ledger.sh flang/stdlib/aes.flang [каталог выходов] -# DVOICHNYY — двоичный (умолчание <дерево>-ledger-binary/flang от build-ledger-binary.sh); +# DVOICHNYY — двоичный (умолчание <дерево>-ledger-binary/flang от build-ledger-binary.fscript); # VYHOD — каталог выходов; PAMYAT (45G), PIK — ворота: адресное пространство и # ЗАМЕРЕННЫЙ пик; PREDEL_SHAGOV, PREDEL_GLUBINY — ключи --предел-…, по умолчанию # не ставятся и ЗАДАЮТ предел, а не поднимают его (сверяется со вшитым в шапке). @@ -24,7 +24,7 @@ test -f "$koren/$fajl" || test -f "$fajl" || { echo "нет файла $fajl" >& dvoichnyy=${DVOICHNYY:-$koren-ledger-binary/flang} test -x "$dvoichnyy" || { - echo "нет двоичного $dvoichnyy — соберите: sh scripts/seed/build-ledger-binary.sh" >&2 + echo "нет двоичного $dvoichnyy — соберите: bootstrap/flang io scripts/seed/build-ledger-binary.fscript --plan Build --timeout 900000 --" >&2 exit 2 } diff --git a/scripts/provability.fscript b/scripts/provability.fscript new file mode 100644 index 000000000..7cb4c750a --- /dev/null +++ b/scripts/provability.fscript @@ -0,0 +1,591 @@ +модуль «Provability» + использует «Rules» из "rules.fscript" + использует «Inquiry» из "inquiry.fscript" + использует «Reading» из "reading.fscript" + использует «Report provenance» из "report-provenance.fscript" + использует «Lists» только «Соединить списки» + +объект «Kind» + «title»: строка + «awaited»: строка + «source»: строка + «record»: строка + «goal»: строка + «trace»: строка + «sign»: строка + «code»: строка + +объект «Check» + «passed»: признак + «words»: строка + +тотальная функция «Root» + возвращает строка + ".." + +тотальная функция «Threshold» + возвращает число + 100 + +тотальная функция «Checker» + возвращает строка + "flang/proof/checker/сверщик" + +тотальная функция «Checker source» + возвращает строка + "flang/proof/checker/checker.c" + +тотальная функция «Forgery ratchet» + возвращает строка + "flang/proof/forgeries/ratchet.txt" + +тотальная функция «Table path» + принимает answers: список «Answer» + возвращает строка + «Setting of» от "table path" и "flang/proof/checker/tests/trap/kinds.tsv" и answers + +тотальная функция «Ratchet path» + принимает answers: список «Answer» + возвращает строка + «Setting of» от "ratchet path" и "flang/proof/checker/tests/trap/ratchet.txt" и answers + +тотальная функция «Is a row» + принимает line: строка + возвращает признак + пример «A comment is not a row» + дано line равно "# вид\tждём" + ожидается нет + пример «The heading is not a row» + дано line равно "вид\tждём\tисходник\tзапись\tцель\tслед\tпризнак\tкод\tпометка" + ожидается нет + пример «Nine cells make a row» + дано line равно "разбор\tснята\ta.flang\ta.record\tцель\tслед\t—\t0\tпометка" + ожидается да + пример «Eight cells do not» + дано line равно "разбор\tснята\ta.flang\ta.record\tцель\tслед\t—\t0" + ожидается нет + (не (line начинается с "#")) и притом (((длина (разделить line по "\t")) равен 9) и притом (не (line начинается с "вид\t"))) + +тотальная функция «Kind of» + принимает line: строка + возвращает «Kind» + пусть cells равно (разделить line по "\t") + если (длина cells) меньше 8 + то запись «Kind» с «title» равным "" и «awaited» равным "" и «source» равным "" и «record» равным "" и «goal» равным "" и «trace» равным "" и «sign» равным "" и «code» равным "" + иначе запись «Kind» с «title» равным (элемент 1 в cells) и «awaited» равным (элемент 2 в cells) и «source» равным (элемент 3 в cells) и «record» равным (элемент 4 в cells) и «goal» равным (элемент 5 в cells) и «trace» равным (элемент 6 в cells) и «sign» равным (элемент 7 в cells) и «code» равным (элемент 8 в cells) + +тотальная функция «Kinds» + принимает table: строка + возвращает список «Kind» + пример «Rows of the table become kinds, comments do not» + дано table равно "# таблица\nразбор\tснята\ta.flang\ta.record\tцель\tслед\t—\t0\tпометка\n" + ожидается [запись «Kind» с «title» равным "разбор" и «awaited» равным "снята" и «source» равным "a.flang" и «record» равным "a.record" и «goal» равным "цель" и «trace» равным "след" и «sign» равным "—" и «code» равным "0"] + отобразить (отфильтровать («Lines» от table) где line → «Is a row» от line) как line → «Kind of» от line + +тотальная функция «Known kinds» + принимает answers: список «Answer» + возвращает список «Kind» + «Kinds» от («Output of» от "table" и answers) + +тотальная функция «Record» + принимает kind: «Kind» + возвращает «Question» + «Read from» от (соединить ["record ", (kind.«record»)] по "") и («Root») и (kind.«record») + +тотальная функция «Setup» + возвращает список «Question» + [(«Run from» от "repository" и («Root») и "git" и ["rev-parse", "--git-dir"]), + («Run from» от "checker source" и («Root») и "test" и ["-f", («Checker source»)]), + («Environment» от "table path" и "FLANG_TRAP_TABLE"), + («Environment» от "ratchet path" и "FLANG_TRAP_RATCHET"), + («Environment» от "compiler" и "CC"), + («Run from» от "checker built" и («Root») и "test" и ["-x", («Checker»)])] + +тотальная функция «Tables» + принимает answers: список «Answer» + возвращает список «Question» + «Соединить списки» от [(«Read from» от "table" и («Root») и («Table path» от answers)), («Read from» от "trap ratchet" и («Root») и («Ratchet path» от answers))] и (если («Exit code of» от "checker built" и answers) равен 0 то пустой список иначе [(«Run from» от "checker build" и («Root») и («Setting of» от "compiler" и "cc" и answers) и ["-std=c99", "-Wall", "-Wextra", "-Werror", "-pedantic", "-O2", "-o", («Checker»), («Checker source»)])]) + +тотальная функция «Sources» + принимает answers: список «Answer» + возвращает список «Question» + пусть kinds равно («Known kinds» от answers) + приписать («Run from» от "trap sums" и («Root») и "sha256sum" и (отобразить kinds как kind → kind.«source»)) к (отобразить kinds как kind → «Record» от kind) + +тотальная функция «Replays» + принимает answers: список «Answer» + возвращает список «Question» + пусть sums равно («Output of» от "trap sums" и answers) + отобразить («Known kinds» от answers) как kind → «Run from» от (соединить ["replay ", (kind.«title»)] по "") и («Root») и («Checker») и [(kind.«source»), (kind.«record»), («Sum of» от (kind.«source») и sums)] + +тотальная функция «Suites» + возвращает список «Question» + «Соединить списки» от [(«Run from» от "share" и («Root») и "sh" и ["flang/proof/corpus-share.sh", "--проигрыванием"]), + («Run from» от "probes" и («Root») и "sh" и ["flang/proof/checker/tests/run.sh"]), + («Read from» от "forgery ratchet" и («Root») и («Forgery ratchet»))] и («Provenance questions» от («Root»)) + +тотальная функция «Stage» + принимает stages: число, answers: список «Answer» + возвращает список «Question» + если (stages меньше 0) или (stages больше 5) + то пустой список + иначе элемент (6 минус stages) в [(«Setup»), («Tables» от answers), («Sources» от answers), («Replays» от answers), («Suites»), («Lean question» от answers)] + +тотальная функция «Said» + принимает kind: «Kind», answers: список «Answer» + возвращает строка + пусть name равно (соединить ["replay ", (kind.«title»)] по "") + соединить [(«Output of» от name и answers), («Errors of» от name и answers)] по "\n" + +тотальная функция «Sign is readable» + принимает sign: строка + возвращает признак + пример «A digit class is the only pattern that is read» + дано sign равно "сведений проиграно заново [1-9]" + ожидается да + пример «Any other pattern sign is not read» + дано sign равно "сведений проиграно заново [0-9]+" + ожидается нет + пусть plain равно (соединить (разделить sign по "[1-9]") по "") + (длина (отфильтровать ["[", "]", "(", ")", "*", "+", "?", "|", "^", "$", "\\", ".", "{", "}"] где symbol → plain содержит symbol)) равен 0 + +тотальная функция «Sign found» + принимает sign: строка, said: строка + возвращает признак + пример «A digit from one to nine stands for the class» + дано sign равно "сведений проиграно заново [1-9]" + дано said равно "сводка: сведений проиграно заново 4, прочего 0" + ожидается да + пример «Zero does not stand for the class» + дано sign равно "сведений проиграно заново [1-9]" + дано said равно "сводка: сведений проиграно заново 0" + ожидается нет + пусть parts равно (разделить sign по "[1-9]") + (длина (отфильтровать ["1", "2", "3", "4", "5", "6", "7", "8", "9"] где digit → said содержит (соединить parts по digit))) больше 0 + +тотальная функция «Kept trouble» + принимает kind: «Kind», said: строка + возвращает список строки + если said содержит (соединить ["утверждение «", (kind.«goal»), "»: вердикт «доказано», а за узел не взялся"] по "") + то пустой список + иначе [(соединить ["цель «", (kind.«goal»), "» снята со слова ядра — вычислением"] по "")] + +тотальная функция «Removed troubles» + принимает kind: «Kind», said: строка, code: число, written: строка + возвращает список строки + пример «A replayed kind has no troubles» + дано kind равно запись «Kind» с «title» равным "разбор" и «awaited» равным "снята" и «source» равным "a.flang" и «record» равным "a.record" и «goal» равным "цель" и «trace» равным "след" и «sign» равным "проиграно заново [1-9]" и «code» равным "0" + дано said равно "проиграно заново 2" + дано code равно 0 + дано written равно "шаг: след" + ожидается пустой список + пример «Every trouble is named» + дано kind равно запись «Kind» с «title» равным "разбор" и «awaited» равным "снята" и «source» равным "a.flang" и «record» равным "a.record" и «goal» равным "цель" и «trace» равным "след" и «sign» равным "проиграно заново [1-9]" и «code» равным "0" + дано said равно "утверждение «цель»: не взялся" + дано code равно 3 + дано written равно "шаг" + ожидается ["код 3, ждали 0", "цель «цель» названа чекером — не переиграна", "в записи нет следа «след» — цель больше не этого вида", "в сводке чекера нет признака «проиграно заново [1-9]»"] + «Gathered words» от [(если (к строке code) равен (kind.«code») то пустой список иначе [(соединить ["код ", (к строке code), ", ждали ", (kind.«code»)] по "")]), + (если said содержит (соединить ["«", (kind.«goal»), "»"] по "") то [(соединить ["цель «", (kind.«goal»), "» названа чекером — не переиграна"] по "")] иначе пустой список), + (если written содержит (kind.«trace») то пустой список иначе [(соединить ["в записи нет следа «", (kind.«trace»), "» — цель больше не этого вида"] по "")]), + (если ((kind.«sign») равен "—") или («Sign found» от (kind.«sign») и said) то пустой список иначе [(соединить ["в сводке чекера нет признака «", (kind.«sign»), "»"] по "")])] + +тотальная функция «Troubles» + принимает kind: «Kind», answers: список «Answer» + возвращает список строки + если (kind.«awaited») равен "на слове" + то «Kept trouble» от kind и («Said» от kind и answers) + иначе «Removed troubles» от kind и («Said» от kind и answers) и («Exit code of» от (соединить ["replay ", (kind.«title»)] по "") и answers) и («Output of» от (соединить ["record ", (kind.«record»)] по "") и answers) + +тотальная функция «Named trouble» + принимает kind: «Kind», answers: список «Answer» + возвращает список строки + разбор («Troubles» от kind и answers) + случай пусто + то пустой список + случай голова и хвост + то [(соединить ["вид «", (kind.«title»), "»: ", (соединить (приписать голова к хвост) по "; ")] по "")] + +тотальная функция «Awaited» + принимает word: строка, kinds: список «Kind» + возвращает список «Kind» + отфильтровать kinds где kind → (kind.«awaited») равен word + +тотальная функция «Troubled» + принимает kinds: список «Kind», answers: список «Answer» + возвращает список строки + «Gathered words» от (отобразить kinds как kind → «Named trouble» от kind и answers) + +тотальная функция «Trap ratchet» + принимает prefix: строка, position: число, answers: список «Answer» + возвращает строка + «Word» от position и («Beginning with» от prefix и («Lines» от («Output of» от "trap ratchet" и answers))) + +тотальная функция «Trap words» + принимает kept: число, computed: число, removed: число, red: число, troubles: строка, table: строка, kinds: число, words: число + возвращает «Check» + пример «A whole trap passes» + дано kept равно 3 + дано computed равно 0 + дано removed равно 39 + дано red равно 0 + дано troubles равно "" + дано table равно "kinds.tsv" + дано kinds равно 38 + дано words равно 3 + ожидается запись «Check» с «passed» равным да и «words» равным "ловушка: ∀-целей на слове ядра 3 из 3, видов обязательства переиграно 39 из 39 (храповик 38/3)" + пример «A goal taken by computing fails the trap» + дано kept равно 3 + дано computed равно 1 + дано removed равно 39 + дано red равно 0 + дано troubles равно "вид «а»: цель «б» снята со слова ядра — вычислением" + дано table равно "kinds.tsv" + дано kinds равно 38 + дано words равно 3 + ожидается запись «Check» с «passed» равным нет и «words» равным "∀-целей, снятых со слова ядра вычислением: 1 из 3 — вид «а»: цель «б» снята со слова ядра — вычислением; таблица kinds.tsv" + пример «A thinner table fails the trap» + дано kept равно 3 + дано computed равно 0 + дано removed равно 37 + дано red равно 0 + дано troubles равно "" + дано table равно "kinds.tsv" + дано kinds равно 38 + дано words равно 3 + ожидается запись «Check» с «passed» равным нет и «words» равным "ловушка ослабла: видов 37 при храповике 38, ∀-целей 3 при храповике 3 — строка таблицы убрана, а храповик при ней нет" + «Chosen» от [(«When» от (computed больше 0) и (запись «Check» с «passed» равным нет и «words» равным (соединить ["∀-целей, снятых со слова ядра вычислением: ", (к строке computed), " из ", (к строке kept), " — ", troubles, "; таблица ", table] по ""))), + («When» от (red больше 0) и (запись «Check» с «passed» равным нет и «words» равным (соединить ["обратная половина ловушки красна: видов не переиграно ", (к строке red), " из ", (к строке removed), " — прибор мерит сломанный чекер, а не снятый калькулятор — ", troubles] по ""))), + («When» от ((removed меньше kinds) или (kept меньше words)) и (запись «Check» с «passed» равным нет и «words» равным (соединить ["ловушка ослабла: видов ", (к строке removed), " при храповике ", (к строке kinds), ", ∀-целей ", (к строке kept), " при храповике ", (к строке words), " — строка таблицы убрана, а храповик при ней нет"] по "")))] и (запись «Check» с «passed» равным да и «words» равным (соединить ["ловушка: ∀-целей на слове ядра ", (к строке kept), " из ", (к строке kept), ", видов обязательства переиграно ", (к строке removed), " из ", (к строке removed), " (храповик ", (к строке kinds), "/", (к строке words), ")"] по "")) + +тотальная функция «Trap check» + принимает answers: список «Answer» + возвращает «Check» + пусть kinds равно («Known kinds» от answers) + пусть kept равно («Awaited» от "на слове" и kinds) + пусть removed равно («Awaited» от "снята" и kinds) + «Trap words» от (длина kept) и (длина («Troubled» от kept и answers)) и (длина removed) и (длина («Troubled» от removed и answers)) и (соединить («Troubled» от kinds и answers) по "; ") и («Table path» от answers) и («Count» от («Trap ratchet» от "видов " и 2 и answers)) и («Count» от («Trap ratchet» от "на слове " и 3 и answers)) + +тотальная функция «Said by» + принимает name: строка, answers: список «Answer» + возвращает список строки + «Соединить списки» от («Lines» от («Output of» от name и answers)) и («Lines» от («Errors of» от name и answers)) + +тотальная функция «Share line» + принимает answers: список «Answer» + возвращает строка + «Beginning with» от "доля-проигрыванием = " и («Said by» от "share" и answers) + +тотальная функция «Share» + принимает line: строка + возвращает строка + пример «The share stands seventh and is followed by the percent sign» + дано line равно "доля-проигрыванием = 650 / 650 = 100.00 % (порог 95)" + ожидается "100.00" + пример «A line of another shape gives no share» + дано line равно "доля-проигрыванием = много" + ожидается "" + если ((«Digits» от («Word» от 3 и line)) и притом («Digits» от («Word» от 5 и line))) и притом ((«Word» от 8 и line) равен "%") + то «Word» от 7 и line + иначе "" + +тотальная функция «Share trouble» + принимает answers: список «Answer» + возвращает строка + пусть named равно (отфильтровать («Said by» от "share" и answers) где line → (line содержит "РАСХОЖДЕНИЕ") или ((line содержит "не смог") или (line содержит "нет ни одной записи"))) + разбор named + случай пусто + то соединить ["линейка вышла кодом ", (к строке («Exit code of» от "share" и answers)), " и числа не дала"] по "" + случай голова и хвост + то голова + +тотальная функция «Share is measured» + принимает answers: список «Answer» + возвращает признак + ((«Exit code of» от "share" и answers) равен 0) и притом (не (пусто («Share» от («Share line» от answers)))) + +тотальная функция «Unreachable» + принимает answers: список «Answer» + возвращает строка + «Leading digits» от («Word» от 3 и («Beginning with» от "исключено мест " и («Said by» от "share" и answers))) + +тотальная функция «Manifest» + принимает answers: список «Answer» + возвращает строка + пусть line равно («Beginning with» от "поймано " и («Said by» от "share" и answers)) + если («Digits» от («Word» от 2 и line)) и притом ((«Word» от 3 и line) равен "из") + то «Leading digits» от («Word» от 4 и line) + иначе "" + +тотальная функция «Numerator» + принимает answers: список «Answer» + возвращает строка + «Number after» от "числитель набора " и («Holding» от "числитель набора " и («Said by» от "share" и answers)) + +тотальная функция «Counted» + принимает label: строка, lines: список строки + возвращает строка + пример «The count stands after the label and before the colon» + дано label равно "подделок" + дано lines равно [" честных 250: принято 250", " подделок 543: отвергнуто 457"] + ожидается "543" + пример «A label without a count gives nothing» + дано label равно "подделок" + дано lines равно ["подделок нет"] + ожидается "" + «First line» от (соединить (отобразить (отфильтровать lines где line → ((«Word» от 1 и line) равен label) и притом ((«Word» от 2 и line) равен (соединить [(«Leading digits» от («Word» от 2 и line)), ":"] по ""))) как line → «Leading digits» от («Word» от 2 и line)) по "\n") + +тотальная функция «Forgeries» + принимает answers: список «Answer» + возвращает строка + «Counted» от "подделок" и («Said by» от "probes" и answers) + +тотальная функция «Rejected» + принимает answers: список «Answer» + возвращает строка + «Number after» от "отвергнуто " и («Holding» от "(обязано быть 0)" и (отфильтровать («Said by» от "probes" и answers) где line → line содержит "честных")) + +тотальная функция «Caught» + принимает answers: список «Answer» + возвращает строка + «Leading digits» от («Word» от 4 и («Beginning with» от "набор подделок: поймано " и (отобразить («Said by» от "probes" и answers) как line → соединить («Words» от line) по " "))) + +тотальная функция «Share check» + принимает answers: список «Answer» + возвращает «Check» + пусть line равно («Share line» от answers) + запись «Check» с «passed» равным ((к числу («Share» от line)) не меньше («Threshold»)) и «words» равным (соединить [(«Share» от line), " %: ", («Word» от 3 и line), " из ", («Word» от 5 и line), "; недостижимых мест вынесено ", (к строке («Count» от («Unreachable» от answers)))] по "") + +тотальная функция «Probes check» + принимает answers: список «Answer» + возвращает «Check» + пусть said равно («Said by» от "probes" и answers) + запись «Check» с «passed» равным ((«Exit code of» от "probes" и answers) равен 0) и «words» равным (соединить ["набор подделок ", («Or unknown» от («Caught» от answers)), " из ", («Or unknown» от («Manifest» от answers)), "; проб на подлог ", («Or unknown» от («Forgeries» от answers)), ", принято кодом 0 — ", («Or unknown» от («Number after» от "ПРИНЯТО кодом 0 — " и («Holding» от "ПРИНЯТО кодом 0 — " и said))), "; честных ", («Or unknown» от («Counted» от "честных" и said)), ", отвергнуто ", («Or unknown» от («Rejected» от answers))] по "") + +тотальная функция «Ratchet number» + принимает prefix: строка, position: число, answers: список «Answer» + возвращает строка + «Word» от position и («Beginning with» от prefix и («Lines» от («Output of» от "forgery ratchet" и answers))) + +тотальная функция «Weakening» + принимает measured: число, kept: число, words: список строки + возвращает список строки + пример «A number below the ratchet is a weakening» + дано measured равно 35 + дано kept равно 36 + дано words равно ["подделок в манифесте ", " при храповике ", " — набор ослаб на ", ""] + ожидается ["подделок в манифесте 35 при храповике 36 — набор ослаб на 1"] + пример «A number at the ratchet is not» + дано measured равно 36 + дано kept равно 36 + дано words равно ["подделок в манифесте ", " при храповике ", " — набор ослаб на ", ""] + ожидается пустой список + если (measured не меньше kept) или ((длина words) меньше 4) + то пустой список + иначе [(соединить [(элемент 1 в words), (к строке measured), (элемент 2 в words), (к строке kept), (элемент 3 в words), (к строке (kept минус measured)), (элемент 4 в words)] по "")] + +тотальная функция «Weakenings» + принимает answers: список «Answer» + возвращает список строки + пусть kept равно («Count» от («Ratchet number» от "проб на подлог " и 4 и answers)) + «Gathered words» от [(«Weakening» от («Count» от («Manifest» от answers)) и («Count» от («Ratchet number» от "подделок " и 2 и answers)) и ["подделок в манифесте ", " при храповике ", " — набор ослаб на ", ""]), + («Weakening» от («Count» от («Numerator» от answers)) и («Count» от («Ratchet number» от "числитель " и 2 и answers)) и ["числитель набора ", " при храповике ", " — просело на ", " мест"]), + (если пусто («Forgeries» от answers) то [(соединить ["проб на подлог НЕ ИЗМЕРЕНО: прогон не дал итога (храповик ", (к строке kept), ") — сравнивать не с чем"] по "")] иначе («Weakening» от («Count» от («Forgeries» от answers)) и kept и ["проб на подлог в прогоне ", " при храповике ", " — выпало ", " (подделка не собралась или проба убрана)"]))] + +тотальная функция «Ratchet is whole» + принимает answers: список «Answer» + возвращает признак + ((«Digits» от («Ratchet number» от "подделок " и 2 и answers)) и притом («Digits» от («Ratchet number» от "числитель " и 2 и answers))) и притом («Digits» от («Ratchet number» от "проб на подлог " и 4 и answers)) + +тотальная функция «Ratchet check» + принимает answers: список «Answer» + возвращает «Check» + «Chosen» от [(«When» от (не ((«Exit code of» от "forgery ratchet" и answers) равен 0)) и (запись «Check» с «passed» равным нет и «words» равным (соединить ["храповика нет — ", («Forgery ratchet»), " потерян"] по ""))), + («When» от (не («Ratchet is whole» от answers)) и (запись «Check» с «passed» равным нет и «words» равным "храповик не называет всех трёх чисел (подделок, числитель, проб на подлог)")), + («When» от ((длина («Weakenings» от answers)) больше 0) и (запись «Check» с «passed» равным нет и «words» равным (соединить («Weakenings» от answers) по "; ")))] и (запись «Check» с «passed» равным да и «words» равным (соединить ["в манифесте ", («Or unknown» от («Manifest» от answers)), " при храповике ", («Ratchet number» от "подделок " и 2 и answers), "; числитель ", («Or unknown» от («Numerator» от answers)), " при храповике ", («Ratchet number» от "числитель " и 2 и answers), "; проб на подлог ", («Forgeries» от answers), " при храповике ", («Ratchet number» от "проб на подлог " и 4 и answers)] по "")) + +тотальная функция «Yes or no» + принимает check: «Check» + возвращает строка + если check.«passed» то "ДА" иначе "НЕТ" + +тотальная функция «Answer line» + принимает question: строка, check: «Check» + возвращает строка + пример «A check answers its question in one line» + дано question равно "проверка 4 — набор не ослаб?" + дано check равно запись «Check» с «passed» равным нет и «words» равным "храповика нет" + ожидается "проверка 4 — набор не ослаб? НЕТ (храповика нет)" + соединить [question, " ", («Yes or no» от check), " (", (check.«words»), ")"] по "" + +тотальная функция «Not measured words» + принимает answers: список «Answer» + возвращает строка + если пусто («Forgeries» от answers) + то соединить ["набор проб кончился кодом ", (к строке («Exit code of» от "probes" и answers)), ", не напечатав итога («подделок N:») — мерить нечем"] по "" + иначе «Share trouble» от answers + +тотальная функция «Is measured» + принимает answers: список «Answer» + возвращает признак + («Share is measured» от answers) и притом (не (пусто («Forgeries» от answers))) + +тотальная функция «Share answer» + принимает answers: список «Answer» + возвращает строка + если «Is measured» от answers + то «Answer line» от "проверка 2 — доля проигрыванием не ниже 100 %?" и («Share check» от answers) + иначе соединить ["проверка 2 — доля проигрыванием не ниже 100 %? НЕ ИЗМЕРЕНА (", («Not measured words» от answers), ")"] по "" + +тотальная функция «Probes answer» + принимает answers: список «Answer» + возвращает строка + если пусто («Forgeries» от answers) + то соединить ["проверка 3 — набор проб пройден? НЕ ИЗМЕРЕНА (прогон кончился кодом ", (к строке («Exit code of» от "probes" и answers)), ", не напечатав итога «подделок N:»)"] по "" + иначе «Answer line» от "проверка 3 — набор проб пройден?" и («Probes check» от answers) + +тотальная функция «Is a failure line» + принимает line: строка + возвращает признак + (длина (отфильтровать ["ПРОВАЛ", "ПОДДЕЛКА НЕ СОБРАЛАСЬ", "ПОРЧА НЕ СОБРАЛАСЬ", "ДЫРА ИЗМЕНИЛАСЬ"] где prefix → line начинается с prefix)) больше 0 + +тотальная функция «Probe failures» + принимает answers: список «Answer» + возвращает список строки + если ((«Probes check» от answers).«passed») и притом (не (пусто («Forgeries» от answers))) + то пустой список + иначе приписать "" к (приписать "чем провалился набор проб (проверка 3) — строками прогона:" к (отобразить (отфильтровать («Said by» от "probes" и answers) где line → «Is a failure line» от line) как line → соединить [" ", line] по "")) + +тотальная функция «Is provable» + принимает answers: список «Answer» + возвращает признак + ((((«Trap check» от answers).«passed») и притом ((«Share check» от answers).«passed»)) и притом ((«Probes check» от answers).«passed»)) и притом ((«Ratchet check» от answers).«passed») + +тотальная функция «Verdict word» + принимает answers: список «Answer» + возвращает строка + «Chosen» от [(«When» от (не («Is measured» от answers)) и "НЕ СМОГ ИЗМЕРИТЬ"), + («When» от («Is provable» от answers) и "ДОКАЗУЕМ")] и "НЕ ДОКАЗУЕМ" + +тотальная функция «Failed» + принимает name: строка, answers: список «Answer» + возвращает признак + не ((«Exit code of» от name и answers) равен 0) + +тотальная функция «Repository obstacle» + принимает answers: список «Answer» + возвращает список строки + «Chosen» от [(«When» от (не («Failed» от "repository" и answers)) и (пустой список)), + («When» от ((«Exit code of» от "repository" и answers) равен 127) и (["git не найден"]))] и (["дерево не под учётом git"]) + +тотальная функция «Missing» + принимает name: строка, words: строка, answers: список «Answer» + возвращает список строки + если «Failed» от name и answers то [words] иначе пустой список + +тотальная функция «No pair» + принимает kind: «Kind» + возвращает строка + соединить ["у вида «", (kind.«title»), "» нет пары ", (kind.«source»), " / ", (kind.«record»)] по "" + +тотальная функция «Reading obstacle» + принимает kind: «Kind» + возвращает список строки + пример «A third word in the awaited cell is not read» + дано kind равно запись «Kind» с «title» равным "разбор" и «awaited» равным "может быть" и «source» равным "a.flang" и «record» равным "a.record" и «goal» равным "цель" и «trace» равным "след" и «sign» равным "—" и «code» равным "0" + ожидается ["в таблице ловушки неизвестное «ждём» — «может быть» (вид «разбор»)"] + пример «A pattern beyond the digit class is not read» + дано kind равно запись «Kind» с «title» равным "разбор" и «awaited» равным "снята" и «source» равным "a.flang" и «record» равным "a.record" и «goal» равным "цель" и «trace» равным "след" и «sign» равным "заново [0-9]+" и «code» равным "0" + ожидается ["в таблице ловушки признак «заново [0-9]+» — образец, которого план не читает (вид «разбор»)"] + «Chosen» от [(«When» от (не (((kind.«awaited») равен "на слове") или ((kind.«awaited») равен "снята"))) и ([(соединить ["в таблице ловушки неизвестное «ждём» — «", (kind.«awaited»), "» (вид «", (kind.«title»), "»)"] по "")])), + («When» от («Sign is readable» от (kind.«sign»)) и (пустой список))] и ([(соединить ["в таблице ловушки признак «", (kind.«sign»), "» — образец, которого план не читает (вид «", (kind.«title»), "»)"] по "")]) + +тотальная функция «Table obstacles» + принимает answers: список «Answer» + возвращает список строки + если «Failed» от "table" и answers + то [(соединить ["нет таблицы ловушки ", («Table path» от answers)] по "")] + иначе «Gathered words» от (отобразить («Known kinds» от answers) как kind → «Reading obstacle» от kind) + +тотальная функция «Trap ratchet obstacles» + принимает answers: список «Answer» + возвращает список строки + «Chosen» от [(«When» от («Failed» от "trap ratchet" и answers) и ([(соединить ["нет храповика ловушки ", («Ratchet path» от answers)] по "")])), + («When» от ((«Digits» от («Trap ratchet» от "видов " и 2 и answers)) и притом («Digits» от («Trap ratchet» от "на слове " и 3 и answers))) и (пустой список))] и ([(соединить ["храповик ловушки ", («Ratchet path» от answers), " не называет обоих чисел"] по "")]) + +тотальная функция «Sums obstacles» + принимает answers: список «Answer» + возвращает список строки + пусть sums равно («Output of» от "trap sums" и answers) + отобразить (отфильтровать («Known kinds» от answers) где kind → пусто («Sum of» от (kind.«source») и sums)) как kind → «No pair» от kind + +тотальная функция «Record obstacles» + принимает asked: строка, answers: список «Answer» + возвращает список строки + если «Failed» от asked и answers + то отобразить (отфильтровать («Known kinds» от answers) где kind → (соединить ["record ", (kind.«record»)] по "") равен asked) как kind → «No pair» от kind + иначе пустой список + +тотальная функция «Probes obstacles» + принимает answers: список «Answer» + возвращает список строки + если («Exit code of» от "probes" и answers) больше 1 + то [(соединить (приписать (соединить ["набор проб не запустился (код ", (к строке («Exit code of» от "probes" и answers)), ")"] по "") к («Said by» от "probes" и answers)) по "\n")] + иначе пустой список + +тотальная функция «Obstacles» + принимает asked: строка, answers: список «Answer» + возвращает список строки + «Gathered words» от [(если asked равен "repository" то («Repository obstacle» от answers) иначе пустой список), + (если asked равен "checker source" то («Missing» от asked и (соединить ["нет ", («Checker source»)] по "") и answers) иначе пустой список), + (если asked равен "table" то («Table obstacles» от answers) иначе пустой список), + (если asked равен "trap ratchet" то («Trap ratchet obstacles» от answers) иначе пустой список), + (если asked равен "checker build" то («Missing» от asked и "чекер не собрался" и answers) иначе пустой список), + (если asked равен "trap sums" то («Sums obstacles» от answers) иначе пустой список), + (если asked начинается с "record " то («Record obstacles» от asked и answers) иначе пустой список), + (если asked равен "probes" то («Probes obstacles» от answers) иначе пустой список)] + +тотальная функция «Verdict text» + принимает answers: список «Answer» + возвращает строка + соединить («Соединить списки» от [(«Provenance» от answers), "", («Verdict word» от answers), "", + («Answer line» от "проверка 1 — калькулятор снят?" и («Trap check» от answers)), + («Share answer» от answers), + («Probes answer» от answers), + («Answer line» от "проверка 4 — набор не ослаб?" и («Ratchet check» от answers))] и («Probe failures» от answers)) по "\n" + +тотальная функция «Verdict» + принимает answers: список «Answer» + возвращает «Продолжение» + «Chosen» от [(«When» от (не («Is measured» от answers)) и (вариант «Не проверено» с код равным "FLANG_PROVABILITY_NOT_MEASURED" и сообщение равным («Verdict text» от answers))), + («When» от («Is provable» от answers) и (вариант «Конец работы» с значение равным («Verdict text» от answers)))] и (вариант «Провал» с код равным "FLANG_NOT_PROVABLE" и сообщение равным («Verdict text» от answers)) + +тотальная функция «Proceed» + принимает queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + разбор queue + случай голова и хвост + то «Ask» от (голова) и (хвост) и stages и answers + случай пусто + то если stages не больше 0 + то «Verdict» от answers + иначе «Proceed» от («Stage» от (stages минус 1) и answers) и (stages минус 1) и answers + +тотальная функция «Begin» + возвращает «Inquiry» + «Begin with» от 6 + +тотальная функция «Next» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает «Продолжение» + пусть answers равно («Heard» от inquiry и reply) + разбор («Obstacles» от (inquiry.«asked») и answers) + случай голова и хвост + то вариант «Не проверено» с код равным "FLANG_PROVABILITY_NOT_MEASURED" и сообщение равным (соединить ["не смог измерить: ", голова] по "") + случай пусто + то «Proceed» от (inquiry.«queue») и (inquiry.«stages») и answers + +план «Verdict» + состояние «Inquiry» + начинает с «Begin» + обрабатывает «Next» diff --git a/scripts/reading.fscript b/scripts/reading.fscript new file mode 100644 index 000000000..c4a27e09c --- /dev/null +++ b/scripts/reading.fscript @@ -0,0 +1,198 @@ +модуль «Reading» + использует «Rules» из "rules.fscript" + использует «Lists» только «Соединить списки» + +тотальная функция «Lines» + принимает text: строка + возвращает список строки + обеспечивает «dropping empty lines does not add lines» (длина результат) не больше (длина (разделить text по "\n")) + пример «Empty lines are dropped» + дано text равно "one\n\ntwo\n" + ожидается ["one", "two"] + отфильтровать (разделить text по "\n") где line → не (пусто line) + +тотальная функция «First line» + принимает text: строка + возвращает строка + пример «The first of two lines» + дано text равно "one\ntwo\n" + ожидается "one" + пример «No lines at all» + дано text равно "" + ожидается "" + разбор («Lines» от text) + случай пусто + то "" + случай голова и хвост + то голова + +тотальная функция «After» + принимает prefix: строка, line: строка + возвращает строка + пример «The rest of the line after its prefix» + дано prefix равно "коммит " + дано line равно "коммит 970deed9" + ожидается "970deed9" + пример «A line with another beginning gives nothing» + дано prefix равно "коммит " + дано line равно "вход flang/self" + ожидается "" + если line начинается с prefix + то подстрока line с ((длина prefix) плюс 1) по (длина line) + иначе "" + +тотальная функция «Value after» + принимает prefix: строка, text: строка + возвращает строка + пример «The first line with the prefix gives the value» + дано prefix равно "вход " + дано text равно "коммит 970deed9\nвход flang/self\nвход other\n" + ожидается "flang/self" + пример «No such line gives nothing» + дано prefix равно "вход " + дано text равно "коммит 970deed9\n" + ожидается "" + «First line» от (соединить (отобразить (отфильтровать («Lines» от text) где line → line начинается с prefix) как line → «After» от prefix и line) по "\n") + +тотальная функция «Words» + принимает line: строка + возвращает список строки + обеспечивает «dropping empty words does not add words» (длина результат) не больше (длина (разделить line по " ")) + пример «Runs of spaces separate words once» + дано line равно "aa11 seed-fingerprint" + ожидается ["aa11", "seed-fingerprint"] + отфильтровать (разделить line по " ") где word → не (пусто word) + +тотальная функция «Word» + принимает position: число, line: строка + возвращает строка + пример «The second word of three» + дано position равно 2 + дано line равно "one two three" + ожидается "two" + пример «A position past the end gives nothing» + дано position равно 4 + дано line равно "one two three" + ожидается "" + пример «A position before the beginning gives nothing» + дано position равно 0 + дано line равно "one two three" + ожидается "" + если (position меньше 1) или (position больше (длина («Words» от line))) + то "" + иначе элемент position в («Words» от line) + +тотальная функция «Without blanks» + принимает text: строка + возвращает строка + пример «Spaces, tabs and line ends are removed» + дано text равно " 8285\t16 \r\n" + ожидается "828516" + свёртка [" ", "\t", "\r", "\n"] начиная с text как kept и blank → соединить (разделить kept по blank) по "" + +тотальная функция «Ends with» + принимает text: строка, ending: строка + возвращает признак + пример «The ending is there» + дано text равно "aa11 seed-fingerprint" + дано ending равно " seed-fingerprint" + ожидается да + пример «The ending is longer than the text» + дано text равно "int" + дано ending равно "fingerprint" + ожидается нет + если (длина ending) больше (длина text) + то нет + иначе (подстрока text с (((длина text) минус (длина ending)) плюс 1) по (длина text)) равен ending + +тотальная функция «Leading digits» + принимает text: строка + возвращает строка + пример «Digits are taken up to the first other sign» + дано text равно "543: отвергнуто" + ожидается "543" + пример «A text that begins with a letter has none» + дано text равно "a12" + ожидается "" + «First line» от (соединить (разделить (свёртка (разложить text на символы) начиная с "" как taken и sign → «Chosen» от [(«When» от (taken содержит "\n") и taken), («When» от ("0123456789" содержит sign) и (соединить [taken, sign] по ""))] и (соединить [taken, "\n"] по "")) по "\n") по "\n") + +тотальная функция «Digits» + принимает text: строка + возвращает признак + пример «A number is made of digits» + дано text равно "650" + ожидается да + пример «An empty text is not a number» + дано text равно "" + ожидается нет + пример «A number with a tail is not a number» + дано text равно "650:" + ожидается нет + (не (пусто text)) и притом ((«Leading digits» от text) равен text) + +тотальная функция «Number after» + принимает mark: строка, line: строка + возвращает строка + пример «The number stands right after the mark» + дано mark равно "ПРИНЯТО кодом 0 — " + дано line равно "подделок 543: ПРИНЯТО кодом 0 — 0 (обязано быть 0)" + ожидается "0" + пример «A line without the mark has no number» + дано mark равно "ПРИНЯТО кодом 0 — " + дано line равно "честных 250" + ожидается "" + если line содержит mark + то «Leading digits» от (свёртка (разделить line по mark) начиная с "" как last и part → part) + иначе "" + +тотальная функция «Beginning with» + принимает prefix: строка, lines: список строки + возвращает строка + пример «The first of the lines with the prefix» + дано prefix равно "видов " + дано lines равно ["# видов 1", "видов 38", "видов 39"] + ожидается "видов 38" + пример «No line has the prefix» + дано prefix равно "видов " + дано lines равно ["на слове 3"] + ожидается "" + «First line» от (соединить (отфильтровать lines где line → line начинается с prefix) по "\n") + +тотальная функция «Holding» + принимает mark: строка, lines: список строки + возвращает строка + пример «The first of the lines with the mark inside» + дано mark равно "числитель набора " + дано lines равно ["поймано 36 из 36", " честные половины: числитель набора 187 (храповик 155)"] + ожидается " честные половины: числитель набора 187 (храповик 155)" + «First line» от (соединить (отфильтровать lines где line → line содержит mark) по "\n") + +тотальная функция «Count» + принимает text: строка + возвращает число + пример «Digits become a number» + дано text равно "543" + ожидается 543 + пример «Anything else counts as nothing» + дано text равно "?" + ожидается 0 + если «Digits» от text то к числу text иначе 0 + +тотальная функция «Or unknown» + принимает text: строка + возвращает строка + пример «An empty number is shown as unknown» + дано text равно "" + ожидается "?" + пример «A number is shown as it is» + дано text равно "36" + ожидается "36" + если пусто text то "?" иначе text + +тотальная функция «Gathered words» + принимает parts: список список строки + возвращает список строки + пример «Parts follow one another in their order» + дано parts равно [["one"], пустой список, ["two", "three"]] + ожидается ["one", "two", "three"] + свёртка parts начиная с (пустой список) как gathered и part → «Соединить списки» от gathered и part diff --git a/scripts/report-provenance.fscript b/scripts/report-provenance.fscript new file mode 100644 index 000000000..dfe537490 --- /dev/null +++ b/scripts/report-provenance.fscript @@ -0,0 +1,201 @@ +модуль «Report provenance» + использует «Rules» из "rules.fscript" + использует «Inquiry» из "inquiry.fscript" + использует «Reading» из "reading.fscript" + +тотальная функция «Summed files» + возвращает список строки + ["scripts/seed-fingerprint", "bootstrap/flang", "flang/proof/checker/checker.c", "flang/proof/tables/inference-rules.tsv"] + +тотальная функция «Build inputs command» + возвращает строка + "cd bootstrap && /bin/ls *.c *.h Makefile | LC_ALL=C sort | xargs cat | sha256sum" + +тотальная функция «Provenance questions» + принимает root: строка + возвращает список «Question» + [(«Run» от "day" и "date" и ["+%F"]), + («Run from» от "head" и root и "git" и ["rev-parse", "HEAD"]), + («Run from» от "changes" и root и "git" и ["status", "--porcelain"]), + («Read from» от "fingerprint" и root и "scripts/seed-fingerprint"), + («Run from» от "sums" и root и "sha256sum" и («Summed files»)), + («Run from» от "build inputs" и root и "sh" и ["-c", («Build inputs command»)]), + («Run from» от "version" и root и "bootstrap/flang" и ["--version"]), + («Read from» от "fingerprint beside binary" и root и "bootstrap/flang.seed-sha256"), + («Read from» от "rules digest" и root и "flang/proof/tables/inference-rules.digest"), + («Read from» от "toolchain" и root и "flang/proof/lean/lean-toolchain"), + («Environment» от "lean" и "LEAN")] + +тотальная функция «Lean question» + принимает answers: список «Answer» + возвращает список «Question» + [(«Run» от "lean version" и («Setting of» от "lean" и "lean" и answers) и ["--version"])] + +тотальная функция «Kept octets» + принимает kept: строка + возвращает число + пример «Octets of a kept Cyrillic prefix» + дано kept равно "де" + ожидается 4 + свёртка (разложить kept на символы) начиная с 0 как total и sign → total плюс («Octets» от sign) + +тотальная функция «Octets» + принимает sign: строка + возвращает число + пример «A Latin letter takes one octet» + дано sign равно "c" + ожидается 1 + пример «A Cyrillic letter takes two octets» + дано sign равно "д" + ожидается 2 + пример «The ellipsis takes three octets» + дано sign равно "…" + ожидается 3 + пусть code равно (код символа sign) + 1 плюс (длина (отфильтровать [128, 2048, 65536] где limit → code не меньше limit)) + +тотальная функция «Short» + принимает sum: строка + возвращает строка + пример «A sum is cut to twelve octets» + дано sum равно "c7eecb965bd0aaaabbbb" + ожидается "c7eecb965bd0…" + пример «A Cyrillic word is cut by octets, as the shell cuts it» + дано sum равно "дерево-правленое" + ожидается "дерево…" + пример «A dash stays a dash» + дано sum равно "—" + ожидается "—…" + соединить [(«First line» от (свёртка (разложить sum на символы) начиная с "" как kept и sign → если kept содержит "\n" то kept иначе (соединить [kept, (если ((«Kept octets» от kept) плюс («Octets» от sign)) больше 12 то "\n" иначе sign)] по ""))), "…"] по "" + +тотальная функция «Or dash» + принимает value: строка + возвращает строка + пример «An empty value becomes a dash» + дано value равно "" + ожидается "—" + пример «A value stays itself» + дано value равно "970deed9" + ожидается "970deed9" + если пусто value то "—" иначе value + +тотальная функция «Sum of» + принимает path: строка, sums: строка + возвращает строка + пример «The sum stands before the path» + дано path равно "scripts/seed-fingerprint" + дано sums равно "aa11 bootstrap/flang\nbb22 scripts/seed-fingerprint\n" + ожидается "bb22" + пример «A missing file has no sum» + дано path равно "scripts/seed-fingerprint" + дано sums равно "aa11 bootstrap/flang\n" + ожидается "" + «First line» от (соединить (отобразить (отфильтровать («Lines» от sums) где line → («Word» от 2 и line) равен path) как line → «Word» от 1 и line) по "\n") + +тотальная функция «Tree line» + принимает answers: список «Answer» + возвращает строка + пусть changed равно (длина («Lines» от («Output of» от "changes" и answers))) + «Chosen» от [(«When» от (не ((«Exit code of» от "head" и answers) равен 0)) и ("SHA дерева — (дерево не под учётом git)")), + («When» от (changed равен 0) и (соединить ["SHA дерева ", («First line» от («Output of» от "head" и answers)), " (рабочая копия чиста)"] по ""))] и (соединить ["SHA дерева ", («First line» от («Output of» от "head" и answers)), " (РАБОЧАЯ КОПИЯ ПРАВЛЕНА: файлов ", (к строке changed), " — замер по одному коммиту не повторится)"] по "") + +тотальная функция «Seed line» + принимает answers: список «Answer» + возвращает строка + пусть fingerprint равно («Output of» от "fingerprint" и answers) + соединить ["SHA семени ", («Short» от («Or dash» от («Sum of» от "scripts/seed-fingerprint" и («Output of» от "sums" и answers)))), " (scripts/seed-fingerprint; печать входа ", («Or dash» от («Value after» от "вход " и fingerprint)), " с коммита ", («Short» от («Or dash» от («Value after» от "коммит " и fingerprint))), ")"] по "" + +тотальная функция «Build inputs» + принимает answers: список «Answer» + возвращает строка + «Or dash» от («Word» от 1 и («First line» от («Output of» от "build inputs" и answers))) + +тотальная функция «Freshness» + принимает answers: список «Answer» + возвращает строка + пусть beside равно («Output of» от "fingerprint beside binary" и answers) + пусть binary равно («Sum of» от "bootstrap/flang" и («Output of» от "sums" и answers)) + «Chosen» от [(«When» от ((пусто beside) или (не ((«Value after» от "двоичный " и beside) равен binary))) и ("отпечатка при этом двоичном нет — свежесть НЕ ПРОВЕРЕНА (записать: sh flang/proof/corpus-share.sh --отпечаток)")), + («When» от ((«Value after» от "семя " и beside) равен («Build inputs» от answers)) и ("собран из нынешнего семени (по отпечатку bootstrap/flang.seed-sha256)"))] и ("ОТСТАЛ ОТ СЕМЕНИ: собран не из нынешних bootstrap/*.c — пересобрать: make -C bootstrap") + +тотальная функция «Binary present» + принимает answers: список «Answer» + возвращает признак + не (((«Exit code of» от "version" и answers) равен 127) или ((«Exit code of» от "version" и answers) равен 126)) + +тотальная функция «Version» + принимает answers: список «Answer» + возвращает строка + пусть named равно («First line» от («Output of» от "version" и answers)) + если пусто named то "версии не назвал" иначе named + +тотальная функция «Binary line» + принимает answers: список «Answer» + возвращает строка + если «Binary present» от answers + то соединить ["двоичный ", («Version» от answers), " (bootstrap/flang), sha256 ", («Short» от («Sum of» от "bootstrap/flang" и («Output of» от "sums" и answers))), ", ", («Freshness» от answers)] по "" + иначе "двоичный НЕТ В ДЕРЕВЕ — ни одно число этого отчёта не снято собранным двоичным" + +тотальная функция «Checker line» + принимает answers: список «Answer» + возвращает строка + соединить ["сверщик flang/proof/checker/checker.c sha256 ", («Short» от («Or dash» от («Sum of» от "flang/proof/checker/checker.c" и («Output of» от "sums" и answers))))] по "" + +тотальная функция «Semantics line» + принимает answers: список «Answer» + возвращает строка + пусть recorded равно («Without blanks» от («First line» от («Output of» от "rules digest" и answers))) + пусть counted равно («Sum of» от "flang/proof/tables/inference-rules.tsv" и («Output of» от "sums" и answers)) + если (пусто counted) или (не ((«Exit code of» от "rules digest" и answers) равен 0)) + то "версия семантики — (нет flang/proof/tables/inference-rules.digest)" + иначе соединить ["версия семантики ", («Short» от recorded), " (flang/proof/tables/inference-rules.digest; ", (если counted равен recorded то "ведомость сходится с отпечатком" иначе "ВЕДОМОСТЬ РАЗОШЛАСЬ С ОТПЕЧАТКОМ — версия семантики не та, что объявлена"), ")"] по "" + +тотальная функция «Lean line» + принимает answers: список «Answer» + возвращает строка + если (не («Answered» от "lean version" и answers)) или ((«Exit code of» от "lean version" и answers) равен 127) + то соединить ["Lean ", («Or dash» от («Without blanks» от («First line» от («Output of» от "toolchain" и answers)))), " по flang/proof/lean/lean-toolchain; в PATH НЕТ — здесь не гонялся"] по "" + иначе соединить ["Lean ", («First line» от («Output of» от "lean version" и answers)), " (в PATH)"] по "" + +тотальная функция «Provenance» + принимает answers: список «Answer» + возвращает строка + соединить ["── чем и на чём снято ──", + (соединить ["дата ", («First line» от («Output of» от "day" и answers))] по ""), + («Tree line» от answers), + («Seed line» от answers), + (соединить ["входы сборки ", («Short» от («Build inputs» от answers)), " (sha256 bootstrap/*.c, *.h, Makefile)"] по ""), + («Binary line» от answers), + («Checker line» от answers), + («Semantics line» от answers), + («Lean line» от answers)] по "\n" + +тотальная функция «Provenance stage» + принимает stages: число, answers: список «Answer» + возвращает список «Question» + если stages равен 1 то («Provenance questions» от "..") иначе («Lean question» от answers) + +тотальная функция «Proceed with provenance» + принимает queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + разбор queue + случай голова и хвост + то «Ask» от (голова) и (хвост) и stages и answers + случай пусто + то если stages не больше 0 + то вариант «Конец работы» с значение равным («Provenance» от answers) + иначе «Proceed with provenance» от («Provenance stage» от (stages минус 1) и answers) и (stages минус 1) и answers + +тотальная функция «Begin provenance» + возвращает «Inquiry» + «Begin with» от 2 + +тотальная функция «Next provenance question» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает «Продолжение» + «Proceed with provenance» от (inquiry.«queue») и (inquiry.«stages») и («Heard» от inquiry и reply) + +план «Report» + состояние «Inquiry» + начинает с «Begin provenance» + обрабатывает «Next provenance question» diff --git a/scripts/report-provenance.sh b/scripts/report-provenance.sh deleted file mode 100644 index 4a726aebd..000000000 --- a/scripts/report-provenance.sh +++ /dev/null @@ -1,133 +0,0 @@ -#!/bin/sh -# SPDX-FileCopyrightText: 2026 Digitable (Marat Zimnurov) -# SPDX-License-Identifier: BSD-2-Clause -# -# ЧЕМ И НА ЧЁМ СНЯТ ОТЧЁТ — шапка провенанса, одна на все отчёты о доказуемости. -# -# sh scripts/report-provenance.sh -# -# ── Зачем ─────────────────────────────────────────────────────────────────── -# Отчёты печатали ЧИСЛА и молчали о том, на чём эти числа сняты. «650 из 650 = -# 100 %» одинаково выглядит на чистом дереве и на дереве с правками в рабочей -# копии; «ДОКАЗУЕМ» одинаково выглядит при собранном двоичном и при отсутствии -# двоичного вовсе. Число без провенанса нельзя ни повторить, ни опровергнуть — -# его можно только процитировать, и оно начинает жить отдельно от дерева. -# -# Пункт 11 внешнего аудита сказал это прямо: «Привяжи отчёты к SHA исходников, -# семени, зависимостям и версии семантики». -# -# ── Что печатается и почему именно это ────────────────────────────────────── -# дата день замера: число устаревает молча, дата — нет; -# SHA дерева коммит И чистота рабочей копии: замер на правленом дереве -# не повторяется по одному коммиту, и об этом надо сказать; -# SHA семени отпечаток входов печати (scripts/seed-fingerprint) и -# коммит, с которого печать снята: семя — не дерево, оно -# отстаёт от исходников на перепечатку; -# входы сборки sha256 всех bootstrap/*.c, *.h, Makefile — то, из чего -# собран двоичный, независимо от того, кто его собрал; -# двоичный версия, sha256 и СВЕЖЕСТЬ относительно семени. Строка -# «НЕТ В ДЕРЕВЕ» здесь — не украшение: отчёты о доказуемости -# умеют печатать вердикт, ни разу не позвав двоичный, и -# читатель обязан это видеть в самом отчёте; -# сверщик sha256 исходника независимого проверяющего: вердикт — -# его, и подмена проверяющего меняет смысл всех чисел; -# версия семантики отпечаток ведомости правил вывода: это и есть версия -# набора правил, по которым слово «доказано» вообще -# что-то значит; -# Lean версия второго, чужого судьи — из PATH, если он есть, -# иначе из lean-toolchain со словом «здесь не гонялся». -# -# Имена переменных латиницей: ни dash, ни bash не принимают кириллицу в именах. -set -u - -KOREN=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -cd "$KOREN" || exit 2 - -sha() { sha256sum "$1" 2>/dev/null | cut -d' ' -f1; } -korotko() { printf '%.12s…' "$1"; } - -# ── дерево ────────────────────────────────────────────────────────────────── -DATA=$(date +%F) -if SHA_DEREVA=$(git rev-parse HEAD 2>/dev/null); then - GRYAZNO=$(git status --porcelain 2>/dev/null | wc -l | tr -d ' ') - if [ "$GRYAZNO" = 0 ]; then CHISTOTA="рабочая копия чиста" - else CHISTOTA="РАБОЧАЯ КОПИЯ ПРАВЛЕНА: файлов $GRYAZNO — замер по одному коммиту не повторится"; fi -else - SHA_DEREVA="—"; CHISTOTA="дерево не под учётом git" -fi - -# ── семя ──────────────────────────────────────────────────────────────────── -OTP=scripts/seed-fingerprint -if [ -f "$OTP" ]; then - SHA_SEMENI=$(sha "$OTP") - KOMMIT_PECHATI=$(sed -n 's/^коммит //p' "$OTP" | head -1) - VHOD_PECHATI=$(sed -n 's/^вход //p' "$OTP" | head -1) -else - SHA_SEMENI="—"; KOMMIT_PECHATI="—"; VHOD_PECHATI="—" -fi - -# Тот же расчёт, что у flang/proof/corpus-share.sh:otpechatok_semeni и у ключа -# кеша CI: имена под LC_ALL=C sort, чтобы отпечаток не зависел от машины. -VHODY_SBORKI=$( ( cd bootstrap 2>/dev/null && /bin/ls *.c *.h Makefile 2>/dev/null \ - | LC_ALL=C sort | xargs cat ) 2>/dev/null | sha256sum 2>/dev/null | cut -d' ' -f1 ) -[ -n "$VHODY_SBORKI" ] || VHODY_SBORKI="—" - -# ── двоичный ──────────────────────────────────────────────────────────────── -OTPECHATOK_PRI=bootstrap/flang.seed-sha256 -if [ -x bootstrap/flang ]; then - VERSIYA=$(./bootstrap/flang --version 2>/dev/null | head -1) - [ -n "$VERSIYA" ] || VERSIYA="версии не назвал" - SHA_DVOICH=$(sha bootstrap/flang) - if [ -f "$OTPECHATOK_PRI" ] && [ "$(sed -n 's/^двоичный //p' "$OTPECHATOK_PRI")" = "$SHA_DVOICH" ]; then - if [ "$(sed -n 's/^семя //p' "$OTPECHATOK_PRI")" = "$VHODY_SBORKI" ]; then - SVEZHEST="собран из нынешнего семени (по отпечатку $OTPECHATOK_PRI)" - else - SVEZHEST="ОТСТАЛ ОТ СЕМЕНИ: собран не из нынешних bootstrap/*.c — пересобрать: make -C bootstrap" - fi - else - SVEZHEST="отпечатка при этом двоичном нет — свежесть НЕ ПРОВЕРЕНА (записать: sh flang/proof/corpus-share.sh --отпечаток)" - fi - DVOICHNYY="$VERSIYA (bootstrap/flang), sha256 $(korotko "$SHA_DVOICH"), $SVEZHEST" -else - DVOICHNYY="НЕТ В ДЕРЕВЕ — ни одно число этого отчёта не снято собранным двоичным" -fi - -# ── сверщик и версия семантики ────────────────────────────────────────────── -SVERSCHIK_C=flang/proof/checker/checker.c -if [ -f "$SVERSCHIK_C" ]; then SHA_SVER=$(sha "$SVERSCHIK_C"); else SHA_SVER="—"; fi - -VED=flang/proof/tables/inference-rules.tsv -OTP_VED=flang/proof/tables/inference-rules.digest -if [ -f "$VED" ] && [ -f "$OTP_VED" ]; then - SHA_VED=$(sha "$VED") - ZAPISANO_VED=$(head -1 "$OTP_VED" | tr -d ' \t\r\n') - if [ "$SHA_VED" = "$ZAPISANO_VED" ]; then SEM_SLOVO="ведомость сходится с отпечатком" - else SEM_SLOVO="ВЕДОМОСТЬ РАЗОШЛАСЬ С ОТПЕЧАТКОМ — версия семантики не та, что объявлена"; fi - SEMANTIKA="$(korotko "$ZAPISANO_VED") ($OTP_VED; $SEM_SLOVO)" -else - SEMANTIKA="— (нет $OTP_VED)" -fi - -# ── Lean ──────────────────────────────────────────────────────────────────── -TOOLCHAIN=flang/proof/lean/lean-toolchain -LEAN=${LEAN:-lean} -if command -v "$LEAN" >/dev/null 2>&1; then - LEAN_SLOVO="$("$LEAN" --version 2>/dev/null | head -1) (в PATH)" -else - if [ -f "$TOOLCHAIN" ]; then ZHDEM=$(tr -d ' \t\r\n' < "$TOOLCHAIN"); else ZHDEM="—"; fi - LEAN_SLOVO="$ZHDEM по $TOOLCHAIN; в PATH НЕТ — здесь не гонялся" -fi - -# ── печать ────────────────────────────────────────────────────────────────── -echo "── чем и на чём снято ──" -printf 'дата %s\n' "$DATA" -printf 'SHA дерева %s (%s)\n' "$SHA_DEREVA" "$CHISTOTA" -printf 'SHA семени %s (%s; печать входа %s с коммита %s)\n' \ - "$(korotko "$SHA_SEMENI")" "$OTP" "$VHOD_PECHATI" "$(korotko "$KOMMIT_PECHATI")" -printf 'входы сборки %s (sha256 bootstrap/*.c, *.h, Makefile)\n' "$(korotko "$VHODY_SBORKI")" -printf 'двоичный %s\n' "$DVOICHNYY" -printf 'сверщик %s sha256 %s\n' "$SVERSCHIK_C" "$(korotko "$SHA_SVER")" -printf 'версия семантики %s\n' "$SEMANTIKA" -printf 'Lean %s\n' "$LEAN_SLOVO" -echo -exit 0 diff --git a/scripts/rules.fscript b/scripts/rules.fscript new file mode 100644 index 000000000..8201fd20e --- /dev/null +++ b/scripts/rules.fscript @@ -0,0 +1,40 @@ +модуль «Rules» + +тип «Rule» от «А» + вариант «Holding» содержит holds: признак, outcome: «А» + +тотальная функция «When» от «А» + принимает holds: признак, outcome: «А» + возвращает «Rule» от «А» + пример «A rule is a condition with its outcome» + дано holds равно да + дано outcome равно "two" + ожидается вариант «Holding» с holds равным да и outcome равным "two" + вариант «Holding» с holds равным holds и outcome равным outcome + +тотальная функция «Applying» от «А» + принимает rules: список («Rule» от «А») + возвращает список «А» + пример «Only the outcomes of rules that hold are kept, in their order» + дано rules равно [вариант «Holding» с holds равным нет и outcome равным "one", вариант «Holding» с holds равным да и outcome равным "two", вариант «Holding» с holds равным да и outcome равным "three"] + ожидается ["two", "three"] + свёртка rules начиная с (пустой список) как kept и candidate → разбор candidate + случай вариант «Holding» с holds как holds и outcome как outcome + то если holds то (добавить outcome к kept) иначе kept + +тотальная функция «Chosen» от «А» + принимает rules: список («Rule» от «А»), otherwise: «А» + возвращает «А» + пример «The first rule that holds decides» + дано rules равно [вариант «Holding» с holds равным нет и outcome равным "one", вариант «Holding» с holds равным да и outcome равным "two", вариант «Holding» с holds равным да и outcome равным "three"] + дано otherwise равно "none" + ожидается "two" + пример «No rule holds» + дано rules равно [вариант «Holding» с holds равным нет и outcome равным "one"] + дано otherwise равно "none" + ожидается "none" + разбор («Applying» от rules) + случай пусто + то otherwise + случай голова и хвост + то голова diff --git a/scripts/seed/binary-origin.fscript b/scripts/seed/binary-origin.fscript new file mode 100644 index 000000000..5075f6e3a --- /dev/null +++ b/scripts/seed/binary-origin.fscript @@ -0,0 +1,738 @@ +модуль «Binary origin» + использует «Rules» из "../rules.fscript" + использует «Inquiry» из "../inquiry.fscript" + использует «Reading» из "../reading.fscript" + использует «Lists» только «Соединить списки» + +объект «Outcome» + «code»: число + «words»: строка + +объект «Trimming» + «kept»: строка + «pending»: строка + +тотальная функция «Root» + возвращает строка + "../.." + +тотальная функция «Seed files» + возвращает список строки + ["bootstrap/compiler_flang.c", "bootstrap/compiler_flang.h", "bootstrap/flang_cli.c", "bootstrap/flang_repl.c", "bootstrap/flang_runtime.c", "bootstrap/flang_runtime.h"] + +тотальная функция «Linker names» + возвращает список строки + ["_DYNAMIC", "_GLOBAL_OFFSET_TABLE_", "_IO_stdin_used", "__FRAME_END__", "__TMC_END__", "__abi_tag", "__do_global_dtors_aux", "__do_global_dtors_aux_fini_array_entry", "__dso_handle", "__frame_dummy_init_array_entry", "_fini", "_init", "_start", "completed", "deregister_tm_clones", "frame_dummy", "register_tm_clones"] + +тотальная функция «Exact command» + возвращает строка + "bootstrap/flang io scripts/seed/binary-origin.fscript --plan Exact --timeout 900000" + +тотальная функция «Strippable» + принимает part: строка + возвращает признак + пример «A mark of the optimizer is stripped» + дано part равно "lto_priv" + ожидается да + пример «A number is stripped» + дано part равно "12" + ожидается да + пример «A part of the name itself is kept» + дано part равно "table" + ожидается нет + (["lto_priv", "isra", "constprop", "part", "cold", "localalias"] содержит part) или («Digits» от part) + +тотальная функция «Trimmed» + принимает trimming: «Trimming», part: строка + возвращает «Trimming» + если «Strippable» от part + то запись «Trimming» с «kept» равным (trimming.«kept») и «pending» равным (соединить [(trimming.«pending»), ".", part] по "") + иначе запись «Trimming» с «kept» равным (соединить [(trimming.«kept»), (trimming.«pending»), ".", part] по "") и «pending» равным "" + +тотальная функция «Without version» + принимает symbol: строка + возвращает строка + пример «A version after the at sign is dropped» + дано symbol равно "memcpy@GLIBC_2.14" + ожидается "memcpy" + разбор (разделить symbol по "@") + случай пусто + то "" + случай голова и хвост + то голова + +тотальная функция «Base name» + принимает symbol: строка + возвращает строка + пример «The marks of the optimizer are dropped from the end» + дано symbol равно "compiler_flang_print.lto_priv.0" + ожидается "compiler_flang_print" + пример «A mark in the middle stays» + дано symbol равно "table.cold.names.7" + ожидается "table.cold.names" + пример «A plain name stays itself» + дано symbol равно "main" + ожидается "main" + разбор (разделить («Without version» от symbol) по ".") + случай пусто + то "" + случай голова и хвост + то (свёртка хвост начиная с (запись «Trimming» с «kept» равным голова и «pending» равным "") как trimming и part → «Trimmed» от trimming и part).«kept» + +тотальная функция «After kind» + принимает line: строка + возвращает строка + пример «The rest of the row after the kind of a function» + дано line равно " 12: 0000000000401000 42 FUNC LOCAL DEFAULT 14 main" + ожидается " LOCAL DEFAULT 14 main" + пример «The rest of the row after the kind of an object» + дано line равно " 13: 0000000000601000 8 OBJECT GLOBAL DEFAULT 25 table" + ожидается " GLOBAL DEFAULT 25 table" + пример «A section gives nothing» + дано line равно " 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1 .interp" + ожидается "" + пусть routine равно (разделить line по " FUNC ") + пусть storage равно (разделить line по " OBJECT ") + «Chosen» от [(«When» от ((длина routine) равен 2) и (свёртка routine начиная с "" как kept и part → part)), + («When» от ((длина storage) равен 2) и (свёртка storage начиная с "" как kept и part → part))] и "" + +тотальная функция «Defined name» + принимает line: строка + возвращает строка + пример «A defined function gives its base name» + дано line равно " 12: 0000000000401000 42 FUNC LOCAL DEFAULT 14 main.cold" + ожидается "main" + пример «An undefined function gives nothing» + дано line равно " 3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND bind@GLIBC_2.2.5 (3)" + ожидается "" + пример «A row without a name gives nothing» + дано line равно " 3: 0000000000000000 0 FUNC GLOBAL DEFAULT 14" + ожидается "" + пусть words равно («Words» от («After kind» от line)) + если ((длина words) меньше 4) или ((элемент 3 в words) равен "UND") + то "" + иначе «Base name» от (элемент 4 в words) + +тотальная функция «Binary names» + принимает symbols: строка + возвращает список строки + пример «Only the full table of names is read» + дано symbols равно "\nSymbol table '.dynsym' contains 1 entries:\n 1: 0000000000000000 0 FUNC GLOBAL DEFAULT 14 dynamic\n\nSymbol table '.symtab' contains 2 entries:\n 1: 0000000000401000 42 FUNC LOCAL DEFAULT 14 main.cold\n 2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts\n" + ожидается ["main"] + пусть tables равно (отфильтровать (разделить symbols по "Symbol table '") где table → («First line» от table) содержит ".symtab") + отфильтровать (отобразить (разделить (соединить tables по "\n") по "\n") как line → «Defined name» от line) где name → не (пусто name) + +тотальная функция «Begin in mode» + принимает mode: строка, stages: число + возвращает «Inquiry» + пример «The mode is the first thing known» + дано mode равно "exact" + дано stages равно 8 + ожидается запись «Inquiry» с «asked» равным "" и «queue» равным пустой список и «stages» равным 8 и «answers» равным [запись «Answer» с «name» равным "mode" и «reply» равным (вариант «Прочитано» с содержимое равным "exact")] + запись «Inquiry» с «asked» равным "" и «queue» равным пустой список и «stages» равным stages и «answers» равным [запись «Answer» с «name» равным "mode" и «reply» равным (вариант «Прочитано» с содержимое равным mode)] + +тотальная функция «Mode» + принимает answers: список «Answer» + возвращает строка + «Output of» от "mode" и answers + +тотальная функция «Argument trouble» + принимает passed: список строки + возвращает строка + пример «No arguments are fine» + дано passed равно пустой список + ожидается "" + пример «The asker is named after its key» + дано passed равно ["--what", "работа «Binary»"] + ожидается "" + пример «A key without the asker is a trouble» + дано passed равно ["--what"] + ожидается "--what без имени" + пример «Any other key is a trouble» + дано passed равно ["--exact"] + ожидается "неизвестный довод: --exact" + разбор passed + случай пусто + то "" + случай голова и хвост + то «Chosen» от [(«When» от (не (голова равен "--what")) и (соединить ["неизвестный довод: ", голова] по "")), + («When» от ((длина хвост) равен 1) и "")] и "--what без имени" + +тотальная функция «Asker» + принимает passed: список строки + возвращает строка + пример «Without arguments the asker is this check itself» + дано passed равно пустой список + ожидается "эта проверка" + пример «The asker is named after its key» + дано passed равно ["--what", "работа «Binary»"] + ожидается "работа «Binary»" + если (длина passed) равен 2 то элемент 2 в passed иначе "эта проверка" + +тотальная функция «Asker of» + принимает answers: список «Answer» + возвращает строка + «Asker» от («Given of» от "arguments" и answers) + +тотальная функция «Root path» + принимает answers: список «Answer» + возвращает строка + «First line» от («Output of» от "root path" и answers) + +тотальная функция «Binary» + принимает answers: список «Answer» + возвращает строка + «Setting of» от "binary" и («Setting of» от "binary fallback" и (соединить [(«Root path» от answers), "/bootstrap/flang"] по "") и answers) и answers + +тотальная функция «Compiler» + принимает answers: список «Answer» + возвращает строка + «Setting of» от "compiler" и "cc" и answers + +тотальная функция «Work» + принимает answers: список «Answer» + возвращает строка + «Made of» от "work" и answers + +тотальная функция «Setup» + возвращает список «Question» + [(«Arguments» от "arguments"), + («Environment» от "binary" и "FLANG_BINARY"), + («Environment» от "binary fallback" и "FLANG_BIN"), + («Environment» от "bypass" и "FLANG_BINARY_UNKNOWN_OK"), + («Environment» от "no memory" и "FLANG_BINARY_ORIGIN_NO_MEMORY"), + («Environment» от "compiler" и "CC"), + («Environment» от "temporary" и "TMPDIR"), + («Run from» от "root path" и («Root») и "pwd" и пустой список)] + +тотальная функция «Tools» + принимает answers: список «Answer» + возвращает список «Question» + если («Mode» от answers) равен "check" + то [(«Run» от "readelf" и "readelf" и ["--version"]), («Run» от "compiler version" и («Compiler» от answers) и ["--version"])] + иначе [(«Run» от "make" и "make" и ["--version"]), («Run» от "compiler version" и («Compiler» от answers) и ["--version"])] + +тотальная функция «Presence» + принимает answers: список «Answer» + возвращает список «Question» + «Gathered» от [[(«Run» от "binary is a file" и "test" и ["-f", («Binary» от answers)]), («Run» от "binary runs" и "test" и ["-x", («Binary» от answers)])], + (отобразить («Seed files») как file → «Run from» от (соединить ["seed ", file] по "") и («Root») и "test" и ["-f", file]), + («Tools» от answers)] + +тотальная функция «Fingerprints» + принимает answers: список «Answer» + возвращает список «Question» + [(«Run» от "binary sum" и "md5sum" и [(«Binary» от answers)]), + («Run» от "binary size" и "wc" и ["-c", («Binary» от answers)]), + («Run from» от "seed sum" и («Root») и "sh" и (приписать "-c" к (приписать "cat \"$@\" | md5sum" к (приписать "sh" к («Seed files»))))), + («Run» от "plan sum" и "md5sum" и ["binary-origin.fscript"]), + («Run from» от "git directory" и («Root») и "git" и ["rev-parse", "--git-dir"])] + +тотальная функция «Remembers» + принимает answers: список «Answer» + возвращает признак + (пусто («Setting of» от "no memory" и "" и answers)) и притом ((«Exit code of» от "git directory" и answers) равен 0) + +тотальная функция «Memory path» + принимает answers: список «Answer» + возвращает строка + пусть directory равно («First line» от («Output of» от "git directory" и answers)) + если directory начинается с "/" + то соединить [directory, "/binary-origin.checked"] по "" + иначе соединить [(«Root path» от answers), "/", directory, "/binary-origin.checked"] по "" + +тотальная функция «Memory» + принимает answers: список «Answer» + возвращает список «Question» + если «Remembers» от answers + то [(«Read» от "memory" и («Memory path» от answers))] + иначе пустой список + +тотальная функция «Mode word» + принимает answers: список «Answer» + возвращает строка + если («Mode» от answers) равен "exact" то "побайтово" иначе "поименно" + +тотальная функция «Sum» + принимает name: строка, answers: список «Answer» + возвращает строка + «Word» от 1 и («First line» от («Output of» от name и answers)) + +тотальная функция «Compiler name» + принимает answers: список «Answer» + возвращает строка + «First line» от («Output of» от "compiler version" и answers) + +тотальная функция «Stamp» + принимает answers: список «Answer» + возвращает строка + соединить [(«Mode word» от answers), («Sum» от "binary sum" и answers), («Sum» от "seed sum" и answers), («Sum» от "plan sum" и answers), («Compiler name» от answers)] по " " + +тотальная функция «Remembered» + принимает answers: список «Answer» + возвращает признак + («Remembers» от answers) и притом ((«Lines» от («Output of» от "memory" и answers)) содержит («Stamp» от answers)) + +тотальная функция «Work pattern» + принимает answers: список «Answer» + возвращает строка + если («Mode» от answers) равен "forgery" + то соединить [(«Setting of» от "temporary" и "/tmp" и answers), "/binary-origin-forgery."] по "" + иначе соединить [(«Setting of» от "temporary" и "/tmp" и answers), "/binary-origin."] по "" + +тотальная функция «Survey» + принимает answers: список «Answer» + возвращает список «Question» + если («Mode» от answers) равен "exact" + то [(«Run from» от "copy" и («Root») и "cp" и («Соединить списки» от (приписать "bootstrap/Makefile" к («Seed files»)) и [(«Work» от answers)])), + («Run» от "cores" и "getconf" и ["_NPROCESSORS_ONLN"])] + иначе [(«Run» от "sections" и "readelf" и ["-SW", («Binary» от answers)]), + («Run» от "table" и "sh" и ["-c", "readelf -sW \"$0\" > \"$1\" 2>/dev/null", («Binary» от answers), (соединить [(«Work» от answers), "/symbols"] по "")]), + («Read» от "symbols" и (соединить [(«Work» от answers), "/symbols"] по ""))] + +тотальная функция «Foreign names command» + возвращает строка + "grep -h -o \"[A-Za-z_][A-Za-z0-9_]*\" \"$@\" | sort -u - \"$0/linker-names\" > \"$0/known-names\" && sort -u \"$0/binary-names\" | comm -23 - \"$0/known-names\"" + +тотальная функция «Cores» + принимает answers: список «Answer» + возвращает строка + пусть counted равно («First line» от («Output of» от "cores" и answers)) + если «Digits» от counted то counted иначе "4" + +тотальная функция «Comparison» + принимает answers: список «Answer» + возвращает список «Question» + пусть work равно («Work» от answers) + если («Mode» от answers) равен "exact" + то [(«Run» от "build" и "make" и ["-C", work, (соединить ["-j", («Cores» от answers)] по "")]), + («Run» от "compare" и "cmp" и ["-s", (соединить [work, "/flang"] по ""), («Binary» от answers)]), + («Run» от "built sum" и "md5sum" и [(соединить [work, "/flang"] по "")]), + («Run» от "built size" и "wc" и ["-c", (соединить [work, "/flang"] по "")])] + иначе [(«Write» от "binary names" и (соединить [work, "/binary-names"] по "") и (соединить (добавить "" к («Binary names» от («Output of» от "symbols" и answers))) по "\n")), + («Write» от "linker names" и (соединить [work, "/linker-names"] по "") и (соединить (добавить "" к («Linker names»)) по "\n")), + («Run from» от "foreign" и («Root») и "env" и (приписать "LC_ALL=C" к (приписать "sh" к (приписать "-c" к (приписать («Foreign names command») к (приписать work к («Seed files»)))))))] + +тотальная функция «Bypass» + возвращает строка + "FLANG_BINARY_UNKNOWN_OK" + +тотальная функция «Cannot check» + принимает reason: строка, answers: список «Answer» + возвращает «Outcome» + запись «Outcome» с «code» равным 3 и «words» равным (соединить [(соединить ["СВЕРИТЬ ДВОИЧНЫЙ НЕ УДАЛОСЬ — судить о доказательствах нельзя: ", («Asker of» от answers)] по ""), "", reason, "", "Пропуск не есть пройденная проверка: судить всё равно —", (соединить [" ", («Bypass»), "=1 <та же команда>"] по "")] по "\n") + +тотальная функция «Failed» + принимает name: строка, answers: список «Answer» + возвращает признак + не ((«Exit code of» от name и answers) равен 0) + +тотальная функция «Absent» + принимает name: строка, answers: список «Answer» + возвращает признак + («Exit code of» от name и answers) равен 127 + +тотальная функция «Steps» + принимает mode: строка + возвращает список строки + если mode равен "forgery" + то ["setup", "presence", "work", "forging", "cleanup"] + иначе ["setup", "presence", "fingerprints", "memory", "work", "survey", "comparison", "cleanup"] + +тотальная функция «Step» + принимает stages: число, mode: строка + возвращает строка + пример «The first step of a check is the setup» + дано stages равно 7 + дано mode равно "check" + ожидается "setup" + пример «The last step of a forgery is the cleanup» + дано stages равно 0 + дано mode равно "forgery" + ожидается "cleanup" + пример «Before the first step there is none» + дано stages равно 8 + дано mode равно "check" + ожидается "" + пусть steps равно («Steps» от mode) + если (stages меньше 0) или (stages не меньше (длина steps)) + то "" + иначе элемент ((длина steps) минус stages) в steps + +тотальная функция «Setup outcomes» + принимает answers: список «Answer» + возвращает список «Outcome» + пусть trouble равно («Argument trouble» от («Given of» от "arguments" и answers)) + «Chosen» от [(«When» от (не (пусто trouble)) и ([запись «Outcome» с «code» равным 3 и «words» равным trouble])), + («When» от ((пусто («Setting of» от "bypass" и "" и answers)) или ((«Mode» от answers) равен "forgery")) и (пустой список))] и ([запись «Outcome» с «code» равным 0 и «words» равным (соединить [(«Bypass»), ": судим двоичным без сверки с семенем по прямому указанию.\nДвоичный: ", («Binary» от answers)] по "")]) + +тотальная функция «Missing seed files» + принимает answers: список «Answer» + возвращает список строки + отфильтровать («Seed files») где file → «Failed» от (соединить ["seed ", file] по "") и answers + +тотальная функция «Missing tools» + принимает answers: список «Answer» + возвращает список строки + пусть compiler равно («Compiler» от answers) + «Chosen» от [(«When» от ((«Mode» от answers) равен "forgery") и ((если «Absent» от "compiler version" и answers то [(соединить ["нет ", compiler, " — подложить нечего"] по "")] иначе пустой список))), + («When» от ((«Mode» от answers) равен "exact") и («Соединить списки» от (если «Absent» от "make" и answers то ["нет make — пересобрать нечем"] иначе пустой список) и (если «Absent» от "compiler version" и answers то [(соединить ["нет ", compiler, " — пересобрать нечем"] по "")] иначе пустой список)))] и ((если «Absent» от "readelf" и answers то [(соединить ["нет readelf — имена из двоичного взять нечем.\nТочная сверка readelf не требует: ", («Exact command»)] по "")] иначе пустой список)) + +тотальная функция «Presence troubles» + принимает answers: список «Answer» + возвращает список строки + «Gathered words» от [(если «Failed» от "binary is a file" и answers то [(соединить ["двоичного нет вовсе: ", («Binary» от answers), "\nСоберите его: make -C bootstrap"] по "")] иначе пустой список), + (если «Failed» от "binary runs" и answers то [(соединить ["двоичный есть, но не запускается: ", («Binary» от answers)] по "")] иначе пустой список), + (отобразить («Missing seed files» от answers) как file → соединить ["в дереве нет файла семени ", file, " — сверять не с чем"] по ""), + («Missing tools» от answers)] + +тотальная функция «First trouble» + принимает troubles: список строки, answers: список «Answer» + возвращает список «Outcome» + разбор troubles + случай пусто + то пустой список + случай голова и хвост + то [(«Cannot check» от голова и answers)] + +тотальная функция «Fingerprint troubles» + принимает answers: список «Answer» + возвращает список строки + если «Absent» от "binary sum" и answers + то ["нет md5sum — отпечаток снять нечем"] + иначе пустой список + +тотальная функция «Memory outcomes» + принимает answers: список «Answer» + возвращает список «Outcome» + если «Remembered» от answers + то [запись «Outcome» с «code» равным 0 и «words» равным (соединить ["двоичный сверен с семенем ", («Mode word» от answers), ": такая сверка уже сходилась — ", («Memory path» от answers)] по "")] + иначе пустой список + +тотальная функция «Settled» + принимает step: строка, answers: список «Answer» + возвращает список «Outcome» + «Chosen» от [(«When» от (step равен "setup") и («Setup outcomes» от answers)), + («When» от (step равен "presence") и («First trouble» от («Presence troubles» от answers) и answers)), + («When» от (step равен "fingerprints") и («First trouble» от («Fingerprint troubles» от answers) и answers)), + («When» от (step равен "memory") и («Memory outcomes» от answers))] и (пустой список) + +тотальная функция «Forged source» + возвращает строка + "int flang_binary_origin_forged_name(void) { return 0; }\nint main(void) { return flang_binary_origin_forged_name(); }\n" + +тотальная функция «Judge» + принимает name: строка, judged: строка, answers: список «Answer» + возвращает «Question» + «Run» от name и "env" и ["FLANG_BINARY_UNKNOWN_OK=", "FLANG_BINARY_ORIGIN_NO_MEMORY=1", "FLANG_BINARY=", (соединить ["FLANG_BIN=", judged] по ""), (соединить [(«Root path» от answers), "/bootstrap/flang"] по ""), "io", "binary-origin.fscript", "--plan", "Check"] + +тотальная функция «Forging» + принимает answers: список «Answer» + возвращает список «Question» + пусть work равно («Work» от answers) + [(«Write» от "forged source" и (соединить [work, "/forged.c"] по "") и («Forged source»)), + («Run» от "forge" и («Compiler» от answers) и ["-o", (соединить [work, "/forged"] по ""), (соединить [work, "/forged.c"] по "")]), + («Judge» от "forged run" и (соединить [work, "/forged"] по "") и answers), + («Run» от "strip version" и "strip" и ["--version"]), + («Run» от "copy binary" и "cp" и [(«Binary» от answers), (соединить [work, "/stripped"] по "")]), + («Run» от "strip" и "strip" и [(соединить [work, "/stripped"] по "")]), + («Judge» от "stripped run" и (соединить [work, "/stripped"] по "") и answers)] + +тотальная функция «Survived lines» + принимает answers: список «Answer» + возвращает список строки + пусть mine равно («Sum» от "plan sum" и answers) + отфильтровать («Lines» от («Output of» от "memory" и answers)) где line → ((«Word» от 4 и line) равен mine) и притом (не (line равен («Stamp» от answers))) + +тотальная функция «Remember» + принимает answers: список «Answer» + возвращает список «Question» + если («Remembers» от answers) и притом ((«Verdict of» от answers).«code» равен 0) + то [(«Write» от "remember" и («Memory path» от answers) и (соединить (добавить "" к (добавить («Stamp» от answers) к («Survived lines» от answers))) по "\n"))] + иначе пустой список + +тотальная функция «Cleanup» + принимает answers: список «Answer» + возвращает список «Question» + приписать («Run» от "cleanup" и "rm" и ["-rf", («Work» от answers)]) к (если («Mode» от answers) равен "forgery" то пустой список иначе («Remember» от answers)) + +тотальная функция «Stage» + принимает step: строка, answers: список «Answer» + возвращает список «Question» + «Chosen» от [(«When» от (step равен "setup") и («Setup»)), + («When» от (step равен "presence") и («Presence» от answers)), + («When» от (step равен "fingerprints") и («Fingerprints» от answers)), + («When» от (step равен "memory") и («Memory» от answers)), + («When» от (step равен "work") и ([(«Temporary directory» от "work" и («Work pattern» от answers))])), + («When» от (step равен "survey") и («Survey» от answers)), + («When» от (step равен "comparison") и («Comparison» от answers)), + («When» от (step равен "forging") и («Forging» от answers)), + («When» от (step равен "cleanup") и («Cleanup» от answers))] и (пустой список) + +тотальная функция «Written» + принимает reply: «Отклик» + возвращает число + пример «A written file tells how much was written» + дано reply равно вариант «Записано» с сколько равным 12 + ожидается 12 + пример «Anything else wrote nothing» + дано reply равно вариант «Пока ничего» + ожидается 0 + разбор reply + случай вариант «Записано» с сколько как amount + то amount + случай любое + то 0 + +тотальная функция «Has name table» + принимает sections: строка + возвращает признак + пример «The table of names is among the sections» + дано sections равно " [28] .comment PROGBITS\n [29] .symtab SYMTAB 0000000000000000 168f040\n" + ожидается да + пример «A stripped binary has none» + дано sections равно " [28] .comment PROGBITS\n [29] .shstrtab STRTAB\n" + ожидается нет + (длина (отфильтровать («Lines» от sections) где line → («Words» от line) содержит ".symtab")) больше 0 + +тотальная функция «Leading» + принимает lines: список строки, amount: число + возвращает список строки + пример «Two of three» + дано lines равно ["one", "two", "three"] + дано amount равно 2 + ожидается ["one", "two"] + пример «More than there is» + дано lines равно ["one"] + дано amount равно 2 + ожидается ["one"] + разбор lines + случай пусто + то пустой список + случай голова и хвост + то если amount не больше 0 + то пустой список + иначе приписать голова к («Leading» от хвост и (amount минус 1)) + +тотальная функция «Without leading» + принимает lines: список строки, amount: число + возвращает список строки + пример «Without the first of three» + дано lines равно ["one", "two", "three"] + дано amount равно 1 + ожидается ["two", "three"] + пример «Nothing to drop» + дано lines равно ["one"] + дано amount равно 0 + ожидается ["one"] + разбор lines + случай пусто + то пустой список + случай голова и хвост + то если amount не больше 0 + то lines + иначе «Without leading» от хвост и (amount минус 1) + +тотальная функция «Shown names» + принимает names: список строки + возвращает список строки + пример «A short list is shown whole» + дано names равно ["forged"] + ожидается [" • forged"] + «Соединить списки» от (отобразить («Leading» от names и 12) как name → соединить [" • ", name] по "") и (если (длина names) больше 12 то [(соединить [" …и ещё ", (к строке ((длина names) минус 12))] по "")] иначе пустой список) + +тотальная функция «Two causes» + возвращает список строки + ["", + "Двоичный собран не из этого семени. Причин ровно две, и обе чинятся:", + "", + " 1. Двоичный СВЕЖЕЕ семени: собран из правки, которой в bootstrap/ нет.", + " Ровно так 23 августа 2026 в двадцати рабочих копиях оказался", + " компилятор из двух невлитых веток — и шесть суток судил язык с", + " доказательствами. Чинится: закоммитить то, из чего он собран, или", + " пересобрать из дерева.", + " 2. Двоичный ОТСТАЛ: семя перепечатали, а его не пересобрали.", + " Чинится: make -C bootstrap", + "", + "Какая из двух — видно по именам выше: имя из вашей же правки значит", + "первое, десятки незнакомых имён семени — второе.", + "", + (соединить ["Побайтовая сверка (около 65 с): ", («Exact command»)] по ""), + (соединить ["Судить всё равно, зная это: ", («Bypass»), "=1 <та же команда>"] по "")] + +тотальная функция «Foreign code» + принимает names: список строки, answers: список «Answer» + возвращает «Outcome» + запись «Outcome» с «code» равным 1 и «words» равным (соединить («Gathered words» от [[(соединить ["ОТКАЗЫВАЮСЬ СУДИТЬ: в двоичном есть код, которого нет в семени: ", («Asker of» от answers)] по ""), + "", + (соединить [" двоичный: ", («Binary» от answers)] по ""), + (соединить [" отпечаток: ", («Sum» от "binary sum" и answers), ", ", («Sum» от "binary size" и answers), " байт"] по ""), + "", + (соединить ["Имён, которых нет ни в bootstrap/*.c, ни в bootstrap/*.h: ", (к строке (длина names))] по "")], + («Shown names» от names), + («Two causes»)]) по "\n") + +тотальная функция «Names verdict» + принимает answers: список «Answer» + возвращает «Outcome» + «Chosen» от [(«When» от (пусто («Work» от answers)) и («Cannot check» от "не завёлся временный каталог" и answers)), + («When» от (не («Has name table» от («Output of» от "sections" и answers))) и («Cannot check» от (соединить ["у двоичного снята таблица имён (.symtab) — сверять по именам нечего.\nПустота не есть совпадение. Побайтовая сверка это переживёт:\n ", («Exact command»)] по "") и answers)), + («When» от ((«Written» от («Reply to» от "binary names" и answers)) не больше 1) и («Cannot check» от (соединить ["в таблице имён двоичного нет ни одного\nопределённого имени — читать нечего. Побайтовая сверка это переживёт:\n ", («Exact command»)] по "") и answers)), + («When» от («Failed» от "foreign" и answers) и («Cannot check» от (соединить ["сличить имена двоичного с именами семени не удалось: ", («Errors of» от "foreign" и answers)] по "") и answers)), + («When» от ((длина («Lines» от («Output of» от "foreign" и answers))) равен 0) и (запись «Outcome» с «code» равным 0 и «words» равным "двоичный сверен с семенем поименно: чужих имён нет"))] и («Foreign code» от («Lines» от («Output of» от "foreign" и answers)) и answers) + +тотальная функция «Last lines» + принимает text: строка, amount: число + возвращает список строки + пример «The end of a long text» + дано text равно "one\ntwo\nthree\n" + дано amount равно 2 + ожидается ["two", "three"] + пример «A short text is taken whole» + дано text равно "one\n" + дано amount равно 2 + ожидается ["one"] + «Without leading» от («Lines» от text) и ((длина («Lines» от text)) минус amount) + +тотальная функция «Not built from seed» + принимает answers: список «Answer» + возвращает «Outcome» + запись «Outcome» с «code» равным 1 и «words» равным (соединить [(соединить ["ОТКАЗЫВАЮСЬ СУДИТЬ: двоичный не собирается из семени этого дерева: ", («Asker of» от answers)] по ""), + "", + (соединить [" двоичный в дереве: ", («Sum» от "binary sum" и answers), " ", («Sum» от "binary size" и answers), " байт"] по ""), + (соединить [" сборка из семени: ", («Sum» от "built sum" и answers), " ", («Sum» от "built size" и answers), " байт"] по ""), + (соединить [" собрано: ", («Compiler» от answers), " — ", («Compiler name» от answers)] по ""), + "", + "Это тот же случай, что 23 августа 2026: в двадцати рабочих копиях лежал", + "двоичный, собранный из невлитых веток. Отличий не было видно ни в номере", + "версии, ни в печатных строках — только в коде.", + "", + "Чинится одним из двух:", + " * пересобрать двоичный из дерева: make -C bootstrap", + " * или закоммитить то, из чего он на самом деле собран.", + "", + (соединить ["Судить всё равно, зная это: ", («Bypass»), "=1 <та же команда>"] по "")] по "\n") + +тотальная функция «Exact verdict» + принимает answers: список «Answer» + возвращает «Outcome» + «Chosen» от [(«When» от (пусто («Work» от answers)) и («Cannot check» от "не завёлся временный каталог" и answers)), + («When» от («Failed» от "copy" и answers) и («Cannot check» от "нет bootstrap/Makefile" и answers)), + («When» от («Failed» от "build" и answers) и («Cannot check» от (соединить («Соединить списки» от (приписать "сборка из семени не прошла — вот её конец:" к («Last lines» от (соединить [(«Output of» от "build" и answers), («Errors of» от "build" и answers)] по "\n") и 20)) и ["", "собрать компилятор из bootstrap/ этого дерева не удалось"]) по "\n") и answers)), + («When» от ((«Exit code of» от "compare" и answers) равен 0) и (запись «Outcome» с «code» равным 0 и «words» равным "двоичный сверен с семенем побайтово: сборка из семени совпала с двоичным"))] и («Not built from seed» от answers) + +тотальная функция «Without log» + принимает answer: строка + возвращает строка + пример «The answer of a plan is kept and its log is dropped» + дано answer равно "{\"plan\":\"Check\",\"result\":\"сверено\",\"orders\":31,\"log\":[]}" + ожидается "{\"plan\":\"Check\",\"result\":\"сверено\"" + пример «An empty answer stays empty» + дано answer равно "" + ожидается "" + разбор (разделить answer по ",\"orders\":") + случай пусто + то "" + случай голова и хвост + то голова + +тотальная функция «Said» + принимает name: строка, answers: список «Answer» + возвращает строка + соединить [(«Without log» от («Output of» от name и answers)), («Errors of» от name и answers)] по "\n" + +тотальная функция «Blind» + принимает words: строка, name: строка, answers: список «Answer» + возвращает «Outcome» + запись «Outcome» с «code» равным 1 и «words» равным (соединить [words, "\n", («Said» от name и answers)] по "") + +тотальная функция «Forgery verdict» + принимает answers: список «Answer» + возвращает «Outcome» + «Chosen» от [(«When» от (пусто («Work» от answers)) и («Cannot check» от "не завёлся временный каталог" и answers)), + («When» от («Failed» от "forge" и answers) и («Cannot check» от "подложную программу не удалось собрать" и answers)), + («When» от (не ((«Exit code of» от "forged run" и answers) равен 1)) и («Blind» от (соединить ["СТОРОЖ СЛЕП: на подложенной программе он ответил кодом ", (к строке («Exit code of» от "forged run" и answers)), " вместо 1."] по "") и "forged run" и answers)), + («When» от (не ((«Said» от "forged run" и answers) содержит "flang_binary_origin_forged_name")) и («Blind» от "СТОРОЖ ОТКАЗАЛ, но не назвал подложное имя — отказ не по делу:" и "forged run" и answers))] и («Emptiness verdict» от answers) + +тотальная функция «Emptiness verdict» + принимает answers: список «Answer» + возвращает «Outcome» + «Chosen» от [(«When» от («Absent» от "strip version" и answers) и (запись «Outcome» с «code» равным 3 и «words» равным "подлог именем: сторож покраснел и назвал имя — видит.\nЧАСТЬ САМОПРОВЕРКИ НЕ СНЯТА: нет strip, подлог снятой таблицей имён не сделан.\nПропуск не есть пройденная проверка.")), + («When» от ((«Failed» от "copy binary" и answers) или («Failed» от "strip" и answers)) и («Cannot check» от "снять таблицу имён с копии двоичного не удалось" и answers)), + («When» от (не ((«Exit code of» от "stripped run" и answers) равен 3)) и («Blind» от (соединить ["СТОРОЖ СЛЕП: на двоичном со снятой таблицей имён он ответил кодом ", (к строке («Exit code of» от "stripped run" и answers)), " вместо 3."] по "") и "stripped run" и answers))] и (запись «Outcome» с «code» равным 0 и «words» равным "подлог именем: сторож покраснел и назвал имя — видит.\nподлог пустотой: сторож отказал кодом 3, а не зазеленел, — видит.") + +тотальная функция «Verdict of» + принимает answers: список «Answer» + возвращает «Outcome» + «Chosen» от [(«When» от ((«Mode» от answers) равен "forgery") и («Forgery verdict» от answers)), + («When» от ((«Mode» от answers) равен "exact") и («Exact verdict» от answers))] и («Names verdict» от answers) + +тотальная функция «Failure code» + принимает mode: строка + возвращает строка + если mode равен "forgery" то "FLANG_GUARD_IS_BLIND" иначе "FLANG_BINARY_NOT_FROM_SEED" + +тотальная функция «Ending» + принимает outcome: «Outcome», mode: строка + возвращает «Продолжение» + пример «Code zero ends the work» + дано outcome равно запись «Outcome» с «code» равным 0 и «words» равным "сверено" + дано mode равно "check" + ожидается вариант «Конец работы» с значение равным "сверено" + пример «Code one is a failure found by the plan» + дано outcome равно запись «Outcome» с «code» равным 1 и «words» равным "чужой код" + дано mode равно "check" + ожидается вариант «Провал» с код равным "FLANG_BINARY_NOT_FROM_SEED" и сообщение равным "чужой код" + пример «Any other code means there was nothing to look with» + дано outcome равно запись «Outcome» с «code» равным 3 и «words» равным "нет readelf" + дано mode равно "check" + ожидается вариант «Не проверено» с код равным "FLANG_BINARY_NOT_CHECKED" и сообщение равным "нет readelf" + «Chosen» от [(«When» от ((outcome.«code») равен 0) и (вариант «Конец работы» с значение равным (outcome.«words»))), + («When» от ((outcome.«code») равен 1) и (вариант «Провал» с код равным («Failure code» от mode) и сообщение равным (outcome.«words»)))] и (вариант «Не проверено» с код равным "FLANG_BINARY_NOT_CHECKED" и сообщение равным (outcome.«words»)) + +тотальная функция «Proceed» + принимает queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + разбор queue + случай голова и хвост + то «Ask» от (голова) и (хвост) и stages и answers + случай пусто + то разбор («Settled» от («Step» от stages и («Mode» от answers)) и answers) + случай голова и хвост + то «Ending» от (голова) и («Mode» от answers) + случай пусто + то если stages не больше 0 + то «Ending» от («Verdict of» от answers) и («Mode» от answers) + иначе «Proceed» от («Stage» от («Step» от (stages минус 1) и («Mode» от answers)) и answers) и (stages минус 1) и answers + +тотальная функция «Begin check» + возвращает «Inquiry» + «Begin in mode» от "check" и 8 + +тотальная функция «Begin exact» + возвращает «Inquiry» + «Begin in mode» от "exact" и 8 + +тотальная функция «Begin forgery» + возвращает «Inquiry» + «Begin in mode» от "forgery" и 5 + +тотальная функция «Next» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает «Продолжение» + «Proceed» от (inquiry.«queue») и (inquiry.«stages») и («Heard» от inquiry и reply) + +план «Check» + состояние «Inquiry» + начинает с «Begin check» + обрабатывает «Next» + +план «Exact» + состояние «Inquiry» + начинает с «Begin exact» + обрабатывает «Next» + +план «Forgery» + состояние «Inquiry» + начинает с «Begin forgery» + обрабатывает «Next» diff --git a/scripts/seed/binary-origin.sh b/scripts/seed/binary-origin.sh deleted file mode 100755 index 97fcaf00f..000000000 --- a/scripts/seed/binary-origin.sh +++ /dev/null @@ -1,334 +0,0 @@ -#!/bin/sh -# SPDX-FileCopyrightText: 2026 Digitable (Marat Zimnurov) -# SPDX-License-Identifier: BSD-2-Clause -# -# Отказ судить двоичным, которого нельзя собрать из bootstrap/ этого дерева: -# быстрая сверка — по именам таблицы символов, точная — побайтовой пересборкой. -# Ответ «сошлось» помнится в .git по отпечаткам двоичного, семени, этого файла и cc. -# -# Как звать: -# sh scripts/seed/binary-origin.sh быстрая сверка (полсекунды) -# sh scripts/seed/binary-origin.sh --точно точная (пересборка, ~65 с) -# sh scripts/seed/binary-origin.sh --чем "<имя>" назвать, кто спрашивает -# sh scripts/seed/binary-origin.sh -- <команда…> отказать или запустить -# sh scripts/seed/binary-origin.sh --подлог самопроверка: два подлога -# Латиницей то же: --exact, --what, --forgery. Судится FLANG_BINARY, иначе -# FLANG_BIN, иначе bootstrap/flang. Обход (вслух): FLANG_BINARY_UNKNOWN_OK=1. -# -# Коды: 0 — двоичный отвечает семени (или сработал ключ обхода); 1 — не отвечает, -# судить отказано; 2 — только у --подлог: часть самопроверки не снята (нет -# strip); 3 — сверить не удалось (нет двоичного, readelf или таблицы имён). -# Коды 2 и 3 — НЕ пройденная проверка. -# Почему так и что снято прогонами: -# docs/zettel/the-binary-is-judged-by-its-symbol-names-not-by-its-size-or-strings.md -set -eu - -export LC_ALL=C - -ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/../.." && pwd) -BYPASS=FLANG_BINARY_UNKNOWN_OK - -err() { printf '%s\n' "$*" >&2; } - -fingerprint() { - if command -v md5sum >/dev/null 2>&1; then md5sum "$1" | cut -d' ' -f1 - elif command -v md5 >/dev/null 2>&1; then md5 -q "$1" - else cksum "$1" | cut -d' ' -f1 - fi -} - -# Размер файла. `stat` разошёлся между GNU и BSD доводами, `wc -c` — нет. -bytes() { wc -c < "$1" | tr -d ' '; } - -cores() { (getconf _NPROCESSORS_ONLN 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4) | tr -d ' '; } - -what="эта проверка" -exact=0 -forgery=0 -while [ $# -gt 0 ]; do - case $1 in - --точно|--exact) exact=1; shift ;; - --подлог|--forgery) forgery=1; shift ;; - --чем|--what) [ $# -ge 2 ] || { err "--чем без имени"; exit 3; }; what=$2; shift 2 ;; - --) shift; break ;; - -*) err "неизвестный довод: $1"; exit 3 ;; - *) break ;; - esac -done - -bin=${FLANG_BINARY:-${FLANG_BIN:-"$ROOT/bootstrap/flang"}} - -# ── Обход по ключу: разрешаем, но вслух ───────────────────────────────────── -if [ -n "${FLANG_BINARY_UNKNOWN_OK:-}" ] && [ "$forgery" = 0 ]; then - err "$BYPASS: судим двоичным без сверки с семенем по прямому указанию." - err "Двоичный: $bin" - if [ $# -gt 0 ]; then exec "$@"; fi - exit 0 -fi - -cannot_check() { - err "СВЕРИТЬ ДВОИЧНЫЙ НЕ УДАЛОСЬ — судить о доказательствах нельзя: $what" - err "" - err "$1" - err "" - err "Пропуск не есть пройденная проверка: судить всё равно —" - err " $BYPASS=1 <та же команда>" - exit 3 -} - -[ -f "$bin" ] || cannot_check "двоичного нет вовсе: $bin -Соберите его: make -C bootstrap" -[ -x "$bin" ] || cannot_check "двоичный есть, но не запускается: $bin" - -SEED_FILES='compiler_flang.c compiler_flang.h flang_cli.c flang_repl.c flang_runtime.c flang_runtime.h' -for f in $SEED_FILES; do - [ -f "$ROOT/bootstrap/$f" ] || cannot_check "в дереве нет файла семени bootstrap/$f — сверять не с чем" -done - -# ── ПОДЛОГ: сторож обязан уметь покраснеть ────────────────────────────────── -if [ "$forgery" = 1 ]; then - command -v "${CC:-cc}" >/dev/null 2>&1 || cannot_check "нет ${CC:-cc} — подложить нечего" - work=$(mktemp -d "${TMPDIR:-/tmp}/binary-origin-forgery.XXXXXX") \ - || cannot_check "не завёлся временный каталог" - trap 'rm -rf "$work"' EXIT INT TERM HUP - cat > "$work/forged.c" <<'FORGED' -int flang_binary_origin_forged_name(void) { return 0; } -int main(void) { return flang_binary_origin_forged_name(); } -FORGED - "${CC:-cc}" -o "$work/forged" "$work/forged.c" 2>/dev/null \ - || cannot_check "подложную программу не удалось собрать" - - out=$(FLANG_BINARY_UNKNOWN_OK= FLANG_BINARY_ORIGIN_NO_MEMORY=1 FLANG_BINARY= \ - FLANG_BIN="$work/forged" sh "$0" 2>&1) && code=0 || code=$? - if [ "$code" != 1 ]; then - err "СТОРОЖ СЛЕП: на подложенной программе он ответил кодом $code вместо 1." - printf '%s\n' "$out" >&2 - exit 1 - fi - case $out in - *flang_binary_origin_forged_name*) ;; - *) err "СТОРОЖ ОТКАЗАЛ, но не назвал подложное имя — отказ не по делу:" - printf '%s\n' "$out" >&2 - exit 1 ;; - esac - echo "подлог именем: сторож покраснел и назвал имя — видит." - - if ! command -v strip >/dev/null 2>&1; then - err "ЧАСТЬ САМОПРОВЕРКИ НЕ СНЯТА: нет strip, подлог снятой таблицей имён не сделан." - err "Пропуск не есть пройденная проверка." - exit 2 - fi - if ! cp "$bin" "$work/stripped" || ! strip "$work/stripped" 2>/dev/null; then - cannot_check "снять таблицу имён с копии двоичного не удалось" - fi - - out=$(FLANG_BINARY_UNKNOWN_OK= FLANG_BINARY_ORIGIN_NO_MEMORY=1 FLANG_BINARY= \ - FLANG_BIN="$work/stripped" sh "$0" 2>&1) && code=0 || code=$? - if [ "$code" != 3 ]; then - err "СТОРОЖ СЛЕП: на двоичном со снятой таблицей имён он ответил кодом $code вместо 3." - printf '%s\n' "$out" >&2 - exit 1 - fi - echo "подлог пустотой: сторож отказал кодом 3, а не зазеленел, — видит." - exit 0 -fi - - -# ── Память ответа ─────────────────────────────────────────────────────────── -remember_key() { - cat "$ROOT/bootstrap/compiler_flang.c" "$ROOT/bootstrap/compiler_flang.h" \ - "$ROOT/bootstrap/flang_cli.c" "$ROOT/bootstrap/flang_repl.c" \ - "$ROOT/bootstrap/flang_runtime.c" "$ROOT/bootstrap/flang_runtime.h" > "$1/seed-whole" - printf '%s %s %s %s %s\n' "$2" "$(fingerprint "$bin")" "$(fingerprint "$1/seed-whole")" \ - "$(fingerprint "$0")" "$("${CC:-cc}" --version 2>/dev/null | head -1)" - rm -f "$1/seed-whole" -} - -memory='' -if [ -n "${FLANG_BINARY_ORIGIN_NO_MEMORY:-}" ]; then - memory='' -elif git_dir=$(cd "$ROOT" && git rev-parse --git-dir 2>/dev/null); then - case $git_dir in - /*) memory=$git_dir/binary-origin.checked ;; - *) memory=$ROOT/$git_dir/binary-origin.checked ;; - esac -fi - -remembered() { - [ -n "$memory" ] && [ -f "$memory" ] && grep -qxF "$1" "$memory" -} - -remember() { - [ -n "$memory" ] || return 0 - mine=$(fingerprint "$0") - if { - if [ -f "$memory" ]; then - awk -v mine="$mine" '$4 == mine' "$memory" | grep -vxF "$1" || true - fi - printf '%s\n' "$1" - } > "$memory.tmp" 2>/dev/null - then - mv "$memory.tmp" "$memory" 2>/dev/null || rm -f "$memory.tmp" - else - rm -f "$memory.tmp" - fi - return 0 -} - -# `exec` подменяет процесс, и ловушка EXIT уже не сработает: убираем сами. -run_and_leave() { - work_dir=$1; shift - if [ -n "$work_dir" ]; then rm -rf "$work_dir"; fi - trap - EXIT INT TERM HUP - exec "$@" -} - -# ── ТОЧНАЯ СВЕРКА ─────────────────────────────────────────────────────────── -if [ "$exact" = 1 ]; then - command -v make >/dev/null 2>&1 || cannot_check "нет make — пересобрать нечем" - command -v "${CC:-cc}" >/dev/null 2>&1 || cannot_check "нет ${CC:-cc} — пересобрать нечем" - - work=$(mktemp -d "${TMPDIR:-/tmp}/binary-origin.XXXXXX") || cannot_check "не завёлся временный каталог" - trap 'rm -rf "$work"' EXIT INT TERM HUP - - # В bootstrap/ ничего не пишется даже временно: он и есть предмет сверки. - stamp=$(remember_key "$work" побайтово) - cc_id=$("${CC:-cc}" --version 2>/dev/null | head -1) - if remembered "$stamp"; then - if [ $# -gt 0 ]; then run_and_leave "$work" "$@"; fi - exit 0 - fi - - cp "$ROOT/bootstrap/Makefile" "$work/" 2>/dev/null || cannot_check "нет bootstrap/Makefile" - for f in $SEED_FILES; do - cp "$ROOT/bootstrap/$f" "$work/" - done - if ! (cd "$work" && make -j"$(cores)" >"$work/build.log" 2>&1); then - err "сборка из семени не прошла — вот её конец:" - tail -20 "$work/build.log" >&2 - cannot_check "собрать компилятор из bootstrap/ этого дерева не удалось" - fi - - if cmp -s "$work/flang" "$bin"; then - remember "$stamp" - if [ $# -gt 0 ]; then run_and_leave "$work" "$@"; fi - exit 0 - fi - - err "ОТКАЗЫВАЮСЬ СУДИТЬ: двоичный не собирается из семени этого дерева: $what" - err "" - err " двоичный в дереве: $(fingerprint "$bin") $(bytes "$bin") байт" - err " сборка из семени: $(fingerprint "$work/flang") $(bytes "$work/flang") байт" - err " собрано: ${CC:-cc} — $cc_id" - err "" - err "Это тот же случай, что 23 августа 2026: в двадцати рабочих копиях лежал" - err "двоичный, собранный из невлитых веток. Отличий не было видно ни в номере" - err "версии, ни в печатных строках — только в коде." - err "" - err "Чинится одним из двух:" - err " * пересобрать двоичный из дерева: make -C bootstrap" - err " * или закоммитить то, из чего он на самом деле собран." - err "" - err "Судить всё равно, зная это: $BYPASS=1 <та же команда>" - exit 1 -fi - -# ── БЫСТРАЯ СВЕРКА ────────────────────────────────────────────────────────── -command -v readelf >/dev/null 2>&1 || cannot_check "нет readelf — имена из двоичного взять нечем. -Точная сверка readelf не требует: sh scripts/seed/binary-origin.sh --точно" - -# Имена, которые кладёт не компилятор flang, а компоновщик и запуск программы. -LINKER_NAMES='_DYNAMIC -_GLOBAL_OFFSET_TABLE_ -_IO_stdin_used -__FRAME_END__ -__TMC_END__ -__abi_tag -__do_global_dtors_aux -__do_global_dtors_aux_fini_array_entry -__dso_handle -__frame_dummy_init_array_entry -_fini -_init -_start -completed -deregister_tm_clones -frame_dummy -register_tm_clones' - -work=$(mktemp -d "${TMPDIR:-/tmp}/binary-origin.XXXXXX") || cannot_check "не завёлся временный каталог" -trap 'rm -rf "$work"' EXIT INT TERM HUP - -stamp=$(remember_key "$work" поименно) -if remembered "$stamp"; then - if [ $# -gt 0 ]; then run_and_leave "$work" "$@"; fi - exit 0 -fi - -readelf -SW "$bin" 2>/dev/null | grep -q '[[:space:]]\.symtab[[:space:]]' \ - || cannot_check "у двоичного снята таблица имён (.symtab) — сверять по именам нечего. -Пустота не есть совпадение. Побайтовая сверка это переживёт: - sh scripts/seed/binary-origin.sh --точно" - -readelf -sW "$bin" 2>/dev/null | awk ' - /^Symbol table/ { ours = ($0 ~ /\.symtab/); next } - function base(n, prev) { - do { - prev = n - sub(/\.(lto_priv|isra|constprop|part|cold|localalias)(\.[0-9]+)?$/, "", n) - sub(/\.[0-9]+$/, "", n) - } while (n != prev) - return n - } - ours && ($4 == "FUNC" || $4 == "OBJECT") && $7 != "UND" && $8 != "" { - n = $8; sub(/@.*/, "", n) - if (n != "") print base(n) - } -' | sort -u > "$work/binary-names" - -[ -s "$work/binary-names" ] || cannot_check "в таблице имён двоичного нет ни одного -определённого имени — читать нечего. Побайтовая сверка это переживёт: - sh scripts/seed/binary-origin.sh --точно" - -grep -h -o '[A-Za-z_][A-Za-z0-9_]*' \ - "$ROOT/bootstrap/compiler_flang.c" "$ROOT/bootstrap/compiler_flang.h" \ - "$ROOT/bootstrap/flang_cli.c" "$ROOT/bootstrap/flang_repl.c" \ - "$ROOT/bootstrap/flang_runtime.c" "$ROOT/bootstrap/flang_runtime.h" \ - | sort -u > "$work/seed-names" - -printf '%s\n' "$LINKER_NAMES" | sort -u > "$work/linker-names" -sort -u -m "$work/seed-names" "$work/linker-names" > "$work/known-names" -comm -23 "$work/binary-names" "$work/known-names" > "$work/foreign-names" - -n=$(wc -l < "$work/foreign-names" | tr -d ' ') -if [ "$n" = 0 ]; then - remember "$stamp" - if [ $# -gt 0 ]; then run_and_leave "$work" "$@"; fi - exit 0 -fi - -err "ОТКАЗЫВАЮСЬ СУДИТЬ: в двоичном есть код, которого нет в семени: $what" -err "" -err " двоичный: $bin" -err " отпечаток: $(fingerprint "$bin"), $(bytes "$bin") байт" -err "" -err "Имён, которых нет ни в bootstrap/*.c, ни в bootstrap/*.h: $n" -sed 's/^/ • /' "$work/foreign-names" | head -12 >&2 -if [ "$n" -gt 12 ]; then err " …и ещё $((n - 12))"; fi -err "" -err "Двоичный собран не из этого семени. Причин ровно две, и обе чинятся:" -err "" -err " 1. Двоичный СВЕЖЕЕ семени: собран из правки, которой в bootstrap/ нет." -err " Ровно так 23 августа 2026 в двадцати рабочих копиях оказался" -err " компилятор из двух невлитых веток — и шесть суток судил язык с" -err " доказательствами. Чинится: закоммитить то, из чего он собран, или" -err " пересобрать из дерева." -err " 2. Двоичный ОТСТАЛ: семя перепечатали, а его не пересобрали." -err " Чинится: make -C bootstrap" -err "" -err "Какая из двух — видно по именам выше: имя из вашей же правки значит" -err "первое, десятки незнакомых имён семени — второе." -err "" -err "Побайтовая сверка (около 65 с): sh scripts/seed/binary-origin.sh --точно" -err "Судить всё равно, зная это: $BYPASS=1 <та же команда>" -exit 1 diff --git a/scripts/seed/build-ledger-binary.fscript b/scripts/seed/build-ledger-binary.fscript new file mode 100644 index 000000000..0abb0ee93 --- /dev/null +++ b/scripts/seed/build-ledger-binary.fscript @@ -0,0 +1,323 @@ +модуль «Build ledger binary» + использует «Rules» из "../rules.fscript" + использует «Inquiry» из "../inquiry.fscript" + использует «Reading» из "../reading.fscript" + использует «Lists» только «Соединить списки» + +объект «Outcome» + «code»: число + «words»: строка + +тотальная функция «Root» + возвращает строка + "../.." + +тотальная функция «Printed files» + возвращает список строки + ["compiler_flang.c", "compiler_flang.h", "Makefile"] + +тотальная функция «Runtime files» + возвращает список строки + ["flang_cli.c", "flang_repl.c", "flang_runtime.c", "flang_runtime.h"] + +тотальная функция «Root path» + принимает answers: список «Answer» + возвращает строка + «First line» от («Output of» от "root path" и answers) + +тотальная функция «Target» + принимает answers: список «Answer» + возвращает строка + разбор («Given of» от "arguments" и answers) + случай пусто + то соединить [(«Root path» от answers), "-ledger-binary"] по "" + случай голова и хвост + то голова + +тотальная функция «Commit» + принимает answers: список «Answer» + возвращает строка + «Setting of» от "commit" и "" и answers + +тотальная функция «Full commit» + принимает answers: список «Answer» + возвращает строка + «First line» от («Output of» от "full commit" и answers) + +тотальная функция «Seed directory» + принимает answers: список «Answer» + возвращает строка + если пусто («Commit» от answers) + то соединить [(«Root path» от answers), "/bootstrap"] по "" + иначе соединить [(«Target» от answers), "/.from-commit/bootstrap"] по "" + +тотальная функция «Runtime directory» + принимает answers: список «Answer» + возвращает строка + если пусто («Commit» от answers) + то соединить [(«Root path» от answers), "/flang/src/emit/c"] по "" + иначе соединить [(«Target» от answers), "/.from-commit/emit-c"] по "" + +тотальная функция «Setup» + возвращает список «Question» + [(«Arguments» от "arguments"), + («Environment» от "jobs" и "J"), + («Environment» от "commit" и "FLANG_SEED_COMMIT"), + («Environment» от "compiler" и "CC"), + («Run from» от "root path" и («Root») и "pwd" и пустой список)] + +тотальная функция «Resolve» + принимает answers: список «Answer» + возвращает список «Question» + если пусто («Commit» от answers) + то пустой список + иначе [(«Run from» от "full commit" и («Root») и "git" и ["rev-parse", "--verify", (соединить [(«Commit» от answers), "^{commit}"] по "")])] + +тотальная функция «Show» + принимает source: строка, directory: строка, file: строка, answers: список «Answer» + возвращает «Question» + «Run from» от (соединить ["show ", directory, "/", file] по "") и («Root») и "sh" и ["-c", "git show \"$0\" > \"$1\"", (соединить [(«Full commit» от answers), ":", source, "/", file] по ""), (соединить [directory, "/", file] по "")] + +тотальная функция «Fetch» + принимает answers: список «Answer» + возвращает список «Question» + если пусто («Commit» от answers) + то пустой список + иначе «Gathered» от [[(«Run» от "directories" и "mkdir" и ["-p", («Seed directory» от answers), («Runtime directory» от answers)])], + (отобразить («Соединить списки» от («Printed files») и («Runtime files»)) как file → «Show» от "bootstrap" и («Seed directory» от answers) и file и answers), + (отобразить («Runtime files») как file → «Show» от "flang/src/emit/c" и («Runtime directory» от answers) и file и answers)] + +тотальная функция «Needed files» + принимает answers: список «Answer» + возвращает список строки + «Соединить списки» от (отобразить («Соединить списки» от («Printed files») и («Runtime files»)) как file → соединить [(«Seed directory» от answers), "/", file] по "") и (отобразить («Runtime files») как file → соединить [(«Runtime directory» от answers), "/", file] по "") + +тотальная функция «Presence» + принимает answers: список «Answer» + возвращает список «Question» + отобразить («Needed files» от answers) как path → «Run» от (соединить ["present ", path] по "") и "test" и ["-f", path] + +тотальная функция «Headers» + принимает answers: список «Answer» + возвращает список «Question» + «Gathered» от [[(«Run» от "target" и "mkdir" и ["-p", («Target» от answers)]), + («Run» от "printed" и "cp" и («Соединить списки» от (приписать "-p" к (отобразить («Printed files») как file → соединить [(«Seed directory» от answers), "/", file] по "")) и [(«Target» от answers)]))], + (отобразить («Runtime files») как file → «Run» от (соединить ["header ", file] по "") и "grep" и ["-n", "-m1", "^/\\* SPDX-FileCopyrightText", (соединить [(«Seed directory» от answers), "/", file] по "")])] + +тотальная функция «Header length» + принимает file: строка, answers: список «Answer» + возвращает число + («Count» от («Leading digits» от («Output of» от (соединить ["header ", file] по "") и answers))) минус 1 + +тотальная функция «Assemble» + принимает file: строка, answers: список «Answer» + возвращает список «Question» + [(«Run» от (соединить ["assemble ", file] по "") и "sh" и ["-c", "{ head -n \"$0\" \"$1\"; cat \"$2\"; } > \"$3\"", (к строке («Header length» от file и answers)), (соединить [(«Seed directory» от answers), "/", file] по ""), (соединить [(«Runtime directory» от answers), "/", file] по ""), (соединить [(«Target» от answers), "/", file] по "")]), + («Run» от (соединить ["ahead ", file] по "") и "sh" и ["-c", "diff \"$0\" \"$1\" | grep -c \"^[<>]\"", (соединить [(«Seed directory» от answers), "/", file] по ""), (соединить [(«Target» от answers), "/", file] по "")])] + +тотальная функция «Assembly» + принимает answers: список «Answer» + возвращает список «Question» + «Gathered» от (отобразить («Runtime files») как file → «Assemble» от file и answers) + +тотальная функция «Jobs» + принимает answers: список «Answer» + возвращает строка + «Setting of» от "jobs" и "8" и answers + +тотальная функция «Build» + принимает answers: список «Answer» + возвращает список «Question» + [(«Run» от "build" и "make" и ["-C", («Target» от answers), (соединить ["-j", («Jobs» от answers)] по ""), (соединить ["CC=", («Setting of» от "compiler" и "cc" и answers)] по "")])] + +тотальная функция «Built» + принимает answers: список «Answer» + возвращает строка + соединить [(«Target» от answers), "/flang"] по "" + +тотальная функция «Measure» + принимает answers: список «Answer» + возвращает список «Question» + [(«Run» от "size" и "wc" и ["-c", («Built» от answers)]), + («Run» от "sum" и "md5sum" и [(«Built» от answers)]), + («Run» от "version" и («Built» от answers) и ["--version"]), + («Run» от "library" и "test" и ["-d", (соединить [(«Target» от answers), "/../flang/stdlib"] по "")])] + +тотальная функция «Failed» + принимает name: строка, answers: список «Answer» + возвращает признак + не ((«Exit code of» от name и answers) равен 0) + +тотальная функция «Not built» + принимает words: список строки + возвращает список «Outcome» + разбор words + случай пусто + то пустой список + случай голова и хвост + то [запись «Outcome» с «code» равным 3 и «words» равным голова] + +тотальная функция «Commit troubles» + принимает answers: список «Answer» + возвращает список строки + если (пусто («Commit» от answers)) или (не («Failed» от "full commit" и answers)) + то пустой список + иначе [(соединить ["коммита ", («Commit» от answers), " в дереве нет"] по "")] + +тотальная функция «Fetch troubles» + принимает answers: список «Answer» + возвращает список строки + если пусто («Commit» от answers) + то пустой список + иначе отобразить (отфильтровать («Needed files» от answers) где path → «Failed» от (соединить ["show ", path] по "") и answers) как path → соединить ["в коммите ", («Full commit» от answers), " нет файла для ", path] по "" + +тотальная функция «Presence troubles» + принимает answers: список «Answer» + возвращает список строки + отобразить (отфильтровать («Needed files» от answers) где path → «Failed» от (соединить ["present ", path] по "") и answers) как path → соединить ["нет ", path, " — дерево не то"] по "" + +тотальная функция «Header troubles» + принимает answers: список «Answer» + возвращает список строки + отобразить (отфильтровать («Runtime files») где file → («Header length» от file и answers) меньше 0) как file → соединить ["в ", («Seed directory» от answers), "/", file, " нет строки SPDX — границы шапки не найти"] по "" + +тотальная функция «Build outcomes» + принимает answers: список «Answer» + возвращает список «Outcome» + если «Failed» от "build" и answers + то [запись «Outcome» с «code» равным 1 и «words» равным (соединить [(соединить («Progress» от answers) по "\n"), («Output of» от "build" и answers), («Errors of» от "build" и answers), (соединить ["сборка в ", («Target» от answers), " не прошла: make ответил кодом ", (к строке («Exit code of» от "build" и answers))] по "")] по "\n")] + иначе пустой список + +тотальная функция «Settled» + принимает stages: число, answers: список «Answer» + возвращает список «Outcome» + «Chosen» от [(«When» от (stages равен 6) и («Not built» от («Commit troubles» от answers))), + («When» от (stages равен 5) и («Not built» от («Fetch troubles» от answers))), + («When» от (stages равен 4) и («Not built» от («Presence troubles» от answers))), + («When» от (stages равен 3) и («Not built» от («Header troubles» от answers))), + («When» от (stages равен 1) и («Build outcomes» от answers))] и (пустой список) + +тотальная функция «Stage» + принимает stages: число, answers: список «Answer» + возвращает список «Question» + «Chosen» от [(«When» от (stages равен 7) и («Setup»)), + («When» от (stages равен 6) и («Resolve» от answers)), + («When» от (stages равен 5) и («Fetch» от answers)), + («When» от (stages равен 4) и («Presence» от answers)), + («When» от (stages равен 3) и («Headers» от answers)), + («When» от (stages равен 2) и («Assembly» от answers)), + («When» от (stages равен 1) и («Build» от answers))] и («Measure» от answers) + +тотальная функция «Padded» + принимает name: строка, width: число + возвращает строка + пример «A short name is padded with spaces» + дано name равно "flang_cli.c" + дано width равно 18 + ожидается "flang_cli.c " + пример «A long name stays itself» + дано name равно "flang_runtime_header.h" + дано width равно 18 + ожидается "flang_runtime_header.h" + если (длина name) не меньше width + то name + иначе соединить [name, (подстрока " " с 1 по (width минус (длина name)))] по "" + +тотальная функция «Ahead» + принимает file: строка, answers: список «Answer» + возвращает число + «Count» от («First line» от («Output of» от (соединить ["ahead ", file] по "") и answers)) + +тотальная функция «Progress» + принимает answers: список «Answer» + возвращает список строки + «Gathered words» от [(если пусто («Commit» от answers) то пустой список иначе [(соединить ["семя и рантайм взяты из коммита ", («Full commit» от answers)] по "")]), + (отобразить («Runtime files») как file → соединить ["рантайм ", («Padded» от file и 18), " дерево обгоняет семя на ", (к строке («Ahead» от file и answers)), " строк"] по ""), + (если (длина (отфильтровать («Runtime files») где file → («Ahead» от file и answers) больше 0)) равен 0 то ["рантайм дерева и рантайм семени СОВПАЛИ: этот двоичный будет равен bootstrap/flang"] иначе пустой список)] + +тотальная функция «Library warning» + принимает answers: список «Answer» + возвращает список строки + если не («Failed» от "library" и answers) + то пустой список + иначе ["", + "ВНИМАНИЕ: этот двоичный НЕ ВИДИТ библиотеку дерева.", + (соединить [" он ищет её в ", («Target» от answers), "/../flang/stdlib — а её там нет"] по ""), + " собранным так двоичным ведомость снимать НЕЛЬЗЯ: он ответит", + " «FLANG_NOT_TOTAL: … вызывает неизвестную функцию …» на здоровом файле,", + " и отказ будет выглядеть долгом автора, а не бедой раскладки.", + "", + " Как снимать ведомость: положите двоичный ВНУТРЬ дерева и зовите оттуда", + (соединить [" mkdir -p ", («Root path» от answers), "/build-ledger"] по ""), + (соединить [" cp -p ", («Target» от answers), "/flang ", («Target» от answers), "/flang_runtime.h ", («Root path» от answers), "/build-ledger/"] по ""), + (соединить [" ", («Root path» от answers), "/build-ledger/flang check <файл> --proof --json"] по ""), + " Каталог build-ledger — временный: уберите его перед коммитом, иначе", + " сторож раскладки покажет лишний каталог в корне."] + +тотальная функция «Spoken» + принимает text: строка + возвращает список строки + пример «The last line end is not a line of its own» + дано text равно "cc -c a.c\n\ncc -o flang\n" + ожидается ["cc -c a.c", "", "cc -o flang"] + пример «No text, no lines» + дано text равно "" + ожидается пустой список + если пусто text + то пустой список + иначе разделить (если «Ends with» от text и "\n" то (подстрока text с 1 по ((длина text) минус 1)) иначе text) по "\n" + +тотальная функция «Report» + принимает answers: список «Answer» + возвращает строка + соединить («Gathered words» от [(«Progress» от answers), + («Spoken» от («Output of» от "build" и answers)), + («Spoken» от («Errors of» от "build" и answers)), + ["", + (соединить ["двоичный: ", («Built» от answers)] по ""), + (соединить ["размер: ", («Word» от 1 и («Output of» от "size" и answers)), " байт"] по ""), + (соединить ["md5: ", («Word» от 1 и («Output of» от "sum" и answers))] по "")], + («Spoken» от («Output of» от "version" и answers)), + («Library warning» от answers)]) по "\n" + +тотальная функция «Ending» + принимает outcome: «Outcome» + возвращает «Продолжение» + пример «Code one is a build that did not pass» + дано outcome равно запись «Outcome» с «code» равным 1 и «words» равным "сборка не прошла" + ожидается вариант «Провал» с код равным "FLANG_LEDGER_BINARY_NOT_BUILT" и сообщение равным "сборка не прошла" + пример «Any other code means there was nothing to build from» + дано outcome равно запись «Outcome» с «code» равным 3 и «words» равным "дерево не то" + ожидается вариант «Не проверено» с код равным "FLANG_LEDGER_BINARY_NO_SOURCE" и сообщение равным "дерево не то" + если (outcome.«code») равен 1 + то вариант «Провал» с код равным "FLANG_LEDGER_BINARY_NOT_BUILT" и сообщение равным (outcome.«words») + иначе вариант «Не проверено» с код равным "FLANG_LEDGER_BINARY_NO_SOURCE" и сообщение равным (outcome.«words») + +тотальная функция «Proceed» + принимает queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + разбор queue + случай голова и хвост + то «Ask» от (голова) и (хвост) и stages и answers + случай пусто + то разбор («Settled» от stages и answers) + случай голова и хвост + то «Ending» от (голова) + случай пусто + то если stages не больше 0 + то вариант «Конец работы» с значение равным («Report» от answers) + иначе «Proceed» от («Stage» от (stages минус 1) и answers) и (stages минус 1) и answers + +тотальная функция «Begin» + возвращает «Inquiry» + «Begin with» от 8 + +тотальная функция «Next» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает «Продолжение» + «Proceed» от (inquiry.«queue») и (inquiry.«stages») и («Heard» от inquiry и reply) + +план «Build» + состояние «Inquiry» + начинает с «Begin» + обрабатывает «Next» diff --git a/scripts/seed/build-ledger-binary.sh b/scripts/seed/build-ledger-binary.sh deleted file mode 100755 index 1a1b55fe6..000000000 --- a/scripts/seed/build-ledger-binary.sh +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/sh -# SPDX-FileCopyrightText: 2026 Digitable (Marat Zimnurov) -# SPDX-License-Identifier: BSD-2-Clause -# -# Двоичный для ведомости: напечатанное семя дословно плюс рантайм дерева -# (flang/src/emit/c) под шапкой семени. Ведомость им снимают только из каталога -# ВНУТРИ дерева: соседний каталог не видит flang/stdlib (сказано вслух в конце). -# -# Как звать: sh scripts/seed/build-ledger-binary.sh [каталог сборки] -# умолчание — <дерево>-ledger-binary; CC (cc), J (8) — чем собирать и число -# заданий make; KOMMIT=<коммит> — собрать по названному коммиту, а не по -# рабочей копии (условие воспроизводимости числа). -# -# Коды: 0 — собрано; 2 — коммита или файлов семени/рантайма нет; 3 — в семени нет -# строки SPDX, границы шапки не найти; иначе — код make. -# см. docs/zettel/a-ledger-binary-beside-the-tree-cannot-see-the-library-and-blames-the-author.md -set -eu - -koren=$(CDPATH= cd -- "$(dirname -- "$0")/../.." && pwd) -kuda=${1:-$koren-ledger-binary} -zadaniy=${J:-8} - -semya=$koren/bootstrap -runtime=$koren/flang/src/emit/c -iz_semeni='compiler_flang.c compiler_flang.h Makefile' -iz_dereva='flang_cli.c flang_repl.c flang_runtime.c flang_runtime.h' - -if [ -n "${KOMMIT:-}" ]; then - polnyy=$(cd "$koren" && git rev-parse --verify "$KOMMIT^{commit}") || { - echo "коммита $KOMMIT в дереве нет" >&2; exit 2; } - semya=$kuda/.iz-kommita/bootstrap - runtime=$kuda/.iz-kommita/emit-c - mkdir -p "$semya" "$runtime" - for name in $iz_semeni $iz_dereva; do - (cd "$koren" && git show "$polnyy:bootstrap/$name") > "$semya/$name" - done - for name in $iz_dereva; do - (cd "$koren" && git show "$polnyy:flang/src/emit/c/$name") > "$runtime/$name" - done - echo "семя и рантайм взяты из коммита $polnyy" -fi - -for name in $iz_semeni $iz_dereva; do - test -f "$semya/$name" || { echo "нет $semya/$name — дерево не то" >&2; exit 2; } -done -for name in $iz_dereva; do - test -f "$runtime/$name" || { echo "нет $runtime/$name — дерево не то" >&2; exit 2; } -done - -mkdir -p "$kuda" - -# ── 1. Напечатанный компилятор — из семени, побайтово ──────────────────────── -for name in $iz_semeni; do - cp -p "$semya/$name" "$kuda/$name" -done - -# ── 2. Рантайм — из дерева, но с ШАПКОЙ ИЗ СЕМЕНИ ──────────────────────────── -for name in $iz_dereva; do - stroka=$(sed -n '/^\/\* SPDX-FileCopyrightText/=' "$semya/$name" | head -1) - test -n "$stroka" || { echo "в $semya/$name нет строки SPDX — границы шапки не найти" >&2; exit 3; } - shapka=$((stroka - 1)) - { - if [ "$shapka" -gt 0 ]; then head -n "$shapka" "$semya/$name"; fi - cat "$runtime/$name" - } > "$kuda/$name" -done - -# ── 3. Сказать вслух, что приём сегодня добавляет ──────────────────────────── -raznica=0 -for name in $iz_dereva; do - skolko=$(diff "$semya/$name" "$kuda/$name" | grep -c '^[<>]' || true) - raznica=$((raznica + skolko)) - printf 'рантайм %-18s дерево обгоняет семя на %s строк\n' "$name" "$skolko" -done -if [ "$raznica" -eq 0 ]; then - echo 'рантайм дерева и рантайм семени СОВПАЛИ: этот двоичный будет равен bootstrap/flang' -fi - -make -C "$kuda" -j"$zadaniy" CC="${CC:-cc}" - -echo -echo "двоичный: $kuda/flang" -echo "размер: $(stat -c%s "$kuda/flang") байт" -echo "md5: $(md5sum "$kuda/flang" | cut -d' ' -f1)" -"$kuda/flang" --version - -# ── 4. Видит ли этот двоичный библиотеку дерева ────────────────────────────── -if [ ! -d "$kuda/../flang/stdlib" ]; then - echo - echo 'ВНИМАНИЕ: этот двоичный НЕ ВИДИТ библиотеку дерева.' - echo " он ищет её в $kuda/../flang/stdlib — а её там нет" - echo ' собранным так двоичным ведомость снимать НЕЛЬЗЯ: он ответит' - echo ' «FLANG_NOT_TOTAL: … вызывает неизвестную функцию …» на здоровом файле,' - echo ' и отказ будет выглядеть долгом автора, а не бедой раскладки.' - echo - echo ' Как снимать ведомость: положите двоичный ВНУТРЬ дерева и зовите оттуда' - echo " mkdir -p $koren/build-ledger" - echo " cp -p $kuda/flang $kuda/flang_runtime.h $koren/build-ledger/" - echo " $koren/build-ledger/flang check <файл> --proof --json" - echo ' Каталог build-ledger — временный: уберите его перед коммитом, иначе' - echo ' сторож раскладки покажет лишний каталог в корне.' -fi diff --git a/scripts/seed/new-binary-acceptance.fscript b/scripts/seed/new-binary-acceptance.fscript new file mode 100644 index 000000000..84703c0a2 --- /dev/null +++ b/scripts/seed/new-binary-acceptance.fscript @@ -0,0 +1,374 @@ +модуль «New binary acceptance» + использует «Rules» из "../rules.fscript" + использует «Inquiry» из "../inquiry.fscript" + использует «Reading» из "../reading.fscript" + использует «Lists» только «Соединить списки» + +объект «Sign» + «lines»: список строки + «troubles»: число + +тотальная функция «Root» + возвращает строка + "../.." + +тотальная функция «Print log» + возвращает строка + "/srv/work/semya5.log" + +тотальная функция «Tree» + принимает answers: список «Answer» + возвращает строка + разбор («Given of» от "arguments" и answers) + случай пусто + то "/srv/flang-rabota/u-semya5" + случай голова и хвост + то голова + +тотальная функция «Binary» + принимает answers: список «Answer» + возвращает строка + соединить [(«Tree» от answers), "/bootstrap/flang"] по "" + +тотальная функция «Root path» + принимает answers: список «Answer» + возвращает строка + «First line» от («Output of» от "root path" и answers) + +тотальная функция «Gate» + принимает answers: список «Answer» + возвращает строка + «Setting of» от "gate" и "/srv/flang-rabota/vorota/flang-vorota" и answers + +тотальная функция «Merged» + принимает name: строка, arguments: список строки + возвращает «Question» + пример «Both streams of the child go into one» + дано name равно "version" + дано arguments равно ["/tree/bootstrap/flang", "--version"] + ожидается запись «Question» с «name» равным "version" и «order» равным (вариант «Запустить процесс» с программа равным "sh" и аргументы равным ["-c", "exec \"$@\" 2>&1", "sh", "/tree/bootstrap/flang", "--version"]) + «Run» от name и "sh" и (приписать "-c" к (приписать "exec \"$@\" 2>&1" к (приписать "sh" к arguments))) + +тотальная функция «Through gate» + принимает name: строка, memory: строка, arguments: список строки, answers: список «Answer» + возвращает «Question» + «Merged» от name и («Соединить списки» от ["env", (соединить ["PAMYAT=", memory] по ""), "timeout", "900", («Gate» от answers), "--", («Binary» от answers), "check"] и arguments) + +тотальная функция «Setup» + возвращает список «Question» + [(«Arguments» от "arguments"), + («Environment» от "gate" и "FLANG_GATE"), + («Run from» от "root path" и («Root») и "pwd" и пустой список)] + +тотальная функция «Print end» + принимает answers: список «Answer» + возвращает список «Question» + [(«Run» от "log end" и "tail" и ["-5", («Print log»)]), + («Run» от "reprint runs" и "pgrep" и ["-f", "scripts/bootstrap-reprint\\.sh"]), + («Run» от "binary runs" и "test" и ["-x", («Binary» от answers)])] + +тотальная функция «Samples» + принимает answers: список «Answer» + возвращает список строки + [(соединить [(«Tree» от answers), "/flang/self/interpret.flang"] по ""), (соединить [(«Root path» от answers), "/flang/self/interpret.flang"] по "")] + +тотальная функция «Signs» + принимает answers: список «Answer» + возвращает список «Question» + «Соединить списки» от [(«Merged» от "version" и [(«Binary» от answers), "--version"]), + («Run» от "names" и "sh" и ["-c", "nm -a \"$0\" 2>/dev/null | grep -o \"compiler_flang_[a-z_]*konkurentnost[a-z_]*\" | sort -u", («Binary» от answers)]), + («Run» от "condition" и "grep" и ["-c", "ПРИ УСЛОВИИ", (соединить [(«Tree» от answers), "/bootstrap/compiler_flang.c"] по "")]), + («Run» от "progress line" и "sh" и ["-c", "strings \"$0\" 2>/dev/null | grep -c \"шагов .* из .*, идёт\"", («Binary» от answers)]), + («Through gate» от "kernel rules" и "45G" и [(соединить [(«Root path» от answers), "/scripts/seed/new-binary-acceptance-probe.flang"] по ""), "--proof"] и answers)] и (отобразить («Samples» от answers) как sample → «Run» от (соединить ["sample ", sample] по "") и "grep" и ["-c", "Узел хеша» от", sample]) + +тотальная функция «Sample» + принимает answers: список «Answer» + возвращает строка + «First line» от (соединить (отфильтровать («Samples» от answers) где sample → («Count» от («First line» от («Output of» от (соединить ["sample ", sample] по "") и answers))) больше 0) по "\n") + +тотальная функция «Live runs» + принимает answers: список «Answer» + возвращает список «Question» + «Соединить списки» от (если пусто («Sample» от answers) то пустой список иначе [(«Through gate» от "fresh types" и "60G" и [(«Sample» от answers)] и answers)]) и [(«Through gate» от "live file" и "45G" и [(соединить [(«Tree» от answers), "/flang/stdlib/hashmap.flang"] по ""), "--proof"] и answers)] + +тотальная функция «Stage» + принимает stages: число, answers: список «Answer» + возвращает список «Question» + «Chosen» от [(«When» от (stages равен 3) и («Setup»)), + («When» от (stages равен 2) и («Print end» от answers)), + («When» от (stages равен 1) и («Signs» от answers))] и («Live runs» от answers) + +тотальная функция «Raw lines» + принимает text: строка + возвращает список строки + пример «The last line end is not a line of its own» + дано text равно "one\n\ntwo\n" + ожидается ["one", "", "two"] + пример «No text, no lines» + дано text равно "" + ожидается пустой список + если пусто text + то пустой список + иначе разделить (если «Ends with» от text и "\n" то (подстрока text с 1 по ((длина text) минус 1)) иначе text) по "\n" + +тотальная функция «Without leading» + принимает lines: список строки, amount: число + возвращает список строки + пример «Without the first of three» + дано lines равно ["one", "two", "three"] + дано amount равно 1 + ожидается ["two", "three"] + разбор lines + случай пусто + то пустой список + случай голова и хвост + то если amount не больше 0 + то lines + иначе «Without leading» от хвост и (amount минус 1) + +тотальная функция «Last lines» + принимает lines: список строки, amount: число + возвращает список строки + пример «Two last of three» + дано lines равно ["one", "two", "three"] + дано amount равно 2 + ожидается ["two", "three"] + «Without leading» от lines и ((длина lines) минус amount) + +тотальная функция «Indented» + принимает lines: список строки + возвращает список строки + пример «Four spaces before every line» + дано lines равно ["one", ""] + ожидается [" one", " "] + отобразить lines как line → соединить [" ", line] по "" + +тотальная функция «Good» + принимает lines: список строки, words: строка + возвращает «Sign» + запись «Sign» с «lines» равным (добавить (соединить [" ✓ ", words] по "") к lines) и «troubles» равным 0 + +тотальная функция «Bad» + принимает lines: список строки, words: строка + возвращает «Sign» + запись «Sign» с «lines» равным (добавить (соединить [" ✗ ", words] по "") к lines) и «troubles» равным 1 + +тотальная функция «Heading» + принимает words: строка + возвращает список строки + пример «A heading follows an empty line» + дано words равно "ИТОГ" + ожидается ["", "=== ИТОГ"] + ["", (соединить ["=== ", words] по "")] + +тотальная функция «Print end lines» + принимает answers: список «Answer» + возвращает список строки + «Gathered words» от [(«Heading» от "ЧЕМ КОНЧИЛАСЬ ПЕЧАТЬ"), + (если («Exit code of» от "log end" и answers) равен 0 то («Raw lines» от («Output of» от "log end" и answers)) иначе [" журнала печати нет"]), + (если («Exit code of» от "reprint runs" и answers) равен 0 то ["", " ⚠ ПЕРЕПЕЧАТКА ЕЩЁ ИДЁТ — строки выше это шапка захода, а не его итог."] иначе пустой список)] + +тотальная функция «Nothing to accept» + принимает answers: список «Answer» + возвращает строка + соединить («Соединить списки» от («Print end lines» от answers) и ["", + (соединить ["ПРИЁМКА НЕ СОСТОЯЛАСЬ: двоичного нет — ", («Binary» от answers)] по ""), + "Ни одна примета не снята; это не «НЕ ПРИНЯТ», это «принимать нечего».", + "Приёмку звать после того, как перепечатка дошла И СЕМЯ СОБРАНО:", + (соединить [" make -C ", («Tree» от answers), "/bootstrap -j8 (минута, 1,05 ГиБ)"] по "")]) по "\n" + +тотальная функция «Gate troubles» + принимает name: строка, answers: список «Answer» + возвращает список строки + пусть code равно («Exit code of» от name и answers) + «Chosen» от [(«When» от (code равен 75) и (приписать "ворота не дали места (код 75) — ОТКАЗ ВОРОТ, а не приговор двоичному; повторить примету" к («Indented» от («Raw lines» от («Output of» от name и answers))))), + («When» от (code равен 124) и (["прогон не уложился в 900 с — примета НЕ СНЯТА, судить по ней нельзя"])), + («When» от ((code равен 127) или (code равен 126)) и ([(соединить ["ворот нет (", («Gate» от answers), ") — примета НЕ СНЯТА, судить по ней нельзя"] по "")]))] и (пустой список) + +тотальная функция «Refused by gate» + принимает lines: список строки, troubles: список строки + возвращает «Sign» + разбор troubles + случай пусто + то запись «Sign» с «lines» равным lines и «troubles» равным 0 + случай голова и хвост + то запись «Sign» с «lines» равным («Соединить списки» от (добавить (соединить [" ✗ ", голова] по "") к lines) и хвост) и «troubles» равным 1 + +тотальная функция «Names sign» + принимает answers: список «Answer» + возвращает «Sign» + пусть names равно («Lines» от («Output of» от "names" и answers)) + пусть lines равно («Соединить списки» от («Heading» от "ПРИМЕТА 1 — печать конкурентности в C") и (если (длина names) равен 0 то [" "] иначе («Indented» от names))) + если (длина (отфильтровать names где name → «Ends with» от name и "_c")) больше 0 + то «Good» от lines и "имя с «_c» есть" + иначе «Bad» от lines и "имени с «_c» НЕТ (было так же)" + +тотальная функция «Counted» + принимает name: строка, missing: строка, answers: список «Answer» + возвращает строка + пусть counted равно («First line» от («Output of» от name и answers)) + если пусто counted то missing иначе counted + +тотальная функция «Condition sign» + принимает answers: список «Answer» + возвращает «Sign» + пусть lines равно («Соединить списки» от («Heading» от "ПРИМЕТА 2 — вердикт «доказано ПРИ УСЛОВИИ»") и [(соединить [" вхождений: ", («Counted» от "condition" и "нет файла" и answers), " (было 0)"] по "")]) + если («Count» от («Counted» от "condition" и "0" и answers)) больше 0 + то «Good» от lines и "вердикт появился" + иначе «Bad» от lines и "вердикта НЕТ — все числа дерева остаются верхней оценкой" + +тотальная функция «Progress sign» + принимает answers: список «Answer» + возвращает «Sign» + пусть lines равно («Соединить списки» от («Heading» от "ПРИМЕТА 3 — строка хода") и [(соединить [" вхождений: ", («Counted» от "progress line" и "0" и answers), " (было 0)"] по "")]) + если («Count» от («Counted» от "progress line" и "0" и answers)) больше 0 + то «Good» от lines и "девятичасовая работа перестала быть слепой" + иначе «Bad» от lines и "строки хода НЕТ" + +тотальная функция «Last matching» + принимает lines: список строки + возвращает строка + пример «The last of the lines that count claims» + дано lines равно [" утверждений 2: доказано 1", "прочее", "утверждений 4: доказано 3, сетка 0"] + ожидается "утверждений 4: доказано 3, сетка 0" + пример «No such line» + дано lines равно ["прочее"] + ожидается "" + свёртка lines начиная с "" как last и line → если («Word» от 1 и line) равен "утверждений" то line иначе last + +тотальная функция «Proved» + принимает total: строка + возвращает строка + пример «The number of proved claims» + дано total равно " утверждений 4: доказано 3, сетка 0, объявлено, не доказано 1" + ожидается "3" + пример «A total of another shape» + дано total равно "утверждений нет" + ожидается "" + если (((«Word» от 1 и total) равен "утверждений") и притом ((«Word» от 3 и total) равен "доказано")) и притом ((«Word» от 2 и total) равен (соединить [(«Leading digits» от («Word» от 2 и total)), ":"] по "")) + то «Leading digits» от («Word» от 4 и total) + иначе "" + +тотальная функция «Rules judged» + принимает lines: список строки, proved: строка + возвращает «Sign» + пример «All four rules arrived» + дано lines равно пустой список + дано proved равно "4" + ожидается запись «Sign» с «lines» равным [" ✓ все четыре правила ядра доехали"] и «troubles» равным 0 + пример «No rule arrived» + дано lines равно пустой список + дано proved равно "0" + ожидается запись «Sign» с «lines» равным [" ✗ ни одно правило не заработало — семя не догнало исходники"] и «troubles» равным 1 + пример «No total at all» + дано lines равно пустой список + дано proved равно "" + ожидается запись «Sign» с «lines» равным [" ✗ проба не дала итога вовсе"] и «troubles» равным 1 + «Chosen» от [(«When» от (пусто proved) и («Bad» от lines и "проба не дала итога вовсе")), + («When» от (proved равен "0") и («Bad» от lines и "ни одно правило не заработало — семя не догнало исходники")), + («When» от (proved равен "4") и («Good» от lines и "все четыре правила ядра доехали"))] и («Good» от lines и (соединить ["правил ядра доехало ", proved, " из 4 — часть, как проба и допускает; какие именно, смотреть в ведомости"] по "")) + +тотальная функция «Rules sign» + принимает answers: список «Answer» + возвращает «Sign» + пусть heading равно («Heading» от "ПРИМЕТА 4 — правила ядра работают (прогон, а не таблица имён)") + пусть total равно («Last matching» от («Raw lines» от («Output of» от "kernel rules" и answers))) + если (длина («Gate troubles» от "kernel rules" и answers)) больше 0 + то «Refused by gate» от heading и («Gate troubles» от "kernel rules" и answers) + иначе «Rules judged» от («Соединить списки» от heading и [(соединить [" ", (если пусто total то "(итога нет)" иначе total)] по ""), " было: утверждений 4: доказано 0, сетка 0, объявлено, не доказано 4"]) и («Proved» от total) + +тотальная функция «Types judged» + принимает lines: список строки, said: список строки + возвращает «Sign» + пусть answer равно («First line» от (соединить (отфильтровать said где line → (line содержит "FLANG_TYPE_ARGS") или (line содержит "замечаний нет")) по "\n")) + пусть shown равно (добавить (соединить [" ", (если пусто answer то "(ответа нет)" иначе answer)] по "") к lines) + «Chosen» от [(«When» от (answer содержит "FLANG_TYPE_ARGS") и («Bad» от shown и "параметрические типы по-прежнему не понимает")), + («When» от (answer содержит "замечаний нет") и («Good» от shown и "читает"))] и (запись «Sign» с «lines» равным («Соединить списки» от (добавить " ✗ ответ не распознан — смотреть руками, вывод целиком выше" к shown) и («Indented» от («Last lines» от said и 3))) и «troubles» равным 1) + +тотальная функция «Types sign» + принимает answers: список «Answer» + возвращает «Sign» + пусть heading равно («Heading» от "ПРИМЕТА 5 — двоичный читает исходники со свежими типами") + пусть sample равно («Sample» от answers) + пусть shown равно (добавить (соединить [" образец: ", sample, " (", («First line» от («Output of» от (соединить ["sample ", sample] по "") и answers)), " вхождений параметрического типа)"] по "") к heading) + «Chosen» от [(«When» от (пусто sample) и («Bad» от heading и "проверить НЕЧЕМ: параметрического типа нет ни в дереве перепечатки, ни в дереве приёмки — примета не снята")), + («When» от ((длина («Gate troubles» от "fresh types" и answers)) больше 0) и («Refused by gate» от shown и («Gate troubles» от "fresh types" и answers)))] и («Types judged» от shown и («Raw lines» от («Output of» от "fresh types" и answers))) + +тотальная функция «Live judged» + принимает lines: список строки, said: список строки + возвращает «Sign» + пусть answer равно (соединить said по "\n") + пусть shown равно («Соединить списки» от lines и («Indented» от said)) + «Chosen» от [(«When» от ((answer содержит "FLANG_PROPERTY") или (answer содержит "FLANG_INTERNAL")) и («Bad» от shown и "падает — принимать НЕЛЬЗЯ")), + («When» от (answer содержит "утверждений") и («Good» от shown и "считает"))] и («Bad» от shown и "ответ не распознан") + +тотальная функция «Live sign» + принимает answers: список «Answer» + возвращает «Sign» + пусть heading равно («Heading» от "ПРИМЕТА 6 — не сломан на живом файле") + если (длина («Gate troubles» от "live file" и answers)) больше 0 + то «Refused by gate» от heading и («Gate troubles» от "live file" и answers) + иначе «Live judged» от heading и («Last lines» от («Raw lines» от («Output of» от "live file" и answers)) и 2) + +тотальная функция «All signs» + принимает answers: список «Answer» + возвращает список «Sign» + [(«Names sign» от answers), («Condition sign» от answers), («Progress sign» от answers), («Rules sign» от answers), («Types sign» от answers), («Live sign» от answers)] + +тотальная функция «Total» + принимает troubles: число + возвращает список строки + пример «No troubles: the binary is accepted» + дано troubles равно 0 + ожидается ["", "=== ИТОГ", " все приметы сошлись. Дальше: sh scripts/bootstrap-reprint.sh --bystro —", " сверить, что семя больше не отстаёт (было 41 расхождение).", " ⛔ Приёмная коммиты с bootstrap/** из веток ОТВЕРГАЕТ: семя кладётся", " в ствол не через неё. Спросить владельца приёмной, как именно."] + пример «Two troubles: the binary is not accepted» + дано troubles равно 2 + ожидается ["", "=== ИТОГ", " примет не сошлось: 2. Двоичный НЕ ПРИНЯТ."] + если troubles равен 0 + то «Соединить списки» от («Heading» от "ИТОГ") и [" все приметы сошлись. Дальше: sh scripts/bootstrap-reprint.sh --bystro —", " сверить, что семя больше не отстаёт (было 41 расхождение).", " ⛔ Приёмная коммиты с bootstrap/** из веток ОТВЕРГАЕТ: семя кладётся", " в ствол не через неё. Спросить владельца приёмной, как именно."] + иначе «Соединить списки» от («Heading» от "ИТОГ") и [(соединить [" примет не сошлось: ", (к строке troubles), ". Двоичный НЕ ПРИНЯТ."] по "")] + +тотальная функция «Verdict» + принимает signs: список «Sign», answers: список «Answer» + возвращает «Продолжение» + пусть troubles равно (свёртка signs начиная с 0 как counted и sign → counted плюс (sign.«troubles»)) + пусть words равно (соединить («Gathered words» от [(«Print end lines» от answers), ["", (соединить ["двоичный: ", («Binary» от answers)] по ""), («First line» от («Output of» от "version" и answers))], («Gathered words» от (отобразить signs как sign → sign.«lines»)), («Total» от troubles)]) по "\n") + если troubles равен 0 + то вариант «Конец работы» с значение равным words + иначе вариант «Провал» с код равным "FLANG_NEW_BINARY_NOT_ACCEPTED" и сообщение равным words + +тотальная функция «Absence» + принимает stages: число, answers: список «Answer» + возвращает список строки + если (stages равен 2) и притом (не ((«Exit code of» от "binary runs" и answers) равен 0)) + то [(«Nothing to accept» от answers)] + иначе пустой список + +тотальная функция «Proceed» + принимает queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + разбор queue + случай голова и хвост + то «Ask» от (голова) и (хвост) и stages и answers + случай пусто + то разбор («Absence» от stages и answers) + случай голова и хвост + то вариант «Не проверено» с код равным "FLANG_NEW_BINARY_ABSENT" и сообщение равным голова + случай пусто + то если stages не больше 0 + то «Verdict» от («All signs» от answers) и answers + иначе «Proceed» от («Stage» от (stages минус 1) и answers) и (stages минус 1) и answers + +тотальная функция «Begin» + возвращает «Inquiry» + «Begin with» от 4 + +тотальная функция «Next» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает «Продолжение» + «Proceed» от (inquiry.«queue») и (inquiry.«stages») и («Heard» от inquiry и reply) + +план «Accept» + состояние «Inquiry» + начинает с «Begin» + обрабатывает «Next» diff --git a/scripts/seed/new-binary-acceptance.sh b/scripts/seed/new-binary-acceptance.sh deleted file mode 100755 index f0d806b22..000000000 --- a/scripts/seed/new-binary-acceptance.sh +++ /dev/null @@ -1,153 +0,0 @@ -#!/bin/sh -# SPDX-FileCopyrightText: 2026 Digitable (Marat Zimnurov) -# SPDX-License-Identifier: BSD-2-Clause -# -# Приёмка нового двоичного после перепечатки семени (задача 0043): шесть примет -# с числами «было»; примета без материала говорит «не снята», а не «сошлась». -# -# Как звать: sh scripts/seed/new-binary-acceptance.sh [дерево перепечатки] -# умолчание — /srv/flang-rabota/u-semya5; прогоны идут через ворота памяти. -# -# Коды: 0 — все приметы сошлись; 1 — хоть одна нет, каждая названа; -# 2 — двоичного нет, приёмка не состоялась («не проверено», а не «не принят»). -# см. docs/zettel/an-acceptance-sign-without-material-must-say-not-taken-not-passed.md -set -u - -D=${1:-/srv/flang-rabota/u-semya5} -DVOICHNYY="$D/bootstrap/flang" -ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/../.." && pwd) -PROBE=$ROOT/scripts/seed/new-binary-acceptance-probe.flang -BED=0 - -TMPD=$(mktemp -d -p "${FLANG_TMP:-/srv/tmp}" new-binary-acceptance.XXXXXX) -trap 'rm -rf "$TMPD"' EXIT INT TERM - -say() { printf '\n=== %s\n' "$*"; } -bad() { printf ' ✗ %s\n' "$*"; BED=$((BED+1)); } -good() { printf ' ✓ %s\n' "$*"; } - -skolko() { grep -c "$1" "$2" 2>/dev/null || true; } - -# Прогон через ворота, вывод — в $TMPD/vyvod, код команды — в $KOD. -progon() { - pamyat=$1 - shift - PAMYAT=$pamyat timeout 900 /srv/flang-rabota/vorota/flang-vorota -- "$@" \ - > "$TMPD/vyvod" 2>&1 - KOD=$? - case $KOD in - 75) bad "ворота не дали места (код 75) — ОТКАЗ ВОРОТ, а не приговор двоичному; повторить примету" - sed 's/^/ /' "$TMPD/vyvod" - return 1 ;; - 124) bad "прогон не уложился в 900 с — примета НЕ СНЯТА, судить по ней нельзя" - return 1 ;; - esac - return 0 -} - -say "ЧЕМ КОНЧИЛАСЬ ПЕЧАТЬ" -tail -5 /srv/work/semya5.log 2>/dev/null || echo " журнала печати нет" - -if pgrep -f 'scripts/bootstrap-reprint\.sh' >/dev/null 2>&1; then - printf '\n ⚠ ПЕРЕПЕЧАТКА ЕЩЁ ИДЁТ — строки выше это шапка захода, а не его итог.\n' -fi - -if [ ! -x "$DVOICHNYY" ]; then - printf '\nПРИЁМКА НЕ СОСТОЯЛАСЬ: двоичного нет — %s\n' "$DVOICHNYY" - printf 'Ни одна примета не снята; это не «НЕ ПРИНЯТ», это «принимать нечего».\n' - printf 'Приёмку звать после того, как перепечатка дошла И СЕМЯ СОБРАНО:\n' - printf ' make -C %s/bootstrap -j8 (минута, 1,05 ГиБ)\n' "$D" - exit 2 -fi -printf '\nдвоичный: %s\n' "$DVOICHNYY" -"$DVOICHNYY" --version 2>&1 | head -1 - -# ── ПРИМЕТА 1: печать конкурентности в C появилась ────────────────────────── -say "ПРИМЕТА 1 — печать конкурентности в C" -IMENA=$(nm -a "$DVOICHNYY" 2>/dev/null | grep -o 'compiler_flang_[a-z_]*konkurentnost[a-z_]*' | sort -u) -printf '%s\n' "$IMENA" | sed 's/^/ /' -if printf '%s\n' "$IMENA" | grep -q '_c$'; then good "имя с «_c» есть"; else bad "имени с «_c» НЕТ (было так же)"; fi - -# ── ПРИМЕТА 2: вердикт «доказано ПРИ УСЛОВИИ» появился ────────────────────── -say "ПРИМЕТА 2 — вердикт «доказано ПРИ УСЛОВИИ»" -N=$(skolko 'ПРИ УСЛОВИИ' "$D/bootstrap/compiler_flang.c") -echo " вхождений: ${N:-нет файла} (было 0)" -if [ "${N:-0}" -gt 0 ] 2>/dev/null - then good "вердикт появился" - else bad "вердикта НЕТ — все числа дерева остаются верхней оценкой" -fi - -# ── ПРИМЕТА 3: строка хода появилась (задача 0031) ────────────────────────── -say "ПРИМЕТА 3 — строка хода" -strings "$DVOICHNYY" > "$TMPD/stroki" 2>/dev/null || true -N=$(skolko 'шагов .* из .*, идёт' "$TMPD/stroki") -echo " вхождений: ${N:-0} (было 0)" -if [ "${N:-0}" -gt 0 ] 2>/dev/null - then good "девятичасовая работа перестала быть слепой" - else bad "строки хода НЕТ" -fi - -# ── ПРИМЕТА 4: правила ядра РАБОТАЮТ, а не просто напечатались ────────────── -say "ПРИМЕТА 4 — правила ядра работают (прогон, а не таблица имён)" -if progon 45G "$DVOICHNYY" check "$PROBA" --proof; then - ITOG=$(grep -E '^ *утверждений' "$TMPD/vyvod" | tail -1) - echo " ${ITOG:-(итога нет)}" - echo " было: утверждений 4: доказано 0, сетка 0, объявлено, не доказано 4" - DOK=$(printf '%s\n' "$ITOG" | sed -n 's/^ *утверждений [0-9]*: доказано \([0-9][0-9]*\).*/\1/p') - case "${DOK:-нет}" in - нет) bad "проба не дала итога вовсе" ;; - 0) bad "ни одно правило не заработало — семя не догнало исходники" ;; - 4) good "все четыре правила ядра доехали" ;; - *) good "правил ядра доехало $DOK из 4 — часть, как проба и допускает; какие именно, смотреть в ведомости" ;; - esac -fi - -# ── ПРИМЕТА 5: двоичный читает свежие исходники ──────────────────────────── -say "ПРИМЕТА 5 — двоичный читает исходники со свежими типами" -OBRAZ= -for kandidat in "$D/flang/self/interpret.flang" "$ROOT/flang/self/interpret.flang"; do - [ -f "$kandidat" ] || continue - skolkoNashlos=$(skolko 'Узел хеша» от' "$kandidat") - [ "${skolkoNashlos:-0}" -gt 0 ] 2>/dev/null || continue - OBRAZ=$kandidat - break -done -if [ -z "$OBRAZ" ]; then - bad "проверить НЕЧЕМ: параметрического типа нет ни в дереве перепечатки, ни в дереве приёмки — примета не снята" -else - echo " образец: $OBRAZ ($(skolko 'Узел хеша» от' "$OBRAZ") вхождений параметрического типа)" - if progon 60G "$DVOICHNYY" check "$OBRAZ"; then - OTVET=$(grep -E 'FLANG_TYPE_ARGS|замечаний нет' "$TMPD/vyvod" | head -1) - echo " ${OTVET:-(ответа нет)}" - case "$OTVET" in - *FLANG_TYPE_ARGS*) bad "параметрические типы по-прежнему не понимает" ;; - *"замечаний нет"*) good "читает" ;; - *) bad "ответ не распознан — смотреть руками, вывод целиком выше" - tail -3 "$TMPD/vyvod" | sed 's/^/ /' ;; - esac - fi -fi - -# ── ПРИМЕТА 6: не сломан ли он вовсе ─────────────────────────────────────── -say "ПРИМЕТА 6 — не сломан на живом файле" -if progon 45G "$DVOICHNYY" check "$D/flang/stdlib/hashmap.flang" --proof; then - OTVET=$(tail -2 "$TMPD/vyvod") - printf '%s\n' "$OTVET" | sed 's/^/ /' - case "$OTVET" in - *FLANG_PROPERTY*|*FLANG_INTERNAL*) bad "падает — принимать НЕЛЬЗЯ" ;; - *утверждений*) good "считает" ;; - *) bad "ответ не распознан" ;; - esac -fi - -say "ИТОГ" -if [ "$BED" -eq 0 ]; then - echo " все приметы сошлись. Дальше: sh scripts/bootstrap-reprint.sh --bystro —" - echo " сверить, что семя больше не отстаёт (было 41 расхождение)." - echo " ⛔ Приёмная коммиты с bootstrap/** из веток ОТВЕРГАЕТ: семя кладётся" - echo " в ствол не через неё. Спросить владельца приёмной, как именно." - exit 0 -fi -echo " примет не сошлось: $BED. Двоичный НЕ ПРИНЯТ." -exit 1 -# ярлык «двоичный:приёмка» sh — новый двоичный после перепечатки принят по шести приметам, а не на слово diff --git a/scripts/seed/print-is-repeatable.fscript b/scripts/seed/print-is-repeatable.fscript new file mode 100644 index 000000000..6103826af --- /dev/null +++ b/scripts/seed/print-is-repeatable.fscript @@ -0,0 +1,422 @@ +модуль «Print is repeatable» + использует «Rules» из "../rules.fscript" + использует «Inquiry» из "../inquiry.fscript" + использует «Reading» из "../reading.fscript" + использует «Lists» только «Соединить списки» + +объект «Pair» + «label»: строка + «left»: строка + «right»: строка + +объект «Outcome» + «same»: признак + «files»: число + «bytes»: число + «lines»: список строки + +тотальная функция «Root» + возвращает строка + "../.." + +тотальная функция «Fingerprint» + возвращает строка + "scripts/seed-fingerprint" + +тотальная функция «Usage» + возвращает строка + "звать: bootstrap/flang io scripts/seed/print-is-repeatable.fscript --plan Check [-- <файл>] либо --plan Forgery" + +тотальная функция «Is a forgery» + принимает answers: список «Answer» + возвращает признак + («Given of» от "mode" и answers) содержит "forgery" + +тотальная функция «Input» + принимает answers: список «Answer» + возвращает строка + разбор («Given of» от "arguments" и answers) + случай пусто + то "flang/self/lexer.flang" + случай голова и хвост + то голова + +тотальная функция «Tree» + принимает answers: список «Answer» + возвращает строка + «First line» от («Output of» от "tree" и answers) + +тотальная функция «Binary» + принимает answers: список «Answer» + возвращает строка + «Setting of» от "binary" и (соединить [(«Tree» от answers), "/bootstrap/flang"] по "") и answers + +тотальная функция «Temporary» + принимает answers: список «Answer» + возвращает строка + «Setting of» от "temporary" и "/srv/tmp" и answers + +тотальная функция «Last value after» + принимает prefix: строка, text: строка + возвращает строка + пример «The last of the lines with the prefix gives the value» + дано prefix равно "предел-шагов " + дано text равно "предел-шагов 10\nпредел-глубины 5\nпредел-шагов 4000\n" + ожидается "4000" + пример «No such line gives nothing» + дано prefix равно "предел-шагов " + дано text равно "предел-глубины 5\n" + ожидается "" + свёртка («Lines» от text) начиная с "" как found и line → если line начинается с prefix то («After» от prefix и line) иначе found + +тотальная функция «Steps limit» + принимает answers: список «Answer» + возвращает строка + «Last value after» от "предел-шагов " и («Output of» от "fingerprint" и answers) + +тотальная функция «Depth limit» + принимает answers: список «Answer» + возвращает строка + «Last value after» от "предел-глубины " и («Output of» от "fingerprint" и answers) + +тотальная функция «Work» + принимает answers: список «Answer» + возвращает строка + «Made of» от "work" и answers + +тотальная функция «Inside» + принимает name: строка, answers: список «Answer» + возвращает строка + соединить [(«Work» от answers), "/", name] по "" + +тотальная функция «Hundred» + возвращает строка + "щщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщщ" + +тотальная функция «Long padding» + возвращает строка + соединить (отобразить [1, 2, 3, 4, 5, 6, 7, 8] как outer → соединить (отобразить [1, 2, 3, 4, 5] как inner → «Hundred») по "") по "" + +тотальная функция «Printing» + принимает name: строка, zone: строка, padding: строка, answers: список «Answer» + возвращает список «Question» + пусть temporary равно («Inside» от (соединить ["temporary-", name] по "") и answers) + [(«Run» от (соединить ["directories ", name] по "") и "mkdir" и ["-p", («Inside» от name и answers), temporary]), + («Run from» от (соединить ["print ", name] по "") и («Tree» от answers) и "env" и [(соединить ["TZ=", zone] по ""), (соединить ["TMPDIR=", temporary] по ""), (соединить ["FLANG_TMP=", temporary] по ""), (соединить ["FLANG_PADDING=", padding] по ""), («Binary» от answers), "emit", («Input» от answers), "--target", "c", "--out", («Inside» от name и answers), "--cli", "--repl", "--runtime", (соединить [(«Tree» от answers), "/flang/src/emit/c"] по ""), "--max-steps", («Steps limit» от answers), "--max-depth", («Depth limit» от answers)])] + +тотальная функция «Pairs» + принимает answers: список «Answer» + возвращает список «Pair» + если «Is a forgery» от answers + то [запись «Pair» с «label» равным "copy" и «left» равным («Inside» от "probe" и answers) и «right» равным («Inside» от "copy" и answers), + запись «Pair» с «label» равным "changed" и «left» равным («Inside» от "probe" и answers) и «right» равным («Inside» от "changed" и answers), + запись «Pair» с «label» равным "missing" и «left» равным («Inside» от "probe" и answers) и «right» равным («Inside» от "missing" и answers)] + иначе [запись «Pair» с «label» равным "prints" и «left» равным («Inside» от "first" и answers) и «right» равным («Inside» от "second-print-of-the-same-tree" и answers)] + +тотальная функция «Names question» + принимает side: строка, pair: «Pair» + возвращает строка + соединить ["names ", side, " ", (pair.«label»)] по "" + +тотальная функция «Names» + принимает side: строка, pair: «Pair», answers: список «Answer» + возвращает список строки + «Lines» от («Output of» от («Names question» от side и pair) и answers) + +тотальная функция «Listing» + принимает pair: «Pair» + возвращает список «Question» + [(«Run» от («Names question» от "left" и pair) и "env" и ["LC_ALL=C", "ls", "-A", (pair.«left»)]), + («Run» от («Names question» от "right" и pair) и "env" и ["LC_ALL=C", "ls", "-A", (pair.«right»)])] + +тотальная функция «Names agree» + принимает pair: «Pair», answers: список «Answer» + возвращает признак + («Output of» от («Names question» от "left" и pair) и answers) равен («Output of» от («Names question» от "right" и pair) и answers) + +тотальная функция «Bytes question» + принимает pair: «Pair», name: строка + возвращает строка + соединить ["bytes ", (pair.«label»), " ", name] по "" + +тотальная функция «Comparing» + принимает pair: «Pair», answers: список «Answer» + возвращает список «Question» + пусть names равно («Names» от "left" и pair и answers) + если «Names agree» от pair и answers + то приписать («Run from» от (соединить ["sizes ", (pair.«label»)] по "") и (pair.«left») и "wc" и (приписать "-c" к (приписать "--" к names))) к (отобразить names как name → «Run» от («Bytes question» от pair и name) и "env" и ["LC_ALL=C", "cmp", (соединить [(pair.«left»), "/", name] по ""), (соединить [(pair.«right»), "/", name] по "")]) + иначе [(«Write» от (соединить ["left list ", (pair.«label»)] по "") и («Inside» от (соединить ["names-left-", (pair.«label»)] по "") и answers) и («Output of» от («Names question» от "left" и pair) и answers)), + («Write» от (соединить ["right list ", (pair.«label»)] по "") и («Inside» от (соединить ["names-right-", (pair.«label»)] по "") и answers) и («Output of» от («Names question» от "right" и pair) и answers)), + («Run» от (соединить ["names difference ", (pair.«label»)] по "") и "env" и ["LC_ALL=C", "diff", («Inside» от (соединить ["names-left-", (pair.«label»)] по "") и answers), («Inside» от (соединить ["names-right-", (pair.«label»)] по "") и answers)])] + +тотальная функция «Size» + принимает name: строка, sizes: список строки + возвращает число + пример «The size stands before the name» + дано name равно "Makefile" + дано sizes равно [" 120 lexer.c", " 3454 Makefile", " 3574 total"] + ожидается 3454 + пример «A name without a line has no size» + дано name равно "absent.c" + дано sizes равно [" 3454 Makefile"] + ожидается 0 + «Count» от («Word» от 1 и («First line» от (соединить (отфильтровать sizes где line → («Word» от 2 и line) равен name) по "\n"))) + +тотальная функция «Difference lines» + принимает pair: «Pair», name: строка, answers: список «Answer» + возвращает список строки + пусть said равно («Reply to» от («Bytes question» от pair и name) и answers) + если («Exit code» от said) равен 0 + то пустой список + иначе [(соединить ["РАЗОШЁЛСЯ: ", name] по ""), (соединить [" ", («First line» от (соединить [(«Output» от said), («Errors» от said)] по "\n"))] по "")] + +тотальная функция «Compared bytes» + принимает pair: «Pair», answers: список «Answer» + возвращает «Outcome» + пусть names равно («Names» от "left" и pair и answers) + пусть sizes равно («Lines» от («Output of» от (соединить ["sizes ", (pair.«label»)] по "") и answers)) + пусть differing равно (отфильтровать names где name → не ((«Exit code of» от («Bytes question» от pair и name) и answers) равен 0)) + пусть lines равно («Gathered words» от (отобразить names как name → «Difference lines» от pair и name и answers)) + запись «Outcome» с «same» равным ((длина differing) равен 0) и «files» равным (длина names) и «bytes» равным (свёртка names начиная с 0 как sum и name → sum плюс («Size» от name и sizes)) и «lines» равным (если (длина differing) равен 0 то lines иначе (добавить (соединить ["файлов сверено ", (к строке (длина names)), ", разошлось ", (к строке (длина differing))] по "") к lines)) + +тотальная функция «Compared» + принимает pair: «Pair», answers: список «Answer» + возвращает «Outcome» + если «Names agree» от pair и answers + то «Compared bytes» от pair и answers + иначе запись «Outcome» с «same» равным нет и «files» равным 0 и «bytes» равным 0 и «lines» равным (приписать "РАЗОШЛИСЬ: наборы напечатанных файлов не совпадают" к (отобразить («Lines» от («Output of» от (соединить ["names difference ", (pair.«label»)] по "") и answers)) как line → соединить [" ", line] по "")) + +тотальная функция «Victim» + принимает answers: список «Answer» + возвращает строка + «First line» от («Output of» от "names probe" и answers) + +тотальная функция «Ending» + принимает lines: список строки, count: число + возвращает список строки + пример «The last two of three lines» + дано lines равно ["one", "two", "three"] + дано count равно 2 + ожидается ["two", "three"] + пример «A short text is kept whole» + дано lines равно ["one"] + дано count равно 2 + ожидается ["one"] + разбор lines + случай пусто + то пустой список + случай голова и хвост + то если (длина lines) не больше count то lines иначе «Ending» от (хвост) и count + +тотальная функция «Print refusal» + принимает name: строка, words: список строки, answers: список «Answer» + возвращает список строки + пусть said равно («Reply to» от (соединить ["print ", name] по "") и answers) + если (не («Answered» от (соединить ["print ", name] по "") и answers)) или ((«Exit code» от said) равен 0) + то пустой список + иначе «Соединить списки» от (приписать (соединить ["НЕ ПРОВЕРЕНО: ", (соединить words по ""), " (код ", (к строке («Exit code» от said)), ")"] по "") к (если «Is a forgery» от answers то пустой список иначе ["Это НЕ «разошлись»: сверять было нечего."])) и («Ending» от («Соединить списки» от («Lines» от («Output» от said)) и («Lines» от («Errors» от said))) и 20) + +тотальная функция «Failed» + принимает name: строка, answers: список «Answer» + возвращает признак + («Answered» от name и answers) и притом (не ((«Exit code of» от name и answers) равен 0)) + +тотальная функция «Wrong call» + принимает answers: список «Answer» + возвращает признак + (длина («Given of» от "arguments" и answers)) больше (если «Is a forgery» от answers то 0 иначе 1) + +тотальная функция «Obstacles» + принимает answers: список «Answer» + возвращает список список строки + отфильтровать [(если «Wrong call» от answers то [(«Usage»)] иначе пустой список), + (если «Failed» от "input" и answers то [(соединить ["входа нет: ", («Input» от answers)] по "")] иначе пустой список), + (если «Failed» от "binary present" и answers то [(соединить ["НЕ ПРОВЕРЕНО: печатать нечем — ", («Binary» от answers), " не исполняемый файл"] по ""), " Собрать: make -C bootstrap -j\"$(nproc)\""] иначе пустой список), + (если («Answered» от "fingerprint" и answers) и притом ((пусто («Steps limit» от answers)) или (пусто («Depth limit» от answers))) то [(соединить ["НЕ ПРОВЕРЕНО: в ", («Fingerprint»), " нет пределов печати"] по ""), " Печатать с чужими пределами нельзя: это была бы другая печать."] иначе пустой список), + (если («Answered» от "work" и answers) и притом (пусто («Work» от answers)) то [(соединить ["НЕ ПРОВЕРЕНО: не создался каталог в ", («Temporary» от answers)] по "")] иначе пустой список), + («Print refusal» от "probe" и ["печать пробы отказала"] и answers), + («Print refusal» от "first" и ["первая печать отказала"] и answers), + («Print refusal» от "second-print-of-the-same-tree" и ["вторая печать отказала"] и answers), + (если («Answered» от "names probe" и answers) и притом (пусто («Victim» от answers)) то ["НЕ ПРОВЕРЕНО: печать пробы не дала ни одного файла"] иначе пустой список)] где lines → (длина lines) больше 0 + +тотальная функция «Is clear» + принимает answers: список «Answer» + возвращает признак + (длина («Obstacles» от answers)) равен 0 + +тотальная функция «Setup» + возвращает список «Question» + [(«Arguments» от "arguments"), («Environment» от "binary" и "FLANG"), («Environment» от "temporary" и "FLANG_TMP"), («Run from» от "tree" и («Root») и "pwd" и ["-P"]), («Read from» от "fingerprint" и («Root») и («Fingerprint»))] + +тотальная функция «Presence» + принимает answers: список «Answer» + возвращает список «Question» + [(«Run from» от "input" и («Tree» от answers) и "test" и ["-f", («Input» от answers)]), («Run» от "binary present" и "test" и ["-x", («Binary» от answers)])] + +тотальная функция «Working place» + принимает answers: список «Answer» + возвращает список «Question» + [(«Temporary directory» от "work" и (соединить [(«Temporary» от answers), "/print-is-repeatable."] по ""))] + +тотальная функция «First print» + принимает answers: список «Answer» + возвращает список «Question» + «Printing» от (если «Is a forgery» от answers то "probe" иначе "first") и "UTC" и "x" и answers + +тотальная функция «Second print» + принимает answers: список «Answer» + возвращает список «Question» + если «Is a forgery» от answers + то [(«Run» от "names probe" и "env" и ["LC_ALL=C", "ls", "-A", («Inside» от "probe" и answers)])] + иначе «Printing» от "second-print-of-the-same-tree" и "Pacific/Kiritimati" и («Long padding») и answers + +тотальная функция «Copy» + принимает name: строка, answers: список «Answer» + возвращает «Question» + «Run» от (соединить ["copy ", name] по "") и "cp" и ["-a", («Inside» от "probe" и answers), («Inside» от name и answers)] + +тотальная функция «Forging» + принимает answers: список «Answer» + возвращает список «Question» + если «Is a forgery» от answers + то [(«Copy» от "copy" и answers), («Copy» от "changed" и answers), («Copy» от "missing" и answers), + («Run» от "change" и "sh" и ["-c", "printf '/* подлог */\\n' >> \"$0\"", («Inside» от (соединить ["changed/", («Victim» от answers)] по "") и answers)]), + («Remove» от "removal" и («Inside» от (соединить ["missing/", («Victim» от answers)] по "") и answers))] + иначе пустой список + +тотальная функция «Listings» + принимает answers: список «Answer» + возвращает список «Question» + «Gathered» от (отобразить («Pairs» от answers) как pair → «Listing» от pair) + +тотальная функция «Comparisons» + принимает answers: список «Answer» + возвращает список «Question» + «Gathered» от (отобразить («Pairs» от answers) как pair → «Comparing» от pair и answers) + +тотальная функция «Cleanup» + принимает answers: список «Answer» + возвращает список «Question» + если пусто («Work» от answers) + то пустой список + иначе [(«Run» от "cleanup" и "rm" и ["-rf", («Work» от answers)])] + +тотальная функция «Work stage» + принимает stages: число, answers: список «Answer» + возвращает список «Question» + если (stages меньше 1) или (stages больше 7) + то пустой список + иначе элемент (8 минус stages) в [(«Presence» от answers), («Working place» от answers), («First print» от answers), («Second print» от answers), («Forging» от answers), («Listings» от answers), («Comparisons» от answers)] + +тотальная функция «Stage» + принимает stages: число, answers: список «Answer» + возвращает список «Question» + «Chosen» от [(«When» от (stages равен 8) и («Setup»)), + («When» от (stages равен 0) и («Cleanup» от answers)), + («When» от («Is clear» от answers) и («Work stage» от stages и answers))] и (пустой список) + +тотальная функция «Heading» + принимает answers: список «Answer» + возвращает список строки + [(соединить ["вход: ", («Input» от answers)] по ""), (соединить ["печатает: ", («Binary» от answers)] по ""), (соединить ["пределы: шагов ", («Steps limit» от answers), ", глубины ", («Depth limit» от answers)] по "")] + +тотальная функция «Repeatable» + принимает outcome: «Outcome» + возвращает список строки + пример «Equal prints are counted in files and bytes» + дано outcome равно запись «Outcome» с «same» равным да и «files» равным 7 и «bytes» равным 1857355 и «lines» равным пустой список + ожидается ["печати совпали побайтово: файлов 7, байт 1857355", "Печать этого двоичного не зависит от времени, адресов, номера процесса,", "путей и часового пояса. Это НЕОБХОДИМОЕ условие Г6, и оно держится.", "Достаточным оно не стало: полная пара печатей одного дерева — за", "работой dve-pechati в .github/workflows/reprint.yml."] + [(соединить ["печати совпали побайтово: файлов ", (к строке (outcome.«files»)), ", байт ", (к строке (outcome.«bytes»))] по ""), "Печать этого двоичного не зависит от времени, адресов, номера процесса,", "путей и часового пояса. Это НЕОБХОДИМОЕ условие Г6, и оно держится.", "Достаточным оно не стало: полная пара печатей одного дерева — за", "работой dve-pechati в .github/workflows/reprint.yml."] + +тотальная функция «Not repeatable» + возвращает список строки + ["", "ПЕЧАТЬ НЕВОСПРОИЗВОДИМА. Это НАХОДКА, а не поломка машины.", "Один двоичный, один вход, два захода — и разные байты. Значит в вывод", "течёт что-то, чего нет во входах. Гейт Г6 на этом дереве не берётся", "ничем: полная пара печатей разойдётся тем же.", "Чинить надо печать, а не проверку: повтор даст то же самое."] + +тотальная функция «Check verdict» + принимает answers: список «Answer» + возвращает «Продолжение» + разбор («Pairs» от answers) + случай пусто + то вариант «Не проверено» с код равным "FLANG_IO_ORDER" и сообщение равным "сверять нечего" + случай голова и хвост + то если («Compared» от (голова) и answers).«same» + то вариант «Конец работы» с значение равным (соединить («Соединить списки» от («Heading» от answers) и («Repeatable» от («Compared» от (голова) и answers))) по "\n") + иначе вариант «Провал» с код равным "FLANG_PRINT_NOT_REPEATABLE" и сообщение равным (соединить («Gathered words» от [(«Heading» от answers), ((«Compared» от (голова) и answers).«lines»), («Not repeatable»)]) по "\n") + +тотальная функция «Trial» + принимает caught: признак, praise: строка, blame: строка + возвращает строка + если caught то praise иначе blame + +тотальная функция «Trials» + принимает answers: список «Answer» + возвращает список строки + пусть victim равно («Victim» от answers) + отобразить («Pairs» от answers) как pair → «Chosen» от [(«When» от ((pair.«label») равен "copy") и («Trial» от ((«Compared» от pair и answers).«same») и "чисто молчит дословная копия признана совпавшей" и "ЛОЖНАЯ ТРЕВОГА: сверщик развёл дословную копию")), + («When» от ((pair.«label») равен "changed") и («Trial» от (не ((«Compared» от pair и answers).«same»)) и (соединить ["подлог пойман изменённый байт в ", victim, " назван"] по "") и (соединить ["ПОДЛОГ НЕ ПОЙМАН: сверщик смолчал на изменённом байте в ", victim] по "")))] и («Trial» от (не ((«Compared» от pair и answers).«same»)) и (соединить ["подлог пойман пропавший файл ", victim, " назван"] по "") и (соединить ["ПОДЛОГ НЕ ПОЙМАН: сверщик смолчал на пропавшем файле ", victim] по "")) + +тотальная функция «Is a blame» + принимает line: строка + возвращает признак + (line начинается с "ЛОЖНАЯ ТРЕВОГА") или (line начинается с "ПОДЛОГ НЕ ПОЙМАН") + +тотальная функция «Forgery verdict» + принимает answers: список «Answer» + возвращает «Продолжение» + пусть trials равно («Trials» от answers) + если (длина (отфильтровать trials где line → «Is a blame» от line)) больше 0 + то вариант «Провал» с код равным "FLANG_PRINT_COMPARISON_BLIND" и сообщение равным (соединить trials по "\n") + иначе вариант «Конец работы» с значение равным (соединить (добавить "прибор краснеет там, где должен, и молчит там, где должен" к trials) по "\n") + +тотальная функция «Is a print refusal» + принимает lines: список строки + возвращает признак + (соединить lines по "\n") содержит "печать отказала" + +тотальная функция «Verdict» + принимает answers: список «Answer» + возвращает «Продолжение» + разбор («Obstacles» от answers) + случай голова и хвост + то вариант «Не проверено» с код равным "FLANG_PRINT_NOT_COMPARED" и сообщение равным (соединить (если «Is a print refusal» от голова то («Соединить списки» от («Heading» от answers) и (голова)) иначе голова) по "\n") + случай пусто + то если «Is a forgery» от answers то («Forgery verdict» от answers) иначе («Check verdict» от answers) + +тотальная функция «Proceed» + принимает queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + разбор queue + случай голова и хвост + то «Ask» от (голова) и (хвост) и stages и answers + случай пусто + то если stages не больше 0 + то «Verdict» от answers + иначе «Proceed» от («Stage» от (stages минус 1) и answers) и (stages минус 1) и answers + +тотальная функция «Begin in mode» + принимает mode: строка + возвращает «Inquiry» + запись «Inquiry» с «asked» равным "" и «queue» равным пустой список и «stages» равным 9 и «answers» равным [запись «Answer» с «name» равным "mode" и «reply» равным (вариант «Доводы» с доводы равным [mode])] + +тотальная функция «Begin check» + возвращает «Inquiry» + «Begin in mode» от "check" + +тотальная функция «Begin forgery» + возвращает «Inquiry» + «Begin in mode» от "forgery" + +тотальная функция «Next» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает «Продолжение» + «Proceed» от (inquiry.«queue») и (inquiry.«stages») и («Heard» от inquiry и reply) + +план «Check» + состояние «Inquiry» + начинает с «Begin check» + обрабатывает «Next» + +план «Forgery» + состояние «Inquiry» + начинает с «Begin forgery» + обрабатывает «Next» diff --git a/scripts/seed/print-is-repeatable.sh b/scripts/seed/print-is-repeatable.sh deleted file mode 100755 index 3cb726d25..000000000 --- a/scripts/seed/print-is-repeatable.sh +++ /dev/null @@ -1,193 +0,0 @@ -#!/bin/sh -# SPDX-FileCopyrightText: 2026 Digitable (Marat Zimnurov) -# SPDX-License-Identifier: BSD-2-Clause -# -# Печать повторима: тот же двоичный, тот же вход, две разные среды (каталоги, -# часовой пояс, набивка окружения) — одни байты. Необходимое условие гейта Г6 -# на каждом пуше, не сам гейт: печатается один модуль, не замыкание компилятора. -# -# Как звать: -# sh scripts/seed/print-is-repeatable.sh сверка (вход flang/self/lexer.flang) -# sh scripts/seed/print-is-repeatable.sh --вход <файл> сверка на другом входе -# sh scripts/seed/print-is-repeatable.sh --подлог проба самого прибора -# FLANG — чем печатать (bootstrap/flang); FLANG_TMP — где работать (/srv/tmp). -# -# Коды: 0 — совпали побайтово; 1 — разошлись: печать невоспроизводима (находка); -# 2 — звать не умеют; 3 — НЕ ПРОВЕРЕНО: печатать нечем, негде или печать отказала. -# см. docs/zettel/one-module-printed-in-two-environments-is-a-necessary-condition-of-gate-six-not-the-gate.md -set -u - -ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/../.." && pwd) -RUNTIME=flang/src/emit/c -OTPECHATOK=scripts/seed-fingerprint -VHOD_PO_UMOLCHANIYU=flang/self/lexer.flang - -skazhi() { printf '%s\n' "$*"; } -beda() { printf '%s\n' "$*" >&2; } - -VHOD=$VHOD_PO_UMOLCHANIYU -PODLOG=net -while [ $# -gt 0 ]; do - case $1 in - --подлог) PODLOG=da ;; - --вход) - shift - [ $# -gt 0 ] || { beda "--вход: не назван файл"; exit 2; } - VHOD=$1 ;; - *) beda "непонятный ключ: $1" - beda "звать: sh scripts/seed/print-is-repeatable.sh [--вход <файл>|--подлог]" - exit 2 ;; - esac - shift -done - -[ -f "$ROOT/$VHOD" ] || { beda "входа нет: $VHOD"; exit 2; } - -BINARY=${FLANG:-$ROOT/bootstrap/flang} -if [ ! -x "$BINARY" ]; then - beda "НЕ ПРОВЕРЕНО: печатать нечем — $BINARY не исполняемый файл" - beda " Собрать: make -C bootstrap -j\"\$(nproc)\"" - exit 3 -fi - -PREDEL_SHAGOV=$(LC_ALL=C.UTF-8 /usr/bin/grep -a '^предел-шагов ' "$ROOT/$OTPECHATOK" 2>/dev/null | tail -1 | sed 's/^[^ ]* //') -PREDEL_GLUBINY=$(LC_ALL=C.UTF-8 /usr/bin/grep -a '^предел-глубины ' "$ROOT/$OTPECHATOK" 2>/dev/null | tail -1 | sed 's/^[^ ]* //') -if [ -z "$PREDEL_SHAGOV" ] || [ -z "$PREDEL_GLUBINY" ]; then - beda "НЕ ПРОВЕРЕНО: в $OTPECHATOK нет пределов печати" - beda " Печатать с чужими пределами нельзя: это была бы другая печать." - exit 3 -fi - -RAB=$(mktemp -d -p "${FLANG_TMP:-/srv/tmp}" povtorima.XXXXXX) || { - beda "НЕ ПРОВЕРЕНО: не создался каталог в ${FLANG_TMP:-/srv/tmp}"; exit 3; } -trap 'rm -rf "$RAB"' EXIT INT TERM - -# ── Сверка двух каталогов побайтово ───────────────────────────────────────── -sverit() { # $1 первый каталог, $2 второй. 0 — сошлись, 1 — разошлись - ( cd "$1" && ls -A ) | LC_ALL=C sort > "$RAB/spisok-1" - ( cd "$2" && ls -A ) | LC_ALL=C sort > "$RAB/spisok-2" - if ! LC_ALL=C cmp -s "$RAB/spisok-1" "$RAB/spisok-2"; then - skazhi "РАЗОШЛИСЬ: наборы напечатанных файлов не совпадают" - LC_ALL=C diff "$RAB/spisok-1" "$RAB/spisok-2" | sed 's/^/ /' - return 1 - fi - sv_fajlov=0; sv_bajt=0; sv_razoshlos=0 - while IFS= read -r f; do - [ -f "$1/$f" ] || continue - sv_fajlov=$((sv_fajlov + 1)) - sv_bajt=$((sv_bajt + $(wc -c < "$1/$f"))) - if ! LC_ALL=C cmp -s "$1/$f" "$2/$f"; then - sv_razoshlos=$((sv_razoshlos + 1)) - skazhi "РАЗОШЁЛСЯ: $f" - skazhi " $(LC_ALL=C cmp "$1/$f" "$2/$f" 2>&1 | head -1)" - fi - done < "$RAB/spisok-1" - if [ "$sv_razoshlos" -gt 0 ]; then - skazhi "файлов сверено $sv_fajlov, разошлось $sv_razoshlos" - return 1 - fi - SVERENO_FAJLOV=$sv_fajlov - SVERENO_BAJT=$sv_bajt - return 0 -} - -# $1 — выходной каталог, $2 — часовой пояс, $3 — временный каталог, -# $4 — набивка окружения (сдвигает адреса стека), $5 — журнал -pechat() { - mkdir -p "$1" "$3" || return 3 - ( - cd "$ROOT" || exit 3 - TZ=$2 TMPDIR=$3 FLANG_TMP=$3 NABIVKA=$4 \ - "$BINARY" emit "$VHOD" --target c --out "$1" \ - --cli --repl --runtime "$ROOT/$RUNTIME" \ - --max-steps "$PREDEL_SHAGOV" --max-depth "$PREDEL_GLUBINY" - ) > "$5" 2>&1 -} - -NABIVKA_1=x -NABIVKA_2=$(awk 'BEGIN { s = ""; while (length(s) < 4000) s = s "щ"; print s }') - -# ── ПОДЛОГ: краснеет ли прибор, когда есть на что ─────────────────────────── -if [ "$PODLOG" = da ]; then - bedy=0 - pechat "$RAB/probe" UTC "$RAB/t0" "$NABIVKA_1" "$RAB/probe.log" - kod=$? - if [ "$kod" -ne 0 ]; then - beda "НЕ ПРОВЕРЕНО: печать пробы отказала (код $kod)" - tail -20 "$RAB/probe.log" >&2 - exit 3 - fi - - cp -a "$RAB/probe" "$RAB/kopiya" - if sverit "$RAB/probe" "$RAB/kopiya" >/dev/null; then - skazhi "чисто молчит дословная копия признана совпавшей" - else - beda "ЛОЖНАЯ ТРЕВОГА: сверщик развёл дословную копию" - bedy=$((bedy + 1)) - fi - - # Порча ровно того рода, какой даёт сбитая печать: один байт в напечатанном. - KOGO=$(cd "$RAB/kopiya" && ls -A | LC_ALL=C sort | head -1) - [ -n "$KOGO" ] || { beda "НЕ ПРОВЕРЕНО: печать пробы не дала ни одного файла"; exit 3; } - printf '/* подлог */\n' >> "$RAB/kopiya/$KOGO" - if sverit "$RAB/probe" "$RAB/kopiya" >/dev/null; then - beda "ПОДЛОГ НЕ ПОЙМАН: сверщик смолчал на изменённом байте в $KOGO" - bedy=$((bedy + 1)) - else - skazhi "подлог пойман изменённый байт в $KOGO назван" - fi - - rm -rf "$RAB/kopiya"; cp -a "$RAB/probe" "$RAB/kopiya" - rm -f "$RAB/kopiya/$KOGO" - if sverit "$RAB/probe" "$RAB/kopiya" >/dev/null; then - beda "ПОДЛОГ НЕ ПОЙМАН: сверщик смолчал на пропавшем файле $KOGO" - bedy=$((bedy + 1)) - else - skazhi "подлог пойман пропавший файл $KOGO назван" - fi - - [ "$bedy" -eq 0 ] || exit 1 - skazhi "прибор краснеет там, где должен, и молчит там, где должен" - exit 0 -fi - -# ── Сама сверка: две печати одного входа в РАЗНЫХ средах ──────────────────── -skazhi "вход: $VHOD" -skazhi "печатает: $BINARY" -skazhi "пределы: шагов $PREDEL_SHAGOV, глубины $PREDEL_GLUBINY" - -pechat "$RAB/pervaya" UTC "$RAB/t1" "$NABIVKA_1" "$RAB/pervaya.log" -kod=$? -if [ "$kod" -ne 0 ]; then - beda "НЕ ПРОВЕРЕНО: первая печать отказала (код $kod)" - beda "Это НЕ «разошлись»: сверять было нечего." - tail -20 "$RAB/pervaya.log" >&2 - exit 3 -fi -pechat "$RAB/vtoraya-pechat-togo-zhe-dereva" Pacific/Kiritimati \ - "$RAB/vremennyy-katalog-vtorogo-zahoda" "$NABIVKA_2" "$RAB/vtoraya.log" -kod=$? -if [ "$kod" -ne 0 ]; then - beda "НЕ ПРОВЕРЕНО: вторая печать отказала (код $kod)" - beda "Это НЕ «разошлись»: сверять было нечего." - tail -20 "$RAB/vtoraya.log" >&2 - exit 3 -fi - -SVERENO_FAJLOV=0; SVERENO_BAJT=0 -if sverit "$RAB/pervaya" "$RAB/vtoraya-pechat-togo-zhe-dereva"; then - skazhi "печати совпали побайтово: файлов $SVERENO_FAJLOV, байт $SVERENO_BAJT" - skazhi "Печать этого двоичного не зависит от времени, адресов, номера процесса," - skazhi "путей и часового пояса. Это НЕОБХОДИМОЕ условие Г6, и оно держится." - skazhi "Достаточным оно не стало: полная пара печатей одного дерева — за" - skazhi "работой dve-pechati в .github/workflows/reprint.yml." - exit 0 -fi - -skazhi "" -skazhi "ПЕЧАТЬ НЕВОСПРОИЗВОДИМА. Это НАХОДКА, а не поломка машины." -skazhi "Один двоичный, один вход, два захода — и разные байты. Значит в вывод" -skazhi "течёт что-то, чего нет во входах. Гейт Г6 на этом дереве не берётся" -skazhi "ничем: полная пара печатей разойдётся тем же." -skazhi "Чинить надо печать, а не проверку: повтор даст то же самое." -exit 1 diff --git a/scripts/seed/seed-freshness.fscript b/scripts/seed/seed-freshness.fscript new file mode 100644 index 000000000..ea7b5d91a --- /dev/null +++ b/scripts/seed/seed-freshness.fscript @@ -0,0 +1,305 @@ +модуль «Seed freshness» + использует «Rules» из "../rules.fscript" + использует «Inquiry» из "../inquiry.fscript" + использует «Reading» из "../reading.fscript" + использует «Lists» только «Соединить списки» + +объект «Outcome» + «code»: число + «words»: строка + +тотальная функция «Root» + возвращает строка + "../.." + +тотальная функция «Bypass» + возвращает строка + "FLANG_SEED_LAG_KNOWN" + +тотальная функция «Reprint» + возвращает строка + "sh scripts/bootstrap-reprint.sh" + +тотальная функция «Argument trouble» + принимает passed: список строки + возвращает строка + пример «No arguments are fine» + дано passed равно пустой список + ожидается "" + пример «The asker is named after its key» + дано passed равно ["--what", "ярлык «доказуемость»"] + ожидается "" + пример «A key without the asker is a trouble» + дано passed равно ["--what"] + ожидается "--what без имени" + пример «Any other key is a trouble» + дано passed равно ["--fast"] + ожидается "неизвестный довод: --fast" + разбор passed + случай пусто + то "" + случай голова и хвост + то «Chosen» от [(«When» от (не (голова равен "--what")) и (соединить ["неизвестный довод: ", голова] по "")), + («When» от ((длина хвост) равен 1) и "")] и "--what без имени" + +тотальная функция «Asker» + принимает passed: список строки + возвращает строка + пример «Without arguments the asker is this check itself» + дано passed равно пустой список + ожидается "эта проверка" + пример «The asker is named after its key» + дано passed равно ["--what", "ярлык «доказуемость»"] + ожидается "ярлык «доказуемость»" + если (длина passed) равен 2 то элемент 2 в passed иначе "эта проверка" + +тотальная функция «Asker of» + принимает answers: список «Answer» + возвращает строка + «Asker» от («Given of» от "arguments" и answers) + +тотальная функция «Run merged» + принимает name: строка, arguments: список строки + возвращает «Question» + пример «Both streams of the child go into one» + дано name равно "body" + дано arguments равно ["scripts/bootstrap-reprint.sh", "--telo"] + ожидается запись «Question» с «name» равным "body" и «order» равным (вариант «Запустить процесс» с программа равным "sh" и аргументы равным ["-c", "cd \"$0\" && exec \"$@\" 2>&1", "../..", "sh", "scripts/bootstrap-reprint.sh", "--telo"]) + «Run» от name и "sh" и (приписать "-c" к (приписать "cd \"$0\" && exec \"$@\" 2>&1" к (приписать («Root») к (приписать "sh" к arguments)))) + +тотальная функция «Last filled» + принимает pieces: список строки + возвращает число + пример «Empty pieces at the end are not counted» + дано pieces равно ["one", "", "two", "", ""] + ожидается 3 + пример «Nothing but empty pieces» + дано pieces равно ["", ""] + ожидается 0 + элемент 2 в (свёртка pieces начиная с [0, 0] как seen и piece → [((элемент 1 в seen) плюс 1), (если пусто piece то (элемент 2 в seen) иначе ((элемент 1 в seen) плюс 1))]) + +тотальная функция «Leading» + принимает pieces: список строки, amount: число + возвращает список строки + пример «Two of three» + дано pieces равно ["one", "two", "three"] + дано amount равно 2 + ожидается ["one", "two"] + разбор pieces + случай пусто + то пустой список + случай голова и хвост + то если amount не больше 0 + то пустой список + иначе приписать голова к («Leading» от хвост и (amount минус 1)) + +тотальная функция «Said» + принимает name: строка, answers: список «Answer» + возвращает строка + пусть pieces равно (разделить («Output of» от name и answers) по "\n") + соединить («Leading» от pieces и («Last filled» от pieces)) по "\n" + +тотальная функция «Unescaped» + принимает text: строка + возвращает строка + пример «Line ends and quotes come back» + дано text равно "цель \\\"а\\\"\\nстрока" + ожидается "цель \"а\"\nстрока" + пример «A backslash stays one backslash» + дано text равно "a\\\\nb" + ожидается "a\\nb" + соединить (отобразить (разделить text по "\\\\") как part → соединить (разделить (соединить (разделить (соединить (разделить part по "\\n") по "\n") по "\\t") по "\t") по "\\\"") по "\"") по "\\" + +тотальная функция «Spoken error» + принимает errors: строка + возвращает строка + пример «The words of a refusal are taken out of its wrapping» + дано errors равно "доказано: утверждений 3\n{\"error\":\"нет readelf\\nвовсе\",\"diagnostics\":[]}\n" + ожидается "нет readelf\nвовсе" + пример «Errors of another shape are shown as they are» + дано errors равно "flang io: непонятный ключ\n" + ожидается "flang io: непонятный ключ\n" + пусть wrapped равно (разделить errors по "{\"error\":\"") + если (длина wrapped) равен 2 + то «Unescaped» от («Leading part» от (разделить (элемент 2 в wrapped) по "\",\"diagnostics\":")) + иначе errors + +тотальная функция «Leading part» + принимает parts: список строки + возвращает строка + разбор parts + случай пусто + то "" + случай голова и хвост + то голова + +тотальная функция «Files word» + принимает amount: число + возвращает строка + пример «One file» + дано amount равно 1 + ожидается "файл" + пример «Three files» + дано amount равно 3 + ожидается "файла" + пример «Eleven files» + дано amount равно 11 + ожидается "файлов" + пример «Twenty one files» + дано amount равно 21 + ожидается "файл" + пример «Forty one hundred and twelve» + дано amount равно 112 + ожидается "файлов" + пример «Eight files» + дано amount равно 8 + ожидается "файлов" + «Chosen» от [(«When» от (((amount остаток от 100) не меньше 11) и притом ((amount остаток от 100) не больше 14)) и ("файлов")), + («When» от ((amount остаток от 10) равен 1) и ("файл")), + («When» от (((amount остаток от 10) не меньше 2) и притом ((amount остаток от 10) не больше 4)) и ("файла"))] и ("файлов") + +тотальная функция «Lagging» + принимает said: строка + возвращает список строки + пример «Only the lines about a reprint are counted» + дано said равно " • flang/self/cli.flang — ждёт перепечатки\nитого 1\n" + ожидается [" • flang/self/cli.flang — ждёт перепечатки"] + отфильтровать («Lines» от said) где line → «Ends with» от line и "перепечатки" + +тотальная функция «Shown» + принимает said: строка, amount: число + возвращает список строки + пусть marked равно (отфильтровать («Lines» от said) где line → line начинается с " • ") + «Соединить списки» от («Leading» от marked и 8) и (если amount больше 8 то [(соединить [" …и ещё ", (к строке (amount минус 8))] по "")] иначе пустой список) + +тотальная функция «Setup» + возвращает список «Question» + [(«Arguments» от "arguments"), («Environment» от "bypass" и («Bypass»))] + +тотальная функция «Origin» + принимает answers: список «Answer» + возвращает список «Question» + [(«Run» от "origin" и "sh" и ["-c", "cd \"$0\" && exec \"$@\" >/dev/null", («Root»), "bootstrap/flang", "io", "scripts/seed/binary-origin.fscript", "--plan", "Check", "--timeout", "300000", "--", "--what", («Asker of» от answers)])] + +тотальная функция «Stage» + принимает stages: число, answers: список «Answer» + возвращает список «Question» + «Chosen» от [(«When» от (stages равен 3) и («Setup»)), + («When» от (stages равен 2) и («Origin» от answers)), + («When» от (stages равен 1) и ([(«Run merged» от "body" и ["scripts/bootstrap-reprint.sh", "--telo"])]))] и ([(«Run merged» от "inputs" и ["scripts/bootstrap-reprint.sh", "--bystro"])]) + +тотальная функция «Refusal» + принимает answers: список «Answer» + возвращает строка + соединить ["ОТКАЗЫВАЮСЬ СУДИТЬ О ДОКАЗАТЕЛЬСТВАХ: ", («Asker of» от answers)] по "" + +тотальная функция «Setup outcomes» + принимает answers: список «Answer» + возвращает список «Outcome» + пусть trouble равно («Argument trouble» от («Given of» от "arguments" и answers)) + если пусто trouble + то пустой список + иначе [запись «Outcome» с «code» равным 3 и «words» равным trouble] + +тотальная функция «Origin outcomes» + принимает answers: список «Answer» + возвращает список «Outcome» + если («Exit code of» от "origin" и answers) равен 0 + то пустой список + иначе [запись «Outcome» с «code» равным (если («Exit code of» от "origin" и answers) равен 1 то 1 иначе 3) и «words» равным («Spoken error» от («Errors of» от "origin" и answers))] + +тотальная функция «Body outcomes» + принимает answers: список «Answer» + возвращает список «Outcome» + «Chosen» от [(«When» от (не ((«Exit code of» от "body" и answers) равен 0)) и ([запись «Outcome» с «code» равным 1 и «words» равным (соединить [(«Refusal» от answers), "", "Дело не в отставании: разошлось ТЕЛО СЕМЕНИ — то, из чего собран двоичный,", "которым эта проверка и судит. Ключа обхода здесь нет.", "", («Said» от "body" и answers)] по "\n")])), + («When» от (пусто («Setting of» от "bypass" и "" и answers)) и (пустой список))] и ([запись «Outcome» с «code» равным 0 и «words» равным (соединить [(«Bypass»), ": судим при отставшем семени по прямому указанию.\nОтвет этой проверки — про дерево, собранное из СТАРОГО семени."] по "")]) + +тотальная функция «Settled» + принимает stages: число, answers: список «Answer» + возвращает список «Outcome» + «Chosen» от [(«When» от (stages равен 3) и («Setup outcomes» от answers)), + («When» от (stages равен 2) и («Origin outcomes» от answers)), + («When» от (stages равен 1) и («Body outcomes» от answers))] и (пустой список) + +тотальная функция «Not compared» + принимает answers: список «Answer» + возвращает «Outcome» + запись «Outcome» с «code» равным 3 и «words» равным (соединить [(соединить ["СЕМЯ СВЕРИТЬ НЕ УДАЛОСЬ — судить о доказательствах нельзя: ", («Asker of» от answers)] по ""), + "", + («Said» от "inputs" и answers), + "", + (соединить ["Сверка входов печати ответила кодом ", (к строке («Exit code of» от "inputs" и answers)), " и ни одного расхождения не назвала."] по ""), + (соединить ["Судить всё равно: ", («Bypass»), "=1 <та же команда>"] по "")] по "\n") + +тотальная функция «Lag» + принимает amount: число, answers: список «Answer» + возвращает «Outcome» + запись «Outcome» с «code» равным 1 и «words» равным (соединить («Gathered words» от [[(«Refusal» от answers), + "", + (соединить ["семя отстало от исходников на ", (к строке amount), " ", («Files word» от amount), ", ведомость показывает состояние,"] по ""), + (соединить ["которого нет; перепечатайте `", («Reprint»), "`"] по ""), + "", + "Двоичный собран из семени и знает СТАРЫЕ правила. Его зелёный ответ — про", + "дерево, которого в этой копии нет: правка есть в исходнике и отсутствует в", + "семени. Ровно так 21–22 августа 2026 трижды за сутки лежали в стволе", + "неработающими правило ядра, четвёртый вердикт и два поручения ввода-вывода.", + "", + (соединить ["Что разошлось (весь список — `", («Reprint»), " --bystro`):"] по "")], + («Shown» от («Said» от "inputs" и answers) и amount), + ["", + "Перепечатка стоит 8 ч 34 мин одного ядра (docs/reprint-ledger.tsv), и это", + "не то, что делают между делом. Знаешь про отставание и берёшь ответ на", + "себя — скажи это вслух:", + "", + (соединить [" ", («Bypass»), "=1 <та же команда>"] по "")]]) по "\n") + +тотальная функция «Verdict of» + принимает answers: список «Answer» + возвращает «Outcome» + пусть amount равно (длина («Lagging» от («Said» от "inputs" и answers))) + «Chosen» от [(«When» от ((«Exit code of» от "inputs" и answers) равен 0) и (запись «Outcome» с «code» равным 0 и «words» равным (соединить ["семя не отстало от исходников: ", («Asker of» от answers)] по ""))), + («When» от (amount равен 0) и («Not compared» от answers))] и («Lag» от amount и answers) + +тотальная функция «Ending» + принимает outcome: «Outcome» + возвращает «Продолжение» + пример «Code zero ends the work» + дано outcome равно запись «Outcome» с «code» равным 0 и «words» равным "семя не отстало" + ожидается вариант «Конец работы» с значение равным "семя не отстало" + пример «Code one is a lag found by the plan» + дано outcome равно запись «Outcome» с «code» равным 1 и «words» равным "семя отстало" + ожидается вариант «Провал» с код равным "FLANG_SEED_LAGS" и сообщение равным "семя отстало" + пример «Any other code means there was nothing to look with» + дано outcome равно запись «Outcome» с «code» равным 3 и «words» равным "сверить не удалось" + ожидается вариант «Не проверено» с код равным "FLANG_SEED_NOT_COMPARED" и сообщение равным "сверить не удалось" + «Chosen» от [(«When» от ((outcome.«code») равен 0) и (вариант «Конец работы» с значение равным (outcome.«words»))), + («When» от ((outcome.«code») равен 1) и (вариант «Провал» с код равным "FLANG_SEED_LAGS" и сообщение равным (outcome.«words»)))] и (вариант «Не проверено» с код равным "FLANG_SEED_NOT_COMPARED" и сообщение равным (outcome.«words»)) + +тотальная функция «Proceed» + принимает queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + разбор queue + случай голова и хвост + то «Ask» от (голова) и (хвост) и stages и answers + случай пусто + то разбор («Settled» от stages и answers) + случай голова и хвост + то «Ending» от (голова) + случай пусто + то если stages не больше 0 + то «Ending» от («Verdict of» от answers) + иначе «Proceed» от («Stage» от (stages минус 1) и answers) и (stages минус 1) и answers + +тотальная функция «Begin» + возвращает «Inquiry» + «Begin with» от 4 + +тотальная функция «Next» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает «Продолжение» + «Proceed» от (inquiry.«queue») и (inquiry.«stages») и («Heard» от inquiry и reply) + +план «Check» + состояние «Inquiry» + начинает с «Begin» + обрабатывает «Next» diff --git a/scripts/seed/seed-freshness.sh b/scripts/seed/seed-freshness.sh index 54b1bfd72..9e51324f4 100755 --- a/scripts/seed/seed-freshness.sh +++ b/scripts/seed/seed-freshness.sh @@ -1,115 +1,3 @@ #!/bin/sh -# SPDX-FileCopyrightText: 2026 Digitable (Marat Zimnurov) -# SPDX-License-Identifier: BSD-2-Clause -# -# Отказ судить о доказательствах, пока семя отстало от исходников или двоичный -# не собирается из семени. Порядок: двоичный (binary-origin.sh) → тело семени -# (bootstrap-reprint.sh --telo, ключа обхода нет) → ключ обхода → входы печати (--bystro). -# -# Как звать: -# sh scripts/seed/seed-freshness.sh только ответить -# sh scripts/seed/seed-freshness.sh --chto "<имя>" ... назвать, кто спрашивает -# sh scripts/seed/seed-freshness.sh -- <команда…> отказать или запустить -# Обход (вслух): SEMYA_OTSTALO_ZNAYU=1 — только сверка семени с исходниками; -# сверку двоичного снимает свой ключ FLANG_BINARY_UNKNOWN_OK, одним обе нельзя. -# -# Коды: 0 — семя отвечает исходникам, двоичный семени (или ключ обхода); -# 1 — отстало либо двоичный чужой, судить отказано; 3 — сверить не удалось. -# см. docs/zettel/a-proof-ledger-taken-with-a-stale-seed-shows-a-tree-that-does-not-exist.md -set -eu - -ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/../.." && pwd) -BYPASS=SEMYA_OTSTALO_ZNAYU -FAST="sh scripts/bootstrap-reprint.sh --bystro" - -err() { printf '%s\n' "$*" >&2; } - -what="эта проверка" -while [ $# -gt 0 ]; do - case $1 in - --chto) [ $# -ge 2 ] || { err "--chto без имени"; exit 3; }; what=$2; shift 2 ;; - --) shift; break ;; - -*) err "неизвестный довод: $1"; exit 3 ;; - *) break ;; - esac -done - -skolko_faylov() { printf '%s\n' "$1" | grep -c 'перепечатки$' || true; } - -fajlov() { - case $1 in - *1[1-4]) printf 'файлов' ;; - *1) printf 'файл' ;; - *[2-4]) printf 'файла' ;; - *) printf 'файлов' ;; - esac -} - -# ── Двоичный обязан собираться из семени, лежащего рядом ───────────────────── -ORIGIN=$ROOT/scripts/seed/binary-origin.sh -if [ -f "$ORIGIN" ]; then - sh "$ORIGIN" --чем "$what" || exit $? -fi - -# ── Тело семени: спрашивается ДО ключа обхода, и ключом не глушится ───────── -TELO="sh scripts/bootstrap-reprint.sh --telo" -rc=0 -telo_out=$(cd "$ROOT" && $TELO 2>&1) || rc=$? -if [ "$rc" != 0 ]; then - err "ОТКАЗЫВАЮСЬ СУДИТЬ О ДОКАЗАТЕЛЬСТВАХ: $what" - err "" - err "Дело не в отставании: разошлось ТЕЛО СЕМЕНИ — то, из чего собран двоичный," - err "которым эта проверка и судит. Ключа обхода здесь нет." - err "" - printf '%s\n' "$telo_out" >&2 - exit 1 -fi - -# ── Обход по ключу: разрешаем, но вслух ────────────────────────────────────── -if [ -n "${SEMYA_OTSTALO_ZNAYU:-}" ]; then - err "$BYPASS: судим при отставшем семени по прямому указанию." - err "Ответ этой проверки — про дерево, собранное из СТАРОГО семени." - if [ $# -gt 0 ]; then exec "$@"; fi - exit 0 -fi - -# ── Сверка входов печати. Стоит полсекунды и двоичного не зовёт ───────────── -rc=0 -out=$(cd "$ROOT" && $FAST 2>&1) || rc=$? -if [ "$rc" = 0 ]; then - if [ $# -gt 0 ]; then exec "$@"; fi - exit 0 -fi - -n=$(skolko_faylov "$out") - -if [ "$n" = 0 ]; then - err "СЕМЯ СВЕРИТЬ НЕ УДАЛОСЬ — судить о доказательствах нельзя: $what" - err "" - printf '%s\n' "$out" >&2 - err "" - err "Сверка входов печати ответила кодом $rc и ни одного расхождения не назвала." - err "Судить всё равно: $BYPASS=1 <та же команда>" - exit 3 -fi - -err "ОТКАЗЫВАЮСЬ СУДИТЬ О ДОКАЗАТЕЛЬСТВАХ: $what" -err "" -err "семя отстало от исходников на $n $(fajlov "$n"), ведомость показывает состояние," -err "которого нет; перепечатайте \`sh scripts/bootstrap-reprint.sh\`" -err "" -err "Двоичный собран из семени и знает СТАРЫЕ правила. Его зелёный ответ — про" -err "дерево, которого в этой копии нет: правка есть в исходнике и отсутствует в" -err "семени. Ровно так 21–22 августа 2026 трижды за сутки лежали в стволе" -err "неработающими правило ядра, четвёртый вердикт и два поручения ввода-вывода." -err "" -err "Что разошлось (весь список — \`$FAST\`):" -printf '%s\n' "$out" | grep '^ • ' | head -8 >&2 -if [ "$n" -gt 8 ]; then err " …и ещё $((n - 8))"; fi -err "" -err "Перепечатка стоит 8 ч 34 мин одного ядра (docs/reprint-ledger.tsv), и это" -err "не то, что делают между делом. Знаешь про отставание и берёшь ответ на" -err "себя — скажи это вслух:" -err "" -err " $BYPASS=1 <та же команда>" -exit 1 +root=$(CDPATH= cd -- "$(dirname -- "$0")/../.." && pwd) +exec "$root/bootstrap/flang" io "$root/scripts/seed/seed-freshness.fscript" --plan Check --timeout 300000 diff --git a/scripts/seed/seed-refresh.sh b/scripts/seed/seed-refresh.sh index f161bf400..c040a14af 100755 --- a/scripts/seed/seed-refresh.sh +++ b/scripts/seed/seed-refresh.sh @@ -213,10 +213,10 @@ if sh "$ROOT/$PEREPECHATKA" --telo >/dev/null 2>&1; then else say " КРАСЕН bootstrap-reprint.sh --telo"; OK=1 fi -if sh "$ROOT/scripts/seed/seed-runtime-is-source.sh" --после-печати >/dev/null 2>&1; then - say " зелен seed-runtime-is-source.sh --после-печати (семя = источник)" +if sh "$ROOT/scripts/seed/seed-runtime-is-source.fscript" --после-печати >/dev/null 2>&1; then + say " зелен seed-runtime-is-source.fscript --после-печати (семя = источник)" else - say " КРАСЕН seed-runtime-is-source.sh --после-печати"; OK=1 + say " КРАСЕН seed-runtime-is-source.fscript --после-печати"; OK=1 fi say "" say "версия собранного двоичного: $(./bootstrap/flang --version 2>&1 | head -1)" diff --git a/scripts/seed/seed-runtime-is-source.fscript b/scripts/seed/seed-runtime-is-source.fscript new file mode 100644 index 000000000..f39d6db67 --- /dev/null +++ b/scripts/seed/seed-runtime-is-source.fscript @@ -0,0 +1,282 @@ +модуль «Seed runtime is source» + использует «Rules» из "../rules.fscript" + использует «Inquiry» из "../inquiry.fscript" + использует «Reading» из "../reading.fscript" + использует «Lists» только «Соединить списки» + +тотальная функция «Root» + возвращает строка + "../.." + +тотальная функция «Runtime files» + возвращает список строки + ["flang_repl.c", "flang_cli.c", "flang_runtime.c", "flang_runtime.h"] + +тотальная функция «Seed path» + принимает name: строка + возвращает строка + пример «The seed copy lies in the bootstrap directory» + дано name равно "flang_cli.c" + ожидается "bootstrap/flang_cli.c" + соединить ["bootstrap/", name] по "" + +тотальная функция «Source path» + принимает name: строка + возвращает строка + пример «The source lies beside the C emitter» + дано name равно "flang_cli.c" + ожидается "flang/src/emit/c/flang_cli.c" + соединить ["flang/src/emit/c/", name] по "" + +тотальная функция «Opening» + принимает name: строка + возвращает строка + соединить ["opening ", name] по "" + +тотальная функция «Position» + принимает name: строка + возвращает строка + соединить ["position ", name] по "" + +тотальная функция «Difference» + принимает name: строка + возвращает строка + соединить ["difference ", name] по "" + +тотальная функция «Opened» + принимает name: строка, answers: список «Answer» + возвращает признак + («Exit code of» от («Opening» от name) и answers) равен 0 + +тотальная функция «Found» + принимает name: строка, answers: список «Answer» + возвращает признак + («Opened» от name и answers) и притом ((«Exit code of» от («Position» от name) и answers) равен 0) + +тотальная функция «Openings» + возвращает список «Question» + отобразить («Runtime files») как name → «Run from» от («Opening» от name) и («Root») и "head" и ["-n", "1", («Source path» от name)] + +тотальная функция «Positions» + принимает answers: список «Answer» + возвращает список «Question» + отобразить (отфильтровать («Runtime files») где name → «Opened» от name и answers) как name → «Run from» от («Position» от name) и («Root») и "env" и ["LC_ALL=C.UTF-8", "grep", "-n", "-m1", "-F", "-x", "--", («First line» от («Output of» от («Opening» от name) и answers)), («Seed path» от name)] + +тотальная функция «Header end» + принимает name: строка, answers: список «Answer» + возвращает строка + «Leading digits» от («Output of» от («Position» от name) и answers) + +тотальная функция «Differences» + принимает answers: список «Answer» + возвращает список «Question» + отобразить (отфильтровать («Runtime files») где name → «Found» от name и answers) как name → «Run from» от («Difference» от name) и («Root») и "sh" и ["-c", "tail -n +\"$0\" \"$1\" | diff - \"$2\"", («Header end» от name и answers), («Seed path» от name), («Source path» от name)] + +тотальная функция «Stage» + принимает stages: число, answers: список «Answer» + возвращает список «Question» + если (stages меньше 0) или (stages больше 2) + то пустой список + иначе элемент (3 минус stages) в [(«Openings»), («Positions» от answers), («Differences» от answers)] + +тотальная функция «Is a change» + принимает line: строка + возвращает признак + пример «A line taken from the seed is a change» + дано line равно "< int old;" + ожидается да + пример «A line number of the difference is not» + дано line равно "12c12" + ожидается нет + (line начинается с "<") или (line начинается с ">") + +тотальная функция «Is a version change» + принимает line: строка + возвращает признак + пример «The version definition is counted apart» + дано line равно "> #define FLANG_VERSION \"0.7.22\"" + ожидается да + пример «Any other definition is an ordinary change» + дано line равно "> #define FLANG_LIMIT 5" + ожидается нет + (line начинается с "< #define FLANG_VERSION ") или (line начинается с "> #define FLANG_VERSION ") + +тотальная функция «Changes» + принимает name: строка, answers: список «Answer» + возвращает список строки + отфильтровать («Lines» от («Output of» от («Difference» от name) и answers)) где line → «Is a change» от line + +тотальная функция «Version changes» + принимает name: строка, answers: список «Answer» + возвращает число + длина (отфильтровать («Changes» от name и answers) где line → «Is a version change» от line) + +тотальная функция «Padded» + принимает text: строка, width: число + возвращает строка + пример «A short name is padded on the right» + дано text равно "flang_cli.c" + дано width равно 18 + ожидается "flang_cli.c " + пример «A long name is left as it is» + дано text равно "flang_runtime_long.c" + дано width равно 18 + ожидается "flang_runtime_long.c" + если (длина text) не меньше width + то text + иначе подстрока (соединить [text, " "] по "") с 1 по width + +тотальная функция «Aligned» + принимает count: число + возвращает строка + пример «One digit is moved to the right» + дано count равно 9 + ожидается " 9" + пример «Two digits fill the width» + дано count равно 14 + ожидается "14" + если count меньше 10 + то соединить [" ", (к строке count)] по "" + иначе к строке count + +тотальная функция «Measure» + принимает name: строка, header: число, changed: число, versions: число + возвращает строка + пример «A body that caught up with the source» + дано name равно "flang_repl.c" + дано header равно 9 + дано changed равно 0 + дано versions равно 0 + ожидается "flang_repl.c шапка 9 строк, тело отстало на 0 строк" + пример «A lagging body with the version counted apart» + дано name равно "flang_runtime.h" + дано header равно 14 + дано changed равно 7 + дано versions равно 2 + ожидается "flang_runtime.h шапка 14 строк, тело отстало на 5 строк, плюс версия" + соединить [(«Padded» от name и 18), " шапка ", («Aligned» от header), " строк, тело отстало на ", (к строке (changed минус versions)), " строк", (если versions больше 0 то ", плюс версия" иначе "")] по "" + +тотальная функция «Is strict» + принимает answers: список «Answer» + возвращает признак + («Given of» от "mode" и answers) содержит "after print" + +тотальная функция «Lag» + принимает name: строка, answers: список «Answer» + возвращает число + если «Found» от name и answers + то длина («Changes» от name и answers) + иначе 0 + +тотальная функция «Is troubled» + принимает name: строка, answers: список «Answer» + возвращает признак + (не («Found» от name и answers)) или ((«Is strict» от answers) и притом ((«Lag» от name и answers) больше 0)) + +тотальная функция «Shown changes» + принимает name: строка, answers: список «Answer» + возвращает список строки + пусть changes равно («Changes» от name и answers) + если «Is troubled» от name и answers + то отфильтровать (отобразить [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] как position → если position больше (длина changes) то "" иначе (элемент position в changes)) где line → не (пусто line) + иначе пустой список + +тотальная функция «Account» + принимает name: строка, answers: список «Answer» + возвращает список строки + «Chosen» от [(«When» от (не («Opened» от name и answers)) и ([(соединить ["НЕТ ФАЙЛА: ", («Seed path» от name), " или ", («Source path» от name)] по "")])), + («When» от ((не («Found» от name и answers)) и притом ((«Exit code of» от («Position» от name) и answers) равен 1)) и ([(соединить ["ПРИЁМ БОЛЬШЕ НЕ ЗАКОНЕН: ", name, " — первой строки источника в семени нет вовсе"] по "")])), + («When» от (не («Found» от name и answers)) и ([(соединить ["НЕТ ФАЙЛА: ", («Seed path» от name), " или ", («Source path» от name)] по "")]))] и (приписать («Measure» от name и ((«Count» от («Header end» от name и answers)) минус 1) и (длина («Changes» от name и answers)) и («Version changes» от name и answers)) к («Shown changes» от name и answers)) + +тотальная функция «Accounts» + принимает answers: список «Answer» + возвращает список строки + «Gathered words» от (отобразить («Runtime files») как name → «Account» от name и answers) + +тотальная функция «Troubled» + принимает answers: список «Answer» + возвращает число + длина (отфильтровать («Runtime files») где name → «Is troubled» от name и answers) + +тотальная функция «Whole lag» + принимает answers: список «Answer» + возвращает число + свёртка («Runtime files») начиная с 0 как lag и name → lag плюс («Lag» от name и answers) + +тотальная функция «Refusal» + принимает strict: признак, troubled: число + возвращает список строки + пример «After a print the seed has to be the source» + дано strict равно да + дано troubled равно 2 + ожидается ["", "ПОСЛЕ ПЕЧАТИ СЕМЯ ОБЯЗАНО СОВПАСТЬ С ИСТОЧНИКОМ, а разошлось в 2", "файл(е/ах). Либо печать копирует уже не дословно, либо источник", "правили ПОСЛЕ того, как печать началась."] + пример «In the middle of work only a lost header is a trouble» + дано strict равно нет + дано troubled равно 1 + ожидается ["", "ПРИЁМ «ШАПКА + ИСТОЧНИК» БОЛЬШЕ НЕ ЗАКОНЕН: в 1 файл(е/ах) первой", "строки источника в семени нет вовсе. Значит печать копирует рантайм", "уже не дословно, и правку в нём без перепечатки проверить нельзя."] + если strict + то ["", (соединить ["ПОСЛЕ ПЕЧАТИ СЕМЯ ОБЯЗАНО СОВПАСТЬ С ИСТОЧНИКОМ, а разошлось в ", (к строке troubled)] по ""), "файл(е/ах). Либо печать копирует уже не дословно, либо источник", "правили ПОСЛЕ того, как печать началась."] + иначе ["", (соединить ["ПРИЁМ «ШАПКА + ИСТОЧНИК» БОЛЬШЕ НЕ ЗАКОНЕН: в ", (к строке troubled), " файл(е/ах) первой"] по ""), "строки источника в семени нет вовсе. Значит печать копирует рантайм", "уже не дословно, и правку в нём без перепечатки проверить нельзя."] + +тотальная функция «Approval» + принимает lag: число + возвращает список строки + пример «A seed equal to the source» + дано lag равно 0 + ожидается ["", "приём «шапка + источник» законен: первая строка источника найдена во всех четырёх", "семя совпадает с источником полностью"] + пример «A lag in the middle of work is the norm» + дано lag равно 12 + ожидается ["", "приём «шапка + источник» законен: первая строка источника найдена во всех четырёх", "семя отстало от источника на 12 строк — это НОРМА посреди правки,", "сойдётся перепечаткой; после неё звать план «After print»"] + если lag больше 0 + то ["", "приём «шапка + источник» законен: первая строка источника найдена во всех четырёх", (соединить ["семя отстало от источника на ", (к строке lag), " строк — это НОРМА посреди правки,"] по ""), "сойдётся перепечаткой; после неё звать план «After print»"] + иначе ["", "приём «шапка + источник» законен: первая строка источника найдена во всех четырёх", "семя совпадает с источником полностью"] + +тотальная функция «Broken differences» + принимает answers: список «Answer» + возвращает список строки + отфильтровать («Runtime files») где name → («Found» от name и answers) и притом ((«Exit code of» от («Difference» от name) и answers) больше 1) + +тотальная функция «Verdict» + принимает answers: список «Answer» + возвращает «Продолжение» + «Chosen» от [(«When» от ((длина («Broken differences» от answers)) больше 0) и (вариант «Не проверено» с код равным "FLANG_SEED_RUNTIME_NOT_COMPARED" и сообщение равным (соединить ["НЕ ПРОВЕРЕНО: diff не отработал на ", (соединить («Broken differences» от answers) по ", ")] по ""))), + («When» от ((«Troubled» от answers) больше 0) и (вариант «Провал» с код равным "FLANG_SEED_RUNTIME_DIFFERS" и сообщение равным (соединить («Соединить списки» от («Accounts» от answers) и («Refusal» от («Is strict» от answers) и («Troubled» от answers))) по "\n")))] и (вариант «Конец работы» с значение равным (соединить («Соединить списки» от («Accounts» от answers) и («Approval» от («Whole lag» от answers))) по "\n")) + +тотальная функция «Proceed» + принимает queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + разбор queue + случай голова и хвост + то «Ask» от (голова) и (хвост) и stages и answers + случай пусто + то если stages не больше 0 + то «Verdict» от answers + иначе «Proceed» от («Stage» от (stages минус 1) и answers) и (stages минус 1) и answers + +тотальная функция «Begin in mode» + принимает mode: строка + возвращает «Inquiry» + запись «Inquiry» с «asked» равным "" и «queue» равным пустой список и «stages» равным 3 и «answers» равным [запись «Answer» с «name» равным "mode" и «reply» равным (вариант «Доводы» с доводы равным [mode])] + +тотальная функция «Begin check» + возвращает «Inquiry» + «Begin in mode» от "check" + +тотальная функция «Begin after print» + возвращает «Inquiry» + «Begin in mode» от "after print" + +тотальная функция «Next» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает «Продолжение» + «Proceed» от (inquiry.«queue») и (inquiry.«stages») и («Heard» от inquiry и reply) + +план «Check» + состояние «Inquiry» + начинает с «Begin check» + обрабатывает «Next» + +план «After print» + состояние «Inquiry» + начинает с «Begin after print» + обрабатывает «Next» diff --git a/scripts/seed/seed-runtime-is-source.sh b/scripts/seed/seed-runtime-is-source.sh deleted file mode 100755 index 70e48e078..000000000 --- a/scripts/seed/seed-runtime-is-source.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/sh -# SPDX-FileCopyrightText: 2026 Digitable (Marat Zimnurov) -# SPDX-License-Identifier: BSD-2-Clause -# -# Семя рантайма — это источник (flang/src/emit/c/*) плюс шапка, и больше ничего. -# Сторож проверяет, что приём «шапка + источник» ещё законен: первая строка -# источника есть в семени. Отставание тел — сведение, не беда. -# -# Как звать: sh scripts/seed/semya-rantayma-eto-istochnik.sh [--после-печати] -# со ключом — сразу после печати: семя обязано совпасть с источником полностью. -# -# Коды: 0 — приём законен (в строгом ладу — совпало полностью); 1 — приём сломан -# (в строгом ладу — разошлось); 2 — непонятный ключ; 5 — нет корня/времянки. -# см. docs/zettel/the-runtime-seed-is-the-source-plus-a-header-and-lagging-mid-work-is-normal.md -set -u -STROGO=0 -for d in "$@"; do - case "$d" in - --после-печати) STROGO=1 ;; - *) printf 'непонятный ключ: %s (знаю только --после-печати)\n' "$d" >&2; exit 2 ;; - esac -done -ROOT=$(cd "$(dirname "$0")/../.." && pwd) -cd "$ROOT" || exit 5 -RAB=${FLANG_TMP:-/srv/tmp}/semya-rantayma.$$ -mkdir -p "$RAB" || exit 5 -trap 'rm -rf "$RAB"' EXIT INT TERM -BEDA=0 -VERSIY=0 -OTSTALO=0 -for b in flang_repl.c flang_cli.c flang_runtime.c flang_runtime.h; do - SEMYA=bootstrap/$b - IST=flang/src/emit/c/$b - if [ ! -f "$SEMYA" ] || [ ! -f "$IST" ]; then - printf 'НЕТ ФАЙЛА: %s или %s\n' "$SEMYA" "$IST" >&2 - BEDA=$((BEDA+1)); continue - fi - PERV=$(head -1 "$IST") - N=$(LC_ALL=C.UTF-8 grep -n -m1 -F -x -- "$PERV" "$SEMYA" | cut -d: -f1) - if [ -z "$N" ]; then - printf 'ПРИЁМ БОЛЬШЕ НЕ ЗАКОНЕН: %s — первой строки источника в семени нет вовсе\n' "$b" >&2 - BEDA=$((BEDA+1)); continue - fi - tail -n +"$N" "$SEMYA" > "$RAB/telo" - diff "$RAB/telo" "$IST" > "$RAB/razn" 2>&1 - # Строки расхождения, кроме именованного послабления про версию. - PROCHIE=$(LC_ALL=C.UTF-8 grep '^[<>]' "$RAB/razn" \ - | LC_ALL=C.UTF-8 grep -cv '^[<>] #define FLANG_VERSION ' || true) - VER=$(LC_ALL=C.UTF-8 grep -c '^[<>] #define FLANG_VERSION ' "$RAB/razn" || true) - VERSIY=$((VERSIY+VER)) - printf '%-18s шапка %2d строк, тело отстало на %s строк' "$b" "$((N-1))" "$PROCHIE" - if [ "$VER" -gt 0 ]; then printf ', плюс версия'; fi - printf '\n' - OTSTALO=$((OTSTALO+PROCHIE+VER)) - if [ "$STROGO" = 1 ] && [ "$((PROCHIE+VER))" -gt 0 ]; then - LC_ALL=C.UTF-8 grep '^[<>]' "$RAB/razn" | head -20 >&2 - BEDA=$((BEDA+1)) - fi -done -if [ "$BEDA" -gt 0 ]; then - if [ "$STROGO" = 1 ]; then - printf '\nПОСЛЕ ПЕЧАТИ СЕМЯ ОБЯЗАНО СОВПАСТЬ С ИСТОЧНИКОМ, а разошлось в %d\n' "$BEDA" >&2 - printf 'файл(е/ах). Либо печать копирует уже не дословно, либо источник\n' >&2 - printf 'правили ПОСЛЕ того, как печать началась.\n' >&2 - else - printf '\nПРИЁМ «ШАПКА + ИСТОЧНИК» БОЛЬШЕ НЕ ЗАКОНЕН: в %d файл(е/ах) первой\n' "$BEDA" >&2 - printf 'строки источника в семени нет вовсе. Значит печать копирует рантайм\n' >&2 - printf 'уже не дословно, и правку в нём без перепечатки проверить нельзя.\n' >&2 - fi - exit 1 -fi -printf '\nприём «шапка + источник» законен: первая строка источника найдена во всех четырёх' -if [ "$OTSTALO" -gt 0 ]; then - printf '\nсемя отстало от источника на %d строк — это НОРМА посреди правки,' "$OTSTALO" - printf '\nсойдётся перепечаткой; после неё звать с --после-печати' -else - printf '\nсемя совпадает с источником полностью' -fi -printf '\n' -exit 0 diff --git a/scripts/seed/two-prints-identical.fscript b/scripts/seed/two-prints-identical.fscript new file mode 100644 index 000000000..1abd1f486 --- /dev/null +++ b/scripts/seed/two-prints-identical.fscript @@ -0,0 +1,684 @@ +модуль «Two prints identical» + использует «Lists» только «Соединить списки» + использует «Rules» из "../rules.fscript" + использует «Inquiry» из "../inquiry.fscript" + использует «Reading» из "../reading.fscript" + +объект «Finding» + «journal»: строка + «mark»: строка + «trouble»: строка + +объект «Outcome» + «same»: признак + «files»: число + «bytes»: число + «lines»: список строки + +тотальная функция «Usage» + возвращает строка + "звать: bootstrap/flang io scripts/seed/two-prints-identical.fscript -- <каталог-1> <каталог-2>" + +тотальная функция «Sides» + возвращает список строки + ["first", "second"] + +тотальная функция «Given tree» + принимает side: строка, answers: список «Answer» + возвращает строка + пусть trees равно («Given of» от "arguments" и answers) + если (длина trees) равен 2 + то элемент (если side равен "first" то 1 иначе 2) в trees + иначе "" + +тотальная функция «Absolute» + принимает path: строка, answers: список «Answer» + возвращает строка + если path начинается с "/" + то path + иначе соединить [(«Setting of» от "caller" и "." и answers), "/", path] по "" + +тотальная функция «Tree» + принимает side: строка, answers: список «Answer» + возвращает строка + «Absolute» от («Given tree» от side и answers) и answers + +тотальная функция «Named journal» + принимает side: строка, answers: список «Answer» + возвращает строка + «Setting of» от (соединить ["named ", side] по "") и "" и answers + +тотальная функция «Is a journal name» + принимает name: строка + возвращает признак + пример «A visible name with the log ending» + дано name равно "print.log" + ожидается да + пример «A hidden name is not taken» + дано name равно ".print.log" + ожидается нет + пример «Another ending is not taken» + дано name равно "print.txt" + ожидается нет + («Ends with» от name и ".log") и притом (не (name начинается с ".")) + +тотальная функция «Beside» + принимает side: строка, answers: список «Answer» + возвращает список строки + отфильтровать («Lines» от («Output of» от (соединить ["beside ", side] по "") и answers)) где name → «Is a journal name» от name + +тотальная функция «Regular question» + принимает side: строка, name: строка + возвращает строка + соединить ["journal file ", side, " ", name] по "" + +тотальная функция «Journals» + принимает side: строка, answers: список «Answer» + возвращает список строки + отфильтровать («Beside» от side и answers) где name → («Exit code of» от («Regular question» от side и name) и answers) равен 0 + +тотальная функция «Raw journal» + принимает side: строка, name: строка, answers: список «Answer» + возвращает строка + соединить [(«Given tree» от side и answers), "/../", name] по "" + +тотальная функция «Last of» + принимает values: список строки + возвращает строка + пример «The last of three» + дано values равно ["one", "two", "three"] + ожидается "three" + пример «Nothing has no last» + дано values равно пустой список + ожидается "" + свёртка values начиная с "" как last и value → value + +тотальная функция «Candidate» + принимает side: строка, answers: список «Answer» + возвращает строка + пусть named равно («Named journal» от side и answers) + пусть journals равно («Journals» от side и answers) + «Chosen» от [(«When» от ((не (пусто named)) и притом ((«Exit code of» от (соединить ["named file ", side] по "") и answers) равен 0)) и named), + («When» от (не (пусто named)) и ""), + («When» от ((длина journals) равен 1) и («Raw journal» от side и («Last of» от journals) и answers))] и "" + +тотальная функция «Directory of» + принимает path: строка + возвращает строка + пример «Everything before the last slash» + дано path равно "/srv/tmp/print/../print.log" + ожидается "/srv/tmp/print/.." + пример «A bare name lies in the current directory» + дано path равно "print.log" + ожидается "." + пример «A file of the root lies in the root» + дано path равно "/print.log" + ожидается "/" + пусть parts равно (разделить path по "/") + пусть cut равно (((длина path) минус (длина («Last of» от parts))) минус 1) + пусть above равно (если cut меньше 1 то "" иначе (подстрока path с 1 по cut)) + «Chosen» от [(«When» от ((длина parts) равен 1) и "."), + («When» от (пусто above) и "/")] и above + +тотальная функция «Located» + принимает side: строка, answers: список «Answer» + возвращает строка + пусть candidate равно («Candidate» от side и answers) + пусть place равно («First line» от («Output of» от (соединить ["place ", side] по "") и answers)) + если (пусто candidate) или (пусто place) + то candidate + иначе соединить [place, "/", («Last of» от (разделить candidate по "/"))] по "" + +тотальная функция «Numbers after» + принимает mark: строка, line: строка + возвращает список строки + пример «Every number that follows the mark» + дано mark равно "код=" + дано line равно "КОНЕЦ код=1 потом код=0 и код=нет" + ожидается ["1", "0"] + пример «A line without the mark has no numbers» + дано mark равно "код=" + дано line равно "КОНЕЦ" + ожидается пустой список + разбор (разделить line по mark) + случай пусто + то пустой список + случай голова и хвост + то отфильтровать (отобразить хвост как part → «Leading digits» от part) где digits → не (пусто digits) + +тотальная функция «Print codes» + принимает lines: список строки + возвращает список строки + «Gathered words» от (отобразить lines как line → «Numbers after» от "ПЕЧАТЬ КОД=" и line) + +тотальная функция «End lines» + принимает lines: список строки + возвращает список строки + отфильтровать lines где line → line начинается с "КОНЕЦ" + +тотальная функция «End codes» + принимает lines: список строки + возвращает список строки + «Gathered words» от (отобразить («End lines» от lines) как line → «Numbers after» от "код=" и line) + +тотальная функция «Without leading blanks» + принимает text: строка + возвращает строка + пример «Spaces and tabs before the value are dropped» + дано text равно " \t 143" + ожидается "143" + пример «Blanks inside the value are kept» + дано text равно " 143 killed" + ожидается "143 killed" + свёртка (разложить text на символы) начиная с "" как kept и sign → если (пусто kept) и притом ((sign равен " ") или (sign равен "\t")) то "" иначе (соединить [kept, sign] по "") + +тотальная функция «Exit status» + принимает lines: список строки + возвращает строка + пример «The status of the last line that names it» + дано lines равно ["Exit status: 0", "\tExit status: 143"] + ожидается "143" + пример «No line names the status» + дано lines равно ["КОНЕЦ код=0"] + ожидается "" + «Without leading blanks» от («Last of» от (разделить («Last of» от (отфильтровать lines где line → line содержит "Exit status:")) по "Exit status:")) + +тотальная функция «Success» + принимает journal: строка, mark: строка, code: строка + возвращает «Finding» + «Chosen» от [(«When» от (пусто code) и (запись «Finding» с «journal» равным journal и «mark» равным mark и «trouble» равным (соединить ["конец назван строкой «", mark, "», а кода в ней нет: ", journal] по ""))), + («When» от (code равен "0") и (запись «Finding» с «journal» равным journal и «mark» равным mark и «trouble» равным ""))] и (запись «Finding» с «journal» равным journal и «mark» равным mark и «trouble» равным (соединить ["печать кончилась НЕ УСПЕХОМ (код ", code, ", по «", mark, "»): ", journal] по "")) + +тотальная функция «End finding» + принимает journal: строка, lines: список строки + возвращает «Finding» + пусть code равно («Last of» от («End codes» от lines)) + пусть status равно («Exit status» от lines) + «Chosen» от [(«When» от (пусто code) и (запись «Finding» с «journal» равным journal и «mark» равным "КОНЕЦ … код=" и «trouble» равным (соединить ["строка «КОНЕЦ» есть, а кода в ней нет: ", journal] по ""))), + («When» от ((не (пусто status)) и притом (не (status равен code))) и (запись «Finding» с «journal» равным journal и «mark» равным "КОНЕЦ … код=" и «trouble» равным (соединить ["журнал сам себе противоречит: «КОНЕЦ … код=", code, "» против «Exit status: ", status, "» — ", journal, "\n Так соврал /srv/tmp/relizy/perepechatka-zahod1-ubita.log: код=0 на убитом\n прогоне. Пусть допишет «ПЕЧАТЬ КОД=<код>» тот, кто печать пустил."] по "")))] и («Success» от journal и "КОНЕЦ … код=" и code) + +тотальная функция «Read finding» + принимает journal: строка, lines: список строки + возвращает «Finding» + пример «A print that named its code zero is ready» + дано journal равно "/srv/tmp/first.log" + дано lines равно ["ПЕЧАТЬ КОД=7", "ПЕЧАТЬ КОД=0"] + ожидается запись «Finding» с «journal» равным "/srv/tmp/first.log" и «mark» равным "ПЕЧАТЬ КОД=" и «trouble» равным "" + пример «A print that ended with another code is not» + дано journal равно "/srv/tmp/first.log" + дано lines равно ["ПЕЧАТЬ КОД=7"] + ожидается запись «Finding» с «journal» равным "/srv/tmp/first.log" и «mark» равным "ПЕЧАТЬ КОД=" и «trouble» равным "печать кончилась НЕ УСПЕХОМ (код 7, по «ПЕЧАТЬ КОД=»): /srv/tmp/first.log" + пример «An end line is believed only while the exit status agrees» + дано journal равно "/srv/tmp/first.log" + дано lines равно ["КОНЕЦ печати код=0", "Exit status: 143"] + ожидается запись «Finding» с «journal» равным "/srv/tmp/first.log" и «mark» равным "КОНЕЦ … код=" и «trouble» равным "журнал сам себе противоречит: «КОНЕЦ … код=0» против «Exit status: 143» — /srv/tmp/first.log\n Так соврал /srv/tmp/relizy/perepechatka-zahod1-ubita.log: код=0 на убитом\n прогоне. Пусть допишет «ПЕЧАТЬ КОД=<код>» тот, кто печать пустил." + пример «A journal without an end is not ready» + дано journal равно "/srv/tmp/first.log" + дано lines равно пустой список + ожидается запись «Finding» с «journal» равным "/srv/tmp/first.log" и «mark» равным "" и «trouble» равным "конца печати в журнале НЕТ: /srv/tmp/first.log\n ни «ПЕЧАТЬ КОД=<код>» (дописать обязан тот, кто пустил печать: для CI —\n работа .github/workflows/reprint.yml, для ручного прогона — оболочка\n запуска), ни «КОНЕЦ … код=<код>». Печать либо идёт, либо её оборвали,\n не закрыв журнал. Это НЕ «печати разошлись»." + «Chosen» от [(«When» от ((длина («Print codes» от lines)) больше 0) и («Success» от journal и "ПЕЧАТЬ КОД=" и («Last of» от («Print codes» от lines)))), + («When» от ((длина («End lines» от lines)) больше 0) и («End finding» от journal и lines))] и (запись «Finding» с «journal» равным journal и «mark» равным "" и «trouble» равным (соединить ["конца печати в журнале НЕТ: ", journal, "\n ни «ПЕЧАТЬ КОД=<код>» (дописать обязан тот, кто пустил печать: для CI —\n работа .github/workflows/reprint.yml, для ручного прогона — оболочка\n запуска), ни «КОНЕЦ … код=<код>». Печать либо идёт, либо её оборвали,\n не закрыв журнал. Это НЕ «печати разошлись»."] по "")) + +тотальная функция «Many journals» + принимает tree: строка, journals: список строки + возвращает строка + пример «Every journal is named and none is chosen» + дано tree равно "/p/tree" + дано journals равно ["/p/tree/../a.log", "/p/tree/../b.log"] + ожидается "рядом с /p/tree журналов 2, и какой из них ЭТОЙ печати — неизвестно:\n /p/tree/../a.log\n /p/tree/../b.log\n Брать самый свежий нельзя: так прибор уже прочёл отказ печати как успех\n (замер А1 2 сентября 2026, docs/zettel/two-logs-beside-a-print-tree-mean-unknown-not-take-the-newer.md).\n Назовите журналы прямо — FLANG_PRINT_LOG_1=… FLANG_PRINT_LOG_2=… — или дайте\n каждой печати свой родительский каталог." + соединить [(соединить ["рядом с ", tree, " журналов ", (к строке (длина journals)), ", и какой из них ЭТОЙ печати — неизвестно:"] по ""), (соединить (отобразить journals как journal → соединить [" ", journal] по "") по "\n"), " Брать самый свежий нельзя: так прибор уже прочёл отказ печати как успех", " (замер А1 2 сентября 2026, docs/zettel/two-logs-beside-a-print-tree-mean-unknown-not-take-the-newer.md).", " Назовите журналы прямо — FLANG_PRINT_LOG_1=… FLANG_PRINT_LOG_2=… — или дайте", " каждой печати свой родительский каталог."] по "\n" + +тотальная функция «Unfound» + принимает side: строка, answers: список «Answer» + возвращает «Finding» + пусть tree равно («Given tree» от side и answers) + пусть journals равно (отобразить («Journals» от side и answers) как name → «Raw journal» от side и name и answers) + «Chosen» от [(«When» от (не (пусто («Named journal» от side и answers))) и (запись «Finding» с «journal» равным "" и «mark» равным "" и «trouble» равным (соединить ["названный журнал не файл: ", («Named journal» от side и answers)] по ""))), + («When» от ((длина journals) равен 0) и (запись «Finding» с «journal» равным "" и «mark» равным "" и «trouble» равным (соединить ["журнала печати рядом с ", tree, " нет (ждём ", tree, "/../*.log)"] по "")))] и (запись «Finding» с «journal» равным («Last of» от journals) и «mark» равным "" и «trouble» равным («Many journals» от tree и journals)) + +тотальная функция «Finding of» + принимает side: строка, answers: список «Answer» + возвращает «Finding» + если пусто («Candidate» от side и answers) + то «Unfound» от side и answers + иначе «Read finding» от («Located» от side и answers) и («Lines» от («Output of» от (соединить ["marks ", side] по "") и answers)) + +тотальная функция «Troubles» + принимает answers: список «Answer» + возвращает список строки + отфильтровать (отобразить («Sides») как side → («Finding of» от side и answers).«trouble») где trouble → не (пусто trouble) + +тотальная функция «Share a journal» + принимает answers: список «Answer» + возвращает признак + пусть journal равно ((«Finding of» от "first" и answers).«journal») + (не (пусто journal)) и притом (journal равен ((«Finding of» от "second" и answers).«journal»)) + +тотальная функция «Wrong call» + принимает answers: список «Answer» + возвращает признак + не ((длина («Given of» от "arguments" и answers)) равен 2) + +тотальная функция «Not directories» + принимает answers: список «Answer» + возвращает список строки + отобразить (отфильтровать («Sides») где side → не ((«Exit code of» от (соединить ["directory ", side] по "") и answers) равен 0)) как side → «Given tree» от side и answers + +тотальная функция «Is called well» + принимает answers: список «Answer» + возвращает признак + (не («Wrong call» от answers)) и притом ((длина («Not directories» от answers)) равен 0) + +тотальная функция «Is ready» + принимает answers: список «Answer» + возвращает признак + ((«Is called well» от answers) и притом ((длина («Troubles» от answers)) равен 0)) и притом (не («Share a journal» от answers)) + +тотальная функция «Setup» + возвращает список «Question» + [(«Arguments» от "arguments"), («Environment» от "named first" и "FLANG_PRINT_LOG_1"), («Environment» от "named second" и "FLANG_PRINT_LOG_2"), («Environment» от "temporary" и "FLANG_TMP"), («Environment» от "caller" и "PWD")] + +тотальная функция «Directories» + принимает answers: список «Answer» + возвращает список «Question» + если «Wrong call» от answers + то пустой список + иначе отобразить («Sides») как side → «Run» от (соединить ["directory ", side] по "") и "test" и ["-d", («Tree» от side и answers)] + +тотальная функция «Lookup» + принимает side: строка, answers: список «Answer» + возвращает «Question» + если пусто («Named journal» от side и answers) + то «Run» от (соединить ["beside ", side] по "") и "env" и ["LC_ALL=C", "ls", "-A", (соединить [(«Tree» от side и answers), "/.."] по "")] + иначе «Run» от (соединить ["named file ", side] по "") и "test" и ["-f", («Absolute» от («Named journal» от side и answers) и answers)] + +тотальная функция «Lookups» + принимает answers: список «Answer» + возвращает список «Question» + если «Is called well» от answers + то отобразить («Sides») как side → «Lookup» от side и answers + иначе пустой список + +тотальная функция «Regular tests» + принимает answers: список «Answer» + возвращает список «Question» + «Gathered» от (отобразить («Sides») как side → отобразить («Beside» от side и answers) как name → «Run» от («Regular question» от side и name) и "test" и ["-f", (соединить [(«Tree» от side и answers), "/../", name] по "")]) + +тотальная функция «Found sides» + принимает answers: список «Answer» + возвращает список строки + отфильтровать («Sides») где side → не (пусто («Candidate» от side и answers)) + +тотальная функция «Places» + принимает answers: список «Answer» + возвращает список «Question» + отобразить («Found sides» от answers) как side → «Run from» от (соединить ["place ", side] по "") и («Directory of» от («Absolute» от («Candidate» от side и answers) и answers)) и "pwd" и ["-P"] + +тотальная функция «Marks» + принимает answers: список «Answer» + возвращает список «Question» + отобразить («Found sides» от answers) как side → «Run» от (соединить ["marks ", side] по "") и "env" и ["LC_ALL=C.UTF-8", "grep", "-a", "-e", "ПЕЧАТЬ КОД=[0-9]", "-e", "^КОНЕЦ", "-e", "Exit status:", («Absolute» от («Located» от side и answers) и answers)] + +тотальная функция «Work» + принимает answers: список «Answer» + возвращает строка + «Made of» от "work" и answers + +тотальная функция «Names question» + принимает side: строка + возвращает строка + соединить ["names ", side] по "" + +тотальная функция «Listings» + принимает answers: список «Answer» + возвращает список «Question» + если «Is ready» от answers + то приписать («Temporary directory» от "work" и (соединить [(«Setting of» от "temporary" и "/srv/tmp" и answers), "/two-prints-identical."] по "")) к («Соединить списки» от (отобразить («Sides») как side → «Run» от («Names question» от side) и "env" и ["LC_ALL=C", "ls", "-A", (соединить [(«Tree» от side и answers), "/flang/src/emit/c"] по "")]) и (отобразить («Sides») как side → «Read» от («Fingerprint question» от side) и (соединить [(«Tree» от side и answers), "/scripts/seed-fingerprint"] по ""))) + иначе пустой список + +тотальная функция «Fingerprint question» + принимает side: строка + возвращает строка + соединить ["fingerprint ", side] по "" + +тотальная функция «Body mark» + возвращает строка + "# ── тело семени ──\n" + +тотальная функция «Printed name» + принимает line: строка + возвращает строка + пример «A body line names a printed file» + дано line равно "ae75865bd84f bootstrap/compiler_flang.c" + ожидается "compiler_flang.c" + пример «A comment names nothing» + дано line равно "# То, что печать положила в bootstrap/" + ожидается "" + «After» от "bootstrap/" и («Word» от 2 и line) + +тотальная функция «Body names» + принимает fingerprint: строка + возвращает список строки + пример «Only the body after the mark is read» + дано fingerprint равно "11 flang/self/lexer.flang\n# ── тело семени ──\n# comment\n22 bootstrap/Makefile\n33 bootstrap/compiler_flang.c\n" + ожидается ["Makefile", "compiler_flang.c"] + пример «A fingerprint without a body names nothing» + дано fingerprint равно "11 flang/self/lexer.flang\n" + ожидается пустой список + пусть parts равно (разделить fingerprint по («Body mark»)) + отфильтровать (отобразить («Lines» от (свёртка («Without first part» от parts) начиная с "" как body и part → part)) как line → «Printed name» от line) где name → не (пусто name) + +тотальная функция «Without first part» + принимает parts: список строки + возвращает список строки + пример «The text before the mark is dropped» + дано parts равно ["head", "body"] + ожидается ["body"] + разбор parts + случай пусто + то пустой список + случай голова и хвост + то хвост + +тотальная функция «Union» + принимает leading: список строки, joining: список строки + возвращает список строки + пример «Names of the second list join the first once» + дано leading равно ["flang_cli.c", "flang_repl.c"] + дано joining равно ["Makefile", "flang_cli.c"] + ожидается ["flang_cli.c", "flang_repl.c", "Makefile"] + свёртка joining начиная с leading как kept и name → если kept содержит name то kept иначе (добавить name к kept) + +тотальная функция «Side names» + принимает side: строка, answers: список «Answer» + возвращает список строки + «Union» от («Lines» от («Output of» от («Names question» от side) и answers)) и («Body names» от («Output of» от («Fingerprint question» от side) и answers)) + +тотальная функция «Side listing» + принимает side: строка, answers: список «Answer» + возвращает строка + соединить («Side names» от side и answers) по "\n" + +тотальная функция «Unfingerprinted» + принимает answers: список «Answer» + возвращает список строки + отфильтровать («Sides») где side → («Answered» от («Fingerprint question» от side) и answers) и притом (пусто («Body names» от («Output of» от («Fingerprint question» от side) и answers))) + +тотальная функция «Names» + принимает answers: список «Answer» + возвращает список строки + «Side names» от "first" и answers + +тотальная функция «Names agree» + принимает answers: список «Answer» + возвращает признак + («Side listing» от "first" и answers) равен («Side listing» от "second" и answers) + +тотальная функция «Printed» + принимает side: строка, name: строка, answers: список «Answer» + возвращает строка + соединить [(«Tree» от side и answers), "/bootstrap/", name] по "" + +тотальная функция «List file» + принимает side: строка, answers: список «Answer» + возвращает строка + соединить [(«Work» от answers), "/names-", side] по "" + +тотальная функция «Presence» + принимает answers: список «Answer» + возвращает список «Question» + «Chosen» от [(«When» от (не («Is ready» от answers)) и (пустой список)), + («When» от («Names agree» от answers) и (отобразить («Names» от answers) как name → «Run» от (соединить ["printed ", name] по "") и "test" и ["-f", («Printed» от "first" и name и answers)]))] и [(«Write» от "list first" и («List file» от "first" и answers) и («Side listing» от "first" и answers)), + («Write» от "list second" и («List file» от "second" и answers) и («Side listing» от "second" и answers)), + («Run» от "names difference" и "env" и ["LC_ALL=C", "diff", («List file» от "first" и answers), («List file» от "second" и answers)])] + +тотальная функция «Regular names» + принимает answers: список «Answer» + возвращает список строки + отфильтровать («Names» от answers) где name → («Answered» от (соединить ["printed ", name] по "") и answers) и притом ((«Exit code of» от (соединить ["printed ", name] по "") и answers) равен 0) + +тотальная функция «Comparisons» + принимает answers: список «Answer» + возвращает список «Question» + пусть names равно («Regular names» от answers) + если (длина names) равен 0 + то пустой список + иначе приписать («Run from» от "sizes" и (соединить [(«Tree» от "first" и answers), "/bootstrap"] по "") и "wc" и (приписать "-c" к (приписать "--" к names))) к (отобразить names как name → «Run» от (соединить ["bytes ", name] по "") и "env" и ["LC_ALL=C", "cmp", («Printed» от "first" и name и answers), («Printed» от "second" и name и answers)]) + +тотальная функция «Cleanup» + принимает answers: список «Answer» + возвращает список «Question» + если пусто («Work» от answers) + то пустой список + иначе [(«Run» от "cleanup" и "rm" и ["-rf", («Work» от answers)])] + +тотальная функция «Stage» + принимает stages: число, answers: список «Answer» + возвращает список «Question» + если (stages меньше 0) или (stages больше 9) + то пустой список + иначе элемент (10 минус stages) в [(«Setup»), («Directories» от answers), («Lookups» от answers), («Regular tests» от answers), («Places» от answers), («Marks» от answers), («Listings» от answers), («Presence» от answers), («Comparisons» от answers), («Cleanup» от answers)] + +тотальная функция «Size» + принимает name: строка, sizes: список строки + возвращает число + пример «The size stands before the name» + дано name равно "flang_cli.c" + дано sizes равно [" 120 flang_repl.c", " 3454 flang_cli.c", " 3574 total"] + ожидается 3454 + пример «A name without a line has no size» + дано name равно "absent.c" + дано sizes равно [" 3454 flang_cli.c"] + ожидается 0 + «Count» от («Word» от 1 и («First line» от (соединить (отфильтровать sizes где line → («Word» от 2 и line) равен name) по "\n"))) + +тотальная функция «Difference lines» + принимает name: строка, answers: список «Answer» + возвращает список строки + пусть said равно («Reply to» от (соединить ["bytes ", name] по "") и answers) + если («Exit code» от said) равен 0 + то пустой список + иначе [(соединить ["РАЗОШЁЛСЯ: bootstrap/", name] по ""), (соединить [" ", («First line» от (соединить [(«Output» от said), («Errors» от said)] по "\n"))] по "")] + +тотальная функция «Compared» + принимает answers: список «Answer» + возвращает «Outcome» + пусть names равно («Regular names» от answers) + пусть sizes равно («Lines» от («Output of» от "sizes" и answers)) + пусть lines равно («Gathered words» от (отобразить names как name → «Difference lines» от name и answers)) + запись «Outcome» с «same» равным ((длина lines) равен 0) и «files» равным (длина names) и «bytes» равным (свёртка names начиная с 0 как sum и name → sum плюс («Size» от name и sizes)) и «lines» равным lines + +тотальная функция «Identical» + принимает outcome: «Outcome», trees: список строки, findings: список «Finding» + возвращает список строки + пример «Equal prints are named with their journals» + дано outcome равно запись «Outcome» с «same» равным да и «files» равным 4 и «bytes» равным 1229825 и «lines» равным пустой список + дано trees равно ["/p/1/tree", "/p/2/tree"] + дано findings равно [запись «Finding» с «journal» равным "/p/1/print.log" и «mark» равным "ПЕЧАТЬ КОД=" и «trouble» равным "", запись «Finding» с «journal» равным "/p/2/print.log" и «mark» равным "ПЕЧАТЬ КОД=" и «trouble» равным ""] + ожидается ["печати совпали побайтово: файлов 4, байт 1229825", " первая: /p/1/tree (журнал /p/1/print.log, конец по «ПЕЧАТЬ КОД=»)", " вторая: /p/2/tree (журнал /p/2/print.log, конец по «ПЕЧАТЬ КОД=»)", "Г6 на ЭТОЙ паре взят. На гейт целиком этого мало: нужна пара из ОДНОГО", "дерева и прибор, зовущийся сам, а не руками."] + если ((длина trees) равен 2) и притом ((длина findings) равен 2) + то [(соединить ["печати совпали побайтово: файлов ", (к строке (outcome.«files»)), ", байт ", (к строке (outcome.«bytes»))] по ""), + (соединить [" первая: ", (элемент 1 в trees), " (журнал ", ((элемент 1 в findings).«journal»), ", конец по «", ((элемент 1 в findings).«mark»), "»)"] по ""), + (соединить [" вторая: ", (элемент 2 в trees), " (журнал ", ((элемент 2 в findings).«journal»), ", конец по «", ((элемент 2 в findings).«mark»), "»)"] по ""), + "Г6 на ЭТОЙ паре взят. На гейт целиком этого мало: нужна пара из ОДНОГО", + "дерева и прибор, зовущийся сам, а не руками."] + иначе пустой список + +тотальная функция «With names» + принимает told: список строки, names: список строки + возвращает список строки + пример «The compared files are named right after the count» + дано told равно ["печати совпали побайтово: файлов 2, байт 10", " первая: /p/1/tree"] + дано names равно ["Makefile", "compiler_flang.c"] + ожидается ["печати совпали побайтово: файлов 2, байт 10", " сверены: Makefile, compiler_flang.c", " первая: /p/1/tree"] + разбор told + случай пусто + то пустой список + случай голова и хвост + то приписать голова к (приписать (соединить [" сверены: ", (соединить names по ", ")] по "") к хвост) + +тотальная функция «Differing» + принимает outcome: «Outcome» + возвращает список строки + пример «Differing files are counted after they are named» + дано outcome равно запись «Outcome» с «same» равным нет и «files» равным 4 и «bytes» равным 10 и «lines» равным ["РАЗОШЁЛСЯ: bootstrap/flang_cli.c", " a b differ: byte 1, line 1"] + ожидается ["РАЗОШЁЛСЯ: bootstrap/flang_cli.c", " a b differ: byte 1, line 1", "", "ПЕЧАТИ РАЗОШЛИСЬ: файлов сверено 4, разошлось 1.", "Значит печать НЕ воспроизводима, и Г6 на этой паре не взят."] + «Соединить списки» от (outcome.«lines») и ["", (соединить ["ПЕЧАТИ РАЗОШЛИСЬ: файлов сверено ", (к строке (outcome.«files»)), ", разошлось ", (к строке ((длина (outcome.«lines»)) делить на 2)), "."] по ""), "Значит печать НЕ воспроизводима, и Г6 на этой паре не взят."] + +тотальная функция «Judgement» + принимает answers: список «Answer» + возвращает «Продолжение» + «Chosen» от [(«When» от (не («Names agree» от answers)) и (вариант «Провал» с код равным "FLANG_PRINTS_DIFFER" и сообщение равным (соединить (приписать "РАЗОШЛИСЬ: наборы файлов в bootstrap/ не совпадают" к (отобразить («Lines» от («Output of» от "names difference" и answers)) как line → соединить [" ", line] по "")) по "\n"))), + («When» от ((«Compared» от answers).«same») и (вариант «Конец работы» с значение равным (соединить («With names» от («Identical» от («Compared» от answers) и (отобразить («Sides») как side → «Given tree» от side и answers) и (отобразить («Sides») как side → «Finding of» от side и answers)) и («Regular names» от answers)) по "\n")))] и (вариант «Провал» с код равным "FLANG_PRINTS_DIFFER" и сообщение равным (соединить («Differing» от («Compared» от answers)) по "\n")) + +тотальная функция «Refusal» + принимает answers: список «Answer» + возвращает список строки + «Chosen» от [(«When» от («Wrong call» от answers) и ([(«Usage»)])), + («When» от ((длина («Not directories» от answers)) больше 0) и ([(соединить ["не каталог: ", («First line» от (соединить («Not directories» от answers) по "\n"))] по "")])), + («When» от («Share a journal» от answers) и ([(соединить ["НЕ ПРОВЕРЕНО: обеим печатям достался ОДИН журнал — ", ((«Finding of» от "first" и answers).«journal»)] по ""), " Значит про одну из них не известно ничего. Назовите журналы прямо:", (соединить [" FLANG_PRINT_LOG_1=<журнал первой> FLANG_PRINT_LOG_2=<журнал второй> bootstrap/flang io scripts/seed/two-prints-identical.fscript -- ", («Given tree» от "first" и answers), " ", («Given tree» от "second" и answers)] по "")])), + («When» от ((длина («Troubles» от answers)) больше 0) и ([(соединить (приписать "НЕ ПРОВЕРЕНО: печать ещё не кончилась или кончилась не успехом:" к (отобразить («Troubles» от answers) как trouble → соединить [" ", trouble] по "")) по "\n"), "Это НЕ «разошлись». Повторить, когда обе печати кончатся."])), + («When» от ((длина («Unfingerprinted» от answers)) больше 0) и ([(соединить ["НЕ ПРОВЕРЕНО: в отпечатке печати нет тела семени — какие файлы напечатаны, не узнать: ", (соединить (отобразить («Unfingerprinted» от answers) как side → соединить [(«Tree» от side и answers), "/scripts/seed-fingerprint"] по "") по ", ")] по "")])), + («When» от (пусто («Work» от answers)) и ([(соединить ["ПРОВЕРИТЬ НЕ УДАЛОСЬ: не создался каталог в ", («Setting of» от "temporary" и "/srv/tmp" и answers)] по "")]))] и (пустой список) + +тотальная функция «Verdict» + принимает answers: список «Answer» + возвращает «Продолжение» + разбор («Refusal» от answers) + случай голова и хвост + то вариант «Не проверено» с код равным "FLANG_PRINTS_NOT_COMPARED" и сообщение равным (соединить (приписать голова к хвост) по "\n") + случай пусто + то «Judgement» от answers + +тотальная функция «Proceed» + принимает queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + разбор queue + случай голова и хвост + то «Ask» от (голова) и (хвост) и stages и answers + случай пусто + то если stages не больше 0 + то «Verdict» от answers + иначе «Proceed» от («Stage» от (stages минус 1) и answers) и (stages минус 1) и answers + +тотальная функция «Begin» + возвращает «Inquiry» + «Begin with» от 10 + +тотальная функция «Next» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает «Продолжение» + «Proceed» от (inquiry.«queue») и (inquiry.«stages») и («Heard» от inquiry и reply) + +план «Check» + состояние «Inquiry» + начинает с «Begin» + обрабатывает «Next» + +объект «Trial» + «name»: строка + «code»: число + «marks»: список строки + «words»: строка + +тотальная функция «Trials» + возвращает список «Trial» + [запись «Trial» с «name» равным "identical" и «code» равным 0 и «marks» равным ["сверены: flang_cli.c, flang_repl.c, flang_runtime.c, flang_runtime.h, Makefile, compiler_flang.c, compiler_flang.h"] и «words» равным "два одинаковых дерева — совпали, и сверены напечатанные файлы", + запись «Trial» с «name» равным "changed byte" и «code» равным 1 и «marks» равным ["РАЗОШЁЛСЯ: bootstrap/compiler_flang.c"] и «words» равным "байт в compiler_flang.c второй печати — разошлись, файл назван", + запись «Trial» с «name» равным "missing makefile" и «code» равным 1 и «marks» равным ["РАЗОШЁЛСЯ: bootstrap/Makefile"] и «words» равным "у второй печати нет Makefile — разошлись, файл назван"] + +тотальная функция «Sandbox» + принимает answers: список «Answer» + возвращает строка + «Made of» от "sandbox" и answers + +тотальная функция «Twin trees script» + возвращает строка + "mkdir -p \"$0/first/tree/bootstrap\" \"$0/first/tree/flang/src/emit\" \"$0/first/tree/scripts\" && cp bootstrap/Makefile bootstrap/*.c bootstrap/*.h \"$0/first/tree/bootstrap/\" && cp -R flang/src/emit/c \"$0/first/tree/flang/src/emit/c\" && cp scripts/seed-fingerprint \"$0/first/tree/scripts/\" && printf 'ПЕЧАТЬ КОД=0\\n' > \"$0/first/print.log\" && cp -R \"$0/first\" \"$0/second\"" + +тотальная функция «Comparison of twins» + принимает name: строка, sandbox: строка + возвращает «Question» + «Run from» от name и "../.." и "bootstrap/flang" и ["io", "scripts/seed/two-prints-identical.fscript", "--plan", "Check", "--timeout", "600000", "--", (соединить [sandbox, "/first/tree"] по ""), (соединить [sandbox, "/second/tree"] по "")] + +тотальная функция «Spoiling» + принимает name: строка, script: строка, sandbox: строка + возвращает «Question» + «Run» от name и "sh" и ["-c", script, sandbox] + +тотальная функция «Forgery steps» + принимает answers: список «Answer» + возвращает список «Question» + пусть sandbox равно («Sandbox» от answers) + если пусто sandbox + то пустой список + иначе [(«Run from» от "twins" и "../.." и "sh" и ["-c", («Twin trees script»), sandbox]), + («Comparison of twins» от "identical" и sandbox), + («Spoiling» от "spoil byte" и "printf x >> \"$0/second/tree/bootstrap/compiler_flang.c\"" и sandbox), + («Comparison of twins» от "changed byte" и sandbox), + («Spoiling» от "drop makefile" и "cp \"$0/first/tree/bootstrap/compiler_flang.c\" \"$0/second/tree/bootstrap/\" && rm \"$0/second/tree/bootstrap/Makefile\"" и sandbox), + («Comparison of twins» от "missing makefile" и sandbox), + («Run» от "sandbox cleanup" и "rm" и ["-rf", sandbox])] + +тотальная функция «Forgery stage» + принимает stages: число, answers: список «Answer» + возвращает список «Question» + если stages равен 1 + то [(«Temporary directory» от "sandbox" и (соединить [(«Setting of» от "temporary" и "/srv/tmp" и answers), "/two-prints-forgery."] по ""))] + иначе «Forgery steps» от answers + +тотальная функция «Trial trouble» + принимает trial: «Trial», code: число, said: строка + возвращает список строки + пример «A trial that answered as expected has no trouble» + дано trial равно запись «Trial» с «name» равным "changed byte" и «code» равным 1 и «marks» равным ["РАЗОШЁЛСЯ: bootstrap/compiler_flang.c"] и «words» равным "байт" + дано code равно 1 + дано said равно "РАЗОШЁЛСЯ: bootstrap/compiler_flang.c" + ожидается пустой список + пример «A blind comparison is named with its code» + дано trial равно запись «Trial» с «name» равным "changed byte" и «code» равным 1 и «marks» равным ["РАЗОШЁЛСЯ: bootstrap/compiler_flang.c"] и «words» равным "байт" + дано code равно 0 + дано said равно "печати совпали" + ожидается ["байт: ждали код 1 и «РАЗОШЁЛСЯ: bootstrap/compiler_flang.c», получили код 0"] + если (code равен (trial.«code»)) и притом ((длина (отфильтровать (trial.«marks») где mark → не (said содержит mark))) равен 0) + то пустой список + иначе [(соединить [(trial.«words»), ": ждали код ", (к строке (trial.«code»)), " и «", (соединить (trial.«marks») по "», «"), "», получили код ", (к строке code)] по "")] + +тотальная функция «Forgery troubles» + принимает answers: список «Answer» + возвращает список строки + «Gathered words» от (отобразить («Trials») как trial → «Trial trouble» от trial и («Exit code of» от (trial.«name») и answers) и (соединить [(«Output of» от (trial.«name») и answers), («Errors of» от (trial.«name») и answers)] по "\n")) + +тотальная функция «Forgery verdict» + принимает answers: список «Answer» + возвращает «Продолжение» + разбор («Forgery troubles» от answers) + случай пусто + то вариант «Конец работы» с значение равным (соединить (приписать "подлог пойман: сверка двух печатей видит напечатанные файлы" к (отобразить («Trials») как trial → соединить [" · ", (trial.«words»)] по "")) по "\n") + случай голова и хвост + то вариант «Провал» с код равным "FLANG_PRINTS_FORGERY_MISSED" и сообщение равным (соединить (приписать "ПОДЛОГ НЕ ПОЙМАН — сверка двух печатей слепа:" к (приписать голова к хвост)) по "\n · ") + +тотальная функция «Proceed with forgery» + принимает queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + разбор queue + случай голова и хвост + то «Ask» от (голова) и (хвост) и stages и answers + случай пусто + то если stages не больше 0 + то «Forgery verdict» от answers + иначе «Proceed with forgery» от («Forgery stage» от (stages минус 1) и answers) и (stages минус 1) и answers + +тотальная функция «Begin forgery» + возвращает «Inquiry» + «Begin with» от 2 + +тотальная функция «Next forgery step» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает «Продолжение» + «Proceed with forgery» от (inquiry.«queue») и (inquiry.«stages») и («Heard» от inquiry и reply) + +план «Forgery» + состояние «Inquiry» + начинает с «Begin forgery» + обрабатывает «Next forgery step» diff --git a/scripts/seed/two-prints-identical.sh b/scripts/seed/two-prints-identical.sh deleted file mode 100755 index e8e7e07d2..000000000 --- a/scripts/seed/two-prints-identical.sh +++ /dev/null @@ -1,148 +0,0 @@ -#!/bin/sh -# SPDX-FileCopyrightText: 2026 Digitable (Marat Zimnurov) -# SPDX-License-Identifier: BSD-2-Clause -# -# Сверить две печати одного дерева побайтово (вопрос гейта Г6): тело семени — -# напечатанные исходники рантайма, список из обоих деревьев. Готовность печати -# спрашивается у её журнала (<каталог>/../*.log), а не у файлов. -# -# Как звать: -# sh scripts/seed/two-prints-identical.sh <каталог-1> <каталог-2> -# ZHURNAL_1=<журнал> ZHURNAL_2=<журнал> … — назвать журналы прямо, если их -# рядом больше одного (прибор не гадает и не берёт самый свежий). -# -# Коды: 0 — совпали побайтово; 1 — разошлись, названы файлы и первое расхождение; -# 2 — звать не умеют; 3 — НЕ ПРОВЕРЕНО: печати нет, она не кончилась, журнал -# спорит сам с собой или неясно, какой журнал чей. -# см. docs/zettel/two-logs-beside-a-print-tree-mean-unknown-not-take-the-newer.md -set -u - -skazhi() { printf '%s\n' "$*"; } -beda() { printf '%s\n' "$*" >&2; } - -put_pryamoj() { - pp_d=$(dirname "$1"); pp_b=$(basename "$1") - pp_d=$(cd "$pp_d" 2>/dev/null && pwd -P) || pp_d="" - [ -n "$pp_d" ] || { printf '%s\n' "$1"; return; } - printf '%s/%s\n' "$pp_d" "$pp_b" -} - -[ $# -eq 2 ] || { beda "звать: sh scripts/seed/two-prints-identical.sh <каталог-1> <каталог-2>"; exit 2; } -A=$1; B=$2 -for d in "$A" "$B"; do - [ -d "$d" ] || { beda "не каталог: $d"; exit 2; } -done - -# $1 — корень дерева печати. $2 — журнал, названный руками, или пусто. -gotova() { - ZH="" - if [ -n "$2" ]; then - [ -f "$2" ] || { NET="названный журнал не файл: $2"; return 1; } - ZH=$2 - else - SKOLKO=0 - for f in "$1"/../*.log; do - [ -f "$f" ] || continue - SKOLKO=$((SKOLKO + 1)); ZH=$f - done - [ "$SKOLKO" -ne 0 ] || { NET="журнала печати рядом с $1 нет (ждём $1/../*.log)"; return 1; } - if [ "$SKOLKO" -gt 1 ]; then - NET="рядом с $1 журналов $SKOLKO, и какой из них ЭТОЙ печати — неизвестно:$( - for f in "$1"/../*.log; do [ -f "$f" ] && printf '\n %s' "$f"; done) - Брать самый свежий нельзя: так прибор уже прочёл отказ печати как успех - (замер А1 2 сентября 2026, см. шапку). Назовите журналы прямо — - ZHURNAL_1=… ZHURNAL_2=… — или дайте каждой печати свой родительский каталог." - return 1 - fi - fi - ZH=$(put_pryamoj "$ZH") - if LC_ALL=C.UTF-8 /usr/bin/grep -aq 'ПЕЧАТЬ КОД=[0-9]' "$ZH"; then - OTKUDA='ПЕЧАТЬ КОД=' - K=$(LC_ALL=C.UTF-8 /usr/bin/grep -ao 'ПЕЧАТЬ КОД=[0-9][0-9]*' "$ZH" | tail -1 | sed 's/.*=//') - elif LC_ALL=C.UTF-8 /usr/bin/grep -aq '^КОНЕЦ' "$ZH"; then - OTKUDA='КОНЕЦ … код=' - K=$(LC_ALL=C.UTF-8 /usr/bin/grep -a '^КОНЕЦ' "$ZH" \ - | LC_ALL=C.UTF-8 /usr/bin/grep -ao 'код=[0-9][0-9]*' | tail -1 | sed 's/.*=//') - [ -n "$K" ] || { NET="строка «КОНЕЦ» есть, а кода в ней нет: $ZH"; return 1; } - VYHOD=$(LC_ALL=C.UTF-8 /usr/bin/grep -a 'Exit status:' "$ZH" | tail -1 \ - | sed 's/.*Exit status:[[:space:]]*//') - if [ -n "$VYHOD" ] && [ "$VYHOD" != "$K" ]; then - NET="журнал сам себе противоречит: «КОНЕЦ … код=$K» против «Exit status: $VYHOD» — $ZH - Так соврал /srv/tmp/relizy/perepechatka-zahod1-ubita.log: код=0 на убитом - прогоне. Пусть допишет «ПЕЧАТЬ КОД=<код>» тот, кто печать пустил." - return 1 - fi - else - NET="конца печати в журнале НЕТ: $ZH - ни «ПЕЧАТЬ КОД=<код>» (дописать обязан тот, кто пустил печать: для CI — - работа .github/workflows/reprint.yml, для ручного прогона — оболочка - запуска), ни «КОНЕЦ … код=<код>». Печать либо идёт, либо её оборвали, - не закрыв журнал. Это НЕ «печати разошлись»." - return 1 - fi - [ -n "$K" ] || { NET="конец назван строкой «$OTKUDA», а кода в ней нет: $ZH"; return 1; } - [ "$K" = 0 ] || { NET="печать кончилась НЕ УСПЕХОМ (код $K, по «$OTKUDA»): $ZH"; return 1; } - return 0 -} - -ne_gotovy=""; NET=""; ZH=""; K=""; OTKUDA=""; VYHOD=""; SKOLKO=0 -ZH_A=""; ZH_B=""; OTKUDA_A=""; OTKUDA_B="" -gotova "$A" "${ZHURNAL_1:-}" || ne_gotovy="$ne_gotovy - $NET" -ZH_A=$ZH; OTKUDA_A=$OTKUDA -gotova "$B" "${ZHURNAL_2:-}" || ne_gotovy="$ne_gotovy - $NET" -ZH_B=$ZH; OTKUDA_B=$OTKUDA -if [ -n "$ZH_A" ] && [ "$ZH_A" = "$ZH_B" ]; then - skazhi "НЕ ПРОВЕРЕНО: обеим печатям достался ОДИН журнал — $ZH_A" - skazhi " Значит про одну из них не известно ничего. Назовите журналы прямо:" - skazhi " ZHURNAL_1=<журнал первой> ZHURNAL_2=<журнал второй> sh $0 $A $B" - exit 3 -fi -if [ -n "$ne_gotovy" ]; then - skazhi "НЕ ПРОВЕРЕНО: печать ещё не кончилась или кончилась не успехом:$ne_gotovy" - skazhi "Это НЕ «разошлись». Повторить, когда обе печати кончатся." - exit 3 -fi - -# ── Сверка. Список файлов тела берётся из ОБОИХ деревьев: файл, появившийся -# только с одной стороны, — тоже расхождение, и молчать о нём нельзя. -spisok() { (cd "$1/flang/src/emit/c" 2>/dev/null && ls -A) | sort; } -# Временное — в FLANG_TMP, как везде в дереве: /tmp здесь запрещён хуком. -SDIR=$(mktemp -d -p "${FLANG_TMP:-/srv/tmp}" dve-pechati.XXXXXX) || { - beda "ПРОВЕРИТЬ НЕ УДАЛОСЬ: не создался каталог в ${FLANG_TMP:-/srv/tmp}"; exit 3; } -trap 'rm -rf "$SDIR"' EXIT INT TERM -spisok "$A" > "$SDIR/a" 2>/dev/null -spisok "$B" > "$SDIR/b" 2>/dev/null - -if ! LC_ALL=C cmp -s "$SDIR/a" "$SDIR/b"; then - skazhi "РАЗОШЛИСЬ: наборы файлов в bootstrap/ не совпадают" - LC_ALL=C diff "$SDIR/a" "$SDIR/b" | sed 's/^/ /' - exit 1 -fi - -fajlov=0; bajt=0; razoshlos=0 -while IFS= read -r f; do - [ -f "$A/bootstrap/$f" ] || continue - fajlov=$((fajlov + 1)) - bajt=$((bajt + $(wc -c < "$A/bootstrap/$f"))) - if ! LC_ALL=C cmp -s "$A/bootstrap/$f" "$B/bootstrap/$f"; then - razoshlos=$((razoshlos + 1)) - skazhi "РАЗОШЁЛСЯ: bootstrap/$f" - skazhi " $(LC_ALL=C cmp "$A/bootstrap/$f" "$B/bootstrap/$f" 2>&1 | head -1)" - fi -done < "$SDIR/a" - -if [ "$razoshlos" -gt 0 ]; then - skazhi "" - skazhi "ПЕЧАТИ РАЗОШЛИСЬ: файлов сверено $fajlov, разошлось $razoshlos." - skazhi "Значит печать НЕ воспроизводима, и Г6 на этой паре не взят." - exit 1 -fi - -skazhi "печати совпали побайтово: файлов $fajlov, байт $bajt" -skazhi " первая: $A (журнал $ZH_A, конец по «$OTKUDA_A»)" -skazhi " вторая: $B (журнал $ZH_B, конец по «$OTKUDA_B»)" -skazhi "Г6 на ЭТОЙ паре взят. На гейт целиком этого мало: нужна пара из ОДНОГО" -skazhi "дерева и прибор, зовущийся сам, а не руками." -exit 0 diff --git a/scripts/seed/what-lags-the-seed.fscript b/scripts/seed/what-lags-the-seed.fscript new file mode 100644 index 000000000..9f1de73b5 --- /dev/null +++ b/scripts/seed/what-lags-the-seed.fscript @@ -0,0 +1,574 @@ +модуль «What lags the seed» + использует «Inquiry» из "../inquiry.fscript" + использует «Reading» из "../reading.fscript" + использует «Lists» только «Соединить списки» + +объект «Source» + «path»: строка + «declared»: число + «missing»: список строки + +тотальная функция «Root» + возвращает строка + "../.." + +тотальная функция «Seed» + возвращает строка + "bootstrap/compiler_flang.c" + +тотальная функция «Entry» + возвращает строка + "flang/self/bootstrap/compiler.flang" + +тотальная функция «Declaration» + возвращает строка + "^(тотальная |частичная )?функция «[^»]+»" + +тотальная функция «Link» + возвращает строка + "^модуль[[:space:]]+«[^»]+»|^[[:space:]]*использует[[:space:]]+«[^»]+»" + +тотальная функция «Chosen file» + принимает answers: список «Answer» + возвращает строка + пусть named равно («First line» от (соединить («Given of» от "arguments" и answers) по "\n")) + «Inside the tree» от named и («First line» от («Output of» от "root" и answers)) + +тотальная функция «Inside the tree» + принимает path: строка, root: строка + возвращает строка + пример «A path under the root is named from the root» + дано path равно "/srv/tree/flang/self/parser.flang" + дано root равно "/srv/tree" + ожидается "flang/self/parser.flang" + пример «A path from the root stays as it is» + дано path равно "flang/self/parser.flang" + дано root равно "/srv/tree" + ожидается "flang/self/parser.flang" + пусть prefix равно (соединить [root, "/"] по "") + если path начинается с prefix то («After» от prefix и path) иначе path + +тотальная функция «Shell» + принимает name: строка, script: строка, arguments: список строки + возвращает «Question» + «Run from» от name и («Root») и "env" и (приписать "LC_ALL=C.UTF-8" к (приписать "sh" к (приписать "-c" к (приписать script к (приписать "sh" к arguments))))) + +тотальная функция «Names file» + принимает answers: список «Answer» + возвращает строка + соединить [(«Made of» от "work" и answers), "/seed-names"] по "" + +тотальная функция «Totals question» + принимает chosen: строка + возвращает «Question» + если пусто chosen + то «Shell» от "totals" и "grep -H -c -E \"$1\" flang/self/*.flang" и [(«Declaration»)] + иначе «Shell» от "totals" и "grep -H -c -E \"$1\" \"$2\"" и [(«Declaration»), chosen] + +тотальная функция «Missing question» + принимает chosen: строка, names: строка + возвращает «Question» + если пусто chosen + то «Shell» от "missing" и "grep -H -o -E \"$1\" flang/self/*.flang | grep -v -F -f \"$2\"" и [(«Declaration»), names] + иначе «Shell» от "missing" и "grep -H -o -E \"$1\" \"$3\" | grep -v -F -f \"$2\"" и [(«Declaration»), names, chosen] + +тотальная функция «Opening» + возвращает список «Question» + [(«Arguments» от "arguments"), + («Environment» от "temporary" и "FLANG_TMP"), + («Run from» от "root" и («Root») и "pwd" и пустой список), + («Run from» от "seed present" и («Root») и "test" и ["-f", («Seed»)]), + («Run from» от "entry present" и («Root») и "test" и ["-f", («Entry»)])] + +тотальная функция «Preparation» + принимает answers: список «Answer» + возвращает список «Question» + пусть work равно («Temporary directory» от "work" и (соединить [(«Setting of» от "temporary" и "/srv/tmp" и answers), "/what-lags-the-seed."] по "")) + если пусто («Chosen file» от answers) + то [work] + иначе [(«Run from» от "chosen present" и («Root») и "test" и ["-f", («Chosen file» от answers)]), work] + +тотальная функция «Gathering» + принимает answers: список «Answer» + возвращает список «Question» + [(«Shell» от "names" и "grep -a -o -P \"$1\" \"$2\" | LC_ALL=C sort -u > \"$3\"" и ["«[^»]{1,120}»", («Seed»), («Names file» от answers)]), + («Totals question» от («Chosen file» от answers)), + («Missing question» от («Chosen file» от answers) и («Names file» от answers)), + («Shell» от "graph" и "grep -r -H -o -E \"$1\" --include='*.flang' --include='*.fscript' flang | LC_ALL=C sort -s -t: -k1,1" и [(«Link»)]), + («Remove» от "names removed" и («Names file» от answers)), + («Remove» от "work removed" и («Made of» от "work" и answers))] + +тотальная функция «Piece» + принимает position: число, pieces: список строки + возвращает строка + пример «The second of three pieces» + дано position равно 2 + дано pieces равно ["a", "b", "c"] + ожидается "b" + пример «A position past the end gives nothing» + дано position равно 4 + дано pieces равно ["a", "b", "c"] + ожидается "" + если (position меньше 1) или (position больше (длина pieces)) + то "" + иначе элемент position в pieces + +тотальная функция «Quoted» + принимает line: строка + возвращает строка + пример «The name stands between the angle quotes» + дано line равно "flang/self/cli.flang:тотальная функция «Ключ: имя»" + ожидается "Ключ: имя" + пример «A line without quotes names nothing» + дано line равно "flang/self/cli.flang:12" + ожидается "" + «Piece» от 1 и (разделить («Piece» от 2 и (разделить line по "«")) по "»") + +тотальная функция «Path of» + принимает line: строка + возвращает строка + пример «The path stands before the first colon» + дано line равно "flang/self/cli.flang:тотальная функция «Ключ: имя»" + ожидается "flang/self/cli.flang" + «Piece» от 1 и (разделить line по ":") + +тотальная функция «Total of» + принимает line: строка + возвращает число + пример «The total stands after the path» + дано line равно "flang/self/cli.flang:83" + ожидается 83 + «Count» от («Piece» от 2 и (разделить line по ":")) + +тотальная функция «Framed» + принимает lines: список строки + возвращает строка + пример «Every line stands between two line ends» + дано lines равно ["a", "b"] + ожидается "\na\nb\n" + соединить ["\n", (соединить lines по "\n"), "\n"] по "" + +тотальная функция «Until line end» + принимает text: строка + возвращает строка + пример «The text before the first line end» + дано text равно "модуль «A»\nb.flang:модуль «B»\n" + ожидается "модуль «A»" + «Piece» от 1 и (разделить text по "\n") + +тотальная функция «Tails» + принимает prefix: строка, framed: строка + возвращает список строки + пример «The rests of the lines that begin with the prefix» + дано prefix равно "a.flang:" + дано framed равно "\na.flang:one\nb.flang:two\na.flang:three\n" + ожидается ["one", "three"] + пример «No line begins with the prefix» + дано prefix равно "c.flang:" + дано framed равно "\na.flang:one\n" + ожидается пустой список + разбор (разделить framed по (соединить ["\n", prefix] по "")) + случай пусто + то пустой список + случай голова и хвост + то отобразить хвост как piece → «Until line end» от piece + +тотальная функция «Source of» + принимает line: строка, missing: строка + возвращает «Source» + пример «A source takes its own missing names only» + дано line равно "flang/self/cli.flang:83" + дано missing равно "\nflang/self/cli.flang:тотальная функция «Ключ»\nflang/self/conc.flang:функция «Узел»\n" + ожидается запись «Source» с «path» равным "flang/self/cli.flang" и «declared» равным 83 и «missing» равным ["Ключ"] + запись «Source» с «path» равным («Path of» от line) и «declared» равным («Total of» от line) и «missing» равным (отобразить («Tails» от (соединить [(«Path of» от line), ":"] по "") и missing) как named → «Quoted» от named) + +тотальная функция «Sources» + принимает answers: список «Answer» + возвращает список «Source» + пусть missing равно («Framed» от («Lines» от («Output of» от "missing" и answers))) + отфильтровать (отобразить («Lines» от («Output of» от "totals" и answers)) как line → «Source of» от line и missing) где source → (source.«declared») больше 0 + +тотальная функция «Is a title» + принимает line: строка + возвращает признак + пример «A module line gives the title» + дано line равно "flang/self/cli.flang:модуль «CLI»" + ожидается да + пример «A uses line does not» + дано line равно "flang/self/cli.flang: использует «Lists»" + ожидается нет + («Piece» от 2 и (разделить line по ":")) начинается с "модуль" + +тотальная функция «Last path» + принимает lines: список строки + возвращает строка + пример «The path of the last line» + дано lines равно ["a.flang:«A»", "b.flang:«B»"] + ожидается "b.flang" + пример «No lines, no path» + дано lines равно пустой список + ожидается "" + если (длина lines) равен 0 то "" иначе «Path of» от (элемент (длина lines) в lines) + +тотальная функция «Titles» + принимает graph: список строки + возвращает строка + пример «Only the first title of a file is kept, and spaces before the name do not matter» + дано graph равно ["a.flang:модуль «A»", "a.flang: использует «B»", "a.flang:модуль «Other»", "b.flang:модуль «B»"] + ожидается "\na.flang:«A»\nb.flang:«B»\n" + «Framed» от (свёртка (отфильтровать graph где line → «Is a title» от line) начиная с (пустой список) как kept и line → если («Last path» от kept) равен («Path of» от line) то kept иначе добавить (соединить [(«Path of» от line), ":«", («Quoted» от line), "»"] по "") к kept) + +тотальная функция «Links» + принимает graph: список строки + возвращает строка + «Framed» от (отфильтровать graph где line → не («Is a title» от line)) + +тотальная функция «Without repeats» + принимает names: список строки + возвращает список строки + пример «A name is kept once, in the order it came» + дано names равно ["b", "a", "b"] + ожидается ["b", "a"] + свёртка names начиная с (пустой список) как kept и name → если kept содержит name то kept иначе добавить name к kept + +тотальная функция «Home of» + принимает title: строка, titles: строка + возвращает список строки + пример «The first file with the title is its home» + дано title равно "A" + дано titles равно "\na.flang:«A»\nb.flang:«A»\n" + ожидается ["a.flang"] + пример «A title nobody declares has no home» + дано title равно "B" + дано titles равно "\na.flang:«A»\n" + ожидается пустой список + пусть pieces равно (разделить titles по (соединить [":«", title, "»\n"] по "")) + пусть before равно (разделить («Piece» от 1 и pieces) по "\n") + если (длина pieces) меньше 2 то пустой список иначе [(«Piece» от (длина before) и before)] + +тотальная функция «Homes of» + принимает used: список строки, titles: строка + возвращает список строки + «Without repeats» от («Gathered words» от (отобразить used как title → «Home of» от title и titles)) + +тотальная функция «Uses of» + принимает path: строка, titles: строка, links: строка + возвращает список строки + если titles содержит (соединить ["\n", path, ":«"] по "") + то отобразить («Tails» от (соединить [path, ":"] по "") и links) как named → «Quoted» от named + иначе пустой список + +тотальная функция «Used by» + принимает paths: список строки, titles: строка, links: строка + возвращает список строки + пример «Uses of a file without a title do not count» + дано paths равно ["a.flang", "c.flang"] + дано titles равно "\na.flang:«A»\n" + дано links равно "\na.flang: использует «B»\nc.flang: использует «D»\n" + ожидается ["B"] + «Without repeats» от («Gathered words» от (отобразить paths как path → «Uses of» от path и titles и links)) + +тотальная функция «Closure» + принимает frontier: список строки, reached: список строки, titles: строка, links: строка, rounds: число + возвращает список строки + если rounds не больше 0 + то reached + иначе разбор frontier + случай пусто + то reached + случай голова и хвост + то «Closure» от (отфильтровать («Homes of» от («Used by» от frontier и titles и links) и titles) где path → не (reached содержит path)) и («Without repeats» от («Соединить списки» от reached и («Homes of» от («Used by» от frontier и titles и links) и titles))) и titles и links и (rounds минус 1) + +тотальная функция «Reached» + принимает graph: список строки + возвращает список строки + пример «The closure follows the uses from the entry» + дано graph равно ["flang/self/bootstrap/compiler.flang:модуль «Compiler»", "flang/self/bootstrap/compiler.flang: использует «Lexer»", "flang/self/lexer.flang:модуль «Lexer»", "flang/self/sets.flang:модуль «Sets»"] + ожидается ["flang/self/bootstrap/compiler.flang", "flang/self/lexer.flang"] + «Closure» от [(«Entry»)] и [(«Entry»)] и («Titles» от graph) и («Links» от graph) и (длина graph) + +тотальная функция «Unresolved» + принимает reached: список строки, graph: список строки + возвращает список строки + пример «A used title without a home is unresolved» + дано reached равно ["a.flang"] + дано graph равно ["a.flang:модуль «A»", "a.flang: использует «B»"] + ожидается ["B"] + пусть titles равно («Titles» от graph) + отфильтровать («Used by» от reached и titles и («Links» от graph)) где title → (длина («Home of» от title и titles)) равен 0 + +тотальная функция «Graph» + принимает answers: список «Answer» + возвращает список строки + «Lines» от («Output of» от "graph" и answers) + +тотальная функция «Sorting» + принимает answers: список «Answer» + возвращает список «Question» + пусть graph равно («Graph» от answers) + разбор («Unresolved» от («Reached» от graph) и graph) + случай пусто + то пустой список + случай голова и хвост + то [(«Run» от "unresolved" и "sh" и (приписать "-c" к (приписать "printf '%s\\n' \"$@\" | LC_ALL=C sort" к (приписать "sh" к (приписать голова к хвост)))))] + +тотальная функция «Base name» + принимает path: строка + возвращает строка + пример «The last part of the path» + дано path равно "flang/self/cli.flang" + ожидается "cli.flang" + свёртка (разделить path по "/") начиная с "" как last и part → part + +тотальная функция «Spaces» + принимает count: число + возвращает строка + пример «Three spaces» + дано count равно 3 + ожидается " " + пример «No spaces for a negative count» + дано count равно -2 + ожидается "" + если count не больше 0 + то "" + иначе соединить [" ", («Spaces» от (count минус 1))] по "" + +тотальная функция «Padded» + принимает text: строка, width: число + возвращает строка + пример «A short text is padded on the right» + дано text равно "cli.flang" + дано width равно 12 + ожидается "cli.flang " + соединить [text, («Spaces» от (width минус (длина text)))] по "" + +тотальная функция «Aligned» + принимает count: число, width: число + возвращает строка + пример «A number is padded on the left» + дано count равно 33 + дано width равно 4 + ожидается " 33" + соединить [(«Spaces» от (width минус (длина (к строке count)))), (к строке count)] по "" + +тотальная функция «Cut» + принимает text: строка, width: число + возвращает строка + пример «A long text is cut» + дано text равно "Предел сетки" + дано width равно 6 + ожидается "Предел" + пример «A short text stays» + дано text равно "Предел" + дано width равно 52 + ожидается "Предел" + если (длина text) больше width то (подстрока text с 1 по width) иначе text + +тотальная функция «First two» + принимает names: список строки + возвращает строка + пример «Two names of three» + дано names равно ["a", "b", "c"] + ожидается "a, b" + пример «The only name» + дано names равно ["a"] + ожидается "a" + разбор names + случай пусто + то "" + случай голова и хвост + то разбор хвост + случай пусто + то голова + случай голова и хвост + то соединить [(элемент 1 в names), ", ", голова] по "" + +тотальная функция «Placed» + принимает sorted: список «Source», source: «Source» + возвращает список «Source» + «Соединить списки» от (добавить source к (отфильтровать sorted где other → (длина (other.«missing»)) не меньше (длина (source.«missing»)))) и (отфильтровать sorted где other → (длина (other.«missing»)) меньше (длина (source.«missing»))) + +тотальная функция «Largest first» + принимает sources: список «Source» + возвращает список «Source» + пример «Sources follow by the number of missing names, equal ones keep their order» + дано sources равно [запись «Source» с «path» равным "a" и «declared» равным 3 и «missing» равным ["x"], запись «Source» с «path» равным "b" и «declared» равным 3 и «missing» равным ["x", "y"], запись «Source» с «path» равным "c" и «declared» равным 3 и «missing» равным ["z"]] + ожидается [запись «Source» с «path» равным "b" и «declared» равным 3 и «missing» равным ["x", "y"], запись «Source» с «path» равным "a" и «declared» равным 3 и «missing» равным ["x"], запись «Source» с «path» равным "c" и «declared» равным 3 и «missing» равным ["z"]] + свёртка sources начиная с (пустой список) как sorted и source → «Placed» от sorted и source + +тотальная функция «Missing in all» + принимает sources: список «Source» + возвращает число + свёртка sources начиная с 0 как sum и source → sum плюс (длина (source.«missing»)) + +тотальная функция «Lagging line» + принимает source: «Source» + возвращает строка + пример «A lagging source is shown in columns» + дано source равно запись «Source» с «path» равным "flang/self/functor.flang" и «declared» равным 60 и «missing» равным ["Предел сетки функтора", "Запас глубины функтора", "Третье"] + ожидается " functor.flang 3 из 60 Предел сетки функтора, Запас глубины функтора" + соединить [" ", («Padded» от («Base name» от (source.«path»)) и 28), " ", («Aligned» от (длина (source.«missing»)) и 4), " из ", («Aligned» от (source.«declared») и 4), " ", («Cut» от («First two» от (source.«missing»)) и 52)] по "" + +тотальная функция «Is reached» + принимает source: «Source», reached: список строки + возвращает признак + reached содержит (source.«path») + +тотальная функция «Lagging» + принимает sources: список «Source», reached: список строки + возвращает список «Source» + отфильтровать sources где source → ((длина (source.«missing»)) больше 0) и притом («Is reached» от source и reached) + +тотальная функция «Outside» + принимает sources: список «Source», reached: список строки + возвращает список «Source» + отфильтровать sources где source → ((длина (source.«missing»)) больше 0) и притом (не («Is reached» от source и reached)) + +тотальная функция «Whole» + принимает sources: список «Source» + возвращает число + длина (отфильтровать sources где source → (длина (source.«missing»)) равен 0) + +тотальная функция «Lagging part» + принимает lagging: список «Source» + возвращает список строки + пример «No lagging source is said in a line» + дано lagging равно пустой список + ожидается ["НАСТОЯЩЕЕ ОТСТАВАНИЕ — файл в замыкании, часть функций новее семени:", " нет ни одного — семя догнало исходник"] + если (длина lagging) равен 0 + то ["НАСТОЯЩЕЕ ОТСТАВАНИЕ — файл в замыкании, часть функций новее семени:", " нет ни одного — семя догнало исходник"] + иначе приписать "НАСТОЯЩЕЕ ОТСТАВАНИЕ — файл в замыкании, часть функций новее семени:" к (добавить (соединить [" ИТОГО: файлов ", (к строке (длина lagging)), ", функций ", (к строке («Missing in all» от lagging))] по "") к (отобразить («Largest first» от lagging) как source → «Lagging line» от source)) + +тотальная функция «Leading» + принимает count: число, names: список строки + возвращает список строки + обеспечивает «taking the leading names does not add names» (длина результат) не больше (длина names) + пример «Four of five» + дано count равно 4 + дано names равно ["a", "b", "c", "d", "e"] + ожидается ["a", "b", "c", "d"] + пример «All of two» + дано count равно 4 + дано names равно ["a", "b"] + ожидается ["a", "b"] + свёртка names начиная с (пустой список) как kept и name → если (длина kept) меньше count то (добавить name к kept) иначе kept + +тотальная функция «Unresolved part» + принимает count: число, sorted: список строки + возвращает список строки + пример «Resolved names are not mentioned» + дано count равно 0 + дано sorted равно пустой список + ожидается пустой список + пример «Unresolved names are counted and the first four are named» + дано count равно 5 + дано sorted равно ["a", "b", "c", "d", "e"] + ожидается [" ⚑ имён модулей не разрешено: 5 (a, b, c, d) — замыкание НЕПОЛНО"] + если count равен 0 + то пустой список + иначе [(соединить [" ⚑ имён модулей не разрешено: ", (к строке count), " (", (соединить («Leading» от 4 и sorted) по ", "), ") — замыкание НЕПОЛНО"] по "")] + +тотальная функция «Whole report» + принимает sources: список «Source», reached: список строки, unresolved: число, sorted: список строки + возвращает строка + пусть outside равно («Outside» от sources и reached) + соединить («Gathered words» от [["ОТСТАВАНИЕ СЕМЕНИ ОТ ИСХОДНИКА, поимённо по функциям", ""], + («Lagging part» от («Lagging» от sources и reached)), + ["", "ВНЕ ЗАМЫКАНИЯ (не достижим из входа печати) — НЕ отставание:", (соединить [" файлов ", (к строке (длина outside)), ", функций ", (к строке («Missing in all» от outside))] по "")], + («Unresolved part» от unresolved и sorted), + ["", (соединить ["файлов, сошедшихся полностью: ", (к строке («Whole» от sources))] по ""), "", "Свежесть семени как ДА/НЕТ — не здесь: scripts/seed/seed-freshness.fscript"]]) по "\n" + +тотальная функция «Named lines» + принимает source: «Source» + возвращает список строки + приписать (соединить [(«Base name» от (source.«path»)), ": нет в семени ", (к строке (длина (source.«missing»))), " из ", (к строке (source.«declared»))] по "") к (отобразить (source.«missing») как name → соединить [" • ", name] по "") + +тотальная функция «Outside line» + принимает source: «Source» + возвращает строка + соединить [(«Base name» от (source.«path»)), ": нет в семени ", (к строке (длина (source.«missing»))), " из ", (к строке (source.«declared»)), " — файл вне замыкания компилятора"] по "" + +тотальная функция «One report» + принимает sources: список «Source», reached: список строки + возвращает строка + пример «A source with every function in the seed is in place» + дано sources равно [запись «Source» с «path» равным "flang/self/lexer.flang" и «declared» равным 12 и «missing» равным пустой список] + дано reached равно ["flang/self/lexer.flang"] + ожидается "всё на месте: сошлись все функции" + пример «A lagging source names its functions» + дано sources равно [запись «Source» с «path» равным "flang/self/functor.flang" и «declared» равным 60 и «missing» равным ["Предел"]] + дано reached равно ["flang/self/functor.flang"] + ожидается "functor.flang: нет в семени 1 из 60\n • Предел" + пример «A source outside the closure is said to be outside» + дано sources равно [запись «Source» с «path» равным "flang/self/sets.flang" и «declared» равным 90 и «missing» равным ["Узел"]] + дано reached равно пустой список + ожидается "sets.flang: нет в семени 1 из 90 — файл вне замыкания компилятора" + пусть said равно («Соединить списки» от («Gathered words» от (отобразить («Lagging» от sources и reached) как source → «Named lines» от source)) и (отобразить («Outside» от sources и reached) как source → «Outside line» от source)) + если (длина said) равен 0 то "всё на месте: сошлись все функции" иначе соединить said по "\n" + +тотальная функция «Report text» + принимает answers: список «Answer» + возвращает строка + пусть reached равно («Reached» от («Graph» от answers)) + если пусто («Chosen file» от answers) + то «Whole report» от («Sources» от answers) и reached и (длина («Lines» от («Output of» от "unresolved" и answers))) и («Lines» от («Output of» от "unresolved" и answers)) + иначе «One report» от («Sources» от answers) и reached + +тотальная функция «Gathering trouble» + принимает answers: список «Answer» + возвращает список строки + «Gathered words» от (отобразить ["names", "graph"] как name → если («Exit code of» от name и answers) равен 0 то пустой список иначе [(соединить ["сбор «", name, "» ответил кодом ", (к строке («Exit code of» от name и answers)), ": ", («Errors of» от name и answers)] по "")]) + +тотальная функция «Finish» + принимает answers: список «Answer» + возвращает «Продолжение» + разбор («Gathering trouble» от answers) + случай пусто + то вариант «Конец работы» с значение равным («Report text» от answers) + случай голова и хвост + то вариант «Не проверено» с код равным "FLANG_SEED_LAG_NOT_MEASURED" и сообщение равным (соединить (приписать голова к хвост) по "\n") + +тотальная функция «Obstacles» + принимает asked: строка, answers: список «Answer» + возвращает список строки + «Gathered words» от [(если (asked равен "seed present") и притом (не ((«Exit code of» от asked и answers) равен 0)) то [(соединить ["семени нет: ", («Seed»)] по "")] иначе пустой список), + (если (asked равен "entry present") и притом (не ((«Exit code of» от asked и answers) равен 0)) то [(соединить ["входа печати нет: ", («Entry»), " — замыкание не построить"] по "")] иначе пустой список), + (если (asked равен "chosen present") и притом (не ((«Exit code of» от asked и answers) равен 0)) то [(соединить ["файла нет: ", («Chosen file» от answers)] по "")] иначе пустой список), + (если (asked равен "work") и притом (пусто («Made of» от asked и answers)) то [(соединить ["временный каталог не завёлся: ", («Errors of» от asked и answers)] по "")] иначе пустой список)] + +тотальная функция «Stage» + принимает stages: число, answers: список «Answer» + возвращает список «Question» + если (stages меньше 0) или (stages больше 3) + то пустой список + иначе элемент (4 минус stages) в [(«Opening»), («Preparation» от answers), («Gathering» от answers), («Sorting» от answers)] + +тотальная функция «Proceed» + принимает queue: список «Question», stages: число, answers: список «Answer» + возвращает «Продолжение» + разбор queue + случай голова и хвост + то «Ask» от (голова) и (хвост) и stages и answers + случай пусто + то если stages не больше 0 + то «Finish» от answers + иначе «Proceed» от («Stage» от (stages минус 1) и answers) и (stages минус 1) и answers + +тотальная функция «Begin» + возвращает «Inquiry» + «Begin with» от 4 + +тотальная функция «Next» + принимает inquiry: «Inquiry», reply: «Отклик» + возвращает «Продолжение» + пусть answers равно («Heard» от inquiry и reply) + разбор («Obstacles» от (inquiry.«asked») и answers) + случай голова и хвост + то вариант «Не проверено» с код равным "FLANG_SEED_LAG_NOT_MEASURED" и сообщение равным голова + случай пусто + то «Proceed» от (inquiry.«queue») и (inquiry.«stages») и answers + +план «Report» + состояние «Inquiry» + начинает с «Begin» + обрабатывает «Next» diff --git a/scripts/seed/what-lags-the-seed.sh b/scripts/seed/what-lags-the-seed.sh deleted file mode 100755 index cfff73f11..000000000 --- a/scripts/seed/what-lags-the-seed.sh +++ /dev/null @@ -1,112 +0,0 @@ -#!/bin/sh -# SPDX-FileCopyrightText: 2026 Digitable (Marat Zimnurov) -# SPDX-License-Identifier: BSD-2-Clause -# -# Что именно есть в исходнике и ещё нет в семени — поимённо, по функциям. -# Отставание отделяется от «файл вне замыкания» графом импортов от входа печати. -# Это не сторож свежести (тот — seed-freshness.sh): код всегда 0, ничего не блокирует. -# -# Как звать: -# sh scripts/seed/what-lags-the-seed.sh сводка по файлам flang/self -# sh scripts/seed/what-lags-the-seed.sh <файл> имена по одному файлу -# -# Коды: 0 — сводка напечатана; 2 — нет семени, входа печати или названного файла. -# см. docs/zettel/lag-behind-the-seed-is-told-by-the-import-graph-not-by-a-share-of-missing-names.md -set -u - -KOREN=$(cd "$(dirname "$0")/../.." && pwd) -SEMYA="$KOREN/bootstrap/compiler_flang.c" -[ -f "$SEMYA" ] || { echo "семени нет: $SEMYA" >&2; exit 2; } - -ODIN=${1:-} - -LC_ALL=C.UTF-8 python3 - "$KOREN" "$SEMYA" "$ODIN" <<'PY' -import re, sys, glob, os - -koren, semya, odin = sys.argv[1], sys.argv[2], sys.argv[3] - -v_semeni = set(re.findall('«([^»]{1,120})»', - open(semya, encoding='utf-8', errors='replace').read())) - -obyavlenie = re.compile(r'^(?:тотальная |частичная )?функция «([^»]+)»', re.M) -imya_modulya = re.compile(r'^модуль\s+«([^»]+)»', re.M) -ispolzuet = re.compile(r'^\s*использует\s+«([^»]+)»', re.M) - -VHOD = os.path.join(koren, 'flang/self/bootstrap/compiler.flang') -if not os.path.exists(VHOD): - print('входа печати нет: %s — замыкание не построить' % VHOD, file=sys.stderr) - sys.exit(2) - -# Граф импортов ПО ИМЕНАМ МОДУЛЕЙ. Путей в строках `использует` нет вовсе. -po_imeni, rebra = {}, {} -for put in sorted(glob.glob(os.path.join(koren, 'flang/**/*.flang'), recursive=True) + glob.glob(os.path.join(koren, 'flang/**/*.fscript'), recursive=True)): - tekst = open(put, encoding='utf-8', errors='replace').read() - m = imya_modulya.search(tekst) - if not m: - continue - po_imeni.setdefault(m.group(1), put) - rebra[put] = set(ispolzuet.findall(tekst)) - -zamykanie, stopka, nerazreshennye = set(), [VHOD], set() -while stopka: - put = stopka.pop() - if put in zamykanie: - continue - zamykanie.add(put) - for u in rebra.get(put, ()): - if u in po_imeni: - stopka.append(po_imeni[u]) - else: - nerazreshennye.add(u) - -fajly = [odin] if odin else sorted(glob.glob(os.path.join(koren, 'flang/self/*.flang'))) -vne, otstali, celyh = [], [], 0 - -for put in fajly: - if not os.path.exists(put): - print('файла нет:', put, file=sys.stderr); sys.exit(2) - imena = obyavlenie.findall(open(put, encoding='utf-8').read()) - if not imena: - continue - net = [i for i in imena if i not in v_semeni] - imya = os.path.basename(put) - if not net: - celyh += 1 - elif os.path.realpath(put) not in {os.path.realpath(x) for x in zamykanie}: - vne.append((imya, len(net), len(imena))) - else: - otstali.append((imya, len(net), len(imena), net)) - -if odin: - for imya, n, vsego, net in otstali: - print('%s: нет в семени %d из %d' % (imya, n, vsego)) - for i in net: - print(' •', i) - for imya, n, vsego in vne: - print('%s: нет в семени %d из %d — файл вне замыкания компилятора' - % (imya, n, vsego)) - if not otstali and not vne: - print('всё на месте: сошлись все функции') - sys.exit(0) - -print('ОТСТАВАНИЕ СЕМЕНИ ОТ ИСХОДНИКА, поимённо по функциям') -print() -print('НАСТОЯЩЕЕ ОТСТАВАНИЕ — файл в замыкании, часть функций новее семени:') -if otstali: - for imya, n, vsego, net in sorted(otstali, key=lambda x: -x[1]): - print(' %-28s %4d из %4d %s' % (imya, n, vsego, ', '.join(net[:2])[:52])) - print(' ИТОГО: файлов %d, функций %d' - % (len(otstali), sum(n for _, n, _, _ in otstali))) -else: - print(' нет ни одного — семя догнало исходник') -print() -print('ВНЕ ЗАМЫКАНИЯ (не достижим из входа печати) — НЕ отставание:') -print(' файлов %d, функций %d' % (len(vne), sum(n for _, n, _ in vne))) -if nerazreshennye: - print(' ⚑ имён модулей не разрешено: %d (%s) — замыкание НЕПОЛНО' - % (len(nerazreshennye), ', '.join(sorted(nerazreshennye)[:4]))) -print() -print('файлов, сошедшихся полностью: %d' % celyh) -print() -print('Свежесть семени как ДА/НЕТ — не здесь: sh scripts/seed/seed-freshness.sh') -PY 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" deleted file mode 100755 index 81db21521..000000000 --- "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" +++ /dev/null @@ -1,367 +0,0 @@ -#!/bin/sh -# SPDX-FileCopyrightText: 2026 Digitable (Marat Zimnurov) -# SPDX-License-Identifier: BSD-2-Clause -# -# ДОКАЗУЕМ ЛИ ЯЗЫК — ОДНИМ СЛОВОМ, ПО ЧЕТЫРЁМ ЧИСЛАМ, А НЕ ПО ПРОЗЕ. -# -# sh scripts/доказуемость.sh -# ./ярлык доказуемость -# -# Печатает ДОКАЗУЕМ или НЕ ДОКАЗУЕМ. Слово это ходит по документам разовым -# суждением («язык формально-доказуем», «взято N из 7 гейтов»), и суждение -# устаревает молча. Здесь его СНИМАЕТ прибор: четыре проверки, у каждой число, -# и слово выводится из чисел, а не вписывается рукой. -# -# ДОКАЗУЕМ печатается ТОЛЬКО когда сходятся все четыре: -# 1. калькулятор СНЯТ из чекера — мерится ЛОВУШКОЙ, прогоном по живой паре -# исходник+запись, а не грепом по имени функции; -# 2. доля корпуса, проверенного ПЕРЕИГРЫВАТЕЛЕМ, не ниже порога (100 %); -# 3. набор проб чекера пройден ЦЕЛИКОМ (ни одна подделка не принята, ни одна -# честная запись не отвергнута, ни одна строка манифеста не потеряна); -# 4. набор подделок НЕ ОСЛАБ: строк манифеста, числителя набора и проб на -# подлог в прогоне проверки 3 не меньше, чем записано в -# flang/proof/forgeries/ratchet.txt. -# Не сошлась хоть одна — НЕ ДОКАЗУЕМ, и названо, какая проверка провалила и -# каким числом. -# -# КОД ВОЗВРАТА НЕСЁТ ВЕРДИКТ: 0 — ДОКАЗУЕМ, 1 — НЕ ДОКАЗУЕМ, 2 — не смог -# измерить (нет исходника чекера, прогон проб не запустился, линейка доли не -# дала числа). Исходов ТРИ, а не два: «не смог измерить» — не «не доказуем», и -# проверки 3 и 4 печатаются числами даже в нём. Так `./ярлык -# доказуемость && …` работает по существу, а не по слову вывода. -# -# ── Почему проверка 1 РЕШАЮЩАЯ, но БОЛЬШЕ НЕ ЗАМЫКАЕТ ПРИБОР НАКОРОТКО ─────── -# «Калькулятор» — ход чекера, который ДОКАЗЫВАЕТ утверждение, ВЫЧИСЛЯЯ его, а -# не проигрывая записанные шаги. Пока он в чекере есть, доля -# доказанного держится вычислением — это дыра гейта Г7 (независимая проверка). -# Одного его наличия довольно, чтобы язык не был формально-доказуем. -# -# До 8 сентября 2026 прибор на этом и останавливался: провалилась проверка 1 — -# проверки 2 и 3 не гонялись вовсе, провалилась 2 — не гонялась 3. Довод был -# «вердикт уже известен, зачем платить за дорогое». Пока подделки сидели в -# знаменателе доли, это было терпимо: порча записи роняла процент, и хоть -# какой-то сторож работал всегда. С решением ADR-0023 недостижимые места из -# знаменателя вынесены, и набор подделок стал ЕДИНСТВЕННЫМ, что стоит между -# долей и ложью. Сторож, который не гоняется, — не сторож: набор мог бы -# рассыпаться месяцами, и прибор молчал бы, потому что «вердикт и так красный». -# ПОЭТОМУ ВСЕ ЧЕТЫРЕ ПРОВЕРКИ ГОНЯЮТСЯ ВСЕГДА и печатаются числами всегда, -# каким бы ни был исход предыдущих. Цена замерена: прогон проб около 3 с, -# линейка доли около 5 с — это не «дорого», это цена одной страницы вывода. -# -# ── Почему НЕ ГРЕП ПО ИМЕНИ (задача 3781) ────────────────────────────────── -# До 8 сентября 2026 проверка 1 звучала так: `git grep -c -F 'перепиской('` -# обязан быть 0. Мерка негодная, и негодность её ПОМЕРЕНА, а не предположена: -# -# · ПЕРЕИМЕНОВАНИЕ. `перепиской` → любое другое имя, и греп зелен, а -# калькулятор на месте. Проверка, которую обходят правкой одной строки, не -# проверка. -# · ПЕРЕЕЗД. Опыт: вызов `перепиской` снят, чекер пересобран — и ту же работу -# немедленно подхватила ДРУГАЯ функция (дверь 5 `половина_закрыта`, -# `тождественны` на глубине 6). Греп при этом печатал 0. -# · СТОРОЖ ВМЕСТЕ С ПРУВЕРОМ. В `перепиской` жили ДВЕ разные вещи: прувер -# (доказать цель счётом) и сторож (поймать замкнутую ложь, выданную за -# тождество). Греп требовал снести обе, а снос сторожа ослаблял поимку -# подделки `Ч365 П7` с «НЕ СОШЛОСЬ» до «НЕ ПРОВЕРЕНО». -# -# ЧЕМ ЗАМЕНЕНО — ЛОВУШКОЙ. Прибор берёт живые пары исходник+запись из дерева по -# таблице flang/proof/checker/tests/trap/kinds.tsv. Две цели в ней «на слове» — -# доказуемы ТОЛЬКО переписыванием тела законами: -# -# «сумма наоборот» цель `результат равен (б плюс а)` при теле `а плюс б` -# «длина растёт на один» цель `результат равен ((длина элементы) плюс 1)` -# при теле `длина (добавить эл к элементы)` -# -# Обе — ∀ по своим доводам, ходов в записи нет ни одного, принципа нет, посылок -# нет: проигрывать нечего. Чекер ОБЯЗАН оставить их на слове ядра и назвать -# поимённо. Снимет хоть одну — калькулятор в дереве есть, под каким бы именем и -# в какой бы функции он ни жил. -# -# И ЛОВУШКА ДВУСТОРОННЯЯ. Остальные строки таблицы — «снята»: по одной цели на -# КАЖДЫЙ вид обязательства, который чекер умеет переигрывать сегодня (К11, -# 9 сентября 2026; до того обратная половина была одна — «сумма трёх», тождество -# знак в знак). Виды сняты по коду чекера: узел «разбором по случаям» на -# носителях segment/algebra/fold и с объявления типа, разбор цели по условию, -# ходы под постусловием, шаги теоремы (по примеру, по свойству, вне случая, над -# списочным телом), вывод по семействам Н/П/Пред/Т/Разв/О/Д/С/СС/В/Ч, -# обязательство входа, тотальность composition/structure/step. Каждую такую цель -# чекер обязан ЗАКРЫТЬ законно: код сошёлся, имя цели в его выводе не названо, -# след вида стоит в записи, счётчик вида в сводке больше нуля. Без этой половины -# проверку 1 брал бы и чекер, сломанный до состояния «ничего не доказываю»: он -# тоже не снял бы ни одной ∀-цели. Вид, за который чекер перестал браться, красит -# проверку 1 своим именем; убыль строки таблицы ловит храповик -# (flang/proof/checker/tests/trap/ratchet.txt). Цели ловушки лежат ВНЕ корпуса -# и доли не двигают (замер: 567/651 до и после К11). -# -# СЕГОДНЯ ОТВЕТ — НЕ ДОКАЗУЕМ, и это не поломка прибора, а честный замер. -# Проверка 1 с 8 сентября 2026 зелена: калькулятор снят, ловушка цела в обе -# стороны. Останавливает вердикт проверка 2: порог доли — 100 % (слово -# владельца 17 сентября 2026, задача 3348), а доля-проигрыванием на 17 сентября -# 2026 — 633 из 650 = 97,38 %. Недостающие 17 мест сверщик берёт на слово ядра -# или закрывает вычислением; каждое названо поимённо, с ценой закрытия, в -# docs/road-to-one-hundred-measured.md. До 17 сентября порог стоял ниже, и с -# 11 сентября прибор печатал ДОКАЗУЕМ про корпус, где эти 17 мест взяты на -# слово, — ровно поэтому порог поднят. Прибор зазеленеет сам, когда доля -# дорастёт до знаменателя, а набор проб и храповики останутся целы. Опускать -# порог, чтобы позеленело, — подлог. -# -# ── Проверка 2: чем меряется доля-проигрыванием ───────────────────────────── -# Гейт Г7 требует ДОЛЮ корпуса, проверенную НЕЗАВИСИМО — проигрыванием -# записанных шагов, а не вычислением. Прежде здесь стояло вписанное рукой -# `DOLYA_PROIGRYVANIEM=0` с доводом «прибора нет». Прибор появился: -# `flang/proof/corpus-share.sh --проигрыванием` разделяет «проиграно» и -# «посчитано» и печатает долю. Число берётся ПРОГОНОМ этого прибора; порог — -# 100 %: каждое обязательство, оставшееся в знаменателе, проиграно сверщиком, -# ни одно не взято на слово ядра. Сравнивается доля с двумя знаками после -# запятой; при знаменателе меньше 20 000 доля меньше единицы до 100.00 не -# округлится, так что порог 100 % честен и без сравнения числителя со -# знаменателем. Линейка печатает и СВОЮ строку «порог Г4 = … %; добрала ли -# доля порога» — это её собственный гейт (flang/proof, не этот прибор); вердикт -# здесь её не читает, а берёт только строку «доля-проигрыванием = …». -# -# ── Проверка 4: храповик набора ───────────────────────────────────────────── -# Набор, вынесенный из знаменателя доли, перестаёт быть виден в проценте, а -# невидимое ветшает. Храповик держит два числа: сколько подделок объявлено и -# сколько мест честных половин проиграно. Первое стережёт исчезновение -# подделки, второе — беду, которой счёт строк не видит: файл остался в -# манифесте, а его честная половина тихо перестала проигрываться. Крутится -# храповик только вверх и только руками, с доводом в коммите. -# -# Имена переменных латиницей: ни dash, ни bash не берут кириллицу в именах. -set -u -export LC_ALL=C.UTF-8 - -KOREN=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -cd "$KOREN" - -SVERSCHIK_C=flang/proof/checker/checker.c -SVERSCHIK=flang/proof/checker/сверщик -PROGON_PROB=flang/proof/checker/tests/run.sh -LINEYKA=flang/proof/corpus-share.sh -HRAPOVIK=flang/proof/forgeries/ratchet.txt -LOVUSHKA_TSV=${LOVUSHKA_TSV:-flang/proof/checker/tests/trap/kinds.tsv} -LOVUSHKA_HRAP=${LOVUSHKA_HRAP:-flang/proof/checker/tests/trap/ratchet.txt} -POROG=100 - -command -v git >/dev/null 2>&1 || { echo "не смог измерить: git не найден" >&2; exit 2; } -git rev-parse --git-dir >/dev/null 2>&1 || { echo "не смог измерить: $KOREN не под учётом git" >&2; exit 2; } -[ -f "$SVERSCHIK_C" ] || { echo "не смог измерить: нет $SVERSCHIK_C" >&2; exit 2; } - -# ── ПРОВЕРКА 1 (РЕШАЮЩАЯ): калькулятор снят? МЕРИТСЯ ЛОВУШКОЙ ────────────── -# Ловушка — это ПРОГОН, а не чтение исходника, поэтому чекер нужен собранным. -# Собираем сами, если двоичного нет: у чекера один файл и ноль зависимостей -# вне libc (тем же вызовом, что в tests/run.sh). -[ -f "$LOVUSHKA_TSV" ] || { echo "не смог измерить: нет таблицы ловушки $LOVUSHKA_TSV" >&2; exit 2; } -[ -f "$LOVUSHKA_HRAP" ] || { echo "не смог измерить: нет храповика ловушки $LOVUSHKA_HRAP" >&2; exit 2; } -if [ ! -x "$SVERSCHIK" ]; then - ${CC:-cc} -std=c99 -Wall -Wextra -Werror -pedantic -O2 -o "$SVERSCHIK" "$SVERSCHIK_C" 2>/dev/null \ - || { echo "не смог измерить: чекер не собрался" >&2; exit 2; } -fi - -# К11: ловушка — ТАБЛИЦА (flang/proof/checker/tests/trap/kinds.tsv), по строке на -# цель. Две половины, и у каждой своё «ждём»: -# «на слове» — ∀-цели, доказуемые ТОЛЬКО вычислением: чекер обязан оставить их -# на слове ядра и назвать поимённо. Снял хоть одну — калькулятор в -# дереве есть, под каким бы именем он ни жил. Это решающая половина. -# «снята» — по одной цели на КАЖДЫЙ вид обязательства, который чекер умеет -# переигрывать: узел (segment/algebra/fold/объявление), разбор цели, -# ходы, шаги теоремы, вывод по семействам, обязательство входа, -# тотальность. Каждую он обязан переиграть: код сошёлся, имя цели в -# выводе не названо, след вида стоит в записи, счётчик вида в сводке -# больше нуля. Без этой половины проверку 1 брал бы и чекер, -# сломанный до «ничего не доказываю»; до К11 она стерегла один вид. -# Девятая колонка «пометка» — чем запись отличается от печати ядра (рукотворная -# правка); прибор её не читает, читает человек: цель с пометкой — не вывод ядра. -# Отпечаток исходника подаётся ТРЕТЬИМ доводом: часть записей зовёт своим -# исходником путь вне дерева (мутанты, рождённые во времянках), и без отпечатка -# чекер честно откажется судить чужое дело. -TAB=$(printf '\t') -KALKULYATOR=0; NA_SLOVE=0; VIDOV=0; VIDOV_KRASNO=0; P1_BEDY="" -while IFS="$TAB" read -r vid zhdem ish zap cel sled priznak kod pometka; do - [ -n "$vid" ] || continue - [ -f "$ish" ] && [ -f "$zap" ] \ - || { echo "не смог измерить: у вида «$vid» нет пары $ish / $zap" >&2; exit 2; } - otp=$(sha256sum "$ish" | cut -d' ' -f1) - vyvod=$("$SVERSCHIK" "$ish" "$zap" "$otp" 2>&1); k=$? - case "$zhdem" in - "на слове") - # Строка «НЕ ВЗЯЛСЯ» перечисляет ПОИМЁННО каждое место, оставшееся на слове - # ядра. Имя цели в ней есть — место не снято; имени нет — снято, кем-то. - NA_SLOVE=$((NA_SLOVE+1)) - printf '%s\n' "$vyvod" | /usr/bin/grep -qF "утверждение «$cel»: вердикт «доказано», а за узел не взялся" \ - || { KALKULYATOR=$((KALKULYATOR+1)); P1_BEDY="$P1_BEDY; вид «$vid»: цель «$cel» снята со слова ядра — вычислением"; } ;; - снята) - VIDOV=$((VIDOV+1)); beda="" - [ "$k" -eq "$kod" ] || beda="код $k, ждали $kod" - # Имя цели в выводе чекера — это либо беда, либо «на слове ядра»: и то, и - # другое значит, что цель НЕ переиграна. - if printf '%s\n' "$vyvod" | /usr/bin/grep -qF "«$cel»"; then beda="${beda:+$beda; }цель «$cel» названа чекером — не переиграна"; fi - /usr/bin/grep -qF -- "$sled" "$zap" || beda="${beda:+$beda; }в записи нет следа «$sled» — цель больше не этого вида" - if [ "$priznak" != "—" ] && ! printf '%s\n' "$vyvod" | /usr/bin/grep -qE -- "$priznak"; then - beda="${beda:+$beda; }в сводке чекера нет признака «$priznak»"; fi - [ -z "$beda" ] || { VIDOV_KRASNO=$((VIDOV_KRASNO+1)); P1_BEDY="$P1_BEDY; вид «$vid»: $beda"; } ;; - *) echo "не смог измерить: в таблице ловушки неизвестное «ждём» — «$zhdem» (вид «$vid»)" >&2; exit 2 ;; - esac -done <&2; exit 2 ;; esac - -if [ "$KALKULYATOR" -gt 0 ]; then - P1=НЕТ - P1_SLOVO="∀-целей, снятых со слова ядра вычислением: $KALKULYATOR из $NA_SLOVE — $P1_BEDY; таблица $LOVUSHKA_TSV" -elif [ "$VIDOV_KRASNO" -gt 0 ]; then - P1=НЕТ - P1_SLOVO="обратная половина ловушки красна: видов не переиграно $VIDOV_KRASNO из $VIDOV — прибор мерит сломанный чекер, а не снятый калькулятор — $P1_BEDY" -elif [ "$VIDOV" -lt "$HR_VID" ] || [ "$NA_SLOVE" -lt "$HR_NS" ]; then - P1=НЕТ - P1_SLOVO="ловушка ослабла: видов $VIDOV при храповике $HR_VID, ∀-целей $NA_SLOVE при храповике $HR_NS — строка таблицы убрана, а храповик при ней нет" -else - P1=ДА - P1_SLOVO="ловушка: ∀-целей на слове ядра $NA_SLOVE из $NA_SLOVE, видов обязательства переиграно $VIDOV из $VIDOV (храповик $HR_VID/$HR_NS)" -fi - -# ── ПРОВЕРКА 2: доля корпуса проигрыванием не ниже порога? ────────────────── -# Число берётся прогоном линейки. Линейка падает кодом 1 на несошедшемся -# балансе знаменателя — тогда числа нет, и врать про него нельзя. -LINEYKA_VYVOD=$(sh "$LINEYKA" --проигрыванием 2>&1) && LINEYKA_KOD=0 || LINEYKA_KOD=$? -DOLYA=$(printf '%s\n' "$LINEYKA_VYVOD" | sed -n 's/^доля-проигрыванием = \([0-9]*\) \/ \([0-9]*\) = \([0-9.]*\) %.*/\3/p') -DOLYA_CH=$(printf '%s\n' "$LINEYKA_VYVOD" | sed -n 's/^доля-проигрыванием = \([0-9]*\) \/ \([0-9]*\) = .*/\1/p') -DOLYA_ZN=$(printf '%s\n' "$LINEYKA_VYVOD" | sed -n 's/^доля-проигрыванием = \([0-9]*\) \/ \([0-9]*\) = .*/\2/p') -NEDOST=$(printf '%s\n' "$LINEYKA_VYVOD" | sed -n 's/^исключено мест *\([0-9][0-9]*\).*/\1/p') -NAB_STROK=$(printf '%s\n' "$LINEYKA_VYVOD" | sed -n 's/^поймано \([0-9][0-9]*\) из \([0-9][0-9]*\) .*/\2/p') -NAB_CHISL=$(printf '%s\n' "$LINEYKA_VYVOD" | sed -n 's/.*числитель набора \([0-9][0-9]*\) .*/\1/p') -# Линейка отказала (несошедшийся баланс знаменателя, пустой корпус) — числа -# нет, и врать про него нельзя. Но это НЕ повод молчать о проверках 3 и 4: -# они гоняются и печатаются всё равно, а вердикт становится «не смог измерить». -NE_IZMERIL=0 -if [ "$LINEYKA_KOD" -ne 0 ] || [ -z "$DOLYA" ]; then - NE_IZMERIL=1; P2="НЕ ИЗМЕРЕНА" - LINEYKA_BEDA=$(printf '%s\n' "$LINEYKA_VYVOD" | grep -m1 'РАСХОЖДЕНИЕ\|не смог\|нет ни одной записи') - [ -n "$LINEYKA_BEDA" ] || LINEYKA_BEDA="линейка вышла кодом $LINEYKA_KOD и числа не дала" -else - P2=$(awk -v d="$DOLYA" -v p="$POROG" 'BEGIN{ print (d+0 >= p+0) ? "ДА" : "НЕТ" }') -fi - -# ── ПРОВЕРКА 3: набор проб чекера пройден целиком? ───────────────────────── -# ГОНЯЕТСЯ ВСЕГДА, каким бы ни был исход проверок 1 и 2 (см. шапку). -# Код 0 у прогона = ни одна подделка не принята, ни одна честная не отвергнута, -# ни одна строка манифеста не потеряна. -PROGON_VYVOD=$(sh "$PROGON_PROB" 2>&1) && PROGON_KOD=0 || PROGON_KOD=$? -if [ "$PROGON_KOD" -gt 1 ]; then - echo "не смог измерить: набор проб не запустился (код $PROGON_KOD)" >&2 - printf '%s\n' "$PROGON_VYVOD" >&2 - exit 2 -fi -PODDELOK=$(printf '%s\n' "$PROGON_VYVOD" | sed -n 's/^ *подделок \([0-9][0-9]*\):.*/\1/p') -PRINYATO=$(printf '%s\n' "$PROGON_VYVOD" | sed -n 's/.*ПРИНЯТО кодом 0 — \([0-9][0-9]*\).*/\1/p') -CHESTNYH=$(printf '%s\n' "$PROGON_VYVOD" | sed -n 's/^ *честных *\([0-9][0-9]*\):.*/\1/p') -OTVERGNUTO=$(printf '%s\n' "$PROGON_VYVOD" | sed -n 's/.*честных.*/&/p' | sed -n 's/.*отвергнуто \([0-9][0-9]*\) (обязано быть 0).*/\1/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 - P4=НЕТ; P4_SLOVO="храповика нет — $HRAPOVIK потерян" -else - HR_P=$(awk '/^подделок /{print $2; exit}' "$HRAPOVIK") - HR_CH=$(awk '/^числитель /{print $2; exit}' "$HRAPOVIK") - HR_PR=$(awk '/^проб на подлог /{print $4; exit}' "$HRAPOVIK") - if [ -z "${HR_P:-}" ] || [ -z "${HR_CH:-}" ] || [ -z "${HR_PR:-}" ]; then - P4=НЕТ; P4_SLOVO="храповик не называет всех трёх чисел (подделок, числитель, проб на подлог)" - else - [ -n "${NAB_STROK:-}" ] || NAB_STROK=0 - [ -n "${NAB_CHISL:-}" ] || NAB_CHISL=0 - if [ "$NAB_STROK" -lt "$HR_P" ]; then - P4=НЕТ - P4_SLOVO="подделок в манифесте $NAB_STROK при храповике $HR_P — набор ослаб на $((HR_P-NAB_STROK))" - fi - if [ "$NAB_CHISL" -lt "$HR_CH" ]; then - P4=НЕТ - if [ -n "$P4_SLOVO" ]; then P4_SLOVO="$P4_SLOVO; "; fi - P4_SLOVO="${P4_SLOVO}числитель набора $NAB_CHISL при храповике $HR_CH — просело на $((HR_CH-NAB_CHISL)) мест" - fi - # Проб на подлог в прогоне проверки 3 (строка «подделок N:» прогона): подделка - # прогона, что не собралась (sed не нашёл строки в перепечатанной записи) или - # убрана, из счёта выпадает молча — здесь убыль громкая. - [ -n "${PODDELOK:-}" ] || PODDELOK=0 - 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)) (подделка не собралась или проба убрана)" - fi - fi -fi - -# ── ЧЕМ И НА ЧЁМ СНЯТО ───────────────────────────────────────────────────── -# Вердикт без провенанса нельзя ни повторить, ни опровергнуть. Шапка печатается -# В ВЫВОД, а не в лог CI: пункт 11 внешнего аудита — «привяжи отчёты к SHA -# исходников, семени, зависимостям и версии семантики». Отдельно она называет -# СОБРАННЫЙ ДВОИЧНЫЙ, и это здесь не формальность: четыре проверки ниже не зовут -# bootstrap/flang ни разу и печатают ДОКАЗУЕМ даже тогда, когда двоичного в -# дереве нет вовсе. Пока это так, читатель обязан видеть это в самом отчёте. -sh "$KOREN/scripts/report-provenance.sh" || true - -# ── ВЕРДИКТ ──────────────────────────────────────────────────────────────── -# Печатаются ВСЕ ЧЕТЫРЕ строки с числами, независимо от того, какая провалила: -# «вердикт уже известен» — не довод молчать о трёх остальных сторожах. -if [ "$NE_IZMERIL" -eq 1 ]; then - echo "НЕ СМОГ ИЗМЕРИТЬ"; ITOG=2 -elif [ "$P1" = ДА ] && [ "$P2" = ДА ] && [ "$P3" = ДА ] && [ "$P4" = ДА ]; then - echo "ДОКАЗУЕМ"; ITOG=0 -else - echo "НЕ ДОКАЗУЕМ"; ITOG=1 -fi -echo -echo "проверка 1 — калькулятор снят? $P1 ($P1_SLOVO)" -if [ "$NE_IZMERIL" -eq 1 ]; then - echo "проверка 2 — доля проигрыванием не ниже ${POROG} %? НЕ ИЗМЕРЕНА ($LINEYKA_BEDA)" -else - echo "проверка 2 — доля проигрыванием не ниже ${POROG} %? $P2 (${DOLYA} %: ${DOLYA_CH} из ${DOLYA_ZN}; недостижимых мест вынесено ${NEDOST:-0})" -fi -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 - echo "проверка 4 — набор не ослаб? НЕТ ($P4_SLOVO)" -fi -if [ "$P3" != ДА ]; then - echo - echo "чем провалился набор проб (проверка 3) — строками прогона:" - # Не только «ПРОВАЛ»: несобравшаяся подделка и сдвинувшаяся дыра долга тоже красят - # прогон (провал в его счёте), и без них список «чем провалился» бывал пуст. - printf '%s\n' "$PROGON_VYVOD" | grep -E '^(ПРОВАЛ|ПОДДЕЛКА НЕ СОБРАЛАСЬ|ПОРЧА НЕ СОБРАЛАСЬ|ДЫРА ИЗМЕНИЛАСЬ)' | sed 's/^/ /' -fi -exit "$ITOG" -# ярлык «доказуемость» sh — формально доказуем язык или нет — одним словом по четырём числам: снят ли калькулятор из чекера (ловушкой), доля программ репозитория проигрыванием не ниже 100 %, цел ли набор проб, не ослаб ли храповик; сегодня НЕ ДОКАЗУЕМ: доля 633 из 650, 17 мест на слове ядра (задача 3348) diff --git "a/\321\217\321\200\320\273\321\213\320\272" "b/\321\217\321\200\320\273\321\213\320\272" index 42cfabc69..3d0d99983 100755 --- "a/\321\217\321\200\320\273\321\213\320\272" +++ "b/\321\217\321\200\320\273\321\213\320\272" @@ -182,12 +182,16 @@ fi # ядра доказательств лежит в исходнике и в собранной программе не работает, а # ведомость печатает зелёное про дерево, которого нет. Список ярлыков, чей ответ # от семени зависит, лежит в ярлыки.flang («Ярлыки о доказательствах»); отказ и -# ключ обхода — в scripts/seed/seed-freshness.sh. +# ключ обхода — в scripts/seed/seed-freshness.fscript. # # Спрашивается КАЖДЫЙ ярлык, а не только помеченный: обещание функции заодно # проверяет, что все имена в списке — настоящие ярлыки этого дерева. if [ "$(ask '«Судит о доказательствах»' --args "{\"ярлык\":\"$name\"}")" = "true" ]; then - sh "$ROOT/scripts/seed/seed-freshness.sh" --chto "ярлык «$name» ($command_line)" || exit $? + freshness=$("$BINARY" io scripts/seed/seed-freshness.fscript --plan Check --timeout 300000 -- --what "ярлык «$name» ($command_line)" 2>&1) && freshness_code=0 || freshness_code=$? + if [ "$freshness_code" != 0 ]; then + printf '%b\n' "$(printf '%s\n' "$freshness" | sed -n 's/^{"error":"\(.*\)","diagnostics":.*$/\1/p')" >&2 + exit "$freshness_code" + fi fi # Доводы после имени ярлыка уезжают команде. У ярлыка из НЕСКОЛЬКИХ команд через diff --git "a/\321\217\321\200\320\273\321\213\320\272\320\270.flang" "b/\321\217\321\200\320\273\321\213\320\272\320\270.flang" index de4d819f9..bb9f76666 100644 --- "a/\321\217\321\200\320\273\321\213\320\272\320\270.flang" +++ "b/\321\217\321\200\320\273\321\213\320\272\320\270.flang" @@ -252,12 +252,12 @@ "плюс собранный bootstrap/flang — дороже прочих дешёвых ", "проверок, оттого место в CI, а не в хуке"] по ""), запись «Ярлык» с «имя» равным "доказуемость" и «команда» равным (соединить [ - "sh scripts/доказуемость.sh"] по "") и «зачем» равным (соединить [ + "bootstrap/flang io scripts/provability.fscript --plan Verdict ", + "--timeout 900000"] по "") и «зачем» равным (соединить [ "формально доказуем язык или нет — одним словом по четырём ", "числам: снят ли калькулятор из чекера (ловушкой), доля программ ", "репозитория проигрыванием не ниже 100 %, цел ли набор проб, не ", - "ослаб ли храповик; сегодня НЕ ДОКАЗУЕМ: доля 633 из 650, 17 ", - "мест на слове ядра (задача 3348)"] по ""), + "ослаб ли храповик"] по ""), запись «Ярлык» с «имя» равным "доля:проигрыванием" и «команда» равным (соединить [ "sh flang/proof/corpus-share.sh --проигрыванием"] по "") и «зачем» равным (соединить [ "проверка 2 доказуемости числом: доля-проигрыванием = Σ ", @@ -286,7 +286,7 @@ " --на-веру"] по "") и «зачем» равным (соединить [ "обещанный деревом выпуск существует на GitHub и ставится"] по ""), запись «Ярлык» с «имя» равным "двоичный:приёмка" и «команда» равным (соединить [ - "sh scripts/seed/new-binary-acceptance.sh"] по "") и «зачем» равным (соединить [ + "bootstrap/flang io scripts/seed/new-binary-acceptance.fscript --plan Accept --timeout 3600000 --"] по "") и «зачем» равным (соединить [ "новый двоичный после перепечатки принят по шести приметам, а не на ", "слово"] по ""), запись «Ярлык» с «имя» равным "столкновения:проверка" и «команда» равным (соединить [