Agents wrote the code, I did the planning. That is easy to say, so here are the receipts: every merged PR of this
site, with the test committed red before the code (all but the first PR, made before this loop), what was caught
before merge, and what I decided.
Код писали агенты, планировал я. Сказать легко, поэтому вот доказательства: каждый смерженный PR этого сайта —
с тестом, закоммиченным красным до кода (кроме самого первого, сделанного до этого цикла), с тем, что поймали
до мержа, и с тем, что решил я.
The PR count and percentages on the home page are about my work at YAGNI, not
this site. This page shows the same loop on this site’s own PRs.
Число PR и проценты на главной — про мою работу в YAGNI, а не про этот сайт.
Здесь тот же цикл на PR самого сайта.
How the loop runs nowКак сейчас устроен цикл
FramingПостановкаthe job to be done, with meкакую работу делаем — со мной
Red testКрасный тестcommitted first, failingпервым коммитом, падает
Writer agentАгент пишетan independent agent makes it passотдельный агент делает его зелёным
JudgeСудьяindependent LLM passes on the diffнезависимые LLM-проверки диффа
FixФиксthen browser and perf checksпотом браузер и perf
MergeМержby me, the humanделаю я, человек
Judge and fix repeat until every confirmed finding is fixed. Highlighted steps are mine. The loop grew over these
PRs: a card mentions a review only where its PR says one ran.
Судья и фикс повторяются, пока не исправлено каждое подтверждённое замечание. Выделенные шаги — мои. Цикл
складывался по ходу этих PR: ревью упомянуто в карточке, только если о нём сказано в самом PR.
11
Merged PRsСмерженных PR
10/11
Red test firstКрасный тест первым
10
Findings highlightedВыделенных находок
31
Commits, no mergesКоммитов без мержей
Every PR, oldest firstВсе PR, от первого
PR #1 · mergedсмержен
Restructure the site so a visitor sees who, what and how to reach me first, and can tell what is clickable
For visitorsДля посетителей
The first screen shows who I am, what I do and how to reach me. Only clickable things cast a shadow. Four sections that repeated each other became one experience timeline.Первый экран сразу говорит, кто я, чем занимаюсь и как со мной связаться. Тень есть только у того, на что можно нажать. Четыре раздела, которые повторяли друг друга, стали одной лентой опыта.
Red testКрасный тест
One commit, made before this loop existed: no red test first.Один коммит, сделанный до появления этого цикла: красного теста первым нет.
ReviewРевью
An independent review found no blockers; its confirmed findings were fixed before merge.Независимое ревью блокеров не нашло; подтверждённые замечания исправлены до мержа.
Caught before mergeПоймано до мержа
The writing filters had no aria-pressed.У фильтров блога не было aria-pressed.
Closing an architecture breakdown left ?case= in the address bar.После закрытия разбора архитектуры в адресе оставался ?case=.
The Now label had too little contrast.У метки Now был слабый контраст.
What I decidedЧто решил я
Acted on two outside reviews: a friend's UX notes and a WebGL engineer's. Kept the 3D topology in the hero, cut the sections that repeated each other.Взял в работу два внешних ревью: UX-заметки друга и отзыв WebGL-инженера. 3D-топологию в hero оставил, повторяющиеся разделы убрал.
Make the page, its JSON-LD and llms.txt agree on who I am and on the numbers
For visitorsДля посетителей
The page, its JSON-LD and llms.txt now say the same things about me: both spellings of the name, one third-person sentence, the same numbers.Страница, её JSON-LD и llms.txt теперь говорят обо мне одно и то же: оба написания имени, одна фраза в третьем лице, одни и те же цифры.
Red → greenКрасный → зелёный
9beb4f1Add a failing test that the page, its JSON-LD and llms.txt agree on who Gleb is and on the numbers → 33a22ddMake the page, its JSON-LD and llms.txt agree on who Gleb is and on the numbers
Caught before mergeПоймано до мержа
The red test pinned one name for the Kingpin −80%: it was triage time in some places and feedback analysis in others.Красный тест закрепил одно название для −80% в Kingpin: где-то это было время триажа, где-то анализ фидбека. 33a22dd
What I decidedЧто решил я
One name per fact: the Kingpin −80% is feedback analysis time everywhere, and the 28 YAGNI PRs are the first week, not the first 8 days.У каждого факта одно название: −80% в Kingpin везде время анализа фидбека, а 28 PR в YAGNI — первая неделя, а не первые 8 дней.
Make the conversion funnel measurable: Umami events + UTM on cal.com
For visitorsДля посетителей
Nothing visible. Clicks on book-a-call, email, CV and LinkedIn became countable events, and every cal.com link says where it was clicked. Extra tests pin the edge cases, such as a middle-click on a button sending nothing.Внешне ничего. Клики по созвону, почте, CV и LinkedIn стали событиями, а каждая ссылка на cal.com говорит, где на неё нажали. Пограничные случаи закреплены отдельными тестами: например, клик колёсиком по кнопке ничего не отправляет.
Red → greenКрасный → зелёный
a4c5332Add a failing test for funnel events: tracked controls, cal.com UTM, Umami helper → bc1eae5Make the conversion funnel measurable with Umami events and UTM on cal.com links
What I decidedЧто решил я
Events go to Umami Cloud: Vercel Hobby has no custom events and keeps data for a month.События отправляются в Umami Cloud: в Vercel Hobby нет своих событий, а данные хранятся месяц.
Give the hero a 5-second hook: value line, stats and an intro-call CTA above the fold
For visitorsДля посетителей
On a phone, the first screen says what I do, backs it with numbers and offers a 30-minute intro call.На телефоне первый экран говорит, чем я занимаюсь, подкрепляет это цифрами и предлагает 30-минутный созвон.
Red → greenКрасный → зелёный
4b5df6fAdd a failing test that the hero says what, proves it and asks for the call above the fold on a phone → b20962dGive the hero a 5-second hook: value line, stats and an intro-call CTA above the fold
What I decidedЧто решил я
The 28 YAGNI PRs say who did what: agents wrote 98% of the code, I did 97% of the planning.28 PR в YAGNI теперь говорят, кто что сделал: 98% кода написали агенты, 97% планирования — моё.
Gate every push on performance budgets, with a perf-watchdog agent
For visitorsДля посетителей
The site stays fast: a push that breaks a byte or Lighthouse budget is blocked before it reaches production.Сайт остаётся быстрым: пуш, который пробивает бюджет по байтам или Lighthouse, блокируется до прода.
Red → greenКрасный → зелёный
1475db1Add a failing test that the site stays within its performance budgets and a push is gated on them → 9b45487Gate every push on byte and Lighthouse budgets, and ask a perf-watchdog agent what got slower when it fails
What I decidedЧто решил я
No GitHub Actions: the gate runs on git push and blocks it.Без GitHub Actions: проверка стоит на git push и блокирует его.
With reduced motion on, the hero canvas stops redrawing once nothing moves: 180 frames per 3 seconds at rest became 0.С включённым reduced motion канвас в hero перестаёт перерисовываться, когда ничего не движется: в покое было 180 кадров за 3 секунды, стало 0.
Red → greenКрасный → зелёный
55e51efAdd a failing test for idling the hero canvas loop under reduced motion → e4db380Idle the hero canvas loop under reduced motion once the scene settles
ReviewРевью
An independent review also checked the wake-ups under reduced motion: fault and drag run to the end and then idle, and the canvas is redrawn after resize.Независимое ревью отдельно проверило пробуждения при reduced motion: сбой и перетаскивание доигрывают до конца и затихают, а после resize канвас перерисовывается.
What I decidedЧто решил я
Kept the scope to reduced motion. Two side issues, a right-click drag and the canvas font fallback, are written down in the PR, not fixed.Ограничил задачу режимом reduced motion. Две побочные проблемы, перетаскивание правой кнопкой и запасной шрифт на канвасе, записаны в PR, но не исправлены.
Give every post its own indexable page and end the brief with a next step
For visitorsДля посетителей
Every post has its own page with a title and a link you can share, and each brief ends with a next step: the next post, LinkedIn or an intro call.У каждого поста своя страница с заголовком и ссылкой, которой можно поделиться, а каждый конспект заканчивается следующим шагом: следующий пост, LinkedIn или созвон.
Red → greenКрасный → зелёный
f0b541bAdd a failing test that every post has an indexable page and the reader gets a next step → 6ff9e6fGive every post its own page, link cards to it, and end the brief with a next step
What I decidedЧто решил я
Post pages keep one book-a-call link, the reader's. No link from home to /writing/ yet: that section was being changed in another branch.На страницах постов одна ссылка на созвон, в конце конспекта. Ссылки с главной на /writing/ пока нет: этот раздел менялся в другой ветке.
The YAGNI card stops claiming 89% of PRs were agent-written; 98% of the code is the one figure
For visitorsДля посетителей
The YAGNI card no longer claims 89% of my PRs were written by agents. One agent share is left: 98% of the code.Карточка YAGNI больше не утверждает, что 89% моих PR написали агенты. Осталась одна доля агентов: 98% кода.
Red → greenКрасный → зелёный
db2be2bAdd a failing test that the YAGNI card never claims 89% of PRs and gives 98% as the one code share → 7b74687The YAGNI card drops the unprovable 89% of PRs; 98% of the code is the one agent share
What I decidedЧто решил я
Dropped the 89%: it counted agent/ branch names, so it couldn't be backed up, and it contradicted the 98%.Убрал 89%: эта цифра считала имена веток agent/, подтвердить её нечем, и она спорила с 98%.
A neural cellular automaton grows the GR monogram in Beyond the CV and heals it after the visitor cuts or bites it
For visitorsДля посетителей
Beyond the CV opens with a GR monogram grown by a small neural network. Cut it or tap it and it heals.Раздел «Вне резюме» начинается с монограммы GR, которую выращивает маленькая нейросеть. Разрежьте её или коснитесь — и она заживёт.
Red testКрасный тест
6151777Red test: a neural cellular automaton grows GR from one cell and regrows it after damage
ReviewРевью
Written by an independent writer agent and reviewed by three independent judge passes; every confirmed finding was fixed.Код написал независимый агент, дифф прошли три независимые проверки-судьи; каждое подтверждённое замечание исправлено.
Caught before mergeПоймано до мержа
A vertical cut made the G grow back as an R. Fixed by training on strokes, not only round bites.После вертикального разреза G отрастала как R. Исправлено обучением на штрихах, а не только на круглых укусах. 7f6064e
A full wipe left a dead blank square. Now it re-seeds.После полного стирания оставался мёртвый пустой квадрат. Теперь монограмма растёт заново. 7f6064e
Training could overwrite better weights. Now it only saves a checkpoint that beats the shipped one.Обучение могло перезаписать более удачные веса. Теперь оно сохраняет только чекпойнт, который лучше текущего. fdd511c
What I decidedЧто решил я
Merged with the limit written down: 11 of 720 healing checks still miss the bar, and Reset recovers. A sharper WebGL version stays a follow-up.Смержил с записанным ограничением: 11 из 720 проверок заживления всё ещё не проходят порог, Reset это исправляет. Более чёткая версия на WebGL — на потом.
Add /booked so a real cal.com booking becomes a funnel step, without leaking booking PII
For visitorsДля посетителей
After booking a call you land on /booked. The booking counts in analytics, credited to the link that led to it.После брони созвона открывается /booked. Бронь засчитывается в аналитике и привязывается к ссылке, с которой пришли.
Red → greenКрасный → зелёный
e432063Add a failing test that /booked counts a real booking by placement and leaks no booking PII → f01970dAdd /booked: a cal.com booking becomes booking_confirmed{source} with no booking PII
What I decidedЧто решил я
Count booked calls, not just clicks on Book a call, and keep none of the booking details: only the link it came from survives.Считать забронированные созвоны, а не только клики по кнопке, и не хранить данные брони: сохраняется только то, с какой ссылки пришли.
Show how this site was built: every merged PR with its red test, what was caught and what I decided
For visitorsДля посетителей
This page: every merged PR of the site with its red test, what was caught before merge and what I decided. Every number on it is computed from the data.Эта страница: каждый смерженный PR сайта с красным тестом, тем, что поймали до мержа, и тем, что решил я. Каждое число на ней посчитано из данных.
Red → greenКрасный → зелёный
48938f7Add 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 → 37af6d8Add /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
ReviewРевью
Written by an independent writer agent and reviewed by an independent judge pass: ship after fixes. Its findings were fixed before merge.Код написал независимый агент, дифф проверил независимый судья: «можно мержить после правок». Его замечания исправлены до мержа.
Caught before mergeПоймано до мержа
The hero link sat right after the YAGNI numbers and read as proof of them. Now it says it is the same loop on this site’s own PRs.Ссылка в hero стояла сразу после цифр YAGNI и читалась как их доказательство. Теперь она говорит, что это тот же цикл на PR этого сайта. 37af6d8
The page claimed a judge step for every PR, but only three PR descriptions record a review. Now a card mentions a review only where its PR says one ran.Страница приписывала шаг судьи каждому PR, хотя ревью записано только в трёх описаниях. Теперь карточка упоминает ревью, только если о нём сказано в PR. 37af6d8
The freshness test would have turned main red after every merge. Now the data records the main commit it covers.Тест свежести ронял бы main после каждого мержа. Теперь данные помнят, по какой коммит main они собраны. a5acd79
What I decidedЧто решил я
Only this site’s PRs count here: the hero’s 28 PRs are YAGNI’s, and the page says so. Each card also shows what the human decided, not only what was caught.Здесь считаются только PR этого сайта: 28 PR из hero — это YAGNI, и страница так и говорит. В каждой карточке есть и то, что решил человек, а не только то, что поймали.
If you build with agents and want a loop like this on your repo, happy to talk it through.Если вы работаете с агентами и хотите такой же цикл в своём репозитории — давайте обсудим.