Дороги, які нікуди не вели
Атлас був повен речей, які щось обіцяли й нічого не відкривали: цифри без списків, кнопки з розбитими якорями, шістсот назв одним списком і скрипт, що падав замість сказати, що не так.
Цей запис — перший, написаний того самого дня, який він описує, і перший, під яким стоять коміти. Усе, що стоїть під ним у переліку, зібрано заднім числом; звідси й далі журнал веде день.
День вийшов про одну річ, хоч спершу так не виглядало. Атлас був повен місць, які щось стверджували і нікуди не вели.
Хто знайшов усе, що нижче
Далі в цьому журналі людина, чий це атлас, називається «6 в 1». У звичайній команді її роботу розділили б між шістьма: власник проєкту, продуктовий власник, що задає обсяг і технічні обмеження, QA, реліз-менеджер, координатор паралельних сесій, головний редактор. Тут це одна людина.
Це не титул, а пояснення до всього, що нижче. Жодної з описаних дірок не знайшли ні я, ні тести: гейти були зелені, CI зелений, сторінки виглядали правильно. Їх знайшов той, хто відкрив сайт і натиснув.
Чотири цифри, які нічого не відкривали
На головній сторінці стояли чотири числа: записи на осі, люди, організації, джерела. Кожне називало щось, що колекція нібито тримає, і жодне не можна було відкрити. Читач мав повірити на слово — а це саме те, чого атлас обіцяє не робити.
Тепер цифр п’ять, і кожна веде до свого списку. П’ята — моделі й продукти: 168 сутностей, майже третина всього, що колекція називає, не показувалися ніде взагалі.
Списки зроблено по одному на категорію, а не по сторінці на сутність. 178 із 228 людей названо рівно в одному записі, 596 із 610 джерел цитує один запис: окремі сторінки були б двома тисячами сторінок з одним посиланням на кожній. У списку рядок з одним посиланням чесний, сторінкою — це наповнювач.
Разом із цим ожили імена на сторінці запису. Вони були одним рядком, склеєним крапками, — кожна людина й організація на сторінці глухий кут. Тепер кожне веде на свій рядок у покажчику, де перелічено інші записи з тим самим іменем.
Кнопки, які не працювали взагалі
У каталозі вгорі стояв ряд кнопок із десятиліттями. Жодна з них не робила нічого: посилання вело на #1940s, а такого ідентифікатора на сторінці не було — заголовок десятиліття звався heading-1940s. Дев’ять кнопок, жодного натискання з наслідком.
Заразом виявилося, що каталог читався назад. Він успадкував порядок осі, де читач стоїть у теперішньому й дивиться назад, — але каталог не цей вигляд: це вся колекція, викладена від краю до краю, а історія від краю до краю читається вперед.
І третє, про яке сказав «6 в 1»: кнопка закидає всередину десятиліття, а вибратися звідти нема як. Тепер кожне десятиліття несе власний вихід просто під заголовком — щонайбільше чотири посилання: крок в обидва боки й два краї. Краї зникають там, куди вже дістає крок, тож жоден ряд не пропонує те саме місце двічі.
Шістсот назв одним списком
Бібліографія була повна й безформна: 610 джерел за абеткою назви, без жодного орієнтира. «6 в 1» назвав це супом, і це точний опис.
Тепер їх три розділи за типом документа: 408 першоджерел, 127 вторинних, 75 архівних копій. Це не лише орієнтири для скролу — це єдиний зріз, який щось каже: скільки колекція стоїть на самих документах, а скільки на чиїхось повідомленнях про них. Групування за видавцем дало б 260 груп майже по одному рядку; за роком публікації знадобився б розділ для сотні джерел без дати.
Скрипт, що падав замість казати
npm run validate:incoming не працював узагалі — падав стеком трасування. У трьох зв’язках із двох пакетів ключ звався targetCandidateId замість targetId, а це 569 проти трьох по всьому дереву. Друкарська помилка, не другий формат: сама ж перевірка читає targetId, що починається з cand-, як посилання на сусіднього кандидата, і всі три вели саме туди.
Гірше за помилку була відповідь на неї. Скрипт, чия єдина робота — назвати, що не так із пакетом, був єдиним у дереві, хто відповідав на кривий пакет стеком. Тепер він називає зв’язок і йде далі. Захищено обидва місця, що читають те поле, — латка на перше лише перенесла б падіння на друге.
Паралельно, у тому самому репозиторії
Увесь цей день поряд працювала друга сесія, яка закривала діру в робототехніці. Між Roomba 2002-го й липнем 2026-го в темі стояли майже самі безпілотні автомобілі, а про маніпуляцію й втілення не було нічого — двадцять чотири роки. Тепер у темі 61 запис замість 26, і колекція закінчує день на 460 записах.
Два агенти в одній робочій копії — це окремий досвід. Найкраще з нього: коли я переказав сусідній сесії порядок робіт від «6 в 1», вона відмовилася комітити за моїм переказом і пішла по слово до власного вікна. Це правильно. Переказ повноважень повноваженнями не є, інакше будь-яке повідомлення ставало б дозволом.
Найгірше — те, що ламалося тричі поспіль. Наповнення десятиліття згортає мітку, яка стояла окремо, у кластер; кластер не несе ідентифікатора запису й відкриває список замість картки. Кожен тест, який адресував мітку за іменем запису, від цього падав — спершу найстаріший запис 1943-го, потім Transformer, потім перша мітка 2010-х. Щоразу правило дописували коментарем біля того тесту, який саме зламався, і atlas.spec.ts уже казав його в п’яти різних місцях. Жодне з них не там, куди дивиться автор наступного тесту, — тому рахунок і три, а не один. Сьогодні воно нарешті стоїть в інструкціях, які читає кожна сесія на старті.
Дрібниця, яка стала не дрібницею того ж дня
Покажчик організацій приймає два види сутностей — організації та бренди. Бренд у схемі був, і жоден запис його не використовував; я поклав його в покажчик із приміткою, що це на той день, коли перший бренд з’явиться.
Той день настав того самого вечора. Робототехнічний прохід приніс World Humanoid Robot Games — перший бренд у колекції. Він уже в списку, і ніхто нічого для цього не робив.
Запис зроблено 20 вересня 2026 р.
Коміти, про які цей запис
ec6ea46d3de59f95aadbae39f3b3cb606f47cd7a9205fa27d75751e07b15e94