diff --git a/.config/nextest.toml b/.config/nextest.toml index 32e37a7c..228a74b0 100644 --- a/.config/nextest.toml +++ b/.config/nextest.toml @@ -5,8 +5,69 @@ flaky-result = "fail" slow-timeout = { period = "10s", terminate-after = 36 } final-status-level = "slow" +[test-groups] +windows-dashboard-server = { max-threads = 2 } +windows-tracedecay-init = { max-threads = 1 } +windows-init-heavy = { max-threads = 4 } +windows-profile-storage = { max-threads = 1 } +windows-session-sqlite = { max-threads = 8 } +windows-process-heavy = { max-threads = 2 } +windows-subprocess = { max-threads = 1 } +windows-memory-eval = { max-threads = 1 } +windows-timing-sensitive = { max-threads = 1 } + [[profile.ci.overrides]] filter = 'all()' platform = { host = 'cfg(windows)' } retries = 2 flaky-result = 'pass' + +[[profile.ci.overrides]] +filter = 'binary(=dashboard_api_test) | binary(=dashboard_analytics_api_test) | binary(=dashboard_automation_api_test) | binary(=dashboard_automation_config_api_test) | binary(=dashboard_automation_skills_api_test) | binary(=dashboard_code_diagnostics_api_test) | binary(=dashboard_graph_api_test) | binary(=dashboard_lcm_api_test) | binary(=dashboard_lcm_fixes_test) | binary(=dashboard_memory_curation_api_test) | binary(=dashboard_savings_api_test)' +platform = { host = 'cfg(windows)' } +test-group = 'windows-dashboard-server' + +[[profile.ci.overrides]] +filter = 'binary(=agent_test) | binary(=branch_db_safety_test) | binary(=cli_non_interactive_test) | binary(=mcp_cli_serve_test)' +platform = { host = 'cfg(windows)' } +test-group = 'windows-tracedecay-init' + +[[profile.ci.overrides]] +filter = 'binary(=automation_memory_curator_runner_test) | binary(=automation_runner_test) | binary(=automation_session_reflector_runner_test) | binary(=automation_skill_writer_runner_test) | binary(=branch_drift_test) | binary(=integration_test) | binary(=regression_core_engine_test) | binary(=tracedecay_test)' +platform = { host = 'cfg(windows)' } +test-group = 'windows-init-heavy' + +[[profile.ci.overrides]] +filter = 'binary(=storage_resolver_test) | binary(=profile_storage_migration_test) | binary(=cursor_transcript_ingest_test)' +platform = { host = 'cfg(windows)' } +test-group = 'windows-profile-storage' + +[[profile.ci.overrides]] +filter = 'binary(=session_lcm_compression_test) | binary(=session_lcm_query_test) | binary(=session_lcm_payload_test) | binary(=session_global_db_test) | binary(=session_transcript_backfill_test) | binary(=codex_transcript_ingest_test) | binary(=hermes_transcript_ingest_test) | binary(=cline_like_transcript_ingest_test) | binary(=corruption_test) | binary(=db_query_test) | binary(=mcp_handler_test) | binary(=mcp_server_test) | binary(=memory_test) | binary(=multi_mcp_coordination_test)' +platform = { host = 'cfg(windows)' } +test-group = 'windows-session-sqlite' + +[[profile.ci.overrides]] +filter = 'binary(=tool_first_touch_test) | binary(=lsp_code_diagnostics_test) | binary(=mcp_dashboard_tool_test) | binary(=extract_worker_test)' +platform = { host = 'cfg(windows)' } +test-group = 'windows-process-heavy' + +[[profile.ci.overrides]] +filter = 'binary(=automation_backend_test)' +platform = { host = 'cfg(windows)' } +test-group = 'windows-subprocess' + +[[profile.ci.overrides]] +filter = 'binary(=memory_eval_test)' +platform = { host = 'cfg(windows)' } +test-group = 'windows-memory-eval' + +[[profile.ci.overrides]] +filter = 'binary(=cli_non_interactive_test) | binary(=cursor_transcript_ingest_test) | binary(=memory_eval_test) | test(=curation_agent_plan_skips_when_automation_is_disabled_and_records_history) | test(=daily_model_series_limits_days_not_model_rows) | test(=memory_fact_store_update_trust_delta_uses_direct_fact_lookup)' +platform = { host = 'cfg(windows)' } +threads-required = "num-test-threads" + +[[profile.ci.overrides]] +filter = 'test(=dead_code_marker_resolve_is_single_pass)' +platform = { host = 'cfg(windows)' } +test-group = 'windows-timing-sensitive' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 30dae4f4..503cae5b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -113,7 +113,8 @@ jobs: - windows-runner env: RUSTC_WRAPPER: sccache - SCCACHE_GHA_ENABLED: "true" + SCCACHE_WEBDAV_ENDPOINT: http://10.10.10.20:8080/cache + SCCACHE_WEBDAV_KEY_PREFIX: tracedecay/windows-msvc steps: - uses: actions/checkout@v7 @@ -158,8 +159,77 @@ jobs: "Windows Rust cache hit: ${{ steps.windows-rust-cache.outputs.cache-hit }}" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append "Windows Rust cache matched key: ${{ steps.windows-rust-cache.outputs.cache-matched-key }}" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append + - name: Reset sccache daemon + shell: pwsh + run: | + if ($env:SCCACHE_PATH -and (Test-Path $env:SCCACHE_PATH)) { + & $env:SCCACHE_PATH --stop-server + } elseif (Get-Command sccache -ErrorAction SilentlyContinue) { + sccache --stop-server + } else { + Write-Host "sccache was not installed; skipping daemon reset" + } + exit 0 + + - name: Clean stale Windows test processes + shell: pwsh + run: | + $workspace = (Resolve-Path $env:GITHUB_WORKSPACE).Path + $repoWorkPath = "\_work\tracedecay\tracedecay" + $all = Get-CimInstance Win32_Process + $stale = foreach ($process in $all) { + if ($process.Name -notin @("tracedecay.exe", "cargo.exe", "cargo-nextest.exe", "rustc.exe", "link.exe", "sccache.exe")) { + continue + } + if (-not $process.CommandLine) { + continue + } + $inCurrentWorkspace = $process.CommandLine.IndexOf($workspace, [StringComparison]::OrdinalIgnoreCase) -ge 0 + $inRepoWorktree = $process.CommandLine.IndexOf($repoWorkPath, [StringComparison]::OrdinalIgnoreCase) -ge 0 + if (-not $inCurrentWorkspace -and -not $inRepoWorktree) { + continue + } + $parent = $all | Where-Object { $_.ProcessId -eq $process.ParentProcessId } + if (-not $parent) { + $process + } + } + foreach ($process in $stale) { + Write-Host "Stopping stale process $($process.Name) pid=$($process.ProcessId)" + Stop-Process -Id $process.ProcessId -Force -ErrorAction SilentlyContinue + } + - name: Run Windows tests - run: cargo nextest run --workspace --profile ci + run: cargo nextest run --workspace --profile ci --test-threads 32 + + - name: Clean abandoned Windows test children + if: always() + shell: pwsh + run: | + $workspace = (Resolve-Path $env:GITHUB_WORKSPACE).Path + $repoWorkPath = "\_work\tracedecay\tracedecay" + $all = Get-CimInstance Win32_Process + $stale = foreach ($process in $all) { + if ($process.Name -ne "tracedecay.exe") { + continue + } + if (-not $process.CommandLine) { + continue + } + $inCurrentWorkspace = $process.CommandLine.IndexOf($workspace, [StringComparison]::OrdinalIgnoreCase) -ge 0 + $inRepoWorktree = $process.CommandLine.IndexOf($repoWorkPath, [StringComparison]::OrdinalIgnoreCase) -ge 0 + if (-not $inCurrentWorkspace -and -not $inRepoWorktree) { + continue + } + $parent = $all | Where-Object { $_.ProcessId -eq $process.ParentProcessId } + if (-not $parent) { + $process + } + } + foreach ($process in $stale) { + Write-Host "Stopping abandoned tracedecay child pid=$($process.ProcessId)" + Stop-Process -Id $process.ProcessId -Force -ErrorAction SilentlyContinue + } - name: Save Windows Rust cache if: steps.windows-rust-cache.outputs.cache-hit != 'true' @@ -177,6 +247,8 @@ jobs: run: | if ($env:SCCACHE_PATH -and (Test-Path $env:SCCACHE_PATH)) { & $env:SCCACHE_PATH --show-stats + } elseif (Get-Command sccache -ErrorAction SilentlyContinue) { + sccache --show-stats } else { Write-Host "sccache was not installed; skipping stats" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c3f291f..a5e68dd0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.17](https://github.com/ScriptedAlchemy/tracedecay/compare/v0.0.16...v0.0.17) - 2026-06-29 + +### Other + +- Add TraceDecay registry, LCM, and transcript audit improvements ([#142](https://github.com/ScriptedAlchemy/tracedecay/pull/142)) + ## [0.0.16](https://github.com/ScriptedAlchemy/tracedecay/compare/v0.0.15...v0.0.16) - 2026-06-29 ### Fixed diff --git a/Cargo.lock b/Cargo.lock index 0da42026..f6f9ed2a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4499,7 +4499,7 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracedecay" -version = "0.0.16" +version = "0.0.17" dependencies = [ "amari-holographic", "axum 0.8.9", diff --git a/Cargo.toml b/Cargo.toml index 882063b9..8ed5446d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tracedecay" -version = "0.0.16" +version = "0.0.17" edition = "2021" description = "Code intelligence tool that builds a semantic knowledge graph from Rust, Go, Java, Scala, TypeScript, Python, C, C++, Kotlin, C#, Swift, and many more codebases" license = "MIT"