Пакет передається не тим, що все лежить у репозиторії, а тим, що людина, яка отримала посилання, знає, з чого почати, чому кожен екран існує двічі, яка тема головна і що станеться на порожньому списку. Ця сторінка веде до відповідей, а не переказує їх.
Одні й ті самі три адреси стоять тут і в README.md, заповнені за один прохід.
Третього місця немає навмисно.
Це клікабельний продукт, а не застосунок, і плутанина тут коштує тижня.
design/kit/docs/rollout.md, розділ C.package.json,
ані кроку збірки, ані залежностей. Сторінки відкриваються з файлової системи; інструменти
в tools/ самі піднімають статичний сервер і Chrome.cart-empty.html,
checkout-declined.html, coach-session-oos.html - не режими одного
документа, а сусідні документи. Саме тому екранів 141, а не 50.../wireframes/_nav.js: шапка, футер, таб-бар, мега-меню і кожен діалог
малюються звідти, а design/_nav.js перефарбовує зверху. Видалити
wireframes/ означає покласти всі 141 сторінку.design/, кожен його стан окремим файлом, і
реєструється рядком у design/_nav.js. Посилання на екран, якого немає в реєстрі,
автоматично переписується назад у сіре - це не баг, це uivFixLinks().Світла. Вона живе в голому :root; темна це блок
[data-theme="dark"], який перевизначає лише семантичні ролі і
жодного примітива. Ролей 98, і в кожної є обидві половини - роль без пари не існує з першого
рядка етапу 08.
design/system/theme.js застосовує збережений вибір ще до першого малювання і
знімає атрибут, коли режим не темний. Тому «світла» це відсутність
атрибута, а не його значення.auto немає за рішенням. Перемикач дає рівно два
стани; системна тема не читається навмисно.Перевіряється це не оком: node tools/theme.mjs знімає обчислений стиль у двох
темах і рахує контраст за формулою WCAG з порогами за поверхнею.
Від кореня до будь-якого артефакту хендофу - не більше двох кліків. Панель ліворуч на будь-якій сторінці це реєстр роадмепу, і вона одна на весь проєкт.
Чотири документи хендофу це .md, і посилання ведуть просто на них.
Локально і на Pages вони відкриються як текст, на GitHub - зверстаними. Це навмисно: файл, з
якого читають, і файл, який перевіряє node tools/handoff.mjs, мусять бути одним
файлом, інакше пакет знову має дві редакції одного.
| Питання | Куди |
|---|---|
| що продукт РОБИТЬ, крок за кроком | handoff/docs/behaviour.md |
| з чого зібраний екран, і що поїде від зміни токена | handoff/docs/map.md |
| що з доступності підтверджено, а що борг | handoff/docs/a11y.md |
| як додати фічу | handoff/docs/one-shot.md |
| що було незрозуміло чужому читачеві | handoff/docs/onboarding-gaps.md |
| чому будь-що з наведеного саме таке | docs/decisions.md |
| правила, які діють у наступній сесії | CLAUDE.md · design/system/CLAUDE.md |
| чим перевіряти | tools/README.md |
wireframes/ це сірий
прототип етапу 04: структура, текст і стани. Він заморожений з етапу 05 і володіє
складом екрана. design/ це та сама розмітка з кольоровим шаром і володіє
виглядом. Знайдена в сірому помилка називається вголос і лагодиться в кольоровій
копії, ніколи вгору по ланцюгу. Це історія процесу - і водночас рантайм, див. розділ 02.Екрани показують кожен стан; вони не кажуть, що між ними рухається, що стається на гілці, якої ніхто не хоче, і яка з гілок глухий кут навмисно. behaviour.md це 152 рядки специфікації, і кожен називає джерело: файл екрана, вузол флоу або вузол IA. Джерел рівно три, четвертого немає.
ia/docs/flows.md, усі п'ять описані.required.map.md знято з корпусу, а не пригадано: екран -> зона -> компонент -> токени, і зворотний список інверсією тих самих даних. Головне питання, на яке він відповідає, - «якщо я зміню цей токен, що поїде».
node tools/map.mjs --write. Ніщо в ньому
не набране руками, тож карта і прилад не можуть розійтися.a11y.md нічого не вводить: усі правила ухвалені на етапах 08-11. Чого бракувало - одного місця, яке каже, що з них істинне сьогодні і якою командою. 26 рядків: 18 підтверджено, 8 боргів.
| Найбільші борги | Сьогодні | Команда |
|---|---|---|
| текстовий зум 200% | 142 з 343 течуть убік на 1280 | accept.mjs --text200 |
| драбина заголовків пропускає щабель | 97 зі 141, одна причина | headings.mjs |
| чорнило проти свого тла | 12 форм. Було 37, з них 25 - одна пара Signal Orange, закрита рішенням власника 25.08.2026 | theme.mjs |
| немає досяжного h1 | 35 зі 141 | headings.mjs |
«Підтверджено» означає прогін сьогодні, а не пам'ять про етап, який писав правило.
Рядок, для якого прилад назвати неможливо, «підтверджено» не отримує ніколи, і це перевіряє
node tools/handoff.mjs.
Промпт лежить у файлі, і сюди він не переказаний. one-shot.md копіюється в свіжу сесію цілком, з однією заміною - рядком у кутових дужках, де називається фіча та її стани. Друга редакція того самого тексту застаріла б першою.
Він веде до всіх трьох документів пакета, а не лише до системи й голосу: без
behaviour.md нова гілка буде вигадана, без map.md токен буде взятий
навмання, без a11y.md новий екран додасть до восьми боргів замість того, щоб їх
не чіпати.
Що вже відомо і не зміниться: нове з'являється в системі першим, потім на
екрані, ніколи навпаки. У файлі екрана заборонені @media,
transition, animation, @keyframes, тег
style, атрибут style, будь-який hex, будь-який px повз токен і
клас, якого немає в системі. Але заборона стосується вигадування у файлі екрана,
а не росту: чого бракує - спершу заводиться в системі повним набором із шести частин, і аж
тоді ставиться на екран.
Обидва відкриті списки пакета адресовані людині, а не наступному етапу:
етапу після цього немає. Без адресата перший же рядок із [?] зупиняє роботу, бо нема кому його поставити.
| Клас | Скільки | Де лежить |
|---|---|---|
| числа, які потребують реальних даних | відсоток тарифу тренера, пороги лояльності, ставка нарахування, строк життя бонусів | backlog.md · sitemap.md |
| борги доступності | 8, у кожного число, яке має дійти до нуля | a11y.md |
| питання поведінки без джерела | 6 | behaviour.md |
| мертві токени і компонент, що читає примітив | 4 + 1 | backlog.md |
розбіжності всередині flows.md | 3 | onboarding-gaps.md |
Зведений список один - розділ «Idle control» в onboarding-gaps.md тримає число рядків, скільки з них закрито і скільки адресовано власнику. Він і є тим єдиним місцем, якого бракувало.
Сьогодні таких рядків 12, і це число теж рахує
node tools/handoff.mjs, а не рука. До 25.08.2026 тут стояло «11» - при списку з
дванадцяти імен і тринадцяти рядках, що насправді називали власника. Число, яке нікому
підтримувати, або прибирається, або дістає прилад; це дістало прилад.
Рішення, прочитане як діра, коштує стільки ж, скільки діра. Тому кожне з них назване і має причину.
sitemap.md «Open items» і cjm-to-be.md Backlog P2. Ця сторінка називала його третім ім'ям і в переліку викресленого - помилку знайшов перший же агент, який будував за one-shot.md.Повний перелік із причинами - backlog.md і розділ «Backlog» у flows.md.
Етап стоїть на читачеві з чистим контекстом, а не на уяві. Нижче - зведення класами, з колонкою «хто знайшов»: чотири незалежні набори, і кожен бачив те, чого не бачили решта.
| Хто | Що читав | Знахідок |
|---|---|---|
| розкотка, 18 субагентів етапу 12 | кожен - документацію 08-11 під СВІЙ екран | 123 питання, зведені в 9 класів; 5 з них доїхали сюди |
| аудитор кроку 1, чистий контекст | продукт ЦІЛКОМ, із забороненими логами критики | 3 діри + 12 висновків, з них жодного «зрозумів неправильно» |
| кроки 2-6, прилади | власні гейти пайплайну | 34 знахідки, і 20 з них - про самі прилади |
| два іспити кроку 7 | кожен будував фічу з one-shot.md, не знаючи репозиторію | 18 і 16 - та сама довжина, і це означає, що хендоф не завершений |
| Клас | Скільки | Приклад | Стало |
|---|---|---|---|
| Зелений лічильник, який не бачить свого класу | найбільший клас етапу | дванадцять власних списків inventory.mjs не могли зробити його вихід червоним; карта покриття зелена, не бачачи чотирьох нових екранів; прилад фокуса ніколи не ходив темною темою | вирази виходу переписані, питання дописані, і біля кожного названо, що зробило б його червоним |
| Одне число у трьох редакціях прози | 4 місця | кількість компонентів: README казав 84, why.html 84, kit.html 93, на диску 94 | оголошений список місць, кожне переписується з таблиць, і питається в обидва боки |
| Правило в прозі без перевірки під ним | 4 правила | «посилайся, не дублюй», «підтверджено означає прогін», «не більше двох кліків», арифметика самого журналу | чотири нові прилади: handoff.mjs, map.mjs, headings.mjs, clone-test.mjs |
| Документ, що описує продукт, якого вже немає | 6 місць | стенд описував ширину, знятої на 12.9; пакет казав, що фічі немає, а форма стоїть з етапу 08; ця сторінка називала фічу третім ім'ям і в переліку викресленого | виправлено в кожному, і причина названа: додавання застарює сусідів так само, як ремонт |
| Прилад, що працює лише на одній машині | 1 | motion-row.mjs ніс домашню теку автора константою чотири етапи | тест чистого клону - єдиний прилад, який читає репозиторій ЗЗОВНІ |
| Два документи, що суперечать один одному | 5 пар | E10 у двох IA-документах це дві різні фічі; job 3 проти Job 4; цикл споживання [?] проти числа на екрані | названо в behaviour.md і в беклозі; лікує власник, бо це рішення, а не друкарська помилка |
| Правило, яке неможливо виконати | 1 | «новий екран не має додавати до боргів доступності» - борг E2 пише футер замороженого рантайму, тож його успадковує кожен екран у мить створення | переписано на виконанне: не додавати нової ПРИЧИНИ, і довести це виміром проти сусіда |
Чотири поломки знайдено оком, коли всі гейти вже були зелені - ціна, що ламається між числом і знаком гривні на підлозі; скелетон, який обіцяє менше рядків, ніж віддає завантажений стан; назва товару в шість рядків; одна дія під двома іменами. Прилади це підлога, а не вердикт, і one-shot.md тепер каже це з цими чотирма як прикладом.
Детектор образів дав 3 попередження, і 2 з них зняті на перевірці: бічна
кольорова смуга на врізці справді є характерним знаком, але в цьому проєкті вона вже
мова - voice/voice.html носить її з етапу 05. Третє було справжнім: правило
.stop не вживалось на сторінці жодного разу і знято.
Повний журнал із верифікацією кожного рядка -
onboarding-gaps.md: 63 замовлення, 39 закрито,
24 відкрито, і ці три числа рахує node tools/handoff.mjs, бо в файлі, чия
тема - «число, якого ніхто не підтримує», вони були набрані рукою і розійшлись.