Skip to content

Tech Debt — Resolved & Archived (immutable history) ​

Снимок закрытых TD-entries и тех, что относятся к архивированным стратегиям (per ADR-024). Living tech-debt backlog — docs/operations/tech-debt-backlog.md.

Файл immutable: создан 2026-05-20 при разделении backlog'а. Новые закрытия добавлять append-only.

Header history (хронология обновлений backlog'а) ​

Сводки циклов из старого backlog'а — оставлены для traceability.

  • 2026-05-06 (Spec-Driven Coverage Phase 0 — test-coverage audit) — Doc-only sub-round. Созданы docs/operations/test-coverage-matrix.md (172 rule-IDs G/BA/DIR/MK/MR/MA), docs/specs/feature-liveness-matrix.md (143 LIV-IDs across 50 feature groups, 16 mapped post-TD-31/32 closure — LIV-1.4 via tests/rtds_hook_e2e.rs, LIV-1.7 via tests/rtds_active_cancel.rs — plus 2 partial для LIV-1.3 и LIV-1.9; 125 unmapped strict + 2 partial), docs/operations/acceptance-criteria-trading.md (10 Gherkin AC для top critical paths), test-audit-report.md (1572 tests classified into Bucket A=210 / B=1230 / C=47), и phase-0-signoff-2026-05-06.md (BLOCKING gate — 6 decision points D1..D6). New pm-test-utils crate (2985 LOC, 73 unit tests, clippy clean). CI gates coverage.yml + mutation-nightly.yml. Helper scripts scripts/{check-requirement-coverage,check-liveness-coverage}.py. Cross-mapping с liveness-audit-2026-05-06.md: TD-31 + TD-32 CLOSED; TD-33 PARTIALLY CLOSED. 22 NEW TDs (TD-35..TD-56) для silent-broken-suspect LIV-IDs — full table в test-audit-report.md. 8 HIGH-risk financial-system gaps escalated. Memory anchors: feedback_spec_driven_tests, feedback_silent_feature_broken, feedback_worktree_isolation.

  • 2026-05-04 (ADR-009 Phase 9 — legacy cleanup) — По прямой user-авторизации удалено ~5.0 KLOC legacy capture/replay кода: crates/pm-bot/src/io/clob/simulator/{engine,replay}.rs (≈2.4 KLOC), crates/pm-bot/src/persistence/capture/poller_compat.rs + tests (≈546 LOC), crates/pm-bot/tests/e2e_hook_parity_replay.rs (103 LOC), весь xtask/ workspace member с migrate-cyyz-to-parquet (≈559 LOC), .cargo/config.toml (xtask alias), и 260 MB cyyz-poller.db source artifact. pm-analytics' replay/sweep/ whatif sub-commands схлопнуты — JSONL.zstd / Parquet единственный принимаемый input. 4 tests/e2e_*_replay.rs переписаны на frozen-v1 Parquet branches. Workspace = 7 CORE members (xtask gone). Tests 1597 → 1561 green, 0 failed, 5 ignored.

  • 2026-05-04 (ADR-009 Phase 7 — test migration to capture-fixtures) — Мигрировано 9 cyyz-replay E2E тестов (bucket-arb / directional / maker / maker-rebate) и 3 ws_load теста из #[ignore] на default-on. record_ws_fixture retained как deprecated stub. Все replay-тесты читают inline frozen-v1 fixtures (~7.3 MB total). Новый replay_determinism.rs (10× identical SHA256 gate) + capture_smoke.rs (round-trip + Parquet schema parity). Workspace = 7 CORE crates + 1 utility (xtask).

  • 2026-05-03 (X2.5 — final closure docs + production-ready verdict) — Doc-only sub-round. Создан multi-wallet-migration-runbook-2026-05-03.md (537 LOC). Закрыты TD-7 (paired maker-rebate) и TD-27 (dashboard rebuild). Verdict обновлён до READY for sustained 24/7 production. Implementation queue пуст впервые с создания файла. Тесты: 1071 pm-bot lib + 27 pm-cli + 28 pm-dashboard + 18 pm-sdk = 1144 green, 0 clippy.

  • 2026-05-03 (X2.1..X2.4 — ADR-015 multi-wallet sprint) — ADR-015 Accepted; X2.2 FE-1 encrypted wallets.db (Argon2id + AES-256-GCM)

    • 6 pm-cli wallet subcommands; X2.3 FE-2 plaintext config.db + 7 pm-cli strategy subcommands + FE-5 budget predicate; X2.4 WebUI configurator (5 Vue views + /api/wallets/* + /api/strategies/*).
  • 2026-05-03 (X5.1..X5.4 — TD-7 paired maker-rebate sprint) — ADR-011 Accepted; X5.2 pure evaluator + 17 unit tests; X5.3 state machine + integration tests (Decision::CallMergePositions); X5.4 runbook. Lib tests 980 → 1014 (+34). Phase 1 single-side parity bit-identical при MAKER_REBATE_PAIRED_ENABLED=false. Теперь ARCHIVED-BY-024.

  • 2026-05-03 (X3 strategy bug-fix sprint) — TD-2 / TD-3 / TD-4 bundle: bucket-arb pricing-mode persistence + R8-2 drift detector + TUI badge. 964 lib tests, 0 clippy. Теперь ARCHIVED-BY-024.

  • 2026-05-03 (TD-27 scope finalization) — ADR-012 Accepted (585 LOC). Split pm-dashboard на Rust axum backend + Vue 3 SPA. Stack: Vue 3 + Vite + TypeScript + Pinia + PrimeVue (Aura dark) + Chart.js

    • Caddy + Docker Compose.
  • 2026-05-03 (user-decision sweep) — User прогнал весь backlog через 5 AskUserQuestion раундов. Implement now / defer with architecture / delete для каждой строки. Удалены: TD-15, TD-16, TD-25, TD-26, testnet validation, Telegram / SMTP backends.

  • 2026-05-03 (alerts + retention sprint) — TD-12a alerts engine (application/alerts/, 4 stock rules, LogSink baseline, +27 lib tests); TD-11 RESOLVED via pm-cli journal gc + auto_prune (+16 lib tests).

  • 2026-05-03 (pre-production sweep) — TD-1 OBSOLETE, TD-6 RESOLVED, TD-8 RESOLVED, TD-17 OBSOLETE, TD-2/3/4/5 explicit deferral docs.

  • 2026-05-03 (next-iteration polish N1..N7) — clean-rewrite db / journal schema ladder в single-shot installer at schema_version = 1; TD-19 / TD-22 OBSOLETE; TD-21 + TD-23 + TD-24 RESOLVED; TD-18 RESOLVED.

RESOLVED ​

#StatusClosure notes
TD-1OBSOLETE 2026-05-03pm-orchestrator crate removed from the workspace; original NEG_RISK_ADAPTER_ADDRESS test-compile errors unreachable from the start.
TD-8RESOLVED 2026-05-03scripts/cleanup-worktrees.sh shipped (interactive listing + --dry-run + --force; skips primary checkout + locked worktrees).
TD-9MERGED into TD-27Reframed by user 2026-05-03: dashboard rebuild surfaces "trading terminal-style analytical info" — visually readable data из underlying log/event stream. Implementation tracked под TD-27.
TD-10MERGED into TD-27Comparison overlay tracked под TD-27 dashboard rebuild; reuses existing PrimeVue ui-components.
TD-11RESOLVED 2026-05-03pm-cli journal gc + application::auto_prune scheduler shipped (canonical journal::gc primitive, 4 env knobs, +16 lib tests). Runbook journal-retention-2026-05-03.md.
TD-12RESOLVED 2026-05-03Alerts engine + LogSink baseline shipped (application/alerts/, 4 stock rules, +27 lib tests). Историческая страница alerts-2026-05-03.md в docs/history/.
TD-13MERGED into TD-27Order management from UI scoped to cancel-only (no modify) by user 2026-05-03. ADR + impl под TD-27.
TD-14MERGED into TD-27Sharpe / Sortino / max drawdown tracked под TD-27 — analytical dashboard widgets.
TD-15DELETED in cleanup 9fe2e5f 2026-05-03Never user-scoped.
TD-16DELETED in cleanup 9fe2e5f 2026-05-03Never user-scoped.
TD-17OBSOLETE 2026-05-03local_api::serve и webhook::server уже разделяют axum with_graceful_shutdown pattern; backport не нужен.
TD-18RESOLVED 2026-05-03metrics_loop tokio::spawn wired в main.rs рядом с local_api::serve. Live SSE smoke 1Hz cadence со всеми Phase 7c + TD-21 RTDS counters.
TD-19OBSOLETE 2026-05-03Subsumed by clean-rewrite single-shot installer at schema_version = 1.
TD-20RESOLVED 2026-05-03bot_kv_state ships как часть clean-rewrite; HistoryWriterPersistClient implements PersistClient via DbCommand::PersistKv.
TD-21RESOLVED 2026-05-03RTDS observability metrics wired через BotEvent::MetricsTick (10 fields, forward-compat).
TD-22OBSOLETE 2026-05-03Обе ladders схлопнуты в единый init_schema + init_journal_schema pair stamped at schema_version = 1.
TD-23RESOLVED 2026-05-03pm-bot clippy warnings 43 → 0 (N4 polish batch).
TD-24RESOLVED 2026-05-03rtds_probe.rs HTML-tag rustdoc warning fixed in N5.
TD-25DELETED in cleanup 9fe2e5f 2026-05-03Telegram backend — never user-scoped.
TD-26DELETED in cleanup 9fe2e5f 2026-05-03SMTP backend — never user-scoped.
Testnet validation rowDELETED in cleanup 9fe2e5f 2026-05-03Never user-scoped.
TD-27RESOLVED 2026-05-03 (X1.0..X1.5b + X2.4 complete)Dashboard UI redesign shipped end-to-end. X1.0 ADR-012 Accepted (585 LOC) — split pm-dashboard на Rust axum backend (REST + SSE proxy) + Vue 3 SPA at frontend/pm-dashboard-web/. X1.1 frontend scaffold + pnpm link to ui-components. X1.2 backend REST endpoints /api/local/*. X1.3 Pinia stores wired to SSE + REST. X1.4a darkPreset + PnL chart + WalletView migration. X1.4b chunks + Compare view + persistence + events + retired routes. X1.5a cancel UI hardening (single-row + 5s undo + paranoid bulk gate; ADR-013). X1.5b risk widgets (RiskBadge / Annualisation row / EquityCurve / DrawdownChart; ADR-014). X2.4 WebUI configurator (wallet/strategy CRUD + 5 Vue views; ADR-015 §D8/D9). Bundled TD-9 / TD-10 / TD-13 / TD-14. 28 pm-dashboard integration tests. Trading hot path bit-identical.
FE-1RESOLVED 2026-05-03 (X2.2 complete)Encrypted multi-wallet store shipped per ADR-015. Encrypted wallets.db (Argon2id KDF + AES-256-GCM, per-DB salt) + 6 pm-cli wallet subcommands. pm-bot startup loader. BOT_WALLET_LABEL semantic-Optional ⇒ legacy .env path bit-identical при unset. WALLETS_MASTER_PASSPHRASE mandatory when label set. Migration runbook multi-wallet-migration-runbook-2026-05-03.md. Lib tests 1014 → 1071. Commit 0f2978f.
FE-2RESOLVED 2026-05-03 (X2.3 complete)SQLite strategy-config store shipped per ADR-015. Plaintext config.db (strategies + strategy_audit tables) + 7 pm-cli strategy subcommands. strategy_audit FK на каждую mutation. INV-3 cross-check в main.rs. BOT_STRATEGY_LABEL semantic-Optional ⇒ legacy env-block path bit-identical. 27 pm-cli integration tests. Commit 33b0402.
FE-5 (base predicate)RESOLVED 2026-05-03 (X2.3 complete)Passive synchronous budget predicate shipped per ADR-015 §D6: budget_limit_usd ≤ wallet_balance + Σ(other enabled strategies' limits on same wallet_label). Runs at provisioning time only; NOT a runtime actor. WebUI form wires тот же predicate server-side (422 on failure). Reinvestment toggle — отдельная open запись в backlog. Commit 33b0402.
Headless MetricsTick ingestRESOLVED 2026-05-03 (X6 cleanup batch)tracing::info!(target: "metrics_tick", …) emit path always-on regardless of BOT_LOCAL_API_ENABLED. Headless monitoring (Prometheus log scraper / Loki / Datadog) consumes те же counters. Commit a611c35.
Phase 5.6.2 OrderClient struct migrationRESOLVED 2026-05-03 (X6 cleanup batch)ADR-010 follow-up complete: Option<ClobExecutor> fields swapped to Arc<dyn OrderClient>; legacy struct branch removed. Commit a611c35.
//! docs full coverageRESOLVED 2026-05-03 (X6 cleanup batch + N5/N6 polish)Module-level //! headers shipped на ~40 source files которым их не хватало. cargo doc --workspace --no-deps clean. Commit a611c35 + e53b73b.
Dry-run journaling parityRESOLVED 2026-05-15 via OpenSpec fix-dry-run-journaling-parityDry-run path исторически писал только в fills table — positions_history и orders_history пустые потому что SimFillEngine и DryRunOrderClient эмитили только SideEffect::InsertFill. Consequences: directional-stop-loss blacklist seed всегда читал 0 rows on dry-run restart, dashboard "Закрытые (SELL P&L)" card стуктура $0 после 2888af4. Fix: Arc<HistoryWriter> через оба DryRun adapters, эмит PositionAccumulated / PositionClosed / OrderPlaced / OrderStatusChanged(EXPIRED) симметрично live path. close_reason через SimExitReason enum (gtc_99 / stop_loss / market_resolved / redeem / ttl_cancel) — никаких heuristic thresholds (memory feedback_no_dust_threshold_finance). 8 liveness integration tests в crates/pm-bot/tests/dry_run_journaling.rs.

Archived (ADR-024 pivot — стратегии deferred/archived 2026-05-13) ​

Эти TDs относились исключительно к стратегиям, которые более не в активном scope после ADR-024: bucket-arb, maker, maker-rebate (включая paired), merge-arb, single-token-mm. Записи сохранены для traceability; при restoration соответствующей стратегии (см. docs/restoration-backlog/) — переоткрыть как новый TD.

#Original statusNotes (ARCHIVED-BY-024 2026-05-13)
TD-2RESOLVED 2026-05-03bucket-arb INV-20 retry pricing-mode persistence: process_bucket_arb_expiry_batch reads BUCKET_ARB_IMMEDIATE_FILL_ENABLED from live config; per-share ceiling, desired price, post_only flag, ManagedOrder.pricing_mode tag branch on the flag. Pure helper compute_repost_per_share_ceiling. Стратегия bucket-arb DEFERRED via ADR-024.
TD-3RESOLVED 2026-05-03bucket-arb R8-2 drift-cancel detector wired into BucketArbStrategy::evaluate_periodic; pricing-mode-aware live basket sums; BUCKET_ARB_DRIFT_CANCEL_MARGIN. 15 unit tests. Стратегия bucket-arb DEFERRED via ADR-024.
TD-4RESOLVED 2026-05-03TUI badge для bucket-arb immediate-fill orders: OrderPricingMode { PatientMaker, ImmediateFill } enum + pricing_mode: Option<OrderPricingMode> на ManagedOrder. 30 construction sites updated. TUI status column renders "PENDING IF" / "PARTIAL IF". Стратегия bucket-arb DEFERRED via ADR-024.
TD-6RESOLVED 2026-05-03BUCKET_ARB_DCA_* env vars документированы как DEPRECATED no-op. Стратегия bucket-arb DEFERRED via ADR-024.
TD-7RESOLVED 2026-05-03 (X5.1+X5.2+X5.3+X5.4 complete)Two-sided maker-rebate placement (paired YES + NO) shipped end-to-end. X5.1 ADR-011 Accepted (537 LOC) — pure evaluator + RebatePairDecision enum, RebatePairState machine, three opt-in env knobs, on-chain CTF merge on BothFilled. X5.2 17 unit tests. X5.3 state machine wired в hooks + Decision::CallMergePositions + 16 integration-shape tests. X5.4 paired-maker-rebate-runbook-2026-05-03.md + sprints/td7-paired-maker-rebate.md. Phase 1 single-side parity bit-identical when MAKER_REBATE_PAIRED_ENABLED=false. Neg-risk paired emission explicitly out of scope. Стратегии maker-rebate / merge-arb ARCHIVED-BY-024.

Superseded ​

#Superseded byNotes
FE-4 (Declarative Condition rule engine)memory feedback_strategy_specific_typed_config + ADR-024 + openspec unify-orders-positions-signals-events design §D14REJECTED-BY-design 2026-05-21. Pre-existing implementation в archived pm-orchestrator (25+ leaf-condition enum) explicitly отвергнута per feedback_strategy_specific_typed_config («никакого universal condition engine»). Каждая стратегия декларирует свой typed Config struct (см. crates/pm-engine/src/strategies/directional/config.rs); SDK не предоставляет generic condition evaluator. Salvage path закрыт.

Cross-references ​