# P92 — октябрь 2025: объяснение сложной инженерной темы ## Область draft-пакета Пакет заменяет только три overlay-статьи: `editorial-2025-10-practice-teaching-engineering`, `editorial-2025-10-mechanism-teaching-engineering`, `editorial-2025-10-field-teaching-engineering`. Единственный исполняемый артефакт — `web/scripts/upgrade-2025-10.mjs`. Все attempts, feedback, trace и results — fixed synthetic in-memory literals; модуль не читает files, network, Git, CI, clock, telemetry, production или user data и не выполняет side effect. Registry, README, очередь, `articles.json`, app-страницы, `docs/`, Git и чужие draft-пакеты не менялись. ## Исследование и историческая граница Граница — 31 октября 2025. Оба источника доступны обычным HTTPS без авторизации и TLS bypass. [ECMA-262 16th edition](https://ecma-international.org/wp-content/uploads/ECMA-262_16th_edition_june_2025.pdf) — неизменяемый опубликованный PDF июня 2025, §27.2.4.1/PerformPromiseAll. [MDN Promise.all](https://raw.githubusercontent.com/mdn/content/3fad0447b4901e28fe88769976787d8d8b87d66d/files/en-us/web/javascript/reference/global_objects/promise/all/index.md) закреплён commit `3fad0447b4901e28fe88769976787d8d8b87d66d` от 19.08.2025. Они подтверждают семантику aggregate outcome, порядок результатов, first rejection и allSettled; не подтверждают cancellation конкретной внешней работы. Вывод «cancel требует отдельного contract» в статье — явно обозначенная инженерная граница, не обещание источника. ## Проход 1 — факты, техника и источники - `runFixedPromiseExercise` создаёт только две in-memory promises: первая сразу rejected, вторая завершается вручную после обработанного aggregate reject. Trace проверяет порядок `aggregate-rejected`, затем `remaining-input-fulfilled`; он не моделирует сеть, timer или ресурс. - `checkFixedTeachingAttempt` принимает только frozen fixed literals. `recipe-only-v1` останавливается на `missing-model` и `missing-counterexample`, `wrong-cancellation-v1` — на `wrong-boundary`; positive path выдаёт только `synthetic-ready-for-human-review`. - В текст не перенесено утверждение, что Promise.all отменяет работу. ECMA-262 и MDN использованы только в заявленных границах; allSettled описан как получение всех исходов, а не cancel mechanism. **Вердикт:** пройдено. ## Проход 2 — редактура, голос, объём, цена и cross-article Все статьи начинаются с наблюдаемой проблемы и цены ошибки в первых двух абзацах. Тон М8 — короткий, наставнический, без claims об эффективности: симптом → причина → проверка → действие. Термины раскрыты при первом появлении. Practice отвечает за маршрут объяснения, mechanism — за разделение трёх уровней состояния, field — за форму конкретной обратной связи. | Статья | Главный вопрос | Самостоятельный артефакт | Цена ошибки | | --- | --- | --- | --- | | practice | Как выстроить объяснение? | путь model → exercise → check | рецепт копируют вне условий | | mechanism | Что именно делает aggregate? | матрица допустимых выводов | ложная очистка и неверное владение | | field | Как вернуть конкретный пробел? | fixed feedback card | неверный hand-off следующему инженеру | Cross-article repetition check после финальной редакции: **0** одинаковых абзацев длиной от 160 знаков и **0** общих последовательностей из 12 слов; общий большой вводный блок отсутствует. **Вердикт:** пройдено. Независимый audit зафиксировал основной текст: practice — **5 725**, mechanism — **6 071**, field — **5 457** знаков. ## Проход 3 — SVG, fixture и выпуск - `node --check web/scripts/upgrade-2025-10.mjs` — PASS. - `node web/scripts/upgrade-2025-10.mjs --verify-fixture` — PASS, 10/10 assertions. - `npm run audit:draft -- scripts/upgrade-2025-10.mjs` — PASS: **5 725 / 6 071 / 5 457**; диапазон 5–15 тыс., table, figure, alt/caption, code, ordered sequence, два источника, проблема и цена. - `xmllint --noout` для трёх SVG — PASS; safety scan чист: нет `script`, `foreignObject`, `javascript:`, `data:image` и inline event handlers. - Sharp renders на 375 px просмотрены: model path сохраняет пять карточек, matrix читает три уровня, feedback loop показывает возврат gap и hand-off без обрезания. Overlay намеренно не подключён. README, registry, очередь и Git не менялись; интеграционный audit/build остаётся задачей независимого редактора. ## Независимый выпускной проход — 31.07.2026 Источники перепроверены на закреплённых версиях. ECMA-262 16th edition PDF показывает `Promise.all`, `NewPromiseCapability`, iterator и `PerformPromiseAll`; MDN commit `3fad0447` подтверждает first rejection, iterable order и границу `allSettled`. Ни один текст не выводит отмену внешней операции из этих фактов. Все три статьи прочитаны целиком. Практика объясняет модель и упражнение, mechanism отделяет input, aggregate и внешнюю операцию, field возвращает recipe к проверяемому feedback. Попарная проверка основного текста: 0 одинаковых абзацев от 160 знаков и 0 общих 12-словных фрагментов. Три SVG повторно отрендерены Sharp на 375 px и остались читаемыми. При буквальном исполнении practice example обнаружен неполный комментарий к `console.log(report)`: объект также содержал `productionEffect`. Snippet изменён на вывод трёх конкретно показываемых полей; результат теперь точно соответствует комментарию. Повторный fixture проходит. ~~~text node --check scripts/upgrade-2025-10.mjs PASS node scripts/upgrade-2025-10.mjs --verify-fixture PASS fixture: 10/10 assertions npm run audit:draft -- scripts/upgrade-2025-10.mjs PASS: 5725 / 6071 / 5457 body chars npm run audit:articles -- <3 October slugs> PASS: each article has 1 table, 1 code example and 1 figure ~~~ После приёмки overlay подключён в `editorial-revisions.mjs` после September 2025. Все examples остаются fixed in-memory teaching models; они не создают production result, отмену внешней работы или claim об эффективности обучения.