From 51a3a8231d94b57206dfc7dafa7d4e12270476cc Mon Sep 17 00:00:00 2001 From: dima Date: Wed, 29 Apr 2026 14:15:47 +0300 Subject: [PATCH] =?UTF-8?q?STATE:=2030.04=20hygiene=20=E2=80=94=20observat?= =?UTF-8?q?ion=20v8.1=20closed,=20snapshot=20rm,=20rule=20#7=20(accepted?= =?UTF-8?q?=20risk),=20rule=20#9=20commit-pinned=20URL=20extension?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- STATE.md | 49 +++++++++++++++++++++---------------------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/STATE.md b/STATE.md index facbfda..b60d3e5 100644 --- a/STATE.md +++ b/STATE.md @@ -14,9 +14,9 @@ --- -**Обновлено:** 2026-04-29 (вторая половина дня), Claude Code (Opus 4.7) — Gitea CE задеплоен на git.suntask.ru, public read-mirror sunprint-state создаётся -**Длительность сессии:** в процессе (29.04: dieline planning в claude.ai → merge STATE.md → Gitea deployment) -**Предыдущая сессия:** 2026-04-28, Claude Code (Opus 4.7), ~6ч — SunTask↔calc интеграция закончена end-to-end (SSO bridge + Lv7CMS reverse + Basic Auth снят) +**Обновлено:** 2026-04-30, Claude Code (Opus 4.7) — гигиена закрыта (push 0e53251 + observation v8.1 closed + snapshot rm), готовы к Dieline Фаза 1 +**Длительность сессии:** в процессе (30.04: pre-flight ✅ → push 0e53251 → observation closed → snapshot+.htpasswd rm → правило #7 + accepted-risk фиксация) +**Предыдущая сессия:** 2026-04-29, Claude Code (Opus 4.7), ~6ч — Gitea CE задеплоен на git.suntask.ru, public+private repos, web_fetch workflow через commit-pinned URL > **Заметка о merge:** этот файл собран из двух источников — базой взят архив `2026-04-29_09-04-38_STATE_post-basicauth.md` (md5 `acda575a5dc67402169f8586af2a0563`), сверху наложены только новые блоки сессии 29.04 (dieline-трек, два бэклог-ряда, урок №12, лог-строка, связанные документы по dieline, новый риск про устаревший Project Knowledge). Регрессия зафиксирована как риск ниже. @@ -24,28 +24,15 @@ ## 🎯 Активный трек -**Не выбран — но подготовлен план dieline-трека (29.04, claude.ai).** +**Observation v8.1 закрыт ✅. Готов к Dieline Фаза 1.** -Три больших трека 27-28 апреля закрыты (БАГ колод v8.1, SSO bridge, Basic Auth снят). Полная end-to-end интеграция SunTask↔calc работает — менеджеры реально пользуются. +Все большие треки 27-29 апреля закрыты (БАГ колод v8.1, SSO bridge, Basic Auth снят, Gitea CE деплой). Гигиена 30.04: snapshot v8.1 удалён, .htpasswd убран, observation чек-лист пройден (0 ошибок за 48h, `2×200 + 1×400 + 0×500` на `/api/v1/calculate`), правило #7 (accepted risk) добавлено в Security политику. -29.04 в claude.ai прошла планёрка по новому большому треку — **конструктор коробок (dieline generator)**. План зафиксирован отдельным разделом ниже («🆕 Трек: Конструктор коробок»), кода ещё не написано. +**Следующий шаг:** запуск **Dieline Фаза 1** (локальный плейграунд в `demo.html`, расширение каталога под микрогофру, AST-парсер, валидация геометрии). Полный план — раздел «🆕 Трек: Конструктор коробок» ниже, ~1-2 недели локально. -Перед стартом любого нового кода — закрыть observation period v8.1: - -### Чек-лист observation v8.1 (закрыть перед стартом dieline / нового трека) - -1. `docker logs printcalc-app --since 48h 2>&1 | grep -E '4[0-9][0-9]|ERROR' | head -20` — норма: только `DECKS_REQUIRED` от тестовых curl'ов и пара 401 от старого пароля. -2. `grep 'POST /api/v1/calculate' /var/log/nginx/calc.suntask.ru.access.log | awk '{print $9}' | sort | uniq -c` — соотношение 200/400/500. 400 допустимы (DECKS_REQUIRED), 500 не должно быть. -3. SQL-проверка: новые `Quote` за сутки, `inputJson->>'templateSlug'` и `inputJson->>'decks'` — что приходит с UI после фикса. -4. 🔵 **Сменить пароли** (manager + owner + DB njsoft_sun_adv) — в этот же чек-лист, не отдельным треком (см. бэклог). -5. После 1-3 → `rm -rf /var/www/print-calc.old.20260427-pre-v81`. -6. После 4 → пометить 🔵 в бэклоге как ✅ закрыт. - -После закрытия observation+паролей кандидаты на следующий трек (см. бэклог): -- 🟡 **Конструктор коробок Фаза 1** (рекомендация — большой плановый трек, locally only ~1-2 недели) +Альтернативные кандидаты (если приоритет сместится): - 🟡 `/admin/approvals` UI (~3ч, владельческий функционал) - 🟢 v8.2 rebase под v8.1 pipeline (НДС 22% / шелкография / equipment) -- 🔵 гигиена (ротация паролей, удаление снэпшота v8.1) — закрывается чек-листом выше --- @@ -269,8 +256,9 @@ Smoke на live: 101 колода × 54 = 5454 карт ✅, productsPerSheet=21 | 🟢 | print-calc v8.2 rebase под v8.1 pipeline | не начат | пересмотреть | архив `print-calculator-v8-code.zip` устарел: содержит НДС 22%/курсы ЦБ/налог.окружение/шелкография/Equipment, но без pipeline-фикса колод. Нужен ремердж перед деплоем | | 🟢 | Accountant CMS (редактор каталогов) | не начат | 2-3 дня | бухгалтер правит цены материалов/процессов | | 🟢 | LIVE-CALC расчёты для тюнинга engine | не начат | по мере проблем | сравнение с реальными сметами | -| 🔵 | **Сменить пароль БД njsoft_sun_adv** | 24-48 ч | 5 мин | DB password засветился в чате claude.ai 28.04 при `docker inspect`. Также пароли manager/owner от 27.04 ещё не сменены | -| 🔵 | rm `/var/www/print-calc.old.20260427-pre-v81` | observation прошло | 1 мин | можно удалять, v8.1 стабилен 24+ часа | +| 🟢 | **njsoft_sun_adv DB password — accepted risk** | принято решение оператора | n/a | DB password засветился в claude.ai-чате 28.04 при `docker inspect`. **Не ротируется**: njsoft — external team с административным доступом к серверу, бэкап-канал для критических инцидентов, ротация порвёт этот канал в обмен на низкоинтенсивную гипотетическую защиту от утечки через Anthropic-инфраструктуру. См. правило 7 Security-политики | +| 🔵 | Сменить пароли manager + owner от 27.04 | shared server | TBD | висят в `/root/print-calc-initial.txt` (засветились 27.04 при `cat`). Ротация требует координации с другими пользователями сервера | +| 🟢 | password-source mystery в SunTask SSO bridge | не блокер | TBD | `application.ini` SunTask **не содержит** `db.default.params.password` (grep'ом 0 совпадений), но `calc-redirect.php` через `parse_ini_file('production')` живёт и SSO работает. Расследовать откуда читается DB password — для документирования архитектуры (расширение Урока #9). Кандидаты: `Lv7CMS/config.ini`, `resources.db.params.password` (другой Zend key), env-переменная контейнера | | 🔵 | Поднять swap 4-8 GB на сервере | не начат | 5-10 мин | сейчас swap=0, PSI чистый — но без swap-парашюта при OOM-инциденте процесс падает мгновенно. Страховка для крупных билдов / неожиданных пиков. Замечено при diagnostic-разведке 29.04 | | 🟢 | Очистка диска / расширение `/dev/md43` | в течение квартала | TBD | 79% занято (652G/878G, 181G свободно). Сейчас не блокер, но если рост контейнерных volumes продолжится — упрётся. Замечено при diagnostic 29.04 | | 🟢 | Расследование `njsoft_sun_adv_db` 86% CPU spike | не срочно | TBD | snapshot 29.04 10:05 показал 86% CPU + 4.27 GB RAM на этом контейнере, load avg 1.20 (norm). Точечный пик, не критично. Если повторится в графике долгой нагрузки — log-analysis MySQL slow-query | @@ -313,10 +301,6 @@ Smoke на live: 101 колода × 54 = 5454 карт ✅, productsPerSheet=21 /etc/nginx/vhosts/njsoft/calc.suntask.ru.conf.bak-pre-rm-basicauth-20260428-152138 — calc nginx vhost ДО снятия auth_basic ``` -### print-calc v8.1 (27.04.2026) — реминд - -Snapshot `/var/www/print-calc.old.20260427-pre-v81` — оставлен для отката v8.1, observation 24h прошёл, можно удалить (см. бэклог). - --- ## 🔗 Связанные документы и среды @@ -345,7 +329,13 @@ Snapshot `/var/www/print-calc.old.20260427-pre-v81` — оставлен для 6. **Сюда НЕ кладём:** пароли, токены, API-ключи, личные данные клиентов, суммы конкретных сделок. Только техническая правда о ходе работ. 7. **Сюда кладём:** активный трек, что выяснено, гипотезы, следующий шаг, бэклог, риски, ссылки. 8. **Перед обновлением — md5-сверка.** Если работаешь в claude.ai через Project Knowledge, сравни md5 загруженной копии с актуальной (репо/сервер). При расхождении — сначала refresh, потом правки. Иначе риск регрессии (см. инцидент 29.04 в рисках). -9. **Public mirror работает только с redacted-копией.** Полный STATE.md (с реальными IP менеджеров, путями инструментов оператора, internal-деталями) живёт в **приватном** репо `git.suntask.ru/sunprint/print-calc` (или X-локально + сервер). Публичный mirror `git.suntask.ru/sunprint/sunprint-state` получает **redacted-версию**: IP-адреса менеджеров заменены на плейсхолдеры (``), сервер `212.41.28.51` остаётся (DNS-публичный, не секрет). При обновлении полного — повторно прогнать sed-redact на копии, проверить через `grep -E '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b'`, что остался только `212.41.28.51`, только потом коммит/push в public. claude.ai в своих сессиях читает **публичную** версию через `web_fetch` на raw URL `https://git.suntask.ru/sunprint/sunprint-state/raw/branch/main/STATE.md`. Это снимает проблему «устаревший Project Knowledge» (см. правило #8) — у LLM всегда свежая версия, не требует ручных upload'ов. +9. **Public mirror работает только с redacted-копией.** Полный STATE.md (с реальными IP менеджеров, путями инструментов оператора, internal-деталями) живёт в **приватном** репо `git.suntask.ru/sunprint/print-calc` (или X-локально + сервер). Публичный mirror `git.suntask.ru/sunprint/sunprint-state` получает **redacted-версию**: IP-адреса менеджеров заменены на плейсхолдеры (``), сервер `212.41.28.51` остаётся (DNS-публичный, не секрет). При обновлении полного — повторно прогнать sed-redact на копии, проверить через `grep -E '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b'`, что остался только `212.41.28.51`, только потом коммит/push в public. + + **Версионирование URL для claude.ai (обязательно):** claude.ai web_fetch держит собственный кеш на стороне Anthropic-инфраструктуры, **не реагирующий на downstream Cache-Control headers** (даже `no-cache, must-revalidate` — проверено 29.04). Поэтому branch-URL `/raw/branch/main/STATE.md` для claude.ai **НЕ работает** — отдаёт устаревшую версию (та, что claude.ai увидел при первом fetch'е). + + Стандарт: для каждого STATE.md update Code в отчёте указывает short-hash последнего commit'а **и готовый URL** формата `https://git.suntask.ru/sunprint/sunprint-state/raw/commit//STATE.md`. claude.ai делает web_fetch на этот URL — он уникален для каждого commit'а, кеша никогда не было, всегда отдаёт нужную версию. + + nginx `Cache-Control: no-cache, must-revalidate` (с `X-Source: raw-passthrough` маркером) для path'ов `^/[^/]+/[^/]+/(raw|media)/` в `/etc/nginx/vhosts/njsoft/git.suntask.ru.conf` остаётся как страховка для остальных HTTP-клиентов (`curl`, браузеры, второй разработчик, будущие интеграции). Не вредит. --- @@ -369,6 +359,8 @@ Snapshot `/var/www/print-calc.old.20260427-pre-v81` — оставлен для 6. **claude.ai-сессии ≠ secure transport.** Чат-история передаётся через Anthropic-инфраструктуру и хранится у них. Code-сессии — тоже. Любой текст, попавший в чат, считается прошедшим минимум через Anthropic-логи. Это не приватная переписка двух людей. +7. **Accepted risk — отдельная категория, не «забыли ротировать».** Когда credentials попали в чат, но ротация имеет операционную стоимость выше рисковой стоимости (legitimate parties с доступом, бэкап-каналы, привязка к внешним конфигам не нашим), фиксируется как **accepted risk** с явным обоснованием в бэклоге, не как 🔵 pending-задача. Это отличает «забыли» от «знаем и приняли осознанно». Применимо: `njsoft_sun_adv` DB password (29.04 — accepted risk: external team backup-channel). + --- ## 📚 Уроки проекта (постоянные принципы) @@ -509,7 +501,8 @@ grep -q 'token\|@host' .git/config && echo DIRTY || echo CLEAN | Дата | Среда | Длительность | Главное | |---|---|---|---| -| 2026-04-29 | claude.ai (Opus 4.7) → Claude Code (Opus 4.7) | планёрка + merge + Gitea-deployment + 2 incident'а | (1) План dieline-трека: путь Б, Фаза 1 локально (1-2 нед), Фаза 2 интеграция (3-5 сессий). 7 решений TBD. (2) **Регрессия STATE.md:** claude.ai обновила файл от 27.04-baseline, затёрла 28.04. Поймали md5-сверкой, восстановили merge'ем. Урок №12 + правило #8. (3) **Gitea CE задеплоен на git.suntask.ru** — Let's Encrypt, nginx reverse-proxy на 127.0.0.1:3000, docker-compose в /opt/gitea, SQLite. Org `sunprint`, public `sunprint-state` (правило #9, redacted), private `print-calc`. (4) **Incident: token в URL** при smoke clone попал в чат через `cat .git/config`. Поймали за 30 сек, отротировали. Урок №13 + Security-секция. Новые backlog: swap, disk, db-spike, .bak-конфиги. | +| 2026-04-30 | claude.ai (Opus 4.7) → Claude Code (Opus 4.7) | гигиена + push 0e53251 + правило #7 | (1) Push `0e53251` (правило #9 расширено — commit-pinned URL для claude.ai, ушло из локального pending в private remote). (2) Observation v8.1 формально закрыт: 0 ошибок за 48h, `2×200 + 1×400 + 0×500` на `/api/v1/calculate`, 0 quotes за 48h (менеджеры калькулировали без сохранения). (3) Snapshot `/var/www/print-calc.old.20260427-pre-v81` (956 KB) и `/var/www/print-calc/.htpasswd` (мёртвый артефакт) удалены. (4) `njsoft_sun_adv` DB password — accepted risk (правило #7 в Security политике): не ротируется, external team backup-channel. (5) Новый 🟢 backlog: «password-source mystery» — `application.ini` SunTask не содержит `db.default.params.password`, но SSO bridge живёт; расследовать откуда читается. Pre-flight memory↔Gitea API: чисто. | +| 2026-04-29 | claude.ai (Opus 4.7) → Claude Code (Opus 4.7) | планёрка + merge + Gitea-deployment + 2 incident'а + кеш-finding | (1) План dieline-трека: путь Б, Фаза 1 локально (1-2 нед), Фаза 2 интеграция (3-5 сессий). 7 решений TBD. (2) **Регрессия STATE.md:** claude.ai обновила файл от 27.04-baseline, затёрла 28.04. Поймали md5-сверкой, восстановили merge'ем. Урок №12 + правило #8. (3) **Gitea CE задеплоен на git.suntask.ru** — Let's Encrypt, nginx reverse-proxy на 127.0.0.1:3000, docker-compose в /opt/gitea, SQLite. Org `sunprint`, public `sunprint-state` (правило #9, redacted), private `print-calc`. (4) **Incident: token в URL** при smoke clone попал в чат через `cat .git/config`. Поймали за 30 сек, отротировали. Урок №13 + Security-секция. Новые backlog: swap, disk, db-spike, .bak-конфиги. (5) **Finding: claude.ai web_fetch имеет агрессивный собственный кеш на стороне Anthropic-инфраструктуры**, не уважающий downstream `Cache-Control` (даже `no-cache, must-revalidate`). nginx-override применён (для других клиентов остаётся защитой), но для claude.ai используется commit-pinned URL `/raw/commit//STATE.md` как обязательный паттерн. Правило #9 расширено. | | 2026-04-28 | Claude Code (Opus 4.7) | ~6ч | **Большой день. Полная end-to-end интеграция SunTask ↔ calc работает.** (1) SunTask SSO bridge: calc-redirect.php v1→v4→v5→v6, 6 итераций архитектуры. (2) Lv7CMS reverse-engineering: 5 уроков (routing из БД, bootstrap без dispatch, session_save_path override, parse_ini_file process_sections, env под app). (3) Basic Auth снят с calc.suntask.ru через `sed -i` + `nginx -s reload` — 6-й урок добавлен. Подтверждение: POST /api/v1/calculate → 200 от Димы () и от другого менеджера () — оба смогли реально использовать калькулятор | | 2026-04-28 (утро) | Claude Code (Opus 4.7) | ~10мин | observation v8.1 прошёл — 24h без ошибок, 0 пятисоток, restic backup OK ночью | | 2026-04-27 (вечер) | Claude Code (Opus 4.7) | ~3ч | **v8.1 БАГ колод задеплоен.** Pipeline `prepareEngineInput.ts` (вариант 1.5), 10 новых тестов, 93/93 зелёных, smoke на live прошёл |