Repository navigation
perf(index): run supervised index workers at below-normal CPU priority - #4
Open
halindrome wants to merge 302 commits into
Open
halindrome wants to merge 302 commits into
halindrome wants to merge 302 commits into
Conversation
Replace the wall-clock ratio test pylsp_scale_cross_registry_build_linear (py_lsp_scale suite) with pylsp_cross_registry_build_work_is_linear in the py_lsp suite. The new test builds the same generated input (n classes, each followed by two methods, in extraction order) and reads the seam-build CBM_LSP_WORK counter instead of a clock, so its verdict does not depend on host load, and it runs in PR CI, which skips the perf suites. 4x the classes must cost at most ~4x the counted work. With the type-QN set the build examines no registry candidates (0 at 1000 and 4000 classes); with the scanning receiver probe the work grows from 2,809,000 to 23,236,000 and the test fails. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Brings DeusData#2244 (agent detection through the UTF-8 path wrapper) up to date with main a222715. The branch was based on 45c45be, 1,323 commits behind. The merge is clean. The merged tree adds exactly this branch's 22 lines to main and removes 6, in src/cli/cli.c and tests/test_cli.c. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
The Windows regression test for DeusData#2145 created its profile directory with test_mkdirp and read the result as a boolean. test_mkdirp returns 0 on success, so the test failed as soon as the directory existed and never reached the detection it was written to check. Inverting the check is not enough on its own. test_mkdirp uses cbm_mkdir, which is the narrow _mkdir on Windows. Under an ANSI code page such as 1252 it does not create the intended name: it creates a directory whose name is the UTF-8 bytes read as code-page characters. The old narrow stat finds that mangled directory and the new wide lookup correctly does not, so the test would pass without the fix and fail with it. th_mkdir_p goes through the wide API and creates the real name, the way a non-ASCII Windows profile actually looks. Since 2b329fe, Claude Code is detected from settings.json, .claude.json or the claude CLI, through cbm_file_exists, which is already wide on Windows; a bare .claude directory no longer marks it as detected. The test now asserts Cursor, which is detected by its directory alone, so the assertion goes through dir_exists, the function this branch changes. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
…de them file_pattern, kind and namespace are applied after the 2000-row BM25 candidate window: unlike the label they cannot go into the FTS5 MATCH. With a common query token and a narrow filter the window held none of the filtered rows, and search_graph answered 0 rows -- or a few rows of an under-counted total -- although matching nodes exist. An unlabelled query whose window held only File/Folder/Variable/Project rows had the same failure. When the window is saturated and such a filter is set, or the window held no row passing the filters, the query is now ranked over every candidate (inner LIMIT -1): the FTS-first subquery plan stays, the extra work is linear in the token's match count (the saturation probe already orders every match), and the total is exact. The decision depends only on the query, never on the page, so offset pages stay consistent. Unfiltered and label-only queries that find rows keep the window and are byte-identical. The filter binds, the count query and the saturation probe move into helpers shared by the ranked and the count query. Measured on Django, meilisearch and kubernetes indexes (9 / 9 / 24 filtered queries): zero results 6 -> 0, 6 -> 0, 23 -> 0; rows returned 52 -> 156, 3 -> 303, 19 -> 807; exact totals 0 -> 9, 0 -> 9, 0 -> 24. The graph is unchanged (search-only change). Refs DeusData#2386 Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
…dabot updates Dependabot opened one PR per CodeQL action (DeusData#2504 init, DeusData#2505 analyze, DeusData#2506 upload-sarif), each moving to 4.38.2. Merging them one at a time would leave init and analyze on different versions in between. This moves all three to v4.39.0 (6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee, the commit the v4.39.0 tag points to) in one change, and adds a Dependabot group so future CodeQL Action updates arrive as a single PR. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Make this repository a Claude Code plugin marketplace so users can find and add the server from inside Claude Code: claude plugin marketplace add DeusData/codebase-memory-mcp claude plugin install codebase-memory@codebase-memory This is slice 1 of DeusData#1188: discovery only. The plugin registers the MCP server and nothing else; the skill, the graph agents and the context hooks still come from `codebase-memory-mcp install`. - .claude-plugin/marketplace.json: one plugin, sourced from ./plugin. - plugin/.claude-plugin/plugin.json: version pinned to the current release. Without a pinned version every commit to main would be a new plugin version for installed users. - plugin/.mcp.json: stdio server `npx -y codebase-memory-mcp@0.12.1`. The pin keeps main from advertising a server version npm does not have; the npm package downloads the release binary on first start and verifies it against the release checksums. - .gitignore: the root .mcp.json stays ignored; plugin/.mcp.json is published. - README: install section, and "use one or the other": with both the plugin and `install`, Claude Code runs the server twice under two tool namespaces. - tests/test_version_metadata_contract.sh: both plugin files are release-tracking surfaces; a new claim form reads the npm package spec (`codebase-memory-mcp@X.Y.Z`), and the unregistered-surface sweep now covers plugin/ and .claude-plugin/. The post-release sync that bumps server.json must bump these pins too, or this contract goes red. No language count is stated anywhere in the plugin metadata, so the language-count contract has nothing new to track. Refs DeusData#1188 Co-authored-by: Kody <kaidi.shi.1121@gmail.com> Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Preserve the current C/C++ field-binding policy while integrating the Java record accessor change. Handle varargs record components with array return types and reject data targets before sequential LSP call emission, matching the parallel path. Add focused regressions for both cases. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Since Go 1.22 a net/http ServeMux pattern may name a method and a host
before the path: mux.HandleFunc("POST /v1/payments", h),
"GET /v1/payments/{id}", "api.example.com/v1/x". Every route
registration gate wanted the first argument to open with a slash (the
extractor's handler capture, find_route_path_in_args in the parallel
pass, and the three gates in the sequential pass), so such a
registration minted no Route and no HANDLES edge, while the same file
written with "/v1/payments" had both.
cbm_service_pattern_mux_split reads the "[METHOD ][HOST]/[PATH]"
grammar. For Go files only, the path of such a pattern now registers
the route, the Route takes the pattern's method when the callee names
none (Handle/HandleFunc are ANY), and a host is dropped from the path.
Both passes share cbm_pipeline_mux_route_path and
cbm_pipeline_route_reg_method so their Routes stay identical. Other
languages and plain "/path" patterns take the unchanged path.
Fixes DeusData#2537
Signed-off-by: Gaurav Dubey <gauravdubey0107@gmail.com>
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Pick up the shared CI contract repair while preserving the approved plugin changes. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Reworks the ADR-loss-across-reindex fix to Alternative 1 (per the PR review):
remove the race rather than narrow it. ADRs live in a per-project sidecar SQLite
DB ("<graph_db>.adr.db"), separate from the graph DB a reindex rebuilds or
deletes, so there is no capture, re-read, re-apply, or lock — and no sleeps,
polling, or timeout deciding an outcome.
store.c:
- ADR writes (store/delete/update_sections) use a cached read-write handle opened
SQLITE_OPEN_READWRITE|CREATE and configured like the graph store (PRAGMA
busy_timeout=10000 + journal_mode=WAL) so cross-process access waits rather
than failing SQLITE_BUSY. A :memory: store keeps ADRs in the graph DB.
- Reads never write: cbm_store_adr_get uses the cached RW handle if open, else
opens the sidecar SQLITE_OPEN_READONLY (with the same busy timeout) when the
file exists, else reads the legacy graph row without creating anything. When
the sidecar exists but is NOT marked migrated (half-created), it falls back to
the legacy graph row so a partial sidecar never hides an ADR.
- One-time migration is atomic: adr_copy_legacy_once wraps the marker check,
legacy copy, and marker insert in a single BEGIN IMMEDIATE...COMMIT
(re-checking the marker under the lock; ROLLBACK->ERR on failure). New public
cbm_store_adr_migrate_once. Sidecar path via cbm_path_for_file_api (Windows
long-path). Dropped the write-only adr_db_path field.
pipeline.c: migrate a legacy ADR into the sidecar BEFORE the format-change and
forced-full routes unlink the old generation; preserve-and-abort on failure, and
do NOT fail open — a query-open returning NULL preserves unless the final DB
genuinely does not exist. Migration targets the FINAL path (staging suffix
stripped). The early-capture/re-apply machinery and its test hook are gone.
artifact.c: the exported artifact carries the ADR — snapshot_inject_adr always
DELETEs project_summaries first, then injects only when an ADR is present, so a
deleted ADR never resurrects through a lingering legacy row. Import restores the
ADR into the destination sidecar via cbm_store_adr_restore_from_graph_if_absent:
it copies the artifact's ADR (INSERT OR IGNORE — never clobbers a local one)
regardless of the migrated marker, so a teammate who already indexed the project
(marked sidecar, no ADR) still receives the shared decision record. store.c
factors the row copy into adr_copy_rows, shared by the one-time legacy migration
and the ungated restore.
mcp.c: delete_project removes "<db>.adr.db" (+ -wal/-shm/-journal) only after the
graph unlink succeeds; is_project_db_file skips *.adr.db. cli.c: exclude
*.adr.db from index listing/counting. README + memory-core baselines updated.
Tests (file-based): ADR written mid-reindex survives on BOTH the full and delta
routes (route-pinned FORCED_FULL / CLOSURE_REPAIR); a legacy row migrates before
a forced-full/format reindex with no prior read; migration failure (a directory
at <db>.adr.db) preserves-and-aborts with the old generation intact;
delete_project via the MCP handler removes the sidecar + journals; the artifact
export->import round trip keeps the ADR; a deleted ADR does not resurrect on
import; an import does not clobber a local ADR; an import into an already-indexed
destination (marked sidecar, no ADR) restores the artifact's ADR; a half-created
sidecar falls back to the legacy row. The import tests remove the destination
graph DB (keeping the sidecar + marker) before importing, matching production
(try_artifact_bootstrap imports only when the graph DB is missing) so the rename
succeeds on Windows, not only on POSIX.
Closes DeusData#516
Signed-off-by: 0xb007ab1e <134006168+0xb007ab1e@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bumps [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) from 4.38.1 to 4.39.1. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](github/codeql-action@1c5b675...9b32540) --- updated-dependencies: - dependency-name: github/codeql-action/upload-sarif dependency-version: 4.39.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
…ndex-cpu main moved 12 merges past this branch's last base (72c3604). One conflict, in src/daemon/application.c: DeusData#2737 split application_background_index() into admit/wait helpers and gave it named result codes. Resolved by taking main's structure and keeping this branch's one change there: the automatic job's args carry _cbm_background after the policy call. The watcher path re-encodes mode/persistence/doc_candidates into the same document, so the marker survives the re-encode, and the job comparison still drops it. The net diff against main is unchanged: the same 13 files and the same added and removed lines as before the merge. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
A background refresh used performance cores minus one, which is a single worker on a host with two or fewer performance cores. One worker sends the indexer down the sequential route, which still builds a different graph than the parallel route (fewer Route and HANDLES edges, churned CALLS). Floor the background width at two whenever the foreground width is two or more; a host whose foreground width is one keeps one. CBM_WORKERS and CBM_INDEX_SINGLE_THREAD keep their precedence, and larger hosts keep their headroom unchanged. The pipeline and mcp worker-policy tests now expect the floored width, and a new pipeline test pins the width for one-core, two-core and larger host shapes. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
C# looks a simple type name up namespace by namespace, innermost outward.
At each namespace N it checks the members of N, then the usings of the
namespace declaration enclosing the reference. The global namespace is
the last N, and its declaration is the compilation unit. So a type
declared without a namespace hides a type that only a compilation-unit
`using` imports, while a `using` inside a namespace body still wins over
the global namespace. Step 8b used to rank every using before the global
namespace.
- CBMCSUsing records whether a directive sits inside a namespace body
(in_namespace). cs_collect_imports tracks it per node, including the
compilation-unit siblings after a file-scoped namespace; the cross-file
entry pre-loads the pipeline import list without placement and the AST
walk upgrades it.
- cs_visible_namespaces ranks a simple name as: enclosing namespaces
innermost outward, namespace-body usings, the global namespace "", and
last the compilation-unit usings.
Ranking the global namespace that high also requires that only a type
proven global claims it. The vendored grammar does not parse a
`ref partial struct` with members, and error recovery dissolves the
enclosing namespace, so every type after it in that namespace surfaced
with no namespace. Mapped to "" those types outranked the real, imported
declaration: on dotnet/runtime 5,313 CALLS moved from implementation
files into reference assemblies (System.Runtime.cs, which declares
DefaultInterpolatedStringHandler as a `ref partial struct`).
cs_type_decl_namespace now returns "" only when the compilation unit
parsed without errors and NULL (unknown, invisible to step 8b, as on
main) otherwise; cs_top_level_namespace passes that through.
Tests:
- parallel_csharp_nested_type_and_global_namespace_binding: the
compilation-unit `using` probe now expects the global type (spec), and
a new namespace-body `using` probe expects the imported one. RED with
the previous order: cu_using=0/0.
- parallel_csharp_parse_damaged_namespace_is_not_global (sequential and
parallel). RED without the clean-parse rule: real=0 no_damaged=0 on
both paths.
- cs_lsp::cslsp_decl_namespace_global_needs_clean_parse: extractor
contract ("" for a clean global type, the namespace when found, never
"" after a parse error).
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
cs_lookup_method searches the other declarations of a type (same simple name, same declared namespace: `partial` pieces, reference-assembly copies) before it walks the base classes. With global-namespace types now carrying the namespace "", every same-name type declared without a namespace anywhere in the repository became a twin of every other one. Across a repository that is a different type per assembly (each test project has its own Program or Helper), so a member missing on the receiver bound to an unrelated type ahead of the receiver's own base. cs_namespace_twins returns no twins for a type in the global namespace. Test: cs_lsp::cslsp_global_namespace_types_are_not_partial_twins runs the production Tier-2 C# registry builder over cross-file defs: two unrelated global Helper types and a base class. RED without the guard: stop_base=0 stop_unrelated_global_twin=1. GREEN with it. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
…dex-cpu fix: preserve CPU headroom during background indexing
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
…s-global-ns fix(cs-lsp): resolve nested types through type qualifiers, bind global-namespace types
…sion-untouched fix(cli): leave a user-owned OpenCode module untouched instead of appending the block
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
…ecursion fix(mcp): expose recursion metadata in trace_path
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
…-compat fix(codex): migrate skill to documented user path
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
feat(cli): opt-in exit contract for index_repository
…plexity fix(elixir): functions carry no complexity, fingerprint or line count
On 2026-11-01 two Linux jobs hung in `sudo apt-get update` right after "Get:5 https://archive.ubuntu.com/ubuntu noble-security InRelease" until their job limit; the build never started in either: - PR 2641, test-tsan x86 (run 41251045506, job 124688326533): the "Install deps (Ubuntu)" step ran 2 h until the 120-minute job limit. - PR 2395, test-unix gcc x86 (run 41256855177, job 124705168264): the same step ran 4 h until the 240-minute job limit. Both logs show the azure mirror ignored after about 15 s, the fallback to archive.ubuntu.com, and then no output until the cancel. The default apt http timeout (120 s) did not end the stall. Rule applied to every workflow step whose run block calls apt: - A step-level timeout-minutes. 10 for steps that only provision packages (green runs on 2026-11-01 and the last green dry run: 5 to 76 s); 20 for the three pr.yml steps that also run scripts/build.sh (green: 246 to 331 s). A stalled mirror now fails the step in minutes instead of holding the runner until the job limit. - `-o Acquire::Retries=3 -o Acquire::http::Timeout=30 -o Acquire::https::Timeout=30` on every apt-get update and install, with the -o options before the subcommand as in test-infrastructure/Dockerfile.msan. Nothing else changes: no action, runner, package or step-order changes. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
The OpenCode 2 compaction hook receives the compaction request, whose messages are the input the summary is built from. Add the post-compaction session note there as a text message, mirroring the 1.18.x path that pushes it into output.context. Session instruction entries are rendered into the system array of every later request, so the note no longer goes through ctx.session.instructions.entry, and event.system stays untouched. Registration and the push still fail open. Pin it in a new agent_clients test: the push sits inside the compaction registration, carries a user text part, is guarded by an array check, and the generated module names neither a system property nor an instruction entry. The DeusData#2077 test drops the assertions that pinned the old channel. Refs DeusData#2204 Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Tool.Result allows content: [], and for it the array branch of appendResult pushed a text part that held only the session note, so the note became the whole content of the tool result. Add a text part only when the array already holds a part; an empty array now falls through to the string output branch, or the result is returned unchanged. Pin it in a new agent_clients test: the part-adding push sits inside the non-empty array branch, ahead of the string output fallback, and no unguarded array branch is left. Refs DeusData#2204 Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
apt-get update exits 0 when index fetches fail: it only prints "W: Some index files failed to download. They have been ignored, or old ones used instead." and the job breaks later at install time with a misleading "Unable to locate package", or installs from stale lists. Add --error-on=any to every apt-get update this branch hardens, placed after the -o options as in test-infrastructure/Dockerfile.msan, so the update step itself fails when an index cannot be fetched. Proof in ubuntu:24.04 (apt 2.8.3) and ubuntu:22.04 (apt 2.4.14) containers with a runner-shaped mirror+file:/etc/apt/apt-mirrors.txt source and the same -o options CI passes: - every mirror unreachable: exit 100 with the flag (E: lines), exit 0 without it (W: lines, zero Packages lists), on both apt versions - first mirror refused or stalled (30 s connect timeout) and the real archive second: the Ign: failover lines do not trip the flag, exit 0 with every index fetched (measured with Acquire::Retries=0) - the image sources with the flag: exit 0 and no Ign/W/E lines, so the option is understood by apt 2.4 and 2.8 - green hosted-runner logs (ubuntu-24.04 and ubuntu-22.04 legs) show no Ign/Err/W/E lines in the update step With Acquire::Retries=3 a mirror failover leaves apt idle after the InRelease failover, with or without the flag and also for a plain apt-get update; that apt behaviour predates this change and is unchanged by it. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
The hosted Ubuntu x64 runners read the archive through mirror+file:/etc/apt/apt-mirrors.txt. With Acquire::Retries above 0 (including the apt default of 3), a failover from a dead first entry of that list (connection refused, DNS failure or a stalled host) to the next entry goes idle: apt-get fetches a few InRelease files from the second mirror and then waits until the step timeout. With Acquire::Retries=0 the same failover completes. Seen on noble (apt 2.8.3) and jammy (apt 2.4.14). Every apt step this branch hardened now picks the retry count at runtime, applied to both update and install: 0 when the runner has the mirror list (moving to the next mirror is the retry), 3 otherwise (arm64 runners and any host with plain sources keep their retries). --error-on=any, the http and https timeouts and the step timeouts are unchanged. Proof: the step text extracted from the edited _build.yml (update plus install of zlib1g-dev), run under bash -e in ubuntu:24.04 and ubuntu:22.04 containers with runner-shaped mirror lists: - first mirror refused: exit 0 in 8 s / 9 s, every index and deb fetched from the second mirror - first mirror stalled (192.0.2.1): exit 0 in 68 s / 69 s, one 30 s timeout each for update and install, then the second mirror - healthy first mirror: exit 0 in 7 s / 9 s - no mirror list, plain sources: the prefix keeps Retries=3, exit 0 in 8 s / 7 s - every mirror dead: update exits 100 in under 1 s, install skipped - revert check, the previous step text with a dead first mirror (refused or stalled): idle with no Packages index at the 180 s cap on both releases Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
…al host The V2 compaction hook pushed a plain object into the compaction request's event.messages. OpenCode's Message is a schema class at v2.2.5, and nobody has run this path on a real 2.x host. The try/catch only guards the array push, which cannot throw. If OpenCode rejects the object, that happens inside its own compaction, out of the plugin's reach, so an untested note could break compaction for every OpenCode 2 user. Losing the note costs far less. Remove the V2 compaction registration and the sessionHooksRegistered flag it needed. The V2 tool hook, proven on OpenCode 2.2.5, stays, and so does the 1.18.x experimental.session.compacting path. OpenCode 2 sessions still get the session note on the first tool result of a session. A later change can add a note after compaction together with a real 2.x run. The replacement test pins that the generated module registers no session hook and touches neither event.messages, a system property nor an instruction entry. Refs DeusData#2204 Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
ci: fail fast when an apt mirror stalls
…2-setup-hooks fix(cli): register OpenCode 2 hooks via the setup context
…ons/github/codeql-action/upload-sarif-4.39.1 build(deps): Bump github/codeql-action/upload-sarif from 4.38.1 to 4.39.1
Bumps [actions/attest](https://github.com/actions/attest) from 4.1.0 to 4.2.2. - [Release notes](https://github.com/actions/attest/releases) - [Changelog](https://github.com/actions/attest/blob/main/RELEASE.md) - [Commits](actions/attest@59d8942...1e69f48) --- updated-dependencies: - dependency-name: actions/attest dependency-version: 4.2.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
Conflict in .github/workflows/scorecard.yml resolved to the main version: main already pins upload-sarif to 9b3254085494b55a0f7c4c2b3d2d52cc712ce370 (v4.39.1, DeusData#2779), which supersedes this branch's v4.39.0 pin. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Main already moved upload-sarif to v4.39.1 (DeusData#2779). Move init and analyze to the same commit, 9b3254085494b55a0f7c4c2b3d2d52cc712ce370 (the commit the v4.39.1 tag points to), so all three CodeQL actions run one version again. The pin comment follows the form Dependabot wrote for upload-sarif. The codeql-action Dependabot group added earlier on this branch keeps the three in lockstep from here on. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Bumps [msys2/setup-msys2](https://github.com/msys2/setup-msys2) from 2.32.0 to 2.33.0. - [Release notes](https://github.com/msys2/setup-msys2/releases) - [Changelog](https://github.com/msys2/setup-msys2/blob/main/CHANGELOG.md) - [Commits](msys2/setup-msys2@66cd2cc...ec48f7c) --- updated-dependencies: - dependency-name: msys2/setup-msys2 dependency-version: 2.33.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
…ons/actions/attest-4.2.2 build(deps): bump actions/attest from 4.1.0 to 4.2.2
….39.0 ci: bump the CodeQL actions to v4.39.1 together and group their Dependabot updates
…ons/msys2/setup-msys2-2.33.0 build(deps): bump msys2/setup-msys2 from 2.32.0 to 2.33.0
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Run supervised index workers (
cli --index-worker) at below-normal CPU priority so a long full index can't starve interactive CLI/MCP queries.Upstream issue: DeusData#2834
During a full index the parallel extraction pass saturates every core. One-shot
codebase-memory-mcp cli <tool>queries are CPU-bound at start-up, and measurement showed their wall time doubling during an index while their CPU time stayed flat — run-queue contention, not a lock (same-project and other-project queries behaved identically). Nothing insrc/lowered worker priority before this change.Change
cbm_lower_cpu_priority()(src/foundation/platform.c/.h): POSIXsetpriority(PRIO_PROCESS, 0, 10), never raising an already-nicer process; WindowsBELOW_NORMAL_PRIORITY_CLASS. Plain nice only — not macOS background QoS, which would pin indexing to efficiency cores and throttle its I/O.run_cli(src/main.c) calls it once in the index-worker role, before any indexing thread exists, so every pipeline thread inherits it. Failure is logged at info and ignored.Acceptance criteria
Testing
platform_lower_cpu_priority_nices_the_process(tests/test_platform.c): forks a child, calls the helper, reportsgetprioritythrough a pipe; asserts success and nice >= 10. Red with the helper stubbed (tests/test_platform.c:1476), green with the change. Skipped on Windows.scripts/test.sh --suites platform,index_supervisor,index_resilience,worker_pool,cli: 442 passed, 1 pre-existing skip, 0 failed.🤖 Generated with Claude Code
https://claude.ai/code/session_01CDDUoWEZMNZ9fLvzp2pPGT