Личный блог программиста
ProgCode.Ru
PHP, Bitrix, JavaScript, D, Windows и практические заметки из ежедневной разработки.
Материалы
Статьи
Эксплуатационная инструкция: симптом, действие, откат и проверка
Как написать короткую инструкцию для опасной операции, чтобы читатель видел вход, ограничения, обратимое действие и критерий завершения.
Web performance budget: LCP, INP и CLS без одной магической метрики
Как читать пользовательские web-метрики: разделить LCP, INP и CLS, выбрать пороги и не менять код по одному красивому числу.
Security headers: CSP и HSTS без иллюзии защиты
Практический разбор Content-Security-Policy и HSTS: что именно ограничивают заголовки, как вводить nonce и где нужна отдельная проверка.
Incident runbook: от симптома до rollback без догадок
Полевой маршрут инцидента: зафиксировать симптом, отделить влияние от причины, выбрать обратимое действие и проверить восстановление.
Retry без шторма: backoff, jitter и идемпотентность
Почему повтор не лечит любой timeout: связываем статус, идемпотентность, экспоненциальную задержку и предел нагрузки.
Миграция схемы БД без простоя: expand, switch, contract
Разбираем совместимую миграцию таблицы: почему опасно менять запись и чтение одним шагом и как оставить обратимый переход.
Trace Context в HTTP: как не потерять запрос на границе proxy
Практический разбор traceparent: формат, правила передачи через proxy и безопасная проверка заголовка на входе сервиса.
TLS-сертификат: почему «curl работает» не закрывает проверку
Разбираем цепочку доверия, срок действия и SAN: какие проверки проходят до HTTP и почему один успешный клиент ничего не доказывает для другого.
HTTP-таймауты: как разложить общий deadline на измеримые фазы
Разбираем timeout по фазам DNS, TCP, TLS, отправки и чтения, чтобы не лечить один общий симптом неправильным retry.
Code review API-изменения: от diff до обратимой миграции
Полевой маршрут для API-diff: классифицируем несовместимость, проверяем потребителей и оставляем безопасное окно отката.
JSON Schema и бизнес-правила: где проходит граница валидации
Почему валидная JSON Schema не гарантирует корректную операцию: разделяем форму данных, бизнес-инвариант и проверку состояния.
API-контракт: как остановить несовместимый ответ до релиза
Разбираем контракт HTTP-ответа: какие изменения ломают клиента, как проверить их локальным валидатором и где заканчивается схема.
Проверка безопасности без чекбоксов: связываем требование, тест и результат
Как превратить security-требование в проверяемую матрицу с отрицательными случаями и понятной границей.
Аутентификация не даёт доступ: строим deny-by-default для объекта
Разбираем, почему проверка логина без проверки объекта оставляет горизонтальную эскалацию прав.
SSRF начинается с URL: проверяем адрес до сетевого вызова
Практическая защита server-side запроса: схема проверки URL, allowlist и запрет обхода через адресную запись.
Лог повторов, который помогает расследовать сбой: attempt, deadline и причина
Какие поля сохранить, чтобы отделить временный сбой от исчерпанного времени и опасного повтора.
Почему retry иногда удваивает данные: идемпотентность на уровне протокола
Разбираем границу между транспортной доставкой и эффектом бизнес-операции.
Повтор запроса без двойного действия: timeout, 503 и безопасный retry
Практический клиент с общим deadline и повтором только там, где операция допускает повторное выполнение.
Измерение производительности, которому можно верить: фиксируем условия и p95
Как оформить повторяемый замер страницы, чтобы одна удачная попытка не стала решением.
Waterfall без иллюзий: как понять, какой ресурс блокирует страницу
Разбираем waterfall по зависимостям, очереди и блокировке, а не по длине полоски на графике.
Медленная первая загрузка: отделяем TTFB от блокирующих ресурсов
Практический разбор критического пути: что измерить, прежде чем менять JavaScript и CSS.
Как передавать сетевую ошибку: короткая запись без утечки токенов
Формат сетевой заметки, который помогает следующему инженеру продолжить проверку и не раскрывает секреты.
Где рождается ошибка HTTP: разбираем цепочку DNS, TLS и заголовков
Механика запроса по слоям: почему одинаковое слово «ошибка» требует разных проверок.
HTTP и TLS без гадания: как разобрать 404, 503 и ошибку сертификата
Практический маршрут от текста ошибки к уровню, на котором действительно нужно искать причину.
Разбор bundle: найти источник роста без гадания
Полевой маршрут от выросшего JavaScript-файла к конкретному input, chunk и проверке source map.
Кэш сборки: ключ определяет, что именно вы повторяете
Почему cache hit не равен корректному результату и какие входы должны участвовать в ключе оптимизации.
Сравнение frontend-сборок: зафиксировать вход до секунд
Как сравнить baseline и candidate так, чтобы разница времени и размера относилась к одному входу.
D и C ABI: разобрать пакет до вызова
Полевой разбор FFI-ошибки: размер структуры, порядок байтов и обязательные поля проверяются до вызова C.
D: @safe и @trusted на границе C API
Как провести маленький unsafe-участок через проверенный интерфейс и не считать атрибут @safe доказательством всей системы.
D для прикладной утилиты: сначала контракт входа, потом язык
Как понять, есть ли у задачи основание для D: нагрузка, native boundary, target matrix и стоимость toolchain.
Миграция Bitrix-поля: проверить сохранение, чтение и обратимость
Полевой чек-лист переноса пользовательского поля: mapping, пустые значения, повторный запуск и проверяемый результат.
Bitrix API и версия: имя метода не обещает одинаковый контракт
Как проверять установленную поверхность API и не считать название класса доказательством совместимости.
Bitrix legacy: когда сохранить код, когда обернуть, когда заменить
Практическое дерево решения для старого API: сохранить поведение, поставить адаптер или перейти на новый контракт.
Разбор 502 в поле: собрать цепочку из access и application log
Полевой маршрут для 502: какие записи собрать, как связать их request-id и где остановиться при разрыве цепочки.
Trace ID связывает события, но не доказывает причину
Как читать trace, log и metric вместе и не превращать совпадение идентификатора в причинный вывод.
Web-диагностика без прыжка к причине: симптом, проверка, действие
Как превратить 502, пустой ответ или отказ в короткий маршрут проверки, не меняя систему наугад.
Инженерный кейс как synthetic evidence hand-off
План на декабрь 2026: безопасно передать synthetic evidence boundary, не придумав ADR, метрики, теста, инцидента или rollout.
Инженерный кейс без ретроспективного proof: причинность и контрфакты
План на декабрь 2026: как не усилить proof задним числом и проверять причинную цепочку через контрфакты.
Инженерный кейс от проблемы до результата: структура без выдуманного результата
План на декабрь 2026: как собрать case narrative из контекста, вариантов, решения, доказательства и residual risk, не выдавая сценарий за проектный результат.
Сравнение технологий без хайпа: кейс с ограничениями и выводами
Плановый field-сценарий на ноябрь 2026: безопасный synthetic evidence hand-off вместо выдуманного отчёта о сравнении.
Сравнение технологий без хайпа: как принять инженерное решение
Сценарий ноября 2026: как отделить измерение, неопределённость и веса от псевдоточного выбора технологии.
Сравнение технологий без хайпа: практический маршрут
План на ноябрь 2026: как собрать взвешенную матрицу с ценой внедрения и не выдать подготовку за выбор технологии.
Октябрьский сценарий hand-off в code review: передать ограниченный вопрос, а не выдать вердикт
Сценарий на октябрь 2026: bounded synthetic hand-off для contract risk без имитации pull request, CI, approval или production-проверки.
Октябрьский сценарий code review: риск, доказательство, допустимый вывод и escalation gate
Сценарий на октябрь 2026: как построить fail-closed escalation gate, чтобы комментарий не выдавал предположение за технический вывод.
Октябрьский стандарт code review: матрица решения и доказательства вместо замечаний о стиле
Сценарий на октябрь 2026: как превратить review из списка вкусовых замечаний в проверяемую матрицу риска, evidence и stop-the-line условий.
UI и API расходятся: полевой протокол диагностики без догадок
Пошаговый разбор рассинхрона: какие четыре факта снять на границе, как отличить stale state от неверного ответа и где остановить расследование.
Состояние экрана не угадывают по статусу: разделяем query, command и ошибку
Практическая схема для UI и BFF: как не превращать 409, 422, 429 и 500 в один красный toast и не терять следующий шаг.
Ответ 200 — ещё не модель экрана: валидируем JSON на границе UI и API
Почему успешный HTTP-статус не даёт права рендерить payload и как вынести проверку screen model в маленький воспроизводимый контракт.
Августовский сценарий расследования: безопасный hand-off по UI → API → worker без production-легенды
Не field report: сценарий на август 2026, как передать ограниченный synthetic evidence для будущего расследования и сохранить stop при разрыве context, data boundary или sampling rule.
Семантика сквозного сигнала на август 2026: context, ошибка, время и cardinality без ложного вывода
Сценарий M9 на август: определить, какие выводы разрешают span, log и metric, где обрывается correlation context и почему sampling не превращает план в измерение.
Августовский план сквозной наблюдаемости: карта сигналов от UI до worker без лишних данных
Сценарий на август 2026: спроектировать trace, log и metric вокруг одного UI → API → worker пути, не превращая correlation context в канал персональных данных.
Репетиция перехода: evidence loop, stop decision и hand-off без ложной готовности
Полевая карточка migration review: как связать rehearsal evidence с контрольной границей, контрпримером и узким stop или hand-off.
Переход как автомат состояний: критерии, трафик, данные и rollback без подмены
Механика migration state machine: почему inventory, control boundary, reversible data state и named trigger должны отказывать по-разному.
План миграции без прыжка: карта фаз, ворот и обратимого состояния
Практическая карточка миграции: сначала инвентарь, затем обратимое состояние данных, сопоставимый срез трафика и только потом узкий review hand-off.
Integration review без интеграции: evidence и точка stop
Как передать проверяемый synthetic packet, не выдав его за сертификат среды.
Type, error, time: почему похожий payload ещё не общий смысл
Механика synthetic matrix, которая останавливает смешанную семантику до ложного вывода.
Три языка, один узкий контракт: граница без магии адаптеров
Как назвать value, error и time так, чтобы fixed record можно было честно передать на review.
Performance review без обещаний: evidence, контрпример, hand-off
Полевая карточка решения, которая не превращает один короткий интервал в гарантию.
Время ожидания, время работы и ложное сравнение нагрузки
Механика сопоставимой trace: какие задержки можно назвать и где review обязан остановиться.
Критический путь: как не оптимизировать сервис до границы
Synthetic waterfall, который отделяет очередь от БД и внешнего вызова — без обещания ускорения.
Полевая безопасность веба: авторизованный цикл evidence и ретеста без ложного допуска
Полевой цикл M9 для security-review: подготовить named synthetic evidence case, проверить границу ретеста, вернуть понятный stop или ограниченный hand-off без approval и production claims.
Почему перечень controls не доказывает защиту: трассируемость и остаточный риск в веб-ревью
Механика M9: контроль имеет смысл лишь в трассе threat model → interruption → bounded evidence → residual risk; список мер не хранит ни путь, ни допустимость вывода.
Контроль без маршрута атаки — это инвентарь, а не защита: практическая карта для веба
Практика M9: превратить список web-security controls в проверяемую связь между путём атаки, точкой прерывания, разрешённым evidence и открытым остаточным риском.
Не один verdict на всех: полевой цикл producer и consumer для контракта данных
Полевой цикл compatibility gate: вести матрицу named producer и consumer, отделять unknown comparison от incompatible reader и передавать только synthetic review hand-off.
Backward совместимость как направление: механизм compatibility gate для схемы данных
Разбор механизма compatibility gate: почему version не является verdict, как разделить schema diff, direction и consumer capability и где fail-closed остановить неявное сравнение.
Schema change без устной координации: практический маршрут для контракта данных
Практический маршрут для изменения схемы: зафиксировать направление сравнения, явный change manifest, потребителя и synthetic compatibility gate до hand-off.
Review устойчивости: доказать остановку раньше, чем спорить о репликах
Полевой формат review для synthetic каскада: проверить именованный injection, одну точку ограничения, трассу и сопоставимость сценариев, не выдавая метрики или production-обещания.
Механика устойчивости: считать ширину каскада до настройки timeout
Инженерская модель каскада в fixed literals: различить последовательный retry, fan-out, fallback и limit point, затем отказать любому сценарию, который не сохраняет конечную ширину работы.
Как разорвать каскад: один бюджет раньше retry, fallback и реплик
Практический маршрут для fixed сценария отказа: назвать полезную работу, выбрать единственного владельца retry, ограничить fan-out и сделать fallback отдельным режимом, а не новым запуском каскада.
Совместимость не решается номером: полевой цикл платформенной команды для API
Полевой цикл для API-платформы: собрать именованных потребителей, отсеять несопоставимые контракты, передать точный synthetic status и не объявлять версию совместимой на основании одного удачного вызова.
Гарантия не равна полю: механизм обратной совместимости для платформенного API
Механика контрактного решения: отделить описанное поле от гарантии, исключение от обхода и совместимость от номера версии; остановить неявное обязательство до интеграции.
Контракт до особого случая: как не превратить платформенный API в меню скрытых параметров
Практика для платформенного API: выделить контрактную поверхность, описать узкий escape hatch и проверить именованного потребителя до того, как особый случай станет скрытой зависимостью.
Синтез инженерного года: полевой counterfactual review без истории из одних побед
Полевой сценарий для разбора годовой записи: проверить альтернативу, стоимость, observation, unknown и границу сравнения, а затем вернуть только safe synthetic hand-off.
Синтез инженерного года: почему наблюдение после решения не доказывает эффект
Механика годового вывода: отделить решение, наблюдение и причинность, указать стоимость, unknown и границу сравнения до того, как correlation станет эффектом.
Синтез инженерного года: как собрать timeline решений без витрины успехов
Практический маршрут для годовой инженерной записи: решение, альтернативы, стоимость, наблюдение, unknown и граница сравнения вместо ретроспективы из одних побед.
Полевой разбор ссылок: как вести журнал исследования для технического решения
Полевой цикл проверки источников: принять вопрос, зафиксировать claim и первоисточник, остановить лишний вывод, передать ограниченный результат и обновить журнал после нового факта.
Версия, представление, утверждение: механизм проверки источника без ложной уверенности
Модель проверки источника: распознать разные уровни evidence, не принять validator или подпись за смысловой факт и остановить вывод до подходящего первоисточника.
Журнал утверждений: как проверить источник до того, как ссылка станет решением
Практический метод для статьи и технического решения: разложить утверждение, версию, наблюдение и следующий шаг по журналу, не выдавая ссылку за доказательство.
Разбор объяснения Promise.all: как вернуть рецепт к условиям задачи
Полевой разбор synthetic объяснения: распознать рецепт без модели, дать точную обратную связь и передать следующий шаг без заявления об эффективности.
Модель Promise.all: где заканчивается aggregate и начинается работа входов
Причинная модель Promise.all для объяснения: порядок результатов, первая ошибка, оставшийся вход и отдельная граница отмены.
Как объяснить Promise.all: сначала модель, затем рецепт и проверка
Практический маршрут для объяснения Promise.all без ложного обещания отмены: задача, модель, контрпример, короткое упражнение и проверяемый synthetic hand-off.
Инженерное интервью: калибровка reviewer-ов без итоговой оценки человека
Полевой технический протокол для одной synthetic пробы: одинаковый вход, независимый review, журнал расхождений и безопасный evidence hand-off.
Инженерное интервью: как не перепутать наблюдение, интерпретацию и решение
Механика технического review: доказательство, трактовка и разрешённый hand-off живут в разных записях, чтобы догадка не стала итогом.
Инженерное интервью: рубрика и рабочая проба вместо экзамена по терминам
Практический маршрут для технического разговора: ограниченная роль, рабочая проба, наблюдаемые критерии и synthetic hand-off без оценки человека.
Полевой журнал UX внутреннего инструмента: short evidence before UI change
Полевой формат: собрать consent boundary, observation record, uncertainty, decision log и follow-up так, чтобы изменение интерфейса можно было честно проверить на следующей задаче.
Исследование UX внутреннего инструмента: от заметки к решению без удобной причинности
Механика evidence coding: отделить факт от темы, тему от candidate change и остановить вывод, если consent, сценарий или ссылка на наблюдение неполны.
Исследование UX внутреннего инструмента: наблюдать задачу, а не свою кнопку
Практический маршрут: согласие, нейтральный сценарий, обезличенная заметка и следующий проверяемый шаг вместо цитат в пользу уже выбранного интерфейса.
Полевой журнал продуктовой метрики: evidence до решения
Полевой формат decision record: собрать цепочку, metric definition, guardrail, negative path и ограничение так, чтобы владелец мог принять или остановить решение.
Почему рост метрики не является решением: denominator, cohort и guardrail
Механика проверки: отделить movement локальной метрики от допустимого решения и остановить расчёт при смешанных периодах, неверном denominator или отсутствии attribution.
Метрики продукта для инженера: построить цепочку, а не поднять conversion
Практический маршрут: связать изменение, событие, действие пользователя, guardrail и решение так, чтобы ошибка измерения останавливалась раньше релиза.
Удобство внутреннего инструмента: учебный кейс без ложного эффекта
Разбор одной fixed synthetic задачи: где появляется ожидание, как отделить сигнал от решения и почему честный safe stop лучше выдуманного улучшения.
Удобство внутреннего инструмента: контракт наблюдаемой задачи
Как построить технический контракт для пути задачи: событие, ожидание, UX-observation, support signal, решение владельца и безопасная остановка claim.
Удобство внутреннего инструмента: наблюдать путь одной задачи
Вместо единого DX-score — путь задачи, явные ожидания, отдельные типы свидетельств, owner и проверяемая стоп-ветка.
Полевой маршрут: автоматизация без массового неверного change
Практический маршрут для владельца batch-операции: построить preview, ограничить scope, привязать approval, сохранить audit trail, проверить observed state и остановиться до опасного rollback.
Почему preview, approval и audit trail не доказывают безопасный change
Разбираем разные доказательства в автоматизации: preview показывает намерение, authority ограничивает scope, approval связывает решение, audit trail фиксирует событие, verification наблюдает результат.
Автоматизация инженерной рутины без массовой ошибки
Как разбить массовую инженерную операцию на preview, ограниченный scope, отдельное approval, проверку результата и заранее спланированный rollback.
Когда synthetic log shape должен остановить AI-review
Кейс без реальных логов и PII: как пройти class, contract, egress, access и expiry до того, как AI-инструмент увидит контекст.
Четыре разных доказательства для AI-egress
Почему class, policy/contract, technical egress и human authorization должны сходиться на одной версии контекста, а не заменять друг друга.
Контекст без класса не должен уходить в AI-инструмент
Короткий маршрут, который отделяет класс данных, contract, egress и human authorization до передачи фрагмента в AI-инструмент.
Когда поиск обязан остановиться: нет цитаты — нет ответа
Полевой маршрут для случая, когда retriever нашёл только закрытый, просроченный или нецитируемый источник: остановить ответ, сохранить причину и передать вопрос на human verification.
Почему vector score не делает документ доказательством
Разбор механики index → candidates → access/freshness/citation filter: vector score ранжирует похожесть, но не доказывает право, дату или истинность claim.
Поиск по инженерной базе: источник важнее уверенного пересказа
Как построить путь index → retrieval → проверки прав и свежести → точная цитата → human verification, не выдавая score за доказательство.
Как остановить merge, когда evidence расходится
Три fixed synthetic случая: нарушение контракта, скрытый side effect и неполный тест. Где заканчивается stop, начинается human approval и чем revert отличается от rollback.
Независимые доказательства ловят разные классы ошибок
Матрица «risk → detecting evidence»: где evidence пересекается, где создаёт ложную уверенность и в какой момент нужно остановить merge.
Один зелёный тест не проверяет generated diff
Контракт, статическая проверка, узкий тест, review и ручное воспроизведение: короткий план, который не выдаёт один зелёный сигнал за решение о merge.
Проверить сгенерированный diff до merge
Три fixed synthetic кейса для проверки AI-assisted diff: выход за scope, нарушение контракта и тест не той ветки; verification gate, stop boundary и рабочий порядок до merge.
Почему правдоподобный код ломает контракт
Механизм проверки candidate code: отделить model output от repository contract, reviewer evidence, test evidence и unknowns, чтобы красивый код не получил чужих гарантий.
Prompt не заменяет постановку задачи
Как превратить запрос к помощнику в ограниченный инженерный цикл: контракт задачи, допустимый контекст, запреты, owner, bounded diff, review и тест.
Год сопровождения: что остановить, что продолжить, что перепроверить
Три fixed synthetic maintenance case: повторяемый runbook gap, риск без owner и cleanup с recheck gate. Как построить timeline, остановить ложный rollback и подготовить следующий квартал без выдуманного ретро.
Как связывать риск, стоимость и повторяемость без фальшивой точности
Evidence types, leading и lagging signals, uncertainty и priority boundary: как использовать компактную synthetic heatmap для порядка review, не выдавая score за вероятность, цену или готовое решение.
Долг — не список неприятностей: как провести maintenance review
Повторяемый симптом, риск, цена, владелец и граница доказательств: короткая карточка maintenance review, которая приводит к одному проверяемому эксперименту, а не к бесконечному списку долгов.
Последний consumer: доказуемое удаление
Три fixed synthetic case для removal gate: active, unknown и migrated. Как остановить удаление, зафиксировать residual risk и не назвать учебную карту доказательством отсутствия скрытых потребителей.
Почему telemetry не равна списку пользователей
Механизм deprecation: разделить source usage, declared dependency, exposure or traffic, authorization и unknown consumer, а затем держать warning, sunset и removal как разные границы.
Устаревший API нельзя удалить по дате в календаре
Consumer map для устаревшего API: контракт, владелец, путь миграции, дедлайн, объявление и граница доказательства до отдельного решения об удалении.
Ёмкость и стоимость: выбрать следующий предел, а не самый большой инстанс
Полевой разбор трёх synthetic сценариев: сравнить performance, model cost и operational risk, зафиксировать stop condition и вернуть обсуждение к маленькому следующему пределу.
Ёмкость и стоимость: почему процент загрузки не равен цене
Механизм для разбора fixed и variable resource, billing unit, quota/limit, saturation и marginal cost без подмены модели настоящим облачным счётом.
Ёмкость и стоимость: SLO выполняется, а расход растёт
Как собрать одну synthetic capacity-card, связать workload, выделенный ресурс и billing unit, а затем остановить разговор о стоимости на проверяемом пределе.
Через полгода: ADR не заменяет проверку решения
Полевой маршрут для устаревшего ADR: заметить drift, сверить assumptions с code и evidence, подготовить successor и безопасно отметить прежнее решение как Superseded только после acceptance.
Как сравнивать альтернативы в ADR и не прятать цену
Механика ADR для выбора между вариантами: одинаковые criteria, reversibility, evidence gap, constraint fit, status и безопасный supersede. Внутри — воспроизводимая, но строго синтетическая score-модель.
ADR как контракт решения: как сохранить контекст без бюрократии
Практический способ превратить длинную переписку в короткий ADR: контекст, варианты, решение, последствия, владелец и дата пересмотра — с границей между записью решения и его реализацией.
Выключить флаг — не значит удалить риск: rollout, rollback и cleanup
Полевой маршрут для gradual rollout: synthetic stages, stop condition, fallback и отдельный cleanup gate, который удаляет ветки и конфигурацию после выбора итогового поведения.
Где принимать решение флага: server, client и журнал exposure
Как выбрать точку вычисления флага, сохранить когортный ключ и отделить evaluation от exposure без мифа о exactly-once событии.
Фича-флаг как контракт выпуска: как не оставить переключатель навсегда
Практический контракт release-флага: владелец, аудитория, срок пересмотра, сигналы, fallback и удаление — до того, как временный boolean попадёт в код.
Инженерия релиза: полевой разбор расхождений версии, artifact и migration
Разбор четырёх synthetic cases: как отличить mismatch source, migration и rollout intent, когда stop сильнее retry и как оставить return point без ложного обещания data rollback.
Инженерия релиза: механизм evidence gate и контролируемого rollback
Модель release evidence: почему одинаковая версия не доказывает одинаковое содержимое, как закрыть вход fixture и почему rollback возвращает только явно названную точку.
Инженерия релиза: цепочка доказательств между commit и deploy
Практический разбор: как связать версию, artifact, migration и намерение rollout так, чтобы расхождение остановило выпуск до действия и оставило проверяемый rollback.
Управление контейнерной нагрузкой: диагностика, решение и проверка
Полевой маршрут для различения request и limit, traffic readiness и HPA signal: три синтетические карточки вместо вымышленных показаний реального кластера.
Управление контейнерной нагрузкой: модель, ограничения и границы
Модель для связи request и limit с HPA и readiness: почему процент CPU имеет знаменатель, Ready не равен capacity, а кривая без источника не является наблюдением.
Управление контейнерной нагрузкой: минимальная инженерная схема
Практический маршрут, который связывает resource requests и limits, readiness и HPA с профилем приложения — без выдачи учебной fixture за состояние кластера.
Шаблоны для команд: полевой разбор между fork и честным отказом
Учебный разбор трёх запросов к service template: совпадение с golden path, узкое расширение и отказ для новой регулируемой задачи. Без выдуманных метрик, использования или результатов CI.
Шаблон как договор: параметры, extension point и право сказать «нет»
Техническая механика командного template: закрытый input contract, versioned base path, named extension, отказ и rollback — без мифа, что генерация заменяет политику или проверку результата.
Шаблоны для команд: golden path без фабрики клонов
Практический маршрут для командного шаблона: назвать повторяемый контракт, оставить узкий golden path, дать проверяемый escape hatch и вовремя отказаться от формы, которая маскирует новую задачу.
Безопасная миграция данных: rehearsal, stop gate и случай раннего contract
Полевой разбор учебного кейса: схема уже расширена, backfill просит больше ресурса, а удалить старую форму ещё нельзя. Как поставить stop gate и не выдать тест за production-доказательство.
Безопасная миграция данных: модель совместимости версий и цена contract
Как описать schema change через совместимость old/new reader и writer, не принять backfill за доказательство готовности и не потерять границу обратимости.
Безопасная миграция данных: expand–migrate–contract без ложного отката
Практический маршрут schema change: сохранить совместимость старого и нового кода, ограничить backfill и не называть удаление столбца откатом.
Границы пакетов: полевой разбор domain leak в общей утилите
Учебный полевой кейс: utility получает InvoiceStatus, consumer пробирается в internal cache. Разбираем стоимость, решение, точку проверки и то, чего synthetic fixture принципиально не умеет доказать.
Границы пакетов: public API, запрещённые импорты и три уровня защиты
Механика границы пакета: чем отличаются public API, runtime exports и статический запрет импорта; как не принять типовую совместимость за право протащить доменную модель в общую утилиту.
Границы пакетов: как остановить общую утилиту до того, как она станет платформой
Практический маршрут для случая, когда shared-утилита начинает импортировать доменную модель: короткий public API, запрещённые направления и проверка без легенды о реальном графе зависимостей.
Полевой разбор границ: три импорта и одна карта модульного монолита
Учебный разбор без выдуманного production-опыта: как классифицировать допустимый API-вызов, протечку во внутренность и новую обратную зависимость, затем выбрать обратимое действие и не выдать fixture за CI.
Граница модуля: граф разрешённых направлений и публичная поверхность
Почему «A зависит от B» недостаточно: как задать зависимость тройкой source → target.public API, обнаруживать internal-протечки и циклы в фиксированной модели, не выдавая её за анализ кода.
Модульный монолит: сначала разрешённые зависимости, потом новые папки
Как превратить «папки по доменам» в проверяемую договорённость: назвать публичный API модуля, разрешённые направления зависимостей, правило для internal-кода и короткую проверку без выдуманного сканирования репозитория.
Модернизация legacy: rollout и rollback без «переключим, если что»
Как превратить migration rollout в ряд ручных решений: один шов, evidence, ограниченная волна, чёткий rollback-route и отдельная граница данных.
Совместимость при модернизации legacy: contract и parity без ложного равенства
Почему одинаковый JSON не означает сохранённое поведение: собрать contract совместимости, отделить форму ответа от effect и проверять parity на заранее названных cases.
Модернизация legacy-системы без потери поведения: выбрать измеримый шов
Как остановить переписывание всего сразу: выбрать один пользовательский шов, сделать его наблюдаемым, назначить владельца и не выдавать учебную проверку за сохранённое поведение реального legacy-модуля.
Практический аудит веб-проекта: порядок исправлений и безопасный triage
Как разбирать список security-гипотез без гонки за самым громким score: отделить evidence от severity, выбрать обратимый шаг, назначить владельца и не превратить triage в неуправляемое изменение.
Практический аудит веб-проекта: evidence, разрешённые границы и проверяемый вывод
Почему evidence, hypothesis и permission нельзя хранить в одной строке аудита; как собрать матрицу доказательств, назвать ограничения проверки и не выдать учебный факт за finding или compliance.
Практический аудит веб-проекта: scope и карта активов до первого теста
Как начать аудит веб-проекта с понятного scope: собрать карту активов, назвать владельца и границу данных, отделить инвентаризацию от права на проверку и оставить обратимый следующий шаг.
Полевой разбор сбоя без поиска виноватого: от unknown к проверке
Маршрут ведущего ретроспективы: остановить спор о людях, восстановить доступные факты, привязать решение к моменту и вывести один обратимый профилактический эксперимент.
Факт, решение, эксперимент: контракт postmortem без заднего знания
Почему timeline без типов записей подменяет факт объяснением, как связать решение с доступной информацией и превратить профилактику в обратимую проверку.
Postmortem без поиска виноватого: собрать факты до объяснения
Как начать ретроспективу с проверяемой timeline, не выдать решение в моменте за ошибку человека и не назвать профилактическую гипотезу уже доказанным исправлением.
SLI/SLO в релизном разговоре: бюджет как петля решения, не как красный график
Как превратить SLI/SLO и error budget в воспроизводимый путь решения: от симптома к scope, данным, причинам и обратимому действию — без автоматического gate, выдуманного incident или декоративного burn rate.
Error budget без магии: границы окна, знаменателя и решения
Разбор механизма error budget: почему процент нельзя читать без числа eligible событий, окна, target и policy; как отделить учебную арифметику от реального burn rate, инцидента и решения о релизе.
SLI без декоративной метрики: минимальный договор пути пользователя
Как начать SLI/SLO не с процента на дашборде, а с договора: какой путь пользователя считаем, какие события входят в знаменатель, что означает успех, кто владеет решением и чего такой договор пока не доказывает.
Ошибка без причины: маршрут диагностики через log, metric и trace
Пошаговый маршрут, который не подменяет один correlation ID новой label-кардинальностью: как разложить симптом, гипотезу и evidence между metric, trace и log/event record.
Почему trace ID не должен становиться label метрики
Разбираем разные модели trace, metric и log/event record: какие поля создают корреляцию, какие допускают агрегацию и почему доказательство одного сценария нельзя заменить высокой cardinality.
Один correlation ID для лога, метрики и трассы: минимальный договор
Как договориться, что trace ID связывает один сценарий, labels метрики остаются малыми, а log attributes объясняют событие без попытки выдать учебную запись за production telemetry.
Flaky-пометка: как разобрать retry, trace и rollback без роста timeout
Разбор flaky без магии: фиксируем две попытки, классифицируем selector и readiness отдельно, используем trace как evidence и готовим обратимую правку.
Selector, ready и retry: четыре контракта одного e2e-теста
Модель устойчивого e2e-теста: auto-wait готовит действие с элементом, readiness доказывает результат, retry классифицирует попытки, а trace остаётся evidence одного запуска.
E2E без лишних retry: ждать факт, а не тишину интерфейса
Почему retry не лечит e2e-падение: отделяем locator, условие готовности, повторный запуск и evidence, а timeout меняем только после проверки контракта.
Смысл поля изменился после релиза: как собрать доказательство до отката
Практика разбора, когда schema осталась валидной, а consumer получил новый смысл поля после релиза.
Почему schema match не равен совместимости: три слоя контракта API
Разбор границы между формой JSON, ожиданием consumer и настоящей provider verification на одном сценарии продления.
Контракт API до релиза: зафиксировать смысл ответа, а не только JSON
Как записать один сценарий consumer/provider так, чтобы schema match не скрыл изменение смысла поля до релиза.
Deploy виден, происхождение нет: диагностика разрыва в цепочке поставки
Практический маршрут для случая, когда виден только deploy: как остановить выводы, восстановить цепочку source → build → digest → declaration → release и не перепутать ее с доказательством provenance.
Attestation без самообмана: что именно связывает provenance с артефактом
Механическая модель для различения artifact digest, statement, подписи, проверки и deploy: declaration не становится provenance без самостоятельной цепочки evidence.
Цепочка поставки без тумана: от секрета в CI до digest артефакта
Как разложить один delivery-поток на trust boundary и evidence, если аудит видит только deploy, а происхождение образа и работа с секретом не связаны с ним.
Отключение правила: как сделать явное решение, ограничение и rollback
Политика для шумного правила: оставить, уточнить или временно подавить один результат — с владельцем, scope, датой пересмотра и обратимым планом.
SARIF без контекста: какие части правила и результата нужны для решения
Разбираем границу между SARIF-форматом, правилом, результатом и проектным контекстом: почему один JSON не отвечает, что менять в политике анализа.
Шумное правило статанализа: не выключать до классификации сигнала
Как разобрать результат опасного правила: отделить форму совпадения от контекста, не назвать его finding раньше времени и не выключить защиту глобально.
Безопасное обновление зависимости: runtime-совместимость и доказательства выпуска
Полевой маршрут обновления без ложного PASS: diff дерева, чистая установка, тесты, runtime smoke и честный rollback.
Lockfile и SBOM: какие факты о зависимости они фиксируют
Граница между manifest, resolved tree и SBOM: почему три похожих списка не дают один и тот же ответ о поставленном компоненте.
Advisory зависимости: сначала зафиксировать факт, потом проверять путь
Как разобрать advisory без выдуманной CVE-диагностики: lockfile, SBOM, заявленный путь до entry point и границы fixture.
CORS error у cookie API: диагностика без отключения CSRF
Полевой маршрут для CORS error, preflight и CSRF 403: собрать факты, разделить границы, исправить один контракт и сохранить отрицательный тест.
Origin, credentials и preflight: где заканчивается модель браузера
Разбор трёх слоёв cross-origin запроса: tuple origin, CORS-доступ к response с credentials и серверный CSRF-контроль mutation.
Cookie API и виджет: как не перепутать CORS с CSRF
Практический контракт для cookie API: CORS ограничивает доступ к ответу, а CSRF-проверка на сервере решает, принимать ли изменение состояния.
Старый session ID после rotation: маршрут проверки logout без выдуманного trace
Диагностический маршрут для случая, когда logout, renewal и cookie выглядят как разные события: как собрать факты, отделить stale ID от текущего и не объявить fixture browser trace.
Cookie, rotation и logout: модель одной сессии без скрытого источника истины
Разбор границы между cookie и серверной записью: что проверяют Secure, HttpOnly и SameSite, почему rotation меняет current ID, а logout не заканчивается удалением строки в браузере.
Одна сессия от входа до logout: короткий контракт cookie и сервера
Учебный контракт одной сессии: cookie выбирает идентификатор, сервер хранит состояние, rotation выводит старый ID из обращения, logout завершает оба слоя.
Полевой маршрут модели угроз: как не принять контроль без объекта защиты
Короткий маршрут ревью одного потока: симптом, граница, злоупотребление, evidence и честный rollback без выдуманного security review.
Контроль и evidence в модели угроз: одна связь, которую можно проверить
Как отделить threat model от реализации: один актив, одно злоупотребление, контроль, evidence и обратимый учебный контракт.
Модель угроз перед чек-листом: назвать поток, актив и границу
Малый учебный DFD-поток: как связать актив, злоупотребление, контроль и evidence до выбора готового списка мер.
Полевой маршрут: остановить фичу без подтверждённой проблемы
Практический разбор инициативы без доказанной проблемы: как сохранить вопрос, выбрать следующий опыт и не выдумать evidence.
Механика evidence: не путать источник, смысл и гипотезу
Технический контракт учебной evidence-модели: какие переходы допустимы до решения об интерфейсе.
Исследование пользовательской проблемы: сначала разделить evidence
Как превратить желание улучшить интерфейс в проверяемую цепочку наблюдения, гипотезы и следующего опыта.
Производительность Bitrix-страницы: диагностика, решение и проверка
Полевой маршрут для случая, когда «тормозит Bitrix»: собрать один честный симптом, сузить границу до запроса, компонента, кеша или шаблона и не потерять rollback.
Производительность Bitrix-страницы: модель, ограничения и границы
Разбираем контракт встроенного кеша Bitrix: какие части ключа названы, где заканчивается документация API и почему model branch не равен наблюдению сервера.
Производительность Bitrix-страницы: минимальная инженерная схема
Как не назвать Bitrix причиной раньше evidence: разделить запрос, компонент, кеш и шаблон, собрать контракт фактов и выбрать обратимое действие.
Полевой маршрут UI-проверки: заменить sleep без потери сигнала
Диагностика нестабильного сценария: от произвольной паузы к проверяемому состоянию, границе и rollback.
Механика UI-проверки: сделать состояние наблюдаемым
Как отделить transition, наблюдение и assertion, чтобы не лечить флак произвольным ожиданием.
Проверки пользовательского сценария: ждать состояние, а не секунду
Практический контракт сценария: проверка ждёт наблюдаемое состояние, а не произвольную паузу.
Мобильный сценарий: разбор скрытого действия и безопасный откат
Полевой маршрут для случая, когда десктопный control исчезает на узком экране: как собрать наблюдение, не выдумать результат и вернуть безопасный путь.
Мобильный сценарий: контракт ввода, состояния и границы
Разбираем, как отделить возможности среды от проектного контракта и не назвать детерминированную модель настоящим поведением браузера.
Мобильный сценарий: один путь без зависимости от hover
Как разложить одно действие на видимые шаги и проверить учебный контракт, не выдавая его за тест телефона или пользователей.
Медиа-слот в разборе: собрать доказательства до смены размера, источника и приоритета
Полевой маршрут для позднего hero, скачущей карточки и спорного priority: какие факты записать, как сделать одну обратимую правку и где заканчивается учебная fixture.
Медиа без ложных метрик: где заканчивается component contract и начинается браузерное наблюдение
Разбираем порядок состояний media slot и границу утверждений: разметка, геометрия, declared load/decode и внешний observation record не являются измерением браузерной метрики.
Изображение в первом экране: сначала контракт разметки, геометрии и наблюдения
Практический маршрут для медиа-слота: не путать declared geometry, load и decode, а проверку браузерной метрики вынести в отдельный наблюдаемый прогон.
Плохая сеть: диагностировать неизвестный результат и не потерять черновик
Полевой маршрут для спорного случая: пользователь не получил ответ, старая попытка отвечает поздно, а интерфейс должен сохранить текст и предложить проверяемое восстановление.
Плохая сеть: граница между попыткой, подтверждением и черновиком
Разбираем контракт, в котором повтор не создаёт новый логический запрос, старый ответ не стирает новый черновик, а неизвестный исход остаётся видимым состоянием.
Плохая сеть: не показывать успех, пока действие не подтверждено
Практический контракт для формы, которая должна сохранить черновик, честно показать неизвестный результат и не создать второй смысловой запрос при повторе.
Форма застряла между retry и старым ответом: диагностика и обратимый возврат к принятому снимку
Полевой маршрут для формы с поздним ответом, дубликатом и повторной отправкой: какие факты собрать, что остановить и где допустим локальный rollback.
Контракт ошибки формы: значение, версия и semantic payload должны относиться к одной попытке
Почему текст ошибки, aria-связь и попытка отправки нельзя собирать из разных копий state — и что именно способен доказать unit fixture.
Ошибка формы пришла после правки поля: как не вернуть пользователя к уже исправленному вводу
Порядок для формы, где ответ относится к старому вводу: локальная проверка, version поля, attemptId и честный retry без ложного сообщения.
Правка токена без сюрпризов: инвентарь кнопок, диагностика и обратимый шаг
Диагностический маршрут для изменения малого design-system contract: отличить неверную конфигурацию от допустимой правки, не назвать payload результатом visual test и оставить безопасный rollback.
Контракт кнопки: как связать токены, состояния и доступную семантику
Разбор малого component contract: какие данные принадлежат токенам, состояниям, семантике и usage inventory, а какие нельзя подменять модельным visual payload.
Маленькая дизайн-система: начать с контракта кнопки, а не с каталога компонентов
Практический маршрут для одинаковых кнопок, которые разошлись по цвету, состояниям и семантике: named tokens, один минимальный contract, usage inventory и обратимая правка.
Когда доступный control ломается после правки: диагностика и безопасный откат
Диагностический маршрут для случая, когда состояние обновилось визуально, но контракт имени, фокуса и объявления разошёлся. Начинаем с одного сценария и сохраняем обратимый путь.
Контракт доступного control: имя, состояние и фокус должны меняться вместе
Почему role сам по себе не исправляет custom control и как связать name, state, focus route и declared status в одном контракте без заявления о реальном accessibility tree.
Доступный интерфейс: проверить кнопку до того, как она станет «готовой»
Практический маршрут для компонента, который выглядит законченным, но теряет клавиатурный фокус и не описывает изменение состояния: семантика, фокус, объявление и обратимое исправление.
Разбор одного тяжёлого кадра: от DOM result к обратимой проверке
Полевой маршрут для Performance panel: не лечить «медленный рендер» по цвету, а сузить один DOM-result, одну interaction, один вопрос к trace и обратимую правку.
Style, layout и paint: не три виновника, а границы одного кадра
Причинная модель для DOM-изменения: отделить JavaScript, style, layout, paint и composite, чтобы не выдавать учебную схему за внутренний контракт браузера.
Медленный рендер без гадания: связать DOM-изменение с одним кадром
Практический маршрут для симптома «страница тормозит»: назвать одно DOM-изменение, собрать одну запись и проверить, где в кадре начинается работа — без подмены модели настоящим trace.
Красный component при зелёном total: как сузить диагностику бюджета пути
Полевой маршрут для случая, когда aggregate остаётся PASS, а named component превышает допуск: проверить contract, сохранить факт и выбрать одно ограниченное действие без глобального performance verdict.
Почему общий PASS не равен бюджету пути: модель сравнения и допуск
Причинная модель бюджета пути: от controlled conditions и snapshot к component checks, aggregate и ограниченной диагностике без подмены учебного расчёта browser trace.
Бюджет пользовательского пути: общий PASS больше не скрывает регрессию
Практический маршрут: описать один пользовательский путь, зафиксировать условия и baseline, сравнить candidate по именованным частям и получить действие вместо общего PASS.
SSR/CSR mismatch: как не выдать второй fetch за исправление
Диагностический маршрут для неоднозначного случая: первый экран отдан SSR, client code просит данные снова, а причина может быть в snapshot, версии markup или неверном владельце состояния.
Граница SSR и CSR: source, snapshot и hydrate не один cache
Причинная модель для ситуации, когда HTML уже содержит данные, но клиент не знает их версию и повторяет загрузку. Разделяем владение source, snapshot, hydrate и клиентским запросом.
SSR и CSR без второго запроса: версия snapshot как граница
Практический маршрут для страницы, где SSR уже получил данные, а CSR должен принять тот же snapshot, проверить его версию и не запускать второй запрос вслепую.
Разбор: как диагностировать архитектурное решение до опасного исправления
Полевой маршрут для случая, когда заметка сохранена, а public read не подтверждает публикацию: какие evidence собрать, как отличить missing decision от pending intent, когда replay допустим и почему не стоит пересоздавать source первым действием.
Под капотом: как архитектурное решение превращается в проверяемый контракт
Механика архитектурного review для учебной публикации заметок: requirements вместо вкусов, evidence отдельно от assumptions, сравнение вариантов по gaps, ключ replay и граница, которую можно откатить.
Архитектурный разбор: как выбрать границу публикации рабочих заметок
Учебный разбор трёх способов публикации рабочих заметок: какие инварианты назвать до кода, где проходит граница записи и чтения, зачем отделять assumption от evidence и как оставить решение обратимым.
Разбор signal при нагрузке: среда, сценарий или узкое место
Полевой маршрут для error-signal и latency-signal без выдуманного инцидента: собрать evidence, отличить environment drift, пробел сценария и synthetic boundary, затем выбрать обратимое действие.
Почему «много запросов» не является нагрузочной моделью
Разбор механизма workload: arrival intent, профиль сегментов, evidence packet и synthetic bottleneck. Почему aggregate без среды и stop criterion не объясняет ни причину, ни следующее действие.
Нагрузочное тестирование: сначала профиль, среда и критерий остановки
Практическая карточка workload до инструмента: один нейтральный endpoint, четыре сегмента профиля, явная среда, подготовка данных и критерий остановки без выдуманного benchmark.
Разбор request в D-сервисе: allocation, условная GC-граница и безопасный откат
Полевой маршрут для одного request: как не спутать рост учебных allocation units с паузой, сохранить evidence о FFI/I/O boundary, увидеть error route и выбрать rollback-safe действие.
Под капотом D-сервиса: request path, allocation и внешние границы
Разбираем один request path в D как наблюдаемую структуру: где в учебной модели появляются allocation units, условная GC boundary, FFI/I/O boundaries и почему слово «быстро» не переносится между runtime.
D в сервисе: как ограничить вопрос о runtime одним запросом
Практический способ разобрать один сервисный запрос в D: отделить результат handler от учебного бюджета allocation units, отметить границы GC, FFI и I/O и подготовить следующий проверяемый шаг.
Разбор: клиент перестал читать ответ API
Полевой маршрут диагностики: собрать evidence, различить missing field и semantic change, поставить retirement на паузу без рискованного «быстрого исправления».
Под капотом: совместимость API идёт в две стороны
Разбираем request и response отдельно: когда optional поле добавляется безопасно, почему schema diff не ловит смену смысла и как это фиксирует contract test.
API. Как менять контракт без внезапного разрыва
Практический маршрут: выделить допустимое изменение, проверить старого и нового потребителя, остановить опасный retirement до выпуска.
Разбор: reader упал после записи — как диагностировать контракт хранилища
Полевой маршрут для случая, когда reader падает после новой записи: какие evidence собрать, когда остановить producer, какой rollback безопасен и как вернуть изменение в compatibility test.
Под капотом: совместимость контракта хранилища без догадок о JSON
Разделяю форму записи, presence, тип и смысл поля. На одной fixture показываю producer/consumer v1/v2, matrix совместимости и причины, по которым narrowing или semantic change нужно отклонить.
Данные. Контракт хранилища: как менять profile/settings без внезапного разрыва
Контракт записи — это не только JSON-поля. Разбираю владельца, границу absent/null, поддержку старых reader и writer, а также маленькую compatibility matrix до безопасного rollout.
Документ сохранён, но не найден: безопасная диагностика поиска
Пошаговый разбор случая, когда source существует, а поисковая выдача пуста или устарела: какие доказательства собрать, как отличить ожидание refresh от ошибки query и почему безопаснее не удалять документ первым действием.
Индексация и поиск: почему запись не означает видимость
Разбираем четыре состояния одной карточки — source, ingest, pending index и visible index. Показываем, где появляется stale выдача, как version защищает учебную проекцию и почему refresh не равен сохранению.
Индексация и поиск: как договориться о свежести выдачи
Сохранённая карточка ещё не обязана быть результатом поиска. Разбираем договор свежести: источник данных, ingest, версия, refresh, наблюдаемая задержка и безопасный маршрут для оператора.
Replay события: как не записать второй result и не скрыть новую схему
Replay полезен только тогда, когда видно исходный event, consumer contract и уже записанный result. Разбираем evidence packet, duplicate, controlled replay, schema mismatch и маршрут без обещания exactly-once.
Эволюция схемы события: где проходит граница совместимого consumer
Новое поле не равно совместимой схемe. Разбираем writer, reader, stable fields, semantic change, versioned consumer result и путь, при котором неизвестная версия останавливает effect вместо тихой подмены данных.
Событийная интеграция: какой envelope зафиксировать до первого consumer
Событие не становится контрактом только потому, что его отправили в очередь. Разбираем минимальный envelope, границу payload, версию схемы, consumer contract и доказательство для повторной доставки.
Поздний владелец lease: как разобрать stale write без ложного диагноза
Когда старый worker пишет после expiry, сначала собираем leaseId, token и highest token ресурса. Такой пакет фактов отделяет stale write от duplicate, неверного release и предположений о времени.
Fence token: почему lock не защищает поздний запрос сам по себе
После истечения lease старый процесс может закончить работу. Fence token полезен только тогда, когда защищаемый ресурс хранит последнее поколение и отклоняет меньший token в своей операции записи.
Lease-блокировка: что проверить до критической секции
Lease не делает остановившийся worker безопасным. Разбираем учебный interleaving: истёкший lease, новое владение, старый запрос и fence token, который должен проверить сам защищаемый ресурс.
Разбор расхождения данных: как собрать evidence до компенсации между сервисами
Owner уже отменил заказ, а projection ещё ждёт резерв — это не повод вручную синхронизировать статусы. Нужен небольшой evidence packet: owner version, event id, версия projection, компенсационный ключ и запрет на следующий рискованный шаг.
Согласованность между сервисами: почему event id не заменяет версию и компенсацию
Повтор сообщения, пропущенная версия и отказ действия — три разные причины расхождения. Разбираем учебную state machine: consumer применяет версии по порядку, owner выпускает новое компенсирующее решение, а duplicate не создаёт второй state change.
Согласованность данных между сервисами: начать с владельца заказа и инварианта
Если один сервис уже отменил заказ, а второй всё ещё ждёт резерв, проблема не в красивом названии eventual consistency. Нужны owner, версия, инвариант следующего действия и доказательство для отстающей проекции.
Poison message: как остановить retry и передать задачу на ручную проверку
Poison message — не название любой ошибки. Для неё нужны причина, лимит попыток, сохранённый контекст и явное ручное решение: исправить вход, отменить эффект или запустить новый контролируемый replay.
Очереди задач: как duplicate появляется после уже записанного эффекта
Разбираем границы delivery: подтверждение относится к доставке, а идемпотентность — к доменному эффекту. Отдельно фиксируем порядок, retry и ручной исход без обещаний exactly-once.
Очереди задач: какой контракт написать до первого consumer
Очередь не задаёт сама порядок, защиту от дубликата и судьбу ошибочного сообщения. Разбираем маленький контракт: идентификатор, ключ эффекта, повтор, терминальный маршрут и ручная проверка.
Разбор stale-read: как найти старую проекцию без догадок
Полевой учебный разбор: собираем source version, key, cache entry, event и reader scope, чтобы отличить stale cache от неправильной проекции или отсутствующего права.
Инвалидация кеша: почему TTL не заменяет version
Разбираем механизм versioned invalidation: source owner создаёт факт изменения, event чистит только более старую entry, а read отличает current hit от stale value.
Инвалидация кеша: ключ, событие и проверка чтения
Учебный контракт для одного публичного представления: владелец записи, key с областью читателя, версия, событие изменения и read с защитой от stale entry.
Разбор конфликта транзакций: где заканчивается граница PostgreSQL
Учебный разбор двух несовместимых решений: как отличить неполный scope, ожидаемую блокировку, deadlock и serialization failure, не выдавая fixture за production-исследование.
Механика транзакции PostgreSQL 13: snapshot, блокировка и полный retry
Разбираем, когда PostgreSQL 13 создаёт snapshot, что реально защищает SELECT FOR UPDATE и почему Serializable не является рейтингом качества, а требует обработать отменённую transaction.
Границы транзакции PostgreSQL: как не оставить смену без дежурного
Фиксируем cross-row инвариант, разбираем два конкурентных запроса и выбираем между явной границей строк и полным retry без выдуманных claims о реальной нагрузке.
Учебный разбор инцидента: почему временный обход не становится выводом
На синтетическом случае разбираем путь от blocked-состояния к проверяемому временному обходу и плановой профилактике. Главный критерий: ни один вывод не должен появиться раньше своего наблюдения.
Разбор инцидента: как связать наблюдение, решение и профилактику
Разделяем состояние разбора на факты, гипотезы, действия, проверки и профилактику. Так временный обход не выдаётся за устранённую причину, а новая проверка не теряется в пересказе.
Разбор инцидента: как собрать факты до первого исправления
Видимый симптом легко исправить отдельной правкой. Разбираем учебную временную шкалу, чтобы связать наблюдение, гипотезу, решение, проверку и профилактику без поиска виноватого.
Разбор учебного baseline: как доказать контроль без сканирования
Учебный разбор трёх отказов и одного разрешённого запроса: не ищем уязвимости, а проверяем, что заявленные gates не исчезли.
Граница запроса: почему baseline не сводится к набору headers
Разбираем один state-changing запрос по слоям: сессия, контекст формы, permission, ответ и доказательство каждого контроля.
Минимальная защита старой админки: один маршрут, четыре контроля
Не начинаем с коллекции заголовков: для учебного маршрута связываем актив, угрозу, контроль и наблюдаемое доказательство.
Разбор учебного restore drill: от архива к доказательству
Разбираем учебный маршрут, в котором archive есть, но verdict появляется только после manifest, checksum, isolated target и безопасных checks.
Контракт резервной копии: scope, manifest и проверяемый restore
Checksum подтверждает байты, но не смысл. Разбираем границы logical backup, поля manifest и последовательность restore, которую можно проверить без реальной аварии.
Резервная копия — это ещё не восстановление: учебный restore drill
Архив в хранилище отвечает только на вопрос о записи байтов. Фиксируем scope, manifest и безопасный учебный restore, чтобы проверять готовность не по имени файла.
Разбор учебной трассы: как прочитать duration и critical path
Пошаговый разбор одного синтетического waterfall: проверяем trace context, parent/child span, duration и critical path без фальшивого production-инцидента.
Trace context в сентябре 2020: parent span, header и граница передачи
Разбираем механизм trace context: что несёт W3C traceparent version 00, как child получает parent и почему duration родителя нельзя складывать с duration вложенной операции.
Трассировка запроса: как собрать один учебный waterfall без платформы
Как провести один синтетический trace context через учебные границы, увидеть parent/child span и не выдать раннюю практику 2020 года за готовую tracing-платформу.
Разбор метрик: как проверить учебный порог по сырой серии
Одна линия «requests» не даёт причины для действия. Разбираем синтетическую серию counter, выбор окна и порога, чтобы отличить факт пересечения от выдуманного production-диагноза.
Лейблы Prometheus: где заканчивается полезная размерность
Label помогает разложить один сигнал, пока его значения ограничены. Разбираем, почему request ID и полный URL не становятся диагностикой, как посчитать учебную cardinality и где поставить контракт в коде.
Метрики приложения: начинаем с одного операционного вопроса
График количества запросов не объясняет деградацию сам по себе. Выбираем одну операцию, bounded labels, учебный запрос и порог, который можно проверить на контролируемой серии.
Разбор журнала: redaction и кардинальность до первой аварии
Выбираем поля для диагностики, удаляем чувствительные значения до сериализации и не превращаем event или route в бесконечный словарь.
Один request_id через границы: как связать журнал без ложной трассировки
Определяем владельца request_id на HTTP-границе, передаём его через дочерний логгер и честно отделяем корреляцию одного запроса от распределённой трассировки.
Структурированные логи: сначала контракт одного события
Связываем один учебный запрос по request_id, фиксируем обязательные поля события и не превращаем журнал в склад сырых объектов.
Разбор: ответ потерян, заявка создана — как проверить retry без второго эффекта
Учебная трасса «сервер сохранил результат, клиент не увидел ответ»: собираем доказательства, сравниваем бюджет времени и проверяем replay детерминированной фикстурой.
Под капотом идемпотентности: ключ, fingerprint и сохранённый HTTP-результат
Разбираем запись idempotency на стороне сервиса: scope ключа, защита от параллельного POST, хранение terminal ответа и граница внешнего эффекта.
Повтор HTTP-запроса без второго эффекта: ключ, результат и бюджет
Потерянный ответ не доказывает, что сервер ничего не сделал. Разбираем один пользовательский intent, idempotency key, ограниченный retry и контракт результата.
Разбор: почему экспорт отчёта повторился и как остановить poison message
Учебный разбор двух путей: результат создан до потерянного ack и невалидная задача крутится в requeue. Собираем журнал, меняем порядок и вводим карантин.
Под капотом фоновой задачи: delivery, ack, повтор и карантин
Разделяем бизнес-состояние задачи и одно delivery: где ставить ack, почему повтор нормален, как сделать одну задачу идемпотентной и остановить poison message.
Фоновые задачи: сначала фиксируем намерение, потом запускаем worker
Долгий экспорт не должен жить внутри HTTP-запроса. Собираем маленький контракт: запись задачи, публикация, обработка, сохранённый результат и ack в последнюю очередь.
Разбор reverse proxy: как не перепутать 504, неверную схему и адрес клиента
502 или 504 — это начало расследования, а не имя причины. Собираем безопасную таблицу сигналов, учебный access-log и маршрут проверки одного proxy-hop-а.
Под капотом reverse proxy: два HTTP-соединения, заголовки и таймауты
Почему приложение видит не тот адрес и схему, а 504 не объясняет причину само по себе: раскладываем proxy на отдельные соединения и проверяем контракт заголовков.
Reverse proxy перед приложением: собираем проверяемую HTTP-границу
Proxy создаёт второе HTTP-соединение и меняет контекст запроса. Собираем малый контракт для заголовков, таймаутов и диагностики вместо правок «вслепую».
Разбор учебного сбоя: pipeline собрал один commit, а deploy взял другой
Учебный разбор сбоя: тесты зелёные, но deploy пересобирает checkout. Ищем границу, проверяем artifact и останавливаем выпуск до внешнего действия.
Минимальный CI/CD pipeline: почему артефакт — контракт выпуска
Разбираем, почему зелёный build не равен готовому релизу: где заканчивается проверка, кто владеет артефактом и на каком условии deploy обязан остановиться.
CI/CD в 2020: минимальный pipeline, который не публикует чужую сборку
Собираем небольшой GitLab CI/CD pipeline: фиксируем входы, проверяем код, передаём в deploy один артефакт и оставляем ручную точку остановки.
Разбор: токен попал в лог — как провести ротацию без ложного исправления
Удалить строку из кода недостаточно, если credential уже увидели Git, лог или внешний сервис. Разбираем учебный incident: ограничить распространение, переключить потребителей, отозвать старое значение и оставить защиту.
Под капотом: как настройка проходит до процесса и становится утечкой
Настройка не исчезает после запуска: она проходит через репозиторий, сборку, образ, delivery и лог. Разбираем границы носителей, чтобы токен не оказался в удобном, но неверном месте.
Конфигурация без утечки: разделяем настройки, секреты и доставку
Когда пароль лежит рядом с настройкой, он проходит через Git, образ и лог. Собираем короткий контракт конфигурации: что хранить в коде, что передавать при запуске и что проверять до выпуска.
Чистый запуск Docker: как отличить ошибку конфигурации от следа старого тома
Повторный docker-compose up не делает базу пустой и не отменяет bind mounts. Собираем безопасный сценарий чистого запуска, который отделяет новую конфигурацию от старого состояния.
Почему контейнер не делает окружение одинаковым: файлы, сеть и переменные
Контейнер изолирует процесс, но не отменяет выбор путей, томов, сервисных адресов и переменных. Разбираем путь одного запроса и точки, где конфигурация расходится с ожиданием.
Локальная разработка в Docker: фиксируем окружение вместо «у меня работает»
Контейнер не отменяет различия между кодом, томами, сетью и переменными. Собираем короткий локальный контракт, который можно повторить на чистой машине.
Разбор: баг на стыке модулей и четыре владельца одного решения
Анонимный учебный разбор: неизвестный ответ интеграции проходит через gateway и checkout. Отделяем исторического автора от владельцев решения, review и проверки после merge.
Под капотом: Git, CODEOWNERS и границы ответственности
Git показывает историю строк, CODEOWNERS маршрутизирует запрос review, а решение и эксплуатационная проверка требуют отдельных записей. Разбираем границы каждого механизма.
Код не равен решению: как назначить владельцев на стыке модулей
Баг проходит через несколько модулей, а у решения нет владельца. Разделяем владение кодом, ревью и последующим действием, чтобы исправление не осталось ничьим.
Разбор: разные release-файлы из одного commit в legacy webpack-проекте
Полевой разбор двух разных dist из одного commit: как не спутать lockfile, режим сборки, runtime и timestamp plugin, а затем оставить короткий след для следующей выкладки.
Почему одинаковый commit даёт другой bundle: границы воспроизводимой сборки
Lockfile фиксирует дерево пакетов, но не время, конфигурацию и поведение plugins. Разбираем, какие входы принадлежат сборке и что именно доказывает SHA-256 manifest.
Один commit — два dist: как собрать доказательство, а не спор
Одинаковый commit выпустил разные файлы. Фиксируем lockfile, runtime, конфигурацию и список SHA-256, чтобы найти меняющийся вход, а не очищать cache наугад.
Разбор: как перевести один legacy-поток на TypeScript и не сорвать выпуск
Фикстура для старого API-модуля: JavaScript-транспорт, TypeScript-нормализатор и экран с явным контрактом. Проверяем вход, build и путь отката без массового переписывания.
Под капотом: почему типы не проверяют runtime и как any размывает границу
Типы помогают compiler увидеть несогласованный код, но исчезают из JavaScript. Разбираем поток внешних данных, роль unknown и причину, по которой any делает миграцию декоративной.
Переход на TypeScript: начать с границы, а не с массового any
Переименование всех файлов создаёт шум, а не типы. Разбираем постепенный маршрут TypeScript 3.5: выбрать границу данных, оставить JavaScript в сборке и считать полезную проверку.
Разбор: красная ошибка формы не становится контрактом сама
У поля появилась красная рамка, но пользователь не получает объяснение и не возвращается к ошибке. Собираем контракт между валидацией, текстом, фокусом и проверкой в браузере.
Под капотом: почему DOM не доказывает имя, роль и фокус
В DOM есть input и кнопка, но пользователю всё равно не за что зацепиться. Разбираем, где HTML даёт браузеру семантику и почему финальная проверка происходит по живому маршруту.
Базовая доступность: пройти форму с клавиатуры до первого релиза
Форма выглядит готовой, пока фокус не пропадёт, поле не останется без имени, а ошибка не окажется только красной рамкой. Собираем короткий маршрут проверки в браузере.
Разбор первой загрузки: быстрый HTML, пустой экран и неверный фикс
Учебный профиль показывает быстрый ответ HTML и поздний полезный экран. Разбираем, как отличить поздний hero, блокирующий JavaScript и CSS без выдуманного production-замера.
Под капотом первой загрузки: где теряется время между HTML и полезным экраном
Быстрый ответ origin не равен быстрому экрану. Разбираем зависимую цепочку HTML, CSS, JavaScript и изображения и проверяем, кому принадлежит задержка.
Производительность первой загрузки: как собрать профиль вместо слова «тяжёлая»
Страница кажется тяжёлой, но сетевой запрос может быть быстрым. Собираем один воспроизводимый профиль и отдельно проверяем сеть, JavaScript, CSS и изображения.
Индекс есть, Seq Scan остался: полевая диагностика PostgreSQL
Не каждый WHERE сопоставим с индексным ключом, а частичный индекс не читает мысли prepared statement. Полевой разбор: селективность, ANALYZE, выражения и predicate shape.
EXPLAIN ANALYZE: читать план запроса, а не угадывать индекс
План показывает Seq Scan, Index Scan и cost, но эти слова сами не объясняют задержку. Разбираем дерево, estimate versus actual, loops и Buffers, чтобы найти первую неверную гипотезу.
SQL-индекс не ускорил запрос: начинаем с плана, а не с CREATE INDEX
Новый индекс есть, но PostgreSQL по-прежнему читает таблицу. Разбираем селективность, статистику и форму предиката через EXPLAIN ANALYZE, не подменяя диагноз очередным CREATE INDEX.
Полевой разбор: контрактный тест REST API без подмены его production-проверкой
В API «всё работает», пока UI не получает 200 без nextCursor или 400 в чужом формате. Собираем три воспроизводимых response-фикстуры, отделяем их от запроса к стенду и готовим маршрут интеграционной проверки.
OpenAPI 3.0.2 под капотом: операция, статус, схема и совместимость клиента
Схема API полезна не как каталог URL. Разбираем, как в OpenAPI 3.0.2 связать операцию с кодами ответов, problem details, required-полями и окончанием cursor-пагинации.
REST API без угадывания: фиксируем статусы, ошибки и страницу списка
Клиент падает не из-за адреса, а когда 200 содержит ошибку, следующая страница исчезает или необязательное поле внезапно становится null. Собираем короткий контракт операции и проверяем его на локальных фикстурах.
CDN отдаёт старый язык: как проверить cache key, Vary и ETag
Один URL отдаёт разные языки, а пользователь получает вчерашний или чужой вариант. Собираем контролируемый сценарий: два запроса, заголовки, ключ варианта и повторная проверка.
HTTP-кэш: почему один Cache-Control не управляет всем маршрутом
Ответ с правильным TTL всё равно может быть неверным: кэш хранит представление по ключу, а browser, proxy и CDN читают его на разных границах. Разбираем свежесть, варианты и повторную проверку.
HTTP Cache-Control: как перестать отдавать устаревшие данные
Пользователь видит старую цену или старый интерфейс после релиза. Разбираем не один TTL, а контракт ресурса: URL, свежесть, повторную проверку и способ измерить результат.
Почему поздняя проверка логина стирает новое состояние формы
Разбираем конкретную гонку: ответ «логин занят» для старого значения приходит позже, перезаписывает новое поле и оставляет ошибку без связи с input. Исправляем версией запроса и доступной разметкой.
Валидация формы как конечный автомат: состояние, версия и ошибка поля
Почему boolean isValid не объясняет форму с серверной проверкой. Разбираем состояния editing, checking, invalid и submitting, а также правило, которое не даёт позднему ответу перезаписать новое значение.
Форма без расхождения правил: клиентская проверка, серверная ошибка и поле
Поле проходит проверку в браузере, а сервер возвращает 422. Собираем контракт правил и ошибок так, чтобы сообщение оказалось у нужного поля и поздний ответ не затёр новое значение.
Разбор: зависший фильтр и неожиданное применение async-результата
На фильтре одновременно видны зависание интерфейса и старый ответ, который перезаписывает новый. Сначала строим трассу, затем разделяем CPU-блокировку и гонку результатов.
Event loop под капотом: почему Promise обгоняет таймер, но не прерывает код
Разделяем стек, browser task и Promise Job. Это помогает не обещать таймеру точность и не пытаться лечить тяжёлый синхронный код лишним await.
Event loop: как воспроизвести порядок Promise, таймера и синхронного кода
Promise-обработчик приходит раньше таймера, а кнопка перестаёт реагировать. Ставим короткий опыт, различаем очередь и долгую синхронную работу, затем выбираем способ исправления.
ES-модули в браузере: диагностика двойного запуска и неверного пути
Инициализация срабатывает дважды или импорт уходит не туда. Учебный диагностический модуль показывает фактический URL, различает две module identity и не выдаёт Console за реальную трассу.
ES-модули: почему import в браузере не равен import в Webpack
Сборщик принял import по имени пакета, а браузер не знает, куда идти. Разделяем URL-резолвацию, построение графа и дополнительные правила Webpack, не смешивая их в один диагноз.
ES-модули в браузере: старт без сборщика
Страница открывается, но модуль не запускается или импорт отвечает 404. Собираем минимальный нативный граф, проверяем URL, MIME и порядок запуска без предположений о Webpack.
jQuery + Webpack: почему legacy-плагин исчезает только в production
Плагин виден в development, но после production-сборки у $.fn нет метода. Разделяем три причины: глобал не создан, плагин выполнился рано или приложение держит второй jQuery.
jQuery в Webpack. Почему legacy-плагин ломается только в production
В development маска работает, а после production-сборки читает undefined вместо window.jQuery. Разбираем порядок выполнения модуля, назначение ProvidePlugin и проверку графа ассетов.
JavaScript. jQuery в Webpack: глобальная зависимость без скрытого порядка
Как подключить jQuery к Webpack-проекту, когда часть кода ждёт window.jQuery, а новые модули используют import.
Bitrix. Замена старого обработчика: один элемент, проверка и откат
Полевой учебный разбор: как заменить один legacy-участок формирования CODE, проверить его на выбранном элементе и подготовить честный откат без обещаний о бесшовной миграции.
Bitrix. Почему один save.php ломается от «маленькой» правки
Почему смешанная ответственность делает локальную правку опасной: отделяем обработку формы, изменение инфоблока и вывод результата, не строя большую архитектуру поверх старого Bitrix-кода.
Bitrix API. Как заменить один вызов Update, не переписывая модуль
Небольшой защищённый шов вокруг CIBlockElement::Update: ограничиваем вход, меняем одно поле CODE, читаем результат обратно и не обещаем переписать весь legacy-модуль.
PHP. Зелёный тест, нерабочая форма: разбираем БД, HTTP и конфигурацию
Полевой разбор ложной зелени: unit-тест подменил репозиторий и HTTP-клиент, а ошибка живёт в DSN, запросе или URL. Собираем короткую трассу без вызова внешнего сервиса.
PHP. Unit и integration: где заканчивается mock и начинается настоящий запрос
Разбираем границу между unit- и integration-тестом PHP: что дают mock-объекты, что они не могут проверить и как выбрать минимальный настоящий переход к БД или HTTP.
PHP. Интеграционный тест репозитория: фиксируем контракт с БД
Как написать небольшой интеграционный тест PHP-репозитория: отдельно настроить тестовую БД, проверить запись и чтение через PDO, а затем безопасно убрать учебные данные.
Bitrix API. Legacy-форма с редактором изображения: разбор типичной ошибки
Разбор формы, где preview обновляется, а в карточку попадает старый файл. Фиксируем контракт между jQuery, FileInput и серверным сохранением, чтобы не путать DOM с подтверждённым ID.
Bitrix API. Встроенный редактор изображений: UI не заменяет серверный контракт
Как подключить FileInput в Bitrix и проверить, что выбранный файл действительно привязан к сущности после сохранения.
Bitrix API. Форма с изображением: где заканчивается редактор и начинается файл
Картинка появляется в форме, но после сохранения карточка остаётся прежней. Разбираем четыре состояния файла и ставим проверку на границе между контролом, b_file и элементом инфоблока.
Windows. Разбор «работает на моей машине» без переустановки среды
Полевой маршрут для двух Windows-машин: сравнить снимки, отделить PATH от кодировки и версии бинарника, проверить одну гипотезу в новом сеансе и не стереть полезные доказательства.
Windows. Почему PATH, кодировка и версия бинарника меняют запуск проекта
Разбираем один механизм: как PowerShell выбирает команду, почему where.exe не заменяет Get-Command -All и где кодовая страница действительно влияет на диагностику.
Windows. Как сохранить минимальный снимок окружения проекта
Фиксируем то, что реально запускает проект на Windows: порядок PATH, найденные бинарники, версии и кодировку консоли — без копирования всего компьютера и без секретов.
PHP cURL. Как обновить устаревший CA bundle без отключения verification
Полевой порядок для старого PHP-окружения: доказать, какой trust store использует модуль, заменить bundle контролируемо и проверить партнёрский HTTPS-запрос без CURLOPT_SSL_VERIFYPEER=false.
TLS в PHP. Почему CA bundle, имя хоста и SNI проверяются по-разному
Разбираем три независимые части TLS-проверки: серверная цепочка, локальный набор доверенных CA и имя виртуального хоста в SNI.
PHP cURL. Как разобрать SSL certificate problem и не отключить проверку
Разбираем отказ проверки TLS в PHP по шагам: сохраняем код ошибки, сравниваем клиент с командной строкой, смотрим цепочку и указываем корректный CA bundle.
PHP cURL. Как разобрать зависшую интеграцию по стадиям запроса
Полевой разбор начинается не с повтора запроса: сохраняем error, HTTP-код и стадии cURL, отличаем отсутствие соединения от позднего первого байта и решаем судьбу неопределённой операции.
PHP cURL. Почему connect, общий timeout и медленный ответ нельзя смешивать
Один error 28 не рассказывает, что именно не успело: DNS и TLS, ожидание первого байта или тело ответа. Разбираем границы опций libcurl и безопасные условия для повтора.
PHP cURL. Как дать веб-интеграции ограниченный бюджет времени
У одного запроса к партнёру должен быть общий предел, короткая граница соединения и понятное правило повтора. Разбираем это на PHP cURL без бесконечного ожидания и двойных операций.
Webpack 4. Bundle вырос после нового entry: как найти причину по stats.json
Пошаговая диагностика Webpack 4: отделяем новые ассеты от реального дублирования, читаем stats.json и проверяем, что браузер действительно скачивает.
Webpack 4. Почему общий import оказывается в двух entry bundle
Разбираем один вопрос: что именно Webpack строит от entry, почему массив файлов — всё ещё один старт, и где появляется дублирование до настройки splitChunks.
Webpack 4. Как добавить две страницы и не возить общий код дважды
Собираем две независимые страницы в Webpack 4: отделяем точки запуска от общего кода, подключаем нужные файлы в HTML и проверяем результат без догадок.
jQuery. Как не отправить legacy-форму дважды
Практический контракт Ajax-формы: один активный jqXHR, корректная сериализация, явные ветки успеха и ошибки, обязательное освобождение кнопки.
jQuery. Почему кнопка перестаёт работать после .html()
Разбираем, почему прямой обработчик исчезает вместе с заменённой разметкой, как выбрать устойчивый контейнер для делегирования и где этот приём не подходит.
jQuery. Как повторно инициализировать виджет и не получить два клика
Разбираем маленький контракт для legacy-виджета: повторный mount снимает только свои события, назначает один обработчик и проверяется тремя вызовами подряд.
Bitrix API. Карточка открывает не тот товар: проверяем конфликт CODE
Полевой разбор ситуации, когда адрес детали показывает другой элемент: считаем совпадения по CODE, сравниваем переменную ЧПУ с фильтром и меняем данные без потери следов.
Bitrix API. Как адрес каталога превращается в ELEMENT_CODE
Разбираем, где ЧПУ-путь становится переменной компонента, почему URL-шаблон не равен запросу к инфоблоку и как проверить связку без гадания по кешу.
Bitrix API. Символьный код: как не получить два одинаковых адреса
Собираем символьный код элемента из имени, проверяем занятость в нужном инфоблоке и разбираем границу, за которой простой суффикс перестаёт быть защитой.
PHP. Как отдать приватный файл владельцу и не сделать uploads публичной папкой
Разбираем контролируемую выдачу документа: путь хранится вне веб-корня, доступ проверяется по записи в базе, а браузер получает содержимое только после авторизации.
PHP. Почему расширение и Content-Type не отвечают на вопрос «что за файл?»
Разбираем, какие сведения о загрузке пришли от клиента, какие получил PHP и где серверу действительно стоит принимать решение о допустимом файле.
PHP. Безопасная загрузка аватара: минимальный маршрут без доверия к имени файла
Собираем маленький обработчик для JPEG и PNG: проверяем доставку, размер и содержимое, сохраняем под своим именем и не отдаём путь из веб-корня.
PHP. Как отличить битый JSON от корректного null в ответе API
Проверка if (!$data) смешивает пустой массив, false, null и ошибку декодирования. Собираем короткий разбор JSON для PHP 7.1 с проверкой json_last_error и контракта ответа.
PHP и cURL. Почему curl_exec() не означает успех интеграции
curl_exec() может вернуть тело ответа, хотя партнёр ответил 404 или 500. Разбираю три уровня результата: транспорт, HTTP и контракт полезной нагрузки.
PHP. Как записать причину 500-й ошибки в интеграции
Разбираю, как собрать один полезный диагностический факт при фатальной ошибке PHP: где работает set_error_handler, зачем нужен shutdown-обработчик и какие данные нельзя писать в лог.
Bitrix API. Элемент есть в админке, но не виден в каталоге
Полевой разбор частой ошибки Bitrix: Add вернул ID, админка показывает элемент, но пользователь не видит его в каталоге. Ищем причину по слоям, а не очищаем кеш наугад.
Bitrix API. Что на самом деле происходит вокруг CIBlockElement::Add
Разбираем жизненный цикл добавления элемента: кто проверяет поля, где срабатывают события Bitrix, почему глобальный обработчик не заменяет сервис и как тестировать эту границу.

