Код писали агенты, планировал я. Сказать такое легко, поэтому вот доказательства: все смерженные PR сайта, кроме обновлений данных и PR от ботов. В карточке каждого — красный тест до кода (если его нет, карточка объясняет почему или обещает объяснить позже), что поймали до мержа и что решил я.
Число PR и проценты на главной — про мою работу в YAGNI, а не про этот сайт. Здесь тот же цикл на PR самого сайта.
Как сейчас устроен цикл
Постановкачто делаем — решаем вместе
Красный тестпервый коммит, тест падает
Агент пишетотдельный агент делает его зелёным
Судьянезависимые LLM-проверки диффа
Фикспотом проверки в браузере и perf
Мержделаю я, человек
Судья и фикс повторяются, пока не исправлены все подтверждённые замечания. Выделенные шаги — мои. Цикл складывался по ходу этих PR: ревью упомянуто в карточке, только если о нём сказано в самом PR.
72
Смерженных PR
43/72
Сначала красный тест
29
Находок в карточках
222
Коммитов без мержей
Все PR, от первого
PR #1 · смержен
Перестроил сайт: посетитель сначала видит, кто я, чем занимаюсь и как со мной связаться, и понимает, что кликабельно
Для посетителей
Первый экран сразу говорит, кто я, чем занимаюсь и как со мной связаться. Тень есть только у того, на что можно нажать. Четыре раздела, которые повторяли друг друга, стали одной лентой опыта.
Красный тест
Один коммит, сделанный до появления этого цикла: красного теста до кода нет.
Ревью
Независимое ревью блокеров не нашло; подтверждённые замечания исправлены до мержа.
Поймано до мержа
У фильтров блога не было aria-pressed.
После закрытия разбора архитектуры в адресе оставался ?case=.
У метки Now был слабый контраст.
Что решил я
Взял в работу два внешних ревью: UX-заметки друга и отзыв WebGL-инженера. 3D-топологию в hero оставил, повторяющиеся разделы убрал.
Страница, её JSON-LD и llms.txt говорят обо мне одно и то же, с одними и теми же цифрами
Для посетителей
Страница, её JSON-LD и llms.txt теперь говорят обо мне одно и то же: оба написания имени, одна фраза в третьем лице, одни и те же цифры.
Красный → зелёный
bd450d2Add a failing test that the page, its JSON-LD and llms.txt agree on who Gleb is and on the numbers → fb2c084Make the page, its JSON-LD and llms.txt agree on who Gleb is and on the numbers
Поймано до мержа
Красный тест закрепил одно название для −80% в Kingpin: где-то это было время триажа, где-то анализ фидбека. fb2c084
Что решил я
У каждого факта одно название: −80% в Kingpin везде время анализа фидбека, а 28 PR в YAGNI — первая неделя, а не первые 8 дней.
Воронку конверсии теперь можно измерить: события Umami и UTM на cal.com
Для посетителей
Внешне ничего. Клики по созвону, почте, CV и LinkedIn стали событиями, а каждая ссылка на cal.com говорит, где на неё нажали. Пограничные случаи закреплены отдельными тестами: например, клик колёсиком по кнопке ничего не отправляет.
Красный → зелёный
283a9d5Add a failing test for funnel events: tracked controls, cal.com UTM, Umami helper → 78579d2Make the conversion funnel measurable with Umami events and UTM on cal.com links
Что решил я
События отправляются в Umami Cloud: в Vercel Hobby нет своих событий, а данные хранятся месяц.
Hero цепляет за 5 секунд: строка ценности, цифры и кнопка созвона до первого скролла
Для посетителей
На телефоне первый экран говорит, чем я занимаюсь, подкрепляет это цифрами и предлагает 30-минутный созвон.
Красный → зелёный
c12c874Add a failing test that the hero says what, proves it and asks for the call above the fold on a phone → 8f46b32Give the hero a 5-second hook: value line, stats and an intro-call CTA above the fold
Что решил я
28 PR в YAGNI теперь говорят, кто что сделал: 98% кода написали агенты, 97% планирования — моё.
Каждый пуш проверяется бюджетами производительности, за ними следит агент perf-watchdog
Для посетителей
Сайт остаётся быстрым: пуш, который пробивает бюджет по байтам или Lighthouse, блокируется до прода.
Красный → зелёный
d6ec0d1Add a failing test that the site stays within its performance budgets and a push is gated on them → 03e8309Gate every push on byte and Lighthouse budgets, and ask a perf-watchdog agent what got slower when it fails
Что решил я
Без GitHub Actions: проверка стоит на git push и блокирует его.
Canvas в hero не крутит цикл анимации при reduced motion
Для посетителей
С включённым reduced motion канвас в hero перестаёт перерисовываться, когда ничего не движется: в покое было 180 кадров за 3 секунды, стало 0.
Красный → зелёный
a3deb9bAdd a failing test for idling the hero canvas loop under reduced motion → 27d9074Idle the hero canvas loop under reduced motion once the scene settles
Ревью
Независимое ревью отдельно проверило пробуждения при reduced motion: сбой и перетаскивание доигрывают до конца и затихают, а после resize канвас перерисовывается.
Что решил я
Ограничил задачу режимом reduced motion. Две побочные проблемы, перетаскивание правой кнопкой и запасной шрифт на канвасе, записаны в PR, но не исправлены.
У каждого поста своя индексируемая страница, а конспект заканчивается следующим шагом
Для посетителей
У каждого поста своя страница с заголовком и ссылкой, которой можно поделиться, а каждый конспект заканчивается следующим шагом: следующий пост, LinkedIn или созвон.
Красный → зелёный
1c56961Add a failing test that every post has an indexable page and the reader gets a next step → 9647d0fGive every post its own page, link cards to it, and end the brief with a next step
Что решил я
На страницах постов одна ссылка на созвон, в конце конспекта. Ссылки с главной на /writing/ пока нет: этот раздел менялся в другой ветке.
Карточка YAGNI больше не утверждает, что 89% PR написали агенты; остаётся одна цифра — 98% кода
Для посетителей
Карточка YAGNI больше не утверждает, что 89% моих PR написали агенты. Осталась одна доля агентов: 98% кода.
Красный → зелёный
b799c39Add a failing test that the YAGNI card never claims 89% of PRs and gives 98% as the one code share → 103283bThe YAGNI card drops the unprovable 89% of PRs; 98% of the code is the one agent share
Что решил я
Убрал 89%: эта цифра считала имена веток agent/, подтвердить её нечем, и она спорила с 98%.
Нейронный клеточный автомат выращивает монограмму GR в блоке «Вне резюме», и она заживает, когда посетитель её режет или откусывает
Для посетителей
Раздел «Вне резюме» начинается с монограммы GR, которую выращивает маленькая нейросеть. Разрежьте её или коснитесь — и она заживёт.
Красный тест
4c261baRed test: a neural cellular automaton grows GR from one cell and regrows it after damage
Ревью
Код написал независимый агент, дифф прошли три независимые проверки-судьи; каждое подтверждённое замечание исправлено.
Поймано до мержа
После вертикального разреза G отрастала как R. Исправлено обучением на штрихах, а не только на круглых укусах. 7a37821
После полного стирания оставался мёртвый пустой квадрат. Теперь монограмма растёт заново. 7a37821
Обучение могло перезаписать более удачные веса. Теперь оно сохраняет только чекпойнт, который лучше текущего. 3365610
Что решил я
Смержил с записанным ограничением: 11 из 720 проверок заживления всё ещё не проходят порог, Reset это исправляет. Более чёткая версия на WebGL — на потом.
Страница /booked: настоящая запись через cal.com становится шагом воронки, а персональные данные брони никуда не утекают
Для посетителей
После брони созвона открывается /booked. Бронь засчитывается в аналитике и привязывается к ссылке, с которой пришли.
Красный → зелёный
977b388Add a failing test that /booked counts a real booking by placement and leaks no booking PII → 8b3a0bcAdd /booked: a cal.com booking becomes booking_confirmed{source} with no booking PII
Что решил я
Считать забронированные созвоны, а не только клики по кнопке, и не хранить данные брони: сохраняется только то, с какой ссылки пришли.
Как собран этот сайт: каждый смерженный PR с красным тестом, тем, что поймали, и тем, что решил я
Для посетителей
Эта страница: каждый смерженный PR сайта с красным тестом, тем, что поймали до мержа, и тем, что решил я. Каждое число на ней посчитано из данных.
Красный → зелёный
1f77025Add a failing test that /how-its-built/ shows every merged PR with its red test, judge findings and human decision, and derives every number from the data → 8972f07Add /how-its-built/: every merged PR of this site with its red test, findings and human decision, every number derived from a generated build-story.json
Ревью
Код написал независимый агент, дифф проверил независимый судья: «можно мержить после правок». Его замечания исправлены до мержа.
Поймано до мержа
Ссылка в hero стояла сразу после цифр YAGNI и читалась как их доказательство. Теперь она говорит, что это тот же цикл на PR этого сайта. 8972f07
Страница приписывала шаг судьи каждому PR, хотя ревью записано только в трёх описаниях. Теперь карточка упоминает ревью, только если о нём сказано в PR. 8972f07
Тест свежести ронял бы main после каждого мержа. Теперь данные помнят, по какой коммит main они собраны. 7a4a6fe
Что решил я
Здесь считаются только PR этого сайта: 28 PR из hero — это YAGNI, и страница так и говорит. В каждой карточке есть и то, что решил человек, а не только то, что поймали.
Perf-гейт на каждом PR в GitHub Actions и watchdog на OpenRouter, который объясняет превышения в одном закреплённом комментарии
Для посетителей
Внешне ничего. Проверка производительности переехала из локального pre-push хука в GitHub Actions и запускается на каждом PR, который меняет то, что уходит на сайт. Если бюджет пробит, недорогая модель объясняет причину в одном комментарии к PR.
Красный тест
a4424f8Red test: the perf gate runs on every PR in CI with a sanitised sticky watchdog comment, and the pre-push hook is gone
Ревью
Дифф проверил независимый судья: «можно мержить после правок». Его правки внесены.
Поймано до мержа
Прогон, отменённый более новым пушем, всё равно мог вызвать модель. Теперь он ничего не стоит.
Без Chrome CI тихо проверял бы только байты. Теперь проверка падает.
Падение тестов не оставляло в PR никакого объяснения. Теперь появляется комментарий «gate not run».
Что решил я
Модель вызывается только при пробитом бюджете, обычно бесплатная, а её ответ обезвреживается перед публикацией. LLM-ревью кода намеренно остаётся локальным.
Полировка P2: подписи фильтров, кириллические шрифты, текст canary #42, телефон только в CV
Для посетителей
Фильтры блога называются так же, как категории на карточках. Русский текст получил кириллические шрифты вместо системных, и они загружаются только когда на странице есть русский. Номер телефона теперь только в PDF-резюме.
Красный тест
Четыре мелкие правки, по коммиту на каждую: тест приходил в том же коммите, что и изменение, поэтому отдельного красного теста до кода нет.
Что решил я
Canary #42 остаётся пасхалкой для тех, кто дочитал резюме до конца, но сформулирован как факт, а не как указание для ИИ. Известное наложение в подвале резюме оставил на потом.
llms.txt оставляет языковым моделям, которые его читают, мягкий boop и хайку-канарейку
Для посетителей
llms.txt, файл для языковых моделей, заканчивается дружеской запиской и хайку, которое модель может процитировать, чтобы показать, что прочитала файл.
Красный → зелёный
79b945bRed test: llms.txt carries one note for language models, a soft boop and an exact haiku, that invites and never commands → 5925c95llms.txt leaves a soft boop and a canary haiku for the language models that read it
Что решил я
Записка только приглашает и ничего не требует, и живёт только в llms.txt: резюме и подвал сайта остаются для людей.
Топология в hero рассказывает историю в 3 шага и заканчивается кейсом YAGNI
Для посетителей
Топология в hero рассказывает историю в три шага: человек утверждает план, агенты строят в песочнице, потом вы ломаете систему и смотрите, как она восстанавливается. В конце ссылка на кейс YAGNI. Свободная игра спрятана за Explore, а на телефонах показывается статичный постер с кнопкой Play.
Красный → зелёный
da0fad8Add failing tests: the hero topology tells a 3-step story that ends on the YAGNI case, and the GR monogram bridges to it → cd66642The hero topology tells a 3-step story that ends on the YAGNI case; free play moves behind Explore
Ревью
Код написал агент, проверил отдельный судья, которому дали только дифф, тесты и задачу. Его замечания исправлены до мержа.
Поймано до мержа
Фокус клавиатуры терялся, когда исчезал элемент в фокусе. Теперь он переходит на Break или на ссылку на кейс.
Ссылка на кейс перехватывала клики с модификаторами, и её нельзя было открыть в новой вкладке.
?domain= сдвигал вёрстку после первой отрисовки. Теперь он применяется при открытии Explore.
Что решил я
Топология должна говорить, какую задачу решает, а не просто выглядеть эффектно. Смержил с двумя записанными недочётами: на постере для телефона часть подписей узлов наезжает друг на друга, а строка статуса в шапке остаётся только на английском.
Ежедневная синхронизация Publora: посты из LinkedIn становятся двуязычными страницами с полным текстом через один PR бота
Для посетителей
На страницах постов теперь полный текст: английский оригинал и русская адаптация, а LinkedIn указан как копия. Новые посты из LinkedIn попадают на сайт через один ежедневный PR от бота, который я проверяю.
Красный тест
05890fdRed test: a daily Publora sync turns new published LinkedIn posts into validated site entries in posts.json and one bot PR, and does nothing when there is nothing new
Поймано до мержа
Сломанный файл бэкфилла останавливал всю синхронизацию. Теперь он пропускается, а ссылки в бэкфилле должны вести на LinkedIn. 5144f45
Что решил я
Оригинал — сайт, копия — LinkedIn. Черновики пишет Haiku 5.5, запасная модель — GLM-5.3 Flash; обе выбраны в сравнении 13 недорогих моделей на двух реальных постах. В main бот никогда не пушит.
Диета главной: 6 последних постов, собранные скрипты страницы, кейсы на отдельных страницах
Для посетителей
Главная стала легче: 6 последних постов и ссылка на все, скрипты страницы в собранных модулях, а у каждого кейса своя страница, которая подгружается на главную только при открытии. HTML главной уменьшился с 35 758 до 30 270 байт в gzip.
Красный тест
876a838Add failing tests: home under 32 KB gzip, 6 latest posts + /writing/, no inline page scripts, cases on their own pages and loaded on open
Поймано до мержа
Ссылка с ?case= могла открыть кейс раньше, чем аналитика начинала слушать события, и автоматическое открытие могло засчитаться как case_open. Теперь восстановление ждёт, пока отработают все модули. 1a49fd0
Скрипты страницы могли запуститься раньше глобальных функций, которые они вызывают. Теперь эти функции загружаются первыми. 1a49fd0
Что решил я
Бюджеты не менял: главная освободила место, сбросив вес, а не за счёт поднятого лимита.
Статический i18n: EN на /, RU на /ru/, типизированные словари, hreflang и переключатель языка ссылкой
Для посетителей
У каждого языка своя страница: английская на /, русская на /ru/, с hreflang и переключателем языка, который сохраняет место на странице. HTML главной уменьшился с 30 266 до 23 218 байт в gzip.
Красный тест
68be84dAdd failing tests: EN at /, RU at /ru/ with lang, hreflang, sitemap and a link switch; typed dictionaries with identical keys
Поймано до мержа
Бронь, сделанная с русской страницы, вела на английскую /booked/. Теперь она ведёт на /ru/booked/. 398a1cd
Переключатель языка терял ?query#anchor при клике правой кнопкой. Теперь сохраняет. 398a1cd
Что решил я
Отдельные статические страницы для каждого языка вместо скрытых дублей текста, словари типизированы: пропущенный или лишний ключ ломает сборку. Английский остаётся языком по умолчанию.
Топология в hero повторяет реальный прогон агентов на этом сайте (PR #11), и посетитель может взять управление на себя
Для посетителей
Топология в hero показывает запись реального прогона агентов на этом сайте, PR #11, включая момент, когда судья ловит G, отросшую как R. Перехватить управление можно в любой момент: выключить судью и посмотреть, как ошибка уходит в прод, или разрезать маленькую GR.
Красный тест
7c2dce6Red test: the topology replay of PR #11 is checkable against git, and the G→R mis-heal is reproduced from committed pre-fix weights
Ревью
Код написал агент, проверили независимые судьи, которым дали только дифф, тесты и задачу: один раз слой данных, один раз интерфейс. Их замечания исправлены до мержа.
Поймано до мержа
Шаг песочницы показывал тест, который появился только после находки. Теперь он называет тесты на укусы, которые были тогда. 2a5148e
Автовоспроизведение засыпало live-регион сообщениями, и его нельзя было поставить на паузу. Теперь фильм ставится на паузу, а live-регион молчит. 2447594
Отменённое заживление могло всё равно сработать позже. Теперь устаревшее заживление не применяется. 2447594
Что решил я
Показывать реальный прогон с пометкой, что это повтор, а не иллюстрацию, и сверять всё в нём с git. Сценарная ошибка при перехвате управления помечена как симуляция.
CV в PDF: две чистые страницы с потоковой вёрсткой, шапкой и подвалом
Для посетителей
PDF-резюме теперь две аккуратные страницы со всеми разделами, настоящими тире и маркерами, более крупным текстом и кликабельными ссылками. Строка canary больше не наезжает на основной текст.
Красный тест
63e597bAdd failing tests: CV PDF on 2 pages with every role, capabilities and education, footer band per page with canary inside, no overlapping lines, real dashes and bullets, 9-11pt body, reading order
Поймано до мержа
Проверялись не все строки: какие-то могли залезть в полосу подвала. Теперь проверяется каждая строка абзацев и списков. 9ad18a8
Заголовок раздела мог остаться один внизу страницы. Теперь он не отрывается от первой записи. 9ad18a8
Что решил я
Две страницы вместо того, чтобы урезать разделы ради одной. Сборка падает на тексте за полями, а не выпускает его, и без новых зависимостей.
Демо VAD в кейсе Sully: услышьте 15 с → 0 прямо в своём браузере
Для посетителей
В кейсе Sully появилось демо «Скажите „алло“»: модель детекции голоса слушает микрофон прямо в браузере и показывает, за сколько миллисекунд заметила голос, рядом со старыми ~15 с тишины. Звук остаётся в памяти, а модель скачивается только после разрешения на микрофон.
Красный тест
bef91a2Add failing tests: voice VAD demo in the Sully case — trigger and privacy line EN/RU, no model or worker URL before the click, Silero v6.2.3 TS port matches ONNX on fixture audio, onset timing on a mocked probability stream, state machine across denied/no mic/unsupported/Save-Data, vad_demo in EVENTS and README
Поймано до мержа
Цифровая тишина в начале записи могла задать уровень шума. Теперь он не опускается ниже −80 dBFS. 7d8d75b
Зависшая инициализация могла оставить микрофон включённым. Теперь сторожевой таймер и тайм-аут всегда его освобождают. 7d8d75b
Уход со страницы не сбрасывал запущенное демо. Теперь оно возвращается в исходное состояние. 7d8d75b
Что решил я
Перенести Silero VAD на TypeScript вместо загрузки ONNX-рантайма, который весил бы около 3,4 МБ на каждый клик. Текст на странице прямо говорит, что в Sully выигрыш дала не быстрая модель, а то, что агент ждёт голос, а не здоровается под гудки.
Синхронизация Publora: все мои посты с августа 2025 года за один прогон, и задача бота остаётся зелёной
Для посетителей
На странице ничего не меняется, пока не смержен следующий PR бота синхронизации. Этот PR должен принести в /writing/ все мои посты из LinkedIn с августа 2025 года с полным текстом. Описания раздела «Блог» теперь говорят, что на сайте полные посты.
Красный тест
Два коммита, и каждый приносил тесты вместе с изменением: отдельного красного теста до кода нет.
Что решил я
Загрузить всё одним прогоном, около $0,04 с Haiku, с ограничением по времени вместо лимита на число постов. Один неудачный черновик пропускается с указанием причины, а не блокирует весь PR.
A tiny learned policy keeps a toy service alive while visitors inject faults
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
4ba4d26Red test: a learned policy keeps a toy service alive under visitor faults, beats doing nothing, matches a frozen runbook, and still fails honestly without the judge or beyond capacity
A /c card for the QR code on the phone case, the code on /hire, and the site's own 404
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
4d9e802Red test: /c, where the QR code on the phone case lands, is a few-kilobyte card in both languages with one booking link tagged case, a vCard, email, phone, LinkedIn and /hire, noindex, and capital /C from the code rewrites to it
Capital /C from the QR code rewrites to /c/index.html
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
10baa76Red test: capital /C from the QR code is rewritten to the file /c/index.html, which the build emits; on production the rewrite to the directory /c/ answered Vercel's NOT_FOUND for /C and /c/
EN↔RU morphs the page in place instead of reloading it
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
50805a8Red test: the language link morphs the page into its other-language twin in place, keeps the paragraph being read where it was, Back morphs it back, and a page whose structure changed falls back to a navigation; every EN page and its RU twin share one structure outside the swapped regions
A depth dial on technical posts: written for people or for engineers
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
45ec1c9Red test: a depth dial on the technical posts morphs the post into its plain-language version in place and back, keeps the paragraph being read, follows the language switch and the next visit; a post opts in with depth: true in its .md front matter or a plain version in its json
Share a quote from a post: a card, a link to the passage, and attribution on copy
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
98dda5cRed test: on a post page a selected passage gets a bar with a quote card (1080×1350 PNG) and a link to that passage as a text fragment, a copied passage pastes with the post title and that link, and the bar's words follow the language morph
No page loads between pages: view transitions and hover prefetch
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
83f81acRed test: every page opts into cross-document view transitions (not under reduced motion), the top bar stays put, a post title on /writing/ and in the inline brief flies into the post heading, home cards stay unnamed, and hovering a site link prefetches it with speculation rules, never prerender
The theme follows the system, and switching it is a light switch
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
22f3e77Red test: the theme follows the system until the visitor picks one, the button walks auto, the other theme, the same theme, auto, with the mode as its label, and a switch spreads the new theme in a circle from the press (instant under reduced motion)
The site remembers what you read, in this browser only
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
ad59052Red test: a post page remembers how far it was read, coming back offers to continue at that paragraph without moving the page, lists tag read and started posts, /writing/ offers to forget it, and none of it reaches analytics
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
6ee08deRed test: a service worker keeps the shell and every page opened, pages network first and hashed assets cache first, never /booked/ or other origins or a query; offline, a read post and home still open and an unread page gets the offline page listing what this browser can read
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
b669210Red test: the build lists posts and fingerprints /hire/ and the case pages in /changes.json; a returning visit after half an hour gets a card with the new posts and updated pages, new cards say NEW for the visit, the first visit shows nothing, and none of it is tracked
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
8970c21Red test: on a post page a small GR companion grows from one cell as far as the post is read and waits there, starts as far as a post was read before, grown it is wounded by a passing cursor and heals, sleeps at night, and loads only on post pages
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
c4eff94Red test: every post grows its own symmetric pixel creature from its slug, the same each time and different for each post, shown on its cards, grown cell by cell in its header, and as its own 1200×630 share preview
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
e73f68fRed test: while the tab is hidden its favicon wilts through six stages over a few minutes (lower and greyer each time) and the title whispers I'll wait; back on the tab both come back
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
e71a1e7Red test: Gleb now — the footer tells his time in Tbilisi (asleep at night) and the site's last commit, from git at build and fresher from GitHub once the footer is in view
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
55cba13Red test: a letter that knows the context — on /hire, WRITE ME AN EMAIL starts the letter with the posts this browser read and the offer the visitor jumped to; nothing leaves until they send it
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
90339fdRed test: print as magic — Ctrl+P on /hire is a one-page CV (A4 and Letter, EN and RU), a post prints as a newspaper page with a masthead, two ruled columns, a drop cap and link addresses; all from /print.css behind media=print
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
eb23b43Red test: shadows from real light — the cursor is the light and the hard shadows fall away from it, the same length; down-right in the middle and without JS; still under reduced motion
Мои заметки к этому PR ещё впереди: пока в карточке только то, что записано в git и GitHub.
Красный тест
e3338b2Red test: the site measures itself — the footer says how fast this page opened for this visitor (LCP, else FCP) and how: server, first paint, bytes over the network or from cache; real Performance API numbers, sent nowhere