456d531a13
feat: harden migration flows and integration coverage
2026-07-21 18:59:26 +03:00
d1d2a0f92e
feat: tiered test infrastructure with Makefile + smart selector + OpenCode commands
...
Root Makefile with timeout-protected test targets:
- Tier 1 (<30s): make test, make test-unit, make test-frontend
- Tier 2 (smart): make test-related F=file.py (via @RELATION BINDS_TO)
- Tier 3 (<5min): make test-integration (Docker, --run-integration)
- Coverage: make coverage (backend + frontend)
- Lint: make lint (ruff + eslint)
Smart test selector (scripts/find-related-tests.py):
- Extracts module names from #region anchors, class/function defs
- Searches 400 BINDS_TO entries across all test files
- Confidence scoring: exact > case-insensitive > substring > heuristic
- Fallback: filename-based fuzzy matching
OpenCode commands:
- /test.all — full suite + coverage
- /test.unit — fast unit tests (<30s)
- /test.related — smart selection by file
- /test.coverage — coverage reports with thresholds
Speckit workflow updated:
- speckit.test.md: raw pytest → make targets with timeout safety
- speckit.plan.md: quickstart uses make targets
- speckit.tasks.md: verification uses make targets
- speckit.implement.md: default stack uses make targets
Frontend: added 'coverage' script to package.json
2026-07-21 18:24:53 +03:00
8bc805d27b
fix(i18n): replace hardcoded UI labels with locale keys
...
Add missing en/ru translations and wire reports, agent, git, settings,
mapper, and tasks surfaces so UI copy follows the active locale.
2026-07-21 09:15:25 +03:00
7bfc5553cf
feat: live app log console, cross-filter, JSONL export
...
Backend:
- /ws/app-logs — real-time app/cot log stream (raw JSONL)
- /api/logs/recent — REST snapshot of ring buffer
- GET /tasks/{id}/logs/export — streaming JSONL export with CoT parse + redaction
- Thread-safe ring buffer (seq-based polling) replaces unsafe asyncio.Queue
- GIL-friendly multi-row Core insert for log persistence
- task_id ContextVar propagates into CotJsonFormatter for CoT correlation
- Hot-apply logging level on settings update (FR-005)
- Buffer trim under DEBUG floods; drop DEBUG first, preserve ERROR/WARNING
- List projection (include_result=False) keeps reports list slim
- Security event consolidated to single REASON atom
Frontend:
- ReportsLogModel + ReportsLogPanel — full live JSONL console
- Cross-filter pinning: Tasks → Logs tab with task chip badges
- LogEntryRow — CoT-aware rendering (marker icons, expandable payload)
- TaskFilterChip, taskChipMeta — scannable type/id/env chips
- Global drawer push via CSS variable (lg+ padding, not overlay)
- i18n en/ru for all log console strings
- Ctrl+A in log panel selects only log lines (window-level handler)
QA fixes:
- Svelte 5 reactivity: SvelteDate/SvelteSet/SvelteURLSearchParams
- Fix seed_trace_id shadowing (F823) in lifecycle.py
- Remove dead code (selectedEnvironment, goToReportsPage)
- Add @BRIEF to C2 test functions, missing {#each} keys
- Remove unused import json as _json from app.py
All 3200+ frontend tests pass; backend lint clean.
2026-07-20 21:41:34 +03:00
49a566359a
feat: translate module — runtime knobs, GRACE anchors, two-layer testing, QA fixes
...
Implementation:
- Performance knobs: llm_batch_max_rows, llm_concurrency, insert_concurrency,
multi_lang_mode, batch_aggressiveness, max_in_flight_batches
- Alembic migration f7a8b9c0d1e2 (idempotent, nullable, non-destructive)
- LLM provider capabilities: throughput_class, reasoning_control,
supports_json_object, default/max_llm_concurrency
- TargetSchemaValidationRequest with conditional validator (sqllab/direct_db)
- Scheduler: background dispatch, local imports for lazy bootstrap
GRACE-Poly compliance:
- Semantic anchors on orchestrator_aggregator, orchestrator_sql, llm_provider
- Shared module _llm_http.py: _apply_reasoning_control extraction (INV_4)
- Alembic migration anchors per C3/C1 template
- Four renamed Svelte components: RunOutcomeSummary, DetectionQualityCard,
LanguageStatList, SourceLanguageOverride
QA (this session):
- 11 backend test regressions fixed: spec'd MagicMock null fields for new
columns, _check_translation_cache_bulk retarget, scheduler mock wiring,
language_detection=auto assertions, token budget constant update
- 4 frontend eslint errors fixed: SvelteSet/SvelteDate imports,
unused lang parameter, dead isTransientError
- Production bugfix: job_to_response() mapped 6 missing fields
- Pre-existing auth test failure documented (dependencies.py untouched)
- Axiom: 6440 contracts, 0 warnings
2026-07-20 14:19:47 +03:00
31b9a19a0c
chore: commit remaining workspace updates
...
Agent:
- lifecycle: run tracking, middleware hardening, langgraph setup
- tests: agent lifecycle + langgraph setup coverage
Backend:
- async_job_runner: resilience hardening, tests
- agent_conversations: run lifecycle integration
- translate: scheduler + orchestrator SQL adjustments
- schemas/services: agent_lifecycle model extensions
Frontend:
- TaskDrawer: UX improvements
- TaskLogPanel/Viewer: safety hardening, i18n (en/ru)
- FilterBar: report filters contract + tests
- Reports page: layout adjustments
Specs:
- 036-agent-test-stabilization: runs contract, modules, events
- 037-superset-baseline-engine: catalog schema, testing API, modules
- 038-dashboard-scenario-model: scenario schema, capture profile, modules
- 039-dashboard-scenario-ui: screen models, release verification UX, modules
- dashboard-verification-usecases: new cross-cutting spec
2026-07-17 19:11:09 +03:00
8f0d123ff8
fix migration resume and release workflow
2026-07-16 12:31:59 +03:00
20105f51c0
feat(translate): add run preflight and focus execution UX
2026-07-16 07:52:52 +03:00
8e2f393267
refactor(frontend): remove addToast bridge — migrate all call sites to notifications API
...
BREAKING: addToast() removed. Use notify() or notifications facade instead.
- Replace addToast(msg, type, duration?) → notify({ message, type, duration? })
- Introduce notifications.success/info/warning/error/show() semantic facade
- Add dismissAllToasts(), timer management (clearTimeout on remove)
- Unify Toast component: single viewport, a11y (role/aria-live by type)
- Migrate 16 models, 2 stores, 38 components, 23 pages (76 files total)
- 147 test files / 3152 tests pass with updated mocks and assertions
2026-07-16 07:40:54 +03:00
20071b8c7a
security: fullstack hardening — task ownership, mapping validation, API-key scoping, test fixes
...
Backend:
- Add validate_mapping_database_ownership() to verify source/target UUIDs
belong to declared environments before persisting mappings (mappings.py)
- Add API-key environment scoping to get_mappings (filter) and
suggest_mappings_api (enforce) (mappings.py)
- Add user_id Column to TaskRecord model + Alembic migration (task.py)
- Persist task.user_id on save, restore on load (persistence.py)
- Wire current_user.id into migrate_dashboards + backup_dashboards
task creation (_action_routes.py)
- Fix test_migration_routes.py: module-level patch leak → autouse fixture,
SupersetClient→AsyncSupersetClient, AsyncMock for sync_environment/run
- Fix 7 Pydantic serializer warnings: 'PENDING'→TaskStatus.PENDING
in test_tasks.py + import TaskStatus
Frontend:
- Deepen isDryRunResult(): validate selection field, risk.items entries
(all 5 fields), and diff object uuids individually (ExecutorModel.svelte.ts)
Prior work included: task password redaction, resume ownership checks,
canonical dry-run DTO alignment, migration UI callback fixes, credential
exposure reduction, assistant dry-run await fix.
2026-07-15 23:02:23 +03:00
612cc55911
test(translate): cover required field checklist
2026-07-15 16:53:25 +03:00
9b3cc54646
feat: add backup integrity verification
2026-07-14 16:05:28 +03:00
c3ad0afc17
refactor: remove rejected dataset review feature
2026-07-14 15:56:31 +03:00
2a56ea5fc9
test: fix backend and frontend test contracts
2026-07-14 10:43:38 +03:00
66497da72b
feat(mapper): secure xlsx upload and dataset selection
2026-07-14 00:34:10 +03:00
d630573402
fix(backup): orthogonal code review fixes + UI/UX overhaul
...
## Critical fixes
- H1: Fix env_id/env/environment_id triple inconsistency in API route
(_action_routes.py now passes 'environment_id', matches scheduler)
- H2: Decompose BackupPlugin.execute() — CC 13 → 5 methods, CC ≤ 5 each
- H3: Fix unhandled int() ValueError on non-numeric dashboard_ids
- H4: Add concurrent guard test with API-style params (env key fallback)
- H5: Make RetentionPolicy configurable via StorageConfig
(retention_daily/weekly/monthly in config model + backend plugin)
- Fix: storage DELETE route missing 'await' on async delete_file (bug)
## UI/UX overhaul
- NEW: centralized cron utility (frontend/src/lib/utils/cron.ts)
- validateCron(), calcNextCronRun(), formatNextRun()
- Used by BackupManager, BackupDashboardModal
- BackupManager: replace custom BackupList with shared FileList
- Adds: download, delete, bulk actions, search, sort, pagination
- Adds: cron next-run preview below schedule input
- Adds: auto-open TaskDrawer on backup task creation
- BackupDashboardModal: dead 'Cron Help' button removed
- Adds: live cron validation + next-run preview
- StorageSettings: adds retention daily/weekly/monthly fields
- BackupCreateRequest type fixed to match actual API contract
- i18n: 7 new keys for en/ru (next_run, retention_*)
2026-07-13 20:58:02 +03:00
ed85e0d80a
feat(git): clarify dashboard release flow
2026-07-13 16:53:35 +03:00
c2bd6cb441
feat(git): clarify dashboard release flow
2026-07-13 12:55:24 +03:00
00d2619c86
fix: align DRAFT integration test with removed DRAFT check in validate_job_preconditions
...
- DRAFT validation was removed from orchestrator_validation.py (moved to service layer)
- Integration test expected ValueError for DRAFT jobs — fixed to test actual behavior
- 194/194 integration tests pass, 0 failures
2026-07-12 19:44:11 +03:00
a39a76c87f
feat(agent-centric-logging): consolidate CoT infra in shared, close REASON→REFLECT chains
...
- shared/cot_logger.py is SSOT; backend/cot_logger.py deleted
- elapsed_ms timing in all REFLECT markers
- Frontend: REASON→REFLECT/EXPLORE in all fetch/post/delete/requestApi
- Dynamic src: route.GET.api.plugins instead of hardcoded api.request_handler
- trace_id generated immediately (no 'no-trace'), X-Trace-ID in both directions
- Global error handlers (window error + unhandledrejection + error.svelte)
- Fixed duplicate logging (shared/logger.py double StreamHandler)
- propagate=False in configure_logger (was in ConfigManager = duplicated startup logs)
- belief_scope: 'Coherence OK' → '{anchor}: completed' + elapsed_ms
- Fixed 28 pre-existing test failures (scheduler sig, DB columns, DRAFT validation, etc)
2026-07-12 19:30:57 +03:00
0cb1f80cd6
feat(git): implement deployment tracking and enhance lifecycle UX
...
Introduce a deployment recording system to track dashboard versions
across environments and improve the Git management user experience.
- Add `Deployment` model and Alembic migration to persist deployment
history.
- Implement `GitDeploymentRecorder` and `GitFingerprint` plugins to
automate deployment logging and content hashing.
- Add `get_deployment_status` API endpoint to retrieve real-time
environment states.
- Refactor `GitLifecycleHeader` to prioritize Call-to-Action (CTA)
buttons and improve visual hierarchy.
- Update `GitWorkspacePanel` to emphasize version saving and
streamline commit workflows.
- Enhance `GitEnvironmentTimeline` with deployment status integration,
collapsible UI, and improved theme consistency.
- Add auto-navigation logic in `GitManagerModel` to guide users to
relevant tabs based on recommended actions.
- Clean up obsolete documentation and update i18n strings for
git visualization features.
2026-07-12 14:57:03 +03:00
3404967f76
feat(git): add environment timeline visualization and branch commit APIs
...
Implement a new Git environment timeline component to visualize dashboard
versions across different deployment stages (Development, Pre-production,
and Production). This includes new backend endpoints and frontend
services to support historical data retrieval and version comparison.
- Add `get_branch_commits` and `get_commit_diff` endpoints to backend
API and Git service.
- Implement `GitEnvironmentTimeline` Svelte component for visual
representation of deployment history.
- Update `GitManagerModel` to manage timeline state, including
environment histories and version selection for comparison.
- Add `getBranchCommits` and `getCommitDiff` methods to `gitService`.
- Improve UX by separating the branch selector from the version map.
- Add comprehensive i18n support for the new visualization features.
2026-07-10 10:55:10 +03:00
db07bbb1d5
feat(maintenance): improve store with pending removals + ADR-0006 compliance
...
- Add pendingRemovals tracking and isEventRemoving() to maintenance store for better in-flight UX in EventsTable.
- Strongly type maintenance API client and store (replace unknown[]).
- Migrate selectedTask/taskLogs to dedicated lib/stores/selectedTask.svelte.ts (proper rune store with separate subscribers).
- Remove legacy central stores.svelte.ts and related dead code (src/pages/, old tests) to comply with ADR-0006 (global stores must be individual files in lib/stores/).
- Update mocks, components, models and tests accordingly.
- Fix related bugs (subscriber decoupling, test mocks).
- Add dedicated test_selectedTask.ts.
- Minor cleanups: semantic tokens, @RATIONALE for model-first, contracts update.
- All key tests (maintenance, selectedTask, store) pass.
Refs: ADR-0006, specs/031-maintenance-banner
2026-07-09 22:14:01 +03:00
3b13c67c0d
feat(translate): language detection, async HTTP LLM, history model, agent improvements
...
- Add async HTTP-based LLM transport (_llm_async_http.py)
- Add orthogonal LLM call tests
- Improve language detection (_lang_detect.py) and batch insert
- Update translate schemas, service utils, preview constants/prompts
- Add TranslateHistoryModel with pagination and filtering
- Update agent confirmation, persistence, langgraph setup, run, tools
- Improve LLM health checking in shared module
- Update translate runs API, history route
2026-07-08 19:35:49 +03:00
e6532c8dab
refactor(translate): remove DRAFT status from UI, auto-transition via preflight
...
- Remove DRAFT badge, 'Mark as READY' button, DRAFT filter pill, DRAFT run gate
- Auto-transition DRAFT<->READY based on runReady (all required preflight items)
- Move PreflightChecklist to page top — always visible across tabs
- Remove orchestration DRAFT gate — preflight handles readiness
- Remove 10 dead i18n keys (status_draft, mark_ready, disabled_draft, hint_draft)
- Add reverse transition READY->DRAFT when fields cleared
- Remove unused runComplete prop from RunTabContent
- Add fallback badge styling for unrecognized statuses
2026-07-08 19:35:05 +03:00
25643a5656
test(frontend): reach coverage targets — 99.45% stmts, 89.14% branches, 99.71% fns, 99.82% lines
...
Add 813 new tests (+31.6%) to bring all covered files to thresholds:
- 4 zero-coverage models (KeyRecovery, BulkReplace, TopNavbar,
TranslationRunResult) → 100% with L1 model-invariant tests
- 8 low-coverage models extended past thresholds
- UI components (Pagination 1→31, Skeleton 20, Badge 27, ConfirmDialog 21)
- API modules (api.ts, cot-logger, maintenance, reports) → 100%
- Utils/stores (dateFormat, timezone, toasts, stores, maintenance)
Production changes:
- Add GRACE contract headers (@RATIONALE/@REJECTED) to 10+ files
- Fix batcheslength→batches.length typo in TranslationRunResult.svelte
- Refactor Badge.svelte || expressions into cls() helper
2026-07-08 11:09:52 +03:00
d0facf4a3a
fix(translate): datasource change not persisted on save + preview column cleanup
...
Root cause: saveJob() used stale sourceDatasourceId (set once on load)
instead of live datasourceId (updated by ConfigTabForm via $bindable).
Since sourceDatasourceId was always truthy, the || fallback to datasourceId
never triggered — the old datasource ID was always sent to PUT.
Fixes:
- Removed dead sourceDatasourceId atom; saveJob() uses datasourceId directly
- Bound sourceTable via $bindable through ConfigTabForm; updated on select
- loadDatasourceColumns() syncs databaseDialect from Superset columns API
- saveJob() sends undefined for database_dialect="unknown" to force re-detect
- Backend: added direct_db+connection_id validation on update (mirroring create)
- Removed redundant "Язык ист." column from TranslationPreview table
- Removed unused getDetectedLang function
Tests:
- TranslationJobModel: datasourceId save mapping, dialect sync, unknown→undefined
- TranslateJobService: reject direct_db without connection_id, preserve existing
Verified: browser — translate_cross datasource persisted after save+reload,
dialect detected as "clickhouse", columns loaded (2), translation column preserved.
2026-07-07 23:50:08 +03:00
34aeeb92a2
fix(backend+frontend): migration deadlock, async pattern, timeout safety, fire-and-forget translations
...
Backend:
- MigrationPlugin.execute — remove AsyncJobRunner.run() deadlock on post-migration
ID sync (2 deadlocks total: plugins/migration.py + api/routes/migration.py
trigger_sync_now). Replace blocking runner.run with direct await.
- MigrationPlugin.execute — fix temp file leak (dry_run=True prevented cleanup).
- MigrationPlugin.execute — IdMappingService(SessionLocal()) now closed in finally.
- MigrationPlugin.execute — wire IdMappingService into MigrationEngine constructor
so cross-filter patching actually works instead of silently skipping.
- MigrationPlugin.execute — SupersetClient.aclose() in finally to prevent
httpx connection pool leak.
- TaskManager — _async_tasks dict leak (add_done_callback cleanup).
- JobLifecycle — CancelledError handler (tasks stuck in RUNNING after cancel).
- JobLifecycle — persist_task BEFORE _broadcast_task_status (crash consistency).
- JobLifecycle — wait_for_resolution/wait_for_input now have 3600s timeout.
- AsyncJobRunner.run — 300s timeout on future.result() (APScheduler thread safety).
Translate scheduler:
- execute_scheduled_translation — replace blocking runner.run(orch.execute_run(run))
with fire-and-forget TranslationOrchestrator.execute_background(). APScheduler
thread is freed in ms instead of blocking for the full translation duration.
Translation runs of 10k+ rows (200+ LLM batches, hours) no longer hit the
300s runner timeout.
- TranslationOrchestrator.execute_background — new static method: opens own DB
session, dispatches asyncio.create_task, handles errors + notification.
- Scheduler last_run_at updated at dispatch time (not after completion).
Frontend:
- MigrationModel.stepReady[3] now requires dryRunResult != null (was always
true, allowing UI to reach step 3 without dry-run).
- WizardModel.goToStep gate for step 3 uses stepReady[3].
- +page.svelte — dryRunResult no longer self-clears via reactive loop.
- Progress bar step 3 indicator gate fixed for new readiness logic.
Tests:
- 2 new regression tests for migration sync (deadlock-free, completes cleanly).
- test_migration_plugin.py — _make_mock_superset_client/_make_mock_mapping_service
helpers for proper async mock behavior (aclose, sync_environment AsyncMock).
- 10 scheduled-translation tests updated for fire-and-forget pattern.
- MigrationModel.test.ts — step 3 invariant + goToStep block test.
- All affected tests: 104 backend + 79 frontend = 183 passed.
2026-07-07 21:04:23 +03:00
89cd123dec
fix(frontend): dynamic year + git commit hash in APP_VERSION
...
- Footer.svelte: replace hardcoded '2025' with new Date().getFullYear()
- build.sh: append git short hash to APP_VERSION for all bundle commands
(bundle, bundle:embeddings, bundle:light). Format: '0.5.2+6f029903'.
Previously only the tag was passed (e.g. '0.5.2'), and .git was not
available in Docker context so vite.config.js fell back to '0.0.0'.
Verified: frontend assets contain '0.5.2+6f029903', getFullYear() replaces
hardcoded 2025.
2026-07-07 12:29:46 +03:00
ac5a139dc9
fix(ui): render KeyRecoveryWizard into body portal to avoid layout margin
...
Modal now mounts at document.body level via svelte mount/unmount.
Extracted WizardContent.svelte for portal rendering.
Eliminates 32px margin from page layout wrapper
(max-w-7xl/space-y-6/px-4 container).
Added KeyRecoveryWizard as portal wrapper, WizardContent as
the actual modal component.
2026-07-06 19:00:24 +03:00
eef7a459ea
fix(security): address QA/security audit findings — authorization, i18n, error safety
...
Critical (C1): Added has_permission('security', 'READ') to /health and
/fingerprint endpoints; has_permission('security', 'WRITE') to /recover.
Previously any authenticated user could enumerate encrypted secrets and
overwrite stored values.
High (Bug #1 ): Fixed recover endpoint — updated/failed status now correctly
reflects whether a non-empty replacement value was submitted. Empty values
now report 'skipped' instead of falsely 'updated'.
High (Bug #2 , #3 ): Replaced all hardcoded English strings in
KeyRecoveryWizard.svelte and SystemSettings.svelte with $t.settings.*
i18n lookups. Keys already existed in en/ru settings.json.
High (H1): Added _sanitize_error() helper to truncate + scrub exception
messages before logging, preventing potential secret leakage in log output.
Cleanup: Moved LLMProviderConfig import to module top. Instantiate
ConnectionService once before for-loop. Added @TEST_EDGE declarations
and @PRE/@SIDE_EFFECT to C4 contract.
Tests: 226 passed
2026-07-06 18:22:36 +03:00
99ccf64458
fix(i18n): remove duplicate closing braces in encryption recovery strings
2026-07-06 18:07:44 +03:00
e1b0175ec4
feat(security): add encryption health inventory and key recovery wizard
...
Backend:
- GET /api/security/encryption/health — inventory of all stored encrypted
secrets (LLM providers, DB connections, profile Git tokens) with
decrypt attempt and structured broken/healthy status
- GET /api/security/encryption/fingerprint — non-secret key fingerprint
- POST /api/security/encryption/recover — bulk replacement of
undecryptable secrets with partial_success semantics
Frontend:
- KeyRecoveryModel.svelte.ts — state machine (idle→scanning→
healthy/needs_recovery→editing→saving→complete/partial_success/error)
- KeyRecoveryWizard.svelte — tabbed dialog with LLM/DB/Git sections,
security guidance, re-encrypt command display, edit/save flow
- SystemSettings entry point — 'Check encrypted secrets' card with
fingerprint and broken count
- API methods: getEncryptionHealth, recoverEncryptedSecrets
- Types: EncryptionRecoveryTypes
- i18n: en/ru strings for recovery flow
Tests: 226 passed
2026-07-06 18:05:05 +03:00
2716f15804
refactor(env): unify Docker env vars — canonical AUTH_SECRET_KEY, remove JWT_SECRET fallback
...
Canonical variables:
- AUTH_SECRET_KEY — JWT signing key for backend + agent (was split across
AUTH_SECRET_KEY / JWT_SECRET)
- SERVICE_JWT — agent→backend service token
- No JWT_SECRET fallback: decoder fails with migration guidance if only
JWT_SECRET is set
Compose files unified:
- docker-compose.yml, docker-compose.enterprise-clean.yml,
docker-compose.e2e.yml — all use AUTH_SECRET_KEY
- build.sh generated compose now passes AUTH_SECRET_KEY + ENCRYPTION_KEY
to backend
Env examples unified and completed:
- .env.example — comprehensive template, all compose vars
- .env.enterprise-clean.example — production template
- backend/.env.example — backend-only run
- docker/.env.agent.example — agent-only run
- NEW: .env.current.example, .env.master.example,
.env.e2e.example, frontend/.env.example
Tests aligned:
- conftest sets AUTH_SECRET_KEY (canonical value matched across test files)
- test mocks use canonical name
- 1176 passed, 0 failed
2026-07-06 14:24:17 +03:00
dcee86c260
refactor(docker): split requirements by role, slim enterprise bundle by default
...
Split requirements.txt into role-specific files:
- requirements-backend.txt — FastAPI API runtime
- requirements-agent.txt — Gradio/LangGraph agent (no embeddings)
- requirements-embeddings.txt — opt-in sentence-transformers
Default enterprise bundle (./build.sh bundle) builds slim agent without
sentence-transformers/torch (~500 MB saved). Embeddings opt-in via
./build.sh bundle:embeddings <tag>. Embedding router degrades gracefully
when package is absent (ImportError catch in _embedding_router.py).
Updated Dockerfiles:
- backend.Dockerfile → requirements-backend.txt
- Dockerfile.agent → requirements-agent.txt + WITH_EMBEDDINGS build arg
- all-in-one.Dockerfile → requirements-backend.txt
Added embeddings variant to build.sh with full manifest/digest output.
Hardened .dockerignore (cache, report, model, archive patterns).
Other branch work: align git route mocks with async services, remove
legacy agent test files superseded by contract tests.
2026-07-06 10:06:07 +03:00
5d80f83869
feat(reports): add task status settings and tests
2026-07-06 01:22:39 +03:00
f607c920b8
test(agent-chat): audit guardrail and error handling
2026-07-06 01:20:12 +03:00
be45dd81f3
refactor(frontend): integrate compact filters into reports page
...
- Rename page title "Отчеты задач" → "Центр статусов"
- Remove standalone quick-status filter block (moved to FilterBar)
- Remove inline filter/sort/time-range HTML (replaced by FilterBar)
- Replace statusTotal() with quickStatusCounts
- Pass quickStatusCounts and onQuickStatusToggle to FilterBar
- Error recovery button text "Повторить" → "Повторить загрузку"
2026-07-05 15:50:51 +03:00
857352e8c9
feat(frontend): compact FilterBar with disclosure toggle and quick pills
...
- Quick status pills (Упавшие/В работе/Успешные) always visible
- Search input with flex spacer in same row
- Explicit "Фильтры" disclosure button with filter icon, badge count, chevron
- aria-expanded / aria-controls for accessibility
- Expandable panel: type, status, time range, sort controls
- Remove bottom status bar ("Показано X из Y", "Активно фильтров")
- Update tests for expanded state and quick pill interactions
2026-07-05 15:50:46 +03:00
f3d92e55a0
refactor(frontend): replace raw buttons with /ui/Button in SummaryPanel
...
- Replace raw <button> with <Button variant="ghost">
- Dim zero-count badges with opacity-50
- Add transition-colors duration-300 to count numbers
- Replace inline reconnect link with themed <Button>
2026-07-05 15:50:41 +03:00
e8dd417882
fix(frontend): prevent TaskList horizontal overflow
...
- Add min-w-0 overflow-hidden to TaskList shell container
- Add filtered_empty UX state to contract
- Update layout contract test to verify TaskList source directly
- Add transition-colors to status badges
2026-07-05 15:50:36 +03:00
1bb6a5b5a7
feat(agent-chat): complete context guardrail event coverage
2026-07-05 14:14:42 +03:00
dbc6314d2e
chore: commit remaining working changes
...
Backend:
- agent: confirmation, persistence, app, langgraph_setup updates
- routes: agent_superset_explore, environments, git helpers/operations
- services: git sync refactoring
- tests: git_status_route expanded
Frontend:
- Navbar: minor cleanup
- Profile: i18n (en/ru), page enhancements, integration tests
- New: _llm_params.py
2026-07-05 09:24:45 +03:00
708b7b5815
refactor(frontend): extract BulkReplaceModal.Model — state + FSM + API
...
- BulkReplaceModalModel.svelte.ts (170 LOC): 13 state atoms,
7-state FSM (closed→configuring→previewing→confirming→applying→applied),
3 API actions (handlePreview, handleApply, loadDictionaries),
1 derived (isLargeChange), @RATIONALE/@REJECTED
- BulkReplaceModal.svelte: 461→~310 LOC (INV_7 compliance),
delegates all state/FSM/API to model, retains modal chrome + previewAfter()
- Follows TopNavbar/TranslationRunResult pattern
2026-07-05 09:21:49 +03:00
9e9d40d86e
fix(frontend): fix Svelte prop shorthand in TranslationRunResult
...
{model.targetLanguages} is invalid shorthand — Svelte only supports
bare identifiers, not property access. Changed to explicit
targetLanguages={model.targetLanguages}
2026-07-05 09:17:33 +03:00
87f124dfeb
refactor(frontend): extract TranslationRunResult.Model — state + API logic
...
- TranslationRunResultModel.svelte.ts (200 LOC): 16 $state atoms,
3 $derived projections, 5 API actions (loadData, handleRetry,
handleRetryInsert, loadMoreRecords, loadBatches), @RATIONALE/@REJECTED
- TranslationRunResult.svelte: 623→456 LOC (167 lines saved, -27%),
delegates all state/API to model, retains template markup and
DOM helpers (copyToClipboard)
- INV_1: 0 naked functions (all logic in model)
- Follows TopNavbar pattern — dense anchor, hierarchical ID,
BINDS_TO -> [TranslationRunResult.Model]
2026-07-05 09:16:32 +03:00
0516b4c698
refactor(frontend): add @RATIONALE/@REJECTED to 5 C:4 contracts
...
- ConfigTabForm: rationale for single-tab vs wizard; rejected multi-step
- ValidationTaskForm: rationale for multi-step wizard; rejected flat form,
tabs, dynamic schema generation
- GitWorkspacePanel: rationale for IntersectionObserver lazy diff chunking;
rejected virtual scroll, server pagination, Web Worker
- Git.ManagerModel: rationale for model-first (cross-operation invariants,
L1 testability); existing @REJECTED preserved
- AgentChat.Component: rationale for reusable component vs inline;
rejected Web Component, iframe
2026-07-05 09:00:08 +03:00
590d659fa5
refactor(frontend): remove @PURPOSE duplicates, merge into @BRIEF (INV_4)
...
- ProviderConfig: remove duplicate @LAYER/@PURPOSE/@UX_STATE block
- SemanticLayerReview: generic @BRIEF → detailed @PURPOSE text,
remove duplicate @LAYER/@SEMANTICS
- ExecutionMappingReview: same — generic @BRIEF → @PURPOSE detail
- TaskRunner: remove duplicate @SEMANTICS/@PURPOSE/@LAYER block
- ValidationFindingsPanel: generic @BRIEF → @PURPOSE detail,
remove duplicate @LAYER/@SEMANTICS
All: INV_4 compliance — single source of truth for contract metadata
in #region HTML comment, no scattered duplicates
2026-07-05 08:54:38 +03:00
45a78c3ccc
refactor(frontend): clean metadata on AssistantChatPanel + TaskDrawer
...
- AssistantChatPanel: C:3→C:4 (33 side-effecting functions), remove JSDoc
duplicates (INV_4), add @PRE/@POST/@SIDE_EFFECT/@DATA_CONTRACT/@RATIONALE/@REJECTED
- TaskDrawer: remove JSDoc duplicates (INV_4), replace 4x @PURPOSE
JSDoc blocks with @BRIEF/@PRE/@POST in function contracts (INV_4),
add @RATIONALE/@REJECTED
- Both: consolidate all metadata in HTML comment #region, remove
scattered JSDoc in <script>
2026-07-05 08:53:17 +03:00
3bad32e184
refactor(frontend): extract TopNavbar.Model — search logic, semantic compliance
...
- Extract TopNavbarModel.svelte.ts (303 LOC) — search state, debounce,
API aggregation, drawer preference hydration
- TopNavbar.svelte: 605→389 LOC (INV_7 compliance)
- Remove duplicate JSDoc metadata (INV_4)
- Add @RATIONALE, @REJECTED, @PRE, @POST, @SIDE_EFFECT, @DATA_CONTRACT
- Replace raw Tailwind (from-sky-500/via-cyan-500/to-indigo-600 →
from-brand-gradient-from/via-brand-gradient-via/to-brand-gradient-to)
- Replace raw Tailwind focus:ring-sky-200 → focus:ring-primary-ring-light
- Fix hardcoded i18n 'Ассистент' → $t.assistant.assistant
- Add primary.ring-light token to tailwind.config.js
- Replace any types with concrete interfaces (DashboardSearchResult, etc.)
- 16 naked functions → 0 (INV_1)
2026-07-05 08:50:43 +03:00