Bitrix API. Создаём элемент инфоблока так, чтобы ошибка не исчезла
Разбираем создание элемента инфоблока как полноценную операцию: контракт полей, обработка LAST_ERROR, свойства, контрольная выборка и проверка публичного сценария.
Tilix и D: что инженер проверяет в инструменте, прежде чем выбрать его
Редакторская версия интервью о Tilix и D: как отделить личный сценарий терминала от проверяемых свойств инструмента и языка.
Bitrix API. Символьный код элемента: транслитерация — только первый шаг
Как получить стабильный CODE из названия в Bitrix и не сломать URL повтором, разделом или массовым обновлением.
Bitrix API. Торговое предложение: создать запись и довести её до каталога
Почему одного CIBlockElement::Add недостаточно для торгового предложения и как проверить связь товара, свойств, цены и остатка.
Firefox. Таймаут страницы: увеличиваем ожидание только после проверки причины
Как отличить медленный ответ сервера от сетевого сбоя и изменить параметр Firefox так, чтобы не скрыть проблему.
PHP. unable to get local issuer certificate: восстановить цепочку доверия, не отключая TLS
Как диагностировать ошибку CA bundle в cURL и PHP и настроить доверенный корень без `verify_peer=false`.
DConf 2017. Сборщик мусора D: наблюдаем паузу, а не обвиняем GC вслепую
Редакторская версия заметки о GC в D: как отличить давление на память, паузу сборки и лишние аллокации.
D и регулярные выражения: повторяем preg_match_all, не теряя смысл совпадений
Как построить аналог поиска всех совпадений в D и проверить различия между PHP-массивом и диапазоном matchAll.
D CTFE: вычислить константу на этапе компиляции и проверить границу применения
Что меняет новый движок CTFE в D и как отличить полезное вычисление на этапе компиляции от скрытого усложнения сборки.
Vibe.d: асинхронный сервер D начинается с границы владения запросом
Как читать Vibe.d не как набор удобных API, а как контракт event loop, обработчика запроса и внешних зависимостей.
Windows. Браузер сам открывает сайты: безопасная диагностика без запуска подозрительного файла
Порядок проверки автозапуска, расширений, прокси, DNS и задач Windows, когда браузер сам переходит на вредоносные страницы.
DMD под Windows x64: проверить разрядность компилятора и бинарника
Как собрать 64-битную программу на DMD под Windows и не перепутать архитектуру компилятора с архитектурой исходного кода.