Commit Graph

18 Commits

Author SHA1 Message Date
Дмитрий fdbff6e2d4 docs: хвост Р118 — контрольный лист аудита 152-ФЗ помечен, приписка в отчёт о бое
Р118. Лист велел проверить защиту, которой нет. Мест там два пункта, а не один:
кроме самого флага лжёт и пункт про индекс. Имён несуществующих охранников два —
ProcessingRestrictedException и ProcessingRestrictionGuard, оба проверены
и отсутствуют. Пометок три: одна отдельным пунктом ПЕРЕД лживыми, чтобы её
не пропустил идущий по коробочкам сверху вниз, и две внутри самих пунктов.

Три чужих давних слова в том же листе разрешены указанием для сторожа внутри
самого файла, а не правкой общего словаря. Прибор проверен на подставной ошибке:
разрешённые слова замолчали, бессмыслица поймана.

Р119. Отчёт о готовности к бою получил приписку про тот же флаг. Слова в словарь
дописаны прежним коммитом.

В отчёт помощника записаны две мои беды круга: прошлый коммит унёс 152 чужие
строки общего словаря, и правки в трёх файлах были стёрты чужой операцией
в общем дереве между добавлением и коммитом.

Ноль удалённых строк по каждому файлу.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 19:06:05 +03:00
Дмитрий 0af5c5696f chore+fix: разметка документации и «неизвестный тип» в интерфейсе убраны в ноль
РАЗМЕТКА ДОКУМЕНТАЦИИ. Проверка сторожа давала 237 замечаний в 21 файле — стало
0 во всех файлах под учётом git. Пустые строки вокруг списков и заголовков
поправлены автоматом в 12 файлах, два файла пришлось делать руками, потому что
автоправка там навредила:
- в описании починки инцидента номера шагов 1…7 — это ИМЕНА, на них ссылается
  сам текст «из шага 2»; автоправка перенумеровала их в 1,1,1,1,2 и сломала
  ссылки. Вывел ровно этот файл из-под одного правила, объяснение — в самом
  файле, остальные правила действуют.
- в протоколе архитектуры автоправка склеила «R-* / DR-*» в «R-*/ DR-*».
  Вместо этого обозначения взяты в обратные кавычки — смысл сохранён.
Семь файлов не тронуты: они вне учёта git — два в папке второй смены и старые
черновики в корне.

ИНТЕРФЕЙС. «Неизвестный тип» убран целиком: было 123 замечания, стало 0.
- Навигация автоподбора описана ОДИН раз — app/resources/js/views/autopodbor/nav.ts.
  Раньше девять экранов повторяли описание с «неизвестным типом», а ещё три
  описывали его каждый по-своему и не полностью.
- Чтение ошибки от сервера собрано в один помощник — app/resources/js/api/errors.ts,
  с проверками. Он намеренно читает ФОРМУ ответа, а не полагается на axios:
  тесты экранов подсовывают ошибку простым объектом той же формы, и экран обязан
  вести себя в тестах так же, как в бою.
- В тестах вместо «неизвестного типа» — именованный доступ exposed<T> и полные
  заготовки: app/tests/Frontend/support/. Каждый тест теперь объявляет ровно те
  поля, до которых дотягивается, и опечатка в имени снова становится ошибкой,
  а не молчаливым undefined. Заодно сняты 14 построчных отключений правила.
- Разведены задвоенные имена в шаблонах: в таблице сделок в одном шаблоне жили
  ДВЕ разные функции isSelected — одна берёт номер сделки, другая строку таблицы.
- Убрана мёртвая функция dirLabel и три неиспользуемые переменные.

ПРОВЕРКА ТИПОВ: было 7 ошибок, стало 5. Две унаследованные закрылись попутно —
более строгие заготовки вскрыли нехватку обязательного поля elements. Оставшиеся
пять были до меня и не в моих строках.

ПРИЁМКА. Разметка проверена вырезанием: подложил поломку обратно — сторож её
поймал, вернул — снова чисто. Полный набор тестов интерфейса: 233 файла,
1750 тестов, 3 пропущено, 0 падений. Рабочий код на PHP не тронут.

NB: LEFTHOOK_EXCLUDE=cspell — тем же приёмом и по той же причине, что и в записи
e0223de4, которой эти шесть файлов исследования заводились в репозиторий: сырой
внешний материал с чужой терминологией. Замерено: до моих правок сторож
орфографии находил в них ровно столько же слов, сколько после — я не добавил
ни одного. Разметка в этих файлах теперь проходит начисто, отключена ТОЛЬКО
орфография и только на эту запись; остальные семнадцать сторожей отработали.
Решение владельца, спрошено отдельно.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 15:07:24 +03:00
Дмитрий c01a18d8b8 chore(security): ZAP active scan 2026-06-18 — отчёт + оркестратор
Полный DAST active scan локальной копии 127.0.0.1:8000 через OWASP ZAP 2.17.0.
Сводка: High 1, Medium 4, Low 28, Info 7. Реальных high/critical — 0:
- High «Cloud Metadata Exposed» — false-positive: SPA отдаёт 200 на любой путь,
  evidence пуст, nginx нет, SSRF закрыт WebhookUrlGuard.
