Проекты03 / 05
Неофициальный справочник по GTA 6, где факт — это запись, а не предложение: четыре статуса, цепочка источников, и статус нельзя сменить без причины с датой.
thecity.gg

- Продукт
- Неофициальный справочник по GTA 6; не связан с Rockstar Games и Take-Two
- Роль
- Разработка: контент-модель, сайт, админ-панель, хостинг
- Период
- Сентябрь – октябрь 2026
- Стек
- Next.js 16, React 19, TypeScript, PostgreSQL 17, Claude API, Docker
- Онлайн
- thecity.gg
Большинство сайтов о GTA 6 смешивают официальные факты, догадки по трейлерам и слухи в одном предложении, и читатель не может отличить одно от другого. Здесь они разделены. Каждое фактическое утверждение — отдельная запись с одним из четырёх статусов (подтверждено, сообщается, слух, опровергнуто), списком источников и тем, что подразумевал каждый источник на момент появления.
Статьи ссылаются на эти записи, а не перепечатывают их. Когда слух подтверждается или умирает, запись меняется один раз, и за ней следуют все страницы, ленты и виджеты, которые её цитируют. Опровергнутое утверждение остаётся на виду, зачёркнутым. Новая дата — это новое утверждение, а не правка.
Девиз — «факты с чеками», и это буквально: смысл чека в том, что утверждение можно проверить, не доверяя магазину.
- 01
Утверждение как единица
У каждого утверждения есть формулировка, статус, источники и история, в которую можно только дописывать. Правила держит код: последняя запись истории должна совпадать с текущим статусом, каждый шаг должен начинаться там, где закончился предыдущий, а ссылку на несуществующее утверждение сохранить нельзя.
- 02
Всё выводится, ничего не ведётся вручную
Журнал изменений, RSS, страница исправлений, сайтмапы, llms.txt и Markdown-двойник каждой страницы генерируются из одних и тех же записей, поэтому ничего нельзя тихо пропустить.
- 03
Админка, которая публикует без деплоя
Каждый раздел редактируется на семи языках. Смена статуса требует причины в одно предложение, эта причина становится публичной строкой журнала, и без неё сохранение отклоняется. Каждое сохранение проверяет весь сайт в том виде, в каком он будет после него.
- 04
Семь языков
Английский, немецкий, французский, испанский, японский, китайский и хинди. Перевод идёт через Claude с одной главной инструкцией: не добавлять, не смягчать и не усиливать ни одно утверждение. Машинные переводы подписаны на странице как машинные.
- 05
Намеренно открыто для машин
llms.txt, JSON-эндпоинт на каждое утверждение, ленты по языкам, ClaimReview и другие структурированные данные на каждом типе страниц, а ещё встраиваемый виджет в sandbox-iframe, который не делит с хост-страницей ни кода, ни стилей.
Как это устроено
Источники
- Официальные каналы
- Видео и прессаи что каждый подразумевал на тот момент
Реестр
- Утверждениестатус, источники, история
- Валидациявесь сайт при каждом сохранении
Цитаты
- Плашки статусана страницах, по id
- [[claim:id]]живой статус внутри текста
Всё остальное
- Журнал изменений, RSS, исправления
- Виджеты, API, llms.txt

