Skip to content

refactor(translation): the matcher suite is a proved plan with 32 probes - #310

Merged
the-homeless-god merged 3 commits into
devfrom
a/translation-run-to-plan
Oct 4, 2026
Merged

the-homeless-god merged 3 commits into
devfrom
a/translation-run-to-plan

Conversation

@the-homeless-god

@the-homeless-god the-homeless-god commented Oct 4, 2026 •

Copy link
Copy Markdown
Member

Что сделано

flang/translation/run.sh (214 строк оболочки) снят. То же гоняет
flang/translation/run.fscript — план, приговор которого доказан ядром:
утверждений 15: доказано 15, сетка 0, объявлено, не доказано 0, и потому ярлык
идёт без --на-веру.

Вместе с переносом вписаны девять опытов, лежавших только в теле PR 298 (пять
на правило отфильтровать, четыре на поблажку сторожу меры). Их автор не мог их
вписать: run.sh был не его. Ожидания — замер, а не предсказание: каждый
прогнан, и каждый ответил ровно то, что названо в том блоке. Набор вырос с 23
опытов до 32, все 32 сошлись.

число откуда
опытов 32 translation:check, код 0
из них новых этим PR 9 блок PR 298
обязательств в плане / доказано 15 / 15 flang check --proof
правил в закрытом списке 41 сверка PRINT-RULES.tsv ↔ RULES[]
прогон целиком 4,3 с time на рабочей машине

Чем доказан перенос

Тройки совпали знак в знак. «Что, ожидаемый код, обязательное слово» сняты
ПРИБОРОМ у обоих файлов на одном дереве — у run.sh разбором его вызовов opyt,
у плана прогоном функции «Опыты», — и diff обеих выписок пуст: 32 строки,
одни и те же имена, коды и слова.

Оба зелены на одном дереве: run.sh → ИТОГ: опытов 32, все сошлись с ожиданием, код 0; план → перевод: закрытый список 41 правил, опытов 32, все сошлись с ожиданием, код 0.

Отрицательный контроль, три подлога — на каждом оба краснеют кодом 1 и
называют ОДНО место:

подлог run.sh план
svetofor.c: 500 → 501 (как в CI) КРАСЕН «честная пара с разбором», код 1 · честная пара с разбором … ответил кодом 1, код 1
PRINT-RULES.tsv: вынуто правило свёртка КРАСЕН «закрытый список … разошлись», код 1 · закрытый список разошёлся — … только в matcher.c: свёртка, код 1
declared_measure_at_the_boundary.c: 1.0 → 2.0 КРАСЕН «честная пара с объявленной мерой», код 1 то же имя опыта, код 1

Третий подлог нарочно бьёт по ОДНОМУ ИЗ ДЕВЯТИ НОВЫХ опытов: иначе краснота не
показывала бы, что новые опыты работают, а не просто написаны.

Два отличия, названные нарочно

Они записаны в шапке плана, а не оставлены на догадку:

  1. Разошедшийся закрытый список у оболочки обрывал прогон до первого опыта;
    здесь он становится бедой номер один, а опыты всё равно прогоняются. Код тот
    же 1, сведений больше.
  2. Несобравшаяся подделка («ПОДДЕЛКА НЕ ПОСТРОЕНА», код 9 от оболочки) у
    run.sh обрывала весь прогон; здесь она краснит СВОЙ опыт поимённо, а
    остальные досчитываются.

Где оболочка осталась, и почему

Оболочка осталась ровно там, где она прибор, а не судья: сборка сличителя
(cc), правка честной пары в подделку (sed/awk) и запуск сличителя. Судит
план: разбор ответа, сверка закрытого списка, сборка опыта из частей и каждое
ожидание проверяются примерами на месте и обязательствами, которые считает
ядро. Прелюдия оболочки (пути, четыре прибора правки, 46 образцов) пишется ОДИН
раз в временный каталог и подключается каждым опытом — иначе протокол плана
раздувался бы в 178 КБ на зелёном прогоне вместо 37 КБ.

Заслоны

