Единая защищённая админка https://admin.zoomstage.online выпущена и принята для zoomstage.online, zoompixel.ru, zoomila.ru и zoomika.ru. Runtime config.json управляется напрямую через local/SFTP, независимо от Git и публичного deploy.
Выполнено:
Формы конфигурации/UTM, применение только выбранных полей к одному/нескольким доменам; CAS, резерв/история, persistent jobs, частичный результат и безопасный retry.
Управление подключениями, pinned SSH host keys; четыре enabled/verified. Pixel RW и сохранение REG.RU-паролей выполнены по прямому разрешению владельца3765.
Первый экран — сводка фактических config/default/весов с отдельным чтением/ошибкой каждой цели.
Независимый конструктор: значение/Рандом по восьми UTM, последняя selection+точный URL сохраняются по домену, можно поменять одно поле; config/веса/default не меняются.
Редактирование requisites отключено, отображение в сводке и runtime сохранены; select-all не включает реквизиты.
Необязательное «Запомнить меня на90дней» со входа, Secure/HttpOnly/Strict cookie, абсолютный server deadline, прежний час без галочки и немедленный logout; сессии переживают замену контейнера.
Docker regression, реальные UI input/click/error/recovery, независимое review; actual bulk host4success и ZIP invalid→valid→retry только2REG→4success. Все360 публичных файлов exactmanifest, configs не менялись.
По отдельному разрешению владельца QA9 all4 архивирован0700 вне webroot, только metadata9 удалена, все исходные RAWconfig восстановлены после fullsemantic compare+CAS. Final UI4domains/sets9absent/requisitesreadonly/builderopen/noJSerrors/logout401 PASS.
Production, KB и журналы синхронизированы; обязательных остатков нет.
Релиз: preland4fc4fd8162aa75157205397f00c936302c0a68cc (main/staging), admin image preland-admin:4fc4fd8, sha256:502154855aa2db46f7cb73d0e4a67d51cfc8d6d729db593e1dc31cb405b867fa. Workflow497/job709 SUCCESS, фактический runner37/zoomzilla-prod-org. Web healthy, worker running. KBmaster1d3030d содержит спецификацию, план, размещение/приёмку и индекс.
Доказательства: output/preland22/production-remember-report.md, production-zip-report.md, production-final-report.md; compact screenshots production-zip-four-success.png и production-final-overview.png. Полный composer test (6suite) exit0, transport23, настоящий multiMiB SFTP12, отдельные review PASS. История двух реальных transport-дефектов и причины пропуска прежней проверкой записаны3771/3774/3775; отказы автоконтроля и последующие прямые разрешения3765/3773 сохранены без подмены истории.
Эксплуатационный контракт: отдельные результаты хостингов, общей транзакции между ними нет; unknown требует reread/reconcile. Архивы/backup/history сохранены; без долгой cookie новый браузер требует входа. Это ограничения контракта, незавершённых обязательных сценариев нет. Отключённые .online не реактивировались; единственный используемый .online — zoomstage.online.
Единая защищённая админка https://admin.zoomstage.online выпущена и принята для zoomstage.online, zoompixel.ru, zoomila.ru и zoomika.ru. Runtime config.json управляется напрямую через local/SFTP, независимо от Git и публичного deploy.
Выполнено:
- [x] Формы конфигурации/UTM, применение только выбранных полей к одному/нескольким доменам; CAS, резерв/история, persistent jobs, частичный результат и безопасный retry.
- [x] Управление подключениями, pinned SSH host keys; четыре enabled/verified. Pixel RW и сохранение REG.RU-паролей выполнены по прямому разрешению владельца3765.
- [x] Первый экран — сводка фактических config/default/весов с отдельным чтением/ошибкой каждой цели.
- [x] Независимый конструктор: значение/Рандом по восьми UTM, последняя selection+точный URL сохраняются по домену, можно поменять одно поле; config/веса/default не меняются.
- [x] Редактирование requisites отключено, отображение в сводке и runtime сохранены; select-all не включает реквизиты.
- [x] Необязательное «Запомнить меня на90дней» со входа, Secure/HttpOnly/Strict cookie, абсолютный server deadline, прежний час без галочки и немедленный logout; сессии переживают замену контейнера.
- [x] indpic UI/ZIP90 из CPanel, серверная проверка размеров/форматов/безопасных путей/лимитов; SFTP inbox, manifest CAS, backup/journal/recovery.
- [x] Docker regression, реальные UI input/click/error/recovery, независимое review; actual bulk host4success и ZIP invalid→valid→retry только2REG→4success. Все360 публичных файлов exactmanifest, configs не менялись.
- [x] По отдельному разрешению владельца QA9 all4 архивирован0700 вне webroot, только metadata9 удалена, все исходные RAWconfig восстановлены после fullsemantic compare+CAS. Final UI4domains/sets9absent/requisitesreadonly/builderopen/noJSerrors/logout401 PASS.
- [x] Production, KB и журналы синхронизированы; обязательных остатков нет.
Релиз: preland4fc4fd8162aa75157205397f00c936302c0a68cc (main/staging), admin image preland-admin:4fc4fd8, sha256:502154855aa2db46f7cb73d0e4a67d51cfc8d6d729db593e1dc31cb405b867fa. Workflow497/job709 SUCCESS, фактический runner37/zoomzilla-prod-org. Web healthy, worker running. KBmaster1d3030d содержит спецификацию, план, размещение/приёмку и индекс.
Доказательства: output/preland22/production-remember-report.md, production-zip-report.md, production-final-report.md; compact screenshots production-zip-four-success.png и production-final-overview.png. Полный composer test (6suite) exit0, transport23, настоящий multiMiB SFTP12, отдельные review PASS. История двух реальных transport-дефектов и причины пропуска прежней проверкой записаны3771/3774/3775; отказы автоконтроля и последующие прямые разрешения3765/3773 сохранены без подмены истории.
Эксплуатационный контракт: отдельные результаты хостингов, общей транзакции между ними нет; unknown требует reread/reconcile. Архивы/backup/history сохранены; без долгой cookie новый браузер требует входа. Это ограничения контракта, незавершённых обязательных сценариев нет. Отключённые .online не реактивировались; единственный используемый .online — zoomstage.online.
Дополнение владельца: сразу добавить загрузку новых наборов indpic на выбранный преленд. Взять за основу готовую админку и проверки редактора наборов основного сайта, скопировать/переиспользовать их вместо разработки другого UI/контракта. Сначала изучить актуальную реализацию и задачи; наборы и runtime-конфиги сохраняются прямо на выбранном хостинге вне Git. Предложенное расположение admin.zoomstage.online. Вопрос формы/полногоJSON отправлен async; инвентаризация продолжается.
Дополнение владельца: сразу добавить загрузку новых наборов indpic на выбранный преленд. Взять за основу готовую админку и проверки редактора наборов основного сайта, скопировать/переиспользовать их вместо разработки другого UI/контракта. Сначала изучить актуальную реализацию и задачи; наборы и runtime-конфиги сохраняются прямо на выбранном хостинге вне Git. Предложенное расположение admin.zoomstage.online. Вопрос формы/полногоJSON отправлен async; инвентаризация продолжается.
Уточнение владельца 25.10.2026: сырой редактор JSON не нужен. Админка должна позволять редактировать все настройки config.json через понятные поля отдельно для каждого домена, исключая ручную правку и разнос файлов по FTP. Добавить выбор одного или нескольких доменов и единую кнопку применения изменений к выбранным. При массовом применении нужны независимые результаты по каждому домену; не распространять случайно остальные настройки исходного домена. Ранее предложенный режим полного JSON отменён этим уточнением. Загрузка indpic и переиспользование интерфейса/проверок CPanel остаются в объёме задачи.
Уточнение владельца 25.10.2026: сырой редактор JSON не нужен. Админка должна позволять редактировать все настройки config.json через понятные поля отдельно для каждого домена, исключая ручную правку и разнос файлов по FTP. Добавить выбор одного или нескольких доменов и единую кнопку применения изменений к выбранным. При массовом применении нужны независимые результаты по каждому домену; не распространять случайно остальные настройки исходного домена. Ранее предложенный режим полного JSON отменён этим уточнением. Загрузка indpic и переиспользование интерфейса/проверок CPanel остаются в объёме задачи.
Подготовлен проект админки: docs/superpowers/specs/2026-10-25-preland22-admin-design.md, локальный коммит b3b14ec в изолированном worktree wt/preland21 (без push/выката). Проект учитывает последнее уточнение владельца: все поля через форму, только выбранные изменения, один/несколько доменов, независимые результаты и повтор после частичного отказа. Прямой SFTP/SSH/файловый адаптер, резерв и конфликт версий; редактор indpic и проверки90изображений из CPanel, общий ZIP для выбранных целей.
Зависимость: нынешние --stage-sets/--remote требуют совпадения runtime /N/ с Git. Независимая замена существующих наборов через админку потребует заменить именно эту часть guard проверкой фактического файлового контракта без отмены проверок кода/статических ресурсов. Изменения workflow и правил ещё не выполнены.
Builder-check отдельным ревьюером: единственный существенный вопрос — деградация проверки каталогов degr/tp/cons при недоступном основном API. В проект внесено решение исполнителя: если каталог доступен, проверяем существование; иначе разрешён номер1–9 с явной пометкой о непроверенном существовании, без ложного утверждения проверки API. Это сохраняет независимость редактирования.
Статус: проект на согласовании согласно hard gate применённого brainstorming; продуктовый код, DNS/TLS, доступы и runtime не менялись. Задача открыта, реализация/браузерная приёмка/выкат остаются впереди.
Подготовлен проект админки: docs/superpowers/specs/2026-10-25-preland22-admin-design.md, локальный коммит b3b14ec в изолированном worktree wt/preland21 (без push/выката). Проект учитывает последнее уточнение владельца: все поля через форму, только выбранные изменения, один/несколько доменов, независимые результаты и повтор после частичного отказа. Прямой SFTP/SSH/файловый адаптер, резерв и конфликт версий; редактор indpic и проверки90изображений из CPanel, общий ZIP для выбранных целей.
Зависимость: нынешние --stage-sets/--remote требуют совпадения runtime /N/ с Git. Независимая замена существующих наборов через админку потребует заменить именно эту часть guard проверкой фактического файлового контракта без отмены проверок кода/статических ресурсов. Изменения workflow и правил ещё не выполнены.
Builder-check отдельным ревьюером: единственный существенный вопрос — деградация проверки каталогов degr/tp/cons при недоступном основном API. В проект внесено решение исполнителя: если каталог доступен, проверяем существование; иначе разрешён номер1–9 с явной пометкой о непроверенном существовании, без ложного утверждения проверки API. Это сохраняет независимость редактирования.
Статус: проект на согласовании согласно hard gate применённого brainstorming; продуктовый код, DNS/TLS, доступы и runtime не менялись. Задача открыта, реализация/браузерная приёмка/выкат остаются впереди.
Владелец поручил командное выполнение с использованием superpowers, фиксацией спецификации/плана в KB, самостоятельной поведенческой приёмкой и выпуском production без дополнительных подтверждений при отсутствии новых продуктовых развилок. Продолжаем по подготовленному проекту b3b14ec. Роли объединяем по независимым областям: Yii2/PHP и Python-контракты — backend/transport; frontend/design/layout — готовый CPanel-интерфейс; indpic/QA — ZIP/файловый контракт; DevOps/Linux/Windows и интеграция — ведущий агент. Не создаём отдельного микросервиса ради каждой роли. Все решения и ограничения остаются в #22; постановка новых бизнес-правил/неоговорённого UI потребует вариантов до изменения.
Владелец поручил командное выполнение с использованием superpowers, фиксацией спецификации/плана в KB, самостоятельной поведенческой приёмкой и выпуском production без дополнительных подтверждений при отсутствии новых продуктовых развилок. Продолжаем по подготовленному проекту b3b14ec. Роли объединяем по независимым областям: Yii2/PHP и Python-контракты — backend/transport; frontend/design/layout — готовый CPanel-интерфейс; indpic/QA — ZIP/файловый контракт; DevOps/Linux/Windows и интеграция — ведущий агент. Не создаём отдельного микросервиса ради каждой роли. Все решения и ограничения остаются в #22; постановка новых бизнес-правил/неоговорённого UI потребует вариантов до изменения.
Спецификация и план опубликованы в KB master f6e6268: «Спеки/2026-10-25 Админка прелендингов 22.md», «Планы/2026-10-25 Админка прелендингов 22 — план.md», индекс обновлён. План в preland5b6b2d2. Реализуются независимые файловые области backend/frontend/runtime guard, ведущий интегрирует и выпускает.
Техническое решение: два точных bind-mount локальных сайтов исключают доступ приложения к остальному /srv/preland. Поскольку rename между bind-mount даёт EXDEV, резерв остаётся в приватном state вне webroot, локальная подготовка изображений — в скрытом .preland-admin-staging внутри того же mount, закрытом nginx/Apache; SFTP-цели используют sibling-папку вне webroot. Это сохраняет атомарную публикацию без общего mount/передачи root SSH ключа. Формулировка спецификации уточняется, публичной выдачи staging/backup нет.
Первичная интеграция: backend CAS/резерв/частичный отказ проверяются в Docker; UI RED корректно обнаружил отсутствие админки. На интеграционном builtin PHP стенде выявлена ошибка harness (router отдавал HTML вместо JS/CSS), исправлен только тестовый router. Далее настоящий browser GREEN; HTTP200 отдельно не считаем приёмкой. DNS A admin.zoomstage.online на153.76.161.93 создана в REG.RU, авторитетная зона ещё распространяется; TLS попытка получила NXDOMAIN, не заявляем готовность HTTPS.
Спецификация и план опубликованы в KB master f6e6268: «Спеки/2026-10-25 Админка прелендингов 22.md», «Планы/2026-10-25 Админка прелендингов 22 — план.md», индекс обновлён. План в preland5b6b2d2. Реализуются независимые файловые области backend/frontend/runtime guard, ведущий интегрирует и выпускает.
Техническое решение: два точных bind-mount локальных сайтов исключают доступ приложения к остальному /srv/preland. Поскольку rename между bind-mount даёт EXDEV, резерв остаётся в приватном state вне webroot, локальная подготовка изображений — в скрытом .preland-admin-staging внутри того же mount, закрытом nginx/Apache; SFTP-цели используют sibling-папку вне webroot. Это сохраняет атомарную публикацию без общего mount/передачи root SSH ключа. Формулировка спецификации уточняется, публичной выдачи staging/backup нет.
Первичная интеграция: backend CAS/резерв/частичный отказ проверяются в Docker; UI RED корректно обнаружил отсутствие админки. На интеграционном builtin PHP стенде выявлена ошибка harness (router отдавал HTML вместо JS/CSS), исправлен только тестовый router. Далее настоящий browser GREEN; HTTP200 отдельно не считаем приёмкой. DNS A admin.zoomstage.online на153.76.161.93 создана в REG.RU, авторитетная зона ещё распространяется; TLS попытка получила NXDOMAIN, не заявляем готовность HTTPS.
Выпущена отдельная админка https://admin.zoomstage.online. Production web healthy, worker running. Код9515c1c + исправление подсказки каталога48c71f3 опубликован в main/staging. Образ preland-admin:48c71f3, manifest fb4c1f8bb36f6edc143e9e51eef2d4b11066a264ea2d088a75fa9d20bf3e1d7b; это базовый образ9515c1c с единственной заменой проверенного admin.js. Runtime обоих локальных сайтов после выпуска и браузерного теста совпадает по SHA256 с исходными.
Реальная приёмка публичной админки: ввод логина/пароля → выбор stage → отображение подтверждённых групп degr/tp/cons → сохранение текущего host кнопкой → видимый успешный результат → повторное чтение. Значения не изменились, ошибок JavaScript нет. Локальная браузерная матрица, массовое применение к двум целям, UTM, ZIP, конфликт/частичный успех/восстановление и независимое review описаны выше; свидетельства в output/preland22/. Production ZIP и4цели пока не считаются проверенными.
Статус целей: stage включён и проверен; pixel смонтирован read-only, выключен для записи, root0:0:755 сохранён; ila/ika созданы с правильными root/host/pinned key, но выключены, пароли ещё не сохранены. Два конкретных запроса владельцу отправлены: разрешить chown997 только корня pixel с сохранением GID0/755 и сохранение существующих REG.RU-паролей в приватном хранилище админки; также нужен ручной вход владельца в открытую вкладку. Ответа пока нет. Автоконтроль ранее отклонил изменение владельца из-за доступа к коду/публичным файлам; обе отклонённые операции не выполнены, обхода нет.
KB master853dfd5 опубликована: актуальная спецификация/план, «Инфраструктура/Админка прелендингов — размещение и приёмка22.md», индекс. TODO/AGENT_LOG синхронизированы. Задача22 остаётся ОТКРЫТОЙ до завершения подключений и обязательной приёмки. Пароли в задачу/KB/Git/отчёты не включены.
Выпущена отдельная админка https://admin.zoomstage.online. Production web healthy, worker running. Код9515c1c + исправление подсказки каталога48c71f3 опубликован в main/staging. Образ preland-admin:48c71f3, manifest fb4c1f8bb36f6edc143e9e51eef2d4b11066a264ea2d088a75fa9d20bf3e1d7b; это базовый образ9515c1c с единственной заменой проверенного admin.js. Runtime обоих локальных сайтов после выпуска и браузерного теста совпадает по SHA256 с исходными.
Реальная приёмка публичной админки: ввод логина/пароля → выбор stage → отображение подтверждённых групп degr/tp/cons → сохранение текущего host кнопкой → видимый успешный результат → повторное чтение. Значения не изменились, ошибок JavaScript нет. Локальная браузерная матрица, массовое применение к двум целям, UTM, ZIP, конфликт/частичный успех/восстановление и независимое review описаны выше; свидетельства в output/preland22/. Production ZIP и4цели пока не считаются проверенными.
Статус целей: stage включён и проверен; pixel смонтирован read-only, выключен для записи, root0:0:755 сохранён; ila/ika созданы с правильными root/host/pinned key, но выключены, пароли ещё не сохранены. Два конкретных запроса владельцу отправлены: разрешить chown997 только корня pixel с сохранением GID0/755 и сохранение существующих REG.RU-паролей в приватном хранилище админки; также нужен ручной вход владельца в открытую вкладку. Ответа пока нет. Автоконтроль ранее отклонил изменение владельца из-за доступа к коду/публичным файлам; обе отклонённые операции не выполнены, обхода нет.
KB master853dfd5 опубликована: актуальная спецификация/план, «Инфраструктура/Админка прелендингов — размещение и приёмка22.md», индекс. TODO/AGENT_LOG синхронизированы. Задача22 остаётся ОТКРЫТОЙ до завершения подключений и обязательной приёмки. Пароли в задачу/KB/Git/отчёты не включены.
Владелец подтвердил оба конкретных действия: chown существующим UID997 только /srv/preland/domains/zoompixel.ru с сохранением GID0/755; сохранение существующих SSH/SFTP-паролей REG.RU u3695920/u3695919 в приватном хранилище админки и включение zoomila.ru/zoomika.ru. Также сообщил о выполненном ручном входе в админку. Продолжаем ранее утверждённый план: подключение, настоящая приёмка четырёх целей, KB и закрытие после проверок.
Владелец подтвердил оба конкретных действия: chown существующим UID997 только /srv/preland/domains/zoompixel.ru с сохранением GID0/755; сохранение существующих SSH/SFTP-паролей REG.RU u3695920/u3695919 в приватном хранилище админки и включение zoomila.ru/zoomika.ru. Также сообщил о выполненном ручном входе в админку. Продолжаем ранее утверждённый план: подключение, настоящая приёмка четырёх целей, KB и закрытие после проверок.
Новое уточнение владельца: первым экраном нужна сводная таблица фактических config.json всех доменов, значения/default и веса вариантов; также готовая ссылка с текущими значениями. Исследован существующий codec: внешние параметры содержат значащую цифру на5позиции,0 запускает выбор по весам; конфиг сам по себе не определяет единственную конкретную ссылку. На согласование отправлена матрица параметры×домены с default/весами и двумя ссылками «По default»/«По весам», только по сохранённым данным, дата чтения/обновление. Реализация нового UI ожидает ответа на этот продуктовый выбор, прежнее подключение/проверки продолжаются. Разрешённая смена владельца pixel выполнена точно:997:0:755, bind RW=true, runtime SHA исходные. Изолированная браузерная сессия утратила прежние вкладки, новая вкладка показывает login; запрошен повторный вход владельца, запрет чтения локального файла браузером не обходится.
Новое уточнение владельца: первым экраном нужна сводная таблица фактических config.json всех доменов, значения/default и веса вариантов; также готовая ссылка с текущими значениями. Исследован существующий codec: внешние параметры содержат значащую цифру на5позиции,0 запускает выбор по весам; конфиг сам по себе не определяет единственную конкретную ссылку. На согласование отправлена матрица параметры×домены с default/весами и двумя ссылками «По default»/«По весам», только по сохранённым данным, дата чтения/обновление. Реализация нового UI ожидает ответа на этот продуктовый выбор, прежнее подключение/проверки продолжаются. Разрешённая смена владельца pixel выполнена точно:997:0:755, bind RW=true, runtime SHA исходные. Изолированная браузерная сессия утратила прежние вкладки, новая вкладка показывает login; запрошен повторный вход владельца, запрет чтения локального файла браузером не обходится.
Дополнение владельца25.10 — сводка и независимый конструктор ссылок
Источник: текущий диалог, preland#22. Сначала владелец запросил сводную таблицу текущих config.json и ссылку. Затем отверг две готовые default/rnd ссылки: нужны списки значений или Рандом по каждому параметру, формирование ссылки и восстановление последнего выбора, чтобы изменить одно поле. Генератор ничего не меняет в конфигурации и не управляет сайтом.
Реализация: первый раздел «Сводка»; строки UTM, колонки домены, в каждой ячейке default и все варианты с весами. Чтение фактических сохранённых файлов, время чтения и обновление, отдельная ошибка цели без подмены пустыми значениями; legacy aliases и semantic enum отображаются каноническими номерами с пояснениями. Несохранённые поля редактора не подмешиваются. Мобильный экран: горизонтальная прокрутка таблицы.
Рядом отдельный «Конструктор ссылки»: домен, восемь списков indpic/theme/degr/reg/banch/tp/cons/focus, значения1..9 (дляenum только1/2) или Рандом. «Сформировать и сохранить» хранит последний выбор отдельно по IDдомена на сервере в приватном state и показывает постоянный скопируемый URL. Сохранение явное, после перезагрузки восстанавливаются выбор и последняя ссылка. Первое открытие без сохранения использует config.default лишь как начальное заполнение; далее конфиг не перезаписывает выбор. Если выбранный номер сейчас не поддерживается фактическим config/catalog, показать предупреждение о fallback, не менять выбор молча.
GET /api/link-builder?target=ID -> {ok:true,selection:null|object,url:null|string,saved_at:null|string}. POST /api/link-builder {target,selection:{все8каноническихключей:string1..9|rnd}} -> {ok:true,selection,url,saved_at}. Авторизация/CSRF общие. Enumограничения на сервере; неожиданные ключи/пропуски/неверные значения отвергаются. URL только https://<проверенныйдомен>/, параметры имеют4ASCIIсимволапрефикса+цифру(0=rnd)+шум; URL сохраняется вместе с выбором, GET не перегенерирует. Никаких заданий записи config, Transport или runtimeвызовов из генератора. Секреты не возвращаются.
План в рамках#22: (1) backend RED→GREEN, отдельный LinkBuilder.php и API; persistence/isolation/securitytests. (2) frontend общий первыйраздел+матрица+независимый генератор, meaningful UItests. (3) интеграция/review, реальный click/change/generate/reload/onefield, доказательство неизменности runtime SHA и регрессия прежнего редактора. (4) выпуск отдельной админки, проверка4подключений/ZIP, KB/итог, закрыть после полного выполнения. Backendвладеет src/LinkBuilder.php/public/index.php/tests/link-builder.php; frontend views/dashboard.php/public/assets/admin.js/css/testsUI; ведущий docs/infra/release. Старые публичные преленды/runtimeне выкатывать радиUIадминки.
## Дополнение владельца25.10 — сводка и независимый конструктор ссылок
Источник: текущий диалог, preland#22. Сначала владелец запросил сводную таблицу текущих config.json и ссылку. Затем отверг две готовые default/rnd ссылки: нужны списки значений или Рандом по каждому параметру, формирование ссылки и восстановление последнего выбора, чтобы изменить одно поле. Генератор ничего не меняет в конфигурации и не управляет сайтом.
Реализация: первый раздел «Сводка»; строки UTM, колонки домены, в каждой ячейке default и все варианты с весами. Чтение фактических сохранённых файлов, время чтения и обновление, отдельная ошибка цели без подмены пустыми значениями; legacy aliases и semantic enum отображаются каноническими номерами с пояснениями. Несохранённые поля редактора не подмешиваются. Мобильный экран: горизонтальная прокрутка таблицы.
Рядом отдельный «Конструктор ссылки»: домен, восемь списков indpic/theme/degr/reg/banch/tp/cons/focus, значения1..9 (дляenum только1/2) или Рандом. «Сформировать и сохранить» хранит последний выбор отдельно по IDдомена на сервере в приватном state и показывает постоянный скопируемый URL. Сохранение явное, после перезагрузки восстанавливаются выбор и последняя ссылка. Первое открытие без сохранения использует config.default лишь как начальное заполнение; далее конфиг не перезаписывает выбор. Если выбранный номер сейчас не поддерживается фактическим config/catalog, показать предупреждение о fallback, не менять выбор молча.
GET /api/link-builder?target=ID -> {ok:true,selection:null|object,url:null|string,saved_at:null|string}. POST /api/link-builder {target,selection:{все8каноническихключей:string1..9|rnd}} -> {ok:true,selection,url,saved_at}. Авторизация/CSRF общие. Enumограничения на сервере; неожиданные ключи/пропуски/неверные значения отвергаются. URL только https://<проверенныйдомен>/, параметры имеют4ASCIIсимволапрефикса+цифру(0=rnd)+шум; URL сохраняется вместе с выбором, GET не перегенерирует. Никаких заданий записи config, Transport или runtimeвызовов из генератора. Секреты не возвращаются.
План в рамках#22: (1) backend RED→GREEN, отдельный LinkBuilder.php и API; persistence/isolation/securitytests. (2) frontend общий первыйраздел+матрица+независимый генератор, meaningful UItests. (3) интеграция/review, реальный click/change/generate/reload/onefield, доказательство неизменности runtime SHA и регрессия прежнего редактора. (4) выпуск отдельной админки, проверка4подключений/ZIP, KB/итог, закрыть после полного выполнения. Backendвладеет src/LinkBuilder.php/public/index.php/tests/link-builder.php; frontend views/dashboard.php/public/assets/admin.js/css/testsUI; ведущий docs/infra/release. Старые публичные преленды/runtimeне выкатывать радиUIадминки.
Сводка и независимый конструктор реализованы, код2cfa2e2 опубликован в main/staging, production админки пока48c71f3. KB спецификация/план дополнены и опубликованы cfac2f2. Root проверил composer validate/test:52 regression+38 LinkBuilderunit+32HTTP PASS, включая auth/CSRF и реальную параллельность same-cookie при3sSSHbannerwait. Review: spec/code/security PASS, открытых существенных замечаний нет.
Root CUA: настоящий выбор theme2→сформировать→reload→точный URL и выбор восстановлены; изменение только focus наrnd сохраняет theme2 и даёт цифру0. Сводка содержит host/requisites/дополнительныеполя и8UTM/default/все веса, alias→канонические номера. По fresh catalog cons9 даёт корректное предупреждение об отсутствии группы, не ложное обещание fallback. Отдельная test-only offline SSH-цель: сохранённый constructor открылся за261мс, пока её колонка читалась; затем отдельная ошибка колонки, a/b остались прочитанными. Offlinefixture убран, runtimea/b SHA остались исходными. Frontend дополнительно DockerGREENx2 нового сценария1440/390+старыйeditor smoke PASS.
Исправлены найденные причины: PHPsessionlock освобождается послеauth/CSRF, сохранённыйconstructor не ждётruntime, предупреждения учитываюткаталог; browsercache возвращал старыйJS при новомHTML — CSS/JS URLs теперь содержат хеш содержимого, rootCUA послеобычногорeloadGREEN.
Операционное уточнение до выпуска: PHPсессии нынешнейслужбы хранятся в/tmp контейнера и теряются приrecreate. Поэтому ранее выполненный владельцем вход сбросился при включенииpixel RW. Переносим backingсессий в закрытый ADMIN_STATE_DIR/sessions0700 без изменения срока3600/Strictcookie/CSRF; добавляем тест новогоPHPпроцесса с тем жеcookie/sharedstate. При выпуске сохраним существующие sessionfiles приватно без вывода/расширениядоступа. Повторный вход и REGподключения пока не выполнены в доступной браузерной вкладке; секреты только в памяти CUA и вGit/KB/отчёты не попадают.
Сводка и независимый конструктор реализованы, код2cfa2e2 опубликован в main/staging, production админки пока48c71f3. KB спецификация/план дополнены и опубликованы cfac2f2. Root проверил composer validate/test:52 regression+38 LinkBuilderunit+32HTTP PASS, включая auth/CSRF и реальную параллельность same-cookie при3sSSHbannerwait. Review: spec/code/security PASS, открытых существенных замечаний нет.
Root CUA: настоящий выбор theme2→сформировать→reload→точный URL и выбор восстановлены; изменение только focus наrnd сохраняет theme2 и даёт цифру0. Сводка содержит host/requisites/дополнительныеполя и8UTM/default/все веса, alias→канонические номера. По fresh catalog cons9 даёт корректное предупреждение об отсутствии группы, не ложное обещание fallback. Отдельная test-only offline SSH-цель: сохранённый constructor открылся за261мс, пока её колонка читалась; затем отдельная ошибка колонки, a/b остались прочитанными. Offlinefixture убран, runtimea/b SHA остались исходными. Frontend дополнительно DockerGREENx2 нового сценария1440/390+старыйeditor smoke PASS.
Исправлены найденные причины: PHPsessionlock освобождается послеauth/CSRF, сохранённыйconstructor не ждётruntime, предупреждения учитываюткаталог; browsercache возвращал старыйJS при новомHTML — CSS/JS URLs теперь содержат хеш содержимого, rootCUA послеобычногорeloadGREEN.
Операционное уточнение до выпуска: PHPсессии нынешнейслужбы хранятся в/tmp контейнера и теряются приrecreate. Поэтому ранее выполненный владельцем вход сбросился при включенииpixel RW. Переносим backingсессий в закрытый ADMIN_STATE_DIR/sessions0700 без изменения срока3600/Strictcookie/CSRF; добавляем тест новогоPHPпроцесса с тем жеcookie/sharedstate. При выпуске сохраним существующие sessionfiles приватно без вывода/расширениядоступа. Повторный вход и REGподключения пока не выполнены в доступной браузерной вкладке; секреты только в памяти CUA и вGit/KB/отчёты не попадают.
Дополнение опубликовано на https://admin.zoomstage.online: первый экран — сводка фактических конфигов, затем отдельный конструктор ссылок. Код2cfa2e2 и d04b405 опубликован в main/staging; workflow493/job705 и494/job706 SUCCESS, фактический runner37/zoomzilla-prod-org.
Production-образ preland-admin:d04b405, manifest417268908e87ee3e3d621a9703f1c01e12e0896f18ec8410efcf2d5e5d7a47db. Полное дерево tracked admin скопировано из Git-архива, зависимости не менялись. Web healthy, worker running. Pixel997:0:755 с разрешённой записью, обе локальные цели включены и проверены. SHA256 stage/pixel config.json остались исходными.
Сессии теперь в постоянном state/sessions0700, файлы0600; срок бездействия3600, Strict/HttpOnly/Secure и CSRF сохранены.18 targeted проверок, повтор HTTP и независимое security review PASS. Ведущий в CUA сохранил вход и выбор после настоящей замены локального web-контейнера. На production отдельный Docker QA выполнил login/read; после замены production web тот же приватный cookie снова прошёл state/config/builder GET и logout. Это API-проверка, она не заменяет ещё не выполненную production UI-приёмку.
Существующие сессии перенесены из прежнего /tmp через закрытую root-подготовку. Первый экспорт root внутри контейнера не мог читать0600 файлы без DAC capability; до успешного повтора служба оставалась старой. Повтор от штатного UID997 выполнен, права не расширены. Идентификаторы/содержимое сессий не выводились. QA-helper сначала ошибочно отправил logout как массив[], исправлен только payload на объект{}, повтор завершился успешно.
KB master c89cb6f опубликована: актуальная заметка размещения/приёмки, спецификация и план с независимым конструктором, версии, проверки и остатки. Скриншоты с тестовыми данными: output/preland22/constructor-preview.png и overview-preview.png; подробные отчёты review/QA там же.
Открытый остаток: доступная агенту вкладка production показывает login. Владелец получил повторный запрос входа уже после исправления постоянных сессий. До него два REG.RU-подключения не сохранены/не включены; общая четырёхцелевая UI/ZIP-приёмка не выполнена. Разрешение на оба действия уже получено, повторное разрешение не запрашиваем. Задача22 остаётся открытой до завершения подключений и приёмки.
Дополнение опубликовано на https://admin.zoomstage.online: первый экран — сводка фактических конфигов, затем отдельный конструктор ссылок. Код2cfa2e2 и d04b405 опубликован в main/staging; workflow493/job705 и494/job706 SUCCESS, фактический runner37/zoomzilla-prod-org.
Production-образ preland-admin:d04b405, manifest417268908e87ee3e3d621a9703f1c01e12e0896f18ec8410efcf2d5e5d7a47db. Полное дерево tracked admin скопировано из Git-архива, зависимости не менялись. Web healthy, worker running. Pixel997:0:755 с разрешённой записью, обе локальные цели включены и проверены. SHA256 stage/pixel config.json остались исходными.
Сессии теперь в постоянном state/sessions0700, файлы0600; срок бездействия3600, Strict/HttpOnly/Secure и CSRF сохранены.18 targeted проверок, повтор HTTP и независимое security review PASS. Ведущий в CUA сохранил вход и выбор после настоящей замены локального web-контейнера. На production отдельный Docker QA выполнил login/read; после замены production web тот же приватный cookie снова прошёл state/config/builder GET и logout. Это API-проверка, она не заменяет ещё не выполненную production UI-приёмку.
Существующие сессии перенесены из прежнего /tmp через закрытую root-подготовку. Первый экспорт root внутри контейнера не мог читать0600 файлы без DAC capability; до успешного повтора служба оставалась старой. Повтор от штатного UID997 выполнен, права не расширены. Идентификаторы/содержимое сессий не выводились. QA-helper сначала ошибочно отправил logout как массив[], исправлен только payload на объект{}, повтор завершился успешно.
KB master c89cb6f опубликована: актуальная заметка размещения/приёмки, спецификация и план с независимым конструктором, версии, проверки и остатки. Скриншоты с тестовыми данными: output/preland22/constructor-preview.png и overview-preview.png; подробные отчёты review/QA там же.
Открытый остаток: доступная агенту вкладка production показывает login. Владелец получил повторный запрос входа уже после исправления постоянных сессий. До него два REG.RU-подключения не сохранены/не включены; общая четырёхцелевая UI/ZIP-приёмка не выполнена. Разрешение на оба действия уже получено, повторное разрешение не запрашиваем. Задача22 остаётся открытой до завершения подключений и приёмки.
Дополнения владельца в текущем диалоге: (1) отключить редактирование реквизитов, допустимо закомментировать; (2) добавить «Запомнить меня», выбран срок90дней. Решение: requisites остаются видны в сводке и сохраняются в runtime, но не создают редактируемых полей и не входят в «Выбрать все поля». Меняем именно UI-редактор, существующие значения не переписываем.
Remember me: отдельная необязательная галочка, по умолчанию выключена. При включении вход действует90дней со дня логина (фиксированный срок, без молчаливого продления); без неё сохраняется час бездействия. Выход немедленно завершает запомненный сеанс. Пароль в браузере/состоянии не хранится: используется HttpOnly/Secure/SameSite=Strict cookie с непрогнозируемым PHPsessionID и приватный серверный файл. Cookie+serverdeadline должны совпадать. Нельзя увеличить срок всех анонимных сессий до90дней: отдельный private backing запомненных файлов с выбором только по существующему SID, обычный sessions/GC3600 остаётся прежним. Не вводить автоматическую переавторизацию с гонкой CSRF между параллельными запросами.
План#22: backend RED→GREEN auth/cookie/90дней/unchecked/expiry/logout/recreate/security; frontend скрытие requisites и checkbox/remember:boolean; реальные UI-проверки и независимое review; отдельный выпуск админки, затем продолжение общей приёмки4доменов/ZIP и KB/закрытие. Сохранение REG.RU уже разрешено; текущий пользователь вошёл, zoomika секрет сохранён через UI, соединение проверяется. Никакие секреты не выводим.
Дополнения владельца в текущем диалоге: (1) отключить редактирование реквизитов, допустимо закомментировать; (2) добавить «Запомнить меня», выбран срок90дней. Решение: requisites остаются видны в сводке и сохраняются в runtime, но не создают редактируемых полей и не входят в «Выбрать все поля». Меняем именно UI-редактор, существующие значения не переписываем.
Remember me: отдельная необязательная галочка, по умолчанию выключена. При включении вход действует90дней со дня логина (фиксированный срок, без молчаливого продления); без неё сохраняется час бездействия. Выход немедленно завершает запомненный сеанс. Пароль в браузере/состоянии не хранится: используется HttpOnly/Secure/SameSite=Strict cookie с непрогнозируемым PHPsessionID и приватный серверный файл. Cookie+serverdeadline должны совпадать. Нельзя увеличить срок всех анонимных сессий до90дней: отдельный private backing запомненных файлов с выбором только по существующему SID, обычный sessions/GC3600 остаётся прежним. Не вводить автоматическую переавторизацию с гонкой CSRF между параллельными запросами.
План#22: backend RED→GREEN auth/cookie/90дней/unchecked/expiry/logout/recreate/security; frontend скрытие requisites и checkbox/remember:boolean; реальные UI-проверки и независимое review; отдельный выпуск админки, затем продолжение общей приёмки4доменов/ZIP и KB/закрытие. Сохранение REG.RU уже разрешено; текущий пользователь вошёл, zoomika секрет сохранён через UI, соединение проверяется. Никакие секреты не выводим.
Подключения REG.RU: разрешённые пароли обоих аккаунтов сохранены через настоящую форму admin.zoomstage.online; значения не выводились. Проверка zoomika воспроизвела generic HTTP500, CLI показал ConnectionClosedException. Применён systematic-debugging: pin и login проходят, короткий php -r возвращает PHP8.2.35. Закрывает соединение именно прежняя служебная команда15842байта. Контрольные безопасные команды с padding1024/4096/8192 выполняются,16384 обрывает соединение. Причина — ограничение длины exec-команды на реальном хостинге, не пароль.
На обоих хостингах подтверждены PHP8.2.35 и gzinflate. Тот же trusted Remote.php14471байт сжимается до5376байт base64. Решение: упаковать служебный код zlib и передавать большие payload существующим приватным SFTP-inbox при пороге7000байт итоговой shell-команды; сохранить pins/корни/CAS/backup/файловый контракт. Bootstrap test обязан оставаться ниже порога или возвращать понятный отказ, без рекурсии. Отдельный тест ограничения8KiB воспроизведёт прежний отказ; затем проверка на обоих реальных REG.RU.
Прежний realSSH fixture проходил, потому что обычный OpenSSH не моделировал ограничение команды хостинга. Поэтому его PASS не доказывал это условие REG.RU. Исправление ведётся отдельной файловой областью Transport.php, параллельно готовым изменениям remember90/requisites. Выпускаем только после targeted gate, реальных соединений и независимого review.
Подключения REG.RU: разрешённые пароли обоих аккаунтов сохранены через настоящую форму admin.zoomstage.online; значения не выводились. Проверка zoomika воспроизвела generic HTTP500, CLI показал ConnectionClosedException. Применён systematic-debugging: pin и login проходят, короткий php -r возвращает PHP8.2.35. Закрывает соединение именно прежняя служебная команда15842байта. Контрольные безопасные команды с padding1024/4096/8192 выполняются,16384 обрывает соединение. Причина — ограничение длины exec-команды на реальном хостинге, не пароль.
На обоих хостингах подтверждены PHP8.2.35 и gzinflate. Тот же trusted Remote.php14471байт сжимается до5376байт base64. Решение: упаковать служебный код zlib и передавать большие payload существующим приватным SFTP-inbox при пороге7000байт итоговой shell-команды; сохранить pins/корни/CAS/backup/файловый контракт. Bootstrap test обязан оставаться ниже порога или возвращать понятный отказ, без рекурсии. Отдельный тест ограничения8KiB воспроизведёт прежний отказ; затем проверка на обоих реальных REG.RU.
Прежний realSSH fixture проходил, потому что обычный OpenSSH не моделировал ограничение команды хостинга. Поэтому его PASS не доказывал это условие REG.RU. Исправление ведётся отдельной файловой областью Transport.php, параллельно готовым изменениям remember90/requisites. Выпускаем только после targeted gate, реальных соединений и независимого review.
Выпущен522aaf8 (образ2c863139...), CI495 SUCCESS. Remember90:40targeted, transport14, общий backend gate52+38+32+18+40+14 PASS, Composer strict PASS, два независимых review PASS. Реальная production UI в отдельном Docker Chromium: Secure/HttpOnly/Strict90дней, закрытие/повторный запуск профиля без логина, logout→обычный вход session-only→финальный401; requisites только в сводке, отсутствуют среди редактируемых/select-all, runtime stage SHA неизменен. Owner-сессия не отзывалась.
Оба REG.RU-подключения сохранены и включены по разрешению3765; настоящие UI test-кнопки показали успешную проверку путей/блокировки/чтения/записи. На обоих realREG compressed transport+raw no-op write/read SHA PASS. Все4цели enabled/verified. Реальное bulk UI-задание f4f8210331848d4ba1cb967313fd0817 применило только host=zoomzilla.ru к4целям:4success. Полное семантическое сравнение всех config с приватным baseline PASS; REG форматирование нормализовано, после QA исходные raw будут восстановлены только при совпадающем полном config/CAS.
Обнаружен UI-дефект после test: backend verified=true, но строка/сводка оставались старые до reload. Минимальный6ec813b обновляет только текущий объект цели+две поверхности, без loadState/сброса drafts/CAS/selected. Реальный UI RED→GREEN×2, независимое review PASS, образ7a4b87cd... подготовлен; выпуск после текущей ZIP-приёмки. Архивный QA9 отсутствовал/unused на4целях; проверка invalid→valid ZIP проводится в отдельном Docker браузере: IAB filechooser не прикрепил файл. Задача остаётся открыта до4targetZIP, обратимого архивирования QA9, финального выпуска/KB.
Выпущен522aaf8 (образ2c863139...), CI495 SUCCESS. Remember90:40targeted, transport14, общий backend gate52+38+32+18+40+14 PASS, Composer strict PASS, два независимых review PASS. Реальная production UI в отдельном Docker Chromium: Secure/HttpOnly/Strict90дней, закрытие/повторный запуск профиля без логина, logout→обычный вход session-only→финальный401; requisites только в сводке, отсутствуют среди редактируемых/select-all, runtime stage SHA неизменен. Owner-сессия не отзывалась.
Оба REG.RU-подключения сохранены и включены по разрешению3765; настоящие UI test-кнопки показали успешную проверку путей/блокировки/чтения/записи. На обоих realREG compressed transport+raw no-op write/read SHA PASS. Все4цели enabled/verified. Реальное bulk UI-задание f4f8210331848d4ba1cb967313fd0817 применило только host=zoomzilla.ru к4целям:4success. Полное семантическое сравнение всех config с приватным baseline PASS; REG форматирование нормализовано, после QA исходные raw будут восстановлены только при совпадающем полном config/CAS.
Обнаружен UI-дефект после test: backend verified=true, но строка/сводка оставались старые до reload. Минимальный6ec813b обновляет только текущий объект цели+две поверхности, без loadState/сброса drafts/CAS/selected. Реальный UI RED→GREEN×2, независимое review PASS, образ7a4b87cd... подготовлен; выпуск после текущей ZIP-приёмки. Архивный QA9 отсутствовал/unused на4целях; проверка invalid→valid ZIP проводится в отдельном Docker браузере: IAB filechooser не прикрепил файл. Задача остаётся открыта до4targetZIP, обратимого архивирования QA9, финального выпуска/KB.
6ec813b выпущен: образsha256:7a4b87cd6dc30ea4264553fba9ac6ffcc167a2ccd1691ab2d3ee6a38839b88e3, web healthy, worker running, HTTPS200. State и постоянные сессии сохранены; резерв state исключает session-файлы, чтобы rollback не восстанавливал отозванные входы.
Автоматическая проверка отклонила первый запуск production ZIP QA до исполнения: общее разрешение на реализацию/выпуск не сочла достаточно явным для временного набора9 на4целях. Ничего не загружалось, новыхjobs не создавалось. Владелец затем явно ответил «Разрешаю загрузку №9 и последующее архивирование» на вопрос о zoomstage.online/zoompixel.ru/zoomila.ru/zoomika.ru, без изменения default/весов и с переносом QA9 в закрытый архив вне рабочих каталогов. Разрешение относится именно к финальному тесту9/all4 и его обратимой уборке. Приёмка продолжается после нового прямого разрешения, обхода отказа нет.
6ec813b выпущен: образsha256:7a4b87cd6dc30ea4264553fba9ac6ffcc167a2ccd1691ab2d3ee6a38839b88e3, web healthy, worker running, HTTPS200. State и постоянные сессии сохранены; резерв state исключает session-файлы, чтобы rollback не восстанавливал отозванные входы.
Автоматическая проверка отклонила первый запуск production ZIP QA до исполнения: общее разрешение на реализацию/выпуск не сочла достаточно явным для временного набора9 на4целях. Ничего не загружалось, новыхjobs не создавалось. Владелец затем явно ответил «Разрешаю загрузку №9 и последующее архивирование» на вопрос о zoomstage.online/zoompixel.ru/zoomila.ru/zoomika.ru, без изменения default/весов и с переносом QA9 в закрытый архив вне рабочих каталогов. Разрешение относится именно к финальному тесту9/all4 и его обратимой уборке. Приёмка продолжается после нового прямого разрешения, обхода отказа нет.
Разрешённая настоящая production ZIP-приёмка6ec813b: invalid ZIP→видимая422ошибка PASS; valid ZIP→job84bd39d1ada1ad73116475541d48c84d. Stage/pixel success, ila/ika unknown («Исполнитель прервался»); retry/cleanup до диагностики не выполнялись. Worker не OOM/restart: точная причина PHP Fatal escapeshellarg(): Argument exceeds allowed2097152bytes in Transport.php61. inlineCommand строит shellescaped большой base64payload ДО проверки7000, поэтому SFTP-inbox fallback не достигается.
План исправления#22: RED тест payload>2MiB (реальный размер набора), затем не вызывать escapeshellarg для огромного аргумента вообще — принять решение inbox до построения inline shellcmd; сохранить pin/root/preflight/bootstrap7000/защиту рекурсии/cleanup. Scoped Transport+tests, независимый review/gate, readonly manifest/config/journal. После выпуска штатный UI retry только unknown ila/ika с reconcile; stage/pixel success не повторять. Прежний regression использовал небольшой synthetic payload, не достигавший лимита escapeshellarg PHP, поэтому не доказывал этот случай настоящего набора90изображений. Задача открыта, 4targetZIP пока не PASS.
Разрешённая настоящая production ZIP-приёмка6ec813b: invalid ZIP→видимая422ошибка PASS; valid ZIP→job84bd39d1ada1ad73116475541d48c84d. Stage/pixel success, ila/ika unknown («Исполнитель прервался»); retry/cleanup до диагностики не выполнялись. Worker не OOM/restart: точная причина PHP Fatal escapeshellarg(): Argument exceeds allowed2097152bytes in Transport.php61. inlineCommand строит shellescaped большой base64payload ДО проверки7000, поэтому SFTP-inbox fallback не достигается.
План исправления#22: RED тест payload>2MiB (реальный размер набора), затем не вызывать escapeshellarg для огромного аргумента вообще — принять решение inbox до построения inline shellcmd; сохранить pin/root/preflight/bootstrap7000/защиту рекурсии/cleanup. Scoped Transport+tests, независимый review/gate, readonly manifest/config/journal. После выпуска штатный UI retry только unknown ila/ika с reconcile; stage/pixel success не повторять. Прежний regression использовал небольшой synthetic payload, не достигавший лимита escapeshellarg PHP, поэтому не доказывал этот случай настоящего набора90изображений. Задача открыта, 4targetZIP пока не PASS.
Исправление большого ZIP4fc4fd8 опубликовано main/staging и выпущено отдельной админкой, образsha256:502154855aa2db46f7cb73d0e4a67d51cfc8d6d729db593e1dc31cb405b867fa. JSON формируется один раз, потенциальная длина base64 считается до inlineCommand/escapeshellarg; большой payload сразу идёт через прежний SFTP-inbox. Helper/pins/root/CAS/config2MiB/7000bootstrap/no-recursion/finallycleanup не ослаблялись.
Native RED: прежние14PASS, затем реальные90изображений→тот же Fatal2097152. GREEN23PASS независимо повторен ведущим; полный composer test (6suite) exit0. Настоящий SSH/SFTP multiMiB:12PASS,90файлов/6,658,379байт, потенциальный аргумент12,019,116байт; manifest точен, config неизменен; обрыв→unknown+cleanup+старыйmanifest сохранён. Полный backend-sftp также PASS. Независимое spec/code/security review PASS.
Readonly production probe после первой неудачи: stage/pixel все90публичных файлов с точным manifest4541a33c...b5c0; REG9отсутствует, все4config versions неизменны относительно начала ZIP. Продолжаем штатным UI retry только ila/ika исходного job84bd39d1ada1ad73116475541d48c84d. Root-часть QAархива прошла дополнительное review: root state:ro, existingreadonlylock+lstat/fstat, receipt черезpipe пишетUID997;18safetyassertionsPASS. Архив ещё не исполнялся.
Исправление большого ZIP4fc4fd8 опубликовано main/staging и выпущено отдельной админкой, образsha256:502154855aa2db46f7cb73d0e4a67d51cfc8d6d729db593e1dc31cb405b867fa. JSON формируется один раз, потенциальная длина base64 считается до inlineCommand/escapeshellarg; большой payload сразу идёт через прежний SFTP-inbox. Helper/pins/root/CAS/config2MiB/7000bootstrap/no-recursion/finallycleanup не ослаблялись.
Native RED: прежние14PASS, затем реальные90изображений→тот же Fatal2097152. GREEN23PASS независимо повторен ведущим; полный composer test (6suite) exit0. Настоящий SSH/SFTP multiMiB:12PASS,90файлов/6,658,379байт, потенциальный аргумент12,019,116байт; manifest точен, config неизменен; обрыв→unknown+cleanup+старыйmanifest сохранён. Полный backend-sftp также PASS. Независимое spec/code/security review PASS.
Readonly production probe после первой неудачи: stage/pixel все90публичных файлов с точным manifest4541a33c...b5c0; REG9отсутствует, все4config versions неизменны относительно начала ZIP. Продолжаем штатным UI retry только ila/ika исходного job84bd39d1ada1ad73116475541d48c84d. Root-часть QAархива прошла дополнительное review: root state:ro, existingreadonlylock+lstat/fstat, receipt черезpipe пишетUID997;18safetyassertionsPASS. Архив ещё не исполнялся.
Финальная ZIP-приёмка PASS: штатный UI retry только ila/ika исходного job84bd39d1ada1ad73116475541d48c84d завершил все4success, stage/pixel не повторялись. На каждом домене все90 публичных файлов (360GET) совпали с fixture manifest4541a33ce11ad45b36a5c5c4a6a740422f182897a863d47cbad75b7e1819b5c0. Все config/default/weights сохранились. QA-сессии logout401. Скриншот output/preland22/production-zip-four-success.png.
Разрешённая обратимая уборка выполнена: report exactmanifest/fullsemantic/CAS, восстановлены исходные RAWconfig только после полного semantic compare, QA9 all4 перемещён в sibling-архивы0700 вне webroot. Root получил state:ro, existingreadonlylock+lstat/fstat; receipts сохранилUID997. Finalize удалил только metadata id:9, все архивы/история/резервы сохранены; worker возобновлён. Все4 RAW SHA теперь точно исходные baseline; all4enabled/verified. Public4home200, QA9all404, private staging403/404, unauthadminstate401; pixel997:0:755, sessions/remember700. Web4fc4fd8 healthy/worker running. Задача пока открыта только для финальной синхронизации KB и итогового UI-smoke после уборки.
Финальная ZIP-приёмка PASS: штатный UI retry только ila/ika исходного job84bd39d1ada1ad73116475541d48c84d завершил все4success, stage/pixel не повторялись. На каждом домене все90 публичных файлов (360GET) совпали с fixture manifest4541a33ce11ad45b36a5c5c4a6a740422f182897a863d47cbad75b7e1819b5c0. Все config/default/weights сохранились. QA-сессии logout401. Скриншот output/preland22/production-zip-four-success.png.
Разрешённая обратимая уборка выполнена: report exactmanifest/fullsemantic/CAS, восстановлены исходные RAWconfig только после полного semantic compare, QA9 all4 перемещён в sibling-архивы0700 вне webroot. Root получил state:ro, existingreadonlylock+lstat/fstat; receipts сохранилUID997. Finalize удалил только metadata id:9, все архивы/история/резервы сохранены; worker возобновлён. Все4 RAW SHA теперь точно исходные baseline; all4enabled/verified. Public4home200, QA9all404, private staging403/404, unauthadminstate401; pixel997:0:755, sessions/remember700. Web4fc4fd8 healthy/worker running. Задача пока открыта только для финальной синхронизации KB и итогового UI-smoke после уборки.
Работы завершены. Финальная production UI-проверка после уборки: все4домена читаются, RAWversions точно исходные, Set9 absent/unregistered/unused, public9sample404, requisitesreadonly, builder открыт безsave, pageErrors/blockedWrites пусты, QAlogout401. Конфиги и действующие наборы сохранены.
Код4fc4fd8, CI497/job709 SUCCESS runner37; образ502154855aa2..., webhealthy/workerrunning. KB1d3030d опубликована master: спецификация/план/инфраструктура/индекс. Задача закрывается, обязательных остатков нет. Проверки и согласования приведены в обновлённом описании и комментариях3754–3776.
Работы завершены. Финальная production UI-проверка после уборки: все4домена читаются, RAWversions точно исходные, Set9 absent/unregistered/unused, public9sample404, requisitesreadonly, builder открыт безsave, pageErrors/blockedWrites пусты, QAlogout401. Конфиги и действующие наборы сохранены.
Код4fc4fd8, CI497/job709 SUCCESS runner37; образ502154855aa2..., webhealthy/workerrunning. KB1d3030d опубликована master: спецификация/план/инфраструктура/индекс. Задача закрывается, обязательных остатков нет. Проверки и согласования приведены в обновлённом описании и комментариях3754–3776.
Уточнение владельца по screenshot utm.chb.default/weights.a/weights.b. Read-only диагностика25.10: только pixel имеет старый raw-блок chb={weights:{a:1,b:0},default:b}, cons в raw отсутствует. Тот же chb присутствует в первом private preland22-qa-before и pre-bulk baseline; текущий RAW SHA37f645... полностью исходный. Админка его не добавляла. Production components/utm-codec.php и cons-utm.php совпадают с выбранной версией: оба удаляют chb из рабочего конфига; cons fallback1/2 обеспечивает текущий поток. Исторический chb относился к вариантам checkbox согласий, заменён cons по api#317/preland#17. overviewExtra показывает неизвестные raw-поля поключево, поэтому старые chb строки попали в сводку без указания устаревания. Это не новый действующий marker и не отдельные три UTM. Код/конфиги/настройки не менялись: владелец спросил происхождение. Факт фиксируется в KB; вопрос не является разрешением удалить runtime-ключ.
Уточнение владельца по screenshot utm.chb.default/weights.a/weights.b. Read-only диагностика25.10: только pixel имеет старый raw-блок chb={weights:{a:1,b:0},default:b}, cons в raw отсутствует. Тот же chb присутствует в первом private preland22-qa-before и pre-bulk baseline; текущий RAW SHA37f645... полностью исходный. Админка его не добавляла. Production components/utm-codec.php и cons-utm.php совпадают с выбранной версией: оба удаляют chb из рабочего конфига; cons fallback1/2 обеспечивает текущий поток. Исторический chb относился к вариантам checkbox согласий, заменён cons по api#317/preland#17. overviewExtra показывает неизвестные raw-поля поключево, поэтому старые chb строки попали в сводку без указания устаревания. Это не новый действующий marker и не отдельные три UTM. Код/конфиги/настройки не менялись: владелец спросил происхождение. Факт фиксируется в KB; вопрос не является разрешением удалить runtime-ключ.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Единая защищённая админка https://admin.zoomstage.online выпущена и принята для zoomstage.online, zoompixel.ru, zoomila.ru и zoomika.ru. Runtime config.json управляется напрямую через local/SFTP, независимо от Git и публичного deploy.
Выполнено:
Релиз: preland4fc4fd8162aa75157205397f00c936302c0a68cc (main/staging), admin image preland-admin:4fc4fd8, sha256:502154855aa2db46f7cb73d0e4a67d51cfc8d6d729db593e1dc31cb405b867fa. Workflow497/job709 SUCCESS, фактический runner37/zoomzilla-prod-org. Web healthy, worker running. KBmaster1d3030d содержит спецификацию, план, размещение/приёмку и индекс.
Доказательства: output/preland22/production-remember-report.md, production-zip-report.md, production-final-report.md; compact screenshots production-zip-four-success.png и production-final-overview.png. Полный composer test (6suite) exit0, transport23, настоящий multiMiB SFTP12, отдельные review PASS. История двух реальных transport-дефектов и причины пропуска прежней проверкой записаны3771/3774/3775; отказы автоконтроля и последующие прямые разрешения3765/3773 сохранены без подмены истории.
Эксплуатационный контракт: отдельные результаты хостингов, общей транзакции между ними нет; unknown требует reread/reconcile. Архивы/backup/history сохранены; без долгой cookie новый браузер требует входа. Это ограничения контракта, незавершённых обязательных сценариев нет. Отключённые .online не реактивировались; единственный используемый .online — zoomstage.online.
Дополнение владельца: сразу добавить загрузку новых наборов indpic на выбранный преленд. Взять за основу готовую админку и проверки редактора наборов основного сайта, скопировать/переиспользовать их вместо разработки другого UI/контракта. Сначала изучить актуальную реализацию и задачи; наборы и runtime-конфиги сохраняются прямо на выбранном хостинге вне Git. Предложенное расположение admin.zoomstage.online. Вопрос формы/полногоJSON отправлен async; инвентаризация продолжается.
Уточнение владельца 25.10.2026: сырой редактор JSON не нужен. Админка должна позволять редактировать все настройки config.json через понятные поля отдельно для каждого домена, исключая ручную правку и разнос файлов по FTP. Добавить выбор одного или нескольких доменов и единую кнопку применения изменений к выбранным. При массовом применении нужны независимые результаты по каждому домену; не распространять случайно остальные настройки исходного домена. Ранее предложенный режим полного JSON отменён этим уточнением. Загрузка indpic и переиспользование интерфейса/проверок CPanel остаются в объёме задачи.
Подготовлен проект админки: docs/superpowers/specs/2026-10-25-preland22-admin-design.md, локальный коммит
b3b14ecв изолированном worktree wt/preland21 (без push/выката). Проект учитывает последнее уточнение владельца: все поля через форму, только выбранные изменения, один/несколько доменов, независимые результаты и повтор после частичного отказа. Прямой SFTP/SSH/файловый адаптер, резерв и конфликт версий; редактор indpic и проверки90изображений из CPanel, общий ZIP для выбранных целей.Зависимость: нынешние --stage-sets/--remote требуют совпадения runtime /N/ с Git. Независимая замена существующих наборов через админку потребует заменить именно эту часть guard проверкой фактического файлового контракта без отмены проверок кода/статических ресурсов. Изменения workflow и правил ещё не выполнены.
Builder-check отдельным ревьюером: единственный существенный вопрос — деградация проверки каталогов degr/tp/cons при недоступном основном API. В проект внесено решение исполнителя: если каталог доступен, проверяем существование; иначе разрешён номер1–9 с явной пометкой о непроверенном существовании, без ложного утверждения проверки API. Это сохраняет независимость редактирования.
Статус: проект на согласовании согласно hard gate применённого brainstorming; продуктовый код, DNS/TLS, доступы и runtime не менялись. Задача открыта, реализация/браузерная приёмка/выкат остаются впереди.
Владелец поручил командное выполнение с использованием superpowers, фиксацией спецификации/плана в KB, самостоятельной поведенческой приёмкой и выпуском production без дополнительных подтверждений при отсутствии новых продуктовых развилок. Продолжаем по подготовленному проекту
b3b14ec. Роли объединяем по независимым областям: Yii2/PHP и Python-контракты — backend/transport; frontend/design/layout — готовый CPanel-интерфейс; indpic/QA — ZIP/файловый контракт; DevOps/Linux/Windows и интеграция — ведущий агент. Не создаём отдельного микросервиса ради каждой роли. Все решения и ограничения остаются в #22; постановка новых бизнес-правил/неоговорённого UI потребует вариантов до изменения.Спецификация и план опубликованы в KB master f6e6268: «Спеки/2026-10-25 Админка прелендингов 22.md», «Планы/2026-10-25 Админка прелендингов 22 — план.md», индекс обновлён. План в preland5b6b2d2. Реализуются независимые файловые области backend/frontend/runtime guard, ведущий интегрирует и выпускает.
Техническое решение: два точных bind-mount локальных сайтов исключают доступ приложения к остальному /srv/preland. Поскольку rename между bind-mount даёт EXDEV, резерв остаётся в приватном state вне webroot, локальная подготовка изображений — в скрытом .preland-admin-staging внутри того же mount, закрытом nginx/Apache; SFTP-цели используют sibling-папку вне webroot. Это сохраняет атомарную публикацию без общего mount/передачи root SSH ключа. Формулировка спецификации уточняется, публичной выдачи staging/backup нет.
Первичная интеграция: backend CAS/резерв/частичный отказ проверяются в Docker; UI RED корректно обнаружил отсутствие админки. На интеграционном builtin PHP стенде выявлена ошибка harness (router отдавал HTML вместо JS/CSS), исправлен только тестовый router. Далее настоящий browser GREEN; HTTP200 отдельно не считаем приёмкой. DNS A admin.zoomstage.online на153.76.161.93 создана в REG.RU, авторитетная зона ещё распространяется; TLS попытка получила NXDOMAIN, не заявляем готовность HTTPS.
Версия кода9515c1c зафиксирована после независимого review: обаverdictPASS (review-followup.md). Восемьсущественныхзамечаний исправлены: праваактивныхпапок, effective/defaultmembership, CAS/reconciliationZIP, durablejournal+автовосстановлениеsupervisor, numeric↔legacybulkpaths, нулевыевеса/точнаяrndподсказка, свежийкаталоггрупп, rootpublisherзащитаотsymlink. Rootreadonlyexport mainAPI реально вернулdegr/tp/cons1/2 безпередачиDBдоступаприложению; catalog TTL180сек.
Проверки ведущим: полныйgate17prelandchecks/manifest/runtime + backendreview52/HTTP18 PASS вfinalPHP8.3/Imagick/pcntl image; realbrowser smoke иpartial/conflict/persist/invalidZIP→validZIP PASS. ОтдельныйUIUTM: bulkZIP3a/b, отказdefaultбезweights, weights3=0/default3кдвум, reread/preserveotherfields, publicrenderиJPEG400×217, исходныезначениявосстановленыUI — PASS. ПубличныеApacheUID33 читаютобакартинки200 иполучают403дляprivate staging. Rootpublisheradversarialsymlinktest actualscriptDocker — PASS, victimнеизменён. ИсполнительдополнительноrealSFTP40PASS иworker65sec37PASS, отчётысохранены.
Инфраструктурныйблокернепрячем: автоматическаяпроверкаразрешенийотклониласначалаcombinednginx+groupwriteдвухкорней, затемболееузкийchownтолькокорняzoompixel.ruнасуществующийUID997. Причина: persistentдоступккоду/публичнымфайламнеподтверждёнконкретно; обеоперацииНЕвыполнены. Факты: stageужеowner997/GID987/mode755, pixelroot0:0:755, pixelconfig997:987:644. Stageне требуетрасширенияправ; pixelпокаreadonly/записьбудетотключена. Нужноеявноеразрешениесформулируемнаконкретнуюоперациювместесготовойадминкой; обходаотказанет.
DNS/TLS admin.zoomstage.online готовы. Образ9515c1cсобираетсядляотдельногоразмещения; Gitea#22остаётсяоткрытойдо4подключений/productionUIпроверок/устраненияостатков. Пароли/ключине включенывGit/отчёты.
Выпущена отдельная админка https://admin.zoomstage.online. Production web healthy, worker running. Код9515c1c + исправление подсказки каталога48c71f3 опубликован в main/staging. Образ preland-admin:48c71f3, manifest fb4c1f8bb36f6edc143e9e51eef2d4b11066a264ea2d088a75fa9d20bf3e1d7b; это базовый образ9515c1c с единственной заменой проверенного admin.js. Runtime обоих локальных сайтов после выпуска и браузерного теста совпадает по SHA256 с исходными.
Реальная приёмка публичной админки: ввод логина/пароля → выбор stage → отображение подтверждённых групп degr/tp/cons → сохранение текущего host кнопкой → видимый успешный результат → повторное чтение. Значения не изменились, ошибок JavaScript нет. Локальная браузерная матрица, массовое применение к двум целям, UTM, ZIP, конфликт/частичный успех/восстановление и независимое review описаны выше; свидетельства в output/preland22/. Production ZIP и4цели пока не считаются проверенными.
Статус целей: stage включён и проверен; pixel смонтирован read-only, выключен для записи, root0:0:755 сохранён; ila/ika созданы с правильными root/host/pinned key, но выключены, пароли ещё не сохранены. Два конкретных запроса владельцу отправлены: разрешить chown997 только корня pixel с сохранением GID0/755 и сохранение существующих REG.RU-паролей в приватном хранилище админки; также нужен ручной вход владельца в открытую вкладку. Ответа пока нет. Автоконтроль ранее отклонил изменение владельца из-за доступа к коду/публичным файлам; обе отклонённые операции не выполнены, обхода нет.
KB master853dfd5 опубликована: актуальная спецификация/план, «Инфраструктура/Админка прелендингов — размещение и приёмка22.md», индекс. TODO/AGENT_LOG синхронизированы. Задача22 остаётся ОТКРЫТОЙ до завершения подключений и обязательной приёмки. Пароли в задачу/KB/Git/отчёты не включены.
Владелец подтвердил оба конкретных действия: chown существующим UID997 только /srv/preland/domains/zoompixel.ru с сохранением GID0/755; сохранение существующих SSH/SFTP-паролей REG.RU u3695920/u3695919 в приватном хранилище админки и включение zoomila.ru/zoomika.ru. Также сообщил о выполненном ручном входе в админку. Продолжаем ранее утверждённый план: подключение, настоящая приёмка четырёх целей, KB и закрытие после проверок.
Новое уточнение владельца: первым экраном нужна сводная таблица фактических config.json всех доменов, значения/default и веса вариантов; также готовая ссылка с текущими значениями. Исследован существующий codec: внешние параметры содержат значащую цифру на5позиции,0 запускает выбор по весам; конфиг сам по себе не определяет единственную конкретную ссылку. На согласование отправлена матрица параметры×домены с default/весами и двумя ссылками «По default»/«По весам», только по сохранённым данным, дата чтения/обновление. Реализация нового UI ожидает ответа на этот продуктовый выбор, прежнее подключение/проверки продолжаются. Разрешённая смена владельца pixel выполнена точно:997:0:755, bind RW=true, runtime SHA исходные. Изолированная браузерная сессия утратила прежние вкладки, новая вкладка показывает login; запрошен повторный вход владельца, запрет чтения локального файла браузером не обходится.
Дополнение владельца25.10 — сводка и независимый конструктор ссылок
Источник: текущий диалог, preland#22. Сначала владелец запросил сводную таблицу текущих config.json и ссылку. Затем отверг две готовые default/rnd ссылки: нужны списки значений или Рандом по каждому параметру, формирование ссылки и восстановление последнего выбора, чтобы изменить одно поле. Генератор ничего не меняет в конфигурации и не управляет сайтом.
Реализация: первый раздел «Сводка»; строки UTM, колонки домены, в каждой ячейке default и все варианты с весами. Чтение фактических сохранённых файлов, время чтения и обновление, отдельная ошибка цели без подмены пустыми значениями; legacy aliases и semantic enum отображаются каноническими номерами с пояснениями. Несохранённые поля редактора не подмешиваются. Мобильный экран: горизонтальная прокрутка таблицы.
Рядом отдельный «Конструктор ссылки»: домен, восемь списков indpic/theme/degr/reg/banch/tp/cons/focus, значения1..9 (дляenum только1/2) или Рандом. «Сформировать и сохранить» хранит последний выбор отдельно по IDдомена на сервере в приватном state и показывает постоянный скопируемый URL. Сохранение явное, после перезагрузки восстанавливаются выбор и последняя ссылка. Первое открытие без сохранения использует config.default лишь как начальное заполнение; далее конфиг не перезаписывает выбор. Если выбранный номер сейчас не поддерживается фактическим config/catalog, показать предупреждение о fallback, не менять выбор молча.
GET /api/link-builder?target=ID -> {ok:true,selection:null|object,url:null|string,saved_at:null|string}. POST /api/link-builder {target,selection:{все8каноническихключей:string1..9|rnd}} -> {ok:true,selection,url,saved_at}. Авторизация/CSRF общие. Enumограничения на сервере; неожиданные ключи/пропуски/неверные значения отвергаются. URL только https://<проверенныйдомен>/, параметры имеют4ASCIIсимволапрефикса+цифру(0=rnd)+шум; URL сохраняется вместе с выбором, GET не перегенерирует. Никаких заданий записи config, Transport или runtimeвызовов из генератора. Секреты не возвращаются.
План в рамках#22: (1) backend RED→GREEN, отдельный LinkBuilder.php и API; persistence/isolation/securitytests. (2) frontend общий первыйраздел+матрица+независимый генератор, meaningful UItests. (3) интеграция/review, реальный click/change/generate/reload/onefield, доказательство неизменности runtime SHA и регрессия прежнего редактора. (4) выпуск отдельной админки, проверка4подключений/ZIP, KB/итог, закрыть после полного выполнения. Backendвладеет src/LinkBuilder.php/public/index.php/tests/link-builder.php; frontend views/dashboard.php/public/assets/admin.js/css/testsUI; ведущий docs/infra/release. Старые публичные преленды/runtimeне выкатывать радиUIадминки.
Сводка и независимый конструктор реализованы, код2cfa2e2 опубликован в main/staging, production админки пока48c71f3. KB спецификация/план дополнены и опубликованы cfac2f2. Root проверил composer validate/test:52 regression+38 LinkBuilderunit+32HTTP PASS, включая auth/CSRF и реальную параллельность same-cookie при3sSSHbannerwait. Review: spec/code/security PASS, открытых существенных замечаний нет.
Root CUA: настоящий выбор theme2→сформировать→reload→точный URL и выбор восстановлены; изменение только focus наrnd сохраняет theme2 и даёт цифру0. Сводка содержит host/requisites/дополнительныеполя и8UTM/default/все веса, alias→канонические номера. По fresh catalog cons9 даёт корректное предупреждение об отсутствии группы, не ложное обещание fallback. Отдельная test-only offline SSH-цель: сохранённый constructor открылся за261мс, пока её колонка читалась; затем отдельная ошибка колонки, a/b остались прочитанными. Offlinefixture убран, runtimea/b SHA остались исходными. Frontend дополнительно DockerGREENx2 нового сценария1440/390+старыйeditor smoke PASS.
Исправлены найденные причины: PHPsessionlock освобождается послеauth/CSRF, сохранённыйconstructor не ждётruntime, предупреждения учитываюткаталог; browsercache возвращал старыйJS при новомHTML — CSS/JS URLs теперь содержат хеш содержимого, rootCUA послеобычногорeloadGREEN.
Операционное уточнение до выпуска: PHPсессии нынешнейслужбы хранятся в/tmp контейнера и теряются приrecreate. Поэтому ранее выполненный владельцем вход сбросился при включенииpixel RW. Переносим backingсессий в закрытый ADMIN_STATE_DIR/sessions0700 без изменения срока3600/Strictcookie/CSRF; добавляем тест новогоPHPпроцесса с тем жеcookie/sharedstate. При выпуске сохраним существующие sessionfiles приватно без вывода/расширениядоступа. Повторный вход и REGподключения пока не выполнены в доступной браузерной вкладке; секреты только в памяти CUA и вGit/KB/отчёты не попадают.
Дополнение опубликовано на https://admin.zoomstage.online: первый экран — сводка фактических конфигов, затем отдельный конструктор ссылок. Код2cfa2e2 и
d04b405опубликован в main/staging; workflow493/job705 и494/job706 SUCCESS, фактический runner37/zoomzilla-prod-org.Production-образ preland-admin:d04b405, manifest417268908e87ee3e3d621a9703f1c01e12e0896f18ec8410efcf2d5e5d7a47db. Полное дерево tracked admin скопировано из Git-архива, зависимости не менялись. Web healthy, worker running. Pixel997:0:755 с разрешённой записью, обе локальные цели включены и проверены. SHA256 stage/pixel config.json остались исходными.
Сессии теперь в постоянном state/sessions0700, файлы0600; срок бездействия3600, Strict/HttpOnly/Secure и CSRF сохранены.18 targeted проверок, повтор HTTP и независимое security review PASS. Ведущий в CUA сохранил вход и выбор после настоящей замены локального web-контейнера. На production отдельный Docker QA выполнил login/read; после замены production web тот же приватный cookie снова прошёл state/config/builder GET и logout. Это API-проверка, она не заменяет ещё не выполненную production UI-приёмку.
Существующие сессии перенесены из прежнего /tmp через закрытую root-подготовку. Первый экспорт root внутри контейнера не мог читать0600 файлы без DAC capability; до успешного повтора служба оставалась старой. Повтор от штатного UID997 выполнен, права не расширены. Идентификаторы/содержимое сессий не выводились. QA-helper сначала ошибочно отправил logout как массив[], исправлен только payload на объект{}, повтор завершился успешно.
KB master c89cb6f опубликована: актуальная заметка размещения/приёмки, спецификация и план с независимым конструктором, версии, проверки и остатки. Скриншоты с тестовыми данными: output/preland22/constructor-preview.png и overview-preview.png; подробные отчёты review/QA там же.
Открытый остаток: доступная агенту вкладка production показывает login. Владелец получил повторный запрос входа уже после исправления постоянных сессий. До него два REG.RU-подключения не сохранены/не включены; общая четырёхцелевая UI/ZIP-приёмка не выполнена. Разрешение на оба действия уже получено, повторное разрешение не запрашиваем. Задача22 остаётся открытой до завершения подключений и приёмки.
Дополнения владельца в текущем диалоге: (1) отключить редактирование реквизитов, допустимо закомментировать; (2) добавить «Запомнить меня», выбран срок90дней. Решение: requisites остаются видны в сводке и сохраняются в runtime, но не создают редактируемых полей и не входят в «Выбрать все поля». Меняем именно UI-редактор, существующие значения не переписываем.
Remember me: отдельная необязательная галочка, по умолчанию выключена. При включении вход действует90дней со дня логина (фиксированный срок, без молчаливого продления); без неё сохраняется час бездействия. Выход немедленно завершает запомненный сеанс. Пароль в браузере/состоянии не хранится: используется HttpOnly/Secure/SameSite=Strict cookie с непрогнозируемым PHPsessionID и приватный серверный файл. Cookie+serverdeadline должны совпадать. Нельзя увеличить срок всех анонимных сессий до90дней: отдельный private backing запомненных файлов с выбором только по существующему SID, обычный sessions/GC3600 остаётся прежним. Не вводить автоматическую переавторизацию с гонкой CSRF между параллельными запросами.
План#22: backend RED→GREEN auth/cookie/90дней/unchecked/expiry/logout/recreate/security; frontend скрытие requisites и checkbox/remember:boolean; реальные UI-проверки и независимое review; отдельный выпуск админки, затем продолжение общей приёмки4доменов/ZIP и KB/закрытие. Сохранение REG.RU уже разрешено; текущий пользователь вошёл, zoomika секрет сохранён через UI, соединение проверяется. Никакие секреты не выводим.
Подключения REG.RU: разрешённые пароли обоих аккаунтов сохранены через настоящую форму admin.zoomstage.online; значения не выводились. Проверка zoomika воспроизвела generic HTTP500, CLI показал ConnectionClosedException. Применён systematic-debugging: pin и login проходят, короткий php -r возвращает PHP8.2.35. Закрывает соединение именно прежняя служебная команда15842байта. Контрольные безопасные команды с padding1024/4096/8192 выполняются,16384 обрывает соединение. Причина — ограничение длины exec-команды на реальном хостинге, не пароль.
На обоих хостингах подтверждены PHP8.2.35 и gzinflate. Тот же trusted Remote.php14471байт сжимается до5376байт base64. Решение: упаковать служебный код zlib и передавать большие payload существующим приватным SFTP-inbox при пороге7000байт итоговой shell-команды; сохранить pins/корни/CAS/backup/файловый контракт. Bootstrap test обязан оставаться ниже порога или возвращать понятный отказ, без рекурсии. Отдельный тест ограничения8KiB воспроизведёт прежний отказ; затем проверка на обоих реальных REG.RU.
Прежний realSSH fixture проходил, потому что обычный OpenSSH не моделировал ограничение команды хостинга. Поэтому его PASS не доказывал это условие REG.RU. Исправление ведётся отдельной файловой областью Transport.php, параллельно готовым изменениям remember90/requisites. Выпускаем только после targeted gate, реальных соединений и независимого review.
Выпущен522aaf8 (образ2c863139...), CI495 SUCCESS. Remember90:40targeted, transport14, общий backend gate52+38+32+18+40+14 PASS, Composer strict PASS, два независимых review PASS. Реальная production UI в отдельном Docker Chromium: Secure/HttpOnly/Strict90дней, закрытие/повторный запуск профиля без логина, logout→обычный вход session-only→финальный401; requisites только в сводке, отсутствуют среди редактируемых/select-all, runtime stage SHA неизменен. Owner-сессия не отзывалась.
Оба REG.RU-подключения сохранены и включены по разрешению3765; настоящие UI test-кнопки показали успешную проверку путей/блокировки/чтения/записи. На обоих realREG compressed transport+raw no-op write/read SHA PASS. Все4цели enabled/verified. Реальное bulk UI-задание f4f8210331848d4ba1cb967313fd0817 применило только host=zoomzilla.ru к4целям:4success. Полное семантическое сравнение всех config с приватным baseline PASS; REG форматирование нормализовано, после QA исходные raw будут восстановлены только при совпадающем полном config/CAS.
Обнаружен UI-дефект после test: backend verified=true, но строка/сводка оставались старые до reload. Минимальный6ec813b обновляет только текущий объект цели+две поверхности, без loadState/сброса drafts/CAS/selected. Реальный UI RED→GREEN×2, независимое review PASS, образ7a4b87cd... подготовлен; выпуск после текущей ZIP-приёмки. Архивный QA9 отсутствовал/unused на4целях; проверка invalid→valid ZIP проводится в отдельном Docker браузере: IAB filechooser не прикрепил файл. Задача остаётся открыта до4targetZIP, обратимого архивирования QA9, финального выпуска/KB.
6ec813bвыпущен: образsha256:7a4b87cd6dc30ea4264553fba9ac6ffcc167a2ccd1691ab2d3ee6a38839b88e3, web healthy, worker running, HTTPS200. State и постоянные сессии сохранены; резерв state исключает session-файлы, чтобы rollback не восстанавливал отозванные входы.Автоматическая проверка отклонила первый запуск production ZIP QA до исполнения: общее разрешение на реализацию/выпуск не сочла достаточно явным для временного набора9 на4целях. Ничего не загружалось, новыхjobs не создавалось. Владелец затем явно ответил «Разрешаю загрузку №9 и последующее архивирование» на вопрос о zoomstage.online/zoompixel.ru/zoomila.ru/zoomika.ru, без изменения default/весов и с переносом QA9 в закрытый архив вне рабочих каталогов. Разрешение относится именно к финальному тесту9/all4 и его обратимой уборке. Приёмка продолжается после нового прямого разрешения, обхода отказа нет.
Разрешённая настоящая production ZIP-приёмка6ec813b: invalid ZIP→видимая422ошибка PASS; valid ZIP→job84bd39d1ada1ad73116475541d48c84d. Stage/pixel success, ila/ika unknown («Исполнитель прервался»); retry/cleanup до диагностики не выполнялись. Worker не OOM/restart: точная причина PHP Fatal escapeshellarg(): Argument exceeds allowed2097152bytes in Transport.php61. inlineCommand строит shellescaped большой base64payload ДО проверки7000, поэтому SFTP-inbox fallback не достигается.
План исправления#22: RED тест payload>2MiB (реальный размер набора), затем не вызывать escapeshellarg для огромного аргумента вообще — принять решение inbox до построения inline shellcmd; сохранить pin/root/preflight/bootstrap7000/защиту рекурсии/cleanup. Scoped Transport+tests, независимый review/gate, readonly manifest/config/journal. После выпуска штатный UI retry только unknown ila/ika с reconcile; stage/pixel success не повторять. Прежний regression использовал небольшой synthetic payload, не достигавший лимита escapeshellarg PHP, поэтому не доказывал этот случай настоящего набора90изображений. Задача открыта, 4targetZIP пока не PASS.
Исправление большого ZIP4fc4fd8 опубликовано main/staging и выпущено отдельной админкой, образsha256:502154855aa2db46f7cb73d0e4a67d51cfc8d6d729db593e1dc31cb405b867fa. JSON формируется один раз, потенциальная длина base64 считается до inlineCommand/escapeshellarg; большой payload сразу идёт через прежний SFTP-inbox. Helper/pins/root/CAS/config2MiB/7000bootstrap/no-recursion/finallycleanup не ослаблялись.
Native RED: прежние14PASS, затем реальные90изображений→тот же Fatal2097152. GREEN23PASS независимо повторен ведущим; полный composer test (6suite) exit0. Настоящий SSH/SFTP multiMiB:12PASS,90файлов/6,658,379байт, потенциальный аргумент12,019,116байт; manifest точен, config неизменен; обрыв→unknown+cleanup+старыйmanifest сохранён. Полный backend-sftp также PASS. Независимое spec/code/security review PASS.
Readonly production probe после первой неудачи: stage/pixel все90публичных файлов с точным manifest4541a33c...b5c0; REG9отсутствует, все4config versions неизменны относительно начала ZIP. Продолжаем штатным UI retry только ila/ika исходного job84bd39d1ada1ad73116475541d48c84d. Root-часть QAархива прошла дополнительное review: root state:ro, existingreadonlylock+lstat/fstat, receipt черезpipe пишетUID997;18safetyassertionsPASS. Архив ещё не исполнялся.
Финальная ZIP-приёмка PASS: штатный UI retry только ila/ika исходного job84bd39d1ada1ad73116475541d48c84d завершил все4success, stage/pixel не повторялись. На каждом домене все90 публичных файлов (360GET) совпали с fixture manifest4541a33ce11ad45b36a5c5c4a6a740422f182897a863d47cbad75b7e1819b5c0. Все config/default/weights сохранились. QA-сессии logout401. Скриншот output/preland22/production-zip-four-success.png.
Разрешённая обратимая уборка выполнена: report exactmanifest/fullsemantic/CAS, восстановлены исходные RAWconfig только после полного semantic compare, QA9 all4 перемещён в sibling-архивы0700 вне webroot. Root получил state:ro, existingreadonlylock+lstat/fstat; receipts сохранилUID997. Finalize удалил только metadata id:9, все архивы/история/резервы сохранены; worker возобновлён. Все4 RAW SHA теперь точно исходные baseline; all4enabled/verified. Public4home200, QA9all404, private staging403/404, unauthadminstate401; pixel997:0:755, sessions/remember700. Web4fc4fd8 healthy/worker running. Задача пока открыта только для финальной синхронизации KB и итогового UI-smoke после уборки.
Работы завершены. Финальная production UI-проверка после уборки: все4домена читаются, RAWversions точно исходные, Set9 absent/unregistered/unused, public9sample404, requisitesreadonly, builder открыт безsave, pageErrors/blockedWrites пусты, QAlogout401. Конфиги и действующие наборы сохранены.
Код4fc4fd8, CI497/job709 SUCCESS runner37; образ502154855aa2..., webhealthy/workerrunning. KB1d3030d опубликована master: спецификация/план/инфраструктура/индекс. Задача закрывается, обязательных остатков нет. Проверки и согласования приведены в обновлённом описании и комментариях3754–3776.
Уточнение владельца по screenshot utm.chb.default/weights.a/weights.b. Read-only диагностика25.10: только pixel имеет старый raw-блок chb={weights:{a:1,b:0},default:b}, cons в raw отсутствует. Тот же chb присутствует в первом private preland22-qa-before и pre-bulk baseline; текущий RAW SHA37f645... полностью исходный. Админка его не добавляла. Production components/utm-codec.php и cons-utm.php совпадают с выбранной версией: оба удаляют chb из рабочего конфига; cons fallback1/2 обеспечивает текущий поток. Исторический chb относился к вариантам checkbox согласий, заменён cons по api#317/preland#17. overviewExtra показывает неизвестные raw-поля поключево, поэтому старые chb строки попали в сводку без указания устаревания. Это не новый действующий marker и не отдельные три UTM. Код/конфиги/настройки не менялись: владелец спросил происхождение. Факт фиксируется в KB; вопрос не является разрешением удалить runtime-ключ.