# P109 — March 2027: «Уроки D для прикладного инженера» ## Статус, temporal boundary и write scope Редакторская дата: **2026-07-31**. Март 2027 ещё не наступил. Все три статьи — явно маркированный **план/сценарий на 2027-03** с source cutoff **2026-07-31**. Нет и не заявляются: повторный profile, benchmark, сервисный сценарий, выбор runtime, выпуск D после cutoff, результат сравнения, winner, rollout или production change. Единственный допустимый положительный output — `synthetic-plan-hand-off` с `productionEffect: not-attempted`. Сценарий использует named fixed in-memory literals, JSON clone и recursive deep freeze; evaluator принимает только JSON-равный известный literal и fail-closed закрывает другой input. Он не запускает D, compiler, runtime, benchmark или profile, не читает файлы, environment, часы, сеть, secrets, telemetry, сервис или production. Изменены только: - `web/scripts/upgrade-2027-03.mjs` - `editorial/reviews/2027-03-draft.md` - `web/public/assets/editorial/2027/d-lessons-2027-runtime-tradeoff-map.svg` - `web/public/assets/editorial/2027/d-lessons-2027-constraint-matrix.svg` - `web/public/assets/editorial/2027/d-lessons-2027-evidence-handoff-loop.svg` Registry, README, `articles.json`, app, queue, P102–P108 и Git state не менялись. ## Pinned official primary sources 1. [D 2.112.0 changelog](https://dlang.org/changelog/2.112.0.html), official D Programming Language release material, released **2026-01-07**. Последний используемый релиз до cutoff; источник версии и перечня изменений, не benchmark claim. 2. [D 2.111.0 changelog](https://dlang.org/changelog/2.111.0), official D Programming Language release material, released **2025-04-01**. Источник даты и релизных изменений, не выбора runtime. 3. [D 2.110.0 changelog](https://dlang.org/changelog/2.110.0.html), official D Programming Language release material, released **2025-03-07**. Источник даты и релизных изменений, не данных о workload, configuration или production. Источники первичные, official, pinned версией и датой, не позднее cutoff. Внешние benchmark/review/blog источники не использованы. Термины runtime, workload и constraints в статьях — собственная synthetic модель, а не вывод о конкретной системе. ## Review pass 1 — фокус, голос, временная честность - **Practice**: контекстное сравнение и место, где D не default. Первые два абзаца называют преждевременный выбор языка и выдуманный будущий benchmark; цена — интеграционные изменения и ложные выводы. Таблица — карта вопроса, не scorecard. - **Mechanism**: runtime trade-off, constraints и falsifiability. Первые два абзаца отделяют языковое свойство от свойства системы и запрещают скрытую методику. Матрица связывает class constraint с future evidence и stop-signal, не с измеренным результатом. - **Field**: synthetic evidence hand-off, не report/profile. Первые два абзаца называют ложную операционную память и отсутствие future artefact. Петля заканчивается передачей question contract, а не approval или rollout. - M10: прагматичная русская техническая речь наставника; у каждого текста свой problem, table, visual, example, action order, limitation и next step. Экосистемный маркетинг и retrospective tone исключены. ## Review pass 2 — literal safety и falsifiability - `planned-runtime-hand-off-v1` требует `planDate: 2027-03`, `sourceCutoff: 2026-07-31`, named workload, named constraints, `benchmark: not-run/not-collected/not-collected` и `synthetic-plan-hand-off`. - `undated-scenario-v1` → `stop-undated-scenario-or-cutoff`. - `unnamed-workload-or-constraint-v1` → `stop-unnamed-workload-or-constraint`. - `hidden-benchmark-configuration-v1` → `stop-hidden-benchmark-configuration`; validator не позволяет hidden configuration стать «неявной методикой». - `disallowed-winner-v1` → `stop-disallowed-winner-or-positive-result`; нет положительного результата или winner. - Factory делает JSON clone и deep freeze including nested constraints. Unknown/mutated input → `stop-unknown-fixed-input`. Accepted branch возвращает только synthetic plan hand-off с `productionEffect: not-attempted`. ## Review pass 3 — visual, accessibility и duplicate scan - Все SVG имеют русские `title` и `desc`; все три соответствующие статьи имеют meaningful русский alt и caption. Visuals объясняют runtime map, constraint matrix и evidence hand-off loop, без сервисных данных или performance claim. - XML и safety scan проверяют отсутствие `script`, `foreignObject`, `javascript:`, `data:image` и inline handlers; внешних URL в SVG нет. - Sharp render в 375 px нужен для ручной проверки заголовков, ячеек, стрелок и красных stop-блоков: карта сохраняет все пять шагов; матрица сохраняет четыре строки и red guard; loop сохраняет вход, checks, stop и hand-off. - Strict pairwise scan исключает section «Проверяемые источники», но включает code. Требование: `shared-12-word-fragments=0` для каждой пары. ## Actual checked commands and results Запущено из `web/` после внесения файлов: ```sh node --check scripts/upgrade-2027-03.mjs node scripts/upgrade-2027-03.mjs --verify-fixture npm run audit:draft -- scripts/upgrade-2027-03.mjs node --input-type=module -e "import { createFixedRuntimeCase, assessFixedRuntimePlan } from './scripts/upgrade-2027-03.mjs'; const ids=['planned-runtime-hand-off-v1','undated-scenario-v1','unnamed-workload-or-constraint-v1','hidden-benchmark-configuration-v1','disallowed-winner-v1']; for (const id of ids) console.log(id, assessFixedRuntimePlan(createFixedRuntimeCase(id)).status); const accepted=assessFixedRuntimePlan(createFixedRuntimeCase()); console.log('exports-frozen', Object.isFrozen(createFixedRuntimeCase()), Object.isFrozen(createFixedRuntimeCase().constraints), accepted.productionEffect);" xmllint --noout public/assets/editorial/2027/d-lessons-2027-runtime-tradeoff-map.svg public/assets/editorial/2027/d-lessons-2027-constraint-matrix.svg public/assets/editorial/2027/d-lessons-2027-evidence-handoff-loop.svg ! rg -n -i "<(script|foreignObject)\\b|javascript:|data:image|(?:^|[[:space:]])on[a-z]+=" public/assets/editorial/2027/d-lessons-2027-runtime-tradeoff-map.svg public/assets/editorial/2027/d-lessons-2027-constraint-matrix.svg public/assets/editorial/2027/d-lessons-2027-evidence-handoff-loop.svg node --input-type=module -e "import sharp from 'sharp'; for (const n of ['d-lessons-2027-runtime-tradeoff-map','d-lessons-2027-constraint-matrix','d-lessons-2027-evidence-handoff-loop']) await sharp('public/assets/editorial/2027/'+n+'.svg').resize({width:375}).png().toFile('/private/tmp/'+n+'-375.png');" node --input-type=module -e "import { revisions } from './scripts/upgrade-2027-03.mjs'; const text=h=>h.replace(/