заслон факт
хук перед пушем, все 21 зелены, 57 с
proved-share-vs-tree своя строка `…
who-calls-the-guards 0 (ярлык зовётся в binary.yml)
guards-without-forgery-probe 0 (проба порчи в том же наборе, ищет строку жалобы плана)
prose-numbers-guard 210 примет из 210 сошлись
inventory:check код 0
file-extensions:check код 0
lint плана 0 строк длиннее 120, 0 ветвлений глубже 2
links:check битых 88 из 7130 — столько же, сколько на базе ветки; прибавки нет

Счётные приметы, сдвинутые этой правкой (сняты прибором, не рукой): таблица
оболочки 56 / 9875 → 55 / 9661, «файлов вне flang» 193 → 192 в трёх местах,
«файлов *.sh» 50 → 49 в двух.

Чего не сделано, и это чужое

  • scripts/four-coverages.fscript читает и запускает flang/translation/run.sh
    («Translation suite», строки 26, 43-44) и считает опыты по строкам
    opyt . После этого PR раздел 4 того отчёта напечатает «НЕ СНЯТО». Файл не
    мой — не правил; владельцу нужно переписать путь на run.fscript, а счёт
    опытов — на поле «опытов» ответа плана.
  • docs/adr/0030, строка 273 называет sh flang/translation/run.sh в прозе
    заголовка Ш4. ADR — запись о прошлом, links:check её не судит; правка за
    владельцем docs/**.
  • docs/four-coverages.md правлен ровно в одном месте: мёртвая ссылка на
    снятый run.sh переписана на run.fscript, чтобы links:check не вырос.

Ветка пересобрана над стволом дважды

Ствол ушёл на 41 коммит пока работа шла, и дважды — в счётные приметы оболочки
(другой перенос снял version-derivations-guard.sh и ещё один скрипт). Числа
НЕ переписаны руками поверх конфликта: при каждом столкновении взята версия
ствола, а затем прибор (prose-numbers-guard, inventory:languages) назвал
разошедшееся заново, и правлено ровно названное. Прогон плана и три подлога
перемерены на пересобранном дереве — ответы те же.

flang/translation/run.sh (214 lines of shell) is gone; the same work is now
flang/translation/run.fscript, a plan the kernel proves: 15 obligations, all
15 proved, so the shortcut runs without --trust.

Nine probes that lived only in the body of PR 298 are written in: five on the
list-filter rule and four on the measure-guard allowance. The expectations are
measured, not predicted - every one answered exactly what that block said it
would, so the suite grew from 23 probes to 32 and all 32 match.

What proves the move is right: the 32 triples (name, expected code, required
word) were taken by instrument from both files - from run.sh by parsing its
probe calls, from the plan by running its probe-table function - and they are
identical. Both run green on one tree: 32 probes, zero divergences, code 0.
Negative control, three forgeries: a number in the printed C of the traffic
light (500 -> 501), one rule cut out of PRINT-RULES.tsv, and a number in the
printed C of the declared measure (1.0 -> 2.0). On each one both go red with
code 1 and name the same place.

Two differences are deliberate and written in the file. A diverged closed list
no longer stops the run before the first probe - it becomes complaint number
one and the probes still run. A forgery that fails to build now reddens its
own probe by name instead of aborting the whole run.

CI calls the plan by its shortcut and takes the binary from the shared cache
the way its neighbours do, because a plan needs the binary; the forgery probe
greps for the plan's complaint line. The counted marks in this workflow follow
the shell file that left.
The translation suite moved from shell to a plan, so the numbers it is counted
in move with it: one shell file and 214 shell lines less, one file less
outside flang. Taken by instrument (inventory:languages for the table,
prose-numbers-guard for the marks), not by hand:

  docs/tree-inventory.md       shell row 56 / 9875 -> 55 / 9661, title 193 -> 192
  docs/javascript-inventory.md 193 -> 192
  .github/workflows/binary.yml shell 50 / 9558 -> 49 / 9344, total 193 -> 192
  .github/workflows/ci.yml     shell files 50 -> 49

After it: inventory:check code 0, prose-numbers-guard 209 marks of 209 agree.

scripts/ledgers/proved-share-ledger.txt takes a row for the new plan:
15 written, 15 proved, 0 on a grid, 0 declared, 0 without a verdict. The
verdict was taken by flang check --proof on this tree, not assumed.

docs/four-coverages.md pointed at the removed run.sh; the link now names
run.fscript, so links:check stays at 88 broken paths of 7130 - the same count
as the base of this branch.

Not touched, because they belong to other cells: scripts/four-coverages.fscript
still reads and runs flang/translation/run.sh, so section 4 of that report will
print "NOT TAKEN" until its owner renames the path; docs/adr/0030 line 273
still names the shell command in prose.
The suite is a plan now, so the job builds the seed on a cache miss. Ten
minutes were the budget of a shell run that needed only cc; its neighbour
guards-selftest, which builds the same seed, asks for twenty.
@the-homeless-god
the-homeless-god force-pushed the a/translation-run-to-plan branch from b47703d to 321eef5 Compare October 4, 2026 16:47
@the-homeless-god
the-homeless-god merged commit 5604556 into dev Oct 4, 2026
32 checks passed
@the-homeless-god
the-homeless-god deleted the a/translation-run-to-plan branch October 4, 2026 17:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant