Commit Graph

1908 Commits

Author SHA1 Message Date
Дмитрий 4dfcde99ba fix(imitation): correct seedPhoneRange columns + import_id FK (F1)
ImitationTestCase::seedPhoneRange used non-existent columns (range_from/range_to/region_name) and omitted the required import_id FK, so every Россвязь-branch test that called it failed. Now seeds a phone_ranges_imports anchor row and inserts phone_ranges with the real columns (def_code/from_num/to_num/operator/region/subject_code/imported_at/import_id), mirroring the verified RossvyazPrefixLookup parsing. Found during Task 5.
2026-06-04 03:54:22 +03:00
Дмитрий f55c224d6a test(imitation): scenario A weighted lottery + distribution stats 2026-06-03 20:21:22 +03:00
Дмитрий 2969f3720f test(imitation): region resolution cascade coverage 2026-06-03 20:08:49 +03:00
Дмитрий 22f6178b2b fix(migrations): clean migrate:fresh resilience (partition parent guard + delta idempotency)
Restores a working migrate:fresh without the reverted blanket catch-all. (1) MonthlyPartitionManager::ensureMonth skips a partitioned table whose parent does not exist yet (targeted pg_class relkind='p' guard) instead of crashing — the initial schema-load runs partitions:create-months before later delta-migrations create their own partitioned tables. (2) migration 0001 runs with $withinTransaction=false so the schema.sql DDL is committed before partitions:create-months opens its second pgsql_supplier connection. (3) re-applies the clean idempotency guards on add_balance_freeze (DROP POLICY IF EXISTS) and add_paused_at (column/index existence checks) since schema.sql already contains those objects. migrate:fresh now rebuilds liderra_testing cleanly; MonthlyPartitionManagerTest 15/15 incl. new resilience guard test.
2026-06-03 20:01:55 +03:00
Дмитрий 544e9e589c feat(imitation): test clients + single-project matrix seeder 2026-06-03 19:37:49 +03:00
Дмитрий 40629276d9 feat(imitation): snapshot forge + condition levers 2026-06-03 19:09:12 +03:00
Дмитрий f8d89e81d1 revert(imitation): drop out-of-scope migration edits from 7c5ca7f6 + dead webhook_log test
Reverts 7c5ca7f6 production-migration edits (load_initial_schema withinTransaction=false + try/catch, idempotency guards) and coupled migrate:fresh guard tests to baseline; imitation suite uses DatabaseTransactions on a pre-migrated DB so the reverted migrate:fresh resilience is not needed for Phase 1. Also drops the orphaned ensureMonth webhook_log test (webhook_log removed from PARTITIONED_TABLES in 2026_05_24_140000_drop_legacy_webhook_artefacts).
2026-06-03 18:58:13 +03:00
Дмитрий 64e962e330 fix(hooks): parse Pest JSON reporter in verify-record + escape dot in tdd-real-test regex
enforce-verify-record extractTestMetrics now recognises the project Pest JSON reporter ({"result":"passed/failed",...}); previously every Pest run was recorded as a failed sentinel, blocking all Pest-verified commits (mirrors enforce-tdd-gate fix 1d2d43a6). enforce-tdd-real-test-verifier TEST_FILE_RE second dot escaped so .env.testing is no longer false-matched as a test file.
2026-06-03 18:51:02 +03:00
Дмитрий 619dc691a9 docs(imitation): session handoff for phase 1 resume (worktree, state, 2 open decisions, subagent rules) 2026-06-03 16:57:18 +03:00
Дмитрий 7c5ca7f688 chore(imitation): Task 0.5 — test env, reference-seed base, migrate:fresh resilience 2026-06-03 16:49:23 +03:00
Дмитрий e03da647c0 docs(imitation): plan — execution status + corrections (namespace, subject codes, Task 0.5 env provision) 2026-06-03 16:25:52 +03:00
Дмитрий a54b0346e9 feat(imitation): deterministic fake DaData phone client 2026-06-03 15:35:46 +03:00
Дмитрий bad947a5b8 docs(imitation): Task 0 — pin verified signatures + plan corrections 2026-06-03 14:57:48 +03:00
Дмитрий dee4a0e1a2 docs(imitation): phase 1 client-imitation spec + implementation plan 2026-06-03 14:52:08 +03:00
CoralMinister bd7b1d3e0f Merge pull request #43 from CoralMinister/feat/deals-city-region
Feat/deals city region
2026-06-02 13:48:18 +03:00
CoralMinister 57e9541775 Merge pull request #42 from CoralMinister/feat/gate-allow-worktree-cd
Feat/gate allow worktree cd
2026-06-02 13:47:47 +03:00
Дмитрий e213f9b01c feat(deals): backfill command for «Город» on existing deals
deals:backfill-region-city fills deals.city from the lead resolved_subject_code (deals -> supplier_lead_deliveries -> supplier_leads) for deals where city is still empty, idempotently and across all tenants (BYPASSRLS). --dry-run reports the count without writing. Whitelisted in artisan-run.yml (dry-run read-only; real run requires confirm_apply). TDD: +4 tests GREEN.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 13:38:10 +03:00
Дмитрий 1d2d43a6f2 fix(tdd-gate): recognize pest JSON reporter failures as RED
composer test / php artisan test emit machine JSON ({"result":"failed",...}); command-not-found and error REDs lack the English Failed keyword the gate looked for, so legit RED runs went unseen and prod-code edits were wrongly blocked. hasFailingTestRun now also matches the structured failure markers. TDD: +1 test; full tools suite 2004 GREEN.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 13:35:05 +03:00
Дмитрий 1609faee8c feat(deals): fill «Город» (deals.city) with resolved region name
The UI «Город» column binds to deals.city but nothing ever populated it — the region was only stored as a numeric code on supplier_leads + the resolution log. RouteSupplierLeadJob now writes the resolved subject name (RussianRegions::CODE_TO_NAME) into deals.city on deal creation (the lead's real region, even if subject_code is substituted on routing step 3), and updates it in the CSV-merge branch when the webhook resolution outranks the tag. New deals now display the region. TDD: +2 tests in RouteSupplierLeadJobTest; 24 job tests GREEN.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 13:16:31 +03:00
Дмитрий 3420f46a59 feat(router-gate): support git -C path for worktree dev
Shell resets cwd each call so a worktree cd does not persist; pointing git at the worktree dir is the cwd-independent way to commit there. classifyGitCommand now strips the leading working-dir flag before all checks, so the real subcommand is classified and all hard-patterns (hook-bypass, force-push, force-add, config-injection) plus the push-main-guard still apply. TDD: plus 6 tests; full tools suite 2003 GREEN.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 13:14:35 +03:00
Дмитрий b05e31c89c feat(router-gate): allow cd into project worktree dirs for worktree dev
PR #41 re-scope enabled 'git worktree' creation but not working inside worktrees: only 'cd app' was whitelisted, so pest/git could not run in a worktree. Add a SAFE_EXACT rule allowing cd into a path with a worktree-/v4-stream- segment, excluding .. and protected segments (.claude/.ssh/.env/runtime/.git) so the cwd-shift read-bypass stays contained. TDD: +6 tests; full tools suite 1997 GREEN.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 13:04:15 +03:00
CoralMinister 237eae7ee0 Merge pull request #41 from CoralMinister/feat/gate-dev-prod-rescope
Feat/gate dev prod rescope
2026-06-02 09:41:03 +03:00
Дмитрий cb32aa9907 feat(gate): re-scope router-gate — allow local dev, keep prod+discipline blocks
composer/npm moved from hard-blacklist to whitelist; git dev-allow (commit/add/branch/switch/checkout/stash/worktree) + push main-guard in shared shell-content-rules; read-only GitHub (get_*/actions_get/actions_list) in mcp-classifier. Prod-safety (deploy/prod-DB/secrets/workflow-triggers/MCP-write), discipline hooks, and main push/merge stay blocked. Spec+plan in docs/superpowers. tools regression 1991 GREEN.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 09:32:39 +03:00
CoralMinister 34b85cf5cc Add files via upload 2026-06-02 08:11:37 +03:00
CoralMinister e2c00d60b1 Add files via upload 2026-06-01 19:07:51 +03:00
CoralMinister 97938c66b2 Add files via upload 2026-06-01 18:48:18 +03:00
CoralMinister 9c8db287ad Add files via upload 2026-06-01 18:11:59 +03:00
CoralMinister b404bf41a8 Add files via upload 2026-06-01 18:10:26 +03:00
CoralMinister d821bfb235 Add files via upload 2026-06-01 18:05:01 +03:00
CoralMinister cc149f324d Add files via upload 2026-06-01 18:01:02 +03:00
CoralMinister 6bd2735973 Add files via upload 2026-06-01 16:26:02 +03:00
CoralMinister 8c50c6db52 Add files via upload 2026-06-01 16:10:59 +03:00
CoralMinister 2000985208 Add files via upload 2026-06-01 14:15:34 +03:00
CoralMinister 544c06a790 Add files via upload 2026-06-01 13:49:51 +03:00
CoralMinister c67c217e43 Add files via upload 2026-06-01 11:10:06 +03:00
CoralMinister a24d084c24 Merge pull request #30 from CoralMinister/worktree-feat+lead-region-resolution
Worktree feat+lead region resolution
2026-06-01 10:51:31 +03:00
Дмитрий 88ae0ac348 docs(claude-md): v2.45 — lead region resolution feature note (§6/§9) 2026-06-01 07:55:57 +03:00
Дмитрий 1107979168 chore(region): add cspell dictionary terms (DaData/Rossvyaz) 2026-06-01 07:39:43 +03:00
Дмитрий 849e467924 fix(region): wrap phone_ranges swap in a transaction + drop stray comment (code-review) 2026-06-01 07:32:15 +03:00
Дмитрий c959c03f55 docs(region): rollout runbook + session progress 2026-06-01 07:21:24 +03:00
Дмитрий 893a142812 feat(region): phone-region:smoke staging command 2026-06-01 07:21:15 +03:00
Дмитрий dae2085ea0 feat(region): RouteSupplierLeadJob — resolve region + persist + fail-safe log + step-3 substitution + CSV-merge 2026-06-01 07:21:08 +03:00
Дмитрий 048f3ad6a2 feat(region): Deal — region_substituted + phone_operator fields 2026-06-01 07:21:01 +03:00
Дмитрий 8be1db34b8 feat(region): LeadRouter cascade routing (exact→all-RF→fallback) + weighted pick variant В + routing_step 2026-06-01 07:19:54 +03:00
Дмитрий 9e05d8f728 test(region): createRoutingSnapshotFromProject accepts regions param 2026-06-01 07:19:46 +03:00
Дмитрий 4bb94257cf feat(region): LeadRegionResolver orchestrator (full qc cascade) 2026-06-01 07:19:37 +03:00
Дмитрий b91b6d5008 feat(region): DaData layer (region map, config, enum, client, budget guard) 2026-06-01 07:19:29 +03:00
Дмитрий b822042a66 feat(region): phone-ranges:import command (parse/map/dry-run/idempotency) 2026-06-01 07:18:23 +03:00
Дмитрий b25aa025e4 feat(region): RossvyazPrefixLookup + RossvyazRecord DTO 2026-06-01 07:18:17 +03:00
Дмитрий 635d631eae chore(region): sync db/schema.sql + CHANGELOG (v8.40) 2026-06-01 07:18:09 +03:00