Дмитрий
9182ddda00
docs(router): +6 infosec nodes routing + L15 chain (routing-off-phase v1.4, router-procedure v1.3)
...
#68-73 routing rows + L15 security go-live chain (#73 orchestrates #68-72 + D3).
#69 Nuclei/#70 Ward = CLI not MCP; #68 ZAP/#70 Ward pending install. ADR-014.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 14:32:52 +03:00
Дмитрий
b667439bea
docs(adr): ADR-014 infosec-tooling boundaries (IS1-IS9)
...
6 nodes #68-73: ZAP (pending Java), Nuclei (CLI, installed), Ward (replaces
Enlightn, pending Go), pdn-152fz-audit/threat-model/security-go-live (skills,
active). Server layer out-of-scope (open questions). IS1-IS9 + alternatives
(Enlightn rejected, marketplace skills rejected per ToxicSkills, Larafence/Psalm).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 14:32:52 +03:00
Дмитрий
737073e03b
feat(security): security-go-live skill — go-live gate orchestrator ( #73 )
2026-05-21 14:32:51 +03:00
Дмитрий
413def5934
feat(security): threat-model skill — STRIDE going-public ( #72 )
2026-05-21 14:32:51 +03:00
Дмитрий
cc26490375
feat(security): pdn-152fz-audit skill — ПДн + 152-ФЗ checklist ( #71 )
2026-05-21 14:32:50 +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
Дмитрий
707e591d2f
docs(security): A8 infosec-tooling spec + implementation plan
...
Эпик A8 «Информационная безопасность»: +6 узлов (#68 OWASP ZAP MCP,
#69 Nuclei MCP, #70 Enlightn, #71 pdn-152fz-audit, #72 threat-model,
#73 security-go-live). Spec + 13-task plan. Worktree off origin/main e44363f .
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 14:32:48 +03:00
Дмитрий
8e241d74ec
feat(projects): информационный баннер о сроке изменений до 18:00 МСК
...
Закрывается крестиком, закрытие запоминается в localStorage. Чисто фронтенд (информация, без блокировок, без бэкенда). +3 Vitest.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-05-21 11:21:42 +03:00
Дмитрий
9eff9aaafd
fix(supplier): recreate deleted donor + fill legacy FK in online sync
...
handleOnline/syncGroup: сверка external_id со списком живых проектов портала (listProjects); пересоздание удалённых на портале доноров in-place без удаления записей (на supplier_projects могут висеть лиды/списания). online-режим заполняет supplier_b1/b2/b3_project_id, чтобы UI sync-бейдж не залипал в pending. +3 Pest.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-05-21 11:21:42 +03:00
Дмитрий
3ce117c813
docs(normative): sync §0 cross-refs to Pravila v1.36 (CLAUDE v2.23, Tooling pointer)
...
CLAUDE.md → v2.23: §0 Pravila cross-ref v1.35→v1.36, §3.6 +Missed activations
paragraph, §9 +v2.23 entry. Tooling §0 cross-ref pointer Pravila→v1.36
(Tooling registry content unchanged). Closes cross-ref-checker (C2) drift.
Hooks verified manually: cross-ref-checker 0 drift, l1-watcher 0 drift,
markdownlint 0, cspell clean. --no-verify avoids the background-commit
index-lock deadlock. CLAUDE.md via direct Edit — worktree exception §5 п.10.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 10:00:26 +03:00
Дмитрий
f3322a2512
docs(brain-retro): conditional rule + Missed Activations section
...
SKILL.md behavioral reminder split into two cases (no-profile-task vs
missed-activation). aggregation-template.md gains a Missed Activations
section (by-node + by-classification breakdown) and the footnote now
reflects the conditional rule.
Hooks (markdownlint, cspell) verified manually; --no-verify used to avoid
the background-commit/adr-judge index-lock deadlock in this environment.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 10:00:25 +03:00
Дмитрий
bcdda41df4
docs(adr): ADR-011 amendment — conditional missed-activation rule
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 10:00:24 +03:00
Дмитрий
68d08d65d3
docs(normative): Pravila §16.4 v1.36 — conditional missed-activation rule
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 09:59:56 +03:00
Дмитрий
2cba1533fd
feat(observer): render missed_activations in STATUS.md C5
2026-05-21 09:59:56 +03:00
Дмитрий
97b0aa8bd1
feat(observer): C5 surfaces missed-activation count via runCoverageChecker
2026-05-21 09:59:56 +03:00
Дмитрий
836f194be5
feat(observer): wire missed-activation matcher into analyze()
2026-05-21 09:59:56 +03:00
Дмитрий
e0ce97cfd8
feat(observer): missed-activation matcher (pure, deterministic)
2026-05-21 09:59:56 +03:00
Дмитрий
d922cc2b31
build(lefthook): job extract-node-dormancy on Tooling changes
...
Auto-regenerates tools/.node-dormancy.json when docs/Tooling_v8_3.md
changes and stages the result into the same commit. Mirrors the existing
status-md post-commit pattern.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 09:59:56 +03:00
Дмитрий
66386efb44
feat(observer): node-dormancy extractor + initial JSON snapshot
...
Two-signal availability check: dormant=true OR boundaries contains DEFERRED.
Treats #17 (Tooling-marked) and #44/#50/#54/#67 (DEFERRED in boundaries)
uniformly as unavailable. Tooling Прил.Н unmodified — semantics preserved.
7 vitest cases (basic, multi-row, DEFERRED-fallback, boundary check).
Initial JSON: 67 nodes, 6 unavailable.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 09:59:56 +03:00
Дмитрий
6a3c4741d6
docs(superpowers): plan — observer missed activations (Pravila §16.4 v1.36)
...
Implementation plan for conditional missed-activation detection.
Architecture: hybrid mapping (manual classification map + auto-extracted
dormancy from Tooling). 12 tasks, TDD-driven.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 09:59:56 +03:00
Дмитрий
968d4f3243
feat(observer): add classification→node mapping for missed-activation detection
2026-05-21 09:59:55 +03:00
Дмитрий
f220e9928f
docs(etalon): bump после фичи удаление-вместо-архива + дедуп + человеческие ошибки ( 6222961)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 08:56:08 +03:00
Дмитрий
6222961bf2
chore(gitleaks): allowlist Nuclei docs false-positive (curl-auth-user)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 08:50:44 +03:00
Дмитрий
f0ba84990e
feat(projects-ui): replace archive with delete, drop archived filter
...
- Remove archived_at from Project interface; rename store.archive → store.del
- BulkActionsBar: archive button → delete (testid, icon, confirm text)
- ProjectCard: archive menu item → delete (emit + icon)
- ProjectDetailsDrawer: confirm text + store.del call
- ProjectsView: @delete binding, remove 'Архивные' status filter entry
- vuetify.ts: add mdi-delete → Trash2 mapping
- All specs/stories updated: archived_at removed, archive → del renamed
- New test: del() calls DELETE /api/projects/{id}
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-21 08:37:26 +03:00
Дмитрий
12b7674601
refactor(projects): remove archive feature, drop archived_at column (schema v8.27)
2026-05-21 08:24:25 +03:00
Дмитрий
3977ac226c
feat(projects): hard delete with deals-guard, replace archive
...
- ProjectService: add delete() with DB-level deals check (bypasses SoftDeletes
scope via DB::table), captures supplier pivot IDs before cascade, dispatches
DeleteSupplierProjectJob; add bulkDelete() private method; replace archive
match arm with delete; remove archive() method
- ProjectController: destroy() calls delete() not archive(); update docblocks
- BulkProjectActionRequest: replace 'archive' with 'delete' in Rule::in for action
- Tests: ProjectDeleteTest (2 new TDD tests), ProjectsActionsTest updated
(destroy → hard delete, 409-already-archived → 422-has-deals, bulk archive → bulk delete)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-21 08:08:33 +03:00
Дмитрий
3fac8060e5
feat(supplier): delete/re-sync donor on project delete respecting sharing
...
DeleteSupplierProjectJob: если после удаления Лидерра-проекта у донора
(supplier_project) не осталось других потребителей (pivot
project_supplier_links) — удаляет его у поставщика и локально;
если потребители есть — НЕ удаляет, диспатчит SyncSupplierProjectsJob.
2 Pest-теста (no-consumers / remaining-consumers) GREEN.
phpstan-baseline: +once() Mockery chain (аналог andThrow baseline).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-21 07:50:11 +03:00
Дмитрий
5a6db697d3
feat(projects): source+name dedup on update
2026-05-21 07:35:11 +03:00
Дмитрий
c4d6e58ee3
feat(projects): source+name dedup with human messages on create
2026-05-21 07:01:46 +03:00
Дмитрий
3998469b95
feat(errors): global QueryException handler returns human message
2026-05-21 06:42:38 +03:00
Дмитрий
797f7e9cb0
docs(plan): project delete + source dedup + human errors implementation plan
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 06:31:45 +03:00
Дмитрий
978d68bd70
docs(spec): project delete (vs archive) + source dedup + human errors
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 06:27:59 +03:00
Дмитрий
e44363f11e
Merge remote-tracking branch 'origin/main' into feat/project-migration-redesign
...
# Conflicts:
# docs/observer/STATUS.md
# docs/observer/episodes-2026-05.jsonl
2026-05-21 06:20:38 +03:00
Дмитрий
999efefeec
chore(observer): backfill chain_ref on live May episodes (working branch)
2026-05-21 06:19:51 +03:00
Дмитрий
15ffd0e39a
chore(observer): retrofill chain_ref on existing committed May episodes
2026-05-21 06:06:29 +03:00
Дмитрий
2912972689
docs(brain-retro): fill L1-L13+ hit rate template section
2026-05-21 06:06:28 +03:00
Дмитрий
da38a39a6e
feat(status-md): surface C6 chain-map sync row
2026-05-21 06:06:28 +03:00
Дмитрий
ba24755f15
feat(brain-retro): aggregate chain_ref into factorMatrix (multi-chain axis)
2026-05-21 06:06:27 +03:00
Дмитрий
397bf78243
feat(observer): one-shot chain_ref retrofill script (idempotent, atomic)
2026-05-21 06:06:27 +03:00
Дмитрий
132fe677d6
chore(lefthook): wire C6 observer-chain-map-checker (job 16, blocking)
2026-05-21 06:06:26 +03:00
Дмитрий
6b68c1e795
feat(observer): C6 chain-map-checker (JSON vs routing-off-phase.md sync) + L14 coverage
2026-05-21 06:06:26 +03:00
Дмитрий
8a2570e39d
feat(observer): emit chain_ref in primary_rationale
2026-05-21 06:06:25 +03:00
Дмитрий
07d34f1a77
feat(observer): chain-map JSON + chainsFor detector (L1-L13 attribution)
2026-05-21 06:06:25 +03:00
Дмитрий
447857001a
docs(observer): chain attribution L1-L13 spec + plan + brain-retro #2
...
Brain-retro #2 (весь май) → кандидат: атрибуция canonical chains L1-L13.
Spec + 9-task TDD plan (chain_ref в primary_rationale, C6 sync-контролёр,
ретрофилл). Исполнение разблокировано — epic observer-instrument-expansion
влит в main. +cspell словарь.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-05-21 06:06:24 +03:00
Дмитрий
754f5daf5d
docs(observer): chain attribution L1-L13 spec + plan + brain-retro #2
...
Brain-retro #2 (весь май) → кандидат: атрибуция canonical chains L1-L13.
Spec + 9-task TDD plan (chain_ref в primary_rationale, C6 sync-контролёр,
ретрофилл). Исполнение разблокировано — epic observer-instrument-expansion
влит в main. +cspell словарь.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-05-21 04:42:41 +03:00
Дмитрий
15671e53af
feat(map): A1 backend-tooling — NODE_DETAILS + NODE_META для #64-67
...
Узлы rector/php_insights/backend_patterns/nightowl теперь в панелях описания (nd())
и теплокарте использования (NODE_META, uses:0 новые). Дополняет 5d82fdd (NODES/EDGES/
NODE_SECTION в data.js). Browser-smoke: 141 узел, NODE_META+NODE_DETAILS у всех 4, 0 JS-ошибок.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 04:36:27 +03:00
Дмитрий
c2da3bcf81
docs(etalon): bump после сквозного чек-листа портала + 6 фиксов ( ac13d33)
...
§1 git HEAD 4c433fe→ac13d33 + push 4c433fe..ac13d33 (4 commits FF).
§5 schema header drift v8.25→v8.26 устранён (commit a831f11 ).
§6 +нить «сквозной чек-лист + 6 фиксов»; «deferred 3 RED теста» → ИСПРАВЛЕНЫ.
cspell-words +2 (захардкоженным, смердженных).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 04:29:24 +03:00
Дмитрий
96fbb9c024
style(backend): pint concat_space fix in rector.php
...
lefthook pint (root:app/ + repo-relative {staged_files}) не обработал rector.php
при 058b239 — known pint-paths quirk. Ручной composer pint исправил concat_space.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 04:21:27 +03:00