Реестр
Реестр обещаний
- 70
- Строк в реестре
- 2233
- Автоматических проверок
- 7
- Областей в одном прогоне
- 7
- Сторожей у самого реестра
Утверждение без опоры это первый шаг ко лжи
Сайт с кодом сверяли дважды, и оба раза находили одно и то же: продукт обещал то, чего нет.
Дороже всего обошлось одно слово: поддержка. Оно стояло в каждом тарифе, за него просили деньги. А места, куда попало бы обращение, не было нигде: ни ящика, ни очереди, ни экрана.
Из того же чтения вышли ещё две находки. Редактор отпечатка рисовал согласованную машину, а профилю выдавал сочетание, какого не бывает. Таблица тарифов обещала массовые действия над профилями, а в кабинете такого экрана не было.
Никто не писал эти строки, чтобы обмануть. Так выходит, когда текст витрины и код расходятся, а сборка этого не замечает. Расхождение записали, и теперь за ним следит программа.
Поддержка в каждом тарифе
Продавалась во всех четырёх тарифах и не была сделана нигде. Теперь она в apps/server/src/support/support.service.ts, стенд apps/server/test/поддержка.js.
Машина, какой не бывает
Редактор показывал согласованное устройство, а выдавал невозможное. Теперь выбор и результат судятся по одним правилам.
Массовые действия в прайсе
Обещаны в таблице тарифов, в кабинете отсутствовали.
В строке три вещи: обещание, файл, стенд
Формат ровно один, и ничего другого в него не влезает: что обещано, где выполнено, чем стережётся. Строка, которая объясняет вместо того, чтобы указать файл, программе не по зубам.
Средний столбец это путь, который можно открыть, а не папка и не название подсистемы. Правый это исполняемый стенд: файл, который гоняет код и краснеет, когда поведение ломается.
Сам реестр лежит в docs/РЕЕСТР-ОБЕЩАНИЙ.md и разбит на семь частей: движок и отпечаток, прокси и сеть, команда и доступ, деньги, поддержка, программа, сайт.
- 1
Прочитать обещание
Возьмите строку «Прокси покрывает весь трафик профиля, а не только https».
- 2
Открыть файл
apps/desktop/src/lib/forkEngine.js: там это правило записано для движка.
- 3
Запустить стенд
apps/desktop/test/proxy-covers-https.js исполняет его и судит, что именно уходит через прокси.
- 4
Сломать нарочно
Сузьте правило обратно до https, запустите стенд снова, посмотрите на красное и верните код.
Четырнадцать строк из семидесяти, как они написаны
Строки взяты из файла без переписывания. Пути отсчитываются от корня репозитория, и каждый из них существует сегодня.
Разброс выбран нарочно: движок, сеть, команда, деньги, поддержка, программа, языки. В каждой части реестра строки устроены ровно так же.
- Движок и отпечаток
- 14
- Прокси и сеть
- 11
- Команда и доступ
- 3
- Деньги
- 12
- Поддержка
- 4
- Программа
- 21
- Сайт
- 5
Всего семьдесят строк, сосчитано по docs/РЕЕСТР-ОБЕЩАНИЙ.md.
| Обещание | Где выполнено | Чем стережётся |
|---|---|---|
| Отпечаток подменяется внутри движка: правки лежат в самом Chromium и применяются при сборке | engine/patches/series | apps/desktop/test/engine-patches-real.js |
| Каждый профиль это отдельная машина: свои ядра, память, видеокарта | packages/shared/src/index.js | packages/shared/test/выбор-редактора-полон.js |
| Машина профиля не меняется от запуска к запуску | packages/shared/src/index.js | packages/shared/test/поколение-3-заморожено.js |
| Часовой пояс и язык согласованы со страной прокси | packages/shared/src/index.js | apps/desktop/test/fingerprint-consistency.js |
| Профиль не открывается без своей защиты | apps/desktop/src/main/main.js | apps/desktop/test/дыры-движка-закрыты.js |
| Прокси с паролем работает, и пароль не уходит в командную строку | apps/desktop/src/lib/proxyAuthBridge.js | apps/desktop/test/proxy-auth-bridge.js |
| Прокси покрывает весь трафик профиля, а не только https | apps/desktop/src/lib/forkEngine.js | apps/desktop/test/proxy-covers-https.js |
| Профиль с настроенным, но неприменимым прокси не открывается | apps/desktop/src/main/main.js | apps/desktop/test/leak-verdict.js |
| Профиль занят на другой машине: второй сессии не будет | apps/desktop/src/main/main.js | apps/desktop/test/profile-busy.js |
| Платный тариф выдаётся только за настоящие деньги | apps/server/src/billing/billing.service.ts | apps/server/test/paid-access.js |
| Цены на витрине считаются из сетки тарифов, а не пишутся руками | apps/web/components/pricing/PricingTable.tsx | apps/web/test/страница-возможностей.js |
| Поддержка: обращению есть куда попасть | apps/server/src/support/support.service.ts | apps/server/test/поддержка.js |
| Предел одновременно открытых считается по памяти машины | apps/desktop/src/lib/engine-config.js | apps/desktop/test/предел-открытых.js |
| Все двадцать два языка целы и не перепутаны | apps/desktop/src/i18n/messages.js | apps/desktop/test/i18n-integrity.js |
Правило короткое: нет строки, нет выкладки
Написать реестр мало. Документ, который никто не исполняет, гниёт за месяц, а этот сгнил бы быстрее прочих: именно тут удобнее всего тихо поправить неудобную правду.
Поэтому у реестра есть свой стенд. apps/web/test/реестр-обещаний.js разбирает таблицу из разметки и делает о ней семь утверждений. Он идёт внутри набора сайта, вместе со всем остальным.
Четыре утверждения о существовании: файл на месте, стенд на месте, ни одна клетка не пуста, файл и стенд не один и тот же путь. Обещание, которое стережёт само себя, не стережётся вовсе.
Три сложнее. Разбор обязан найти хотя бы тридцать строк, иначе сломанный разборщик выдаст пустой реестр за чистый. Каждый названный стенд обязан стоять в команде прогона своей части. И шесть слов обязаны уцелеть в реестре: поддержка, отпечаток, прокси, приглашение, платный тариф, цены.
Реестр разобран и он не пуст
Не меньше тридцати строк, иначе сломанный разбор прочитался бы как чистый реестр.
Каждое обещание называет живой файл
Путь отсчитывается от корня репозитория и обязан существовать на диске.
Каждое обещание называет живой стенд
То же правило для столбца со сторожем.
Каждый стенд действительно входит в прогон
Имя файла обязано стоять в команде прогона своей части либо попадать под её образец.
Сторож достаёт до файла, который стережёт
Самое трудное из семи. Ему отведён отдельный раздел ниже.
В реестре нет пустых мест
И файл не совпадает со сторожем: обещание не может быть собственным доказательством.
Самые дорогие обещания названы поимённо
Поддержка, отпечаток, прокси, приглашение, платный тариф, цены. Пропало одно, стенд падает и говорит какое.
Правило
Тише всего ломается сторож, который стережёт не то
Файл жив, стенд жив, прогон зелёный, а стережёт стенд совсем другое. Так у нас и было, и на экране об этом ничего не говорило.
Строка про автоматическую смену адреса называла сторожем proxy-rotation.js. Тот файл исполняет proxies.js. А сам proxyRotate.js не исполняла ни одна проверка в репозитории. Обещание с витрины жило без доказательства.
Теперь стенд требует, чтобы сторож доставал до своего файла. Он читает исходник сторожа, сперва срезает примечания и требует, чтобы файл был назван. Примечания срезаются потому, что строка «см. proxyRotate.js» это не исполнение. Ровно так однажды осталась зелёной проверка движка, из-под которой вырезали весь блок шума WebGL.
Исключений два, и оба узкие. Стенд из apps/server/test, который сам поднимает настоящий сервер, исполняет сервер целиком; нужны оба признака сразу, а не один. Файл из packages/shared подключают по имени пакета, поэтому упоминание @armanos/shared засчитывается.
Ещё одно правило выросло из моей же ошибки. Совпадением считалось имя файла без расширения. Для packages/shared/src/index.js это строка «index», которая встречается в любом вызове indexOf. Слишком короткие корни теперь отвергаются сразу: index, api, main, utils, types, config.
По имени
Исходник сторожа называет путь, имя файла или корень имени, который не настолько общий, чтобы ничего не значить.
По живому серверу
Стенд из apps/server/test, который сам поднимает сервер, исполняет его целиком, включая названный файл.
По имени пакета
Файлы packages/shared подключают как @armanos/shared, и требовать путь значило бы требовать того, чего в коде не пишут.
Проверка, которую никто не зовёт, хуже ненаписанной
Написанная проверка, которую не зовёт ни одна команда, создаёт чувство, что место прикрыто. Это хуже пустого места: туда перестают возвращаться.
scripts/все-ли-проверки-в-прогоне.js идёт первым во всём прогоне и не исполняет ни строчки продукта. Он только сверяет файлы проверок на диске с тем, что команды действительно зовут.
Раньше он помнил четыре области, а их семь. Эта слепота спрятала две настоящие дыры. У командной строки был настоящий стенд на двадцать девять проверок, который не звали ни разу. У набора для JavaScript, названного на этом сайте нашим преимуществом, команда прогона указывала на файл, которого не существовало ни одного дня.
Теперь области считаются из списка рабочих областей, а не помнятся. Сторож отвергает команду, зовущую отсутствующий файл, и образец, не находящий ничего. И он проверяет, стоит ли он сам в корневой команде: у сторожа, которого никто не зовёт, та же болезнь.
Есть одно честное исключение, и оно объявляет себя само. Замеру, открывающему восемь настоящих браузеров, не место в прогоне, который обязан идти на любой машине. Такой файл несёт строку о том, что он замер, и причину не короче двадцати знаков, а в конце сторож печатает все такие файлы поимённо. Молчаливый список исключений гниёт, напечатанный перечитывают.
Проверка на диске, которую не зовёт ни одна команда
Названа в отказе вместе с областью, к которой относится.
Команда, зовущая файл, которого нет
Случай набора разработчика: путь был мёртв с первого дня и выглядел покрытием.
Образец, не находящий ни одного файла
Пустой образец гоняет ноль файлов и печатает зелёное.
Область, которой нет в корневой команде
Тогда «всё зелено» означает «зелено не всё».
Проверка, дописанная после итоговой строки
Она исполняется, печатается и в счёт не идёт. Это стережёт отдельно apps/desktop/test/checks-really-run.js.
Каждое число на сайте измерено, а не написано пальцем
На главной сказано, сколько автоматических проверок. Такое число легко написать и легко забыть, когда оно перестанет быть правдой.
Поэтому оно считается. apps/web/scripts/сосчитать-проверки.js гоняет три набора, считает строки ok и пишет apps/web/measured.json. Страница берёт числа только оттуда.
Красный прогон не пишет ничего. Если набор упал, сценарий называет его и выходит до записи. Иначе на главной оказалось бы число из сломанного набора. apps/web/test/proof-strip.js судит, что выход в исходнике стоит раньше записи, а не только задуман так.
Два числа берутся прямо из кода, а не из подсчёта строк. Число замеров самопроверки получают так: строят отпечаток и спрашивают у модуля проверки, сколько замеров он ждёт. Число языков это число словарей на диске. Сторож выводит оба заново и сличает.
Цены и нормы этой дорогой не идут вовсе. Таблица тарифов берёт PLANS, TEAM_SEAT_PRICE и EXTRA_PROFILE_PRICE из packages/shared, из того же пакета, по которому программа решает, что вам разрешено. Страница загрузки берёт число профилей бесплатного тарифа у самого тарифа. Двойку, тройку и двести никто в страницу не вписывает.
- Автоматических проверок
- 2233
- сервер
- 440
- программа
- 1602
- сайт
- 191
- Замеров отпечатка
- 25
- Языков в программе и на сайте
- 22
Содержимое apps/web/measured.json. Пересчитать: node scripts/сосчитать-проверки.js из apps/web.
Проверка доказывается возвратом дефекта
Зелёная проверка, которая не умеет покраснеть, не стоит ничего. Поэтому способ один и он скучный. Сломать поведение в коде продукта ровно так, как оно ломается на самом деле. Запустить проверку. Увидеть красное и убедиться, что причина та самая. Вернуть код и увидеть зелёное.
Это не обряд. Так находятся настоящие дефекты. Сервер отвечал «мало прав» на негодный ключ и тем сообщал нападающему, что ключ узнан. Поблажка для своей машины открывала всю местную сеть. Пароли входа лежали в файле открытым текстом.
Так же вскрывается и моя собственная плохая работа. Три моих возврата дефекта оказались негодными: один бил в недостижимую строку, другой ломал чужое поколение отпечатка, третий ломал разбор вместо поведения. Прежде чем верить красному или зелёному, убедитесь, что сломали именно то и именно так.
У соседней ловушки свой сторож. Проверки, дописанные ниже итоговой строки стенда, исполняются и печатаются, но в счёт не идут: файл выходит зелёным с провалом на экране. apps/desktop/test/checks-really-run.js читает все стенды и такую форму отвергает.
- 1
Сломать
Вернуть дефект в файл продукта ровно тем способом, каким он случался.
- 2
Запустить стенд
Он обязан покраснеть, и сообщение обязано назвать настоящую причину.
- 3
Прочитать сообщение
Стенд, покрасневший не по той причине, не доказывает ничего.
- 4
Вернуть
Поставить код на место и убедиться, что снова зелено.
Чего не удалось измерить, записано как неизмеренное
Реестр это не только список работающего. В нём целиком лежат два места, где измерение не получилось.
WebGPU на Windows. Приёмка движка Windows дала «не принято» на одном стенде из пяти. На арендованной машине нет видеокарты, и Chromium выключает саму возможность WebGPU на уровне сведений о железе, до всякого выбора поставщика. В шести случаях запуска navigator.gpu отсутствовал целиком. Значит заплата, закрывающая чтение пикселей через WebGPU, на Windows никем не проверена, и сайт не утверждает о ней ничего.
Голоса синтеза речи на Linux. Первая запись винила вырезанный обновлятель компонентов, и это было неверно. Шесть замеров дали настоящий ответ. Chromium держит путь к системному синтезу за доводом запуска, которого настоящий Chrome не ставит, и у настоящего Chrome на Linux голосов тоже ноль. С доводом их 13363, а столько не бывает ни на одной живой машине. Значит наш ноль равен норме площадки, и проверку приёмки исправили: она спрашивает незасеянный движок.
Обе записи называют свои журналы. Замеры Windows лежат в docs/замеры/webgpu-windows-04-09.log и docs/замеры/gpu-status-windows-04-09.log, приговор и журнал приёмки в docs/замеры/приёмка-windows-02-09.json и одноимённом .log. Машину можно удалять, не теряя приговора.
Непроверенное не равно исправному
Чего в реестре нет, того мы и не обещаем
Реестр это заодно список того, что не продаётся. Если у вещи нет строки, это не обещание, и рассчитывать на неё не стоит.
Оплата картой. Касса написана под платёжный сервис и остаётся мёртвой, пока не дадут ключи. Без ключа сервис не создаёт клиента и отвечает, что платежи не настроены. Сервис ещё не выбран, поэтому здесь никто не обещает кнопку оплаты, которая сегодня спишет деньги с карты.
Подпись и нотаризация. Сборка под macOS уже идёт с усиленной средой выполнения и правами доступа, а это то, что нужно нотаризации; в сборке под Windows записано имя издателя. Ни та, ни другая не подписана. Опознаватель подписи и доступы Apple оставлены пустыми, чтобы неподписанная местная сборка собиралась. Пока сертификатов нет, при первом запуске человек увидит предупреждение системы.
Правовые документы. Оферты и правил возврата нет. Они нужны, чтобы принимать деньги, а не чтобы работала программа, и платёжный сервис потребует их при подключении.
Перепродажа прокси. Магазин прокси это отобранный справочник поставщиков плюс запись намерения о заказе. Создание заказа не берёт денег и не ходит ни в чей API. Реестр стережёт здесь другое: значок «наш поставщик» горит только там, где выдача действительно работает, а сегодня этот список пуст.
Оплата картой
Написана под платёжный сервис, без ключей мертва. apps/server/src/billing/stripe.service.ts.
Подпись и нотаризация
Усиленная среда и права доступа заданы, сертификата нет. apps/desktop/electron-builder.yml.
Оферта и правила возврата
Не написаны. Нужны для приёма денег, а не для работы программы.
Перепродажа прокси
Заказ это записанное намерение: денег не берёт, к поставщику не ходит. apps/server/src/proxy-store/proxy-store.service.ts.
Чего это не делает
- Строка в реестре не обещает, что ничего не сломается. Она говорит, что проверка есть и она идёт, а не что она покрывает все случаи.
- Стенд реестра судит устройство, а не правду. Он не знает, о том ли самом судит названный стенд. Это видит только человек, читающий стенд.
- Число 2233 это три набора: сервер, программа, сайт. Общий пакет, командная строка и два набора разработчика идут в той же команде и в это число не входят.
- Здесь нигде не сказано, что площадка не может распознать профиль. Стережётся разделение профилей и машина, которая не меняется.
- Строки реестра написаны в репозитории по-русски. Эта страница их переводит, подлинник лежит в файле.
- WebGPU на Windows не проверен и останется непроверенным, пока его не измерят на машине с настоящей видеокартой.
Как проверить
В каждой строке слева утверждение, справа файл или стенд, на котором оно держится.
- Реестр это файл в репозитории, а не страница, написанная для вас
- docs/РЕЕСТР-ОБЕЩАНИЙ.md
- Строка с мёртвым файлом или мёртвым стендом роняет прогон
- apps/web/test/реестр-обещаний.js
- Стенд, не достающий до названного файла, отвергается
- apps/web/test/реестр-обещаний.js, проверка «сторож достаёт до файла, которым обещание выполнено»
- Ни одна написанная в дереве проверка не остаётся вне прогона
- scripts/все-ли-проверки-в-прогоне.js
- Числа на сайте приходят только из зелёного прогона настоящих наборов
- apps/web/scripts/сосчитать-проверки.js · apps/web/test/proof-strip.js
- Проверка, дописанная после итога стенда, не считается и отвергается
- apps/desktop/test/checks-really-run.js
Возьмите одну строку и сломайте её сами
Доводом служит репозиторий. Поставьте программу, откройте файл, названный в строке, и запустите стенд, который стоит рядом.