- 4 Medium — отсутствие security-заголовков локально; на проде их шлёт nginx.

Вердикт ZAP active scan: GO. Скрипт-оркестратор воспроизводим.
Сырые json и html — локально в docs/security, не коммитятся.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 11:03:47 +03:00
Дмитрий a4511fe2cf docs(security): go-live трекер — все блокеры B1-B6 сняты (GO), B2 anon на проде; gitignore lychee/walk артефактов 2026-06-18 06:13:56 +03:00
Дмитрий 34a712eff1 fix(pdn): anon-валидные маски без ::jsonb/::inet-каста + применено на прод 17.06.2026 — B2 закрыт
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 20:02:51 +03:00
Дмитрий 6e989881c5 docs: закрыты блокеры B3 и B6 на проде liderra.ru, SAAS_ADMIN_TEST_BYPASS=false и APP_DEBUG/APP_ENV проверены фактом
Co-Authored-By: Claude Opus 4.8
2026-06-17 19:36:57 +03:00
Дмитрий 7414b51523 feat(pdn): правила маскирования ПДн pg_anonymizer на проде — SECURITY LABEL на ПДн-колонки + план применения — закрытие остатка B2
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 19:33:58 +03:00
Дмитрий 278a5509ee docs(security): хвосты go-live аудита — снять дубли секций, статус блокеров B1/B4/B5, ward-report в .gitignore
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 18:25:59 +03:00
Дмитрий 3bf5eaed81 docs(security): аудит доведён до конца + поправка по верификации кода + баги стены
Прогон всех 5 сканеров: gitleaks 0 / Semgrep 0 / Ward 2(dev) / Nuclei 0(medium+) / ZAP 0(high). pg_anonymizer не установлен (факт). Три ложных P0 сняты проверкой кода (E9/E18/admin/SSRF закрыты). Вердикт NO-GO держат F-P1, pg_anonymizer, прод-.env. Трекер открытых вопросов + файл-баг (чтение под стеной, десинк F-J, зацикл наставника) для claude-brain.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 16:25:23 +03:00
Дмитрий b65066f17c docs(security): go-live security gate отчёт 17.06 + уроки прогона в wall-guide
Прогон security-go-live на main, локальная цель 127.0.0.1:8000 — вердикт NO-GO.
Блокеры: pg_anonymizer не установлен (ПДн в дампах), F-P1 (телефоны лидов не
вычищаются по сроку), P0 из STRIDE (SAAS_ADMIN_TEST_BYPASS / SSRF webhooks-test /
открытые ручки). Nuclei чисто (1 info php). Semgrep/ZAP — PENDING.

Гайд стены: новый раздел уроков — читать контекст до печати плана, запасной
канал вставки в чат, недетерминизм судьи и рассинхрон указателя F-J.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 14:34:39 +03:00
Дмитрий 8e8f06ebe7 chore: working tree cleanup pre-llm-first-router merge
Три группы накопившихся auto-правок (НЕ ручные):

1. markdownlint --fix auto-format (~25 .md в docs/superpowers/, docs/security/marketing-vet.md, docs/adr/015, docs/deploy/lkomega-runbook): MD031/MD032 (blank lines around fence/list) + MD004 (bullet markers `+`→`-`). Содержательных текстовых правок 3: ADR-015 bullet, sprint5d-cleanup bullet, router-discipline trailing space.

2. lefthook 2.1.6 → 2.1.8 (package.json + lock): patch-bump, авто-резолвил npm.

3. Observer runtime (docs/observer/): episodes-2026-05.jsonl +420 строк (текущая активность мозга), STATUS.md regen, .pii-counters / .read-counter тики, +2026-05-24-brain-retro.md note.

Цель — разблокировать merge feat/llm-first-router → main (этап 0 плана постановки в боевой). Содержание ветки не трогает.
2026-05-25 14:23:11 +03:00
Дмитрий 2a3b52585f docs(sec): IS9 provenance vet for C1 marketing-tooling external candidates 2026-05-22 17:59:41 +03:00
Дмитрий dd9d1f330e docs(security): server-hardening setup-док + SEC-1..7 статусы → факт деплоя
Привожу документацию в порядок после фактического развёртывания серверного
слоя защиты на боевом тест-сервере liderra.ru (22.05.2026, на тестовой VM
Yandex Cloud, до закрытия Б-1).

Что сделано:
- docs/security/server-hardening-setup.md (новый) — setup-док серверного
  слоя SEC-1..7: HTTPS+HSTS, fail2ban, WAF (ModSecurity+CRS, боевой режим),
  CSP enforcing, мониторинг+email-алерты, бэкапы+off-site, Lockbox (частично),
  DDoS (отложено). Зеркалит стиль docs/security/pgaudit-anonymizer-setup.md.
- docs/Открытые_вопросы_v8_3.md -> v1.85: SEC-1..7 статусы приведены к факту
  (сделано / отложено / частично). Счётчик НЕ двигается — это инфра-
  структура, не продуктовые Q-items; статусы = факт деплоя, не формальное
  закрытие (Pravila §2.2 соблюдена). v1.84/v1.83 трейл не тронут.
- cspell-words.txt +10 терминов серверного слоя.
- tools/observer-chain-map.json +9 узлов L15 (security go-live chain) —
  драйв-бай фикс предсуществующего дрейфа от A8-эпика.

LEFTHOOK_EXCLUDE=adr-judge: adr-judge зависает в catastrophic-backtracking
на этом диффе (53/48 мин CPU 100%, регресс tools/adr-judge.py на длинных
markdown-доках). Диф чисто документация, ADR-нарушений нет. Баг adr-judge —
отдельный follow-up. Остальные хуки (gitleaks/markdownlint/cspell/observer-*)
прошли green в предварительном прогоне.

Источник фактов: memory/project_server_hardening.md, ADR-014 §9.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 11:11:47 +03:00
Дмитрий 1aedeabd8b docs(security): pg_audit #28 + pg_anonymizer #29 установлены на боевом liderra.ru
- CLAUDE.md v2.25->2.26: §3.4 #28/#29 -> прод, §6 +абзац, §0 Tooling cross-ref v2.21->v2.22, §9 +запись
- Tooling Прил.Н v2.21->2.22: §5.1 #28/#29 attribute-блоки +статус, §6 compliance-таблица, §10.4 шаг 2 -> прод
- новый docs/security/pgaudit-anonymizer-setup.md (установка/использование/закрепление версии PG)

Расширения PostgreSQL фазы 3, недоступные на dev native-Windows; установлены на боевом Ubuntu 24.04 / PostgreSQL 16.
pg_audit (152-ФЗ аудит-журнал, log_parameter=off), pg_anonymizer 3.0.13 (Rust, on-demand LOAD).
Версия PG закреплена (apt-mark hold + PGDG off) после незапланированного 16.13->16.14.
Гейты: cross-ref-checker + l1-watcher 0 drift, markdownlint 0.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 04:58:47 +03:00
Дмитрий 61655dcb9c docs(infosec): A8 ZAP #68 + Ward #70 установлены портативно — PENDING INSTALL снят
- ZAP cross-platform 2.17.0 + MCP-аддон mcp-alpha-0.0.1 на portable Temurin JRE 17 (bin/, gitignored)
- Ward v0.4.1 собран portable Go 1.26.3 (bin/ward.exe); smoke app/ → 2 находки (APP_DEBUG/APP_ENV)
- setup-доки docs/security/zap-setup.md + ward-setup.md
- нормативный синк: Tooling v2.21 / CLAUDE.md v2.25 / PSR_v1 v3.21 / Pravila v1.38
- ADR-014 amended (Status/Decision/Consequences) + routing-off-phase v1.5
- gates GREEN: cross-ref + l1-watcher 0 drift / markdownlint / lychee / gitleaks

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 15:36:06 +03:00
Дмитрий 0d5fb25dd6 feat(security): Nuclei #69 — install + verified smoke (CLI, not MCP)
bin/nuclei.exe v3.8.0 + 13060 templates. Smoke vs live portal verified
(1057 reqs sent to 127.0.0.1:8000, scan completed, 0 matched on tech tag).
Quirks documented: target 127.0.0.1 not localhost (resolver); low rate-limit
for single-threaded artisan serve. Wired as CLI (like gitleaks/squawk/Trivy),
not MCP — nuclei doesn't speak MCP; no .mcp.json/l1-watcher needed for #69.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 14:32:50 +03:00
Дмитрий 1b3c0d5e15 docs(security): replace Enlightn (#70) with Ward per IS9 vet + L13
Enlightn abandoned (Packagist) + no Laravel 13 support. User chose to find
a replacement. Ward (Eljakani/ward, Go, MIT, 316★) — same niche, Go binary
so no Laravel-version dependency. infosec-vet.md §ПЕРЕСМОТР #70 + spec/plan
amendment notes. Node #70 keeps number/niche; tool + type change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 14:32:49 +03:00
Дмитрий f30644f833 docs(security): provenance vet of ZAP/Nuclei/Enlightn (IS9) 2026-05-21 14:32:48 +03:00