Skip to content

fix(kernel): finish the pinned resolution port and the three regressions it exposed - #582

Merged
bompus merged 30 commits into
fork/consolidatedfrom
fix/kernel-port-debt
Oct 29, 2026
Merged

bompus merged 30 commits into
fork/consolidatedfrom
fix/kernel-port-debt

Conversation

@bompus

@bompus bompus commented Oct 29, 2026

Copy link
Copy Markdown
Owner

Finishes the pinned upstream resolution port in the Rust kernel: 29 commits, 26 of them ports of upstream behaviour, plus three fixes this branch found by running the fork's own tests against them.

What the port covers

  • Go: value-type inference, indexed and chained receivers, package-value calls, build-constraint twins, external test packages, conversion refs.
  • Rust: calls resolved by the receiver's written type; chained and generic receivers.
  • VB.NET: namespace receivers, overload picks, head members.
  • JS/TS: named class expressions scoped and exported over CommonJS; non-test refs resolve as if Jest manual mocks were absent; JSX tag imports recorded as synthesis inputs; workspace package entries and manifest-edit sync.
  • Sharing: interface/type-alias calls, unqualified call results, builtin-named methods on typed locals, this-field element calls, framework ownership past the name strategies, Dart library privacy, indexed import-path spelling, lone same-file match confidence, finish() visibility.

The three fixes on top

  1. Explicit operator calls read their argument list (48b54075). tree-sitter-cpp parses d.operator+=(c) as a call on the receiver with the operator name stranded in an ERROR sibling, so cpp_call_argument_types found no call, every overload tied at 0, and operator+=(int) took a call that operator+=(const Counter&) fits. The error text is accepted as the callee spelling. size_type/difference_type count as numbers, as upstream does, so p->operator[](0) reaches the index overload. operator-method-names.test.ts 3/5 → 5/5.
  2. A typed-local receiver keeps the invocation-time binding (f9fb8f12). The fix(python): calls like reg.get() on a typed local or parameter reach the class's method colbymchenry/codegraph#2821 port settled builtin-named method calls through pythonLocalClass alone, which refuses any name bound twice; store = A(); store = B(); store.get() then resolved to nothing. The binding in effect at the call now decides, with the fork's existing uncertainty rules (same-line replacement, captured cell, deferred lambda) still refusing, and the fix(python): calls like reg.get() on a typed local or parameter reach the class's method colbymchenry/codegraph#2821 prohibitions (branch/loop/with/comprehension bindings, outside-project bases) still holding. receiver-scope-lookup 61/69 → 69/69, method-call-owner-class 12/13 → 13/13, python-typed-builtin-method-calls 24/24.
  3. The visibility veto applies to name picks only (0ae0b138). 2ca95adb applied isVisibleAcrossFiles to every strategy, but upstream guards only the name match (index.ts:1867). Its ESM leg dropped a typed store action and an imported component function value as unexported module bindings. Structured picks keep every language's privacy rule and skip the ESM export check. import-type-modifier 9/10 → 10/10, function-ref-project-imports 2/3 → 3/3, Dart part privacy still 12/12.

Checks

  • vitest run: 11,064 passed, 23 failed, 43 skipped (928 files). All 23 failures are pre-existing on origin/fork/consolidated at 421ea886; I ran the same files on a clean worktree of that commit and they fail there identically: explore substring ordering 3, Pascal function-ref 1, index-recovery-off-thread 8 (the test expects an idx_edges_synthesis_site index no code creates), Java records 2, JS receiver binding 1, ui-package 8 (only_child is not a function in the Svelte runtime).
  • Kernel golden dumps: 8/8, no .dump change, so no re-baseline.
  • eval:precision on the corpora this touches: json 11 absent + 7 present held, flask 2/2, vite 6+2, svelte 1/1. Results committed in 3c708552.
  • 74 C++ suites (645 tests) and the four Python/TS suites named above pass.

npm test cannot run on this host: its pretest runs check:kernel-rules, which reports 10 diagnostics in codegraph-kernel/src/resolve/pascal_scope.rs. That file is untouched by this branch and origin/fork/consolidated has the same five sites, so the default branch fails that gate too. CI does not run the script. The suite above is vitest run directly.

README rows