То, что обычно не попадает в портфолио. Всё это было на самом деле, и всё это есть в истории коммитов.
Сбой 01
Первая настоящая проверка реестра поймала сам реестр
- Симптом
- 29 октября в реестре появилось утверждение, что Rockstar не называла композитора. Статус: подтверждено, сверено по двум постам. В тот же день Rockstar имя назвала.
- Причина
- Когда утверждение писали, всё было верно. По словам самого сайта, оно было правдой на момент внесения и перестало быть правдой в течение суток.
- Решение
- На следующий день оно перешло Confirmed → Debunked с датированной причиной, и я прошёл одно утверждение от начала до конца: страница утверждения, Markdown-двойник, JSON, журнал изменений, RSS, исправления, виджет, llms.txt, японская версия. Всё сошлось. Это первая настоящая проверка, а не послужной список, и она показывает, где гарантия заканчивается: факт, процитированный по id, следует за реестром, а факт, набранный в тексте поста, нет. Утверждения распространяются, проза — нет.
Сбой 02
Бюджет в 1,5 секунды и исправление, отозванное через 7,5 минуты
- Симптом
- Бюджет был заложен в дизайн: LCP меньше 1,5 с на медленном 4G. Ранние цифры выглядели отлично, потому что появились раньше фотографий.
- Причина
- Первое исправление оказалось неверным, и это зафиксировано:
content-visibilityне придержал запросы картинок галереи, и через 7,5 минуты коммит взял сказанное обратно и записал настоящие цифры. Сама фотография весит 17–27 КБ. Цена складывается арифметически: задержка, потом очередь за документом, двумя шрифтами и фреймворком. - Решение
- Исправления, которое бы это спрятало, нет. Фото на первом экране выбрано осознанно, а промах записан. Замеры на сегодня: текстовые страницы 1,14–1,38 с, в пределах бюджета; страницы, которые начинаются с фотографии, 2,2–2,4 с, сверх него. Большинство сайтов такой промах закапывают. Здесь есть публичный след: неверное исправление, отзыв и заявленный компромисс.
Сбой 03
Защитная проверка, ставшая аварией
- Симптом
- Новостной пост мог упасть с HTTP 500.
- Причина
- Неверную ссылку на утверждение намеренно сделали жёсткой ошибкой, и для файлов это правильно: падает сборка, и до читателя ничего не доходит. Но новостные посты живут в Postgres и через сборку не проходят. Тот же
throwпереехал со времени сборки на время запроса, и опечатка стала живым 500. - Решение
- Одно правило стало двумя. При рендере никогда не бросать исключение: отбросить ссылку и предупредить. При сохранении отказывать и подсказывать ближайший реальный id по расстоянию редактирования. Где выполняется проверка, важно не меньше, чем что она проверяет.
Сбой 04
Как сделать «полностью статичный» сайт редактируемым без деплоя
- Симптом
- За три недели до выхода игры без сборки могли меняться только новости. Каждое исправление в утверждении означало коммит и деплой.
- Причина
- Пересборка на каждую правку медленная и тяжёлая. Перенос всего в базу выбрасывает ревью и откат из git. И сборка не видит базу, поэтому пререндеренные страницы показывали бы старую версию поверх правки редактора.
- Решение
- Три слоя. Файлы в git — основа. Строка в Postgres с ключом по точному пути файла заменяет этот файл, поэтому остальная система не знает о существовании базы. Запросы обслуживает оверлей в памяти. От пререндера отказались, а вместе с ним и от «полностью статичного». Результат: 63 из 85 живых утверждений существуют только в Postgres, добавлены в течение двух дней после того коммита, без единой зависимости от CMS.
Сбой 05
Семь языков, один макет, ни одного веб-шрифта
- Симптом
- Японский, китайский и хинди должны были уместиться в дизайн на высоких узких капсах, плотном трекинге и line-height 0,92, не выходя из бюджета производительности.
- Причина
- CJK-веб-шрифт стоит мегабайты, а типографика, определяющая внешний вид, вредит этим письменностям: отрицательный трекинг их сминает, а line-height 0,92 сталкивает строки деванагари. Дальше шли допущения, верные только для английского: порядок слов в шаблонах,
toLowerCase(), длина заголовка в символах. - Решение
- Системные шрифты для каждого языка, более высокий line-height, никакого отрицательного трекинга, японские заголовки переносятся между фразами, ширина заголовка считается в пикселях, шаблоны не зависят от порядка слов. Замеренный результат: японская главная весит на 3 КБ больше английской при том же LCP. Работа свелась к удалению допущений, а не к добавлению шрифтов.
- утверждений в реестреподтверждено 42, сообщается 34, слух 4, опровергнуто 5; 30 октября 2026
- утверждения добавлено через админку за 48 часовбез коммита и без деплоя
- URL в сайтмапахсемь языков, 43 новостных поста
- японская страница против английскойLighthouse: 424 против 421 КБ
- доступность, лучшие практики, SEOLighthouse на пяти страницах, каждый прогон; производительность 95–100
- коммитов за 8 активных днейзелёные 22 из 23 прогонов CI: линт, типы, валидация всего сайта, обход JSON-LD. Юнит-тестов нет
Пульс проекта
Каждый коммит в репозиториях проекта на одной линии. Чем выше столбик, тем жарче было.
- Движок за один вечер: утверждения, история, восемь типов страниц
- Семь языков с разницей в 31,5 минуты: инфраструктура, затем контент
- thecity.gg выходит на собственном домене
- Исправлен 500 в новостях, сайтмапы и редиректы
- Каждый раздел редактируется без деплоя
Если то, что вы публикуете, должно оставаться правдой и после публикации, единицей должна быть не страница, а факт. Та же структура подходит для прайс-листов, комплаенс-заявлений и спецификаций продуктов: для всего, что устаревает сразу в десяти местах. Если это похоже на ваш сайт, расскажите мне о нём.
Или спросите о нём цифровой разум