Commit Graph

2630 Commits

Author SHA1 Message Date
Дмитрий 98497bd2b8 feat(router-gate): classifyPowerShellCommand (whitelist + path-deny + git route) 2026-05-29 20:20:35 +03:00
Дмитрий 1f5d0dbc09 feat(router-gate): powershell tokenizer + hard-blacklist (keep + v4.1 G10) 2026-05-29 20:19:15 +03:00
Дмитрий 1659ca2dd3 feat(router-gate): stream E — subagent-prompt-prefix inheritance (256-bit sentinel, restricted/ paths, isCli guard)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 20:15:12 +03:00
Дмитрий 06d61522cc feat(router-gate): stream A — decomposition detector Direction 3 + v4.1 hard-block (§3.8)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 20:14:06 +03:00
Дмитрий 26a9b9af0d feat(router-gate): normative-content path matcher + content extraction (stream D task 9)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 20:12:58 +03:00
Дмитрий 0c4a6ca23a feat(router-gate): bash gate main() + dynamic path-normalize fallback (fail-CLOSE) 2026-05-29 20:10:58 +03:00
Дмитрий 9b7c2b335d fix(router-gate): stream A skill-scope — restore plan reason strings, arrow/optional-chaining, +reason tests 2026-05-29 20:10:41 +03:00
Дмитрий 23b10d2b7f feat(router-gate): response-scan LLM layer + Stop hook (stream D task 8)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 20:10:23 +03:00
Дмитрий e951193dd5 feat(router-gate): classifyBashCommand integration + bashContentClassify export 2026-05-29 20:09:42 +03:00
Дмитрий 78a88a3bc0 fix(router-gate): stream E — anchor 'всё ок' narrative pattern (no false-match inside 'всё окно') 2026-05-29 20:07:58 +03:00
Дмитрий fbbfdf530b feat(router-gate): response-scan deterministic layer (stream D task 7) 2026-05-29 20:06:52 +03:00
Дмитрий f05a8a66b2 feat(router-gate): bash whitelist + script-execution file-watcher 2026-05-29 20:06:04 +03:00
Дмитрий 826650cb1b feat(router-gate): stream A — skill scope verifier Direction 2 + v4.1 content-level (§3.7)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 20:05:22 +03:00
Дмитрий 76ef10ec26 feat(router-gate): bash hard-blacklist (v3.9+v4.0 C16/#4/#21/#22/#34 + v4.1 G7/G8) 2026-05-29 20:04:40 +03:00
Дмитрий aa28b26047 feat(router-gate): stream E — subagent return scanner + G2 narrative + structured schema
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 20:01:57 +03:00
Дмитрий 1aa09230d0 feat(router-gate): per-tool LLM-judge PreToolUse hook wiring (stream D task 6)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 20:01:48 +03:00
Дмитрий b9b1352bcd fix(router-gate): stream A safe-baseline — dedupe overlap, deep-freeze, dead-var, +tests
Fix 1 (correctness): keywordOverlapCount dedupes `a` into a Set so duplicate
keywords like ['router','router','gate'] ∩ ['router','gate'] yields 2 not 3.
Fix 2 (consistency): deep-freeze all nested threshold objects in DEFAULT_THRESHOLDS
matching the tools/cost-pricing.mjs pattern.
Fix 3 (cleanup): move isMutatingForBaseline check to top of evaluateThresholds
so key/th vars are only computed in the metered-tool branch.
Fix 4 (coverage): add LS=10 and AskUserQuestion=2 soft_flag tests.
Fix 5 (docs): JSDoc on METERED_TOOLS noting TodoWrite → TodoWrite_writes mapping.
Tests: 23 → 29 (+6), all GREEN.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 20:01:00 +03:00
Дмитрий e791d70d0e feat(router-gate): shared classifyGitCommand (readonly/conditional/hard incl G5/G6) 2026-05-29 19:59:14 +03:00
Дмитрий 94938acec8 docs(plans): sync Stream C plan with review fixes (browser_navigate boundary + base64 fixture) 2026-05-29 19:57:12 +03:00
Дмитрий 2a089011d9 feat(router-gate): per-tool LLM-judge pure decision (stream D task 5)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 19:56:38 +03:00
Дмитрий 55fc886087 fix(router-gate): Stream C review — browser_navigate host-boundary (SSRF spoof guard) + boot-scan best-effort note 2026-05-29 19:56:09 +03:00
Дмитрий 2006dbd544 feat(router-gate): injection detect (#34) + approve-git-op reader 2026-05-29 19:55:04 +03:00
Дмитрий e986f8ed93 feat(router-gate): pathDenyOverlay + path/command helpers 2026-05-29 19:52:42 +03:00
Дмитрий 27b9cf654d feat(router-gate): stream A — safe-baseline metering Direction 1 (§3.1.2) 2026-05-29 19:52:32 +03:00
Дмитрий d49371c7b3 feat(router-gate): stream E — cosmetic AskUser detector (v4.1 §4.5)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 19:50:14 +03:00
Дмитрий 6733c8b039 feat(router-gate): shared path-normalize + protected-path detection 2026-05-29 19:50:14 +03:00
Дмитрий a5c3f27419 feat(router-gate): multiJudgeConsensus 3-judge any-YES + cache/budget (stream D task 4)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 19:50:01 +03:00
Дмитрий 7f9afea2a0 feat(router-gate): commit-message-scanner — G11 content scan + llm-judge stub (Stream C) 2026-05-29 19:49:38 +03:00
Дмитрий 5f7f2fcc3b fix(router-gate): stream A path-normalization — $& replacement, narrow catch, BOM/EOF, docs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 19:48:49 +03:00
Дмитрий 8603d73495 test(router-gate): bash-tokenizer segments + subshell + mutating 2026-05-29 19:48:49 +03:00
Дмитрий 04fbd8aa23 feat(router-gate): mcp-tool-classifier — classification map + decision logic (Stream C §5.3, G1/G12) 2026-05-29 19:47:29 +03:00
Дмитрий 490ac1ac0e fix(router-gate): stream E — punctuation-aware stop detection + review nits (BOM/JSDoc/??) 2026-05-29 19:45:57 +03:00
Дмитрий 5d9d34daaa feat(router-gate): glob-restricted-filter — F8 post-execution Glob filter (Stream C) 2026-05-29 19:45:33 +03:00
Дмитрий 5f959ca391 feat(router-gate): bash-tokenizer over shell-quote (stream B)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 19:44:55 +03:00
Дмитрий 2901e708fa feat(router-gate): framework-boot-scanner — project-type detect + boot-scan decision (Stream C F7) 2026-05-29 19:44:26 +03:00
Дмитрий 1ebf365458 feat(router-gate): static-content-scanner — multi-language suspicious-pattern scan (Stream C §5.2) 2026-05-29 19:42:51 +03:00
Дмитрий 2771995661 feat(router-gate): llm-judge single-judge call + interface contract (stream D task 3)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 19:40:55 +03:00
Дмитрий 417fe6521d feat(router-gate): stream A — path-normalization + glob util (§3.1.1) 2026-05-29 19:36:10 +03:00
Дмитрий e233544abb feat(router-gate): llm-judge file-backed cache + budget (stream D task 2) 2026-05-29 19:31:04 +03:00
Дмитрий 5a8aea5642 docs(pilot): snapshot 29.05 day+2 ~21:00 МСК — ADR-018 deployed + cleanup DONE
15 коммитов на main (03df0608..7645b50b), deploy 26646633140 SUCCESS,
cleanup 3 партиций (activity_log + balance_transactions + pd_processing_log
y2026_m05) 18 mismatches → 0. Master verify: All audit chains intact.

Архитектурный gap discovered: Laravel AuditRebuildChain не работает на проде
(crm_supplier_worker не SUPERUSER). Workaround через
.github/workflows/sql-rebuild-audit-chain.yml. Future fix отдельный план P2.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 19:30:48 +03:00
Дмитрий 7a39e4be35 docs(plans): router-gate v4 Stream C sub-plan (static scan + MCP path-deny) 2026-05-29 19:30:21 +03:00
Дмитрий 6f477c82ff docs(plans): router-gate v4 Stream B sub-plan (shell content parsing) 2026-05-29 19:29:17 +03:00
Дмитрий 0ff1271fab feat(router-gate): stream E — askuser-answer-parser (S27/E33/E34 + parse + approval)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 19:27:01 +03:00
Дмитрий 389fa9ef8d feat(router-gate): llm-judge pure prompt/parse helpers (stream D task 1)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 19:23:48 +03:00
Дмитрий 7645b50b05 docs(incidents): record actual cleanup execution + Laravel permission gap
Дополняет handoff чем фактически произошло 29.05.2026:
- 3 партиции (не 1) пришлось чинить: activity_log_y2026_m05 (id=599),
  balance_transactions_y2026_m05 (id=462), pd_processing_log_y2026_m05 (id=191).
  Race condition бил по всем 3 tenant-scoped audit-таблицам.
  Всего 18 mismatches → 0, 9 tenant-scopes, 679 rows rebuilt.
- Laravel AuditRebuildChain не работает на проде: crm_supplier_worker не
  может SET session_replication_role (требуется SUPERUSER). Tests проходят
  потому что используют postgres superuser. Это first-ever rebuild attempt
  на проде раскрыл gap.
- Workaround использован .github/workflows/sql-rebuild-audit-chain.yml
  через sudo -u postgres psql. Future fix — отдельный план.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 19:14:29 +03:00
Дмитрий cec0bb39b8 ci(rebuild): support pd_processing_log + tenant_operations_log
Нужно для cleanup третьей таблицы (pd_processing_log_y2026_m05) после race
condition. tenant_operations_log добавлен для полноты покрытия
4 из 6 audit-таблиц (auth_log + saas_admin_audit_log — BYPASSRLS global,
не per-tenant).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 19:05:33 +03:00
Дмитрий 7f5157b1e3 ci(rebuild): parameterized SQL rebuild workflow (audit chain)
Принимает partition + from_id + table_kind (activity_log | balance_transactions).
Используется для cleanup'а Stage 5 findings 1+2 без перезаписи Laravel
AuditRebuildChain (тот не работает на проде из-за permissions
crm_supplier_worker — не может SET session_replication_role).

Renamed from sql-rebuild-chain-599.yml.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 18:59:28 +03:00
Дмитрий eb4f3953d8 docs(plans): router-gate v4 handoff instructions (5 prompts + merge + deploy)
Handoff document for non-programmer user — how to launch 5 parallel
Claude sessions, monitor progress, merge results, and activate v4.0+v4.1+v4.2.

Contains:
- Ready-to-copy prompts for Streams A, B, C, D, E
- VM Sandbox hands-on guide pointer (Stream F)
- Checkpoint 1 merge instructions
- Stream G (cleanup + register) prompt
- User-run Smokes guide
- Stream H (brain-retro + docs sync) prompt
- Final verification + worktree cleanup

+ cspell vocab additions (промты, мониторьте) for Russian content.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 18:55:38 +03:00
Дмитрий e0d78c6ff3 ci(one-off): SQL rebuild activity_log_y2026_m05 from id=599
Воспроизводит per-tenant логику AuditRebuildChain::rebuildScope() через
PL/pgSQL под postgres superuser'ом (обходит limitation crm_supplier_worker
роли — она не может SET session_replication_role).

После успешного выполнения этот workflow удалить (одноразовый cleanup).

Pre+post verify печатают count mismatches до/после.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 18:55:15 +03:00
Дмитрий 882787a862 ci(artisan-run): allow audit:rebuild-chain --dry-run в read-only whitelist
--dry-run не делает UPDATE → safe to allow без confirm_apply.
Нужно для Stage 5 cleanup handoff doc step 3.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 18:49:45 +03:00