Commit Graph
4420 Commits
Author SHA1 Message Date
Martin Vogel 8fafd8aa2a Merge pull request #2568 from Totopo27/fix/gh-2563-extra-extensions-jinja2
fix(discover): map jinja and jinja2 in userconfig language table
2026-10-20 19:39:26 +02:00
Martin Vogel 94f952d8d6 Merge pull request #2599 from pcristin/fix/windows-local-transition-cleanup
fix(daemon): wait out Windows local teardown contention
2026-10-20 19:39:21 +02:00
Martin Vogel 205343e8db Merge pull request #2694 from woodsonl/fix/opencode-augment-timeout
fix(cli): bound emitted OpenCode augment() with SIGKILL timeout and stdin guard
2026-10-20 19:39:16 +02:00
Martin Vogel 8c7b3bd76e Merge pull request #1786 from umi008/fix/issue-1718-approve-sensitive-separators
fix(workspace): treat '/' and '\' as the same separator in root matching (#1718)
2026-10-20 19:39:11 +02:00
Martin Vogel 9c89041a56 Merge pull request #2556 from mvanhorn/fix/2433-server-discover-probe-log
fix(mcp): log the server/discover connect probe as info, not an error
2026-10-20 19:39:06 +02:00
Martin Vogel c99fe11c36 Merge pull request #2512 from lorenzozanee/fix/issue-2481-tsx-ampersand
test(parse): cover the reported TSX ampersand fragment (#2481)
2026-10-20 19:39:01 +02:00
Martin Vogel 27dea228f0 Merge pull request #2720 from DeusData/carry/1803-symlink-bounded-count
fix(discover): a symlink must not abort a bounded count (carries #1803, fixes #2701)
2026-10-20 19:38:55 +02:00
Martin Vogel 172c36191d Merge pull request #2623 from dianshu/fix/ts-bounded-lookup-main-20261013
fix(ts): bound recursive member and method lookup
2026-10-20 19:38:38 +02:00
Martin Vogel 9a2d1d60c3 Merge pull request #2710 from wazum/fix/606-php-unindexed-receiver
fix(php): drop the name guess when the receiver's class is not indexed
2026-10-20 19:34:05 +02:00
Martin Vogel 3fa75481dc Merge pull request #2726: refresh project messaging and CBM Lens website 2026-10-20 19:25:48 +02:00
Martin Vogel dd357a7c97 docs: refresh project messaging and Lens website
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-20 19:08:27 +02:00
Martin Vogel 6172374452 Merge origin/main into fix/issue-2481-tsx-ampersand
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-20 07:16:11 +02:00
Martin Vogel f460813b94 Merge branch 'main' into fix/606-php-unindexed-receiver 2026-10-20 07:04:42 +02:00
Martin Vogel a22271570e Merge pull request #2677 from DeusData/feat/deploy-graph-gaps
feat(deploy): render Helm images, mark default-valued images, link crds and werf charts
2026-10-20 06:34:12 +02:00
Martin VogelandLogan G aa95352bd1 fix(discover): a symlink must not abort a bounded count
safe_stat reports a symlink as CBM_NOT_FOUND by policy, and
walk_dir_process_entry turned any CBM_NOT_FOUND into out->failed when
count_only was set. One symlink anywhere in a tree therefore aborted the
whole count.

cbm_discover_count_bounded is what auto-index admission calls (the MCP
session path and the daemon path), so any repository containing any
symlink could never auto-index: admission logged
reason=unsafe_or_unavailable_path files=-1 and returned. Nothing is unsafe
and the walk is not slow; the count simply refused at the first symlink it
met. Explicit index_repository was unaffected, because count_only is false
there and the same entry is skipped rather than fatal.

A count now skips symlinks and still aborts on an entry it genuinely cannot
observe, which is what the admission guard wants.

Carried from #1803 by Logan G onto current main. #1822 has since given
safe_stat an is_symlink out-param for the ignored-files report, so this
reuses it instead of adding a second is_link parameter; the production
change is the one condition. The regression test
discover_count_bounded_survives_a_symlink is the contributor's, aligned
with the neighbouring symlink tests: a visible SKIP_PLATFORM on Windows
instead of compiling it out, no wall-clock deadline (0 = none), and
th_cleanup of its temp tree.

Co-authored-by: Logan G <logan@gosolto.com>
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-20 06:32:03 +02:00
Martin Vogel 0286569e63 test(workspace): create the descendant on disk; write the grant via cbm_fopen
The Windows half of ws_approve_sensitive_matches_across_separator_styles
asserted the sensitive-root hint for <cache>/.ssh/cfg/sub without creating
that directory. Containment canonicalizes the candidate, which on Windows
opens it (CreateFileW, OPEN_EXISTING), so a missing descendant was reported
as outside the allowed root and the assertion failed on the Windows shard.
Create it the way its parent is created.

The grant file is now written through cbm_fopen, the wrapper every
repository or user path goes through, in binary mode.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-20 06:05:10 +02:00
Martin Vogel 8af291deb4 Merge branch 'main' into fix/2433-server-discover-probe-log 2026-10-20 06:00:20 +02:00
Martin Vogel 5a04e424e7 Merge branch 'main' into fix/issue-1718-approve-sensitive-separators
main landed the same separator-equivalent comparison in 2e6dc087
(ws_prefix_equal), so the conflict in ws_is_ancestor_or_equal resolves to
main's helper; the #1718 comment above the function is kept. The two
test-file conflicts were both sides adding tests at the same place, and
keep both.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-20 05:42:35 +02:00
Martin Vogel 542311ba11 Merge branch 'main' into fix/gh-2563-extra-extensions-jinja2 2026-10-20 05:31:05 +02:00
Martin Vogel 1cf657377b Merge branch 'main' into fix/opencode-augment-timeout 2026-10-20 05:04:58 +02:00
Martin Vogel 4c80d89edf Merge pull request #2713 from DeusData/fix/py-namespace-effect-allowlist
fix(python): a top-level call of a harmless same-module function keeps the package namespace
2026-10-20 04:54:32 +02:00
Martin Vogel 5a4af9c46f Merge pull request #1913 from ilyabrykau-orca/fix/go-method-receiver-qn
fix(extract): receiver-qualify Go method QNs
2026-10-20 04:16:17 +02:00
Martin Vogel 171f99b698 Merge pull request #2714 from DeusData/feat/hooks-graph-follow-up-hint
feat(hooks): name the graph follow-up tools in every search augmentation
2026-10-20 03:28:57 +02:00
Martin Vogel af312fb74b Merge branch 'main' into fix/windows-local-transition-cleanup
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-20 03:17:21 +02:00
Martin Vogel 0e4ec8018d Merge main 28a6905c into fix/ts-bounded-lookup-main-20261013
Brings the branch onto current main. The only red in the PR's CI run,
incremental_deleted_spawner_drops_its_process, was a main-side failure at
the old base 56700bdb, fixed on main by 2317c2e7.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-20 01:01:17 +02:00
Martin Vogel 6513104921 Merge branch 'main' into fix/opencode-augment-timeout 2026-10-20 00:34:46 +02:00
Martin Vogel 1137a9ebe2 Merge branch 'main' into fix/606-php-unindexed-receiver 2026-10-20 00:34:43 +02:00
Martin Vogel 8781bbd29f Merge origin/main into fix/py-namespace-effect-allowlist
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-20 00:26:27 +02:00
Martin Vogel 28a6905c07 Merge pull request #2712 from DeusData/fix/py-namespace-string-future-facts
fix(python): docstrings and __future__ imports are no namespace barriers
2026-10-20 00:25:58 +02:00
Martin Vogel 4f29d6cbdd Merge branch 'main' into fix/606-php-unindexed-receiver 2026-10-19 23:57:19 +02:00
Martin Vogel f0e3b514a0 Merge branch 'main' into fix/opencode-augment-timeout 2026-10-19 23:57:15 +02:00
Martin Vogel d21152603c Merge pull request #2707 from DeusData/fix/data-flows-test-file-scope
fix(routes): scope DATA_FLOWS pairing at the test-file boundary (R1 + R2)
2026-10-19 23:55:09 +02:00
Martin Vogel c52ca5d34c feat(hooks): name the graph follow-up tools in every search augmentation
When an agent greps for a symbol that the graph knows, the PreToolUse
augmentation (Grep, Glob and Bash searches) lists the matching symbols. It now
closes with one line that is cbm's own statement, outside the untrusted symbol
block, naming the graph tools for the usual next question:

  [codebase-memory] For these symbols, trace_path lists callers and callees,
  get_code_snippet returns the exact source, and search_graph finds related
  symbols by name.

The line carries no repository-derived value and is stated as facts, as Claude
Code asks of hook context. It is appended at the string's real end into
reserved room: the list loop's offset can run past its cap when a row is
truncated, so appending at that offset could have written past the buffer.
Searches without a hit, errors and non-search events are unchanged.

Refs #509

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-19 23:52:05 +02:00
Martin Vogel db5791a0de Merge branch 'main' into fix/606-php-unindexed-receiver 2026-10-19 23:49:36 +02:00
Martin Vogel 5cdbe9b0b6 fix(deploy): taint Helm changes of and/or, later conditions, sortAlpha, parse errors
Review round 4 of #2677 (user decisions: R4-1..R4-4, R4-6, R4-7, R4-9;
R4-5 measured and left out). Every case ends in an UNKNOWN image, never a
wrong one.

Changes not run exactly (helm_template.c):
- A deep merge into a values map is not exact when a change was made at or
  below its path (a set storing a map there): every values map a set or a
  merge changes keeps its path, and such a merge leaves the images after it
  UNKNOWN.
- and / or at an operand whose truth is not known -- UNKNOWN, or a map a
  change made unknown -- leave the images after them UNKNOWN when an
  operand after it may change maps.
- In an if / with an UNKNOWN condition skips, the else-if / else-with
  conditions after it are looked at too: a change there taints, an
  assignment there makes its variable UNKNOWN.
- sortAlpha sorts a []string in place: it counts as a change (a list is
  never poisoned, so it taints). No other Sprig list function changes its
  argument in place.
- A template, a define body or a scanned template file the grammar does not
  parse may hide a change: its images are UNKNOWN.

Work (helm_template.c):
- A capture's keys leave the key set one by one; the set is no longer
  cleared by walking its whole capacity after each capture.
- Template files are found by a hash of their path, and an include of a
  name that is no define is answered once per render.

Known limit, documented (README): each template file renders on its own,
while Helm renders a chart's files with one shared .Values. Running them in
Helm's order is the planned follow-up; the coarse rule across files cost 83
more correct images on the 20 infra corpora and was left out.

On the 20 infra corpora: Image edges identical to round 4 (0 lost, 0
added), no budget trip.

Tests: R4-1..R4-4 and R4-9 fail on 3401def5 by their assertions (each sub
case too); R4-6 and R4-7 are correctness controls, their cost measured
outside the suite.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-19 23:42:36 +02:00
Martin Vogel cd16ef8046 Merge fix/go-weak-selector-calls (#1907, with main 32445b20) into fix/go-method-receiver-qn
Brings main 32445b20 in through the refreshed #1907. No conflicts.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-19 22:29:34 +02:00
Martin Vogel 6856f09705 Merge origin/main (32445b20) into fix/go-weak-selector-calls
Conflict in tests/test_pipeline.c: this branch and #2703 (on main) each
registered two Go tests at the same place in the suite list; both pairs
are kept.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-19 22:29:14 +02:00
Martin Vogel 170fad6b65 Merge fix/py-namespace-string-future-facts (#2712) into fix/py-namespace-effect-allowlist
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-19 22:26:49 +02:00
Martin Vogel 32445b2001 Merge pull request #2706 from DeusData/fix/php-trait-flatten-index
fix(php): index trait methods by receiver while flattening (#1265)
2026-10-19 22:26:45 +02:00
Martin Vogel efe007ea1b Merge pull request #2708 from DeusData/feat/mcp-profile-instructions
feat(mcp): state the structural questions in the scout and analysis profiles
2026-10-19 21:58:51 +02:00
Martin Vogel 2248ae1f3c Merge pull request #2698 from DeusData/feat/mcp-tool-search-discovery
feat(mcp): load the structural tools upfront and say what the graph answers
2026-10-19 21:57:17 +02:00
Pcristin e9e7861d77 Merge branch 'main' into fix/windows-local-transition-cleanup 2026-10-19 14:05:05 +03:00
Wolfgang Klinger 5fd9e4f33c fix(php): drop the name guess when the receiver's class is not indexed
When the PHP LSP knows a receiver's class but the class is not in the
index, it emits php_method_typed_unindexed at 0.55, below the LSP
confidence floor. The resolver skipped that row and the weak short-name
fallback bound the call to a same-named project method: `$file->getUid()`
on a vendor File became a CALLS edge to App\Item::getUid.

#2520 turns this row into php_external_receiver when a vendor `use`
proves the class external, but two cases still reach the fallback. A
global function import (`use function sprintf;`) leaves the file's import
bindings unproven, since #2705 proves only class imports absent. And a
vendor type that arrives through a return type
(`$repository->findFile()->getUid()`) has no `use` in the calling file
at all.

Both resolvers now drop a unique_name or suffix_match edge when the LSP
row names a receiver class that no project class-like symbol shares by
simple name. A project class with that name keeps the fallback, because
the PHP LSP does not follow every cross-file type.

The test pair covers both cases, through pass_calls.c and pass_parallel.c.
Each case is RED on main on its own (vendorCall, chainedVendorCall);
calls on a project-typed receiver and on $this still resolve. On a
211-file TYPO3 project PHP CALLS edges go from 1083 to 1059
(-18 suffix_match, -6 unique_name; typed php_* edges unchanged): 25
removed, and 1 that a removed edge on the same caller had absorbed.

Signed-off-by: Wolfgang Klinger <wolfgang@wazum.com>
2026-10-19 10:21:28 +02:00
Martin Vogel 2cda42e894 Merge remote-tracking branch 'origin/main' into fix/data-flows-test-file-scope
Conflict in tests/test_edge_types_probe.c: both sides added tests after
et_handles_exact (the R1 + R2 DATA_FLOWS tests and the #1692 ASP.NET
overload test); both are kept.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-19 07:50:13 +02:00
Martin Vogel 93724ba36b Merge main d4980ad7 into fix/py-namespace-string-future-facts
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-19 07:49:58 +02:00
Martin Vogel 5e345e32c0 feat(mcp): state the structural questions in the scout and analysis profiles
The read-only analysis profile and the fast scout profile serve the graph
subagents (codebase-memory-auditor, codebase-memory-scout). Their server
instructions listed tools only. Like the default profile, they now state as
facts which structural questions the graph answers (where a symbol is defined,
who calls a function, what it calls, and for analysis also call chains, data
flow and change impact), keywords first: analysis 190 -> 648 characters, scout
199 -> 427, well within Claude Code's 4,096-character cut. The profile names,
check_index_coverage and the absence of index_repository are unchanged.

Stacked on #2698.

Refs #509

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-19 07:45:37 +02:00
Martin Vogel d4980ad757 Merge pull request #2705 from DeusData/fix/php-global-use-known-absent
fix(php): prove an unaliased global class use absent from the project
2026-10-19 07:44:57 +02:00
Martin Vogel 8d1815cb76 Merge remote-tracking branch 'origin/main' into fix/data-flows-test-file-scope
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-19 07:43:28 +02:00
Martin Vogel 6f00af3b7e fix(routes): scope DATA_FLOWS pairing at the test-file boundary (R1 + R2)
Design decision 2026-10-18 (R1 + R2): a handler defined in a test file
pairs only with callers in that same file, and a caller in a test file
pairs only with handlers in that same file. A test's request to the
application, a production caller matched to a test's mock server, and
the private mock servers of two tests pairing across files are not
data flows of the application. #2689 links every caller of a route to
every handler of it, so these pairs were made on main.

try_create_data_flow now refuses a pair whose caller or handler is in a
test file (cbm_is_test_file, the per-language rule extraction uses)
when the two files differ. HTTP_CALLS and HANDLES are unchanged; only
the pairing is scoped. The pass log counts the refused pairs
(skipped_test_scope).

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-19 07:43:28 +02:00
Martin Vogel 30bd5aaa91 test(routes): test-file callers and handlers pair only within their file
Design decision 2026-10-18 (R1 + R2): a DATA_FLOWS caller in a test file
pairs only with handlers in that same file, and a handler in a test
file pairs only with callers in that same file.

infrascan: test callers by each language rule (a tests/ directory, a
Java *Test.java, a TS .spec.ts) get no flow to a production handler; a
production caller gets no flow to a test mock server; a test reaches
the mock server of its own file but not one in another test file.
Controls: a production caller keeps its flow, and so does a same-file
test pair.

edge_types_probe: a Spring controller, a mock controller under
src/test/, a production TS client and a TS .test.ts client meet on
the same __route__ANY__ nodes. Exactly one flow (production client to
production controller) on the sequential and on the parallel path.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-19 07:43:28 +02:00