Checked the "About this fork" tables and the benchmark rows: none move. This is resolution correctness with no user-visible surface, command, language, framework or config change, and no measured number in the README comes from these paths.

bompus and others added 29 commits October 29, 2026 08:53
A lone same-file definition chosen by findBestMatch scored by directory
proximity (0.7/0.4), losing to a framework's naming guess in another
file. is_decisive_same_file_match scores it 0.9 when it is the only
same-file candidate, is not the caller itself, and, as a member, belongs
to an owner the caller is inside.

Ports upstream cde4cd7 (colbymchenry#1938). same-file-match-confidence: 7/7.
The resolver is not dropped before process exit on the CLI index path, so
CODEGRAPH_KERNEL_PROF=1 accumulated timings that never printed. close()
is the deterministic teardown point.
Upstream's kernel defers a file whose parse tree has errors, so the test
expected tryKernelExtract to return null. The fork's tsjs walker extracts
the recovered tree natively (cba9256) and keeps the re-export signature
as written — assert that contract instead.
An alias, workspace or direct-path join kept a specifier's lexical
spelling, so `@/widgets/Chart/` probed `Chart//index.tsx` and
`src/widgets/./Chart` probed `./` segments no files row is keyed by.
probe_extensions now spells each candidate as the index keys it for the
ES-module family; other languages keep the path as found.

Ports upstream 8651990 (colbymchenry#2792). import-path-spelling: 5/5.
A Dart `_name` is private to its library — the library file and every
file its `part` directives name — not to its file. private_is_file_local
drops `dart`; is_visible_across_files gets the dart arm (a private
candidate is seen only from a file of its own library); and the
exact-name pre-pick filter declines a private candidate another library
declares so the caller's own library's declaration wins.

Ports upstream f7820b5 (colbymchenry#2832). dart-part-privacy: 10/12 — the two
remaining failures resolve a typed receiver's private method through
resolve_method_on_type's member path, whose visibility gate still needs
tracing (upstream's dart arm at name-matcher.ts ~13147 /
preferOwnDartLibrary is the next suspect).
finish() applied name_post_guard but not the file/library-locality veto
resolveOne's nameResult gets at index.ts:1867, so typed-receiver picks
(instance-method) linked private members of another library. With the
dart arm in place this completes f7820b5: dart-part-privacy 12/12.
…stored

The file lock was released as soon as indexing started — the promise
returned unawaited, the try ended, the finally let the lock go. Awaited,
the lock now holds until the files are stored, as indexAll and sync hold
it (upstream 865ddf4 / colbymchenry#2845).
settleKernelOutcome merged kernel candidates beside the frameworks', so a
project namesake could answer a call Nuxt's navigateTo owns (upstream
58eb57a / colbymchenry#2826). With ownsReference set, the frameworks' best answer
wins or the ref stays unresolved.
…ompiled in

Upstream's test asserted wasm-preload sets (9ee6718 / colbymchenry#2824); the fork
has no wasm loader, so a tsx <script> can never lack its grammar. The
block-mapping half was already fixed in sfcScriptLanguage.
… only

Two corrections to the finish() is_visible_across_files port:

- Run it on the node after supertype/overload/alias retargets, the way
  upstream vets the target matchReference reports — a pre-forward object
  property or import alias is not the node upstream inspects.
- Vet only name-matcher picks: upstream's guard sits inside the
  matchReference arm, so import, file-path and framework results never
  reach it. An import pick's alias forward can legitimately land on an
  unexported module member (export const api = { run: right }).

Also ports the Rust arm upstream added for typed receivers: a method a
trait declares carries no pub of its own — reached through a typed
receiver it is the trait's (rust_trait_of + rust_typed_refs, marking
rust_written_call exits). Fixes the rust-* regressions the guard exposed
(rust-typed-receivers, rust-receiver-chains, rust-generic-bound-paths,
rust-method-value-types, rust-self-field-types, rust-wrapped-self-calls)
while keeping dart-part-privacy 12/12.

Remaining exposed failures are import-binding port debt, not guard bugs:
items$.getState().inc (import-type-modifier) and styled(Disclosure)
(function-ref-project-imports) resolve upstream through the import path
the kernel does not fully carry.
…alue call arms

Port goReceiverChainType/goElementOf/goPackageValueType semantics
tree-natively into the kernel: package-level var/const typing, indexed
and chained receiver calls, and declared-type terminal vetoes for
literals/outside types. Bound-receiver misses are terminal unless the
receiver is an asserted local the index cannot type (upstream
strategy-3 passthrough). TS gateTargetKind gains the missing upstream
arms (import self-edge, Go extends qualification, dot-imported
supertypes) and goBareTypeDir for type-position targets.
Upstream's matchGoPackageValueCall resolves at 0.9; the arm inherited
go_method_in_package's 0.85.
goElementOf (named slice/map types resolve through their declarations),
goFieldTypeOf (struct field written types), selector-expression and
call-expression result arms in go_expr_written. Param/decl locals the
declaration reader misses fall back to infer_local_receiver_type.
…ersion refs (colbymchenry#2581)

Port upstream 800e582's three Go semantics into the kernel:

- A `pkg.Type(…)` conversion resolves its type through the import
  member arm — the kind filter now accepts Go exported member kinds
  (struct/interface/type_alias/variable/constant), which the TS
  edge-kind rewrite then turns into a `references` edge.
- `go_name_visible` is clause-aware: files sharing a directory but
  declaring different package clauses (`a` vs `a_test`) see each
  other's bare top-level names only through an import — qualified,
  or bare after a dot import and exported.
- New `go_build.rs` ports `goFileConstraint`/`preferGoBuildTwin`:
  `//go:build` and `// +build` expressions plus `_GOOS`/`_GOARCH`
  filename suffixes evaluate against the ordered GO_BUILD_TARGETS;
  a resolved target with constrained twins retargets to the twin
  the reference's own file builds with, and `go_pick_twin` collapses
  multi-candidate package members the import arm couldn't pick.

Also fixes the fork's `go-type-visibility.ts`: module-root packages
spell their dir `''` (matching `getGoPackageDir` and kernel
`pos_dirname`), so `goTypePositionTarget` retargets a namesake
function to the module-root type.
…colbymchenry#2762)

Port upstream dbb6aa9: VbReceiver gains a namespace arm
(vb_known_namespaces/vb_namespace_around/vb_namespace_named/
vb_types_in_namespace/vb_module_member_in) so reads like
Billing.Invoice.MaxLines and Acme.Billing.Invoice.MaxLines link the
type or Module member the namespace declares; vb_takes_no_arguments +
vb_runnable_overload pick the overload VB.NET runs when a method is
named without parentheses (Me.Load, Optional/ParamArray, a ctor's
Me.New never resolves to itself); vb_head_member + vb_with_head link a
bare member before the dot (Button1.Text) when no local or parameter
shadows it, gated by foreign-Module and outside-namesake checks.
vb_receiver_type's member search is extracted as vb_member_around.
colbymchenry#2502, colbymchenry#2456)

Port e8ddc4e's declared-entry import resolution into the kernel and its
sync-side invalidation into codegraph.ts.

Kernel (napi config grows entriesByDir + scopedByName):
- resolve_workspace_import takes from_file; workspace_import_targets tries
  declared entries first — exports (exact, wildcard, fallback arrays,
  nested conditions), then source/module/main/types/typings in order —
  then an indexed direct probe, then emitted→source mapping, then the
  direct probe as last resort. Path deps (file:/link:/portal:) resolve
  scoped by the importer's nearest manifest, before global names;
  longest package name wins.
- imports.rs gains longest_package_name/match_workspace_package/
  declared_workspace_entries/indexed_target/built_source_of plus
  WorkspaceTargets/exported_targets/built_sources_of; prefilter passes
  the importing file through.

TS sync side (upstream index.ts port):
- resolver: refreshWorkspacePackages/getWorkspaceFingerprint/
  workspacePackageDirOf; a moved map closes the kernel since the config
  is construction-time.
- codegraph.ts: js_workspace_fingerprint metadata stamped at index and
  re-checked on full reconcile; a moved fingerprint re-opens every
  ESM-language ref for the orphan sweep. reopenReferencesThroughAddedFiles
  gets packageDirOf so a late-appearing declared entry re-links importers.
- loader.ts KernelWorkspaceIn + serialization gain the two new maps.

workspace-package-entries: 26/26. Regression sweep: 146/147, the one
failure a pre-existing tracked bucket (7180fd0 colbymchenry#2788).
…s type

Port 449eefa's resolver half: `this.items[0].save()` arrives as
`this.items[].save` from the extractors (already ported) and now binds the
element type the field's declaration writes instead of bare-name matching
any project method.

- method_call_shape: elementOf arm `^this\.(#?[\w$]+)\[\]\.([\w$]+)$` →
  match_ts_this_field_call(field, method, r, element=true) — exclusive,
  like the plain `this.field.m` arm.
- TsFieldDecl gains element; ts_field_element_type reads it off the
  written type (`Item[]`, `Array<Item>`, `ReadonlyArray<Item>`,
  `Record<string, Item>`) and rejects unions, arrays of arrays and
  non-plain elements; ts_field_element adds tsFieldRead's multi-line
  continuation guard (`| Other[]` on the lines below).
- ts_field_held filters element reads through ts_class_type_parameter —
  `class Store<Item> { items: Item[] }` holds no project `Item`.
- ts_class_type_parameter ported upstream: `class|interface|type` keyword
  anchor, 24-line multi-line head, returns true when the list's `>` is
  not found (drop the type rather than take a parameter for a class).

ts-this-field-element 11/11; expression-receiver-calls +
ts-array-annotated-receivers green; receiver sweep shows only tracked
debt (08478ee colbymchenry#2811, 013b91c colbymchenry#2825); golden dumps unchanged.
…amed method (colbymchenry#2821)

A python call `reg.get()` on a builtin-named method was dropped by the
builtin filter before any strategy could read the receiver. Port
matchPythonTypedLocalCall (colbymchenry#2583) into python_attribute_verdict: a plain
local or parameter receiver settles only through scope evidence —
`python_local_class` agrees a binding def's parameter annotation (quoted,
Optional[T], Union[..., None], T | None, read off the raw def header) or
its assignments (ctor/factory/None; any foreign binding shape, rebinding
or contested evidence refuses). Members come from `python_strict_members`
— the class's own or a declared base's, resolved through the file's
imports, so a base from outside the project holds none of its methods
and the extends edges never substitute a same-name class.

Sync side: FAILED_PY_ATTR_REF widened to the one-dot `x.y` shape. The
fork's delta-narrowed retry keys (perf/sync-delta-retry) never list an
unchanged name like `get`, so a signature-only edit to the factory a
failed typed-local call reads its type from gave no retry key; the
attr-retry lane kernel-probes candidates and retries only resolvable
ones, which also lands the edge's typeFrom stamp for future edits.
…turn type (colbymchenry#2822)

`repository().pending()` — and `val repo = repository()` locals — type the
receiver by the inner call's declared return, so `pending` is the method the
returned project type declares, never a same-named method elsewhere. A type
from outside the project leaves the name strategies untouched, and an
extension the bound-member walk can't see keeps the old name match.

The extractor's return_type keeps only a user_type's first identifier
(`Request`), so `kotlin_scoped_hit` retypes the callee through its signature
(`(): Request.Builder`) and writes a lone nested name through its declaring
outer (`Builder` → `Shop.Builder`).

Two pre-existing filters were misaligned with the kotlinCall/kotlinBare
split this relies on: member-scope reachability vetted receiver-written
names (`text().reverse`) as if receiver-less, and a Chain-shape call with a
non-project receiver type (`StringBuilder`) vetoed every name match —
upstream only constrains standard-library names there. Both now match
upstream's isReceiverLessKotlinCall / kotlinStdChain boundary.

Also: python_local_class returns Option<Answer> — a name no enclosing def
binds (module-level, global) is upstream's `undefined`, not a refused local,
which restores module-global `store = Store()` receivers the strict arm
claimed and dropped.
…nt (colbymchenry#2790)

Port upstream e69546e's mockless context: a ref from non-test code resolves
on a graph without the project's __mocks__/ files, while test code keeps the
whole graph. resolve_ref sets a per-ref mockless flag; nodes_by_name,
nodes_by_lower_name and nodes_by_qualified_name then drop __mocks__/ nodes
(gated on the cached mock-name sets so unaffected names aren't re-collected).
The TS callback-synthesis guards were already in place.

Also fix ts_scoped_reference's type-ref tail: upstream importedTypeMember
falls through (undefined) on a found-miss unless the specifier is outside
the repository — a resolved package directory whose exports can't be read
is not a refusal. The old gate refused references/extends refs bound to a
no-entry workspace package, which upstream answers by name-match.
…nputs (colbymchenry#2563)

collectSynthesisInputs only kept files whose own content matched
mayFeedSynthesis, so a barrel or index that merely forwarded another
module's component was never recorded as an input. When a later sync
edited only that index, the JSX pass never reran and the tag kept its
stale endpoint.

Port upstream's importedTagModules: for each JSX-bearing file, map its
capitalized tags to project imports and collect every file
exportedComponent reads through, memoized per collection run.
…ymchenry#2831)

Port upstream 8fdc8a1: a field chain or struct literal receiver's declared
type decides the call — `vis.map.get` is HashMap's, `Xyz{}.to_val` is Xyz's —
and a path call naming a type std or a dependency owns reaches only the
project's impls of that type or the named trait, never a project namesake.

- rust_expr_type types tuple-struct/enum-variant constructor calls
- undeclared-type guard limited to plain named `field_expression` heads,
  exempting generics, Self, outside types, use-aliases and wrapper-own
  methods; derived-trait provided methods resolve through `#[derive]`
- rust_path_call_reachable gates name-match on the path's outside type

Rust sweep 28 files/206 tests green; kernel golden dumps clean; the 16
remaining full-suite failures are all tracked port debt.
…onJS (colbymchenry#2825)

A named class expression is a class bound inside its expression: index
its members and supertypes, but resolve references written outside the
expression on a graph where that class and its members are not — a
same-named declaration or binding keeps its links, and `new Widget()`
elsewhere links nothing. References written inside see the whole graph
unless the name is another expression's, bound inside that one alone.

`module.exports = class Router` / `exports.Store = class StoreImpl`
are the module's value: the class stays reachable to every importer,
and collect_cjs_export records the declared name as the export's
local binding.

Inheritance refs resolved through an import binding emit upstream's
import confidence 0.9; the scoped arm's 0.95 stays for type-position
references.
colbymchenry#2801)

Nothing calls an interface or a type alias, or makes an instance of one.
A calls/instantiates result that found a TypeScript type by name or
through an import meant the value its file declares beside it — the
function under `interface Ok` in a result module, the class merged with
an interface — and a global the project only types, like `new Response()`
or `new Worker()`, links nothing.
tree-sitter-cpp parses `d.operator+=(c)` as a call on the receiver alone,
with the operator's name stranded in an ERROR sibling (`function:
(identifier) (ERROR ".operator+=") arguments: (c)`), so the callee never
spells `operator+=` and cpp_call_argument_types found no call. Every
overload then tied at 0 and the first — `operator+=(int)` — took a call
that `operator+=(const Counter&)` fits. Accept a call whose error spells
the operator name (the member-access dot is part of the error text), so
the argument types are read and the class overload wins.

`size_type` and `difference_type` count as numbers now, the container
convention upstream uses (6bd217a): nlohmann/json's `p->operator[](0)`
reaches the index overload, not the `T*` one.
The colbymchenry#2821 port (0b564c78) settled a builtin-named method call through
pythonLocalClass alone, which refuses when a name is bound more than
once. `store = A(); store = B(); store.get()` then resolved to nothing,
though the fork's receiver-scope rule has always read the binding in
effect at the call (B).

Read that binding: among plain assignments at or before the call, the
last one decides, and a bare annotation (`store: B`) does not rebind.
python_receiver_uncertain still holds back a same-line replacement and a
later replacement a closure's captured cell sees, and a later binding no
longer poisons an earlier one when the call reads before it. A def's
parameter keeps its annotation when nothing rebinds it.

Three shapes the strict read owns stay with it: a binding that is not a
plain assignment (a branch, loop, `with`, comprehension), a base from
outside the project, and a future binding read from a lambda body. A
receiver naming a class declared here (`File.write(f, "x")`) and a
lambda parameter of the receiver's name keep the ordinary paths.
2ca95adb applied isVisibleAcrossFiles to every strategy's pick. Upstream
guards just the name match (index.ts:1867), and the port's ESM leg
vetoed picks that were never name guesses: a typed store action
(`items$.getState().inc()`) and an imported component function value
were both dropped as unexported module bindings. Keep every language's
privacy rule for a structured pick, and skip the ESM export check for a
pick a receiver's type or a function value made.
Every case held on each corpus (json 11 absent + 7 present, flask 2
present, vite 6 absent + 2 present, svelte 1 absent).
@coderabbitai

coderabbitai Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

Run configuration
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@bompus

bompus commented Oct 29, 2026

Copy link
Copy Markdown
Owner Author

Review round (GPT-6.1 Sol, xhigh) returned fix-then-ship with four findings; all four are fixed in c17ae187, each with a regression test.

  • P2, bare function-name guesses bypassed ESM visibility: the veto now exempts a function-ref only when the file's own import resolves to the target's file (ref_imports_target_file). A bare-name fallback is vetted again; a default-exported wrapper still reaches its inner function through the default import, and export default function Name now counts as an exported name. Test: imported name the module does not export stays unresolved.
  • P2, direct Python read of a future local: result = store.get(); store = A() (UnboundLocalError) is refused; the future-initialization exception stays for a nested def capturing the outer name. Test: future_local.py.
  • P2, conditional bindings: two conditional bindings in different blocks leave no value in effect and are refused; one conditional beside a None placeholder or a later plain assignment still reads, and a conflicting set whose binding in effect may run conditionally stays unknown. Test: branches_two.py.
  • P3, comments defeat C++ operator recognition: the matcher now compares the operator_name node the grammar still reads, falling back to trimmed text only when there is none. Test: b./* note */operator+=(a) selects the class overload.

Re-ran after the fixes: the seven focused suites 180 tests with only the pre-existing Pascal failure, and the full suite 11,068 passed with the same 23 pre-existing failures as origin.

- C++ (P3): a comment inside the access (`b./* note */operator+=(a)`)
  left the comment in the error's text, so the operator name never
  matched. Compare the `operator_name` node the grammar still reads,
  and keep the trimmed-text form only when there is none.
- Python (P2): a local read before its only assignment in the same def
  (`result = store.get(); store = A()`) is an UnboundLocalError, not
  the later value; refuse it, keeping the future-initialization
  exception for a nested def that captures the outer name.
- Python (P2): two conditional bindings in different blocks leave no
  value in effect (`if flag: store = A() else: store = B()`, then
  `store.get()`); refuse. One conditional beside a `None` placeholder
  or a later plain assignment still reads, and a conflicting set whose
  binding in effect may not run stays unknown.
- ESM (P2): a function value is import-justified only when the file's
  own import resolves to the target's file, so a bare name fallback
  can no longer take an unexported namesake from another module. A
  default-exported wrapper still reaches its inner function through
  the default import, and `export default function Name` counts as an
  exported name.

Regression tests: commented operator access, a future local read, two
class-binding branches, and an imported name the module does not export.
@bompus
bompus force-pushed the fix/kernel-port-debt branch from c17ae18 to 3289308 Compare October 29, 2026 16:47
@bompus

bompus commented Oct 29, 2026

Copy link
Copy Markdown
Owner Author

Landing with a documented waiver, on the owner's instruction.

macOS legs (waived). source-reads (macos-latest) and lifecycle (macos-latest) were cancelled six times across three runs, each after ~15 minutes with zero steps executed — the jobs never reached a runner. This is a queue failure, not a test result: lifecycle (macos-latest) passed in 11m19s on c17ae187, so macOS runners work for this repo. The latest rerun has Ubuntu and Windows green on both workflows (source-reads 5m10s / 11m54s, lifecycle 7m25s).

Windows flake (resolved). One lifecycle (windows-latest) run failed on identical content at mcp-daemon.test.ts: "daemon 1408 did not exit within 8 s of disconnect (exited in the next 20 s)". The rerun passed, as did the same workflow on the previous head.

Review. GPT-6.1 Sol (xhigh) returned fix-then-ship; all four findings are fixed in 3289308 with regression tests (see the review-round comment above).

Scope of what the waived leg covered. contained-source.yml exercises source reads on codegraph-kernel/src/contained_source.rs, lib.rs, the kernel loader and three source-scan tests. This branch does not modify any of those; the workflow runs because the PR touches lib.rs from the port commits. The Ubuntu and Windows legs pass.

@bompus
bompus merged commit 58a13dc into fork/consolidated Oct 29, 2026
7 of 13 checks passed
@bompus
bompus deleted the fix/kernel-port-debt branch October 29, 2026 17:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant