Commit Graph
2682 Commits
Author SHA1 Message Date
Pcristin fb2e38f5bb Merge branch 'main' into fix/issue-1682-dotted-ts-imports 2026-09-01 21:13:59 +03:00
Martin Vogel 7808686cee Merge pull request #1679 from astandrik/codex/perf-cpp-short-name-lookups
perf(lsp): index C++ short-name type lookups
2026-09-01 17:08:48 +02:00
Martin Vogel 641c71f53c Merge pull request #1868 from DeusData/feat/issue-469-file-outline
feat(mcp): add bounded file outline tool
2026-09-01 17:02:05 +02:00
Martin Vogel 3627eff580 Merge pull request #1389 from Yyunozor/fix/arg-url-false-positives
fix(pipeline): reject non-HTTP slash arguments
2026-09-01 17:00:12 +02:00
Martin Vogel f0cf84d251 Merge pull request #1426 from tthayer/feat/pkl-call-extraction
feat(pkl): extract calls, branches, throws and decorators
2026-09-01 16:57:12 +02:00
Martin Vogel a824d82a34 Merge pull request #1939 from xkchok/fix/go-cross-package-field-dispatch
fix(go): resolve cross-package field-chain calls via type dispatch
2026-09-01 14:18:32 +02:00
Martin Vogel 5a5be7409a Merge pull request #1844 from DeusData/codex/issue-1838-perl-grammar-v1.2.1
fix(perl): update grammar for format declarations
2026-09-01 14:16:16 +02:00
Martin Vogel b357d0902f Merge pull request #1657 from atirna/fix/index-worker-explicit-memory-budget
fix(mem): honor explicit worker budget override
2026-09-01 14:12:43 +02:00
Martin Vogel 105069b76b Merge pull request #1960 from DeusData/ci/codeql-gate-budget-v2
ci(security): raise the codeql-gate wait from 45 to 150 minutes
2026-09-01 14:11:34 +02:00
Martin Vogel 011087ebbb Merge pull request #1961 from ilyabrykau-orca/test/windows-guards-go-fixture
test(ci): make the Windows path guard fixture polyglot so CI indexes Go end to end
2026-09-01 14:10:26 +02:00
Martin Vogel 58fb9455bc Merge pull request #1958 from ilyabrykau-orca/fix/windows-guards-setup-retry
fix(ci): gate Windows guard setups on the index response, not list_projects stats
2026-09-01 14:09:27 +02:00
Atirna 7f158e950f Merge branch 'main' into fix/index-worker-explicit-memory-budget 2026-09-01 14:54:15 +05:30
xkchok e11d5900cd fix(test): free the return-type table in the go field-chain helper
run_go_field_chain_sequential tears down the results, registry and
cross arenas but never calls harness_ctx_free_tables, so pass_calls'
CBMReturnTypeTable (strdup'd method return types) leaked whenever the
helper ran. ASan builds caught it: AddressSanitizer: 32911 byte(s)
leaked in 6 allocation(s) from build_return_type_table, failing
test-diag, test-lsan-macos and both gcc sanitizer shards. Verify
locally: build/c/test-runner parallel -> 73 passed, no leaks.

Signed-off-by: xkchok <143325001+xkchok@users.noreply.github.com>
2026-09-01 15:52:15 +08:00
xkchok 4d20a42755 style: clang-format the pxc_fold_go_struct_fields signature
The manual wrap disagreed with clang-format's packing heuristic: with
two parameters still fitting under the 100-column limit, the formatter
packs them onto the first line rather than breaking after the first
argument. Fix the wrap so the PR cleanly passes the ci lint gate.

Signed-off-by: xkchok <143325001+xkchok@users.noreply.github.com>
2026-09-01 15:52:10 +08:00
xkchok 8f50841af4 fix(go): resolve cross-package field-chain calls via type dispatch
Go calls written through an aliased struct field (h.svc.Method(ctx,
req)) previously fell through to fuzzy suffix matching because:

- the per-file Go dispatch walk was bypassed, so field selectors were
  never descended;
- struct fields extracted as flat "Field" defs were dropped by the LSP
  label map, so every Go struct registered with zero fields;
- receiver types written through import aliases (svc.Svc) produced
  qualified names that exist nowhere in the project registry.

Changes:

- restore the Go walk in cbm_pxc_dispatch_file and descend field
  selectors through the shared prebuilt registry, emitting
  lsp_type_dispatch edges;
- fold per-field defs into their owning struct inside
  cbm_pxc_collect_all_defs (one site covers both the prebuilt-registry
  path and the per-file fallback);
- re-qualify the last alias segment through the calling file's import
  map when the direct receiver-type lookup misses
  (go_requalify_via_imports).

Tests:

- tests/test_parallel.c: cross-package field chain resolves end to end
  with an lsp_type_dispatch edge in the parallel resolver;
- tests/test_go_lsp.c: alias-typed struct field re-qualifies through
  the import map and lands on the real receiver type.

Signed-off-by: xkchok <143325001+xkchok@users.noreply.github.com>
2026-09-01 15:51:50 +08:00
Yyunozor c86f1ffafd fix(pipeline): reject non-http slash arguments
Signed-off-by: Yyunozor <yyunozor@icloud.com>
2026-08-31 20:14:01 +02:00
Tony Thayer-OsborneandClaude Fable 5 c9d68de607 Merge upstream/main into feat/pkl-call-extraction
Resolves conflicts with the Chialisp language addition (#1920) in three
repro ledgers. Both branches added one call-capable language, so beyond
the textual conflicts, the auto-merged shared totals had to be bumped a
second time:

- repro_language_registry.c: capability partition now 88/27/49,
  EXPECTED_CALL_CAPABLE_LANGUAGES 115, EXPECTED_NON_CALL_LANGUAGES 51,
  EXPECTED_MATRIX_B_ROWS 49
- repro_call_node_manifest.c: historical total 226, active primary 196,
  direct calls 160, constructor calls 22, primary owners 196
- repro_call_argument_matrix_b.c: ROUTINE_ARGUMENT_LANGUAGE_COUNT 39,
  matrix static assert 49 (RACKET..CHIALISP)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 09:13:50 -07:00
Pcristin b3d7940f4a Merge branch 'main' into fix/issue-1682-dotted-ts-imports 2026-08-31 17:51:21 +03:00
Martin Vogel ae5de7fe0e Merge pull request #1920 from OhOkThisIsFine/claude/focused-herschel-ee8e1c
fix(daemon): contain zombie generations from abandoned requests, name mute endpoint holders
2026-08-31 14:56:11 +02:00
Martin Vogel 0a8a1f297a Merge pull request #1921 from OhOkThisIsFine/fix/daemon-runtime-uutils-image-donor
fix(tests): copy the runner, not /bin/cat, as the POSIX blocked image
2026-08-31 14:40:19 +02:00
Martin Vogel 8d7d3892b3 Merge pull request #1938 from ilyabrykau-orca/fix/go-import-symbol-fallback
fix(pipeline): never bind a Go import to a symbol
2026-08-31 14:31:47 +02:00
Martin Vogel a6468ed441 Merge pull request #1922 from CaptainMittens/fix/reject-out-of-scope-projection
fix(cypher): refuse a name that is not in scope instead of projecting a blank column
2026-08-31 14:28:17 +02:00
Martin Vogel 20e86c02b1 Merge pull request #1944 from ilyabrykau-orca/fix/go-bare-ref-field-binding
fix(pipeline): a bare Go reference never binds a struct Field
2026-08-31 14:12:27 +02:00
Martin Vogel 1794d9ba7a style(mcp): clang-format the rebased analysis_tools block
The rebase resolution hand-aligned the analysis_tools array in both
src/mcp/mcp.c and tests/test_mcp.c after adding get_file_outline beside
compare_graphs, and the column widths did not match what clang-format
produces. That was the only red leg.

Whitespace only: with all whitespace stripped, both files hash identically
before and after (mcp.c d9b9bf785ac9, test_mcp.c 5a7fbf137492), so no
rebuild was required to re-validate the suites.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-08-31 14:01:36 +02:00
Martin Vogel 1e3f2fd209 Merge pull request #1487 from JCVIDev/feat/opencode-context-hooks
feat(cli): extend the OpenCode plugin to every documented context surface
2026-08-31 13:32:07 +02:00
Martin Vogel 61de19bbd3 Merge pull request #1940 from ilyabrykau-orca/fix/go-struct-fields
fix(extract): descend into Go struct field_declaration_list
2026-08-31 13:11:06 +02:00
Martin Vogel fcd8bfc106 Merge pull request #1937 from ilyabrykau-orca/fix/go-usage-writes-cross-language
fix(pipeline): guard USAGE/WRITES/READS against cross-language binds
2026-08-31 13:09:50 +02:00
Martin Vogel d122124fba test(mcp): derive the tools/list cursor from the live tool count
Registering get_file_outline makes 17 tools. The pagination test passed the
literal cursor "8" and asserted no nextCursor came back, which silently
encoded "there are at most MCP_TOOLS_PAGE_SIZE * 2 tools". At 17 the tail
from offset 8 legitimately overflows one page, so the gate failed for a
reason that had nothing to do with pagination being wrong.

Production behaviour is correct and unchanged: the no-cursor path returns
every tool, and a cursored page emits nextCursor exactly while tools remain
after it. Only the test's hard-coded count assumption was wrong.

The offset is now derived from the live count, so the final page is asserted
wherever it falls and adding tool 18 will not break it. A positive control
asserts that page 0 DOES advertise a cursor, so the no-cursor assertion
cannot pass vacuously if paging stopped emitting altogether.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-08-31 12:30:08 +02:00
Pcristin dd74440200 Merge branch 'main' into fix/issue-1682-dotted-ts-imports 2026-08-31 13:24:19 +03:00
Ilya Brykau a874b6bc95 test(ci): make the Windows path guard fixture polyglot so CI indexes Go end to end
The only CI venue that drives a repository through the shipped binary
(MCP stdio -> supervisor -> pipeline -> SQLite) is the Windows guards
harness, and every fixture it indexed was TypeScript-only. The Go/cgo
extraction defect family (#1932: build-tag twins #1911, struct fields
#1935, cgo #1929, channels #1930, cross-language bleed #1928) was
invisible to that venue by construction.

Add a dummy Go package to the test_non_ascii_path fixture covering those
shapes: a struct with fields and a method, a //go:build linux/windows
twin pair sharing one function name, a cgo file (C preamble, C. call,
//export directive), and a channel producer/consumer pair. Count Go-file
definitions per variant (Function/Method where file_path CONTAINS '.go'),
require at least one in the ASCII baseline, and include the count in the
cross-variant equality check - Go qualified names embed the containing
directory, so non-ASCII paths reach the Go passes on their own route.

Measured with the harness functions against a current binary: baseline
nodes=28 edges=46 definitions=12 go=7, identical for the Latin-1 and
Cyrillic variants. The go=7 includes exactly one FlushDisk - the twin
collision on main is deterministic, and this guard will observe the
second twin appear when the build-tag fix lands.

Signed-off-by: Ilya Brykau <ilya.brykau@orca.security>
2026-08-31 12:13:24 +02:00
Martin Vogel 77063bca8e ci(security): raise the codeql-gate wait from 45 to 150 minutes
The gate waited 90 x 30s = 45 min for CodeQL to finish on the PR head. That
is shorter than CodeQL actually takes on this repository, so the gate has
been failing runs that had not failed.

Measured on PR #1426, head 7b72652a: the CodeQL SAST workflow completed with
conclusion=success at 17:46:05, having started at 15:41:44 -- 124 minutes.
The gate step ran 16:52:58 to 17:38:44 and reported "BLOCKED: CodeQL timeout"
7 minutes and 21 seconds before the scan it was waiting for succeeded.

Two open contributor pull requests are red from exactly this: #1426 and
#1769, both with CodeQL completed=success on their head and every other
check green.

Three further PRs (#1703, #1741, #1742) are also red on codeql-gate alone,
but from a different cause: the CodeQL run on their head is
completed=cancelled, so the gate saw a non-success conclusion and correctly
exited 1 without waiting. This change does not help those and is not
intended to; they need a fresh scan, most likely having been superseded by
concurrency cancel-in-progress in codeql.yml.

300 x 30s = 150 min covers the measured 124 min with margin. The job already
declares timeout-minutes: 240, so the wait still cannot outlive its own job.
No trigger, permission or gating change: codeql-gate blocks exactly what it
blocked before, and a genuine CodeQL failure still exits 1 immediately rather
than waiting out the budget. Only the absence of a verdict waits longer.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-08-31 12:10:58 +02:00
Ilya Brykau 947e52d944 fix(ci): gate Windows guard setups on the index response, not list_projects stats
The guards read node/edge counts exclusively from list_projects, but that
tool publishes its stats columns asynchronously — on some venues never
within a one-shot MCP session. index_repository's own response carries the
synchronous, authoritative counts, so a healthy index was misread as
'SETUP FAIL: ASCII baseline did not index ... nodes: None' (issue #1952
carries five such runs; reproduced deterministically on macOS where
list_projects returns the project row with no stats fields at all while
the index response reports nodes=12/edges=21 and definition queries work).

- test_non_ascii_path: take counts from the index_repository summary;
  keep list_projects only as a polled fallback (wait_projects_with_stats
  in mcp_stdio) and for the no-project diagnostics, now in a helper.
- Retry setup steps once (fresh cache) before declaring a precondition
  skip: the ASCII baseline, the CLI ASCII control (test_cli_non_ascii_arg),
  the hook-augment index and its permanent-daemon start — these are setup,
  not the surfaces under test, and a cold runner's daemon startup latency
  must not red the job through the all-skip gate.

Signed-off-by: Ilya Brykau <ilya.brykau@orca.security>
2026-08-31 12:09:08 +02:00
Martin Vogel 9b24332db2 Merge pull request #1945 from DeusData/chore/codeql-action-4.37.9
chore(deps): bump github/codeql-action init+analyze to v4.37.9 together
2026-08-31 11:13:34 +02:00
Ilya Brykau cc00a0275e fix(pipeline): a bare Go reference never binds a struct Field
The READS/WRITES resolvers and the USAGE registry fallback hand bare
reference text to the short-name registry, which contains Field nodes -
so once Go struct fields exist (#1935), every Go local err := ... binds
whichever struct field is named err, project-wide: 21308 USAGE and 5191
WRITES onto Go fields on the measured repo, top target a test struct's
field T collecting 3013 edges. In Go that binding is impossible by
construction: a field is only reachable through a selector expression
(x.f), and selector references resolve on the LSP path - every
Field-targeted reference edge in the census carried dot-less text.

Add cbm_go_suppress_bare_field_ref() next to the #1928 predicate and
consult it at the same four sites (both READS/WRITES resolvers, both
USAGE registry fallbacks): drop the bind when the file is Go, the
target label is Field, and the reference text has no '.'. Go-gated
because C#/Java/C++/Python method bodies legitimately reference their
own members bare (cp_reads_writes_cs_static_field pins that shape).

Field-validated on the #1940 stack: USAGE onto Go fields 21308 -> 0,
WRITES 5191 -> 0; the only remaining field-targeted edges are 2466
CALLS, which are #1906/#1907's selector-guard territory. Reproduce-
first pipeline probes (sequential + parallel twins) were RED on the
stack without this commit.

Fixes #1942

Signed-off-by: Ilya Brykau <ilya.brykau@orca.security>
2026-08-31 11:09:27 +02:00
Martin Vogel 17b5a43263 fix(perl): update grammar for format declarations
Refresh the complete generated Perl grammar bundle from upstream v1.2.1 at c3e17b31179bf8f658c9f37c7a3ea6a202212d5a, raising it from ABI 14 to supported ABI 15. Preserve the existing license and record the source and per-file provenance.

Add deterministic coverage for a valid format followed by a named sub, while retaining a malformed-source control.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-08-30 16:48:41 +02:00
Martin Vogel 0b9df18318 feat(mcp): add bounded file outline tool
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-08-30 16:46:06 +02:00
Martin Vogel 288d41551e chore(deps): bump github/codeql-action init+analyze to v4.37.9 together
Dependabot split this bump across two PRs -- #1898 bumps init, #1900 bumps
analyze -- but codeql-action requires every step in a workflow to run the
same version. Either PR alone produces a mismatch and analyze fails with:

  Loaded a configuration file for version '4.37.4', but running version '4.37.9'

so neither can be green on its own, and merging either would leave main's
CodeQL job broken for every subsequent PR. Bump both pins in one commit.

Pin verified: cdf488f595d80d6e07e03d4674febd5ab45fa938 is the commit that
the annotated tag v4.37.9 dereferences to in github/codeql-action.

Supersedes #1898 and #1900.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-08-30 16:39:49 +02:00
Martin Vogel ec08f76e12 Merge pull request #1899 from DeusData/dependabot/github_actions/github/codeql-action/upload-sarif-4.37.9
chore(deps): Bump github/codeql-action/upload-sarif from 4.37.6 to 4.37.9
2026-08-30 16:38:57 +02:00
Martin Vogel a0f6476ee7 Merge pull request #1794 from DeusData/dependabot/github_actions/actions/attest-build-provenance-4.2.2
build(deps): bump actions/attest-build-provenance from 4.1.1 to 4.2.2
2026-08-30 16:36:16 +02:00
Ilya Brykau e07a12b669 test(extract): pin Go struct field extraction and blank-identifier skip
Reproduce-first probe for the two fixes on this branch: RED without the
descend fix (count_defs_with_label(r, "Field") == 0, expected 3), GREEN
with it. Asserts the three named fields with their declared types in
return_type, the absence of the blank identifier, and that interface
members keep extracting exactly as before.

Signed-off-by: Ilya Brykau <ilya.brykau@orca.security>
2026-08-30 15:07:48 +02:00
Ilya Brykau cb7cb44412 fix(extract): skip Go blank-identifier struct fields
Signed-off-by: Ilya Brykau <ilya.brykau@orca.security>
2026-08-30 15:07:48 +02:00
Ilya Brykau 47116b8e19 fix(extract): descend into Go struct field_declaration_list
Signed-off-by: Ilya Brykau <ilya.brykau@orca.security>
2026-08-30 15:07:48 +02:00
Ilya Brykau d6417ada0e fix(pipeline): guard USAGE/WRITES/READS against cross-language binds
USAGE, WRITES and READS edges resolve through the same short-name
registry as CALLS but never consulted the #725 cross-language guard.
On a Go tree with eBPF C probes every Go identifier spelled like a C
one produced a reference edge into the C file: 31.5% of all WRITES on
the originally measured repo crossed the Go->C boundary, led by dozens
of Go test locals named event writing a C probe's automatic variable.

Add cbm_suppress_cross_language_ref() - the reference-edge analog of
cbm_suppress_cross_language_suffix_match - and consult it on BOTH
resolvers of each edge type: the sequential pass (pass_usages.c
resolve_usage_edges registry-fallback branch, resolve_rw_edges) and
their parallel twins (pass_parallel.c resolve_file_usages,
resolve_file_rw). The sequential-only version of this change left 344
Go->C WRITES alive on a ~1150-file repo because large repos resolve
through pass_parallel.c - the field census caught it, and the
parallel-twin test now pins it.

Unlike the CALLS guard the predicate takes no strategy parameter: a
reference edge carries no import-closure evidence, so every registry
strategy is a bare-name guess across a boundary. LSP-backed semantic
references resolve before the fallback and are unaffected. JS/TS stay
one family, and C/C++ count as one family too (.h maps to
CBM_LANG_CPP, so a .c file referencing its own header is not a
boundary).

Field-validated on the ~1150-file Go+C repo: Go->C/C++ WRITES 835->0,
USAGE 1545->0; C->Go 15/90->0; 6432 reference edges dropped in total,
every one cross-language (Go->.json 3034, Go->.hpp/.h 1612, Go->.c
746, Go->.sh/.yaml/.yml 443, ...) and none same-language. CALLS and
IMPORTS totals are byte-identical to main.

Fixes #1928

Signed-off-by: Ilya Brykau <ilya.brykau@orca.security>
2026-08-30 14:53:07 +02:00
Ilya Brykau 7d76b88f1e fix(pipeline): never bind a Go import to a symbol
A Go import path names a package - never a function, method, field or
another language's build target. Strategy 1 resolves every correct Go
import (module path -> the package's Folder node); when it misses the
import is external and the correct result is NO edge. Two name-guess
fallbacks violated that:

- Strategy 3's language-agnostic symbol-name fallback matched the
  path's last segment against any project definition of the same
  simple name and returned the lexicographically smallest survivor:
  import "os/exec" bound a test harness's exec() method (52 edges on
  the measured repo), two imports bound a Function extracted from a
  Makefile. 89 of 2295 Go IMPORTS edges (3.9%) were false; 27 of those
  are the import "C" case (#1926/#1931), the remaining 62 this.
- Strategy 1b's sibling-file resolution admits symbol labels through
  import_targetable_label, re-creating the same bug one directory
  closer: with Strategy 3 gated, the field census still bound one
  os/exec import to a same-package exec() method.

Gate both on the importing file's language through a new pure
predicate, cbm_import_symbol_fallback_allowed(): false for Go, true
for everything else - member-importing languages (Python, Java, Rust
use crate::ops::helper) legitimately need the symbol fallback, and
build/markup grammars (SCSS partials, Meson subdir, Pony use) the
sibling one. Strategies 1, 2 and 4 are untouched.

Reproduce-first test ei_go_import_never_binds_symbol asserts the
IMPORTS relation EXACTLY (an internal package import stays; neither
the cross-package nor the same-package decoy may be bound): RED
count=2 expected==1 before each gate, GREEN after. Adds
ei_edge_count_is, the exact-count sibling of ei_edge_present, since a
floor cannot catch a fabricated extra edge.

Field-validated on a real ~1150-file Go+C repo: Go IMPORTS by target
label went Folder 2206 / Method 85 / Function 4 on main to
Folder 2206 / Method 0 / Function 0 with the fix; all 2206 correct
package-Folder edges survive.

Fixes #1934

Signed-off-by: Ilya Brykau <ilya.brykau@orca.security>
2026-08-30 14:41:11 +02:00
Martin Vogel 3de05cd607 Merge pull request #1905 from DeusData/feat/868-artifact-reconcile
fix(artifact): reconcile imported hashes against git on bootstrap
2026-08-30 01:33:22 +02:00
Joshua RichterandClaude Opus 5 afc948bab1 fix(cypher): refuse a name that is not in scope instead of projecting a blank
A RETURN could name a variable the WITH before it dropped. The query ran,
exited clean, printed a column for that name, and filled it with empty
strings. Nothing said anything was wrong.

That silence is the harm. A reader sees a column of nothing and reads it as
"the graph holds no such data". The true answer is "your query named
something that is out of scope". For a code graph, a false "nothing calls X"
is the worst answer it can give.

The check runs on the parsed query rather than on the run-time bindings, and
that split is the whole point. It asks whether the query DECLARED the name,
which is a different question from whether a row happened to bind it. So the
existing convention is untouched: an OPTIONAL MATCH target that matched
nothing is still declared, still legal, and still projects "".

Two placeholders are skipped, because neither names anything the query
declared: count(*) stores "*", and a CASE expression stores "CASE".

A query with more names than the guard can model skips the check rather than
guessing. A wrong refusal costs the caller a working query, which is worse
than the silence this removes.

Same failure shape as #373, and the same answer: say so out loud.

Fixes #1919

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Joshua Richter <jrichter5781@gmail.com>
2026-08-29 19:09:07 -04:00
OhOkThisIsFineandClaude Fable 5 fc1b1ee74e fix(daemon): contain zombie generations from abandoned requests, name mute endpoint holders
Fixes the 2026-08-29 daemon zombie class: a client disconnected while its
application request was in flight, the request never observed cancellation,
and runtime_worker_finish joined the request thread with no deadline. The
disconnect path wedged forever, the generation stayed formally RUNNING, and
a dead process held the endpoint pipes and UI port for nine hours while
every new client timed out with no diagnostic.

Four changes:

- runtime: the disconnect-path reap of an in-flight application request now
  waits at most RUNTIME_ABANDONED_REQUEST_JOIN_TIMEOUT_MS (30 s), then logs
  daemon.application_request_unresponsive (peer pid, request token) and
  fail-stops the process. The kernel releases every native claim and the
  next client starts a fresh generation. Test seams expose the ceiling and
  replace the terminal stop with a recordable hook.
- diagnostics: a transport connect that reaches a live process but gets no
  valid answer now resolves the holder's kernel pid
  (GetNamedPipeServerProcessId / SO_PEERCRED). `daemon start` classifies a
  mute holder as RESERVED (no doomed competitor spawns) and names the pid
  in its timeout message; `daemon status` prints "not responding (endpoint
  held by pid N)" with recovery guidance instead of "not running".
- frontend: the maintenance monitor's quiet-state poll drops from 10 ms to
  250 ms. Each probe revalidates the whole ancestor directory chain on
  Windows; at 100 Hz that burned ~20% of a core for the life of every MCP
  session (7762 CPU-seconds on one 9.5 h session). Detection latency spends
  0.25 s of the 15 s activation drain budget.
- version_cohort: the healthy fresh-claim record is renamed from
  "claimed_unheld" (misread as a stale-claim anomaly during the incident
  diagnosis) to "claimed_fresh" with prior_holder=none.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: OhOkThisIsFine <102485413+OhOkThisIsFine@users.noreply.github.com>
2026-08-29 14:44:28 -07:00
OhOkThisIsFineandClaude Fable 5 68b8809874 fix(tests): copy the runner, not /bin/cat, as the POSIX blocked image
daemon_runtime_process_fingerprint_never_hashes_replacement_path (POSIX
variant) copied /bin/cat to a temp file named "image" and executed the
copy. On Ubuntu 25.10+/26.04 and any other uutils system, /bin/cat is a
multi-call binary: a copy invoked under the name "image" prints
"coreutils: unknown program 'image'" and exits 1, so the fixture died at
ASSERT(setup). Reproduced on WSL Ubuntu 26.04 (uutils coreutils 0.8.0).

The Windows variant of the same test already avoids this class of donor:
it copies the test runner itself and parks it in a
__cbm_runtime_image_holder argv mode. The POSIX variant now does the
same. The holder mode gains a POSIX branch that blocks reading stdin
until EOF — exactly the behaviour the cat donor provided — and
runtime_test_spawn_blocked_executable passes the holder argument, so its
target must now be a copy of this runner (it has exactly one caller).

The /bin/echo replacement donor is gone too: it was only ever hashed,
never executed, and on a uutils system cat and echo can be the same
multi-call bytes, which would have broken the fixture's
original != replacement precondition. The replacement is now a small
data file, mirroring the Windows variant.

No signing change is needed on macOS: the image copy stays
byte-identical to the runner, and the identical-copy fixture already
proves such a copy executes.

daemon_runtime suite on WSL Ubuntu 26.04: 44 passed / 0 failed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: OhOkThisIsFine <102485413+OhOkThisIsFine@users.noreply.github.com>
2026-08-29 14:43:59 -07:00
Pcristin 834e4f0231 Merge branch 'main' into fix/issue-1682-dotted-ts-imports 2026-08-30 00:26:47 +03:00
Martin Vogel 997d087b21 Merge pull request #1904 from DeusData/feat/adr-section-update
feat(mcp): add manage_adr mode='set_sections' and splice ADR sections instead of rebuilding
2026-08-29 20:34:46 +02:00