Skip to content

CI never indexes Go end to end: the only binary-level harness fixtures are TypeScript-only #1959

Description

@ilyabrykau-orca

Status: fix open — PR #1961, stacked on #1958. Measured with the harness functions against a current binary: baseline nodes=28 edges=46 definitions=12 go=7, identical across ASCII, Latin-1 and Cyrillic repo paths.

Problem

The only place CI indexes a repository through the shipped binary end to end is the Windows guards harness (scripts/test-windows.ps1, tests/windows/), and every fixture it indexes is TypeScript-only (math.ts + main.ts in test_non_ascii_path.py, math.ts in test_cli_non_ascii_arg.py, m.ts in test_hook_augment.py). The C unit/pipeline suites (scripts/test.sh) exercise extraction per-language in-process, but no workflow ever drives Go source through the real product surface (MCP stdio session → supervisor → pipeline → SQLite).

That blind spot is exactly where the Go/cgo extraction defect family (#1932) lived unnoticed: build-tag twin files (#1911), struct fields (#1935), cgo files and //export contracts (#1929), channels (#1930), Go-vs-C cross-language bleed (#1928) — none of these could have been caught by a CI venue that never indexes a .go file end to end.

There is also a path-encoding dimension: Go qualified names embed the containing directory (cbm_lang_module_is_dir), so a non-ASCII repository path flows into Go QNs differently than into TS QNs. The non-ASCII path guard (#636/#357, fixed by #700) therefore currently proves nothing about the Go pipeline passes.

Proposal (implemented by the linked PR)

Make the test_non_ascii_path.py fixture polyglot: keep the TS pair, add a small dummy Go package exercising the formerly broken shapes — a struct with fields and a method, a //go:build linux / //go:build windows twin pair sharing one function name, a cgo file with a C preamble, a C. call and an //export directive, and an unbuffered-channel producer/consumer pair.

The guard's existing invariant (byte-identical fixture ⇒ identical counts regardless of path encoding) then covers the Go passes automatically. Additionally, the harness counts Go-file definitions (MATCH (n:Function|Method) WHERE n.file_path CONTAINS '.go') per variant, asserts the baseline extracted at least one, and includes the value in the cross-variant equality check — so a change that silently stops extracting Go definitions, or extracts them differently under non-ASCII paths, turns the guard red.

Fixture content is dummy code written for this purpose; counts stay deterministic on current main (the build-tag twin collision itself is deterministic for identical input bytes), so the guard is green today and tightens automatically as the #1932 fixes land.

Metadata

Metadata

Assignees

No one assigned

    Labels

    parsing/qualityGraph extraction bugs, false positives, missing edgeswindowsWindows-specific issues

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions